//Initialisation des variables globales
//Nombre de caractere minimum
var iCharacterMinimum = 6;
//Nombre de caractere maximum
var iCharacterMaximum = 8;
//Le minimum qu'il faut avoir comme chiffre pour que ce soit secure
var iMinimumChiffreSecure = 3;
//Determination du nombre de caractere pour la repetition
var ciMaxRepetition = 2;
//Initialisation du message d'erreur
var sMsgErreur = "";

//Caracteres autorises
var aCaractereMajuscule = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var aCaractereMinuscule = "abcdefghijklmnopqrstuvwxyz";
var aChiffre = "0123456789";
//var aCaractereSpecial = "!@#$%-.&*?_~";
var aCaractereSpecial = "-_";
var aForbiddenWords = new Array("012345","123456","1234567","12345678","123456789","1234567890","654321","654321","76543210","abcdef","ABCDEF","abcdefg","ABCDEFG","abcdefgh","ABCDEFGH","abcdefghi","ABCDEFGHI","abcdefghij","ABCDEFGHIJ","abcdefghijk","ABCDEFGHIJK","ABCDEFGHIJKL","abcdefghijklmn","abcdefghijklmno","password");

//Calcul de l'evaluateur
//********************************************************
//Total des points a effectuer pour passer les niveaux
var ciNiveauVert = 60; //Excellent (par defaut : 60)
var ciNiveauBleu = 50; //Bon	(par defaut : 55)
var ciNiveauOrange = 35; //Moyen	(par defaut : 35)
//Tout ce qui est en dessous de 35 est insuffisant !

//Message d'erreur
var aMsgErreur = new Array();

//Divers variables
var sValeur = "";
var sNomElement = "";
var oFormulaire = "";
var oInputElement = "";

fCreerMessage = function ()
{
	aMsgErreur = [msg_password_checker_01 + " " + iCharacterMaximum + " " + msg_password_evaluator_characters + ".", 
				  msg_password_checker_02 + " " + iCharacterMinimum + " " + msg_password_evaluator_characters + ".",
				  msg_password_checker_03,
				  msg_password_checker_04,
				  msg_password_checker_05,
				  msg_password_checker_06,
				  msg_password_checker_07,
				  msg_password_checker_08,
				  msg_password_checker_09,
				  msg_password_evaluator_10];
}

//	Check si la longueur du mot de passe est correcte
function fLongueurPassword ()
{
	var iTotalPoint = 0;
	if (sValeur.length < iCharacterMinimum){
		iTotalPoint += 0;
		sMsgErreur = aMsgErreur[4];
	}else if (sValeur.length > (iCharacterMinimum-1) && sValeur.length < (iCharacterMaximum+1)){
		//iTotalPoint += 10;
		iTotalPoint += 35;
	}else if (sValeur.length > (iCharacterMaximum)){
		iTotalPoint += 25;
		sMsgErreur = aMsgErreur[0];
	}
	return iTotalPoint;
}

function fCompteurCaractere (iTotalCaractereMinuscule, iTotalCaractereMajuscule){
	var iTotalPoint = 0;
	if (iTotalCaractereMajuscule == 0 && iTotalCaractereMinuscule != 0) { 
		iTotalPoint += 7; 
	}else if (iTotalCaractereMajuscule != 0 && iTotalCaractereMinuscule != 0) { 
		iTotalPoint += 13;
	}else if (iTotalCaractereMajuscule != 0 && iTotalCaractereMinuscule == 0) { 
		iTotalPoint += 15;
	}
	return iTotalPoint;
}

function fCheckCaractereValide (){
	for (var iCnt = 0; iCnt < sValeur.length; iCnt++){
		if(aCaractereMajuscule.indexOf(sValeur.charAt(iCnt),0) == -1){
			if(aCaractereMinuscule.indexOf(sValeur.charAt(iCnt),0) == -1){
				if(aChiffre.indexOf(sValeur.charAt(iCnt),0) == -1){
					if(aCaractereSpecial.indexOf(sValeur.charAt(iCnt),0) == -1){
						sMsgErreur = aMsgErreur[2];
						return false;
					}
				}
			}
		}
	}
}

