// Code javascript SIFACILE de gestion de menus au survol ou d'infobulles
// cross browser, transparence progressive. 1 seule infobulle ouverte à l'instant t : l'ouverture 
// d'une autre infobulle provoque la fermeture de la précédente éventuelle
// fermeture sur le mouse_out. Indépendant script_layer (gestion de popup via layers) car une popup peut contenir des menus ou infobulles
// alert("name="+navigator.appName+"\nVersion="+navigator.appVersion+"\nCodename="+navigator.appCodeName)
var x=navigator.userAgent.toLowerCase()
if(x.indexOf("opera")>-1) sf_NAV='Opera'
else if(x.indexOf("safari")>-1) sf_NAV='Safari'
else if(x.indexOf("msie")>-1) sf_NAV='IE'
else if(x.indexOf("mozilla")>-1 && x.indexOf("firefox")>-1) sf_NAV='Mozilla'
else if(self.document.layers) sf_NAV='NS'
else sf_NAV='?'
//alert(' \nsf_NAV='+sf_NAV+'\n\nAgent='+x)

var sf_bon='';		// mémo du nom des bulles ouverte
var sf_bopac=0;		// opacité de la bulle en cours
var sf_bstart=0;	// transparence de départ par défaut
var sf_bdel,sf_refresh,sf_bblstep=0;
var sf_docbubble=Array();	// mémo des bulles, pour affichage à la fin du document
var sf_mopac=false;		// masque de body en place (true) ou pas (false)


// ouverture de la bulle d'infos (x=1) ou fermeture avec inertie (x=0)
// inertie nécessaire pour permettre un déplacement facile de la souris vers la bulle
// s=step de transparence chaque 25 msec
function sf_bulle(name,x,s,m,start) {
	if(!x) {
		clearTimeout(sf_refresh)
		sf_bdel=setTimeout('sf_bdisplay("' + name + '",0)',50);
	}
	else {
		if(!start) var start=0
		clearTimeout(sf_bdel);
		sf_bdisplay(name,1,s,m,start);
	}
}

