﻿/************
*  Fichier Javascript commun fnac.com
*
*
*****************/

/**************
* Variables globales
**************/
var IS_IE = document.all && window.print && !window.opera && /MSIE [56]/.test(navigator.userAgent);
var IS_IE_ALL = document.all && window.print && !window.opera && /MSIE/.test(navigator.userAgent);
var IE_W3C = IS_IE && /MSIE [789]/.test(navigator.userAgent);
var IS_Webkit = /Konqueror|Safari|KHTML/.test(navigator.userAgent);
var heightPropertyToUse = IS_IE ? "height" : "minHeight";


/********************
* Framework
* Ensemble de fonctions qui aident au développement
* Certaines de ces fonctions ne sont pas documentees, par le simple fait qu'ellesfonctionnent parfaitement et n'ont pas à être modifiees.
*******************/

/* AddEvent :
	Cette fonction permet d'associer une fonction a un evenement,
	ex : addEvent(window, "load", mafonction)
	ne Jamais mettre de parentheses a la fonction passee en parametres
*/
function addEvent( obj, type, fn )
{
	if (obj.addEventListener)
		obj.addEventListener( type, fn, false );
	else if (obj.attachEvent)
	{
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
	}
}



/*  getStyle :
	Cette fonction permet de récupérer le style declaré sur un element, meme si celui-ci a ete declare dans la feuille de style.
	ex : getStyle(monelement, "padding-top");
*/
function getStyle(oElm, strCssRule){
	var strValue = "";
	if(document.defaultView && document.defaultView.getComputedStyle) {
		try{ strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule); }
		catch(e) { strValue = ""; }
	}
	else if(oElm.currentStyle) {
		try{
			strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){
				return p1.toUpperCase();
			});
			strValue = oElm.currentStyle[strCssRule];
		} catch(e) {
			strValue = "";
		}
	}
	return strValue;
}

/*  intStyle :
	Cette fonction retourne une valeur entiere d'un style.
	ex :
		getStyle(monelement, "padding-top"); // retourne 15px, mais on ne veut que 15
		intStyle(monelement, "padding-top"); // retourne 15

*/
function intStyle(oElm, strCSSRule) {
	var val = parseInt(getStyle(oElm, strCSSRule));
	if (isNaN(val)) val=0;
	return val;
}

/*  floatStyle :
	Cette fonction retourne la  valeur flottante d'un style.
	ex :
		getStyle(monelement, "width"); // retourne 15.5em, mais on ne veut que 15.5
		floatStyle(monelement, "padding-top"); // retourne 15
	Cette fonction n'est pas encore utilisee, mais peut-être dans un developpement futur.
*/
function floatStyle(oElm, strCSSRule) {
	var val = parseFloat(getStyle(oElm, strCSSRule));
	if (isNaN(val)) val=0;
	return val;
}

/* findPos :
	récupère la position X,Y d'un objet dans une page
	ex :
		var pos = findPos(elm);

*/
function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}


/* getMouse :
	Récupère les coordonnées de la souris et les met dans les variables globales
		window.mouseX
	et	window.mouseY,
		il faut passer event en paramètre sur les évènements
	ex :
		function fun(param1, param2, e) {
			getMouse(e);
			sourisX = window.mouseX;
			sourisY = window.mouseY
		}
		fun("foo", "bar", event);

*/
/* getMouse :  */
function getMouse(e){
	var x,y; var elt = (navigator.userAgent.indexOf("MSIE 5")!=-1) ? document.body : document.documentElement;
	if ( document.captureEvents ) {
		x = e.pageX;
		y = e.pageY;
	} else if ( window.event.clientX ) {
		x = window.event.clientX+elt.scrollLeft;
		y = window.event.clientY+elt.scrollTop;
	}
	window.mouseX = x;
	window.mouseY = y;
}


/*  ifrlayer :
	Cette fonction retourne la  valeur flottante d'un style.
	ex :
		- afficher un bloc :
			myBlock.style.display='block';
			ifrlayer.make(myBlock); //génère ou affiche l'iframe
		- cacher un bloc :
			myBlock.style.display='none';
			ifrlayer.hide(myBlock); //cache l'iframe associée au bloc
		-déplacer un bloc :
			myBlock.style.left = "100px";
			ifrlayer.move(myBlock); // déplace l'iframe associée au bloc
	Cette fonction n'est pas encore utilisee, mais peut-être dans un developpement futur.
*/
/* genere une iframe pour faire passer les divs par dessus des selects sous IE */
var ifrlayer = {
	make:function(obj) {
		if(!obj) return; obj = (typeof(obj)=="string") ? document.getElementById(obj) : obj; if(!obj) return;
		if(document.all && !window.opera && document.getElementById) {
			if(obj.parentNode && !obj.iframelayer) {
			    var ifr = obj.parentNode.insertBefore(document.createElement('<iframe src="javascript:false"></iframe>'), obj);
			    if(obj.currentStyle.zIndex != "" && parseInt(obj.currentStyle.zIndex)>1 ) {
				    ifr.style.zIndex = parseInt(obj.currentStyle.zIndex)-1;
			    }
			    with(ifr.style) {
				    filter = "mask()";
				    position = "absolute";
			    }
                obj.iframelayer = ifr;
            }
		}
		if(obj.iframelayer) {
		    obj.iframelayer.style.visibility="visible";
            ifrlayer.resize(obj);
            ifrlayer.move(obj)
        }
	},
	hide:function(obj) {
		if(!obj) return; obj = typeof(obj)=="string" ? document.getElementById(obj) : obj; if (!obj) return;
		var ifr = obj.iframelayer;
		if(ifr) {
			ifr.style.visibility="hidden";
		}
	},
	move:function(obj) {
		if(obj && obj.iframelayer) {
		    with(obj.iframelayer.style) {
			    top = obj.offsetTop+"px";
			    left = obj.offsetLeft+"px"
		    }
		}
	},
	resize:function(obj) {
	    if(obj && obj.iframelayer) {
	        with(obj.iframelayer.style) {
	            width =  obj.offsetWidth+"px";
		        height =  obj.offsetHeight+"px";
		    }
		}
	}
}
/* generateElements();
	génère des coins sur les blocks contenant la classe "corners"
	Cette fonction n'est plus utilisée par simple choix de la fnac.
	Je laisse cette fonction mais commentée afin que d'autres puissent s'inspirer si besoin.
*/
/*
function generateElements() {
	var content = document.getElementById("content");
	var div = content.getElementsByTagName("div");
	var btm_shadow = document.createElement("b"); btm_shadow.className="btmshadow"; btm_shadow.appendChild(document.createElement("b"));
	var tl = document.createElement("b"); tl.className="tl";var tr = document.createElement("b"); tr.className="tr";
	var bl = document.createElement("b"); bl.className="bl";var br = document.createElement("b"); br.className="br";
	for (var i=div.length-1; i>=0; i--) {
		var x=div[i];
		if (!x.alreadyProcessed) {
			if (x.className.indexOf("corners")!=-1) {
				var divIsd = getDivInside(x);
				with (divIsd) {
					appendChild(tl.cloneNode(true));appendChild(tr.cloneNode(true));
					appendChild(bl.cloneNode(true));appendChild(br.cloneNode(true));
				}
			}
			if (x.className.indexOf("bottomshadow")!=-1) {
				var btm = x.appendChild(btm_shadow.cloneNode(true));
			}
			x.alreadyProcessed=true;
		}
	}
}
*/

