//   -------------- commenti -----------------

//  usare come tipo oggetto quanto segue:

//  string: come stringa o testo
//  num   : come numero o valore
//  date  : come data o ora
//  email : per controllare se esiste @

//  modificato mauri 27/07/2001


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"]= " \xE8 obbligatorio.";
language["min"]	= " Deve essere compreso tra ";
language["max"]= " e non pu\xF0 superare il valore ";
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 ";
language["uguale"]= " deve essere uguale a ";
language["invalidm"]		= " non \xE8 corretto.";
language["invalidf"]		= " non \xE8 corretta.";


function addfield(x, type, obbligatorio, HTMLname, min, max, focusOnError )
{
   if(!(focusOnError)) focusOnError = "S" ;
   
   
   removefield( x );
   var p;
   var i;
   n = x.name;
   eval("V_"+n+" = new formResult(x, type, obbligatorio, HTMLname, min, max , focusOnError);");
   checkObjects[eval(checkObjects.length)] = eval("V_"+n);
}

function removefield( x )
{
	for( i = 0; i < checkObjects.length; i++ )
	{
		if( checkObjects[i].form.name == x.name )
		{
			checkObjects.splice( i, 1 );
			return;
		}
	}
}

function showhide(layer_ref, show)
{
	if( show )
	{
		state = "block";
	}
	else
	{
		state = "none";
	}

	if (document.getElementById)
	{ // DOM3 = IE5, NS6
		document.getElementById(layer_ref).style.display = state;
	}
	else {
		if (document.layers) { // Netscape 4
		eval( "document." + layer_ref + ".display = state");
	}
	else { // IE 4
		eval( "document.all." + layer_ref + ".style.display = state" );
	}
}
}

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 formResult(form, type, obbligatorio, HTMLname, min, max, focusOnError )
{
   this.form = form;
   this.type = type;
   this.obbligatorio = obbligatorio;
   this.HTMLname = HTMLname;
   this.min  = min;
   this.max  = max;
   this.focusOnError = focusOnError ;
   
}

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 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
	//alert( 'mese:' + b );
	d = s.substring(0, 2)// day
	//alert( 'giorno:' + d );
	f = s.substring(6, 10)// year
	//alert( 'anno:' + f );

	//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
	}
	if (f<1900 || f>2050) {
        //alert("Data Richiesta errata formato GGMMAAAA");//
		return 8
	}
        //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;
   
   var doFocus = true ;
   
   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.focusOnError = checkObjects[i].focusOnError;
             validateObject.obbligatorio = checkObjects[i].obbligatorio;
             validateObject.type = checkObjects[i].type;
             //alert("[" + checkObjects[i].form.value + "]");
			 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'] + "\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";
                   }             
                } 
                
                
                   if (validateObject.type == "pivacf" )
                   {
                      if( validateObject.len != 16 && validateObject.len != 11 )
                      {
                         errors += language['start'] + "Il campo P. IVA o C.f. \xE8 obbligatorio e deve essere esattamente 16 caratteri (per il codice fiscale) o 11 caratteri (per la partita iva)\n";
                      }
                      else if( validateObject.len == 16 )
                      {
                         if( check_cf( validateObject.val ) != true )
                         {
                            errors += language['start'] + language['field'] + "'" +  validateObject.HTMLname + "'" +  language['invalidm'] + "\n";
                         }
                      }
                      else
                      {
                         if( check_pi( validateObject.val ) != true )
                         {
                            errors += language['start'] + language['field'] + "'" +  validateObject.HTMLname + "'" +  language['invalidm'] + "\n";
                         }
                      }
                   }
                
                
                else if(validateObject.type == "email")
                {
                   if ((validateObject.val.indexOf("@") == -1) || (validateObject.val.charAt(0) == ".") || (validateObject.val.charAt(0) == "@") || (validateObject.len < 6) || (validateObject.val.indexOf(".") == -1) || (validateObject.val.charAt(validateObject.val.indexOf("@")+1) == ".") || (validateObject.val.charAt(validateObject.val.indexOf("@")-1) == "."))
                   { 
                      errors += language['start'] + language['field'] + "'" +  validateObject.HTMLname + "'" +  language['email'] + "\n";
                   }
                }
             }
             if ( errors && ( first == 0 ) )
             {
                first = validateObject.form;
             	if(validateObject.focusOnError != "S")
             	{
             		doFocus = false ;
             	}
             }
          } 
      }
   }
   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 == "pivacf" )
	{
	if( validateObject.x1.value.length != 16 && validateObject.x1.value.length != 11 )
	{
		errors += language['start'] + "Il campo P. IVA o C.f. �obbligatorio e deve essere esattamente 16 caratteri (per il codice fiscale) o 11 caratteri (per la partita iva)\n";
	}
	else if( validateObject.x1.value.length == 16 )
	{
		if( check_cf( validateObject.x1.value ) != true )
		{
		errors += language['start'] + language['field'] + "'" +  validateObject.labelx1 + "'" +  language['invalidm'] + "\n";
		}
	}
	else
	{
		if( check_pi( validateObject.x1.value.length ) != true )
		{
		errors += language['start'] + language['field'] + "'" +  validateObject.labelx1 + "'" +  language['invalidm'] + "\n";
		}
	}
	}
         
         
         else if(validateObject.tipo == "date")
         {
             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";
             } 
         }
         else if(validateObject.tipo == "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['uguale'] + "'" +  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(validateObject.focusOnError != "S")
             {
             	doFocus = false ;
             }
          } 

      }
   }
   if (errors)
   {
      alert(language["header"].concat("\n" + errors)) ;
      errors = "";
      
      if(doFocus == true)
      {
      	first.focus();
      }
      return false;
   }
   else
   {
     return true;
   }
}
function showhide(layer_ref, show)
{
	if( show )
	{
		state = "block";
	}
	else
	{
		state = "none";
	}

	if (document.getElementById)
	{ // DOM3 = IE5, NS6
		document.getElementById(layer_ref).style.display = state;
	}
	else {
		if (document.layers) { // Netscape 4
		eval( "document." + layer_ref + ".display = state");
	}
	else { // IE 4
		eval( "document.all." + layer_ref + ".style.display = state" );
	}
}
}


