/**
* Fonctions génériques pour formulaires
*/
	/**
	* Supprime un élément de la page
	*
	* @param DOM_object element eléméent à supprimer
	*/
	function supprimeElement(element)
	{
		while(element.hasChildNodes())
		{//Appel Récursif
			supprimeElement(element.firstChild);
		}
		element.parentNode.removeChild(element);
	}
	/**
	* Supprime un élément de la page
	*
	* @param string id de l'element eléméent à supprimer
	*/
	function supprimeElementById(id_element)
	{
		if(document.getElementById(id_element))
		{
			supprimeElement(document.getElementById(id_element));
		}
		else
		{
			alert('Pb supprimeElementById() -> Element "' + id_element + '" non trouvé')
		}
	}
	/**
	* Vide le contenu d'un élément de la page
	*
	* @param string id de l'element eléméent à vider
	*/
	function videElementById(id_element)
	{
		if(document.getElementById(id_element))
		{
			while(document.getElementById(id_element).hasChildNodes())
			{
				supprimeElement(document.getElementById(id_element).firstChild);
			}
		}
		else
		{
			alert('Pb supprimeElementById() -> Element "' + id_element + '" non trouvé')
		}
	}
	/**
	* Vide le contenu d'un élément de la page
	*
	* @param DOM_object element eléméent à vider
	*/
	function videElement(element)
	{
		while(element.hasChildNodes())
		{
			supprimeElement(element.firstChild);
		}
	}
	function getKeyCode(e)
	{
		if(window.event)
		{
			return window.event.keyCode;
		}
		else
		{
			if(e)
			{
				return e.which;
			}
			return null;
		}
	}
	/**
	 * Retourne un tableau d'objets qui ont la classe recherchée
	 *
	 * @param node noeud_dom limiter la recherche aux enfants d'un noeud (optionnel)
	 * @param tag string limiter la recherche à un type de noeud (optionnel), '*' pour jocker
	 */
	function getElementsByClass(searchClass, node, tag)
	{
		var classElements = new Array();
		if(node == null)
		{
			node = document;
		}
		if(tag == null)
		{
			tag = '*';
		}
		var els = node.getElementsByTagName(tag);
		var elsLen = els.length;
		var pattern = new RegExp("(^|\\s)" + searchClass + "(\\s|$)");
		for (var i = 0, j = 0; i < elsLen; i++)
		{
			if(pattern.test(els[i].className))
			{
				classElements[j] = els[i];
				j++;
			}
		}
		return classElements;
	}

	function addEvent(obj, type, fn)
	{
		if(obj.addEventListener)
		{
			obj.addEventListener(type, fn, false);
		}
		else if(obj.attachEvent)
		{
			obj["e" + type + fn] = fn;
			obj[type + fn] = function()
			{
				obj["e" + type + fn](window.event);
			}
			obj.attachEvent("on" + type, obj[type + fn]);
		}
	}

	function removeEvent(obj, type, fn)
	{
		if(obj.removeEventListener)
		{
			obj.removeEventListener(type, fn, false);
		}
		else if(obj.detachEvent)
		{
			obj.detachEvent("on" + type, obj[type + fn]);
			obj[type + fn] = null;
			obj["e" + type + fn] = null;
		}
	}

	/**
	* Contrôle la saisie d'un champs textarea
	*
	* @param DOM_object textarea lien DOM vers le textarea à contrôler
	* @param string id_cible nom du conteneur qui affiche le nombre de caractères saisis
	*/
	function compteur_textarea(textarea,id_cible)
	{
		var textarea_value = textarea.value;//On récupère la valeur courrante
		textarea_value = textarea_value.substring(0,getAttributeFromClass(textarea,'maxlength'));//On supprimme ce qui dépasse éventuellement
		textarea.value = textarea_value;
		document.getElementById(id_cible).firstChild.nodeValue = textarea_value.length;//On indique la longueur courrante
	}
	function keyRestrict(e,validchars)
	{
		var key = '';
		var keychar = '';
		key = getKeyCode(e);
		if(key == null)
		{
			return true;
		}
		keychar = String.fromCharCode(key);
		keychar = keychar.toLowerCase();
		validchars = validchars.toLowerCase();
		if(validchars.indexOf(keychar) != -1)
		{
			return true;
		}
		if(
			key == null
			|| key == 0
			|| key == 8
			|| key == 9
			|| key == 13
			|| key == 27
		)
		{
			return true;
		}
		return false;
	}
	function limiterSaisie(obj,event)
	{
		if(obj.className.search(/numeric/) != -1)
		{
			return keyRestrict(event,'1234567890');
		}
		else
		{
			if(class_obj.search(/alpha/) != -1)
			{
				return keyRestrict(event,'abcdefghijklmnopqrstuvwxyz ' + String.fromCharCode(241));
			}
			return true;
		}
	}
	/**
	 * Exactement le même comportement que "limiterSaisie()"
	 * La seule différence est que le paramètre de pointage est un id au lien d'un objet DOM
	 */
	function limiterSaisieById(id_obj,event)
	{
		return limiterSaisie(document.getElementById(id_obj),event);
	}
	/**
	 * Fonction générique, lie une fonction à un évènement pour un objet
	 */
	function ajouterEvenement(obj,evenement,fonction)
	{
		if(obj.addEventListener)
		{
			obj.addEventListener(evenement,fonction,false);
			return true;
		}
		if(obj.attachEvent)
		{
			obj.attachEvent(evenement,fonction);
			return true;
		}
		return false;
	}
	/**
	* Fonction générique, délie une fonction à un évènement pour un objet
	*/
	function retirerEvenement(obj,evenement,fonction)
	{
		if(obj.addEventListener)
		{
			obj.removeEventListener(evenement,fonction,false);
			return true;
		}
		if(obj.detachEvent)
		{
			obj.detachEvent(evenement,fonction);
			return true;
		}
		return false;
	}
	/**
	 * Fonction générique, récupère un attribut dans la classe d'un objet DOM
	 *
	 * Ne marche que pour des attributs passées comme suit : class="NomAttribut-ValeurCorrespondante"
	 *
	 * @param DOM objet_DOM Objet DOM interrogé
	 * @param string nom_attribut Nom de l'attribut
	 * @return string retourne la valeur correspondante, ou FALSE si l'attribut n'est pas trouvé
	 */
	function getAttributeFromClass(objet_DOM,nom_attribut)
	{
		var tmp1 = objet_DOM.className.split(' ');
		for(var i = 0; i < tmp1.length; i++)
		{
			var tmp2 = tmp1[i].split('-');
			if(tmp2.length >= 2 && tmp2[0] == nom_attribut)
			{
				return tmp2[1];
			}
		}
		return false;
	}
	/**
	 * Transforme une chaine passée en paramètre en une autre utilisable en URL
	 *
	 * @param string chaine_origine
	 * @param string id_champs_cible
	 * @return string retourne la chaine sans accents, en minuscules, avec des tirets pour séparer les mots
	 */
	function transformChainePourURL(chaine_origine,id_champs_cible)
	{
		var xmlhttp_object = null;
		if(window.XMLHttpRequest)
		{
			xmlhttp_object = new XMLHttpRequest();
		}
		else if(window.ActiveXObject)
		{
			xmlhttp_object = new ActiveXObject('Microsoft.XMLHTTP');
		}
		else
		{
			return;
		}
		xmlhttp_object.open('POST','retourne_chaine_url.php',true); //ouverture asynchrone
		xmlhttp_object.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		xmlhttp_object.onreadystatechange = function()
		{
			if(xmlhttp_object.readyState == 4)
			{
				var chaine_url = xmlhttp_object.responseText;
				document.getElementById(id_champs_cible).value = chaine_url;
				return;
			}
		}
		xmlhttp_object.send('chaine=' + chaine_origine);
	}
	/**
	 * Fonction générique, charge en mémoire le contenu d'un formulaire pour avoir une comparaison à faire au moment de la sortie
	 */
	function scanne_formulaire()
	{
		window.formulaire_init = new Array();
		for(var i = 0; i < document.forms[0].elements.length; i++)
		{
			var name = document.forms[0].elements[i].name;
			switch(document.forms[0].elements[i].type)
			{
				case 'radio':
					window.formulaire_init[document.forms[0].elements[i].name + '_' + document.forms[0].elements[i].value] = new Array();
					window.formulaire_init[document.forms[0].elements[i].name + '_' + document.forms[0].elements[i].value]['type'] = document.forms[0].elements[i].type;
					window.formulaire_init[document.forms[0].elements[i].name + '_' + document.forms[0].elements[i].value]['checked'] = document.forms[0].elements[i].checked;
					break;
				case 'checkbox':
					window.formulaire_init[document.forms[0].elements[i].name] = new Array();
					window.formulaire_init[document.forms[0].elements[i].name]['type'] = document.forms[0].elements[i].type;
					window.formulaire_init[document.forms[0].elements[i].name]['checked'] = document.forms[0].elements[i].checked;
					break;
				case 'text':
				case 'textarea':
					var curent_name = document.forms[0].elements[i].name;
					if(curent_name.search(/\[\]/) != -1)
					{//Tableau
						var nom_tableau = curent_name.substr(0,curent_name.length - 2);
						if(!window.formulaire_init[nom_tableau])
						{
							window.formulaire_init[nom_tableau] = new Array();
						}
						var new_line = window.formulaire_init[nom_tableau].length;
						window.formulaire_init[nom_tableau][new_line] = new Array();
						window.formulaire_init[nom_tableau][new_line]['type'] = document.forms[0].elements[i].type;
						window.formulaire_init[nom_tableau][new_line]['value'] = document.forms[0].elements[i].value;
					}
					else
					{
						window.formulaire_init[document.forms[0].elements[i].name] = new Array();
						window.formulaire_init[document.forms[0].elements[i].name]['type'] = document.forms[0].elements[i].type;
						window.formulaire_init[document.forms[0].elements[i].name]['value'] = document.forms[0].elements[i].value;
					}
					break;
				case 'select-one':
					var curent_name = document.forms[0].elements[i].name;
					if(curent_name.search(/\[\]/) != -1)
					{//Tableau
						var nom_tableau = curent_name.substr(0,curent_name.length - 2);
						if(!window.formulaire_init[nom_tableau])
						{
							window.formulaire_init[nom_tableau] = new Array();
						}
						var new_line = window.formulaire_init[nom_tableau].length;
						window.formulaire_init[nom_tableau][new_line] = new Array();
						window.formulaire_init[nom_tableau][new_line]['type'] = document.forms[0].elements[i].type;
						for(var j = 0; j< document.forms[0].elements[i].length; j++)
						{
							if(document.forms[0].elements[i].options[j].selected == true)
							{
								window.formulaire_init[nom_tableau][new_line]['value'] = document.forms[0].elements[i].options[j].value;
							}
						}
					}
					else
					{
						window.formulaire_init[document.forms[0].elements[i].name] = new Array();
						window.formulaire_init[document.forms[0].elements[i].name]['type'] = document.forms[0].elements[i].type;
						for(var j = 0; j < document.forms[0].elements[i].length; j++)
						{
							if(document.forms[0].elements[i].options[j].selected == true)
							{
								window.formulaire_init[document.forms[0].elements[i].name]['value'] = document.forms[0].elements[i].options[j].value;
							}
						}
					}
					break;
			}
		}
		for(var i = 0; i < document.getElementsByTagName('a').length; i++)
		{
			var href = document.getElementsByTagName('a')[i].getAttribute('href');
			if(
				href.search(/javascript/) == -1
				&& href.search(/action/) == -1
				&& href.search(/jpg/) == -1
				&& document.getElementsByTagName('a')[i].className != 'popup'
				&& document.getElementsByTagName('a')[i].className != 'lightbox_link'
			)
			{
				document.getElementsByTagName('a')[i].onclick = function(){return cherche_modif_formulaire();};
			}
		}
	}
	/**
	 * Fonction générique, charge en mémoire le contenu d'un formulaire pour avoir une comparaison à faire au moment de la sortie
	 */
	function cherche_modif_formulaire()
	{
		var identique = true;
		for(var i = 0; i < document.forms[0].elements.length; i++)
		{
			if(identique == true)
			{
				switch(document.forms[0].elements[i].type)
				{
					case 'radio':
						if(window.formulaire_init[document.forms[0].elements[i].name + '_' + document.forms[0].elements[i].value]['checked'] != document.forms[0].elements[i].checked)
						{
							identique = false;
						}
						break;
					case 'checkbox':
						if(window.formulaire_init[document.forms[0].elements[i].name]['checked'] != document.forms[0].elements[i].checked)
						{
							identique = false;
						}
						break;
					case 'text':
					case 'textarea':
						var curent_name = document.forms[0].elements[i].name;
						if(curent_name.search(/\[\]/) != -1)
						{//Tableau
							var nom_tableau = curent_name.substr(0,curent_name.length - 2);
							identique = false;
							for(var j = 0; j < window.formulaire_init[nom_tableau].length; j++)
							{
								if(document.forms[0].elements[i].value == window.formulaire_init[nom_tableau][j]['value'])
								{
									identique = true;
								}
							}
						}
						else
						{
							if(window.formulaire_init[document.forms[0].elements[i].name]['value'] != document.forms[0].elements[i].value)
							{
								identique = false;
							}
						}
						break;
					case 'select-one':
						var curent_name = document.forms[0].elements[i].name;
						if(curent_name.search(/\[\]/) != -1)
						{//Tableau
							var nom_tableau = curent_name.substr(0,curent_name.length - 2);
							identique = false;
							for(var j = 0; j < document.forms[0].elements[i].length; j++)
							{
								if(document.forms[0].elements[i].options[j].selected == true)
								{
									for(var k = 0; k < window.formulaire_init[nom_tableau].length; k++)
									{
										if(document.forms[0].elements[i].options[j].value == window.formulaire_init[nom_tableau][k]['value'])
										{
											identique = true;
										}
									}
								}
							}
						}
						else
						{
							for(var j = 0; j < document.forms[0].elements[i].length; j++)
							{
								if(document.forms[0].elements[i].options[j].selected == true)
								{
									if(window.formulaire_init[document.forms[0].elements[i].name]['value'] != document.forms[0].elements[i].options[j].value)
									{
										identique = false;
									}
								}
							}
						}
						break;
				}
			}
			else
			{
				return confirm('Le formulaire a été modifié.\n\nVoulez-vous vraiment quitter sans sauvegarder ?\n\nAppuyer sur "Ok" pour continuer ou sur "Annuler" pour rester sur la page actuelle.');
			}
		}
		return true;
	}
	function selectNextPaire(obj,event,id_next)
	{
		if(
			obj.value.length == 2
			&& (
				(//Pavé numérique
					getKeyCode(event) >= 96
					&& getKeyCode(event) <= 105
				)
				||
				(//Touches avec MAJ
					getKeyCode(event) >= 48
					&& getKeyCode(event) <= 59
				)
			)
		)
		{//Seulement si le champs est numérique et si le champs avait atteint la longueur 2
			document.getElementById(id_next).focus();
			document.getElementById(id_next).select();
		}
	}