// -----------------------------------------------------------------------------
// Generic Form Validation
//
// Copyright (C) 2000 Jacob Hage - [jacobhage@hotmail.com]
// Distributed under the terms of the GNU Library General Public License
// -----------------------------------------------------------------------------

// -----------------------------------------------------------------------------
// Initializing script  - setting global variables
// -----------------------------------------------------------------------------
var checkObjects		= new Array(); 	// Array containing the objects to validate.
var errors				= ""; 			// Variable holding the error message.
var returnVal			= false; 		// General return value. The validated form will only be submitted if true.
var language			= new Array(); 	// Language independent error messages!
var selectecLanguage	= "italian";	// Choose between "english", "danish", "dutch", "french", "spanish", "russian", "portuguese"
language.english		= new Array();
language.danish			= new Array();
language.dutch			= new Array();
language.french			= new Array();
language.spanish		= new Array();
language.russian		= new Array();
language.portuguese		= new Array();
language.swedish		= new Array();
language.polish			= new Array();
language.brazport		= new Array(); // Brazilian Portuguese
language.italian		= new Array(); // Italiano

// Error messages in english:
	language.english.header		= "The following error(s) occured:"
	language.english.start		= "->";
	language.english.field		= " Field ";
	language.english.require	= " is required";
	language.english.min		= " and must consist of at least ";
	language.english.max		= " and must not contain more than ";
	language.english.minmax		= " and no more than ";
	language.english.chars		= " characters";
	language.english.num		= " and must contain a number";
	language.english.numdec		= " e deve contenere solo una virgola";
	language.english.email		= " must contain a valid e-mail address";
	language.english.data		= " deve essere in forma: gg/mm/aaaaa";
	language.english.datarange	= "";
	language.english.time		= " it's must to be with format: HH:MM";
	language.english.timerange	= "";
	
// Error messages in Danish:
	language.danish.header		= "Der opstod f\370lgende fejl:";
	language.danish.start		= "->";
	language.danish.field		= " Feltet ";
	language.danish.require		= " skal udfyldes";
	language.danish.min			= " og skal best\345 af mindst ";
	language.danish.max			= " og m\345 ikke best\345 af flere end ";
	language.danish.minmax		= " og ikke flere " // English: " and no more than ";
	language.danish.chars		= " tegn";
	language.danish.num			= " og m\345 kun best\345 af tal";
	language.danish.numdec		= " e deve contenere solo una virgola";
	language.danish.email		= " skal indeholde en korrekt e-mail addresse";
	language.danish.data		= " deve essere in forma: gg/mm/aaaaa";
	language.danish.datarange	= "";
	language.danish.time		= " e deve avere il formato HH:MM";
	language.danish.timerange	= "";
	
// Error messages in Dutch: 
	language.dutch.header		= "De volgende fout(en) zitten in het formulier:"
	language.dutch.start		= "->";
	language.dutch.field		= " Veld ";
	language.dutch.require		= " is verplicht";
	language.dutch.min			= " en moet bestaan uit minstens";
	language.dutch.max			= " en moet bestaan uit meer dan";
	language.dutch.minmax		= " en niet meer dan";
	language.dutch.chars		= " karakters";
	language.dutch.num			= " en moet een nummer zijn";
	language.dutch.numdec		= " e deve contenere solo una virgola";
	language.dutch.email		= " moet een geldig e-mail adres zijn.";
	language.dutch.data		= " deve essere in forma: gg/mm/aaaaa";
	language.dutch.datarange	= "";
	language.dutch.time		= " e deve avere il formato HH:MM";
	language.dutch.timerange	= "";
	
// Error messages in French: 
	language.french.header		= "L'erreur suivante s'est produite: "
	language.french.start		= "->";
	language.french.field		= " Le champs ";
	language.french.require		= " est obligatoire";
	language.french.min			= " et doit contenir au moins ";
	language.french.max			= " et ne doit pas contenir plus de ";
	language.french.minmax		= " et pas plus de ";
	language.french.chars		= " caract\350res";
	language.french.num			= " et doit contenir un nombre ";
	language.french.numdec		= " e deve contenere solo una virgola";
	language.french.email		= " doit contenir une adresse e-mail valide";
	language.french.data		= " deve essere in forma: gg/mm/aaaaa\n ATTENZIONE alla coerenza della data";
	language.french.datarange	= "";
	language.french.time		= " e deve avere il formato HH:MM";
	language.french.timerange	= "";
	
