//-----------------------------------------------------------------------------------------
// Librairie de validation de formulaire - JavaScript
// Programmation: Vincent
//-----------------------------------------------------------------------------------------





//-----------------------------------------------------------------------------------------
// Fonctions generales
//-----------------------------------------------------------------------------------------


function StartFlash(nom_fichier,largeur,hauteur)
{
 document.write('<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="[ http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0 ]http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="'+largeur+'" height="'+hauteur+'">'); 
 document.write('<param name="movie" value="'+nom_fichier+'">'); 
 document.write('<param name="quality" value="high">'); 
 document.write('<embed src="'+nom_fichier+'" width="'+largeur+'" height="'+hauteur+'" quality="high" pluginspage="[ http://www.macromedia.com/go/getflashplayer ]http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash"></embed></object>'); 
}

//> verifierToucheEnter
/*
Description:
	Détermine si l'usager a pressé Enter pendant qu'il remplissait le form
*/
function verifierToucheEnter(evt)
{
	var c = document.layers ? evt.which 
		  : document.all ? event.keyCode
		  : evt.keyCode;
		
	if(c == 13){
		//Si c'est Enter
		return false;
	}

	//On return "vrai" pour que la lettre pressée s'affiche
	return true;
	
	/*if (document.layers)
		document.captureEvents(Event.KEYPRESS); Pour NN4*/
}
//< verifierToucheEnter



//> determinerMessagesErreur (v.2.0)
/*
Description:
	Determine l'en-tete et le pied de page des message d'alerte selon la langue recue en argument
	
Note au programmeur:
	Creer une nouvelle instruction 'case' pour chaque nouvelle langue.
*/
function determinerMessagesErreur( langue )
{
var debutAlerte = "";
var finAlerte = "";

// Variables definissant la langue du message d'erreur
switch ( langue )
	{
	case "fr":
		debutAlerte = "Un ou plusieurs champs sont invalides:";
		finAlerte = "Veuillez remplir ces champs correctement avant de poursuivre.";
		break;
		
	case "en":
		debutAlerte = "One or more fields are invalid:";
		finAlerte = "Please fill these fields correctly to continue.";
		break;
		
	// Dupliquez le contenu du commentaire qui suit
	// pour chaque nouvelle langue et remplacez les elements entre guillemets
	/*
	case "LANGUE":
		debutAlerte = "DEBUT DU MESSAGE D'ALERTE";
		finAlerte = "FIN DU MESSAGE D'ALERTE";
		break;
	*/
		
		
	default:
		break;
	}
	
	
return new Array( debutAlerte, finAlerte );
}
//< determinerMessagesErreur





//-----------------------------------------------------------------------------------------





//> validerChaine ( v.2.0 )
/*
Description:
	Valide une chaine de caracteres, puis retourne l'erreur.
*/
function validerChaine( chaine, taille )
{
chaineSansEspace = chaine.replace(/ /gi, "");

if ( chaineSansEspace.length >= taille )
	return false;
else
	return true;
}
//< validerChaine





//-----------------------------------------------------------------------------------------





//> validerNombre ( v.2.0 )
/*
Description:
	Valide un nombre, puis retourne l'erreur.
*/
function validerNombre( chaine )
{
chaine = chaine.replace(/ /gi, "");
chaine = chaine.replace(/,/gi, ".");

if ( ( !isNaN( chaine ) ) && ( chaine.length > 0 ) )
	return false;
else
	return true;
}
//< validerNombre





//-----------------------------------------------------------------------------------------





//> validerMotDePasse ( v.2.0 )
/*
Description:
	Valide la comparaison entre un champ de mot de passe et un champ de confirmation de mot de passe, puis retourne l'erreur.
*/
function validerMotDePasse( chaine, chaineConfirmation )
{
if ( chaine == chaineConfirmation )
	return false;
else
	return true;
}
//< validerMotDePasse





//-----------------------------------------------------------------------------------------





//> validerListeDeroulante ( v.2.0 )
/*
Description:
	Valide la selection d'une option valide dans une liste deroulante, puis retourne l'erreur.
*/
function validerListeDeroulante( objetListe, valeurInvalide )
{
if ( objetListe.options[objetListe.selectedIndex].value == valeurInvalide )
	return true;
else
	return false;
}
//< validerListeDeroulante





