if(typeof QMI === "undefined" || !QMI) {
    var QMI = {};
}

if(typeof QMI.globals === "undefined" || !QMI.globals) {
    QMI.globals = {};
}

if(typeof QMI.util === "undefined" || !QMI.util) {
    QMI.util = {};
}

if(typeof QMI.widget === "undefined" || !QMI.widget) {
    QMI.widget = {};
}

if(typeof QMI.lang === "undefined" || !QMI.lang) {
    QMI.lang = {};
}

if(typeof QMI.util.Ajax === "undefined" || !QMI.util.Ajax) {
    QMI.util.Ajax = {};
}

QMI.util.Promotion = function (promoElement, cart, cancelCaption) {
    this.imagePopup = this.initializeImagePopup();
	this.promoGId = promoElement;
	cart.globalPromotion = this;
    this.init(cancelCaption);
}

QMI.util.Promotion.prototype.init = function(cancelCaption) {
    this.wireCartControls();
    this.wireAddPromoBox(cancelCaption);
}

QMI.util.Promotion.prototype.updatePromo = 	function (promoText) {
	 if(this.promoGId) {
     	this.promoGId.innerHTML = promoText;
     }
          
    this.init();   
};

QMI.util.Promotion.prototype.showImagePopup = function (e, popup) {
    e = e || event;

    popup.show();
    YAHOO.util.Event.preventDefault(e);   
}



QMI.util.Promotion.prototype.wireCartControls = function (){
	var imagePopLnk = YAHOO.util.Dom.getElementsByClassName('imagePopupLnk', 'a');
    YAHOO.util.Event.addListener(imagePopLnk, "click", this.showImagePopup, this.imagePopup);
}

QMI.util.Promotion.prototype.wireAddPromoBox = function (cancelCaption){
	// PROMO CODE BOX
    var pCodeBox = document.getElementById("promoCodeBox");
    var pCodeBoxH3 = pCodeBox.getElementsByTagName("h3")[0];
    var pCodeBoxLink = document.getElementById("lnkAddNewPromo");
    pcbox = new QMI.widget.PromoCodeBox(pCodeBox, pCodeBoxH3, pCodeBoxLink, {cancelBtnText: cancelCaption});
}

QMI.util.Promotion.prototype.initializeImagePopup = function() {
    var popup = new YAHOO.widget.Panel("productImagePopup", {
        width:"400px",
        fixedcenter:true,
        constraintviewport: false,
        underlay:"none",
        modal: true,
        close:true,
        visible:false,
        draggable:false
    });

    popup.render();
    return popup;
}

/**
 * Hijacks the submit buttons of a given form and causes them to make an XHR
 * call instead of a standard post to the server.
 * @constructor
 * @requires YAHOO.util.Dom
 * @requires YAHOO.util.Event
 * @requires YAHOO.util.Connect
 * @requires YAHOO.lang.JSON
 * @requires QMI.globals
 * @param {String|HTMLElement} tableEl An ID or reference for a table element
 *                                     representing the cart.
 * @param {Object}         userConfig  An object containing optional config 
 *                                     information used to override defaults
 * 
 */
QMI.widget.Cart = function (tableEl, userConfig) {
    this.cfg = {
        submitHijackClassName: "formsubmitter",
        delBtnAnchorText: "Effacer",
        delBtnClassName: "effacer",
        btnMoveToWishlistClassName: "plusTard",
        delSubmitElId: "refresh",
        delWishlistSubmitElId: "submitWishlist",
        delItemFromColor: "#FF0000",
        delItemToColor: "#FFFFFF",
        newItemFromColor: "#FFFF00",
        newItemToColor: "#FFFFFF",
        changedSubmitElId: "refresh",
        changedItemFromColor: "#FFFF00",
        changedItemToColor: "#FFFFFF",
        qtyFieldClassName: "qty",
        suggBoxClassName: "suggestion",
        highlightTimeout: 750,
        priceValueElClassName: "total",
        errorMessagesElId: "error-messages",
        errorClassName: "error",
        suggBoxId: "product-window",
        crossSellFragmentPanelId: "fragment-panel",
        crossSellFragmentHdId: "fragment-hd",
        crossSellFragmentBdId: "fragment-bd",
        crossSellFragmentFtId: "fragment-ft",
        auxPanelCloseBtnClassName: "popClose",
        oldPriceClassName: "old-price",
        qtyTotalElId: "qtyTotal"
    };
    for (var key in userConfig) {
        if (userConfig.hasOwnProperty(key)) {
            this.cfg[key] = userConfig[key];
        }
    }
    
    this.oldCart = this.cfg.oldCart || null;
    this.delSubmitEl = YAHOO.util.Dom.get(this.cfg.delSubmitElId);
    this.delSubmitWishlistEl = YAHOO.util.Dom.get(this.cfg.delWishlistSubmitElId);
    this.changedSubmitEl = YAHOO.util.Dom.get(this.cfg.changedSubmitElId);
    this.tableEl = YAHOO.util.Dom.get(tableEl);
    this.formEl = YAHOO.util.Dom.getAncestorByTagName(this.tableEl, "form");
    this.totalEl = YAHOO.util.Dom.getElementsByClassName(this.cfg.priceValueElClassName, null, this.tableEl.tFoot)[0];
    this.errorListEl = YAHOO.util.Dom.get(this.cfg.errorMessagesElId);
    this.globalPromotion = null;
    this.qtyTotalEl = YAHOO.util.Dom.get(this.cfg.qtyTotalElId);
    
    var suggPanel = YAHOO.util.Dom.get(this.cfg.suggBoxId);
	this.suggPanel = new YAHOO.widget.Panel(suggPanel, {
			width: "574px",
			fixedcenter: true,
			constraintoviewport: true,
			underlay: "none",
			close: true,
			visible: false,
			draggable: false,
			modal: true});
	this.suggPanel.render(document.body);
	suggPanel.style.display = "block"; // set to block since it's hidden in CSS to avoid content flicker
	// store default class names found in panel for later resetting
	this.pnlDefaults = {
		panelClasses: this.suggPanel.element.className, 
		hdClasses: this.suggPanel.header.className,
		bdClasses: this.suggPanel.body.className,
		ftClasses: this.suggPanel.footer.className
	};

    if (this.tableEl) {
        var cartObj = this;
        var cfg = this.cfg;
        if (this.formEl && this.cfg.submitHijackClassName && !YAHOO.util.Dom.hasClass(this.formEl, "hijacked")) {
            function submitButtonHandler(e) {
                e = e || event;
                var callback = {
                    success: function (o) {
                        if (o.responseText) {
                            if (cartObj.oldCart) {
                                var response = YAHOO.lang.JSON.parse(o.responseText);
                                // Store the item template
                                cartObj.itemTemplate = response.itemTemplate;
                                
                                // Clear previous errors
                                cartObj.errorListEl.innerHTML = "";
                                
                                // Run through both carts and see if there are any differences
                                //   cartObj available through Cart closure
                                cartObj.updateCart(response.cart, cartObj.oldCart.cart);
                                
                                // Store new cart for next compare
                                cartObj.oldCart.cart = response.cart;
                                
                                //update the ACH global promotion
                                cartObj.globalPromotion.updatePromo(response.GlobPromo);
                                
                                cartObj.wireBuyNow();
                            }
                        }
                    },
                    failure: function () {}
                };
                var frm = YAHOO.util.Dom.getAncestorByTagName(this, "form");
                var formData = "";
                for (var i = 0; frm.elements[i]; i += 1) {
                	var isValid = false;
                    var t = frm.elements[i].getAttribute("type");
                    if (t && (t.toLowerCase() === "checkbox" || t.toLowerCase() === "radio")) {
                    	if (frm.elements[i].checked) {
                    		isValid = true;
                    	}
                    } else if (t && t.toLowerCase() !== "submit") {
                        isValid = true;
                    } else if (!t) {
                    	isValid = true;
                    }

                    if (isValid) {
                        formData += frm.elements[i].name + "=" + frm.elements[i].value + "&";
                    }
                    	
                }
                formData += this.name + "=" + this.value;
                YAHOO.util.Connect.initHeader("accept", "application/json");
                var conn = YAHOO.util.Connect.asyncRequest(frm.method, frm.action, callback, formData);
                YAHOO.util.Event.preventDefault(e); // prevent the button from performing its default submit action
            };
            function getSubmitEl(inputEl) {
                if (inputEl.getAttribute("type") === "submit" && YAHOO.util.Dom.hasClass(inputEl, cfg.submitHijackClassName)) {
                    return true;
                }
                return false;
            };
            function addClick(submitEl) {
                YAHOO.util.Event.on(submitEl, "click", submitButtonHandler, submitEl, true);
            };
            YAHOO.util.Dom.getElementsBy(getSubmitEl, "input", this.formEl, addClick);
            YAHOO.util.Dom.addClass(this.formEl, "hijacked");
            
            this.init();
        }
    }
};

