/**
 * Ce fichier JavaScript est à utiliser conjointement à un fichier de 
 * localisation de la langue.
 * (exemple pour le français: 'common-local-fr.js')
 */

/**
 * Common functions used all over the site.
 */

// Defines an XMLHttpRequest constructor for Internet Explorer.
if (typeof (window.XMLHttpRequest) == 'undefined'
    && typeof (window.ActiveXObject) != 'undefined')
{
	window.XMLHttpRequest = function () 
	{
		return new ActiveXObject ('Msxml2.XMLHTTP');
	}
}

// Defines the 'push' method for Array.
if (typeof (Array.prototype.push) == 'undefined')
	Array.prototype.push = function (item) { this[this.count] = item; };

// An object dumper
function ObjectDump (object)
{
	var str = '';
	for (var prop in object)
	{
		if (str == '')
			str += "\n";
		str += prop + ' [' + typeof (object[prop]) + ']';
	}
	
	if (str == '')
		str = '[empty]';
	
	return str;
}

/**
 * Constructeur du menu flottant des rayons.
 */
if (window.XMLHttpRequest)
{
	function CatalogMenu (catalogMenuId, HTTPRessourceUri)
	{
		var ajaxRequest = new XMLHttpRequest ();
		// Annulation de la requête s'il est impossible d'utiliser les requêtes
		// HTTP.
		if (! ajaxRequest)
			return;
		var rx_appVersion = /MSIE\s([\d\.]+)/i;
		var oldIE = false;
		
		if (rx_appVersion.exec (navigator.appVersion)
		    && (RegExp.$1 < 7.0))
	    {
	    	oldIE = true;
	    }
	    
		// Récupération de l'élément DOM correspondant au menu à compléter.
		var catalogMenu = document.getElementById (catalogMenuId);
		// Tableau des noeuds finaux du menu à compléter.
		window.dynamicMenuNodes = new Array ();
		var zIndex = 500;
		var zIndexTemp = zIndex;
		
		// Annulation de la procédure si le menu ne contient aucun élément.
		if (! catalogMenu.hasChildNodes ())
			return;
		
		// Mise en place préliminaire des styles des éléments du menu qui vont 
		// accueillir des sous-menus flottants.
		var iMax = catalogMenu.childNodes.length;
		// Parcours des premiers éléments LI du menu (grands rayons).
		for (var i = 0; i < iMax; ++i)
		{
			var grandRayon = catalogMenu.childNodes[i];
			if (grandRayon.nodeName.toLowerCase() == 'li')
			{
				var sousRayons;
				// Vérifier que cette suppression n'interfere pas avec le 
				// bon fonctionnement du menu. Les styles des grands rayons ne 
				// devraient pas avoir d'influence sur le comportement du menu.
				grandRayon.style.position = 'relative';
				grandRayon.style.display = 'inline';
				//if (oldIE) grandRayon.style.display = 'inline-table';
				grandRayon.style.zIndex = --zIndexTemp;
				// Récupération des sous-rayons de chaque grand rayon.
				// (Il n'existe qu'un seul niveau de sous-rayons)
				sousRayons = grandRayon.getElementsByTagName ('li');
				if (sousRayons.length > 0)
				{
					var jMax = sousRayons.length;
					var hMax = 0;
					for (var j = 0; j < jMax; ++j)
					{
						sousRayons[j].style.position = 'relative';
						sousRayons[j].style.display = 'inline';
						if (hMax = 0)
							hMax = sousRayons[j].offsetHeight;
						if (hMax < sousRayons[j].offsetHeight)
						{
							;
						};
						sousRayons[j].style.zIndex = 100;
						window.dynamicMenuNodes.push (sousRayons[j]);
					}
				}
			}
		}
		
		ajaxRequest.onreadystatechange = function () { 
			dynamicMenu_AJAX_onreadystatechange (ajaxRequest);
		};
		ajaxRequest.open ('GET', HTTPRessourceUri, 1);
		ajaxRequest.send (null);
		
	}
}

/**
 * Mise en place des menus flottants récupérés dynamiquement.
 */