/*  addHover :
	Cette fonction ajoute le fonctionnement de la pseudo classe hover en CSS, et seulement pour IE
	Elle se base sur les evenement propres à IE qui sont les evenements qui ont le comportement le plus proche du :hover en CSS.
	Pour utiliser cette fonction il faut le faire en CSS
	ex :
		#menu ul li {behavior:expression(addHover(this))}
		Afin de ne pas prendre en compte IE7 en mode strict il suffit de placer la classe .IS_IE avant, cette classe est ajoutée pendant le chargement de la page.
		.IS_IE #menu ul li {behavior:expression(addHover(this))}
*/
function addHover(elm) {
	elm.style.behavior = " ";
	elm.onmouseenter = function() {
		this.className+= ' hover';
	}
	elm.onmouseleave = function() {
		this.className = this.className.replace(/\bhover\b/,"");
	}
}

/******************************
* fonctions d'effets
******************************/
/*
 size : redimensionne un élément avec un effet
 size ( element, actionsWidth:object, heightWidth:object, timer:int, pitch:int);
 */

function resize(obj, actionWidth, actionHeight, timer, pitch, funcWhile, funcAfter, inBoucle) {
	var endWidth=false;
	var endHeight=false;
	if (actionWidth) {
		if (!inBoucle) obj.style.width=actionWidth.start+"px";
		if ((pitch>=0 && obj.offsetWidth<actionWidth.end) || (pitch<0  && obj.offsetWidth>actionWidth.end)) obj.style.width = actionWidth.start+pitch+"px";
		if ((pitch>=0 && obj.offsetWidth>=actionWidth.end) || (pitch<=0  && obj.offsetWidth<=actionWidth.end)) {
			obj.style.width = actionWidth.end+"px";
			endWidth=true;
		}
	} else {
		endWidth=true;
	}
	if (actionHeight) {
		if (!inBoucle) obj.style.height=actionHeight.start+"px";
		if ((pitch>=0 && obj.offsetHeight<actionHeight.end) || (pitch<0  && obj.offsetHeight>actionHeight.end)) obj.style.height = actionHeight.start+pitch+"px";
		if ((pitch>=0 && obj.offsetHeight>=actionHeight.end) || (pitch<=0  && obj.offsetHeight<=actionHeight.end)) {
			obj.style.height = actionHeight.end+"px";
			endHeight=true;
		}
	} else {
		endHeight=true;
	}
	if (funcWhile) funcWhile();
	if (endWidth && endHeight) {
		if (funcAfter) funcAfter();
		return;
	}
	setTimeout(function() {
		resize(
			obj,
			actionWidth ? {start:obj.offsetWidth, end:actionWidth.end} : null,
			actionHeight ? {start:obj.offsetHeight, end:actionHeight.end} : null,
			timer,
			pitch,
			funcWhile,
			funcAfter,
			true
		)
	}, timer);
}


/*************
* Fonctions pour fixer les coins sous IE
* Une fonctions est prévue aussi pour Safari 2.0, Opera 8.5 et FF 1.0 pour certains cas
**************/
var CSSBottomCorners=[]; //array pouvant contenir les coins absolu positionnés en bottom
var currentBlockToFixCorners=null; //variable gloable utilisée lorsqu'on veux fixer les coins sur un seul bloc

/*  cssRight :
	fixe les coins positionnés en absolu à droite
	ex :
		body.IS_IE .tr {right:expression(addHover(this))}
		Il faut afin que cela fonctionne, avoir déclaré le right dans un selecteur précédent (pour les autres navigateurs).
		ex : .tr {height:5px;  width:5px; right:0}
		Afin de ne pas prendre en compte IE7 en mode strict il suffit de placer la classe .IS_IE avant, cette classe est ajoutée pendant le chargement de la page et n'est ajoutée que pour IE5.x ou 6.
*/
function cssRight(elm) {
	elm.style.right=(parseInt(elm.currentStyle.right)-(elm.parentNode.offsetWidth%2))+"px";
}

/*  cssBottom :  (comme CSS right avec un paramètre supplémentaire)
	fixe les coins positionnés en absolu à droite
	ex :
		body.IS_IE .br {bottom:expression(addHover(this))}
	Il faut afin que cela fonctionne, avoir déclaré le right dans un selecteur précédent (pour les autres navigateurs).
	Afin de ne pas prendre en compte IE7 en mode strict il suffit de placer la classe .IS_IE avant, cette classe est ajoutée pendant le chargement de la page et n'est ajoutée que pour IE5.x ou 6.

	Si on veut rajouter ces coins dans un array qui permettra de les refixer si le bloc s'agrandit ou autre. il suffit de rajouter "true" dans les paramètres.
	ex :
		body.IS_IE .br {bottom:expression(addHover(this, true))}
*/
function cssBottom(elm, pushElement) {
	if (pushElement && !elm.CSSBottomAlreadyCSS) {
		CSSBottomCorners.push(elm);
		elm.CSSBottomAlreadyCSS=true;
	}
	elm.style.bottom=(parseInt(elm.currentStyle.bottom)-(elm.parentNode.offsetHeight%2))+"px";
}

/*  fixCorners :
	Cette fonction  est appelée lorsque l'on doit fixer tous les coins d'une page ou d'un block.
	ex :
		fixCorners ();  //Lance la fonction pour fixer tous les blocks, il faut lancer la fonction une fois la page chargée.
		fixCorners(block); //en passant un element en parametre, le traitement ne se fera que sur le bloc et non sur toute la page.
*/
function fixCorners(block) {
	if (IS_IE) {
		for (i=CSSBottomCorners.length-1; i>-1; --i) {
			CSSBottomCorners[i].style.bottom="";
		}
	} else {
		if (IS_Webkit || /Gecko\/200[56]|Opera 8.5/i.test(navigator.userAgent)) fixCornersOnBlocks(block);
	}
}

/*
	fixCornersOnBlocks :
	Ajoute une classe CSS hidecorners afin de cacher les coins puis les réafficher.
	Cette fonction n'est lancée que pour Safari, Le moteur Gecko 2005 (FF1.0) et Opera 8.5), car lorsqu'on agrandit un block en Javascript, les coins en absolu positionnés en bas restent à leur place. Cette fonction corrige le problème.
*/
function fixCornersOnBlocks(block) {
	currentBlockToFixCorners = block || document.body;
	currentBlockToFixCorners.className+=" hidecorners";
	setTimeout("fixCornersOnBlocksShowCorners()",5);
}

/*
	fixCornersOnBlocksShowCorners :
	Fonction associée à fixCornersOnBlocks(), cette fonction retire la classe hidecorners qui a été appliquée à currentBlockToFixCorners
*/
function fixCornersOnBlocksShowCorners() {
	if (currentBlockToFixCorners) currentBlockToFixCorners.className=currentBlockToFixCorners.className.replace(/\bhidecorners\b/g,"");
	currentBlockToFixCorners=null;
}

/****************
* Initialisation du système d'évaluation critéo
******************/


