function RLtrim(zone){	//## supprimer les espaces en début et en fin ##
	return zone.replace(/(^\s*)|(\s*$)/g,"");
}

function SignalErreur(z1,frm,z2){	//## signaler les erreurs ##
	erreurfond  = '#E9D6E0';
	erreurtexte = '#FFFFFF';
	
	frm.elements[z2].style.backgroundColor = erreurfond ; 
	frm.elements[z2].style.color = erreurtexte ; 

 frm.elements[z2].focus();
	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
			}
   // Couleurs par défaut
   bonfond = '#FFFFFF';
   bontexte = '#000000';
			formulaire.elements[no_element].style.backgroundColor = bonfond ; 
			formulaire.elements[no_element].style.color = bontexte ; 

			switch ( valeur["type"] ){				
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 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;
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Controle la validite d'un
				case "ctrlimg":	//~~ Vérifie la valeur d'un controle / images   formulaire pour eviter les msg
				//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ envoyer par un robot
					if (    formulaire.elements[no_element].value.length<1 
          || ( valeur["valctrl"] && formulaire.elements[no_element].value.toLowerCase() != valeur["valctrl"] ) ){	
						retour+=SignalErreur(valeur,formulaire,no_element);
					}
					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(/^[a-zA-Z\.0-9_-]+@[a-zA-Z0-9-]{2,}[.][a-zA-Z]{2,3}$/) ){
						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;	
	}	
}