function formValidate(f, errorMessage)
{
    //alert('f.elements.length = '+f.elements.length);
    //var fieldsorder = f.elements["fieldsorder"];
    //if (fieldsorder) fieldsorder.value = "";
    for (var i=0; i<f.elements.length; i++) 
    {
        var e = f.elements[i];
        var t = e.type;
        if (t == "hidden" || t == "submit" || t == "button") continue;
        var n = e.className;
        
        //if (fieldsorder) fieldsorder.value += n + ",";

        var m = errorMessage;
        
        if (t == "text" || t == "password" || t == "file" || t == "select-one" || t == "textarea")
        {
			//alert(n);
            if (hasRequiredFlag(n))
            {
                if (isEmpty(e, m)) return false;
            }

			var minLength = hasMinimunLengthFlag(n);
            if (minLength >= 1)
            {
                if (isShorterThan(e, m, minLength)) return false;
            }
            //alert('minLength control passed');
            if (hasNumberFlag(n))
            {
                if (!isNumber(e, m)) return false;
            } 
            
            if (hasEmailFlag(n))
            {
                if (!isEmail(e, true, m)) return false;
            }
        }
        
        if (t == "checkbox") 
        {
            if (hasRequiredFlag(n))
            {     
                if (!e.checked) return giveAlert(e, m); 
            }     
        }    
		
        if (t == "radio") 
        {
            // Troppo complicato fare i controlli
        }
    }
    
    //alert(f.elements["fieldsorder"].value);
    return true;
}

function isEmpty(e, m) 
{
    if (e.type != "file") e.value = trim(e.value);
    if (e.value == "") return !giveAlert(e, m);

    return false;
}

function isNumber(e, m) 
{
	//alert(e.value);
	e.value = trim(e.value);
	var i = parseFloat(e.value);
    if (isNaN(i)) return giveAlert(e, m);
    return true;
}


function isEmail(e, empty, m) 
{
    e.value = trim(e.value);
    if ((e.value == "") && empty) return true;

    var re = /^.+@.+\..+$/;
    if (!re.test(e.value)) return giveAlert(e, m);
    return true;
}

function isShorterThan(e, m, minLength)
{
	e.value = trim(e.value);
	if (e.value.length < minLength) return !giveAlert(e, m);

	return false;
}

function giveAlert(e, m)
{
    e.focus();
    var t = e.title;
    if (t == null || t == "") t = e.name;
    alert(m.replace("{title}", t));
    return false;
}

function hasFlag(n, f) 
{
	var flag = "__"+f+"__";
    return (n.lastIndexOf(flag) >= 0);
}

function hasRequiredFlag(n)
{
    return hasFlag(n, "noempty");
}

function hasEmailFlag(n)
{
    return hasFlag(n, "email");
}

function hasNumberFlag(n) 
{
    return hasFlag(n, "numeric");
}

function hasMinimunLengthFlag(n)
{
	var flag = "__minlength";
	var x = n.lastIndexOf(flag);
    if (x < 0) return -1;
	var length = parseInt(n.substring(n.indexOf('-', x+flag.length)+1, n.indexOf('__', x+flag.length)+1));
	//alert('min length: '+length);
	return length;
}

function trim(s) 
{
    var tmp = s.replace(/^[\s\u00A0]*/, '').replace(/[\s\u00A0]*$/, '');
    return tmp;
}


// apre una finestra centrata, le da' il focus e ritorna l'handle
function openWindow(pageToOpen, title, width, height, parameters)
{
	scH=screen.availHeight;
	scW=screen.availWidth;
	t=(scH/2)-(height/2);
	l=(scW/2)-(width/2);
	var w = window.open(pageToOpen, title, 'width='+width+',height='+height+',left='+l+',top='+t+','+parameters);
	w.focus();
	return w;
}