/*  initEvalFields :
	inialise les images qui permettront d'évaluer le produit
	initEvalFields();
*/
var evaluationMaxNote = 5;
function evaluationInitFields() {
	var p = document.getElementsByTagName("p");
	for (var i=0; i<p.length; i++) {
		var x = p[i];
		if (x.className.match(/\beval\b/)) {
			var img = x.getElementsByTagName("img");
			if (img.length>0) {
				img = img[0];
				img.onmousemove=function(e) {
					evaluationAnimation(this,e);
				}
				img.onmouseout=function() {
					evaluationClearAnim(this)
				}
				img.onclick=function() {
					evaluationSetGrade(this, this.overGrade, true)
				}
			}
		}
	}
}

function evaluationAnimation(img,e) {
	getMouse(e);
	var starWidth = img.offsetWidth/evaluationMaxNote;
	var imgX = findPos(img)[0];
	var mousePosX = window.mouseX-imgX;
	var note = parseInt(mousePosX/starWidth)+1;
	note = note>evaluationMaxNote ? evaluationMaxNote : note<1 ? 1 : note;
	img.overGrade = note;
	if (!img.protectedGrade) evaluationSetGrade(img, note);
}

function evaluationSetGrade(img, note, saveGrade) {
	img.src=img.src.replace(/\d{1}sur/,note+"sur");
	if (saveGrade) {
		img.savedGrade = note;
		evaluationSendGradeByAjax(note);
	}
}

function evaluationClearAnim(img) {
	if (!img.savedGrade) img.savedGrade = 0;
	evaluationSetGrade(img, img.savedGrade);
}

function evaluationSendGradeByAjax(note) {
	//bout de code pour envoyer par ajax la note afin de la sauvegarder en base de donner
}

/*************
* Alignement en hauteur
* Les fonctions qui suivent alignent les blocs et les contenus en hauteur
**************/
/* hashmaps contenant des references de blocks qui doivent être traités */
var arrLineOfMiseEnAvant=[];
var arrLineOfAlignedProduct=[];
var arrBlocksInCol=[];

/*  getDivInside :
	Retourne le premier element contenant la classe blk_inside.
	retourne null si aucun element n'a été trouvé.
	ex : var blockInside = getDivInside(block);
*/
function getDivInside(elm) {
	var div = elm.getElementsByTagName("div");
	for (var i=0; i<div.length; i++) {
		if (div[i].className.match(/\bblk_inside\b/)) return div[i];
	}
	return null;
}

/* findListParent :
	retourne le LI parent d'un élément passé en paramètre
	var li = findListParent(element)
*/
function findListParent(elm) {
	var li = elm
	while(li.nodeName!="LI") li=li.parentNode;
	return li;
}

/*  getAllBlocks :
	cette fonction rempli des arrays (hashmaps) avec les blocks qui devront être traités, elle est lancée pendant le chargement de la page,
	le traitement des blocks se fait une fois la page chargé en un temps très courts par les fonctions fixMiseEnAvant, fixAligneProduits, fixBlocksHeight (ces fonctions doivent être lancées dans l'ordre cité).
*/
function getAllBlocks() {
	arrLineOfMiseEnAvant=[]; arrLineOfAlignedProduct=[]; arrBlocksInCol=[];
	var content = document.body;
	if (!content) return;
	var div = content.getElementsByTagName("div");
	for (var i=0; i<div.length; i++) {
		var line = div[i];
		if (/\bline_[2345]cols/.test(line.className)) { /*on cherche les lignes*/
			var divInside = line.getElementsByTagName("div");
			if (/\baligner_produits\b/.test(line.className)) {
				arrLineOfAlignedProduct.push(line);
				line.blocks=[];
			}
			for (var j=0; j<divInside.length; j++) {
				var block=divInside[j];  /* on recupere les blocks */
				if (/\bblock\b/.test(block.className)) {
					if (/\bmise_en_avant\b/.test(block.className)) { /* Si block mise_en_avant */
						if (!line.alreadyAdded) { /* on initialise un array de block afin que le traitement soit plus rapide une fois la page chargée */
							arrLineOfMiseEnAvant.push(line);
							line.alreadyAdded=true;
						}
						if (!line.miseEnAvantBlocks) {
							line.miseEnAvantBlocks=[];
						}
						line.miseEnAvantBlocks.push(block);
					}
					if (line.blocks) {
						line.blocks.push(block);
					}
					if (!/\bnoresize\b/.test(block.className)) {
						arrBlocksInCol.push(block);
					}
					block.lineContainer = line;
				}
			}
			//optimisation ne fonctionne pas dans tous les cas (boucle infinnie)
			//i+=divInside.length-2;
		}
	}
}

/*  fixMiseEnAvant :
	Aligne les contenus des blocks de mise en avant quand ceux-ci sont dans un conteneur ligne.
*/
function fixMiseEnAvant() {
	for (var i=0; i<arrLineOfMiseEnAvant.length; i++) {
		var line = arrLineOfMiseEnAvant[i];
		/* on cherche d'abord l'ensemble des éléments qui devronts être alignés */
		var imgs = []; var resume = []; var links = [];
		var dd = line.getElementsByTagName("dd");
		var maxOffset=0;
		for (var j=0; j<dd.length; j++) {
			var y=dd[j];
			if (y.className.match(/\bimg\b/)) { imgs.push(y); y.isImage = true; }
			if (y.className.match(/\bresume\b/)) resume.push(y);
			if (y.className.match(/\blinks\b/)) links.push(y);
		}

		/* on traite les img à part

		/* aligner les éléments */
		var arrOfArrElements = [imgs, resume,links];
		var maxImgHeight = 0
		for (var j=0; j<arrOfArrElements.length; j++) {
			var arrTmp = arrOfArrElements[j];
			maxOffset=0;
			for (var k=0; k<arrTmp.length; k++) {
				var current = arrTmp[k];
				if(current.offsetTop>maxOffset) maxOffset=current.offsetTop;
				if (current.isImage) {
					if (current.offsetHeight>=maxImgHeight) maxImgHeight = current.offsetHeight;
				}
			}
			for (var k=0; k<arrTmp.length; k++) {
				var current = arrTmp[k];
				if (current.isImage) {
					var currentHeight = current.offsetHeight;
					var heightToApply = maxImgHeight-currentHeight;
					var topToApply = parseInt(heightToApply/2);
					var bottomToApply = heightToApply-topToApply;
					current.style.paddingTop = intStyle(current, "padding-top")+topToApply+"px";
					current.style.paddingBottom = intStyle(current, "padding-bottom")+bottomToApply+"px";
					current.style.marginTop = intStyle(current, "margin-top")+(maxOffset-current.offsetTop)+"px";
				} else {
					current.style.paddingTop = intStyle(current, "padding-top")+(maxOffset-current.offsetTop)+"px";
				}
			}
		}
	}
}

