

<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
</head>

<pre>function Formulaire(formulaire)
// constructeur de la classe (en entrée : l'attribut &quot;name&quot; du formulaire à valider)
{
   // variables membres
   this.form=formulaire; // nom du formulaire
   this.erreurs=new Array(); // tableau des champs contenant des erreurs de saisie</pre>
<pre>   // tableaux des règles de validation appliquées aux champs
   this.regles=new Array();
   this.messages=new Array();
   this.validations=new Array();
   this.params=new Array();</pre>
<pre>   // méthodes
   this.regle=regleChamp;
   this.nettoyer=nettoyerChaine;
   this.valider=validerForm;
   this.liste=listeErreurs;
}</pre>
<pre>function regleChamp(champ, type, message, param)
/* ajoute une règle de validation :
- &quot;champ&quot; est la valeur de l'attribut &quot;name&quot; du champ
- &quot;type&quot; est la règle de validation proprement dite
- &quot;message&quot; est le message d'erreur en cas de validation erronée
- &quot;param&quot; est un paramètre facultatif, utilisé par ceratines règles */
{
   this.regles.push(champ);
   this.validations.push(type);
   this.messages.push(message);
   this.params.push(param);
}</pre>
<pre>function listeErreurs()
// retourne la liste des erreurs
{
   var x, liste=&quot;&quot;;
   </pre>
<pre>   // construction de la chaîne
   for(x=0; x&lt;this.erreurs.length; x++) liste+=&quot;- &quot;+this.erreurs[x]+&quot;\n&quot;;
   </pre>
<pre>   return liste;
}
</pre>
<pre>function nettoyerChaine(chaine)
// supprime les espaces en début et fin de chaîne (équivalent à la fonction PHP &quot;trim()&quot;)
{
   regex=new RegExp(&quot;(^ +)|( +$)&quot;, &quot;g&quot;);
   chaine=chaine.replace(regex, &quot;&quot;);</pre>
<pre>   return chaine;
}</pre>
<pre>function validerForm()
// valide le formulaire : chaque champ doit vérifier les règles qui lui ont été définies
{
   var x, regex, msg=&quot;&quot;;
   eval(&quot;var formulaire=document.&quot;+this.form+&quot;;&quot;);
   </pre>
<pre>   // si aucune règle n'a été définie, la validation est toujours vraie
   if(!this.regles.length) return true;
   </pre>
<pre>   // on examine chaque champ
   for(x=0; x&lt;this.regles.length; x++)
   {
      // on effectue au préalable un petit nettoyage sur le champ à valider
      eval(&quot;formulaire.&quot;+this.regles[x]+&quot;.value=this.nettoyer(formulaire.&quot;+this.regles[x]+&quot;.value);&quot;);
      </pre>
<pre>      switch(this.validations[x])
      {
         // le champ doit avoir le même contenu qu'un autre
         case &quot;comparaison&quot;:
            eval(&quot;if(formulaire.&quot;+this.regles[x]+&quot;.value!='&quot;+this.params[x]+&quot;') this.erreurs.push(this.messages[x]);&quot;);
            break;
            </pre>
<pre>         /* le champ doit avoir une certaine longueur : c'est le dernier paramètre sous la forme &quot;min,max&quot;
         (0 signifiant pas de minimum ou de maximum) */
         case &quot;longueur&quot;:
            eval(&quot;var longueur=formulaire.&quot;+this.regles[x]+&quot;.value.length;&quot;);
            if(longueur)
            {
               var temp=this.params[x].split(&quot;,( +)?&quot;);
               mini=parseInt(temp[0]);
               maxi=parseInt(temp[1]);
               </pre>
<pre>               if((mini &amp;&amp; longueur&lt;mini) || (maxi &amp;&amp; longueur&gt;maxi)) this.erreurs.push(this.messages[x]);
            }
            break;</pre>
<pre>         // le champ (uniquement s'il est rempli) doit vérifier une expression régulière
         case &quot;regex&quot;:
            switch(this.params[x])
            {
               // quelques exemples...
               case &quot;mail&quot;:
                  regex=new RegExp(&quot;^[a-z0-9_]([.-]?[a-z0-9_]+)+@[a-z0-9_]([.-]?[a-z0-9_]+)+\.([a-z]{2,4}|[a-z]{6})$&quot;, &quot;gi&quot;);
                  break;
                  </pre>
<pre>               case &quot;alpha_num&quot;:
                  regex=new RegExp(&quot;^[_a-z0-9]+$&quot;, &quot;gi&quot;);
                  break;
                  </pre>
<pre>               case &quot;code_postal&quot;:
                  regex=new RegExp(&quot;^(0[1-9]|[1-9][0-9])[0-9]{3}$&quot;, &quot;g&quot;);
                  break;
                  </pre>
<pre>               case &quot;date&quot;:
                  regex=new RegEx(&quot;^[0-3][0-9][/-.](0[1-9]|1[0-2])[/-.][0-9]{4}$&quot;, &quot;g&quot;);
                  break;
                  </pre>
<pre>               // par défaut (non vide)
               default:
                  regex=new RegExp(&quot;^.+$&quot;, &quot;g&quot;);</pre>
<pre>            }
            </pre>
<pre>            eval('if(formulaire.'+this.regles[x]+'.value!=&quot;&quot; &amp;&amp; !regex.exec(formulaire.'+this.regles[x]+'.value)) this.erreurs.push(this.messages[x]);');
            break;
            </pre>
<pre>         case &quot;requis&quot;:
         default:
         // le champ doit juste être rempli
            eval('if(formulaire.'+this.regles[x]+'.value==&quot;&quot;) this.erreurs.push(this.messages[x]);');
      }
   }
   </pre>
<pre>   // en cas d'erreur, on affiche les différents messages
   if(this.erreurs.length)
   {
      var msg=&quot;Le formulaire comporte des erreurs :\n\n&quot;+this.liste()+&quot;\nVeuillez remplir correctement les champs.&quot;;
      alert(msg);
      return false;
   }
   </pre>
<pre>   // en cas de succès, on envoie le formulaire
   return true;
}</pre>
