
/**************************************************************
* Funzioni base (utilizzate in altre funzioni di validazione) *
**************************************************************/


// ritorna false se l'argomento ha lunghezza 0, true altrimenti
// Argomenti: str tipo stringa
function notNull(str) {
	if (str.length == 0 )
		return false
	else 
		return true
}

// ritorna false se l'argomento è costituito da soli spazi o
// ha lunghezza 0, true altrimenti
// Argomenti: str tipo stringa
function notBlank(str) {
	for (i = 0; i < str.length; i++) {
		if (str.charAt(i) != " ")
			return true
	}
	return false
}

// ritorna true se il primo argomento è una stringa di 
// lunghezza pari al valore del secondo argomento
// Argomenti: str tipo stringa, size intero
function isSize(str, size) {
	if (str.length == size) 
		return true
	else
		return false
}

// ritorna true se l'argomento è una stringa costituita
// unicamente da caratteri numerici, false altrimenti
// Argomenti: str stringa
function isDigits(str){ 
	var myExp=/^[0-9]*$/;
	
	return myExp.test(str)
}

// ritorna true se la stringa rappresenta un numero valido,
// con o senza decimali, false altrimenti. Il formato .nn 
// (Es: .123) è considerato valido
// Argomenti: str stringa
function isNumber(str){
	var myExp=/(^\d+$)|(^\d*\.\d+$)/
	
	return myExp.test(str)
}

// ritorna true se il primo argomento rappresenta un numero
// compreso tra il secondo (valore minimo) e il terzo 
// (valore massimo) argomento
// Argomenti: str stringa,  num1,num2 numerici
function isInRange(str, num1, num2) {
	//var i = parseInt(str,10)
	var i = parseInt(str)
	
	return((i >= num1) && (i <= num2))
}

// ritorna true se l'argomento è una stringa composta unicamente
// da caratteri alfanumerici
// Argomenti: str stringa
function isAlfanumeric(str){
	var myExp=/^[a-zA-Z0-9]*$/i;
	
	return myExp.test(str)
}


/*************************************************************
	Controllo del Codice Fiscale - solo a livello di sintassi
**************************************************************/
function Trim(stringa)
	 {
	 reTrim=/\s+$|^\s+/g;
	 return stringa.replace(reTrim,"");
	 }
function isCodFisc(cod_fisc)
	 {
	 var re = /^[A-Z]{6}\d{2}[A-Z]\d{2}[A-Z]\d{2}[A-Z0-9][A-Z]$/;
	 Codice=Trim(cod_fisc.toUpperCase());
	return re.test(Codice)
	 }
//function isPIVA(what){
//	var i=new RegExp("[0-9]{11}");
//	return i.test(what);
//}


//LA SEGUENTE PROCEDURE E' BUGGATA! col CF dei COM-RE non funziona!
//effettua il controllo desiderato basandosi sull'algoritmo reperibile in www.finanze.it
//function isPartitaIVA(sz_Codice){
//   var n_Val,n_Som1=0,n_Som2=0,lcv;
//   if (sz_Codice.length!=11 || isNaN(parseFloat(sz_Codice)) || parseFloat(sz_Codice)<parseFloat(0))
//      return false;
//   
//   for (lcv=0;lcv<9;lcv+=2) {
//      n_Val=parseInt(sz_Codice.charAt(lcv));
//      n_Som1+=n_Val;
//      n_Val=parseInt(sz_Codice.charAt(lcv+1));
//      n_Som1+=Math.floor(n_Val/5) + (n_Val<<1) % 10;
//   }
//   n_Som2 = 10 - (n_Som1 % 10);
//   n_Val=parseInt(sz_Codice.charAt(10));
//   if (n_Som2==n_Val)
//      return true;
//   return false;
//}