//-----------------------------------------------------------------------------------------





//> validerSelectionCochee ( v.2.0 )
/*
Description:
	Valide la selection d'une boite ˆ cocher ou d'un groupe de bouton radios, puis retourne l'erreur.
*/
function validerSelectionCochee( objetSelectionCochee )
{
if ( (objetSelectionCochee.type + "").toLowerCase() == "checkbox" )
	{
	// Valide la selection d'une boite a cocher
	return !objetSelectionCochee.checked;
	}
else
	{
	// Valide la selection d'au moins un bouton radio
	var selection = false;
	for ( compteurItems = 0; compteurItems < objetSelectionCochee.length; compteurItems++ )
		{
		if ( objetSelectionCochee[compteurItems].checked )
			{
			selection = true;
			break;
			}
		}
	
	return !selection;
	}
}
//< validerSelectionCochee






//-----------------------------------------------------------------------------------------





//> validerTelephone ( v.2.0 )
/*
Description:
	Valide un numero de telephone, le formate, puis retourne l'erreur.
*/
function validerTelephone( objetChamp )
{
chaine = objetChamp.value;
chaine = chaine.replace(/ /gi, "");
chaine = chaine.replace(/-/gi, "");
chaine = chaine.replace(/_/gi, "");
chaine = chaine.replace(/\(/gi, "");
chaine = chaine.replace(/\)/gi, "");
chaine = chaine.replace(/\./gi, "");
chaine = chaine.replace(/,/gi, "");

if ( !validerNombre( chaine ) )
	{
	if ( ( chaine.length == 10 ) || ( chaine.length == 11 ) )
		{
		if ( chaine.length == 10 )
			{
			chaine = chaine.substring( 0, 3 ) + "-" + chaine.substring( 3, 6 ) + "-" + chaine.substring( 6, chaine.length );
			}
		else if ( chaine.length == 11 )
			{
			chaine = chaine.substring( 0, 1 ) + "-" + chaine.substring( 1, 4 ) + "-" + chaine.substring( 4, 7 ) + "-" + chaine.substring( 7, chaine.length );
			}
		
		objetChamp.value = chaine;
		return false;
		}
	else
		{
		return true;
		}
	}
else
	{
	return true;
	}
}
//< validerTelephone






//-----------------------------------------------------------------------------------------





//> validerCodePostal ( v.2.0 )
/*
Description:
	Valide un code postal, le formate, puis retourne l'erreur.
*/
function validerCodePostal( objetChamp )
{
chaine = objetChamp.value;
chaine = chaine.replace(/ /gi, "");
var tablePositionLettres = new Array( 0, 2, 4 );
var tablePositionNombres = new Array( 1, 3, 5 );

if ( chaine.length == 6 )
	{
	var erreurFormat = false;
	
	// Valide les lettres
	for ( compteurItems = 0; compteurItems < tablePositionLettres.length; compteurItems++ )
		{
		if ( erreurFormat = !isNaN( chaine.charAt(tablePositionLettres[compteurItems]) ) )
			break;
		}
	
	if ( !erreurFormat )
		{
		// Valide les nombres
		for ( compteurItems = 0; compteurItems < tablePositionNombres.length; compteurItems++ )
			{
			if ( erreurFormat =isNaN( chaine.charAt(tablePositionNombres[compteurItems]) ) )
				break;
			}
			
		if ( !erreurFormat )
			{
			objetChamp.value = ( chaine.substring( 0, 3 ) + " " + chaine.substring( 3, chaine.length ) ).toUpperCase();
			return false;
			}
		else
			{
			return true;
			}
		}
	else
		{
		return true;
		}
	}
else
	{
	return true;
	}
}
//< validerCodePostal





//-----------------------------------------------------------------------------------------