// Hijack all link to buyNow action.
QMI.widget.Cart.prototype.init = function () {
    this.createDeleteButtons();
    this.createMoveToWishlistButtons();
    this.wireQtyFields();
    this.wireSuggBoxes();
    this.wireBuyNow();
};

QMI.widget.Cart.prototype.wireBuyNow = function () {
    var commanderMaintenants = YAHOO.util.Dom.getElementsByClassName('buyNowAction', 'a');
    YAHOO.util.Event.addListener(commanderMaintenants, "click", function buyNow() {
        document.getElementById("buyNow").click();
    });
};

/**
 * @requires YAHOO.util.Dom
 * @requires YAHOO.util.Event
 */
QMI.widget.Cart.prototype.createDeleteButtons = function () {
    var cartObj = this;
    function getBy(el) {
        return el.getAttribute("type").toLowerCase() === "checkbox"
                && el.className == cartObj.cfg.delBtnClassName;
    };
    function apply(el) {
        cartObj.__createDeleteButton(el);
    }
    YAHOO.util.Dom.getElementsBy(getBy, "input", this.tableEl, apply);
};

QMI.widget.Cart.prototype.createMoveToWishlistButtons = function () {
   
    var cartObj = this;
    function getBy(el) {
       
      
        return el.getAttribute("type").toLowerCase() === "checkbox"
                && el.className == cartObj.cfg.btnMoveToWishlistClassName;
        
    };
    function apply(el) {
        
        cartObj.__createMoveToWishlistButton(el);
    }    
    
    YAHOO.util.Dom.getElementsBy(getBy, "input", this.tableEl, apply);
};

/**
 * @private
 */
QMI.widget.Cart.prototype.__createDeleteButton = function (checkboxEl) {
    var anchorText = this.cfg.delBtnAnchorText;
    var classNameToApply = this.cfg.delBtnClassName;

    var a = document.createElement("a");
    a.href = "#";
    if (classNameToApply) {
        a.className = classNameToApply;
    }
    a.id = this.cfg.delBtnClassName + checkboxEl.id;
    a.appendChild(document.createTextNode(anchorText));
    YAHOO.util.Event.on(a, "click", function (e) {
        e = e || event;
        checkboxEl.checked = true;
        this.delSubmitEl.click();
        YAHOO.util.Event.preventDefault(e);
    }, this, true);
    YAHOO.util.Dom.insertAfter(a, checkboxEl);
    checkboxEl.style.display = "none";
};

QMI.widget.Cart.prototype.__createMoveToWishlistButton = function (checkboxEl) {
    // do not create button if checkbox has been flagged as hidden
   
    if (YAHOO.util.Dom.hasClass(checkboxEl, 'hidden')) {
        return;
    }
   
    var anchorText = this.cfg.btnMoveToWishlistClassName;
    var classNameToApply = this.cfg.btnMoveToWishlistClassName;

    var a = document.createElement("a");
    a.href = "#";
    if (classNameToApply) {
        a.className = classNameToApply;
    }
    a.id = this.cfg.delBtnClassName + checkboxEl.id;
    a.appendChild(document.createTextNode(anchorText));
    YAHOO.util.Event.on(a, "click", function (e) {
        e = e || event;
        checkboxEl.checked = true;
        this.delSubmitWishlistEl.click();
        YAHOO.util.Event.preventDefault(e);
    }, this, true);
    YAHOO.util.Dom.insertAfter(a, checkboxEl);
    checkboxEl.style.display = "none";
};

/**
 * @requires YAHOO.util.Dom
 * @requires YAHOO.util.Event
 */
QMI.widget.Cart.prototype.wireQtyFields = function () {
    var cartObj = this;
    function applyTo(el) {
        cartObj.__wireQtyField(el);
    };
    YAHOO.util.Dom.getElementsByClassName(this.cfg.qtyFieldClassName, "input", this.tableEl, applyTo);
};

/**
 * @private
 */
QMI.widget.Cart.prototype.__wireQtyField = function (el) {
    YAHOO.util.Event.on(el, "change", function (e) {
	    e = e || event;
	    this.changedSubmitEl.click();
	    YAHOO.util.Event.preventDefault(e);
    }, this, true);
    YAHOO.util.Event.on(el, "focus", function () {
	   	YAHOO.util.Dom.addClass(this.parentNode, 'aActualiser');
    });
    YAHOO.util.Event.on(el, "blur", function () {
	   	YAHOO.util.Dom.removeClass(this.parentNode, 'aActualiser');
    });
};


QMI.widget.Cart.prototype.wireSuggBoxes = function () {
	var cartObj = this;
	function applyTo(el) {
		cartObj.__wireSuggBox(el);
	};
	YAHOO.util.Dom.getElementsByClassName(this.cfg.suggBoxClassName, "div", this.tableEl, applyTo);
};

/**
 * @private
 */
QMI.widget.Cart.prototype.__wireSuggBox = function (el) {
	var cartObj = this;
	var anchor = el.getElementsByTagName("a")[0];
	// if the suggestion box doesn't have an anchor, don't wire anything up
	if (anchor) {
		YAHOO.util.Event.on(el, "click", function (e) {
			e = e || event;
			var callback = {
				success: function (o) {
					// replace IDs in fragment with generated ones to make sure there are no conflicts in the DOM
					var panelId = YAHOO.util.Dom.generateId();
					var hdId = YAHOO.util.Dom.generateId();
					var bdId = YAHOO.util.Dom.generateId();
					var ftId = YAHOO.util.Dom.generateId();
					var txt = o.responseText;
					txt = txt.replace(cartObj.cfg.crossSellFragmentPanelId, panelId);
					txt = txt.replace(cartObj.cfg.crossSellFragmentHdId, hdId);
					txt = txt.replace(cartObj.cfg.crossSellFragmentBdId, bdId);
					txt = txt.replace(cartObj.cfg.crossSellFragmentFtId, ftId);
					
					// create temporary div in DOM and put responseText in it to create DOM nodes
					var tmpDiv = document.createElement("div");
					tmpDiv.style.display = "none";
					document.body.appendChild(tmpDiv);
					tmpDiv.innerHTML = txt;
					
					// grab newly created fragment nodes from DOM and insert fragment nodes into panel
					var panel = document.getElementById(panelId);
					if (panel) {
						cartObj.suggPanel.element.className = cartObj.pnlDefaults.panelClasses + " " + panel.className;
					}
					
					var hd = document.getElementById(hdId);
					if (hd) {
						cartObj.suggPanel.header.className = cartObj.pnlDefaults.hdClasses + " " + hd.className;
						cartObj.suggPanel.setHeader(hd.innerHTML);
					}
					
					var bd = document.getElementById(bdId);
					if (bd) {
						cartObj.suggPanel.body.className = cartObj.pnlDefaults.bdClasses + " " + bd.className;
						cartObj.suggPanel.setBody(bd.innerHTML);
					}
					
					var ft = document.getElementById(ftId);
					if (ft) {
						cartObj.suggPanel.footer.className = cartObj.pnlDefaults.ftClasses + " " + ft.className;
						cartObj.suggPanel.setFooter(ft.innerHTML);
					}
					
					// clear temp div
					tmpDiv.parentNode.removeChild(tmpDiv);
					
					// render panel with new content
					cartObj.suggPanel.render();
					
					// find and wire up auxiliary panel close buttons
					var btns = YAHOO.util.Dom.getElementsByClassName(cartObj.cfg.auxPanelCloseBtnClassName, null, cartObj.suggPanel.element);
					for (var i = 0; btns[i]; i += 1) {
						var a = document.createElement("a");
						a.href = "#";
						a.className = btns[i].className;
						a.appendChild(document.createTextNode(btns[i].title));
						YAHOO.util.Event.on(a, "click", function (e) {
							e = e || event;
							cartObj.suggPanel.hide();
							YAHOO.util.Event.preventDefault(e);
						});
						YAHOO.util.Dom.insertBefore(a, btns[i]);
					}
										
					// force ajax form submission instead of standard submission
					var callback = {
						success: function (o) {
							cartObj.suggPanel.hide();
							
							// *****************************************************
							// THE FOLLOWING IS IDENTICAL TO THE STANDARD CART SUBMIT CALLBACK AND SHOULD BE NORMALIZED
							// *****************************************************
							
                            var response = YAHOO.lang.JSON.parse(o.responseText);
                            
                            // Store the item template
                            cartObj.itemTemplate = response.itemTemplate;
                            
                            // Clear previous errors
                            cartObj.errorListEl.innerHTML = "";
                            
                            // Run through both carts and see if there are any differences
                            //   cartObj available through Cart closure
                            cartObj.updateCart(response.cart, cartObj.oldCart.cart);
                            
                            // Store new cart for next compare
                            cartObj.oldCart.cart = response.cart;
                            
                            //update the ACH global promotion
                            cartObj.globalPromotion.updatePromo(response.GlobPromo);
						}
					};
					var frm = cartObj.suggPanel.body.getElementsByTagName("form")[0];
					if (frm) {
						YAHOO.util.Event.on(frm, "submit", function (e) {
							e = e || event;
							YAHOO.util.Connect.setForm(this);
							YAHOO.util.Connect.initHeader("accept", "application/json");
							var conn = YAHOO.util.Connect.asyncRequest(this.method, this.action, callback);
							YAHOO.util.Event.preventDefault(e);
						});
					}
					
					cartObj.suggPanel.cfg.setProperty("fixedcenter", true);
					cartObj.suggPanel.show();
					cartObj.suggPanel.cfg.setProperty("fixedcenter", false);
				},
				failure: function (o) {
				}
			};			
			var conn = YAHOO.util.Connect.asyncRequest("GET", anchor.href, callback);
			YAHOO.util.Event.preventDefault(e);
		});
	}
};

