
function CalcolaCodiceFiscale( sNome, sCognome, sCodiceComuneNascita, sDataNascita, sSesso ) {
	// debug parametri ricevuti
	//alert('['+sNome+'] ['+sCognome+'] ['+sCodiceComuneNascita+'] ['+sDataNascita+'] ['+sSesso+']');

	// variabili d'appoggio
	var sCodiceFiscale = '';
	var cfCognome = '';
	var cfNome = '';
	var cfSesso = '';
	var cfMese = '';
	var cfChrControllo = '';
	var i, somma=0;
	
	// controllo sulla validità dei dati ricevuti
	if (sNome.length<1) return ''; else sNome=sNome.toUpperCase();
	if (sCognome.length<1) return ''; else sCognome=sCognome.toUpperCase();
	if (sCodiceComuneNascita.length!=4) return '';
	if (sDataNascita.length!=10) return '';
	if ((sSesso.length!=1) || ( (sSesso!='M') && (sSesso!='F') && (sSesso!='f') && (sSesso!='m') )) return '';

	// identificazione gg, mm e aaaa di nascita
	var gg = sDataNascita.substr(0,2);
	var mm = sDataNascita.substr(3,2);
	var aa = sDataNascita.substr(8,2);
	//identificazione sesso (o maschio, 1 femmina)
	if ((sSesso=='F') || (sSesso=='f')) 
		sSesso = 1;
	else 
		sSesso = 0;
	
	// Processa il mese
	//----------------------------------------------------------------
	switch (mm) {
			case '01': cfMese='A' ; break;            
			case '02': cfMese='B' ; break;            
			case '03': cfMese='C' ; break;            
			case '04': cfMese='D' ; break;            
			case '05': cfMese='E' ; break;            
			case '06': cfMese='H' ; break;            
			case '07': cfMese='L' ; break;            
			case '08': cfMese='M' ; break;            
			case '09': cfMese='P' ; break;            
			case '10': cfMese='R' ; break;            
			case '11': cfMese='S' ; break;            
			case '12': cfMese='T' ; break;            
	}
	
	// Processa il cognome
	//----------------------------------------------------------------
	for (i=0; i<sCognome.length; i++) {
			 switch (sCognome.charAt(i)) {
					case 'A':
					case 'E':
					case 'I':
					case 'O':
					case 'U': break;            
					default : 
							if((sCognome.charAt(i)<='Z') && (sCognome.charAt(i)>'A'))
								cfCognome = cfCognome + sCognome.charAt(i);
			}
	}
	if (cfCognome.length < 3)  {
			for (i=0; i<sCognome.length; i++) {
					switch (sCognome.charAt(i)) {
						  case 'A':
						  case 'E':
						  case 'I':
						  case 'O':
						  case 'U': cfCognome = cfCognome + sCognome.charAt(i);
					}
			}
			if (cfCognome.length < 3) {
					for (i=cfCognome.length; i<=3; i++) 
						 { cfCognome = cfCognome + 'X'; }
			}
	}
	cfCognome = cfCognome.substring(0,3);
	//------------------------------------------------------------ 
	
	
	// processa il nome
	//----------------------------------------------------------------
	for (i=0; i<sNome.length; i++) {
			switch (sNome.charAt(i)) {
					case 'A':
					case 'E':
					case 'I':
					case 'O':
					case 'U': break;
					default:
							if((sNome.charAt(i)<='Z')&& (sNome.charAt(i)>'A'))
								cfNome = cfNome + sNome.charAt(i);
			}
	}
	if (cfNome.length > 3) {
			cfNome = cfNome.substring(0,1) + cfNome.substring(2,4);
	} 
	else {
			if (cfNome.length < 3) {
					for (i=0; i<sNome.length; i++) {
							switch (sNome.charAt(i)) {
								 case 'A':
								 case 'E':
								 case 'I':
								 case 'O':
								 case 'U': cfNome = cfNome + sNome.charAt(i);
							}
					}
					if (cfNome.length < 3) {
						for (i=cfNome.length; i<=3; i++) 
							{cfNome = cfNome + 'X';}
					}
			}
			cfNome = cfNome.substring(0,3);
	}
	//--------------------------------------- Fine processa nome
	
	
	// processa giorno e sesso
	//--------------------------------------------
	cfSesso = parseInt(gg,10) + (40 * sSesso);
	if (cfSesso<10) cfSesso='0'+cfSesso;
	// alert(gg+'-'+mm+'-'+aa+'  -  '+parseInt(gg,10)+'  -  '+cfSesso);
	//--------------------------------------------
	
	sCodiceFiscale = cfCognome + cfNome + aa + cfMese + cfSesso + sCodiceComuneNascita;
	
	// calcola la cifra di controllo
	//--------------------------------------------
	for (i=0; i<15; i++) {
			if (((i+1) % 2) != 0) {	//caratteri dispari
					switch (sCodiceFiscale.charAt(i)) {
							case '0':
							case 'A':{ somma += 1; break;}
							case '1':
							case 'B':{ somma += 0; break;}
							case '2':
							case 'C':{ somma += 5; break;}
							case '3':
							case 'D':{ somma += 7; break;}
							case '4':
							case 'E':{ somma += 9; break;}
							case '5':
							case 'F':{ somma += 13; break;}
							case '6':
							case 'G':{ somma += 15; break;}
							case '7':
							case 'H':{ somma += 17; break;}
							case '8':
							case 'I':{ somma += 19; break;}
							case '9':
							case 'J':{ somma += 21; break;}
							case 'K':{ somma += 2; break;}
							case 'L':{ somma += 4; break;}
							case 'M':{ somma += 18; break;}
							case 'N':{ somma += 20; break;}
							case 'O':{ somma += 11; break;}
							case 'P':{ somma += 3; break;}
							case 'Q':{ somma += 6; break;}
							case 'R':{ somma += 8; break;}
							case 'S':{ somma += 12; break;}
							case 'T':{ somma += 14; break;}
							case 'U':{ somma += 16; break;}
							case 'V':{ somma += 10; break;}
							case 'W':{ somma += 22; break;}
							case 'X':{ somma += 25; break;}
							case 'Y':{ somma += 24; break;}
							case 'Z':{ somma += 23; break;}
					}
			} else { //caratteri pari
					switch (sCodiceFiscale.charAt(i)) {
							case '0':
							case 'A':{ somma += 0; break;}
							case '1':
							case 'B':{ somma += 1; break;}
							case '2':
							case 'C':{ somma += 2; break;}
							case '3':
							case 'D':{ somma += 3; break;}
							case '4':
							case 'E':{ somma += 4; break;}
							case '5':
							case 'F':{ somma += 5; break;}
							case '6':
							case 'G':{ somma += 6; break;}
							case '7':
							case 'H':{ somma += 7; break;}
							case '8':
							case 'I':{ somma += 8; break;}
							case '9':
							case 'J':{ somma += 9; break;}
							case 'K':{ somma += 10; break;}
							case 'L':{ somma += 11; break;}
							case 'M':{ somma += 12; break;}
							case 'N':{ somma += 13; break;}
							case 'O':{ somma += 14; break;}
							case 'P':{ somma += 15; break;}
							case 'Q':{ somma += 16; break;}
							case 'R':{ somma += 17; break;}
							case 'S':{ somma += 18; break;}
							case 'T':{ somma += 19; break;}
							case 'U':{ somma += 20; break;}
							case 'V':{ somma += 21; break;}
							case 'W':{ somma += 22; break;}
							case 'X':{ somma += 23; break;}
							case 'Y':{ somma += 24; break;}
							case 'Z':{ somma += 25; break;}
					}
			}
	}
	somma %= 26;
	switch (somma) {
			case 0: {cfChrControllo='A'; break;}
			case 1: {cfChrControllo='B'; break;}
			case 2: {cfChrControllo='C'; break;}
			case 3: {cfChrControllo='D'; break;}
			case 4: {cfChrControllo='E'; break;}
			case 5: {cfChrControllo='F'; break;}
			case 6: {cfChrControllo='G'; break;}
			case 7: {cfChrControllo='H'; break;}
			case 8: {cfChrControllo='I'; break;}
			case 9: {cfChrControllo='J'; break;}
			case 10: {cfChrControllo='K'; break;}
			case 11: {cfChrControllo='L'; break;}
			case 12: {cfChrControllo='M'; break;}
			case 13: {cfChrControllo='N'; break;}
			case 14: {cfChrControllo='O'; break;}
			case 15: {cfChrControllo='P'; break;}
			case 16: {cfChrControllo='Q'; break;}
			case 17: {cfChrControllo='R'; break;}
			case 18: {cfChrControllo='S'; break;}
			case 19: {cfChrControllo='T'; break;}
			case 20: {cfChrControllo='U'; break;}
			case 21: {cfChrControllo='V'; break;}
			case 22: {cfChrControllo='W'; break;}
			case 23: {cfChrControllo='X'; break;}
			case 24: {cfChrControllo='Y'; break;}
			case 25: {cfChrControllo='Z'; break;}
	}
	//--------------------------------------------

	sCodiceFiscale = sCodiceFiscale + cfChrControllo;
	if (sCodiceFiscale.length!=16) 
		return '';
	else
		return sCodiceFiscale; 
}


