/*
Script de validation automatique de formulaires 
Par Eric GUYADER-BERGER - 2007
Sur une idée de Christophe Porteneuve.

Réutilisable à vos risques et périls !
*/

var messages=$H();
messages['fr']=$H({oblig:'Le champ $champ est obligatoire',
									invalide:'La valeur du champ $champ ne convient pas',
									format:'Le format du champ $champ ne convient pas',
									type:'Le type de données du champ $champ ne convient pas',
									mdp_diff:'$champ et sa confirmation doivent être identiques'
									});
messages['en']=$H({oblig:'$champ must be filled',
									invalide:'$champ value is not valid',
									format:'$champ format is not valid',
									type:'$champ value type is not correct',
									mdp_diff:'$champ and his confirmation must be equal'
									});

//Expressions régulières de validation de contenu
RE_BLANK=/^\s*$/;							
RE_TYPE_DATE=/([0-9]{1,2})\/([0-9]{1,2})\/([0-9]{4,4})/;			
				
//Expressions régulières de tests sur le ID de champs
RE_CHAMP_AUTO=/^[^-^_^:]+(-(.*)-)(_Obl)?(:(.*):)?(_(Dbl|Int|Date(eur|usa)[JMA]?))?(_(.+)_)?(_MD5)?$/;
RE_NOM_VALIDATION=/\-(.*)\-/;
RE_OBLIG=/_Obl/;
RE_DATE=/_Date/;
RE_REGEXP=/:(.*):/;
RE_CHAMP_TYPE=/_(Dbl|Int|Date)/;

function dateValide(annee,mois,jour){
				var dtOk=true;
				// Valide la date dont les éléments sont passés en arguments
  			var dateRecomposee=new Date(annee,mois-1,jour);
				if(dateRecomposee.getFullYear()!=annee || dateRecomposee.getMonth()!=mois-1 || dateRecomposee.getDate()!=jour){
   				dtOk=false;
  			}
  			return dtOk;
  		}

function bindEvents(e){
	Element.observe($(frmId),'submit',validerForm,false);
}

function completerMessage(chp,lg,type){
	var re_champ=/\$champ/;
	return (messages[lg][type]).replace(re_champ,"'"+chp+"'")+"\n";
}

function verifieTypeValeur(t,v){
	switch(t){
		case 'Int':
			valeurNum=parseInt(v,10);
			if(valeurNum!=String(v)){
				return false;
			}
			break;
		case 'Dbl':
			valeurNum=parseFloat(v.replace(',','.'));
			if(valeurNum!=String(v.replace(',','.'))){
				return false;
			}
			break;
		case 'Dateeur':
			var j=v.match(RE_TYPE_DATE)[1];
			var m=v.match(RE_TYPE_DATE)[2];
			var a=v.match(RE_TYPE_DATE)[3];
			return dateValide(a,m,j);
			break;
			
		case 'Dateusa':
			var j=v.match(RE_TYPE_DATE)[2];
			var m=v.match(RE_TYPE_DATE)[1];
			var a=v.match(RE_TYPE_DATE)[3];
			return dateValide(a,m,j);
			break;
	}
	return true;
}

