function bw_check(){var is_major=parseInt(navigator.appVersion);this.nver=is_major;this.ver=navigator.appVersion;this.agent=navigator.userAgent;this.dom=document.getElementById?1:0;this.opera=window.opera?1:0;this.ie5=(this.ver.indexOf("MSIE 5")>-1&&this.dom&&!this.opera)?1:0;this.ie6=(this.ver.indexOf("MSIE 6")>-1&&this.dom&&!this.opera)?1:0;this.ie4=(document.all&&!this.dom&&!this.opera)?1:0;this.ie=this.ie4||this.ie5||this.ie6;this.mac=this.agent.indexOf("Mac")>-1;this.ns6=(this.dom&&parseInt(this.ver)>=5)?1:0;this.ie3=(this.ver.indexOf("MSIE")&&(is_major<4));this.hotjava=(this.agent.toLowerCase().indexOf('hotjava')!=-1)?1:0;this.ns4=(document.layers&&!this.dom&&!this.hotjava)?1:0;this.bw=(this.ie6||this.ie5||this.ie4||this.ns4||this.ns6||this.opera);this.ver3=(this.hotjava||this.ie3);this.opera7=((this.agent.toLowerCase().indexOf('opera 7')>-1) || (this.agent.toLowerCase().indexOf('opera/7')>-1));this.operaOld=this.opera&&!this.opera7;return this;};
function none(){}
function nn(val){return val != null;}
//function und(val){return typeof(val)=='undefined';}

/**
 * @return true si la variable fournie est définie.
 */
function checkVariable(variable) {
	if ( (variable == null) || (variable == 'undefined') ) {
		return false;
	}
	return true;
}

function und(a_val) {
	return (a_val == null) || (typeof(a_val) == 'undefined');
}

/**
 * Fixe la hauteur de l'élément contenant l'iframe dans laquelle est appelée cette méthode.
 * Pour IE5 Win, l'élément <iframe> doit être contenu dans un élément dont l'id correspond à la
 * concaténation du name de <iframe> et de '_parent'.
 * @param	a_height	(int)		hauteur en pixel
 */
function setParentIFrameHeight(a_height) {
	var l_parentNode;
	var l_iFrame = window.frameElement;
	if (und(l_iFrame)) {
		// IE 5.0 !!!
		// on recherche par son nom dans la fenêtre parente
		l_parentNode = xbGetElementById(window.name + '_parent', window.parent);
	} else {
		l_parentNode = l_iFrame.parentNode;
	}

	if (l_parentNode) {
		l_parentNode.style.height = a_height;
	} else {
		alert('noeud IFrame parent non trouvé');
	}
}

/** Remonte depuis un élément HTML jusqu'à l'élément HTML dans lequel il est inclu.
* Cela permet de récupérer la référence du composant et d'invoquer une de ses méthodes.
* @param a_includedNode 	élément HTML dont il faut trouver l'élément père.
* @param a_tagName 			nom de l'élément auquel il faut remonter.
* @return la référence du composant trouvé.
* @author VLT.
*/
function getElement(a_includedNode, a_tagName) {
	var l_uppTagName = a_tagName.toUpperCase();
	var l_node = a_includedNode;
	var l_uppName;
	do {
		l_node = l_node.parentNode;
		l_uppName = l_node.nodeName.toUpperCase();
		if (l_uppName == "BODY") {
			return null;
		}
	}
	while (l_uppName != l_uppTagName);

	return l_node;
}

/** 
 * Remonte dans les noeuds parents de l'élément HTML donné jusqu'à l'élément HTML 
 * dont on a spécifié le nom.
 * @param a_childNode (HTMLElement) référence de l'élément dont il faut trouver l'élément père.
 * @param a_parentName (String) nom de l'élément père jusqu'auquel il faut remonter.
 * @return la référence du composant trouvé.
 * @author VLT.
 */
function getParentByTagName(a_childNode, a_parentName) {
	var l_uppParentName = a_parentName.toUpperCase();
	var l_node = a_childNode;
	var l_uppName;
	do {
		l_uppName = l_node.nodeName.toUpperCase();
		if (l_uppName == "BODY") {
			return null;
		}
		if (l_uppName == l_uppParentName) {
			return l_node;
		}
		l_node = l_node.parentNode;
	}
	while (l_node.nodeName.toUpperCase() != l_uppParentName);

	return l_node;
}

