/*Documentation Controle Javascript :
===================================

Type de champs INPUT (sauf radio) & TEXTEAREA
	==> fw_obligatoire (oui | non)
	    	Cette option permet de déterminer le caractère obligatoire du champs

	==> fw_type (int | float | email | cp | date | alphanum | url)
	    	Cette option permet de déterminer quel controle de formulaire on doit appliquer au champs (entier, chaine de caractère...)

	==> fw_lib 
	    	Cette option permet de déterminer le libellé qui sera affiché par la fonction de contrôle de formulaire
	    
	==> fw_mode
			Dans le cas du type date, on choisit des modes via cet attribut 
			Les différents modes sont : (jj/mm/aaaa | jj-mm-aaaa | jj mm aaaa | aaaa-mm-jj)
	    						
	==> fw_lien (id du champs lié)
			Permet de lier 2 champs ensemble (attention, il faut mettre comme valeur l'ID du champs a lier et non pas le name)
		
	==> fw_type_lien (egale) 
			Permet de définir le type de lien qui existe entre les 2 champs
	
	==> fw_size
			Cette option permet de définir quelle doit être la taille exacte du contenu
	
	==> fw_min_size
			Cette option permet de définir quelle doit être la taille minimum du contenu
	
	==> fw_max_size
			Cette option permet de définir quelle doit être la taille maximum du contenu


Type de champs INPUT Radio (les controles doivent etre positionnes sur le premier input radio)
	==> fw_obligatoire (oui | non)
	    Cette option permet de déterminer le caractère obligatoire du champs

	==> fw_lib 
	    Cette option permet de déterminer le libellé qui sera affiché par la fonction de contrôle de formulaire


Type de champs INPUT Submit
	==> fw_submit_mode (simple | disable)
	    Cette option permet de controler que le submit ne soit validé qu'une fois.
	    	=> simple 	: le formulaire ne peut être validé qu'une seule fois
	    	=> disable 	: comme simple, mais le bouton submit est en plus désactivé (RECOMMANDE)
	==> fw_submit_function (maFonctionPeronnalisee())
			=> maFonctionPeronnalisee() : ici vous pouvez mettre le nom d'une fonction personnalisée qui, par exemple, ouvrira une popin d'attente le temps de la validation du formulaire


Type de champs SELECT 
	==> fw_obligatoire (oui | non)
		Cette option permet de déterminer le caractère obligatoire du champs, en se basant sur la propriété SELECTED

	==> fw_lib 
		Cette option permet de déterminer le libellé qui sera affiché par la fonction de contrôle de formulaire


Exemple d'utilisation : 
	
	Entete du formulaire :
	<form name='form" method="post" name="formulaire" onSubmit="return verifFormulaire(this)" action="blabl.php" >

	Submit du fomulaire 
	<input type="submit" value="Verifier">    
	Submit avec désactivation du bouton
	<input type="submit" fw_submit_mode="disable" value="Verifier">
*/

