

   /*==================================================================================|
	|		Attention : Remplacer les "monform" par le nom de votre formulaire		|
	|   _______   ___                      ____                                         |
    |	ConForm : CONtrole des champs d'un FORMulaire   		   						|
	|   ¯¯¯¯¯¯¯   ¯¯¯                      ¯¯¯¯                                         |
	|																					|
	| 							   ~\\|//												|
    |                        (@ ~)														|
    |     •———————————oOOO————(_)————OOOo—————————•										|
    |     | M'écrire : http://mas.keo.in?Code=Bul |										|
    |     | Mon Site : http://bul.fr.nf           |										|
    |     |              .oooO   Oooo.            |										|
    |     •——————————————(   )———(   )————————————•										|
    |                     \ (     ) /													|
    |                      \_)   (_/													|
	|																					|
	|===================================================================================|
	|											|										|
	|	     lang="								|										|
	|————————————————————————————————————————————|——————————————————————————————————————|
	|			  nom:nom de la zone;					| par défaut : n° champ 		|
	|————————————————————————————————————————————|——————————————————————————————————————|
	|			  erreur:libellé de l'erreur;			| par défaut : invalide 		|
	|————————————————————————————————————————————|——————————————————————————————————————|
	|             type:obligatoire;				 | doit être renseigné					|
	|				   date;					 | dépend de "format:"					|
	|				   cocher;					 | cases à cocher (checkbox)			|
	|				   liste;					 | select où choisir des lignes			|
	|				   radio;					 | radio à cocher ( au moins 1 )		|
	|				   mail;					 | adresse Mail ( ab.cd@ef.gh )			|
	|				   nombre;					 | valeur								|
	|				   specifique;				 | test à faire (dans format:)			|
	|				   accepter					 | 1 checkbox/radio qui doit être coché	|
	|————————————————————————————————————————————|——————————————————————————————————————|
	|             format:de la date;			 | si type:date  jjmmaaaa 				|
	|											 |               jj/mm/aaaa ( défaut ) 	|
	|					 test particulier;		 | if ( test particulier )				|	   
	|————————————————————————————————————————————|——————————————————————————————————————|
	|			  separateur:?;					 | entre jj,mm et aaaa					|
	|											 | par défaut : n'importe   			|
	|————————————————————————————————————————————|——————————————————————————————————————|
	|			  mini:valeur;					 | ° valeur mini de nombre   		   	|
	|											 | ° nombre de cases mini à cocher		|
	|											 |  si select multiple, par défaut=1	|
	|                                            | ° nbr caractères mini à saisir       |
	|                                            |    si type:obligatoire               |
	|                                            |    1 par défaut                      |
	|————————————————————————————————————————————|——————————————————————————————————————|
	|			  maxi:valeur;					 | ° valeur maxi de nombre				|
	|											 | ° nbr cases maxi à cocher si 		|
	|											 |   select multiple, par défaut=mini	|
	|                                            | ° nbr caractères maxi à saisir       |
	|                                            |    si type:obligatoire               |
	|                                            |    pas de maxi par défaut            |
	|————————————————————————————————————————————|——————————————————————————————————————|
	|			  bonfond:couleur;				 | couleur fond si contrôles bons		|
	|————————————————————————————————————————————|——————————————————————————————————————|
	|			  bontexte:couleur;				 | couleur texte si contrôles bons		|  
	|————————————————————————————————————————————|——————————————————————————————————————|
	|			  erreurfond:couleur;			 | couleur fond si contrôles faux		|
	|————————————————————————————————————————————|——————————————————————————————————————|
	|			  erreurtexte:couleur;			 | couleur texte si contrôles faux		|  
	|————————————————————————————————————————————|——————————————————————————————————————|
	|	          "						   		 |										|
	|											 |										|
	|===================================================================================|
	|																					|
	| 			Si vous ajoutez/modifier des contrôles, ce serait    					|
	|			sympa de me les faire parvenir  : merci d'avance. 						|
	|			Si vous voulez que j'en ajoute  : contactez-moi.						|
	|																					|
	|==================================================================================*/