QMI.widget.Cart.prototype.updateCart = function (newCart, oldCart) {
    var toStr = YAHOO.lang.JSON.stringify;
    var newItems = [];
    var deleteItems = [];
    var changedItems = [];
    
    // See if there are new items
    for (var key in newCart.items) {
        if (newCart.items.hasOwnProperty(key)) {
            if (!oldCart.items[key]) {
                newItems[key] = newCart.items[key];
                this.buildItem(key, newItems[key], "add");
            }
        }
    }
    
    // See if any items were deleted or changed
    for (var key in oldCart.items) {
        if (oldCart.items.hasOwnProperty(key)) {
            if (!newCart.items[key]) {
                deleteItems[key] = oldCart.items[key];
                this.buildItem(key, deleteItems[key], "delete");
            } else if (toStr(oldCart.items[key]) !== toStr(newCart.items[key]) ||
           			(newCart.items[key].qtyErr && newCart.items[key].qtyErr[0] !== "")) {
           		// Added second condition to avoid second identical error message disapearing.
               	changedItems[key] = newCart.items[key];
               	this.buildItem(key, changedItems[key], "change");
            }
        }
    }
    
    if (newCart.total !== oldCart.total) {
        this.totalEl.innerHTML = newCart.total;
    }
    if (newCart.qtyTotal !== oldCart.qtyTotal) {
        this.qtyTotalEl.innerHTML = newCart.qtyTotal;
    }
    
      updatePopupJS();
  
};
     

function updatePopupJS() {

                    var zoomGiftMessageLinks = YAHOO.util.Dom.getElementsByClassName("giftMessagePopupLink", 'a');
                            
                    var zoomGiftMessagePanel = new YAHOO.widget.Panel("giftMessagePopup", {        
                        constraintoviewport:true,
                        close:true,
                        visible:false,
                        draggable:false,
                        width:"450px",
                        fixedcenter:true,
                        underlay:"none",
                        modal: true
                    });
                
                    zoomGiftMessagePanel.render(document.body);
                
                    // Loop over zoom links and wire up to panel
                    for (var i = 0; zoomGiftMessageLinks[i]; i += 1) {
                        // Create a panel to display zoom image
                        zoomGiftMessageLinks[i].id = 'imagetoenlarge' + i;
                        zoomGiftMessageLinks[i].onclick = function (e) {
                            var titreDuPopupGiftMessage = document.getElementById('titreGiftMessage');
                            titreDuPopupGiftMessage.innerHTML = this.title;
                
                            showStandardPopup(this.href, 'contentGiftMessageBox');
                
                            var viewportwidth;
                            var viewportheight;
                
                            // the more standards compliant browsers (mozilla/netscape/opera/IE7) use window.innerWidth and window.innerHeight
                            if (typeof window.innerWidth != 'undefined') {
                                viewportwidth = window.innerWidth,
                                        viewportheight = window.innerHeight
                            }
                
                            // IE6 in standards compliant mode (i.e. with a valid doctype as the first line in the document)
                            else if (typeof document.documentElement != 'undefined' && typeof document.documentElement.clientWidth != 'undefined' && document.documentElement.clientWidth != 0) {
                                viewportwidth = document.documentElement.clientWidth,
                                        viewportheight = document.documentElement.clientHeight
                            }
                
                            // older versions of IE
                
                            else {
                                viewportwidth = document.getElementsByTagName('body')[0].clientWidth,
                                        viewportheight = document.getElementsByTagName('body')[0].clientHeight
                            }
                
                
                            zoomGiftMessagePanel.render(document.body);
                            zoomGiftMessagePanel.show();
                
                
                            var offsetWidthMarginA = viewportwidth - 980;
                            var offsetWidthMarginB = offsetWidthMarginA / 2;
                            var offsetFinal = offsetWidthMarginB + 200;
                
                            document.getElementById("giftMessagePopup_c").style.left = offsetFinal + "px";
                
                            e = e || event;
                            YAHOO.util.Event.preventDefault(e);
                        };
                    }
}



function cleanCAPS(str) {
	capsallowed = 3; // Lowercase if more than ## CAPS in a row
	do {
		eval("re = /([A-Z]{" + (capsallowed+1) + ",})/g;");
		myArray = str.match(re);
		if (myArray) {
			eval("re = /" + myArray[0] + "/;");
			str = str.replace(re, ""+myArray[0].toLowerCase());
		}
	} while (myArray);
	return str;
}

function html_entity_decode(str) {
  var ta=document.createElement("textarea");
  ta.innerHTML=str.replace(/</g,"&lt;").replace(/>/g,"&gt;");
  return ta.value;
}

