/**
 * @FileFR » Gestion des contrôles de formulaire
 * @FileEN » Management of the controls of form
 */

/**
 * @FunctionFR checkControls » Vérifie tous les contrôles et affiche les messages associés
 * @FunctionEN checkControls » Check all the controls and return the associated messages
 * @ParamFR aaControlsArray Array / » Tableau de contrôles
 * @ParamEN aaControlsArray Array / » Array of controls
 */
function checkControls(aaControlsArray)
{
   laMessages = new Array();
   for (var i = 0 ; i < aaControlsArray.length ; i++)
   {
      // Tableau de contrôles : ['Required', Id, Condition, Type, Span, IdTarget]
      if (aaControlsArray[i][0] == "Required")
      {
         if (laMessages[aaControlsArray[i][4]] == null)
         {
            laMessages[aaControlsArray[i][4]] = new Array();
         }
         laMessages[aaControlsArray[i][4]][laMessages[aaControlsArray[i][4]].length] = new Array(checkRequired(aaControlsArray[i][1], aaControlsArray[i][2]), aaControlsArray[i][3], aaControlsArray[i][5]);
      }
      // Tableau de contrôles : ['Incorrect', Id, Condition, Type, Span, IdTarget]
      if (aaControlsArray[i][0] == "Incorrect")
      {
         if (laMessages[aaControlsArray[i][4]] == null)
         {
            laMessages[aaControlsArray[i][4]] = new Array();
         }
         laMessages[aaControlsArray[i][4]][laMessages[aaControlsArray[i][4]].length] = new Array(checkCorrect(aaControlsArray[i][1], aaControlsArray[i][2]), aaControlsArray[i][3], aaControlsArray[i][5]);
      }
      // Tableau de contrôles : ['Correct', Id, Condition, Type, Span, IdTarget]
      if (aaControlsArray[i][0] == "Correct")
      {
         if (laMessages[aaControlsArray[i][4]] == null)
         {
            laMessages[aaControlsArray[i][4]] = new Array();
         }
         laMessages[aaControlsArray[i][4]][laMessages[aaControlsArray[i][4]].length] = new Array(checkCorrect(aaControlsArray[i][1], aaControlsArray[i][2]), aaControlsArray[i][3], aaControlsArray[i][5]);
      }
      // Tableau de contrôles : ['Length', Id, Condition, Type, Span, IdTarget]
      if (aaControlsArray[i][0] == "Length")
      {
         if (laMessages[aaControlsArray[i][5]] == null)
         {
            laMessages[aaControlsArray[i][5]] = new Array();
         }
         laMessages[aaControlsArray[i][5]][laMessages[aaControlsArray[i][5]].length] = new Array(checkLength(aaControlsArray[i][1], aaControlsArray[i][2], aaControlsArray[i][3]), aaControlsArray[i][4], aaControlsArray[i][6]);
      }
      // Tableau de contrôles : ['Email', Id, Type, Span, IdTarget]
      if (aaControlsArray[i][0] == "Email")
      {
         if (laMessages[aaControlsArray[i][3]] == null)
         {
            laMessages[aaControlsArray[i][3]] = new Array();
         }
         laMessages[aaControlsArray[i][3]][laMessages[aaControlsArray[i][3]].length] = new Array(checkEmail(aaControlsArray[i][1]), aaControlsArray[i][2], aaControlsArray[i][4]);
      }
      // Tableau de contrôles : ['Phone', Id, Type, Span, IdTarget]
      if (aaControlsArray[i][0] == "Phone")
      {
         if (laMessages[aaControlsArray[i][3]] == null)
         {
            laMessages[aaControlsArray[i][3]] = new Array();
         }
         laMessages[aaControlsArray[i][3]][laMessages[aaControlsArray[i][3]].length] = new Array(checkPhone(aaControlsArray[i][1]), aaControlsArray[i][2], aaControlsArray[i][4]);
      }
      // Tableau de contrôles : ['Color', Id, DefaultValue, Type, Span, IdTarget]
      if (aaControlsArray[i][0] == "Color")
      {
         if (laMessages[aaControlsArray[i][4]] == null)
         {
            laMessages[aaControlsArray[i][4]] = new Array();
         }
         laMessages[aaControlsArray[i][4]][laMessages[aaControlsArray[i][4]].length] = new Array(checkColor(aaControlsArray[i][1], aaControlsArray[i][2]), aaControlsArray[i][3], aaControlsArray[i][5]);
      }
      // Tableau de contrôles : ['Number', Id, Format, FormatLanguage, Search, ValueMax, ValueMin, Type, Span, IdTarget]
      if (aaControlsArray[i][0] == "Number")
      {
         if (laMessages[aaControlsArray[i][9]] == null)
         {
            laMessages[aaControlsArray[i][9]] = new Array();
         }
         laMessages[aaControlsArray[i][9]][laMessages[aaControlsArray[i][9]].length] = new Array(checkNumber(aaControlsArray[i][1], aaControlsArray[i][2], aaControlsArray[i][3], aaControlsArray[i][4], aaControlsArray[i][5], aaControlsArray[i][6], aaControlsArray[i][7]), aaControlsArray[i][8], aaControlsArray[i][10]);
      }
      // Tableau de contrôles : ['Date', Id, FormatDate, DateLanguage, Search, Type, Span, IdTarget]
      if (aaControlsArray[i][0] == "Date")
      {
         if (laMessages[aaControlsArray[i][6]] == null)
         {
            laMessages[aaControlsArray[i][6]] = new Array();
         }
         laMessages[aaControlsArray[i][6]][laMessages[aaControlsArray[i][6]].length] = new Array(checkDate(aaControlsArray[i][1], aaControlsArray[i][2], aaControlsArray[i][3], aaControlsArray[i][4]), aaControlsArray[i][5], aaControlsArray[i][7]);
      }
      // Tableau de contrôles : ['Extension', Id, ExtensionsList, Type, Span, IdTarget]
      if (aaControlsArray[i][0] == "Extension")
      {
         if (laMessages[aaControlsArray[i][4]] == null)
         {
            laMessages[aaControlsArray[i][4]] = new Array();
         }
         laMessages[aaControlsArray[i][4]][laMessages[aaControlsArray[i][4]].length] = new Array(checkExtension(aaControlsArray[i][1], aaControlsArray[i][2]), aaControlsArray[i][3], aaControlsArray[i][5]);
      }
      // Tableau de contrôles : ['Special', Id, Condition, Message, Type, Span, IdTarget]
      if (aaControlsArray[i][0] == "Special")
      {
         if (laMessages[aaControlsArray[i][5]] == null)
         {
            laMessages[aaControlsArray[i][5]] = new Array();
         }
         laMessages[aaControlsArray[i][5]][laMessages[aaControlsArray[i][5]].length] = new Array(checkSpecial(aaControlsArray[i][1], aaControlsArray[i][2], aaControlsArray[i][3]), aaControlsArray[i][4], aaControlsArray[i][6]);
      }
   }

   for (var i in laMessages)
   {
      var laError      = new Array();
      var laWarning    = new Array();
      var laRequired   = new Array();
      var laCorrect    = new Array();
      var laIncorrect  = new Array();
      var lsValue = "checked";
      for (var j = 0 ; j < laMessages[i].length ; j++)
      {
         if (laMessages[i][j][2])
         {
            lsValue = document.getElementById(laMessages[i][j][2]).value;
         }
         if (laMessages[i][j][1] == "E" && laMessages[i][j][0] != "")
         {
            var lbAlready = false;
            for (k = 0 ; k < laError.length ; k++)
            {
               if (laError[k] ==laMessages[i][j][0])
               {
                  lbAlready = true;
               }
            }
            if (!lbAlready)
            {
               laError[laError.length] = laMessages[i][j][0];
            }
         }
         if (laMessages[i][j][1] == "W" && laMessages[i][j][0] != "")
         {
            var lbAlready = false;
            for (k = 0 ; k < laWarning.length ; k++)
            {
               if (laWarning[k] == laMessages[i][j][0])
               {
                  lbAlready = true;
               }
            }
            if (!lbAlready)
            {
               laWarning[laWarning.length] = laMessages[i][j][0];
            }
         }
         if (laMessages[i][j][1] == "O" && laMessages[i][j][0] != "")
         {
            laRequired[laRequired.length] = laMessages[i][j][0];
         }
         if (laMessages[i][j][1] == "C" && laMessages[i][j][0] != "")
         {
            laCorrect[laCorrect.length] = laMessages[i][j][0];
         }
         if (laMessages[i][j][1] == "I" && laMessages[i][j][0] != "")
         {
            laIncorrect[laIncorrect.length] = laMessages[i][j][0];
         }
      }
      var lsOutput = "";
      if (laRequired.length > 0)
      {
         lsOutput += '<a class="tooltip info-required" href="#"><img class="image" src="' + IMG_URL + 'msg-required.gif"/><span class="position"><span class="border-tooltip"><span class="text-tooltip">';
         lsOutput += laRequired[0];
         lsOutput += '</span></span><span class="arrow-tooltip">&nbsp;</span></span></a>';
      }
      else if (laError.length > 0)
      {
         lsOutput += '<a class="tooltip info-error" href="#"><img class="image" src="' + IMG_URL + 'msg-error.gif"/><span class="position"><span class="border-tooltip"><span class="text-tooltip">';
         for (var j = 0 ; j < laError.length ; j++)
         {
            lsOutput += (j != 0 ? "<br/>" : "") + laError[j];
         }
         lsOutput += '</span></span><span class="arrow-tooltip">&nbsp;</span></span></a>';
      }
      else if (laWarning.length > 0)
      {
         lsOutput += '<a class="tooltip info-warning" href="#"><img class="image" src="' + IMG_URL + 'msg-warning.gif"/><span class="position"><span class="border-tooltip"><span class="text-tooltip">';
         for (var j = 0 ; j < laWarning.length ; j++)
         {
            lsOutput += (j != 0 ? "<br/>" : "") + laWarning[j];
         }
         lsOutput += '</span></span><span class="arrow-tooltip">&nbsp;</span></span></a>';
      }
      else if (laIncorrect.length > 0)
      {
         lsOutput += '';
      }
      else if (laCorrect.length > 0)
      {
         lsOutput += '<img class="image" src="' + IMG_URL + 'msg-correct.gif"/>';
      }
      else if (laError.length == 0 && laWarning.length == 0 && laRequired.length == 0 && laIncorrect.length == 0 && lsValue != "")
      {
         lsOutput += '<img class="image" src="' + IMG_URL + 'msg-correct.gif"/>';
      }
      if (document.getElementById(i) != null)
      {
         document.getElementById(i).innerHTML = lsOutput;
      }
   }
}