//######################################################################
function RLtrim(zone)	//## supprimer les espaces en début et en fin ##
//######################################################################
{	
	return zone.replace(/(^\s*)|(\s*$)/g,"");
}
//###########################################################
function SignalErreur(z1,monform,z2)	//## signaler les erreurs ##
//###########################################################
{	
	if ( z1["erreurfond"] )
	{ 
		monform.elements[z2].style.backgroundColor=z1["erreurfond"] ; 
	}
	if ( z1["erreurtexte"] )
	{ 
		monform.elements[z2].style.color=z1["erreurtexte"] ; 
	}
	return "\r\n"+z1["erreur"];
}
//#####################################################################
function ConForm(formulaire)	//## contrôle des champs du formulaire ##
//#####################################################################
{	
	var retour="",tester;
	for (	no_element=0;
			no_element<formulaire.elements.length;
			no_element++)	// pour toutes les champs d'un formulaire
	{	
	//	tester=formulaire.elements[no_element].controle;	//#### non traité par moteurs Gecko
	//	tester=formulaire.elements[no_element].alt;			//#### non valable pour textarea
		tester=formulaire.elements[no_element].lang;			//	version actuelle
		if (tester)
		{	//~~~~~~~~ il y a un alt="contrôle à faire" ~~~~~~~~
			var zones=RLtrim(tester).split(";");
			// format : alt="id1:valeur1;id2:valeur2...."
			var	valeur=new Array();
			for (	var z=0;
					z<zones.length;
					z++ )	// pour toutes les zones du controle
			{	// valeur["id#"]=valeur#
				trv=RLtrim(zones[z]).split(":");	// id#:valeur#
				if (trv.length==2)
				{	    
					valeur[RLtrim(trv[0].toLowerCase())]=RLtrim(trv[1].toLowerCase());	
				}
			}	
			if ( !valeur["nom"] )
			{
				valeur["nom"]="Champ("+(no_element+1)+")";	// valeurs par défaut
			}
			if ( !valeur["erreur"] )
			{	
				valeur["erreur"]=valeur["nom"]+" invalide";	// valeurs par défaut
			}
			if ( valeur["bonfond"] )
			{ 
				formulaire.elements[no_element].style.backgroundColor=valeur["bonfond"] ; 
			}
			if ( valeur["bontexte"] )
			{ 
				formulaire.elements[no_element].style.color=valeur["bontexte"] ; 
			}
			switch ( valeur["type"] )	
			{								
			//-_-_-_-_ traitements possibles actuellement -_-_-_-_
			
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ le checkbox
				case "accepter":	//~~ accepter une obligation ~~~~~~~~~~~~~~~~~~~~~ ou le radio Unique
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ doit être coché
					if ( !formulaire.elements[no_element].checked )
					{	
						retour+=SignalErreur(valeur,formulaire,no_element);
					}
					break;
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ si un contrôle
				case "specifique":	//~~ test dans format: ~~~~~~~~~~~~~~~~~~~ par trop particulier
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ est nécessaire
					try			{	
									if ( eval(valeur["format"]) )	
									{ 	
										retour+=SignalErreur(valeur,formulaire,no_element);	
									}	
								}	
					catch(e)	{ 
								}
					break;
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1 radio
				case "radio":	//~~ Radio ~~~~~~~~~~~~~~~~~~~~~ doit être
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ coché
					var nom=formulaire.elements[no_element].name;
					var err=true;
					for ( var n=0;n<formulaire[nom].length;n++ )
					{ 
						if ( formulaire[nom][n].checked ) 
						{	
							err=false;
							n=formulaire[nom].length;
						}	
					}
					if ( err )
					{ 	
						retour+=SignalErreur(valeur,formulaire,no_element);	
					}
					break;
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ n éléments de la liste doivent cochés
	 			case "liste":	//~~ select ~~~~~~~~~~~~~~~~~~~~~ entre mini et maxi si liste multiple
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1 au moins sinon
					switch ( formulaire.elements[no_element].multiple ) 
					{
						case true:	//.... select multiple ....
							if ( !valeur["mini"] ) valeur["mini"]=1;
							if ( !valeur["maxi"] ) valeur["maxi"]=valeur["mini"];
							break;	
						case false:	//.... select unique ....
							valeur["mini"]=1;
							valeur["maxi"]=valeur["mini"];
							break;	
					}
					var nbr=0;
					var nom=formulaire.elements[no_element];
					for ( var n=0;n<nom.length;n++)
					{ 
						if ( nom[n].selected )
						{ 
							nbr++; 
						} 
					}
					if ( nbr < valeur["mini"] || nbr > valeur["maxi"] )
					{ 	
						retour+=SignalErreur(valeur,formulaire,no_element);   
					}
					break;
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ différents format
				case "date":	//~~ date ~~~~~~~~~~~~~~~~~~~~~ possible d'une date
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "adaptable facilement"
					var j,m,a,la,s;
					switch ( valeur["format"] ) 
					{
						case "jjmmaaaa":
							la=4;
							j=0;
							m=2;
							a=4;
							s=new Array();
							break;
						default:	
							//~~ jj/mm/aaaa par défaut
						case "jj/mm/aaaa":
							la=4;
							j=0;
							m=3;
							a=6;
							s=new Array(2,5);
							break;	
					}
					if ( formulaire.elements[no_element].value.length  != (la+s.length+4) )
					{	
						retour+=SignalErreur(valeur,formulaire,no_element);
						break;	
					}
					if ( valeur["separateur"] )
					{	
						for ( var n=0; n<s.length; n++ )
						{	
							if (formulaire.elements[no_element].value.charAt(s[n])!=valeur["separateur"] )
							{	
								retour+=SignalErreur(valeur,formulaire,no_element);
								break;	
							}	
						}	
					}
					j=Number(formulaire.elements[no_element].value.substring(j,2));
					m=Number(formulaire.elements[no_element].value.substring(m,m+2));
					a=Number(formulaire.elements[no_element].value.substring(a,a+la));
					if ( isNaN(j) || isNaN(m) || isNaN(a) || j<1 ||  m<1 || m>12 )
					{	
						retour+=SignalErreur(valeur,formulaire,no_element);
						break;	
					}
					var fm;
					switch (m)	
					{
						case 4:
						case 6:
						case 9:
						case 11:
							fm=30;
							break;
						case 2:
							if ( (a%4)==0 && ((a%100)!=0 || (a%400)==0) )
									{
										fm=29;
									}
							else	{
										fm=28;
									}
							break;
						default:
							fm=31;
							break;	
					}
					if ( j>fm )
					{	
						retour+=SignalErreur(valeur,formulaire,no_element);
						break;	
					}
					break;
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ n checkbox doivent 
				case "cocher":	//~~ checkbox ~~~~~~~~~~~~~~~~~~~~~   être cochés
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >= mini et <= maxi
					var nom=formulaire.elements[no_element].name;
					var nbc=0;
					for ( var n=0;n<formulaire[nom].length;n++ )
					{ 
						if ( formulaire[nom][n].checked ) 
						{
							nbc++;
						}
					}
					if ( nbc<valeur["mini"] || nbc>valeur["maxi"] )
					{ 	
						retour+=SignalErreur(valeur,formulaire,no_element);
						break;	
					}	
					break;
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ format ( minimaliste )
				case "mail":	//~~ mail ~~~~~~~~~~~~~~~~~~~~~ du 
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mail
					if ( !formulaire.elements[no_element].value.match
								("[-\./w]*@[/w]*\.[/w]*") )	// pas terrible ça !
					{
						retour+=SignalErreur(valeur,formulaire,no_element);
					}
					break;
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ une 
				case "nombre":	//~~ nombre ~~~~~~~~~~~~~~~~~~~~~ valeur
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >= mini et <= maxi
					if (isNaN(formulaire.elements[no_element].value))
					{ 	
						retour+=SignalErreur(valeur,formulaire,no_element);
						break;	
					}
					if (valeur["mini"])
					{	
						if (Number(formulaire.elements[no_element].value)<Number(valeur["mini"]))
						{ 	
							retour+=SignalErreur(valeur,formulaire,no_element);
							break;	
						}	
					}
					if (valeur["maxi"])
					{	
						if (Number(formulaire.elements[no_element].value)>Number(valeur["maxi"]))
						{ 	
							retour+=SignalErreur(valeur,formulaire,no_element);
							break;	
						}	
					}
					break;
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ champ non vide
				case "obligatoire":	//~~ obligatoire ~~~~~~~~~~~~~~~~~~~ et/ou longueur
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ saisie contrôlée
					if (   formulaire.elements[no_element].value.length<1 
						|| ( valeur["mini"] && formulaire.elements[no_element].value.length<Number(valeur["mini"]) )
						|| ( valeur["maxi"] && formulaire.elements[no_element].value.length>Number(valeur["maxi"]) ) ) 
					{	
						retour+=SignalErreur(valeur,formulaire,no_element);
					}
					break;
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ controle
				default:	//~~ pas de contrôle alors ? ~~~~~~~~~~~~~~~~~~~~~~~ non traité.
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ enfin pour le moment
					break;	
			}	
		}	
	}
	if (retour.length>0)
			{	
				alert ( retour );
				return false;	
			}
	else	{	
				return true;	
			}	
}
