/*
*  cf.js
* ----------------------------------------------------------------------------
*  Copyright © 1995-2004 Intesys S.r.l. Verona (I). All rights reserved.
* ----------------------------------------------------------------------------
*  Data e versione:
*	05/11/2004 - 1.00
* ----------------------------------------------------------------------------
*/

function isValidCF(cf, cognome, nome, dataNascita, sesso) {
	// dataNascita nel formato 'dd/mm/yyyy'
	// sesso = ('M' | 'F')
	cf = cf.toUpperCase()
    var re  = '^'
			+ calcolaCognome(cognome.toUpperCase())
			+ calcolaNome(nome.toUpperCase())
			+ calcolaNascita(dataNascita, sesso.toUpperCase())
			+ '[A-Z][LQUMRVNSPT\\d]{3,3}[A-Z]$'
	var reCF = new RegExp(re)
	return reCF.test(cf) && cfCheckKey(cf)
}


function calcolaCognome(cognome) {
	var code = getConsonanti(cognome)+getVocali(cognome)+'XXX'
	return code.substring(0,3)
}


function calcolaNome(nome) {
	var cons = getConsonanti(nome)
	if (cons.length > 3) {
		return cons.substring(0, 1) + cons.substring(2, 4)
	} else {
		return (cons+getVocali(nome)+'XXX').substring(0,3);
	}
}


function getConsonanti(str) {
	return str.split(/[^bcdfghjklmnpqrstvwxyz]/i).join('')
}


function getVocali(str) {
	return str.split(/[^aeiou]/i).join('')
}


function re4omocodia(str) {
	str = '' + str
	var result = ''
	for (var i=0; i<str.length; i++) {
		var ch = str.substring(i, i+1)
		result += '['
			   + ch
			   + (ch == '0' ? 'L' : '')
			   + (ch == '1' ? 'M' : '')
			   + (ch == '2' ? 'N' : '')
			   + (ch == '3' ? 'P' : '')
			   + (ch == '4' ? 'Q' : '')
			   + (ch == '5' ? 'R' : '')
			   + (ch == '6' ? 'S' : '')
			   + (ch == '7' ? 'U' : '')
			   + (ch == '8' ? 'T' : '')
			   + (ch == '9' ? 'V' : '')
			   + ']'
	}
	return result
}


function calcolaNascita(dataNascita, sesso) {
	var giorno = dataNascita.substring(0, 2)
	var mese   = dataNascita.substring(3, 5)
	var anno   = dataNascita.substring(8, 10)
	var codiceMese = 'ABCDEHLMPRST'
	return re4omocodia(anno)
		 + codiceMese.charAt(parseInt(mese, 10) - 1)
		 + re4omocodia((sesso == 'F' ? 40 + parseInt(giorno, 10) : giorno))
}


function cfCheckKey(cf) { 
	var set1 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	var set2 = "ABCDEFGHIJABCDEFGHIJKLMNOPQRSTUVWXYZ"
	var setpari = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	var setdisp = "BAKPLCQDREVOSFTGUHMINJWZYX"
	var s = 0
	var i = 1;
	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
	}
	return true
} 

