/** 
*	@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(pays)
	{
		case '57': return IsNumSS_FR(valeur); break;
		
		case '63': return IsNumSS_ES(valeur); break;
	}
	return false;
}

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));
}

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));
}

function IsCleSS(valeur, pays)
{
	switch(pays)
	{
		case '57': return IsCleSS_FR(valeur); break;
		case '63': return IsCleSS_ES(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;}
}

function CalculCleSS(valeur, pays)
{
	switch(pays)
	{
		case '57': return CalculCleSS_FR(valeur); break;
		case '63': return CalculCleSS_ES(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_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;}
}