/*  fixAligneProduits :
	Aligne les listes de produits quand 2 à 3 blocs sont contenus dans une ligne ayant la classe "aligner_produits".
	ex : <div class="line_2cols aligner_produits">
*/
function fixAligneProduits() {
	var maxLengthLinks=0;
	var maxLengthProduits=0;
	var maxOffset=0;
	var maxHeight=0;
	for (var i=0; i<arrLineOfAlignedProduct.length; i++) { /*on parcours les lignes */
		var line = arrLineOfAlignedProduct[i];
		for (var j=0; j<line.blocks.length; j++) { /* puis les lignes de chaque  block */
			var block = line.blocks[j];
			block.linksBlocks=[];
			var dd = block.getElementsByTagName("dd");
			for (var k=0; k<dd.length; k++) {
				if (dd[k].className.match(/\blinks\b/)) block.linksBlocks.push(dd[k]);
			}
			if (block.linksBlocks.length>maxLengthLinks) maxLengthLinks=block.linksBlocks.length;
			block.produits=[];
			var li = block.getElementsByTagName("li");
			for (var k=0; k<li.length; k++) {
				if (li[k].parentNode.className.match(/\blisteproduits\b/)) block.produits.push(li[k]);
			}
			if (block.produits.length>maxLengthProduits) maxLengthProduits=block.produits.length;
		}
		for (var j=0; j<maxLengthProduits; j++) { /* on parcoure les tableaux de links, puis les blocks pour aligner les contenus.  */
			maxHeight=0;
			for (var k=0; k<line.blocks.length; k++) {
				if (j<line.blocks[k].produits.length) {
					var current = line.blocks[k].produits[j];
					if(current.offsetHeight>maxHeight) maxHeight=current.offsetHeight;
				}
			}
			for (var k=0; k<line.blocks.length; k++) {
				if (j<line.blocks[k].produits.length) {
					var current = line.blocks[k].produits[j];
					current.style[heightPropertyToUse] = maxHeight-intStyle(current, "padding-top")-intStyle(current, "padding-bottom")+"px";
				}
			}
		}
		for (var j=0; j<maxLengthLinks; j++) { /* on parcoure les tableaux de links, puis les blocks pour aligner les contenus.  */
			maxOffset=0;
			for (var k=0; k<line.blocks.length; k++) {
				if (j<line.blocks[k].linksBlocks.length) {
					var current = line.blocks[k].linksBlocks[j];
					if(current.offsetTop>maxOffset) maxOffset=current.offsetTop;
				}
			}
			for (var k=0; k<line.blocks.length; k++) {
				if (j<line.blocks[k].linksBlocks.length) {
					var current = line.blocks[k].linksBlocks[j];
					current.style.paddingTop = intStyle(current, "padding-top")+(maxOffset-current.offsetTop)+"px";
				}
			}
		}
	}
}

/*  fixBlocksHeight :
	Aligne tous les blocks en hauteur.
*/
function fixBlocksHeight() {
	var content;
	for (var i=0; i<arrBlocksInCol.length; i++) {
		content=null;
		var b = arrBlocksInCol[i];
		var div = b.getElementsByTagName("div");
		for (var j=0; j<div.length; j++) {
			if (div[j].className.match(/\bblk_content\b/)) { /* on recupere le blk_content, du block */
				content=div[j];
				break;
			}
		}
		if (content) {
			/* on défini la nouvelle hauteur du block via, une simple soustraction : hauteur_content+(hauteu_ligne-hauteur_Block)-paddings */
			content.style[heightPropertyToUse] = content.offsetHeight+(b.lineContainer.offsetHeight-b.offsetHeight)-(intStyle(content,"padding-top")+intStyle(content,"padding-bottom"))+"px";
		}
	}
}


/* ====== alignement des listes (listes en ligne et listes en colonne ou un élément sur 2 est sur la droite ou la gauche) ======= */
var listes_inline=[];
var listes_2cols=[];

/* getAllLists :
	Récupères toutes les listes de produits ou contacts afin de les traiter après
*/
function getAllLists() {
	var ul = document.getElementsByTagName("ul");
	for (var i=0; i<ul.length; i++) {
		var x = ul[i];
		x.listItems = [];
		if (x.offsetHeight>0) {
			if (x.className.match(/\b(produits_conseilles|liste_inline|liste_3cols)\b/)) {
				listes_inline.push(x);
				for (var j=0; j<x.childNodes.length; j++) {
					var y = x.childNodes[j];
					if (y.nodeType==1 && y.nodeName=="LI") {
						x.listItems.push(y);
					}
				}

				//on recupere le block de liens qui se trouve dans la liste
				x.linksItems=[];
				x.evalItems=[];
				if (x.className.match(/\bproduits_conseilles\b/)) {
					var ul2 = x.getElementsByTagName("ul");
					for (var j=0; j<ul2.length; j++) {
						var y = ul2[j];
						if (y.className.match(/\blinks\b/)) {
							x.linksItems.push(y);
						}
					}
				} else {
					//  dans le cas d'une liste en ligne, on n'alignement pas les links d'accès au produit, mais on aligne les évaluations
					if (x.className.match(/\bliste_inline\b/)) {
						var div = x.getElementsByTagName("div");
						for (var j=0; j<div.length; j++) {
							var y = div[j];
							if (y.className.match(/\beval\b/)) {
								x.evalItems.push(y);
							}
						}
					}
				}
			} else if(x.className.match(/\bliste_2cols\b/)) {
				listes_2cols.push(x);
				x.itemsLeft = [];
				x.itemsRight = [];
				counter=0;
				for (var j=0; j<x.childNodes.length; j++) {
					var y = x.childNodes[j];
					if (y.nodeType==1 && y.nodeName=="LI") {
						var dd = y.getElementsByTagName("dd");
						for (var k=0; k<dd.length; k++) {
							var z = dd[k];
							if (z.className.match(/\blinks\b/)) {
								y.linksBlock = z;
							}
						}
						if (counter%2) {
							x.itemsRight.push(y);
						} else {
							x.itemsLeft.push(y);
						}
						counter++;
					}
				}
			}
		}
	}
}
function fixListeInline() {
	for (var i=0; i<listes_inline.length; i++) {
		var x = listes_inline[i];
		var maxHeight = 0;
		for (var j=0; j<x.listItems.length; j++) {
			var y=x.listItems[j];
			if (y.offsetHeight>maxHeight) maxHeight = y.offsetHeight;
		}
		for (var j=0; j<x.listItems.length; j++) {
			var y=x.listItems[j];
			y.style[heightPropertyToUse] = maxHeight-intStyle(y, "padding-top")-intStyle(y, "padding-bottom")+"px";
		}
		if (x.linksItems && x.linksItems.length>0) {
			var arr = x.linksItems;
			var maxOffset = 0;
			for (var j=0; j<arr.length; j++) {
				var y = arr[j];
				if (y.offsetTop>maxOffset) maxOffset=y.offsetTop;
			}
			for (var j=0; j<arr.length; j++) {
				var y = arr[j];
				y.style.paddingTop = intStyle(y, "padding-top")+(maxOffset-y.offsetTop)+"px";
			}
		}
		if (x.evalItems && x.evalItems.length>0) {
			var arr = x.evalItems;
			var maxOffset = 0;
			for (var j=0; j<arr.length; j++) {
				var y = arr[j];
				var li = findListParent(y);
				var offsetTop = findPos(y)[1]-findPos(li)[1];
				y.specialOffsetTop = offsetTop;
				if (offsetTop>maxOffset) maxOffset=offsetTop;
			}
			for (var j=0; j<arr.length; j++) {
				var y = arr[j];
				y.style.marginTop = (maxOffset-y.specialOffsetTop)+"px";
			}
		}
	}
}
function fixListe2cols() {
	for (var i=0; i<listes_2cols.length; i++) {
		var x = listes_2cols[i];
		for (var j=0; j<x.itemsLeft.length; j++) {
			var l = x.itemsLeft[j];
			var r = x.itemsRight[j];
			var maxOffset = l.linksBlock.offsetTop>r.linksBlock.offsetTop ? l.linksBlock.offsetTop : r.linksBlock.offsetTop;
			l.linksBlock.style.paddingTop = intStyle(l.linksBlock, "padding-top")+(maxOffset-l.linksBlock.offsetTop)+"px";
			r.linksBlock.style.paddingTop = intStyle(r.linksBlock, "padding-top")+(maxOffset-r.linksBlock.offsetTop)+"px";
			var heightStuff = intStyle(l,"padding-top")+intStyle(l,"padding-bottom")+intStyle(l, "border-top-width")+intStyle(l, "border-bottom-width")
			l.style[heightPropertyToUse]=r.style[heightPropertyToUse]= (l.offsetHeight>=r.offsetHeight ? l.offsetHeight : r.offsetHeight)-heightStuff+"px";
		}
	}
}
/*** Fin alignement en hauteur ***/