// Error messages in Spanish: 
	language.spanish.header		= "Se ha producido un error:"
	language.spanish.start		= "->";
	language.spanish.field		= " El campo ";
	language.spanish.require	= " es obligatorio";
	language.spanish.min		= " y debe contener al menos ";
	language.spanish.max		= " y no debe contener m\341s de ";
	language.spanish.minmax		= " y no m\341s de ";
	language.spanish.chars		= " caracteres";
	language.spanish.num		= " y debe contener un n\372mero";
	language.spanish.numdec		= " e deve contenere solo una virgola";
	language.spanish.email		= " debe contener una direcci\363n de e-mail v\341lida";
	language.spanish.data		= " deve essere in forma: gg/mm/aaaaa";
	language.spanish.datarange	= "";
	language.spanish.time		= " e deve avere il formato HH:MM";
	language.spanish.timerange	= "";
	
// Error messages in russian: 
	language.russian.header		= "The following error(s) occured:"
	language.russian.start		= "->";
	language.russian.field		= " Field ";
	language.russian.require	= " is required";
	language.russian.min		= " and must consist of at least ";
	language.russian.max		= " and must not contain more than ";
	language.russian.minmax		= " and no more than ";
	language.russian.chars		= " characters";
	language.russian.num		= " and must contain a number";
	language.russian.numdec		= " e deve contenere solo una virgola";
	language.russian.email		= " must contain a valid e-mail address";
	language.russian.data		= " deve essere in forma: gg/mm/aaaaa";
	language.russian.datarange	= "";
	language.russian.time		= " it's must to be with format: HH:MM";
	language.russian.timerange	= "";

// Error messages in portuguese: 
	language.portuguese.header		= "The following error(s) occured:"
	language.portuguese.start		= "->";
	language.portuguese.field		= " Field ";
	language.portuguese.require	= " is required";
	language.portuguese.min		= " and must consist of at least ";
	language.portuguese.max		= " and must not contain more than ";
	language.portuguese.minmax		= " and no more than ";
	language.portuguese.chars		= " characters";
	language.portuguese.num			= " and must contain a number";
	language.portuguese.numdec			= " e deve contenere solo una virgola";
	language.portuguese.email		= " must contain a valid e-mail address";
	language.portuguese.data		= " deve essere in forma: gg/mm/aaaaa";
	language.portuguese.datarange	= "";
	language.portuguese.time		= " it's must to be with format: HH:MM";
	language.portuguese.timerange	= "";

// Error messages in Swedish: 
	language.swedish.header		= "The following error(s) occured:"
	language.swedish.start		= "->";
	language.swedish.field		= " Field ";
	language.swedish.require	= " is required";
	language.swedish.min		= " and must consist of at least ";
	language.swedish.max		= " and must not contain more than ";
	language.swedish.minmax		= " and no more than ";
	language.swedish.chars		= " characters";
	language.swedish.num		= " and must contain a number";
	language.swedish.numdec		= " e deve contenere solo una virgola";
	language.swedish.email		= " must contain a valid e-mail address";
	language.swedish.data		= " deve essere in forma: gg/mm/aaaaa";
	language.swedish.datarange	= "";
	language.swedish.time		= " it's must to be with format: HH:MM";
	language.swedish.timerange	= "";

// Error messages in polish: 	
	language.polish.header		= "The following error(s) occured:"
	language.polish.start		= "->";
	language.polish.field		= " Field ";
	language.polish.require	= " is required";
	language.polish.min		= " and must consist of at least ";
	language.polish.max		= " and must not contain more than ";
	language.polish.minmax		= " and no more than ";
	language.polish.chars		= " characters";
	language.polish.num			= " and must contain a number";
	language.polish.numdec		= " e deve contenere solo una virgola";
	language.polish.email		= " must contain a valid e-mail address";
	language.polish.data		= " deve essere in forma: gg/mm/aaaaa";
	language.polish.datarange	= "";
	language.polish.time		= " it's must to be with format: HH:MM";
	language.polish.timerange	= "";
	