/**
 * @FunctionFR checkSpecial » Vérifie le contrôle spécial et retourne le message d'erreur
 * @FunctionEN checkSpecial » Check the special control and return the error message
 * @ParamFR asIdField String / » Identifiant HTML du champ dans le formulaire
 * @ParamEN asIdField String / » HTML ID of the field in the form
 * @ParamFR asCondition Boolean / » Condition à évaluer pour vérifier le contrôle 
 * @ParamEN asCondition Boolean / » Condition to evaluate to check the control
 * @ParamFR asMessage String / » Message à afficher
 * @ParamEN asMessage String / » Message to display
 * @ReturnFR String » Message d'erreur
 * @ReturnEN String » Error message
 */
function checkSpecial(asIdField, asCondition, asMessage)
{
   if (eval(asCondition))
   {
      return asMessage;
   }
   return "";
}


/**
 * @FunctionFR checkExtension » Vérifie le contrôle d'extensions et retourne le message d'erreur
 * @FunctionEN checkExtension » Check the control of extensions and return the error message
 * @ParamFR asIdField String / » Identifiant HTML du champ dans le formulaire
 * @ParamEN asIdField String / » HTML ID of the field in the form
 * @ParamFR asExtensions String / » Extensions autorisées concaténées
 * @ParamEN asExtensions String / » Concatened authorised extensions
 * @ReturnFR String » Message d'erreur
 * @ReturnEN String » Error message
 */