function verifFormulaire(formulaire)
{
	// Tableaux permettant de stocker les éventuelles erreurs détectées
	var tab_oblig 	= new Array();
	var tab_type 	= new Array();
	var tab_lien 	= new Array();
	var tab_size 	= new Array();
	var name 		= '';
	
	// Tableaux de controle de variables multiples
	var tab_check_obligatoire = new Object(); 	// Contient le nombres de cases cochées par id
	
	// La variable nb_submit permet de controler le nb de fois où ce formulaire a été soumis
	if ( formulaire.nb_submit == undefined )
	{
		formulaire.nb_submit = 0;
	}
	
	// Afin de controler le submit, ces 3 variables sont instanciées à false au début
	var dom_submit					= new Array(); // Contient les éléments Dom Object du submit du formulaire
	var controle_submit 			= false; // gestion du controle du submit
	var controle_submit_function 	= false; // contient le nom de la fonction personnalisée pour le submit
	
  
	//On recupere tous les élements du formulaire
	formulaire_elements=formulaire.elements;
	
	for(i=0;i!=formulaire_elements.length;i++)
	{
		/***********************************************/
		// 1) CAS DE L INPUT (SAUF RADIO ET CHECKBOX) ET DU TEXTAREA
		/***********************************************/
		if(	(	formulaire_elements[i].nodeName=="INPUT" 
				&& formulaire_elements[i].getAttribute('type')!="radio" 
				&& formulaire_elements[i].getAttribute('type')!="checkbox"
			) 
			|| formulaire_elements[i].nodeName=="TEXTAREA")
		{			
			//On verifie si le champs est obligatoire
			if(formulaire_elements[i].getAttribute('fw_obligatoire')=="oui")
			{
				//Si il est vide, on met le nom du champs dans le tableau 
				if(formulaire_elements[i].value== "")
				{
					tab_oblig.push(formulaire_elements[i].getAttribute('fw_lib'));
				}
			}
			
			
			/***********************************************/
			//On verifie si le champs est lié à un autre champs
			/***********************************************/
			if(formulaire_elements[i].getAttribute('fw_lien')!=null)
			{
				// Récupération de l'id du champ lié
				var id_champ_lie = formulaire_elements[i].getAttribute('fw_lien');
				
				//CAS DU TYPE DE LIEN EGALE ==> les champs doivent avoir la meme valeur
				if(formulaire_elements[i].getAttribute('fw_type_lien')=='egale')
				{
					if (formulaire_elements[i].value!=formulaire_elements[id_champ_lie].value)
					{
						tab_lien.push(formulaire_elements[i].getAttribute('fw_lib') + " et "+ formulaire_elements[id_champ_lie].getAttribute('fw_lib') + " doivent être égaux");
					}
				}
			}
			
			
			if (formulaire_elements[i].value != "")
			{
				// *************
				// *** Vérification de la taille du champ
				// *************
				// Si une taille exacte est fournie
				if ( formulaire_elements[i].getAttribute('fw_size') != null )
				{
					// Récupération de la taille exacte que doit avoir le contenu du champs
					var taille_exacte = formulaire_elements[i].getAttribute('fw_size');
					// Si le contenu du champ n'est pas à la taille exacte imposée
					if ( formulaire_elements[i].value.length != taille_exacte )
					{
						tab_size.push( formulaire_elements[i].getAttribute('fw_lib') +" doit contenir exactement "+ taille_exacte +" caractères");
					}
				}
				
				
				// Si une taille minimale est fournie
				if ( formulaire_elements[i].getAttribute('fw_min_size') != null )
				{
					// Récupération de la taille minimal que doit avoir le contenu du champs
					var min_size = formulaire_elements[i].getAttribute('fw_min_size');
					// Si le contenu du champ ne contient pas assez de caractères
					if ( formulaire_elements[i].value.length < min_size )
					{
						tab_size.push( formulaire_elements[i].getAttribute('fw_lib') +" doit contenir au moins "+ min_size +" caractères");
					}
				}
				
				
				// Si une taille maximale est fournie
				if ( formulaire_elements[i].getAttribute('fw_max_size') != null )
				{
					// Récupération de la taille maximale que doit avoir le contenu du champs
					var max_size = formulaire_elements[i].getAttribute('fw_max_size');
					// Si le contenu du champ contient trop de caractères
					if ( formulaire_elements[i].value.length > max_size )
					{
						tab_size.push( formulaire_elements[i].getAttribute('fw_lib') +" ne doit pas contenir plus de  "+ max_size +" caractères");
					}
				}
				
				
				/***********************************************/
				//On verifie les differents type "entier"
				/***********************************************/
				if(formulaire_elements[i].getAttribute('fw_type')=="int")
				{
					//Si il n'est pas de type entier, on met le nom du champs dans le tableau 	        	
					if(isNotInt(formulaire_elements[i].value))
					{
						var j 					= tab_type.length;
						tab_type[j] 			= new Array();
						tab_type[j]["lib"] 		= new Array();
						tab_type[j]["type"] 	= new Array();
						tab_type[j]["lib"] 		= formulaire_elements[i].getAttribute('fw_lib');
						tab_type[j]["type"] 	= formulaire_elements[i].getAttribute('fw_type');
					}
				}
				
				
				/***********************************************/
				//On verifie les differents type "float"
				/***********************************************/
				if(formulaire_elements[i].getAttribute('fw_type')=="float")
				{
					//Si il n'est pas de type float, on met le nom du champs dans le tableau 	        	
					if(isNotFloat(formulaire_elements[i].value))
					{
						var j 					= tab_type.length;
						tab_type[j] 			= new Array();
						tab_type[j]["lib"] 		= new Array();
						tab_type[j]["type"] 	= new Array();
						tab_type[j]["lib"] 		= formulaire_elements[i].getAttribute('fw_lib');
						tab_type[j]["type"] 	= formulaire_elements[i].getAttribute('fw_type');
					}
				}
				
				
				/***********************************************/
				//On verifie les differents type "email"
				/***********************************************/
				if(formulaire_elements[i].getAttribute('fw_type')=="email")
				{
					//Si il n'est pas de type email, on met le nom du champs dans le tableau 	        	
					if(isNotEmailAdress(formulaire_elements[i].value))
					{
						var j 					= tab_type.length;
						tab_type[j] 			= new Array();
						tab_type[j]["lib"] 		= new Array();
						tab_type[j]["type"] 	= new Array();
						tab_type[j]["lib"] 		= formulaire_elements[i].getAttribute('fw_lib');
						tab_type[j]["type"] 	= formulaire_elements[i].getAttribute('fw_type');
					}
				}
				
				
				/***********************************************/
				//On verifie les differents type "cp" / Code Postale
				/***********************************************/
				if(formulaire_elements[i].getAttribute('fw_type')=="cp")
				{
					//Si il n'est pas de type code pstal, on met le nom du champs dans le tableau 	        	
					if(isNotCodePostal(formulaire_elements[i].value))
					{
						var j 					= tab_type.length;
						tab_type[j] 			= new Array();
						tab_type[j]["lib"] 		= new Array();
						tab_type[j]["type"] 	= new Array();
						tab_type[j]["lib"] 		= formulaire_elements[i].getAttribute('fw_lib');
						tab_type[j]["type"] 	= formulaire_elements[i].getAttribute('fw_type');
					}
				}
				
				
				/***********************************************/
				//On verifie les differents type "date" 
				/***********************************************/
				if(formulaire_elements[i].getAttribute('fw_type')=="date")
				{
					//Si il n'est pas de type date, on met le nom du champs dans le tableau 	        	
					if(isNotDate(formulaire_elements[i].value,formulaire_elements[i].getAttribute('fw_mode')))
					{
						var j 					= tab_type.length;
						tab_type[j] 			= new Array();
						tab_type[j]["lib"] 		= new Array();
						tab_type[j]["type"] 	= new Array();
						tab_type[j]["lib"] 		= formulaire_elements[i].getAttribute('fw_lib');
						tab_type[j]["type"] 	= formulaire_elements[i].getAttribute('fw_type') + " au format " + formulaire_elements[i].getAttribute('fw_mode');
					}
				}
				
				
				/***********************************************/
				//On verifie les differents type "alpha numerique" 
				/***********************************************/
				if(formulaire_elements[i].getAttribute('fw_type')=="alphanum")
				{
					//Si il n'est pas de type alphanumeric, on met le nom du champs dans le tableau 	        	
					if(isNotAlphanumeric(formulaire_elements[i].value))
					{
						var j= tab_type.length;
						tab_type[j]  			= new Array();
						tab_type[j]["lib"] 		= new Array();
						tab_type[j]["type"] 	= new Array();
						tab_type[j]["lib"] 		= formulaire_elements[i].getAttribute('fw_lib');
						tab_type[j]["type"] 	= formulaire_elements[i].getAttribute('fw_type');
					}
				}
				
				
				/***********************************************/
				//On verifie le type "url" 
				/***********************************************/
				if(formulaire_elements[i].getAttribute('fw_type')=="url")
				{
					//S'il n'est pas de type "url", on met le nom du champs dans le tableau 	        	
					if(isNotUrl(formulaire_elements[i].value))
					{
						var j= tab_type.length;
						tab_type[j]  			= new Array();
						tab_type[j]["lib"] 		= new Array();
						tab_type[j]["type"] 	= new Array();
						tab_type[j]["lib"] 		= formulaire_elements[i].getAttribute('fw_lib');
						tab_type[j]["type"] 	= formulaire_elements[i].getAttribute('fw_type');
					}
				}
			}
		}
		
		
		/***********************************************/
		// 2.1) CAS DE L INPUT RADIO 
	    /***********************************************/
		if(formulaire_elements[i].nodeName=="INPUT" && formulaire_elements[i].getAttribute('type')=="radio" && name!= formulaire_elements[i].getAttribute('name') && formulaire_elements[i].getAttribute('fw_obligatoire')=="oui")
		{
			var name=formulaire_elements[i].getAttribute('name');
			if(testerRadio(formulaire.elements[name])== false)
			{
				tab_oblig.push(formulaire_elements[i].getAttribute('fw_lib'));
			}
		}
		
		/***********************************************/
		// 2.2) CAS DE L INPUT CHECKBOX
	    /***********************************************/
		// 2.2.1) Checkbox obligatoire
		if(formulaire_elements[i].nodeName=="INPUT" && formulaire_elements[i].getAttribute('type')=="checkbox" && name!= formulaire_elements[i].getAttribute('name') && formulaire_elements[i].getAttribute('fw_obligatoire')=="oui")
		{
			var name=formulaire_elements[i].getAttribute('name');
			if( !formulaire.elements[name].checked )
			{
				tab_oblig.push(formulaire_elements[i].getAttribute('fw_lib'));
			}
		}
		
		// 2.2.1) Checkbox "au moins un obligatoire"
		if(formulaire_elements[i].nodeName=="INPUT" && formulaire_elements[i].getAttribute('type')=="checkbox" && formulaire_elements[i].getAttribute('fw_check_obligatoire') != undefined)
		{
			var name = formulaire_elements[i].getAttribute('name');
			var key = formulaire.elements[i].getAttribute('fw_check_obligatoire');
			if( tab_check_obligatoire[key] == undefined )
			{
				tab_check_obligatoire[key] = {};
				tab_check_obligatoire[key]['lib'] = formulaire_elements[i].getAttribute('fw_lib');
				tab_check_obligatoire[key]['nb'] = 0;
			}
				
			if( formulaire.elements[i].checked )
			{
				tab_check_obligatoire[key]['nb']++;
			}
		}
		
		
		/***********************************************/
		// 3) CAS DE LA COMBOBOX
		/***********************************************/
		if(formulaire_elements[i].nodeName=="SELECT")
		{				
			var vide=0;
			if(formulaire_elements[i].getAttribute('fw_obligatoire')=="oui")		
			{
				for ( var k=0; k<formulaire_elements[i].options.length; k++) 
				{
					if ( formulaire_elements[i].options[k].selected == true && formulaire_elements[i].options[k].value == "" ) 
					{
						vide++;
					}
				}
				//Si aucune valeur n'est selectionnée on met le nom du champs dans le tableau 
				if(formulaire_elements[i].value== "")
				{
					tab_oblig.push(formulaire_elements[i].getAttribute('fw_lib'));
				}
			}		
		}
		
		
		/***********************************************/
		// 4) CAS DU SUBMIT
		/***********************************************/
		if(formulaire_elements[i].nodeName=="INPUT" && formulaire_elements[i].getAttribute('type')=="submit" && formulaire_elements[i].getAttribute('fw_submit_mode') != "" && formulaire_elements[i].getAttribute('fw_submit_mode') != undefined)
		{				
			// Dans tous les cas, on fait le controle du submit : validé une seule fois
			controle_submit = true;
			
			// Le bouton sera désactivé
			if(formulaire_elements[i].getAttribute('fw_submit_mode')=="disable")
			{
				dom_submit[dom_submit.length] = formulaire_elements[i];
				disableSubmit(formulaire_elements[i]);
			}
		}
		
		if(formulaire_elements[i].nodeName=="INPUT" && formulaire_elements[i].getAttribute('type')=="submit" && formulaire_elements[i].getAttribute('fw_submit_function') != "" && formulaire_elements[i].getAttribute('fw_submit_function') != undefined)
		{				
			controle_submit_function = formulaire_elements[i].getAttribute('fw_submit_function');
		}
	}
	
	
	// On vérifie que toutes les listes de checkbox marquées comme étant obligatoires disposent d'au moins une case cochée
	for( var i in tab_check_obligatoire )
	{
		if( tab_check_obligatoire[i]['nb'] == 0 )
		{
			tab_oblig.push(tab_check_obligatoire[i]['lib']);
		}
	}
	
	
	///////////////////////////////////////////////////////////////////////////////////////////
	//Maintenant que nos 3 tableaux sont remplis  on va afficher le message à l'utilisateur
	///////////////////////////////////////////////////////////////////////////////////////////
	// *************
	// *** Un des champs obligatoires n'est pas rempli
	// *************
	var lib = "Attention, le(s) champ(s) suivant(s) sont obligatoire(s) : \n";
	var liste= "";
	for(var i=0; i<tab_oblig.length; i++)
	{
		liste=liste+" - "+tab_oblig[i]+"\n";
	}
	
	if(liste!="")
	{
		for(var k=0; k<dom_submit.length; k++)
			enableSubmit(dom_submit[k]);
		formulaire.nb_submit = 0;
		alert(lib+liste);
		return false;
	}
	
	// *************
	// ** Un des champs ne respecte pas le type obligatoire
	// *************
	var lib_type="Le formulaire contient le(s) erreur(s) suivante(s) : \n"; 
	var liste_type="";
	for(var i=0; i<tab_type.length; i++)
	{
		liste_type=liste_type+" - "+tab_type[i]["lib"]+" doit être de type "+tab_type[i]["type"]+"\n";
	}
	
	if(liste_type!="")
	{
		for(var k=0; k<dom_submit.length; k++)
			enableSubmit(dom_submit[k]);
		formulaire.nb_submit = 0;
		alert(lib_type+liste_type);
		return false;
	}
	
	
	// *************
	// *** Un des champs ne respecte pas les tailles fixées
	// *************
	var liste_taille = "";
	for(var i=0; i<tab_size.length; i++)
	{
		liste_taille = liste_taille +" - "+ tab_size[i] +"\n";
	}
    
	if(liste_taille != "")
	{
		for(var k=0; k<dom_submit.length; k++)
			enableSubmit(dom_submit[k]);
		formulaire.nb_submit = 0;
		alert(liste_taille);
		return false;
	}
	
	
	// *************
	// *** 2 champs liés sont faux
	// *************
	var liste_lien= "";
	for(var i=0; i<tab_lien.length; i++)
	{
		liste_lien=liste_lien+" - "+tab_lien[i]+"\n";
	}
    
	if(liste_lien!="")
	{
		for(var k=0; k<dom_submit.length; k++)
			enableSubmit(dom_submit[k]);
		formulaire.nb_submit = 0;
		alert(liste_lien);
		return false;
	}
	
	
	//**************************************
	// LA VALIDATION DU FORMULIARE S'EST BIEN DEROULEE, ON VA TESTER SA SOUMISSION
	//**************************************
	// Si le controle du submit est "simple", et qu'on a pas déjà soumis le formulaire
	if (controle_submit == true && formulaire.nb_submit == 0)
	{
		// si on a une fonction personnalisée on l'exécute
		if (controle_submit_function != false)
		{
			eval(controle_submit_function);
		}
		formulaire.nb_submit++;
		return true; 
	}
	// Si pas de controle du submit, on soumet le formulaire dans tous les cas
	else if (controle_submit == false)
	{
		return true; 
	}
	// Si on a un controle du submit et que le formulaire a déjà été soumis on bloque la soumission
	else
	{
		return false;
	}
}

 
///////////////////////////////////////////
// Fonctions utilisées pour la manipulations des éléments de formulaire
///////////////////////////////////////////