function validerForm(e){
	//Autre approche : constituer un tableau associatif des champs :
	//champs[Nom de validation]['valeur']=valeur
	//champs[Nom de validation]['obligatoire']=(true|false);
	//champs[Nom de validation]['nature']=(str|int|dbl|date);
	//champs[Nom de validation]['regexp']='regexp valide';
	//On validera ensuite ce tableau
	
	var formElt=$(frmId);
	var champs=$H();
	var pwdMd5=[];
		
	//Parcours de tous les contrôles du formulaire
	for(var i=0;i<formElt.elements.length;++i){
		var elt=$(formElt.elements[i]);
		if(elt.id.match(RE_CHAMP_AUTO)){
  		switch(elt.type){
  			case 'text': case 'textarea':
  				//Un champ texte peut être un vrai texte ou une date...
  				if(!elt.id.match(RE_DATE)){
  					//Pas une date
  					var key=elt.id.match(RE_CHAMP_AUTO)[2];
  					var val=$F(elt);
  					champs[key]=$H();
  					champs[key]['valeur']=val;
  					champs[key]['obligatoire']=elt.id.match(RE_OBLIG);
  					champs[key]['nature']=(elt.id.match(RE_CHAMP_TYPE))?elt.id.match(RE_CHAMP_TYPE)[1]:'str';
  					champs[key]['regexp']=(elt.id.match(RE_REGEXP))?elt.id.match(RE_REGEXP)[1] : null;
						champs[key]['valeur_bis']=champs[key]['valeur'];
  				}else{
  					//Une date
  					//alert('Date :'+elt.name);
						var key=elt.id.match(RE_CHAMP_AUTO)[2];
  					var val=$F(elt);
  					champs[key]=$H();
  					champs[key]['valeur']=val;
  					champs[key]['obligatoire']=elt.id.match(RE_OBLIG);
  					champs[key]['nature']=elt.id.match(RE_CHAMP_AUTO)[7];
  					champs[key]['regexp']=(elt.id.match(RE_REGEXP))?elt.id.match(RE_REGEXP)[1] : null;
						champs[key]['valeur_bis']=champs[key]['valeur'];
  				}
					break;
				
				case 'select':case 'select-one':case 'select-multiple':case 'file':
					//Selects : là aussi dates ou listes "normales"...
					if(!elt.id.match(RE_DATE)){
						//Pas une date
						var key=elt.id.match(RE_CHAMP_AUTO)[2];
  					var val=$F(elt);
						if(null!=val){
							val=val.toString();
						}else{
							val='';
						}
						
						champs[key]=$H();
  					champs[key]['valeur']=val;
  					champs[key]['obligatoire']=!elt.id.match(RE_OBLIG) || true;
  					champs[key]['nature']='str';
  					champs[key]['regexp']=null;
						champs[key]['valeur_bis']=champs[key]['valeur'];
					}else{
						//Date
						var key=elt.id.match(RE_CHAMP_AUTO)[2];
  					var val=$F(elt.id.substr(0,elt.id.length-1)+'J')+'/'+$F(elt.id.substr(0,elt.id.length-1)+'M')+'/'+$F(elt.id.substr(0,elt.id.length-1)+'A');
//						val=val.toString();
						
						champs[key]=$H();
  					champs[key]['valeur']=val;
  					champs[key]['obligatoire']=!elt.id.match(RE_OBLIG) || true;
  					champs[key]['nature']=elt.id.match(RE_CHAMP_AUTO)[7].substr(0,elt.id.match(RE_CHAMP_AUTO)[7].length-1);
  					champs[key]['regexp']=null;
						champs[key]['valeur_bis']=champs[key]['valeur'];
					}
					break;
					
				case 'radio':
					var key=elt.id.match(RE_CHAMP_AUTO)[2];
					var val=Form.getInputs(formElt,'radio',elt.name).find(function(x){ return (null!=$F(x)); });
					champs[key]=$H();
					champs[key]['valeur']=(undefined==val)?'':val.value;
					champs[key]['obligatoire']=!elt.id.match(RE_OBLIG) || true;
					champs[key]['nature']='str';
					champs[key]['regexp']=null;
					champs[key]['valeur_bis']=champs[key]['valeur'];
					break;
					
				case 'password':
					//Validation du mot de passe : doit être égal à sa confirmation
					//De plus, s'il est à encrypter MD5, l'ajouter au tableau d'encryption
					
					var key=elt.id.match(RE_CHAMP_AUTO)[2];
					var val=$F(elt);
//					alert(''===val);
					if(elt.id.match(RE_CHAMP_AUTO)[10]){
						var valconf=$F(document.getElementsByName(elt.id.match(RE_CHAMP_AUTO)[10])[0]);
					}else{
						valconf=val;
					}
					
					champs[key]=$H();
					champs[key]['obligatoire']=!elt.id.match(RE_OBLIG) || true;
					champs[key]['valeur']=val;
					champs[key]['valeur_bis']=valconf;
					champs[key]['nature']='str';
					champs[key]['regexp']=null;
					
					if(elt.id.match(RE_CHAMP_AUTO)[11]){
						pwdMd5[pwdMd5.length]=elt.id;
						if(elt.id.match(RE_CHAMP_AUTO)[10]){
							pwdMd5[pwdMd5.length]=(document.getElementsByName(elt.id.match(RE_CHAMP_AUTO)[10])[0]).id;
						}
					}
					
					break;
					
  		} //switch(elt.type){
		}	//if(elt.id.match(RE_CHAMP_AUTO)){
	}	//for(var i=0;i<formElt.elements.length;++i){
	//alert(champs.inspect());
	
	var valid=true;
	var message='';
	var cles=champs.keys();
	
	//Inspecter le tableau champs pour validation
	for(var i=0;i<cles.length;++i){
		if(champs[cles[i]]['obligatoire'] && champs[cles[i]]['valeur'].match(RE_BLANK)){
			//Champ obligatoire non renseigné
			valid=false;
			message+=completerMessage(cles[i],sLangueValidation,'oblig');			 
		}else{
			var natureAvalider=true;
			if(champs[cles[i]]['regexp']!=null){
  			//Expression régulière à valider
  			var re= champs[cles[i]]['regexp'];
  			if(!champs[cles[i]]['valeur'].match(re)){				//La saisie ne respecte pas l'ereg de validation
    			valid=false;
    			message+=completerMessage(cles[i],sLangueValidation,'format');
					natureAvalider=false;
  			}
			}
		 	if(natureAvalider && champs[cles[i]]['nature']!='str'){
  			//Type de données à valider
  			var type=champs[cles[i]]['nature'];
  			if(!verifieTypeValeur(type,champs[cles[i]]['valeur'])){
    			valid=false;
     			message+=completerMessage(cles[i],sLangueValidation,'type');
				}
			}
			if(champs[cles[i]]['valeur']!=champs[cles[i]]['valeur_bis']){
				valid=false;
   			message+=completerMessage(cles[i],sLangueValidation,'mdp_diff');
			}
		}
	}
	
//	valid=false;
	
	if(!valid){
		Event.stop(e);
		alert(message);
	}
	
	//Encrypter md5 les mots de passe avant de partir...
	pwdMd5=$A(pwdMd5);
	pwdMd5.each(function(eltId){$(eltId).value=calcMD5($F(eltId));});
		
}//validerForm


