//Field types
var FC_TEXT = 0;
var FC_TEXTAREA = 1;
var FC_RADIO = 2;
var FC_CHECKBOX = 3;
var FC_SELECT = 4;

//Validator Types
var FC_TEXTVALIDATOR = 0;
var FC_EMAILVALIDATOR = 1;
var FC_INTVALIDATOR = 2;
var FC_FLOATVALIDATOR = 3;
var FC_DATETIMEVALIDATOR = 4;
var FC_DATEVALIDATOR = 5;
var FC_TIMEVALIDATOR = 6;
var FC_CHECKBOXVALIDATOR = 7;
var FC_INTARRAYVALIDATOR = 20;
var FC_FLOATARRAYVALIDATOR = 21;

function isValid(pattern, str)
{
	return pattern.test(str);
}
function isMail(value)
{
	var pattern  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	if (isValid(pattern, value))
	{
		return true;
	}
	return false;
}
function isValuta(campoObj)
{
// (a) one or more digits, followed by ., followed by two digits
// (b) one or more digits
	var pattern = /^((\d+\.\d{2})|(\d+))$/
	if (isValid(pattern, campoObj.value))
	{
		return true;
	} 
	return false;
}
function isInt(value)
{
	var pattern = /^(\d+)$/;
	if (isValid(pattern, value))
	{
		return true;
	} 
	return false;
}
function isFloat(value)
{
// BOI, followed by one of these two patterns:
// (a) one or more digits, followed by ., followed by zero or more digits
// (b) zero or more digits, followed by ., followed by one or more digits
// ... followed by EOI.
	var pattern = /^((\d+(\.\d*)?)|((\d*\.)?\d+))$/
	if (isValid(pattern, value))
	{
	  return true;
	} 
	return false;
}
function isFloatOrInt(value)
{
	if (isFloat(value) || isInt(value))
	{
	  return true;
	} 
	return false;
}
function isValid_Time(value)
{
	var retVal=false;
	var pattern = /^([0-2]{1}[0-9]){1}:([0-5]{1}[0-9]){1}$/;
	//verifica formato
	if(isValid(pattern, value))
	{
		//verifica validita' time
		var match = pattern.exec(value);
		if (!(match[1] > 23 ||  match[2] > 59))
		{
			retVal=true;
		}
	}
	return retVal;
}
function isValid_GG_MM_AAAA_Date(value)
{
	var retVal=false;
	var pattern = /^([0-9]){2}(\/){1}([0-9]){2}(\/){1}([0-9]){4}$/;
	//verifica formato
	if(isValid(pattern, value))
	{
		//verifica validita' data
		var tmpDateArray = value.split('/');
		var gg = parseInt(tmpDateArray[0],10);
		var mm = parseInt(tmpDateArray[1],10)-1;
		var aaaa = parseInt(tmpDateArray[2],10);

		var tmpDate = new Date(aaaa,mm,gg);
		if((gg == tmpDate.getDate()) && (mm == tmpDate.getMonth()) && (aaaa == tmpDate.getFullYear()))
			retVal=true;
	}
	return retVal;
}
function isValid_GG_MM_AAAA_DateTime(value)
{
	var retVal=false;
	var pattern = /^([0-9]){2}\/([0-9]){2}\/([0-9]){4} ([0-9]){2}:([0-9]){2}(:[0-9]{2}){0,1}$/;
	//verifica formato
	if(isValid(pattern, value))
	{
		//verifica validita' data
		var tmpDateArray = value.split('/');
		var gg = parseInt(tmpDateArray[0],10);
		var mm = parseInt(tmpDateArray[1],10)-1;
		var aaaa = parseInt(tmpDateArray[2],10);

		var tmpDate = new Date(aaaa,mm,gg);
		if((gg == tmpDate.getDate()) && (mm == tmpDate.getMonth()) && (aaaa == tmpDate.getFullYear()))
			retVal=true;
	}
	return retVal;
}