/*****************
* domLoad et onload fonctions
* Ces fonctions permettent de lancer des fonctions en 2 temps
* - Soit pendant le chargement de la page (mais le DOM est construit)
* - Soit une fois que la page est construite
*****************/
/* variables globales (arrays et booleens) qui permettent de gérer le lancement des fonctions domload et onload */
var domLoaded=false;
var domMustLaunch=false;
var domLoadFunctionLaunched=false;
var domLoadTimer=null;
var domLoadArrFunctions=[];
var onloadArrFunctions=[];

/*
	domLoad() :
	Appartient a un ensemble de fonctions qui sont lancées pendant le chargement de la page, une fois le DOM construit
	Cette fonction attend que le dom soit totalement construit
*/
function domLoad() {
	if(document.getElementById("footer")) {
		domLoadCaller();
	} else {
		domLoadTimer=setTimeout("domLoad()",10);
	}
}
domLoad();

/*
	domLoadCaller() :
	Appartient a un ensemble de fonctions qui sont lancées pendant le chargement de la page, une fois le DOM construit
	Cette fonction gère le lancement de la fonction finale domLoadFunctions();
	domLoadCaller() lances les fonctions contenues dans un array de fonctions et gère le fait que domLoad doit être lancé avant le onload
*/
function domLoadCaller() {
	domLoadFunctionLaunched=true;
	for (var i=0; i<domLoadArrFunctions.length; i++) {
		domLoadArrFunctions[i]();
	}
	domLoadFunctions();
	domLoaded=true;
	if(domMustLaunch) {
		onloadCaller();
	}
}

/*
	onloadCaller() : // ne pas modifier cette fonction
	Cette fonction gère le lancement de la fonction finale onLoadFunctions();
	onLoadCaller() est exécutée une fois que la page est chargée.
*/
function onloadCaller() {
	clearTimeout(domLoadTimer);
	if (!domLoadFunctionLaunched) {
		domLoadCaller();
	}
	if (!domLoaded) {
		domMustLaunch=true;
		return;
	}
	for (var i=0; i<domLoadArrFunctions.length; i++) {
		onloadArrFunctions[i]();
	}
	onloadFunctions();
}

/*
	addDomLoadFunc() :
	permet d'ajouter facilement une fonction qui sera lancée avant avant le chargement complet de la page.
	ex :
		function myfunc() {
			//contenu fonction.
		}
		addDomLoadFunc(myfunc) // il ne faut pas mettre les parenthèses, car ici on passe une fonction en paramètres.

	Si on veut lancer la fonction avec des paramètres, il faut passer par une fonction anonyme.
	ex :
		function myfunc(p1, p2) {
			//contenu fonction.
		}
		addDomLoadFunc(
			function () {
				myfunc("foo", "bar");
			}
		);
		// il ne faut pas mettre les parenthèses, car ici on passe une fonction en paramètres.
*/
function addDomLoadFunc(f) {
	domLoadArrFunctions.push(f);
}
/*
	addOnLoadFunc() :
	permet d'ajouter facilement une fonction qui sera lancée une fois la page chargée.
	fonctionne de la même manière que addDomLoadFunc()
*/
function addOnloadFunc(f) {
	onloadArrFunctions.push(f);
}

//on lance la fonction onloadCaller une fois la page chargée.
addEvent(window, "load", onloadCaller);

/***** fin domLoad et onload fonctions *****/


/*******************
* Toolbar fonctions pour la toolbar
*********************/
var fnacToolbar=null;
var fnacToolbarTimer=null;
var fnacStartScroll=true;
/*
	initToolbar :  initialise la toolbar et corrige le positionnement de la toolbar sous IE
	La toolbar est traitée (système d'onglets resize d'éléments) seulement si la page dans laquelle on est n'est pas un template de toolbar.
	Un test est effectué sur le className du document.body
 */
function initToolbar() {
	fnacToolbar = document.getElementById("toolbar");
	if (!fnacToolbar) return;
	if (document.body.className.match(/\btoolbar\b/)) return
	//problème avec IE, pour lequel on doit emuler un pseudo position:fixed, et aussi positionner une iframe pour passer par dessus les selects.
	if (IS_IE) { //problème avec IE, pour lequel on doit emuler un pseudo position:fixed, et aussi positionner une iframe pour passer par dessus les selects.
		ifrlayer.make(fnacToolbar);
		fnacToolbar.sensZIndex=1;
		if (fnacToolbar.currentStyle.zIndex=="") fnacToolbar.style.zIndex = 100;
		addEvent(window, 'scroll', toolbarSetPos);
		addEvent(window, 'resize',
			function() {
				toolbarSetPos();
				if (document.documentElement.scrollHeight>document.body.offsetHeight) {
					if (document.body.style.position!="relative") document.body.style.position="relative";
				} else {
					if (document.body.style.position!="") document.body.style.position="";
				}
			}
		);
		toolbarSetPos();
	}
	initToolbarTabs();
	toolbarSetBodyPaddingBottom();
}
/*
	toolbarSetPos :
	Cette fonction corrige le manque du position:fixed sous IE5/6

 */
function toolbarSetPos() {
	clearTimeout(fnacToolbarTimer);
	if (fnacStartScroll) {
		ifrlayer.hide(fnacToolbar);
		fnacStartScroll=false;
	}
	fnacToolbar.sensZIndex=-fnacToolbar.sensZIndex;
	fnacToolbar.style.zIndex = parseInt(fnacToolbar.currentStyle.zIndex)+fnacToolbar.sensZIndex;
	fnacToolbarTimer=setTimeout(toolbarReplaceIfr,10);
}

function toolbarReplaceIfr() {
	ifrlayer.make(fnacToolbar);
	fnacStartScroll = true;
}

function toolbarSetBodyPaddingBottom() {
	document.body.style.paddingBottom = fnacToolbar.offsetHeight+"px";
	/* sous Opera, il y a un bug de rafraîchessement de la toolbar lorsque celle-ci se réduit. On corrige ce bug en forcant le navigateur à rafraiche le contenu principal */
	if (window.opera) {
		document.documentElement.scrollTop+=1;
		setTimeout(function() {document.documentElement.scrollTop-=1}, 1);
	}

}