function dynamicMenu_AJAX_onreadystatechange (ajaxRequest)
{
	if ((ajaxRequest.readyState == 4) && (ajaxRequest.status == 200))
	{
		if (typeof (document.createElement) == 'undefined')
			return;
		
		requestBody = document.createElement ('DIV');
		
		requestBody.innerHTML = ajaxRequest.responseText;
		
		/*
		var XMLDoc = ajaxRequest.responseXML;
		var body = XMLDoc.getElementsByTagName ('body').item(0);
		var menus;
		if (body.xml)
		{
			bodyEl = document.createElement('body');
			bodyEl.innerHTML = body.xml;
			body = bodyEl;
		}
		*/
		
		menus = requestBody.getElementsByTagName ('div');
		
		var rxMenuId = new RegExp ('^menu_flottant_(catalog_stand_\\d+)$');
		// Ce patron pose des pbms à IE5.5 alors on utilise l'expression qui 
		// suit, même si elle est moins pertinente.
		// var rxMenuClassName = new RegExp ('(?:^\\s*|\\s+)(catalog_stand_\\d+)(?:\\s+|\\s*$)');
		var rxMenuClassName = new RegExp ('(catalog_stand_\\d+)');
		var zIndex = 500;
		
		for (var i=0, 
		         iMax=dynamicMenuNodes.length,
		         dynamicMenuNode;
			 (i < iMax) && (dynamicMenuNode=dynamicMenuNodes[i]);
			 ++i)
		{
			
			if (rxMenuClassName.test(dynamicMenuNode.className))
			{
				dynamicMenuId = RegExp.$1;
				
				for (var j=0,
                         jMax=menus.length,
                         floattingMenuNode;
					 (j < jMax) && (floattingMenuNode=menus[j]);
					 ++j)
				{
					if (rxMenuId.test (floattingMenuNode.getAttribute('id')))
					{
						floattingMenuId = RegExp.$1;
						
						if (dynamicMenuId == floattingMenuId)
						{
							dynamicMenuNode.subMenu = floattingMenuNode.cloneNode(true);
							dynamicMenuNode.subMenu.style.position = 'absolute';
							dynamicMenuNode.appendChild (dynamicMenuNode.subMenu);
							dynamicMenuNode.subMenu.style.zIndex = zIndex;
							dynamicMenuNode.subMenu.style.top = (dynamicMenuNode.offsetHeight) + 'px';
							dynamicMenuNode.subMenu.style.left = '0px';
							dynamicMenuNode.subMenu.style.whiteSpace = 'nowrap';
							dynamicMenuNode.onmouseover = function () {
								
								if (typeof (this.timeout) != 'undefined')
									clearTimeout (this.timeout);
								this.subMenu.style.display = 'block';
								this.subMenu.style.zIndex = '1000';
								if (typeof (this.hideFlash) != 'undefined')
									this.hideFlash ();
								if (this.subMenu.style.left == '0px')
								{
									absLeft = 0;
									tmpElt = this.subMenu;
									do { absLeft += tmpElt.offsetLeft; }
									while ((tmpElt = tmpElt.offsetParent) && (tmpElt.id != 'site'));
									if (absLeft + this.subMenu.offsetWidth > 1000)
									{
										this.subMenu.style.left = (1000 - (absLeft + this.subMenu.offsetWidth))+'px';
									}
									else
									{
										this.subMenu.style.left = '0px';
									}
								}
								return true;
							}
							dynamicMenuNode.onactivate = dynamicMenuNode.onmouseover;
							dynamicMenuNode.onmouseout = function () {
								this.timeout = setTimeout ("document.getElementById('" + this.subMenu.id + "').style.display = 'none';", 10);
								if (typeof (this.showFlash) != 'undefined')
									this.showFlash ();
							}
							dynamicMenuNode.ondeactivate = dynamicMenuNode.onmouseout;
							var subListItems = dynamicMenuNode.subMenu.getElementsByTagName ('li');
							
							for (var k = 0,
								     kMax = subListItems.length,
								     subListItem;
								 (k < kMax) && (subListItem = subListItems[k]);
								 ++k)
							{
								if (subListItem.hasChildNodes())
								{
									cNode = subListItem.firstChild;
									while ((typeof (cNode) != 'undefined') && (cNode != null))
									{
										if (cNode.nodeName.toUpperCase () == 'DIV')
										{
											cNode.style.position = 'absolute';
											cNode.style.zIndex = zIndex;
											//cNode.style.width = '150px';
										}
										cNode = cNode.nextSibling;
									}
								}
							}
							for (var k = 0,
								     kMax = subListItems.length,
								     subListItem;
								 (k < kMax) && (subListItem = subListItems[k]);
								 ++k)
							{
								if (subListItem.hasChildNodes())
								{
									cNode = subListItem.firstChild;
									while ((typeof (cNode) != 'undefined') && (cNode != null))
									{
										if (cNode.nodeName.toUpperCase () == 'DIV')
										{						
											subListItem.subMenu = cNode;
											cNode.style.left = (subListItem.offsetLeft + subListItem.offsetWidth) + 'px';
											cNode.style.top = subListItem.offsetTop + 'px';
											subListItem.onmouseover = function () {
												//this.subMenu.style.left = this.offsetLeft + this.offsetWidth + 'px';
												this.subMenu.style.display = 'block';
												return false;
											};
											subListItem.onmouseout = function () {
												this.subMenu.style.display = 'none';
												return false;
											};
										}
										cNode = cNode.nextSibling;
									}
								}
							}
							for (var k = 0,
								     kMax = subListItems.length,
								     subListItem;
								 (k < kMax) && (subListItem = subListItems[k]);
								 ++k)
							{
								if (subListItem.hasChildNodes())
								{
									cNode = subListItem.firstChild;
									while ((typeof (cNode) != 'undefined') && (cNode != null))
									{
										if (cNode.nodeName.toUpperCase () == 'DIV')
										{						
											cNode.style.display = 'none';
										}
										cNode = cNode.nextSibling;
									}
								}
							}
							dynamicMenuNode.subMenu.style.display = 'none';
						}
					}
				}
			}
		}
	}
}

