
/*
 * Système de validation automatique des champs en JS
 * - S'active automatiquement sur les form disposants de la classe 'FormAutoCheck'
 * - Seuls les champs avec la classe 'AutoCheck' sont controlés
 * - pour spécifier le contenu du champ il faut rajouter un attribut check='regex' (attention, ici la regex ne prend pas les délimiteurs de début et fin
 * - les champs se vident tout seul lorsqu'il prennet le focus
 * - Si le champ est vide, il est remis à sa valeur par défaut lorsqu'il perd le focus
 * - le value par défaut du champ n'est pas accepté comme valide sauf si le parameêtre exemple est défini
 * - le paramêtre exemple permet de définir le texte annoncé dans le champs par défaut (il permet de prédéfinir le value à une valeur acceptable)
 * 
 * Tout ce qui se trouve dans le onsubmit sera effectué après le test des champs
 * Attention à l'utilisation du this dans le onsubmit ! il vaut mieux faire référence au form par : $('idDuForm')
 * un return false; dans le onsubmit du form annulera l'envoi du form par le navigateur
 * 
 */



OBJ.eventAdd( window, 'load', initFormAutoCheck);

var FormsAutoChecks = [];

/**
 * Initialise le check automatique des formulaires 
 * @warning Seuls les balise form possédant une classe FormAutoCheck seront pris en compte
 * @warning Au sein de ce formulaire seuls les champs ayant la classe AutoCheck seront vérifiés
 */
function initFormAutoCheck()
{
	var forms = document.getElementsByTagName('form');
	var debug = '';
	for( e in forms )
	{
		debug += typeof( forms[e] )+' - ';
		if( forms[e].getAttribute  )
			debug += "("+forms[e].getAttribute('id')+") - ";
		if( OBJ.classHas( forms[e], 'FormAutoCheck' ) && !OBJ.classHas( forms[e], 'FormAutoCheckInitOk') )
		{
			var formTemp = new FormAutoCheck( forms[e] ); // créé la nouvelle classe
			FormsAutoChecks.push( formTemp ); // la stocke dans le tableau prévu à cet effet
		}
	}
	//alert( debug );
	
	
	var inps = document.getElementsByTagName('input') ;
	for( e in inps )
	{
		if( OBJ.classHas( inps[e], 'selfCheck' ) )
		{
			initSelfCheck( inps[e] );
		}
	}
	
}

/**
 * Définition de la classe FormAutoCheck
 * Une instance de cette classe est crée pour chaque formulaire utilisant l'autocheck
 */