function toggleToolbar() {
	if (fnacToolbar.className.match(/\bstate_close\b/)) { openToolbar(); return }
	if (fnacToolbar.className.match(/\bstate_open\b/)) { closeToolbar(); return }
}


function openToolbar() {
	var tb = fnacToolbar;
	tb.style.height="";
	var currentSize = tb.clientHeight;
	tb.className=tb.className.replace(/\bstate_close\b/g,'')+" state_open";
	var endSize = tb.clientHeight;
	tb.style.height = currentSize+"px";

	resize(tb, null, {start:currentSize, end:endSize}, (IE_W3C ? 1 : 3), (IE_W3C ? 15 : 10), (IS_IE ? function() {ifrlayer.move(tb,true);} : null), toolbarSetBodyPaddingBottom);
}

function closeToolbar() {
	var tb = fnacToolbar;
	var startHeight = tb.offsetHeight;
	tb.className = tb.className.replace(/\bstate_open\b/g,'')+" state_close";
	tb.style.height="";

	resize(tb, null, {start:startHeight, end:tb.offsetHeight}, (IE_W3C ? 1 : 3), -(IE_W3C ? 15 : 10), (IS_IE ? function() {ifrlayer.move(tb,true);} : null), toolbarSetBodyPaddingBottom);
}





/* onglets de la toolbar (fonctions) */
function initToolbarTabs() {
	var header;
	var tb = fnacToolbar;
	var div = tb.getElementsByTagName("div");
	for (var i=0; i<div.length; i++) {
		var x = div[i];
		if (x.className.match(/\bheader\b/)) header = x;
	}
	/* liens tabs */
	var a = header.getElementsByTagName("ul")[0].getElementsByTagName("a");
	for (var i=0; i<a.length; i++) {
		var x = a[i];
		x.onclick = function() {
			toolbarSetCurrentTab(this,true);
			return false;
		}
		if (x.parentNode.className.match(/\bcurrent\b/)) {
			toolbarSetCurrentTab(x,false);
		}
	}
}

function toolbarSetCurrentTab(elm, mustOpen) {
	var ul = elm.parentNode.parentNode;
	var contentId = elm.parentNode.id.replace(/\btb_/,'tbc_');
	var li = ul.getElementsByTagName('li');
	for (var i=0; i<li.length; i++) {
		var x = li[i];
		x.className = x.className.replace(/\bcurrent\b/g, '');
	}
	elm.parentNode.className+=' current';
	var content = document.getElementById('toolbar_content');

	for (var i=0; i<content.childNodes.length; i++) {
		var x = content.childNodes[i];
		if (x.nodeType==1 && x.className.match(/\btoolbar_tabs_content\b/)) {
			x.className = x.className.replace(/\bcurrent\b/g,'');
		}
	}
	var currentTab = document.getElementById(contentId);
	if (currentTab) {
		document.getElementById(contentId).className+=' current';
		checkScrollBlocks(contentId);
	}
	if (mustOpen) {
		openToolbar();
	}
}
/* checkScrollBlocks
   il peut y avoir des blocks de scroll dans certains éléments.
   Ces blocks de scroll sont horizontaux, et les éléments à l'intérieurs sont des list-items floatés. Mais comme cela ne fonctionne pas, cette fonction fixe les largeurs des éléments et applique une largeur sur l'élément parent de tous les list-items.
*/
function checkScrollBlocks(elm) {
	elm = typeof(elm) == "string" ? document.getElementById(elm) : elm;
	if (!elm) return;
	var div = elm.getElementsByTagName("div");
	var childWidth = 0;
	for (var i=0; i<div.length; i++) {
		var x = div[i];
		childWidth=0;
		if (x.className.match(/\bscrollblock\b/)) {
			x.style.width = x.offsetWidth-intStyle(x,"padding-left")-intStyle(x,"padding-right");
			var liste = x.getElementsByTagName("ul");
			if (liste.length>0) {
				liste = liste[0];
			} else {
				continue;
			}
			var li = x.getElementsByTagName("li");
			for (var j=0; j<li.length; j++) {
				var y = li[j]
				childWidth+=y.offsetWidth;
				childWidth+=intStyle(y,"margin-left");
				childWidth+=intStyle(y,"margin-right");
				y.style.width = y.offsetWidth-intStyle(y,"padding-left")-intStyle(y,"padding-right")-intStyle(y,"border-left-width")-intStyle(y,"border-right-width")+"px";
			}
			liste.style.width = childWidth+"px";
		}
	}
}

/***************
* Exécutions des fonctions au chargement de la page
 ***************/
/*
	domLoadFunctions() :
	cette fonction est lancée pendant le chargement de la page, une fois que le DOM est complètement construit
*/
function domLoadFunctions() {
	document.body.className+=" hasJS"; //cette classe rajoute une classe CSS qui permet des actions afin de cacher ou afficher des éléments seulement pour les visiteurs qui ont le Javascript activé sur leur navigateur. (exemple le hidesubmit)
	if (IS_IE) document.body.className+=" IS_IE"; //cette classe permet d'utiliser des hacks CSS/JS seulement pour IE6 et versions inférieures.
	initToolbar(); //initialisation de la toolbar seulement pour IE 5 et 6
	getAllBlocks(); //parsing de tous les blocks et mise ne place dans des hashmaps
	fixAligneProduits(); //alignement des contenus de produits
	getAllLists(); // parsing de toutes les listes produits ou contacts
	evaluationInitFields();
	derouleDispeBock(); //permet le bon fonctionnement des sous-menus d豯ulants
}

/*
	onloadFunctions() :
	cette fonction est lancée une fois que la page est totalement chargée (images, flash, fichiers associés)
*/
function onloadFunctions() {
	fixMiseEnAvant(); //alignement des contenus de mise en avant
	fixListeInline(); //aligne les items des listes en ligne
	fixListe2cols(); //aligne les items des listes en 2 colonnes
	fixBlocksHeight();  //alignement des blocs
	fixCorners(); //correction des coins (seulement pour IE et si besoin pour anciennes version des autres navigateurs)
}

