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; }