/**********************************************************************
*	
*	version du 15/01/2009
*	
*	Classe de gestion de formulaire
*	
*	new Form() : nouveau formulaire
*
*	parametres :
*	{
*		- name : nom du formulaire
*		- libellesDansInput : si true, applique automatiquement la gestion des focus à tous les input et textarea
*	}
*	
**********************************************************************/

function Form(parametres)
{
	this.parametres = {
		name: "",
		libellesDansInput: true
	};
	
	this.form = null;
	this.libelles = Array();
	this.focused = Array();
	this.strErreur = "";
	this.regles = Array();
	var thisObject = this;
	
	/*
	*	this.optionsDefaut()
	*	permet de tenir compte des parametres fournis tout en gardant les valeurs
	*	par defaut des parametres non fournis
	*
	*	- parametres : parametres founis
	*	
	*	note : les parametres par defaut sont this.parametres
	*/
	this.optionsDefaut = function(parametres)
	{
		if (parametres)
		{
			for (var propriete in parametres)
				this.parametres[propriete] = parametres[propriete];
		}
		return true;
	}
	this.optionsDefaut(parametres);
	this.form = document.forms[this.parametres.name];
	this.form.onsubmit = function() { return thisObject.onSubmit(); };
	
	/*
	*	this.appliquerTousOnFocus()
	*	applique la gestion du focus sur tous les input et textarea du formulaire
	*/
	this.appliquerTousOnFocus = function()
	{
		var elements = this.form.getElementsByTagName("input");
		for (var i in elements)
		{
			if (elements[i].type == "text" || elements[i].type == "password")
				this.appliquerOnFocus(elements[i]);
		}
		
		elements = this.form.getElementsByTagName("textarea");
		for (i in elements)
			this.appliquerOnFocus(elements[i]);
	}
	
	/*
	*	this.appliquerOnFocus()
	*	applique la gestion du focus sur un element
	*
	*	- element : element sur lequel applique la gestion du focus
	*/
	this.appliquerOnFocus = function(element)
	{
		if (element.addEventListener)
		{
			element.addEventListener('focus', function() { thisObject.onFocus(this); }, false);
			element.addEventListener('blur', function() { thisObject.onBlur(this); }, false);
		}
		else if (element.attachEvent)
		{
			element.attachEvent('onfocus', function(e) { thisObject.onFocus(e.srcElement); });
			element.attachEvent('onblur', function(e) { thisObject.onBlur(e.srcElement); });
		}
	}
	
	/*
	*	this.onFocus()
	*	fonction effacant le libelle de l'element qui recoit le focus
	*
	*	- element : element qui recoit le focus
	*/
	this.onFocus = function(element)
	{
		if (!this.focused[element.name])
		{
			this.focused[element.name] = true;
			this.libelles[element.name] = element.value;
			element.value = "";
		}
	}
	
	/*
	*	this.onBlur()
	*	fonction remettant le libelle de l'element qui perd le focus si celui-ci est vide
	*
	*	- element : element qui perd le focus
	*/
	this.onBlur = function(element)
	{
		if (this.libelles[element.name] != "" && element.value == "")
		{
			this.focused[element.name] = false;
			element.value = this.libelles[element.name];
		}
	}
	
	/*
	*	this.elementFocused()
	*	fonction indiquant 
	*
	*	- element
	*/
	this.elementFocused = function(element)
	{
		return this.focused[element.name] == true;
	}
	
	this.ajouterRegleValidation = function(nameElement1, typeRegle, strErreur, nameElement2)
	{
		var regle = new RegleValidation({
			element1: this.form.elements[nameElement1],
			element2: this.form.elements[nameElement2],
			type: typeRegle,
			erreur: strErreur,
			form: this
		});
		this.regles.push(regle);
	}
	
	this.onSubmit = function()
	{
		if (!this.valider())
		{
			alert(this.strErreur);
			return false;
		}
		return true;
	}
	
	this.valider = function()
	{
		this.strErreur = "";
		for (var i in this.regles)
		{
			if (!this.regles[i].valider())
				this.strErreur += (this.strErreur != "" ? "\n" : "") + this.regles[i].erreur;
		}
		return this.strErreur == "";
	}
	
	if (this.parametres.libellesDansInput)
		this.appliquerTousOnFocus();
}

function RegleValidation(parametres)
{
	this.parametres = {
		element1: null,
		element2: null,
		type: RegleValidation.types.obligatoire,
		erreur: "",
		form: null
	};
	
	this.element1 = null;
	this.element2 = null;
	this.erreur = "";
	
	/*
	*	this.optionsDefaut()
	*	permet de tenir compte des parametres fournis tout en gardant les valeurs
	*	par defaut des parametres non fournis
	*
	*	- parametres : parametres founis
	*	
	*	note : les parametres par defaut sont this.parametres
	*/
	this.optionsDefaut = function(parametres)
	{
		if (parametres)
		{
			for (var propriete in parametres)
				this.parametres[propriete] = parametres[propriete];
		}
		return true;
	}
	this.optionsDefaut(parametres);
	this.element1 = this.parametres.element1;
	this.element2 = this.parametres.element2;
	this.erreur = this.parametres.erreur;
	if (this.erreur == "")
		this.erreur = "- Erreur -";
	
	/*
	*	this.valider()
	*	verifie que la regle est respectee
	*/
	this.valider = function()
	{
		switch (this.parametres.type)
		{
			case RegleValidation.types.obligatoire:
				return this.parametres.form.elementFocused(this.element1) && this.element1.value != "";
			
			case RegleValidation.types.email:
				if (this.element1.value != "")
				{
					var regInvalide = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)|(@\-)/;
					var regValide = /^[a-zA-Z0-9\-\._!#\$%&\*\+=\^\{\}~]+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/;
					return !regInvalide.test(this.element1.value) && regValide.test(this.element1.value);
				}
				return true;
			case RegleValidation.types.identiques:
				if (this.element1.value != "" && this.element2.value != "")
					return this.element1.value === this.element2.value;
				return true;
		}
		return true;
	}
}
RegleValidation.types = {
	obligatoire: 0,
	email: 1,
	identiques: 2
}
