// JavaScript Document

/************************************************************
 * 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 erreur dans une fenetre d'alert
	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;
 
			// 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++) {
			error += this.errors[i].message + "\n";
		}
		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.checkZipcode	= checkZipcode;
	this.checkTelephoneFr	= checkTelephoneFr; 
 
// 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) {
			if (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;
		} else {
			retour  = true;
		}
 
		// 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 = "";
		//alert(elem.type);
		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 radio (groupe)
			case "radio": case "checkbox":
			//group = eval("this.myForm." + elem.name);
			group = document.getElementsByName(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
	/************************************************************
	 * checkEmail
	 * Verification de la validite de l'email
	 * @elem : element de formulaire courant
	 ************************************************************/
	function checkEmail(elem) {
		if (elem.value != '')
		{
			var regexp = /^[a-z0-9._-]+@[a-z0-9.-]{2,}[.][a-z]{2,3}$/;
			if (regexp.exec(elem.value) == null) {
				message = "L'email saisi n'est pas 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;
		}
	}
	/************************************************************
	 * checkZipcode
	 * Verification de la validite du code postal
	 * @elem : element de formulaire courant
	 ************************************************************/
	function checkZipcode(elem) {
		if (document.getElementById("PAYS").value != "Autre" && elem.value != '')
		{
			var regexp = /^\d{4,5}$/;
			if (regexp.exec(elem.value) == null) {
				message = "Le code postal saisi n'est pas 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;
		}
		else
		{
			this.errorManager.setClassLabel(elem, "required"); // Mise a jour de la classe du label
			delete regexp;
		}
	}
	
	/************************************************************
	 * checkTelephoneFr
	 * Verification du téléphone fixe en francais
	 * @elem : element de formulaire courant
	 ************************************************************/
	/*function checkTelephoneFr(elem) {
		if (document.getElementById('PAYS').value == 'fr') {
			var regexp2 = /^\d{10,10}$/;
		if ((elem.value !='')  && (regexp2.exec(elem.value)== null)) {
			message = "Le telephone saisi n'est pas 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;	
			//isNaN (elem.value);
			//alert(elem.value);
		}
		
		} else {
			this.errorManager.setClassLabel(elem, "required"); // Mise a jour de la classe du label
		}
		delete regexp;
	}*/
		/************************************************************
	 * checkTelephoneFr
	 * Verification du téléphone fixe en francais
	 * @elem : element de formulaire courant
	 ************************************************************/
	
	function checkTelephoneFr(elem) 
	{
		// Vérification du tel portable
		var portable = -1;
		if (document.getElementById("TEL_PORT").value != '')
		{
			if (checkphone(document.getElementById("TEL_PORT").value, "mobile"))
			{
				portable = 1;
			}
			else 
			{
				portable = 0;
			}
		}		
		
		// Vérification du tel fixe, uniquement si le pays est "fr".
		if (document.getElementById("PAYS").value == "fr")
		{
			if (document.getElementById("TEL_FIXE").value != '')
			{
				// Le tel fixe est incorrect
				if(checkphone(document.getElementById("TEL_FIXE").value, "autre") == false)
				{	
					message = 'Le format de votre num&eacute;ro de t&eacute;l&eacute;phone est incorrect';
					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;
					
					// Aucun des numéros n'est correct
					if (portable == 0)
					{						
						message = 'Le format de votre num&eacute;ro de mobile est incorrect';
						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 if (portable == -1)
					{
						message = 'Vous devez saisir au moins un t&eacute;l&eacute;phone 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;
					}
					
					// Le portable est bon, on vide le champ et on laisse passer
					else
					{
						document.getElementById("TEL_FIXE").value = '';
						this.errorManager.setClassLabel(elem, "required"); // Mise a jour de la classe du label
					}
				}
				
				// Le numéro de fixe est correct
				else 
				{
					// Si le champ "mobile" est faux, on le vide
					if (portable == 0)
					{
						document.getElementById("TEL_PORT").value = '';
					}
					this.errorManager.setClassLabel(elem, "required"); // Mise a jour de la classe du label
				}
			}
			
			// Le tel fixe est vide
			else
			{
				// Le portable est faux
				if (portable == 0){
					message = 'Le format de votre num&eacute;ro de mobile est incorrect';
					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;
					message = 'Vous devez saisir au moins un t&eacute;l&eacute;phone 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;
				}
				// Le portable est vide
				else if (portable == -1)
				{
					message = 'Vous devez saisir au moins un t&eacute;l&eacute;phone 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;
				}
			}
		}
		
		// Le pays n'est pas "fr", on laisse passer
		else
		{
			this.errorManager.setClassLabel(elem, "required"); // Mise a jour de la classe du label
		}
	}	
	
	function checkphone(phone, typephone){ 
	 var retour, trouve;
	 var typephone1 = new Array("01","02","03","04","05","08","09");
	 var typephone2 = new Array("06");
	 trouve = 0;
	 retour = false;
	 //isNaN(document.form_inscription.PHONE.value)
	 if (phone != ''){ 	 
	 	phone = nettoie_phone(phone);
	 	if(phone.length == 12 && phone.substring(0,3) == "+33"){
		 	phone = "0"+phone.substring(3,13) 		
		}
	 	if(!isNaN(phone)){	 	
		 	if((phone.length == 10 && phone.substring(0,1) == "0")){
		 		// le numero est on bon format 		
		 		if(typephone == "mobile"){
		 			for(i=0;i<typephone2.length;i++){ 				
		 				if(phone.substring(0,2) == typephone2[i]){
		 					trouve = 1.
		 				}
		 			} 			 			
		 		}else{
		 			for(i=0;i<typephone1.length;i++){
		 				if(phone.substring(0,2) == typephone1[i]){
		 					trouve = 1.
		 				}
		 			} 			 			
		 		}
		 		if(trouve == 1){
		 			retour=true;
		 		}
		 	}
		 }
	 }
	 return retour; 
	}
	
	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;
	}
}