//CETTE FONCTION PERMET DE TESTER LES BOUTONS RADIOS
function testerRadio(radio) 
{
	// Dans le cas où le radio est unique (un seul input avec le meme "name"), la valeur retournée n'est pas un tableau
	if( radio.length == undefined )
		var radio = new Array(radio);
	
	for (var i=0; i<radio.length;i++) 
	{
		if (radio[i].checked) 
		{
			return true;
		}
	}
	return false;
}

function testerCheckbox(checkbox)
{
	for (var i=0; i<radio.length;i++) 
    {
  		if (radio[i].checked) 
    	{
			return true;
    	}
  	}
	return false;
}
   
//
function disableSubmit(submit)
{
	if (submit != false)
	{
		submit.disabled=true;
	}
}

//
function enableSubmit(submit)
{
	if (submit != false)
	{
		submit.disabled=false;
	}
}

   
///////////////////////////////////////////
////LISTE DES EXPRESSIONS REGULIERES UTILISEES POUR FAIRE LE CONTOLE DES FORMULAIRE
///////////////////////////////////////////   
  
// Expressions régulières de test de longueur
var regExpEmpty=/^$/g;									// Accepte une chaine vide
var regExp8Chars=/^[0-9a-zA-Z]{8,}$/g;	// Accepte une chaine d'au moins 8 carctères alphanumeriques (pour un mot de passe par exemple).

