// vers. 2.7 - 20/8/2009 - richiede prototype

function impostaDecimali(valore, usaAlert, cifredecimali) {
	//imposta il punto come separatore decimale 
	// uso onblur="this.value=impostaDecimali(this.value, true, xx)" (dove xx e' il numero di decimali, il default e' 2)
	// in checkForm: numero=impostaDecimali(numero, false, xx);
	
	if(cifredecimali==undefined) cifredecimali=2;
	nuovoNum=valore;
	if(valore != '' && isNaN(valore)) {
		nuovoNum=nuovoNum.replace(/,/,".");
	
		if(isNaN(nuovoNum)) {	// se nuovoNum continua a essere un non numero, viene restituito il valore originale
			nuovoNum=valore;
		} 
	}
	if(!isNaN(nuovoNum) && nuovoNum != '') { // controllo e impostazione numero dei decimali
		punto=nuovoNum.toString().lastIndexOf('.');
		if(punto==-1) {
			zeri='';
			for(i=1; i<= cifredecimali; i++) { zeri += '0'; }
			nuovoNum=nuovoNum + "." + zeri;
		} else {
			decimali=nuovoNum.toString().substr(punto+1);
			if(decimali.length <cifredecimali) {
				for(i=decimali.length; i< cifredecimali; i++) { nuovoNum += '0'; }
			} else if(decimali.length >cifredecimali) {
				eccedenza=decimali.length-cifredecimali;
				nuovoNum=nuovoNum.substr(0,nuovoNum.length-eccedenza)
				if (usaAlert) alert("Numero di decimali non corretto. Il valore inserito " + String.fromCharCode(232) +" stato modificato");
			}
		}

	}	
	return nuovoNum;
}

function controllaData(datastr) { //controlla se una data e' corretta, nella forma gg/mm/aaaa o gg/mm/aaaa hh:mm- riporta errore anche con stringhe vuote
	if(datastr.indexOf('/') == -1) {
		return false;
	} else {
		dta=datastr.split('/')
		//controllo ora
		if(dta[2].indexOf(':')!=-1) {
			dta[3]=dta[2].substr(5,2);//ora
			dta[4]=dta[2].substr(8);//minuti
			dta[2]=dta[2].substr(0,4);
		} else {
			dta[3]=0;
			dta[4]=0;
		}
		if(isNaN(dta[0]) || isNaN(dta[1])  || isNaN(dta[2]) || dta[2].length<4) {
			return false;
		} else {
			dta[1]--; // i mesi partono da 0
			ndta=new Date(dta[2],dta[1],dta[0],dta[3],dta[4]);
			//console.log(ndta.toString());
			if(ndta.getFullYear()!=dta[2] ||  ndta.getMonth()!=dta[1] || ndta.getDate()!=dta[0]  || ndta.getHours()!=dta[3] || ndta.getMinutes()!=dta[4]) {
				return false
			}
		}
	}
	return true;
}
function controllaOra(orastr) { //controlla se una stringa corrisponde ad un'ora nella forma hh:mm. Ora: 0-23, munuti: 0-59 

	if(orastr.indexOf(':') == -1) {
		return false;
	} else {
		ora=orastr.split(':')
		if(ora[0]=='' || ora[1]=='' || 
			isNaN(ora[0]) || isNaN(ora[1]) || 
			Number(ora[0]) < 0 || Number(ora[0]) > 23 || 
			Number(ora[1]) < 0 || Number(ora[1]) > 59) {
			
			return false;
		}
	}
	return true
}

function checkMail(emailStr) {
	 mailRegExp=new RegExp("^[\\w\._=-]+@[\\w\\.-]+\\.[a-zA-Z]{2,4}$");
	 if(!mailRegExp.test(emailStr)) {
	 	return false;
	 } else {
	 	return true;
	 }
}

function contaTesto (_campo, _campocontatore, _limite) {
	/*
	il form da controllare deve contenere i campi '_campo' (textarea) e '_campocontatore' (input):
	<textarea name=nomecampo wrap=physical cols=28 rows=4 onKeyDown="contaTesto(this.form.nomecampo,this.form.contatore,xxx);" onKeyUp="contaTesto(this.form.nomecampo,this.form.contatore,xxx);"></textarea>
	<input readonly type=text name=contatore size=3 maxlength=3 value="xxx">
	dove 'xxx' e' il numero massimo di caratteri ammessi
	*/
	if ($F(_campo).length > _limite) {
		_campo.value = $F(_campo).substring(0, _limite)
	} else { 
		_campocontatore.value = _limite - $F(_campo).length
	}
}