if (XMLHttpRequest)
{
	function ajouterPanier (sender, HTTPRessource, adressePanier)
	{
		var formElement = sender.form;
		var ajaxRequest = new XMLHttpRequest ();
		var panierContenu = document.createElement ('div');
		
		panierContenu.id = 'panierContenu';
		panierContenu.appendChild (document.createTextNode (LOCAL_MESSAGE_BOX_WAITING));
		
		var panier = MessageBox ('ajoutPanier', panierContenu, false);
		if (! panier)
			return false;
		panier.affichage = panierContenu;
		panier.affichage.msgBox = panier;
		panier.bt_panier = document.createElement ('a');
		panier.bt_panier.msgBox = panier;
		panier.bt_panier.className = 'bt_panier';
		panier.bt_panier.href=adressePanier;
		panier.bt_panier.appendChild (document.createTextNode (LOCAL_MESSAGE_BOX_BT_PANIER));
		panier.bt_panier.onclick = function () { this.msgBox.close (); return true; };
		panier.bt_continuer = document.createElement ('a');
		panier.bt_continuer.msgBox = panier;
		panier.bt_continuer.className = 'bt_continuer';
		panier.bt_continuer.href = '#';
		panier.bt_continuer.appendChild (document.createTextNode (LOCAL_MESSAGE_BOX_BT_CONTINUER));
		panier.bt_continuer.onclick = function () { this.msgBox.close(); document.location.reload(); return false; };
		
		panier.bt_OK.parentNode.removeChild (panier.bt_OK);
		panier.pied.appendChild (panier.bt_panier);
		panier.pied.appendChild (panier.bt_continuer);
		panier.bt_continuer.focus();
		
		ajaxRequest.open ('POST', HTTPRessource, 1);
		ajaxRequest.setRequestHeader ('Content-Type', 'application/x-www-form-urlencoded');
		
		ajaxRequest.onreadystatechange = function () { ajouterPanier_AJAX_onreadystatechange (ajaxRequest); };
		
		var postData = '';
		for (var i = 0,
		         iMax = formElement.length,
		         inputElement;
		         (i < iMax) && (inputElement = formElement.elements[i]);
		         ++i)
		{
			switch (inputElement.type)
			{
				case 'text':
				case 'hidden':
					postData += (postData == '' ? '' : '&') + inputElement.name + '=' + inputElement.value;
			}
		}
		if (sender.name) postData += (postData == '' ? '' : '&') + sender.name + '=' + sender.value;
		
		ajaxRequest.send (postData);
		
		return true;
	}
	
	function ajouterPanier_AJAX_onreadystatechange (ajaxRequest) {
		if (ajaxRequest.readyState == 4 && ajaxRequest.status == '200')
		{
			var panierContenu = document.getElementById ('panierContenu');
			while (panierContenu.firstChild)
				panierContenu.removeChild  (panierContenu.firstChild);
			
			ajaxRequest.setResponseHeader &&
				ajaxRequest.setResponseHeader ('text/xml');
			
			XMLDoc = ajaxRequest.responseXML;
			if ((typeof(XMLDoc) == 'undefined') || (! XMLDoc.hasChildNodes()))
				return false;
			body = XMLDoc.getElementsByTagName ('body').item(0);
			if (body.xml)
			{
				tmpBody = document.createElement ('body');
				tmpBody.innerHTML =body.xml;
				body = tmpBody;
			}
			while (panierContenu.firstChild)
				panierContenu.removeChild (panierContenu.firstChild);
			el = body.firstChild;
			while ((typeof (el) != 'undefined') && (el != null))
			{
				if (el.id == 'infos_panier')
				{
					elts = el.getElementsByTagName ('span');
					var qtt = elts.length > 0?elts[0].innerHTML:'0';
					if (qtt &&  (obj = document.getElementById('widgetPanierQtt')))
					{
						obj.innerHTML = qtt;
					}
					var montant = elts.length > 1?elts[1].innerHTML:'0';
					if (montant &&  (obj = document.getElementById('widgetPanierMontant')))
					{
						obj.innerHTML = montant;
					}
				}
				else if (el.id == 'produit_panier')
				{
					panierContenu.appendChild (el.cloneNode (true));
				}
				el = el.nextSibling;
			}
			
		}
		
		return true;
	}
}

function switchPromo (id_div1, id_div2, id_radio1)
{	
	var obj_radio1 = document.getElementById(id_radio1);

	var obj_table1 = document.getElementById(id_div1);
	var obj_table2 = document.getElementById(id_div2);
 	
 	if (! (obj_radio1 && obj_table1 && obj_table2))
 		return;
 	
	if (obj_radio1.checked == true){
		obj_table1.className = "tabpromo";
		obj_table2.className = "hidden";
	}
	else{
		obj_table2.className = "tabpromo";
		obj_table1.className = "hidden";

	}
}

function hidden (id_radio1, id_select)
{
	var obj_radio1 = document.getElementById(id_radio1);
	var obj_select = document.getElementById(id_select);
	
	if (! (obj_radio1 && obj_select))
 		return;
 	
	if (obj_radio1.checked == true){
		obj_select.className = "hidden";
	}
	else{
		obj_select.className = "";
	}

} 

function appearBtnValid (obj_radio1, id_div1)
{
	var obj_valid = document.getElementById ('boutonValider');
	var obj_table1 = document.getElementById(id_div1);
	
	if (! (obj_radio1 && obj_table1))
 		return;
 	
	if (obj_radio1.checked == false){
		return;
		}
	obj_valid.parentNode.removeChild(obj_valid); 
	obj_table1.appendChild(obj_valid);

}

function checkPromo (id_radio1, id_radio2)
{
	var obj_radio1;
	var obj_radio2;
	if (typeof (id_radio1) == 'string')
		var obj_radio1 = document.getElementById(id_radio1);
	else
		var obj_radio1 = id_radio1;
	
	if (typeof (id_radio1) == 'string')
		obj_radio2 = document.getElementById(id_radio2);
	else
		obj_radio2 = id_radio2;
	
	if (obj_radio1.checked == true){
		obj_radio2.checked = true;
	}
}