QMI.widget.Cart.prototype.buildItem = function (id, itemObject, mode) {
    if (this.itemTemplate && id && itemObject && mode) {
        // Temporary repository for new TR contents as IE6 can't do an innerHTML on a tr element
        var cartObj = this;
        function addError(err) {
            var li = document.createElement("li");
            li.appendChild(document.createTextNode(err));
            cartObj.errorListEl.appendChild(li);
        }
        function createItem() {
            var tmpl = cartObj.itemTemplate;
            var newItem = "";
            newItem = tmpl.replace(/{IMGSRC}/, html_entity_decode(itemObject.imgURI));
            newItem = newItem.replace(/{PRODID}/g, id);
            newItem = newItem.replace(/{ITEMID}/g, itemObject.itemId);
            newItem = newItem.replace(/{PRODUCTID}/g, itemObject.productId);
            newItem = newItem.replace(/{PRODNAME}/,  html_entity_decode(itemObject.name));
            newItem = newItem.replace(/{PRODSUBNAME}/, itemObject.subname);
            newItem = newItem.replace(/{PRODTYPE}/, itemObject.type);
            newItem = newItem.replace(/{COIMGSRC}/, html_entity_decode(itemObject.companyImgURI));
            newItem = newItem.replace(/{STOCK_CODE}/, itemObject.stockStatusCode);
            newItem = newItem.replace(/{STOCK}/, itemObject.stockStatus);
            newItem = newItem.replace(/{NOTE}/, itemObject.note);
            newItem = newItem.replace(/{QTY}/, itemObject.qty);
            newItem = newItem.replace(/{GIFTMESSAGE}/, itemObject.giftMessage);
            newItem = newItem.replace(/{CROSS-SELL}/, itemObject.crossSell);
            newItem = newItem.replace(/{PRICE}/, itemObject.price);
            newItem = newItem.replace(/{PRICENOTE}/, itemObject.priceNote);
//            newItem = newItem.replace(/{UNITPRICE}/, itemObject.unitprice);
            newItem = newItem.replace(/{INSTALMENT}/, itemObject.instalment);

            var moveToWishlistClass = (itemObject.addToWishlist) ? "" : "hidden";
            newItem = newItem.replace(/{PLUSTARDCLASS}/, moveToWishlistClass);

            if (itemObject.qtyErr) {
	            for (var i = 0; i < itemObject.qtyErr.length; i++) {
	            	if (itemObject.qtyErr[i] !== "") {
		            	var errClass = " class='" + cartObj.cfg.errorClassName + "'";
		                newItem = newItem.replace(/{QTYERR}/, errClass);
		                addError(itemObject.qtyErr);
	            	}
	            }
            }
            return newItem;
        };
        switch (mode) {
        case "add":
        
            var newTable = "<table><tbody><tr id='row" + id + "'>" + createItem() + "</tr></tbody></table>";
            var tmp = document.createElement("div");
            tmp.id = YAHOO.util.Dom.generateId();
            document.body.appendChild(tmp);
            tmp.innerHTML = newTable;
            
            // Make sure the "old price" class name is given to the old price node (if a new promo price exists) 
            var newPrice = YAHOO.util.Dom.getElementsByClassName("new-price", "p", tmp.id)[0];
            var newPriceTxt = newPrice.textContent || newPrice.innerText;
            if (typeof newPriceTxt !== "undefined" && newPriceTxt.length > 0) {
            	var oldPrice = YAHOO.util.Dom.getPreviousSibling(newPrice);
            	YAHOO.util.Dom.addClass(oldPrice, this.cfg.oldPriceClassName);
            }
            
            var newItem = document.getElementById("row" + id);
            
            newItem.className = "first row";
            YAHOO.util.Dom.getChildren(this.tableEl.tBodies[0])[0].className = "row";
            
            this.tableEl.tBodies[0].insertBefore(newItem,this.tableEl.tBodies[0].childNodes[0]);
            //this.tableEl.tBodies[0].appendChild(newItem);
            tmp.parentNode.removeChild(tmp);
        	
            var cbox = YAHOO.util.Dom.getElementsByClassName(this.cfg.delBtnClassName, "input", newItem)[0];
            if (cbox) {
                this.__createDeleteButton(cbox);
            }
            cbox = YAHOO.util.Dom.getElementsByClassName(this.cfg.btnMoveToWishlistClassName, "input", newItem)[0];
            if (cbox) {
                this.__createMoveToWishlistButton(cbox);
            }
            var qtyFld = YAHOO.util.Dom.getElementsByClassName(this.cfg.qtyFieldClassName, "input", newItem)[0];
            if (qtyFld) {
                this.__wireQtyField(qtyFld);
            }
            var suggbox = YAHOO.util.Dom.getElementsByClassName(this.cfg.suggBoxClassName, "div", newItem)[0];
            if (suggbox) {
            	this.__wireSuggBox(suggbox);
            }
	       	
            QMI.util.Ajax.highlightElement(
                newItem, 
                {
                    fromColor: this.cfg.newItemFromColor,
                    toColor: this.cfg.newItemToColor,
                    timeout: this.cfg.highlightTimeout
                });
            break;
        case "delete":
            var oldTr = document.getElementById("row" + id);
            if (oldTr) {
                QMI.util.Ajax.highlightElement(
                    oldTr, 
                    {
                        onComplete: function () {
                        	var pn = oldTr.parentNode;                        
							pn.removeChild(oldTr);							
							YAHOO.util.Dom.getFirstChild(pn).className = "first row";
							
							
                        },
                        fromColor: this.cfg.delItemFromColor,
                        toColor: this.cfg.delItemToColor,
                        timeout: this.cfg.highlightTimeout
                    });
                    
                    
            }
            break;
        case "change":
            //var tr = document.createElement("tr");
            //tr.id = "row" + id;
            var oldTr = document.getElementById("row" + id);
            if (oldTr) {
                var tmpId = YAHOO.util.Dom.generateId();
                var newTable = "<table><tbody><tr id='" + tmpId + "'>" + createItem() + "</tr></tbody></table>";
                var tmp = document.createElement("div");
	            tmp.id = YAHOO.util.Dom.generateId();
                document.body.appendChild(tmp);
                tmp.innerHTML = newTable;
                
                // Make sure the "old price" class name is given to the old price node (if a new promo price exists) 
	            var newPrice = YAHOO.util.Dom.getElementsByClassName("new-price", "p", tmp.id)[0];
	            var newPriceTxt = newPrice.textContent || newPrice.innerText;
	            if (typeof newPriceTxt !== "undefined" && newPriceTxt.length > 0) {
	            	var oldPrice = YAHOO.util.Dom.getPreviousSibling(newPrice);
	            	YAHOO.util.Dom.addClass(oldPrice, this.cfg.oldPriceClassName);
	            }

                var newItem = document.getElementById(tmpId);
            
                YAHOO.util.Dom.insertBefore(newItem, oldTr);
                if (YAHOO.util.Dom.hasClass(oldTr, "first")) {
                    newItem.className = "first";
                }
                var oldId = oldTr.id;
                oldTr.parentNode.removeChild(oldTr);
                newItem.id = oldId;
                tmp.parentNode.removeChild(tmp);
            }
            var cbox = YAHOO.util.Dom.getElementsByClassName(this.cfg.delBtnClassName, "input", newItem)[0];
            if (cbox) {
                this.__createDeleteButton(cbox);
            }
            cbox = YAHOO.util.Dom.getElementsByClassName(this.cfg.btnMoveToWishlistClassName, "input", newItem)[0];
            if (cbox) {
                this.__createMoveToWishlistButton(cbox);
            }
            var qtyFld = YAHOO.util.Dom.getElementsByClassName(this.cfg.qtyFieldClassName, "input", newItem)[0];
            if (qtyFld) {
                this.__wireQtyField(qtyFld);
            }
            var suggbox = YAHOO.util.Dom.getElementsByClassName(this.cfg.suggBoxClassName, "div", newItem)[0];
            if (suggbox) {
            	this.__wireSuggBox(suggbox);
            }
            
            QMI.util.Ajax.highlightElement(
                newItem, 
                {
                    fromColor: this.cfg.changedItemFromColor,
                    toColor: this.cfg.changedItemToColor,
                    timeout: this.cfg.highlightTimeout
                });
            break;
        }
        
        // reset css class on each table row (shopping-cart)
        
        
    }
};

/**
 * @param {String|HTMLElement} containerEl  ID of or reference to an element representing the promo code box
 * @param {String|HTMLElement} showEl       ID of or reference to an element that will show the promo code box when clicked
 * @param {Object}             userConfig   An object containing default configuration overrides
 * @requires YAHOO.util.Dom
 * @requires YAHOO.util.Event
 */
QMI.widget.PromoCodeBox = function (containerEl, showEl, showElSec, userConfig) {
	this.cfg = {
		promoClassName: "promotion",
		activeClassName: "promo-active",
		closeBtnClassName: "promo-close-btn",
		closeBtnText: "X",
		cancelBtnClassName: "promo-cancel-btn",
		cancelBtnText: "Annuler",
		showElClickableClassName: "clickable"
	}
	
	this.states = {
		VISIBLE: 1,
		HIDDEN: 0
	}
	
	for (var key in userConfig) {
		if (userConfig.hasOwnProperty(key)) {
			this.cfg[key] = userConfig[key];
		}
	}
	
	this.containerEl = YAHOO.util.Dom.get(containerEl);
	if (!this.containerEl) {
		return false;
	}
	
	this.showEl = YAHOO.util.Dom.get(showEl);
	if (!this.showEl) {
		return false;
	}
	
	this.showElSec = YAHOO.util.Dom.get(showElSec);
	if (!this.showElSec) {
		return false;
	}
	
	this.formEl = this.containerEl.getElementsByTagName("form")[0];
	if (!this.formEl) {
		return false;
	}
	
	function getBy(el) {
		if (el.getAttribute("type") === "text") {
			return true;
		}
		return false;
	};
	this.textFields = YAHOO.util.Dom.getElementsBy(getBy, "input", this.formEl);
	
	this.init();
};

QMI.widget.PromoCodeBox.prototype.init = function () {
	// if the form contains an error (has "error" class name) set container to active (i.e. open)
	if (YAHOO.util.Dom.hasClass(this.formEl, "error")) {
		this.show();
	}

	// bind to show element
	YAHOO.util.Event.on(this.showEl, "click", this.show, this, true);
	YAHOO.util.Dom.addClass(this.showEl, this.cfg.showElClickableClassName);
	YAHOO.util.Event.on(this.showElSec, "click", this.show, this, true);

	// create and append close button
	var close = document.createElement("a");
	close.href = "#";
	close.appendChild(document.createTextNode(this.cfg.closeBtnText));
	close.className = this.cfg.closeBtnClassName;
	YAHOO.util.Event.on(close, "click", this.hide, this, true);
	this.containerEl.appendChild(close);
	
	// create and append cancel button
	var cancel = document.createElement("a");
	cancel.href = "#";
	cancel.appendChild(document.createTextNode(this.cfg.cancelBtnText));
	cancel.className = this.cfg.cancelBtnClassName;
	YAHOO.util.Event.on(cancel, "click", this.hide, this, true);
	this.formEl.appendChild(cancel);
};

QMI.widget.PromoCodeBox.prototype.show = function (e) {
	e = e || (typeof event === "undefined") ? null : event;
	this.state = this.states.VISIBLE;
	YAHOO.util.Dom.replaceClass(this.containerEl, this.cfg.promoClassName, this.cfg.activeClassName);
	if (e) {
		YAHOO.util.Event.preventDefault(e);
	}
};

QMI.widget.PromoCodeBox.prototype.hide = function (e) {
	e = e || (typeof event === "undefined") ? null : event;
	this.state = this.states.HIDDEN;
	YAHOO.util.Dom.replaceClass(this.containerEl, this.cfg.activeClassName, this.cfg.promoClassName);
	this.clearTextFields();
	if (e) {
		YAHOO.util.Event.preventDefault(e);
	}
};

QMI.widget.PromoCodeBox.prototype.clearTextFields = function () {
	for (var i = 0; this.textFields[i]; i += 1) {
		this.textFields[i].value = "";
	}
};


