  /**
   * Ensemble de méthodes permettant de valider un formulaire
   *
   * ################################################################
   * Méthode à appeler : CheckForm
   * Exemple :
   *   - "toto" est le champ textuel à tester
   *   - "[toto]" est le champ caché contenant les filtres
   *   - "<toto>" est le champ caché contenant la réponse
   * d'alerte en cas de test déféctueux
   *
   * La valeur du filtre tient sur 2 caractères.
   * Le premier prend la valeur "*" si le champ n'est pas obligatoire
   * sinon il prend la valeur "+" si le champ est obligatoire
   * Le second peu prendre les valeurs "N", "A", "E" ou "#" selon la
   * nature de la donnée à tester :
   *   - N : donnée numérique
   *   - A : donnée alphabétique
   *   - E : email
   *   - # : donnée alphanumérique
   * ################################################################
   *
   * @author Sébastien Fernandez, sfernandez@sdv.fr
   * @date 2003-11-03
   * @version 1.0
   **/

  /**
   * Méthode retournant vrai si le type du champ est textuel
   * @param type type du champ
   * @return vrai ou faux
   **/
  function isText(type)
    {
    var rtn = false;
    if (type.toLowerCase() == 'text')
      rtn = true;
    if (type.toLowerCase() == 'textarea')
      rtn = true;
    if (type.toLowerCase() == 'password')
      rtn = true;
    return rtn;
    }
  /**
   * Méthode retournant vrai si le champ test existe
   * @param frm objet formulaire
   * @param name nom de l'objet test
   * @return vrai ou faux
   **/
  function doTest(frm, name)
    {
    rtn = false;
    if (frm.elements['['+name+']'])
      rtn = true;
    return rtn;
    }
  /**
   * Méthode découpant tous les espaces dans une chaine de caractères
   * @param value chaine de caractères
   * @return chaine de caractères
   **/
  function cutSpace(value)
    {
    return value.replace(/\s*/g,'').toLowerCase();
    }
  /**
   * Méthode retournant le(s) type(s) de filtre qui correspond à la valeur à tester
   * @param value valeur à tester
   * @param factor nombre de caractères
   * @return chaine de caractères
   **/
  function getFilter(value, factor)
    {
    var Filter = new Array(new RegExp("^[0-9]+$"),
                           new RegExp("^[a-z]+$"),
                           new RegExp("^[a-zA-Z0-9_-][a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.([a-zA-Z]{2,3})$"),
                           new RegExp("^([0-9]{2}\/){2}[0-9]{4}$"),
                           new RegExp("^.+$"));
    var Result = new Array('N',
                           'A',
                           'E',
                           'D',
                           '#');
    var rtn = '';
    for (var i = 0; i < Filter.length; i++)
      {
      if (value.match(Filter[i]))
        rtn += Result[i];
      }
    if ((factor == '*') && (rtn == ''))
      {
      for (i = 0; i < Filter.length; i++)
        rtn += Result[i];
      }
    return rtn;
    }
  /**
   * Méthode testant la valeur d'objet du formulaire
   * @param frm objet formulaire
   * @param value valeur de l'objet à tester
   * @param name nom de l'objet test
   * @return vrai ou faux
   **/
  function isSuccessful(frm, value, name)
    {
    var rtn    = false;
    var filter = '';
    if (frm.elements[name].value.length == 2)
      {
      filter = getFilter(value, frm.elements[name].value.charAt(0))
      for (var i = 0; i < filter.length; i++)
        {
        if (frm.elements[name].value.charAt(1) == filter.charAt(i))
          rtn = true;
        }
      }
    else
      alert("Attention: problème d'encodage du champ "+name);
    return rtn;
    }
  /**
   * Méthode vérifiant la présence d'une alerte personnalisée
   * @param frm objet formulaire
   * @param name nom de l'objet à tester
   * @return vrai ou faux
   **/
  function doAlert(frm, name)
    {
    rtn = false;
    if (frm.elements[name])
      rtn = true;
    return rtn;
    }
  /**
   * Méthode testant les objets textuels du formulaire
   * Retourne vrai si tous les objets textuels répondent aux critères donnés
   * @param frm objet formulaire
   * @return vrai ou faux
   **/
  function CheckForm(frm)
    {
    var Item   = null;
    var art    = '';
    var rtn    = true;
    for (var i = 0; i < frm.length; i++)
      {
      Item = frm.elements[i];
      if (isText(Item.type))
        {
        if (doTest(frm, Item.name))
          {
          if (!isSuccessful(frm, cutSpace(Item.value), '['+Item.name+']'))
            {
            if (doAlert(frm, '<'+Item.name+'>'))
              art += "\n"+frm.elements['<'+Item.name+'>'].value;
            else
              art += "\nProblème avec le champ : "+Item.name;
            }
          }
        }
      }
    if (art != '')
      {
      alert(art.substring(1, art.length));
      rtn = false;
      }
    return rtn;
    }