//Effetua il controllo formale della partita iva         
function controllaPIVA(pi){
	if( pi == '' )  return false;
	if( pi.length != 11 )	return false;
	
	validi = "0123456789";
	
	for( i = 0; i < 11; i++ ){
		if( validi.indexOf( pi.charAt(i) ) == -1 )
			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( ( 10 - s%10 )%10 != pi.charCodeAt(10) - '0'.charCodeAt(0) )	return false;
	
	return true;
}



/******************************
* Riformattazione di stringhe *
******************************/

// ritorna l'argomento al quale sono stati tolti i
// caratteri non numerici
// Argomenti: str stringa
function stripNonDigits(str) {
	return str.replace(/[^0-9]/g,"")
}

// ritorna l'argomento al quale sono stati tolti i
// caratteri contenuti nella stringa passata come
// secondo argomento
// Argomenti: str,chars stringhe
function stripChars(str, chars) {
	var i
	var newstring = ""
	for (i = 0;  i < str.length; i++) {
		mychar = str.charAt(i)
		if (chars.indexOf(mychar) == -1) // mychar non è contenuto in chars
			newstring += mychar
	}
	return newstring
}



/*******************************
* Validazione formati speciali *
*******************************/

// ritorna true se l'argomento è una password valida
// Argomenti: str stringa
function isPassword(str){
	var myExp=/^[a-z0-9_]*$/i;
	
	if (!isInside(str,4,8)) return false;
	return myExp.test(str)
}

// ritorna true se l'argomento è un nickname valido
// Argomenti: str stringa
function isNickname(str){
	var myExp=/^[a-z0-9_]*$/i;
	
	if (!isInside(str,3,10)) return false;
	return myExp.test(str)
}

// Ritorna true se l'argomento è un indirizzo di email valido.
// E' valida la sintassi usuale user@domain,
// ma sono consentiti anche i formati user@[ip]
// e "User with Spaces"@domain o [ip],
// (tutte sintassi legali secondo il W3C.)
// Sono controllati anche errori quali multipli @ o . limitrofi
// nell'indirizzo (Es: user@a@b.com ed user@a..b.co.uk).
// Argomenti: emailStr stringa.


function isEmail (emailStr) {
	// Formato user@domain e separazione di username e dominio
	var emailPat=/^(.+)@(.+)$/
	// Pattern per ritrovare i caratteri speciali (non consentiti)
	var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"
	// Caratteri consentiti in username o domainname
	var validChars="\[^\\s" + specialChars + "\]"
	// Username contenente spazi
	var quotedUser="(\"[^\"]*\")"
	// domainName costituito da un indirizzo IP
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/
	// Unità 'atomo' ovvero una serie di caratteri non speciali
	var atom=validChars + '+'
	// Una 'word' dell'username. L'username può essere costituito da più 'word'
	// separate da .
	var word="(" + atom + "|" + quotedUser + ")"
	// Struttura dell'username
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$")
	// Dominio sombolico
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$")

	// Controllo della sintassi username@domain e separazione dell'username dal
	// domain
	var matchArray=emailStr.match(emailPat)
	if (matchArray==null) {
		//alert("Email address seems incorrect (check @ and .'s)")
		return false
	}
	var user=matchArray[1]
	var domain=matchArray[2]
	
	// User valido.
	if (user.match(userPat)==null) {
	    //alert("The username doesn't seem to be valid.")
	    return false
	}
	
	// Indirizzo IP valido (nel caso in cui il domain sia un IP.
	var IPArray=domain.match(ipDomainPat)
	if (IPArray!=null) {
		  for (var i=1;i<=4;i++) {
		    if (IPArray[i]>255) {
		        //alert("Destination IP address is invalid!")
			return false
		    }
	    }
	    return true
	}
	
	// Domain è un nome simbolico
	var domainArray=domain.match(domainPat)
	if (domainArray==null) {
		//alert("The domain name doesn't seem to be valid.")
	    return false
	}
	
	
	// controllo sulla parte terminale del domain.
	
	// Spezzo il domain in 'atomi'
	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>6)) {
	   // alert("The address must end in a three-letter domain, or two letter country.")
	   return false
	}
	
	// Parte terminale del dominio preceduta da un host name.
	if (len<2) {
	   //var errStr="This address is missing a hostname!"
	   //alert(errStr)
	   return false
	}
	
	return true;
}


// ritorna true se nella stringa passata per argomento
// sono contenuti 5 o 9 caratteri numerici 
// Argomenti: str stringa
function isZip(str) {
	if (notNull(str)) {
		newstring = stripNonDigits(str)
		if (isSize(newstring,5) || isSize(newstring, 9)) 
			return true
	}
	return false
}

// ritorna true se nella stringa passata per argomento
// sono contenuti 5 caratteri numerici 
// Argomenti: str stringa
function isCAP(str) {
	if (notNull(str)) {
		newstring = stripNonDigits(str)
		if (isSize(newstring,5)) 
			return true
	}
	return false
}