function checkForm2() {
	//
	/*
	nel tag onsubmit="checkForm2([this, 'ckbElimina', 'errorClass'], argomenti); return esitoCKF"
	esempio:
	checkForm2([this, null],{id:'email',descr:'Indirizzo Email', errMes: 'L\'indirizzo email inserito non e' corretto', tipo:'email', obbl:true}); return esitoCKF;
	
	per ogni campo e' definito un oggetto con i partametri necessari
	per compatibilita' con le versioni precedenti e' possibile anche l'uso di un array

		id (indice 0 se array): id del campo
		descr (1): nome in chiaro del campo
		errMes (2): messaggio di errore specifico
		tipo (3): tipo: email, num: numero, pri: privacy, data: data, text: testo, sel: select, pre: prezzo, 
			  		cf: codice fiscale, piva: partita iva.
			  		pwd: password/id (richiede min e max car.)
		obbl (4): campo obbligatorio? (true o false) viene ignorato da text, sel e privacy
		min: numero minimo di caratteri (per controllo pwd) o valore minimo (per num e pre)
		max: numero massimo di caratteri (per controllo pwd) o valore massimo (per num e pre)
		
		il primo elemento dell'array di parametri inviati a checkform contiene indicazioni generali:
			0: riferimento all'oggetto form
			1: se presente, si tratta di un checkbox per l'eliminazione del record
			   se e' selezionato, i controlli non vengono effettuati. Se non serve: stringa nulla
			2: nome della classe da applicare al nodo genitore del campo in caso di errore
	
	*/
	var a=arguments, err=false, mes='', thisField, errObbl;
	//myForm=a[0][0];
	var isElimina=false;
	
	
	if(a[0][1] != null && a[0][1] !='') {
		if($(a[0][1]) && $(a[0][1]).checked) isElimina=true;
	}
	//console.log('isElimina: ' + isElimina);
	
	if(isElimina) {
		esitoCKF=true;
	} else {
		esitoCKF=true;
		var errorClass=a[0][2];
		for(i=1; i<a.length; i++) {
			
			thisField={};
			
			if(Object.isArray(a[i])) { // per compatibilita'
				thisField.id=a[i][0];
				thisField.descr=a[i][1]; 
				thisField.errMes=a[i][2];
				thisField.tipo=a[i][3];
				thisField.obbl=a[i][4];
			} else {
				thisField=a[i];
			}
			
			if(!$(thisField.id)) alert(thisField.id + ' mancante');
			
			//if(thisField.min==null) thisField.min=8; // gia' verificati dalla classe php
			//if(thisField.max==null) thisField.max=20;
			
			
			err=false;
			if(thisField.obbl==null) thisField.obbl=false;
			errObbl= ($F(thisField.id)==='' && thisField.obbl==true) ? true : false;	
			
			if((thisField.tipo=='text' || thisField.tipo=='sel') && $F(thisField.id)=='') { //if(thisField.tipo=='sel' && thisField.id.selectedIndex==0) 
				err=true;
				mes="\u00c8 necessario inserire il valore '" + thisField.descr + "'";
				
			} else if(thisField.tipo=='pri' && !$(thisField.id).checked) {
				err=true;	
				mes="\u00c8 necessario acconsentire al trattamento dei dati personali";
			
			} else if(thisField.tipo=='email' && (errObbl || ($F(thisField.id)!=='' && !checkMail($F(thisField.id))))) {
				err=true;
				mes="'" + thisField.descr + "' \u00e8 mancante o non \u00e8 un indirizzo di posta elettronica corretto";
			
			} else if(thisField.tipo=='num' || thisField.tipo=='pre') {
				if(thisField.tipo=='pre' && $F(thisField.id)!='') $(thisField.id).value=impostaDecimali($F(thisField.id), false, 2);
				
				if(errObbl || ($F(thisField.id)!='' && isNaN($F(thisField.id)))) {
					err=true;
					mes="Il valore '" + thisField.descr + "' \u00E8 mancante o non corretto";
				
				} else if ($F(thisField.id)!='' && 
						((thisField._min!=null && thisField._min!='' && $F(thisField.id) < thisField._min) ||
						(thisField._max!=null && thisField._max!='' && $F(thisField.id) > thisField._max))){
					err=true;
					
					if(thisField._min!=null && thisField._min!='' && thisField._max!=null && thisField._max!='') {
						mes="Il valore '" + thisField.descr + "' deve essere compreso tra " + thisField._min + " e " + thisField._max;

					} else if (thisField._min!=null && thisField._min!='') {
						mes="Il valore '" + thisField.descr + "' deve essere pi\u00F9 grande di " + thisField._min;
				
					} else if (thisField._max!=null && thisField._max!='') {
						mes="Il valore '" + thisField.descr + "' deve essere pi\u00F9 piccolo di " + thisField._max;
					}
				}
				
			} else if ((thisField.tipo=='data' || thisField.tipo=='dataOra') && (errObbl || ($F(thisField.id) !=''  &&!controllaData($F(thisField.id))))) {
				err=true;
				mes="Il campo '" + thisField.descr + "' \u00e8 mancante o non corretto (la data va inserita nella forma gg/mm/aaaa " + (thisField.tipo=='dataOra'? 'hh:mm': '') + ")";
			
			} else if (thisField.tipo=='ora' && (errObbl || ($F(thisField.id) !=''  && !controllaOra($F(thisField.id))))) {
				err=true;
				mes="Il campo '" + thisField.descr + "' \u00e8 mancante o non corretto (l'ora va inserita nella forma hh:mm)";
		
			} else if (thisField.tipo=='cf' && (errObbl || ($F(thisField.id) !=''  && !controllaCF($F(thisField.id)) ))) {
				err=true;
				mes="Il campo '" + thisField.descr + "' \u00e8 mancante o non corretto";
		
			} else if (thisField.tipo=='piva' && (errObbl || ($F(thisField.id) !=''  && !controllaPIVA($F(thisField.id))))) {
				err=true;
				mes="Il campo '" + thisField.descr + "' \u00e8 mancante o non corretto (la Partita IVA deve essere composta da 11 cifre numeriche)";
			
			} else if (thisField.tipo=='pwd' && (errObbl || ($F(thisField.id) !=''  && !controllaPWD($F(thisField.id), thisField._min, thisField._max)))) {
				err=true;
				mes="Il campo '" + thisField.descr + "' \u00e8 mancante o non corretto.\n\u00c8 necessario inserire una parola con un numero di caratteri compreso tra " + thisField._min + " e " + thisField._max + ", e composta solo di lettere non accentate o numeri (senza spazi o altri caratteri particolari)";
			
			}
			
			// aggiungere controllo per thisField.tipo=='web'
			if(errorClass) $$('*.' + errorClass).invoke('removeClassName',errorClass); // rimuove errori precedenti
			
			if(err) {
				if(thisField.errMes!=null && thisField.errMes!='') mes=thisField.errMes;
				alert(mes);
				//console.log(mes + '\n\nValore inserito: ' + $F(thisField.id));
				$(thisField.id).focus();
				if(errorClass) $(thisField.id).up(0).addClassName(errorClass);
				
				esitoCKF=false;
				break;
			} else {
				esitoCKF=true;
			}
		}
	}	
}