function decheckedPromo (id_radio)
{
	var obj_radio;
	if (typeof (obj_radio) == 'string')
		obj_radio = document.getElementById(id_radio);
	else
		obj_radio = id_radio;
	
	obj_radio.checked = true;
}

function switchView (id_div)
{
	var obj_parent;
	var nb_child = 0;
	
	obj_parent = document.getElementById(id_div).parentNode;
	nb_child = obj_parent.childNodes.length;

	for (var i=0; i < nb_child ;++i )
	{ 
		if (id_div != obj_parent.childNodes[i].id)
		{
			if (obj_parent.childNodes[i].style)
				obj_parent.childNodes[i].style.display="none";
		}
		else
		{
			if (obj_parent.childNodes[i].style)
			obj_parent.childNodes[i].style.display="";
		}
	}
}

/**
 * FORM VALIDATION FUNCTIONS
 */

/**
 * Efface la valeur par dÃ©faut d'une boite de texte.
 */
function clearInputDefaultValue (inputElement)
{
	if (inputElement.value != null 
	    && inputElement.defaultValue != null)
	{
		if (inputElement.value == inputElement.defaultValue)
			inputElement.value = '';
	}
}

/**
 * RÃ©tablit la valeur par dÃ©faut d'une boite de texte.
 */
function restoreInputDefaultValue (inputElement)
{
	if (inputElement != null 
	    && inputElement.value != null 
	    && inputElement.defaultValue != null)
	{
		if (inputElement.value == '')
			inputElement.value = inputElement.defaultValue;
	}
}

/**
* Affiche 4 ligne d' un tableau
*/
function rowsfour (HTMLTableElement)
{
	var nb = HTMLTableElement.rows.length;
	for (var i=5; i < nb; ++i)
	{
		HTMLTableElement.rows[i].style.display = 'none';
	}
}
/**
* Affiche toutes les lignes d'un tableau
*/
function freerows (HTMLTableElement)
{ 
	var nb = HTMLTableElement.rows.length;
	for (var i=0; i<nb; ++i)
	{
		HTMLTableElement.rows[i].style.display = '';
	}
}
/**
*
*/

/**
* fonction switch view2 qui met tout le monde invisble
*/
  function switchView2 (id_div)
{
	var obj_parent;
	var nb_child = 0;
	obj_parent = document.getElementById(id_div).parentNode;
	nb_child = obj_parent.childNodes.length;
	for (var i=0; i < nb_child ;++i )
	{ 
		if (id_div != obj_parent.childNodes[i].id)
		{
			if (obj_parent.childNodes[i].style)
				obj_parent.childNodes[i].style.display="none";
		}
	}
}
/**
 * Valide le formulaire rapide de newsletter. 
 */
function validateNewsletterWidgetForm (formElement)
{
	if (formElement.news_mail)
	{
		if (validateEmailString (formElement.news_mail.value))
			return true
		else
		{
			MessageBox ("alert", LOCAL_EMAIL_ADDRESS_NOT_VALID);
			return false;
		}
	}
	/* If structure has changed, we can't validate but this is not user's fault.
	 * Check what's wrong on server side.
	 */
	return true;
}

/**
 * Indique si une adresse courriel est correctement formatée.
 */
function validateEmailString (emailStr)
{
	var rxEmailPattern = new RegExp (
		'^[-_\.a-zA-Z0-1]+@([-_a-zA-Z0-1]+\.)+[a-zA-Z]{2,}$');
	return emailStr.match (rxEmailPattern)?true:false;
}


/**
 * Aligne et etend horizontalement les enfants directs d'un element.
 * Utilise pour etendre le menu du catalogue dans l'entete.
 */