//> validerCourriel ( v.2.0 )
/*
Description:
	Valide un courriel, puis retourne l'erreur.
*/
/*function validerCourriel( chaine )
{
var longueurUsager = 2;
var longueurDomaine = 2;
var longueurExtension = 2;
var tableCaracteresInterdits = new Array( " ", "!", "@", "#", "$", "%", "?", "&", "*", "(", ")", ";", ":", "'", "\"", "Ï", "¾", "<", ">", "Ç", "È", "Â", "/", "\\", "+", "=" )

if ( chaine.length > 0 )
	{
	if ( ( chaine.indexOf("@") != -1 ) && ( chaine.indexOf(".") != -1 ) )
		{
		var usager = chaine.substring( 0, chaine.indexOf("@") );
		var domaine = chaine.substring( ( chaine.indexOf("@") + 1 ), chaine.lastIndexOf(".") );
		var extension = chaine.substring( ( chaine.lastIndexOf(".") + 1 ), chaine.length );
		
		if ( ( usager.length >= longueurUsager ) && ( domaine.length >= longueurDomaine ) && ( extension.length >= longueurExtension ) )
			{
			var chaineValidationCaracteres = ( usager + domaine + extension ).toLowerCase();
			var caractereTrouve = false;
			
			for ( compteurItems = 0; compteurItems < tableCaracteresInterdits.length; compteurItems++ )
				{
				if ( caractereInterdit = chaineValidationCaracteres.indexOf(tableCaracteresInterdits[compteurItems]) != -1 )
					{
					caractereInterdit = true;
					break;
					}
				}
				
			if ( !caractereInterdit )
				{
				return false;
				}
			else
				{
				return true; // !caractereInterdit
				}
			}
		else
			{
			return true; //( usager.length >= longueurUsager ) && ( domaine.length >= longueurDomaine ) && ( extension.length >= longueurExtension )
			}
		}
	else
		{
		return true; // ( chaine.indexOf("@") != -1 ) && ( chaine.indexOf(".") != -1 )
		}
	}
else
	{
	return true;  // chaine.length > 0
	}
}*/
//< validerCourriel






//-----------------------------------------------------------------------------------------