/**
 * Creates a star rating system based on a set of radio buttons. It expects each
 * radio button to be within a list item of an ordered or unordered list. The rating
 * are displayed via class names that follow the pattern: rating0, rating1, rating15,
 * rating2, rating25... The unselected state is represented by rating0. The prefix "rating"
 * is the default prefix and can be changed via the userConfig object by writing to the
 * radioProxyClassName property.
 *
 * @param {String|HTMLElement} containerEl  Id or reference of container within
 *                                          which radio buttons will be found.
 * @param {Object}             userConfig   Object containing custom values to 
 *                                          override default config.
 */
QMI.widget.Rating = function (containerEl, userConfig) {
	// get container element, return false if none is found
	this.containerEl = YAHOO.util.Dom.get(containerEl);
	if (!this.containerEl) {
		return false;
	}
	
	// establish defaults
	this.cfg = {
		ratingWidgetClassName: "rating-widget",
		radioHiddenClassName: "hidden",
		radioProxyNodeName: "li",
		radioProxyClassName: "rating",
		selectedPrefix: "selected-",
		msgIdSuffix: "-msg",
		msgClassName: "stars-message",
		msgPleaseVote: "Vote!",
		msgVoted: "Thanks!",
		ratingStart: 1,
		ratingEnd: 5
	};
	
	// override defaults
	for (var key in userConfig) {
		if (userConfig.hasOwnProperty(key)) {
			this.cfg[key] = userConfig[key];
		}
	}
	
	// boolean to determine if a vote has already been cast (for message display purposes)
	this.voted = false;
	
	// get message element if it exists
	this.msgEl = document.getElementById(this.containerEl.id + this.cfg.msgIdSuffix);
	
	// if no message element exists, create and insert it
	if (!this.msgEl) {
		this.msgEl = document.createElement("span");
		YAHOO.util.Dom.insertAfter(this.msgEl, this.containerEl); 
	}
	
	// set up hash table of all possible rating class names
	this.allPossibleRatingClassNames = [];
	for (var i = this.cfg.ratingStart; i < this.cfg.ratingEnd + 1; i += 1) {
		this.allPossibleRatingClassNames.push(this.cfg.radioProxyClassName + i.toString());
	}
	
	// set up match method for a radio button
	function isRadio(el) {
		var t = el.getAttribute("type");
		if (t && t.toLowerCase() === "radio") {
			return true;
		}
		return false;
	};
	
	// where the current selected index is stored
	this.selectedidx = 0;
	
	// find and store all radio buttons
	this.radios = YAHOO.util.Dom.getElementsBy(isRadio, "input", this.containerEl);
	
	// initialize
	this.init();
};

QMI.widget.Rating.prototype.init = function () {

	// assign rating widget class name to container element
	YAHOO.util.Dom.addClass(this.containerEl, this.cfg.ratingWidgetClassName);

	// assign base "unselected" rating class name to container element
	YAHOO.util.Dom.addClass(this.containerEl, this.cfg.radioProxyClassName + "0");
	
	// Add class name to message element
	YAHOO.util.Dom.addClass(this.msgEl, this.cfg.msgClassName);
	
	for (var i = 0; this.radios[i]; i += 1) {
		// cache current radio button
		var radio = this.radios[i];
		
		// hide current radio button
		YAHOO.util.Dom.addClass(radio, this.cfg.radioHiddenClassName);
		
		// find proxy for current radio button
		var proxy = YAHOO.util.Dom.getAncestorByTagName(radio, this.cfg.radioProxyNodeName);
		
		// add individual rating class name to proxy
		YAHOO.util.Dom.addClass(proxy, this.cfg.radioProxyClassName);
		
		// prepare event payload
		var evtPayload = {
			radioEl: radio,
			idx: (i + 1),
			ratingObj: this
		};
		
		// assign mouseup event handler
		YAHOO.util.Event.on(proxy, "mouseup", this.mouseupHandler, evtPayload);
		
		// assign mouseover event handler
		YAHOO.util.Event.on(proxy, "mouseover", this.mouseoverHandler, evtPayload);
		
		// assign mouseout event handler
		YAHOO.util.Event.on(proxy, "mouseout", this.mouseoutHandler, evtPayload);
	}
};

QMI.widget.Rating.prototype.mouseupHandler = function (e, o) {
	// fix event object
	e = e || event;
	
	// store idx
	o.ratingObj.selectedidx = o.idx;
	
	// click radio button
	o.radioEl.click();
	
	// set the current rating class name
	o.ratingObj.setRatingClassName(o.idx.toString());
	
	// set the vote message
	o.ratingObj.msgEl.innerHTML = o.ratingObj.cfg.msgVoted;
	o.ratingObj.voted = true;
};

QMI.widget.Rating.prototype.mouseoverHandler = function (e, o) {
	// fix event object
	e = e || event;
	
	// set the current rating class name
	o.ratingObj.setRatingClassName(o.idx.toString());
	
	// set the vote message
	o.ratingObj.msgEl.innerHTML = o.ratingObj.cfg.msgPleaseVote;
};

QMI.widget.Rating.prototype.mouseoutHandler = function (e, o) {
	// fix event object
	e = e || event;
	
	// set the current rating class name
	o.ratingObj.setRatingClassName(o.ratingObj.selectedidx.toString());
	
	// set the vote message
	if (o.ratingObj.voted) {
		o.ratingObj.msgEl.innerHTML = o.ratingObj.cfg.msgVoted;
	} else {
		o.ratingObj.msgEl.innerHTML = "";
	}
};

QMI.widget.Rating.prototype.setRatingClassName = function (idx) {
	// establish local var aliases
	idx = idx.toString();
	var classes = this.allPossibleRatingClassNames;
	var prefix = this.cfg.radioProxyClassName;
	
	// remove any previous prefix + idx class name
	for (var i = 0; classes[i]; i += 1) {
		YAHOO.util.Dom.removeClass(this.containerEl, classes[i]);
	}
	
	// add new prefix + idx class name
	YAHOO.util.Dom.addClass(this.containerEl, prefix + idx);
};

/**
 * Creates anchors representing radio buttons in a form using text from the labels
 * associated to those radio buttons. The onclick action of the anchor sets the associated
 * radio button as checked and then submits the form by clicking on the first submit button 
 * that is found. It is possible to specify a desired submit button by id or reference in
 * order to override the default "first submit" behaviour. The contents of the form are then 
 * hidden and a "thank you" message is 
 * displayed.
 * @param {String|HTMLElement} frmEl    ID or reference to a form element
 * @param {String|HTMLElement} submitEl (Optional) ID or reference to a submit element
 * @requires YAHOO.util.Dom
 * @requires YAHOO.util.Event
 */
QMI.util.radioToAnchor = function (frmEl, submitEl) {

	frmEl = YAHOO.util.Dom.get(frmEl);
	if (frmEl) {
		submitEl = submitEl || YAHOO.util.Dom.getElementsBy(function (el) {
			var t = el.getAttribute("type");
			if (t && t.toLowerCase() === "submit") {
				return true;
			}
			return false;
		}, "input", frmEl)[0];
		var labels = frmEl.getElementsByTagName("label");
		var id = undefined;
		
		for (var i = 0; labels[i]; i += 1) {
			if ((YAHOO.env.ua.ie>0)&&(YAHOO.env.ua.ie <= 7)) {				
				// ugly workaround for IE6 which is incapable of reading the "for" attribute of an input
				for (var j = 0; labels[i].attributes[j]; j += 1) {
					if (labels[i].attributes[j].nodeName === "for") {
						id = labels[i].attributes[j].value;
					}
				}
			} else {
				// code for all other competent browsers
				id = labels[i].getAttribute("for");
			}
			if (id) {
				var radio = document.getElementById(id);
				if (radio) {
					var a = document.createElement("a");
					var txt = labels[i].innerText || labels[i].textContent;
					a.appendChild(document.createTextNode(txt));
					a.href = "#" + id;
					var payload = {
						radio: radio,
						submit: submitEl,
						frmEl: frmEl
					};
					YAHOO.util.Event.on(a, "click", function (e, o) {
						e = e || event;
						o.radio.click();
						o.submit.click();
						YAHOO.util.Event.preventDefault(e);
					}, payload);
					YAHOO.util.Dom.insertBefore(a, labels[i]);
					radio.style.display = "none";
					labels[i].style.display = "none";
				}
			}
		}
	}
};

/**
 * Submits the parent form of an element when an one of its events is triggered
 * @param {String|HTMLElement} el        ID or reference of element to bind to
 * @param {String}             evt       Event that triggers form's submit
 * @param {String|HTMLElement} submitEl  (Optional) Submit element to hide
 * @requires YAHOO.util.Dom
 * @requires YAHOO.util.Event
 */
QMI.util.submitFormOn = function (el, evt, submitEl) {
	el = YAHOO.util.Dom.get(el);
	submitEl = YAHOO.util.Dom.get(submitEl);
	if (YAHOO.lang.isString(evt)) {
		if (el) {
			var frm = YAHOO.util.Dom.getAncestorByTagName(el, "form");
			if (frm) {
				YAHOO.util.Event.on(el, evt, function() {submitEl.click();}, frm, true);
                if (submitEl) {
					submitEl.style.display = "none";
				}
				return true;
			}
		}
	}
	return false;
};

