/** 
*	@file js/num_ss.js
*	@author Cyril COPHIGNON
*	@date 2006/08/16 
*	@brief Bibliotheque javascript de gestion des numeros de securite sociale
*	@brief 11/07/2008 Ajout des fonctions pour gérer le numéro de sécu ES
*/

/** 
*	@fn function IsNumSS(valeur, pays)
*	@brief fonction qui verifie la validité d'un numero de secucite sociale
*	@param valeur chaine supposee etre un numero de secu
*	@param pays identifiant du pays 57: france, 63: espagne
*	@return	bool True: numero de secu valide
*/
function IsNumSS(valeur, pays)
{
	switch(Number(pays))
	{
		case 57: return IsNumSS_FR(valeur); break;
		case 63: return IsNumSS_ES(valeur); break;
		case 16: return IsNumSS_BE(valeur); break;
		case 86: return IsNumSS_IT(valeur); break;
	}
	return false;
}

/** 
*	@fn function IsNumSS_FR(valeur)
*	@brief fonction que la chaine passe en parametre est un format de numero de secu FR valide
*	@param valeur chaine supposee etre un numero de secu
*	@return	bool True: numero de secu valide
*/
function IsNumSS_FR(valeur)
{
	var reg= new RegExp("^[12]{1}[ \.\-]?[0-9]{2}[ \.\-]?([0][0-9]|[1][0-2])[ \.\-]?([0-9]{2}|2A|2B)[ \.\-]?[0-9]{3}[ \.\-]?[0-9]{3}[ \.\-]?[0-9]{2}$","gi"); 
	return (valeur.search(reg) !=-1 && IsCleSS_FR(valeur));
}

/** 
*	@fn function IsNumSS_ES(valeur)
*	@brief fonction que la chaine passe en parametre est un ofrmat de numero de secu ES valide
*	@param valeur chaine supposee etre un numero de secu
*	@return	bool True: numero de secu valide
*/
function IsNumSS_ES(valeur)
{
	var reg = new RegExp('^([0-4]{1}[0-9]{1}|50|51|52)[ \.\-]?([0-9]{8})[ \.\-]?([0-9]{2})$', "gi"); 
	return (valeur.search(reg) !=-1 && IsCleSS_ES(valeur));
}

/** 
*	@fn function IsNumSS_BE(valeur)
*	@brief fonction que la chaine passe en parametre est un format de numero de secu BE valide
*	@param valeur chaine supposee etre un numero de secu
*	@return	bool True: numero de secu valide
*/
function IsNumSS_BE(valeur)
{
	var reg= new RegExp("^[0-9]{2}[ \.\-]?([0|4][0-9]|[1][0-2])[ \.\-]?[0][0-9]|([1-2][0-9]|[3][0-1])[ \.\-]?[0-9]{3}[ \.\-]?[0-9]{2}$","gi"); 
	return (valeur.search(reg) !=-1 && IsCleSS_BE(valeur));
}

/** 
*	@fn function IsNumSS_IT(valeur)
*	@brief fonction que la chaine passe en parametre est un format de numero de secu IT valide
*	@param valeur chaine supposee etre un numero de secu
*	@return	bool True: numero de secu valide
*/
function IsNumSS_IT(valeur)
{
	var reg= new RegExp("^([A-Z]{3}[ \.\-]?)([A-Z]{3}[ \.\-]?)([0-9]{2}[ \.\-]?[ABCDEHLMPRST]{1}[ \.\-]?[0-9]{2}[ \.\-]?)([A-Z0-9]{4}[ \.\-]?)([A-Z]{1})$","gi"); 
	var tmp = valeur.search(reg);
	var bool = IsCleSS_IT(valeur);
	return ( tmp!=-1 && bool);
}


/** 
*	@fn function IsCleSS(valeur, pays)
*	@brief fonction verifiant la cle d'un numero de secu
*	@param valeur chaine supposee etre un numero de secu
*	@param pays identifiant du pays 57: france, 63: espagne
*	@return	bool True: numero de secu valide
*/
function IsCleSS(valeur, pays)
{
	//suppression des espaces éventuels ou spérateurs
	var reg= new RegExp("[ -\.]","gi");
	valeur=valeur.replace(reg, "");
	
	switch(Number(pays))
	{
		case 57: return IsCleSS_FR(valeur); break;
		case 63: return IsCleSS_ES(valeur); break;
		case 16: return IsCleSS_BE(valeur); break;
		case 86: return IsCleSS_IT(valeur); break;
	}
	return false;
}

/** 
*	@fn function IsCleSS_FR(valeur)
*	@brief fonction qui compare la clef du numero de secucite sociale passé en paramétre avec la clé calculée
*	@param valeur chaine supposee etre un numero de secu 
*	@return	bool true: si la clef du numero de secu passe en parametre est egale a la clef calcule
*/
function IsCleSS_FR(valeur)
{
	var cle=valeur.substr(13,2);
	if((valeur.toUpperCase()).lastIndexOf('A')!=-1)
	{
		var reg= new RegExp("A","gi");
		valeur=valeur.replace(reg, "0");
		var num=Number(valeur.substr(0,13));
		num-=1000000;
	}
	else if((valeur.toUpperCase()).lastIndexOf('B')!=-1)
	{
		var reg= new RegExp("B","gi");
		valeur=valeur.replace(reg, "0");
		var num=Number(valeur.substr(0,13));
		num-=2000000;
	}
	else var num=valeur.substr(0,13);
	return (97-(num%97)==cle);
}