function checkExtension(asIdField, asExtensions)
{
   var lsMsgError = "";
   var laExtensions = asExtensions.split(', ');
   var lbNotIn = false;
   loField = document.getElementById(asIdField);
   if (loField.value == "")
   {
      lbNotIn = true;
   }
   for (var n = 0 ; n < laExtensions.length ; n++)
   {
      if ("."+laExtensions[n].toUpperCase() == loField.value.substr(loField.value.length-laExtensions[n].length-1, laExtensions[n].length+1).toUpperCase())
      {
         lbNotIn = true;
      }
   }
   if (!lbNotIn)
   {
      lsMsgError = DivioLang["msgFileExtension"];
      //lsMsgError = DivioLang["msgFileExtension"].replace(/#0#/, asExtensions);
   }
   return lsMsgError;
}

/**
 * @FunctionFR checkCorrect » Vérifie si le champ est renseigné et retourne le message d'erreur
 * @FunctionEN checkCorrect » Check if the field is filled and return the error message
 * @ParamFR asIdField String / » Identifiant HTML du champ dans le formulaire
 * @ParamEN asIdField String / » HTML ID of the field in the form
 * @ParamFR asCondition Boolean / » Condition à évaluer pour vérifier le contrôle 
 * @ParamEN asCondition Boolean / » Condition to evaluate to check the control
 * @ReturnFR String » Message d'erreur
 * @ReturnEN String » Error message
 */
function checkCorrect(asIdField, asCondition)
{
   var lsMsgCorrect = "";
   var lbCondition;
   loField = document.getElementById(asIdField);
   if (asCondition == "")
   {
      var lsValue = loField.value.replace(/^\s*|\s*$/g,"");
      lbCondition = (lsValue != "");
      if (!lbCondition)
      {
         loField.value = "";
      }
   }
   else
   {
      lbCondition = !eval(asCondition);
   }
   if (lbCondition)
   {
      lsMsgCorrect = DivioLang["msgCorrect"];
   }
   return lsMsgCorrect;
}

/**
 * @FunctionFR checkRequired » Vérifie si le champ est renseigné et retourne le message d'erreur
 * @FunctionEN checkRequired » Check if the field is filled and return the error message
 * @ParamFR asIdField String / » Identifiant HTML du champ dans le formulaire
 * @ParamEN asIdField String / » HTML ID of the field in the form
 * @ParamFR asCondition Boolean / » Condition à évaluer pour vérifier le contrôle d'obligation
 * @ParamEN asCondition Boolean / » Condition to evaluate to check the required control
 * @ReturnFR String » Message d'erreur
 * @ReturnEN String » Error message
 */
