String.prototype.isFiscalCode = function() {
if (!(/^[A-Z]{6}\d{2}[A-Z]\d{2}[A-Z]\d{3}[A-Z]$/i).test(this)) return false;
var _convOdd = 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 strFiscal = this.slice(0,15).toUpperCase();
for (var i=0,chksum=0;i<strFiscal.length;i+=2) {
chksum += _convOdd[(isNaN(strFiscal.charAt(i))) ? strFiscal.charAt(i).charCodeAt(0)-65 : strFiscal.charAt(i)-0];
chksum += (isNaN(strFiscal.charAt(i+1))) ? strFiscal.charAt(i+1).charCodeAt(0)-65 : strFiscal.charAt(i+1)-0;
}
return (String.fromCharCode(65 + chksum % 26) == this.slice(-1).toUpperCase());
}
alert("codicefiscale".isFiscalCode())