//> validerCourriel
/*
Description:
	Valide un courriel, puis retourne l'erreur.
*/
function validerCourriel(mail) {

  /*** Début de déclaration de variable ***/
  //var de retour boolean true ou false
  var ret = false;
  //var où l'on stock le caractère courant au fur et a mesure de l'analyse
  var car = "";
  //var où l'on stock le caractère place avant le @
  var carAfter = "";
  //var où l'on stock le caractère place après le @
  var carBefore = "";
  //var où l'on stock le nombre de caractères total
  var nbrcar = mail.length;
  //var où l'on stock le nombre de @ trouvé
  var nbrarobase = 0;
  //var où l'on stock le nombre de . trouvé
  var nbrpoint = 0;
  //var définissant les caractères authorisés
  var goodcar = "@0123456789.-_abcdefghijklmnopqrstuvwxyz";
  /*** Fin de déclaration de variable ***/

  /*** Début de boucle de l'analyse ***/
  for(cnt=0;cnt<nbrcar;cnt++) {

    //Récupération du caractère courant
    var car = mail.substr(cnt,1);

    /** Début de l'analyse du caractère courant **/
    //Si le caractère est authorisé
    if(goodcar.indexOf(car) >= 0) {

      //On initialise les variables carAfter et carBefore à vide
      carAfter = "";
      carBefore = "";

      /* Début de l'analyse du @ */
      //Si le caractère est @
      if(car == "@") {


        //Si le @ n'est pas le premier
        if((cnt-1) >= 0) {

          //Récupération du caractère placé avant le @
          carBefore = mail.substr((cnt-1),1);
        }

        //Si le @ n'est pas le dernier
        if((cnt+1)<nbrcar) {

          //Récupération du caractère placé après le @
         carAfter = mail.substr((cnt+1),1);
        }

        //Si toutes les condition de @ sont respectées
        //conditions:
        //    - cnt>0                 : n'est pas placé en première position
        //    - nbrarobase==0   : est unique
        //    - cnt<(nbrcar-4)     : se trouve à une position max de 5 avant la fin
        //      (sachant que les domaines les plus petit sont : a.fr par ex.)
        //    - !(carBefore==".") : qu'il n'y est pas de . avant le @
        //    - !(carAfter==".")   : qu'il n'y est pas de . après le @
        //    - !(carBefore=="-") : qu'il n'y est pas de - avant le @
        //    - !(carAfter=="-")   : qu'il n'y est pas de - après le @
        //    - !(carBefore=="_") : qu'il n'y est pas de _ avant le @
        //    - !(carAfter=="_")   : qu'il n'y est pas de _ après le @
        if(cnt>0 && nbrarobase==0 && cnt<(nbrcar-4) && !(carBefore==".") && !(carAfter==".") && !(carBefore=="-") && !(carAfter=="-") && !(carBefore=="_") && !(carAfter=="_")) {

          //On incrémente le @
          nbrarobase++;
        } else {

         //Affectation Faux à la var de retour
         ret = true;
         //On sort de la boucle 
         break;
        }
      }
      /* Fin de l'analyse du @ */

      /* Début de l'analyse du . */
      //Si le caractère est .
      if(car == ".") {

        //Si le . n'est pas le premier
        if((cnt-1) >= 0) {

          //Récupération du caractère placé avant le .
          carBefore = mail.substr((cnt-1),1);
        }

        //Si le . n'est pas le dernier
        if((cnt+1)<nbrcar) {

          //Récupération du caractère placé après le .
         carAfter = mail.substr((cnt+1),1);
        }

        //Si toutes les condition de @ sont respectées
        //conditions:
        //    - cnt>0                 : n'est pas placé en première position
        //    - cnt<(nbrcar-2)     : se trouve à une position max de 3 avant la fin
        //      (sachant que les domaines les plus petit sont : a.fr par ex.)
        //    - !(carBefore==".") : qu'il n'y est pas de . avant le .
        //    - !(carAfter==".")   : qu'il n'y est pas de . après le .
        //    - !(carBefore=="-") : qu'il n'y est pas de - avant le .
        //    - !(carAfter=="-")   : qu'il n'y est pas de - après le .
        //    - !(carBefore=="_") : qu'il n'y est pas de _ avant le .
        //    - !(carAfter=="_")   : qu'il n'y est pas de _ après le .
        if(cnt>0 && cnt<(nbrcar-2) && !(carBefore==".") && !(carAfter==".") && !(carBefore=="-") && !(carAfter=="-") && !(carBefore=="_") && !(carAfter=="_")) {

          //On incrémente le .
          nbrpoint++;
        } else {

          //Affectation Faux à la var de retour 
          ret = true;
          //On sort de la boucle 
          break;
        }
      }
      /* Fin de l'analyse du . */

    } else {

      //Affectation Faux à la var de retour 
      ret = true;
      //On sort de la boucle 
      break;
    }
    /*** Fin de l'analyse du caractère courant ***/
  }
  /*** Fin de boucle de l'analyse ***/

  /*** Début de l'analyse du nombre de @ et de . ***/
  //Si il n'y a aucun @ et aucun .
  //Si le 1er et le dernier caractère est .
  //Si le 1er et le dernier caractère est -
  //Si le 1er et le dernier caractère est _
  if(nbrarobase == 0 || nbrpoint == 0 || mail.substr(0,1) == "." || mail.substr(0,1) == "-" || mail.substr(0,1) == "_" || mail.substr((nbrcar-1),1) == "." || mail.substr((nbrcar-1),1) == "-" || mail.substr((nbrcar-1),1) == "_") {

    //Affectation Faux à la var de retour 
    ret = true;
  }
  /*** Fin de l'analyse du nombre de . et de @ ***/

  //Renvoi de la valeur de la var de retour
  return ret;
}
//< validerCourriel






//-----------------------------------------------------------------------------------------