function checkRequired(asIdField, asCondition)
{
   var lsMsgError = "";
   var lsCondition;
   loField = document.getElementById(asIdField);
   if (asCondition == "")
   {
      var lsValue = loField.value.replace(/^\s*|\s*$/g,"");
      lbCondition = (lsValue == "");
      if (lbCondition)
      {
         loField.value = "";
      }
   }
   else
   {
      lbCondition = eval(asCondition);
   }

   if (lbCondition)
   {
      lsMsgError = DivioLang["msgRequired"];
   }
   return lsMsgError;
}

/**
 * @FunctionFR checkEmail » Vérifie si le champ email est correct et retourne le message d'erreur
 * @FunctionEN checkEmail » Check if the email field is correct and return the error message
 * @ParamFR asIdField String / » Identifiant HTML du champ dans le formulaire
 * @ParamEN asIdField String / » HTML ID of the field in the form
 * @ReturnFR String » Message d'erreur
 * @ReturnEN String » Error message
 */
function checkEmail(asIdField)
{
   var lsMsgError = "";
   loField = document.getElementById(asIdField);
   var lsValue = loField.value.replace(/^\s*|\s*$/g,"");
   if (lsValue == "")
   {
      return "";
   }
   var reEmail = /^.+@.+\..{2,3}$/;
   if (!reEmail.test(lsValue))
   {
      lsMsgError = DivioLang["msgEmail"];
   }
   return lsMsgError;
}


/**
 * @FunctionFR checkPhone » Vérifie si le champ téléphone est correct et retourne le message d'erreur
 * @FunctionEN checkPhone » Check if the phone field is correct and return the error message
 * @ParamFR asIdField String / » Identifiant HTML du champ dans le formulaire
 * @ParamEN asIdField String / » HTML ID of the field in the form
 * @ReturnFR String » Message d'erreur
 * @ReturnEN String » Error message
 */
function checkPhone(asIdField)
{
   var lsMsgError = "";
   loField = document.getElementById(asIdField);
   var lsValue = loField.value.replace(/^\s*|\s*$/g,"");
   if (lsValue == "")
   {
      return "";
   }
   var rePhone1 = /^\+?[0-9 ]*(\([0-9 ]+\))*[0-9 ]*$/;
   var rePhone2 = /[0-9]{6,19}$/; // Seulement les chiffres
   if (!(rePhone1.test(lsValue) && rePhone2.test(lsValue.replace(/[+ \(\)]/g, ""))))
   {
      lsMsgError = DivioLang["msgPhone"];
   }
   return lsMsgError;
}


/**
 * @FunctionFR checkColor » Vérifie si le champ couleur est correct et retourne le message d'erreur
 * @FunctionEN checkColor » Check if the color field is correct and return the error message
 * @ParamFR asIdField String / » Identifiant HTML du champ dans le formulaire
 * @ParamEN asIdField String / » HTML ID of the field in the form
 * @ParamFR asDefaultValue String / » Couleur par défaut
 * @ParamEN asDefaultValue String / » Default color
 * @ReturnFR String » Message d'erreur
 * @ReturnEN String » Error message
 */
function checkColor(asIdField, asDefaultValue)
{
   var lsMsgError = "";
   loField = document.getElementById(asIdField);
   var lsValue = loField.value.replace(/^\s*|\s*$/g,"").toUpperCase();
   loField.value = lsValue;
   if (lsValue == "")
   {
      return "";
   }
   var reColor = /^#([0-9]|[A-F]){6}$/;
   if (!reColor.test(lsValue))
   {
      if (asDefaultValue != "")
      {
         loField.value = asDefaultValue;
      }
      else
      {
         lsMsgError = DivioLang["msgColor"];
      }
   }
   return lsMsgError;
}

/**
 * @FunctionFR checkLength » Vérifie si la longueur du champ est correcte et retourne le message d'erreur
 * @FunctionEN checkLength » Check if the length of the field is correct and return the error message
 * @ParamFR asIdField String / » Identifiant HTML du champ dans le formulaire
 * @ParamEN asIdField String / » HTML ID of the field in the form
 * @ParamFR anValueMin Integer / » Longueur minimum authorisée
 * @ParamEN anValueMin Integer / » Minimum authorised length
 * @ParamFR anValueMax Integer / » Longueur maximum authorisée
 * @ParamEN anValueMax Integer / » Maximum authorised length
 * @ReturnFR String » Message d'erreur
 * @ReturnEN String » Error message
 */
