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;

    if (cart !== null){
        cart.globalPromotion = this;
    }

    this.init(cart, cancelCaption);

}

QMI.util.Promotion.prototype.init = function(cancelCaption) {
    this.wireCartControls();
    this.wireAddPromoBox(cancelCaption);
}


QMI.util.Promotion.prototype.init = function(cart, cancelCaption) {
    this.wireCartControls();
//    if (cart !== null){
        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");

    if( pCodeBox != null ){
        var h3s = pCodeBox.getElementsByTagName("h3");
        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: "Supprimer",
        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.name = checkboxEl.name;
    a.appendChild(document.createTextNode(anchorText));
    YAHOO.util.Event.on(a, "click", function (e) {
        e = e || event;
        checkboxEl.checked = true;
        gaAddToWishlistCart(a.id);
        this.delSubmitWishlistEl.click();
        YAHOO.util.Event.preventDefault(e);
    }, this, true);
    YAHOO.util.Dom.insertAfter(a, checkboxEl);
    checkboxEl.style.display = "none";
};

function gaAddToWishlistCart(id){

    elt = YAHOO.util.Dom.get('name'+id);
    if ( elt){
        try{
             pageTracker._trackEvent('M�morisation', 'Ajout', elt.value);
            //_gaq.push(['_trackEvent', 'M�morisation', 'Ajout', elt.value]);
        }catch(err){}
    }
}

/**
 * @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);

                            cartObj.wireBuyNow();
                        }
                    };
                    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(/{TOTALSHIPPINGPRICETEXT}/, itemObject.totalShippingPriceText);
            newItem = newItem.replace(/{TOTALSHIPPINGPRICE}/, itemObject.totalShippingPrice);
            newItem = newItem.replace(/{PRICENOTE}/, itemObject.priceNote);
            newItem = newItem.replace(/{GAWISHLIST}/, itemObject.gaWishList);
            
            //            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.parentNode.parentNode.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.containerEl.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");
});

/***************************************
 ** analytics
 ***************************************/

/**
 * 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);
}
;
/**
 * Serialize form input
 * @param frmElt form Element
 */
function serializeFormData(frmElt) {
    var formData = "";
    for (var i = 0; frmElt.elements[i]; i += 1) {
        var isValid = false;
        var t = frmElt.elements[i].getAttribute("type");

        if (t && (t.toLowerCase() === "checkbox" || t.toLowerCase() === "radio")) {
            if (frmElt.elements[i].checked) {
                isValid = true;
            }
        } else {
            isValid = true;
        }

        if (isValid) {
            formData += frmElt.elements[i].name + "=" + frmElt.elements[i].value + "&";
        }

    }
    formData += frmElt.name + "=" + frmElt.value;

    return formData;
}
/**
 * Add item to shopping Cart
 * @param skuId the sku
 * @param productId the product
 */
function addToCart(skuId, productId) {
    //1st step: lookup AJX_ADDTOCART form.
    var frm = YAHOO.util.Dom.get('AJX_ADDTOCART');
    if (frm == null || YAHOO.lang.isUndefined(frm)) return false;
    var s = YAHOO.util.Dom.get('AJX_SKU');
    var p = YAHOO.util.Dom.get('AJX_PRD');
    s.value = skuId;
    p.value = productId;

    var addToCartCallBack = {

        success : function (o) {
            // Process the JSON data returned from the server
            var data = [];
            try {
                data = eval(o.responseText);
            }
            catch (x) {
                return;
            }
            updateCartButtons(data);
        },
        //failure : function (o) {
        //    if (!YAHOO.util.Connect.isCallInProgress(o)) {
        //        //                alert("Async call failed, try again!");
        //    }
        //},

        timeout : 3000
    };


    YAHOO.util.Connect.initHeader("accept", "application/json");
    var conn = YAHOO.util.Connect.asyncRequest('POST', frm.action, addToCartCallBack, serializeFormData(frm));


    return false;

}
/**
 *
 * @param cartStatus
 */
function __addToCart(formId) {


    var addToCartCallBack = {

        success : function (o) {

            var msg = '';
            // Process the JSON data returned from the server
            var data = [];
            try {

                data = eval(o.responseText);

            }
            catch (x) {

                return;
            }

            updateCartButtons(data);


        },

        failure : function (o) {
            if (!YAHOO.util.Connect.isCallInProgress(o)) {
                //                alert("Async call failed, try again!");
            }
        },

        timeout : 3000
    };


    YAHOO.util.Connect.initHeader("accept", "application/json");
    var conn = YAHOO.util.Connect.asyncRequest('POST', formId.action, addToCartCallBack, serializeFormData(formId));


    return false;
}
/**
 * code to replace <div title="productId|skuId" class="addToCart">...</div> with the add to cart form..
 * @param cartStatus
 */
function updateCartButtons(cartStatus) {

    //step1: create a place holder for add to cart form..
    var frmHolder = YAHOO.util.Dom.get('AJX_ADDTOCART_WRAPPER');


    if (frmHolder == null || YAHOO.lang.isUndefined(frmHolder)) {

        return;
    }

    var totalItems =  YAHOO.util.Dom.get('qtyTotal');
    if (!(totalItems == null || YAHOO.lang.isUndefined(totalItems))){
        totalItems.innerHTML = cartStatus['cartSize'];
    }
    


    frmHolder.innerHTML = cartStatus['addToCartTemplate'];

    var addToCarts = YAHOO.util.Selector.query('div.addToCart');
    if (addToCarts == null || YAHOO.lang.isUndefined(addToCarts) || addToCarts.length == 0) return;

    for (var ii = 0; ii < addToCarts.length; ii++) {

        // retrieve the product Id to add to the cart..
        var itemsList = addToCarts[ii].title;
        var p = '';
        var s = '';
        if (itemsList.indexOf('|') >= 0) {
            var items = itemsList.split('|');
            p = items[0];
            s = items[1];
        } else {
            p = itemsList;
            s = itemsList;
        }



        //check in the productId of the cart which ones are to add and the other ones aren't
        var inCart = false;
        var cartItems = cartStatus['items'];
        var len = cartItems.length;
        for (var jj = 0; jj < len; jj++) {

            var curItem = cartItems[jj];
            var cartProduct = '';
            for (var propertyName in curItem) {
                if (propertyName == 'productId') {
                    cartProduct = curItem[propertyName];
                    break;
                }

            }

            if (p == cartProduct) {
                inCart = true;
                break;
            }
        }
        if (inCart) {
            addToCarts[ii].innerHTML = cartStatus.itemInCartTemplate;
        } else {


            var addToCartTpl = '' + cartStatus.addToCartButton;
            addToCartTpl = addToCartTpl.replace(/{PRODUCTID}/g, p);
            addToCartTpl = addToCartTpl.replace(/{SKUID}/g, s);
            addToCarts[ii].innerHTML = addToCartTpl;
        }
    }
}

function addToCartSetup() {


    var el = new YAHOO.util.Element(document.createElement('div'));
    el.set('id', 'AJX_ADDTOCART_WRAPPER');
    el.appendTo(document.body);
    YAHOO.util.Dom.setStyle(['AJX_ADDTOCART_WRAPPER'], 'display', 'none');
    if (!(typeof cartStatus === "undefined")) {
                    updateCartButtons(cartStatus);
    }

}
YAHOO.util.Event.onDOMReady(addToCartSetup);


function ajaxSearchChange(eltId, page, sort) {

    element = YAHOO.util.Dom.get(eltId);
    params = element.getAttribute('params');

    params = params + '&page=' + escape(page) + '&sort=' + escape(sort);
    ajaxSearch(eltId, params);
    return false;
}
function ajaxSearch(eltId, params) {
    var ajaxSearchCallBack = {

        success : function (o) {

            var msg = '';
            // Process the JSON data returned from the server
            var data = [];
            try {

                data = eval(o.responseText);
                elt = YAHOO.util.Dom.get(data['eltId']);

                elt.innerHTML = data['content'];
                
                if (!(typeof cartStatus === "undefined")) {
                    updateCartButtons(cartStatus);
                }
            }
            catch (x) {

                return;
            }


        },

        failure : function (o) {
            if (!YAHOO.util.Connect.isCallInProgress(o)) {
                //                alert("Async call failed, try again!");
            }
        },

        timeout : 30000
    };

    
     var elt =   YAHOO.util.Dom.get(eltId);
     elt.innerHTML = '';
     var el = new YAHOO.util.Element(document.createElement('img'));
     el.set('src', '/qmi/Static/neutral/images/anim_wait.gif');
    el.setStyle('margin-left','50%');
    el.setStyle('margin-right','50%');
    el.setStyle('margin-top', '50px');
     el.appendTo(elt);



    YAHOO.util.Connect.initHeader("accept", "application/json");
    params = params + '&eltId=' + eltId;
    var jsonUrl = '/qmi/search/templates/extended/_perform_search_json.jsp?' + params;

    
    var conn = YAHOO.util.Connect.asyncRequest('GET', jsonUrl, ajaxSearchCallBack, '');

}
function ajaxSearchSetup() {
    var dynamicSearchs = YAHOO.util.Selector.query('div.dynamicSearch');


    if (dynamicSearchs == null || YAHOO.lang.isUndefined(dynamicSearchs) || dynamicSearchs.length == 0) return;


    for (var ii = 0; ii < dynamicSearchs.length; ii++) {
        eltId = dynamicSearchs[ii].id;
        params = dynamicSearchs[ii].getAttribute('params');

        ajaxSearch(eltId, params);
    }


}

YAHOO.util.Event.onDOMReady(ajaxSearchSetup);


