// popups pied de page
function popup(page,largeur,hauteur,scrollbars) {
	if (typeof(fenetre)!='undefined'){
		fenetre.close();
	}
	var origineX;var origineY;var Lecran;var Hecran;var CalageH=0;var CalageV =-100;
	if (navigator.appVersion.substring(0,1) >= 4){
		if (screen.height <= 768){Lecran = largeur;Hecran = hauteur;}
		else{Lecran = screen.width;Hecran = screen.height;}
	}
	else{Lecran = largeur;  Hecran = hauteur;}
	origineX = Math.round((Lecran-largeur)/2)+ CalageH;origineY = Math.round((Hecran-hauteur)/2)+ CalageV; 
	fenetre = window.open(page,'fenetre',"status,height=" + hauteur + ",width=" + largeur + ",resizable=no,left=" + origineX + ",top=" + origineY + ",screenX=" + origineX + ",screenY=" + origineY + ",scrollbars=" + scrollbars + ",status=no");
	fenetre.focus();  
}


/************************************************************
 * 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;
 
 
// 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;
		} 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 = "";
		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;
			
			case "hidden":
			
			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-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;
	}
}
