var checkObjects	= new Array();
var checkRelations = new Array();
var errors		= "";
var language		= new Array();

language["header"]	= "Errori di compilazione:"
language["start"]	= "->";
language["field"]	= " Il campo ";
language["require"]	= " è obbligatorio";
language["min"]		= " e deve essere almeno ";
language["max"]		= " non può superare ";
language["minmax"]	= " e compreso fra ";
language["chars"]	= " caratteri";
language["num"]		= " deve essere un numero";
language["email"]	= " deve essere un indirizzo di e-mail valido";
language["date"]	= " deve essere una data nel formato gg/mm/aaaa.";
language["maggiore"]	= " deve essere maggiore di ";
language["minore"]	= " deve essere minore di ";
language["maggioreuguale"]	= " deve essere maggiore o uguale a ";
language["minoreuguale"]	= " deve essere minore o uguale a ";

function addfield(x, type, obbligatorio, HTMLname, min, max )
{
   var p;
   var i;
   n = x.name;
   eval("V_"+n+" = new formResult(x, type, obbligatorio, HTMLname, min, max );");
   checkObjects[eval(checkObjects.length)] = eval("V_"+n);
}

function addrelation( x1, labelx1, x2, labelx2, operatore, tipo )
{
   var p;
   var i;
   n = x1.name + x2.name;
   eval("V_"+n+" = new formRelation(x1, labelx1, x2, labelx2, operatore, tipo);");
   checkRelations[eval(checkRelations.length)] = eval("V_"+n);
}

function giradata( s )
{
	return ( s.substring(6, 10) + s.substring(3, 5)  + s.substring(0, 2) );
}

function formResult(form, type, obbligatorio, HTMLname, min, max )
{
   this.form = form;
   this.type = type;
   this.obbligatorio = obbligatorio;
   this.HTMLname = HTMLname;
   this.min  = min;
   this.max  = max;
}

function formRelation( x1, labelx1, x2, labelx2, operatore, tipo )
{
   this.x1 = x1;
   this.x2 = x2;
   this.labelx1 = labelx1;
   this.labelx2 = labelx2;
   this.operatore = operatore;
   this.tipo = tipo;
}

function checkemail(emailStr)
{
    var emailPat=/^(.+)@(.+)$/
    var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"
    var validChars="\[^\\s" + specialChars + "\]"
    var firstChars=validChars
    var quotedUser="(\"[^\"]*\")"
    var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/
    var atom="(" + firstChars + validChars + "*" + ")"
    var word="(" + atom + "|" + quotedUser + ")"
    var userPat=new RegExp("^" + word + "(\\." + word + ")*$")
    var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$")
    var matchArray=emailStr.match(emailPat)

    if (matchArray==null)
    {
	   return 1
    }

    var user=matchArray[1]
    var domain=matchArray[2]
    if (user.match(userPat)==null)
	{
       return 2
    }
    var IPArray=domain.match(ipDomainPat)
    if (IPArray!=null) 
    {
       for (var i=1;i<=4;i++)
	   {
	      if (IPArray[i]>255)
		  {
		     return 3
	      }
       }
       return 0
    }
    var domainArray=domain.match(domainPat)
    if (domainArray==null)
	{
	   return 4
    }
    var atomPat=new RegExp(atom,"g")
    var domArr=domain.match(atomPat)
    var len=domArr.length
    if (domArr[domArr.length-1].length<2 || domArr[domArr.length-1].length>3)
	{
       return 5
    }
    if (domArr[domArr.length-1].length==3 && len<2)
	{
       return 6
    }
   return 0;
}

function checkdate( s ){
//	window.onerror=null // for all other strange errors

	var err=0
	var psj=0;
	if (s.length != 10 ) return 1
	b = s.substring(3, 5)// month
	d = s.substring(0, 2)// day
	f = s.substring(6, 10)// year

	//basic error checking
	if (b<1 || b>12) {
		//alert("Data Richiesta errata formato GGMMAAAA");//
		return 2
	}

	if (d<1 || d>31) {
        	//alert("Data Richiesta errata formato GGMMAAAA");//
		return 3
	}

        //advanced error checking

	// months with 30 days
	if (b==4 || b==6 || b==9 || b==11){
		if (d==31) {
        	//alert("Data Richiesta l'Ultimo giorno del mese è il 30 !!! (formato GGMMAAAA)");//
		return 4
	}
	}

	// february, leap year
	if (b==2){
		// feb
		var g=parseInt(f/4)
		if (isNaN(g)) {
			//alert("Data Richiesta errata formato GGMMAAAA");//
		        return 5
		}

		if (d>29) {
			//alert("Data Richiesta errata formato GGMMAAAA");//
		        return 6
		}

		if (d==29 && ((f/4)!=parseInt(f/4))) {
			//alert("Data Richiesta l'anno non è bisestile !!! (formato GGMMAAAA)");//
		        return 7
		}
	}
   return 0
}

