/**
* Objet FormValidator
*
* Permet de g?rer la validation de formulaire
*
* Mettre onsubmit="return formValidator.check(this);" dans la balise <form>
*
* en dessous de </form>, mettre :
* <script type='text/javascript'>
* 	formValidator.addRules("id_du_champ","contraintes");
* </script>
*
* contraintes est une liste avec l'espace comme separateur
* les valeurs peuvent etre :
*		champ obligatoire 	=> required (marche aussi pour le select)
*		taille mini			=> minlength=X
*		taille maxi 		=> maxlength=X
*		champ numerique		=> numeric
*		nombre de decimales => decimals=X
*
*		pour les checkbox :
*			formValidator.addRules("Checkbox","minlength=3 maxlength=4 baseid=meschecks insertafter=id");
*
*			TOUT LE TEMPS METTRE "Checkbox" au lieu de l'id
*				minlength	=> nombre minimum de cases devant etres coch?es, si pas pr?cis?, les cases sont optionnelles
*				maxlength	=> nombre maximum de cases devant etres coch?es, si pas pr?cis?, pas de maxi
*				baseid		=> base de l'id des input
*				insertafter	=> id de l'?l?ment apres lequel on veut mettre le rapport d'erreur, si pas pr?cis?, apres la derniere check
*				newline		=> y ou n indique si le rapport d'erreur se met sur une nouvelle ligne. Si pas pr?cis?, n
*
* ne pas mettre d 'espace entre = et la valeur
* decimals peut etre mis a 0 pour un entier
*
* Exemple : formValidator.addRules("Description","maxlength=3 minlength=1 required");
*
* <script>
*/