// Expressions régulières de test de type de caractère
var regExpAlphanumeric=/^[0-9a-zA-Z]+$/g;									// Accepte une chaine alphanumérique
var regExpAlphanumericWithWhitespace=/^[0-9a-zA-Z ]+$/g;	// Accepte une chaine alphanumérique + ' '
var regExpAlphabetic=/^[a-zA-Z]+$/g;											// Accepte une chaine alphabétique
var regExpNumeric=/^[0-9]+$/g;														// Accepte une chaine numérique

// Expressions régulières de test de type
var regExpInt=/^[0-9]+$/g;																																		// Accepte une chaine de type 'int'
var regExpDouble=/^[-+]?[0-9]+(\.[0-9]+)?$/g;																									// Accepte une chaine de type 'double'
var regExpFloat=/^[-+]?[0-9]+(\.[0-9]+)?([eE][-+]?[0-9]+)?$/g;																// Accepte une chaine de type 'float'
var regExpTime=/^([01][0-9]|2[0123])\:([012345][0-9])(\:([012345][0-9])(.([0-9]{3})+)?)?$/g;	// Accepte une chaine de type 'time'. Ex : 12:51 ou 21:45:35.654

// Expressions régulières de test de date
var regExpFrenchDate=/^(0[1-9]|[12][0-9]|3[01])[\- \/\.](0[1-9]|1[012])[\- \/\.](19|20)\d\d$/g;  	// date au format jj/mm/aaaa ou jj-mm-aaaa ou jj mm aaaa ou jj.mm.aaaa avec aaaa compris entre 1900 et 2099.
var regExpjjslashmmslashaaaaDate=/^(0[1-9]|[12][0-9]|3[01])[\/](0[1-9]|1[012])[\/](19|20)\d\d$/g; // date au format jj/mm/aaaa avec aaaa compris entre 1900 et 2099.
var regExpjjtiretmmtiretaaaaDate=/^(0[1-9]|[12][0-9]|3[01])[-](0[1-9]|1[012])[-](19|20)\d\d$/g;  	// date au format jj-mm-aaaa avec aaaa compris entre 1900 et 2099.
var regExpjjespacemmespaceaaaaDate=/^(0[1-9]|[12][0-9]|3[01])[ ](0[1-9]|1[012])[ ](19|20)\d\d$/g; // date au format jj mm aaaa avec aaaa compris entre 1900 et 2099.
var regExpaaaatiretmmtiretjjDate=/^(19|20)\d\d[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])$/g; 	// idem ci-dessus mais format anglais (Ex : aaaa-mm-jj)

