/*******************************************************************************
** Fichier     : validators.js                                                **
** Auteur      : FISCHER Michaël                                              **
** Créé le     : 04/09/2008                                                   **
** Version     : 1.0                                                          **
** Modif.      :                                                              **
********************************************************************************
** Description : Fichier contenant divers validateurs JavaScript              **
*******************************************************************************/

/* */

/**
 * 
 */
function confirmation(formulaire, message) {
   if (confirm(message)) {
      /* Met la couleur de fond blanc aux input de type 'text', 'password' ainsi
         qu'aux champs 'textarea'
      */
      for (var i=0 ; i < formulaire.elements.length ; i++) {
         if (
            (formulaire.elements[i].type == 'text') ||
            (formulaire.elements[i].type == 'textarea') ||
            (formulaire.elements[i].type == 'password')
         ) {
            formulaire.elements[i].style.backgroundColor = "rgb(255, 255, 255)";
            /*if (formulaire.elements[i].type == 'textarea') {
               document.getElementById(
                  formulaire.elements[i].name+'_cpt'
               ).innerHTML = 0;
            }*/
         }
      }
      return true;
   }
   return false;
}

/**
 * Fonction permettant de vérifier si une date est valide
 */
function isDate(c, separator) {
   if (c == "") {
      return false;
   }
   var expReg = new RegExp("^[*+?./\]$");
   if (expReg.test(separator)) {
      e = new RegExp(
         "^([0-9]{2})\\"+separator+"[0-9]{2}\\"+separator+"[0-9]{4}$"
      );
   }
   else {
      e = new RegExp(
         "^([0-9]{2})"+separator+"[0-9]{2}"+separator+"[0-9]{4}$"
      );
   }
   if (!e.test(c)) {
      return false;
   }
   d = parseInt(c.split(separator)[0], 10); // jour
   m = parseInt(c.split(separator)[1], 10); // mois
   y = parseInt(c.split(separator)[2], 10); // année
   
   /* Année bissextile ? */
   if (((y%4 == 0) && (y%100 != 0)) || (y%400 == 0)) {
      fevrier = 29;
   }
   else {
      fevrier = 28;
   }
   nbJours = new Array(31, fevrier, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
   return ((m >= 1) && (m <= 12) && (d >= 1) && (d <= nbJours[m-1]));
}

/* */


/**
 * Fonction permettant de vérifier qu'un champ n'est pas vide
 */
function vIsNotEmpty(field) {
   var expReg = new RegExp("^\\s*(\\S\\s*)+\\s*$");
   if (expReg.test(field.value)) {
      return true;
   }
   return false;
}

/**
 * Fonction permettant de vérifier qu'un champ contienne entre 'min' et 'max'
 * caractères
 */
function vIsString(field, required, min, max, spacing) {
   if (spacing) {
      var expReg = new RegExp("^(\\S|\\s){"+min+","+max+"}$");
   }
   else {
      var expReg = new RegExp("^\\S{"+min+","+max+"}$");
   }
   if (expReg.test(field.value) || ((field.value == '') && !required)) {
      return true;
   }
   return false;
}

/**
 * Fonction permettant de vérifier qu'un champ contienne entre 'min' et 'max'
 * lettres (minuscules ou majuscules) et chiffres
 */
function vIsAlphanum(field, required, min, max) {
   var expReg = new RegExp("^[a-zA-Z0-9]{"+min+","+max+"}$");
   if (expReg.test(field.value) || ((field.value == '') && !required)) {
      return true;
   }
   return false;
}

/**
 * Fonction permettant de vérifier qu'un champ contienne une adresse e-mail
 */
function vIsEmail(field, required) {
   var expReg = new RegExp("^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$");
   if (expReg.test(field.value) || ((field.value == '') && !required)) {
      return true;
   }
   return false;
}

/**
 * Fonction permettant de vérifier qu'un champ contienne un nombre entier
 * compris dans un intervalle
 */
function vIsInteger(field, required, min ,max) {
   var expReg = new RegExp("^[0-9]+$");
   if (expReg.test(field.value)) {
      if ((field.value >= min) && (field.value <= max)) {
         return true;
      }
   }
   else if ((field.value == '') && !required) {
      return true;
   }
   return false;
}

/**
 * Fonction permettant de vérifier qu'un champ contienne un nombre à virgule
 * flottante compris dans un intervalle
 */
function vIsFloat(field, required, min, max, nbDec) {
   var expReg = new RegExp("^[0-9]+(\.[0-9]{0,"+nbDec+"})?$");
   
   if (expReg.test(field.value)) {
      if ((field.value >= min) && (field.value <= max)) {
         return true;
      }
   }
   else if ((field.value == '') && !required) {
      return true;
   }
   return false;
}

/**
 * Fonction permettant de vérifier qu'un champ contienne un nombre contenant un
 * certain nombre de chiffres
 */
function vIsDigit(field, required, min, max) {
   var expReg = new RegExp("^[0-9]{"+min+","+max+"}$");
   if (expReg.test(field.value) || ((field.value == '') && !required)) {
      return true;
   }
   return false;
}

/**
 * Fonction permettant de vérifier qu'un champ satisfasse une expression
 * régulière
 */
function vIsRegex(field, required, regex, match) {
   var expReg = new RegExp(regex);
   var ok = (match?expReg.test(field.value):!expReg.test(field.value));
   if (ok || ((field.value == '') && !required)) {
      return true;
   }
   return false;
}

/**
 * Fonction permettant de vérifier qu'un champ contienne la même chose qu'un
 * autre champ
 */
function vIsCompare(field, required, otherField) {
   if ((field.value == otherField.value) || ((field.value == '') && !required)) {
      return true;
   }
   return false;
}

/**
 * Fonction permettant le vérification de la syntaxe d'une heure
 */
function vIsTime(field, required, separator) {
   var expReg = new RegExp("^[*+?./\]$");
   if (expReg.test(separator)) {
      separator = '\\'+separator;
   }
   var expReg = new RegExp("^(([0-1][0-9])|(2[0-3]))"+separator+"[0-5][0-9]$");
   if (expReg.test(field.value) || ((field.value == '') && !required)) {
      return true;
   }
   return false;
}

/**
 * Fonction permettant la vérification de la syntaxe d'une date
 */
function vIsDate(field, required, separator) {
   if (isDate(field.value, separator) ||
      ((field.value == '') && !required)
   ) {
      return true;
   }
   return false;
}


/************** FONCTIONS AGISSANT SUR LES CHAMPS D'UN FORMULAIRE *************/

/**
 * Fonction permettant de modifier la couleur de fond d'un champ ne devant pas
 * être vide en fonction du texte saisi dans ce dernier
 */
function vNotEmpty(field) {
   if (vIsNotEmpty(field)) {
      field.style.backgroundColor = "rgb(164, 242, 140)";/*"#A4F28C";*/
   }
   else {
      field.style.backgroundColor = "rgb(255, 136,139)";/*"#FF888B";*/
   }
}

/**
 * Fonction permettant de modifier la couleur de fond d'un champ devant contenir
 * entre 'min' et 'max' caractères
 */
function vString(field, required, min, max, spacing) {
   min = ((min == undefined)?1:min);
   max = ((max == undefined)?20:max);
   spacing = ((spacing == undefined)?true:spacing);
   if (vIsString(field, required, min, max, spacing)) {
      field.style.backgroundColor = "rgb(164, 242, 140)";/*"#A4F28C";*/
   }
   else {
      field.style.backgroundColor = "rgb(255, 136,139)";/*"#FF888B";*/
   }
}

/**
 * Fonction permettant de modifier la couleur de fond d'un champ devant contenir
 * entre 'min' et 'max' lettres (minuscules ou majuscules) et chiffres
 */
function vAlphanum(field, required, min, max) {
   min = ((min == undefined)?1:min);
   max = ((max == undefined)?20:max);
   if (vIsAlphanum(field, required, min, max)) {
      field.style.backgroundColor = "rgb(164, 242, 140)";/*"#A4F28C";*/
   }
   else {
      field.style.backgroundColor = "rgb(255, 136,139)";/*"#FF888B";*/
   }
}

/**
 * Fonction permettant de modifier la couleur de fond d'un champ devant contenir
 * une adresse e-mail
 */
function vEmail(field, required) {
   if (vIsEmail(field, required)) {
      field.style.backgroundColor = "rgb(164, 242, 140)";/*"#A4F28C";*/
   }
   else {
      field.style.backgroundColor = "rgb(255, 136,139)";/*"#FF888B";*/
   }
}

/**
 * Fonction permettant de modifier la couleur de fond d'un champ devant contenir
 * un nombre entier compris dans un intervalle
 */
function vInteger(field, required, min, max) {
   if (vIsInteger(field, required, min, max)) {
      field.style.backgroundColor = "rgb(164, 242, 140)";/*"#A4F28C";*/
   }
   else {
      field.style.backgroundColor = "rgb(255, 136,139)";/*"#FF888B";*/
   }
}

/**
 * Fonction permettant de modifier la couleur de fond d'un champ devant contenir
 * un nombre à virgule flottante compris dans un intervalle
 */
function vFloat(field, required, min, max, nbDec) {
   nbDec = ((nbDec == undefined)?3:nbDec);
   if (vIsFloat(field, required, min, max, nbDec)) {
      field.style.backgroundColor = "rgb(164, 242, 140)";/*"#A4F28C";*/
   }
   else {
      field.style.backgroundColor = "rgb(255, 136,139)";/*"#FF888B";*/
   }
}

/**
 * Fonction permettant de modifier la couleur de fond d'un champ devant contenir
 * un nombre contenant un certain nombre de chiffres
 */
function vDigit(field, required, min, max) {
   min = ((min == undefined)?1:min);
   max = ((max == undefined)?10:max);
   if (vIsDigit(field, required, min, max)) {
      field.style.backgroundColor = "rgb(164, 242, 140)";/*"#A4F28C";*/
   }
   else {
      field.style.backgroundColor = "rgb(255, 136,139)";/*"#FF888B";*/
   }
}

/**
 * Fonction permettant de modifier la couleur de fond d'un champ devant
 * satisfaire une expression régulière
 */
function vRegex(field, required, regex, match) {
   match = ((match == undefined)?true:match);
   if (vIsRegex(field, required, regex, match)) {
      field.style.backgroundColor = "rgb(164, 242, 140)";
   }
   else {
      field.style.backgroundColor = "rgb(255, 136,139)";
   }
}

/**
 * Fonction permettant de modifier la couleur de fond d'un champ devant contenir
 * la même chose qu'un autre champ
 */
function vCompare(field, required, otherField) {
   if (vIsCompare(field, required, otherField)) {
      field.style.backgroundColor = "rgb(164, 242, 140)";/*"#A4F28C";*/
   }
   else {
      field.style.backgroundColor = "rgb(255, 136,139)";/*"#FF888B";*/
   }
}

/**
 * Fonction permettant de modifier la couleur de fond d'un champ devant contenir
 * une heure
 */
function vTime(field, required, separator) {
   separator = ((separator == undefined)?'':separator);
   if (vIsTime(field, required, separator)) {
      field.style.backgroundColor = "rgb(164, 242, 140)";/*"#A4F28C";*/
   }
   else {
      field.style.backgroundColor = "rgb(255, 136,139)";/*"#FF888B";*/
   }
}

/**
 * Fonction permettant de modifier la couleur de fond d'un champ devant contenir
 * une date
 */
function vDate(field, required, separator) {
   separator = ((separator == undefined)?'':separator);
   if (vIsDate(field, required, separator)) {
      field.style.backgroundColor = "rgb(164, 242, 140)";/*"#A4F28C";*/
   }
   else {
      field.style.backgroundColor = "rgb(255, 136,139)";/*"#FF888B";*/
   }
}