var provinceItaliane = [
'AG',
'AL',
'AN',
'AO',
'AR',
'AP',
'AT',
'AV',
'BA',
'BT',
'BL',
'BN',
'BG',
'BI',
'BO',
'BZ',
'BS',
'BR',
'CA',
'CL',
'CB',
'CI',
'CE',
'CT',
'CZ',
'CH',
'CO',
'CS',
'CR',
'KR',
'CN',
'EN',
'FM',
'FE',
'FI',
'FG',
'FC',
'FR',
'GE',
'GO',
'GR',
'IM',
'IS',
'SP',
'AQ',
'LT',
'LE',
'LC',
'LI',
'LO',
'LU',
'MC',
'MN',
'MS',
'MT',
'ME',
'MI',
'MO',
'MB',
'NA',
'NO',
'NU',
'OT',
'OR',
'PD',
'PA',
'PR',
'PV',
'PG',
'PU',
'PE',
'PC',
'PI',
'PT',
'PN',
'PZ',
'PO',
'RG',
'RA',
'RC',
'RE',
'RI',
'RN',
'RM',
'RO',
'SA',
'VS',
'SS',
'SV',
'SI',
'SR',
'SO',
'TA',
'TE',
'TR',
'TO',
'OG',
'TP',
'TN',
'TV',
'TS',
'UD',
'VA',
'VE',
'VB',
'VC',
'VR',
'VV',
'VI',
'VT'
];

Validation.addAllThese([
	[
		'validate-codicefiscale',
		'Per favore immetti un codice fiscale valido.',
		function(v){
			return verificaCodiceFiscale(v);
		}
	],
	[
		'validate-piva',
		'Per favore immetti una partita iva valida.',
		function(v){
			return verificaPartitaIva(v);
		}
	],
	[
		'validate-provincia',
		'Per favore immetti una sigla di una provincia Italiana valida.',
		function(v){
			var country = $('country');
			if( country == null ){
				country = $('billing:country_id');
			}
			if( country == null ){
				country = $('shipping:country_id');
			}
			if( country == null ){
				return true;
			}
			if( country.value == 'IT' ){
				switch(true){
					case (v.length != 2):
						return false;
						break;
					default:
						return provinceItaliane.indexOf( v.toUpperCase() ) > -1;
						break;
				}
			}
			else{
				return true;
			} 
		}
	]
]);

function verificaCodiceFiscale(v){
	var cf = v;

	var country = $('country');
	if( country == null ){
		country = $('billing:country_id');
	}
	if( country == null ){
		country = $('shipping:country_id');
	}
	if( country == null ){
		return true;
	}
	if( country.value == 'IT' ){
		switch(true){
			case (cf.length == 0):
				return true;
				break;
			case (cf.length == 11):
				return verificaPartitaIva(v);
				break;
			case (cf.length != 16):
				return false;
				break;
			default:
				cf = cf.toUpperCase();
				allowedChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
				for( i = 0; i < 16; i++ ){
					if( allowedChars.indexOf( cf.charAt(i) ) == -1 ){
						return false;
					}
				}
				var set1 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
				var set2 = "ABCDEFGHIJABCDEFGHIJKLMNOPQRSTUVWXYZ";
				var setpari = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
				var setdisp = "BAKPLCQDREVOSFTGUHMINJWZYX";
				var 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;
				}
				break;
		}
	}
	
	return true;
}

function verificaPartitaIva(v){
	var country = $('country');
	if( country == null ){
		country = $('billing:country_id');
	}
	if( country == null ){
		country = $('shipping:country_id');
	}
	if( country == null ){
		return true;
	}
	if( country.value == 'IT' ){
		switch(true){
				case ( v.length == 0 ):
					return true;
					break;
				case ( v.length > 0 && (v.length != 11) ):
					return false;
					break;
			}
	
			var allowedChars = "0123456789";
			for( i = 0; i < 11; i++ ){
				if( allowedChars.indexOf( v.charAt(i) ) == -1 ){
					return false;
				}
			}
	
			s = 0;
			for( i = 0; i <= 9; i += 2 ){
				s += v.charCodeAt(i) - '0'.charCodeAt(0);
			}
	
			for( i = 1; i <= 9; i += 2 ){
				c = 2*( v.charCodeAt(i) - '0'.charCodeAt(0) );
				if( c > 9 ){ c = c - 9; }
				s += c;
			}
	
			if( ( 10 - s % 10 ) % 10 != v.charCodeAt(10) - '0'.charCodeAt(0) ){
				return false;
			}
	}
	
	return true;
}