function FormAutoCheck( form ){
	this.form = form; // pointeur sur le form
	this.champs = []; // tableau des champs à analyser
	this.initOnSubmit = null; // contient le onsubmit original
	var self = this; // pointeur interne pour le passge aux evenements
	
	this.init = function()
	{
		var elems = this.form.elements; // pointeur vers les éléments d'un form
		for( e in elems )
		{
			if( OBJ.classHas( elems[e], 'AutoCheck' ) )
			{
				this.initChamp( elems[e] );
				
			}
		}
		this.champs = ksort( this.champs ); // tri les champs (par ordre du tabindex ... ou ordre de la page)
		//alert( AlertTab( this.champs ) );
		this.initOnSubmit = this.form.onsubmit; // copie le onsubmit original
		
		this.form.onsubmit = this.formSubmit;
		//OBJ.eventAdd( this.form, 'submit', this.formSubmit );
		
		OBJ.classAdd( this.form, 'FormAutoCheckInitOk' );
	}
	
	this.initChamp = function( champ )
	{
		var n = champ.getAttribute('tabindex',false);
		if( !n )
			n = 1000+this.champs.length; // génère un nouveau nombre
			
		this.champs[ n ] = champ;
		//this.champs.push( champ );
		
		OBJ.eventAdd( champ, 'keyup', this.champKeyUp );
		//OBJ.eventAdd( champ, 'change', this.champChange ); //pb addevent sur IE (8)
		OBJ.eventAdd( champ, 'focus', this.champFocus );
		OBJ.eventAdd( champ, 'blur' , this.champBlur  );
		champ.exemple = champ.getAttribute('exemple',false); // cherche si il y a un exemple de fourni
		if( champ.exemple ) // si il y a un exemple
		{
			champ.initValue = champ.exemple;
			if( champ.value == '' )
				champ.value=champ.exemple;
		}
		else
			champ.initValue = champ.value;
		
		this.checkGetValue( champ );
		
		
		champ.FAC_valide = false; // initialise le champ à faux
		this.verifChamp( champ ); // vérifie si le contenu initial est OK ou pas (politique des exemples)
		
	}
	
	this.checkGetValue = function( champ )
	{
		var name = champ.getAttribute('name',false);
		var ret;
		if( name ) // si le champ à bien un name
		{
			if( ret = getUrlVars( false, name ) ) // on recherche dans l'url si la variable du même nom est présent
				champ.value = STR.urldecode( ret ); // on met la valeur dans le champ
		}
	}
	
	this.champChamp = function( event )
	{
		var target = event.target || event.srcElement;
		self.verifChamp( target );
	}
	this.champKeyUp = function( event )
	{
		var target = event.target || event.srcElement;
		self.verifChamp( target );
	}
	this.champFocus = function( event )
	{
		var target = event.target || event.srcElement;
		if( target.iniValue != '' && target.initValue == target.value ) // si on a un initValue et que le champ correspond, on le vide
			target.value = '';
	}
	this.champBlur  = function( event )
	{
		
		var target = event.target || event.srcElement;
		if( target.initValue != '' && target.value == '' ) // si on a un initValue et que le champ est vide, on le remet
			target.value = target.initValue;
		else
			self.verifChamp( target );
	}
	
	this.verifChamp = function( champ )
	{
		//alert( champ );
		var regexTxt = champ.getAttribute('check',false);
		if( !regexTxt )
		{
			champ.FAC_valide = true;
			return true; // pas de check : tout est OK par défaut
		}
		
		
			
		var val = champ.value;
		if( champ.initValue == champ.value ) // on est sur la valeur initiale, on supprime les checks
		{
			OBJ.classRemove( champ, 'FormChampNOK');
			OBJ.classRemove( champ, 'FormChampOK');
			val = '';
			champ.FAC_valide = false;
		}
		else
		{
			// var regex = new RegExp( regexTxt );
			//if( val.search( regex )!=-1 )
			var ret = this.check( regexTxt, val );
			//alert( ret );
			if( ret )
			{
				OBJ.classRemove( champ, 'FormChampNOK');
				OBJ.classAdd( champ, 'FormChampOK');
				champ.FAC_valide = true;
			}
			else
			{
				OBJ.classRemove( champ, 'FormChampOK');
				OBJ.classAdd( champ, 'FormChampNOK');
				champ.FAC_valide = false;
			}
		}
	}
	
	this.check = function( regexTxt, val )
	{
		switch( regexTxt )
		{
			case 'nonvide': regexTxt = '(.){1,}'; 													break;
			case 'cp': 		regexTxt = '^[0-9]{4,5}$'; 												break;
			case 'date': 	regexTxt = '^[0123]?[0-9][/\\.,_-][01]?[0-9][/\\.,_-](|19|20)[0-9]{2}$'; 	break;
			case 'text': 	regexTxt = '(.){2,64}'; 												break;
			case 'mail': 	regexTxt = '^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,5}$';			break;
			case 'tel': 	regexTxt = '^0[1-9]([-. ]?[0-9]{2}){4}$'; 								break;
			case 'int': 	regexTxt = '^[0-9]+$';	 												break;
			case 'float': 	regexTxt = '^[0-9]+(|\\.[0-9]+)$';	 									break;
			
		}
		var regex = new RegExp( regexTxt );
		if( val.search( regex )!=-1 )
			return true;
		else
			return false;
	}
	
	this.formSubmit = function( event )
	{
		for( e in self.champs )
		{
			self.verifChamp( self.champs[e] ); // relance la vérif des champs
			if( ! self.champs[e].FAC_valide )
			{
				alert('Le champ '+self.champs[e].name+' n\'est pas valide. Merci de le corriger' );
				self.champs[e].focus();
				return false;
			}
		}
		for( e in self.champs ) // vide les champs qui ont la valeur de l'exemple
		{
			if( self.champs[e].value == self.champs[e].exemple )
			{
				self.champs[e].value='';
			}
		}
		
		
		if( self.initOnSubmit )
		{
			var ret = self.initOnSubmit(); // execute le submit original si besoin
			//alert( ret );
			if( ret === false  ) // uniquement si on avait un return false
				return false;
		}
		return true;
	}
	
	
	this.init();
	
}