// Expressions régulières de test de booleen
var regExpBoolean=/^true|false$/g;		// Accepte une chaine de type 'boolean'

// Expressions régulières de test de types administratifs français
var regExpCodePostal=/^([A-Z]+[A-Z]?\-)?[0-9]{1,2} ?[0-9]{3}$/g;																																	// Accepte une chaine de type 'code postal'. Ex : F-33370 ou 33 370 ou 33370 ou F-1 370
var regExpTelephoneFixe=/^(01|02|03|04|05)[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}$/g;										// Accepte un numero de téléphone de type 'fixe'. Ex : 01.34.12.52.30 ou 0134125230
var regExpTelephonePortable=/^(06)[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}$/g;														// Accepte un numero de téléphone de type 'portable'.
var regExpTelephoneNational=/^(0[12345689])[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}$/g;										// Accepte un numero de téléphone de type 'national' y compris numéros en '08'.
var regExpTelephoneInternational=/^(\+[0-9]{2})[ \.\-]?[0-9][ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}$/g;	// Accepte un numero de téléphone de type 'international'. Ex : (+33) 1 34 12 52 30
var regExpNumeroSecuriteSociale=/^[12][ \.\-]?[0-9]{2}[ \.\-]?(0[1-9]|[1][0-2])[ \.\-]?([0-9]{2}|2A|2B)[ \.\-]?[0-9]{3}[ \.\-]?[0-9]{3}[ \.\-]?[0-9]{2}$/g; // Accepte un numero de sécurité sociale français. Ex : 1 85 34 33 354 450 45
var regExpTVAIntracommunautaire=/^[A-Z]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{3}[ \.\-]?[0-9]{3}[ \.\-]?[0-9]{3}$/g;										// Accepte un numero de TVA Intra-communautaire. Ex : FR 02 254 254 254
var regExpNumeroSiren=/^[0-9]{3}[ \.\-]?[0-9]{3}[ \.\-]?[0-9]{3}$/g;																															// Accepte un numero SIREN. Ex : 254 254 254
var regExpNumeroSiret=/^[0-9]{3}[ \.\-]?[0-9]{3}[ \.\-]?[0-9]{3}[ \.\-]?[0-9]{5}$/g;																							// Accepte un numero SIRET. Ex : 254 254 254 12345
var regExpCodeApe=/^[0-9]{2}[ \.\-]?[0-9]{1} ?[a-zA-Z]$/g;																																				// Accepte un code APE. Ex : 25.4Z