//
function isURL(str) {  
	var myExp=/./;
	
	return myExp.test(str)
}

// ritorna true se la data rappresentata dal giorno pari al
// primo argomento, dal mese pari al secondo e dall'anno pari 
// al terzo è valida, false altrimenti
// Argomenti gg,mm,aaaa stringhe rappresentanti interi
// (aaaa anno in formato esteso a 4 cifre)
function isDate(gg,mm,aaaa){ 
	// gg, mm, aaaa sono stringhe tutte di caratteri numerici
	if (!isDigits(gg)) return false;
	if (!isDigits(mm)) return false;
	if (!isDigits(aaaa)) return false;
	
	giorno = parseInt(gg,10);
	mese = parseInt(mm,10);
	anno = parseInt(aaaa,10);
	
	if (!isInRange(giorno,1,31)) return false;
	if (!isInRange(mese,1,12)) return false;
	
	testDate = new Date(anno,mese-1,giorno);
	
	return ( testDate.getMonth()==(mese-1) && 
			 testDate.getDate()==(giorno)    )
}

// ritorna true se la stringa è contiene solo caratteri
// numerici e  +-/ o spazio, false altrimenti
// Argomenti: str stringa
function isPhone(str){	
	
	newstring = stripChars(str, "+ -/().");
	if (isDigits(newstring)) return true;
	return false
}


/*******************************
* Validazione formati standard *
*******************************/

// ritorna true se l'argomento è una stringa non 
// vuota e non costituita da soli spazi
// Argomenti: str stringa
function isValidString(str) {
	if (notNull(str)&& notBlank(str)) 
		return true;
	return false;
}

// ritorna true se il primo argomento è una stringa
// di lunghezza superiore al valore del secondo argomento,
// false altrimenti
// Argomenti: str stringa, maxLength numerico
function isLonger(str,maxLength) {
	if (str.length>maxLength)
		return true;
	return false
}

// ritorna true se il primo argomento è una stringa
// di lunghezza inferiore al valore del secondo argomento,
// false altrimenti
// Argomenti: str stringa, minLength numerico
function isShorter(str,minLength) {
	if (str.length<minLength)
		return true;
	return false
}

// ritorna true se la lunghezza della stringa passata come 
// primo argomento è compresa tra i valori rappresentati
// dal secondo (minimo) e il terzo (massimo) argomento,
// false altrimenti
// Argomenti: str stringa, minLength,maxLength numerici
function isInside(str,minLength,maxLength) {
	if (!isShorter(str,minLength) && !isLonger(str,maxLength))
		return true;
	return false
}


/********
* Varie *
********/

// ritorna true se l'oggetto radio passato per argomento 
// ha una selezione effettuata, false altrimenti
// Argomenti: radio INPUT di tipo radio
function isRadioSelected(radio) {
	for (i=0 ; i< radio.length ; i++){
		if (radio[i].checked) return true;
	}
	return false
}

// ritorna l'indice dell'oggetto radio passato per argomento 
// che ha una selezione effettuata, -1 altrimenti
// Argomenti: radio INPUT di tipo radio
function RadioSelected(radio) {
	for (i=0 ; i< radio.length ; i++){
		if (radio[i].checked) return i;
	}
	return -1;
}

function OptionSelected(Option) {
	for (i=0 ; i< Option.length ; i++){
		//alert(i);
		if (Option[i].selected) return Option[i].value;
	}
	return -1;
}