/** 
 * Calcul de la coordonnée horizontale absolue d'un élément HTML.
 * @param a_myNode objet HTML dont on souhaite connaître la coordonnée.
 * @return coordonnée horizontale de l'objet.
 * @author VLT le 07/02/2002
 */
function getClientLeft(a_myNode) {
	var l_tmpNode = a_myNode;
	var l_left = 0;
	while ((l_tmpNode != null) &&(l_tmpNode.nodeName != "BODY")) {
		l_left += l_tmpNode.offsetLeft;
		l_tmpNode = l_tmpNode.offsetParent;
	}
	return l_left;
}

/** 
 * Calcul de la coordonnée verticale absolue d'un élément HTML.
 * @param a_myNode objet HTML dont on souhaite connaître la coordonnée.
 * @return coordonnée horizontale de l'objet.
 * @author VLT le 07/02/2002
 */
function getClientTop(a_myNode) {
	var l_tmpNode = a_myNode;
	var l_top = 0;
	while ((l_tmpNode != null) &&(l_tmpNode.nodeName != "BODY")) {
		l_top += l_tmpNode.offsetTop;
		l_tmpNode = l_tmpNode.offsetParent;
	}
	return l_top;
}

/** 
 * Calcul des coordonnées absolues d'un élément HTML.
 * @param a_myNode objet HTML dont on souhaite connaître les coordonnées.
 * @return les coordonnées [left, top]
 */
function getClientPosition(a_htmlElt) {
	var l_tmpNode = a_htmlElt;
	var l_position = [0, 0];
	while ((l_tmpNode != null) && (l_tmpNode.nodeName != "BODY")) {
		l_position[0] += l_tmpNode.offsetLeft;
		l_position[1] += l_tmpNode.offsetTop;
		l_tmpNode = l_tmpNode.offsetParent;
	}
	return l_position;
}

/**
 * Renvoie le premier fils de node dont le tag s'appelle name.
 * Renvoie le noeud lui-même si aucun fils correspondant n'est trouvé.
 * @param node      élément HTML père
 * @param tagName   nom du tag désiré
 */
function getChildByTag(node, tagName) {
	var l_children = node.getElementsByTagName(tagName);
	if (checkVariable(l_children) && checkVariable(l_children[0])) {
		return l_children[0];
	} else {
		return node;
	}
}

/**
 * Extrait de l'url courante les valeurs correspondantes aux paramètres spécifiés
 * dans l'url (cf visu.htm?toto=12&titi=14.
 * @return un objet comportant les propriétés définies ["toto"] = 12, ["titi"] = 14
 */
function extractQueryParams(a_window) {
	var l_window = a_window || window;
	var l_query = l_window.location.search.substring(1);	// on supprime le ?
	var l_params = l_query.split("&");	// on décompose par paires clé valeur

	var l_args = new Object();
	var l_pos, l_argName, l_argValue;
	for (var i = l_params.length; --i >= 0; ) {
		l_pos = l_params[i].indexOf("=");
		if (l_pos > 0) {
			// on a bien une paire clé valeur
			l_argName = l_params[i].substring(0, l_pos);	// on extrait le nom
			l_argValue = l_params[i].substring(l_pos + 1);	// on extrait la valeur
			// on stocke la valeur
			l_args[l_argName] = unescape(l_argValue);		// on stocke la valeur décodée
		}
	}
	// on renvoie l'objet contenant les valeurs
	return l_args;
}

/**
 * Définit la valeur du champ caché spécifié.
 * Ajoute éventuellment le champ hidden au formulaire fourni s'il n'existe pas.
 * @param	a_form		(HTMLForm)	formulaire
 * @param	a_window	(window)	fenêtre contenant le formulaire
 * @param	a_name		(String)	nom du champ
 * @param	a_value		(String)	valeur associée
 */
function setHiddenValue(a_form, a_window, a_name, a_value) {
	// on regarde si le champ existe déjà 
	var l_hidden = xbGetElementById(a_name, a_window);
	if (und(l_hidden)) {
		// non -> on le construit
		l_hidden = a_window.document.createElement('input');
		l_hidden.id = a_name;
		l_hidden.name = a_name;
		// pour compatibilité X-Browser, impossible de spécifier le type -> on cache le champ texte
		l_hidden.style.visibility = "hidden";
		l_hidden.style.display= "none";
		// on l'ajoute au formulaire
		a_form.appendChild(l_hidden);
	}
	// on définit sa valeur
	l_hidden.value = a_value;
}