// Expressions régulières de test de types liés à internet
var regExpEmailAdress=/^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,})$/g;						// Accepte une adresse email. Ex : toto@toto.com
var regExpIpAdress=/\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/g;	// Accepte une adresse ip. Ex : 192.168.0.1
var regExpDomainName=/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$/g;																					// Accepte un nom de domaine. Ex : toto.com
var regExpUrl=/^((http(s?)|ftp)\:\/\/)?([a-z0-9]+)(([\.\-]?[a-z0-9]+)*)\.([a-z]{2,})(\:[0-9]+)?\/?/gi;							// Accepte une url ftp, http ou https, avec ou sans login/mot de passe, avec ou sans numero de port. Ex : http://www.toto.com, ftp://toto:toto@ftp.toto.com:21/
var regExpHexColor=/^#[0-9A-Fa-f]{6}$/g; 																																													// Accepte une couleur hexadécimale

//Les deux fonction suivantes servent à identifier si une chaine de caractère est compatible ou non avec une expression régulière passée en paramètre
function matchRegularExpression(valeur, regularExpression)
{
	var resultat = valeur.match(regularExpression);
	if(resultat!=null && resultat.length==1) 
	{	
		return true;
	}
	else
	{
		return false;
	}
}
	
function doesntMatchRegularExpression(valeur, regularExpression)
{
	if(matchRegularExpression(valeur, regularExpression))
	{
		return false;
	}
	else
	{
		return true;
	}
}
	