function cf_disableSubmit(submitID, disabledLabel) {
	if(esitoCKF && submitID!='' && $(submitID)) {
		// aggiunge un valore hidden con lo stesso nome del submit disabilitato
		var hiddenElement=document.createElement('input');
		hiddenElement.setAttribute("type", "hidden");
		hiddenElement.setAttribute("name", $(submitID).name);
		$(submitID).parentNode.appendChild(hiddenElement);
		
		// disabilita il pulsante
		$(submitID).disabled=true;
		if(disabledLabel == null || disabledLabel=='') disabledLabel="Registrazione in corso... Attendere";
		$(submitID).value=disabledLabel;
		
	}
}

// da http://www.icosaedro.it/cf-pi/
function controllaPIVA(piva) {
	if( piva == '' ) return false;
	if( piva.length != 11 ) return false;
	var  validi = "0123456789";
	for(var i = 0; i < 11; i++ ) if( validi.indexOf( piva.charAt(i) ) == -1 ) return false;
	var c, s = 0;
	// cifre pari
	for( i = 0; i <= 9; i += 2 ) s += piva.charCodeAt(i) - '0'.charCodeAt(0);
	// cifre dispari
	for( i = 1; i <= 9; i += 2 ) {
		c = 2*( piva.charCodeAt(i) - '0'.charCodeAt(0) );
		if( c > 9 ) c = c - 9;
		s += c;
	}
	if((10 - s%10) %10 != piva.charCodeAt(10) - '0'.charCodeAt(0)) {
		return false;
	} else {
		return true;
	}
}


function controllaCF(cf) {
	
	var validi, i, s, set1, set2, setpari, setdisp;
	var esito=true;
	if( cf == '' ) return false;
	cf = cf.toUpperCase();
	if( cf.length != 16 ) esito=false;
	validi = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
	for( i = 0; i < 16; i++ ) if( validi.indexOf( cf.charAt(i) ) == -1 ) esito=false;
	
	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) ) esito=false;
	
	if(!esito) {
		return controllaPIVA(cf); // le aziende possono avere il CF uguale alla p.IVA
	} else {
		return true;
	}
}