function FormValidator()
{
	this.rules 	= new Array();
	this.isGood	= true;
	this.mesMessages = new Array();
	//this.ind = 0;

	this.removeRules = function(ruleName){
		var temp = this.rules;
		this.rules 	= new Array();
		for(key in temp){
			if(key != ruleName)
				this.rules[key] = temp[key];
		}
		//if(document.getElementById("erreur"+ruleName))
			//document.getElementById("erreur"+ruleName).parentNode.removeChild(document.getElementById("erreur"+ruleName));
	}
	
	this.addRules = function(fieldId,rules){
		
		//this.message[fieldId] = new Array();
		this.rules[fieldId] = rules;
		//this.messageE[fieldId] = "";
		var sp = document.getElementById("label"+fieldId);
		
		/*if(rules.indexOf('minlength') != -1 || rules.indexOf('required') != -1)
			sp.innerHTML += " *";*/
		if(rules.indexOf('required') != -1)
			sp.innerHTML += "<span class='etoile'> *</span>";
		if(rules.indexOf('numeric') != -1)
		{
			var keyCod;
			document.getElementById(fieldId).onkeypress = function(e){
				//alert(e);
				
				if(!e){
					//alert(YAHOO.env.ua.ie);
					e = window.event;	
					if(YAHOO.env.ua.ie > 0)
					{
						
						keyCod = e.keyCode;
					}
					if (YAHOO.env.ua.gecko > 0)
					{
						if (e.keyCode == 0)
							keyCod = e.charCode;
						else	
							keyCod = e.keyCode; 
					}
				}
				else{
					if(YAHOO.env.ua.ie > 0)
					{
						
						keyCod = e.keyCode;
					}
					if (YAHOO.env.ua.gecko > 0)
					{
						if (e.keyCode == 0)
							keyCod = e.charCode;
						else	
							keyCod = e.keyCode; 
					}
				}
					//alert("cc "+keyCod);
					
					
				if(!(keyCod >= 48 && keyCod <=57))
				{	//alert("not entre 48 et 57");				
					dec = true;

					if(rules.indexOf('decimals') != -1)
					{
						deb 	= rules.indexOf('decimals')+9;
						space 	= rules.indexOf(' ',deb);
						val 	= space == -1 ? rules.substring(deb) : rules.substring(deb,space);	
						dec 	= parseInt(val) != 0;
					}
					
					switch(keyCod)
					{
						case 0:
							switch(keyCod)
							{
								case 13:
									YAHOO.util.Event.stopEvent(e);
									break;
							}
							break;
						
						case 46:
							if(this.value.indexOf('.') != -1 || !dec)
								YAHOO.util.Event.stopEvent(e);
							break;
						default:
							YAHOO.util.Event.stopEvent(e);
					}
				}
				else
				{	//alert("entre 48 et 57");
					if(rules.indexOf('decimals') != -1)
					{
						deb 	= rules.indexOf('decimals')+9;
						space 	= rules.indexOf(' ',deb);

						val 	= space == -1 ? rules.substring(deb) : rules.substring(deb,space);
						if(this.value.indexOf('.') != -1)
						{
							if(this.value.length - this.value.indexOf('.') - 1 == parseInt(val))
								YAHOO.util.Event.stopEvent(e);
						}
					}

				}

			}

		}



		//par.insertBefore(di,suiv);

	}

	

	/**

	* Verification d'email

	* @param	String l'email

	* @return	boolean

	*/ 

	this.isMail = function(string) {

		if (string.search(/^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6})$/) != -1)
	/* ^([a-zA-Z0-9]+(([\.\-\_]?[a-zA-Z0-9]+)+)?)\@(([a-zA-Z0-9]+[\.\-\_])+[a-zA-Z]{2,4})$*/
	/* ^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[\\w]+[\\w]$ */
	/* ^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$ */


			return true;

		else

			return false;



	}
	/**
	* Verifie le formulaire
	* 
	* @param	Form	Le formulaire
	* @return	boolean 
	*/
	this.check = function(theForm){
		this.isGood = true;		
		this.mesMessages=  new Array();
		for(id in this.rules)
		{
			rules	= this.rules[id];

			this.setErrMess(id,"*");
			
			field	= null;
			if(id.toLowerCase() == "checkbox"){
				
				if(rules.indexOf('minlength') != -1){
					deb 	= rules.indexOf('minlength')+10;
					space 	= rules.indexOf(' ',deb);
					minval 	= space == -1 ? rules.substring(deb) : rules.substring(deb,space);
				}
				else
					minval = 0;
				
				if(rules.indexOf('maxlength') != -1){
					deb 	= rules.indexOf('maxlength')+10;
					space 	= rules.indexOf(' ',deb);
					maxval 	= space == -1 ? rules.substring(deb) : rules.substring(deb,space);
				}
				else
					maxval = 0;
				
				deb 	= rules.indexOf('baseid')+7;
				space 	= rules.indexOf(' ',deb);
				baseid 	= space == -1 ? rules.substring(deb) : rules.substring(deb,space);
				
				inps = document.getElementsByTagName("input");
				checkcmpt = 0;
				for(i=0;i<inps.length;i++){
					if(inps[i].type.toLowerCase() == "checkbox" && inps[i].id.indexOf(baseid) != -1
						&& inps[i].checked)
						checkcmpt++;
				}
				if(minval != 0 && checkcmpt < minval)
					this.setErrMess(baseid,"Vous devez cocher au moins "+minval+" cases");
				else if(maxval != 0 && checkcmpt > maxval)
					this.setErrMess(baseid,"Vous devez cocher au maximum "+maxval+" cases");
				else if(maxval != 0 && minval == 0)
					this.setErrMess(baseid,"");
				else
					this.setErrMess(baseid,"*");
			}
			else{
				field 	= document.getElementById(id);


				//alert(field.nodeName.toLowerCase() + " " + field.options[field.selectedIndex].value);		
	
				if(rules.indexOf('required') != -1)
				{
					if((field.type == "text" || field.type == "password" || field.type == "file" || 
						field.nodeName.toLowerCase() == "textarea" || field.type == "hidden")
							&& !trim(field.value))
						this.setErrMess(id,"Ce champ est obligatoire.");
					else if(field.nodeName.toLowerCase() == "select" && 
						field.options[field.selectedIndex].value == -1)
						this.setErrMess(id,"Ce champ est obligatoire.");
	
				}
				else
					this.setErrMess(id,"");
				
	
				if(rules.indexOf('maxlength') != -1)
				{
					deb 	= rules.indexOf('maxlength')+10;
					space 	= rules.indexOf(' ',deb);
					val 	= space == -1 ? rules.substring(deb) : rules.substring(deb,space);
	
					if((field.type == "text" || field.type == "password" || field.nodeName.toLowerCase() == "textarea")
							&& ! (trim(field.value).length <= val) )
						this.setErrMess(id,"Longueur maxi "+val);
	
					if(field.nodeName.toLowerCase() == "select" && field.multiple)
					{
						cmptsel = 0;
	
						for (j = 0; j < field.options.length; j++)
						    if (field.options.options[j].selected)
								cmptsel++;
	
						if(cmptsel > val)
							this.setErrMess(id,"Vous ne devez pas selectionner plus de "+val+" éléments.");	
					}
				}
	
				if(rules.indexOf('minlength') != -1)
				{
					deb 	= rules.indexOf('minlength')+10;
					space 	= rules.indexOf(' ',deb);
	
					val 	= space == -1 ? rules.substring(deb) : rules.substring(deb,space);
	
					if((field.type == "text" || field.type == "password" || field.nodeName.toLowerCase() == "textarea")
							&& ! (trim(field.value).length >= val) )
					{
						if (rules.indexOf('required') != -1)
							this.setErrMess(id,"Ce champ ne doit pas contenir moins de "+val+" caractères.");
					}
						
	
					if(field.nodeName.toLowerCase() == "select" && field.multiple)
					{
						cmptsel = 0;
						for (j = 0; j < field.options.length; j++)
						    if (field.options.options[j].selected)
								cmptsel++;
	
						if(cmptsel < val)
							this.setErrMess(id,"Vous ne devez pas selectionner moins de "+val+" éléments.");	
					}
				}
	
				if(rules.indexOf('mail') != -1)
				{
					if(trim(field.value))
						if(!this.isMail(field.value))
							this.setErrMess(id,"Adresse mail incorrecte");
				}
				if (rules.indexOf('alpha') != -1)
				{
					//alert("oo");
					if(trim(field.value))
						if(!this.isAlpha(field.value))
							this.setErrMess(id,"Ne peut contenir que des lettres ou les caracteres suivants : -");
				}
			}
		}

		
		//alert("tt"+this.mesMessages['nom']);
		return this.isGood;

	}

	this.isAlpha = function(str)
	{
		//var reg = new RegExp("[0-9\&~\"#\{\}\\$\(\[\]\@=\+£\^¨\*\.\,\?\;\:]");
		var reg = /[0-9.\/*+=}\]\\@&"{[|_^¨\$£µ%!§:;,°²~?]/;
		if(reg.exec(str))
		{
			//alert("true");
			return false;
		}else{
			//alert("false");
			return true;
		}
		//return false;
	}

	this.setErrMess = function(fieldId,messageI){
		var sp = document.getElementById("label"+fieldId);
		
		if(messageI != "*" && messageI != ""){
			sp.style.color = "red";		
			this.isGood = false;
			
			this.mesMessages[fieldId] = messageI;
			//alert(fieldId + " - "+ this.mesMessages[fieldId]);
			//alert(formValidatorMessage[fieldId]);
		}
		else
			sp.style.color = "";		
	}
	
	this.getMess = function()
	{
		var retour = new Array();
		for (id in this.mesMessages)
		{
			retour.push({elemId:id, mess:this.mesMessages[id]});
		}
		return retour;
	}
}