function checkLength(asIdField, anValueMin, anValueMax)
{
   var lsMsgError = "";
   loField = document.getElementById(asIdField);
   var lsValue = loField.value.replace(/^\s*|\s*$/g,"");
   if (lsValue == "")
   {
      return "";
   }
   if (lsValue.length < parseInt(anValueMin) || lsValue.length > parseInt(anValueMax))
   {
      if (anValueMin == anValueMax)
      {
         lsMsgError  = DivioLang["msgLengthEqual"].replace(/#0#/, anValueMin);
      }
      else
      {
         lsMsgError  = DivioLang["msgLengthBetween"];
         if (lsValue.length < parseInt(anValueMin))
         {
            lsMsgError += DivioLang["msgLengthMin"].replace(/#0#/, anValueMin);
         }
         if (lsValue.length > parseInt(anValueMax))
         {
            lsMsgError += DivioLang["msgLengthMax"].replace(/#0#/, anValueMax);
         }
      }
   }
   return lsMsgError;
}


/*******************************************************************************
                    Partie Vérification et formatage du nombre
*******************************************************************************/

/**
 * @FunctionFR checkNumber » Vérifie si le champ nombre est correct et retourne le message d'erreur
 * @FunctionEN checkNumber » Check if the number field is correct and return the error message
 * @ParamFR asIdField String / » Identifiant HTML du champ dans le formulaire
 * @ParamEN asIdField String / » HTML ID of the field in the form
 * @ParamFR asNumberFormat String / » Nombre de chiffres avant la virgule, nombre de chiffres après la virgule (exemple : 3,2 pour 999,00)
 * @ParamEN asNumberFormat String / » Number of digits before the comma, number of digits after the comma (example : 3,2 pour 999.00)
 * @ParamFR asNumberLangage String / » Format du nombre (FR => 9 999,00 ; EN => 9,999.00)
 * @ParamEN asNumberLangage String / » Format of the number (FR => 9 999,00 ; EN => 9,999.00)
 * @ParamFR abSearch Boolean / » Recherche ou non (caractères autorisés : > < = ! ?)
 * @ParamEN abSearch Boolean / » Search or not (authorised characters : > < = ! ?)
 * @ParamFR anValueMax Float / » Valeur maximum du nombre
 * @ParamEN anValueMax Float / » Maximum value of the number
 * @ParamFR anValueMin Float / » Valeur minimum du nombre
 * @ParamEN anValueMin Float / » Minimum value of the number
 * @ParamFR abFormat Boolean / » Formatage ou non du nombre
 * @ParamEN abFormat Boolean / » Formating or not of the number
 * @ReturnFR String » Message d'erreur
 * @ReturnEN String » Error message
 */
function checkNumber(asIdField, asNumberFormat, asNumberLangage, abSearch, anValueMax, anValueMin, abFormat)
{
   loNumberField = document.getElementById(asIdField);
   var lsMsgError = "";
   if (chkNumber(loNumberField, asNumberFormat, asNumberLangage, eval(abSearch), anValueMax, anValueMin, abFormat) == false)
   {
      laNumberFormat = asNumberFormat.split(",");
      lsMsgFormat = "";
      for (var n=0 ; n < parseInt(laNumberFormat[0]) ; n++)
      {
         lsMsgFormat += "9";
      }
      if (laNumberFormat.length == 2)
      {
         lsMsgFormat += DivioLang["msgNumberSeparate"];
         for (var n=0 ; n < parseInt(laNumberFormat[1]) ; n++)
         {
            lsMsgFormat += "0";
         }
      }

      lsMsgError = DivioLang["msgNumber"].replace(/#0#/, lsMsgFormat);
      if (anValueMin != "")
      {
         lsMsgError += DivioLang["msgNumberSuperior"].replace(/#0#/, anValueMin);
      }
      if (anValueMax != "")
      {
         lsMsgError += DivioLang["msgNumberInferior"].replace(/#0#/, anValueMax);
      }
   }
   return lsMsgError;
}

/**
 * @FunctionFR chckNumber » Vérifie si le champ nombre est correct et retourne s'il a une erreur
 * @FunctionEN chckNumber » Check if the number field is correct and return if there is an error
 * @ParamFR aoNumberField Object / » Champ dans le formulaire
 * @ParamEN aoNumberField Object / » Field in the form
 * @ParamFR asNumberFormat Integer / » Nombre de chiffres avant la virgule, nombre de chiffres après la virgule (exemple : 3,2 pour 999,00)
 * @ParamEN asNumberFormat Integer / » Number of digits before the comma, number of digits after the comma (example : 3,2 pour 999.00)
 * @ParamFR abSearch Boolean / » Recherche ou non (caractères autorisés : > < = ! ?)
 * @ParamEN abSearch Boolean / » Search or not (authorised characters : > < = ! ?)
 * @ParamFR anValueMax Float / » Valeur maximum du nombre
 * @ParamEN anValueMax Float / » Maximum value of the number
 * @ParamFR anValueMin Float / » Valeur minimum du nombre
 * @ParamEN anValueMin Float / » Minimum value of the number
 * @ParamFR abFormat Boolean / » Formatage ou non du nombre
 * @ParamEN abFormat Boolean / » Formating or not of the number
 * @ReturnFR Boolean » Existance d'une erreur
 * @ReturnEN Boolean » Existence of an error
 */
function chkNumber(aoNumberField, asNumberFormat, asNumberLangage, abSearch, anValueMax, anValueMin, abFormat)
{
   var lsNumber  = aoNumberField.value;
   
   var lsCompare = "";
   if (abSearch)
   {
      if (lsNumber == "!" || lsNumber == "?")
      {
         return true;
      }
      if (lsNumber.substr(0,2) == "<=" || lsNumber.substr(0,2) == ">=" || lsNumber.substr(0,2) == "<>")
      {
         lsCompare = lsNumber.substr(0,2);
         lsNumber = lsNumber.substr(2,lsNumber.length-2);
      }
      else if (lsNumber.substr(0,1) == "<" || lsNumber.substr(0,1) == ">" || lsNumber.substr(0,1) == "=")
      {
         lsCompare = lsNumber.substr(0,1);
         lsNumber = lsNumber.substr(1,lsNumber.length-1);
      }
   }
   var lsNumber = lsNumber.replace(/^\s*|\s*$/g,"");
   if (lsNumber == "")
   {
      aoNumberField.value = lsCompare;
      return true;
   }
   if (asNumberLangage == "FR")
   {
      lsNumber = lsNumber.replace(",", ".");
      lsNumber = lsNumber.replace(" ", "");
   }
   else
   {
      lsNumber = lsNumber.replace(" ", "");
      lsNumber = lsNumber.replace(",", "");
   }

   var laFormat = asNumberFormat.split(",");
   var lsRegExp = /^(-|\+)?(\d*)\.?(\d*)$/;
   if (!lsRegExp.exec(lsNumber))
   {
      return false; // Le nombre n'est pas correct
   }

   var lsInt = RegExp.$2;
   // Suppression des 0 devant en trop
   while (parseInt(laFormat[0]) < lsInt.length && lsInt.substr(0, 1) == "0")
   {
      lsInt = lsInt.substr(1,lsInt.length-1);
   }
   if (parseInt(laFormat[0]) < (lsInt.length))
   {
      return false; // La partie entière du nombre est trop grande
   }
   var lsFloat = RegExp.$3;
   if (laFormat.length == 2)
   {
      // Suppression des 0 derrière en trop
      while (parseInt(laFormat[1]) < lsFloat.length && lsFloat.substr(lsFloat.length-1, 1) == "0")
      {
         lsFloat = lsFloat.substr(0,lsFloat.length-1);
      }
      if (parseInt(laFormat[1]) < lsFloat.length)
      {
         return false; // La partie décimale du nombre est trop grande
      }
   }
   if (anValueMin != "" && parseFloat(lsNumber) < parseFloat(anValueMin))
   {
      return false; // Le nombre est trop petit
   }
   if (anValueMax != "" && parseFloat(lsNumber) > parseFloat(anValueMax))
   {
      return false; // Le nombre est trop grand
   }
   if (abFormat)
   {
      for (var nbZeros = (parseInt(laFormat[1]) - lsFloat.length) ; nbZeros > 0  ; nbZeros--)
      {
         lsFloat += "0";
      }
      if (laFormat.length == 2)
      {
         if (asNumberLangage == "FR")
         {
            lsFloat = "," + lsFloat;
         }
         else
         {
            lsFloat = "." + lsFloat;
         }
      }
      else
      {
         lsFloat = "";
      }
      lsInt = lsInt + (lsInt == "" && laFormat.length == 2 ? "0" : "");
      var lnLengthInt = lsInt.length;
      if (asNumberLangage == "FR")
      {
         lsSeparator = ' ';
      }
      else
      {
         lsSeparator = ',';
      }
      var lsInteger = ((lnLengthInt > 2 && lnLengthInt % 3) ? lsInt.substr(0, lnLengthInt % 3) + lsSeparator : lsInt.substr(0, lnLengthInt % 3)) + (lnLengthInt > 2 ? lsInt.substr(lnLengthInt % 3).match(new RegExp('[0-9]{3}', 'g')).join(lsSeparator) : "");
      aoNumberField.value = lsCompare + (RegExp.$1 == "-" ? "-" : "") + lsInteger + lsFloat;
   }
   return true;
}


/*******************************************************************************
                    Partie Vérification et formatage de la date
*******************************************************************************/

/**
 * @FunctionFR checkDate » Vérifie si le champ date est correct et retourne le message d'erreur
 * @FunctionEN checkDate » Check if the date field is correct and return the error message
 * @ParamFR asIdField String / » Identifiant HTML du champ dans le formulaire
 * @ParamEN asIdField String / » HTML ID of the field in the form
 * @ParamFR aeDateFormat Enum / » Format de la date (D = JJ/MM/AAAA, T = JJ/MM/AAAA HH:MI:SS)
 * @ParamEN aeDateFormat Enum / » Format of the date (D = DD/MM/YYYY, T = DD/MM/YYYY HH:MI:SS)
 * @ParamFR aeLanguageFormat Enum / » Langage de la date (FR = JJ/MM/AAAA, EN = MM/JJ/AAAA)
 * @ParamEN aeLanguageFormat Enum / » Language of the date (FR = DD/MM/YYYY, EN = MM/DD/YYYY)
 * @ParamFR abSearch Boolean / » Recherche ou non (caractères autorisés : > < = ! ?)
 * @ParamEN abSearch Boolean / » Search or not (authorised characters : > < = ! ?)
 * @ReturnFR String » Message d'erreur
 * @ReturnEN String » Error message
 */
function checkDate(asIdField, aeDateFormat, aeLanguageFormat, abSearch)
{
   var lsMsgError = "";
   loDateField = document.getElementById(asIdField);
   if (chkDate(loDateField, aeDateFormat, aeLanguageFormat, eval(abSearch)) == false)
   {
      lsMsgError = DivioLang["msgDate"];
      if (aeDateFormat == "D")
      {
         if (aeLanguageFormat == "FR")
         {
            lsMsgError += DivioLang["msgDateFormat"];
         }
         if (aeLanguageFormat == "EN")
         {
            lsMsgError += DivioLang["msgDateENFormat"];
         }
      }
      if (aeDateFormat == "T")
      {
         if (aeLanguageFormat == "FR")
         {
            lsMsgError += DivioLang["msgDateTimeFormat"];
         }
         if (aeLanguageFormat == "EN")
         {
            lsMsgError += DivioLang["msgDateTimeENFormat"];
         }
      }
   }
   return lsMsgError;
}


/**
 * @FunctionFR chckDate » Vérifie si le champ date est correct et retourne s'il a une erreur
 * @FunctionEN chckDate » Check if the date field is correct and return if there is an error
 * @ParamFR aoDateField Object / » Champ dans le formulaire
 * @ParamEN aoDateField Object / » Field in the form
 * @ParamFR aeDateFormat Enum / » Format de la date (D = JJ/MM/AAAA, T = JJ/MM/AAAA HH:MI:SS)
 * @ParamEN aeDateFormat Enum / » Format of the date (D = DD/MM/YYYY, T = DD/MM/YYYY HH:MI:SS)
 * @ParamFR aeLanguageFormat Enum / » Langage de la date (FR = JJ/MM/AAAA, EN = MM/JJ/AAAA)
 * @ParamEN aeLanguageFormat Enum / » Language of the date (FR = DD/MM/YYYY, EN = MM/DD/YYYY)
 * @ParamFR abSearch Boolean / » Recherche ou non (caractères autorisés : > < = ! ?)
 * @ParamEN abSearch Boolean / » Search or not (authorised characters : > < = ! ?)
 * @ReturnFR Boolean » Existance d'une erreur
 * @ReturnEN Boolean » Existence of an error
 */
function chkDate(aoDateField, aeDateFormat, aeLanguageFormat, abSearch)
{
   var lsDate = "", lsTime = "", lsCompare = "";
   var laDate, laTime;
   var lsDay = "", lsMonth = "", lsYear = "", lsHour = "", lsMinute = "", lsSecond = "";
   var lnDay = "", lnMonth = "", lnYear = "", lnHour = "", lnMinute = "", lnSecond = "";
   var lsTimeHhMiSs = "";

   // Suppression des espaces à gauche et à droite
   lsDate = aoDateField.value.replace(/^\s*|\s*$/g,"");
   if (lsDate.length == 0) // Date vide
   {
      return true;
   }
   if (abSearch)
   {
      if (lsDate == "!" || lsDate == "?")
      {
         return true;
      }
      if (lsDate.substr(0,2) == "<=" || lsDate.substr(0,2) == ">=" || lsDate.substr(0,2) == "<>")
      {
         lsCompare = lsDate.substr(0,2);
         lsDate = lsDate.substr(2,lsDate.length-2);
      }
      else if (lsDate.substr(0,1) == "<" || lsDate.substr(0,1) == ">" || lsDate.substr(0,1) == "=")
      {
         lsCompare = lsDate.substr(0,1);
         lsDate = lsDate.substr(1,lsDate.length-1);
      }
   }
   if (aeDateFormat == 'D')
   {  // Remplacement des séparateurs par "/"
      lsDate = lsDate.replace(/\D/g, "/");
   }
   if (aeDateFormat == 'T')
   {  // Séparation de la date et des heures
      // Remplacement des séparateurs de date par "/", remplacement des séparateurs d'heure par ":"
      laDate = lsDate.split(" ");
      if ((aeLanguageFormat == "EN" && laDate.length > 3) || (aeLanguageFormat == "FR" && laDate.length > 2))
      {
         return false; // Erreur date heure découpée en plus de 2 parties (date et heure)
      }
      lsDate = laDate[0].replace(/\D/g, "/");
      if (laDate.length >= 2)
      {
         lsTime = laDate[1].replace(/\D/g, ":");
      }
      if (laDate.length == 3)
      {
         lsFormatTime = laDate[2].toLowerCase();
      }
   }

// Traitement de la date
// ---------------------
   if (lsDate.indexOf("/") != -1)
   {
      // Séparateur de date trouvé
      laDate = lsDate.split("/");
      if (laDate.length != 3)
      {
         return false; // Erreur date non découpée en 3 parties
      }
      else
      {
         // Découpage de la date en 3 parties
         lsDay   = laDate[0];
         lsMonth = laDate[1];
         lsYear  = laDate[2];
      }
   }
   else
   {
      // Pas de séparateur
      if (lsDate.length >= 6)
      {
         lsDay   = lsDate.substr(0, 2);
         lsMonth = lsDate.substr(2, 2);
         lsYear  = lsDate.substr(4);
      }
      else
      {
         return false; // Date incorrect (format trop court)
      }
   }
   if (lsYear.length == 2) {
      lsYear = (parseInt(lsYear,10) <= 15 ? "20" : "19") + lsYear;
   }
   else if (lsYear.length != 2 && lsYear.length != 4) {
      return false; // L'année n'est pas correct
   }


   if (aeLanguageFormat == "EN") // Format anglais
   {
      var lsTemp;
      lsTemp  = lsDay;
      lsDay   = lsMonth;
      lsMonth = lsTemp;
   }
   lnDay   = parseInt(lsDay, 10);
   lnMonth = parseInt(lsMonth, 10);
   lnYear  = parseInt(lsYear, 10);
   if (lnMonth>12 || lnMonth<1)
   {
      return false; // Le mois n'est pas correct
   }
   if (((lnMonth == 1 || lnMonth == 3 || lnMonth == 5 || lnMonth == 7 || lnMonth == 8 || lnMonth == 10 || lnMonth == 12) && (lnDay > 31 || lnDay < 1)) // Mois de 31 jours
       || ((lnMonth == 4 || lnMonth == 6 || lnMonth == 9 || lnMonth == 11) && (lnDay > 30 || lnDay < 1)) // Mois de 30 jours
       || (lnMonth == 2 && (lnDay < 1 || (lnDay > 29 && (lnYear % 4) == 0) || (lnDay > 28 && (lnYear % 4) != 0)))) // Février
   {
      return false; // Le jour n'est pas correct
   }

   lsDay = lnDay.toString();
   if (lsDay.length == 1)
   {
      lsDay = "0" + lsDay;
   }
   lsMonth = lnMonth.toString();
   if (lsMonth.length == 1)
   {
      lsMonth = "0" + lsMonth;
   }

   // Traitement des heures
   // ---------------------
   if (aeDateFormat == "T")
   {
      if (lsTime == "")
      {
         if (aeLanguageFormat == "FR")
         {
            lsTimeHhMiSs = " 00:00:00";
         }
         else
         {
            lsTimeHhMiSs = " 12:00:00 a.m.";
         }
      }
      else
      {
         laTime = lsTime.split(":");
         if (laTime.length > 3)
         {
            return false; // Erreur heure découpée en plus de 3 parties
         }
         else
         {
            if (laTime.length >= 1)
            {
               if (laTime[0] == "")
               {
                  if (asLanguageFormat == "FR")
                  {
                     lnHour = 0;
                  }
                  else
                  {
                     lnHour = 12;
                  }
               }
               else
               {
                  lnHour = parseInt(laTime[0], 10);
               }
               if ((aeLanguageFormat == "FR" && (lnHour > 23 || lnHour < 0)) || (aeLanguageFormat == "EN" && (lnHour > 12 || lnHour < 1)))
               {
                  return false; // Les heures ne sont pas correctes
               }
               else
               {
                  lsHour = (lnHour < 10 ? "0" : "")+lnHour.toString();
                  lsHour = (lsHour == "0" ? "0" : "")+lsHour;
               }
            }
            if (laTime.length >= 2)
            {
               if (laTime[1] == "")
               {
                  lnMinute = 0;
               }
               else
               {
                  lnMinute = parseInt(laTime[1], 10);
               }
               if (lnMinute > 59 || lnMinute < 0)
               {
                  return false; // Les minutes ne sont pas correctes
               }
               else
               {
                  lsMinute = (lnMinute < 10 ? "0" : "")+lnMinute.toString();
                  lsMinute = (lsMinute == "0" ? "0" : "")+lsMinute;
               }
            }
            if (laTime.length == 3)
            {
               if (laTime[2] == "")
               {
                  lnSecond = 0;
               }
               else
               {
                  lnSecond = parseInt(laTime[2], 10);
               }
               if (lnSecond > 59 || lnSecond < 0)
               {
                  return false; // Les secondes ne sont pas correctes
               }
               else
               {
                  lsSecond = (lnSecond < 10 ? "0" : "")+lnSecond.toString();
                  lsSecond = (lsSecond == "0" ? "0" : "")+lsSecond;
               }
            }
         }
         if (aeLanguageFormat == "EN" && lsFormatTime == "")
         {
            lsFormatTime = "a.m.";
         }
         if (aeLanguageFormat == "EN" && lsFormatTime != "a.m." && lsFormatTime != "p.m.")
         {
            return false; // Le format d'heure est incorrect
         }
         lsTimeHhMiSs = " "+lsHour+":"+(lsMinute != "" ? lsMinute : "00")+":"+(lsSecond != "" ? lsSecond : "00")+(aeLanguageFormat == "EN" ? " "+lsFormatTime : "");
      }
   }

   // Formatage de la date
   if (aeLanguageFormat == "EN")
   {
      aoDateField.value = lsCompare + lsMonth + "/" + lsDay +"/" + lsYear + lsTimeHhMiSs;
   }
   else
   {
      aoDateField.value = lsCompare + lsDay + "/" + lsMonth + "/" + lsYear + lsTimeHhMiSs;
   }
   return true;
}


