/************************************************************
 * Objet formErrorManager
 * Permet de traiter les erreurs du formulaire
 * @errorType	: Type d'erreur affichee (alert | global-div | individual-div)
 * @errorDivId	: identifiant du div dans lequel sera affichee l'erreur
 *
 * PROPRIETES
 * errorType	: Type d'erreur a afficher
 * errorDivId	: Identifiant du div d'erreur dans lequel sont affichees les erreurs
 * errors	: tableau d'objets contenant les erreurs 
 * elem2focus	: element de formulaire focus
 ************************************************************/
function formErrorManager(errorType, errorDivId) {
 
 
// PROPRIETES
	this.errorType	= errorType; // Type d'erreur : alert, global-div, individual-div
	this.errorDivId	= errorDivId; // Div id dans lequel afficher le message d'erreur
	this.errors	= null; // Tableau des erreurs
	this.elem2focus	= null;
 
 
// METHODES
	this.init			= init;
	this.unset			= unset;
	this.setError		= setError; // Ajoute le message d'erreur courant au message d'erreur complet
	this.setClassLabel	= setClassLabel; // Met a jour la classe pour le label du champ
	this.showErrors		= showErrors; // Affichage des erreurs
	this.showAlert		= showAlert; // Affichage des erreurs dans une fenetre d'alert
	this.showAlertJquery= showAlertJquery; // Affichage des erreurs avec l'alert jQuery
	this.showFloatingDiv= showFloatingDiv; // Affichage des erreurs dans un div flottant au centre de la page
	this.showGlobalDiv	= showGlobalDiv; // Affichage des erreurs dans un div
	// this.showIndividualDiv	= showIndividualDiv; // Affichage des erreurs dans des divs individuels
 
 
	/************************************************************
	 * init
	 * Initialisation  de l'objet
	 ************************************************************/
	function init() {
		this.errors = Array();
		this.elem2focus	= null;
	}
 
 
	/************************************************************
	 * unset
	 * RAZ de l'objet
	 ************************************************************/
	function unset() {
		for (i = 0; i < this.errors.length; i++) {
			delete this.errors[i];
		}
		delete this.errors;
		delete this.elem2focus;
	}
 
 
	/************************************************************
	 * setError
	 * Ajout du message d'erreur courant au message complet
	 * @elem : element de formulaire courant
	 * @message : texte de l'erreur
	 ************************************************************/
	function setError(elem, message) {
		var error = new Object();
		error.name = elem.name;
		error.message = message;
		this.errors.push( error );
		if (!this.elem2focus) {
			this.elem2focus = elem;
		}
		delete error;
	}
 
 
	/************************************************************
	 * setClassLabel
	 * Changement de classe css pour le label associe au champ
	 * @elem : element de formulaire courant
	 * @cName : nom de la classe courante
	 ************************************************************/
	function setClassLabel(elem, cName) {
		if (document.getElementById( "label-" + elem.name )) {
			label = document.getElementById( "label-" + elem.name );
			label.setAttribute('class', cName);
			label.setAttribute('className', cName);
			delete label;
		}
	}
 
 
	/************************************************************
	 * showErrors
	 * Affichage du / des messages d'erreur
	 ************************************************************/
	function showErrors() {
		this.elem2focus.focus();
		switch (this.errorType) {
 
			// Message d'alerte
			case "alert":
			this.showAlert();
			break;
			
			// Message d'alerte jquery
			case "alertjquery":
			this.showAlertJquery();
			break;
 
			// Div general Hidden / Visible
			case "floating-div":
			this.showFloatingDiv();
			break;
 
			// Div general Hidden / Visible
			case "global-div":
			this.showGlobalDiv();
			break;
 
			// Divs individuel
			case "individual-div":
			alert("showErrors() : INDIVIDUAL-DIV A FAIRE");
			break;
 
			default:
			alert("Type d'erreur non reconnue");
			break;
		}
	}
 
 
	/************************************************************
	 * showAlert
	 * Affichage du / des messages d'erreur dans un div
	 ************************************************************/
	function showAlert() {
		error = "";
		for (i = 0; i < this.errors.length; i++) {
			if (this.errors[i].message.length > 45) {
				poscut = this.errors[i].message.indexOf(' ', 40);
				part1 = this.errors[i].message.substring(0, poscut);
				part2 = this.errors[i].message.substring(poscut, this.errors[i].message.length);
				error += part1 + "\n " + part2.substring(0, part2.length) + "\n";
			}
			else
				error += this.errors[i].message + "\n";
		}
		alert(error);
		delete error;
	}

	/************************************************************
	 * showAlertJquery
	 * Affichage du / des messages d'erreur dans un div
	 ************************************************************/
	function showAlertJquery() {
		error = "";
		for (i = 0; i < this.errors.length; i++) {
			if (this.errors[i].message.length > 45) {
				poscut = this.errors[i].message.indexOf(' ', 40);
				part1 = this.errors[i].message.substring(0, poscut);
				part2 = this.errors[i].message.substring(poscut, this.errors[i].message.length);
				error += part1 + "<br/>" + part2.substring(0, part2.length) + "<br />";
			}
			else
				error += this.errors[i].message + "<br />";
		}
		alert(error);
		delete error;
	}
 
	/************************************************************
	 * showFloatingDiv
	 * Affichage du / des messages d'erreur dans un div flottant
	 ************************************************************/
	function showFloatingDiv() {
		error = "";
		for (i = 0; i < this.errors.length; i++) {
			error += this.errors[i].message + "<br/>";
		}
		document.getElementById(this.errorDivId).innerHTML = error;
		document.getElementById(this.errorDivId).innerHTML += '<br/><br/><a href="javascript: document.getElementById(\''+this.errorDivId+'\').style.visibility = \'hidden\'; void(0);">Fermer</a><br/><br/>';
		scr_w	= document.body.clientWidth;
		scr_h	= document.body.clientHeight;
		pleft	= (scr_w - document.getElementById(this.errorDivId).offsetWidth) / 2;
		ptop	= (scr_h - document.getElementById(this.errorDivId).offsetHeight) / 2;
		document.getElementById(this.errorDivId).style.left = pleft;
		document.getElementById(this.errorDivId).style.top = ptop;
		document.getElementById(this.errorDivId).style.visibility = 'visible';
		delete error;
	}
 
 
	/************************************************************
	 * showGlobalDiv
	 * Affichage du / des messages d'erreur dans un div
	 ************************************************************/
	function showGlobalDiv() {
		error = "";
		for (i = 0; i < this.errors.length; i++) {
			error += this.errors[i].message + "<br/>";
		}
		document.getElementById(this.errorDivId).innerHTML = error;
		delete error;
	}
}
 
 
 
 
 
