/** *********************************************************
*	@file www/js/rib.js
*	@author COPHIGNON CYRIL
*	@date	26/03/2008
*	@brief bibliotheque javascript de gestion des ribs et des ibans
*************************************************************/
/**
 * @fn IsRIB(valeur, pays)
 * @brief fonction verfiant le format du rib
 * @param [string] valeur chaine contant le numero
 * @param [bool] true ou false si le format est valide
 */
function IsRIB(valeur, pays)
{
	var reg= new RegExp("[^A-Za-z0-9]","gi"); //on retire tous les caractères spéciaux
	valeur=valeur.replace(reg, "");
	
	switch(pays)
	{
		case '57': return IsRIB_FR(valeur); break; //France
		case '63': return IsRIB_ES(valeur); break; //Espagne
		case '16': return IsRIB_BE(valeur); break; //Espagne
	}
	return false;	
}

/** 
*	@fn function IsRIB_FR(valeur)
*	@brief fonction que la chaine passe en parametre est un format RIB FR valide
*	@param [string] valeur chaine contant le numero
*	@return	[bool] True: numero valide
*/
function IsRIB_FR(valeur)
{
	var reg= new RegExp("^[0-9]{5}[ \.\-]?[0-9]{5}[ \.\-]?[A-Za-z0-9]{11}[ \.\-]?[0-9]{2}$");
	return (valeur.search(reg) !=-1 && IsCleRIB_FR(valeur));
}

/** 
*	@fn function IsCleRIB_FR(valeur)
*	@brief fonction qui compare la clef du numero de rib en paramétre avec la clé calculée
*	@param [string] valeur chaine contant le numero
*	@return	[bool] ture: si la clef du numero passe en parametre est egale a la clef calculee
*/
function IsCleRIB_FR(valeur)
{
	//suppression des espaces éventuels
	var reg= new RegExp("[^A-Za-z0-9]","gi"); //on retire tous les caractères spéciaux
	valeur=valeur.replace(reg, "");
	var cle=CalculCleRIB_FR(valeur);
	return (valeur.substr(21,2)==cle);
}

/** 
*	@fn function CalculCleRIB_FR(valeur)
*	@brief fonction qui calculant la clef
*	@param [string] valeur chaine contant le numero
*	@return	[int] la clef 
*/
function CalculCleRIB_FR(valeur)
{
	var reg= new RegExp("[^A-Za-z0-9]","gi"); //on retire tous les caractères spéciaux
	valeur=valeur.replace(reg, "");
	
	var banque 	= valeur.substr(0,5);
	var guichet	= valeur.substr(5,5);
	var compte	= (valeur.substr(10,11)).toUpperCase();
	
	//alert(banque + " "+ guichet+" "+compte);
	// Conversion du numero de compte avec des lettres en n° compte à chiffre
	function replaceAlpha(alpha) { return '12345678912345678923456789'.charAt(alpha.charCodeAt(0) - 65); }
	compte= parseInt(compte.toUpperCase().replace(/[A-Z]/g, replaceAlpha), 10);
	
	//Calcul clé RIB
	return (97 - (((parseFloat(banque, 10)% 97 * 100000 + parseFloat(guichet)) % 97 * 100000000000 + compte) % 97) * 100 % 97);
}

/** 
*	@fn function IsRIB_BE(valeur)
*	@brief fonction que la chaine passe en parametre est un format RIB BE valide
*	@param [string] valeur chaine contant le numero
*	@return	[bool] True: numero valide
*/
function IsRIB_BE(valeur)
{
	var reg= new RegExp("^[0-9]{3}[ \.\-]?[0-9]{7}[ \.\-]?[0-9]{2}$");
	return (valeur.search(reg) !=-1 && IsCleRIB_BE(valeur));
}