//> validerFormulaire (v.2.0)
/*
Description:
	Valide un formulaire.
	
Parametres:
	objetFormulaire: L'objet formulaire a modifier ( document.forms["unFormulaire"] );
	estFormulaire: Booleene si l'objet qui demande la validation est faite par le formulaire ( onsubmit="validerFormulaire({...});" );
	langue: Langue utilisee pur la gestion du message d'alerte ( fonctionne avec la fonction 'determinerMessagesErreur' );
	listeVerifications: Liste des verifications a effectuer ( 'nomElementFormulaire', 'typeDeValidation', 'messageErreurDuChamp' {, ...} ).

Note au programmeur:
	Types de validations disponibles:
		chaine: Valide une chaine de caractere ( affecter 'nomElementFormulaire' comme suit: 'nomElementFormulaire:caracteresNecessaire'; pour le nombre de caracteres necessaires );
		nombre: Valide un nombre;
		liste: Valide la selection d'une liste deroulannte ( affecter 'nomElementFormulaire' comme suit: 'nomElementFormulaire:valeurInvalide'; pour les valeurs selectionnees invalides );
		courriel: Valide un courriel si l'usager a rempli le champ;
		courriel_r: Valide un courriel requis;
		telephone: Valide un numero de telephone si l'usager a rempli le champ;
		telephone_r: Valide un numero de telephone requis;
		codepostal: Valide un code postal si l'usager a rempli le champ;
		codepostal_r: Valide un code postal requis.
*/
function validerFormulaire( objetFormulaire, estFormulaire, langue, listeVerifications  )
{
// Variables internes
var messageErreur = determinerMessagesErreur(langue);
var chaineErreurs = "";
var erreur = false;
var listeErreurs = new Array();


// Construit la tables des verifications
var tableVerifications = new Array();

for ( compteur = 3; compteur < validerFormulaire.arguments.length; compteur = compteur + 3 )
	{
	tableVerifications[tableVerifications.length] = new Array(
		validerFormulaire.arguments[compteur],      // Le nom de l'element du formulaire
		validerFormulaire.arguments[compteur + 1],  // Le type de validation de l'element
		validerFormulaire.arguments[compteur + 2]   // Le message d'erreur a afficher
		);
	}


// Debute la validation de chacun des elements de la table
for ( compteur = 0; compteur < tableVerifications.length; compteur++ )
	{
	var ajouterALaListeErreur = true; // Si l'element du formulaire est sujet a un focus et un select
	
	// Lance les validations selon le type demande
	switch( tableVerifications[compteur][1] )
		{
		
		//- Chaine
		case ("chaine"):
			var objetChamp = eval( "objetFormulaire." + tableVerifications[compteur][0].substring( 0, tableVerifications[compteur][0].indexOf(":") ) );
			var valeurChamp = objetChamp.value;
			var nombreCaracteres = tableVerifications[compteur][0].substring( ( tableVerifications[compteur][0].indexOf(":") + 1 ), tableVerifications[compteur][0].length )
			erreur = validerChaine( valeurChamp, nombreCaracteres );
			
			break;
		//- /Chaine
		
		
		
		//- Nombre
		case ("nombre"):
			var valeurChamp = eval( "objetFormulaire." + tableVerifications[compteur][0] + ".value" );
			erreur = validerNombre( valeurChamp );
				
			break;
		//- /Nombre
		
		
		
		//- Mot de passe
		case ("motdepasse"):
			var objetChampNouveau = eval( "objetFormulaire." + tableVerifications[compteur][0].substring( 0, ( tableVerifications[compteur][0].indexOf(":") ) ) );
			var objetChampConfirmation = eval( "objetFormulaire." + tableVerifications[compteur][0].substring( ( tableVerifications[compteur][0].indexOf(":") + 1 ), ( tableVerifications[compteur][0].lastIndexOf(":") ) ) );			
			var nombreCaracteres = tableVerifications[compteur][0].substring( ( tableVerifications[compteur][0].lastIndexOf(":") + 1 ), tableVerifications[compteur][0].length );
			
			var alerteChaine = tableVerifications[compteur][2].substring( 0, tableVerifications[compteur][2].indexOf(":") );
			var alerteConfirmation = tableVerifications[compteur][2].substring( ( tableVerifications[compteur][2].indexOf(":") + 1 ), tableVerifications[compteur][2].length );
			
			var valeurChampNouveau = objetChampNouveau.value;
			var valeurChampConfirmation = objetChampConfirmation.value;
			
			erreur = validerChaine( valeurChampNouveau, nombreCaracteres );
			
			if (erreur)
				{
				tableVerifications[compteur][0] = objetChampNouveau.name;
				tableVerifications[compteur][2] = alerteChaine;
				}
			else
				{
				erreur = validerMotDePasse( valeurChampNouveau, valeurChampConfirmation );
				
				if (erreur)
					{
					tableVerifications[compteur][0] = objetChampConfirmation.name;
					tableVerifications[compteur][2] = alerteConfirmation;
					}
				}
				
				
			break;
		//- /Mot de passe
		
		
		
		//- Liste deroulante
		case ("liste"):
			var objetListe = eval( "objetFormulaire." + tableVerifications[compteur][0].substring( 0, tableVerifications[compteur][0].indexOf(":") ) );
			var valeurInvalide = tableVerifications[compteur][0].substring( ( tableVerifications[compteur][0].indexOf(":") + 1 ), tableVerifications[compteur][0].length )
			erreur = validerListeDeroulante( objetListe, valeurInvalide );
			ajouterALaListeErreur = false;
			
			break;
		//- /Liste Deroulante
		
		
		
		//- Boite a cocher ou bouton radio
		case ("cocher"):
			var objetSelectionCochee = eval( "objetFormulaire." + tableVerifications[compteur][0] );
			erreur = validerSelectionCochee( objetSelectionCochee );
			ajouterALaListeErreur = false;
			
			break;
		//- /Boite a cocher ou bouton radio
		
		
		
		//- Courriel
		case ("courriel"):
			var valeurChamp = eval( "objetFormulaire." + tableVerifications[compteur][0] + ".value" );
			if ( valeurChamp.length > 0 )
				erreur = validerCourriel( valeurChamp );
			else
				erreur = false;
				
			break;
		//- /Courriel
		
		
		
		//- Courriel requis
		case ("courriel_r"):
			var valeurChamp = eval( "objetFormulaire." + tableVerifications[compteur][0] + ".value" );
			erreur = validerCourriel( valeurChamp );
			
			break;
		//- /Courriel requis
		
		
		
		//- Telephone
		case ("telephone"):
			var objetChamp = eval( "objetFormulaire." + tableVerifications[compteur][0] );
			if ( (objetChamp.value).length > 0 )
				erreur = validerTelephone( objetChamp );
			else
				erreur = false;
				
			break;
		//- /Telephone
		
		
		
		//- Telephone requis
		case ("telephone_r"):
			var objetChamp = eval( "objetFormulaire." + tableVerifications[compteur][0] );
			erreur = validerTelephone( objetChamp );
			
			break;
		//- /Telephone requis
		
		
		
		//- Code postal
		case ("codepostal"):
			var objetChamp = eval( "objetFormulaire." + tableVerifications[compteur][0] );
			if ( (objetChamp.value).length > 0 )
				erreur = validerCodePostal( objetChamp );
			else
				erreur = false;
				
			break;
		//- /Code postal
		
		
		
		//- Code postal requis
		case ("codepostal_r"):
			var objetChamp = eval( "objetFormulaire." + tableVerifications[compteur][0] );
			erreur = validerCodePostal( objetChamp );
			
			break;
		//- /Code postal requis
		
		
		
		default:
			break;
		}
		
		
	// Construit le message d'erreur
	if ( erreur )
		{
		chaineErreurs += "    - " + tableVerifications[compteur][2] + "\n";
		if ( ajouterALaListeErreur )
			{
			if ( tableVerifications[compteur][0].indexOf(":") == -1 )
				listeErreurs[listeErreurs.length] = tableVerifications[compteur][0];
			else
				listeErreurs[listeErreurs.length] = tableVerifications[compteur][0].substring( 0, tableVerifications[compteur][0].indexOf(":") );
			}
		}
	}
	// Fin des validations
	
	
	
	if ( chaineErreurs.length )
		{		
		// Lance le message d'alerte
		alert(
			messageErreur[0] + "\n \n" +
			chaineErreurs +
			"\n\n" + messageErreur[1] + "\n "
			);
		
		if ( listeErreurs.length > 0 )
			{
			// Selectionne le champ de la premiere erreur rencontree
			eval( "objetFormulaire." + listeErreurs[0] + ".focus()" );
			eval( "objetFormulaire." + listeErreurs[0] + ".select()" );
			}

		
		if ( estFormulaire )
			return false;
		}
	else
		{
		// Soumet le formulaire
		if ( estFormulaire )
			return true;
		else
			objetFormulaire.submit();
		}
}
//< validerFormulaire





//-----------------------------------------------------------------------------------------





