//Initialisation des variables globales
//Nombre de caractere minimum
var iCaractereMinimum = 6;
//Nombre de caractere maximum
var iCaractereMaximum = 80;
//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;
//Langue par defaut
var sLangue = "en";
//Initialisation du message d'erreur
var sMsgErreur = "";

//Caracteres autorises
var aCaractereMajuscule = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var aCaractereMinuscule = "abcdefghijklmnopqrstuvwxyz";
var aChiffre = "0123456789";
//var aCaractereSpecial = "!@#$%-.&*?_~";
var aCaractereSpecial = "-_ ";
var aMotInterdit = new Array();


//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["en"] = ["The password is required and may not exceed "+iCaractereMaximum+" characters.", 
							 "Please type a password (at least "+iCaractereMinimum+" characters).",
							 "Invalid character.",
							 "Repetition not allowed",
							 "Number of characters still needed.",
							 "Acceptable",
							 "Good password",
							 "Very good password",
							 "Character string not allowed",
							 "Please use a password that is different to your user name."];
								 
	aMsgErreur["fr"] = ["Le mot de passe est obligatoire et il ne doit pas d&eacute;passer "+iCaractereMaximum+" caract&egrave;res.", 
							"Vous devez entrer un mot de passe (au moins "+iCaractereMinimum+" caract&egrave;res).",
							"Caract&egrave;re Invalide.",
							"R&eacute;p&eacute;tition interdite",
							"Nombre de caract&egrave;res insuffisants",
							"Acceptable",
							"Bon",
							"Excellent",
							"Cha&icirc;ne de caract&egrave;res interdite",
							"Veuillez utiliser un mot de passe diff&eacute;rent de votre nom d'utilisateur"];
							
	aMsgErreur["de"] = ["Die Eingabe des Passworts ist obligatorisch (nicht l&auml;nger als "+iCaractereMaximum+" Buchstaben).", 
							"Sie m&uuml;ssen ein Kennwort eingeben (mindestens "+iCaractereMinimum+" Zeichen).",
							"Ung&uuml;ltige Zeichen.",
							"R&eacute;p&eacute;tition interdite",
							"Anzahl der Zeichen nicht ausreichend",
							"Akzeptabel",
							"Gut",
							"Sehr gut",
							"Ung&uuml;ltige Zeichenkette",
							"Bitte verwenden Sie ein anderes Kennwort als Ihren Benutzernamen"];
							
	aMsgErreur["it"] = ["La password è necessaria e non può superare "+iCaractereMaximum+"  caratteri.", 
				 			 "Per favore inserisca la password (minimo "+iCaractereMinimum+" caratteri).",
							 "Carattere non valido.",
							 "Non é possibile ripetere caratteri.",
							 "Numero di caratteri insufficiente",
							 "Accettabile",
							 "Bene",
							 "Molto bene",
							 "Sequenza di caratteri non autorizzata.",
							 "Deve essere utilizzata una password diversa dal nome utente."];
							 
	aMsgErreur["es"] =	["La contrase&ntilde;a es obligatoria y no debe contener mas de "+iCaractereMaximum+" caracteres.", 
							 "Por favor ingresar una contrase&ntilde;a (mínimo "+iCaractereMinimum+" caracteres).",
							 "Caracter inv&aacute;lido.",
							 "Repetici&oacute;n prohibida",
							 "Cantidad de caracteres insuficiente",
							 "Aceptable",
							 "Buena",
							 "Muy buenas",
							 "Cantidad de caracteres prohibida",
							 "Ingrese una contrase&ntilde;a distinta al nombre de usuario."];
}