function fCheckMemeChaine(sChaine){
	var sDebut = "^(";
	var sFin = ")*$";
	var sRecherche = new RegExp(sDebut+sChaine+sFin,"g");
	if(sRecherche.test(sValeur)){
		return true;
	}else {
		return false;
	}
}

function fCheckSequence(iTotalCaractere){
	var sSequence = sValeur.substr(0, iTotalCaractere);
	if(!fCheckMemeChaine(sSequence)){
		if(iTotalCaractere > ciMaxRepetition){
			var iNouveauTotal = iTotalCaractere - 1;
			fCheckSequence(iNouveauTotal);
		}else{
			return true;
		}
	}else {
		sMsgErreur = aMsgErreur[3];
		return false;
	}
}

function fCheckNotRepetition (){
	//Test si c'est le meme caractere 
	if(!fCheckMemeChaine(sValeur.charAt(0))){
		var iSequenceCaractere = Math.floor((sValeur.length)/2);
		if(fCheckSequence(iSequenceCaractere)){
			return true;
		}
	}else {
		//C'est le meme caractere
		sMsgErreur = aMsgErreur[3];
		return false;
	}
}

function fCheckMotInterdit(){
	for(var iCnt = 0; iCnt < aForbiddenWords.length; iCnt++){
		if(aForbiddenWords[iCnt] == sValeur){
			sMsgErreur = aMsgErreur[8];
			return false;
		}
	}
	return true;
}

function fLongueurValide(){
	if(sValeur.length > iCharacterMaximum){
		sMsgErreur = aMsgErreur[0];
//		oInputElement.value = sValeur.substring(0,iCharacterMaximum);
		return false;
	}else {
		return true;
	}
}

// Check password
function fCheckPasswordScore(){
	//Initialisation
	var iTotalPoint = 0;
	
	//Validite du caractere
	fCheckCaractereValide();
	if(sMsgErreur != ""){
		return false;
	}
	
	//Longueur du mot de passe
	iTotalPoint = fLongueurPassword();
	if(sMsgErreur != ""){
		return false;
	}
/*
	//Test le suivi des touches
	fCheckNotRepetition();

	if(sMsgErreur != ""){
		return false;
	}
*/
	//Test des lettres normales
	var iTotalCarMaj = fCombienDsTableau(aCaractereMajuscule);
	var iTotalCarMin = fCombienDsTableau(aCaractereMinuscule);
	var iTotalCaractere = iTotalCarMin + iTotalCarMaj;
	iTotalPoint += fCompteurCaractere(iTotalCarMin, iTotalCarMaj);
	
	//Test des chiffres
	var iTotalNum = fCombienDsTableau(aChiffre);
	if (iTotalNum >= 1){
		iTotalPoint += 5;
	}
	if (iTotalNum >= iMinimumChiffreSecure){
		iTotalPoint += 5;
	}
	
	//Test caractere speciale
	var iTotalCarSpe = fCombienDsTableau(aCaractereSpecial);
	if (iTotalCarSpe == 1){
		iTotalPoint += 10;
	}	
	if (iTotalCarSpe > 1){
		iTotalPoint += 25;
	}
	
	//Melange chiffre et caractere
	if (iTotalNum != 0 && iTotalCaractere != 0){
		iTotalPoint += 2;
	}
	//Melange chiffre, caractere et caractere special
	if (iTotalNum != 0 && iTotalCarMaj != 0 && iTotalCarSpe != 0){
		iTotalPoint += 3;
	}
	//Melange chiffre, caractere et caractere special 
	if (iTotalNum != 0 && iTotalCarMaj != 0 && iTotalCarMin != 0 && iTotalCarSpe != 0){
		iTotalPoint += 5;
	}
	return iTotalPoint;
}
 