/**
 * Generates and inserts "back" buttons in placeholders in an HTML document
 * 
 */
QMI.util.makeBackButtons = function (className, linkText) {
	if (className && YAHOO.lang.isString(className) && linkText && YAHOO.lang.isString(linkText)) {
		var placeHolders = YAHOO.util.Dom.getElementsByClassName(className);
		for (var i = 0; placeHolders[i]; i += 1) {
			var a = document.createElement("a");
			a.href = "#";
			a.onclick = function (e) {
				e = e || event;
				history.back();
				YAHOO.util.Event.preventDefault(e);
			};
			a.appendChild(document.createTextNode(linkText));
			placeHolders[i].appendChild(a);
		}
	}
};

/**
 * Animates the background color of an element. Exposes "start" and "end" custom
 * events so as to trigger 
 * @requires YAHOO.util.Event
 * @requires YAHOO.util.ColorAnim
 * @param {String|HTMLElement} el  A reference to or ID of the element to animate
 * @param {Object} userConfig  An object containing any of the following optional params:
 *     {String}   fromColor   The color to animate from, defaults to yellow
 *     {String}   toColor     The color to animate to, defaults to white
 *     {Function} onStart     A function to execute on the animation's start
 *     {Function} onTween     A function to execute on each frame of the animation
 *     {Function} onComplete  A function to execute on the animation's end
 */
QMI.util.Ajax.highlightElement = function (el, userConfig) {
    if (el) {
        var fromColor = (userConfig && userConfig.fromColor) ? userConfig.fromColor : "#FFFF00";
        var toColor = (userConfig && userConfig.toColor) ? userConfig.toColor : "#FFFFFF";
        var timeout = (userConfig && userConfig.timeout) ? userConfig.timeout : 1000;
        el = YAHOO.util.Dom.get(el);
        YAHOO.util.Dom.setStyle(el, "background-color", fromColor);
        setTimeout(function () {
            var colorAnim = new YAHOO.util.ColorAnim(
                    el, {
                        backgroundColor: {
                            from: fromColor,
                            to: toColor
                        }
                    });
            if (userConfig && userConfig.onStart) {
                colorAnim.onStart.subscribe(userConfig.onStart);
            }
            if (userConfig && userConfig.onTween) {
                colorAnim.onTween.subscribe(userConfig.onTween);
            }
            if (userConfig && userConfig.onComplete) {
                colorAnim.onComplete.subscribe(userConfig.onComplete);
            }
            colorAnim.animate();
            colorAnim = null;
        }, timeout);
    }
};

/*
**** Function that should only be used in form pages */
function preventCopyPaste(inputName){
	
	var myBlockedInputs = YAHOO.util.Dom.getElementsByClassName(inputName, 'input');	
	YAHOO.util.Event.addListener(myBlockedInputs, "focus", browser);
	YAHOO.util.Event.addListener(myBlockedInputs, "keydown", checkCtrlIns);
	
	function checkCtrlIns(e, field){
		e = e || event;
		if (e.ctrlKey && e.keyCode==86){
			YAHOO.util.Event.preventDefault(e);
		}
		else{
			return true;
		}
	}

	function browser(e){
		e = e || event;
		if (e.button == 2){
			if (navigator.appName == 'Microsoft Internet Explorer'){
				clickIE(e);
			}
			if (navigator.appName == 'Netscape'){
				clickNS(e);
			}
			else{
				clickNS(e);
			}
		}

		var message="";
		///////////////////////////////////
		function clickIE(e) {if (document.all) {(message);return false;}}
		function clickNS(e) {
			if(document.layers||(document.getElementById&&!document.all)){
				if (e.which==2||e.which==3) {(message);return false;}
			}
		}
		
		if (document.layers){
			document.captureEvents(Event.MOUSEDOWN);
			document.onmousedown=clickNS;
		}
		else{
			document.onmouseup=clickNS;document.oncontextmenu=clickIE;
		}

		document.oncontextmenu=new Function("return false")
	}

	function reenable(){
		var message="";
		///////////////////////////////////
		function clickIE() {if (document.all) {(message);return true;}}
		function clickNS(e) {
			if (document.layers||(document.getElementById&&!document.all)){
				if (e.which==2||e.which==3) {(message);return true;}
			}
		}
		
		if (document.layers){
			document.captureEvents(Event.MOUSEDOWN);
			document.onmousedown=clickNS;
		}
		else{
			document.onmouseup=clickNS;
			document.oncontextmenu=clickIE;
		}
		document.oncontextmenu=new Function("return true")
	}
};

function itemResizer(el, itemClass, itemContainer, itemPadding){
    var itemsToResize = YAHOO.util.Dom.getElementsByClassName(itemClass, itemContainer, el);
    
    var maxHeightResult = 0;
    for(x=0;x<itemsToResize.length;x++){
        itemsToResize[x].style.height = "auto";
        if(itemsToResize[x].offsetHeight > maxHeightResult){
            maxHeightResult = itemsToResize[x].offsetHeight;
        }
    }	
    for(y=0;y<itemsToResize.length;y++){
        itemsToResize[y].style.height = (maxHeightResult + itemPadding)+"px";
    }
}

