function calcolaCF(cognome,nome,data_di_nascita,codicecomune,sesso) {
	var appo = ""; // di volta in volta metto il parametro da codificare
	var appino = "", somma = 0; // di servizio
	var cf_cognome = "", cf_nome = "", cf_datanascita = "", cf_comune = "", cf_carcontrollo = ""; // pezzi già codificati

	// parsing cognome
	cognome = cognome.toUpperCase();
	cognome = cognome.replace(/ /g,"");
	for (i=0; i<cognome.length; i++) {
		if (cf_cognome.length<3 && (cognome.charAt(i)!="A" && cognome.charAt(i)!="E" && cognome.charAt(i)!="I" && cognome.charAt(i)!="O" && cognome.charAt(i)!="U" && cognome.charAt(i)>"A" && cognome.charAt(i)<="Z")) cf_cognome += cognome.charAt(i);
	}
	if (cf_cognome.length<3) {
		for (i=0; i<cognome.length; i++) {
			if (cf_cognome.length<3 && (cognome.charAt(i)=="A" || cognome.charAt(i)=="E" || cognome.charAt(i)=="I" || cognome.charAt(i)=="O" || cognome.charAt(i)=="U")) cf_cognome += cognome.charAt(i);
		}
		if (cf_cognome.length < 3) {
			for (i=cf_cognome.length; i<3; i++) cf_cognome += 'X';
		}
	}
	
	// parsing nome
	nome = nome.toUpperCase();
	nome = nome.replace(/ /g,"");
	appino = "";
	for (i=0; i<nome.length; i++) {
		if (nome.charAt(i)!="A" && nome.charAt(i)!="E" && nome.charAt(i)!="I" && nome.charAt(i)!="O" && nome.charAt(i)!="U" && nome.charAt(i)>"A" && nome.charAt(i)<="Z") appino += nome.charAt(i); // prendiamo tutte le consonanti
	}
/*	if (appino.length<3) cf_nome = appino.substring(0,1);
	else if (appino.length<4) cf_nome = appino.substring(0,1) + appino.substring(2,3);
	else cf_nome = appino.substring(0,1) + appino.substring(2,4);*/
	if (appino.length<4) cf_nome = appino;
	else cf_nome = appino.substring(0,1) + appino.substring(2,4);
	if (cf_nome.length<3) {
		for (i=0; i<nome.length; i++) {
			if (cf_nome.length<3 && (nome.charAt(i)=="A" || nome.charAt(i)=="E" || nome.charAt(i)=="I" || nome.charAt(i)=="O" || nome.charAt(i)=="U")) cf_nome += nome.charAt(i);
		}
		if (cf_nome.length < 3) {
			for (i=cf_nome.length; i<3; i++) cf_nome += 'X';
		}
	}

	// parsing data di nascita
	//anno
	cf_datanascita = data_di_nascita.substring(8);
	//mese
	var arrmese = new Array('A','B','C','D','E','H','L','M','P','R','S','T');
	cf_datanascita += arrmese[parseInt(data_di_nascita.substring(3,5),10)-1];
	//giorno
	if (sesso=="M") cf_datanascita += data_di_nascita.substring(0,2);
	else cf_datanascita += (40+parseInt(data_di_nascita.substring(0,2),10)).toString();
	
	// parsing comune di nascita
	cf_comune = codicecomune;
	
	// parsing carattere di controllo
	appo = cf_cognome + cf_nome + cf_datanascita + cf_comune; // sono 15 caratteri
	acode = "A".charCodeAt(0);//if (((i+1) % 2) != 0) //caratteri dispari
	//posizioni pari
	appino = "";
	somma = 0;
	for (i=1; i<15; i=i+2) appino += appo.charAt(i);
	for (i=0; i<7; i++) {
		switch (appino.charAt(i)) {
			case '0': case '1':	case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
				somma += parseInt(appino.charAt(i));
			break;
			default: // tutti gli altri casi (le lettere)
				somma += appino.charAt(i).charCodeAt(0)-acode;
			break;
		}
	}
	//posizioni dispari
	appino = "";
	for (i=0; i<15; i=i+2) appino += appo.charAt(i);
	for (i=0; i<8; i++) {
		switch (appino.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;
		}
	}
	//calcolo finale
	somma %= 26;
	switch (somma) {
		case 0: cf_carcontrollo='A'; break;
		case 1: cf_carcontrollo='B'; break;
		case 2: cf_carcontrollo='C'; break;
		case 3: cf_carcontrollo='D'; break;
		case 4: cf_carcontrollo='E'; break;
		case 5: cf_carcontrollo='F'; break;
		case 6: cf_carcontrollo='G'; break;
		case 7: cf_carcontrollo='H'; break;
		case 8: cf_carcontrollo='I'; break;
		case 9: cf_carcontrollo='J'; break;
		case 10: cf_carcontrollo='K'; break;
		case 11: cf_carcontrollo='L'; break;
		case 12: cf_carcontrollo='M'; break;
		case 13: cf_carcontrollo='N'; break;
		case 14: cf_carcontrollo='O'; break;
		case 15: cf_carcontrollo='P'; break;
		case 16: cf_carcontrollo='Q'; break;
		case 17: cf_carcontrollo='R'; break;
		case 18: cf_carcontrollo='S'; break;
		case 19: cf_carcontrollo='T'; break;
		case 20: cf_carcontrollo='U'; break;
		case 21: cf_carcontrollo='V'; break;
		case 22: cf_carcontrollo='W'; break;
		case 23: cf_carcontrollo='X'; break;
		case 24: cf_carcontrollo='Y'; break;
		case 25: cf_carcontrollo='Z'; break;
	}

	return (cf_cognome + cf_nome + cf_datanascita + cf_comune + cf_carcontrollo);
}

function controllaCF(v) {
	var appo = v.toUpperCase();
	var c = true;
	if (appo.length!=16) c = false;
	else if ((appo.charAt(0)<"A" || appo.charAt(0)>"Z") || 
		   (appo.charAt(1)<"A" || appo.charAt(1)>"Z") || 
		   (appo.charAt(2)<"A" || appo.charAt(2)>"Z") || 
		   (appo.charAt(3)<"A" || appo.charAt(3)>"Z") || 
		   (appo.charAt(4)<"A" || appo.charAt(4)>"Z") || 
		   (appo.charAt(5)<"A" || appo.charAt(5)>"Z") || 
		   (appo.charAt(6)<"0" || appo.charAt(6)>"9") || 
		   (appo.charAt(7)<"0" || appo.charAt(7)>"9") || 
		   (appo.charAt(8)<"A" || appo.charAt(8)>"Z") || 
		   (appo.charAt(9)<"0" || appo.charAt(9)>"9") || 
		   (appo.charAt(10)<"0" || appo.charAt(10)>"9") || 
		   (appo.charAt(11)<"A" || appo.charAt(11)>"Z") || 
		   (appo.charAt(12)<"0" || appo.charAt(12)>"9") || 
		   (appo.charAt(13)<"0" || appo.charAt(13)>"9") || 
		   (appo.charAt(14)<"0" || appo.charAt(14)>"9") || 
		   (appo.charAt(15)<"A" || appo.charAt(15)>"Z")) c =false;
	return c;
}