function initSelfCheck( input )
{
	this.input = input; // pointeur sur l'input
	var self = this; // pointeur interne pour le passge aux evenements
	
	this.init = function()
	{
		OBJ.eventAdd( this.input, 'keyup', this.champKeyUp );
		OBJ.eventAdd( this.input, 'focus', this.champFocus );
		OBJ.eventAdd( this.input, 'blur' , this.champBlur  );
		this.input.exemple = this.input.getAttribute('exemple',false); // cherche si il y a un exemple de fourni
		if( this.input.exemple ) // si il y a un exemple
		{
			this.input.initValue = this.input.exemple;
			if( this.input.value == '' )
				this.input.value=this.input.exemple;
		}
		else
			this.input.initValue = this.input.value;
		
		this.input.getValue = function(){
			if( this.verifChamp() )
				return this.value;
			alert("Le champ \""+this.initValue+"\" n'est pas valide. Merci de corriger");
			return false;
		}
	    
		
		this.input.verifChamp = function( )
		{
			//alert( champ );
			var regexTxt = this.getAttribute('check',false);
			if( !regexTxt )
			{
				this.FAC_valide = true;
				return true; // pas de check : tout est OK par défaut
			}
				
			var val = this.value;
			if( this.initValue == this.value ) // on est sur la valeur initiale, on supprime les checks
			{
				OBJ.classRemove( this, 'FormChampNOK');
				OBJ.classRemove( this, 'FormChampOK');
				val = '';
				this.FAC_valide = false;
				return false;
			}
			else
			{
				var ret = this.check( regexTxt );
				if( ret )
				{
					OBJ.classRemove( this, 'FormChampNOK');
					OBJ.classAdd( this, 'FormChampOK');
					this.FAC_valide = true;
					return true;
				}
				else
				{
					OBJ.classRemove( this, 'FormChampOK');
					OBJ.classAdd( this, 'FormChampNOK');
					this.FAC_valide = false;
					return false;
				}
			}
			return false; // pb ... on aurai pas du aller jusqu'à là
		}
		this.input.check = function( regexTxt )
		{
			var val = this.value;
			switch( regexTxt )
			{
				case 'nonvide': regexTxt = '(.){1,}'; 													break;
				case 'cp': 		regexTxt = '^[0-9]{4,5}$'; 												break;
				case 'date': 	regexTxt = '^[0123]?[0-9][/\\.,_-][01]?[0-9][/\\.,_-](|19|20)[0-9]{2}$'; 	break;
				case 'text': 	regexTxt = '(.){2,64}'; 												break;
				case 'mail': 	regexTxt = '^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,5}$';			break;
				case 'tel': 	regexTxt = '^0[1-9]([-. ]?[0-9]{2}){4}$'; 								break;
				case 'int': 	regexTxt = '^[0-9]+$';	 												break;
				case 'float': 	regexTxt = '^[0-9]+(|\\.[0-9]+)$';	 									break;
				
			}
			var regex = new RegExp( regexTxt );
			if( val.search( regex )!=-1 )
				return true;
			else
				return false;
		}
		this.input.testOnFocus = function()
		{
			if( this.iniValue != '' && this.initValue == this.value ) // si on a un initValue et que le champ correspond, on le vide
				this.value = '';
		}
		this.input.testOnBlur = function()
		{
			if( this.initValue != '' && this.value == '' ) // si on a un initValue et que le champ est vide, on le remet
				this.value = this.initValue;
			this.verifChamp(); // revalide le champ au cas ou
		}
		
		this.input.checkGetValue = function( )
		{
			var name = this.getAttribute('name',false);
			var ret;
			if( name ) // si le champ à bien un name
			{
				if( ret = getUrlVars( false, name ) ) // on recherche dans l'url si la variable du même nom est présent
					this.value = STR.urldecode( ret ); // on met la valeur dans le champ
			}
		}
		
		this.input.checkGetValue();
		
		this.input.FAC_valide = false; // initialise le champ à faux
		this.input.verifChamp( ); // vérifie si le contenu initial est OK ou pas (politique des exemples)
	}
	
	
	this.champKeyUp = function( event )
	{
		var target = event.target || event.srcElement;
		target.verifChamp();
	}
	this.champFocus = function( event )
	{
		var target = event.target || event.srcElement;
		target.testOnFocus();
	}
	this.champBlur  = function( event )
	{
		var target = event.target || event.srcElement;
		target.testOnBlur();
	}
	
	
	this.init();
}