// ouverture / extinction d'une infobulle
// x=0(éteindre)  1(allumer)
// s=step de transparence (0..100) chaque 25 msec (0 -> pas de transparence progressive)
// ok_move = true/false : repositionner pour tenir à l'écran (true)
// start=transparence de départ au moment de l'allumage (0-100)
// cont :faux = init de l'extinction / allumage, 1 -> suite (modif transparence)
// mask=xx:yy
// xx= pre -> allume le fond avant l'image, post -> allume l'image avant le fond
// yy= pre -> éteint le fond avant l'image, post -> éteind l'image avant le fond
function sf_bdisplay(name,x,s,ok_move,start,cont) {
	if(sf_docbubble[name]['mask']) {
		var mask=sf_docbubble[name]['mask'].split(':')
		if(!mask[0]) mask=Array('none','none')
		else if(!mask[1]) mask[1]=mask[0]
	} else mask=new Array('none','none')
	delai_plus=0	// Allumage/extinction maskage -> délai supplémentaire avant action sur l'infobulle
	if(!cont) {		// INITS
		var cont=false;
		if(!x && mask[1]=='pre' && sf_bon==name) {	// bulle à éteindre et mask='pre' -> extinction du masque
			document.getElementById('sf-bodymask').style.display='none'		// estompage du body END
			delai_plus=150		// délai avant la suite des opérations
		}
		else if(x && mask[0]=='pre') {				// bulle à aluumer et mask = 'pre'-> allumage du masque
			document.getElementById('sf-bodymask').style.display='block'	// estompage du body START
			delai_plus=200
		}
		if(sf_bon) {
			if(sf_bon!=name) sf_closebulle(sf_bon)	// 	bulle à allumer/éteindre <> bulle active -> extinction immédiate de l'active
			else cont=true
		}
	}

	if(document.getElementById(name)) {
		var z=document.getElementById(name).style
		if(!s) s=sf_bblstep; else sf_bblstep=s		// pas +/-à utiliser
		if(!x && s>0) s=-s							// début d'inversion
		if(!start) var start=sf_bstart; else sf_bstart=start
		if(sf_bon) ok_move=false		// déplacement auto : uniquement avant l'ouverture
		if((x && sf_bopac<100) || (!x && sf_bopac>start)) {	// Modif de transparence en cours
			if(x && !cont) {		// INIT ALLUMAGE
				sf_bon=name;
				z.filter='alpha(opacity=0)';z.opacity=0
				z.display='block'							// permet de connaitre sa largeur et hauteur
				var mx=0,my=0

				// calcul offset/largeur fenêtre
				var doc=document.compatMode && document.compatMode=="BackCompat" ?
				  document.body : document.documentElement
				var doc1=sf_NAV=='Safari'? document.body : doc	// Forcage obligatoire avec 3.1 (525.13)
				var w_r=doc.clientWidth								// largeur d'écran
				var w_b=doc.clientHeight							// et sa hauteur
				var w_x=doc1.scrollLeft								// offset X
				var w_y=doc1.scrollTop								// offset Y
				var b_r=document.getElementById(name).offsetWidth	// largeur de la bulle
				var b_b=document.getElementById(name).offsetHeight	// et sa hauteur

				// Centrage a milieu de l'écran
				if(sf_docbubble[name]['center']==1) {
					var b_x=w_x+Math.round((w_r-b_r)/2)
					var b_y=w_y+Math.round((w_b-b_b)/2)
				}
				
				// Alignement des coins haut gauche avec le <a> trigger
				else {
					w_r-=3;w_b-=3	// marge de 3 pt avant le bord de la fenêtre
					container=document.getElementById('a_'+name),ty=0
				
					// Correction des bugs, en dynamique pour que la page reste cachable
					if(sf_NAV=='Mozilla') {			// bug Mozilla PC (cf doc_script_bubbles.txt)
						var child=container.childNodes
						for(i=0;i<child.length;i++) if(parseInt(child[i].offsetTop)<ty) ty=parseInt(child[i].offsetTop)
					} else if(sf_NAV=='Safari')		// bug Safari PC (cf doc_script_bubbles.txt)
						container.style['vertical-align']='top'

					// Calcul du point haut/gauche du container
					var b_x=sf_docbubble[name]['x']+container.offsetLeft	// x bord gauche
					var b_y=sf_docbubble[name]['y']+container.offsetTop+ty	// y bord haut
					b_r+=b_x;b_b+=b_y										// coin bas/droite de l'objet

					// calcul offset/largeur fenêtre avec marge de -5 pt autours
					var doc=document.compatMode && document.compatMode=="BackCompat" ?
					  document.body : document.documentElement
					var doc1=sf_NAV=='Safari'? document.body : doc	// Forcage obligatoire avec 3.1 (525.13)
					var w_x=doc1.scrollLeft			// offset X
					var w_y=doc1.scrollTop			// offset Y
					var w_r=doc.clientWidth+w_x-5	// bord droit limite
					var w_b=doc.clientHeight+w_y-5	// bas limite

					// calcul nouvelle pos, en cas de débordement
					if(ok_move) {
						if(b_r>w_r) mx=w_r-b_r			// déplacer vers la gauche
						if(b_x+mx<w_x) mx=w_x-b_x		// mais sans dépasser le bord
						if(b_b>w_b) my=w_b-b_b			// déplacer vers le haut
						if(b_y+my<w_y) my=w_y-b_y		// mais sans dépasser le bord
					}
				}
		
				// positionnement
				document.getElementById(name).style.left=(b_x+mx)+'px'
				document.getElementById(name).style.top=(b_y+my)+'px'
			}
			// modif de la transparence (on et off)
			if(!delai_plus) {
				sf_bopac+=s? s : 100
				if(sf_bopac>100) sf_bopac=100
				z.filter='alpha(opacity='+sf_bopac+')';z.opacity=sf_bopac/100
				// IE 5.5+ : on peut utiliser 'progid:DXImageTransform.Microsoft.alpha(opacity='+sf_bopac+')';
			}
			if(!cont ||((x && sf_bopac<100) || (!x && sf_bopac>start)))
			  sf_refresh=setTimeout('sf_bdisplay("' + name + '",'+x+',' + s +','+ok_move+','+start+',1)',25+delai_plus);
  			if(x && sf_bopac>=start && mask[0]=='post')
				setTimeout("document.getElementById('sf-bodymask').style.display='block'",200)	// délai_plus...
		}
		if(!x && sf_bopac<=start) {
			sf_closebulle(name)		// fin d'extinction -> RAZ all
			if(mask[1]=='post') setTimeout("document.getElementById('sf-bodymask').style.display='none'",100)
		}
	}
}

function sf_closebulle(name) {
	clearTimeout(sf_refresh);
	document.getElementById(name).style.display='none';
	sf_bopac=0;sf_bon='';sf_bblstep=0;sf_mopac=false;sf_bstart=0
}

function sf_putbulle(name,content) {
	txt=  '<div id="'+name+'" style="z-index:999;position:absolute;left:0;top:0;display:none"'
		+ (sf_docbubble[name]['mask'] ?
			(sf_docbubble[name]['click']? 'onclick="sf_bulle(\''+name+'\',0)"' : '')
		  : ' onmouseover="sf_bulle(\''+name+'\',1)" '
		    + (sf_docbubble[name]['click'] ? 'onclick' : 'onmouseout')
		    + '="sf_bulle(\''+name+'\',0)"')
		+ '>'+ content+ '<'+'/div>';
	document.write(txt);
}