///////////////////////////////////////////
////LISTE DES FRONCTIONS DE CONTROLE UTILISEE
////Chacune prend comme argument la valeur de l'attribut "value" d'un champ de formulaire de type "text" ou "password"
///////////////////////////////////////////   
function isEmpty(valeur)
{
	return matchRegularExpression(valeur, regExpEmpty);
}

function isNotEmpty(valeur)
{
	return doesntMatchRegularExpression(valeur, regExpEmpty);
}

function isNot8CharsLength(valeur)
{
	return doesntMatchRegularExpression(valeur, regExp8Chars);
}

function isNotAlphanumeric(valeur)  
{
	return doesntMatchRegularExpression(valeur, regExpAlphanumeric);
}

function isAlphanumeric(valeur)  
{
	return matchRegularExpression(valeur, regExpAlphanumeric);
}

function isNotAlphanumericWithWhitespace(valeur)
{
	return doesntMatchRegularExpression(valeur, regExpAlphanumericWithWhitespace);
}

function isNotAlphabetic(valeur)
{
	return doesntMatchRegularExpression(valeur, regExpAlphabetic);
}

function isNotNumeric(valeur)
{
	return doesntMatchRegularExpression(valeur, regExpNumeric);
}

function isNotInt(valeur)
{
	return doesntMatchRegularExpression(valeur, regExpInt);
}