function validate( formname )
{
   var first = 0;
   if (checkObjects.length > 0)
   {
      for (i = 0; i < checkObjects.length; i++)
      {
          if( ( formname == null ) || ( formname == checkObjects[i].form.form.name ) ) 
          {
             validateObject = new Object();
             validateObject.form = checkObjects[i].form;
             validateObject.HTMLname = checkObjects[i].HTMLname;
             validateObject.val = checkObjects[i].form.value;
             validateObject.len = checkObjects[i].form.value.length;
             validateObject.min = checkObjects[i].min;
             validateObject.max = checkObjects[i].max;
             validateObject.obbligatorio = checkObjects[i].obbligatorio;
             validateObject.type = checkObjects[i].type;
             if ( validateObject.obbligatorio == 1 || validateObject.len > 0 )
             {
                if (validateObject.type == "num" )
                {
                   if ((validateObject.len <= 0) || (validateObject.type == "num" && isNaN(validateObject.val)))
                   { 
                      errors += language['start'] + language['field'] + "'" +  validateObject.HTMLname + "'" +  language['require'] + language['num'] + "\n";    
                   } 
                   else if (validateObject.min && validateObject.max && (parseInt(validateObject.val) < validateObject.min || parseInt(validateObject.val) > validateObject.max))
                   {  
                      errors += language['start'] + language['field'] + "'" +  validateObject.HTMLname + "'" +  language['require'] + language['min'] + validateObject.min + language['max'] + validateObject.max + "\n";
                   }
                   else if (validateObject.min && !validateObject.max && (parseInt(validateObject.val) < validateObject.min))
                   { 
                      errors += language['start'] + language['field'] + "'" + validateObject.HTMLname + "'" + language['require'] + language['min'] + validateObject.min  + "\n";
                   }
                   else if (validateObject.max && !validateObject.min &&(parseInt(validateObject.val) > validateObject.max))
                   { 
                      errors += language['start'] + language['field'] + "'" +  validateObject.HTMLname + "'" +  language['require'] + language['max'] + validateObject.max + "\n";
                   }
                   else if (!validateObject.min && !validateObject.max && validateObject.len <= 0)
                   { 
                      errors += language['start'] + language['field'] + "'" +  validateObject.HTMLname + "'" +  language['require'] + "\n";
                   }
                } 
                else if(validateObject.type == "date")
                {
                   err = checkdate( validateObject.val );
                   if ( err != 0 )
                   {
                      errors += language['start'] + language['field'] + "'" +  validateObject.HTMLname + "'" +  language['date'] + " ("+ err + ")\n";    
                   } 
                }
                else if(validateObject.type == "string")
                {
                   if (validateObject.min && validateObject.max && (validateObject.len < validateObject.min || validateObject.len > validateObject.max))
                   {  
                      errors += language['start'] + language['field'] + "'" +  validateObject.HTMLname + "'" +  language['require'] + language['min'] + validateObject.min + language['minmax'] + validateObject.max+language['chars'] + "\n";
                   }
                   else if (validateObject.min && !validateObject.max && (validateObject.len < validateObject.min))
                   { 
                      errors += language['start'] + language['field'] + "'" +  validateObject.HTMLname + "'" +  language['require'] + language['min'] + validateObject.min + language['chars'] + "\n";
                   }
                   else if (validateObject.max && !validateObject.min &&(validateObject.len > validateObject.max))
                   { 
                      errors += language['start'] + language['field'] + "'" +  validateObject.HTMLname + "'" +  language['require'] + language['max'] + validateObject.max + language['chars'] + "\n";
                   }
                   else if (!validateObject.min && !validateObject.max && validateObject.len <= 0)
                   { 
                      errors += language['start'] + language['field'] + "'" +  validateObject.HTMLname + "'" + language['require'] + "\n";
                   }             
                } 
                else if(validateObject.type == "email")
                {
                      err = checkemail( validateObject.val );
                      if ( err != 0 )
                      {
                         errors += language['start'] + language['field'] + "'" +  validateObject.HTMLname + "'" +  language['email'] + "\n";
                      } 
                }
             }
             if ( errors && ( first == 0 ) )
             {
                first = validateObject.form;
             }
          } 
      }
   }
   if (checkRelations.length > 0)
   {
      for (i = 0; i < checkRelations.length; i++)
      {
         validateObject = new Object();
         validateObject.x1 = checkRelations[i].x1;
         validateObject.x2 = checkRelations[i].x2;
         validateObject.labelx1 = checkRelations[i].labelx1;
         validateObject.labelx2 = checkRelations[i].labelx2;
         validateObject.operatore = checkRelations[i].operatore;
         validateObject.tipo = checkRelations[i].tipo;
         if (validateObject.tipo == "num" )
         {
             if ( validateObject.operatore == ">"  && !( parseInt( validateObject.x1.value ) > parseInt( validateObject.x2.value ) ) )
             { 
                errors += language['start'] + language['field'] + "'" +  validateObject.labelx1 + "'" +  language['maggiore'] + "'" +  validateObject.labelx2 + "'" + "\n";    
             } 
             else if ( validateObject.operatore == ">="  && !( parseInt( validateObject.x1.value ) >= parseInt( validateObject.x2.value ) ) )
             { 
                errors += language['start'] + language['field'] + "'" +  validateObject.labelx1 + "'" +  language['maggioreuguale'] + "'" +  validateObject.labelx2 + "'" +  "\n";    
             } 
             else if ( validateObject.operatore == "<"  && !( parseInt( validateObject.x1.value ) < parseInt( validateObject.x2.value ) ) )
             { 
                errors += language['start'] + language['field'] + "'" +  validateObject.labelx1 + "'" +  language['minore'] + "'" +  validateObject.labelx2 + "'" +  "\n";    
             } 
             else if ( validateObject.operatore == "<="  && !( parseInt( validateObject.x1.value ) <= parseInt( validateObject.x2.value ) ) )
             { 
                errors += language['start'] + "'" +  language['field'] + validateObject.labelx1 + language['minoreuguale'] + "'" +  validateObject.labelx2 + "\n";    
             } 
         }
         else if(validateObject.tipo == "date")
         {
             if ( validateObject.operatore == ">"  && !( giradata( validateObject.x1.value ) > giradata( validateObject.x2.value ) ) )
             { 
                errors += language['start'] + language['field'] + "'" +  validateObject.labelx1 + "'" +  language['maggiore'] + "'" +  validateObject.labelx2 + "'" +  "\n";    
             } 
             else if ( validateObject.operatore == ">="  && !( giradata( validateObject.x1.value ) >= giradata( validateObject.x2.value ) ) )
             { 
                errors += language['start'] + language['field'] + "'" +  validateObject.labelx1 + "'" +  language['maggioreuguale'] + "'" +  validateObject.labelx2 + "'" +  "\n";    
             } 
             else if ( validateObject.operatore == "<"  && !( giradata( validateObject.x1.value ) < giradata( validateObject.x2.value ) ) )
             { 
                errors += language['start'] + language['field'] + "'" +  validateObject.labelx1 + "'" +  language['minore'] + "'" +  validateObject.labelx2 + "'" +  "\n";    
             } 
             else if ( validateObject.operatore == "<="  && !( giradata( validateObject.x1.value ) <= giradata( validateObject.x2.value ) ) )
             { 
                errors += language['start'] + language['field'] + "'" +  validateObject.labelx1 + "'" +  language['minoreuguale']  + "'" + validateObject.labelx2 + "'" +  "\n";    
             } 
         }
         else if(validateObject.type == "string")
         {
             if ( validateObject.operatore == ">"  && !( validateObject.x1.value > validateObject.x2.value ) )
             { 
                errors += language['start'] + language['field'] + "'" +  validateObject.labelx1 + "'" +  language['maggiore'] + "'" +  validateObject.labelx2 + "'" +  "\n";    
             } 
             else if ( validateObject.operatore == ">="  && !( validateObject.x1.value >= validateObject.x2.value ) )
             { 
                errors += language['start'] + language['field'] + "'" +  validateObject.labelx1 + "'" +  language['maggioreuguale'] + "'" +  validateObject.labelx2 + "'" +  "\n";    
             } 
             else if ( validateObject.operatore == "<"  && !( validateObject.x1.value < validateObject.x2.value ) )
             { 
                errors += language['start'] + language['field'] + "'" +  validateObject.labelx1 + "'" +  language['minore'] + "'" +  validateObject.labelx2 + "'" +  "\n";    
             } 
             else if ( validateObject.operatore == "<="  && !( validateObject.x1.value <= validateObject.x2.value ) )
             { 
                errors += language['start'] + language['field'] + "'" +  validateObject.labelx1 + "'" +  language['minoreuguale'] + "'" +  validateObject.labelx2 + "'" +  "\n";    
             } 
         }
          if ( errors && ( first == 0 ) )
          {
             first = validateObject.x1;
          } 

      }
   }
   if (errors)
   {
      alert(language["header"].concat("\n" + errors));
      errors = "";
      first.focus();
      return false;
   } 
   else
   {
		window.open("conferma_mailing_eng.html", "_blank", "fullscreen=no, directories=no, location=0, menubar=0, resizable=0, scrollbars=0, status=0, titlebar=0, toolbar=0 screenX=250, screenY=150,top=150,left=250 width=320,height=230");
	     return true;
   }
}