function check_cf(cf)
{
	var validi, i, s, set1, set2, setpari, setdisp;
	if( cf == '' )  return '';
	cf = cf.toUpperCase();
	validi = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
	for( i = 0; i < 16; i++ ){
		if( validi.indexOf( cf.charAt(i) ) == -1 )
			return "Il codice fiscale contiene un carattere non valido `" +
				cf.charAt(i) +
				"'.\nI caratteri validi sono le lettere e le cifre.\n";
	}
	set1 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	set2 = "ABCDEFGHIJABCDEFGHIJKLMNOPQRSTUVWXYZ";
	setpari = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	setdisp = "BAKPLCQDREVOSFTGUHMINJWZYX";
	s = 0;
	for( i = 1; i <= 13; i += 2 )
		s += setpari.indexOf( set2.charAt( set1.indexOf( cf.charAt(i) )));
	for( i = 0; i <= 14; i += 2 )
		s += setdisp.indexOf( set2.charAt( set1.indexOf( cf.charAt(i) )));
	if( s%26 != cf.charCodeAt(15)-'A'.charCodeAt(0) )
		return false;
	return true;
}

function check_pi(pi)
{
	if( pi == '' )  return false;
	var validi = "0123456789";
	
	
	
	var i ;
	
	if(isNaN(  parseFloat(  pi ) )) return false ;
	
	s = 0;
	
	
	for( i = 0; i <= 9; i += 2 )
	{
		s += pi.charCodeAt(i) - '0'.charCodeAt(0);
	}	
	
	for( i = 1; i <= 9; i += 2 )
	{
		c = 2*( pi.charCodeAt(i) - '0'.charCodeAt(0) );
		if( c > 9 )  c = c - 9;
		s += c;
	}
	
	if ( s == 0 )
		return false;
	
	if( ( 10 - s%10 )%10 != pi.charCodeAt(10) - '0'.charCodeAt(0) )
    		return false;
	
	return true;
}