function checkBoxes(formObj, fieldname)
{
	checkBoxesCollection = formObj.elements[fieldname];
	if(typeof(checkBoxesCollection.length) === 'undefined')
		checkBoxesCollection = Array(formObj.elements[fieldname]);
	for (var i=0, j=checkBoxesCollection.length; i < j; i++)
	{
		if (checkBoxesCollection[i].checked)
			return true;
	}
	return false;
}
function isValidArray(formObj, fieldObj, itemValidatorFunction)
{
	elementsCollection = formObj.elements[fieldObj.name];
	if(typeof(elementsCollection.length) === 'undefined')
		elementsCollection = Array(formObj.elements[fieldObj.name]);
	
	var tmpValue;
	for (var i=0, j=elementsCollection.length; i < j; i++)
	{
		tmpValue = Trim(getValue(elementsCollection[i], fieldObj.type)); 
		if(tmpValue.length>0)
		{
		    if(itemValidatorFunction && !itemValidatorFunction(tmpValue))
		    {
				return false;
		    }
		}
		else if(fieldObj.required)
		{
			return false;
		}
	}
	return true;
}
function LTrim(str)
{
   var whitespace = new String(" \t\n\r");
   var s = new String(str);
   if (whitespace.indexOf(s.charAt(0)) != -1)
   {
      var j=0, i = s.length;
      while (j < i && whitespace.indexOf(s.charAt(j)) != -1)
         j++;
      s = s.substring(j, i);
   }
   return s;
}
function RTrim(str)
{
   var whitespace = new String(" \t\n\r");
   var s = new String(str);
   if (whitespace.indexOf(s.charAt(s.length-1)) != -1)
   {
      var i = s.length - 1;
      while (i >= 0 && whitespace.indexOf(s.charAt(i)) != -1)
         i--;
      s = s.substring(0, i+1);
   }
   return s;
}Field
function Trim(str)
{
   return RTrim(LTrim(str));
}

function getValue(e,t)
{
	retVal="";
	switch(t)
	{
		case FC_TEXT: case FC_TEXTAREA: case FC_RADIO: case FC_CHECKBOX:
			retVal=e.value;
		break;
		case FC_SELECT:
			if(e.selectedIndex>=0) retVal=e.options[e.selectedIndex].value;
		break;
	}
	return retVal;
}

function validate(formObj, fieldObj)
{
	var elem = formObj[fieldObj.name];
	/* DEBUG */
	if(!elem)
	{
		alert( "- NAME NON DEFINITO: " + fieldObj.name + "\n");
		return false;
	}
	/* END DEBUG */
        
        switch(fieldObj.validator)
        {
			case FC_INTARRAYVALIDATOR:
				return isValidArray(formObj, fieldObj, isInt);	    
			break;
			case FC_FLOATARRAYVALIDATOR:
				return isValidArray(formObj, fieldObj, isFloat);	    
			break;
			
            default:
                var value = getValue(elem, fieldObj.type);
                if (Trim(value).length!=0)
                {
                        switch(fieldObj.validator)
                        {
                                case FC_TEXTVALIDATOR:
                                        return true;
                                break;
                                case FC_EMAILVALIDATOR:
                                        return isMail(value);
                                break;
                                case FC_INTVALIDATOR:
                                        return isInt(value);
                                break;
                                case FC_DATETIMEVALIDATOR:
                                        return isValid_GG_MM_AAAA_DateTime(value);
                                break;
                                case FC_TIMEVALIDATOR:
                                        return isValid_Time(value);
                                break;
                                case FC_DATEVALIDATOR:
                                        return isValid_GG_MM_AAAA_Date(value);
                                break;
                                case FC_CHECKBOXVALIDATOR:
                                        return checkBoxes(formObj, fieldObj.name);
                                break;
								case FC_FLOATVALIDATOR:
                                        return isFloat(value);
                                break;
                        }
                        return false;
                }
                else
                {
                        if(fieldObj.required)
                                return false;
                        else
                                return true;
                }
        }
}

function Field(name, type, validator, required, message, badValue)
{
	this.name="";
	this.type=""; //text,textarea,radio,checkbox,select
	this.validator="";
	this.required="";
	this.message="";
	this.badValue="";
	if(name!=null) this.name=name;
	if(type!=null) this.type=type;
	if(validator!=null) this.validator=validator;
	if(required!=null) this.required=required;
	if(message!=null) this.message=message;
	if(badValue!=null) this.badValue=badValue;
	
	this.check = function(theForm)
	{
		if((!validate(theForm, this)) || ((this.badValue.length>0) && (value==this.badValue)))
		{
			return "- " + this.message + "\n";
		}
		return "";
	}
}


function FormChecker(theForm) 
{
	this.form = theForm;
	this.fields = new Array();
	
	this.addField = function(f)
	{
		this.fields.push(f); 
	}
  
	this.doCheck = function()
	{
		errors = "";
		for(i=0;i<this.fields.length;i++)
		{
			errors += this.fields[i].check(this.form);
		}
		if(errors.length>0)
		{
			alert(errors);
			return false;
		}
		return true;
	}
}

