
function autocheckByClass(formulaire , langue , options ) 
{ // uses the CSS class of form elements to determine type 

		/*
		USAGE : 
		Formulaire simple à tester si ca vous va, ca fait tout tout seul avec les styles !
		(pas de tableau, pas de javascript, le pied)
		
		
		c'est l'attribut "class" qui définit :
		NULLisEmpty => dans une boite deroulante si la valeur est NULL alors c'est comme si c'était vide !
		required => obligatoire
		blink  =>clignotte si erreur
		date => c'est une date
		email => c'est un email
		float => chiffre a virgule
		int => entier
		confirm_NomChamp => doit etre égal au contenu de NomChamp (confirmation de pass par exemple)
		requiredAtLeast_NomChamp => repetable plusieurs fois : pour qu'au moins un des champs soit rempli 
		requiredAtLeastOneOf_Nom => repetable plusieurs fois : pour qu'au moins un des champs ayant class="requiredAtLeastOneOf_Nom" soit rempli 
		requiredifchecked_NomCheckBox => champs obligatoire si la checkbox est cochée
		
		requiredIfFilled_NomChamp => champs obligatoire si le champ NomChamp est rempli
		
		greaterThan_NomChamp => doit etre plus grand que le champ NomChamp
		lengthMin_int => Min de caracteres
		lengthMax_int => Max de caracteres
		
		regExp_exp1 => Correspond a l'expression exp1 sinon erreur err1 paramétré comme ceci:
							<script>
								var exp1=/^0[1-68]([\.|\-|\s]+[0-9]{2}){4}$/ ;
								var regExp_exp1="Le champ \"#1#\" DOIT être au format : 02.02.02.02.02"
							</script>
							si regExp_exp1 n'est pas indiqué, un message par défaut est utilisé !
		
		exemple :
			<style>
				.error{
					background-color:#FF0000;
				}
				label {
					font: bold .7em arial, verdana, sans-serif;
					color: #000;
					padding-right: 5px;
					float :left;
					text-align:right;
					width:100px;
				}
				fieldset {border: 1px dotted #F00;padding: 5px;}
				legend  {
					color: #fff;
					background: #ffa20c;
					border: 1px solid #781351;
					padding: 2px 6px
				}
			</style>
			<script>
				var required_errormessage1_fr="Veuillez indiquer votre texte"
				var required_errormessage1_us="please fill this field"
			</script>
			<script language="JavaScript" src="/communsgen/js/FormCheck.js"></script>
			<form name="formulaire" onsubmit="var ObjVerif=new autocheckByClass(this); return ObjVerif.validate(this) ">
				<fieldset>
				<legend>formulaire à remplir</legend>
				<p>
					<label for="email">email (*)</label><input type="text" name="email" id="email" value="" class="required email blink required_errormessage1"  />
				</p>
				<p>
					<label for="emailtest">email Verif (*)</label><input type="text" name="emailtest" id="emailtest" value="" class="required email blink confirm_email confirm_info"  />
				</p>
				<p>
					<label for="info">date (*)</label><input type="text" name="info"  id="info" value="" class="required date"  />
				</p>
				<p>
					<label for="textarea">textarea (*)</label><textarea name="textarea" id="textarea" class="required blink " ></textarea>
				</p>
					<input type="submit" value="valider" name="valider">
				</fieldset>
			</form>



		Si on veut des messages d'erreurs perdonnalisés , on crée des variables JS :
		<script>
		    var required_errormessage1_fr="Veuillez indiquer votre texte"
		    var required_errormessage1_us="please fill this field"
		</script>
		
		et dans le class on ajoute
		required_errormessage1
		
		=>la langue sera geree par rapport a la langue passee en parametre de la classe dans le onSubmit
		avec : onsubmit="var ObjVerif=new autocheckByClass(this);ObjVerif.langue='us'; return ObjVerif.validate(this) "
		sinon on peut mettre directement 
		<script>
		    var required_errormessage1="Veuillez indiquer votre texte"
		</script>
		
		on peut faire de meme avec :
		<script>
		    var float_errormessage1="indiquer un nombre avec une virgule"
		</script> 
					
					
					
		=>options ; sous la forme: {noLabelNoAlert:1 , copyFormToField:'ContenuMail_InnerHTML'} donne des possiblités supplémentaires :
		
			noLabelNoAlert  : si =1 pas d'alert si erreur
			copyFormToField : si le navigateur est IE alors le contenu du formulaire est copié dans le champ indiqué
	
		*/
	
	if(typeof options != 'undefined') { this.options = options; } else { this.options = {}; }
	if(this.options.noLabelNoAlert) { this.noLabelNoAlert = this.options.noLabelNoAlert; } // si =1 pas d'alert si erreur
	if(this.options.copyFormToField) { this.copyFormToField = this.options.copyFormToField; } // si IE alors le contenu du formulaire est copié dans le champ indiqué
	if (typeof(langue)=="undefined")langue="fr"
	var errorMessage=""
	
	
	
	
	var Message=new Array()
	switch(langue.toLowerCase()){
				case "jp" :
					Message["fieldrequired"]="The \"#1#\" field cannot be left blank."
					Message["checkboxrequired"]="The \"#1#\" checkbox must be checked."
					Message["email"]="E&#12513;&#12540;&#12523;&#12450;&#12489;&#12524;&#12473;&#12364;&#27491;&#12375;&#12367;&#12354;&#12426;&#12414;&#12379;&#12435;&#12290;"
					Message["confirmation"]="The \"#1#\" field does not match the \"#2#\" field."
					Message["selectone"]="You must select one of the \"#1#\" options."
					Message["integer"]="The \"#1#\" field must contain a whole number."
					Message["float"]="The \"#1#\" field must contain number."
					Message["date"]="\"#1#\" &#12398;&#27396;&#12399;&#24517;&#12378;&#12372;&#35352;&#20837;&#12367;&#12384;&#12373;&#12356;."
					
					Message["dateinvalid"]="The date is invalid."
					Message["requiredatleast"]="&#26368;&#20302;&#65297;&#12388;&#12399;&#12372;&#35352;&#20837;&#12367;&#12384;&#12373;&#12356;"
					Message["requiredifchecked"]="You must fill the field \"#1#\" \nbecause you checked \"#2#\".";
					Message["requirediffilled"]="You must fill the field \"#1#\" \nbecause you filled \"#2#\".";
					
					Message["requiredatleastoneof"]="You must fill at least on of these fields.";
					Message["greaterthan"]="The field \"#1#\" must be greater than \"#2#\".";
					
					Message["lengthmin"]="The field \"#1#\" should be at least #2# character(s).\nThis field actually has #3# character(s).";
					Message["lengthmax"]="The field \"#1#\" should be max #2# character(s).\nThis field actually has #3# character(s).";
					
					Message["lengthequals"]="The field \"#1#\" should be #2# character(s).\nThis field actually has #3# character(s).";
					
					Message["regexp"]="The field \"#1#\" does not meet the required format.";
					
					break;
				case "us" :
				case "gb" :
				case "en" :
				case "uk" :
					Message["fieldrequired"]="The \"#1#\" field cannot be left blank."
					Message["checkboxrequired"]="The \"#1#\" checkbox must be checked."
					Message["email"]="The email is not correct !"
					Message["confirmation"]="The \"#1#\" field does not match the \"#2#\" field."
					Message["selectone"]="You must select one of the \"#1#\" options."
					Message["integer"]="The \"#1#\" field must contain a whole number."
					Message["float"]="The \"#1#\" field must contain number."
					Message["date"]="The \"#1#\" field must be a date like DD/MM/YYYY."
					Message["dateinvalid"]="The date is invalid."
					Message["requiredatleast"]="At least one of this fields must filled."
					Message["requiredifchecked"]="You must fill the field \"#1#\" \nbecause you checked \"#2#\".";
					Message["requirediffilled"]="You must fill the field \"#1#\" \nbecause you filled \"#2#\".";
					
					
					Message["requiredatleastoneof"]="You must fill at least on of these fields.";
					Message["greaterthan"]="The field \"#1#\" must be greater than \"#2#\".";
					Message["lengthmin"]="The field \"#1#\" should be at least #2# character(s).\nThis field actually has #3# character(s).";
					Message["lengthmax"]="The field \"#1#\" should be max #2# character(s).\nThis field actually has #3# character(s).";
					Message["lengthequals"]="The field \"#1#\" should be #2# character(s).\nThis field actually has #3# character(s).";
					
					Message["regexp"]="The field \"#1#\" does not meet the required format.";
					
					break;
					
				case "it" :
	
					Message["fieldrequired"]="Il campo \"#1#\" non è compilato.";
					Message["checkboxrequired"]="La casella \"#1#\" deve essere spuntata.";
					Message["email"]="L'email non è corretto!";
					Message["confirmation"]="Il campo \"#1#\" non corrisponde al campo #2#.";
					Message["selectone"]="Dovete selezionare una delle opzioni di \"#1#\".";
					Message["integer"]="Il campo \"#1#\" deve contenere un numero intero senza decimali.";
					Message["float"]="Il campo \"#1#\" deve essere un numero.";
					Message["date"]="Il campo \"#1#\" deve essere al formato GG/MM/AAAA.";
					Message["dateinvalid"]="La data non è valida";
					Message["requiredatleast"]="Dovete compilare almeno uno di questi campi";
					Message["requiredifchecked"]="Avete spuntato \"#2#\"\n dovete compilare il campo \"#1#\".";
					Message["requirediffilled"]="You must fill the field \"#1#\" \nbecause you filled \"#2#\".";
					
					
					
					Message["requiredatleastoneof"]="Dovete compilare uno dei campi";
					Message["greaterthan"]="Il valore del campo \"#1#\" deve essere superiore a  \"#2#\".";
					
					Message["lengthmin"]="Il valore del campo \"#1#\" deve contenere almeno #2# caratteri.\nQuesto campo contiene attualmente#3# caratteri." ;
					
					
					Message["lengthmax"]="Il valore del campo \"#1#\" deve contenere al massimo #2# caratteri.\nQuesto campo contiene attualmente#3# caratteri." ;
					Message["lengthequals"]="Il valore del campo \"#1#\" deve contenere #2# caratteri.\nQuesto campo contiene attualmente#3# caratteri." ;
					
					Message["regexp"]="The field \"#1#\" does not meet the required format.";
					
					
					
					break;
					
				default:
					Message["fieldrequired"]="Le champ \"#1#\" n'est pas rempli."
					Message["checkboxrequired"]="La case \"#1#\" doit être cochée."
					Message["email"]="L'email n'est pas correct !"
					Message["confirmation"]="Le champ \"#1#\" ne correspond pas au champ \"#2#\"."
					Message["selectone"]="Vous devez sélectionner une des options de \"#1#\"."
					Message["integer"]="Le champ \"#1#\" doit etre un nombre entier sans décimales."
					Message["float"]="Le champ \"#1#\" doit etre un nombre."
					Message["date"]="Le champ \"#1#\" doit etre au format JJ/MM/AAAA."
					Message["dateinvalid"]="La date est invalide."
					Message["requiredatleast"]="Au moins un de ces champs doit etre rempli."
					Message["requiredifchecked"]="Vous avez coché \"#2#\"\n vous devez remplir le champ \"#1#\".";
					Message["requirediffilled"]="Vous devez remplir le champ \"#1#\"\nCar vous avez renseigné \"#2#\"\n.";
					
					
					Message["requiredatleastoneof"]="Vous devez remplir l'un des champs.";
					Message["greaterthan"]="La valeur du champ \"#1#\" doit etre plus grande que \"#2#\".";
					
					Message["lengthmin"]="La valeur du champ \"#1#\" doit contenir au moins #2# caractère(s).\nCe champ contient actuellement #3# charactère(s).";
					Message["lengthmax"]="La valeur du champ \"#1#\" doit contenir maximum #2# caractère(s).\nCe champ contient actuellement #3# charactère(s).";
					
					Message["lengthequals"]="La valeur du champ \"#1#\" doit contenir #2# caractère(s).\nCe champ contient actuellement #3# charactère(s).";
					
					Message["regexp"]="La valeur du champ \"#1#\" ne correspond pas au format attendu.";
					
					break;
	}



	
	this.getLangMessage=function(elem,classname ,typeInfo, params){
		var paramsArray=params.split("|")
		var retour=""
		if(elem.className){
			//on regarde si une variable javascript correspond a classname_nomvar_lang ou classname_nomvar 
			var re = new RegExp("(^|\\s+)"+ classname +"_\\w+($|\\s+)" ,"gi" );
			var tempo=(elem.className.match( re )+"").replace("\t","").replace(" ","").replace(" ","").replace(" ","").replace(" ","")
			if (tempo && tempo!="null"  )	{
				//alert(  eval("typeof("+ tempo +"_"+langue+")")  )
				if(eval("typeof("+ tempo +"_"+langue+")")!="undefined"){
					retour=eval(tempo+"_"+langue)
				}else if(eval("typeof("+ tempo +")")!="undefined"){
					retour=eval(tempo)
				}
			}
		}
		if (retour=="")retour=Message[typeInfo]
		
		for(var i= 0;  i < paramsArray.length; i++){
			retour=retour.replace("#"+ (i+1) +"#" , paramsArray[i] )
		}
		return retour
	}
		
	this.getElementsByClass=function (searchClass,node,tag) {
		var classElements = new Array();
		if ( node == null )
			node = document;
		if ( tag == null )
			tag = '*';
		var els = node.getElementsByTagName(tag);
		var elsLen = els.length;
		var pattern = new RegExp('(^|\\s)'+searchClass+'(\\s|$)' , "gi");
		for (i = 0, j = 0; i < elsLen; i++) {
			if ( pattern.test(els[i].className) ) {
				classElements[j] = els[i];
				j++;
			}
		}
		return classElements;
	}
		
	this.requireValue = function(fld)
	{ // Le champ doit etre remplis
		//alert(fld.name);
	  if(fld.disabled) return true;
	  if(!fld.value.length ||fld.value.length==0 )
	  { errorMessage= this.getLangMessage(fld,"required", "fieldrequired", this.fieldname(fld)) ; return false; }
	  return true;
	}
	
	this.getLabel=function (fld){
		if(fld.name && document.getElementsByTagName)
		{
			for(var i= 0, lbl= document.getElementsByTagName("LABEL"); i < lbl.length; i++)
			  if(lbl[i].htmlFor==fld.name) return lbl[i].nodeValue||lbl[i].textContent||lbl[i].innerText;
			for(var i= 0, lbl= document.getElementsByTagName("label"); i < lbl.length; i++)
			  if(lbl[i].htmlFor==fld.name) return lbl[i].nodeValue||lbl[i].textContent||lbl[i].innerText;
			for(var i= 0, lbl= document.getElementsByTagName("Label"); i < lbl.length; i++)
			  if(lbl[i].htmlFor==fld.name) return lbl[i].nodeValue||lbl[i].textContent||lbl[i].innerText;
		}
		return ""
	}
	
	this.fieldname=function (fld)
	{ // Récupere le texte du label du champ ou le nom du champ
	  return ( (tempo=this.getLabel(fld))=="" )?fld.name :tempo;
	}
	
	this.requireChecked=function (fld)
	{ // La checkBox doit etre cochée
	  if(fld.disabled) return true;
	  if(!fld.checked)
	  { errorMessage=this.getLangMessage(fld,"required","checkboxrequired", this.fieldname(fld)) ; return false; }
	  return true;
	}
	
	
	this.checkEmail=function (fld)
	{ // Verif mail
	  if(!fld.value.length||fld.disabled) return true; // Si c'est vide on s'en fou
	  var regex = /^[a-zA-Z0-9._-]+@([a-zA-Z0-9.-]+\.)+[a-zA-Z0-9.-]{2,4}$/;	  
	  retour= regex.test(fld.value) && fld.value.indexOf("..") == -1 ;  
	  if(!retour)errorMessage= this.getLangMessage(fld,"email","email", this.fieldname(fld))
	  return retour
	}


	this.fixDate=function (fld)
	{ // verif date
	  if(!fld.value.length||fld.disabled) return true; // Si c'est vide on s'en fou
	  var regex = /^([\d]{1,2})\/([\d]{1,2})\/([\d]{4})$/;	  
	  
	  
	 retour="" 
	 var m = regex.exec(fld.value);
	  if (m == null) {
	  	errorMessage=this.getLangMessage(fld,"date","date", this.fieldname(fld))
	    return false;
	  } else {
	    if(m.length==4 && parseInt(m[1])<=31 && parseInt(m[2])<=12){
	    	var dt= new Date(m[2]+"/"+m[1]+"/"+m[3])
	    	if ( dt.getMonth()+1!=m[2] || dt.getDate()!=m[1] || dt.getFullYear()!=m[3]  ){
	    		errorMessage=this.getLangMessage(fld,"dateinvalid","dateinvalid", this.fieldname(fld))
	    		return false;	
	    	}
	      	retour=("00"+m[1]).substring( ("00"+m[1]).length-2 ) +"/"+  ("00"+m[2]).substring( ("00"+m[2]).length-2 ) +"/"+ ("0000"+m[3]).substring( ("0000"+m[3]).length-4 )
	    }else{
			errorMessage=this.getLangMessage(fld,"date","date", this.fieldname(fld))
	    	return false;	    
		}	
	  }
	  fld.value=retour
	  return true;
	}

	this.fixInt=function (fld)
	{ // champ entier
	  if(!fld.value.length||fld.disabled) return true; // Si c'est vide on s'en fou
	  var val= fld.value;
	  val= val.replace(new RegExp(",","g"),".");
	  val2= parseInt(val);
	  if(isNaN(val2) || val.indexOf(".")>0 || isNaN(val) )
	  { // parse error 
	    errorMessage=this.getLangMessage(fld,"integer","integer", this.fieldname(fld) )
	    return false;
	  }
	  fld.value= val.replace(new RegExp(",","g"),".");
	  return true;
	}
	this.fixFloat=function (fld)
	{ // champ float
	  if(!fld.value.length||fld.disabled) return true; // blank fields are the domain of requireValue 
	  var val= fld.value;
	  val= val.replace(new RegExp(",","g"),".");
	  
	  val2= parseFloat(fld.value);
	  if(isNaN(val2) || isNaN(val) )
	  { // parse error 
	    errorMessage= this.getLangMessage(fld,"float","float", this.fieldname(fld) );
	    return false;
	  }
	  fld.value=val.replace(new RegExp(",","g"),".");
	  return true;
	}
	
	this.requireConfirmation=function (fld,confirmfld)
	{ // Les 2 champs doivent etre identiques
	  if(fld.disabled) return true;
	  if(fld.value != confirmfld.value){ 
	  	errorMessage=this.getLangMessage(fld,"confirmation","confirmation", this.fieldname(fld)+"|"+this.fieldname(confirmfld) )    ; 
	  	return false; 
	  }
	  return true;
	}
	
	
	this.requireIfChecked=function (fld,checkfld)
	{ // Les 2 champs doivent etre identiques
	  if(fld.disabled) return true;
	  
	  
	  bIsFilled=false
	  if(fld.type == "checkbox")bIsFilled=fld.checked
	  if (fld.type.substring(0,3) == "sel" )bIsFilled=!(fld.selectedIndex == -1 || fld.options[fld.selectedIndex].value=="" )
	  if(fld.type == "text" || fld.type == "password" || fld.type == "textarea")bIsFilled=(fld.value !="")
	  if(fld.type == "checkbox")bIsFilled=checkfld.checked
	  
	  if(checkfld.checked && !bIsFilled){ 
	  	errorMessage=this.getLangMessage(fld,"requiredifchecked","requiredifchecked", this.fieldname(fld)+"|"+this.fieldname(checkfld) )    ; 
	  	return false; 
	  }
	  return true;
	}
	
	
	this.requireRadio=function(radios)
	{ // au moins un radio doit etre coché
	  if(!radios.length) return true; // invalid parameter
	  var visible= false, enabled= false;
	  for(var i= 0; i < radios.length; i++)
	  {
	    if(!enabled) enabled= !radios[i].disabled;
	    if(radios[i].checked) return true;
	    else if(typeof(radios[i].offsetWidth) == "undefined" || radios[i].offsetWidth > 0) visible= true;
	  }
	  if(!visible||!enabled) return true; // no visible/enabled options in this group
	  errorMessage=this.getLangMessage(radios,"required","selectone", this.fieldname(radios[0]) );
	  return false;
	}


	this.isMemberOf=function (elem,classname)
	{ // elem contient-il le classname dans son attribut class  (style) ?
	  if(!elem.className)
	    return false
	  else if(elem.className.toLowerCase() == classname.toLowerCase())
	    return true;
	  else if(elem.className.indexOf(" ") > -1)
	  { // multiple class names; use split, if avail 
	    var re = new RegExp("(^|\\s+)"+ classname +"($|\\s+)" ,"gi" );
	    return elem.className.match( re )
	  }
	  return false;
	}


	this.formInscriptionBlink=function ( champ, Compteur ){ 
		
		//var re = new RegExp("(^|\\s+)error($|\\s+)" ,"gi" );
		
		//var tempo=champ.className.match( re )+""
		
		//if (!ele.className)return false;
		//return (new RegExp('(\\s|^)'+cls+'(\\s|$)')).test(ele.className);
		//if(champ.className.match( /(^|\s+)error($|\s+)/g )+""=="null" ){
		if(!champ.className)champ.className = "";
		if(!champ.className || !(new RegExp('(\\s|^)error(\\s|$)')).test(champ.className) ){
			champ.className += " error" 
		}else{
			champ.className=champ.className.replace(/(^|\s+)error($|\s+)/gi,""); 
		}
		//window.status="Compteur0="+Compteur
		if (Compteur-->0 && champ.className.toLowerCase().indexOf("blink")>-1){
			var me=this 
			var t1=setTimeout(function(){ me.formInscriptionBlink( champ, Compteur );}, 500 )
			//window.status="Compteur1="+Compteur
		}; 
	}

	this.checkClass=function (el)
		{ 
			// validation des champs en fonction de la class attribuée
			
		  if(el.type == "text" || el.type == "password" || el.type == "textarea")
		  { // champs text
		  	
		  	if(this.isMemberOf(el,"required") && !this.requireValue(el)) return false;
		    
		    if(this.isMemberOf(el,"requiredifchecked_\\w+") ){
				var regex = new RegExp("(^|\\s+)requiredifchecked_(\\w+)($|\\s+)","gi"  );
				var m = regex.exec(el.className);
				if (m == null || !document.getElementsByName(m[2]) || !this.requireIfChecked(el,document.getElementsByName(m[2])[0] )) return false;
		   	}
		    
		    if(this.isMemberOf(el,"date") && !this.fixDate(el)) return false;
		    if(this.isMemberOf(el,"int") && !this.fixInt(el)) return false;
		    if(this.isMemberOf(el,"float") && !this.fixFloat(el)) return false;
		    if(this.isMemberOf(el,"email") && !this.checkEmail(el)) return false;
		    if(this.isMemberOf(el,"confirm_\\w+") ){
				var regex = new RegExp("(^|\\s+)confirm_(\\w+)($|\\s+)","gi"  );
				var m = regex.exec(el.className);
				if (m == null || !document.getElementsByName(m[2]) || !this.requireConfirmation(el,document.getElementsByName(m[2])[0] )) return false;
		   	}
		   	
		   	
		   	//requirediffilled_NomChamp
		   	if(this.isMemberOf(el,"requirediffilled_\\w+") ){
				var regex = new RegExp("(^|\\s+)requirediffilled_(\\w+)($|\\s+)","gi"  );
				var m = regex.exec(el.className);
				//alert("m=" + m )
				if (m == null || !document.getElementsByName(m[2]) || !this.requiredIfFilled(el,document.getElementsByName(m[2])[0] )) return false;
		   	}
		   	
		   	if(el.value=="" && this.isMemberOf(el,"requiredatleast_\\w+") ){
				if (!this.requiredAtLeast(el) ) return false;
		   	}
		   	
		   	if(el.value!="" && this.isMemberOf(el,"greaterThan_\\w+") ){   
		   		if (!this.greaterThan(el) ) return false;
		   	}
		   	
		   	
		   	
		   	if(el.value!="" && this.isMemberOf(el,"lengthMax_\\w+") ){   
		   		if (!this.lengthMax(el) ) return false;
		   	}
		   	
		   	if(el.value!="" && this.isMemberOf(el,"lengthmin_\\w+") ){   
		   		if (!this.lengthMin(el) ) return false;
		   	}
		   
		   	if(el.value!="" && this.isMemberOf(el,"lengthequals_\\w+") ){   
		   		if (!this.lengthEquals(el) ) return false;
		   	}
		    
		   
		   	if(el.value=="" && this.isMemberOf(el,"requiredAtLeastOneOf_\\w+") ){
				if (!this.requiredAtLeastOneOf(el) ) return false;
		   	}
		   
		   	if(el.value!="" && this.isMemberOf(el,"regExp_\\w+") ){
				if (!this.regExp(el) ) return false;
		   	}
		   	
		  } //  select et select-multiple 
		  else if(el.type == "checkbox" ){
		  	
		   if( this.isMemberOf(el,"required") && !this.requireChecked(el)) return false;
		   
		   if(!el.checked && this.isMemberOf(el,"requiredAtLeastOneOf_\\w+") ){
				if (!this.requiredAtLeastOneOf(el) ) return false;
		   }
		  }  
		    
		  else if(el.type.substring(0,3) == "sel" ){
		  	
			   if( this.isMemberOf(el,"required") && (el.selectedIndex == -1 || el.options[el.selectedIndex].value=="" || (this.isMemberOf(el,"NULLisEmpty") && el.options[el.selectedIndex].value.toLowerCase()=="null" ) )) {
			    		errorMessage=this.getLangMessage(el,"fieldrequired","fieldrequired", this.fieldname(el) )    ; 
			    		return false;
			    }
			 if(this.isMemberOf(el,"requiredifchecked_\\w+") ){
				var regex = new RegExp("(^|\\s+)requiredifchecked_(\\w+)($|\\s+)","gi"  );
				var m = regex.exec(el.className);
				if (m == null || !document.getElementsByName(m[2]) || !this.requireIfChecked(el,document.getElementsByName(m[2])[0] )) return false;
		   	 }
		   	 if(this.isMemberOf(el,"requirediffilled_\\w+") ){
				var regex = new RegExp("(^|\\s+)requirediffilled_(\\w+)($|\\s+)","gi"  );
				var m = regex.exec(el.className);
				//alert("m=" + m )
				if (m == null || !document.getElementsByName(m[2]) || !this.requiredIfFilled(el,document.getElementsByName(m[2])[0] )) return false;
		   	}
		   }
		  else if(el.type == "radio" ){
		  		if( this.isMemberOf(el,"required") &&  !this.requireRadio(formulaire[el.name])) return false;
		  }
		  
		  
		  return true;
		}

	this.requiredAtLeast=function(el){
				var regex = new RegExp("(^|\\s+)requiredatleast_(\\w+)($|\\s+)","gi"  );
				var m = regex.exec(el.className);
				var ListeChamps=""
				var bBool=false
				if(m!==null){
					for(var i=2 ; i<=m.length ; i+=3){
						if (document.getElementsByName(m[i]) && document.getElementsByName(m[i])[0].value!=""){bBool=true}
						ListeChamps+=m[i]+"|"
					}
					if(!bBool){
						errorMessage=this.getLangMessage(el,"requiredatleast","requiredatleast", "" )    ; 
						ListeChampsArray=ListeChamps.split("|")
						for(var i=0 ; i<ListeChampsArray.length ; i++){
							if(ListeChampsArray[i]!=""){
								this.formInscriptionBlink( document.getElementsByName(ListeChampsArray[i])[0] , 5)
							}
						}
	  					return false; 
					}
					return true; 
				}
	}
	//requiredIfFilled
	this.requiredIfFilled=function (fld,checkfld)  // fld : element en cours de test ; checkfld : champs que l'on teste si remplis
	{ // Les 2 champs doivent etre identiques
	  if(fld.disabled) return true;
	  bIsFilled=false
	  if(fld.type == "checkbox")bIsFilled=fld.checked
	  if (fld.type.substring(0,3) == "sel" )bIsFilled=!(fld.selectedIndex == -1 || fld.options[fld.selectedIndex].value=="" )
	  if(fld.type == "text" || fld.type == "password" || fld.type == "textarea")bIsFilled=(fld.value !="")
	  if(fld.type == "checkbox")bIsFilled=checkfld.value!=""
	 // alert( "["+ checkfld.value +"]"   + (!bIsFilled) )
	  if(checkfld.value!="" && !bIsFilled){ 
	  	errorMessage=this.getLangMessage(fld,"requirediffilled","requirediffilled", this.fieldname(fld)+"|"+this.fieldname(checkfld) )    ; 
	  	return false; 
	  }
	  return true;
	}
	
	
	this.dateToInt=function(d) {
		return parseInt(""+d.split("/" )[2]+d.split("/" )[1]+d.split("/" )[0], 10);
		
	}


	this.regExp=function(el){
				var regex = new RegExp("(^|\\s+)regExp_(\\w+)($|\\s+)","gi"  );
				var m = regex.exec(el.className);
				
				if(m!==null){
					eval( "var myRegExp="+ m[2] +";" )
					if( !el.value.match(myRegExp) ){
						
						errorMessage=this.getLangMessage(el,"regexp","regexp", this.fieldname(el)   )    ; 
	  					return false; 
					}
				}
				return true
	}

	this.lengthMin=function(el){
				var regex = new RegExp("(^|\\s+)lengthmin_(\\w+)($|\\s+)","gi"  );
				var m = regex.exec(el.className);
				
				if(m!==null){
					if(el.value.length < parseInt(m[2])){
						errorMessage=this.getLangMessage(el,"lengthmin","lengthmin", this.fieldname(el)+"|"+ m[2]+"|"+ el.value.length    )    ; 
	  					return false; 
					}
				}
				return true
	}
	this.lengthMax=function(el){
				var regex = new RegExp("(^|\\s+)lengthmax_(\\w+)($|\\s+)","gi"  );
				var m = regex.exec(el.className);
				if(m!==null){
					if(el.value.length > parseInt(m[2])){
						errorMessage=this.getLangMessage(el,"lengthmax","lengthmax", this.fieldname(el)+"|"+ m[2]+"|"+ el.value.length   )    ; 
	  					return false; 
					}
				}
				return true
	}
	this.lengthEquals=function(el){
				var regex = new RegExp("(^|\\s+)lengthequals_(\\w+)($|\\s+)","gi"  );
				var m = regex.exec(el.className);
				if(m!==null){
					if(el.value.length != parseInt(m[2])){
						errorMessage=this.getLangMessage(el,"lengthequals","lengthequals", this.fieldname(el)+"|"+ m[2]+"|"+ el.value.length    )    ; 
	  					return false; 
					}
				}
				return true
	}
	
	this.greaterThan=function(el){
				//est ce que c'est un champ date ?
				var isChampDate=false;
				var regex = new RegExp("(^|\\s+)date($|\\s+)","gi"  );
				var m = regex.exec(el.className);
				if(m!==null){
					
					isChampDate=(m[0].replace(/^\s+/g,'').replace(/\s+$/g,'') ==="date")
					//alert("m[0]="+ m[0])
					//alert("isChampDate="+isChampDate)
				}
				
				var regex = new RegExp("(^|\\s+)greaterthan_(\\w+)($|\\s+)","gi"  );
				var m = regex.exec(el.className);
				var ListeChamps=""
				var bBool=false
				
				if(m!==null){
					for(var i=2 ; i<=m.length ; i+=3){
						
						if (document.getElementsByName(m[i]) 
								&& ((isChampDate)?this.dateToInt(document.getElementsByName(m[i])[0].value):document.getElementsByName(m[i])[0].value)<((isChampDate)?this.dateToInt(el.value):el.value)
							){
								bBool=true
						}
					}
					
					if(!bBool){
						errorMessage=this.getLangMessage(el,"greaterthan","greaterthan", this.fieldname(el)+"|"+ this.fieldname(document.getElementsByName(m[2])[0])    )    ; 
						//this.formInscriptionBlink( document.getElementsByName(m[2])[0] , 5)
	  					return false; 
					}
					return true; 
				}
	}
	
	
	
	this.requiredAtLeastOneOf=function(el){
			var regex = new RegExp("(^|\\s+)requiredAtLeastOneOf_(\\w+)($|\\s+)","gi"  );
			var m = regex.exec(el.className);
			for(var i=2 ; i<=m.length ; i+=3){
				var elements=this.getElementsByClass("requiredAtLeastOneOf_"+ m[i])
				var bIsFilled=false
					for(var n=0 ; n<elements.length ; n++){
						fld=elements[n]
						if(fld.type.substring(0,3) == "sel" )bIsFilled=!(fld.selectedIndex == -1 || fld.options[fld.selectedIndex].value=="" )
						if(fld.type == "text" || fld.type == "password" || fld.type == "textarea")bIsFilled=(fld.value !="")
						if(fld.type == "checkbox" || el.type == "radio" )bIsFilled=fld.checked
						if(bIsFilled)return true
					}
			}
			
			errorMessage=this.getLangMessage(el,"requiredatleastoneof","requiredatleastoneof", "" )    ; 
			
			return false;
		
	}
	
	
	
	this.validate=function(formulaire){
		if (this.copyFormToField && this.copyFormToField!="" && formulaire[this.copyFormToField]){
			var isIE  = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;
			if (isIE) {
				/*
				on ne le fait que sur IE puisque c'est le seul qui renvoi le formulaire rempli
				Les autres envoient le formulaire vierge original
				*/
				try{
					formulaire[this.copyFormToField].value=formulaire.innerHTML;
				}
				catch(e){}
			}
		}
		status=""
			for(var index= 0; index < formulaire.elements.length; index++){
				//on efface les vieilles erreurs
				var el= formulaire.elements[index];
				el.className=el.className.replace(/(^|\s+)error($|\s+)/,""); 
			}
		  for(var index= 0; index < formulaire.elements.length; index++)
		  {
		    var el= formulaire.elements[index];
		   
		    if(!el.type) continue;
		   // if(el.type == "radio" && !requireRadio(formulaire[el.name]))
		   // { this.formInscriptionBlink( el, 5 );status=errorMessage;alert(errorMessage); formulaire.elements[index].focus(); return false; }
		   // else 
		  //  alert(formulaire.elements[index].name +"---"+ this.checkClass(formulaire.elements[index]) )
		   if(!this.checkClass(formulaire.elements[index])) 
		    { 
		    	
		    		if((el.type == "radio" || el.type == "checkbox") && formulaire[el.name].length){
		    			for(var i= 0; i < formulaire[el.name].length; i++)
						  {
						  	this.formInscriptionBlink( formulaire[el.name][i], 5 );
						  }
		    			
		    		}else{
		    			this.formInscriptionBlink( el, 5 );
		    		}
		    		status=errorMessage;
		    		if(this.getLabel(el)=="" && this.noLabelNoAlert){
		    			//this.fieldname(fld)
		    			//this.getLabel(el))==""
		    			//pas d'alert !
		    		}else{
		    			alert(errorMessage); 
		    		}
		    		try
					  {
					 	formulaire.elements[index].focus(); 
					  }
					catch(err)
					  {
					  //Handle errors here
					  }
		    		
		    		return false; 
		   	}
		  }
		  /*
		  ON DESACTIVE LA DESACTIVATION DU SUBMIT CAR JAMAIS REACTIVE ENSUITE
		  for(var index= 0; index < formulaire.elements.length; index++)
		    if(formulaire.elements[index].type == "submit") formulaire.elements[index].disabled= true;
		  */
		  return true;
		}
	
	

	
}

