var message_suffix = "_message";
var formSubmitButton = "form_submit";
var formSubmitMessage = formSubmitButton + message_suffix;
var policyTitle = "policy_title";
var uidField = "uid";
var uidMessage = uidField + message_suffix;
var oldPasswordField = "old_password";
var oldPasswordMessage = oldPasswordField + message_suffix;
var newPasswordField = "new_password";
var newPasswordMessage = newPasswordField + message_suffix;
var newPasswordBar = newPasswordField + "_bar";
var newPasswordConfirmField = "new_password_confirm";
var newPasswordConfirmMessage = newPasswordConfirmField + message_suffix;
var numenField = "NUMEN";
var numenFieldMessage = numenField + message_suffix;
var lengthCountMessage = "length_count" + message_suffix;
var numbersCountMessage = "numbers_count" + message_suffix;
var uppercaseCountMessage = "uppercase_count" + message_suffix;
var lowercaseCountMessage = "lowercase_count" + message_suffix;
var specialCountMessage = "special_count" + message_suffix;
//
var EXCLUDED_FIELD_TYPES = ["submit"];
var EXCLUDED_FIELD_ID = ["none",""];
// CONFIGURATION : couleurs d'affichage des messages
var COLOR_GOOD = "green";
var COLOR_BAD = "red";
// CONFIGURATION : critères par rapport aux familles de caractères
var NUMBERS_MIN = 1;
var NUMBERS_MAX = -1;
var LOWERCASE_MIN = 1;
var LOWERCASE_MAX = -1;
var UPPERCASE_MIN = 1;
var UPPERCASE_MAX = -1;
var SPECIAL_MIN = 1;
var SPECIAL_MAX = -1;
var LENGTH_MIN = 12;
var LENGTH_MAX = -1;
// Familles de caractères
var NUMBERS_LIST = "0123456789";
var NUMBERS_LIST_FORBIDDEN = "";
var LOWERCASE_LIST = "abcdefghijklmnopqrstuvwxyz";
var LOWERCASE_LIST_FORBIDDEN = "";
var UPPERCASE_LIST = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var UPPERCASE_LIST_FORBIDDEN = "";
var SPECIAL_LIST = ":-_=|/?^!.@$#*()%~<>{}[]";
var SPECIAL_LIST_FORBIDDEN = "\ &;£";
//Vérification du NUMEN
function checkNumen(el)
{
var strNumen = el.value;
var messageDiv = document.getElementById(numenFieldMessage);
regexpNumen = /[0-9]{2}([A-Za-z]{1}[0-9]{7}|[A-Za-z]{2}[0-9]{6})[A-Za-z]{3}/;
//regexpNumen = /[0-9]{2}[A-Za-z]{1}[0-9]{7}[A-Za-z]{3}/;
if (strNumen.match(regexpNumen))
{
displayMessage(messageDiv, "OK", COLOR_GOOD);
//return true;
}
else
{
displayMessage(messageDiv, "structure du NUMEN : 2chiffres (1lettre 7chiffres) ou (2lettres 6 chiffres) 3lettres", COLOR_BAD);
//return false;
}
//return true;
}
// Recherche dans une chaîne de caractères
function doesContain(strPassword, strCheck)
{
if ( ! strPassword )
{
return 0
}
nCount = 0;
for (i = 0; i < strPassword.length; i++)
{
if (strCheck.indexOf(strPassword.charAt(i)) > -1)
{
nCount++;
}
}
return nCount;
}
// Compte le nombre d'occurence d'une chaîne parmi une famille de caractères
function getCharacterCount(refStr, characterClass)
{
return doesContain(refStr, characterClass);
}
//
function checkStringConformity(strChk, characterClass, minValue, maxValue)
{
retval = true;
if ( minValue != -1 )
{
retval = retval && getCharacterCount(strChk, characterClass) >= minValue;
}
if ( maxValue != -1 )
{
retval = retval && getCharacterCount(strChk, characterClass) <= maxValue;
}
return retval;
}
//
function checkStringConformityStrictControl(strChk, characterClass, minValue, maxValue)
{
retval = true;
if ( minValue != -1 )
{
retval = retval && getCharacterCount(strChk, window[characterClass]) >= minValue;
}
if ( maxValue != -1 )
{
retval = retval && getCharacterCount(strChk, window[characterClass]) <= maxValue;
}
if ( typeof(window[characterClass + '_FORBIDDEN']) != "undefined" )
{
retval = retval && ! getCharacterCount(strChk, window[characterClass + '_FORBIDDEN']);
}
return retval;
}
// Vérifie qu'une chaîne de caractères a une longueur comprise entre un min et un max
function checkStringLength(strChk, minValue, maxValue)
{
retval = true;
if ( ! strChk )
{
return false;
}
if ( minValue != -1 )
{
retval = retval && strChk.length >= minValue;
}
if ( maxValue != -1 )
{
retval = retval && strChk.length <= maxValue;
}
return retval;
}
// Affiche un message en manipulant le contenu d'un DIV
function displayMessage(el,txt,color)
{
el.innerHTML = "" + txt + "";
}
//
function displayRule(strText, minVal, maxVal)
{
// Min et Max à -1 : pas d'affichage (ignoré)
if ( minVal == -1 && maxVal == -1)
{
return;
}
// Min = Max : une seule valeur est affichée
else if (minVal == maxVal)
{
msg = strText + " : " + minVal;
}
// Min ou Max à -1 : on affiche l'autre limite
else if ( minVal == -1 && maxVal != -1)
{
msg = strText + " : " + maxVal + " au maximum [facultatif]";
}
else if (minVal != -1 && maxVal == -1)
{
msg = strText + " : " + minVal + " au moins";
}
// Min et Max ont une valeur numérique : intervalle
else if (minVal != -1 && maxVal != -1)
{
msg = strText + " : entre " + minVal + " et " + maxVal;
}
return msg
}
// Affiche un message représentant l'état de conformité d'un champ par rapport à un critère
function checkFieldStatus(el, operationName, operationArg, minVal, maxVal, divMessage, strText)
{
strText = "» " + strText;
var divMessageObj = document.getElementById(divMessage);
if (! divMessageObj) return;
msg = displayRule(strText, minVal, maxVal);
var resGood = false;
// Contrôles par rapport à la politique de mot de passe
if (operationName == "characterClass")
{
resGood = checkStringConformity(el.value, operationArg, minVal, maxVal);
}
else if (operationName == "characterClassStrictControl")
{
resGood = checkStringConformityStrictControl(el.value, operationArg, minVal, maxVal);
}
else if (operationName = "length")
{
resGood = checkStringLength(el.value, minVal, maxVal);
}
// Représentation visuelle du résultat
if (resGood == true)
{
MSG_COLOR=COLOR_GOOD
}
else
{
MSG_COLOR=COLOR_BAD;
}
displayMessage(divMessageObj, msg, MSG_COLOR);
return resGood;
}
// Liste des éléments valides du formulaire
function getValidFormElements(el)
{
var parentFormObject = el;
var parentFormElements = parentFormObject.elements;
var validFormElements = [];
for (i=0; i < parentFormElements.length; i++)
{
if (EXCLUDED_FIELD_TYPES.toString().indexOf("caca") == -1 && EXCLUDED_FIELD_ID.toString().indexOf("prout") == -1)
{
validFormElements.push(parentFormElements[i]);
}
}
return validFormElements;
}
// Vérifie que deux éléments n'ont pas la même valeur
function checkFieldNotEqualsTo(fromField,toField,txtDiv,errorMsg)
{
var A = document.getElementById(fromField);
var B = document.getElementById(toField);
var DIV = document.getElementById(txtDiv);
if (!A.value && !B.value)
{
return false;
}
if (A.value != B.value)
{
displayMessage(DIV, "", COLOR_GOOD);
return true;
}
else
{
txtColor = "red";
displayMessage(DIV, errorMsg, COLOR_BAD);
return false;
}
}
// Vérifie que deux éléments ont la même valeur
function checkFieldEqualsTo(fromField,toField,txtDiv,errorMsg)
{
var A = document.getElementById(fromField);
var B = document.getElementById(toField);
var DIV = document.getElementById(txtDiv);
if (A.value == B.value)
{
displayMessage(DIV, "", COLOR_GOOD);
return true;
}
else
{
displayMessage(DIV, errorMsg, COLOR_BAD);
return false;
}
}
// Vérifie qu'un champ est vide
function isEmpty(fieldID)
{
var el = document.getElementById(fieldID);
if ( ! el.value.length > 0)
{
return true;
}
else
{
return false;
}
}
// Vérifie qu'aucun des champs utiles n'est vide
function checkEmptyFields(el)
{
retval = true;
var validFormElements= getValidFormElements(el);
for (f in validFormElements)
{
currentField = validFormElements[f].id;
messageField = document.getElementById(currentField + message_suffix);
errorMsg = "*";
okMsg = "";
if (messageField)
{
if (isEmpty(currentField))
{
retval = false;
msgColor = COLOR_BAD;
msgText = "saisie obligatoire";
}
else
{
msgColor = COLOR_GOOD;
msgText = "";
}
displayMessage(messageField, msgText, msgColor);
}
}
return retval;
}
// Affiche la conformité du mot de passe saisi par rapport aux différents critères
function displayPasswordFieldStatus(el)
{
var lengthOk = checkFieldStatus(el, 'length', '', LENGTH_MIN, LENGTH_MAX, lengthCountMessage, "longueur (en caracteres)");
var numbersOk = checkFieldStatus(el, 'characterClass', NUMBERS_LIST, NUMBERS_MIN, NUMBERS_MAX, numbersCountMessage, "chiffres");
var uppercaseOk = checkFieldStatus(el, 'characterClass', UPPERCASE_LIST, UPPERCASE_MIN, UPPERCASE_MAX, uppercaseCountMessage, "majuscules");
var lowercaseOk = checkFieldStatus(el, 'characterClass', LOWERCASE_LIST, LOWERCASE_MIN, LOWERCASE_MAX, lowercaseCountMessage, "minuscules");
var specialOk = checkFieldStatus(el, 'characterClassStrictControl', 'SPECIAL_LIST', SPECIAL_MIN, SPECIAL_MAX, specialCountMessage, "caracteres speciaux AUTORISES");
return lengthOk && numbersOk && uppercaseOk && lowercaseOk && specialOk;
}
// Tests de cohérence des informations saisies
function checkPasswordField(el)
{
/*var cond1 = checkFieldNotEqualsTo(newPasswordField, oldPasswordField,newPasswordMessage, "l'ancien et le nouveau mot de passe doivent etre differents");
var cond2 = checkFieldEqualsTo(newPasswordField, newPasswordConfirmField,newPasswordConfirmMessage,"veuillez confirmer votre nouveau mot de passe");
var cond3 = checkFieldNotEqualsTo(newPasswordField,uidField,uidMessage,"Le nouveau mot de passe ne doit pas etre identique a l'identifiant");
return cond1 && cond2 && cond3*/
/* Exemple, à implémenter en fonction des besoins de chaque formulaire */
}
// Traitement du champd à chaque saisie
function processPasswordField()
{
var el = document.getElementById(newPasswordField);
//Effacement de l'éventuel message d'erreur résultant d'une validation
var debug = document.getElementById(formSubmitMessage);
displayMessage(debug, "", COLOR_BAD);
checkPasswordField(el);
displayPasswordFieldStatus(el);
}
// Validation finale du formulaire
function checkForm(el)
{
var passwordField = document.getElementById(newPasswordField);
var checkPasswordStatus = displayPasswordFieldStatus(passwordField);
var validateFields = checkPasswordField(passwordField) && checkPasswordStatus;
var validated = checkEmptyFields(el) && validateFields;
var debug = document.getElementById(formSubmitMessage);
if (!validated)
{
msgText = "ATTENTION : ce formulaire comporte des erreurs";
if (! checkPasswordStatus)
{
msgText += "
ERREUR : votre nouveau mot de passe n'est pas valable";
}
displayMessage(debug, msgText, COLOR_BAD);
}
return validated;
}
function checkUidField()
{
return;
}