/** 
*	@fn function IsCleRIB_BE(valeur)
*	@brief fonction qui compare la clef du numero de rib en paramétre avec la clé calculée
*	@param [string] valeur chaine contant le numero
*	@return	[bool] ture: si la clef du numero passe en parametre est egale a la clef calculee
*/
function IsCleRIB_BE(valeur)
{
	//suppression des espaces éventuels
	var reg= new RegExp("[^A-Za-z0-9]","gi"); //on retire tous les caractères spéciaux
	valeur=valeur.replace(reg, ""); 
	var cle=CalculCleRIB_BE(valeur);
	return (valeur.substr(10,2)==cle);
}

/** 
*	@fn function CalculCleRIB_BE(valeur)
*	@brief fonction qui calculant la clef
*	@param [string] valeur chaine contant le numero
*	@return	[int] la clef 
*/
function CalculCleRIB_BE(valeur)
{
	var reg= new RegExp("[^A-Za-z0-9]","gi"); //on retire tous les caractères spéciaux
	valeur=valeur.replace(reg, "");
		
	try
	{
		return Number(valeur.substring(0,10))%97 ;
	}
	catch(e) {return -1;}
}


/** 
*	@fn function IsRIB_ES(valeur)
*	@brief fonction que la chaine passe en parametre est un format RIB ES valide
*	@param [string] valeur chaine contant le numero
*	@return	[bool] True: numero valide
*/
function IsRIB_ES(valeur)
{
	var reg= new RegExp("^[0-9]{4}[ \.\-]?[0-9]{4}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{10}$");
	return (valeur.search(reg) !=-1 && IsCleRIB_ES(valeur));
}

/** 
*	@fn function IsCleRIB_ES(valeur)
*	@brief fonction qui compare la clef du numero de rib en paramétre avec la clé calculée
*	@param [string] valeur chaine contant le numero
*	@return	[bool] ture: si la clef du numero passe en parametre est egale a la clef calculee
*/
function IsCleRIB_ES(valeur)
{
	//suppression des espaces éventuels
	var reg= new RegExp("[^A-Za-z0-9]","gi"); //on retire tous les caractères spéciaux
	valeur=valeur.replace(reg, "");
	var cle=CalculCleRIB_ES(valeur);
	return (valeur.substr(8,2)==cle);
}

/** 
*	@fn function CalculCleRIB_ES(valeur)
*	@brief fonction qui calculant la clef
*	@param [string] valeur chaine contant le numero
*	@return	[int] la clef 
*/
function CalculCleRIB_ES(valeur)
{
	var reg= new RegExp("[^A-Za-z0-9]","gi"); //on retire tous les caractères spéciaux
	valeur=valeur.replace(reg, "");
	
	var chaine=valeur.match(/^(\d{4})(\d{4})(\d{2})(\d{10})$/);
	
	try
	{
		//alert(Calcul_Digit_CC_ES(chaine[4]));
		return Calcul_Digit_CC_ES(chaine[1]+chaine[2]) + Calcul_Digit_CC_ES(chaine[4]) ;
	}
	catch(e) {return -1;}
}

/** 
*	@fn function Calcul_Digit_CC_ES(valeur) 
*	@brief fonction qui calculant le digit de control
*	@param [string] valeur chaine contant le numero
*	@return	[int] le digit de control
*/
function Calcul_Digit_CC_ES(valeur) 
{
	//valeur= parseInt(valeur);
	var pesos = Array(1, 2, 4, 8, 5, 10, 9, 7, 3, 6);
	var contador = pesos.length-1;
	var position = valeur.length-1;
	var s=0; 
		
	while( position >= 0)
	{
		s += parseInt(pesos[contador]*parseInt(valeur.substr(position,1)));
		contador--;
		position--;
	}
	
	valeur = 11 - (s%11);
	if(valeur==10) return '1';
	else if(valeur==11) return '0';
	else return valeur.toString();
}

/********************************************************************************************************************************/

/**
 * @fn IsIBAN(valeur, pays)
 * @brief fonction verfiant le format du rib
 * @param [string] valeur chaine contant le numero
 * @param [bool] true ou false si le format est valide
 */