function isNotDouble(valeur)
{
	return doesntMatchRegularExpression(valeur, regExpDouble);
}

function isNotFloat(valeur)
{
	return doesntMatchRegularExpression(valeur, regExpFloat);
}

function isNotBoolean(valeur)
{
	return doesntMatchRegularExpression(valeur, regExpBoolean);
}

function isNotTime(valeur)
{
	return doesntMatchRegularExpression(valeur, regExpTime);
}

function isNotDate(valeur, mode)
{
	switch (mode)
	{
		case "jj/mm/aaaa" : 
			return doesntMatchRegularExpression(valeur, regExpjjslashmmslashaaaaDate);
		break;
		case "jj-mm-aaaa" :
			return doesntMatchRegularExpression(valeur, regExpjjtiretmmtiretaaaaDate);
		break;
		case "jj mm aaaa" :
			return doesntMatchRegularExpression(valeur, regExpjjespacemmespaceaaaaDate);
		break;
		case "aaaa-mm-jj" :
			return doesntMatchRegularExpression(valeur, regExpaaaatiretmmtiretjjDate);
		break;					
		default : 
			return doesntMatchRegularExpression(valeur, regExpFrenchDate);
		break;
	}
}

function isNotCodePostal(valeur)
{
	return doesntMatchRegularExpression(valeur, regExpCodePostal);
}

function isNotTelephone(valeur, mode)
{
	switch (mode)
	{
		case "fixe" : 
			return doesntMatchRegularExpression(valeur, regExpTelephoneFixe);
		break;
		case "port" :
			return doesntMatchRegularExpression(valeur, regExpTelephonePortable);
		break;
		case "nati" :
			return doesntMatchRegularExpression(valeur, regExpTelephoneNational);
		break;
		case "inte" :
			return doesntMatchRegularExpression(valeur, regExpTelephoneInternational);
		break;
		default : 
			return doesntMatchRegularExpression(valeur, regExpTelephoneNational);
		break;
	}
}

function isNotNumeroSecuriteSociale(valeur)
{
	return doesntMatchRegularExpression(valeur, regExpNumeroSecuriteSociale);
}

function isNotTVAIntracommunautaire(valeur)
{
	return doesntMatchRegularExpression(valeur, regExpTVAIntracommunautaire);
}

function isNotNumeroSiren(valeur)
{
	return doesntMatchRegularExpression(valeur, regExpNumeroSiren);
}

function isNotNumeroSiret(valeur)
{
	return doesntMatchRegularExpression(valeur, regExpNumeroSiret);
}

function isNotCodeApe(valeur)
{
	return doesntMatchRegularExpression(valeur, regExpCodeApe);
}

function isNotEmailAdress(valeur)
{
	return doesntMatchRegularExpression(valeur, regExpEmailAdress);
}

function isNotIpAdress(valeur)
{
	return doesntMatchRegularExpression(valeur, regExpIpAdress);
}

function isNotDomainName(valeur)
{
	return doesntMatchRegularExpression(valeur, regExpDomainName);
}

function isNotUrl(valeur)
{
	return doesntMatchRegularExpression(valeur, regExpUrl);
}

function isNotHexColor(valeur)
{
	return doesntMatchRegularExpression(valeur, regExpHexColor);
}

