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');
}

/**
 * Redimensionne la cellule contenant l'iframe de détail, en utilisant l'élément <span id="bottom">
 * pour déterminer la hauteur fonction du contenu
 */
function resizeDetailIFrame() {
	// on récupère l'élément
	var l_bottomElt = xbGetElementById("bottom");
	if (!und(l_bottomElt)) {
		// on détermine sa position en Y
		var l_posY = getClientTop(l_bottomElt);
		
		// on modifie la taille de la cellule parente
		setParentIFrameHeight(l_posY);
	}
}

/**
 * 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;
	}
}

/**
 * Cache l'élément HTML fourni.
 */
function hideElement(a_htmlElt) {
	if (und(a_htmlElt.style)) {
		a_htmlElt.visibility = "hidden";
	} else {
		a_htmlElt.style.visibility = "hidden";
	}
}

/**
 * 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;
	for (var i= 0; i < a_form.length; i++) {
		if (a_form.elements[i].name == a_name) {
			l_hidden = a_form.elements[i];
			break;
		}
	} 
	if (und(l_hidden)) {
		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;
}

/**
 * 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>');
}

/**
 * Renvoie true si la chaîne passée a bien 'une tête de' mail.
 * @param a_strEmail  chaîne à tester
 * @return true si 'tête de' mail
 */
function isValidEmail(a_strEmail){
  var l_validRegExp = /^[^@]+@[^@]+.[a-z]{2,}$/i;
  if (a_strEmail.search(l_validRegExp) == -1) {
      return false;
  } 
  return true; 
}

/**
 * Renvoie true si la chaîne passée est vide ou ne contient que des 'blancs'
 * @param  s chaîne à tester
 * @return true si chaîne 'vide'
 */
function isBlank(s) {
	if ((s == null) || (s == "")) {
		return true;
	}
	var c;
	for (var i = 0; i < s.length; i++) {
		c = s.charAt(i);
		if ((c != ' ') && (c != '\n') && (c != '')) return false;
	}
	return true;
}

