/** 
*	@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;
	}
	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 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)
{
	switch(Number(pays))
	{
		case 57: return IsCleSS_FR(valeur); break;
		case 63: return IsCleSS_ES(valeur); break;
		case 16: return IsCleSS_BE(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 ture: si la clef du numero de secu passe en parametre est egale a la clef calcule
*/
function IsCleSS_FR(valeur)
{
	//suppression des espaces éventuels ou spérateurs
	var reg= new RegExp("[ -\.]","gi");
	valeur=valeur.replace(reg, "");
	
	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 ture: si la clef du numero de secu passe en parametre est egale a la clef calcule
*/
function IsCleSS_ES(valeur)
{
	//suppression des espaces éventuels ou spérateurs
	var reg= new RegExp("[ -\.]","gi");
	valeur=valeur.replace(reg, "");
	
	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 ture: si la clef du numero de secu passe en parametre est egale a la clef calcule
*/
function IsCleSS_BE(valeur)
{
	//suppression des espaces éventuels ou spérateurs
	var reg= new RegExp("[ -\.]","gi");
	valeur=valeur.replace(reg, "");
	try
	{
		return (CalculCleSS_BE(valeur.substr(0,9))==valeur.substr(9,2));
	}
	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)
{
	switch(Number(pays))
	{
		case 57: return CalculCleSS_FR(valeur); break;
		case 63: return CalculCleSS_ES(valeur); break;
		case 16: return CalculCleSS_BE(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)
{
	var reg= new RegExp("-| |/","gi");
	valeur=valeur.replace(reg, "");
	return (97-(valeur.substr(0,13)%97));
}

/** 
*	@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)
{
	var reg= new RegExp("-| |/","gi");
	valeur=valeur.replace(reg, "");
	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 reg= new RegExp("-| |/","gi");
	valeur=valeur.replace(reg, "");
	
	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;}
}