/************************************************************
 * Objet formValidater
 * Permet de tester les elements obligatoires d'un formulaire
 * @errorType	: Type d'erreur affichee (alert | global-div | individual-div)
 * @errorDivId	: identifiant du div dans lequel sera affichee l'erreur
 *
 * PROPRIETES
 * compteur	: compteur des elements de formulaire
 * errors	: tableau d'objets contenant les erreurs 
 * elem2focus	: element de formulaire focus
 * errorType	: Type d'erreur affichee
 * errorDivId	: Identifiant du div 
 ************************************************************/
function formValidator(errorType, errorDivId) {


// Proprietes
	this.errorManager	= new formErrorManager(errorType, errorDivId);
	this.myForm = undefined;
	this.compteur	= 0; // utilisé lors du parcours des elements de formulaire


// Methodes
	this.verifForm		= verifForm; // Verfication des elements de formulaire
	this.verifRequiredField	= verifRequiredField; // Verification de champ obligatoire
	this.verifField		= verifField; // Verification de champ
// Controles specifiques
	this.checkEmail		= checkEmail;
	this.checkCP			= checkCP;
	this.checkPhone		= checkPhone;
 
 
// Definition des methodes
	/************************************************************
	 * verifForm
	 * Verification de formulaire
	 * @myForm : objet formulaire a tester
	 ************************************************************/
	function verifForm(myForm) {
		this.myForm = myForm;
	
		// Gestion des messages d'erreur
		this.errorManager.init();
		
		// Boucle sur les elements de formulaire
		for (this.compteur = 0; myForm.elements[this.compteur]; this.compteur++) {
			elem = myForm.elements[ this.compteur ];
 			
			// Verification du champ obligatoire
			if (elem.getAttribute('required') != null) {
				ret = this.verifRequiredField(elem);
			}
			// Controle specifique sur le champ
			if (elem.value != "" && elem.getAttribute('control') != null) {
				control = elem.getAttribute('control') + "(elem)";
				eval("this." + control);
			}				
			delete elem;
		}
		
		
		
		// Si il y a eu des erreurs
		if (this.errorManager.errors.length) {
			this.errorManager.showErrors();
			retour  = false;
		} 
		// Flush les erreurs
		this.errorManager.unset(); 
		delete this.myForm;
 
		return retour;
	}


	/************************************************************
	 * verifRequiredField
	 * Verification de champ obligatoire
	 * @elem : element de formulaire courant
	 ************************************************************/
	function verifRequiredField(elem) {
		if (message = this.verifField(elem)) {
			this.errorManager.setError(elem, message); // Mise a jour du message d'erreur
			this.errorManager.setClassLabel(elem, "error"); // Mise a jour de la classe du label
			retour = false;
		} else {
			this.errorManager.setClassLabel(elem, "required"); // Mise a jour de la classe du label
			retour = true;
		}
		delete message;
		return retour;
	}
 
 
	/************************************************************
	 * verifField
	 * Verification de champ de formulaire
	 * @elem : element de formulaire courant
	 ************************************************************/
	function verifField(elem) {
		message = "";
		switch (elem.type) {
			
			
			// Champs de type Text, Textarea, File
			case "text":
			case "password":
			case "textarea":
			case "file":
			if (elem.value == '') { message = elem.getAttribute('message'); }
			break;
			
			
			// Champ de type select-one
			case "select-one":
			if (elem[elem.selectedIndex].value == '') { message = elem.getAttribute('message'); }
			break;
 
 
			// Champ de type select-multiple
			case "select-multiple":
			selectedIndex = elem.selectedIndex;
			if (elem.value == '') { message = elem.getAttribute('message'); }
			delete selectedIndex;
			break;
 
 
			// Champ de type checkbox et radio (groupe)
			case "checkbox":
			case "radio":
			group = eval("this.myForm." + elem.name);
			if (group.length == undefined) {
				if (!elem.checked) { message = elem.getAttribute('message'); }
			} else {
				this.compteur += (group.length - 1);
				for (i = 0; i < group.length; i++) {
					if (group[i].checked == true) { return message; }
				}
				message = elem.getAttribute('message');
			}
			delete group;
			break;
 
 
			// Autres
			default:
			alert("CHAMP DE TYPE " + elem.type + " PAS ENCORE GERE");
			break;
		}
		return message;
	}
 
 
// CONTROLES SPECIFIQUES
	/************************************************************
	 * verifField
	 * Verification de la validite de l'email
	 * @elem : element de formulaire courant
	 ************************************************************/
	function checkEmail(elem) {
		var regexp = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]{2,}[.][a-z]{2,3}$/;
		if (regexp.exec(elem.value) == null) {
			message = "Merci d'indiquer un E-mail valide."; 
			this.errorManager.setError(elem, message); // Mise a jour du message d'erreur
			this.errorManager.setClassLabel(elem, "error"); // Mise a jour de la classe du label
			delete message;
		} else {
			this.errorManager.setClassLabel(elem, "required"); // Mise a jour de la classe du label
		}
		delete regexp;
	}
	
	function checkCP(elem) {
			var regexp =  /^\d{5}$/;
			if (regexp.exec(elem.value) == null) {
				message = "Merci d'indiquer un code postal valide.";
				this.errorManager.setError(elem, message); // Mise a jour du message d'erreur
				this.errorManager.setClassLabel(elem, "error"); // Mise a jour de la classe du label
				delete message;
			} else {
				this.errorManager.setClassLabel(elem, "required"); // Mise a jour de la classe du label
			}
			delete regexp;
		}
		
		
	function nettoie_phone(phone){ 
		var separateurs = new Array(" ",".","-","/");
		for(i = 0; i < separateurs.length; i++){ 
			while (phone.indexOf(separateurs[i])!= -1){
				phone = phone.replace(separateurs[i],"");
			}
		}
		return phone;
	}
		
	function checkPhone(elem){ 
		var phone = elem.value;
		
		var regex = /^(01|02|03|04|05|06|08|09)\d{8}$/;
		phone = nettoie_phone(phone);
		if (!regex.exec(phone)) {
			message = "Merci d'indiquer un numero de telephone valide.";
			this.errorManager.setError(elem, message);
			this.errorManager.setClassLabel(elem, "error"); // Mise a jour de la classe du label
			delete message;
		}
		else
			this.errorManager.setClassLabel(elem, "required");
		delete phone;
	}
		
}

function checkNaiss(myForm){
	var majeur = true;
	if (myForm.annee.value > 1990) {
		majeur = false;
	}
	else {
		if (myForm.annee.value == 1990) {
			d = new Date();
			if (myForm.mois.value > (d.getMonth()+1)) {
				majeur = false;
			}
			else {
				if (myForm.mois.value == (d.getMonth()+1)) {
					if (myForm.jour.value > d.getDate()) {
						majeur = false;
					}
				}
			}
		}
	}
	if (!majeur) {
		message = "Désolé mais l'inscription est réservée aux personnes majeures. Cette page va maintenant se fermer.";
		alert(message);
		delete message;
		window.close();
		return false;
	}
	else {
		return true;
	}
}
	