function addLoadEvent (func) {
 var oldonload = window.onload;
	  if (typeof window.onload != 'function') {
	    window.onload = func;
	  } else {
	    window.onload = function() {
	      if (oldonload) {//avoid a runtime error in IE 7
	        oldonload();
	      }
	      func();
	    }
	  }
		return true
}



/*
 * (c)2006 Jesse Skinner/Dean Edwards/Matthias Miller/John Resig
 * Special thanks to Dan Webb's domready.js Prototype extension
 * and Simon Willison's addLoadEvent
 *
 * For more info, see:
 * http://www.thefutureoftheweb.com/blog/adddomloadevent
 * http://dean.edwards.name/weblog/2006/06/again/
 * http://www.vivabit.com/bollocks/2006/06/21/a-dom-ready-extension-for-prototype
 * http://simon.incutio.com/archive/2004/05/26/addLoadEvent
 * 
 *
 * To use: call addDOMLoadEvent one or more times with functions, ie:
 *
 *    function something() {
 *       // do something
 *    }
 *    addDOMLoadEvent(something);
 *
 *    addDOMLoadEvent(function() {
 *        // do other stuff
 *    });
 *
 */
 
addDOMLoadEvent = (function(){
    // create event function stack
    var load_events = [],
        load_timer,
        script,
        done,
        exec,
        old_onload,
        init = function () {
            done = true;

            // kill the timer
            clearInterval(load_timer);

            // execute each function in the stack in the order they were added
            while (exec = load_events.shift())
                exec();

            if (script) script.onreadystatechange = '';
        };

    return function (func) {
        // if the init function was already ran, just run this function now and stop
        if (done) return func();

        if (!load_events[0]) {
            // for Mozilla/Opera9
            if (document.addEventListener)
                document.addEventListener("DOMContentLoaded", init, false);

            // for Internet Explorer
            /*@cc_on @*/
            /*@if (@_win32)
                document.write("<script id=__ie_onload defer src=//0><\/scr"+"ipt>");
                script = document.getElementById("__ie_onload");
                script.onreadystatechange = function() {
                    if (this.readyState == "complete")
                        init(); // call the onload handler
                };
            /*@end @*/

            // for Safari
            if (/WebKit/i.test(navigator.userAgent)) { // sniff
                load_timer = setInterval(function() {
                    if (/loaded|complete/.test(document.readyState))
                        init(); // call the onload handler
                }, 10);
            }

            // for other browsers set the window.onload, but also execute the old window.onload
            old_onload = window.onload;
            window.onload = function() {
                init();
                if (old_onload) old_onload();
            };
        }

        load_events.push(func);
    }
})();