function hScaleChildren (DOMContainer)
{
	switch ('undefined')
	{
		case typeof (DOMContainer):
		case typeof (DOMContainer.hasChildNodes):
		case typeof (Array.prototype.push):
			return;
	}
	
	if (! DOMContainer.hasChildNodes ())
		return;
	
	var maxWidth = DOMContainer.offsetWidth;
	var maxWidth = 1000;
	var lineOfChildren = new Array;
	var lastOffsetTop = 0;
	var cumulWidth = 0;
	var totalWidth = 0;
	var ELEMENT_NODE = 1;
	
	// Supprime les noeuds du DOM qui ne sont pas des elements HTML.
	if ((typeof (DOMContainer.firstChild) != 'undefined')
	    && (typeof (DOMContainer.nextSibling) != 'undefined')
	    && (typeof (DOMContainer.nodeType) != 'undefined')
	    && (typeof (DOMContainer.removeChild) != 'undefined')
	   )
	{
		var DOMChild = DOMContainer.firstChild;
		var temp;
		while (DOMChild != null)
		{
			temp = DOMChild.nextSibling;
			if (DOMChild.nodeType != ELEMENT_NODE)
			{
				DOMChild.parentNode.removeChild (DOMChild);
			}
			DOMChild = temp;
		}
	}
	
	
	var DOMChild = DOMContainer.firstChild;
	
	for (var DOMChild = DOMContainer.firstChild; 
	     typeof (DOMChild) != 'undefined' && DOMChild !== null;
	     DOMChild = DOMChild.nextSibling)
	{
		if ((maxWidth < cumulWidth + DOMChild.offsetWidth)
		    || (
		    	((typeof(DOMChild.nextSibling) != 'undefined') && (DOMChild.nextSibling != null))
		    	&& (DOMChild.offsetHeight > DOMChild.nextSibling.offsetHeight)
		       )/* 
		Ce code devait permettre de coincer les rubriques marquetees entre deux autres, mais ne marche pas bien... 
		    || ((typeof (DOMChild.nextSibling) != 'undefined') 
		        && (DOMChild.nextSibling.id.indexOf('markete') > -1) 
		        && (DOMChild.id.indexOf('markete') == -1))*/)
		{
			var emptyWidth = maxWidth - cumulWidth;
			var lineCumulWidth = 0; // Cumul de la largeur occupee apres traitement
			var lastIndex = lineOfChildren.length - 1;
			var fillWidth = Math.round(emptyWidth / lineOfChildren.length);
			
			for (var i=0, child = lineOfChildren[i];
			     i < lineOfChildren.length;
			     child = lineOfChildren[++i])
			{
				if (i == lastIndex)
				{
					child.style.width = (Math.round (maxWidth - lineCumulWidth)) + 'px';
				}
				else
				{
					child.style.width += (child.offsetWidth + fillWidth) + 'px';
					lineCumulWidth += child.offsetWidth; 
				}
			}
			cumulWidth = 0;
			lineOfChildren = new Array ();
		}
		 
		lineOfChildren.push (DOMChild);
		cumulWidth += DOMChild.offsetWidth;
	}
	
	if (lineOfChildren.length > 0)
	{
		var emptyWidth = maxWidth - cumulWidth;
		var lineCumulWidth = 0; // Cumul de la largeur occupee apres traitement
		var lastIndex = lineOfChildren.length - 1;
		var fillWidth = Math.round(emptyWidth / lineOfChildren.length);
		
		for (var i=0, child = lineOfChildren[i];
		     i < lineOfChildren.length;
		     child = lineOfChildren[++i])
		{
			if (i == lastIndex)
			{
				child.style.width = (Math.round (maxWidth - lineCumulWidth)) + 'px';
			}
			else
			{
				child.style.width += (child.offsetWidth + fillWidth) + 'px';
				lineCumulWidth += child.offsetWidth; 
			}
		}
		cumulWidth = 0;
		lineOfChildren = new Array ();
	}
}

/**
 * Raccourci permettant de creer un element DOM DIV et de lui attribuer un 
 * nom de classe CSS.
 * 
 * Utilise par ModalElement, DropShadow.
 * 
 * @param string className Nom de la classe a affecter au DIV.
 */
if (typeof (document.createElement) != 'undefined')
{
	function newDiv (className)
	{
		var DOMElement = document.createElement ('DIV');
		DOMElement.className = className;
		return DOMElement;
	}
}

/**
 * Transforme un element HTML de type bloc en element modal.
 * L'element modal obtient l'exclusivité du focus. L'arriere plan hors de la
 * surface de l'element devient grisee et indisponible a  la navigation.
 * Pour fermer l'element modal, il faut invoquer la methode close().
 */
if (document.createElement)
{
	function ModalElement (DOMObject)
	{
		var rx_appVersion = /MSIE\s([\d\.]+)/i;
		var oldIE = false;
		
		if (rx_appVersion.exec (navigator.appVersion)
		    && (RegExp.$1 < 7.0))
		{
			oldIE = true;
			document.body.forceScrollLock = document.body.scrollTop;
			document.body.oldOnscroll = document.body.onscroll;
			document.body.onscroll = function () { scrollTo(document.body.scrollLeft, document.body.forceScrollLock); };
			
			// Masque les elements SELECT du document pour ne pas detruire la presentation du modal box.
			var selects = document.getElementsByTagName('SELECT');
			
			for (var i = 0, DOMElement; i < selects.length && (DOMElement = selects[i]); ++i)
			{
				DOMElement.modalReversal = new Object ();
				DOMElement.modalReversal.visibility = DOMElement.style.visibility;
				DOMElement.style.visibility = 'hidden';
			}
		}
		
		var mw = DOMObject.modalWindow = newDiv ('modal_box');
		/* // Effectue par DropShadow
		var ds = mw.dropShadow = newDiv ('dropShadow');
		ds.top = newDiv ('bt');
		ds.leftTop = newDiv ('blt');
		ds.rightTop = newDiv ('brt');
		ds.left = newDiv ('bl');
		ds.right = newDiv ('br');
		ds.bottom = newDiv ('bb');
		ds.leftBottom = newDiv ('blb');
		ds.rightBottom = newDiv ('brb');
		ds.inner = newDiv ('inner');
		ds.inner2 = newDiv ('inner2');
		
		mw.appendChild (ds);
		ds.appendChild (ds.leftTop);
		ds.appendChild (ds.rightTop);
		ds.appendChild (ds.top);
		ds.appendChild (ds.left);
		ds.appendChild (ds.right);
		ds.appendChild (ds.leftBottom);
		ds.appendChild (ds.rightBottom);
		ds.appendChild (ds.bottom);
		*/
		mw.appendChild (DOMObject);
		
		DOMObject.close = ModalElement_close;
		
		DOMObject.modalBackground = newDiv ('modal_bg');
		if (oldIE)
			DOMObject.modalBackground.style.marginTop = document.body.scrollTop + 'px';
		
		document.body.appendChild (DOMObject.modalBackground);
		document.body.appendChild (DOMObject.modalWindow);
		
		mw.style.visibility = 'hidden';
		
		var marginTop = - (DOMObject.offsetHeight / 2);
		if (oldIE)
			marginTop+= document.body.scrollTop;
		
		mw.style.marginLeft = (-(DOMObject.offsetWidth / 2))+'px';
		mw.style.marginTop = (marginTop)+'px';
		
		/* Appilque par DropShadow
		ds.style.height = mw.offsetHeight + 'px';
		ds.style.width = mw.offsetWidth + 'px';
		ds.top.style.left = 
			ds.bottom.style.left = 
			(ds.leftTop.offsetWidth + ds.leftTop.offsetLeft) + 'px';
		ds.top.style.width = 
			ds.bottom.style.width = 
			(ds.rightTop.offsetLeft - ds.top.offsetLeft)+'px';
		
		ds.left.style.top = 
			ds.right.style.top =
			(ds.leftTop.offsetHeight + ds.leftTop.offsetTop) + 'px';
		ds.left.style.height =
			ds.right.style.height =
			(ds.bottom.offsetTop - ds.left.offsetTop) + 'px';
		*/
		
		mw.dropShadow = DropShadow (mw);
		
		DOMObject.modalWindow.style.visibility = '';
		
		
		if (this.onload)
			this.onload ();
		
		return DOMObject;
	}
	
	function ModalElement_close ()
	{
		this.modalBackground.parentNode.removeChild (this.modalBackground);
		
		this.modalWindow.parentNode.removeChild (this.modalWindow);
		if (this.onclose)
			this.onclose ();
		
		
		var selects = document.getElementsByTagName('SELECT');
		
		for (var i = 0, DOMElement; i < selects.length && (DOMElement = selects[i]); ++i)
		{
			if (typeof (DOMElement.modalReversal) != 'undefined')
			{
				DOMElement.style.visibility = DOMElement.modalReversal.visibility;
				DOMElement.modalReversal = undefined;
			}
		}
		
		if ((typeof (document.body.forceScrollLock) != 'undefined'))
		{
			document.body.forceScollLock = undefined;
			document.body.onscroll = document.body.oldOnscroll;
		}
		
		return this;
	}
}

