codice:
<%@ Language=JScript %>
<%
// Mappatura conversione caratteri posizione dispari
var mapChars = new Array(1, 0, 5, 7, 9, 13, 15, 17, 19, 21, 2, 4, 18,
20, 11, 3, 6, 8, 12, 14, 16, 10, 22, 25, 24, 23);
var errCode = 0;
function buildFiscalCode(firstName, lastName, birthDate, city, sex)
{
firstName = checkName(firstName);
errCode = 1; // Codice errore per Nome invalido
if (firstName.length < 1) return(false);
lastName = checkName(lastName);
errCode = 2; // Codice errore per Cognome invalido
if (lastName.length < 1) return(false);
errCode = 3; // Codice errore per Data invalida
if ((birthDate = checkDate(birthDate)) == false) return(false);
var code = codeName(lastName, 3);
code += codeName(firstName, 4) + birthDate.substr(6, 2);
code += "ABCDEHLMPRST".substr(parseInt(birthDate.substr(2, 2), 10) - 1, 1);
code += ((sex != 0) ? birthDate.substr(0, 2) : parseInt(birthDate.substr(0, 2), 10) + 40);
errCode = 4; // Codice errore per codice Comune/Nazione invalido
if (city.match(/^[A-Z]\d{3}$/) == null) return(false);
code += city;
checkSum = 0;
for ( n = 0 ; n < 15 ; n++ )
{
c = code.charCodeAt(n);
if (n & 1) checkSum += (c > 57) ? (c - 65) : (c - 48);
else checkSum += (c > 57) ? mapChars[c - 65] : mapChars[c - 48];
}
code += String.fromCharCode((checkSum % 26) + 65);
errCode = 0; // Nessun errore
return(code);
}
// Codifica il cognome: prima, seconda e terza consonante (se possibile)
// Codifica il nome: prima, terza e quarta consonante (se possibile)
function codeName(name, lim)
{
var code = "", r = name.match(/[^AEIOU]/g);
if (r != null) for ( n = 0 ; n < r.length && code.length < lim ; n++ ) code += r[n];
if (code.length > 3) code = code.substr(0, 1) + code.substr(2, 2); // prima, terza e quarta consonante
if (code.length < 3) // Se le consonanti non arrivano a 3, aggiungi le vocali
{
r = name.match(/[AEIOU]/g);
if (r != null) for ( n = 0 ; n < r.length && code.length < 3 ; n++ ) code += r[n];
}
while (code.length < 3) code += "X"; // Se minore di 3 caratteri, aggiungi "X"
return(code);
}
function checkName(name)
{
name = name.toUpperCase();
name = name.replace(/[ÀÁÂÃÄÅàáâãäå]/g, "A"); // Converti le 'A' accentate
name = name.replace(/[ÈÉÊËèéêë]/g, "E"); // Converti le 'E' accentate
name = name.replace(/[ÌÍÎÏìíîï]/g, "I"); // Converti le 'I' accentate
name = name.replace(/[ÒÓÔÕÖòóôõö]/g, "O"); // Converti le 'O' accentate
name = name.replace(/[ÙÚÛÜùúûü]/g, "U"); // Converti le 'U' accentate
name = name.replace(/[Çç]/g, "C"); // Converti le 'ç'
name = name.replace(/[Ññ]/g, "N"); // Converti le 'N' accentate
name = name.replace(/[Ýýÿ]/g, "Y"); // Converti le 'Y' accentate
return(name.replace(/[^A-Z]/g, "")); // Elimina qualsiasi carattere non sia una lettera
}
function checkDate(birthDate)
{
if ((r = birthDate.match(/^(\d{2})([/-]?)(\d{2})\2(\d{4})$/)) == null &&
(r = birthDate.match(/^(\d{1,2})([/-])(\d{1,2})\2(\d{2}|\d{4})$/)) == null) return(false);
var day = parseInt(r[1], 10); // Inserire la radice '10' in modo da forzare la conversione
var month = parseInt(r[3], 10); // decimale e non ottale (nel caso di leading-zeros)
var year = parseInt(r[4], 10);
if (year < 100) year += 1900;
if (year < 1800 || year > (new Date()).getFullYear()) return(false); // Anno compreso tra 1800 e anno corrente
if (month <1 | month > 12) return(false); // Mese compreso tra 1 e 12
if (month == 2) maxDay = (!(year % 4) && ((year % 100) || !(year % 400))) ? 29 : 28;
else maxDay = (month == 4 || month == 6 || month == 9 || month == 11) ? 30 : 31;
if (day <1 | day > maxDay) return(false); // Giorno compreso tra 1 e max giorni del mese corrente
var dt = (day < 10) ? "0" + day : day;
return(dt + ((month < 10) ? "0" + month : month) + year); // Formatta "ddmmyyyy"
}
%>