(function(){
	function togMenuBox(e){
		e = e || event;
		 isIE6 = / msie | MSIE 6/.test (navigator.userAgent);
        
        if(YAHOO.util.Dom.hasClass("AllMenu","showmenu")){    
            YAHOO.util.Dom.removeClass("AllMenu","showmenu");
            YAHOO.util.Dom.addClass("AllMenu","hiddenmenu");
            document.getElementById('hd').style.zIndex = 1;
            document.getElementById("buttonplus").style.display = "inline";
            document.getElementById("buttonmoins").style.display = "none";
        }
		if(YAHOO.util.Dom.hasClass(this.nextSibling, 'jsHidden')){
			YAHOO.util.Dom.removeClass(this.nextSibling, 'jsHidden');
			YAHOO.util.Dom.addClass(this.parentNode, 'jsOpen');
			document.getElementById('hd').style.zIndex = 3;
            
           if( document.getElementById('sort') && isIE6){
                   document.getElementById('sort').style.visibility = 'hidden';
		    }
		}
		else{
			YAHOO.util.Dom.addClass(this.nextSibling, 'jsHidden');
			YAHOO.util.Dom.removeClass(this.parentNode, 'jsOpen');
			document.getElementById('hd').style.zIndex = 0;
            if( document.getElementById('sort') && isIE6){
                   document.getElementById('sort').style.visibility = 'visible';
                   
		    }
		}		
		YAHOO.util.Event.preventDefault(e);
	}
    //new function for display new menu. by CHUN YAN
    function allCategoriesMenu(e){
        e = e || event;
        if(YAHOO.util.Dom.hasClass("AllMenu","hiddenmenu")){
            YAHOO.util.Dom.removeClass("AllMenu","hiddenmenu");
            YAHOO.util.Dom.addClass("AllMenu","showmenu");
            document.getElementById("buttonplus").style.display = "none";
            document.getElementById("buttonmoins").style.display = "inline";
            document.getElementById('hd').style.zIndex = 3;
        }else{
            YAHOO.util.Dom.removeClass("AllMenu","showmenu");
            YAHOO.util.Dom.addClass("AllMenu","hiddenmenu");
            document.getElementById('hd').style.zIndex = 0;
            document.getElementById("buttonplus").style.display = "inline";
            document.getElementById("buttonmoins").style.display = "none";
        }
        YAHOO.util.Event.preventDefault(e);
    }
    function addAllCategoriesEvent(el){
        YAHOO.util.Event.addListener(el,"click",allCategoriesMenu);
    }
	function addTogMenuEvent(el){
		YAHOO.util.Event.addListener(el, "click", togMenuBox);
	}
	var lnkMenuBoutique = YAHOO.util.Dom.getElementsByClassName("lnkMenuBoutiques", 'a', 'hd', addTogMenuEvent);
//	var lnkMenuCategories = YAHOO.util.Dom.getElementsByClassName("lnkMenuCategories", 'a', 'hd', addTogMenuEvent);
	var lnkMenuCategories = YAHOO.util.Dom.getElementsByClassName("lnkMenuCategories", 'a', 'hd', addAllCategoriesEvent);
	function togScrollBody(e){
		e = e || event;
		var divNameToDisplay = this.href.slice(this.href.lastIndexOf("#")+1,this.href.length);
		divToDisplay = document.getElementById(divNameToDisplay);
		
		if(YAHOO.util.Dom.hasClass(divToDisplay, 'jsHidden')){
			YAHOO.util.Dom.addClass(divstogScroll, 'jsHidden');
			YAHOO.util.Dom.removeClass(divToDisplay, 'jsHidden');
			
			if(togScrollFocus=="zoScrollItem0"){
				YAHOO.util.Dom.addClass(btnScrollPrev, 'activeScrollPrev');
				YAHOO.util.Dom.removeClass(this, 'activeScrollNext');
			}
			else{
				YAHOO.util.Dom.addClass(btnScrollNext, 'activeScrollNext');
				YAHOO.util.Dom.removeClass(this, 'activeScrollPrev');
			}
			togScrollFocus = divNameToDisplay;
		}
		YAHOO.util.Event.preventDefault(e);
	}
	
	function addTogScrollEvent(el){
		YAHOO.util.Event.addListener(el, "click", togScrollBody);
	}
	
	var lnkTogScroll = YAHOO.util.Dom.getElementsByClassName("lnkTogScroll", 'a', 'bd', addTogScrollEvent);
	var btnScrollNext = YAHOO.util.Dom.getElementsByClassName("roundNext", 'a', 'bd');
	var btnScrollPrev = YAHOO.util.Dom.getElementsByClassName("roundPrevious", 'a', 'bd');
	var divstogScroll = YAHOO.util.Dom.getElementsByClassName("zoScrollItem", 'ul', 'bd');
	YAHOO.util.Dom.addClass(btnScrollNext, 'activeScrollNext');
	var togScrollFocus = "zoScrollItem0";
	
	function recommendScrollNext(){
        var offset = parseInt(YAHOO.util.Dom.getStyle('scrollContent','left'));
        var maxWidth = parseInt(YAHOO.util.Dom.getStyle('scrollContent','width'));
        if(offset <= 0 && Math.abs(offset) < (maxWidth-670) ){
            var offset_x = offset - 670;
            document.getElementById('previous').style.cursor = "pointer";
            document.getElementById('previous').style.background = "url(/qmi/Static/ACH/neutral/images/btn_scrollright_on.jpg)";
            if(Math.abs(offset_x) == (maxWidth-670)){
                document.getElementById('next').style.cursor = "default";
                document.getElementById('next').style.background = "url(/qmi/Static/ACH/neutral/images/btn_scroll_off.jpg)";
            }
        }else {
            document.getElementById('next').style.cursor = "default";
            document.getElementById('next').style.background = "url(/qmi/Static/ACH/neutral/images/btn_scroll_off.jpg)";
            offset_x = offset;
        }
        var attributes = {
        left: { to: offset_x}
            };
        var myAnim=new YAHOO.util.Anim('scrollContent', attributes, 1.5, YAHOO.util.Easing.easeOut);
        myAnim.animate();
    };
    function addScrollNextEvent(el){
        YAHOO.util.Event.addListener(el,"click",recommendScrollNext);
    };

    function recommendScrollPrevious(){
        var offset = parseInt(YAHOO.util.Dom.getStyle('scrollContent','left'));
        if(offset < 0 ){
            var offset_x = offset + 670;
            document.getElementById('next').style.cursor = "pointer";
            document.getElementById('next').style.background = "url(/qmi/Static/ACH/neutral/images/btn_scrollleft_on.jpg)";
            if(offset_x >=0){
                document.getElementById('previous').style.cursor = "default";
                document.getElementById('previous').style.background = "url(/qmi/Static/ACH/neutral/images/btn_scroll_off.jpg)";
            }
        }else {
            document.getElementById('previous').style.cursor = "default";
            document.getElementById('previous').style.background = "url(/qmi/Static/ACH/neutral/images/btn_scroll_off.jpg)";
            offset_x = offset;
        }
        var attributes = {
        left: { to: offset_x}
            };
        var myAnim=new YAHOO.util.Anim('scrollContent', attributes, 1.5, YAHOO.util.Easing.easeOut);
        myAnim.animate();
    };
    function addScrollPreviousEvent(el){
        YAHOO.util.Event.addListener(el,"click",recommendScrollPrevious);
    };
    var scrollRecommendNxet = YAHOO.util.Dom.getElementsByClassName("buttonPrevious","a","recommendScroll",addScrollNextEvent);
    var scrollRecommendPrevious = YAHOO.util.Dom.getElementsByClassName("buttonNext","a","recommendScroll",addScrollPreviousEvent);
	
	var zoShowcases = YAHOO.util.Dom.getElementsByClassName("zoShowcases", 'div', 'bd', function(el){
		itemResizer(el, "scTitle", "span", -10);
		itemResizer(el, "showcaseDisplay", "div", 40);
		
	});
    var zoShowcasesRow = YAHOO.util.Dom.getElementsByClassName("row", 'div', 'bd', function(el){
		itemResizer(el, "showcaseDisplay", "div", 40);
		
	});
	
	
	var zoVertiSimple = YAHOO.util.Dom.getElementsByClassName("zoVertiSimple", 'div', 'bd', function(el){
		itemResizer(el, "zoItem", "div", -30);
	});
    
    
	var zoSimpleBlock = YAHOO.util.Dom.getElementsByClassName("zoVertiSimple", 'div', 'bd', function(el){
		itemResizer(el, "row", "div", 0);
	});
	
	var zoBoxPrevnouv = YAHOO.util.Dom.getElementsByClassName("zoBoxPrevnouv", 'div', 'bd', function(el){
		itemResizer(el, "zoItem", "div", -30);
	});
	
	var zoBanniereProduit = YAHOO.util.Dom.getElementsByClassName("zoBanniereProduit", 'div', 'bd', function(el){
		itemResizer(el, "itemDisplay", "div", 10);
	});

    var zoShowcaseNoText = YAHOO.util.Dom.getElementsByClassName("zoShowcaseNoText", 'div', 'bd', function(el){
		itemResizer(el, "showcaseDisplay", "div", 15);

	});
	
})();


/* **************************************
** Video popup                         **
************************************** */
var videoPopup;
var videoCentered = false;

/**
 * Opens the standard popup (which the skeleton should already be in the page) and asynchronously displays
 * the provided URL in the popup.
 * @param url the URL to display in the popup
 * @param id the popup skeleton's ID
 */
function showStandardPopup(url, id) {
    document.getElementById(id).innerHTML = '<div class="loading" style="text-align:center"></div>';

    if (!YAHOO.lang.isValue(url)) {
        return;
    }

    var callback = {
        success: function(response) {
            if (document.getElementById) {
                if (document.getElementById(id).style.display == "block") {
                    document.getElementById(id).style.display = 'none';
                }
                else if (document.getElementById(id).style.display == "none") {
                    document.getElementById(id).style.display = 'block';
                }
                else {
                    document.getElementById(id).style.display = 'none';
                }
            }

            document.getElementById(id).innerHTML = response.responseText;
            document.getElementById(id).style.display = 'block';
        },
        failure: function(response) {
            document.getElementById(position).innerHTML = "Erreur " + response.status;
        }
    };

    YAHOO.util.Connect.asyncRequest('GET', url, callback);
 }; 
   


function initializeVideoPopup() {
    videoPopup = new YAHOO.widget.Overlay("productVideoPopup", {
        width:"475px",
        height: "800px",
        fixedcenter: true,
        constraintviewport: true,
        underlay:"none",
        modal: true,
        close: true,
        visible: false,
        draggable: false
    });

	var close = document.createElement("span");
	close.className = "container-close";
	close.onclick = function () {
		//videoPlayer.stop();
		videoPopup.hide();
	};
    
    var closer = document.createElement("div");
	closer.className = "overlay-close";
	closer.onclick = function () {
		//videoPlayer.stop();
		videoPopup.hide();
	};

    videoPopup.render(document.body);

    videoPopup.element.appendChild(close);
    videoPopup.element.appendChild(closer);
    // Override show and hide methods
    videoPopup.show = function () {
    	var el = videoPopup.element;
    	var viewWidth = YAHOO.util.Dom.getViewportWidth();
        var viewHeight = YAHOO.util.Dom.getViewportHeight();
    	el.style.position = "absolute";
    	el.style.left = ((viewWidth / 2) - (el.offsetWidth / 2)) + "px";
     
        el.style.visibility = "visible";
    };

    videoPopup.hide = function () {
    	var el = videoPopup.element;
    	el.style.left = "-3000px";
        showStandardPopup(null, 'contentVideoBox');
        videoCentered = false;
        el.style.visibility = "hidden";
    };
}

function playRequestedVideo(e) {
    e = e || event;
    YAHOO.util.Event.stopEvent(e);

    var a = this;
    if (this.nodeName.toLowerCase() == "div") {
        a = this.getElementsByTagName("a")[0];
    }
    var popupUrl = a.href;
    var vidTitle = YAHOO.lang.trim(a.title);

    showStandardPopup(popupUrl, 'contentVideoBox');
    videoPopup.render(document.body);

    if (!videoCentered) {
        videoPopup.cfg.setProperty("fixedcenter", true);
    }

    videoPopup.show();
    
    var popContentTile = YAHOO.util.Dom.getElementsByClassName('popContentTitle', 'h5', 'productVideoPopup')[0];
    popContentTile.innerHTML = vidTitle;

    // ensure the popup doesn't move with viewport scrolling.
    videoPopup.cfg.setProperty("fixedcenter", true);
    videoCentered = true;
}