function DropShadow (DOMElement)
{
	var ds = newDiv ('dropShadow');
	
	ds.target = DOMElement;
	
	ds.top = newDiv ('bt');
	ds.leftTop = newDiv ('blt');
	ds.rightTop = newDiv ('brt');
	ds.left = newDiv ('bl');
	ds.right = newDiv ('br');
	ds.bottom = newDiv ('bb');
	ds.leftBottom = newDiv ('blb');
	ds.rightBottom = newDiv ('brb');
	ds.inner = newDiv ('inner');
	ds.inner2 = newDiv ('inner2');
	
	ds.target.appendChild (ds);
	ds.appendChild (ds.leftTop);
	ds.appendChild (ds.rightTop);
	ds.appendChild (ds.top);
	ds.appendChild (ds.left);
	ds.appendChild (ds.right);
	ds.appendChild (ds.leftBottom);
	ds.appendChild (ds.rightBottom);
	ds.appendChild (ds.bottom);
	
	ds.resize = DropShadow_resize;
	
	ds.resize ();
	
	return ds;
}

function DropShadow_resize ()
{
	this.style.top = '0';
	this.style.left = '0';
	this.style.zIndex = this.target.style.zIndex - 1;
	this.style.height = this.target.offsetHeight + 'px';
	this.style.width = this.target.offsetWidth + 'px';
	
	this.top.style.left = 
	this.bottom.style.left = 
		(this.leftTop.offsetWidth + this.leftTop.offsetLeft) + 'px';
	this.top.style.width = 
	this.bottom.style.width = 
		(this.rightTop.offsetLeft - this.top.offsetLeft)+'px';
	
	this.left.style.top = 
	this.right.style.top =
		(this.leftTop.offsetHeight + this.leftTop.offsetTop) + 'px';
	this.left.style.height =
	this.right.style.height =
		(this.bottom.offsetTop - this.left.offsetTop) + 'px';
}

/**
 * Affiche un zoom d'une image dans un calque modal.
 */
function displayLargeImage (strImageHRef)
{
	if (! ModalElement || ! document.body.appendChild)
		return false;
	
	var imgElt;
	imgElt = document.createElement ('img');
	imgElt.title = LOCAL_IMAGE_CLOSE_MODAL;
	imgElt.onclick = function () { this.close(); };
	
	imgElt.style.cursor = 'hand';
	if (imgElt.style.cursor == '')
		imgElt.style.cursor = 'pointer';
	imgElt.style.display = 'none';
	
	imgElt.onload = function () { 
		this.onload = ''; this.style.display = 'block'; ModalElement (this);
	};
	
	if (imgElt.style.display == 'none')
		document.body.appendChild (imgElt);
	
	imgElt.src = strImageHRef;
	
	return true;
}

/**
 * Affiche du texte dans une modal box.
 * strMessage peut etre une chaine de caracteres ou un element HTML visuel.
 */