/** 
*	@fn function IsCleSS_ES(valeur)
*	@brief fonction qui compare la clef du numero de secucite sociale passé en paramétre avec la clé calculée
*	@param valeur chaine supposee etre un numero de secu 
*	@return	bool true: si la clef du numero de secu passe en parametre est egale a la clef calcule
*/
function IsCleSS_ES(valeur)
{
	var chaine = valeur.match(/^(\d{2})(\d{8})(\d{2})$/);
	try
	{
		var num;
		if(Number(chaine[2]) < 10000000)	num = Number(chaine[2]) + Number(chaine[1]) * 10000000;
		else num =  Number(chaine[1] + Number(chaine[2]));	
	
		return (num%97==chaine[3]);
	}
	catch(e) {return -1;}
}

/** 
*	@fn function IsCleSS_BE(valeur)
*	@brief fonction qui compare la clef du numero de secucite sociale passé en paramétre avec la clé calculée
*	@param valeur chaine supposee etre un numero de secu 
*	@return	bool true: si la clef du numero de secu passe en parametre est egale a la clef calcule
*/
function IsCleSS_BE(valeur)
{
	try
	{
		return (CalculCleSS_BE(valeur.substr(0,9))==valeur.substr(9,2));
	}
	catch(e) {return -1;}
}

/** 
*	@fn function IsCleSS_IT(valeur)
*	@brief fonction qui compare la clef du numero de secucite sociale passé en paramétre avec la clé calculée
*	@param valeur chaine supposee etre un numero de secu 
*	@return	bool true: si la clef du numero de secu passe en parametre est egale a la clef calcule
*/
function IsCleSS_IT(valeur)
{
	try
	{
		return (CalculCleSS_IT(valeur.substr(0,valeur.length-1)) == valeur.substr(valeur.length-1,valeur.length));
	}
	catch(e) {return -1;}
}

/** 
*	@fn function CalculCleSS(valeur, pays)
*	@brief fonction calculant la cle d'un numero de secu
*	@param valeur chaine supposee etre un numero de secu
*	@param pays identifiant du pays 57: france, 63: espagne
*	@return	bool True: numero de secu valide
*/
function CalculCleSS(valeur, pays)
{
	var reg= new RegExp("-| |/","gi");
	valeur=valeur.replace(reg, "");
		
	switch(Number(pays))
	{
		case 57: return CalculCleSS_FR(valeur); break;
		case 63: return CalculCleSS_ES(valeur); break;
		case 16: return CalculCleSS_BE(valeur); break;
		case 86: return CalculCleSS_IT(valeur); break;
	}
	return false;
}


/** 
*	@fn function CalculCleSS_FR(valeur)
*	@brief fonction qui calculant la clef d'un numero de secucite sociale
*	@param valeur chaine supposee etre un numero de secu 
*	@return	int: clef du numero de secu
*/
function CalculCleSS_FR(valeur)
{
	return (97-(valeur.substr(0,13)%97));
}

/** 
*	@fn function CalculCleSS_IT(valeur)
*	@brief fonction qui calculant la clef d'un code fiscal
*	@param valeur chaine supposee etre un numero de secu 
*	@return	int: clef du numero de secu
*/
function CalculCleSS_IT(valeur)
{
	var tab_initial	= new Array ("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z","0", "1", "2", "3", "4", "5", "6" ,"7", "8" ,"9");
	
	//Table de conversion des caractères
	var tab_corresp_pair 	= new Array ("0", "1", "2", "3", "4", "5", "6" ,"7", "8" ,"9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "0", "1", "2", "3", "4", "5", "6" ,"7", "8" ,"9");
	var tab_corresp_impair	= 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", "1", "0", "5", "7", "9", "13", "15" ,"17", "19" ,"21");
	
	var encodage="";
	var position =0;
	
	//Parcours de la chaine
	for(var i=0; i<chaine.length; i++)
	{ 
		position = tab_initial.search(chaine[i]);
		
		//Test de la parité de $i
		if(($i+1)%2==0) encodage += tab_corresp_pair[position];
		else encodage += tab_corresp_impair[position];
	}
	
	return tab_initial[Modulo(encodage,26)];	
}

/** 
*	@fn function CalculCleSS_BE(valeur)
*	@brief fonction qui calculant la clef d'un numero de secucite sociale
*	@param valeur chaine supposee etre un numero de secu 
*	@return	int: clef du numero de secu
*/
function CalculCleSS_BE(valeur)
{
	return (97-(Number(valeur.substr(0,9))%97));
}

/** 
*	@fn function CalculCleSS_ES(valeur)
*	@brief fonction qui calculant la clef d'un numero de secucite sociale
*	@param valeur chaine supposee etre un numero de secu 
*	@return	int: clef du numero de secu
*/
function CalculCleSS_ES(valeur)
{
	var chaine = new Array();
	var num;
	chaine = valeur.match(/^(\d{2})(\d{8})(\d{2})?$/);
	
	try
	{
		if(Number(chaine[2]) < 10000000)	num = Number(chaine[2]) + Number(chaine[1]) * 10000000;
		else num =  Number(chaine[1] + Number(chaine[2]));	
		return (num%97);
	}
	catch(e) {return -1;}
}