// Error messages in brazilian portuguese: 
	language.brazport.header	= "O(s) seguinte(s) erro(s) ocorreu(ram):"
	language.brazport.start		= "->";
	language.brazport.field		= " O campo ";
	language.brazport.require	= " é obrigatório";
	language.brazport.min		= " e deve ser composto de no mínimo por ";
	language.brazport.max		= " e não deve conter mais de ";
	language.brazport.minmax	= " e não mais de ";
	language.brazport.chars		= " caracteres";
	language.brazport.num		= " e deve conter um número";
	language.brazport.numdec		= " e deve contenere solo una virgola";
	language.brazport.email		= " deve conter um endereço de e-mail válido";
	language.brazport.data		= " deve essere in forma: gg/mm/aaaaa";
	language.brazport.datarange	= "";
	language.brazport.time		= " e deve avere il formato HH:MM";
	language.brazport.timerange	= "";

// Error messages in italian : 
	language.italian.header	= "Si e\' rilevato uno o piu\' errori:\n"
	language.italian.start		= "->";
	language.italian.field		= " Il campo ";
	language.italian.require	= " e\' richiesto";
	language.italian.min		= " e deve essere composto di un minimo di ";
	language.italian.max		= " e non puo\' contenere più di ";
	language.italian.minmax	= " e non piu\' di ";
	language.italian.chars		= " caratteri";
	language.italian.num		= " e deve essere numerico";
	language.italian.numdec		= " e contenere solo una virgola come separaore decimale";
	language.italian.email		= " e deve contenere un indirizzo e-mail valido";
	language.italian.data		= " deve essere in forma: gg/mm/aaaaa\n    ATTENZIONE alla coerenza della data";
	language.italian.datarange	= " La data \"INSERITA\" non puo\' essere minore della data di \"ATTIVAZIONE\"";
	language.italian.time		= " e deve avere il formato HH:MM";
	language.italian.timerange	= " Il valore del tempo \"alle ore\" non puo\' essere minore del tempo \"dalle ore\"";
// -----------------------------------------------------------------------------
// define - Call this function in the beginning of the page. I.e. onLoad.
//
// n = name of the input field (Required)
// type= string, num, email (Required)
// min = the value must have at least [min] characters (Optional)
// max = the value must have maximum [max] characters (Optional)
// d = (Optional)
// -----------------------------------------------------------------------------
function define(n,type,HTMLname,min,max,d){
	var p;
	var i;
	var x;
	if(!d) d=document;
	if((p=n.indexOf("?"))>0&&parent.frames.length){
    	d=parent.frames[n.substring(p+1)].document;
    	n=n.substring(0,p);
    }
	if(!(x=d[n])&&d.all) x=d.all[n];
	
  	for (i=0;!x&&i<d.forms.length;i++){
  		x=d.forms[i][n];
  	}
	for(i=0;!x&&d.layers&&i<d.layers.length;i++){
		x=define(n,type,HTMLname,min,max,d.layers[i].document);
		return x;		
	}
	
	// Create Object. The name will be "V_something" where something is the "n" parameter above.
	eval("V_"+n+" = new formResult(x,type,HTMLname,min,max);");
	checkObjects[eval(checkObjects.length)] = eval("V_"+n);
	
}

// -----------------------------------------------------------------------------
// formResult - Used internally to create the objects
// -----------------------------------------------------------------------------
function formResult(form,type,HTMLname,min,max){
	this.form = form;
	this.type = type;
	this.HTMLname = HTMLname;
	this.min  = min;
	this.max  = max;
}