//	Check si la longueur du mot de passe est correcte
function fLongueurPassword (){
	var iTotalPoint = 0;
	if (sValeur.length < iCaractereMinimum){
		iTotalPoint += 0;
		sMsgErreur = aMsgErreur[sLangue][4];
	}else if (sValeur.length > (iCaractereMinimum-1) && sValeur.length < (iCaractereMaximum+1)){
		//iTotalPoint += 10;
		iTotalPoint += 35;
	}else if (sValeur.length > (iCaractereMaximum)){
		iTotalPoint += 25;
		sMsgErreur = aMsgErreur[sLangue][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 iCompteur = 0; iCompteur < sValeur.length; iCompteur++){
		if(aCaractereMajuscule.indexOf(sValeur.charAt(iCompteur),0) == -1){
			if(aCaractereMinuscule.indexOf(sValeur.charAt(iCompteur),0) == -1){
				if(aChiffre.indexOf(sValeur.charAt(iCompteur),0) == -1){
					if(aCaractereSpecial.indexOf(sValeur.charAt(iCompteur),0) == -1){
						sMsgErreur = aMsgErreur[sLangue][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 fModulo(rChiffre,rBase) {
	return Math.round(rChiffre - (Math.floor(rChiffre/rBase)*rBase));
}

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[sLangue][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[sLangue][3];
		return false;
	}
}

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

function fCheckUser(){
	if(document.getElementById('iIdUser')){
		if(document.getElementById('iIdUser').value != ""){
			if(document.getElementById('iIdUser').value == sValeur){
				sMsgErreur = aMsgErreur[sLangue][9];
				return true;
			}else {
				return false;
			}
		}else {
			return false;
		}
	}else {
		return false;
	}
}

function fLongueurValide(){
	if(sValeur.length > iCaractereMaximum){
		sMsgErreur = aMsgErreur[sLangue][0];
		//oInputElement.value = sValeur.substring(0,iCaractereMaximum);
		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) {
	sValeur = oElement.value;
	sNomElement = oElement.name;
	oInputElement = oElement;
	oFormulaire = oForm;
	
	iCaractereMinimum = iMinimumCaractere;
	iCaractereMaximum = iMaximumCaractere;
	
	sLangue = sLangue.charAt(0)+sLangue.charAt(1);
	
	fCreerMessage();
	
	sMsgErreur = "";
	if(sValeur != ""){
		//Test si la longeur est valide
		if(fLongueurValide()){	
			//Test si c'est un mot de passe interdit
			if(fCheckMotInterdit()){
				//Test si le mot de passe est identique au nom d'utilisateur
				if(!fCheckUser()){
					// Recuperation des points pour ce mot de passe
					var iTotalPoint = fCheckPasswordScore();
					if(sMsgErreur != ""){
						var sTexte = sMsgErreur;
						fMsg('BarRed', 0);
					}else{
						//alert(iTotalPoint);
						if (iTotalPoint >= ciNiveauVert){
					 		var sTexte = aMsgErreur[sLangue][7];
					 		fMsg('BarGreen', iTotalPoint);
						}else if (iTotalPoint >= ciNiveauBleu){
					 		var sTexte = aMsgErreur[sLangue][6];
					 		fMsg('BarBlue', iTotalPoint);
						}else if (iTotalPoint >= ciNiveauOrange){
					 		var sTexte = aMsgErreur[sLangue][5];
					 		fMsg('BarOrange', iTotalPoint);
						}else {
					 		var sTexte = aMsgErreur[sLangue][4];
					 		fMsg('BarRed', 0);
						}
					}
				}else {
					var sTexte = sMsgErreur;
					fMsg('BarRed', 0);
				}
			}else {
				var sTexte = sMsgErreur;
				fMsg('BarRed', 0);
			}
		}else{
			var sTexte = sMsgErreur;
			fMsg('BarRed', 0);
		}
	}else {
		var sTexte = "";
		fMsg('', 0);
	}
	document.getElementById("iIdInfos").innerHTML = "<gettext>" + sTexte + "</gettext>";
	return false;
}
 
function fMsg(sClass, iPoint){
	document.getElementById('iIdBarreCouleur').className=sClass;
	oFormulaire.iTotal.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; 
} 

