//Michel DEBOOM 06/2005, Vincent CALAME 02/2007

/* Version 0.9 */

/*
Pour indiquer qu'un élément est susceptible de déclencher l'affichage d'un pop-up, 
il faut que son identifiant (l'attribut id) soit construit sous la forme 
PREFIXE_DETAILLE + l'identifiant de l'élément à afficher en bulle
ou PREFIXE_DETAILLE + l'identifiant de l'élément à afficher en bulle
La différence entre PREFIXE_DETAILLE et PREFIXE_RECOUVRE, c'est qu'avec PREFIXE_DETAILLE, la bulle
est légèrement en dessous de la souris, alors qu'avec PREFIXE__RECOUVRE, la bulle recouvre l'emplacement de la souris.
Les actions possibles pour l'utilisateur sont différentes :
- avec PREFIXE_DETAILLE, l'utilisateur a toujours accès à l'élément de départ (par exemple s'il agit un lien) mais ne peut pas accéder à la bulle,
- avec PREFIXE_RECOUVRE, l'utilisateur ne peut plus accéder à l'élément de départ mais peut accéder au contenu de la bulle, notamment s'il y a un lien dedans. PREFIXE_RECOUVRE est adapté pour les renvois de notes.
*/
var PREFIXE_DETAILLE = 'detail_';
var PREFIXE_RECOUVRE = 'contenu_';
var RECOUVRIR = 1;
var gk = (window.Event)?1:0; // navigateurs Gecko ou IE
var bulleEncours = null; //bulle en train d'être affichée, =0 si aucune bulle n'est affichée.
var dimElement= 0; //Élément de référence pour le calcul des dimensions d'écran, utilisé si gk = 0


function testBulle(evt) {
	if(!dimElement){ // IE6
		dimElement = (!document.documentElement.clientWidth)?document.body:document.documentElement;
	} 
	var node = (gk)?evt.target:event.srcElement; //objet sous la souris
	if (!node.tagName) node = node.parentNode; // noeud #text
	var elementId = node.id;
	var testId = checkId(elementId);
	if (testId > 0) {
		var bulleElement = getBulleElement(elementId,testId);
		if(bulleElement != bulleEncours) {// seulement si changement de bulleStyle 
			hideBulleEncours();
			bulleEncours = bulleElement;
			with (bulleElement) {
				var wpop = offsetWidth
				var hpop = offsetHeight;
			}
			var sourceHeight = node.offsetHeight; // hauteur de l'élément source (on suppose la valeur peu élevée)
			var fx = (gk)?innerWidth-15:dimElement.clientWidth;   //largeur de la fenêtre
			var fy = (gk)?innerHeight-15:dimElement.clientHeight; //hauteur de la fenêtre
			var sx = (gk)?pageXOffset:dimElement.scrollLeft;     //défilement horizontal
			var sy = (gk)?pageYOffset:dimElement.scrollTop;       //défilement vertical
			var cx = (gk)?evt.pageX:event.clientX+sx;       //Position exacte de la souris en x
			var cy = (gk)?evt.pageY:event.clientY+sy;       //Position exacte de la souris en y
			var posx = 0;
			if (cx >= fx+sx-wpop-10) { //position à gauche de l'élément
				if (testId == 1) posx = cx-15-wpop;
				else if (testId == 2) posx = cx-wpop +5;
			}
			else {
				if (testId == 1) posx = cx+10;
				else if (testId == 2) posx = cx -6;
			}
			var posy = 0;
			if (cy >= fy+sy-hpop-20) { //position au dessus de l'élément
				if (testId == 1) posy = fy+sy-hpop-sourceHeight-2; 
				else if (testId == 2) posy = fy+sy-hpop + 5; 
			}
			else {
				if (testId == 1) posy = cy+sourceHeight +2; //assure que la bulle ne recouvre pas la source
				else if (testId == 2) posy = cy - 6;	
			}
			bulleEncours.style.left = posx + 'px';
			bulleEncours.style.top = posy + 'px';
		}
	} 
	else {
		if (bulleEncours != null) {
			var hide = 1;
			while(node != dimElement)  {
				if (node == bulleEncours) {
					hide = 0;
					break;
				}
				node = node.parentNode;
			}
			if (hide == 1) hideBulleEncours();
		}
	}
	return true;
}

function checkId(elementId) {
	if (elementId.indexOf(PREFIXE_DETAILLE) == 0) return 1;
	if (elementId.indexOf(PREFIXE_RECOUVRE) == 0) return 2;
	return 0;
}

function getBulleElement(elementId, testId) {
	var bulleId;
	if (testId == 1) {
		bulleId = elementId.substring(PREFIXE_DETAILLE.length);
	}
	else if (testId == 2) {
		bulleId = elementId.substring(PREFIXE_RECOUVRE.length);
	}
	return document.getElementById(bulleId);
}

function hideBulleEncours() {
	if (bulleEncours != null) {
		bulleEncours.style.left= -999 + 'px';
		bulleEncours = null;
	}
}

document.onmousemove=testBulle;