function MessageBox (strType, strMessage, cloneDOMObject, isURI, onloadFunc)
{
	if (! ModalElement || !document.createElement || !document.appendChild)
	{
		switch (strType)
		{
			case 'alert': alert (strMessage);
		}
		return null;
	}
	
	if (typeof (cloneDOMObject) == 'undefined')
		cloneDOMObject = true;
	
	if (typeof (isURI) == 'undefined')
		isURI = false;
	
	var msgBox = document.createElement ('DIV');
	msgBox.onload = onloadFunc;
	msgBox.className = 'messageBox';
	msgBox.contenu = document.createElement ('DIV');
	msgBox.contenu.msgBox = msgBox;
	msgBox.contenu.className = strType;
	msgBox.contenu.style.position = 'relative';
	msgBox.appendChild (msgBox.contenu);
	msgBox.entete = document.createElement('DIV');
	msgBox.entete.msgBox = msgBox;
	msgBox.entete.className = 'entete';
	msgBox.contenu.appendChild (msgBox.entete);
	msgBox.message = document.createElement ('DIV');
	msgBox.message.msgBox = msgBox;
	msgBox.message.className = 'message';
	if (isURI == true)
	{
		var msg = LOCAL_MESSAGE_BOX_WAITING;
		var msgLines = msg.split("\n");
		var strLine;
		for (var i=0; i < msgLines.length, strLine = msgLines[i]; ++i)
		{
			if (i > 0)
				msgBox.message.appendChild (document.createElement ('BR'));
			msgBox.message.appendChild (document.createTextNode (strLine));
		}
		msgBox.dynamicRequest = new XMLHttpRequest ();
		msgBox.dynamicRequest.onreadystatechange = function () { MessageBox_dynamicRequest_onreadystatechange (msgBox); };
		msgBox.dynamicRequest.open ('GET', strMessage, 1);
		msgBox.dynamicRequest.send (null);
		
	}
	else if (typeof (strMessage) == 'string')
	{
		msgLines = strMessage.split("\n");
		for (var i=0; i < msgLines.length, strLine = msgLines[i]; ++i)
		{
			if (i > 0)
				msgBox.message.appendChild (document.createElement ('BR'));
			msgBox.message.appendChild (document.createTextNode (strLine));
		}
	}
	else
	{
		msgBox.message.appendChild (cloneDOMObject ? strMessage.cloneNode (true) : strMessage );
	}
	msgBox.contenu.appendChild (msgBox.message);
	msgBox.piedConteneur = document.createElement ('DIV');
	msgBox.piedConteneur.msgBox = msgBox;
	msgBox.piedConteneur.className = 'pied';
	msgBox.pied = document.createElement ('div');
	msgBox.piedConteneur.appendChild (msgBox.pied);
	var sep = document.createElement ('div');
	sep.style.clear = 'both';
	msgBox.piedConteneur.appendChild (sep);
	msgBox.contenu.appendChild (msgBox.piedConteneur);
	msgBox.bt_OK = document.createElement ('A');
	msgBox.bt_OK.href = "#";
	msgBox.bt_OK.msgBox = msgBox;
	msgBox.bt_OK.className = 'btOK';
	msgBox.bt_OK.appendChild (document.createTextNode(LOCAL_MESSAGE_BOX_OK));
	msgBox.bt_OK.onclick = function () { this.msgBox.close (); return false;};
	msgBox.pied.appendChild (msgBox.bt_OK);
	
	return ModalElement (msgBox);
}

function MessageBox_dynamicRequest_onreadystatechange (MsgBox)
{
	if ((MsgBox.dynamicRequest.readyState == 4) && (MsgBox.dynamicRequest.status == 200))
	{
		while (MsgBox.message.hasChildNodes ())
			MsgBox.message.removeChild (MsgBox.message.firstChild);
		MsgBox.message.innerHTML = MsgBox.dynamicRequest.responseText;
		
		if (typeof (MsgBox.onload) == 'function')
			MsgBox.onload ();
	}
}

/**
 * Classe de gestion du panier a  utiliser en parallele a AJAX.
 */
function Panier (){
  this.add = Panier_add; 
  this.displaypopup = Panier_displaypopup;
}
function Panier_add(){
	if (true)
		return false;
	return false;
}
function Panier_displaypopup ()
{
	if (! ModalElement || ! document.body.appendChild)
		return false;
	return false;
}

/**
 * Rassemble les éléments de formulaire dans un tableau, à partir d'un noeud
 * DOM donné par son identifiant ou un référence à l'objet.
 */

function getFormFieldsChildrenOf (domNode)
{
	var result = new Array ();
	if (typeof (domNode) == 'string')
		domNode = document.getElementById (domNode);
	
	if (typeof (domNode) == 'undefined')
		return result;
	
	if (typeof (domNode.getElementsByTagName) == 'undefined')
		return result;
	
	var formFields = domNode.getElementsByTagName ('INPUT');
	for (var i=0; i < formFields.length; ++i)
		result.push (formFields[i]);
	
	formFields = domNode.getElementsByTagName ('SELECT');
	for (var i=0; i < formFields.length; ++i)
		result.push (formFields[i]);
	
	formFields = domNode.getElementsByTagName ('TEXTAREA');
	for (var i=0; i < formFields.length; ++i)
		result.push (formFields[i]);
	
	return result;
}

/**
 * Active les champs de formulaire enfants d'un noeud HTML par son id ou un 
 * objet DOM
 */
function activateFormFieldsChildrenOf (domNode)
{
	if (typeof (domNode) == 'string')
		domNode = document.getElementById (domNode);
	
	var formFields = getFormFieldsChildrenOf (domNode);
	
	for (var i = 0; i < formFields.length; ++i)
		formFields[i].disabled = '';
	
	domNode.style.display = '';
} 

/**
 * Désactive les champs de formulaire, enfants d'un noeud HTML par son id ou 
 * une référence à son objet DOM.
 */
