/*Visible! mme en commentaire (pour dŽfinir en UTF8 sans que a se mette encore 1 fois dans le code du fichier appelant cette page)<meta http-equiv="content-type" content="text/html;charset=utf-8">*//* function getStyle(objet, proprieteDeStyle) //renvoi la propriŽtŽ de style d'un objet, le nom de la classefunction afficherSecurHtmlJavascript(txt)function calqueVisibleOnOff(nomCalque) //Pour afficher/masquer les calquesfunction calqueMasquer(nomCalque)function calqueAfficher(nomCalque)function hauteurFenetre() //pour hauteur fenetre (partie visible, affichŽe)function largeurFenetre() //idem pour largeurfunction scrollVerticalFenetre() //Pour le scroll verticalfunction scrollHorizontalFenetre() //idem pour le scroll horizontalfunction centrerElement(element, PositionFixeOuPas)function positionnerCalqueInfo(nomChp) //Pour afficher le calque infofunction trouverPositionXY(objet)function deplace(hautMax) function fDeplace(hautMax)function cacherInfo()function corrigerChpListe(objetChamp)function afficherLoaderOnOff(onOff, emetteur)//pas sžr que ok si ces fonction ici (dans fichier js) car il me semble que a pose pb si j'utilise des caractres spŽciaux dans un fichier .js (ˆ tester, ˆ faire) :Scripts pour mini-bulles:function afficherBulleInfo(emetteur, evt, txt, numBulle, fixeOuPas, placement, surZoneOuPas, objetFixeOuPas)function masquerBullesInfo(numBulle)function position(evt)function animerDefilementPage()function defilerPageVersElement(element)*/////// SCRIPTS POUR BOUTONS PERSONNALISƒS//action = "survol" ou "clic" ou ""//couleur = 1, 2, 3 ou 0//taille = "gros" ou "" (ou normal)/*function activerBouton(objetThis, action){		couleur = couleurBouton(objetThis.className);	taille = tailleBouton(objetThis.className);	action = actionBouton(action, couleur);	objetThis.className = "bouton"+taille +" "+ "boutonFond"+couleur +" "+ action +" curseurMain"; //ex: "boutonGros boutonFondVert boutonFondVertSurvol curseurMain"}function couleurBouton(classeActuelle){	if (classeActuelle.indexOf("Vert") >= 0) { return "Vert"; }	else if (classeActuelle.indexOf("Orange") >= 0) { return "Orange"; }	else if (classeActuelle.indexOf("Rouge") >= 0) { return "Rouge"; }	else if (classeActuelle.indexOf("Noir") >= 0) { return "Noir"; }	else { return "Bleu"; }}function tailleBouton(classeActuelle){		if (classeActuelle.indexOf("Gros") >= 0) { return "Gros"; } else { return ""; }}//renvoie "boutonFondVertSurvol" ou "boutonFondVertClic" ou ""function actionBouton(action, couleur){	if(action == 'survol') { return "boutonFond"+ couleur +"Survol"; } else if(action == 'clic') { return "boutonFond"+ couleur +"Clic"; } else { return ""; }}*/////// FIN SCRIPTS POUR BOUTONS PERSONNALISƒS/*function cookiesTest(){	var expDate = new Date(); //date du jour	expDate.setTime(expDate.getTime() + 10*1000); //date de fin du cookies. =10*1000 => 10 secondes - (jours * 24 * 3600 * 1000)	document.cookie = "test=cookiesTest;expires=" + expDate.toGMTString(); //Žcrit le cookies avec date d'expiration	var position = document.cookie.indexOf( "test=cookiesTest" );	if( position == -1 )	{		calqueAfficher('zoneTexteCookiesErreur', 'inline'); //pour afficher la zone d'erreur de cookies (cachŽe par dŽfaut)		//alert( "Veuillez activer les cookies et actualiser cette page." );		return "ƒchec";	}	document.cookie = "test=FINcookiesTest;expires=" + expDate.toGMTString(); //Žcrit le cookies	return "RŽussi";}*/      //  document.cookie = nom + "=" + escape(valeur) + ";expires=" + expDate.toGMTString()//renvoi la propriŽtŽ de style d'un objet, le nom de la classe (mis ainsi car fonction diffŽrente selon le navigateur)function getStyle(objet, proprieteDeStyle){	objet = document.getElementById(objet);	if (objet.currentStyle)		var valeurDuStyle = objet.currentStyle[proprieteDeStyle];	else if (window.getComputedStyle)		var valeurDuStyle = document.defaultView.getComputedStyle(objet,null).getPropertyValue(proprieteDeStyle);	return valeurDuStyle;}//Pour afficher du texte qui contient du code html (en javascript)//ex: pour afficher le non-inscrit qui a cochŽe la case (quand clic pour dŽcocher)function afficherSecurHtmlJavascript(txt){	txt = txt.replace(/</g,"&lt;"); //remplace les < par le code html pour Žviter d'interprter leur contenu (<b> ne sera pas mis en gras)	return txt ;}//Alterne l'affichage du calque dŽsignŽ:function calqueVisibleOnOff(nomCalque, typeDisplay){	if( document.getElementById(nomCalque) == null ) { return; }		var calqueID; 	calqueID = document.getElementById(nomCalque) ;		//si le calque est totalement masquŽ (au dŽpart, par dŽfaut), alors il faut lui permettre de pouvoir s'affiche (bizarrerie: par dŽfaut, il est considŽrŽ masquŽ mme si ˆ la crŽation il est visible):	if (calqueID.style.visibility != "visible")	{	//alert(calqueID.style.visibility);	calqueID.style.visibility = "visible"; //visibility = rend la POSSIBILITƒ de s'afficher	calqueID.style.display = "none" ; //display = l'affiche (si visibility OK). Ici le masque pour pouvoir l'afficher dans la condition qui suit (car 1er accs)	//	alert("masque0 a");	}		//alterne l'affichage:	if (calqueID.style.display == "none")	{	//calqueID.style.display = "" ; //l'affiche		calqueAfficher(nomCalque, typeDisplay);	//   		alert("affiche0 a");	}	else	{	//calqueID.style.display = "none" ; //le masque		calqueMasquer(nomCalque);	//     alert("masque0 b");	}}//Masquer le calque dŽsignŽ://si typeMasquage = 'hidden' => masque l'objet tout en le laissant occupŽ la place qu'il occupait.function calqueMasquer(nomCalque, typeMasquage){	if( document.getElementById(nomCalque) == null ) { return; }	//alert(nomCalque);	var calqueID;	calqueID = document.getElementById(nomCalque) ;	// alert(calqueID);		if(typeMasquage == 'hidden')	{ calqueID.style.visibility = "hidden" ; } //cache en laissant la zone occupŽe	else { calqueID.style.display = "none" ; } //cache en dŽcalant la suite des ŽlŽments	// alert("masquerOui");}//Afficher le calque dŽsignŽ://typeDisplay : si indiquŽ => inline ou ??? ce qu'on veut//info: il existe une CSS zoneTableau et zoneTableauB. le 2 permet d'utiliser "display:none". Cela permet de vraiment masquer l'ŽlŽment et de libŽrer l'espace physique qu'il occupe (il n'y a donc pas di vide en bas de l'Žcran, par ex). Mais on ne eput laors pas le rŽafficher avec calqueID.style.display = "" ; Il faut donc utiliser soit://calqueID.style.display = "block" ; //mais provoque un retour ˆ la ligne des ŽlŽments.//calqueID.style.display = "inline" ; //mais marche pas pour tout (ex: pas les mini-bulles qui s'affiche, elle ne se plaait pas bien)//donc j'utilise typeDisplay si j'ai besoin, pour certain ŽlŽment bien maitrisŽ.function calqueAfficher(nomCalque, typeDisplay){	if( document.getElementById(nomCalque) == null ) { return; }	var calqueID;	calqueID = document.getElementById(nomCalque) ;	if (calqueID.style.visibility != "visible") { calqueID.style.visibility = "visible"; } //au cas o le calque est masquŽ ˆ l'origine. Ce qui est normal pour travailler sans tre gnŽ par ceux-ci lors de la crŽation de la page web.	if(typeDisplay)	{			//alert('ok - typeDisplay:'+typeDisplay);		calqueID.style.display = typeDisplay ; //peut-tre utiliser "block" ˆ la place de "" (car si zoneTableau contient display = "none" alors on ne peut pas le rŽafficher en mettant seulement "" (il faut "block" !!!) ˆ tester	} else	{		calqueID.style.display = "" ; //le contraire de "", ici, est "none"	} //alert("afficherOui");}//pour connaitre la hauteur d'une fenetre (la partie affichŽe seulement) //sept2011//info : document.getElementById("bulleInfo"+numBulle).style.left = scrollHorizontalFenetre() +"px";function hauteurFenetre() //remplace document.body.clientHeight qui ne donnait pas pareil suite au nouveau doctype{//idem voir largeurFenetre()//	if(typeof(window.innerHeight)=='number') {return window.innerHeight;}//	else if(document.documentElement && document.documentElement.clientHeight) {return document.documentElement.clientHeight;}	if(document.documentElement && document.documentElement.clientHeight) {return document.documentElement.clientHeight;}	else { return document.body.clientHeight; }}function largeurFenetre() //idem pour la largeur{//dŽsactivŽ car incluait la largeur de la barre de dŽfilement.//	if(typeof(window.innerWidth)=='number') {return window.innerWidth;}//	else if(document.documentElement && document.documentElement.clientWidth) {return document.documentElement.clientWidth;}// remplacŽ par :	if(document.documentElement && document.documentElement.clientWidth) {return document.documentElement.clientWidth;}	else { return document.body.clientWidth; }}function scrollVerticalFenetre() //Pour le scroll vertical //remplace document.body.scrollTop{	if(typeof(window.pageYOffset)=='number') {return window.pageYOffset;}	else if(document.body && document.body.scrollTop) {return document.body.scrollTop;}	else if(document.documentElement && document.documentElement.scrollTop) {return document.documentElement.scrollTop;}	else {return 0;} //car sous IE 6, 7, 8 si pas de scroll => renvoi null au lieu de 0.}function scrollHorizontalFenetre() //idem pour le scroll horizontal{	if(typeof(window.pageXOffset)=='number') {return window.pageXOffset;}	else if(document.body && document.body.scrollLeft) {return document.body.scrollLeft;}	else if(document.documentElement && document.documentElement.scrollLeft) {return document.documentElement.scrollLeft;}	else {return 0;} //car sous IE 6, 7, 8 si pas de scroll => renvoi null au lieu de 0.}//voir aussi info ici (tous les paramtres) : http://www.softcomplex.com/docs/get_window_size_and_scrollbar_position.htmlfunction largeurContenu() //Pour la largeur rŽelle du contenu (inclus le scrolling possible){	if(document.documentElement && document.documentElement.scrollWidth) {return document.documentElement.scrollWidth;}	else { return document.body.scrollWidth ; }}function hauteurContenu() //idem pour hauteur{	if(document.documentElement && document.documentElement.scrollHeight) {return document.documentElement.scrollHeight;}	else { return document.body.scrollHeight ; }}//centrer un ŽlŽment DIV sur une page://rŽcupŽrŽ sur internet (libre)://PositionFixeOuPas = si on veut que quand on se dŽplace vers le bas, l'ŽlŽment reste affichŽ et ne dŽfile pas. Dans ce cas, il ne faut pas prende en compte la valeur de dŽfilement pour sTop et sLeftfunction centrerElement(element, PositionFixeOuPas){	if( document.getElementById(element) == null ) { return; }	var height=document.getElementById(element).offsetHeight;//hauteur de l'ŽlŽment ˆ positionner	var width=document.getElementById(element).offsetWidth;//largeur de l'ŽlŽment ˆ positionner//window.status=height;	//myParent=document.getElementById(element).parentNode; //avant. RemplacŽ par ligne suivante	myParent=document.body; //document.body.clientHeight; = hauteur en pixel//	var pHeight=myParent.clientHeight;//Hauteur de l'ŽlŽment parent //avant: offsetWidth mais donne l'Žcran et pas la fentre !!//	var pWidth=myParent.clientWidth;//Largeur de l'ŽlŽment parent //remplacŽ par hauteurFenetre() - sept2011	var pHeight=hauteurFenetre(); //sept2011	var pWidth=largeurFenetre();//alert("pWidth:"+pWidth +"pHeight="+pHeight +" width="+width +" height="+height );	if(height > pHeight)	{ 	//si la zone affichŽe (nouveau cadeau, groupe,...) est + haute que la hauteur visible de la fentre => on ne peut pas cliquer sur les boutons annuler ou valider => dans ce cas, on ne centre pas la fentre	}	else	{//alert('PositionFixeOuPas:'+PositionFixeOuPas);		if (PositionFixeOuPas == "Fixe")		{	var sTop=0;			var sLeft=0;		}		else //sinon "absolu" par dŽfaut 		{	//var sTop=myParent.scrollTop;//Hauteur de dŽfilement de l'ŽlŽment parent			//var sLeft=myParent.scrollLeft;//Longueur de dŽfilement de l'ŽlŽment parent			var sTop=scrollVerticalFenetre(); //sept2011			var sLeft=scrollHorizontalFenetre();		}//alert(" sTop="+sTop +" sLeft="+sLeft );		var posY=(pHeight/2)-(height/2)+sTop;//Calcul de la position en Y		var posX=(pWidth/2)-(width/2)+sLeft;//Calcul de la position en X//alert("posY="+posY +" posX="+posX );		document.getElementById(element).style.top=posY+"px";		document.getElementById(element).style.left=posX+"px";//alert(" doc.gEBI.style.top="+document.getElementById(element).style.top );		//alert("hauteurFenetreVisible:"+ hauteurFenetreVisible +"pHeight="+ pHeight +" height="+ height +" sTop="+sTop );	}//alert("FIN: sTop="+sTop +" sLeft="+sLeft +" posY="+posY +" posX="+posX +" doc.gEBI.style.top="+document.getElementById(element).style.top );//	if(element == 'formZoneCadeau') { window.status = "pHeight="+ pHeight +" height="+ height +" width="+ width +" sTop="+sTop +"posY="+ posY ; }}//Pour afficher le calque info//pour bien placer le calque en hauteur://PositionFixeOuPas ajoutŽ comme pour les mini bullesfunction positionnerCalqueInfo(nomChp, txt, couleur, PositionFixeOuPas){	if( document.getElementById("calqueInfo") == null ) { return; }	//sept2011: idem que dans afficherBulleInfo (suite ˆ nouveau doctype)	if(typeof(nomChp)=="string") { nomChp = document.getElementById(nomChp) ; }	if(nomChp == null) { return; }	objetID = document.getElementById("calqueInfo");//alert("position base:" + objetID.style.position);	objetID.style.position = "absolute";//alert("position nouvelle:" + objetID.style.position);	//SŽpare le titre et le corps du texte (du chp info):	//txt = le titre et le texte ˆ afficher dans le corps de l'info (en 1 mme variable, mais le titre occupe la ligne 1)	posFinTitre = txt.indexOf("<br>"); //renvoie la position du premier retour ˆ la ligne => jusqu'ˆ fin du titre	document.getElementById("infoLeTitre").innerHTML = txt.substr(0,posFinTitre);	document.getElementById("infoLeTexte").innerHTML = txt.substr(posFinTitre+4); //+4 car ne pas mettre <br>	//met la couleur souhaitŽe	if(couleur == 1) //vert	{ valeurCouleur = "#00B600"; }	else if(couleur == 2) //orange	{ valeurCouleur = "#FFA500"; }	else if(couleur == 3) //rouge	{ valeurCouleur = "#D31409"; }	else //sinon par dŽfaut (le bleu)	{ couleur = 0; valeurCouleur = "#75788A"; } //avant oct2011: le bleu Žtait la valeur par dŽfaut : #0095dc//Puis attribue cette couleur au divers ŽlŽments composant le calque d'information:	objetZoneInfo = document.getElementById("zoneInfoTitreEtTexte");	objetZoneInfo.style.border = 'solid 2px '+valeurCouleur;	document.getElementById("infoLeTitre").style.backgroundColor = valeurCouleur;	objetZoneInfo.style.backgroundColor = valeurCouleur;	document.getElementById("infoLeTexte").style.color = valeurCouleur;	document.getElementById("imageInfoFleche").src = "images/bulleInfo/flecheVersDroiteCouleur"+couleur+".png"	objetID.style.top = 25 +"px"; //calqueInfo.style.top = 25; //position de dŽpart en hauteur	largeurFleche = 23 ; //23 = largeur de l'image de la flche qui pointe sur la zone ˆ informer.	espaceZone = 3; //-3 = le dŽcalage vers la gauche pour que l'info ne touche pas le champ compltement	espaceFenetre = 1; //-1 pour laisser un marge de 1 pixel par rapport au bord de la fentre	limiteLargeurInfo = 250; //pour Žviter d'avoir un champ d'info qui s'Žtende trop (surtout sur les grands Žcrans)	calqueAfficher('calqueInfo'); //on affiche le calque d'information	//on redŽfini la largeur du calque d'info si l'espace est trop petit pour tre affichŽ ˆ gauche de la zone ˆ informer. Si encore trop Žtroit, il faudra envisager d'afficher le champs d'info ˆ droite plut™t qu'ˆ gauche de la zone ˆ informer:	objetZoneInfo.width = trouverPositionXY(nomChp)[0] -largeurFleche -espaceZone -espaceFenetre + "px";	if( parseInt(objetZoneInfo.width) > limiteLargeurInfo) { objetZoneInfo.width = limiteLargeurInfo; } //parseInt garde que le nombre (=> sans "px")	objetID.width = parseInt(objetZoneInfo.width)  + "px";	objetID.style.left = (trouverPositionXY(nomChp)[0]) -(objetID.offsetWidth) -espaceZone +"px";//si on veut placer la droite du chp info ˆ gauche de la zone ˆ informer:	//**calqueInfo.style.left = (trouverPositionXY(nomChp)[0])-(calqueInfo.offsetWidth)-3; //offsetWidth car style.width marche pas !			//alert(trouverPositionXY(nomChp)[1]);	positionHaute = trouverPositionXY(nomChp, PositionFixeOuPas)[1]+Math.floor(nomChp.clientHeight/2)-12; //recherche le haut du chp ˆ informer. Finalement le clietnHeight n'est plus utile	//[1] car on ne rŽcupre que le haut (pas la gauche)	// DivisŽ par 2 pour avoir la moitiŽ de la hauteur du champ (avec arrondi). clientHeight = ici hauteur du chp	//-12 = du bord supŽrieur au milieu de la flche, du calque info.//Sans dŽplacmeent:	objetID.style.top = positionHaute +"px"; //on le place ˆ sa position finale//alert(positionHaute);//pour simuler un dŽplacement://	deplace(positionHaute);	//positionHaute est la position max que le calque info ne doit pas dŽpasser	//alert(positionHaute);}//cherche le haut et la gauche de l'objet en remontant ˆ chaque fois au parent de l'objet. (offsetTop calcule le haut de l'objet par rapport ˆ son parent):function trouverPositionXY(objet, PositionFixeOuPas){		if( objet == null ) { return; }	var positionGauche = positionHaut = 0;	    if (objet.offsetParent)    {	do		{	positionGauche += objet.offsetLeft;			positionHaut += objet.offsetTop;			//alert(positionGauche +'*-*-*'+ positionHaut);		} while (objet = objet.offsetParent);	}		//si objet en position fixe, marche pas car sa position est toujours la mme (mme si on dŽfile la page) => il faut ajouter le dŽfilement:	myParent=document.body; //document.body.clientHeight; = hauteur en pixel	if (PositionFixeOuPas == "fixe")	{	//var sTop = myParent.scrollTop;//Hauteur de dŽfilement de l'ŽlŽment parent		//var sLeft = myParent.scrollLeft;//Longueur de dŽfilement de l'ŽlŽment parent		var sTop=scrollVerticalFenetre(); //sept2011		var sLeft=scrollHorizontalFenetre();	}	else //sinon "absolu" par dŽfaut 	{	var sTop = 0;		var sLeft = 0-0; //je dŽcale de -2px car j'ai remarquŽ que lorsque a apparaissait par-dessus la photo de l'auteur d'un com, on voyait un peu la photo en-dessous.	}	//window.status = positionGauche +'*-*-*'+ positionHaut	return [positionGauche+sLeft,positionHaut+sTop];}function deplace(hautMax) { 	vitesseDeplacement = 125; //vitesse en ms. 25 = trs rapide, 1000 lent	b=setTimeout("fDeplace("+ hautMax +")",vitesseDeplacement); } function fDeplace(hautMax) {	if( document.getElementById("calqueInfo") == null ) { return; }	objetID = document.getElementById("calqueInfo"); 		if(objetID.offsetTop < (hautMax-1)) 	{	/*	alert("haut info=" + objetID.offsetTop		+ ", MAX=" + hautMax		+ ", Max - haut info=Žcart=" + (hautMax-(objetID.offsetTop))		+ ", haut+Žcart=" + (objetID.offsetTop+((hautMax-(objetID.offsetTop))))		+ ", nouveau haut info="+ (Math.ceil(objetID.offsetTop+((hautMax-(objetID.offsetTop))) / 4)));	*/			objetID.style.top = Math.ceil( objetID.offsetTop + ((hautMax-(objetID.offsetTop))) / 3 ) +"px"; // le dernier chiffre permet d'augmenter le nb d'Žtape dans l'animation			deplace(hautMax);	}	else	{	objetID.style.top = hautMax +"px"; //on le place ˆ sa position finale une fois fini (car erreur arrondi,É)		clearTimeout(b); //sort de la boucle setTimeOut	}}function cacherInfo(){	if( document.getElementById('calqueInfo') == null ) { return; }	if(window.b) { clearTimeout(b); } //sort de la boucle setTimeOut	calqueMasquer('calqueInfo');}function corrigerChpListe(objetChamp){	texte = listeElementsVirgule(objetChamp.value);	objetChamp.value = texte;}//test pour afficher icone de chargement - loader://affiche l'icone loader PAR-DESSUS un objet tel que 1 case ˆ cocher (ici: pas ˆ la place de l'icone connaissance par exemple)//emetteur est donc la zone o doit s'afficher le loader//si positionForcee n'est pas vide => on affichera le loader ˆ l'endroit prŽcisŽ.function afficherLoaderOnOff(onOff, emetteur, positionForcee){	if( document.getElementById("imageLoader2") == null ) { return; }	if( emetteur == null ) { return; }	objetLoader = document.getElementById("imageLoader2");//alert(imageLoader.className);	if(onOff == "on")	{//alert(emetteur);		if(positionForcee) { positionEmetteur = positionForcee; positionEmetteur=positionEmetteur.split(','); } else { positionEmetteur = trouverPositionXY(emetteur) ; }//alert('positionEmetteur[0...3]= '+ positionEmetteur +', '+ positionEmetteur[0] +', '+ positionEmetteur[1]);		//Attention : si emetteur n'est plus affichŽ, alors emetteur.offsetWidth vaudra 0 !		var largeurEmetteur = emetteur.offsetWidth;		var hauteurEmetteur = emetteur.offsetHeight;				if(largeurEmetteur == 0) { largeurEmetteur = 15; }		if(hauteurEmetteur == 0) { hauteurEmetteur = 14; }		//j'ai pris la largeur et hauteur de l'icone nouveau com. Mais ce n'est pas forcŽment une taille adŽquate.		objetLoader.style.display = "inline"; //affiche l'objet		objetLoader.className = "fondRondLoader";		objetLoader.src = "images/objetsDivers/loader.gif";		//objetLoader.width = 16; 		//objetLoader.height = 16;				//centre l'objet Loader par rapport ˆ l'emetteur:		objetLoader.style.left = positionEmetteur[0] - Math.round((objetLoader.width - largeurEmetteur) /2) -1 +"px"; //+2 pour ajuster mieux sinon dŽcalŽ un peu ˆ gauche		objetLoader.style.top = positionEmetteur[1] - Math.round((objetLoader.height - hauteurEmetteur) /2) -3 +"px"; //+2 pour ajuster mieux sinon dŽcalŽ un peu ˆ gauche//		objetLoader.style.left = positionEmetteur[0];//		objetLoader.style.top = positionEmetteur[1] ;//objetLoader.style.position = "absolute";	}	else	{		objetLoader.style.display = "none"; //masque l'objet//		objetLoader.className = "fondRond";//		objetLoader.src = "images/icones1/connaissance/connaitre2.png";//		objetLoader.width = 22;//		objetLoader.height = 22;	}}//DEBUT Script pour mini-bulles ://-numBulle = indique quelle style de bulle on veut afficher = 1 ou 2//bulle n¡ 1 = si la souris va dessus, elle se cache de suite = information)//bulle n¡ 2 = celle o la souris peut aller dessus pour agir = info pour action//-fixeOuPas dŽfini si la bulle doit bouger ou pas. Pas nŽcessaire quand icone petite. Mais utile pour ligne avec nos informations sur nous ˆ changer Žventuellement.//fixeOuPas = "demi fixe" = la bulle ne bouge pas MAIS la mini flche oui.//fixeOuPas = "fixe" = rien ne bouge (ni bulel, ni mini flche)//-placement = o doit se placer la bulle apr rapport ˆ la zone ˆ informer.//"Dessus" par dŽfaut mais on peut dire "dessous" et pourquoi pas, + tard: droite, gauche//ne pas utiliser "position" car mot rŽservŽ (je me fais souvent avoir)//objetFixeOuPas = "fixe" si l'objet ˆ informer est en position = "fixed" (ex: l'utilisateur en haut ˆ gauche, la zone d'un nouveau cadeau) => rien ˆ voir avec le fixe de FixeOuPas qui concerne la bulle ˆ afficher// PROBLEME ACTUEL : si fentre vraiment trop Žtroite et qu'on scrol ˆ droite: la mini bulle et aussi sa flche s'afficheront pas bien (surtout sous FF).function afficherBulleInfo(emetteur, evt, txt, numBulle, fixeOuPas, placement, surZoneOuPas, objetFixeOuPas){	//sept2011: le nom seul de l'emetteur ne fonctionne plsu sous FF suite au nouveau Doctype. Certains emetteur Žtant transmis avec document.getElementById, on vŽrifie alors si c'est nom seul => un string. Si oui alors on prend son document.getElementById. Si cet nouvelle valeur de emetteur toujours pas ok alors on arrte.	if(typeof(emetteur)=="string") { emetteur = document.getElementById(emetteur) ; }	if(emetteur == null) { return; }	//window.status = emetteur ;	if( document.getElementById('miniFleche'+numBulle) == null ) { return; } //si existe pas//permet d'empcher l'affichage de la mini bulle d'info (comme pour boite de dialogue "nouveau com") qui appara”t vide lors du clic sur la mini photo de l'auteur d'un com //voir aussi clicPhotoMiniCom(IDpers) ds listeCadeaux	if( document.getElementById('memoPourClicPhotoMiniCom') != null ) //si existe bien :	{ if(document.getElementById('memoPourClicPhotoMiniCom').value == 'stop' || document.getElementById('memoPourClicPhotoMiniCom').value == 're-ok'){ document.getElementById('memoPourClicPhotoMiniCom').value = 'ok'; return; }	}//window.status = "info: "+ emetteur.id +', '+ emetteur.offsetTop +', '+ emetteur.offsetLeft ;//=	if(emetteur && special != "specialX" && special != "specialZoneLigne") // && special != "specialZoneLigne" // && formCadeau.typeBtnSurvol.value == "x"//	{//=		formCadeau.typeBtnClic.value = "effacŽ";		//		siGroupe = formCadeau.modifGroupeOuLigne.value;//		numLigne = formCadeau.modifNumero.value;//		if(siGroupe != "-") { masquerBouton(numLigne, siGroupe); }		//=		formCadeau.modifGroupeOuLigne.value = "-";//=		formCadeau.modifNumero.value = "-";//	}//=	else//	{//=		if (formCadeau.typeBtnClic.value == "x") { special = "specialX"; }//=		afficherBouton('', '', special);//	}//si on affiche une bulle pour une zone (un bouton,...) situŽ dans une zone de ligne (ou groupe), alors on laisse les valeurs de mŽmo de la ligne ou groupe pour pouvoir re-afficher le cadre, sinon on remet ˆ 0 pour ne pas afficher le cadre,... de la dernire zone survolŽe:if(surZoneOuPas != "surZoneLigne" && nomPageActuelle() == 'pageMaListeDeCadeaux') { razMemoGroupe(); }//Pour afficher le cadre (pour bouton "x" si clic dessus, pour pouvoir confirmer tout en laissant visible cadre sur la ligne)////	typeBtnSurvol = formCadeau.typeBtnSurvol.value;////	typeBtnClic = formCadeau.typeBtnClic.value;			//alert('111');//	if(typeBtnSurvol != "x") { formCadeau.typeBtnClic.value = 'x fini'; typeBtnClic = formCadeau.typeBtnClic.value ;}	//alert('22');	if(!numBulle) { numBulle = 1; } //si numŽro de bulle non prŽcisŽ alros on met 1 (la bulle d'info n¡ 1 toute bte)	//	if(numBulle == 1) { numBulle = "1_2011"; } //test nouvelle bulle d'info		if(!placement) { placement = "dessus"; } ; //valeur par dŽfaut si pas dŽfini//numBulle = 1;//=	if(emetteur) //si bien des paramtres envoyŽs, sinon on survole la zone de la bulle ou la mini flche => on ne fait que reafficher sans remettre la position car ne doit plus bouger	{//	alert('hello');				//Corrige bug: si la bule pas encore affichŽe, alros la mini flche se met au bord au dŽbut puis aprs tout OK. Donc pas jolie.		//POru corriger, je vŽrfie si le calque est dŽjˆ affichŽ. Si non alors on mettra la petit flche au milieu par dŽfaut !	//	bulleVisible = document.getElementById('bulleInfo'+numBulle).style.display; //soit ""(visible) soit "none"(masquer)		//le contr™le se fait avec < || (bulleVisible == "none" && fixeOuPas == "demi fixe") > au niveau de l'affichage de la mini flche		//if(bulleVisible == "none") { fixeOuPas = "fixe"; }		//NON OK CORRIGƒ, IL FALLAIT METTRE LARGEURBOUT,... APRéS AFFICHAGE DES CALQUES		calqueAfficher('bulleInfo'+numBulle); //ne peut pas tre mis ˆ la fin sinon sautillement dans l'affichage !		calqueAfficher('miniFleche'+numBulle);		//on affiche la bonne image de la mini flche (selon si tournŽ ou pas)		if(placement == "dessous") { imageFleche = "images/bulleInfo/miniFlecheHaut.png"; } else {  imageFleche = "images/bulleInfo/miniFlecheBas.png"; } //...Haut.gif = pointe vers le haut (pas pour le placement en haut ! :-)		//et si on ne mettait pas de flche quand bulle cliquable! (pour ressembler + ˆ 1 bouton):		if(numBulle==2) { imageFleche = ""; /*calqueMasquer('miniFleche'+numBulle);*/ } //si on ne veut pas afficher la miniFlche pour bulle cliquable (pour + ressembler ˆ un bouton)			 document.getElementById("miniFleche"+numBulle).src = imageFleche ; //doit tre mis aprs affichage des calques pour donner les bonnes valeurs:/*		largeurBout = document.getElementById("imageGaucheBulleInfo"+numBulle).offsetWidth; //largeur d'un arrondi gauche = env. 14		hauteurDessousBulle = document.getElementById("sousBulleInfo"+numBulle).offsetHeight; //la heuteur de la zone sous la bulel, lˆ o apparait la petite flche. Cette zone est importante car elle permt d'aller sur la bulle sans qu'elle se cache ou sans avoir ˆ passer par la mini flche pour aller sur la bulle (concerne celle qui reste affichŽ => la n¡1)		hauteurDessusBulle = document.getElementById("surBulleInfo"+numBulle).offsetHeight; //idem pour le dessus		hauteurMiniFleche = document.getElementById("miniFleche"+numBulle).offsetHeight; */ //remplacŽ par (oct2011) :largeurBout = 0; //largeur d'un arrondi gauche = env. 14hauteurDessousBulle = 0; //la heuteur de la zone sous la bulle, lˆ o apparait la petite flche. Cette zone est importante car elle permt d'aller sur la bulle sans qu'elle se cache ou sans avoir ˆ passer par la mini flche pour aller sur la bulle (concerne celle qui reste affichŽ => la n¡1)hauteurDessusBulle = 0; //idem pour le dessushauteurMiniFleche = document.getElementById("miniFleche"+numBulle).offsetHeight; 				document.getElementById("texteBulleInfo"+numBulle).innerHTML = txt; //le texte ˆ afficher dans la bulle		document.getElementById("bulleInfo"+numBulle).style.position = "absolute" ;	//positionnŽ en absolu			//	alert(evt);	//	sourisH = position(evt)[0]; //coordonnŽe horizontale de la souris	//	alert(evt +"-"+ sourisH);			sourisH1 = position(evt)[0]; //coordonnŽe horizontale de la souris		sourisH2 = sourisH1; //coordonnŽe horizontale de la souris		//sourisH = 350; //coordonnŽe horizontale de la souris		//Placement de la BULLE :		if(fixeOuPas == "fixe" || fixeOuPas == "demi fixe") { sourisH1 = trouverPositionXY(emetteur)[0] + Math.round(emetteur.offsetWidth /2);}//alert(trouverPositionXY(emetteur)[1]);		//emetteur = eval(emetteur.id);//alert(trouverPositionXY(btnModifier));//testCoord(btnModifier);//break;//permet de corriger le pb suivant (sous FF): si fentre pas trs large et beaucoup de texte dans la bulle (ex: si non inscrit et qu'on veut ajouter un commentaire => bulle disant 'pas autorisŽ') : la hauteur de la bulle n'est pas ok et la flche en dessous se retrouve + bas que la bulle. Le fait de positionner la bulle, offsetHeight renvoi alors une valeur valide. (pour constater la diffŽrence en emetteur.offsetHeight avant et positionnement, utiliser window.status un peu aprs aprs avoir dŽsactiver les 2 lignes ci-aprs)://(oct2011: mme si la bulle dŽjˆ affichŽe => bien utile)		document.getElementById("bulleInfo"+numBulle).style.top = 1 +"px";		document.getElementById("bulleInfo"+numBulle).style.left = 1 +"px";				//pb n¡2 sous Firefox : si scrolling horizontal, alors FF va rŽduire d'autant la largeur de la bulle. Donc elle devient trs Žtroite si fentre etroite alors que a pourrait occuper toute la largeur de la fentre. A rŽsoudre: A FAIRE.//alert(document.getElementById("bulleInfo"+numBulle).clientWidth);		//test:	if(document.getElementById("bulleInfo"+numBulle).clientWidth +1 >= largeurFenetre() ) { alert(document.getElementById("bulleInfo"+numBulle).clientWidth); document.getElementById("bulleInfo"+numBulle).style.width = document.getElementById("bulleInfo"+numBulle).clientWidth ; }//		document.getElementById("bulleInfo"+numBulle).style.left = scrollHorizontalFenetre() +"px";//test:		document.getElementById("bulleInfo"+numBulle).style.width = 102 +"px";//Fin correction bug. //Žventuellement ˆ faire aussi pour bulle num 2 mais peu utilisŽe donc pas la peine pour l'instant	//pour la verticale:		verticalEnPlus = -8 ; //0 // oct2011:-8		verticalEnMoins = -5 ; //avant 0 mais pour PC car curseur gros => cache la bulle donc descendue de 5px		if(placement == "dessous") { verticalEnPlus = emetteur.offsetHeight +8; }		else { verticalEnMoins = document.getElementById("bulleInfo"+numBulle).offsetHeight; } //oct2011: ajout de +8 pour si "dessous"		positionVerticale1 = trouverPositionXY(emetteur, objetFixeOuPas)[1] - verticalEnMoins + verticalEnPlus ;		//alert(positionVerticale1 +" ; "+ document.getElementById("bulleInfo"+numBulle).offsetHeight );		document.getElementById("bulleInfo"+numBulle).style.top = positionVerticale1 +"px";		//alert(positionVerticale1 +" - "+ emetteur +" - "+ verticalEnMoins);//break;		//alert(emetteur);	//	alert(trouverPositionXY(emetteur)[1] +" **** "+ positionVerticale1);	//pour placer bulle horizontalement:		scrollH = scrollHorizontalFenetre(); //oct2011: ajoutŽ pour prendre en compte le scroll horizontal				positionPrevue1 = scrollH + sourisH1 - Math.round(document.getElementById("bulleInfo"+numBulle).offsetWidth /2); //(en fait, positionPrevue1 = position du bord gauche de la bulle)		if(positionPrevue1 < 1+scrollH) //si trop au bord GAUCHE de l'Žcran		{	//window.status = window.status + ' P1<1+scroll' ;			positionPrevue1 = 1+scrollH ; //1 = bord de l'Žcran minimal (pour pas que l'info disparaisse ˆ gauche de l'Žcran			document.getElementById("bulleInfo"+numBulle).style.left = positionPrevue1 +"px";			document.getElementById("bulleInfo"+numBulle).style.right = 'auto';		}		else //si pas trop au bord, donc ˆ priori s'affichera normalement, mais on vŽrifie quand-mme avant si pas trop ˆ DROITE		{						positionPrevue2 = scrollH + sourisH1 + Math.round(document.getElementById("bulleInfo"+numBulle).offsetWidth /2);			//window.status = positionPrevue2 +"scrollH:"+ scrollH +"sourisH: "+ sourisH1 +"largeur demi: "+ Math.round(document.getElementById("bulleInfo"+numBulle).offsetWidth /2)  ;									if(positionPrevue2 >= largeurFenetre() ) //si trop au bord DROIT de l'Žcran			{	//window.status = window.status + ' P2>' ;				//positionPrevue2 = positionPrevue2 - Math.round(document.getElementById("bulleInfo"+numBulle).offsetWidth /2); //car sera depuis la droite				positionPrevue2 = 1 - scrollH ;				//document.getElementById("bulleInfo"+numBulle).style.right = positionPrevue2 +"px"; //on place la droite de la bulle				//document.getElementById("bulleInfo"+numBulle).style.left = positionPrevue2 +"px";				document.getElementById("bulleInfo"+numBulle).style.right = positionPrevue2 +"px";				document.getElementById("bulleInfo"+numBulle).style.left = 'auto';			}			else //sinon normal (comme avant avec positionPrevue1)			{	//window.status = window.status + ' P2<' ;				document.getElementById("bulleInfo"+numBulle).style.left = positionPrevue1 +"px";				document.getElementById("bulleInfo"+numBulle).style.right = 'auto';			}		}		//	window.status = "info verticalEnMoins, offsetHeight = "+ verticalEnMoins +', '+ document.getElementById("bulleInfo"+numBulle).offsetHeight;		//Placement de la MINI FLéCHE :		//if(fixeOuPas == "fixe" || (bulleVisible == "none" && fixeOuPas == "demi fixe")) { sourisH2 = trouverPositionXY(emetteur)[0] + Math.round(emetteur.offsetWidth /2);} //Žtait poru coorigŽ bug mais ok maintenant !		if(fixeOuPas == "fixe") { sourisH2 = trouverPositionXY(emetteur)[0] + Math.round(emetteur.offsetWidth /2);}	//pour la verticale:		verticalEnPlus = -8 ; //0 // oct2011:-8		verticalEnMoins = -5 ; //idem que un peu plus haut		if(placement == "dessous") { verticalEnPlus = emetteur.offsetHeight + hauteurDessusBulle - hauteurMiniFleche +8; } else { verticalEnMoins = hauteurDessousBulle; } //oct2011: ajout de +8 pour si "dessous"		positionVerticale2 = trouverPositionXY(emetteur, objetFixeOuPas)[1] - verticalEnMoins + verticalEnPlus ;				document.getElementById("miniFleche"+numBulle).style.top = positionVerticale2 +"px";	//pour l'horizontal:				positionPrevue2 = sourisH2 - Math.round(document.getElementById("miniFleche"+numBulle).offsetWidth /2);		if(positionPrevue2 < largeurBout) //si trop au bord de l'Žcran		{			positionPrevue2 = largeurBout ; //env. 14 = largeur d'un coin arrondi gauche		}		if(positionPrevue2 < positionPrevue1 + largeurBout)//si la flche bouge par rapport ˆ la bulle, il ne faut pas que la flche soit trop ˆ gauche de la bulle (sous l'arorndi => plus accrochŽe!)		{			positionPrevue2 = positionPrevue1 + largeurBout ;		}		if(positionPrevue2 + document.getElementById("miniFleche"+numBulle).offsetWidth > positionPrevue1 + document.getElementById("bulleInfo"+numBulle).offsetWidth - largeurBout) //idem mais pas trop ˆ droite de la bulle		{			positionPrevue2 = positionPrevue1 + document.getElementById("bulleInfo"+numBulle).offsetWidth - largeurBout - document.getElementById("miniFleche"+numBulle).offsetWidth;		}	//	alert(111);	//	eval("texteBulleInfo"+numBulle).innerHTML = "positionPrevue2:"+positionPrevue2 +"positionPrevue1:"+positionPrevue1;	//alert(positionPrevue1);		document.getElementById("miniFleche"+numBulle).style.left = positionPrevue2 +"px";			//	alert(positionPrevue1 +","+ positionVerticale1 +","+ positionPrevue2 +","+ positionVerticale2);	}	//window.status = "info positionVerticale1, positionPrevue1, positionVerticale2, positionPrevue2 = "+ positionVerticale1 +','+ positionPrevue1 +','+ positionVerticale2 +','+ positionPrevue2;//=	else //on survole la bulle	{//		alert('bye');//=		calqueAfficher('bulleInfo'+numBulle);//=		calqueAfficher('miniFleche'+numBulle);		//		txt = "pas d'Žmetteur d'objet";	}//dans les 2 cas, on affiche la bulle:	//alert('333');	//alert('yeees!');		//onMouseMove envoie l'ŽvŽnement ˆ chaque fois que la souris se dŽplace au-dessus de la zone contenant l'ŽvŽnement	//onMouseOver seulement quand la souris entre dans la zone ET quand elle passe d'un mot ˆ l'autre (le caractre espace doit faire croire qu'il y a eu interruption et donc refait onMosueOver lors du passage sur le mot suivant, sans pour autant faire onMouseOu (heureusement!)).}//on peut prŽciser le num de la bulle ˆ masquerfunction masquerBullesInfo(numBulle){////	typeBtnClic = formCadeau.typeBtnClic.value;			if( document.getElementById('miniFleche2') == null ) { return; }			if((!numBulle) || numBulle == 1) //si bulle pas prŽcisŽ ou bulle 1 seulement	{		calqueMasquer('bulleInfo1');		calqueMasquer('miniFleche1');		calqueMasquer('bulleInfo1_2011');		calqueMasquer('miniFleche1_2011');	}		if((!numBulle) || numBulle == 2)	{		calqueMasquer('bulleInfo2');		calqueMasquer('miniFleche2');	}	////	if(numBulle == 2) //&& formCadeau.modifGroupeOuLigne.value == "-"	{////		masquerBouton();//++		formCadeau.typeBtnSurvol.value = "";//++		formCadeau.typeBtnClic.value = "";		//alert('???');		//if(formCadeau.typeBtnClic.value == '') { masquerBouton(); }	//	formCadeau.typeBtnClic.value = ''; 	} //	texteBulleInfo1.innerHTML = "bouhh";}/*function register_position(){	mouse_x = 0;	mouse_y = 0;	document.onmousemove = position;}*/function position(evt){	if(!evt) evt = window.event;	mouse_x = evt.clientX;	mouse_y = evt.clientY;//	window.status = "Souris X:"+mouse_x+" / Y:"+mouse_y;		return [mouse_x,mouse_y];}/*function position(evt){//	if (navigator.appName.substring(0,3) == "Net") document.captureEvents(Event.MOUSEMOVE);	//x = (navigator.appName.substring(0,3) == "Net") ? e.pageX : event.x+document.body.scrollLeft;	//y = (navigator.appName.substring(0,3) == "Net") ? e.pageY : event.y+document.body.scrollTop;		if(!evt) evt = window.event;		mouse_x = evt.clientX;	mouse_y = evt.clientY;//	if( !evt ) evt = window.event; //   var x = evt.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft); //   var y = evt.clientY + (document.documentElement.scrollTop || document.body.scrollTop);	//x =  event.x+document.body.scrollLeft;	//y =  event.y+document.body.scrollTop;	window.status = "Souris x:"+x+" | y:"+y;	}*/////FIN script pour mini bulles (d'auter sotn dans le fichier  fichier 'miniBulles.html', mais rŽservŽ ˆ quelques page seulement, c'est poruquoi pas mis ici).//Pour l'animation de dŽfilement var positionNouvelle = 0; //init en var globalevar directionDefilement = "bas"; //par dŽfaut on ira vers le basvar scrollPrecedent = -1; //mis ˆ -1 si pas de dŽfilement en coursfunction animerDefilementPage(){	myParent=document.body; //la fenetre	//nouvellePosition = Math.round((positionNouvelle - myParent.scrollTop)/2) + myParent.scrollTop;	nouvellePosition = Math.round((positionNouvelle - scrollVerticalFenetre())/2) + scrollVerticalFenetre(); //sept2011 : on remplace myParent.scrollTop par scrollVerticalFenetre() partout.	//	window.status = window.status + nouvellePosition + ',';	if( (directionDefilement == 'bas' && scrollVerticalFenetre() < scrollPrecedent && scrollPrecedent != -1)	|| (directionDefilement == 'haut' && scrollVerticalFenetre() > scrollPrecedent && scrollPrecedent != -1) ) //si l'utilisateur dŽplace le dŽfilement dans le sens opposŽ au dŽfilement : on stop le dŽfilement pour lui rendre la main de suite	{ scrollPrecedent = -1; return; } //stoppŽ		//myParent.scrollTop = nouvellePosition ;	window.scroll(0, nouvellePosition); //sept2011 : remplace myParent.scrollTop	scrollPrecedent = scrollVerticalFenetre(); //sept2011		if( (directionDefilement == 'bas' && scrollVerticalFenetre() < positionNouvelle) || (directionDefilement == 'haut' && scrollVerticalFenetre() > (positionNouvelle+1))) //si aps encore attteint la limite (selon si on va vers le bas ou vers le haut)	{		setTimeout(animerDefilementPage,70); // rappelle animerDefilementPage (en ms) //?:pas de paramtre dans animerDefilementPage	} else { scrollPrecedent = -1; }}//si l'ŽlŽment n'est pas entirement visible => dŽfile la page pour qu'il le soit.function defilerPageVersElement(element){	var margePosition = 20; //pour laisser un peu d'espace en haut ou en bas en plus de la postion haute ou basse de l'ŽlŽment//	window.status = '';	element = document.getElementById(element); //transforme en objet	positionObjet = trouverPositionXY( element );	var hauteurElement = element.offsetHeight; //hauteur de l'ŽlŽment	var hautElement = positionObjet[1];//le haut de l'ŽlŽment	var basElement = hautElement + hauteurElement;//le bas de l'ŽlŽment			myParent=document.body; //la fentre	//var hauteurPage=myParent.clientHeight;//Hauteur de la page (partie visible)	//var ScrollPage=myParent.scrollTop;//nb de pixel de dŽfilement	var hauteurPage=hauteurFenetre(); //sept2011	var ScrollPage=scrollVerticalFenetre(); //sept2011	if( hautElement > ScrollPage && basElement < (hauteurPage + ScrollPage) ) //si haut visible &ET bas visible aussi => ok.	{ /*window.status = 'ok';*/ }	else	{		//window.status = 'pas ok:'+ basElement +','+ (basElement-hauteurPage) ;		if(hautElement < (ScrollPage + hauteurElement)) //si elŽment est plus haut => remonte un peu		{ //myParent.scrollTop = hautElement -10 ; //10 pour petite marge au-dessous			positionNouvelle = hautElement -margePosition ; directionDefilement = "haut"; animerDefilementPage(); //monte		}		else //Sinon il est plus bas => descend un peu :		{ //myParent.scrollTop = basElement-hauteurPage +10 ; //10 pour petite marge en-dessous			positionNouvelle = basElement-hauteurPage +margePosition ; directionDefilement = "bas"; animerDefilementPage(); //descend		}	}	//	window.status = window.status +"  hauteurElement="+hauteurElement+"hautElement="+hautElement+" basElement="+basElement+" hauteurPage="+hauteurPage+"ScrollPage="+ScrollPage ;}//Fin animation dŽfilement
