/**
 * Fonctions javascript commune à tous les sites
 * 
 * @author : Service Informatique
 * @version : 2007-09-25
 * @copyright : Monné-Decroix (service informatique)
 */

/////// FORMULAIRE ///////
var NombreDeClics = 0;	// Nombre de clics de soumission du formulaire, permet de ne pas valider plusieurs fois un formulaire

/**
 * Incremente la variable javascript globale "NombreDeClics"
 */
function CompteClics(){
	NombreDeClics++;
}

/**
 * Initialise la variable NombreDeClics
 */
function ChargementFormulaire(){
	NombreDeClics = 0;
}
//////////////////////////

/////// COOKIES /////////
function SetCookie(name, value){
	var argv = SetCookie.arguments;
	var argc = SetCookie.arguments.length;
	var expires = (argc > 2) ? argv[2] : null;
	var path = (argc > 3) ? argv[3] : null;
	var domain = (argc > 4) ? argv[4] : null;
	var secure = (argc > 5) ? argv[5] : false;
	document.cookie = name + "=" + escape (value) +
	((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
	((path == null) ? "" : ("; path=" + path)) +
	((domain == null) ? "" : ("; domain=" + domain)) +
	((secure == true) ? "; secure" : "");
}
//////////////////////////

/////// ALERTE / CONFIRM / WINDOW ///////
/**
 * Demande une confirmation avant de rediriger vers l'url
 *
 * @param string vLibelle Texte de la confirmation
 * @param string vUrl Url de redirection si on valide la confirmation
 */
function openConfirm(vLibelle, vUrl){
	if(confirm(vLibelle)){
		document.location.href = vUrl;
	}
}

/**
 * Ouvre un popup
 *
 * @param string str_url Url de la page
 * @param string str_name Nom de la fenetre
 * @param integer int_w Largeur de la fenetre
 * @param integer int_h Hauteur de la fenetre
 * @param string str_rezisable yes : la fenetre sera redimensionable, no : l'inverse
 * @param string str_srollbars yes : les bars de scroll seront utilisable, no : l'inverse
 */
function openPopup(str_url, str_name, int_w, int_h, str_rezisable, str_srollbars){
	var opts = "width="+int_w+",height="+int_h+",resizable="+str_rezisable+",scrollbars="+str_srollbars;
	var win = window.open(str_url,str_name,opts);
	win.focus();
}

/**
 * Ferme une fenetre
 */
function closeWindow(){
	window.close();
}

/**
 * Ajoute du HTML a la fin du BODY
 */
function addHTMLAfterBody(element, HTML) {
   var o = document.createElement("htmlSection");
   o.innerHTML = HTML;
   element.appendChild(o)
} 
/////////////////////////////////////////

/////// CHECK FIELD ///////
/**
 * Verifie que les valeurs des deux champs sont vides.
 *	Si les deux valeurs sont vides
 *		- On affiche une alerte avec le contenu de la variable err_Message
 *		- On donne le focus au champ obj_Champ1
 *		- On initialise la variable NombreDeClics à 0
 *
 * @param object obj_Champ1 Premier objet html à vérifier
 * @param object obj_Champ2 Second objet html à vérifier
 * @param string err_Message Message a afficher en cas d'erreur
 * @return boolean
 */
function ChampsNonVides(obj_Champ1, obj_Champ2, err_Message){
	if ((obj_Champ1.value == "") && (obj_Champ2.value == "")){
		alert (txt_veuillez_saisir+" : "+err_Message);
		obj_Champ1.focus();
		NombreDeClics = 0;
		return false;
	} else {
		return true;
	}
}

/**
 * Verifie que la valeur du champ est vide.
 *	Si la valeur est vide
 *		- On affiche une alerte avec le contenu de la variable err_Message
 *		- On donne le focus au champ obj_Champ
 *		- On initialise la variable NombreDeClics à 0
 *
 * @param object obj_Champ Objet html à vérifier
 * @param string err_Message Message a afficher en cas d'erreur
 * @param string version [Parametre optionnel] si omis version js normale sinon version jquery
 * @return boolean ou le message dans le cas d'un form jquery
 */
function ChampNonVide(obj_Champ, err_Message, version){
	
	var valeur = obj_Champ.value;
	if (version == undefined){
		if (valeur == ""){
			alert(txt_veuillez_saisir+" : "+err_Message);
			obj_Champ.focus();
			NombreDeClics = 0;
			return false;
		} else { 
			return true; 
		}
	}else{
		if (valeur == ""){
			obj_Champ.focus();
			NombreDeClics = 0;
			return txt_veuillez_saisir+" : "+err_Message;
		} else { 
			return ''; 
		}
	}
}


/**
 * Verifie que la valeur du champs est differente de 0.
 *	Si la valeur est égale à 0
 *		- On affiche une alerte avec le contenu de la variable err_Message
 *		- On donne le focus au champ obj_Champ
 *		- On initialise la variable NombreDeClics à 0
 *
 * @param object obj_Champ Objet html à vérifier
 * @param string err_Message Message a afficher en cas d'erreur
 * @return boolean
 */
function ChampNonNul(obj_Champ, err_Message){
	if (obj_Champ.value == "0"){
		alert (txt_veuillez_saisir+" : "+err_Message);
		obj_Champ.focus();
		NombreDeClics = 0;
		return false;
	} else {
		return true;
	}
}

/**
 * Verifie si la valeur d'un champ ne contient que des lettres.
 *  Si tel n'est pas le cas il affiche une alerte avec comme message le contenu de la variable err_Message
 *  et donne le focus au champ obj_Champ
 *
 * @param object obj_Champ Objet html à vérifier
 * @param string err_Message Message a afficher en cas d'erreur
 * @return boolean
 */
function QueDesLettres(obj_Champ, err_Message){
	var exp_Reguliere = new RegExp("^[a-zA-ZÀÁÂÃÄÅàáâãäåÒÓÔÕÖòóôõöÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ]+$");
	if (!exp_Reguliere.test(obj_Champ.value)){
		alert (err_Message);
		obj_Champ.focus();
		NombreDeClics = 0;
		return false;
	} else {
		return true;
	}
}

/**
 * Verifie si la valeur d'un champ ne contient que des lettres et les caractères "'" OU " " OU "-" OU "&" OU "/".
 *  Si tel n'est pas le cas il affiche une alerte avec comme message le contenu de la variable err_Message
 *  et donne le focus au champ obj_Champ
 *
 * @param object obj_Champ Objet html à vérifier
 * @param string err_Message Message a afficher en cas d'erreur
 * @return boolean
 */
function QueDesLettresExtend(obj_Champ, err_Message){
	var exp_Reguliere = new RegExp("^[a-zA-ZÀÁÂÃÄÅàáâãäåÒÓÔÕÖòóôõöÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ' &/-]+$");
	if (!exp_Reguliere.test(obj_Champ.value)){
		alert (err_Message);
		obj_Champ.focus();
		NombreDeClics = 0;
		return false;
	} else {
		return true;
	}
}

/**
 * Verifie si la valeur d'un champ ne contient que des caracteres hors meta (pour gestion xml)
 * 		La liste n'est pas exhaustive
 *  Si tel n'est pas le cas il affiche une alerte avec comme message le contenu de la variable err_Message
 *  et donne le focus au champ obj_Champ
 *
 * @param object obj_Champ Objet html à vérifier
 * @param string err_Message Message a afficher en cas d'erreur
 * @return boolean
 */
function QueDesCaracteresHorsMeta(obj_Champ, err_Message){
	var exp_Reguliere = new RegExp("[&~#/\|_@$><]");
	if (exp_Reguliere.test(obj_Champ.value)){
		alert (err_Message);
		obj_Champ.focus();
		NombreDeClics = 0;
		return false;
	} else {
		return true;
	}
}

/**
 * Verifie si la valeur d'un champ est égal à une valeur.
 *  Si tel n'est pas le cas il affiche une alerte avec comme message le contenu de la variable err_Message
 *  et donne le focus au champ obj_Champ
 *
 * @param object obj_Champ Objet html à vérifier
 * @param mixed value valeur servant de comparaison
 * @param string err_Message Message a afficher en cas d'erreur
 * @return boolean
 */
function EgalA(obj_Champ, value, err_Message){
	if(typeof(obj_Champ) == 'object'){
		var val_Test = obj_Champ.value;
	} else {
		var val_Test = obj_Champ;
	}
	if (val_Test != value){
		alert (txt_veuillez_saisir+" "+err_Message);
		if(typeof(obj_Champ) == 'object'){
			obj_Champ.focus();
		}
		NombreDeClics = 0;
		return false;
	} else {
		return true;
	}
}

/**
 * Verifie si la valeur d'un champ est differente d'une valeur.
 *  Si tel n'est pas le cas il affiche une alerte avec comme message le contenu de la variable err_Message
 *  et donne le focus au champ obj_Champ
 *
 * @param object obj_Champ Objet html à vérifier
 * @param mixed value valeur servant de comparaison
 * @param string err_Message Message a afficher en cas d'erreur
 * @return boolean
 */
function NonEgalA(obj_Champ, value, err_Message){
	if(typeof(obj_Champ) == 'object'){
		var val_Test = obj_Champ.value;
	} else {
		var val_Test = obj_Champ;
	}
	if (val_Test == value){
		alert (txt_veuillez_saisir+" "+err_Message);
		if(typeof(obj_Champ) == 'object'){
			obj_Champ.focus();
		}
		NombreDeClics = 0;
		return false;
	} else {
		return true;
	}
}

/**
 * Verifie si la valeur d'un champ est supérieure à une valeur minimum.
 *  Si tel n'est pas le cas il affiche une alerte avec comme message le contenu de la variable err_Message
 *  et donne le focus au champ obj_Champ
 *
 * @param object obj_Champ Objet html à vérifier
 * @param mixed val_Min valeur servant de comparaison
 * @param string err_Message Message a afficher en cas d'erreur
 * @return boolean
 */
function SuperieurA (obj_Champ, val_Min, err_Message){
	if(typeof(obj_Champ) == 'object'){
		var val_Test = parseFloat(obj_Champ.value);
	} else {
		var val_Test = obj_Champ;
	}
	if (val_Test < val_Min){
		alert (err_Message);
		if(typeof(obj_Champ) == 'object'){
			obj_Champ.focus();
		}
		NombreDeClics = 0;
		return false;
	} else {
		return true;
	}
}

/**
 * Verifie si la valeur d'un champ est inferieure à une valeur maximum.
 *  Si tel n'est pas le cas il affiche une alerte avec comme message le contenu de la variable err_Message
 *  et donne le focus au champ obj_Champ
 *
 * @param object obj_Champ Objet html à vérifier
 * @param mixed val_Max valeur servant de comparaison
 * @param string err_Message Message a afficher en cas d'erreur
 * @return boolean
 */
function InferieurA (obj_Champ, val_Max, err_Message){
	if(typeof(obj_Champ) == 'object'){
		var val_Test = parseFloat(obj_Champ.value);
	} else {
		var val_Test = obj_Champ;
	}
	if (val_Test > val_Max){
		alert (err_Message);
		if(typeof(obj_Champ) == 'object'){
			obj_Champ.focus();
		}
		NombreDeClics = 0;
		return false;
	} else {
		return true;
	}
}

/**
 * Verifie si la valeur d'un champ est comprise entre une valeur minimu et une valeur maximum.
 *  Si tel n'est pas le cas il affiche une alerte avec comme message le contenu de la variable err_Message
 *  et donne le focus au champ obj_Champ
 *
 * @param object obj_Champ Objet html à vérifier
 * @param mixed val_Min valeur servant de comparaison
 * @param mixed val_Max valeur servant de comparaison
 * @param string err_Message Message a afficher en cas d'erreur
 * @return boolean
 */
function ComprisEntre (obj_Champ, val_Min, val_Max, err_Message){
	if(typeof(obj_Champ) == 'object'){
		var val_Test = parseFloat(obj_Champ.value);
	} else {
		var val_Test = obj_Champ;
	}
	if ((val_Test < val_Min) || (val_Test > val_Max)){
		alert (err_Message);
		if(typeof(obj_Champ) == 'object'){
			obj_Champ.focus();
		}
		NombreDeClics = 0;
		return false;
	} else {
		return true;
	}
}

/**
 * Retourne true si le nombre de caractères de la valeur d'un champ est supérieure ou égal à un nombre.
 *
 * @param object obj_Champ Objet html à vérifier
 * @param integer int_Longueur Longeur minimale de la chaine 
 * @param string err_Message Message a afficher en cas d'erreur
 * @return boolean
 */
function LongueurMinimale(obj_Champ, int_Longueur, err_Message){
	if(typeof(obj_Champ) == 'object'){
		var val_Test = obj_Champ.value.length;
	} else {
		var val_Test = obj_Champ.length;
	}
	if(val_Test >= int_Longueur){
		return true;
	} else {
		alert (err_Message);
		if(typeof(obj_Champ) == 'object'){
			obj_Champ.focus();
		}
		NombreDeClics = 0;
		return false;
	}
}

/**
 * Verifie si la valeur d'un champ est un nombre ou non.
 *  Si tel n'est pas le cas
 *		- On affiche une alerte avec comme message le contenu de la variable err_Message
 *  	- On donne le focus au champ obj_Champ
 *		- On initialise la variable NombreDeClics à 0
 *
 * @param object obj_Champ Objet html à vérifier
 * @param string err_Message Message a afficher en cas d'erreur
 * @return boolean
 */
function EstUnNombre(obj_Champ, err_Message){
	var nb = obj_Champ.value.replace(',','.');
	nb = Number(nb);
	
	if (isNaN(nb)){
		alert (err_Message);
		obj_Champ.focus();
		NombreDeClics = 0;
		return false;
	} else {
		return true;
	}
}

/**
 * Verifie si la valeur d'un champ est un entier ou non.
 *  Si tel n'est pas le cas
 *		- On affiche une alerte avec comme message le contenu de la variable err_Message
 *  	- On donne le focus au champ obj_Champ
 *		- On initialise la variable NombreDeClics à 0
 *
 * @param object obj_Champ Objet html à vérifier
 * @param string err_Message Message a afficher en cas d'erreur
 * @return boolean
 */
function EstUnEntier(obj_Champ, err_Message){
	var maReg = new RegExp ("^[0-9]+$", "gi");
	if (!maReg.test(obj_Champ.value)){
		alert (err_Message);
		obj_Champ.focus();
		NombreDeClics = 0;
		return false;
	} else {
		return true; 
	}
}

/**
 * Verifie si la valeur d'un champ est un email valide ou non.
 *  Si tel n'est pas le cas
 *		- On affiche une alerte
 *  	- On donne le focus au champ obj_Champ
 *		- On initialise la variable NombreDeClics à 0
 * 
 * @param object obj_Champ Objet html à vérifier
 * @param string err_Message Message a afficher en cas d'erreur
 * @param string version [Parametre optionnel] si omis version js normale sinon version jquery
 * @return boolean
 */
function CheckEMail(obj_Champ, err_Message, version){
	var maReg = new RegExp ("^\\w[\\w+\.\-]+\\w@\\w[\\w+\.\-]*\\w\\.[a-zA-Z]{2,6}$", "gi");
	if (version == undefined){
		if (!maReg.test(obj_Champ.value)){
			alert (err_Message);
			obj_Champ.focus();
			NombreDeClics = 0;
			return false;
		} else {
			return true; 
		}
	}else{
		if (!maReg.test(obj_Champ.value)){
			obj_Champ.focus();
			NombreDeClics = 0;
			return err_Message;
		} else { 
			return ''; 
		}
	}
}

/**
 * Verifie si la valeur d'un champ est un numéro de téléphone valide ou non.
 *  Si tel n'est pas le cas il affiche une alerte avec comme message le contenu de la variable err_Message
 *  et donne le focus au champ obj_Champ
 *
 * @param object obj_Champ Objet html à vérifier
 * @param string err_Message Message a afficher en cas d'erreur
 * @param string version [Parametre optionnel] si omis version js normale sinon version jquery
 * @return boolean
 */
function CheckTelephone(obj_Champ, err_Message, version){
	
	// On remplace les caractères "espace" "point" et "tiret" par vide
	var maReg = new RegExp("[ .-]", "gi") ;
	// Test de la chaine obtenue
	exp_Reguliere = new RegExp("^[+]?[0-9]{10,12}$");
	
	var str = obj_Champ.value.replace(maReg, "");
	
	if (version == undefined){
		if (!exp_Reguliere.test(str)){
			alert (err_Message);
			obj_Champ.focus();
			NombreDeClics = 0;
			return false;
		} else {
			return true;
		} 
	} else {
		if (!exp_Reguliere.test(str)){
			obj_Champ.focus();
			NombreDeClics = 0;
			return err_Message;
		} else { 
			return ''; 
		}
	} 
}

/**
 * Verifie si la valeur d'un champ est un code textuel valide ou non.
 *	Chaine ne contenant que des lettres, chiffres, les caractères _ et -
 *  Si tel n'est pas le cas il affiche une alerte avec comme message le contenu de la variable err_Message
 *  et donne le focus au champ obj_Champ
 *
 * @param object obj_Champ Objet html à vérifier
 * @param string err_Message Message a afficher en cas d'erreur
 * @return boolean
 */
function CheckCodeTextuel(obj_Champ, err_Message){
	var exp_Reguliere = new RegExp("^[0-9a-zA-Z_-]+$");
	if (!exp_Reguliere.test(obj_Champ.value)){
		alert (err_Message);
		obj_Champ.focus();
		NombreDeClics = 0;
		return false;
	} else {
		return true;
	} 
}

/**
 * Verifie si la valeur d'un champ est un code postal valide ou non.
 *	Chaine ne contenant que des lettres, chiffres et le caractère _
 *  Si tel n'est pas le cas il affiche une alerte avec comme message le contenu de la variable err_Message
 *  et donne le focus au champ obj_Champ
 *
 * @param object obj_Champ Objet html à vérifier
 * @param string err_Message Message a afficher en cas d'erreur
 * @return boolean
 */
function CheckCodePostal(obj_Champ, err_Message){
	var exp_Reguliere = new RegExp("^[0-9]{5}$");
	if (!exp_Reguliere.test(obj_Champ.value)){
		alert (err_Message);
		obj_Champ.focus();
		NombreDeClics = 0;
		return false;
	} else {
		return true;
	} 
}

/**
 * Renvoie le jour de la semaine depuis une date
 *
 * @param object obj_Champ Date en string 
 * @return integer le jour de la semaine 0 dimanche
 */
function GetJourSemaine(obj_Champ){
	var var_Date = obj_Champ.value;
	
	var jour = parseInt (var_Date.split ("/")[0], 10);
	var mois = parseInt (var_Date.split ("/")[1], 10)-1; // faut faire -1 sur le mois c'est comme ça!!!!
	var annee = parseInt (var_Date.split ("/")[2], 10);
	var date_select = new Date(annee, mois, jour);
	
	return date_select.getDay();
}

/**
 * Verifie si la valeur d'un champ est une date valide ou non.
 *  Si tel n'est pas le cas
 *		- On affiche une alerte avec comme message le contenu de la variable err_Message
 *  	- On donne le focus au champ obj_Champ
 *		- On initialise la variable NombreDeClics à 0
 *
 * @param object obj_Date Objet html à vérifier
 * @param string err_Message Message a afficher en cas d'erreur
 * @return boolean
 */
function CheckDate(obj_Date, err_Message){
	var var_Retour = false;
	if(typeof(obj_Date) == 'object'){
		var var_Date = obj_Date.value;
	} else {
		var var_Date = obj_Date;
	}
	
	if (var_Date != ""){
		var exp_Reguliere = new RegExp("^[0-9]{1,2}\/[0-9]{1,2}\/([0-9]{2}|[0-9]{4})$");
		if (exp_Reguliere.test (var_Date)){
			var jours = parseInt (var_Date.split ("/")[0], 10);
			var mois = parseInt (var_Date.split ("/")[1], 10);
			var annee = parseInt (var_Date.split ("/")[2], 10);
			if (annee < 1000){
				if (annee < 89){
					annee+=2000;
				} else {
					annee+=1900;
				}
			}
			if (annee%4 == 0 && annee%100 !=0 || annee%400 == 0){
				var JoursFevrier = 29;
			} else {
				var JoursFevrier = 28;
			}
			var JoursParMois = new Array(31,JoursFevrier,31,30,31,30,31,31,30,31,30,31);
			if ( mois >= 1 && mois <=12 && jours >= 1 && jours <= JoursParMois[mois-1] ){
				var_Retour = true;
			}
		}
	}
	
	if (!var_Retour){
		alert (err_Message);
		if(typeof(obj_Date) == 'object'){
			obj_Date.focus();
		}
		NombreDeClics = 0;
	}
	
	return var_Retour; 
}

/**
 * Verifie si la valeur d'un champ est une heure valide ou non.
 *  Si tel n'est pas le cas
 *		- On affiche une alerte avec comme message le contenu de la variable err_Message
 *  	- On donne le focus au champ obj_Champ
 *		- On initialise la variable NombreDeClics à 0
 *
 * @param object obj_Time Objet html à vérifier
 * @param string err_Message Message a afficher en cas d'erreur
 * @return boolean
 */
function CheckTime(obj_Time, err_Message){
	var var_Retour = false;
	var var_Time = obj_Time.value;

	if (var_Time != ""){
		var exp_Reguliere = new RegExp("^[0-9]{1,2}:[0-9]{1,2}(:[0-9]{1,2})?$");
		if (exp_Reguliere.test (var_Time)){
			var heure = parseInt (var_Time.split (":")[0], 10);
			var minutes = parseInt (var_Time.split (":")[1], 10);
			if ( heure >= 0 && heure <=23 && minutes >= 0 && minutes <= 59 ){
				var_Retour = true;
			}
		}
	}
	
	if (!var_Retour){
		alert (err_Message);
		obj_Time.focus();
		NombreDeClics = 0;
	}
	
	return var_Retour; 
}

/**
 * Compare la première date avec la deuxième.
 *	retourne vrai si elle est inférieure ou égale et faux dans le cas contraire
 *
 * @param object obj_Date1 Objet html de la première date
 * @param object obj_Date2 Objet html de la seconde date
 * @param string txt_Date1 Nom correspondant au champ obj_Date1
 * @param string txt_Date2 Nom correspondant au champ obj_Date2
 * @return boolean
 */
function CheckCompareDate(obj_Date1, obj_Date2, txt_Date1, txt_Date2){
	var str_date1 = obj_Date1.value;
	var str_date2 = obj_Date2.value;
	j1 = parseInt(str_date1.split("/")[0], 10); // jour 
	m1 = parseInt(str_date1.split("/")[1], 10); // mois 
	a1 = parseInt(str_date1.split("/")[2], 10); // année 
	j2 = parseInt(str_date2.split("/")[0], 10); // jour 
	m2 = parseInt(str_date2.split("/")[1], 10); // mois 
	a2 = parseInt(str_date2.split("/")[2], 10); // année 
	date1 = new Date (a1, m1-1, j1);
	date2 = new Date (a2, m2-1, j2);
	if(date1 <= date2){
		return true;
	} else {
		alert(txt_Date2+" "+txt_anterieure_a+" "+txt_Date1);
		return false;
	}
}

/**
 * Verifie que la valeur de nb2 est strictement supérieure à nb1
 *  Si tel n'est pas le cas il affiche une alerte avec comme message le contenu de la variable err_Message
 *	et donne le focus au champ obj_Champ
 *
 * @param integer nb1 Nombre 1
 * @param integer nb2 Nombre 2
 * @param object obj_Champ Objet html à vérifier
 * @param string err_Message Message a afficher en cas d'erreur
 * @return boolean
 */
function estSuperieur(nb1, nb2, obj_Champ, err_Message){
	if(nb1 != "" && nb2 != ""){
		nb1 = nb1.toString().replace(',','.');
		nb1 = Number(nb1);
		nb2 = nb2.toString().replace(',','.');
		nb2 = Number(nb2);
		if (nb1 < nb2){
			alert (err_Message);
			obj_Champ.focus();
			NombreDeClics = 0;
			return false;
		} else { 
			return true; 
		}
	} else {
		return true; 
	}
}

/**
 * Verifie que l'extension d'un fichier à uploader est bien acceptée
 *  Si tel n'est pas le cas il affiche une alerte avec comme message le contenu de la variable err_Message
 *	et donne le focus au champ obj_Champ
 *
 * @param object obj_Champ Objet html à vérifier
 * @param array extension_list Liste des extensions acceptées
 * @param string err_Message Message a afficher en cas d'erreur
 * @return boolean
 */
function checkExtensionFileUpload(obj_Champ, extension_list, err_Message){
	var found = false;
	for(var i = 0; i < extension_list.length; i++){
		var maReg = new RegExp(extension_list[i]+"$", "gi");
		if (maReg.test(obj_Champ.value)){
			found = true;
		}
	}
	
	if(!found){
		alert (err_Message);
		obj_Champ.focus();
		NombreDeClics = 0;
		return false;
	} else {
		return true;
	}
}

/**
 * Verifie que "nb" entrée soit selectionné dans le selecteur "select"
 *	Le comportement est definit pas "comparateur"
 *
 * @param object select Objet select a verifier
 * @param integer nb Nombre d'entrée de reference
 * @param string comparateur > => on attend nb ou plus, < => on attend nb ou moins, = => on attend exactement nb, mais aussi les <= et >=
 * @param string err_Message Message a afficher en cas d'erreur
 * @return boolean
 */
function checkNbEntriesSelected(select, nb, comparateur, err_Message){
	// Compte le nombre d'entrée selectionné
	var nb_selected = 0;
	for(i = 0; i < select.options.length; i++){
		if(select.options[i].selected){
			nb_selected++;
		}
	}
	
	// On verifie par rapport au comparateur
	var ok = false
	switch(comparateur){
		case '=': 
			if(nb_selected == nb){
				ok = true; 
			}
		break;
		
		case '<=': 
			if(nb_selected <= nb){
				ok = true; 
			}
		break;
		
		case '>=': 
			if(nb_selected >= nb){
				ok = true; 
			}
		break;
		
		case '<': 
			if(nb_selected < nb){
				ok = true; 
			}
		break;
		
		case '>': 
			if(nb_selected > nb){
				ok = true; 
			}
		break;
		
		default: break;
	}
	
	// Le retour
	if(!ok){
		alert (err_Message);
		select.focus();
		NombreDeClics = 0;
		return false;
	} else {
		return true;
	}
}
///////////////////////////

/////// FIELDS ///////
/**
 * Retourne la valeur selectionné d'un selecteur
 *
 * @param object objet
 * @return string
 */
function getValueThisSelect(objet){
	return objet.options[objet.selectedIndex].value;
}

/**
 * Change la class d'un objet HTML
 *
 * @param string object_id
 * @param string class_name
 */
function changeClassName(object_id, class_name){
	if(typeof(object_id) == 'object'){
		object_id.className = class_name;
	} else {
	document.getElementById(object_id).className = class_name;
}
}

/**
 * Ajoute la class a un objet HTML
 *
 * @param string object_id
 * @param string class_name
 */
function addClassName(object_id, class_name){
	if(typeof(object_id) == 'object'){
		object_id.className += ' '+class_name;
	} else {
		document.getElementById(object_id).className += ' '+class_name;
	}
}

/**
 * Change la source d'un objet HTML
 *
 * @param string object_id
 * @param string source
 */
function changeSource(object_id, source){
	if(typeof(object_id) == 'object'){
		object_id.src = source;
	} else {
	document.getElementById(object_id).src = source;
}
}

/**
 * Deplace une valeur selectionnée d'un selecteur vers un autre
 *
 * @param string select_src
 * @param string select_dest
 */
function moveEntrieSelectToSelect(select_src, select_dest){
	// Recup les valeurs selectionnees
	var elmSrc = document.getElementsByName(select_src);
	var elmDest = document.getElementsByName(select_dest);
	
	if(elmSrc[0] && elmDest[0]){
		if (elmSrc[0].options.selectedIndex>=0) {
			o=new Option(elmSrc[0].options[elmSrc[0].options.selectedIndex].text,elmSrc[0].options[elmSrc[0].options.selectedIndex].value);
			elmDest[0].options[elmDest[0].options.length]=o;
			elmSrc[0].options[elmSrc[0].options.selectedIndex]=null;
		}
	}
}

/**
 * Selectionne toutes les entrees d'un selecteur
 *
 * @param string selecteur
 */
function selectAllEntrieSelect(selecteur){
	var elm = document.getElementsByName(selecteur);
	
	if(elm[0]){
		for(i = 0; i < elm[0].options.length; i++){
			elm[0].options[i].selected = true;
		}
	}
}

/**
 * Deselectionne toutes les entrees d'un selecteur
 *
 * @param string selecteur
 */
function deselectAllEntrieSelect(selecteur){
	var elm = document.getElementsByName(selecteur);
	
	if(elm[0]){
		for(i = 0; i < elm[0].options.length; i++){
			elm[0].options[i].selected = false;
		}
	}
}

/**
 * Deplace les entrées d'un select
 *
 * @param string selecteur
 * @param string way
 */
function moveEntrieSelectInside(selecteur, way){
	var elm = document.getElementsByName(selecteur);
	var selecteurmax = elm[0].length-2;
	var selecteursel = elm[0].selectedIndex;
	
	if ((selecteursel < 0) || (selecteursel < 1 && way == -1) || (selecteursel > selecteurmax && way == 1)) {
	} else {
		tmpopt = new Option( elm[0].options[selecteursel+way].text, elm[0].options[selecteursel+way].value );
		
		elm[0].options[selecteursel+way].text = elm[0].options[selecteursel].text; 
		elm[0].options[selecteursel+way].value = elm[0].options[selecteursel].value; 
		elm[0].options[selecteursel+way].selected = true;
		
		elm[0].options[selecteursel].text = tmpopt.text;             
		elm[0].options[selecteursel].value = tmpopt.value;
		elm[0].options[selecteursel].selected = false;
	}
}

/**
 * Supprime toutes les entrées d'un selecteur
 *
 * @param string select Id du selecteur
 */
function deleteAllEntriesSelect(select){
	var elm = document.getElementById(select);
	if(elm){
		var nb = elm.options.length;
		for(var i = (nb-1); i >= 0; i=i-1){
			elm.options[i] = null;
		}
	}
}

/**
 * Ajoute une entrée d'un selecteur
 *
 * @param string select Id du selecteur
 */
function insertEntrieSelect(select, value, label){
	var elm = document.getElementById(select);
	if(elm){
		o=new Option(label,value);
		elm.options[elm.options.length]=o;
	}
}

/**
 * Inverse le display d'un objet
 *
 * @param string selecteur
 */
function invertDisplay(id){
	var elm = document.getElementById(id);
	
	if (elm.style.display == 'none') {
		elm.style.display = 'block';
	} else {
		elm.style.display = 'none';
	}
}

/**
 * Change le display d'un objet
 *
 * @param string selecteur
 * @param string display
 */
function changeDisplay(id, display){
	document.getElementById(id).style.display = display;
}

/**
* Inverse une image par une autre (si image = image1 => image = image2 et inversement)
*
* @param string img Objet image
* @param string url Url de l'image
* @param string img1 Image1
* @param string img2 Image2
*/
function invertImages(img, url, img1, img2){
	eval("var reg_exp = /"+img1+"$/;");
	
	var elm = document.getElementById(img);
	if(reg_exp.exec(elm.src)){
		elm.src = url+img2;
	} else {
		elm.src = url+img1;
	}
}

/**
* Fonction de cochage ou decochage de toutes les checkbox commencant par name
*
* @param string formId Id du formulaire
* @param string checkboxId Id de la checkbox de reference
* @param string name debut du nom des checkbox qu'on va selectioner
*/
function checkCheckboxAllNone(formId, checkboxId, name){	
	// Protect caractere [ and ] to not disturb regexp
	var elements = name.split(/\[/);
	name = elements.join("\\\[");
	elements = name.split(/\]/);
	name = elements.join("\\\]");
	eval("var reg = /^"+name+"/");
	
	var form = document.getElementById(formId);
	for (var i = 0; i < form.elements.length; i++){
		if (form.elements[i].type == 'checkbox' && reg.exec(form.elements[i].name) != null){
			if(document.getElementById(checkboxId).checked){
				form.elements[i].checked = true;
			} else {
				form.elements[i].checked = false;
			}
		}
	}
}

//////////////////////

/////// STRING ///////
/**
 * Remplace une chaine par une autre
 *
 * @param string var_Chaine Chaine dans laquelle on remplace
 * @param string var_Ancien Chaine à remplacer
 * @param string var_Nouveau Chaine remplacante
 * @return boolean
 */
function RemplacerChaine (var_Chaine, var_Ancien, var_Nouveau){
	var var_Position = 0;
	while (var_Position != -1){
		var_Position = var_Chaine.indexOf (var_Ancien, var_Position);
		if (var_Position >= 0){
			var_Chaine = var_Chaine.substring (0, var_Position) + var_Nouveau + var_Chaine.substring (var_Position + var_Ancien.length);
			var_Position += var_Nouveau.length;
		}
	}
	return var_Chaine;
}

/**
 * Converti une monnaie en une autre 
 *
 * @param string the_Conversion Le mode de convertion
 * @param object obj_Source Objet contenant la valeur de depart
 * @param object obj_Cible Objet devant contenir la valeur transformé
 * @return boolean
 */
function ConversionMonnaie (the_Conversion, obj_Source, obj_Cible){
	switch (the_Conversion){
		case 'EvF' :
			var the_ConvertedValue = Math.round (100 * parseFloat (obj_Source.value) * 6.55957) / 100;
			if (isNaN (the_ConvertedValue)){
				alert (txt_montant_incorrect);
				obj_Source.focus();
			} else {
				obj_Cible.value = the_ConvertedValue;
			}
		break;
		
		case 'FvE' :
			var the_ConvertedValue = Math.round (100 * parseFloat (obj_Source.value) / 6.55957) / 100;
			if (isNaN (the_ConvertedValue)){
				alert (txt_montant_incorrect);
				obj_Source.focus ();
			} else {
				obj_Cible.value = the_ConvertedValue;
			}
		break;
		
		default:
			alert (txt_erreur_type_conversion);
		break;
	}
}

/**
 * Converti des euros en francs 
 *
 * @param object obj_Source Objet contenant la valeur de depart
 * @param object obj_Cible Objet devant contenir la valeur transformé
 * @return boolean
 */
function EurosVersFrancs (obj_Source, obj_Cible){
	return ConversionMonnaie ('EvF', obj_Source, obj_Cible);
}

/**
 * Converti des francs en euros 
 *
 * @param object obj_Source Objet contenant la valeur de depart
 * @param object obj_Cible Objet devant contenir la valeur transformé
 * @return boolean
 */
function FrancsVersEuros (obj_Source, obj_Cible){
	return ConversionMonnaie ('FvE', obj_Source, obj_Cible);
}

/**
 * equivalent de la fonction php: rajoute des slashes devant les caracteres speciaux
 *
 * @param string ch Chaine à proteger
 * @return string
 */
function addslashes(ch){
	ch = ch.replace(/\\/g,"\\\\");
	ch = ch.replace(/\'/g,"\\'");
	ch = ch.replace(/\"/g,"\\\"");
	return ch;
}

/**
 * fonction qui remplace les caracteres accentués
 *
 * @param string chaine Chaine à proteger
 * @return string
 */
function noaccent(chaine){
	var temp = chaine.replace(/[àâä]/gi,"a");
	temp = temp.replace(/[éèêë]/gi,"e");
	temp = temp.replace(/[îï]/gi,"i");
	temp = temp.replace(/[ôö]/gi,"o");
	temp = temp.replace(/[ùûü]/gi,"u");
	temp = temp.replace(/[ç]/gi,"c");
	return temp;
}

/**
 * fonction permettant de supprimer les espaces en debut et fin de chaine
 *
 * @param string chaine Chaine à proteger
 * @return string
 */
function trim(chaine){
	var regExpBeginning = /^\s+/;
	var regExpEnd       = /\s+$/;
	return chaine.replace(regExpBeginning, "").replace(regExpEnd, "");
}

/**
 * fonction permettant de mettre en favori le site
 *
 * @param string url et le titre 

 */
function ajoutFavoris(url,titre) {
	agent=navigator.userAgent;
	version=navigator.appVersion;

	//navigateur
	opera=(agent.indexOf("Opera")>-1)?1:0;
	ie=(agent.indexOf("MSIE")>-1)?1:0;
	firefox=(agent.indexOf("Firefox")>-1)?1:0;
	safari=(agent.indexOf("Safari")>-1)?1:0;
	
	//os
	osmac=(agent.indexOf("Mac")>-1)?1:0;

	if (osmac == 0){//on est sur PC
		if (ie == 1){
			window.external.AddFavorite(url,titre); 
		}else{
			if (firefox == 1){
				window.sidebar.addPanel(titre,url,''); 
			}else{
				alert("Cette fonction n\'est pas utilisable avec votre navigateur.\n\nUtilisez plutôt la combinaison de touches \"CTRL-D\"");
			}
		}
	}else{
		alert("Cette fonction n\'est pas utilisable sur Macintosh.\n\nUtilisez plutôt la combinaison de touches \"Pomme-D\"");
	}
}

function MoveRight() {
	var domElement = document.getElementById('Slider');
	if (domElement) {
		domElement.style.marginLeft = '-850px';
	}
}



