// 2008-08-26 L. Meynadier
// 2008-09-02 Correctif de majuscule + commentaires sur IE

function max_tableau(tableau) // retourne la longueur de l'Ã©lÃ©ment le plus long d'un tableau de chaines de caractÃ¨res
{
	taille = 0;
	while (tableau.length > 0) {
		ligne = tableau.pop().length;
		if (ligne > taille) {
			taille=ligne;
		}
	}
	return taille;
}

function dedoublonne(chaine) // Ã©limine les caractÃ¨res en doublon dans une chaine
{
	tableau = chaine.split('').reverse();
	resultat = '';
	while (tableau.length > 0) {
		caractere = tableau.pop();
		if (tableau.indexOf(caractere) == -1) { resultat += caractere; }
	}
	return resultat;
}

function securite_mdp(champ_mdp) // calcul le niveau de confiance Ã  accorder Ã  un mot de passe
{
// Pour que cela fonctionne avec IE 6 ou 7, il faut procÃ©der aux changements suivants :
//
// majuscule = max_tableau(mdp.split(/[^A-Z]/));
// minuscule = max_tableau(mdp.split(/[^a-z]/));
// lettre = max_tableau(mdp.split(/[^a-zA-Z]/));
// chiffre = max_tableau(mdp.split(/[^0-9]/));
// different = max_tableau(mdp.split(/[^a-zA-Z0-9]/));
// accent = 0;
// nonalphanum = different;
//
// et modifier le calcul du score pour prendre en compte le fait que les accents ne sont pas reconnus.
//
// On peut savoir si on a affaire Ã  IE avec le test suivant par exemple :
//
// if ((navigator.appVersion.indexOf('MSIE') != -1) { alert('Internet Explorer'); }
//
	mdp = champ_mdp.value.replace(/^\s*/,'').replace(/\s*$/,''); // suppression des espaces en dÃ©but et fin
	longueur = mdp.length; // longueur du mot de passe
	if (longueur >= 8) // taille minimum du mot de passe = 6
	{
		if (navigator.appVersion.indexOf('MSIE') != -1) {
			majuscule = max_tableau(mdp.split(/[^A-Z]/));
			minuscule = max_tableau(mdp.split(/[^a-z]/));
			lettre = max_tableau(mdp.split(/[^a-zA-Z]/));
			chiffre = max_tableau(mdp.split(/[^0-9]/));
			different = max_tableau(mdp.split(/[^a-zA-Z0-9]/));
			accent = 0;
			nonalphanum = different;
		} 
		else {
			majuscule = max_tableau(mdp.split(/[^A-ZÀÂÄÇÉÈÊËÎÏÔÖÙÛÜŸ]/)); // plus grand nombre de lettres majuscules successives			
			lettre = max_tableau(mdp.split(/[^a-zA-ZàâäçéèêëîïôöùûüÿÀÂÄÇÉÈÊËÎÏÔÖÙÛÜŸ]/)); // plus grand nombre de lettres successives
			chiffre = max_tableau(mdp.split(/[^0-9]/)); // plus grand nombre de chiffres successives
			different = dedoublonne(mdp).length; // nombre de caracteres differents
			accent = mdp.split(/[àâäçéèêëîïôöùûüÿÀÂÄÇÉÈÊËÎÏÔÖÙÛÜŸ]/).length-1; // nombre d'occurence de caractères accentues français
			minuscule = max_tableau(mdp.split(/[^a-zàâäçéèêëîïôöùûüÿa]/)); // plus grand nombre de lettres minuscules successives
		}
		if (majuscule == longueur || minuscule == longueur || chiffre == longueur || different == 1) {
			score = 1; // score maximum s'il n'y a que des caractÃ¨res d'un mÃªme type
		}else if (isDate("dmy",mdp)) {
			score = 1; // score maximum s'il s'agit d'une date
		} else {
			score = different;
			score -= majuscule;
			score -= minuscule;
			if (score < 2) {score = 2;} // score minimum s'il y a des majuscules et minuscules
			if (chiffre > 0) {score++;}
			nonalphanum = mdp.split(/[^A-Za-z0-9]/).length-1-accent; // nombre d'occurence de caractÃ¨res non-alphanumÃ©rique
			if (accent > 0) {score++;} // bonus en presence d'accent(s)
			if (nonalphanum > 0) {score += 2;} // bonus en prÃ©sence de caractÃ¨re(s) non-alphanumÃ©rique(s)
			if (majuscule > 0 && minuscule > 0 && chiffre >0 && accent > 0 && nonalphanum > 0) {score++;} //bonus pour la prÃ©sence de caractÃ¨res de diffÃ©rent type
//			if (score > 6 && lettre > (longueur/2)) {score = 6;} // score maximum s'il y a trop de lettres qui se suivent
			if (score > 8 ) {score = 8;}
		}
	} else {
		score = 0; // score nul pour un mot de passe trop court
	}
	return score;
}

function vumetre_mdp(degre, style) // affiche les couleurs en fonction du score obtenu
{
	var couleurs = new Array ('#c00', '#f00', '#ff4000', '#ff8000', '#ffc000', '#ff0', '#c0ff00', '#0f0'); // couleurs du vumÃ¨tre
	var force = new Array ('Tr&egrave;s faible', 'Faible', 'Passable', 'Correct', 'Bon', 'Tr&egrave;s bon', 'Excellent', 'Optimal');
	//document.getElementById(style+'0').style.color='inherit'; // affichage du texte prÃ©cÃ©dent les cases
	// document.getElementById(style+'0').style.color='#000'; // version supportÃ©e par IE 6 ou 7
	for (i = 1 ; i <= couleurs.length ; i++)
	{
		if (degre >= i) {
			document.getElementById(style+i).style.background=couleurs[i-1]; // mise en couleur d'une case
		} else {
			document.getElementById(style+i).style.background='#fff'; // retour au blanc d'une case
		}
	}
	if (degre>0) {
		document.getElementById("securite").style.display="block";
		document.getElementById("force").innerHTML=force[degre-1];
	} else {
		document.getElementById("securite").style.display="none";
		document.getElementById("force").innerHTML="";
	}
}

// Autres fonctions (commentÃ©es dans le index.html)
function test_champ_vide(champ, message)
{
	if (champ.value == '') {
		if (message != '') {
			alert(message);
		}
		champ.focus();
		champ.select();
		return false;
	} else {
		return true;
	}
}

function test_longueur_min(champ, taille, message)
{
	if (champ.value.length < taille) {
		if (message != '') {
			alert(message);
		}
		champ.focus();
		champ.select();
		return false;
	} else {
		return true;
	}	
}

function compare_deux_champs(champ1, champ2, message)
{
	if (champ1.value != champ2.value) {
		if (message != '') {
			alert(message);
		}
		champ1.value = '';
		champ2.value = '';
		champ1.focus();
		champ1.select();
		return false;
	} else {
		return true;
	}
}