function IsIBAN(valeur, pays)
{
	var reg= new RegExp("[^A-Za-z0-9]","gi"); //on retire tous les caractères spéciaux
	valeur=valeur.replace(reg, "");
	
	var res = false;
	
	switch(pays)
	{
		case '57': res = IsIBAN_FR(valeur); break; //France
		case '63': res = IsIBAN_ES(valeur); break; //Espagne
		case '16': res = IsIBAN_BE(valeur); break; //Belgique
	}
	
	//Si l'iban n'appartient pas au pays on test si c'est un IBAN générique
	if(res==false) 
	
	return false;	
}

/** 
*	@fn function Char_to_code(char)
*	@brief fonction de conversion des lettres de l'iban en chiffre pour le calcul de cle
*	@param [string] char le caractere a transfomer en code
*	@return	[int] le code du caractere
*/
function Char_to_code(char)
{
	return 10+char.toUpperCase().charCodeAt(0)-String("A").charCodeAt(0);
}


/** 
*	@fn function IsIBAN_FR(valeur)
*	@brief fonction que la chaine passe en parametre est un format RIB FR valide
*	@param [string] valeur chaine contant le numero
*	@return	[bool] True: numero de secu valide
*/
function IsIBAN_FR(valeur)
{
	var reg= new RegExp("^[F]{1}[R]{1}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{5}[ \.\-]?[0-9]{5}[ \.\-]?[A-Za-z0-9]{11}[ \.\-]?[0-9]{2}$");
	return (valeur.search(reg) !=-1 && IsCleIBAN(valeur) && IsRIB_FR(valeur.substr(4,valeur.length)));
}

/** 
*	@fn function IsIBAN_BE(valeur)
*	@brief fonction que la chaine passe en parametre est un format RIB BE valide
*	@param [string] valeur chaine contant le numero
*	@return	[bool] True: numero de secu valide
*/
function IsIBAN_BE(valeur)
{
	var reg= new RegExp("^[B]{1}[E]{1}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{4}[ \.\-]?[0-9]{4}[ \.\-]?[0-9]{4}$");
	return (valeur.search(reg) !=-1 && IsCleIBAN(valeur) && IsRIB_BE(valeur.substr(4,valeur.length)));
}

/** 
*	@fn function IsIBAN_ES(valeur)
*	@brief fonction que la chaine passe en parametre est un format RIB ES valide
*	@param [string] valeur chaine contant le numero
*	@return	[bool] True: numero de secu valide
*/
function IsIBAN_ES(valeur)
{
	var reg= new RegExp("^[E]{1}[S]{1}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{4}[ \.\-]?[0-9]{4}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{10}$");
	return (valeur.search(reg) !=-1 && IsCleIBAN(valeur) && IsRIB_ES(valeur.substr(4,valeur.length)));
}

/** 
*	@fn function IsCleIBAN(valeur)
*	@brief fonction verifie que l'iban est coherant avec sa cle
*	@param [string] valeur chaine contant le numero
*	@return	[bool] true: si le calcul de cle donne 1
*/
function IsCleIBAN(valeur)
{
	//suppression des espaces éventuels
	var reg= new RegExp("[^A-Za-z0-9]","gi"); //on retire tous les caractères spéciaux
	valeur=valeur.replace(reg, "");
	var cle=CalculCleIBAN(valeur);
	return (Number(valeur.substr(2,2))==Number(cle));
}

/** 
*	@fn function CalculCleIBAN(valeur)
*	@brief fonction qui calculant la clef
*	@param [string] valeur chaine contant le numero
*	@return	[int] clef 
*/
function CalculCleIBAN(valeur)
{
	var rib = valeur.substr(4,valeur.length);
	var chaine = rib+Char_to_code((valeur.substr(0,1)).toUpperCase())+Char_to_code((valeur.substr(1,2)).toUpperCase())+"00";
	
	i=0;
	retenue="";
	while (i<eval(chaine.length))
	{
		cle=parseFloat(retenue+chaine.substring(i, i+9)) % 97;
		retenue=String(cle);	
		i=i+9;
	}
	return (98-(cle % 97));
}