function ptFormValidate(f, errorMessage)
{
	var radiosRequired = new Object();
	var checkboxesRequired = new Object();
    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;
        var m = errorMessage;

        if (t == "text" || t == "password" || t == "file" || t == "select-one" || t == "textarea")
        {
            if (hasRequiredFlag(n))
            {
                if (isEmpty(e, m)) return false;
            }

            var minLength = hasMinimunLengthFlag(n);
            if (minLength >= 1)
            {
                if (isShorterThan(e, m, minLength)) return false;
            }

            if (hasNumberFlag(n))
            {
                if (!isNumber(e, m)) return false;
            }

            if (hasEmailFlag(n))
            {
                if (!isEmail(e, true, m)) return false;
            }
        }

		//per gestire i checkbox a scelta multipla, gestisco i checkbox come i radio, cioe' a gruppi!
		//eventualmente i gruppi avranno un checkbox solo al loro interno!
        if (t == "checkbox")
        {
            if (hasRequiredFlag(n))
				checkboxesRequired[e.name] = true;
            /*{
                if (!e.checked) return giveAlert(e, m);
            }*/
        }

        if (t == "radio")
        {
			if (hasRequiredFlag(n))
				radiosRequired[e.name] = true;
        }
    }

	for (var k in checkboxesRequired)
	{
		if (checkboxesRequired[k])
		{
			var ok = false;
			var checkboxGroup = f.elements[k];
			if (checkboxGroup.length)  //se e' definito il campo "length", e' un array!
			{
				for (i = 0; i < checkboxGroup.length; i++)
				{
					if (checkboxGroup[i].checked)
					{
						ok = true;
						break;
					}
				}
				if (!ok)
					return giveAlert(checkboxGroup[0], m);
			}
			else
			{
				if (!checkboxGroup.checked)
					return giveAlert(checkboxGroup, m);
			}
		}
	}

	for (k in radiosRequired)
	{
		if (radiosRequired[k])
		{
			var ok = false;
			var radioGroup = f.elements[k];
			for (i = 0; i < radioGroup.length; i++)
			{
				if (radioGroup[i].checked)
				{
					ok = true;
					break;
				}
			}
			if (!ok)
				return giveAlert(radioGroup[0], m);
		}
	}

    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)
{
    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));
    return length;
}

function trim(s)
{
    var tmp = s.replace(/^[\s\u00A0]*/, '').replace(/[\s\u00A0]*$/, '');
    return tmp;
}

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;
}

function compileCheckboxesList(form)
{
	var checkboxesList = '';

    for (var i=0; i<form.elements.length; i++)
    {
        var e = form.elements[i];
        var t = e.type;
        if (t == "checkbox" || t == 'radio')
        {
        	checkboxesList += e.name + ',';
        }
    }
    //rimuovo l'eventuale ultima virgola....
    if (checkboxesList.charAt(checkboxesList.length - 1) == ',')
    {
    	checkboxesList = checkboxesList.substring(0, checkboxesList.length - 1);
    }
    form.platinumCheckboxesList.value = checkboxesList;
}


if (typeof String.prototype.trim == 'undefined')
{
	String.prototype.trim = function() {
		return this.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
	}
}

function checkFile(fileInput, exts, allFiles)
{
	if (allFiles) return true;
	var f = fileInput.value;
	var i = f.lastIndexOf('.');
	var f_ext;
	if (i < 0)
		f_ext = '';
	else
		f_ext = f.substring(i+1).toLowerCase();
	for (var key in exts)
	{
		if (f_ext == exts[key])
		{
			return true;
		}
	}

	return false;
}
