

/* *************************************
Ce fichier JS contient diverses methodes
************************************* */

function addslashes(input_string)
{
	/* *************************************
	NAME :
		addslashes
	INPUT :
		input_string => chaine dont on va faire un "escape" sur les guillemets et apostrophes
	OUTPUT :
		- (fait preceder les guillemets et apostrophes d'un slash)
	************************************* */
	return input_string.replace(/\"/g,"\\\"").replace(/\'/g,"\\\'");
}

/* detection du browser */
var b_ie			= false; /* Internet Explorer */
var b_ff			= false; /* Netscape/Firefox */
var b_sf			= false; /* Safari */
var b_chrome	= false; /* Chrome */

switch (navigator.appName.toLowerCase()) /* possibilite d'affiner avec "navigator.appVersion" */
{
	case "microsoft internet explorer":
	case "adobe svg viewer": /* pour l'affichage svg sous IE */
		b_ie = true;
		break;
	case "netscape":
		b_ff = true;
		if(navigator.userAgent.toLowerCase().indexOf("chrome")>-1)b_chrome = true;
		if(navigator.userAgent.toLowerCase().indexOf("safari")>-1)b_sf = true;
		break;
	case "safari":
		b_sf = true;
}

/* Browser Detect Lite  v2.1.4 */
/* http://www.dithered.com/javascript/browser_detect/index.html */
/* modified by Chris Nott (chris@NOSPAMdithered.com - remove NOSPAM)*/
/* detection du browser complete */
function BrowserDetectLite() {
   var ua = navigator.userAgent.toLowerCase();

   /* browser name */
   this.isGecko     = (ua.indexOf('gecko') != -1 && ua.indexOf('safari') == -1);
   this.isMozilla   = (this.isGecko && ua.indexOf('gecko/') + 14 == ua.length);
   this.isNS        = ( (this.isGecko) ? (ua.indexOf('netscape') != -1) : ( (ua.indexOf('mozilla') != -1) && (ua.indexOf('spoofer') == -1) && (ua.indexOf('compatible') == -1) && (ua.indexOf('opera') == -1) && (ua.indexOf('webtv') == -1) && (ua.indexOf('hotjava') == -1) ) );
   this.isIE        = ( (ua.indexOf('msie') != -1) && (ua.indexOf('opera') == -1) && (ua.indexOf('webtv') == -1) );
   this.isSafari    = (ua.indexOf('safari') != - 1);
   this.isOpera     = (ua.indexOf('opera') != -1);
   this.isKonqueror = (ua.indexOf('konqueror') != -1 && !this.isSafari);
   this.isIcab      = (ua.indexOf('icab') != -1);
   this.isAol       = (ua.indexOf('aol') != -1);

   /* spoofing and compatible browsers */
   this.isIECompatible = ( (ua.indexOf('msie') != -1) && !this.isIE);
   this.isNSCompatible = ( (ua.indexOf('mozilla') != -1) && !this.isNS && !this.isMozilla);

   /* browser version */
   this.versionMinor = parseFloat(navigator.appVersion);

   /* correct version number */
   if (this.isNS && this.isGecko) {
      this.versionMinor = parseFloat( ua.substring( ua.lastIndexOf('/') + 1 ) );
   }
   else if (this.isIE && this.versionMinor >= 4) {
      this.versionMinor = parseFloat( ua.substring( ua.indexOf('msie ') + 5 ) );
   }
   else if (this.isMozilla) {
      this.versionMinor = parseFloat( ua.substring( ua.indexOf('rv:') + 3 ) );
   }
   else if (this.isSafari) {
      this.versionMinor = parseFloat( ua.substring( ua.lastIndexOf('/') + 1 ) );
   }
   else if (this.isOpera) {
      if (ua.indexOf('opera/') != -1) {
         this.versionMinor = parseFloat( ua.substring( ua.indexOf('opera/') + 6 ) );
      }
      else {
         this.versionMinor = parseFloat( ua.substring( ua.indexOf('opera ') + 6 ) );
      }
   }
   else if (this.isKonqueror) {
      this.versionMinor = parseFloat( ua.substring( ua.indexOf('konqueror/') + 10 ) );
   }
   else if (this.isIcab) {
      if (ua.indexOf('icab/') != -1) {
         this.versionMinor = parseFloat( ua.substring( ua.indexOf('icab/') + 6 ) );
      }
      else {
         this.versionMinor = parseFloat( ua.substring( ua.indexOf('icab ') + 6 ) );
      }
   }

   this.versionMajor = parseInt(this.versionMinor);
   this.geckoVersion = ( (this.isGecko) ? ua.substring( (ua.lastIndexOf('gecko/') + 6), (ua.lastIndexOf('gecko/') + 14) ) : -1 );

   /* dom support */
   this.isDOM1 = (document.getElementById);
   this.isDOM2Event = (document.addEventListener && document.removeEventListener);

   /* css compatibility mode */
   this.mode = document.compatMode ? document.compatMode : 'BackCompat';

   /* platform */
   this.isWin   = (ua.indexOf('win') != -1);
   this.isWin32 = (this.isWin && ( ua.indexOf('95') != -1 || ua.indexOf('98') != -1 || ua.indexOf('nt') != -1 || ua.indexOf('win32') != -1 || ua.indexOf('32bit') != -1 || ua.indexOf('xp') != -1) );
   this.isMac   = (ua.indexOf('mac') != -1);
   this.isUnix  = (ua.indexOf('unix') != -1 || ua.indexOf('sunos') != -1 || ua.indexOf('bsd') != -1 || ua.indexOf('x11') != -1);
   this.isLinux = (ua.indexOf('linux') != -1);

   /* specific browser shortcuts */
   this.isNS4x = (this.isNS && this.versionMajor == 4);
   this.isNS40x = (this.isNS4x && this.versionMinor < 4.5);
   this.isNS47x = (this.isNS4x && this.versionMinor >= 4.7);
   this.isNS4up = (this.isNS && this.versionMinor >= 4);
   this.isNS6x = (this.isNS && this.versionMajor == 6);
   this.isNS6up = (this.isNS && this.versionMajor >= 6);
   this.isNS7x = (this.isNS && this.versionMajor == 7);
   this.isNS7up = (this.isNS && this.versionMajor >= 7);

   this.isIE4x = (this.isIE && this.versionMajor == 4);
   this.isIE4up = (this.isIE && this.versionMajor >= 4);
   this.isIE5x = (this.isIE && this.versionMajor == 5);
   this.isIE55 = (this.isIE && this.versionMinor == 5.5);
   this.isIE5up = (this.isIE && this.versionMajor >= 5);
   this.isIE6x = (this.isIE && this.versionMajor == 6);
   this.isIE6up = (this.isIE && this.versionMajor >= 6);

   this.isIE4xMac = (this.isIE4x && this.isMac);
}
var browser = new BrowserDetectLite();

function cancelbubble_event(e)
{
	/* *************************************
	NAME :
		cancelbubble_event
	INPUT :
		e => evenement
	OUTPUT :
		- (applique le cancelbubble)
	************************************* */
	if (b_ie) e.cancelBubble	= true;
	if (b_ff || b_chrome) e.stopPropagation();
}

function dec2hex(input)
{
	/* *************************************
	NAME :
		dec2hex
	INPUT :
		input	=> décimal à convertir en héxadécimal
	OUTPUT :
		héxadécimal du décimal donné en paramètres
	************************************* */
	return input.toString(16);
}
function hex2dec(input)
{
	/* *************************************
	NAME :
		hex2dec
	INPUT :
		input	=> hexadécimal à convertir en décimal
	OUTPUT :
		décimal de l'héxadécimal donné en paramètres
	************************************* */
	return parseInt(input, 16);
}
function color_invert(input)
{
	/* *************************************
	NAME :
		color_invert
	INPUT :
		input	=> couleur à inverser (ex: #ff0000)
	OUTPUT :
		inverse de la couleur spécifiée (ex: #ff0000 => #00ffff)
	************************************* */
	/* cas spéciaux */
	if (input == "transparent") return "#000000";
	if (input == "") return "#000000";

	if (input.length == 4 && input.substr(0, 1) == "#")
	{	/* format #xyz => à mettre au format #xxyyzz */
		input = "#" + input.substr(1, 1) + input.substr(1, 1) + input.substr(2, 1) + input.substr(2, 1) + input.substr(3, 1) + input.substr(3, 1);
	}

	if (input.length != 7 || input.substr(0, 1) != "#")
	{	/* format invalide */
		return "#000000";
	}

	var tmp_string	= rgb_to_hex(input);
	tmp_string			= tmp_string.replace("#", "");
	var r						= dec2hex(255 - hex2dec(tmp_string.substr(0,2)));
	r								= (r.length > 1) ? r : "0" + r;
	var g						= dec2hex(255 - hex2dec(tmp_string.substr(2,2)));
	g								= (g.length > 1) ? g : "0" + g;
	var b						= dec2hex(255 - hex2dec(tmp_string.substr(4,2)));
	b								= (b.length > 1) ? b : "0" + b;
	return "#" + r + g + b;
}

/* tableau contenant la position de départ (et de fin en cas de sélection) du curseur dans l'input/textarea */
var cursor_position = new Array(0, 0);
function cursor_position_restore(object_reference, iframe_mode)
{
	/* *************************************
	NAME :
		cursor_position_restore
	INPUT :
		object_reference	=> objet de référence
		iframe_mode				=> true si on veut la position dans une iframe en mode "designMode"
	OUTPUT :
		- (restauration de la position du curseur dans l'objet)
	************************************* */
	/* remise en place du curseur à la position à laquelle il était lors de la sauvegarde */
	var position_start	= cursor_position[0];
	var position_end		= cursor_position[1];

	if (b_ie)
	{
		object_reference.focus();
		/* même code en mode iframe ou pas */
		var range = object_reference.document.selection.createRange();
		range.collapse(true);
		range.moveEnd('character',  position_end);
		range.moveStart('character', position_start);
	}

	if (b_ff)
	{
		if (iframe_mode)
		{
			/* la sauvegarde de la position n'a pas été fiable => ne rien faire */
		}
		else
		{
			object_reference.focus();
			object_reference.setSelectionRange(position_start, position_end);
		}
	}

	return true;
}

function cursor_position_save(object_reference, iframe_mode)
{
	/* *************************************
	NAME :
		cursor_position_save
	INPUT :
		object_reference	=> objet de référence
		iframe_mode				=> true si on veut la position dans une iframe en mode "designMode"
	OUTPUT :
		- (sauvegarde de la position du curseur dans l'objet)
	************************************* */
	cursor_position = new Array(0, 0);

	if (b_ie)
	{
		object_reference.focus();
		/* même code en mode iframe ou pas */
		var selection_range	= document.selection.createRange().duplicate();
		var before_range		= document.body.createTextRange();
		before_range.moveToElementText(object_reference);					/* sélection de tout le texte */
		before_range.setEndPoint("EndToStart", selection_range);	/* déplacement de la fin où on en a besoin */
		var after_range			= document.body.createTextRange();
		after_range.moveToElementText(object_reference);					/* sélection de tout le texte */
		after_range.setEndPoint("StartToEnd", selection_range);		/* déplacement du début où on en a besoin */
		var before_text, selection_text, after_text;
		/* charge la valeur du texte que l'on veut comparer */
		before_text					= before_range.text;
		selection_text			= selection_range.text;
		after_text					= after_range.text;
		cursor_position[0]	= before_text.length;
		cursor_position[1]	= before_text.length + selection_text.length;
	}

	if (b_ff)
	{
		if (iframe_mode)
		{
			/* startOffset et endOffset renvoient la position relative à la ligne courante, et pas absolue... => on ne peut rien en faire */
			/*
			var sel							= object_reference.getSelection();
			var range						= sel.getRangeAt(0);
			var container				= range.startContainer;
			cursor_position[0]	= range.startOffset;
			cursor_position[1]	= range.endOffset;
			*/
		}
		else
		{
			cursor_position[0]	= object_reference.selectionStart;
			cursor_position[1]	= object_reference.selectionEnd;
		}
	}

	return true;
}

function doc_exe_js(object_document, id_script, timeout)
{
	/* *************************************
	NAME :
		doc_exe_js
	INPUT :
		object_document	=> document de reference contenant le code a executer
		id_script				=> id de l'objet contenant (au sens "value") le code a executer
		timeout					=> eventuel delai avant execution (ex: 1000, 2000...)
	OUTPUT :
		- (le code javascript situe dans l'objet "object_document" au niveau d'une balise <textarea id=id_script> ou <script id=id_script> est execute)
	************************************* */
	/* retour a l'accueil ou derniere vue affichee ou page en cours de modification */
	try
	{
		/* gestion du cas ou plusieurs scripts existent (par exemple pour formateur_page_menu) */
		if (String(timeout) == "undefined" || timeout == null)
			timeout = 0;
		if (object_document.getElementsByName(id_script).length)
		{
			for (var i=0 ; i<object_document.getElementsByName(id_script).length ; i++)
			{
				var script_tags = object_document.getElementsByName(id_script)[i];
				if (script_tags != null)
				{
					/* en priorité on prend le "value" (par exemple pour un "<textarea>..."), sinon le "innerHTML" (par exemple pour un "<script>...") */
					var js_code	= String(script_tags.value) != "undefined" ? script_tags.value : script_tags.innerHTML;
					/* exécution */
					if (String(js_code) != "undefined")
						window.setTimeout(js_code, timeout);
				}
			}
		}
		else
		{
			var script_tags = object_document.getElementById(id_script);

			if (script_tags != null)
			{
				/* en priorité on prend le "value" (par exemple pour un "<textarea>..."), sinon le "innerHTML" (par exemple pour un "<script>..." */
				var js_code	= String(script_tags.value) != "undefined" ? script_tags.value : script_tags.innerHTML;
				/* exécution */
				if (String(js_code) != "undefined")
					window.setTimeout(js_code, timeout);
			}
		}
	}
	catch(erreur) {}
	return true;
}

function dom_remove_newline_nodes(ref_dom)
{
	/* *************************************
	NAME :
		dom_remove_newline_nodes
	INPUT :
		ref_dom => DOM de reference
	OUTPUT :
		- (suppression des nodes "\n" du DOM fourni en argument)
	************************************* */
	var tmp_node = null;
	for (var i=ref_dom.childNodes.length-1 ; i>=0 ; i--)
	{
		tmp_node = ref_dom.childNodes[i];
		if (tmp_node.nodeType == 3 && (tmp_node.nodeValue.match(/ *\n */gi) != null))
		{
			ref_dom.removeChild(tmp_node);
		}
		else
		{
			dom_remove_newline_nodes(tmp_node);
		}
	}
	return true;
}

function export_table_to_xls(input_table, export_type)
{
	/* *************************************
	NAME :
		export_table_to_xls
	INPUT :
		input_table	=> table à exporter
		export_type	=> "excel" pour télécharger vers Excel
								=> sinon téléchargement classique
	OUTPUT :
		- (export de la table sous une forme ou une autre, par appel serveur)
	************************************* */
	var result = "";

	if (String(input_table.tagName).toLowerCase() != "table")
	{
		fog_manage(true);
		window.setTimeout("msg_alert('', language_msg('00934'), '', true);", 100);
		return false;
	}

	if (export_type == "excel")
	{	/* Excel : conserver une table HTML classique */
		var tmp_string	= get_outerHTML(input_table);
		/* suppression des attributs HTML inutiles*/
		tmp_string			= tmp_string.replace(/ class=".*"/gi, "");
		tmp_string			= tmp_string.replace(/ header=".*"/gi, "");
		tmp_string			= tmp_string.replace(/ onclick=".*"/gi, "");
		tmp_string			= tmp_string.replace(/ style=".*"/gi, "");
		/* remplacement des sauts de ligne incohérents pour Excel */
		tmp_string			= tmp_string.replace(/<br\/>/gi, "<br>");
		result					= tmp_string;
	}
	else
	{
		var x						= input_table.rows
		for (i=0 ; i<x.length ; i++)
		{
			var y					= x[i].cells
			for (j=0 ; j<y.length ; j++)
			{
				/* épuration des tags */
				result			+= remove_html_tags(y[j].innerHTML) + String.fromCharCode(9)
			}
			result				+= String.fromCharCode(13)
		}
	}

	/* soumission dans une autre fenêtre (iframe) */
	var rnd																								= String(Math.random());
	var export_table_to_xls_iframe												= document.createElement("iframe");
	export_table_to_xls_iframe.style.display							= "none";
	export_table_to_xls_iframe.setAttribute("src", "about:blank");
	export_table_to_xls_iframe.setAttribute("id", "export_table_to_xls_iframe_" + rnd);
	document.body.appendChild(export_table_to_xls_iframe);
	var window_document																		= (b_ie ? export_table_to_xls_iframe.contentWindow.document : export_table_to_xls_iframe.contentDocument);
	window_document.write("<form id='form_main' action='../php/miscellaneous.php' method='post' onSubmit='return false;'>");
	window_document.write("<input type='text' name='export_data' id='export_data'/>");
	window_document.write("<input type='text' name='export_type' id='export_type'/>");
	window_document.write("<input type='text' name='param_action' id='param_action'/>");
	window_document.getElementById("export_data").value		= result;
	window_document.getElementById("export_type").value		= export_type;
	window_document.getElementById("param_action").value	= "export_table";
	window_document.write("<script type='text/javascript'>document.getElementById('form_main').submit();</script>");
	window_document.write("</form>");

	/* suppression de l'iframe */
	window.setTimeout("document.getElementById('export_table_to_xls_iframe_" + rnd + "').parentNode.removeChild(document.getElementById('export_table_to_xls_iframe_" + rnd + "'));", 30000);

	return true;
}

function fields_get(ref_object, value_or_field, separator, separator_multiple, escape_it)
{
	/* *************************************
	NAME :
		fields_get
	INPUT :
		ref_object					=> objet de reference dans lequel on recherche (ex: document)
		value_or_field			=> 'value' ou 'field', permet de dire si on souhaite renvoyer la liste des valeurs ou la liste des objets
		separator						=> separateur a utiliser pour separer les valeurs
		separator_multiple	=> separateur de valeurs multiples
		escape_it						=> true/false selon que l'on souhaite ou non faire un "escape" sur les valeurs ou non
	OUTPUT :
		Si value_or_field = 'value' => name_field1=value_field1&name_field2=value_field2&... (recuperation de tous les champs et de leurs valeurs)
		Si value_or_field = 'field' => tableau contenant les objets
	************************************* */
	var result_values = "";
	var result_fields = new Array();
	var object_type		= "";
	var tmp_string		= "";
	var tmp_value			= "";
	var object				= "";
	if (separator == null) separator = "&";

	var alltags = ref_object.getElementsByTagName("*");
	for (var i=0 ; i<alltags.length ; i++)
	{
		object				= alltags[i];
		try
		{
			object_type = object.type;
		}
		catch(e)
		{
			object_type	= "";
		}

		if (object.name != "")
		{
			switch(String(object_type).toLowerCase())
			{
				case "file" :
				case "hidden" :
				case "password" :
				case "text" :
				case "textarea" :
					result_fields[result_fields.length] = object;
					result_values += separator + object.name + "=" + field_get_value(object, separator_multiple, escape_it);
					break;
				case "select" :
				case "select-one" :
				case "select-multiple" :
					tmp_value = "";
					result_fields[result_fields.length] = object;
					result_values += separator + object.name + "=" + field_get_value(object, separator_multiple, escape_it);
					break;
				case "radio" :
					result_fields[result_fields.length] = object;
					result_values += separator + object.name + "=" + field_get_value(object, separator_multiple, escape_it);
					break;
				default :
			}
		}
	}
	result_values = result_values.substr(1, result_values.length);
	if (value_or_field == "value") return (result_values);
	if (value_or_field == "field") return (result_fields);
	return (false);
}

function field_get_value(ref_object, separator_multiple, escape_it)
{
	/* *************************************
	NAME :
		field_get_value
	INPUT :
		ref_object					=> objet de reference dont on veut récupérer la valeur
		separator_multiple	=> separateur de valeurs multiples
		escape_it						=> true/false selon que l'on souhaite ou non faire un "escape" sur les valeurs ou non
	OUTPUT :
		valeur de l'objet
	************************************* */
	if (String(ref_object) == "undefined" || ref_object == null) return "";

	if (String(separator_multiple) == "undefined")	separator_multiple	= "";
	if (String(escape_it) == "undefined")						escape_it						= false;

	var result_value	= "";
	var object_type		= ref_object.type;
	/* gestion du cas "bouton radio" */
	if (object_type == "" || String(object_type) == "undefined")
		if (String(ref_object.length) != "undefined")
			object_type		= ref_object[0].type;

	switch(String(object_type).toLowerCase())
	{
		case "file" :
		case "hidden" :
		case "password" :
		case "text" :
		case "textarea" :
			/* encodage du signe '+' a la source pour eviter les pbs ajax */
			result_value = (escape_it ? escape((ref_object.value).replace(/\+/gi , "%2B")) : ref_object.value);
			break;
		case "select" :
		case "select-one" :
		case "select-multiple" :
			result_value = "";
			for (var k=0 ; k<ref_object.options.length ; k++)
				if (ref_object.options[k].selected)
				{
					var tmp_string = (ref_object.options[k].value != "" ? ref_object.options[k].value : ref_object.options[k].text);
					if (result_value != "")
						result_value += separator_multiple;
					result_value += (escape_it ? escape(tmp_string) : tmp_string);
				}
			break;
		case "radio" :
			for (var k=0 ; k<ref_object.length ; k++)
				if (ref_object[k].checked)
					result_value = (escape_it ? escape(ref_object[k].value) : ref_object[k].value);
			break;
		default :
	}
	return result_value;
}

function field_set_value(ref_object, value)
{
	/* *************************************
	NAME :
		field_set_value
	INPUT :
		ref_object => objet de reference dont on met a jour la valeur (ex: document.getElementById("input_texte")
		value => valeur que l'on souhaite donner au champ
	OUTPUT :
		- (true si tout a bien fonctionne et false sinon)
	************************************* */
	if (String(ref_object) == "undefined" || ref_object == null) return false;

	tmp_string = ref_object.type;
	switch(String(tmp_string).toLowerCase())
	{
		case "hidden" :
		/* on ne met pas a jour un champ de type password */
		/*case "password" :*/
		case "text" :
			ref_object.value = value;
			break;
		case "textarea" :
			if (b_ie)
				ref_object.value = value;
			if (b_ff)
				ref_object.innerHTML = value;
			break;
		case "select" :
		case "select-one" :
		case "select-multiple" :
			for (var k=0 ; k<ref_object.length ; k++)
				if (ref_object[k].value == value)
					ref_object[k].selected = true;
			break;
		case "radio" :
			for (var k=0 ; k<ref_object.length ; k++)
				if (ref_object[k].value == value)
					ref_object[k].checked = true;
			break;
		default :
	}
	return (false);
}

function fnIs_coordinate(tmp_string)
{
	/* *************************************
	NAME :
		fnIs_coordinate
	INPUT :
		tmp_string	=> chaine a verifier
	OUTPUT :
		true si la chaine est de type coordonnees gmap et false sinon
	************************************* */
	var pattern = new RegExp(".*<x>.*<\/x><y>.*<\/y>.*", "gi");
	return pattern.test(tmp_string);
}

function fnIs_coordinate_light(tmp_string)
{
	/* *************************************
	NAME :
		fnIs_coordinate_light
	INPUT :
		tmp_string	=> chaine a verifier
	OUTPUT :
		true si la chaine est de type coordonnees gmap et false sinon (test plus simple que fnIs_coordinate)
	************************************* */
	var pattern = new RegExp("<point><x>.*<\/x>.*", "gi");
	return pattern.test(tmp_string);
}

/* [Reload de la page] */
function fnReload(){
	/* *************************************
	NAME :
		fnReload
	INPUT :
		-
	OUTPUT :
		- (recharge la fenetre courante)
	************************************ */
	tmpUrl								= window.location.href;
	tmpUrl2								= (unescape(tmpUrl)).replace(/(req>)[^<]*(<\/req>)/gi, "$1$2");
	window.location.href	= tmpUrl2;
	return true;
}

/*
a mettre dans la page utilisant le fog si fog active par defaut (pour gerer le 1er affichage de la page)
<iframe id='iframe_fog' src='../html/fog.html' class='css_fog' frameborder='0' style='z-index:400000;' zIndexDefault='400000'></iframe>
*/
function fog_get_status()
{
	/* *************************************
	NAME :
		fog_get_status
	INPUT :
		-
	OUTPUT :
		- (renvoie true si le fog est active et false sinon)
	************************************ */
	return document.getElementById('iframe_fog').style.display == "block";
}

function fog_manage(activate)
{
	/* *************************************
	NAME :
		fog_manage
	INPUT :
		activate => true ou false selon que l'on veut voir afficher ou non le voile qui masque tout
	OUTPUT :
		- (true si tout a bien fonctionne et false sinon)
	************************************ */
	var fog = document.getElementById('iframe_fog');
	if (String(fog) != "undefined" && fog != null)
	{
		fog.style.display	= activate ? "none" : "block";
		fog.className			= "css_fog"; /* il faut le forcer car probleme sinon en cas de reaffichage via msg_error */

		/* calcul des nouvelles dimensions */
		var new_width			= window_get_sizes(window, "max_x");
		if (b_ff)
		{	/* largeur de l'ascenseur à prendre en compte si scroll actif */
			if (window_get_sizes(window, "height") != window_get_sizes(window, "max_y"))
				new_width			-= 16;
		}
		var new_height		= window_get_sizes(window, "max_y");
		if (b_ff)
		{	/* hauteur de l'ascenseur à prendre en compte si scroll actif */
			if (window_get_sizes(window, "width") != window_get_sizes(window, "max_x"))
				new_height		-= 16;
		}

		if (activate)
		{	/* activation : on prend l'ancien zIndex + 2 (car a +1 on peut par exemple avoir l'affiche d'un msg_xxx) */
			fog.style.width		= new_width;
			fog.style.height	= new_height;
			fog.style.zIndex	= parseInt(fog.style.zIndex) + 2;
			fog.style.display	= "block";
		}
		else
		{	/* désactivation : on prend le zIndex - 2 et, si on est arrive a la valeur initiale on le desaffiche */
			/* (cela permet de gerer l'affichage successif de plusieurs msg_xxx) */
			fog.style.width		= new_width;
			fog.style.height	= new_height;
			fog.style.zIndex	= parseInt(fog.style.zIndex) - 2;
			if (fog.style.zIndex <= parseInt(fog.getAttribute("zIndexDefault")))
			{
				fog.style.zIndex	= parseInt(fog.getAttribute("zIndexDefault"));
				fog.style.display	= "none";
			}
		}
	}
	return (true);
}

function _getElementsByClassName(el)
{
	/* *************************************
	NAME :
		_getElementsByClassName
	INPUT :
		el	=> classe souhaitée
	OUTPUT :
		collection d'objets
	************************************* */
	if (document.getElementsByClassName)
		return document.getElementsByClassName(el);

	var ret		= new Array();
	var allEl	= document.getElementsByTagName('*');
	var i = 0;
	while(elm = allEl[i++])
	{
		if(elm.className == el)
		{
			ret[ret.length] = elm;
		}
	}
	return ret;
}

function get_outerHTML(object)
{
	/* *************************************
	NAME :
		get_outerHTML
	INPUT :
		object => objet dont on veut le "outerHTML" (qui fonctionne en natif sous IE mais pas FF)
	OUTPUT :
		- (outerHTML de l'objet)
	************************************* */
	var tmp_string = "";
	if (b_ie)
		tmp_string = object.outerHTML;
	if (b_ff)
	{
		tmp_string = "<" + object.nodeName;
		for (var i=0 ; i<object.attributes.length ; i++)
		{
			if (object.attributes.item(i).nodeValue != null)
			{
				tmp_string += " ";
				tmp_string += object.attributes.item(i).nodeName;
				tmp_string += "=\"";
				tmp_string += object.attributes.item(i).nodeValue;
				tmp_string += "\"";
			}
		}
		tmp_string += ">" + object.innerHTML + "</" + object.nodeName + ">";
	}
	return tmp_string;
}

function getChildrenByTagName(root_element, tag)
{
	/* *************************************
	NAME :
		getChildrenByTagName
	INPUT :
		root_element	=> objet de reference
		tag						=> string representant le tag
	OUTPUT :
		- (equivalent a la fonction getElementsByTagName mais ne renvoie que les enfants)
	************************************* */
	if (root_element == null) return null;
  var kids = root_element.childNodes;
  var kids_w_tag = new Array();

  for (var i=0; i<kids.length; i++)
    if (kids.item(i).tagName == tag.toUpperCase())
      kids_w_tag.push(kids.item(i));

  return kids_w_tag;
}

function html_entity_decode(texte, iCycle) {
		/* *************************************
	NAME :
		html_entity_decode
	INPUT :
		texte => chaine a decoder
		iCycle => nombre de cycle a passer sur la chaine
	OUTPUT :
		valeur decodee
	************************************* */
	if(texte!=""){
		for(var i=0;i<iCycle;i++){
			texte = texte.replace(/&quot;/g,'"'); /* 34 22 */
			texte = texte.replace(/&amp;/g,'&'); /* 38 26	 */
			texte = texte.replace(/&#39;/g,"'"); /* 39 27 */
			texte = texte.replace(/&apos;/g,"'"); /* 39 27 */
			texte = texte.replace(/&lt;/g,'<'); /* 60 3C */
			texte = texte.replace(/&gt;/g,'>'); /* 62 3E */
			texte = texte.replace(/&circ;/g,'^'); /* 94 5E */
			texte = texte.replace(/&lsquo;/g,'‘'); /* 145 91 */
			texte = texte.replace(/&rsquo;/g,'’'); /* 146 92 */
			texte = texte.replace(/&ldquo;/g,'“'); /* 147 93 */
			texte = texte.replace(/&rdquo;/g,'”'); /* 148 94 */
			texte = texte.replace(/&bull;/g,'•'); /* 149 95 */
			texte = texte.replace(/&ndash;/g,'–'); /* 150 96 */
			texte = texte.replace(/&mdash;/g,'—'); /* 151 97 */
			texte = texte.replace(/&tilde;/g,'˜'); /* 152 98 */
			texte = texte.replace(/&trade;/g,'™'); /* 153 99 */
			texte = texte.replace(/&scaron;/g,'š'); /* 154 9A */
			texte = texte.replace(/&rsaquo;/g,'›'); /* 155 9B */
			texte = texte.replace(/&oelig;/g,'œ'); /* 156 9C */
			texte = texte.replace(/&#357;/g,''); /* 157 9D */
			texte = texte.replace(/&#382;/g,'ž'); /* 158 9E */
			texte = texte.replace(/&Yuml;/g,'Ÿ'); /* 159 9F */
			texte = texte.replace(/&nbsp;/g,' '); /* 160 A0 */
			texte = texte.replace(/&iexcl;/g,'¡'); /* 161 A1 */
			texte = texte.replace(/&cent;/g,'¢'); /* 162 A2 */
			texte = texte.replace(/&pound;/g,'£'); /* 163 A3 */
			texte = texte.replace(/&curren;/g,' '); /* 164 A4 */
			texte = texte.replace(/&yen;/g,'¥'); /* 165 A5 */
			texte = texte.replace(/&brvbar;/g,'¦'); /* 166 A6 */
			texte = texte.replace(/&sect;/g,'§'); /* 167 A7 */
			texte = texte.replace(/&uml;/g,'¨'); /* 168 A8 */
			texte = texte.replace(/&copy;/g,'©'); /* 169 A9 */
			texte = texte.replace(/&ordf;/g,'ª'); /* 170 AA */
			texte = texte.replace(/&laquo;/g,'«'); /* 171 AB */
			texte = texte.replace(/&not;/g,'¬'); /* 172 AC */
			texte = texte.replace(/&shy;/g,'­'); /* 173 AD */
			texte = texte.replace(/&reg;/g,'®'); /* 174 AE */
			texte = texte.replace(/&macr;/g,'¯'); /* 175 AF */
			texte = texte.replace(/&deg;/g,'°'); /* 176 B0 */
			texte = texte.replace(/&plusmn;/g,'±'); /* 177 B1 */
			texte = texte.replace(/&sup2;/g,'²'); /* 178 B2 */
			texte = texte.replace(/&sup3;/g,'³'); /* 179 B3 */
			texte = texte.replace(/&acute;/g,'´'); /* 180 B4 */
			texte = texte.replace(/&micro;/g,'µ'); /* 181 B5 */
			texte = texte.replace(/&para/g,'¶'); /* 182 B6 */
			texte = texte.replace(/&middot;/g,'·'); /* 183 B7 */
			texte = texte.replace(/&cedil;/g,'¸'); /* 184 B8 */
			texte = texte.replace(/&sup1;/g,'¹'); /* 185 B9 */
			texte = texte.replace(/&ordm;/g,'º'); /* 186 BA */
			texte = texte.replace(/&raquo;/g,'»'); /* 187 BB */
			texte = texte.replace(/&frac14;/g,'¼'); /* 188 BC */
			texte = texte.replace(/&frac12;/g,'½'); /* 189 BD */
			texte = texte.replace(/&frac34;/g,'¾'); /* 190 BE */
			texte = texte.replace(/&iquest;/g,'¿'); /* 191 BF */
			texte = texte.replace(/&Agrave;/g,'À'); /* 192 C0 */
			texte = texte.replace(/&Aacute;/g,'Á'); /* 193 C1 */
			texte = texte.replace(/&Acirc;/g,'Â'); /* 194 C2 */
			texte = texte.replace(/&Atilde;/g,'Ã'); /* 195 C3 */
			texte = texte.replace(/&Auml;/g,'Ä'); /* 196 C4 */
			texte = texte.replace(/&Aring;/g,'Å'); /* 197 C5 */
			texte = texte.replace(/&AElig;/g,'Æ'); /* 198 C6 */
			texte = texte.replace(/&Ccedil;/g,'Ç'); /* 199 C7 */
			texte = texte.replace(/&Egrave;/g,'È'); /* 200 C8 */
			texte = texte.replace(/&Eacute;/g,'É'); /* 201 C9 */
			texte = texte.replace(/&Ecirc;/g,'Ê'); /* 202 CA */
			texte = texte.replace(/&Euml;/g,'Ë'); /* 203 CB */
			texte = texte.replace(/&Igrave;/g,'Ì'); /* 204 CC */
			texte = texte.replace(/&Iacute;/g,'Í'); /* 205 CD */
			texte = texte.replace(/&Icirc;/g,'Î'); /* 206 CE */
			texte = texte.replace(/&Iuml;/g,'Ï'); /* 207 CF */
			texte = texte.replace(/&ETH;/g,'Ð'); /* 208 D0 */
			texte = texte.replace(/&Ntilde;/g,'Ñ'); /* 209 D1 */
			texte = texte.replace(/&Ograve;/g,'Ò'); /* 210 D2 */
			texte = texte.replace(/&Oacute;/g,'Ó'); /* 211 D3 */
			texte = texte.replace(/&Ocirc;/g,'Ô'); /* 212 D4 */
			texte = texte.replace(/&Otilde;/g,'Õ'); /* 213 D5 */
			texte = texte.replace(/&Ouml;/g,'Ö'); /* 214 D6 */
			texte = texte.replace(/&times;/g,'×'); /* 215 D7 */
			texte = texte.replace(/&Oslash;/g,'Ø'); /* 216 D8 */
			texte = texte.replace(/&Ugrave;/g,'Ù'); /* 217 D9 */
			texte = texte.replace(/&Uacute;/g,'Ú'); /* 218 DA */
			texte = texte.replace(/&Ucirc;/g,'Û'); /* 219 DB */
			texte = texte.replace(/&Uuml;/g,'Ü'); /* 220 DC */
			texte = texte.replace(/&Yacute;/g,'Ý'); /* 221 DD */
			texte = texte.replace(/&THORN;/g,'Þ'); /* 222 DE */
			texte = texte.replace(/&szlig;/g,'ß'); /* 223 DF */
			texte = texte.replace(/&agrave;/g,'à'); /* 224 E0 */
			texte = texte.replace(/&aacute;/g,'á'); /* 225 E1 */
			texte = texte.replace(/&acirc;/g,'â'); /* 226 E2 */
			texte = texte.replace(/&atilde;/g,'ã'); /* 227 E3 */
			texte = texte.replace(/&auml;/g,'ä'); /* 228 E4 */
			texte = texte.replace(/&aring;/g,'å'); /* 229 E5 */
			texte = texte.replace(/&aelig;/g,'æ'); /* 230 E6 */
			texte = texte.replace(/&ccedil;/g,'ç'); /* 231 E7 */
			texte = texte.replace(/&egrave;/g,'è'); /* 232 E8 */
			texte = texte.replace(/&eacute;/g,'é'); /* 233 E9 */
			texte = texte.replace(/&ecirc;/g,'ê'); /* 234 EA */
			texte = texte.replace(/&euml;/g,'ë'); /* 235 EB */
			texte = texte.replace(/&igrave;/g,'ì'); /* 236 EC */
			texte = texte.replace(/&iacute;/g,'í'); /* 237 ED */
			texte = texte.replace(/&icirc;/g,'î'); /* 238 EE */
			texte = texte.replace(/&iuml;/g,'ï'); /* 239 EF */
			texte = texte.replace(/&eth;/g,'ð'); /* 240 F0 */
			texte = texte.replace(/&ntilde;/g,'ñ'); /* 241 F1 */
			texte = texte.replace(/&ograve;/g,'ò'); /* 242 F2 */
			texte = texte.replace(/&oacute;/g,'ó'); /* 243 F3 */
			texte = texte.replace(/&ocirc;/g,'ô'); /* 244 F4 */
			texte = texte.replace(/&otilde;/g,'õ'); /* 245 F5 */
			texte = texte.replace(/&ouml;/g,'ö'); /* 246 F6 */
			texte = texte.replace(/&divide;/g,'÷'); /* 247 F7 */
			texte = texte.replace(/&oslash;/g,'ø'); /* 248 F8 */
			texte = texte.replace(/&ugrave;/g,'ù'); /* 249 F9 */
			texte = texte.replace(/&uacute;/g,'ú'); /* 250 FA */
			texte = texte.replace(/&ucirc;/g,'û'); /* 251 FB */
			texte = texte.replace(/&uuml;/g,'ü'); /* 252 FC */
			texte = texte.replace(/&yacute;/g,'ý'); /* 253 FD */
			texte = texte.replace(/&thorn;/g,'þ'); /* 254 FE */
			texte = texte.replace(/&yuml;/g,'ÿ'); /* 255 FF */
		}
	}
	return texte;
}

function html_entity_decode_light(texte)
{
	/* *************************************
	NAME :
		html_entity_decode_light
	INPUT :
		texte => chaine a decoder
	OUTPUT :
		valeur decodee
	************************************* */
	if(texte!=""){
			texte = texte.replace(/&amp;/g,'&'); /* 38 26	 */
			texte = texte.replace(/&#39;/g,"'"); /* 39 27 */
			texte = texte.replace(/&apos;/g,"'"); /* 39 27 */
			texte = texte.replace(/&lt;/g,'<'); /* 60 3C */
			texte = texte.replace(/&gt;/g,'>'); /* 62 3E */
	}
	return texte;
}

function htmlentities(texte) {
	/* *************************************
	NAME :
		htmlentities
	INPUT :
		texte => chaine a coder
	OUTPUT :
		valeur decodee
	************************************* */
	if(texte!=""){
		texte = texte.replace(/"/g,'&quot;'); /* 34 22*/
		texte = texte.replace(/&/g,'&amp;'); /* 38 26 */
		texte = texte.replace(/\'/g,'&#39;'); /* 39 27 */
		texte = texte.replace(/</g,'&lt;'); /* 60 3C */
		texte = texte.replace(/>/g,'&gt;'); /* 62 3E */
		texte = texte.replace(/\^/g,'&circ;'); /* 94 5E */
		texte = texte.replace(/‘/g,'&lsquo;'); /* 145 91 */
		texte = texte.replace(/’/g,'&rsquo;'); /* 146 92 */
		texte = texte.replace(/“/g,'&ldquo;'); /* 147 93 */
		texte = texte.replace(/”/g,'&rdquo;'); /* 148 94 */
		texte = texte.replace(/•/g,'&bull;'); /* 149 95 */
		texte = texte.replace(/–/g,'&ndash;'); /* 150 96 */
		texte = texte.replace(/—/g,'&mdash;'); /* 151 97 */
		texte = texte.replace(/˜/g,'&tilde;'); /* 152 98 */
		texte = texte.replace(/™/g,'&trade;'); /* 153 99 */
		texte = texte.replace(/š/g,'&scaron;'); /* 154 9A */
		texte = texte.replace(/›/g,'&rsaquo;'); /* 155 9B */
		texte = texte.replace(/œ/g,'&oelig;'); /* 156 9C */
		texte = texte.replace(//g,'&#357;'); /* 157 9D */
		texte = texte.replace(/ž/g,'&#382;'); /* 158 9E */
		texte = texte.replace(/Ÿ/g,'&Yuml;'); /* 159 9F */
		texte = texte.replace(/ /g,'&nbsp;'); /* 160 A0 */
		texte = texte.replace(/¡/g,'&iexcl;'); /* 161 A1 */
		texte = texte.replace(/¢/g,'&cent;'); /* 162 A2 */
		texte = texte.replace(/£/g,'&pound;'); /* 163 A3 */
		texte = texte.replace(/ /g,'&curren;'); /* 164 A4 */
		texte = texte.replace(/¥/g,'&yen;'); /* 165 A5 */
		texte = texte.replace(/¦/g,'&brvbar;'); /* 166 A6 */
		texte = texte.replace(/§/g,'&sect;'); /* 167 A7 */
		texte = texte.replace(/¨/g,'&uml;'); /* 168 A8 */
		texte = texte.replace(/©/g,'&copy;'); /* 169 A9 */
		texte = texte.replace(/ª/g,'&ordf;'); /* 170 AA */
		texte = texte.replace(/«/g,'&laquo;'); /* 171 AB */
		texte = texte.replace(/¬/g,'&not;'); /* 172 AC */
		texte = texte.replace(/­/g,'&shy;'); /* 173 AD */
		texte = texte.replace(/®/g,'&reg;'); /* 174 AE */
		texte = texte.replace(/¯/g,'&macr;'); /* 175 AF */
		texte = texte.replace(/°/g,'&deg;'); /* 176 B0 */
		texte = texte.replace(/±/g,'&plusmn;'); /* 177 B1 */
		texte = texte.replace(/²/g,'&sup2;'); /* 178 B2 */
		texte = texte.replace(/³/g,'&sup3;'); /* 179 B3 */
		texte = texte.replace(/´/g,'&acute;'); /* 180 B4 */
		texte = texte.replace(/µ/g,'&micro;'); /* 181 B5 */
		texte = texte.replace(/¶/g,'&para'); /* 182 B6 */
		texte = texte.replace(/·/g,'&middot;'); /* 183 B7 */
		texte = texte.replace(/¸/g,'&cedil;'); /* 184 B8 */
		texte = texte.replace(/¹/g,'&sup1;'); /* 185 B9 */
		texte = texte.replace(/º/g,'&ordm;'); /* 186 BA */
		texte = texte.replace(/»/g,'&raquo;'); /* 187 BB */
		texte = texte.replace(/¼/g,'&frac14;'); /* 188 BC */
		texte = texte.replace(/½/g,'&frac12;'); /* 189 BD */
		texte = texte.replace(/¾/g,'&frac34;'); /* 190 BE */
		texte = texte.replace(/¿/g,'&iquest;'); /* 191 BF */
		texte = texte.replace(/À/g,'&Agrave;'); /* 192 C0 */
		texte = texte.replace(/Á/g,'&Aacute;'); /* 193 C1 */
		texte = texte.replace(/Â/g,'&Acirc;'); /* 194 C2 */
		texte = texte.replace(/Ã/g,'&Atilde;'); /* 195 C3 */
		texte = texte.replace(/Ä/g,'&Auml;'); /* 196 C4 */
		texte = texte.replace(/Å/g,'&Aring;'); /* 197 C5 */
		texte = texte.replace(/Æ/g,'&AElig;'); /* 198 C6 */
		texte = texte.replace(/Ç/g,'&Ccedil;'); /* 199 C7 */
		texte = texte.replace(/È/g,'&Egrave;'); /* 200 C8 */
		texte = texte.replace(/É/g,'&Eacute;'); /* 201 C9 */
		texte = texte.replace(/Ê/g,'&Ecirc;'); /* 202 CA */
		texte = texte.replace(/Ë/g,'&Euml;'); /* 203 CB */
		texte = texte.replace(/Ì/g,'&Igrave;'); /* 204 CC */
		texte = texte.replace(/Í/g,'&Iacute;'); /* 205 CD */
		texte = texte.replace(/Î/g,'&Icirc;'); /* 206 CE */
		texte = texte.replace(/Ï/g,'&Iuml;'); /* 207 CF */
		texte = texte.replace(/Ð/g,'&ETH;'); /* 208 D0 */
		texte = texte.replace(/Ñ/g,'&Ntilde;'); /* 209 D1 */
		texte = texte.replace(/Ò/g,'&Ograve;'); /* 210 D2 */
		texte = texte.replace(/Ó/g,'&Oacute;'); /* 211 D3 */
		texte = texte.replace(/Ô/g,'&Ocirc;'); /* 212 D4 */
		texte = texte.replace(/Õ/g,'&Otilde;'); /* 213 D5 */
		texte = texte.replace(/Ö/g,'&Ouml;'); /* 214 D6 */
		texte = texte.replace(/×/g,'&times;'); /* 215 D7 */
		texte = texte.replace(/Ø/g,'&Oslash;'); /* 216 D8 */
		texte = texte.replace(/Ù/g,'&Ugrave;'); /* 217 D9 */
		texte = texte.replace(/Ú/g,'&Uacute;'); /* 218 DA */
		texte = texte.replace(/Û/g,'&Ucirc;'); /* 219 DB */
		texte = texte.replace(/Ü/g,'&Uuml;'); /* 220 DC */
		texte = texte.replace(/Ý/g,'&Yacute;'); /* 221 DD */
		texte = texte.replace(/Þ/g,'&THORN;'); /* 222 DE */
		texte = texte.replace(/ß/g,'&szlig;'); /* 223 DF */
		texte = texte.replace(/à/g,'&agrave;'); /* 224 E0 */
		texte = texte.replace(/á/g,'&aacute;'); /* 225 E1 */
		texte = texte.replace(/â/g,'&acirc;'); /* 226 E2 */
		texte = texte.replace(/ã/g,'&atilde;'); /* 227 E3 */
		texte = texte.replace(/ä/g,'&auml;'); /* 228 E4 */
		texte = texte.replace(/å/g,'&aring;'); /* 229 E5 */
		texte = texte.replace(/æ/g,'&aelig;'); /* 230 E6 */
		texte = texte.replace(/ç/g,'&ccedil;'); /* 231 E7 */
		texte = texte.replace(/è/g,'&egrave;'); /* 232 E8 */
		texte = texte.replace(/é/g,'&eacute;'); /* 233 E9 */
		texte = texte.replace(/ê/g,'&ecirc;'); /* 234 EA */
		texte = texte.replace(/ë/g,'&euml;'); /* 235 EB */
		texte = texte.replace(/ì/g,'&igrave;'); /* 236 EC */
		texte = texte.replace(/í/g,'&iacute;'); /* 237 ED */
		texte = texte.replace(/î/g,'&icirc;'); /* 238 EE */
		texte = texte.replace(/ï/g,'&iuml;'); /* 239 EF */
		texte = texte.replace(/ð/g,'&eth;'); /* 240 F0 */
		texte = texte.replace(/ñ/g,'&ntilde;'); /* 241 F1 */
		texte = texte.replace(/ò/g,'&ograve;'); /* 242 F2 */
		texte = texte.replace(/ó/g,'&oacute;'); /* 243 F3 */
		texte = texte.replace(/ô/g,'&ocirc;'); /* 244 F4 */
		texte = texte.replace(/õ/g,'&otilde;'); /* 245 F5 */
		texte = texte.replace(/ö/g,'&ouml;'); /* 246 F6 */
		texte = texte.replace(/÷/g,'&divide;'); /* 247 F7 */
		texte = texte.replace(/ø/g,'&oslash;'); /* 248 F8 */
		texte = texte.replace(/ù/g,'&ugrave;'); /* 249 F9 */
		texte = texte.replace(/ú/g,'&uacute;'); /* 250 FA */
		texte = texte.replace(/û/g,'&ucirc;'); /* 251 FB */
		texte = texte.replace(/ü/g,'&uuml;'); /* 252 FC */
		texte = texte.replace(/ý/g,'&yacute;'); /* 253 FD */
		texte = texte.replace(/þ/g,'&thorn;'); /* 254 FE */
		texte = texte.replace(/ÿ/g,'&yuml;'); /* 255 FF */
	}
	return texte;
}

function htmlentities_light(texte) {
	/* *************************************
	NAME :
		htmlentities_light
	INPUT :
		texte => chaine a coder
	OUTPUT :
		valeur decodee
	************************************* */
	if(texte!=""){
		texte = texte.replace(/"/g,'&quot;');	/* 34 22*/
		texte = texte.replace(/&/g,'&amp;');	/* 38 26 */
		texte = texte.replace(/\'/g,'&#39;');	/* 39 27 */ /* &#39; car la fonction PHP "htmlentities" encode l'apostrophe sous cette forme */
		texte = texte.replace(/</g,'&lt;');		/* 60 3C */
		texte = texte.replace(/>/g,'&gt;');		/* 62 3E */
		}
	return texte;
}

function iframe_has_scrolls(iframe)
{
	/* *************************************
	NAME :
		iframe_has_scrolls
	INPUT :
		iframe	=> iframe a tester
	OUTPUT :
		0 si l'iframe n'a pas de scrolls
		1 si scroll horizontal uniquement
		2 si scroll horizontal vertical
		3 si tous les scrolls sont actifs (par defaut si erreur "permission denied")
	************************************* */
	var scroll_x	= true;
	var scroll_y	= true;
	try
	{
		scroll_x	= (window_get_sizes(iframe.contentWindow, "max_x") > window_get_sizes(iframe.contentWindow, "width"));
		scroll_y	= (window_get_sizes(iframe.contentWindow, "max_y") > window_get_sizes(iframe.contentWindow, "height"));
	}
	catch(e){};
	if (scroll_x && scroll_y) return 3;
	if (scroll_y) return 2;
	if (scroll_x) return 1;
	return 0;
}

var ip_address_info_string = "";
function ip_address_info(ip_address)
{
	/* *************************************
	NAME :
		ip_address_info
	INPUT :
		ip_address => adresse IP dont on veut des informations
	OUTPUT :
		- (ouvre une popup contenant les informations de l'adresse IP)
	************************************* */
	ip_address_info_string = ip_address;
	var T_answer	= new Array();
	T_answer[0]		= "ipinfodb";
	T_answer[1]		= "ipchecking";
	T_answer[2]		= "ip2location";
	msg_prompt("", "select", "", language_msg("00892"), T_answer, false, "ip_address_info_validate", true);
	return true;
}

function ip_address_info_validate(result)
{
	/* *************************************
	NAME :
		ip_address_info_validate
	INPUT :
		result => choix de l'utilisateur
	OUTPUT :
		- (ouvre une popup contenant les informations de l'adresse IP)
	************************************* */
	if (!result) return false;

	var tmp_string;
	switch (result)
	{
		case "ipchecking" :
			tmp_string	= "http://www.ipchecking.com/?ip=" + ip_address_info_string;
			break;
		case "ip2location" :
			tmp_string	= "http://www.ip2location.com/" + ip_address_info_string;
			break;
		case "ipinfodb" :
			tmp_string	= "http://ipinfodb.com/ip_query.php?output=raw&ip=" + ip_address_info_string;
			break;
		default :
			break;
	}
	if (tmp_string != "" && String(tmp_string) != "undefined")
		open_link(tmp_string, "iframe" , "", "400" , "900");

	return true;
}

function is_date(valeur, mode)
{
	/* *************************************
	NAME :
		is_date
	INPUT :
		valeur	=> valeur input
		mode		=> type de date (fr, en...)
	OUTPUT :
		true si la chaine est de type date (selon le mode), et false sinon
	************************************* */
	var regExpFrenchDate	= /^(0[1-9]|[12][0-9]|3[01])[\- \/\.](0[1-9]|1[012])[\- \/\.](19|20)\d\d$/g;  /* date au format jj/mm/aaaa ou jj-mm-aaaa ou jj mm aaaa ou jj.mm.aaaa avec aaaa compris entre 1900 et 2099 */
	var regExpEnglishDate	= /^(19|20)\d\d[\- \/\.](0[1-9]|1[012])[\- \/\.](0[1-9]|[12][0-9]|3[01])$/g; /* idem ci-dessus mais format anglais (Ex : aaaa/mm/jj) */
	switch (mode)
	{
		case "fr" :
			return matchRegularExpression(valeur, regExpFrenchDate);
			break;
		case "en" :
			return matchRegularExpression(valeur, regExpEnglishDate);
			break;
		default :
			return matchRegularExpression(valeur, regExpFrenchDate);
			break;
	}
}

function is_email(mail_address)
{
	/* *************************************
	NAME :
		is_email
	INPUT :
		mail_address	=> chaine de caracteres
	OUTPUT :
		true si la chaine est de type e-mail, et false sinon
	************************************* */
	var word		= "[-!#-'*+/-9=?A-Z^-~\x80-\xFF]+";
	var pattern	= "^(" + word + "\.)*" + word + "@(" + word + "\.)+\." + word + "$";
	var reg			= new RegExp(pattern, '');
	return reg.test(mail_address);
}

function is_number(input_string)
{
	/* *************************************
	NAME :
		is_number
	INPUT :
		input_string	=> chaine de caracteres
	OUTPUT :
		true si la chaine est de type nombre, et false sinon
	************************************* */
	var exp = new RegExp("^[0-9-.]*$","g");
	return exp.test(input_string);
}

function language_change(new_language)
{
	/* *************************************
	NAME :
		language_change
	INPUT :
		new_language	=> nouvelle langue souhaitee
	OUTPUT :
		- (changement de la langue courante)
	************************************* */
	var doc													= document.getElementById('form_main');
	doc.input_language_change.value	= new_language;
	doc.action											= '../php/user-process.php';
	doc.param_action.value					= 'language_change';
	doc.submit();
}

function matchRegularExpression(valeur, regularExpression)
{
	/* *************************************
	NAME :
		matchRegularExpression
	INPUT :
		valeur						=> valeur input
		regularExpression	=> expression reguliere
	OUTPUT :
		true si la valeur correspond a l'expression reguliere et false sinon
	************************************* */
	var resultat = valeur.match(regularExpression);
	if(resultat!=null && resultat.length==1) return true;
	else return false;
}

function msg_prompt_close(){
/* *************************************
NAME :
	msg_prompt_close
INPUT :
	-
OUTPUT :
	- (simulation de click pour fermer une fenetre assistant)
************************************* */
	var oParentTable = this.frameElement.parentNode.parentNode.parentNode.parentNode;
	if(oParentTable && oParentTable.getElementsByTagName("input")){
		var oParentInput = oParentTable.getElementsByTagName("input");
		if(oParentInput[0])oParentInput[0].click();
	}
}

function node_get_position(node)
{
	/* *************************************
	NAME :
		node_get_position
	INPUT :
		node	=> noeud dans une arborescence
	OUTPUT :
		position du noeud par rapport a ses freres (ex: c'est le frere n°0, c'est le frere n°4...)
	************************************* */
	/* renvoie la position du node parmi ses freres (premier = 0) */
	for (var i=0 ; i<node.parentNode.childNodes.length ; i++)
	{
		if (node.parentNode.childNodes[i] == node)
			return i;
	}
	return -1;
}

function object_is_visible(ref_object)
{
	/* *************************************
	NAME :
		object_is_visible
	INPUT :
		ref_object	=> objet de reference
	OUTPUT :
		true si l'objet est visible et false sinon
	************************************* */
	var to_continue			= true;
	var result					= true;
	var current_object	= ref_object;
	/* parcours de l'objet et des parents */
	while(to_continue)
	{
		if (current_object.style.display.toLowerCase() == "none")					result			= false;
		if (current_object.style.visibility.toLowerCase() == "collapse")	result			= false;
		if (current_object.style.visibility.toLowerCase() == "hidden")		result			= false;
		if (result == false)																							to_continue	= false;

		/* parcours des parents */
		var current_object_parent = current_object.parentNode;
		if (current_object != document.getElementsByTagName('body')[0] && current_object_parent != current_object && String(current_object_parent) != "null"  && String(current_object_parent) != "undefined")
			current_object	= current_object_parent;
		else
			to_continue			= false;
	}
	return result;
}

function object_style_get(ref_object)
{
	/* *************************************
	NAME :
		object_style_get
	INPUT :
		ref_object	=> objet de reference dont on recupere le style
	OUTPUT :
		style de l'objet
	************************************* */
	var result;
	/* avant enregistrement on retablit la hauteur/largeur réelle pour IE */
	if (b_ie) result = ref_object.getAttribute("style").cssText.toLowerCase();
	if (b_ff) result = ref_object.getAttribute("style").toLowerCase();

	/* cas special style "background-img <=> background-image" (on rajoute une entree "background-img" similaire a "background-image") */
	var tmp_string	= result;
	if (tmp_string.indexOf("background-image:") == -1)
	{
		result				= tmp_string;
	}
	else
	{
		tmp_string		= tmp_string.replace(/(.*)(background-image:)(.*)/i, '$3');	/* suppression de tout ce qui est avant 'background-img' (comprise) */
		tmp_string		= tmp_string.replace(/(;.*)/i, '');													/* suppression de tout ce qui est apres */
		/* suppression des guillemets */
		tmp_string		= tmp_string.replace(/"/g, "");
		/* suppression de la valeur "none" qui apparaît parfois */
		tmp_string		= tmp_string.replace("none", "");
		result				+= ";background-img:" + tmp_string + ";";										/* rajout de la nouvelle entree */
	}

	var tmp_string	= result;
	if (tmp_string.indexOf("opacity:") == -1)
	{
		if (tmp_string.indexOf("opacity=") == -1)
		{
			result			= tmp_string;
		}
		else
		{
			/* cas special style "opacity" (on rajoute une entree "opacity:yyy" similaire à "filter:alpha(opacity=xxx)" avec xxx=yyy*100) */
			tmp_string	= tmp_string.replace(/(.*)(opacity=)(.*)/i, '$3');	/* suppression de tout ce qui est avant 'opacity' (comprise) */
			tmp_string	= tmp_string.replace(/(;.*)/i, '');									/* suppression de tout ce qui est apres */
			result			+= ";opacity=" + tmp_string/100 + ";";							/* rajout de la nouvelle entree */
		}
	}
	else
	{
		/* cas special style "opacity" (on rajoute une entree "filter:alpha(opacity=xxx)" similaire a "opacity:yyy" avec xxx=yyy*100) */
		tmp_string		= tmp_string.replace(/(.*)(opacity:)(.*)/i, '$3');		/* suppression de tout ce qui est avant 'opacity' (comprise) */
		tmp_string		= tmp_string.replace(/(;.*)/i, '');										/* suppression de tout ce qui est apres */
		result				+= ";filter:alpha(opacity=" + tmp_string*100 + ");";	/* rajout de la nouvelle entree */
	}

	/* cas spécial : on supprime l'attribut overflow car géré par le formateur directement */
	var tmp_string	= result;
	if (result.indexOf("overflow:") != -1)
	{
		var tmp_before	= result.replace(/(.*)(overflow:)(.*)/i, '$1');												/* conservation de ce qui est avant */
		tmp_string			= result.substr(result.indexOf("overflow:"), result.length);					/* récupération de ce qui reste */
		var tmp_after		= tmp_string.substr(tmp_string.indexOf(";") + 1, tmp_string.length);	/* récupération de ce qui est après */
		result					= tmp_before + tmp_after;
	}
	return (result);
}

function object_style_set(ref_object, ref_value, design_mode, remove_all)
{
	/* *************************************
	NAME :
		object_style_set
	INPUT :
		ref_object	=> objet de reference dont on va modifier le style
		ref_value		=> nouvelle valeur de style
		design_mode	=> true si on est en mode design (dans ce cas certaines proprietes de l'objet sont protegees) et false sinon
		remove_all	=> true si on force tous les styles (même ceux non fournis) et false sinon
	OUTPUT :
		- (true si tout a bien fonctionne et false sinon)
	************************************* */
	if (design_mode)
	{ /* sauvegarde des styles proteges */
		var tmp_height		= ref_object.style.height;
		var tmp_width			= ref_object.style.width;
		var tmp_top				= ref_object.style.top;
		var tmp_left			= ref_object.style.left;
		var tmp_zIndex		= ref_object.style.zIndex;
		var tmp_position	= ref_object.style.position;
		var tmp_overflow	= ref_object.style.overflow;
		var tmp_overflowX	= ref_object.style.overflowX;
		var tmp_overflowY	= ref_object.style.overflowY;
	}

	/* cas special style "background-img <=> background-image" (on rajoute une entree "background-image" similaire a "background-img") */
	if (ref_value.indexOf("background-img:") != -1)
	{
		/* extraction de la valeur exacte */
		var background_value	= ref_value;
		background_value			= ref_value.replace(/(.*)(background-img:)(.*)/i, '$2$3');	/* suppression de tout ce qui est avant 'background-img' (non comprise) */
		background_value			= background_value.replace(/(;.*)/i, '');								/* suppression de tout ce qui est apres */
		background_value			= background_value.replace(/background\-img:/gi, '');		/* suppression de 'background-img' */
		/* suppression de "url(...)" */
		background_value			= background_value.replace(/url\(/g, "");
		background_value			= background_value.replace(/\)$/g, "");
		/* suppression de toute référence à "background-img" qui sera rajouté à la fin */
		var new_value					= ref_value;
		var tmp_integer				= new_value.indexOf("background-img:");
		new_value							= ref_value.substring(0, tmp_integer) + ref_value.substring(tmp_integer + 15 + background_value.length + 1, ref_value.length); /* 15 pour 'background-img" et 1 pour le point-virgule à la fin */
		/* rajout des entrées avec la chaîne "url(...)" autour du lien */
		if (background_value != '""')
		{
			new_value						+= ";background-img:url(" + background_value + ");" + ";background-image:url(" + background_value + ");";
			ref_value						= new_value;
		}
	}

	/* cas special style "opacity" : extraction de la valeur sous la forme "opacity:yyy" */
	if (ref_value.indexOf("opacity:") != -1)
	{
		/* extraction de la valeur exacte */
		var opacity_value	= ref_value;
		opacity_value			= ref_value.replace(/(.*)(opacity:)(.*)/i, '$2$3');	/* suppression de tout ce qui est avant 'opacity' (non comprise) */
		opacity_value			= opacity_value.replace(/(;.*)/i, '');					/* suppression de tout ce qui est apres */
		opacity_value			= opacity_value.replace(/opacity:/gi, '');			/* suppression de 'opacity' */
		if (opacity_value == "")
		{	/* si opacité non-définie : juste supprimer ce style de la liste => ne rien faire */
			var new_value		= ref_value;
		}
		else
		{
			/* suppression de toute référence à "opacity" qui sera rajouté à la fin */
			var new_value		= ref_value;
			tmp_integer			= new_value.indexOf("opacity:");
			new_value				= new_value.substring(0, tmp_integer) + new_value.substring(tmp_integer + 8 + opacity_value.length + 1, new_value.length); /* 8 pour "opacity" et 1 pour le point-virgule à la fin */
			tmp_integer			= new_value.indexOf("filter:alpha(opacity=");
			new_value				= new_value.substring(0, tmp_integer) + new_value.substring(tmp_integer + 21 + opacity_value.length + 2, new_value.length); /* 21 pour "filter:alpha(opacity=" et 2 pour la parenthèse et le point-virgule à la fin */
			/* vérification de la valeur */
			if (opacity_value > 1)
				opacity_value	= opacity_value / 100;
			/* rajout des entrées */
			new_value				+= ";opacity:" + opacity_value + ";" + ";filter:alpha(opacity=" + opacity_value*100 + ");";
		}
		ref_value					= new_value;
	}

	/* cas special style "opacity" : extraction de la valeur sous la forme "filter:alpha(opacity=xxx)" */
	if (ref_value.indexOf("opacity=") != -1)
	{
		/* extraction de la valeur exacte */
		var opacity_value	= ref_value;
		opacity_value			= ref_value.replace(/(.*)(opacity=)(.*)/i, '$2$3');	/* suppression de tout ce qui est avant 'opacity' (non comprise) */
		opacity_value			= opacity_value.replace(/(\);.*)/i, '');				/* suppression de tout ce qui est apres */
		opacity_value			= opacity_value.replace(/opacity=/gi, '');			/* suppression de 'opacity' */
		opacity_value			= opacity_value.replace(/\)/gi, '');						/* suppression de 'opacity' */
		if (opacity_value == "")
		{	/* si opacité non-définie : juste supprimer ce style de la liste => ne rien faire */
			var new_value		= ref_value;
		}
		else
		{
			/* suppression de toute référence à "opacity" qui sera rajouté à la fin */
			var new_value		= ref_value;
			tmp_integer			= new_value.indexOf("opacity:");
			new_value				= new_value.substring(0, tmp_integer) + new_value.substring(tmp_integer + 8 + opacity_value.length + 1, new_value.length); /* 8 pour "opacity" et 1 pour le point-virgule à la fin */
			tmp_integer			= new_value.indexOf("filter:alpha(opacity=");
			new_value				= new_value.substring(0, tmp_integer) + new_value.substring(tmp_integer + 21 + opacity_value.length + 2, new_value.length); /* 21 pour "filter:alpha(opacity=" et 2 pour la parenthèse et le point-virgule à la fin */
			/* vérification de la valeur */
			if (opacity_value > 1)
				opacity_value	= opacity_value / 100;
			/* rajout des entrées */
			new_value				+= ";opacity:" + opacity_value + ";" + ";filter:alpha(opacity=" + opacity_value*100 + ");";
		}
		ref_value					= new_value;
	}

	/* backup des elements de style qui ne sont pas fournis */
	var tmp_array_old = ref_object.style.cssText.toLowerCase().split(/;/gi);
	var tmp_array_new = ref_value.toLowerCase().split(/;/gi);
	var tmp_cssText		= "";
	if (!remove_all)
	{
		for (var i=0 ; i<tmp_array_old.length ; i++)
		{
			var tmp_string_old	= tmp_array_old[i];
			var tmp_bool				= false;
			for (var k=0 ; k<tmp_array_new.length ; k++)
			{
				var tmp_string_new = tmp_array_new[k];
				if (trim(tmp_string_old.split(":")[0]) == trim(tmp_string_new.split(":")[0]))
				{
					tmp_bool = true;
					break;
				}
			}
			if (!tmp_bool)
			{	/* propriete non mise a jour => sauvegarde */
				if (tmp_string_old.indexOf("opacity:") != -1 || tmp_string_old.indexOf("opacity=") != -1 )
				{	/* on ne restaure pas l'opacity => elle n'était pas dans l'assistant visiblement */
				}
				else
				{
					tmp_cssText += trim(tmp_string_old.split(":")[0]) + ":" + trim(tmp_string_old.split(":")[1]) + ";";
				}
			}
		}
	}

	/* nouveaux styles = anciens styles non modifies + nouveaux styles */
	ref_object.style.cssText	= tmp_cssText + ref_value;

	if (design_mode)
	{ /* restauration des styles proteges */
		ref_object.style.height			= tmp_height;
		ref_object.style.width			= tmp_width;
		ref_object.style.top				= tmp_top;
		ref_object.style.left				= tmp_left;
		ref_object.style.zIndex			= tmp_zIndex;
		ref_object.style.position		= tmp_position;
		ref_object.style.overflow		= tmp_overflow;
		ref_object.style.overflowX	= tmp_overflowX;
		ref_object.style.overflowY	= tmp_overflowY;
	}
	return true;
}

function offset_absolute(current_object)
{
	/* *************************************
	NAME :
		offset_absolute
	INPUT :
		current_object	=> objet dont on va ramener [offsetLeft, offsetTop] absolu (<=> même si l'objet est en positionnement relatif)
	OUTPUT :
		[offsetLeft, offsetTop] absolu
	************************************* */
	var current_left	= current_object.offsetLeft;
	var current_top		= current_object.offsetTop;
	while(current_object.offsetParent)
	{
		if(current_object == document.getElementsByTagName('body')[0])
			break;
		else
		{
			current_left		= current_left + current_object.offsetParent.offsetLeft;
			current_top			= current_top + current_object.offsetParent.offsetTop;
			current_object	= current_object.offsetParent;
		}
	}
	return new Array(current_left, current_top);
}

var iframe_open_link				= null;
var open_link_popup_blocker	= false;	/* true si un popup-blocker semble activé et false sinon */
function open_link(new_url, mode, window_name, height, width, tab_save_session)
{
	/* *************************************
	NAME :
		open_link
	INPUT :
		new_url						=> url a ouvrir
		mode							=>	"auto"		: le lien est ouvert dans une nouvelle fenetre ou la meme, automatiquement selon le nom de domaine
													"new"			: le lien est toujours ouvert dans une nouvelle fenetre
													"same"		: le lien est toujours ouvert dans la meme fenetre
													"iframe"	: le lien s'ouvre dans une nouvelle iframe
													"parent"	: le lien s'ouvre dans la fenêtre parente
													"tab"			: le lien s'ouvre dans un nouveau tab en haut de la fenêtre
		window_name				=> titre de la fenêtre le cas échéant (même nom pour pouvoir réutiliser une fenêtre existante)
		height						=> largeur de la fenetre si nouvelle
		width							=> hauteur de la fenetre si nouvelle
		tab_save_session	=> argument utile dans le cas d'un affichage "tab"
	OUTPUT :
		- (ouvre le lien souhaite, dans la meme page ou dans une autre)
	************************************* */
	if (new_url == "") return false;
	if (String(tab_save_session) == "undefined") tab_save_session = true;

	if (mode == "auto")
	{
		/* si le lien est dans le meme domaine => ouverture dans la meme page, sinon dans une autre page */
		/* => on teste l'url de la fenetre parente pour le cas on soit dans une iframe notamment lorsque redirection de nom de domaine vers faaroo */
		/* => de toute facon window.parent = window lorsqu'on n'est pas dans une iframe */
		try
		{
			var current_url	= window.parent.location.href;
		}
		catch(e)
		{	/* probleme de securite */
			var current_url	= window.location.href;
		}

		if (url_is_same_domain(current_url, new_url))
			mode = "same";
		else
			mode = "new";
	}

	/* affichage */
	if (mode == "new")
	{
		/* si le popup blocker est déjà activé on ne fait rien, le message d'erreur a déjà eu lieu */
		if (open_link_popup_blocker) return false;
		var tmp_string	= "";
		if (String(height) != "undefined")	tmp_string	+= "height=" + height + ",";
		if (String(width) != "undefined")		tmp_string	+= "width=" + width + ",";
		/* si on demande à afficher dans la fenêtre courante, alors on évite de l'écraser */
		if (window.name == window_name)			window.name	= "";
		try
		{
			var new_window = window.open(new_url, window_name, tmp_string);
			if (String(new_window) == "undefined" || String(new_window) == "null")
			{	/* popup-blocker probable */
				open_link_popup_blocker = true;
			}
		}
		catch(e)
		{	/* popup-blocker probable */
			open_link_popup_blocker = true;
		};

		if (open_link_popup_blocker)
		{	/* popup-blocker probable */
			fog_manage(true);
			window.setTimeout("msg_alert('', language_msg('00171'), '', true);", 100);
			/* on indique qu'il y a un popup blocker actif */
			return false;
		}
	}

	if (mode == "iframe")
	{
		fog_manage(true);
		if (iframe_open_link != null)
		{	/* suppression de l'iframe le cas echeant */
			iframe_open_link.parentNode.removeChild(iframe_open_link);
			iframe_open_link = null;
		}
		/* taille par defaut */
		if (String(height) == "undefined")	height	= "600px";
		if (String(width) == "undefined")		width		= "940px";
		/* creation de l'iframe */
		iframe_open_link								= document.createElement("iframe");
		/* masquage de la bordure de l'iframe */
		if (b_ie)
			iframe_open_link.setAttribute("frameBorder", "0");
		if (b_ff)
			iframe_open_link.style.border	= "0px solid #000";
		iframe_open_link.style.height		= height;
		iframe_open_link.style.width		= width;
		iframe_open_link.src						= new_url;
		document.body.appendChild(iframe_open_link);
		/* affichage de l'iframe */
		msg_object("", iframe_open_link, "open_link_validate", true, true);
	}

	if (mode == "tab")
	{	/* création du nouvel onglet à taille maximale */
		if (window.parent != window)
		{	/* il faut ajouter l'iframe à partir de l'objet window parent, sinon erreur sous IE */
			window.parent.open_link(new_url, "tab");
			return false;
		}
		/* vérification que l'on peut utiliser le mode onglet */
		var div_index_tab = document.getElementById("div_index_tab");
		if (String(div_index_tab) == "null" || String(div_index_tab) == "undefined")
		{	/* erreur => ouverture de la page d'accueil */
			open_link("../php/index.php", "same");
			return false;
		}
		var rnd															= String(Math.random());
		/* calcul des coordonnées d'affichage */
		height															= window_get_sizes(window, "height") - parseInt(div_index_tab.offsetHeight);
		width																= window_get_sizes(window, "width");
 		/* ajustements pour tenir au plus juste dans la fenêtre */
 		if (b_ie) { height -= 7; width -= 24; }
 		if (b_ff) { height -= 2; width -= 2; }
		/* creation de l'iframe */
		var iframe_open_link_tab						= document.createElement("iframe");
		if (b_ie)
			iframe_open_link_tab.setAttribute("frameBorder", "0");
		iframe_open_link_tab.className			= "css_tab"; /* attention, classe utilisée dans "index.js", fonction "index_open_tab_prepare" */
		iframe_open_link_tab.style.height		= height;
		iframe_open_link_tab.style.top			= parseInt(div_index_tab.offsetHeight);
		iframe_open_link_tab.style.width		= width;
		iframe_open_link_tab.setAttribute("id", "iframe_open_link_tab_" + rnd);
		iframe_open_link_tab.src						= new_url;
		/* ouverture de l'iframe */
		window.document.body.appendChild(iframe_open_link_tab);
		/* préparation de l'onglet */
		var div_open_link_tab								= document.createElement("div");
		div_open_link_tab.className					= "css_tab_selected";
		/* clic sur l'onglet pour appeler la zone souhaitée */
		div_open_link_tab.setAttribute("iframe_open_link_tab_id", iframe_open_link_tab.getAttribute("id"));
		div_open_link_tab.onclick						= function() { index_open_tab(this, false, false); return true; };
		/* affichage de l'onglet en haut */
		div_index_tab.appendChild(div_open_link_tab);
		index_open_tab(div_open_link_tab, false, tab_save_session);
		return true;
	}

	if (mode == "same")
	{
		window.location.href = new_url;
	}

	if (mode == "parent")
	{
		try
		{	/* on essaye d'ouvrir dans la fenetre appelante si possible (ce qui revient a la fenetre courante si elle n'existe pas */
			window.parent.location.href = new_url;
		}
		catch(e)
		{	/* probleme de securite */
			window.location.href = new_url;
		}
	}

	return true;
}

function open_link_validate(result)
{
	/* *************************************
	NAME :
		open_link_validate
	INPUT :
		result => selon retour de msg_object
	OUTPUT :
		- (ouvre le lien souhaite, dans la meme page ou dans une autre)
	************************************* */
	if (iframe_open_link != null)
	{	/* suppression de l'iframe le cas echeant */
		iframe_open_link.parentNode.removeChild(iframe_open_link);
		iframe_open_link	= null;
	}
	if (result == "" || result == null)
		return false;
	else
		return true;
}

function open_page(page_id)
{
	/* *************************************
	NAME :
		open_page
	INPUT :
		page_id	=> ID de la page
	OUTPUT :
		- (ouvre la page souhaitee)
	************************************* */
	if (page_id != "")
	{
		var new_url = '../php/page.php?page_id=' + page_id.substr(0, 32) + 'static';
		try
		{	/* on essaye d'ouvrir dans la fenetre appelante si possible (ce qui revient a la fenetre courante si elle n'existe pas */
			/* et uniquement si on est dans le même domaine (sinon on peut être dans une redirection de nom de domaine) */
			var current_url	= window.parent.location.href;
			if (url_is_same_domain(current_url, new_url))
			{
				window.parent.location.href = new_url;
			}
			else
			{
				window.location.href = new_url;
			}
		}
		catch(e)
		{	/* probleme de securite */
			window.location.href	= new_url;
		}
	}
	return true;
}

function quota_display(percentage_target, object_id)
{
	/* *************************************
	NAME :
		quota_display
	INPUT :
		percentage_target	=> pourcentage a afficher
		object_id					=> objet de reference contenant la jauge
	OUTPUT :
		mise a jour progressive de la jauge de quota
	************************************* */
	var PERCENTAGE_STEP						= 10;
	var PERCENTAGE_MAX						= 100;
	/* recuperation des objets */
	var object_reference					= document.getElementById(object_id);
	var object_reference_parent		= object_reference.parentNode;
	/* calcul de la valeur affichee actuellement */
	if (b_ie)
		var current_percentage			= parseInt(object_reference.offsetWidth) * PERCENTAGE_MAX / parseInt(object_reference_parent.currentStyle.width);
	if (b_ff)
		var current_percentage			= parseInt(object_reference.offsetWidth) * PERCENTAGE_MAX / parseInt(object_reference_parent.offsetWidth);
	/* calcul de la nouvelle valeur a afficher */
	var new_percentage						= current_percentage + PERCENTAGE_STEP;
	/* calcul du depassement */
	if (percentage_target > PERCENTAGE_MAX)
		percentage_target						= PERCENTAGE_MAX;
	if (new_percentage > percentage_target)
		new_percentage							= percentage_target;
	/* affichage (de bas en haut) */
	if (new_percentage == "")
		new_percentage							= 0;
	object_reference.style.width	= (new_percentage) + "%";
	/* relance si l'affichage n'est pas termine */
	if (new_percentage < percentage_target)
		window.setTimeout("quota_display('" + percentage_target + "', '" + object_id + "')", 100);
}

function remove_html_tags(input)
{
	/* *************************************
	NAME :
		remove_html_tags
	INPUT :
		input => chaine dont on va supprimer les tags HTML
	OUTPUT :
		chaine sans les tags HTML
	************************************* */
	var re = /(<([^>]+)>)/gi;
	return input.replace(re, "");
}

function remove_special_characters(input, remove_accents, remove_spaces, remove_dots, remove_at, remove_ponctuation, replaced_by)
{
	/* *************************************
	NAME :
		remove_special_characters (!! EQUIVALENT DE LA MÊME FONCTION DANS LIB-STRING.PHP !!)
	INPUT :
		input								=> chaine dont on va supprimer les accents
		remove_accents			=> true si on supprime les accents, et false sinon
		remove_spaces				=> true si on supprime les espaces, et false sinon
		remove_dots					=> true si on supprime les points
		remove_at						=> true si on supprime les @
		remove_ponctuation	=> true si on supprime la ponctuation
		replaced_by					=> caractères par lequel on remplace
	OUTPUT :
		chaine sans les caractères non-désirés pour un fichier
	************************************* */
	var result	= input;
	if (remove_accents)
	{
		var before	= new Array('À','Á','Â','Ã','Ä','Å','Ç','È','É','Ê','Ë','Ì','Í','Î','Ï','Ò','Ó','Ô','Õ','Ö','Ù','Ú','Û','Ü','Ý','à','á','â','ã','ä','å','ç','è','é','ê','ë','ì','í','î','ï','ð','ò','ó','ô','õ','ö','ù','ú','û','ü','ý','ÿ');
		var after		= new Array('A','A','A','A','A','A','C','E','E','E','E','I','I','I','I','O','O','O','O','O','U','U','U','U','Y','a','a','a','a','a','a','c','e','e','e','e','i','i','i','i','o','o','o','o','o','o','u','u','u','u','y','y');
		for (var i=0 ; i<before.length ; i++)
		{
			var reg		= new RegExp(before[i], "g");
			result		= result.replace(reg, after[i]);
		}
	}
	if (remove_spaces)			result	= result.replace(/ /g, replaced_by);
	if (remove_dots)				result	= result.replace(/\./g, replaced_by);
	if (remove_at)					result	= result.replace(/@/g, replaced_by);
	if (remove_ponctuation)	result	= result.replace(/[^a-zA-Z0-9]/g, replaced_by);
	result													= result.replace(/#/g, replaced_by);
	if (replaced_by != "_")	result	= result.replace(/_/g, replaced_by);
	return result;
}

function rgb_to_hex(str)
{
	/* *************************************
	NAME :
		rgb_to_hex
	INPUT :
		str	=> chaine à convertir
	OUTPUT :
		valeur de couleur sous la forme #xxxxxx au lieu de rgb(yy,yy,yy)
	************************************* */
	if (str.indexOf("#") != -1) return str;
	if (str.toLowerCase() == "transparent") return str;

	str			= str.replace(/rgb\(|\)/g, "").split(",");
	str[0]	= parseInt(str[0], 10).toString(16).toLowerCase();
	str[1]	= parseInt(str[1], 10).toString(16).toLowerCase();
	str[2]	= parseInt(str[2], 10).toString(16).toLowerCase();
	str[0]	= (str[0].length == 1) ? '0' + str[0] : str[0];
	str[1]	= (str[1].length == 1) ? '0' + str[1] : str[1];
	str[2]	= (str[2].length == 1) ? '0' + str[2] : str[2];
	return('#' + str.join(""));
}

function style_border_preview(zone, mode)
{
	/* *************************************
	NAME :
		style_border_preview
	INPUT :
		zone	=> top/bottom/left/right selon la zone a mettre a jour
		mode	=> 1 (mettre a jour la zone par rapport au parametrage souhaite) ou 2 (recuperer le style de la zone et le mettre dans le parametrage souhaite)
	OUTPUT :
		- (mise a jour de la previsualisation visuelle des bordures)
	************************************* */
	var div_style_border				= document.getElementById("div_style_border");
	var div_style_border_color	= document.getElementById("div_style_border_color");
	var div_style_border_style	= document.getElementById("div_style_border_style");
	var div_style_border_width	= document.getElementById("div_style_border_width");

	/* recuperation des valeurs a mettre a jour et affectation d'une valeur par défaut si besoin */
	var new_color	= div_style_border_color.value;
	var new_style	= div_style_border_style.value;
	var new_width	= div_style_border_width.value;

	if (new_color == "" && new_style == "" && new_width == "")
	{	/* tout est vide => autorisé car on peut mettre une bordure à vide */
	}
	else
	{	/* tout n'est pas vide mais certaines le sont => utilisation de valeurs par défaut */
		if (new_color == "")	new_color	= "#000000";
		if (new_style == "")	new_style	= "solid";
		if (new_width == "")	new_width	= "1px";
	}

	/* recuperation des champs caches */
	var style_border_bottom_color	= document.getElementById("style_border-bottom-color");
	var style_border_bottom_style	= document.getElementById("style_border-bottom-style");
	var style_border_bottom_width	= document.getElementById("style_border-bottom-width");
	var style_border_left_color		= document.getElementById("style_border-left-color");
	var style_border_left_style		= document.getElementById("style_border-left-style");
	var style_border_left_width		= document.getElementById("style_border-left-width");
	var style_border_right_color	= document.getElementById("style_border-right-color");
	var style_border_right_style	= document.getElementById("style_border-right-style");
	var style_border_right_width	= document.getElementById("style_border-right-width");
	var style_border_top_color		= document.getElementById("style_border-top-color");
	var style_border_top_style		= document.getElementById("style_border-top-style");
	var style_border_top_width		= document.getElementById("style_border-top-width");

	/* TOP */
	if (zone == "top" || zone == "all")
	{
		if (mode == 1)
		{	/* mise a jour de la bordure */
			var old_color																= div_style_border.style.borderTopColor;
			var old_style																= div_style_border.style.borderTopStyle;
			var old_width																= div_style_border.style.borderTopWidth;
			div_style_border.style.borderTopColor				= new_color;
			div_style_border.style.borderTopStyle				= new_style;
			div_style_border.style.borderTopWidth				= new_width;
			/* cas special : on a applique le meme style => il faut en fait supprimer le style */
			if (old_color == div_style_border.style.borderTopColor && old_style == div_style_border.style.borderTopStyle && old_width == div_style_border.style.borderTopWidth)
			{
				new_color																	= "#000";
				new_style																	= "none";
				new_width																	= "0px";
				div_style_border.style.borderTopColor			= new_color;
				div_style_border.style.borderTopStyle			= new_style;
				div_style_border.style.borderTopWidth			= new_width;
			}
			/* impact sur les champs caches */
			style_border_top_color.value								= new_color;
			style_border_top_style.value								= new_style;
			style_border_top_width.value								= new_width;
		}
		if (mode == 2)
		{	/* recuperation du style de la zone */
			div_style_border_color.value								= div_style_border.style.borderTopColor;
			div_style_border_style.value								= div_style_border.style.borderTopStyle;
			div_style_border_width.value								= div_style_border.style.borderTopWidth;
			try{color_update_background(div_style_border_color);}catch(e){};
		}
	}

	/* BOTTOM */
	if (zone == "bottom" || zone == "all")
	{
		if (mode == 1)
		{	/* mise a jour de la bordure */
			var old_color																= div_style_border.style.borderBottomColor;
			var old_style																= div_style_border.style.borderBottomStyle;
			var old_width																= div_style_border.style.borderBottomWidth;
			div_style_border.style.borderBottomColor		= new_color;
			div_style_border.style.borderBottomStyle		= new_style;
			div_style_border.style.borderBottomWidth		= new_width;
			/* cas special : on a applique le meme style => il faut en fait supprimer le style */
			if (old_color == div_style_border.style.borderBottomColor && old_style == div_style_border.style.borderBottomStyle && old_width == div_style_border.style.borderBottomWidth)
			{
				new_color																	= "#000";
				new_style																	= "none";
				new_width																	= "0px";
				div_style_border.style.borderBottomColor	= new_color;
				div_style_border.style.borderBottomStyle	= new_style;
				div_style_border.style.borderBottomWidth	= new_width;
			}
			/* impact sur les champs caches */
			style_border_bottom_color.value							= new_color;
			style_border_bottom_style.value							= new_style;
			style_border_bottom_width.value							= new_width;
		}
		if (mode == 2)
		{	/* recuperation du style de la zone */
			div_style_border_color.value								= div_style_border.style.borderBottomColor;
			div_style_border_style.value								= div_style_border.style.borderBottomStyle;
			div_style_border_width.value								= div_style_border.style.borderBottomWidth;
			try{color_update_background(div_style_border_color);}catch(e){};
		}
	}

	/* LEFT */
	if (zone == "left" || zone == "all")
	{
		if (mode == 1)
		{	/* mise a jour de la bordure */
			var old_color																= div_style_border.style.borderLeftColor;
			var old_style																= div_style_border.style.borderLeftStyle;
			var old_width																= div_style_border.style.borderLeftWidth;
			div_style_border.style.borderLeftColor			= new_color;
			div_style_border.style.borderLeftStyle			= new_style;
			div_style_border.style.borderLeftWidth			= new_width;
			/* cas special : on a applique le meme style => il faut en fait supprimer le style */
			if (old_color == div_style_border.style.borderLeftColor && old_style == div_style_border.style.borderLeftStyle && old_width == div_style_border.style.borderLeftWidth)
			{
				new_color																	= "#000";
				new_style																	= "none";
				new_width																	= "0px";
				div_style_border.style.borderLeftColor		= new_color;
				div_style_border.style.borderLeftStyle		= new_style;
				div_style_border.style.borderLeftWidth		= new_width;
			}
			/* impact sur les champs caches */
			style_border_left_color.value								= new_color;
			style_border_left_style.value								= new_style;
			style_border_left_width.value								= new_width;
		}
		if (mode == 2)
		{	/* recuperation du style de la zone */
			div_style_border_color.value								= div_style_border.style.borderLeftColor;
			div_style_border_style.value								= div_style_border.style.borderLeftStyle;
			div_style_border_width.value								= div_style_border.style.borderLeftWidth;
			try{color_update_background(div_style_border_color);}catch(e){};
		}
	}

	/* RIGHT */
	if (zone == "right" || zone == "all")
	{
		if (mode == 1)
		{	/* mise a jour de la bordure */
			var old_color																= div_style_border.style.borderRightColor;
			var old_style																= div_style_border.style.borderRightStyle;
			var old_width																= div_style_border.style.borderRightWidth;
			div_style_border.style.borderRightColor			= new_color;
			div_style_border.style.borderRightStyle			= new_style;
			div_style_border.style.borderRightWidth			= new_width;
			/* cas special : on a applique le meme style => il faut en fait supprimer le style */
			if (old_color == div_style_border.style.borderRightColor && old_style == div_style_border.style.borderRightStyle && old_width == div_style_border.style.borderRightWidth)
			{
				new_color																	= "#000";
				new_style																	= "none";
				new_width																	= "0px";
				div_style_border.style.borderRightColor		= new_color;
				div_style_border.style.borderRightStyle		= new_style;
				div_style_border.style.borderRightWidth		= new_width;
			}
			/* impact sur les champs caches */
			style_border_right_color.value							= new_color;
			style_border_right_style.value							= new_style;
			style_border_right_width.value							= new_width;
		}
		if (mode == 2)
		{	/* recuperation du style de la zone */
			div_style_border_color.value								= div_style_border.style.borderRightColor;
			div_style_border_style.value								= div_style_border.style.borderRightStyle;
			div_style_border_width.value								= div_style_border.style.borderRightWidth;
			try{color_update_background(div_style_border_color);}catch(e){};
		}
	}

	style_border_preview_adjust();
}

function style_border_preview_adjust()
{	/*  */
	/* *************************************
	NAME :
		style_border_preview_adjust
	INPUT :
		-
	OUTPUT :
		- (ajustement de la previsualisation pour un affichage correct)
	************************************* */
	var style_border_init_height	= 80;
	var style_border_init_left		= 54;
	var style_border_init_top			= 21;
	var style_border_init_width		= 91;

	var div_style_border	= document.getElementById("div_style_border");

	var borderTopWidth		= div_style_border.style.borderTopWidth == "" ? 0 : parseInt(div_style_border.style.borderTopWidth);
	var borderBottomWidth	= div_style_border.style.borderBottomWidth == "" ? 0 : parseInt(div_style_border.style.borderBottomWidth);
	var borderLeftWidth		= div_style_border.style.borderLeftWidth == "" ? 0 : parseInt(div_style_border.style.borderLeftWidth);
	var borderRightWidth	= div_style_border.style.borderRightWidth == "" ? 0 : parseInt(div_style_border.style.borderRightWidth);
	if (b_ff)
	{
		div_style_border.style.top		= (style_border_init_top - borderTopWidth) + "px";
		div_style_border.style.left		= (style_border_init_left - borderLeftWidth) + "px";
		div_style_border.style.height	= (style_border_init_height) + "px";
		div_style_border.style.width	= (style_border_init_width) + "px";
	}
	if (b_ie)
	{
		div_style_border.style.top		= (style_border_init_top - borderTopWidth) + "px";
		div_style_border.style.left		= (style_border_init_left - borderLeftWidth) + "px";
		div_style_border.style.height	= (style_border_init_height + borderTopWidth + borderBottomWidth) + "px";
		div_style_border.style.width	= (style_border_init_width + borderLeftWidth + borderRightWidth) + "px";
	}
}

function style_border_preview_init()
{	/*  */
	/* *************************************
	NAME :
		style_border_preview_init
	INPUT :
		-
	OUTPUT :
		- (mise a jour de la previsualisation visuelle des bordures par rapport a l'existant)
	************************************* */
	var div_style_border	= document.getElementById("div_style_border");

	/* recuperation des champs caches */
	var style_border_bottom_color	= document.getElementById("style_border-bottom-color");
	var style_border_bottom_style	= document.getElementById("style_border-bottom-style");
	var style_border_bottom_width	= document.getElementById("style_border-bottom-width");
	var style_border_left_color		= document.getElementById("style_border-left-color");
	var style_border_left_style		= document.getElementById("style_border-left-style");
	var style_border_left_width		= document.getElementById("style_border-left-width");
	var style_border_right_color	= document.getElementById("style_border-right-color");
	var style_border_right_style	= document.getElementById("style_border-right-style");
	var style_border_right_width	= document.getElementById("style_border-right-width");
	var style_border_top_color		= document.getElementById("style_border-top-color");
	var style_border_top_style		= document.getElementById("style_border-top-style");
	var style_border_top_width		= document.getElementById("style_border-top-width");

	/* gestion de plantages sous IE lorsqu'on a mis un style incomplet (ex: sans préciser le style ou la largeur ou la couleur */
	try { div_style_border.style.borderTopStyle			= style_border_top_style.value;} catch(e) {};
	try { div_style_border.style.borderTopStyle			= style_border_top_color.value;} catch(e) {};
	try { div_style_border.style.borderTopStyle			= style_border_top_width.value;} catch(e) {};
	try { div_style_border.style.borderTopColor			= style_border_top_style.value;} catch(e) {};
	try { div_style_border.style.borderTopColor			= style_border_top_color.value;} catch(e) {};
	try { div_style_border.style.borderTopColor			= style_border_top_width.value;} catch(e) {};
	try { div_style_border.style.borderTopWidth			= style_border_top_style.value;} catch(e) {};
	try { div_style_border.style.borderTopWidth			= style_border_top_color.value;} catch(e) {};
	try { div_style_border.style.borderTopWidth			= style_border_top_width.value;} catch(e) {};

	try { div_style_border.style.borderBottomStyle	= style_border_bottom_style.value;} catch(e) {};
	try { div_style_border.style.borderBottomStyle	= style_border_bottom_color.value;} catch(e) {};
	try { div_style_border.style.borderBottomStyle	= style_border_bottom_width.value;} catch(e) {};
	try { div_style_border.style.borderBottomColor	= style_border_bottom_style.value;} catch(e) {};
	try { div_style_border.style.borderBottomColor	= style_border_bottom_color.value;} catch(e) {};
	try { div_style_border.style.borderBottomColor	= style_border_bottom_width.value;} catch(e) {};
	try { div_style_border.style.borderBottomWidth	= style_border_bottom_style.value;} catch(e) {};
	try { div_style_border.style.borderBottomWidth	= style_border_bottom_color.value;} catch(e) {};
	try { div_style_border.style.borderBottomWidth	= style_border_bottom_width.value;} catch(e) {};

	try { div_style_border.style.borderLeftStyle		= style_border_left_style.value;} catch(e) {};
	try { div_style_border.style.borderLeftStyle		= style_border_left_color.value;} catch(e) {};
	try { div_style_border.style.borderLeftStyle		= style_border_left_width.value;} catch(e) {};
	try { div_style_border.style.borderLeftColor		= style_border_left_style.value;} catch(e) {};
	try { div_style_border.style.borderLeftColor		= style_border_left_color.value;} catch(e) {};
	try { div_style_border.style.borderLeftColor		= style_border_left_width.value;} catch(e) {};
	try { div_style_border.style.borderLeftWidth		= style_border_left_style.value;} catch(e) {};
	try { div_style_border.style.borderLeftWidth		= style_border_left_color.value;} catch(e) {};
	try { div_style_border.style.borderLeftWidth		= style_border_left_width.value;} catch(e) {};

	try { div_style_border.style.borderRightStyle		= style_border_right_style.value;} catch(e) {};
	try { div_style_border.style.borderRightStyle		= style_border_right_color.value;} catch(e) {};
	try { div_style_border.style.borderRightStyle		= style_border_right_width.value;} catch(e) {};
	try { div_style_border.style.borderRightColor		= style_border_right_style.value;} catch(e) {};
	try { div_style_border.style.borderRightColor		= style_border_right_color.value;} catch(e) {};
	try { div_style_border.style.borderRightColor		= style_border_right_width.value;} catch(e) {};
	try { div_style_border.style.borderRightWidth		= style_border_right_style.value;} catch(e) {};
	try { div_style_border.style.borderRightWidth		= style_border_right_color.value;} catch(e) {};
	try { div_style_border.style.borderRightWidth		= style_border_right_width.value;} catch(e) {};

	try { style_border_preview_adjust();} catch(e) {};
}

function swf_reload_media(swf_patternallowed,swf_patternnotallowed, metier_id, swf_movie, swf_movie_url, swf_movie_id, swf_movie_width, swf_movie_height, swf_movie_version, swf_movie_install, swf_movie_flashvar, swf_movie_params, swf_movie_attributes){
/* *************************************
NAME :
	swf_reload_media
INPUT :
	swf_patternallowed 		=> pattern des ressources autorisees par le lecteur
	swf_patternnotallowed	=> pattern des ressources non autorisees par le lecteur
	metier_id							=> id numerique  de l'objet
	swf_movie							=> url du lecteur swf
	swf_movie_url					=> url de la ressource à lire
	swf_movie_id					=> id de l'objet cible pour accueillir le lecteur
	swf_movie_width 			=> largeur du lecteur
	swf_movie_height 			=> hauteur du lecteur
	swf_movie_version			=> version flash recommandee
	swf_movie_install 		=> lancement auto de la version recommandée
	swf_movie_flashvar		=> tableau des flashvar
	swf_movie_params			=> tableau des params
	swf_movie_attributes	=> tableau des attributs
OUTPUT :
	- rechargement du lecteur avec une nouvelle ressource ou lancement du téléchargement/ouverture classique
************************************* */
	if(swf_movie_url.substr(0, 1) == "&")
		return false;

	if(swf_patternnotallowed != "")
	{
		var regExp = new RegExp(swf_patternnotallowed, "gi");
		if(regExp.test(swf_movie_url))
		{
			var oMedia = document.getElementById("div_media_" + metier_id);
				if(oMedia)
				{
					oMedia.innerHTML="<iframe src='"+ swf_movie_url + "'></iframe>";
				}
		}
		else
		{
			swfobject.embedSWF(swf_movie + swf_movie_url, swf_movie_id, swf_movie_width, swf_movie_height, swf_movie_version, swf_movie_install, swf_movie_flashvar, swf_movie_params, swf_movie_attributes);
		}
	}
	else
	{
		var regExp = new RegExp(swf_patternallowed, "gi");
		if(regExp.test(swf_movie_url))
		{
			swfobject.embedSWF(swf_movie + swf_movie_url, swf_movie_id, swf_movie_width, swf_movie_height, swf_movie_version, swf_movie_install, swf_movie_flashvar, swf_movie_params, swf_movie_attributes);
		}
		else
		{
			var oMedia = document.getElementById("div_media_" + metier_id);
			if(oMedia)
			{
				oMedia.innerHTML="<iframe src='"+ swf_movie_url + "'></iframe>";
			}
		}
	}
}

function table_get_from_id(table_id, remove_text_nodes)
{
	/* *************************************
	NAME :
		table_get_from_id
	INPUT :
		table_id					=> id de la table a recuperer
		remove_text_nodes	=> true si on veut supprimer les nodes de type "texte" et false sinon (generes par Firefox par exemple)
	OUTPUT :
		renvoi le contenu de la table selon le type de browser
	************************************* */
	var table;
	if (b_ie)
	{
		table = document.getElementById(table_id).firstChild;
	}
	if (b_ff)
	{
		table = document.getElementById(table_id).lastChild;
	}
	if (remove_text_nodes)
	{
		for (var i_tr=table.childNodes.length-1 ; i_tr>=0 ; i_tr--)
		{
			var tr = table.childNodes[i_tr];
			if (tr.nodeType == 3)
			{	/* type "texte" => suppression */
				tr.parentNode.removeChild(tr);
				tr = null;
			}
			else
			{
				for (var i_td=tr.childNodes.length-1 ; i_td>=0 ; i_td--) /* parcours a l'envers car suppression */
				{
					var td = tr.childNodes[i_td];
					if (td.nodeType == 3)
					{	/* type "texte" => suppression */
						td.parentNode.removeChild(td);
						td = null;
					}
				}
			}
		}
	}
	return (table);
}

function table_sort(reference_table, no_column)
{
	/* *************************************
	NAME :
		table_sort
	INPUT :
		reference_table	=> référence de la table à trier
		no_column				=> numéro d'ordre de la colonne à trier dans la table
	OUTPUT :
		- (tri la table donnée en paramètre)
	************************************* */
	var min_index					= -1;
	var min_value					= null;
	var tmp_value					= null;
	var current_cell			= null;
	var tmp_cell					= null;

	/* tri simple à double boucle */
	var tmp_table_rows		= getChildrenByTagName(reference_table, "tr");

	var min_row						= 0;
	/* est-ce qu'on a une ligne de titre ? */
	if (getChildrenByTagName(tmp_table_rows[0], "td")[0].getAttribute("header") == "1")
		min_row							= 1;

	/* parcours de toutes les lignes */
	for (var i=min_row ; i<tmp_table_rows.length ; i++)
	{
		/* récupération de la valeur de la colonne à trier */
		var current_cell		= getChildrenByTagName(tmp_table_rows[i], "td")[no_column];
		min_value						= current_cell.innerHTML;
		min_index						= i;

		/* prise en compte du cas "nombre" */
		if (!isNaN(min_value))
		{
			if (current_cell.innerHTML != "")
				min_value					= parseFloat(min_value);
			else
				min_value					= "";
		}

		/* parcours de toutes les lignes en-dessous */
		for (var k=i+1 ; k<tmp_table_rows.length ; k++)
		{
			/* récupération de la valeur de la colonne à trier */
			var tmp_cell			= getChildrenByTagName(tmp_table_rows[k], "td")[no_column];
			tmp_value					= tmp_cell.innerHTML;

			/* prise en compte du cas "nombre" */
			if (!isNaN(tmp_value))
			{
				if (tmp_value != "")
					tmp_value				= parseFloat(tmp_value);
				else
					tmp_value				= "";
			}

			if (tmp_value < min_value)
			{
				min_index				= k;
				min_value				= tmp_value;
			}
		}

		/* déplacement de la colonne */
		var tmp_row					= tmp_table_rows[min_index];
		if (tmp_row)
			reference_table.insertBefore(tmp_row, tmp_table_rows[i]);

		/* on recharge la liste des lignes */
		tmp_table_rows			= getChildrenByTagName(reference_table, "tr");
	}
}

String.prototype.trim = function() { return this.replace( /^\s+|\s+$/, "" ); }

function trim(tmp_string)
{
	/* *************************************
	NAME :
		trim
	INPUT :
		tmp_string => chaine dont on veut supprimer les espaces inutiles
	OUTPUT :
		chaine sans espaces inutiles
	************************************* */
	if (String(tmp_string) == "undefined" || String(tmp_string) == null)
		return "";
	else
		return tmp_string.replace(/(^\s*)|(\s*$)/g,'');
}

function trim_array(tmp_array)
{
	/* *************************************
	NAME :
		tmp_array
	INPUT :
		tmp_array => tableau dont on veut supprimer les valeurs inutiles
	OUTPUT :
		chaine sans espaces inutiles
	************************************* */
	var tmp = new Array();
	for(j=0 ; j<tmp_array.length ; j++)
		if(tmp_array[j] != '')
			tmp[tmp.length] = tmp_array[j];
	tmp_array.length = tmp.length;
	for(j=0 ; j<tmp.length ; j++)
		tmp_array[j] = tmp[j];
	return tmp_array;
}

function url_argument_value(name)
{
	var regexS	= "[\\?&]"+name+"=([^&#]*)";
	var regex		= new RegExp( regexS );
	var tmpURL	= window.location.href;
	var results	= regex.exec( tmpURL );
	if (results	== null)
		return "";
	else
		return results[1];
}

function url_is_same_domain(url_1, url_2)
{
	/* *************************************
	NAME :
		url_is_same_domain
	INPUT :
		url_1	=> 1e url
		url_2	=> 2e url
	OUTPUT :
		true si les urls sont dans le même domaine et false sinon
	************************************* */
	var result;

	/* cas 1 : "." ou "/" en debut d'url => relatif => meme fenetre */
	if (url_1.substr(0, 1) == "." || url_1.substr(0, 1) == "/")
		result = true;
	else
	{
		/* cas 2 : meme serveur (apres protocol://) => meme domaine => meme fenetre */
		var serveur_2	= url_2.substr(url_2.indexOf("://") + 3, url_2.length);
		serveur_2			= serveur_2.substr(0, serveur_2.indexOf("/"));
		var serveur_1	= url_1.substr(url_1.indexOf("://") + 3, url_1.length);
		serveur_1			= serveur_1.substr(0, serveur_1.indexOf("/"));
		if (serveur_2 == serveur_1)
			result = true;
		else
			result = false;
	}
	return result;
}

function utf8_encode(string) {
      string = string.replace(/\r\n/g,"\n");
      var utftext = "";

      for (var n = 0; n < string.length; n++) {

          var c = string.charCodeAt(n);

          if (c < 128) {
              utftext += String.fromCharCode(c);
          }
          else if((c > 127) && (c < 2048)) {
              utftext += String.fromCharCode((c >> 6) | 192);
              utftext += String.fromCharCode((c & 63) | 128);
          }
          else {
              utftext += String.fromCharCode((c >> 12) | 224);
              utftext += String.fromCharCode(((c >> 6) & 63) | 128);
              utftext += String.fromCharCode((c & 63) | 128);
          }
      }
      return utftext;
}

function window_get_sizes(object, request)
{
	/* *************************************
	NAME :
		window_get_sizes
	INPUT :
		request => valeur cherchee concernant la fenetre (width, height, max_x, max_y, scroll_x, scroll_y)
	OUTPUT :
		valeur cherchee
	************************************* */
	switch (String(request).toLowerCase())
	{
		case "width" :
			return (parseInt(b_ie ? object.document.body.offsetWidth : object.innerWidth));
		case "height" :
			return (parseInt(b_ie ? object.document.body.offsetHeight : object.innerHeight));
		case "max_x" :
			var tmp_integer	= parseInt((b_ie || b_sf || b_chrome) ? object.document.body.scrollWidth : parseInt(object.innerWidth) + parseInt(object.scrollMaxX));
			var tmp_max_x		= parseInt((b_ie || b_sf || b_chrome) ? object.document.body.clientWidth : object.innerWidth);
			return (tmp_integer < tmp_max_x ? tmp_max_x : tmp_integer);
		case "max_y" :
			var tmp_integer	= parseInt((b_ie || b_sf || b_chrome) ? object.document.body.scrollHeight : parseInt(object.innerHeight) + parseInt(object.scrollMaxY));
			var tmp_max_y		= parseInt((b_ie || b_sf || b_chrome) ? object.document.body.clientHeight : object.innerHeight);
			return (tmp_integer < tmp_max_y ? tmp_max_y : tmp_integer);
		case "scroll_x" :
			return (parseInt(b_ie ? object.document.body.scrollLeft : object.scrollX));
		case "scroll_y" :
			return (parseInt(b_ie ? object.document.body.scrollTop : object.scrollY));
	}
	return false;
}

function window_preparesubmit()
{
	/* *************************************
	NAME :
		window_preparesubmit
	INPUT :
		-
	OUTPUT :
		- (preparation du submit par sauvegarde du contenu du formulaire)
	************************************* */
	/* necessite d'avoir la ligne suivante dans le formulaire soumis :
		<textarea id='textarea_backup' name='textarea_backup' style='display:none;' cols='1' rows='1'></textarea>
	*/
	var textarea_backup		= document.getElementById("textarea_backup");
	var tmp_string				= get_outerHTML(document.getElementById("form_main"));
	textarea_backup.value	= tmp_string;
	return true;
}


/* *************************************
Ce fichier JS contient diverses methodes
************************************* */

/* touche "escape" => masquage de l'alerte (ok, non, annuler... selon le type d'alerte) */
document.onkeydown = function(e){
	var keyCode = b_ie ? event.keyCode : e.keyCode;
	/* escape */
	if (keyCode == 27)
	{ try { key_manage_escape(e); } catch(erreur) {}; }
	/* delete */
	if (keyCode == 46)
	{ try { key_manage_delete(e); } catch(erreur) {}; }
	/* ctrl^z */
	if (keyCode == 90 && (b_ie ? event.ctrlKey : e.ctrlKey))
	{ try { key_manage_ctrlz(e); } catch(erreur) {}; }
	/* ctrl^y */
	if (keyCode == 89 && (b_ie ? event.ctrlKey : e.ctrlKey))
	{ try { key_manage_ctrly(e); } catch(erreur) {}; }
	/* flèches de direction */
	if (keyCode == 37 || keyCode == 38 || keyCode == 39 || keyCode == 40)
	{ try { key_manage_move(e, keyCode); } catch(erreur) {}; }
};
var key_manage_escape;
var key_manage_delete;

var x, y;
function selectmouse(e)
{
	/* *************************************
	NAME :
		selectmouse
	INPUT :
		-
	OUTPUT :
		- (desactivation du clic droit de la souris et de la selection sauf sur les champs)
	************************************* */
	if (b_ie)
	{
		x = event.clientX;
		y = event.clientY;
		var tmp_string = event.srcElement.nodeName.toLowerCase();
		/* on autorise la selection dans un champ (ou dans un objet, comme par exemple le Flash du Diaporama sinon probleme IE/FF) */
		return (mouse_can_select || tmp_string == "input" || tmp_string == "textarea" || tmp_string == "object" || tmp_string == "embed" || tmp_string == "select");
	}
	if (b_ff)
	{
		x = e.clientX;
		y = e.clientY;
		var tmp_string = e.target.nodeName.toLowerCase();
		/* on autorise la selection dans un champ (ou dans un objet, comme par exemple le Flash du Diaporama sinon probleme IE/FF) */
		return (mouse_can_select || tmp_string == "input" || tmp_string == "textarea" || tmp_string == "object" || tmp_string == "embed" || tmp_string == "select");
	}
	return (false);
}

/* *************************************
gestion du menu contextuel + desactivation de la selection du texte sauf sur les champs de saisie
************************************* */
var mouse_can_select	= false;
var mouse_can_context	= false;
if (b_ie)
{
	document.oncontextmenu	= new Function("return mouse_can_context;");
	document.onmousedown		= selectmouse;
	document.onselectstart	= selectmouse;
	document.onmousemove		= selectmouse;
}
if (b_ff)
{
	window.captureEvents(Event.MOUSEDOWN);
	window.captureEvents(Event.MOUSEMOVE);
	document.oncontextmenu	= new Function("return mouse_can_context;");
	document.onmousedown		= selectmouse;
	document.onmousemove		= selectmouse;
}

var mouse_isleft	= false;
var mouse_isright	= false;
function mouse_left(e)
{
	/* *************************************
	NAME :
		mouse_left
	INPUT :
		e => event permettant de connaitre le clic de la souris
	OUTPUT :
		true si click gauche et false sinon
	************************************* */
	if ((b_ff && e.button == 0) || (b_ie && event.button == 1))
		mouse_isleft = true;
	else
		mouse_isleft = false;
	return parseInt(mouse_isleft);
}

function mouse_right(e)
{
	/* *************************************
	NAME :
		mouse_right
	INPUT :
		e => event permettant de connaitre le clic de la souris
	OUTPUT :
		true si click droit et false sinon
	************************************* */
	if ((b_ff && e.button == 2) || (b_ie && event.button == 2))
		mouse_isright = true;
	else
		mouse_isright = false;
	return parseInt(mouse_isright);
}

function mouse_x(e)
{
	/* *************************************
	NAME :
		mouse_x
	INPUT :
		e => event permettant de connaitre la position de la souris
	OUTPUT :
		abscisse de l'emplacement de la souris
	************************************* */
	if (b_ie)
		return parseInt(event.clientX) + parseInt(document.body.scrollLeft);
	if (b_ff)
		return e.pageX;
}

function mouse_y(e)
{
	/* *************************************
	NAME :
		mouse_y
	INPUT :
		e => event permettant de connaitre la position de la souris
	OUTPUT :
		ordonnee de l'emplacement de la souris
	************************************* */
	if (b_ie)
		return parseInt(event.clientY) + parseInt(document.body.scrollTop);
	if (b_ff)
		return e.pageY;
}