function DisplayFlash(flashFile,width,height,quality,wmode,idHtml,background) {
  document.write('<object id="'+ idHtml +'" type="application/x-shockwave-flash" data="'+ flashFile +'" width="'+ width +'" height="'+ height +'">');
  document.write('  <param name="movie" value="'+ flashFile +'" />');
  document.write('  <param name="allowScriptAccess" value="always" />');
  document.write('  <param name="quality" value="'+ quality +'" />');
  document.write('  <param name="wmode" value="'+ wmode +'" />');
  document.write('  <param name="bgcolor" value="'+ background +'" />');
  document.write('  <embed src="'+ flashFile + '" quality="high" wmode="'+ wmode +'" width="'+ width +'" height="'+ height +'" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />');
  document.write('</object>');
}
// function getElementsByClassName(.document ou un id ou un getbytagname etc etc, le nom du tag, le nom de la class a trouver)
function getElementsByClassName(oElm, sTagName, sClassName)
{
  var aElements = (sTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(sTagName);
  var aReturnElements = new Array();
  sClassName = sClassName.replace(/\-/g, "\\-");
  var oRegExp = new RegExp("(^|\\s)" + sClassName + "(\\s|$)");
  var oElement;
  for(var i=0; i < aElements.length; i++)
  {
    oElement = aElements[i];
    if(oRegExp.test(oElement.className))
    aReturnElements.push(oElement);
  }
  return aReturnElements
}
//derouleDispeBock() passe tout les UL en display none en style n袥ssaire pour la fontction dessous, mais charge au debut de la page
function derouleDispeBock(){
  if (document.getElementById("menu")){
    var selectClass = getElementsByClassName(document.getElementById("menu"), "ul", "sousMenuDeroule");
    for (var i=0; i < selectClass.length; i++)
    {
      selectClass[i].style.display="none";
    }
  }
}
function sousMenuDeroule(onOff,id,evt){
  var monId = document.getElementById(id);
  var monUl = monId.getElementsByTagName("ul");
  if (monUl.length>0){// permet de tester si il y a un sousmenu a derouler, sinon provoque une erreur
    var diffNavWidth = monUl[0].offsetWidth-1;
    var diffNavHeight = monUl[0].offsetHeight-1;
    var diffBlocWidth = 0;
    var diffblocHeight = 0;
    if (IS_IE_ALL)// pour corriger les soucis d'affichage d'ie
    {
      diffNavWidth = monUl[0].offsetWidth+1;
      diffNavHeight = monUl[0].offsetHeight+1;
      diffBlocWidth = +2;
      diffBlocHeight = +2;
    }
    if (onOff == "on")
    {
      if (monUl[0].style.display=="block")//on test si le block est visible
      {}else//s'il ne l'est pas, on envoi la methode
      {
        var selectClass = getElementsByClassName(document.getElementById("menu"), "ul", "sousMenuDeroule");
        for (var i=0; i < selectClass.length; i++)
        {
          selectClass[i].style.display="none";
        }
        monUl[0].style.display="block";// permet de faire disparaitre toute chance d'afficher 2 sous-menus en meme temps
        ifrlayer.make(monUl[0]);
        resize(monUl[0], {start: 0, end: 136}, {start: 0, end: 126}, 20, 30, 0, ifrlayer.resize(monUl[0]), 0);
        monUl[0].className+=" fini";//on ajoute cette class pour la finition du bloc (bordure)
      }
    }
    if (onOff == "off")
    {
      getMouse(evt);// ici on va r袵perer les positionnements du bloc et de la souris pour faire disparaitre le menu proprement sans les sursauts engendres par le onmouseout
      var blocX = findPos(monUl[0])[0];
      var blocY = findPos(monUl[0])[1];
      var sourisX  = window.mouseX;
      var sourisY  = window.mouseY;
      var blocXmouseX  = sourisX-blocX;
      var blocYmouseY  = sourisY-blocY;
      if(blocXmouseX < diffBlocWidth || blocXmouseX > diffNavWidth || blocYmouseY < diffblocHeight || blocYmouseY > diffNavHeight)
      {
        monUl[0].style.display="none";//on cache
        monUl[0].className="sousMenuDeroule";//et on enleve la class fini
        ifrlayer.hide(monUl[0]);
      }
    }else{}
  }
//  document.getElementById("mioumiou").innerHTML=diffBlocWidth+"-"+blocXmouseX;
}

function changeOpacity(obj, actionOpac, timer, pitch, inBoucle) {
  var endOpac=false;
  var theOpacter = obj.parentNode.style;
	if (actionOpac) {
		if (!inBoucle) theOpacter=actionOpac.start;
		if ((pitch>=0 && theOpacter<actionOpac.end) || (pitch<0  && theOpacter>actionOpac.end)) theOpacter = actionOpac.start+pitch;
		if ((pitch>=0 && theOpacter>=actionOpac.end) || (pitch<=0  && theOpacter<=actionOpac.end)) {
			theOpacter = actionOpac.end;
			endOpac=true;
		}
	} else {
		endOpac=true;
	}
  theOpacter.filter = "alpha(opacity=" + actionOpac.end + ")";
  theOpacter.opacity = (actionOpac.end / 100);
  theOpacter.MozOpacity = (actionOpac.end / 100);
  theOpacter.KhtmlOpacity = (actionOpac.end / 100);
  if (endOpac)
  {
    return;
  }
  setTimeout(function()
  {
    changeOpacity(
      obj,
      actionOpac ? {start:obj.theOpacter, end:actionOpac.end} : null,
      timer,
      pitch,
      true
    )
  }, timer);
}

function switchAvantageAdherent(id, idOnglet){
  var selectOngletOffreAdh = document.getElementById(idOnglet);
  var selectOffreAdh = getElementsByClassName(document.getElementById("blockAvantageAdherent"), "div", "blockAvantageAdherent");
  var monId = document.getElementById(id);
  monId.style.display="block";
  var heightMonId = monId.offsetHeight;
  var heightMonIdParent = monId.parentNode.offsetHeight;
  monId.parentNode.style.height="auto";
  function switchAvantageAdherentLoop(){
    for (var i=0; i < selectOffreAdh.length; i++)
    {
      selectOffreAdh[i].style.display="none";
      selectOngletOffreAdh.parentNode.getElementsByTagName("li")[i].className="";
    }
    selectOngletOffreAdh.className="ongletAvtAdhActive";
    monId.style.display="block";
    document.getElementById("AvtAdhAdherer").style.display="none";// le premier bloc doit disparaitre au premier changement d'onglet, il n'est pas demand矱u'il reapparaisse
  }
  monId.style.display="block";
//retourne une taille de difference pour pouvoir derouler dans les deux sens proprement
  var frame = parseInt(heightMonId-heightMonIdParent)/10;
//IE n'a pas les bonne taille, je le force donc - bug a corriger
  if (IS_IE)frame=50;
//  IE7 retourne 0 si on arrive sur la page avec l'ancre, je recalcule et cela suffit pour avoir la bonne hauteur
  if (!heightMonId == 0){
    resize(monId.parentNode, 0, {start: heightMonIdParent, end: heightMonId}, 1, frame, switchAvantageAdherentLoop(), 0, 0);
  }
//  un peu d'opacite pour plus tard ?
//  changeOpacity(monId.parentNode, {start: 0, end: 100}, 1, 10, 0);

//  pas tres propre, mais permet de switcher d'onglet du menu principal
  if (id=="AvtAdhPaiement")
  {
    document.getElementById("m_adh_avantages_carte").className="";
    document.getElementById("m_adh_facilite_paiement").className="current";
  }
  else
  {
    document.getElementById("m_adh_avantages_carte").className="current";
    document.getElementById("m_adh_facilite_paiement").className="";
  }
}
function printDebug(debug){
  var monId = document.getElementById("header");
  monId.innerHTML="<div id=\"debugJS\"><pre>"+debug+"</pre></div>";
}


function switchChoixNewsletter(id, idOnglet){
  var selectOngletNewsletter = document.getElementById(idOnglet);
  var selectNewsletter = document.getElementById("nlChoixNewsletter").getElementsByTagName("ul");
  var monId = document.getElementById(id).getElementsByTagName("ul")[0];
  for (var i=0; i < selectNewsletter.length; i++)
  {
    selectNewsletter[i].style.display="none";
    selectOngletNewsletter.parentNode.getElementsByTagName("li")[i].className="nlListeInactif";
  }
  selectOngletNewsletter.className="nlListeActif";
  monId.style.display="block";
}
function listingNlLive(){
  var lesInput = document.getElementById("form1").getElementsByTagName("input");
  for (var i = 0; i < 5; i++)
  {
    alert(lesInput[i].parentNode.getElementsByTagName("label")[i].textContent);
  }
}

function popinIt(obj, id, tag, className, noeuxParent, popinClassName, onOff){
  if (onOff=="on"){
    if (document.getElementById("jeVeuxEtreSupprimer")){
      var del = document.getElementById("jeVeuxEtreSupprimer");
      del.parentNode.removeChild(del);
    }
    var remplissage = getElementsByClassName(document.getElementById(id), tag, className)[0].innerHTML; //recup le HTML
    nouveauDiv = document.createElement("div");
    nouveauDiv.id="jeVeuxEtreSupprimer";
    nouveauDiv.className="popin "+popinClassName;
    nouveauDiv.style.display="block";
    nouveauDiv.innerHTML = remplissage;
    obj.parentNode.insertBefore(nouveauDiv, obj);
    var leNouveauDiv = document.getElementById("jeVeuxEtreSupprimer");
    var leParentLeNouveauDiv = noeuxParent;
    var ouLeNouveauDiv = leNouveauDiv.offsetHeight+leNouveauDiv.offsetTop;
//    alert("Le nouveau div findpos : "+leNouveauDiv.offsetTop+" et hauteur "+leNouveauDiv.offsetHeight)
    var ouLeParentLeNouveauDiv = leParentLeNouveauDiv.offsetHeight+leParentLeNouveauDiv.offsetTop;
    if (ouLeNouveauDiv>ouLeParentLeNouveauDiv){
      leNouveauDiv.getElementsByTagName("span")[0].className="popbr";
      leNouveauDiv.style.marginTop="-"+leNouveauDiv.offsetHeight+"px";
    }
    if (leNouveauDiv.offsetLeft<1){
      leNouveauDiv.getElementsByTagName("span")[0].className="popbl";
      leNouveauDiv.className+=" popInDerouleDroite";
    }
//    alert("Le parent findpos : "+leParentLeNouveauDiv.offsetTop+" et hauteur "+leParentLeNouveauDiv.offsetHeight)
//    alert("Ou est le nouveau div : "+ouLeNouveauDiv+" et son parent : "+ouLeParentLeNouveauDiv);
  }
  else{
      var del = document.getElementById("jeVeuxEtreSupprimer");
      del.parentNode.removeChild(del);
  }
  var miou="miou";
}

function toggle() {
 for (i=0;i<document.getElementsByTagName("div").length; i++) {
	if (document.getElementsByTagName("div").item(i).className == "event"){

			if (document.getElementsByTagName("div").item(i).style.display == "none"){
				document.getElementsByTagName("div").item(i).style.display = "";
			} else {
				document.getElementsByTagName("div").item(i).style.display = "none";
			}
		}
	}
 }

function toggleAndWrite(artlink,Title,TypeId, gauche, haut)
{

	var listArt = artlink.toString();
	listArt = listArt.replace(/\|\|/g, ', ');
	listArt = listArt.replace(/,\s+$/, '.');
	
	for (i=0;i<document.getElementsByTagName("div").length; i++) {
		if (document.getElementsByTagName("div").item(i).className == "event"){
		
			if (document.getElementsByTagName("div").item(i).style.display == "none"){
				document.getElementsByTagName("div").item(i).style.display = "";
				document.getElementsByTagName("div").item(i).style.position = "absolute";
				document.getElementsByTagName("div").item(i).style.left = gauche+"px";
				document.getElementsByTagName("div").item(i).style.top = haut+"px";

				document.getElementsByTagName("div").item(i).innerHTML = "<span class='toggle'><a href='/' onclick='toggle(1); return false' title='Masquer l explication'>X</a></span><p style='padding: 0 7px; background-color: #A3A3A3; color: #fff;'>Nous vous proposons " + TypeId + " <strong>" + Title + "</strong> parce que vous avez consult&eacute;<br /></p><p style='padding: 7px; background-color: #fff; color: #A3A3A3;'><strong>" + listArt + "</strong></p>";
			} else if (document.getElementsByTagName("div").item(i).style.display == "") {
				
				document.getElementsByTagName("div").item(i).style.position = "absolute";
				document.getElementsByTagName("div").item(i).style.left = gauche+"px";
				document.getElementsByTagName("div").item(i).style.top = haut+"px";
				
				document.getElementsByTagName("div").item(i).innerHTML = "<span class='toggle'><a href='/' onclick='toggle(1); return false' title='Masquer l explication'>X</a></span><p style='padding: 0 7px; background-color: #A3A3A3; color: #fff;'>Nous vous proposons " + TypeId + " <strong>" + Title + "</strong> parce que vous avez consult&eacute;<br /></p><p style='padding: 7px; background-color: #fff; color: #A3A3A3;'><strong>" + listArt + "</strong></p>";
			} else {
				document.getElementsByTagName("div").item(i).style.display = "none";
			}
		 }
	}
}

//http://www.diplok.com/1ppl/html/article103.html
var sldValue=0
var sldTop=0
var sldLeft=0
var doDrag=false
var sldMouseLeft=0
var sldMouseTop=0

function getAbsLeft(o) {
	var oLeft = o.offsetLeft
	while(o.offsetParent!=null) {
		oParent = o.offsetParent
		oLeft += oParent.offsetLeft
		o = oParent
	}
	return oLeft
}

function getAbsTop(o) {
	var oTop = o.offsetTop
	while(o.offsetParent!=null) {
		oParent = o.offsetParent
		oTop += oParent.offsetTop
		o = oParent
	}
	return oTop
}

function setLeft(o,oLeft) {
	o.style.left = oLeft + "px"
}

function setTop(o,oTop) {
	o.style.top = oTop + "px"
}

function setPosition(o,oLeft,oTop) {
	setLeft(o,oLeft)
	setTop(o,oTop)
}

function sldMouseDown(e)
{
	if (!e) {e = window.event}
	doDrag=true
	o=document.getElementById("event1")
	sldLeft=getAbsLeft(o)
	sldTop=getAbsTop(o)
	sldMouseLeft=e.clientX-sldLeft
	sldMouseTop=e.clientY-sldTop

	/*document.getElementById("mouseCapt").innerHTML = "Mouse Position on Mouse Down event : " + e.clientX + "/" + e.clientY
	document.getElementById("headPos").innerHTML = "Head Position on Mouse Down event : " + sldLeft + "/" + sldTop
	document.getElementById("mousePosRel").innerHTML = "Relative Mouse Position on Mouse Down event : " + sldMouseLeft + "/" + sldMouseTop*/

}

function sldMouseUp(e)
{
	doDrag=false
}

function sldMouseMove(e)
{
	if (!e) {e = window.event}

	/*if (document.getElementById("mousePos"))
	{
		document.getElementById("mousePos").innerHTML = "Mouse Position : " + e.clientX + "/" + e.clientY
		document.getElementById("dragStatus").innerHTML = "doDrag : " + doDrag
	}*/

	if (doDrag)
	{
		o=document.getElementById("event1")
		setPosition(o,e.clientX-sldMouseLeft,e.clientY-sldMouseTop)
		return false
	}
}

document.onmousemove = sldMouseMove;