function bindVideoPopupsInProduct(videosClassName) {
	YAHOO.util.Dom.getElementsByClassName(videosClassName, null, document.body, function (videoZone) {
		YAHOO.util.Dom.getElementsByClassName("itemDisplay", "div", videoZone, function (el) {
			var a = el.getElementsByTagName("a")[0];
            a.onclick = playRequestedVideo;
			el.onclick = a.onclick;
		});
	});
}
function bindVideoPopupsEverywhere() {
    YAHOO.util.Dom.getElementsByClassName("icnVideoAvailable", "a" , document.body, function (el) {
        el.onclick = playRequestedVideo;
    });
}
/***************************************
** Page initialization is done here.
***************************************/
YAHOO.util.Event.onDOMReady(function() {
    
    initializeVideoPopup();
    bindVideoPopupsEverywhere();
   bindVideoPopupsInProduct("zoVideoList");
});

/**
 * Used throughout checkout process to bind ajax in multipayment option selection.
 */
function bindMultipaymentForms() {
    var submits = YAHOO.util.Selector.query('.multipayment-submit', document.getElementById('billing-info-container'));
    if (submits == null || YAHOO.lang.isUndefined(submits) || submits.length == 0) return;

    for (var i = 0; i < submits.length; i++) {
        refreshContainerWhenFormPosted(
                submits[i],
                document.getElementById('billing-info-refresher'),
                '../../common/order/_summary_total_order_box.jsp',
                null);
    }
}

function initializeLoadingPopup() {
    loadingPopup = new YAHOO.widget.Panel("productLoadingPopup", {
        width:"700px",
        fixedcenter:true,
        constraintviewport: true,
        underlay:"#fff",
        modal: true,
        close:false,
        visible:false,
        draggable:false
    });

    loadingPopup.render();
}
function showLoadingPopup() {
  
    if (YAHOO.util.Dom.hasClass('productLoadingPopup', 'popup-orange')) {
        YAHOO.util.Dom.removeClass('productLoadingPopup', 'popup-orange');
    }
    if (YAHOO.util.Dom.hasClass('productLoadingPopup', 'popup-numerosecurite')) {
        YAHOO.util.Dom.removeClass('productLoadingPopup', 'popup-numerosecurite');
    }
    
    YAHOO.util.Dom.addClass('productLoadingPopup', 'loadingPopup');
	document.getElementById('popup_title').innerHTML = '<h5></h5>';
    
    if (YAHOO.util.Dom.hasClass('productLoadingPopup', 'langen')) {
         document.getElementById('popup_content_wrapper').innerHTML = '<img alt="Loading" src="/qmi/Static/en/images/loadingPopup.gif"/>';	        
    } else  {
         document.getElementById('popup_content_wrapper').innerHTML = '<img alt="Chargement de la page" src="/qmi/Static/fr/images/loadingPopup.gif"/>';	    
    }
    
    loadingPopup.render();
    loadingPopup.show();	       
}
		
function cartLoadingOverlay() {
    initializeLoadingPopup();  
    showLoadingPopup();
}
       initializeLoadingPopup(); 

/**
 * Standard method for implementing the common pattern of posting a form and refreshing a container's content with response content.
 * @param submitEl the element on which to attach our behavior.
 * @param containerEl the container to refresh when form is posted.
 * @param postUrl if provided, the form's URL will be changed to this upon submit.
 */
function refreshContainerWhenFormPosted(submitEl, containerEl, postUrl, callback) {
    var formToUse = submitEl.form;
    YAHOO.util.Event.addListener(formToUse, 'submit', function(e) {
        e = e || event;
        YAHOO.util.Event.preventDefault(e);
        YAHOO.util.Connect.setForm(formToUse);
        YAHOO.util.Connect.asyncRequest('POST', postUrl, {
            success: function(o) {
                containerEl.innerHTML = o.responseText;
                if (callback) callback();
            }
        });
    });
}
/*
* ajax function for reanding sub categories
* @param catid the parent category id
* by CHUN YAN
 */
function menuajax(catid) {
    // Get the div element in which to report messages from the server
    var sub_cat = "results"+catid;
    var msg_section = YAHOO.util.Dom.get(sub_cat);
    msg_section.innerHTML = '';
    //alert(sub_cat);
    // Define the callbacks for the asyncRequest
    var callbacks = {

        success : function (o) {
            YAHOO.log("RAW JSON DATA: " + o.responseText);
            var msg = '';
            // Process the JSON data returned from the server
            var messages = [];
            try {
                messages = YAHOO.lang.JSON.parse(o.responseText);
            }
            catch (x) {
                alert("JSON Parse failed!");
                return;
            }

            YAHOO.log("PARSED DATA: " + YAHOO.lang.dump(messages));
            // The returned data was parsed into an array of objects.
            if(messages.length>0){
//                YAHOO.util.Dom.removeClass(sub_cat,'menuNoBorad');
//                msg='<div class="menu-shadow"></div>';
                msg ='<li class="cap"></li>';
                for (var i = 0, len = messages.length; i < len; ++i) {
                    var m = messages[i];
                    var classLi="";
                    if(i==0){
                        classLi="class='first'";
                    };
                    if(m){
                        if(m.childcat){
                            msg +="<li id='"+ m.categoryid +"' "+classLi+"><div class='menuitems' onmouseover=\"menuajax('"+m.categoryid+"')\">";
                            msg +=m.url+"</div><ul id='results"+m.categoryid+"' class='menuNoBorad'></ul></li>";
                        }else{
                            msg += "<li id='"+ m.categoryid +"' "+classLi+"><div class='menuitems'>";
                            msg += m.url + "</div></li>";
                        }
                    }
                }
                msg +='';
            }
            if(msg != ''){
                msg_section.innerHTML = '<div class="menu-shadow"></div>' + msg;
                YAHOO.util.Dom.removeClass(sub_cat,'menuNoBorad');
            }

        },

        failure : function (o) {
            if (!YAHOO.util.Connect.isCallInProgress(o)) {
//                alert("Async call failed, try again!");
            }
        },

        timeout : 3000
    };

    // Make the call to the server for JSON data
    var sUrl = "/qmi/Static/ACH/neutral/ajax_functions/cat_json.jsp?cat="+catid;
    YAHOO.util.Connect.asyncRequest('GET',sUrl, callbacks);
};

function Mainmenuajax(catid,type) {
    // Get the div element in which to report messages from the server
    var sub_cat = "results"+catid+type;
    var msg_section = YAHOO.util.Dom.get(sub_cat);
    msg_section.innerHTML = '';
    //alert(sub_cat);
    // Define the callbacks for the asyncRequest
    var callbacks = {

        success : function (o) {
            YAHOO.log("RAW JSON DATA: " + o.responseText);
            var msg = '';
            // Process the JSON data returned from the server
            var messages = [];
            try {
                messages = YAHOO.lang.JSON.parse(o.responseText);
            }
            catch (x) {
                alert("JSON Parse failed!");
                return;
            }

            YAHOO.log("PARSED DATA: " + YAHOO.lang.dump(messages));
            // The returned data was parsed into an array of objects.
            if(messages.length>0){
//                YAHOO.util.Dom.removeClass(sub_cat,'menuNoBorad');
//                msg='<div class="menu-shadow"></div>';
                msg ='<li class="cap"></li>';
                for (var i = 0, len = messages.length; i < len; ++i) {
                    var m = messages[i];
                    var classLi="";
                    if(i==0){
                        classLi="class='first'";
                    };
                    if(m){
                        if(m.childcat){
                            msg +="<li id='"+ m.categoryid +"' "+classLi+"><div class='menuitems' onmouseover=\"Mainmenuajax('"+m.categoryid+"',"+"'"+ type +"'"+")\">";
                            msg +=m.url+"</div><ul id='results"+m.categoryid+type+"' class='menuNoBorad'></ul></li>";
                        }else{
                            msg += "<li id='"+ m.categoryid +"' "+classLi+"><div class='menuitems'>";
                            msg += m.url + "</div></li>";
                        }
                    }
                }
                msg +='';
            }
            if(msg != ''){
                msg_section.innerHTML = '<div class="menu-shadow"></div>' + msg;
                YAHOO.util.Dom.removeClass(sub_cat,'menuNoBorad');
            }

        },

        failure : function (o) {
            if (!YAHOO.util.Connect.isCallInProgress(o)) {
//                alert("Async call failed, try again!");
            }
        },

        timeout : 3000
    };

    // Make the call to the server for JSON data
    var sUrl = "/qmi/Static/ACH/neutral/ajax_functions/cat_json.jsp?cat="+catid;
    YAHOO.util.Connect.asyncRequest('GET',sUrl, callbacks);
};