function controllaPWD(_pwd, _min, _max) {
	var pattern=new RegExp();
	pattern.compile('\\w{' + _min + ',' + _max + '}', 'g');
	if (!pattern.test(_pwd)) {
		return false;
	} else {
		return true;
	}
}


function checkIBAN_IT (iban, cineur, cin, abi, cab, cc, obbligatorio, errorClass) {
	// se viene fornito il campo iban, il controllo viene effettuato su questo (da fare)
	// altrimenti sugli altri campi assumendo per "paese" il valore "IT"
	// le variabili si riferiscono agli id dei campi
	
	// errorClass, se impostata e' la classe da applicare al nodo che contiene il campo in caso di errore
	if(errorClass==null) errorClass='';
	var iban_val;
	
	//esitoCKF=true;  // per i test
	
	if(esitoCKF) {
		if(iban != null) {
		
			// da fare
			
		} else if($F(cineur) && $F(cin) && $F(abi) && $F(cab) && $F(cc)) {
								
				iban_val='';
				
				if(isNaN($F(cineur)) || $F(cineur).length != 2) {
					alert('Il codice CIN EUR deve essere un numero di due cifre');
					esitoCKF=false;
					$(cineur).focus();
					if(errorClass) $(cineur).up(0).addClassName(errorClass);
				
				} else if($F(cin).length != 1 || /[^A-Z]/.test($F(cin))) { // test restituisce true se trova un carattere non permesso
					alert('Il codice CIN deve essere una lettera maiuscola');
					esitoCKF=false;
					$(cin).focus();
					if(errorClass) $(cin).up(0).addClassName(errorClass);
									
				} else if(isNaN($F(abi)) || $F(abi).length != 5) {
					alert('Il codice ABI deve essere un numero di cinque cifre');
					esitoCKF=false;
					$(abi).focus();
					if(errorClass) $(abi).up(0).addClassName(errorClass);
				
				} else if(isNaN($F(cab)) || $F(cab).length != 5) {
					alert('Il codice CAB deve essere un numero di cinque cifre');
					esitoCKF=false;
					$(cab).focus();
					if(errorClass) $(cab).up(0).addClassName(errorClass);
				
				} else if($F(cc).length != 12 || /[^A-Z0-9]/.test($F(cc))) {
					alert('Il numero di conto deve essere composto da numeri o lettere alfabetiche maiuscole ed essere composto da 12 cifre');
					esitoCKF=false;
					$(cc).focus();
					if(errorClass) $(cc).up(0).addClassName(errorClass);
				
				} 
				
				if(esitoCKF) iban_val='IT'+$F(cineur)+$F(cin)+$F(abi)+$F(cab)+$F(cc);
		
		} else {
			iban_val='';
		
		} // end if iban != null
		
		
		if(esitoCKF && !iban_val && obbligatorio != null && obbligatorio) {
			alert('Il codice IBAN \u00E8 mancante o incompleto');
			esitoCKF=false;
			
			if(iban!= null) {
				$(iban).focus();
				if(errorClass) $(iban).up(0).addClassName(errorClass);
			} else {
				$(cineur).focus();
			}
		}
			
		if(esitoCKF && iban_val) { // verifica checkdigit CIN EUR
			
			// posizionamento delle prima 4 cifre in fondo alla stringa
			var check=iban_val.substr(4)+iban_val.substr(0,4);
			
			//trasformazione delle lettere in numeri: A=10 (ASCII A=65, i numeri sono tra 48 e 57)
			var check_num='', c;
			for (var i = 0; i < check.length; i++ ) {
				c = check.charCodeAt(i);
				if(c>=65) {
					c=c-55;
				} else {
					c=check.charAt(i);
				}
				check_num+=String(c);
			}
			
			// divisione di check_num in parti di 8 cifre e controllo
			var resto='';
			for(i=0; i<check_num.length; i=i+8) {
				resto=Number(String(resto)+String(check_num.substr(i,8))) % 97;
			}
			
			if(resto !=1) {
				alert('Il codice IBAN non \u00E8 corretto');
				esitoCKF=false;
			
				if(iban!= null) {
					$(iban).focus();
					if(errorClass) $(iban).up(0).addClassName(errorClass);
				} else {
					$(cineur).focus();
				}
			}
		}
	} // end if esitoCKF
	
	/*
	console.log(iban_val);
	console.log(check);
	console.log(check_num);
	console.log(resto);
	
	if(esitoCKF) alert('Codice corretto');
	*/
}