var defaultProps =
	'dependent=no,'+ 			//fermeture auto avec fermeture parent (NS, ne fonctionne pas sur IE)
	'directories=no,'+			//barre d'outils
	'location=no,'+				//zone d'adresse
	'menubar=no,'+				//barre de menu
	'focus=yes,'+
	'status=no,';				//barre de statuts
	
function openWindow(a_url, a_name, a_width, a_height, a_left, a_top, a_scroll, a_resize) {
	if (!a_resize) {
		a_resize = 'no';
	}
	var l_props = defaultProps +
					'resizable=' + a_resize + ',' +	//redimensionnement
					'width=' + a_width + ',' +
					'height=' + a_height + ',' +
					'screenX=' + a_left + ',' +		//position horizontale (NS, ne fonctionne pas sur IE)
					'screenY=' + a_top + ',' +
					'left=' + a_left + ',' +		//position horizontale (IE, ne fonctionne pas sur NS)
					'top=' + a_top + ',' +
					'scrollbars=' + a_scroll;		//ascenseurs
	var theWindow = window.open(a_url, a_name, l_props); 

	if (theWindow) {
		theWindow.focus();
	} else {
		alert("Attention, votre navigateur bloque l'ouverture de fenêtres pop-up");
	}

	return theWindow;
}

/**
 * Rajoute dans la page HTML le code correspondant à un mailto :
 * <a class="a_class" title="a_title" href="mailto:a_user@a_domain?subject=a_subject&body=a_body">a_lib</a>
 * @param	a_user		(String)	nom de l'utilisateur
 * @param	a_domain	(String)	nom de domaine
 * @param	a_lib		(String)	texte affiché (si null, affichage du mail complet)
 * @param	a_class		(String)	classe CSS précisée pour la balise <a> (facultatif, null possible)
 * @param	a_subject	(String)	sujet (facultatif, null possible)
 * @param	a_body		(String)	contenu (facultatif, null possible)
 * @param	a_title		(String)	info-bulle (facultatif, null possible)
 */
function writeMail(a_user, a_domain, a_lib, a_class, a_subject, a_body, a_title) {
	document.write('<a');
	if (!und(a_class)) {
		document.write(' class="' + a_class + '"');
	}
	if (!und(a_title)) {
		document.write(' title="' + a_title + '"');
	}
	document.write(' href="' + 'mai');
	document.write('l' + 'to:' + a_user + '@' + a_domain);
	if (!und(a_subject)) {
		document.write('?' + 'sub' + 'ject=' + a_subject);
	}
	if (!und(a_body)) {
		document.write('&' + 'body=' + a_body);
	}
	if (und(a_lib)) {
		a_lib = a_user + '@' + a_domain;
	}
	document.write('">' + a_lib + '</a>');
}

/************************************************************************************
 ** trace dans une autre fenêtre
 */
/**
 * Ouvre la fenêtre de trace
 */
function initTrace() {
	var l_props = 
					'dependent=no,' + 	//fermeture sans fermeture parent (NS, ne fonctionne pas sur IE)
					'directories=no,' +	//barre d'outils
					'location=no,' +		//zone d'adresse
					'menubar=no,' +		//barre de menu
					'focus=no,' +
					'status=yes,' + 	//barre de statuts
					'resizable=yes,' +	//redimensionnement
					'width=350,' +
					'height=200,' +
					'screenX=900,' +		//position horizontale (NS, ne fonctionne pas sur IE)
					'screenY=0,' +
					'scrollbars=yes';	//ascenseurs
					
	top.trace = window.open('../modules/trace.htm', 'trace', l_props);
	top.trace.focus();
}

/**
 * Ajoute la ligne fournie au début de la trace
 * @param a_line   ligne à tracer
 */
function writeMyTrace(a_line) {
	if (checkVariable(top.trace) && (top.trace.closed == false)) {
		var l_textArea = top.trace.document.traceForm.traceText;
		l_textArea.value = a_line + '\n' + l_textArea.value;
	
//		var l_div = xbGetElementById("js", top.trace);
//		xbSetInnerHTML(l_div, "<script>alert('titi')<\/script>");
	}
}