function deactivateFormFieldsChildrenOf (domNode, hide)
{
	if (typeof (domNode) == 'string')
		domNode = document.getElementById (domNode);
	
	if (typeof (hide) == 'undefined')
		hide = false;
	var formFields = getFormFieldsChildrenOf (domNode);
	
	for (var i = 0; i < formFields.length; ++i)
		formFields[i].disabled = 'disabled';
	
	if (hide)
		domNode.style.display = 'none';
} 

/***********************************************
* Pausing up-down scroller- © Dynamic Drive (www.dynamicdrive.com)
* This notice MUST stay intact for legal use
* Visit http://www.dynamicdrive.com/ for this script and 100s more.
***********************************************/

function pausescroller(content, divId, divClass, delay){
    this.content=content //message array content
    this.tickerid=divId //ID of ticker div to display information
    this.delay=delay //Delay between msg change, in miliseconds.
    this.mouseoverBol=0 //Boolean to indicate whether mouse is currently over scroller (and pause it if it is)
    this.hiddendivpointer=1 //index of message array for hidden div
    document.write('<div id="'+divId+'" class="'+divClass+'" style="position: relative; overflow: hidden; "><div class="innerDiv" style="position: absolute; overflow: hidden;" id="'+divId+'1">'+content[0]+'</div><div class="innerDiv" style="position: absolute; visibility: hidden; overflow: hidden;" id="'+divId+'2">'+content[1]+'</div></div>')
    var scrollerinstance=this
    if (window.addEventListener) //run onload in DOM2 browsers
    window.addEventListener("load", function(){scrollerinstance.initialize()}, false)
    else if (window.attachEvent) //run onload in IE5.5+
    window.attachEvent("onload", function(){scrollerinstance.initialize()})
    else if (document.getElementById) //if legacy DOM browsers, just start scroller after 0.5 sec
    setTimeout(function(){scrollerinstance.initialize()}, 500)
}

// -------------------------------------------------------------------
// initialize()- Initialize scroller method.
// -Get div objects, set initial positions, start up down animation
// -------------------------------------------------------------------

pausescroller.prototype.initialize=function(){
    this.tickerdiv=document.getElementById(this.tickerid)
    this.visiblediv=document.getElementById(this.tickerid+"1")
    this.hiddendiv=document.getElementById(this.tickerid+"2")
    this.visibledivtop=parseInt(pausescroller.getCSSpadding(this.tickerdiv))
    //set width of inner DIVs to outer DIV's width minus padding (padding assumed to be top padding x 2)
    this.visiblediv.style.width=this.hiddendiv.style.width=this.tickerdiv.offsetWidth-(this.visibledivtop*2)+"px"
    this.getinline(this.visiblediv, this.hiddendiv)
    this.hiddendiv.style.visibility="visible"
    var scrollerinstance=this
    document.getElementById(this.tickerid).onmouseover=function(){scrollerinstance.mouseoverBol=1}
    document.getElementById(this.tickerid).onmouseout=function(){scrollerinstance.mouseoverBol=0}
    if (window.attachEvent) //Clean up loose references in IE
    window.attachEvent("onunload", function(){scrollerinstance.tickerdiv.onmouseover=scrollerinstance.tickerdiv.onmouseout=null})
    setTimeout(function(){scrollerinstance.animateup()}, this.delay)
}


// -------------------------------------------------------------------
// animateup()- Move the two inner divs of the scroller up and in sync
// -------------------------------------------------------------------

pausescroller.prototype.animateup=function(){
    var scrollerinstance=this
    if (parseInt(this.hiddendiv.style.top)>(this.visibledivtop+5)){
    this.visiblediv.style.top=parseInt(this.visiblediv.style.top)-5+"px"
    this.hiddendiv.style.top=parseInt(this.hiddendiv.style.top)-5+"px"
    setTimeout(function(){scrollerinstance.animateup()}, 50)
    }
    else{
    this.getinline(this.hiddendiv, this.visiblediv)
    this.swapdivs()
    setTimeout(function(){scrollerinstance.setmessage()}, this.delay)
    }
}

// -------------------------------------------------------------------
// swapdivs()- Swap between which is the visible and which is the hidden div
// -------------------------------------------------------------------

pausescroller.prototype.swapdivs=function(){
    var tempcontainer=this.visiblediv
    this.visiblediv=this.hiddendiv
    this.hiddendiv=tempcontainer
}

pausescroller.prototype.getinline=function(div1, div2){
    div1.style.top=this.visibledivtop+"px"
    div2.style.top=Math.max(div1.parentNode.offsetHeight, div1.offsetHeight)+"px"
}

// -------------------------------------------------------------------
// setmessage()- Populate the hidden div with the next message before it's visible
// -------------------------------------------------------------------

pausescroller.prototype.setmessage=function(){
    var scrollerinstance=this
    if (this.mouseoverBol==1) //if mouse is currently over scoller, do nothing (pause it)
    setTimeout(function(){scrollerinstance.setmessage()}, 100)
    else{
    var i=this.hiddendivpointer
    var ceiling=this.content.length
    this.hiddendivpointer=(i+1>ceiling-1)? 0 : i+1
    this.hiddendiv.innerHTML=this.content[this.hiddendivpointer]
    this.animateup()
    }
}

pausescroller.getCSSpadding=function(tickerobj){ //get CSS padding value, if any
    if (tickerobj.currentStyle)
    return tickerobj.currentStyle["paddingTop"]
    else if (window.getComputedStyle) //if DOM2
    return window.getComputedStyle(tickerobj, "").getPropertyValue("padding-top")
    else
    return 0
}