function fCheckPassword(oElement, iMinimumCaractere, iMaximumCaractere, oForm, idInfo, idBarColor, idTotal)
{
	sValeur = oElement.value;
	sNomElement = oElement.name;
	oInputElement = oElement;
	oFormulaire = oForm;
	
	iCharacterMinimum = iMinimumCaractere;
	iCharacterMaximum = iMaximumCaractere;
		
	fCreerMessage();
	
	sMsgErreur = "";
	if(sValeur != ""){
		//Test si la longeur est valide
		if(fLongueurValide()){	
			//Test si c'est un mot de passe interdit
			if(fCheckMotInterdit()){
				// Recuperation des points pour ce mot de passe
				var iTotalPoint = fCheckPasswordScore();
				if(sMsgErreur != ""){
					var sTexte = sMsgErreur;
					fMsg('ucPwdBarRed', 0, idBarColor, idTotal);
				}else{
					//alert(iTotalPoint);
					if (iTotalPoint >= ciNiveauVert){
						var sTexte = aMsgErreur[7];
						fMsg('ucPwdBarGreen', iTotalPoint, idBarColor, idTotal);
					}else if (iTotalPoint >= ciNiveauBleu){
						var sTexte = aMsgErreur[6];
						fMsg('ucPwdBarBlue', iTotalPoint, idBarColor, idTotal);
					}else if (iTotalPoint >= ciNiveauOrange){
						var sTexte = aMsgErreur[5];
						fMsg('ucPwdBarOrange', iTotalPoint, idBarColor, idTotal);
					}else {
						var sTexte = aMsgErreur[4];
						fMsg('ucPwdBarRed', 0, idBarColor, idTotal);
					}
				}
			}else {
				var sTexte = sMsgErreur;
				fMsg('ucPwdBarRed', 0, idBarColor, idTotal);
			}
		}else{
			var sTexte = sMsgErreur;
			fMsg('ucPwdBarRed', 0, idBarColor, idTotal);
		}
	}else {
		var sTexte = "";
		fMsg('', 0, idBarColor, idTotal);
	}
	document.getElementById(idInfo).innerHTML = "<gettext>" + sTexte + "</gettext>";
}
 
function fMsg(sClass, iPoint, idBarColor, idTotal)
{
	document.getElementById(idBarColor).className=sClass;
	document.getElementById(idTotal).value = iPoint;
}

function fCombienDsTableau(aTableau){ 
	var iTotal = 0;
	
	for (i = 0; i < sValeur.length; i++) {
		if (aTableau.indexOf(sValeur.charAt(i)) > -1) { 
    		iTotal++;
		} 
	} 
	return iTotal; 
}

function fCheckPasswordChars(oObj)
{
	var bOk = true;
	var sObjValue = oObj.value;

	for(var iCnt = 0; iCnt < aForbiddenWords.length; iCnt++)
	{
		if(aForbiddenWords[iCnt] == sObjValue)
		{
			alert(msg_invalid_invalid_characters);
			ucfPutfocus(oObj);
			bOk = false;
		}
	}

	if (bOk)
	{
		for (var iCnt = 0; iCnt < sObjValue.length; iCnt++)
		{
			if(aCaractereMajuscule.indexOf(sObjValue.charAt(iCnt),0) == -1)
			{
				if(aCaractereMinuscule.indexOf(sObjValue.charAt(iCnt),0) == -1)
				{
					if(aChiffre.indexOf(sObjValue.charAt(iCnt),0) == -1)
					{
						if(aCaractereSpecial.indexOf(sObjValue.charAt(iCnt),0) == -1)
						{
							alert(msg_invalid_invalid_characters);
							ucfPutfocus(oObj);
							bOk = false;
						}
					}
				}
			}
		}
	}

	return bOk;
}