// -----------------------------------------------------------------------------
// validate - Call this function onSubmit and return the "returnVal". (onSubmit="validate();return returnVal;")
// -----------------------------------------------------------------------------
function validate(){
	if(checkObjects.length>0){
		errorObject = "";
		for(i=0;i<checkObjects.length;i++){
			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.type 	= checkObjects[i].type;
			//Debug alert line
			//alert("cont:"+ i +"\nvalidateObject: "+validateObject+"\nvalidateObject.HTMLname: " + validateObject.HTMLname+ "\nvalidateObject.val: "+validateObject.val+"\nvalidateObject.len: "+validateObject.len+"\nvalidateObject.min,validateObject.max: "+validateObject.min+","+validateObject.max+"\nvalidateObject.type: "+validateObject.type);
			
			// Checking input. If "min" and/or "max" is defined the input has to be within the specific range
			if(validateObject.type == "num" || validateObject.type == "string"){
				if((validateObject.type == "num" && validateObject.len <= 0) || (validateObject.type == "num" && isNaN(validateObject.val))){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].num+"\n";
				} else if (validateObject.type == "num" && validateObject.val == 0){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].min+validateObject.min+language[selectecLanguage].minmax+validateObject.max+language[selectecLanguage].chars+"\n";
				} else if (validateObject.min && validateObject.max && (validateObject.len < validateObject.min || validateObject.len > validateObject.max)){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].min+validateObject.min+language[selectecLanguage].minmax+validateObject.max+language[selectecLanguage].chars+"\n";
				} else if (validateObject.min && !validateObject.max && (validateObject.len < validateObject.min)){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].min+validateObject.min+language[selectecLanguage].chars+"\n";
				} else if (validateObject.max && !validateObject.min &&(validateObject.len > validateObject.max)){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].max+validateObject.max+language[selectecLanguage].chars+"\n";
				} else if (!validateObject.min && !validateObject.max && validateObject.len <= 0){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+"\n";
				}
			}
			if(validateObject.type == "numdec"){
				//alert(validateObject.val + 'ok')
				validateObject.val = parseFloat(validateObject.val);
				if((validateObject.type == "numdec" && validateObject.len <= 0) || (validateObject.type == "numdec" && isNaN(validateObject.val))){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].numdec+"\n";
				} else if (validateObject.type == "numdec" && validateObject.val == 0){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].min+validateObject.min+language[selectecLanguage].minmax+validateObject.max+language[selectecLanguage].chars+"\n";
				} else if (validateObject.min && validateObject.max && (validateObject.len < validateObject.min || validateObject.len > validateObject.max)){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].min+validateObject.min+language[selectecLanguage].minmax+validateObject.max+language[selectecLanguage].chars+"\n";
				} else if (validateObject.min && !validateObject.max && (validateObject.len < validateObject.min)){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].min+validateObject.min+language[selectecLanguage].chars+"\n";
				} else if (validateObject.max && !validateObject.min &&(validateObject.len > validateObject.max)){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].max+validateObject.max+language[selectecLanguage].chars+"\n";
				} else if (!validateObject.min && !validateObject.max && validateObject.len <= 0){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+"\n";
				}
			}
			if(validateObject.type == "time"){
				var tempo = validateObject.val;
			  	if (tempo.length == 4) {
					tempo = tempo.substr(0,2) + ':' + tempo.substr(2,2);
			  	}
			  	if (tempo.length == 3) {
					ore = tempo.substr(0,1);
					minuti = tempo.substr(2,2);  
					tempo = '0' + ore + ':' + minuti;
			  	}
			  	if (tempo.length == 2) {
					tempo = tempo.substr(0,2) + ':00' ;
			  	}
			  	if (tempo.length == 1) {
					tempo = '0' + tempo + ':00';
			  	}
				ore = 0;
				minuti = 0;
				var separatore = "";
				ore = tempo.substr(0,2); 
				minuti = tempo.substr(3,2); 
				separatore = tempo.substr(2,1); 
				var tempo_a = validateObject.max;
				var tempo_da = validateObject.min;
				//alert("time-'" + tempo +"' ore-"+ore + " Min-"+  minuti + " Sep-"+ separatore);				
				//alert ("max-" + validateObject.max + " Min-" + validateObject.min);
				if((tempo.length <= 4 ) || (tempo.length > 5 )){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].time+"\n";
				} else if ((ore <= 0 ) || (isNaN(ore))){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].time+"\n";
				} else if ( ore > 24 ){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].time+"\n";
				} else if ((minuti < 0) || (isNaN(minuti))){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].time+"\n";
				} else if (minuti > 59) {errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].time+"\n";
				} else if ( tempo_a < tempo_da ) {errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].timerange+"\n";
				} else if (separatore != ":"){checkObjects[i].form.value = ore + ":" + minuti;
				}
			}
			if(validateObject.type == "email"){
				// Checking existense of "@" and ".". The length of the input must be at least 5 characters. The "." must neither be preceding the "@" nor follow it.
				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[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].email+"\n";}
			} 
			if(validateObject.type == "data"){
			  	var dataok = true; 
			  	var data = validateObject.val;
				var primo = 0;
				var secondo = 0;
				var terzo = 0;
			  if (data.length == 4) {
			    	var dataoggi = new Date();
					var annooggi;
  					annooggi = dataoggi.getYear();
					primo 	= data.substr(0,2);
					secondo = data.substr(2,2);
					terzo 	= annooggi
					data 	= primo + '/' + secondo + '/' + terzo;
			  }
			  if (data.length == 6) {
					primo 	= data.substr(0,2);
					secondo = data.substr(2,2);
					terzo 	= '20' + data.substr(4,2);
					data 	= primo + '/' + secondo + '/' + terzo;
			  }
			  if (data.length == 7) {
					data = "0" + data  ;
			  }
			  if (data.length == 8 || data.length == 7) {
			  	if (data.length == 7) {
					data = "0" + data  ;
			  	}
				primo = 0;
				secondo = 0;
				terzo = 0;
				primo 	= data.substr(0,2);
				secondo = data.substr(2,2);
				terzo 	= data.substr(4,4);
				data 	= primo + '/' + secondo + '/' + terzo;
			  }
			  if (data.length < 10 || data.length > 10) {dataok = false;}
			  //alert ("data:" + data + " dataok:" + dataok);
 	 			if (data.length == 10) { 
					var ok = true; 
    				var first = false; 
    				var second = false; 
    				var g = 0; 
    				var m = 0; 
					var z = 0;
    				var giorno; 
    				var mese; 
    				var anno; 
    				for(z=0;z<data.length;z++) { 
      					if (data.charAt(z) != '/' && (data.charAt(z) < '0') || (data.charAt(z) > '9')) ok = false; 
    				} 
    				if (!ok){dataok = false;}
					for(z=0;z<data.length;z++) { 
      					if (data.charAt(z) == '/' && !first) {; 
        					first = true;
        					g = z;
      					} 
      					else if (data.charAt(z) == '/' && first) { 
        					second = true;
        					m = z;
      					} 
    				} 
    				if (!first || !second) ok = false; 
    				if (!ok){dataok = false;}
					
					giorno = data.substring(0,g); 
	    			mese   = data.substring(g+1,m); 
    				anno   = data.substring(m+1,data.length); 
    				//alert ("mese:" + m + " giorno:" + g + "\ndata: " + anno+ mese + giorno);
					if (anno < 1000) ok = false;     
    				if (mese < 1 || mese > 12) ok = false;     
    				if (giorno < 1 || giorno > 31) ok = false; 
    				if (giorno > 30 && mese == 4) ok = false; 
    				if (giorno > 30 && mese == 6) ok = false; 
    				if (giorno > 30 && mese == 9) ok = false; 
    				if (giorno > 30 && mese == 11) ok = false; 
    				if (giorno > 29 && mese == 2) ok = false; 
    				if (giorno == 29 && mese == 2) {
					//alert ("data: " + anno+ mese + giorno);
    					if (anno % 4 == 0) {
    						if (anno % 100 == 0) { 
    							if (anno % 400 != 0) ok = false; 
    						}
      					}
						else ok = false;
					}
    				//alert(ok); 
					if (!ok){dataok = false;}
  				}
				//alert(dataok); 
   				if (dataok == false) {
      				errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].data+"\n";
				}
    		}
			if(validateObject.type == "datarange"){
				var data = validateObject.min;
				var anno = data.substr(6,4); 
				var mese = data.substr(3,2); 
				var giorno = data.substr(0,2); 
				var datainizio = anno + mese + giorno;		
				//alert (datainizio);
				data = validateObject.max;
				anno = data.substr(6,4); 
				mese = data.substr(3,2); 
				giorno = data.substr(0,2); 
				var datafine = anno + mese + giorno;
				//alert (datafine);
				if (datainizio > datafine) {
					errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].datarange+"\n";
				}
			}
		}
	}
	// Used to set the state of the returnVal. If errors -> show error messages in chosen language
	if(errors){
		alert(language[selectecLanguage].header.concat("\n"+errors));
		errors = "";
		returnVal = false;
	} else {
		returnVal = true;
	}
}