function validaCF( sCodiceFiscale ){
		//val_cod_fisc è il codice fiscale inserito dall'utente
		var cod_fisc_inserito = sCodiceFiscale;
		var cod_fisc_inserito = cod_fisc_inserito.toUpperCase();
	
		//Questo è il sedicesimo carattere, cioè il check digit del codice fiscale 
		check_digit_inserito = cod_fisc_inserito.charAt(cod_fisc_inserito.length-1);
		
		//inizializziamo la variabile che rappresenterà l'ultimo carattere del codice fiscale
		check_digit_calcolato= "";
		
		//Inizializzo gli array che mi serviranno per verificare il codice fiscale
		var array_caratteri = new Array();
		var array_check_digit = new Array();
	
		sommatotale = 0;
		
			array_caratteri[0] = "A";		
			array_caratteri[1] = "B";
			array_caratteri[2] = "C";
			array_caratteri[3] = "D";
			array_caratteri[4] = "E";
			array_caratteri[5] = "F";
			array_caratteri[6] = "G";
			array_caratteri[7] = "H";
			array_caratteri[8] = "I";		
			array_caratteri[9] = "J";
			array_caratteri[10] = "K";
			array_caratteri[11] = "L";
			array_caratteri[12] = "M";
			array_caratteri[13] = "N";
			array_caratteri[14] = "O";
			array_caratteri[15] = "P";
			array_caratteri[16] = "Q";
			array_caratteri[17] = "R";
			array_caratteri[18] = "S";
			array_caratteri[19] = "T";
			array_caratteri[20] = "U";
			array_caratteri[21] = "V";
			array_caratteri[22] = "W";
			array_caratteri[23] = "X";
			array_caratteri[24] = "Y";
			array_caratteri[25] = "Z";
			array_caratteri[26] = "0";
			array_caratteri[27] = "1";
			array_caratteri[28] = "2";
			array_caratteri[29] = "3";
			array_caratteri[30] = "4";
			array_caratteri[31] = "5";
			array_caratteri[32] = "6";
			array_caratteri[33] = "7";
			array_caratteri[34] = "8";
			array_caratteri[35] = "9";		
		
		
				//incominciamo a passare ogni lettera del codice fiscale con substring
				for (a=0; a<cod_fisc_inserito.length-1; a++) {
					//mamorizziamo di volta in volta il carattere numerico o alfanumerico
					//all'interno della variabile part
					part=cod_fisc_inserito.substring(a,a+1);
						
						for(var i=0; i<array_caratteri.length; i++){
							//Se il primo carattere del codice fiscale inserito corrisponde ad un valore dell'array 
							if (part== array_caratteri[i]) {
								//se la posizione del carattere è dispari
								if( (a+1)%2 != 0){
									if(part=="A"){sommatotale = sommatotale + 1;}
									if(part=="B"){sommatotale = sommatotale + 0;}
									if(part=="C"){sommatotale = sommatotale + 5;}
									if(part=="D"){sommatotale = sommatotale + 7;}	
									if(part=="E"){sommatotale = sommatotale + 9;}
									if(part=="F"){sommatotale = sommatotale + 13;}
									if(part=="G"){sommatotale = sommatotale + 15;}
									if(part=="H"){sommatotale = sommatotale + 17;}	
									if(part=="I"){sommatotale = sommatotale + 19;}
									if(part=="J"){sommatotale = sommatotale + 21;}
									if(part=="K"){sommatotale = sommatotale + 2;}
									if(part=="L"){sommatotale = sommatotale + 4;}	
									if(part=="M"){sommatotale = sommatotale + 18;}
									if(part=="N"){sommatotale = sommatotale + 20;}
									if(part=="O"){sommatotale = sommatotale + 11;}
									if(part=="P"){sommatotale = sommatotale + 3;}
									if(part=="Q"){sommatotale = sommatotale + 6;}
									if(part=="R"){sommatotale = sommatotale + 8;}
									if(part=="S"){sommatotale = sommatotale + 12;}
									if(part=="T"){sommatotale = sommatotale + 14;}
									if(part=="U"){sommatotale = sommatotale + 16;}
									if(part=="V"){sommatotale = sommatotale + 10;}
									if(part=="W"){sommatotale = sommatotale + 22;}
									if(part=="X"){sommatotale = sommatotale + 25;}
									if(part=="Y"){sommatotale = sommatotale + 24;}
									if(part=="Z"){sommatotale = sommatotale + 23;}
									if(part=="0"){sommatotale = sommatotale + 1;}
									if(part=="1"){sommatotale = sommatotale + 0;}	
									if(part=="2"){sommatotale = sommatotale + 5;}
									if(part=="3"){sommatotale = sommatotale + 7;}
									if(part=="4"){sommatotale = sommatotale + 9;}
									if(part=="5"){sommatotale = sommatotale + 13;}
									if(part=="6"){sommatotale = sommatotale + 15;}
									if(part=="7"){sommatotale = sommatotale + 17;}
									if(part=="8"){sommatotale = sommatotale + 19;}
									if(part=="9"){sommatotale = sommatotale + 21;}
								}
								//se la posizione del carattere è pari							
								else {
									if(part=="A"){sommatotale = sommatotale + 0;}
									if(part=="B"){sommatotale = sommatotale + 1;}
									if(part=="C"){sommatotale = sommatotale + 2;}
									if(part=="D"){sommatotale = sommatotale + 3;}	
									if(part=="E"){sommatotale = sommatotale + 4;}
									if(part=="F"){sommatotale = sommatotale + 5;}
									if(part=="G"){sommatotale = sommatotale + 6;}
									if(part=="H"){sommatotale = sommatotale + 7;}	
									if(part=="I"){sommatotale = sommatotale + 8;}
									if(part=="J"){sommatotale = sommatotale + 9;}
									if(part=="K"){sommatotale = sommatotale + 10;}
									if(part=="L"){sommatotale = sommatotale + 11;}	
									if(part=="M"){sommatotale = sommatotale + 12;}
									if(part=="N"){sommatotale = sommatotale + 13;}
									if(part=="O"){sommatotale = sommatotale + 14;}
									if(part=="P"){sommatotale = sommatotale + 15;}
									if(part=="Q"){sommatotale = sommatotale + 16;}
									if(part=="R"){sommatotale = sommatotale + 17;}
									if(part=="S"){sommatotale = sommatotale + 18;}
									if(part=="T"){sommatotale = sommatotale + 19;}
									if(part=="U"){sommatotale = sommatotale + 20;}
									if(part=="V"){sommatotale = sommatotale + 21;}
									if(part=="W"){sommatotale = sommatotale + 22;}
									if(part=="X"){sommatotale = sommatotale + 23;}
									if(part=="Y"){sommatotale = sommatotale + 24;}
									if(part=="Z"){sommatotale = sommatotale + 25;}
									if(part=="0"){sommatotale = sommatotale + 0;}
									if(part=="1"){sommatotale = sommatotale + 1;}	
									if(part=="2"){sommatotale = sommatotale + 2;}
									if(part=="3"){sommatotale = sommatotale + 3;}
									if(part=="4"){sommatotale = sommatotale + 4;}
									if(part=="5"){sommatotale = sommatotale + 5;}
									if(part=="6"){sommatotale = sommatotale + 6;}
									if(part=="7"){sommatotale = sommatotale + 7;}
									if(part=="8"){sommatotale = sommatotale + 8;}
									if(part=="9"){sommatotale = sommatotale + 9;}
								}
								
							}
						}
						
				}
				//questa variabile sarà il numero che mi aiutera a sapere qual'è l'ultimo carattere
				resto = sommatotale % 26;
				
				
				
				if(resto=="0"){check_digit_calcolato = "A";}
				if(resto=="1"){check_digit_calcolato = "B";}
				if(resto=="2"){check_digit_calcolato = "C";}
				if(resto=="3"){check_digit_calcolato = "D";}	
				if(resto=="4"){check_digit_calcolato = "E";}
				if(resto=="5"){check_digit_calcolato = "F";}
				if(resto=="6"){check_digit_calcolato = "G";}
				if(resto=="7"){check_digit_calcolato = "H";}
				if(resto=="8"){check_digit_calcolato = "I";}	
				if(resto=="9"){check_digit_calcolato = "J";}
				if(resto=="10"){check_digit_calcolato = "K";}
				if(resto=="11"){check_digit_calcolato = "L";}
				if(resto=="12"){check_digit_calcolato = "M";}
				if(resto=="13"){check_digit_calcolato = "N";}	
				if(resto=="14"){check_digit_calcolato = "O";}
				if(resto=="15"){check_digit_calcolato = "P";}
				if(resto=="16"){check_digit_calcolato = "Q";}
				if(resto=="17"){check_digit_calcolato = "R";}
				if(resto=="18"){check_digit_calcolato = "S";}	
				if(resto=="19"){check_digit_calcolato = "T";}
				if(resto=="20"){check_digit_calcolato = "U";}
				if(resto=="21"){check_digit_calcolato = "V";}
				if(resto=="22"){check_digit_calcolato = "W";}
				if(resto=="23"){check_digit_calcolato = "X";}	
				if(resto=="24"){check_digit_calcolato = "Y";}
				if(resto=="25"){check_digit_calcolato = "Z";}
			
//				alert("l'ultimo carattere calcolato è " + check_digit_calcolato);
//				alert("l'ultimo carattere inserito è " + check_digit_inserito);
				if(check_digit_inserito !== check_digit_calcolato){
					//alert("Attenzione! Il codice fiscale è errato");
					//document.frmPagamento.sAltCodiceFiscale.focus();
					return false;
				} else {
					return true;
				}		
		
}


