//   -------------- 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 F. Panzera 20/03/2008


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"]        = " \u00E8 obbligatorio";
language["min"]            = " e deve essere almeno ";
language["max"]            = " non pu\u00F2 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 ";
language["uguale"]         = " deve essere uguale a ";
language["exactly"]        = " e deve essere esattamente ";
language["or"]             = " e deve essere esattamente ";
language["invalidm"]       = " non \u00E8 corretto.";
language["invalidf"]       = " non \u00E8 corretta.";

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 '';
	if (pi.length != 11) {
		return "La lunghezza della partita IVA non \u00E8\n" +
			"corretta: la partita IVA dovrebbe essere lunga\n" +
			"esattamente 11 caratteri.\n";
	}
	validi = "0123456789";
	for (i = 0; i < 11; i++) {
		if (validi.indexOf(pi.charAt(i)) == -1) {
			return "La partita IVA contiene un carattere non valido '" +
				pi.charAt(i) + "'.\nI caratteri validi sono le cifre.\n";
		}
	}
	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 (( 10 - s%10 )%10 != pi.charCodeAt(10) - '0'.charCodeAt(0)) return false;
	return true;
}

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 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 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);						// Mese
	// alert("DEBUG: mese:" + b );
	d = s.substring(0, 2);						// Giorno
	// alert("DEBUG: giorno:" + d );
	f = s.substring(6, 10);						// Anno
	// alert("DEBUG:anno:" + f );

	// Controllo errori base
	if (b < 1 || b > 12) {
		// alert("Data errata! Formato GGMMAAAA");
		return 2;
	}

	if (d < 1 || d > 31) {
        // alert("Data errata! Formato GGMMAAAA");
		return 3;
	}
	if (f < 1900 || f > 2050) {
        // alert("Data errata! Formato GGMMAAAA");
		return 8;
	}

	// Controllo errori avanzato
	// Verifica mesi con 30 giorni
	if (b == 4 || b == 6 || b == 9 || b == 11) {
		if (d == 31) {
        	// alert("Data errata! L'ultimo giorno del mese \u00E8 il 30! (formato GGMMAAAA)");
			return 4;
		}
	}
	// Verifica Febbraio anni bisestili
	if (b == 2) {
		var g = parseInt(f/4);
		if (isNaN(g)) {
			// alert("Data errata! Formato GGMMAAAA");
	       return 5;
		}
		if (d > 29) {
			// alert("Data errata! Formato GGMMAAAA");
			return 6;
		}
		if (d == 29 && ((f/4)!=parseInt(f/4))) {
			// alert("Data errata! L'anno non \u00E8 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.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) {
					// Validazione campo tipo numerico
					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";
						}
					// Validazione campo tipo data
					} else if(validateObject.type == "date") {
						err = checkdate(validateObject.val);
						if (err != 0) {
							errors += language['start'] + language['field'] + "'" +  validateObject.HTMLname + "'" +  language['date'] + "\n";    
						}
					// Validazione campo tipo testo
					} 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";
						}
					// Validazione campo tipo partita IVA e/o Codice Fiscale
					} else if (validateObject.type == "pivacf" || validateObject.type == "piva" || validateObject.type == "cf") {
						if (validateObject.type == "pivacf") {  
							if (validateObject.len != 16 && validateObject.len != 11) {
								errors += "Il campo P. IVA o C.f. \u00E8 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 == "cf") {  
							if (validateObject.len != 16) {
								errors += language['start'] + language['field'] + "'" +  validateObject.HTMLname + "'" +  language['require'] + language['exactly'] + 16 +language['chars'] + "\n";
							} else {
								if (check_cf(validateObject.val) != true) {
									errors += language['start'] + language['field'] + "'" +  validateObject.HTMLname + "'" +  language['invalidm'] + "\n";
								}
							}
						} else if (validateObject.type == "piva") {  
							if (validateObject.len != 11) {
								errors += language['start'] + language['field'] + "'" +  validateObject.HTMLname + "'" +  language['require'] + language['exactly'] + 11 +language['chars'] + "\n";
							} else {
								if (check_pi(validateObject.val) != true) {
									errors += language['start'] + language['field'] + "'" +  validateObject.HTMLname + "'" +  language['invalidf'] + "\n";
								}
							}
						}
					// Validazione campo tipo e-mail
					} 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 (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 == ">"  && !( 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 (errors) {
		alert(language["header"].concat("\n" + errors));
		errors = "";
		first.focus();
		return false;
	}  else {
		return true;
	}
}
