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) {
                        // try qui patch les reponses brisees
                        try{
                            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();
                                }
                            }
                            // patch les reponses vide
                            if(o.responseText=="") document.location = document.location+"?deleted=1";
                        }catch(e){
                            document.location = document.location+"?deleted=1";
                        }
                    },
                    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);
        } 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(/{PRICENOTE}/, itemObject.priceNote);
            newItem = newItem.replace(/{GAWISHLIST}/, itemObject.gaWishList);
            newItem = newItem.replace(/{PRICESTYLE}/, itemObject.priceStyle);
            newItem = newItem.replace(/{UNITPRICE}/, itemObject.listPrice);
            newItem = newItem.replace(/{INSTALMENT}/, itemObject.instalment);
            newItem = newItem.replace(/{NEW-TOTAL}/, itemObject.newTotalPrice);

            var moveToWishlistClass = (itemObject.addToWishlist) ? "" : "hidden";
            newItem = newItem.replace(/{PLUSTARDCLASS}/, moveToWishlistClass);
            newItem = newItem.replace(/{PLUSTARDCLASSTO}/, 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 (response) {
                                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:"647px",
        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.zIndex  = 10000;
        el.style.visibility = "visible";
        el.style.width = "647px";
    };

    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);

    var callback = function () {

        alert('currentPlayerId:' + document.getElementById('currentPlayerId'));
    }
    showStandardPopup(popupUrl, 'contentVideoBox');
    pageTracker._trackEvent('Video', 'Affichage', vidTitle + '(' + a.rel + ')');

    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;


    //var playerIdEl = YAHOO.util.Dom.getElementById('currentPlayerId');
    //alert(playerIdEl);



    // 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;
    });
    YAHOO.util.Dom.getElementsByClassName("icnVideoAvailableFeatured", "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('mode-multi-paiement'));
    if (submits == null || YAHOO.lang.isUndefined(submits) || submits.length == 0) return;

    for (var i = 0; i < submits.length; i++) {
        var store = submits[i].id.substring(18, 21);
        var id = 'billing-info-refresher-' + store;
        refreshContainerWhenFormPosted(
                submits[i],
                document.getElementById('billing-info-refresher-' + store),
                '../../common/order/_summary_total_order_box.jsp?erpRequested=' + store,
                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;
            }
            var qtyTotalvar = document.getElementById("qtyTotal");
            qtyTotalvar.firstChild.data = parseInt(qtyTotalvar.firstChild.data) + 1;

            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;
}
/**
 *  Check if current productId is in list.
 * @param productId
 * @param itemList
 */
function isItemInList(productId, itemList) {
    var len = itemList.length;
    var ret = false;

    for (var jj = 0; jj < len; jj++) {

        var curItem = itemList[jj];
        var wishProduct = '';
        for (var propertyName in curItem) {
            if (propertyName == 'productId') {
                wishProduct = curItem[propertyName];
                break;
            }

        }

        if (productId == wishProduct) {
            ret = true;
            break;
        }
    }
    return ret;
}
/**
 * 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;
    }


    frmHolder.innerHTML = cartStatus['addToCartTemplate'];
    var completeURL = window.location.href;
    var URl = (completeURL.split("?"))[0];
    

    var addToWishList = YAHOO.util.Selector.query('div.wishlistajax');
    var handleWishList = (!(addToWishList == null || YAHOO.lang.isUndefined(addToWishList) || addToWishList.length == 0));
    if (handleWishList) {
        for (var ii = 0; ii < addToWishList.length; ii++) {
            // retrieve the product Id to add to the cart..
            var itemsList = addToWishList[ii].title;
            var p = '';
            var s = '';
            var i = '';
            if (itemsList.indexOf('|') >= 0) {
                var items = itemsList.split('|');
                p = items[0];
                s = items[1];
                i = items[2];
            } else {
                p = itemsList;
                s = itemsList;
                
            }
            //check in the productId of the cart which ones are to add and the other ones aren't
            var inWish = false;
            var wishItems = cartStatus['wishList'];
            var inWish = isItemInList(p, wishItems);
            var addToWishTpl ='';
            if (inWish) {
                addToWishTpl = '' + cartStatus.itemInWishListTemplate;
            } else {
                addToWishTpl = '' + cartStatus.addToWishListTemplate;
            }



            addToWishTpl = addToWishTpl.replace(/{CURRENTURL}/g, URl);
            addToWishTpl = addToWishTpl.replace(/{PRODUCTID}/g, p);
            addToWishTpl = addToWishTpl.replace(/{SKUID}/g, s);
            addToWishTpl = addToWishTpl.replace(/{ITEM}/g, html_entity_decode(i));
            addToWishList[ii].innerHTML = addToWishTpl;

        }
    }


    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 = isItemInList(p, cartStatus['items']);
        if (inCart) {
            addToCarts[ii].innerHTML = cartStatus.itemInCartTemplate;
            YAHOO.util.Dom.replaceClass(addToCarts[ii],"addToCart","dynAddedToCart");
        } 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);
}
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 : 3000
    };


    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);

/*
 The following information must not be removed:
 Awesome Box v2
 Written by: Paul Armstrong, Paul Armstrong Designs
 Site: http://paularmstrongdesigns.com
 Idea and some functions from "LightBox" http://www.huddletogether.com
 Example & Documentation: http://paularmstrongdesigns.com/awesome/box/
 Last Updated: Friday, February 2, 2007 at 12:31:10

 This work is licensed under a Creative Commons Attribution-ShareAlike 2.5 License
 http://creativecommons.org/licenses/by-sa/2.5/

 Required Yahoo! UI Files:
 * yahoo.js
 * dom.js
 * event.js
 * [ or: yahoo-dom-event.js ]
 * animation.js
 * [ or: animation-min.js ]
 */

var aLoadImgSrc = '/qmi/Static/neutral/images/anim_wait.gif'; // where is the loading image? (recommend absolute)


var aImgTypes = new Array('jpg', 'gif', 'png', 'bmp'); // types of images to place in Awesome Box

/*
 *  ***************************************
 *  EDIT BEYOND THIS POINT AT YOUR OWN RISK
 *  ***************************************
 */

var aClient = new Object();
/*
 *  aClient.allImgs()
 *    Find all links going to an image with an aImgTypes and return it as an array.
 */
aClient.allImgs = function() {


    var links = YAHOO.util.Selector.query('ol.slideShow li a');


    var photos = new Array();
    for (i = 0; i < links.length; i++) {
        for (j = 0; j < aImgTypes.length; j++) {
            if (links[i].href.indexOf(aImgTypes[j]) != -1) {
                photos.push(links[i])
            }
        }
    }
    return photos;
}

/*
 *  aClient.pageWidth() and aClient.pageHeight()
 *    Returns the width and height of the content in the document.
 */
aClient.pageWidth = function() {
    var xScroll;
    if (window.innerHeight && window.scrollMaxY) {
        xScroll = document.body.scrollWidth;
    } else if (document.body.scrollHeight > document.body.offsetHeight) { // all but Explorer Mac
        xScroll = document.body.scrollWidth;
    } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
        xScroll = document.body.offsetWidth;
    }
    if (xScroll < $D.getViewportWidth()) {
        pageWidth = $D.getViewportWidth();
    } else {
        pageWidth = xScroll;
    }
    return pageWidth;
};
aClient.pageHeight = function() {
    var yScroll;
    if (window.innerHeight && window.scrollMaxY) {
        yScroll = window.innerHeight + window.scrollMaxY;
    } else if (document.body.scrollHeight > document.body.offsetHeight) { // all but Explorer Mac
        yScroll = document.body.scrollHeight;
    } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
        yScroll = document.body.offsetHeight;
    }
    if (yScroll <= $D.getViewportHeight()) {
        pageHeight = $D.getViewportHeight();
    } else {
        pageHeight = yScroll;
    }
    return pageHeight;
};

/*
 *  aClient.xScroll(), aClient.yScroll()
 *    Returns the position of the X and Y scrollbars.
 */
aClient.xScroll = function() {
    var xScroll = window.scrollX || document.documentElement.scrollLeft;
    return xScroll;
}
aClient.yScroll = function() {
    var yScroll = window.scrollY || document.documentElement.scrollTop;
    return yScroll;
}

/*
 *  array.inArray(value)
 *    Returns the key of the array that value is assigned to if true, null if false.
 */
Array.prototype.inArray = function(value) {
    for (i = 0; i < this.length; i++) {
        if (this[i] == value) {
            return i;
        }
    }
    return null;
}

/*
 *  Helper Variables
 */
var $D = YAHOO.util.Dom;
var $E = YAHOO.util.Event;
var $A = YAHOO.util.Anim;
var $M = YAHOO.util.Motion;
var $S = YAHOO.util.Scroll;
var $Ease = YAHOO.util.Easing;
var $ = $D.get;

/*
 *  AnimMgr
 *    Sets the default frames per second higher so Safari will display animations
 *    at the correct speed. Degrades for slower browsers.
 */
YAHOO.util.AnimMgr.fps = 500;

YAHOO.widget.aEffect = function(el) {
    this.oEl = YAHOO.util.Dom.get(el);
};

/*
 *  YAHOO.widget.aEffect.aShowLoad()
 *    Animation widget for transition period on Awesome Box initialize or between images.
 */
YAHOO.widget.aEffect.prototype.aShowLoad = function() {
    var showLoad = new $A('aLoadImg', {opacity: {to: 1}}, 0.2);
    showLoad.onStart.subscribe(function() {
        $D.setStyle('aLoadImg', 'display', 'block');
        $D.setXY('aLoadImg', [
            ($D.getViewportWidth() / 2) - 16 + aClient.xScroll(),
            ($D.getViewportHeight() / 2) - 16 + aClient.yScroll()
        ]);
        if ($D.hasClass('aBoxMeta', 'aOpen')) {
            var hideMeta = new $A('aBoxMeta', {opacity: {to: 0}, height: {to: 0}}, 0.2);
            hideMeta.onStart.subscribe(function() {
                $D.setStyle('aImg', 'opacity', '0');
                $D.setStyle('aImg', 'visibility', 'hidden');
            });
            hideMeta.animate();
        }
    });
    showLoad.animate();
};

/*
 *  YAHOO.widget.aEffect.aShowOverlay
 *    Fades in #aOverlay and #aBox.
 *    Initializes YAHOO.widget.aEffect.aShowLoad()
 */
YAHOO.widget.aEffect.prototype.aShowOverlay = function() {
    selects = document.getElementsByTagName("select");
    for (i = 0; i != selects.length; i++) {
        $D.setStyle(selects[i], 'visibility', 'hidden');
    }

    var fadeOverlay = new $A('aOverlay', {opacity: {to: 0.85}}, 0.3);
    fadeOverlay.onStart.subscribe(function() {
        $D.setStyle('aOverlay', 'display', 'block');
        $D.setStyle('aOverlay', 'height', aClient.pageHeight() + 'px');
    });
    var showBox = new $A('aBox', {opacity: {to: 1}}, 0.3);
    showBox.onStart.subscribe(function() {
        $D.setStyle('aBox', 'display', 'block');
        var showLoad = new YAHOO.widget.aEffect();
        showLoad.aShowLoad();
    });
    showBox.animate();
    fadeOverlay.animate();
};

/*
 *  YAHOO.widget.aEffect.aResizeBox()
 *    Initialized after new image is completed loading. Resizes and moves #aBox, times out
 *    and displays #aBoxMeta information
 */
YAHOO.widget.aEffect.prototype.aResizeBox = function(aPreload) {
    var imgScale = YAHOO.awesomebox.scaleImage(aPreload);

    var moveBox = new $M('aBox', {
        width: {to: (imgScale[0] + 20)},
        height: {to: (imgScale[1] + 20)},
        points: {to: [
            ($D.getViewportWidth() / 2) - (imgScale[0] / 2) + aClient.xScroll() - 10,
            ($D.getViewportHeight() / 2) - (imgScale[1] / 2) + aClient.yScroll() - 10
        ]
        }
    }, 0.3);
    moveBox.onStart.subscribe(function() {
        $D.setStyle('aBox', 'display', 'block');

        var hideLoad = new $A('aLoadImg', {opacity: {to: 0}}, 0.3);
        var sizeImage = new $A('aImg', {width: {to: imgScale[0]}, height: {to: imgScale[1]}}, 0.3);

        hideLoad.onComplete.subscribe(function() {
            $D.setStyle('aLoadImg', 'display', 'none');
        });
        hideLoad.animate();
        sizeImage.animate();
    });
    moveBox.onComplete.subscribe(function() {
        $D.setStyle('aBox', 'height', imgScale[1] + 90 + 'px');
        $D.setStyle('aBoxMeta', 'width', imgScale[0] + 'px');
        $D.addClass('aBoxMeta', 'aOpen');
        $('aImg').setAttribute('width', imgScale[0]);
        $('aImg').setAttribute('height', imgScale[1]);
        $D.setStyle('aImg', 'visibility', 'visible');

        var fadeImg = new $A('aImg', {opacity: {from: 0, to: 1}}, 0.3);

        fadeImg.onComplete.subscribe(function() {
            var showMeta = new $A('aBoxMeta', {opacity: {from: 0, to: 1}, height: {to: 40}}, 0.2);
            showMeta.animate();
        });
        fadeImg.animate();
    });
    if ($D.hasClass('aBoxMeta', 'aOpen')) {
        setTimeout(function() {
            $('aImg').setAttribute('src', aPreload.src);
            moveBox.animate();
        }, 300);
    } else {
        $('aImg').setAttribute('src', aPreload.src);
        moveBox.animate();
    }
};

/*
 *  YAHOO.widget.aEffect.aClose
 *    Closes #aBox and #aOverlay. Invoked via pressing 'x', clicking the 'X' image or #aOverlay
 */
YAHOO.widget.aEffect.prototype.aClose = function() {
    var that = $('aImg');
    var hideMeta = new $A('aBoxMeta', {height: {to: 0}, opacity: {to: 0}}, 0.2);
    var fadeBox = new $M('aBox', {opacity: {to: 0}}, 0.3);
    fadeBox.onComplete.subscribe(function() {
        var hideOverlay = new $A('aOverlay', {opacity: {to: 0}}, 0.3);
        hideOverlay.onStart.subscribe(function() {
            selects = document.getElementsByTagName("select");
            for (i = 0; i != selects.length; i++) {
                $D.setStyle(selects[i], 'visibility', 'visible');
            }
            $D.removeClass('aBoxMeta', 'aOpen');
            $D.setStyle('aBox', 'display', 'none');
            $D.setStyle('aImg', 'opacity', '0');
            $D.setStyle('aImg', 'visibility', 'hidden');
            $D.setStyle('aOverlay', 'display', 'none');
            $D.setStyle('aOverlay', 'height', '0px');
            $D.setStyle('aLoadImg', 'display', 'none');
        });
        hideOverlay.animate();
    });
    hideMeta.animate();
    fadeBox.animate();
    $E.removeListener('aNextButton', 'click');
    $E.removeListener('aPrevButton', 'click');
    $E.removeListener(document, 'keypress');
};


/*
 *  YAHOO.awesomebox()
 *    Non-animating functions, initialized on window load completion.
 */
YAHOO.awesomebox = function() {
    return {

        /*
         *  init()
         *    Creates the markup, checks for direct image link, adds event listeners.
         */
        init : function() {
            if (!document.getElementsByTagName) {
                return;
            }

            /*
             *  Awesome Box Markup
             *
             <div id="aOverlay" title="Click to Close"></div>
             <div id="aBox">
             <div id="aImgHolder">
             <img id="aImg" />
             </div>
             <div id="aBoxMeta">
             <a class="aButton" href="#next" id="aNextButton"></a>
             <a class="aButton" href="#prev" id="aPrevButton"></a>
             <a class="aButton" href="#close" id="aCloseButton"></a>
             <h1 id="aInfoTitle"></h1>
             <p id="aCount"></p>
             <p id="aInfo"></p>
             </div>
             </div>
             <img src="images/aBox-loading.gif" id="aLoadImg" />
             */

            var aBody = document.getElementsByTagName("body").item(0);

            var aOverlay = document.createElement('div');
            $(aOverlay).setAttribute('id', 'aOverlay');
            $(aOverlay).setAttribute('title', 'Click to Close');
            aBody.appendChild(aOverlay);
            $D.setStyle('aOverlay', 'opacity', '0');

            var aBox = document.createElement('div');
            $(aBox).setAttribute('id', 'aBox');
            aBody.appendChild(aBox);
            $D.setStyle('aBox', 'opacity', '0');
            $D.setXY('aBox', [($D.getViewportWidth() / 2) - 21, ($D.getViewportHeight() / 2) - 21])
            $D.setStyle('aBox', 'display', 'none');

            var aImgHolder = document.createElement('div');
            $(aImgHolder).setAttribute('id', 'aImgHolder');
            aBox.appendChild(aImgHolder);

            var aImg = document.createElement('img');
            $(aImg).setAttribute('id', 'aImg');
            aImgHolder.appendChild(aImg);
            $D.setStyle('aImg', 'opacity', '0');
            $D.setStyle('aImg', 'visibility', 'hidden');

            var aBoxMeta = document.createElement('div');
            $(aBoxMeta).setAttribute('id', 'aBoxMeta');
            aBox.appendChild(aBoxMeta);

            var aNextButton = document.createElement('a');
            $(aNextButton).setAttribute('id', 'aNextButton');
            aBoxMeta.appendChild(aNextButton);
            $(aNextButton).setAttribute('href', '#next');
            $D.addClass(aNextButton, 'aButton');

            var aPrevButton = document.createElement('a');
            $(aPrevButton).setAttribute('id', 'aPrevButton');
            aBoxMeta.appendChild(aPrevButton);
            $(aPrevButton).setAttribute('href', '#prev');
            $D.addClass(aPrevButton, 'aButton');

            var aCloseButton = document.createElement('a');
            $(aCloseButton).setAttribute('id', 'aCloseButton');
            aBoxMeta.appendChild(aCloseButton);
            $(aCloseButton).setAttribute('href', '#close');
            $D.addClass(aCloseButton, 'aButton');

            var aInfoTitle = document.createElement('h1');
            $(aInfoTitle).setAttribute('id', 'aInfoTitle');
            aBoxMeta.appendChild(aInfoTitle);

            var aCount = document.createElement('p');
            $(aCount).setAttribute('id', 'aCount');
            aBoxMeta.appendChild(aCount);
            $D.setStyle(aCount, 'opacity', '0');

            var aInfo = document.createElement('p');
            $(aInfo).setAttribute('id', 'aInfo');
            aBoxMeta.appendChild(aInfo);

            var preloadLoading = new Image();
            preloadLoading.src = aLoadImgSrc;

            var aLoadImg = document.createElement('img');
            $(aLoadImg).setAttribute('id', 'aLoadImg');
            aBody.appendChild(aLoadImg);
            $(aLoadImg).setAttribute('src', preloadLoading.src);
            $D.setStyle('aLoadImg', 'opacity', '0');

            /*
             *  Hash Check
             *    Checks the URL on page load for #filename and attempts to load it
             */
            if (window.location.href.indexOf('#') != -1) {
                // generate an ID for the body if it doesn't exist
                if (document.body.id != '' || document.body.id != null) {
                    var body = $D.generateId(document.body);
                } else {
                    var body = document.body.id;
                }
                var imgArray = aClient.allImgs();
                var loadImg = window.location.href.split('#')[1];
                for (i = 0; i < imgArray.length; i++) {
                    var imgUrl = imgArray[i].getAttribute('href').split('/');
                    if (imgUrl[imgUrl.length - 1].split('.')[0] == loadImg) {
                        $E.onAvailable(body, this.load, $(imgArray[i]), true);
                    }
                }
            }

            $E.on(aOverlay, 'click', this.close);
            $E.on(aCloseButton, 'click', this.close);

            $E.on(aClient.allImgs(), 'click', this.load);
        },

        /*
         *  load()
         *    Gets information for new image and invokes appropriate actions.
         */
        load : function(e, newImg) {
            var fadeOverlayIn = new YAHOO.widget.aEffect();
            fadeOverlayIn.aShowOverlay();

            if (newImg) {
                var that = newImg;
            } else {
                var that = this;
            }

            $E.stopEvent(e);
            $E.removeListener(document, 'keypress');

            aPreload = new Image();
            aPreload.onload = function() {
                var resizeBox = new YAHOO.widget.aEffect(that);
                resizeBox.aResizeBox(aPreload);


                if (!that.getAttribute('rel')) {
                    $D.setStyle('aNextButton', 'visibility', 'hidden');
                    $D.setStyle('aPrevButton', 'visibility', 'hidden');
                    $D.setStyle('aCount', 'opacity', '0');
                } else {
                    $D.setStyle('aCount', 'opacity', '1');
                    $E.removeListener('aNextButton', 'click');
                    $E.removeListener('aPrevButton', 'click');
                }
                var aInfoTitle = '';
                var aInfo = '';

                if (that.getAttribute('title') != null) {
                    var aInfoTitle = that.getAttribute('title');
                }
                if (
                        that.getElementsByTagName('img')[0] &&
                        that.getElementsByTagName('img')[0].getAttribute('title') != null
                        ) {
                    var aInfoTitle = that.getElementsByTagName('img')[0].getAttribute('title');
                }
                if (
                        that.getElementsByTagName('img')[0] &&
                        that.getElementsByTagName('img')[0].getAttribute('alt') != null
                        ) {
                    var aInfo = that.getElementsByTagName('img')[0].getAttribute('alt');
                } else {
                    var aInfo = that.innerHTML;
                }
                if ($D.hasClass('aBoxMeta', 'aOpen')) {
                    setTimeout(function() {
                        $('aInfoTitle').innerHTML = aInfoTitle;
                        $('aInfo').innerHTML = aInfo;
                    }, 250);
                } else {
                    $('aInfoTitle').innerHTML = aInfoTitle;
                    $('aInfo').innerHTML = aInfo;
                }

                var urlSplit = that.getAttribute('href').split('/');
                var filename = urlSplit[urlSplit.length - 1].split('.')[0];
                if (window.location.href.indexOf('#') != -1) {
                    var url = window.location.href.split('#')[0];
                } else {
                    var url = window.location.href;
                }
                window.location = url + '#' + filename;

                if (that.getAttribute('rel')) {
                    YAHOO.awesomebox.loadNeighbors(that);
                }
                $E.addListener(document, 'keypress', function(e) {
                    $E.stopEvent(e);
                    switch ($E.getCharCode(e)) {
                        case (120) : YAHOO.awesomebox.close();
                            break;
                    }
                });
            };
            aPreload.src = that.getAttribute('href');
        },

        /*
         *  loadNeighbors()
         *    Invoked via load(), finds and preloads next and previous image.
         */
        loadNeighbors : function(that) {
            var imgRefs = aClient.allImgs();
            var photoSet = new Array();
            for (j = 0; j < imgRefs.length; j++) {
                if (
                        imgRefs[j].getAttribute('rel') &&
                        imgRefs[j].getAttribute('rel') == that.getAttribute('rel')
                        ) {
                    photoSet.push(imgRefs[j]);
                }
            }
            var key = photoSet.inArray(that);
            setTimeout(function() {
                $('aCount').innerHTML = ' ' + (key + 1) + ' / ' + photoSet.length;
            }, 300);

            if (key != photoSet.length - 1) {
                var next = new Image();
                next.src = photoSet[key + 1].getAttribute('href');
                $D.setStyle('aNextButton', 'visibility', 'visible');
            } else {
                $D.setStyle('aNextButton', 'visibility', 'hidden');
            }
            if (key != 0) {
                var prev = new Image();
                prev.src = photoSet[key - 1].getAttribute('href');
                $D.setStyle('aPrevButton', 'visibility', 'visible');
            } else {
                $D.setStyle('aPrevButton', 'visibility', 'hidden');
            }
            $E.addListener('aNextButton', 'click', this.load, photoSet[key + 1], true);
            $E.addListener('aPrevButton', 'click', this.load, photoSet[key - 1], true);
            $E.addListener(document, 'keypress', function(e) {
                $E.stopEvent(e);

                switch ($E.getCharCode(e)) {
                    // 110 = n, 112 = p
                    case (110) :
                        if (key != photoSet.length - 1) {
                            YAHOO.awesomebox.load('', photoSet[key + 1]);
                        }
                        break;
                    case (112) :
                        if (key != 0) {
                            YAHOO.awesomebox.load('', photoSet[key - 1]);
                        }
                        break;
                }
            });
        },

        /*
         *  scaleImage()
         * Returns proportional values for height and width of image, scaled if necessary.
         */
        scaleImage : function(aImage) {
            var sHeight = aImage.height;
            var sWidth = aImage.width;
            if (aImage.width > $D.getViewportWidth()) {
                sWidth = $D.getViewportWidth() - 20;
                sHeight = aImage.height * (sWidth / aImage.width);
                if (sHeight + 100 > ($D.getViewportHeight() - 20)) {
                    sHeight = $D.getViewportHeight() - 120;
                    sWidth = aImage.width * (sHeight / aImage.height);
                }
            } else if (aImage.height + 100 > $D.getViewportHeight()) {
                sWidth = aImage.width * (($D.getViewportHeight() - 120) / aImage.height);
                sHeight = $D.getViewportHeight() - 120;
                if (sWidth > ($D.getViewportWidth() - 20)) {
                    sWidth = aImage.width * (sHeight / aImage.height);
                    sHeight = aImage.height * (sWidth / aImage.width);
                }
            }
            var scaleAtts = new Array(Math.floor(sWidth), Math.floor(sHeight));
            return scaleAtts;
        },

        /*
         *  close()
         *    Calls YAHOO.widget.aEffect.aClose() and resets the #filename to #close.
         *    Not the most elegant solution.
         */
        close : function() {
            var aClose = new YAHOO.widget.aEffect();
            aClose.aClose();
            if (window.location.href.indexOf('#') != -1) {
                var url = window.location.href.split('#')[0];
            } else {
                var url = window.location.href;
            }
            window.location = url + '#close';
        }
    }
}();

/*
 *  Start up the processes on window load.
 */
YAHOO.util.Event.on(window, 'load', YAHOO.awesomebox.init, YAHOO.awesomebox, true);

/*
 Copyright (c) 2009, Yahoo! Inc. All rights reserved.
 Code licensed under the BSD License:
 http://developer.yahoo.net/yui/license.txt
 version: 2.8.0r4
 */
(function() {
    var P;
    YAHOO.widget.Carousel = function(s, r) {
        YAHOO.widget.Carousel.superclass.constructor.call(this, s, r);
    };
    var U = YAHOO.widget.Carousel,e = YAHOO.util.Dom,c = YAHOO.util.Event,p = YAHOO.lang;
    P = "Carousel";
    var T = {},F = "afterScroll",g = "allItemsRemoved",b = "beforeHide",J = "beforePageChange",i = "beforeScroll",Y = "beforeShow",B = "blur",X = "focus",a = "hide",S = "itemAdded",o = "itemRemoved",Q = "itemReplaced",C = "itemSelected",L = "loadItems",I = "navigationStateChange",h = "pageChange",H = "render",V = "show",Z = "startAutoPlay",q = "stopAutoPlay",K = "uiUpdate";

    function G(r, s) {
        var t;
        for (t in s) {
            if (s.hasOwnProperty(t)) {
                e.setStyle(r, t, s[t]);
            }
        }
    }

    function W(s, r) {
        var t = document.createElement(s);
        r = r || {};
        if (r.className) {
            e.addClass(t, r.className);
        }
        if (r.styles) {
            G(t, r.styles);
        }
        if (r.parent) {
            r.parent.appendChild(t);
        }
        if (r.id) {
            t.setAttribute("id", r.id);
        }
        if (r.content) {
            if (r.content.nodeName) {
                t.appendChild(r.content);
            } else {
                t.innerHTML = r.content;
            }
        }
        return t;
    }

    function d(t, s, r) {
        var v;
        if (!t) {
            return 0;
        }
        function u(y, x) {
            var z;
            if (x == "marginRight" && YAHOO.env.ua.webkit) {
                z = parseInt(e.getStyle(y, "marginLeft"), 10);
            } else {
                z = parseInt(e.getStyle(y, x), 10);
            }
            return p.isNumber(z) ? z : 0;
        }

        function w(y, x) {
            var z;
            if (x == "marginRight" && YAHOO.env.ua.webkit) {
                z = parseFloat(e.getStyle(y, "marginLeft"));
            } else {
                z = parseFloat(e.getStyle(y, x));
            }
            return p.isNumber(z) ? z : 0;
        }

        if (typeof r == "undefined") {
            r = "int";
        }
        switch (s) {case"height":v = t.offsetHeight;if (v > 0) {
            v += u(t, "marginTop") + u(t, "marginBottom");
        } else {
            v = w(t, "height") + u(t, "marginTop") + u(t, "marginBottom") + u(t, "borderTopWidth") + u(t, "borderBottomWidth") + u(t, "paddingTop") + u(t, "paddingBottom");
        }break;case"width":v = t.offsetWidth;if (v > 0) {
            v += u(t, "marginLeft") + u(t, "marginRight");
        } else {
            v = w(t, "width") + u(t, "marginLeft") + u(t, "marginRight") + u(t, "borderLeftWidth") + u(t, "borderRightWidth") + u(t, "paddingLeft") + u(t, "paddingRight");
        }break;default:if (r == "int") {
            v = u(t, s);
        } else {
            if (r == "float") {
                v = w(t, s);
            } else {
                v = e.getStyle(t, s);
            }
        }break;}
        return v;
    }

    function O(w) {
        var u = this,x,t,s = 0,v = u.get("firstVisible"),r = false;
        if (u._itemsTable.numItems === 0) {
            return 0;
        }
        t = u._itemsTable.items[v] || u._itemsTable.loading[v];
        if (p.isUndefined(t)) {
            return 0;
        }
        x = e.get(t.id);
        if (typeof w == "undefined") {
            r = u.get("isVertical");
        } else {
            r = w == "height";
        }
        if (this._itemAttrCache[w]) {
            return this._itemAttrCache[w];
        }
        if (r) {
            s = d(x, "height");
        } else {
            s = d(x, "width");
        }
        this._itemAttrCache[w] = s;
        return s;
    }

    function N() {
        var s = this,t,r;
        t = s.get("isVertical");
        r = O.call(s, t ? "height" : "width");
        return(r * s.get("revealAmount") / 100);
    }

    function m(w) {
        var AH = this,z = AH._cols,v = AH._rows,u,AC,AB,t,x,AD,AJ = 0,AE,s,AG,AA = {},y = 0,AI = AH._itemsTable,AF = AI.items,r = AI.loading;
        AB = AH.get("isVertical");
        AC = O.call(AH, AB ? "height" : "width");
        AG = N.call(AH);
        while (y < w) {
            if (!AF[y] && !r[y]) {
                AJ++;
            }
            y++;
        }
        w -= AJ;
        if (v) {
            u = this.getPageForItem(w);
            if (AB) {
                x = Math.floor(w / z);
                AJ = x;
                AE = AJ * AC;
                AA.top = (AE + AG) + "px";
                AC = O.call(AH, "width");
                t = w % z;
                AJ = t;
                s = AJ * AC;
                AA.left = s + "px";
            } else {
                t = w % z;
                AD = (u - 1) * z;
                AJ = t + AD;
                s = AJ * AC;
                AA.left = (s + AG) + "px";
                AC = O.call(AH, "height");
                x = Math.floor(w / z);
                AD = (u - 1) * v;
                AJ = x - AD;
                AE = AJ * AC;
                AA.top = AE + "px";
            }
        } else {
            if (AB) {
                AA.left = 0;
                AA.top = ((w * AC) + AG) + "px";
            } else {
                AA.top = 0;
                AA.left = ((w * AC) + AG) + "px";
            }
        }
        return AA;
    }

    function D(s) {
        var r = this.get("numVisible");
        return Math.floor(s / r) * r;
    }

    function j(t) {
        var s = 0,r = 0;
        s = O.call(this);
        r = s * t;
        return r;
    }

    function f(r, s) {
        s.scrollPageBackward();
        c.preventDefault(r);
    }

    function k(r, s) {
        s.scrollPageForward();
        c.preventDefault(r);
    }

    function n(w, s) {
        var AA = this,AB = AA.CLASSES,r,y = AA._firstItem,t = AA.get("isCircular"),x = AA.get("numItems"),z = AA.get("numVisible"),v = s,u = y + z - 1;
        if (v >= 0 && v < x) {
            if (!p.isUndefined(AA._itemsTable.items[v])) {
                r = e.get(AA._itemsTable.items[v].id);
                if (r) {
                    e.removeClass(r, AB.SELECTED_ITEM);
                }
            }
        }
        if (p.isNumber(w)) {
            w = parseInt(w, 10);
            w = p.isNumber(w) ? w : 0;
        } else {
            w = y;
        }
        if (p.isUndefined(AA._itemsTable.items[w])) {
            w = D.call(AA, w);
            AA.scrollTo(w);
        }
        if (!p.isUndefined(AA._itemsTable.items[w])) {
            r = e.get(AA._itemsTable.items[w].id);
            if (r) {
                e.addClass(r, AB.SELECTED_ITEM);
            }
        }
        if (w < y || w > u) {
            w = D.call(AA, w);
            AA.scrollTo(w);
        }
    }

    function l() {
        var t = false,w = this,s = w.CLASSES,v,r,u;
        if (!w._hasRendered) {
            return;
        }
        r = w.get("navigation");
        u = w._firstItem + w.get("numVisible");
        if (r.prev) {
            if (w.get("numItems") === 0 || w._firstItem === 0) {
                if (w.get("numItems") === 0 || !w.get("isCircular")) {
                    c.removeListener(r.prev, "click", f);
                    e.addClass(r.prev, s.FIRST_NAV_DISABLED);
                    for (v = 0; v < w._navBtns.prev.length; v++) {
                        w._navBtns.prev[v].setAttribute("disabled", "true");
                    }
                    w._prevEnabled = false;
                } else {
                    t = !w._prevEnabled;
                }
            } else {
                t = !w._prevEnabled;
            }
            if (t) {
                c.on(r.prev, "click", f, w);
                e.removeClass(r.prev, s.FIRST_NAV_DISABLED);
                for (v = 0; v < w._navBtns.prev.length; v++) {
                    w._navBtns.prev[v].removeAttribute("disabled");
                }
                w._prevEnabled = true;
            }
        }
        t = false;
        if (r.next) {
            if (u >= w.get("numItems")) {
                if (!w.get("isCircular")) {
                    c.removeListener(r.next, "click", k);
                    e.addClass(r.next, s.DISABLED);
                    for (v = 0; v < w._navBtns.next.length; v++) {
                        w._navBtns.next[v].setAttribute("disabled", "true");
                    }
                    w._nextEnabled = false;
                } else {
                    t = !w._nextEnabled;
                }
            } else {
                t = !w._nextEnabled;
            }
            if (t) {
                c.on(r.next, "click", k, w);
                e.removeClass(r.next, s.DISABLED);
                for (v = 0; v < w._navBtns.next.length; v++) {
                    w._navBtns.next[v].removeAttribute("disabled");
                }
                w._nextEnabled = true;
            }
        }
        w.fireEvent(I, {next:w._nextEnabled,prev:w._prevEnabled});
    }

    function R(t) {
        var u = this,r,s;
        if (!u._hasRendered) {
            return;
        }
        s = u.get("numVisible");
        if (!p.isNumber(t)) {
            t = Math.floor(u.get("selectedItem") / s);
        }
        r = Math.ceil(u.get("numItems") / s);
        u._pages.num = r;
        u._pages.cur = t;
        if (r > u.CONFIG.MAX_PAGER_BUTTONS) {
            u._updatePagerMenu();
        } else {
            u._updatePagerButtons();
        }
    }

    function M(r, s) {
        switch (s) {case"height":return d(r, "marginTop") + d(r, "marginBottom") + d(r, "paddingTop") + d(r, "paddingBottom") + d(r, "borderTopWidth") + d(r, "borderBottomWidth");case"width":return d(r, "marginLeft") + d(r, "marginRight") + d(r, "paddingLeft") + d(r, "paddingRight") + d(r, "borderLeftWidth") + d(r, "borderRightWidth");default:break;}
        return d(r, s);
    }

    function A(s) {
        var r = this;
        if (!p.isObject(s)) {
            return;
        }
        switch (s.ev) {case S:r._syncUiForItemAdd(s);break;case o:r._syncUiForItemRemove(s);break;case Q:r._syncUiForItemReplace(s);break;case L:r._syncUiForLazyLoading(s);break;}
        r.fireEvent(K);
    }

    function E(u, s) {
        var w = this,v = w.get("currentPage"),t,r = w.get("numVisible");
        t = parseInt(w._firstItem / r, 10);
        if (t != v) {
            w.setAttributeConfig("currentPage", {value:t});
            w.fireEvent(h, t);
        }
        if (w.get("selectOnScroll")) {
            if (w.get("selectedItem") != w._selectedItem) {
                w.set("selectedItem", w._selectedItem);
            }
        }
        clearTimeout(w._autoPlayTimer);
        delete w._autoPlayTimer;
        if (w.isAutoPlayOn()) {
            w.startAutoPlay();
        }
        w.fireEvent(F, {first:w._firstItem,last:s}, w);
    }

    U.getById = function(r) {
        return T[r] ? T[r].object : false;
    };
    YAHOO.extend(U, YAHOO.util.Element, {_rows:null,_cols:null,_animObj:null,_carouselEl:null,_clipEl:null,_firstItem:0,_hasFocus:false,_hasRendered:false,_isAnimationInProgress:false,_isAutoPlayInProgress:false,_itemsTable:null,_navBtns:null,_navEl:null,_nextEnabled:true,_pages:null,_pagination:{},_prevEnabled:true,_recomputeSize:true,_itemAttrCache:{},CLASSES:{BUTTON:"yui-carousel-button",CAROUSEL:"yui-carousel",CAROUSEL_EL:"yui-carousel-element",CONTAINER:"yui-carousel-container",CONTENT:"yui-carousel-content",DISABLED:"yui-carousel-button-disabled",FIRST_NAV:" yui-carousel-first-button",FIRST_NAV_DISABLED:"yui-carousel-first-button-disabled",FIRST_PAGE:"yui-carousel-nav-first-page",FOCUSSED_BUTTON:"yui-carousel-button-focus",HORIZONTAL:"yui-carousel-horizontal",ITEM_LOADING:"yui-carousel-item-loading",MIN_WIDTH:"yui-carousel-min-width",NAVIGATION:"yui-carousel-nav",NEXT_NAV:" yui-carousel-next-button",NEXT_PAGE:"yui-carousel-next",NAV_CONTAINER:"yui-carousel-buttons",PAGER_ITEM:"yui-carousel-pager-item",PAGINATION:"yui-carousel-pagination",PAGE_FOCUS:"yui-carousel-nav-page-focus",PREV_PAGE:"yui-carousel-prev",SELECTED_ITEM:"yui-carousel-item-selected",SELECTED_NAV:"yui-carousel-nav-page-selected",VERTICAL:"yui-carousel-vertical",MULTI_ROW:"yui-carousel-multi-row",ROW:"yui-carousel-row",VERTICAL_CONTAINER:"yui-carousel-vertical-container",VISIBLE:"yui-carousel-visible"},CONFIG:{FIRST_VISIBLE:0,HORZ_MIN_WIDTH:180,MAX_PAGER_BUTTONS:5,VERT_MIN_WIDTH:115,NUM_VISIBLE:3},STRINGS:{ITEM_LOADING_CONTENT:"Loading",NEXT_BUTTON_TEXT:"Next Page",PAGER_PREFIX_TEXT:"Go to page ",PREVIOUS_BUTTON_TEXT:"Previous Page"},addItem:function(y, s) {
        var x = this,u,t,r,z = 0,w,v = x.get("numItems");
        if (!y) {
            return false;
        }
        if (p.isString(y) || y.nodeName) {
            t = y.nodeName ? y.innerHTML : y;
        } else {
            if (p.isObject(y)) {
                t = y.content;
            } else {
                return false;
            }
        }
        u = y.className || "";
        r = y.id ? y.id : e.generateId();
        if (p.isUndefined(s)) {
            x._itemsTable.items.push({item:t,className:u,id:r});
            w = x._itemsTable.items.length - 1;
        } else {
            if (s < 0 || s > v) {
                return false;
            }
            if (!x._itemsTable.items[s]) {
                x._itemsTable.items[s] = undefined;
                z = 1;
            }
            x._itemsTable.items.splice(s, z, {item:t,className:u,id:r});
        }
        x._itemsTable.numItems++;
        if (v < x._itemsTable.items.length) {
            x.set("numItems", x._itemsTable.items.length);
        }
        x.fireEvent(S, {pos:s,ev:S,newPos:w});
        return true;
    },addItems:function(r) {
        var s,u,t = true;
        if (!p.isArray(r)) {
            return false;
        }
        for (s = 0,u = r.length; s < u; s++) {
            if (this.addItem(r[s][0], r[s][1]) === false) {
                t = false;
            }
        }
        return t;
    },blur:function() {
        this._carouselEl.blur();
        this.fireEvent(B);
    },clearItems:function() {
        var r = this,s = r.get("numItems");
        while (s > 0) {
            if (!r.removeItem(0)) {
            }
            if (r._itemsTable.numItems === 0) {
                r.set("numItems", 0);
                break;
            }
            s--;
        }
        r.fireEvent(g);
    },focus:function() {
        var AA = this,v,w,x,u,z,AB,s,t,r;
        if (!AA._hasRendered) {
            return;
        }
        if (AA.isAnimating()) {
            return;
        }
        r = AA.get("selectedItem");
        AB = AA.get("numVisible");
        s = AA.get("selectOnScroll");
        t = (r >= 0) ? AA.getItem(r) : null;
        v = AA.get("firstVisible");
        z = v + AB - 1;
        x = (r < v || r > z);
        w = (t && t.id) ? e.get(t.id) : null;
        u = AA._itemsTable;
        if (!s && x) {
            w = (u && u.items && u.items[v]) ? e.get(u.items[v].id) : null;
        }
        if (w) {
            try {
                w.focus();
            } catch(y) {
            }
        }
        AA.fireEvent(X);
    },hide:function() {
        var r = this;
        if (r.fireEvent(b) !== false) {
            r.removeClass(r.CLASSES.VISIBLE);
            r.fireEvent(a);
        }
    },init:function(u, s) {
        var v = this,r = u,w = false,t;
        if (!u) {
            return;
        }
        v._hasRendered = false;
        v._navBtns = {prev:[],next:[]};
        v._pages = {el:null,num:0,cur:0};
        v._pagination = {};
        v._itemAttrCache = {};
        v._itemsTable = {loading:{},numItems:0,items:[],size:0};
        if (p.isString(u)) {
            u = e.get(u);
        } else {
            if (!u.nodeName) {
                return;
            }
        }
        U.superclass.init.call(v, u, s);
        t = v.get("selectedItem");
        if (t > 0) {
            v.set("firstVisible", D.call(v, t));
        }
        if (u) {
            if (!u.id) {
                u.setAttribute("id", e.generateId());
            }
            w = v._parseCarousel(u);
            if (!w) {
                v._createCarousel(r);
            }
        } else {
            u = v._createCarousel(r);
        }
        r = u.id;
        v.initEvents();
        if (w) {
            v._parseCarouselItems();
        }
        if (t > 0) {
            n.call(v, t, 0);
        }
        if (!s || typeof s.isVertical == "undefined") {
            v.set("isVertical", false);
        }
        v._parseCarouselNavigation(u);
        v._navEl = v._setupCarouselNavigation();
        T[r] = {object:v};
        v._loadItems(Math.min(v.get("firstVisible") + v.get("numVisible"), v.get("numItems")) - 1);
    },initAttributes:function(r) {
        var s = this;
        r = r || {};
        U.superclass.initAttributes.call(s, r);
        s.setAttributeConfig("carouselEl", {validator:p.isString,value:r.carouselEl || "OL"});
        s.setAttributeConfig("carouselItemEl", {validator:p.isString,value:r.carouselItemEl || "LI"});
        s.setAttributeConfig("currentPage", {readOnly:true,value:0});
        s.setAttributeConfig("firstVisible", {method:s._setFirstVisible,validator:s._validateFirstVisible,value:r.firstVisible || s.CONFIG.FIRST_VISIBLE});
        s.setAttributeConfig("selectOnScroll", {validator:p.isBoolean,value:r.selectOnScroll || true});
        s.setAttributeConfig("numVisible", {setter:s._numVisibleSetter,method:s._setNumVisible,validator:s._validateNumVisible,value:r.numVisible || s.CONFIG.NUM_VISIBLE});
        s.setAttributeConfig("numItems", {method:s._setNumItems,validator:s._validateNumItems,value:s._itemsTable.numItems});
        s.setAttributeConfig("scrollIncrement", {validator:s._validateScrollIncrement,value:r.scrollIncrement || 1});
        s.setAttributeConfig("selectedItem", {setter:s._selectedItemSetter,method:s._setSelectedItem,validator:p.isNumber,value:-1});
        s.setAttributeConfig("revealAmount", {method:s._setRevealAmount,validator:s._validateRevealAmount,value:r.revealAmount || 0});
        s.setAttributeConfig("isCircular", {validator:p.isBoolean,value:r.isCircular || false});
        s.setAttributeConfig("isVertical", {method:s._setOrientation,validator:p.isBoolean,value:r.isVertical || false});
        s.setAttributeConfig("navigation", {method:s._setNavigation,validator:s._validateNavigation,value:r.navigation || {prev:null,next:null,page:null}});
        s.setAttributeConfig("animation", {validator:s._validateAnimation,value:r.animation || {speed:0,effect:null}});
        s.setAttributeConfig("autoPlay", {validator:p.isNumber,value:r.autoPlay || 0});
        s.setAttributeConfig("autoPlayInterval", {validator:p.isNumber,value:r.autoPlayInterval || 0});
        s.setAttributeConfig("numPages", {readOnly:true,getter:s._getNumPages});
        s.setAttributeConfig("lastVisible", {readOnly:true,getter:s._getLastVisible});
    },initEvents:function() {
        var t = this,s = t.CLASSES,r;
        t.on("keydown", t._keyboardEventHandler);
        t.on(F, l);
        t.on(S, A);
        t.on(o, A);
        t.on(Q, A);
        t.on(C, function() {
            if (t._hasFocus) {
                t.focus();
            }
        });
        t.on(L, A);
        t.on(g, function(u) {
            t.scrollTo(0);
            l.call(t);
            R.call(t);
        });
        t.on(h, R, t);
        t.on(H, function(u) {
            if (t.get("selectedItem") === null || t.get("selectedItem") <= 0) {
                t.set("selectedItem", t.get("firstVisible"));
            }
            l.call(t, u);
            R.call(t, u);
            t._setClipContainerSize();
            t.show();
        });
        t.on("selectedItemChange", function(u) {
            n.call(t, u.newValue, u.prevValue);
            if (u.newValue >= 0) {
                t._updateTabIndex(t.getElementForItem(u.newValue));
            }
            t.fireEvent(C, u.newValue);
        });
        t.on(K, function(u) {
            l.call(t, u);
            R.call(t, u);
        });
        t.on("firstVisibleChange", function(u) {
            if (!t.get("selectOnScroll")) {
                if (u.newValue >= 0) {
                    t._updateTabIndex(t.getElementForItem(u.newValue));
                }
            }
        });
        t.on("click", function(u) {
            if (t.isAutoPlayOn()) {
                t.stopAutoPlay();
            }
            t._itemClickHandler(u);
            t._pagerClickHandler(u);
        });
        c.onFocus(t.get("element"), function(u, w) {
            var v = c.getTarget(u);
            if (v && v.nodeName.toUpperCase() == "A" && e.getAncestorByClassName(v, s.NAVIGATION)) {
                if (r) {
                    e.removeClass(r, s.PAGE_FOCUS);
                }
                r = v.parentNode;
                e.addClass(r, s.PAGE_FOCUS);
            } else {
                if (r) {
                    e.removeClass(r, s.PAGE_FOCUS);
                }
            }
            w._hasFocus = true;
            w._updateNavButtons(c.getTarget(u), true);
        }, t);
        c.onBlur(t.get("element"), function(u, v) {
            v._hasFocus = false;
            v._updateNavButtons(c.getTarget(u), false);
        }, t);
    },isAnimating:function() {
        return this._isAnimationInProgress;
    },isAutoPlayOn:function() {
        return this._isAutoPlayInProgress;
    },getElementForItem:function(r) {
        var s = this;
        if (r < 0 || r >= s.get("numItems")) {
            return null;
        }
        if (s._itemsTable.items[r]) {
            return e.get(s._itemsTable.items[r].id);
        }
        return null;
    },getElementForItems:function() {
        var t = this,s = [],r;
        for (r = 0; r < t._itemsTable.numItems; r++) {
            s.push(t.getElementForItem(r));
        }
        return s;
    },getItem:function(r) {
        var s = this;
        if (r < 0 || r >= s.get("numItems")) {
            return null;
        }
        if (s._itemsTable.numItems > r) {
            if (!p.isUndefined(s._itemsTable.items[r])) {
                return s._itemsTable.items[r];
            }
        }
        return null;
    },getItems:function() {
        return this._itemsTable.items;
    },getLoadingItems:function() {
        return this._itemsTable.loading;
    },getRows:function() {
        return this._rows;
    },getCols:function() {
        return this._cols;
    },getItemPositionById:function(w) {
        var u = this,v = u.get("numItems"),s = 0,r = u._itemsTable.items,t;
        while (s < v) {
            t = r[s] || {};
            if (t.id == w) {
                return s;
            }
            s++;
        }
        return -1;
    },getVisibleItems:function() {
        var u = this,s = u.get("firstVisible"),v = s + u.get("numVisible"),t = [];
        while (s < v) {
            t.push(u.getElementForItem(s));
            s++;
        }
        return t;
    },removeItem:function(s) {
        var u = this,t,r = u.get("numItems");
        if (s < 0 || s >= r) {
            return false;
        }
        t = u._itemsTable.items.splice(s, 1);
        if (t && t.length == 1) {
            u._itemsTable.numItems--;
            u.set("numItems", r - 1);
            u.fireEvent(o, {item:t[0],pos:s,ev:o});
            return true;
        }
        return false;
    },replaceItem:function(z, u) {
        var y = this,w,v,t,x = y.get("numItems"),s,r = z;
        if (!z) {
            return false;
        }
        if (p.isString(z) || z.nodeName) {
            v = z.nodeName ? z.innerHTML : z;
        } else {
            if (p.isObject(z)) {
                v = z.content;
            } else {
                return false;
            }
        }
        if (p.isUndefined(u)) {
            return false;
        } else {
            if (u < 0 || u >= x) {
                return false;
            }
            s = y._itemsTable.items[u];
            if (!s) {
                s = y._itemsTable.loading[u];
                y._itemsTable.items[u] = undefined;
            }
            y._itemsTable.items.splice(u, 1, {item:v,className:z.className || "",id:e.generateId()});
            r = y._itemsTable.items[u];
        }
        y.fireEvent(Q, {newItem:r,oldItem:s,pos:u,ev:Q});
        return true;
    },replaceItems:function(r) {
        var s,u,t = true;
        if (!p.isArray(r)) {
            return false;
        }
        for (s = 0,u = r.length; s < u; s++) {
            if (this.replaceItem(r[s][0], r[s][1]) === false) {
                t = false;
            }
        }
        return t;
    },render:function(s) {
        var u = this,r = u.CLASSES,t = u._rows;
        u.addClass(r.CAROUSEL);
        if (!u._clipEl) {
            u._clipEl = u._createCarouselClip();
            u._clipEl.appendChild(u._carouselEl);
        }
        if (s) {
            u.appendChild(u._clipEl);
            u.appendTo(s);
        } else {
            if (!e.inDocument(u.get("element"))) {
                return false;
            }
            u.appendChild(u._clipEl);
        }
        if (t) {
            e.addClass(u._clipEl, r.MULTI_ROW);
        }
        if (u.get("isVertical")) {
            u.addClass(r.VERTICAL);
        } else {
            u.addClass(r.HORIZONTAL);
        }
        if (u.get("numItems") < 1) {
            return false;
        }
        u._refreshUi();
        return true;
    },scrollBackward:function() {
        var r = this;
        r.scrollTo(r._firstItem - r.get("scrollIncrement"));
    },scrollForward:function() {
        var r = this;
        r.scrollTo(r._firstItem + r.get("scrollIncrement"));
    },scrollPageBackward:function() {
        var t = this,u = t.get("isVertical"),s = t._cols,r = t._firstItem - t.get("numVisible");
        if (r < 0) {
            if (s) {
                r = t._firstItem - s;
            }
        }
        if (t.get("selectOnScroll")) {
            t._selectedItem = t._getSelectedItem(r);
        }
        t.scrollTo(r);
    },scrollPageForward:function() {
        var s = this,r = s._firstItem + s.get("numVisible");
        if (r > s.get("numItems")) {
            r = 0;
        }
        if (s.get("selectOnScroll")) {
            s._selectedItem = s._getSelectedItem(r);
        }
        s.scrollTo(r);
    },scrollTo:function(AL, AI) {
        var AH = this,u,AJ,z,AB,AC,AM,AN,AO,AD,AA,v,AF,s,w,t,x,AE,y,AP,AK = AH._itemsTable,AG = AK.items,r = AK.loading;
        if (p.isUndefined(AL) || AL == AH._firstItem || AH.isAnimating()) {
            return;
        }
        AJ = AH.get("animation");
        z = AH.get("isCircular");
        AB = AH.get("isVertical");
        AA = AH._cols;
        v = AH._rows;
        AO = AH._firstItem;
        AF = AH.get("numItems");
        s = AH.get("numVisible");
        t = AH.get("currentPage");
        AP = function() {
            if (AH.isAutoPlayOn()) {
                AH.stopAutoPlay();
            }
        };
        if (AL < 0) {
            if (z) {
                AL = AF + AL;
            } else {
                AP.call(AH);
                return;
            }
        } else {
            if (AF > 0 && AL > AF - 1) {
                if (AH.get("isCircular")) {
                    AL = AF - AL;
                } else {
                    AP.call(AH);
                    return;
                }
            }
        }
        if (isNaN(AL)) {
            return;
        }
        AN = (AH._firstItem > AL) ? "backward" : "forward";
        AE = AO + s;
        AE = (AE > AF - 1) ? AF - 1 : AE;
        x = AH.fireEvent(i, {dir:AN,first:AO,last:AE});
        if (x === false) {
            return;
        }
        AH.fireEvent(J, {page:t});
        AD = AL + s - 1;
        AH._loadItems(AD > AF - 1 ? AF - 1 : AD);
        AM = 0 - AL;
        if (v) {
            if (AB) {
                AM = parseInt(AM / AA, 10);
            } else {
                AM = parseInt(AM / v, 10);
            }
        }
        y = 0;
        while (AM < 0 && y < AL + s - 1 && y < AF) {
            if (!AG[y] && !r[y]) {
                AM++;
            }
            y += v ? v : 1;
        }
        AH._firstItem = AL;
        AH.set("firstVisible", AL);
        AE = AL + s;
        AE = (AE > AF - 1) ? AF - 1 : AE;
        w = j.call(AH, AM);
        u = AJ.speed > 0;
        if (u) {
            AH._animateAndSetCarouselOffset(w, AL, AE, AI);
        } else {
            AH._setCarouselOffset(w);
            E.call(AH, AL, AE);
        }
    },getPageForItem:function(r) {
        return Math.ceil((r + 1) / parseInt(this.get("numVisible"), 10));
    },getFirstVisibleOnPage:function(r) {
        return(r - 1) * this.get("numVisible");
    },selectPreviousItem:function() {
        var t = this,s = 0,r = t.get("selectedItem");
        if (r == this._firstItem) {
            s = r - t.get("numVisible");
            t._selectedItem = t._getSelectedItem(r - 1);
            t.scrollTo(s);
        } else {
            s = t.get("selectedItem") - t.get("scrollIncrement");
            t.set("selectedItem", t._getSelectedItem(s));
        }
    },selectNextItem:function() {
        var s = this,r = 0;
        r = s.get("selectedItem") + s.get("scrollIncrement");
        s.set("selectedItem", s._getSelectedItem(r));
    },show:function() {
        var s = this,r = s.CLASSES;
        if (s.fireEvent(Y) !== false) {
            s.addClass(r.VISIBLE);
            s.fireEvent(V);
        }
    },startAutoPlay:function() {
        var r = this,s;
        if (p.isUndefined(r._autoPlayTimer)) {
            s = r.get("autoPlayInterval");
            if (s <= 0) {
                return;
            }
            r._isAutoPlayInProgress = true;
            r.fireEvent(Z);
            r._autoPlayTimer = setTimeout(function() {
                r._autoScroll();
            }, s);
        }
    },stopAutoPlay:function() {
        var r = this;
        if (!p.isUndefined(r._autoPlayTimer)) {
            clearTimeout(r._autoPlayTimer);
            delete r._autoPlayTimer;
            r._isAutoPlayInProgress = false;
            r.fireEvent(q);
        }
    },updatePagination:function() {
        var z = this,x = z._pagination;
        if (!x.el) {
            return false;
        }
        var w = z.get("numItems"),AA = z.get("numVisible"),u = z.get("firstVisible") + 1,v = z.get("currentPage") + 1,r = z.get("numPages"),t = {"numVisible":AA,"numPages":r,"numItems":w,"selectedItem":z.get("selectedItem") + 1,"currentPage":v,"firstVisible":u,"lastVisible":z.get("lastVisible") + 1},s = x.callback || {},y = s.scope && s.obj ? s.obj : z;
        x.el.innerHTML = p.isFunction(s.fn) ? s.fn.apply(y, [x.template,t]) : YAHOO.lang.substitute(x.template, t);
    },registerPagination:function(s, u, r) {
        var t = this;
        t._pagination.template = s;
        t._pagination.callback = r || {};
        if (!t._pagination.el) {
            t._pagination.el = W("DIV", {className:t.CLASSES.PAGINATION});
            if (u == "before") {
                t._navEl.insertBefore(t._pagination.el, t._navEl.firstChild);
            } else {
                t._navEl.appendChild(t._pagination.el);
            }
            t.on("itemSelected", t.updatePagination);
            t.on("pageChange", t.updatePagination);
        }
        t.updatePagination();
    },toString:function() {
        return P + (this.get ? " (#" + this.get("id") + ")" : "");
    },_animateAndSetCarouselOffset:function(w, u, s) {
        var v = this,t = v.get("animation"),r = null;
        if (v.get("isVertical")) {
            r = new YAHOO.util.Motion(v._carouselEl, {top:{to:w}}, t.speed, t.effect);
        } else {
            r = new YAHOO.util.Motion(v._carouselEl, {left:{to:w}}, t.speed, t.effect);
        }
        v._isAnimationInProgress = true;
        r.onComplete.subscribe(v._animationCompleteHandler, {scope:v,item:u,last:s});
        r.animate();
    },_animationCompleteHandler:function(r, s, t) {
        t.scope._isAnimationInProgress = false;
        E.call(t.scope, t.item, t.last);
    },_autoScroll:function() {
        var s = this,t = s._firstItem,r;
        if (t >= s.get("numItems") - 1) {
            if (s.get("isCircular")) {
                r = 0;
            } else {
                s.stopAutoPlay();
            }
        } else {
            r = t + s.get("numVisible");
        }
        s._selectedItem = s._getSelectedItem(r);
        s.scrollTo.call(s, r);
    },_createCarousel:function(s) {
        var u = this,r = u.CLASSES,t = e.get(s);
        if (!t) {
            t = W("DIV", {className:r.CAROUSEL,id:s});
        }
        if (!u._carouselEl) {
            u._carouselEl = W(u.get("carouselEl"), {className:r.CAROUSEL_EL});
        }
        return t;
    },_createCarouselClip:function() {
        return W("DIV", {className:this.CLASSES.CONTENT});
    },_createCarouselItem:function(u) {
        var r,t = this,s = m.call(t, u.pos);
        return W(t.get("carouselItemEl"), {className:u.className,styles:u.styles,content:u.content,id:u.id});
    },_getValidIndex:function(t) {
        var w = this,r = w.get("isCircular"),u = w.get("numItems"),v = w.get("numVisible"),s = u - 1;
        if (t < 0) {
            t = r ? Math.ceil(u / v) * v + t : 0;
        } else {
            if (t > s) {
                t = r ? 0 : s;
            }
        }
        return t;
    },_getSelectedItem:function(v) {
        var u = this,r = u.get("isCircular"),t = u.get("numItems"),s = t - 1;
        if (v < 0) {
            if (r) {
                v = t + v;
            } else {
                v = u.get("selectedItem");
            }
        } else {
            if (v > s) {
                if (r) {
                    v = v - t;
                } else {
                    v = u.get("selectedItem");
                }
            }
        }
        return v;
    },_itemClickHandler:function(v) {
        var y = this,w = y.get("carouselItemEl"),s = y.get("element"),t,u,x = c.getTarget(v),r = x.tagName.toUpperCase();
        if (r === "INPUT" || r === "SELECT" || r === "TEXTAREA") {
            return;
        }
        while (x && x != s && x.id != y._carouselEl) {
            t = x.nodeName;
            if (t.toUpperCase() == w) {
                break;
            }
            x = x.parentNode;
        }
        if ((u = y.getItemPositionById(x.id)) >= 0) {
            y.set("selectedItem", y._getSelectedItem(u));
            y.focus();
        }
    },_keyboardEventHandler:function(t) {
        var v = this,s = c.getCharCode(t),u = c.getTarget(t),r = false;
        if (v.isAnimating() || u.tagName.toUpperCase() === "SELECT") {
            return;
        }
        switch (s) {case 37:case 38:v.selectPreviousItem();r = true;break;case 39:case 40:v.selectNextItem();r = true;break;case 33:v.scrollPageBackward();r = true;break;case 34:v.scrollPageForward();r = true;break;}
        if (r) {
            if (v.isAutoPlayOn()) {
                v.stopAutoPlay();
            }
            c.preventDefault(t);
        }
    },_loadItems:function(t) {
        var w = this,s = w.get("numItems"),u = w.get("numVisible"),v = w.get("revealAmount"),x = w._itemsTable.items.length,r = w.get("lastVisible");
        if (x > t && t + 1 >= u) {
            x = t % u || t == r ? t - t % u : t - u + 1;
        }
        if (v && t < s - 1) {
            t++;
        }
        if (t >= x && (!w.getItem(x) || !w.getItem(t))) {
            w.fireEvent(L, {ev:L,first:x,last:t,num:t - x + 1});
        }
    },_pagerChangeHandler:function(s) {
        var v = this,u = c.getTarget(s),t = u.value,r;
        if (t) {
            r = v.getFirstVisibleOnPage(t);
            v._selectedItem = r;
            v.scrollTo(r);
            v.focus();
        }
    },_pagerClickHandler:function(x) {
        var z = this,t = z.CLASSES,u = c.getTarget(x),s = u.nodeName.toUpperCase(),r,w,v,y;
        if (e.hasClass(u, t.PAGER_ITEM) || e.hasClass(u.parentNode, t.PAGER_ITEM)) {
            if (s == "EM") {
                u = u.parentNode;
            }
            r = u.href;
            w = r.lastIndexOf("#");
            v = parseInt(r.substring(w + 1), 10);
            if (v != -1) {
                y = z.getFirstVisibleOnPage(v);
                z._selectedItem = y;
                z.scrollTo(y);
                z.focus();
            }
            c.preventDefault(x);
        }
    },_parseCarousel:function(t) {
        var w = this,x,r,s,v,u;
        r = w.CLASSES;
        s = w.get("carouselEl");
        v = false;
        for (x = t.firstChild; x; x = x.nextSibling) {
            if (x.nodeType == 1) {
                u = x.nodeName;
                if (u.toUpperCase() == s) {
                    w._carouselEl = x;
                    e.addClass(w._carouselEl, w.CLASSES.CAROUSEL_EL);
                    v = true;
                }
            }
        }
        return v;
    },_parseCarouselItems:function() {
        var y = this,AA = y.CLASSES,v = 0,z,r,t,u,s,w = y.get("firstVisible"),x = y._carouselEl;
        z = y._rows;
        t = y.get("carouselItemEl");
        for (r = x.firstChild; r; r = r.nextSibling) {
            if (r.nodeType == 1) {
                s = r.nodeName;
                if (s.toUpperCase() == t) {
                    if (r.id) {
                        u = r.id;
                    } else {
                        u = e.generateId();
                        r.setAttribute("id", u);
                    }
                    y.addItem(r, w);
                    w++;
                }
            }
        }
    },_parseCarouselNavigation:function(x) {
        var y = this,w,z = y.CLASSES,s,v,u,r,t = false;
        r = e.getElementsByClassName(z.PREV_PAGE, "*", x);
        if (r.length > 0) {
            for (v in r) {
                if (r.hasOwnProperty(v)) {
                    s = r[v];
                    if (s.nodeName == "INPUT" || s.nodeName == "BUTTON" || s.nodeName == "A") {
                        y._navBtns.prev.push(s);
                    } else {
                        u = s.getElementsByTagName("INPUT");
                        if (p.isArray(u) && u.length > 0) {
                            y._navBtns.prev.push(u[0]);
                        } else {
                            u = s.getElementsByTagName("BUTTON");
                            if (p.isArray(u) && u.length > 0) {
                                y._navBtns.prev.push(u[0]);
                            }
                        }
                    }
                }
            }
            w = {prev:r};
        }
        r = e.getElementsByClassName(z.NEXT_PAGE, "*", x);
        if (r.length > 0) {
            for (v in r) {
                if (r.hasOwnProperty(v)) {
                    s = r[v];
                    if (s.nodeName == "INPUT" || s.nodeName == "BUTTON" || s.nodeName == "A") {
                        y._navBtns.next.push(s);
                    } else {
                        u = s.getElementsByTagName("INPUT");
                        if (p.isArray(u) && u.length > 0) {
                            y._navBtns.next.push(u[0]);
                        } else {
                            u = s.getElementsByTagName("BUTTON");
                            if (p.isArray(u) && u.length > 0) {
                                y._navBtns.next.push(u[0]);
                            }
                        }
                    }
                }
            }
            if (w) {
                w.next = r;
            } else {
                w = {next:r};
            }
        }
        if (w) {
            y.set("navigation", w);
            t = true;
        }
        return t;
    },_refreshUi:function() {
        var v = this,s,w = v.get("isVertical"),y = v.get("firstVisible"),t,x,r,u;
        if (v._itemsTable.numItems < 1) {
            return;
        }
        u = O.call(v, w ? "height" : "width");
        t = v._itemsTable.items[y].id;
        u = w ? d(t, "width") : d(t, "height");
        e.setStyle(v._carouselEl, w ? "width" : "height", u + "px");
        v._hasRendered = true;
        v.fireEvent(H);
    },_setCarouselOffset:function(t) {
        var r = this,s;
        s = r.get("isVertical") ? "top" : "left";
        e.setStyle(r._carouselEl, s, t + "px");
    },_setupCarouselNavigation:function() {
        var w = this,u,s,r,y,v,x,t;
        r = w.CLASSES;
        v = e.getElementsByClassName(r.NAVIGATION, "DIV", w.get("element"));
        if (v.length === 0) {
            v = W("DIV", {className:r.NAVIGATION});
            w.insertBefore(v, e.getFirstChild(w.get("element")));
        } else {
            v = v[0];
        }
        w._pages.el = W("UL");
        v.appendChild(w._pages.el);
        y = w.get("navigation");
        if (p.isString(y.prev) || p.isArray(y.prev)) {
            if (p.isString(y.prev)) {
                y.prev = [y.prev];
            }
            for (u in y.prev) {
                if (y.prev.hasOwnProperty(u)) {
                    w._navBtns.prev.push(e.get(y.prev[u]));
                }
            }
        } else {
            t = W("SPAN", {className:r.BUTTON + r.FIRST_NAV});
            e.setStyle(t, "visibility", "visible");
            u = e.generateId();
            t.innerHTML = '<button type="button" ' + 'id="' + u + '" name="' + w.STRINGS.PREVIOUS_BUTTON_TEXT + '">' + w.STRINGS.PREVIOUS_BUTTON_TEXT + "</button>";
            v.appendChild(t);
            u = e.get(u);
            w._navBtns.prev = [u];
            s = {prev:[t]};
        }
        if (p.isString(y.next) || p.isArray(y.next)) {
            if (p.isString(y.next)) {
                y.next = [y.next];
            }
            for (u in y.next) {
                if (y.next.hasOwnProperty(u)) {
                    w._navBtns.next.push(e.get(y.next[u]));
                }
            }
        } else {
            x = W("SPAN", {className:r.BUTTON + r.NEXT_NAV});
            e.setStyle(x, "visibility", "visible");
            u = e.generateId();
            x.innerHTML = '<button type="button" ' + 'id="' + u + '" name="' + w.STRINGS.NEXT_BUTTON_TEXT + '">' + w.STRINGS.NEXT_BUTTON_TEXT + "</button>";
            v.appendChild(x);
            u = e.get(u);
            w._navBtns.next = [u];
            if (s) {
                s.next = [x];
            } else {
                s = {next:[x]};
            }
        }
        if (s) {
            w.set("navigation", s);
        }
        return v;
    },_setClipContainerSize:function(r, t) {
        var z = this,x = z.get("isVertical"),AB = z._rows,v = z._cols,y = z.get("revealAmount"),s = O.call(z, "height"),u = O.call(z, "width"),AA,w;
        r = r || z._clipEl;
        if (AB) {
            AA = s * AB;
            w = u * v;
        } else {
            t = t || z.get("numVisible");
            if (x) {
                AA = s * t;
            } else {
                w = u * t;
            }
        }
        z._recomputeSize = (AA === 0);
        if (z._recomputeSize) {
            z._hasRendered = false;
            return;
        }
        y = N.call(z);
        if (x) {
            AA += (y * 2);
        } else {
            w += (y * 2);
        }
        if (x) {
            AA += M(z._carouselEl, "height");
            e.setStyle(r, "height", AA + "px");
            if (v) {
                w += M(z._carouselEl, "width");
                e.setStyle(r, "width", w + (0) + "px");
            }
        } else {
            w += M(z._carouselEl, "width");
            e.setStyle(r, "width", w + "px");
            if (AB) {
                AA += M(z._carouselEl, "height");
                e.setStyle(r, "height", AA + "px");
            }
        }
        z._setContainerSize(r);
    },_setContainerSize:function(s, t) {
        var w = this,r = w.CONFIG,z = w.CLASSES,v,y,u,x;
        v = w.get("isVertical");
        y = w._rows;
        u = w._cols;
        s = s || w._clipEl;
        t = t || (v ? "height" : "width");
        x = parseFloat(e.getStyle(s, t), 10);
        x = p.isNumber(x) ? x : 0;
        if (v) {
            x += M(w._carouselEl, "height") + d(w._navEl, "height");
        } else {
            x += M(w._carouselEl, "width");
        }
        if (!v) {
            if (x < r.HORZ_MIN_WIDTH) {
                x = r.HORZ_MIN_WIDTH;
                w.addClass(z.MIN_WIDTH);
            }
        }
        w.setStyle(t, x + "px");
        if (v) {
            x = O.call(w, "width");
            if (u) {
                x = x * u;
            }
            e.setStyle(w._carouselEl, "width", x + "px");
            if (x < r.VERT_MIN_WIDTH) {
                x = r.VERT_MIN_WIDTH;
                w.addClass(z.MIN_WIDTH);
            }
            w.setStyle("width", x + "px");
        } else {
            if (y) {
                x = O.call(w, "height");
                x = x * y;
                e.setStyle(w._carouselEl, "height", x + "px");
            }
        }
    },_setFirstVisible:function(s) {
        var r = this;
        if (s >= 0 && s < r.get("numItems")) {
            r.scrollTo(s);
        } else {
            s = r.get("firstVisible");
        }
        return s;
    },_setNavigation:function(r) {
        var s = this;
        if (r.prev) {
            c.on(r.prev, "click", f, s);
        }
        if (r.next) {
            c.on(r.next, "click", k, s);
        }
    },_setNumVisible:function(s) {
        var r = this;
        r._setClipContainerSize(r._clipEl, s);
    },_numVisibleSetter:function(t) {
        var s = this,r = t;
        if (p.isArray(t)) {
            s._cols = t[0];
            s._rows = t[1];
            r = t[0] * t[1];
        }
        return r;
    },_selectedItemSetter:function(s) {
        var r = this;
        return(s < r.get("numItems")) ? s : 0;
    },_setNumItems:function(t) {
        var s = this,r = s._itemsTable.numItems;
        if (p.isArray(s._itemsTable.items)) {
            if (s._itemsTable.items.length != r) {
                r = s._itemsTable.items.length;
                s._itemsTable.numItems = r;
            }
        }
        if (t < r) {
            while (r > t) {
                s.removeItem(r - 1);
                r--;
            }
        }
        return t;
    },_setOrientation:function(t) {
        var s = this,r = s.CLASSES;
        if (t) {
            s.replaceClass(r.HORIZONTAL, r.VERTICAL);
        } else {
            s.replaceClass(r.VERTICAL, r.HORIZONTAL);
        }
        this._itemAttrCache = {};
        return t;
    },_setRevealAmount:function(s) {
        var r = this;
        if (s >= 0 && s <= 100) {
            s = parseInt(s, 10);
            s = p.isNumber(s) ? s : 0;
            r._setClipContainerSize();
        } else {
            s = r.get("revealAmount");
        }
        return s;
    },_setSelectedItem:function(r) {
        this._selectedItem = r;
    },_getNumPages:function() {
        return Math.ceil(parseInt(this.get("numItems"), 10) / parseInt(this.get("numVisible"), 10));
    },_getLastVisible:function() {
        var r = this;
        return r.get("currentPage") + 1 == r.get("numPages") ? r.get("numItems") - 1 : r.get("firstVisible") + r.get("numVisible") - 1;
    },_syncUiForItemAdd:function(u) {
        var v,AA = this,x = AA._carouselEl,r,AB,t = AA._itemsTable,s,w,y,z;
        w = p.isUndefined(u.pos) ? u.newPos || t.numItems - 1 : u.pos;
        if (!s) {
            AB = t.items[w] || {};
            r = AA._createCarouselItem({className:AB.className,styles:AB.styles,content:AB.item,id:AB.id,pos:w});
            if (p.isUndefined(u.pos)) {
                if (!p.isUndefined(t.loading[w])) {
                    s = t.loading[w];
                }
                if (s) {
                    x.replaceChild(r, s);
                    delete t.loading[w];
                } else {
                    x.appendChild(r);
                }
            } else {
                if (!p.isUndefined(t.items[u.pos + 1])) {
                    y = e.get(t.items[u.pos + 1].id);
                }
                if (y) {
                    x.insertBefore(r, y);
                } else {
                }
            }
        } else {
            if (p.isUndefined(u.pos)) {
                if (!e.isAncestor(AA._carouselEl, s)) {
                    x.appendChild(s);
                }
            } else {
                if (!e.isAncestor(x, s)) {
                    if (!p.isUndefined(t.items[u.pos + 1])) {
                        x.insertBefore(s, e.get(t.items[u.pos + 1].id));
                    }
                }
            }
        }
        if (!AA._hasRendered) {
            AA._refreshUi();
        }
        if (AA.get("selectedItem") < 0) {
            AA.set("selectedItem", AA.get("firstVisible"));
        }
        AA._syncUiItems();
    },_syncUiForItemReplace:function(x) {
        var w = this,t = w._carouselEl,r = w._itemsTable,y = x.pos,v = x.newItem,s = x.oldItem,u;
        u = w._createCarouselItem({className:v.className,styles:v.styles,content:v.item,id:v.id,pos:y});
        if (u && s) {
            c.purgeElement(s, true);
            t.replaceChild(u, e.get(s.id));
            if (!p.isUndefined(r.loading[y])) {
                r.numItems++;
                delete r.loading[y];
            }
        }
        if (!w._hasRendered) {
            w._refreshUi();
        }
        w._syncUiItems();
    },_syncUiForItemRemove:function(w) {
        var v = this,r = v._carouselEl,t,u,s,x;
        s = v.get("numItems");
        u = w.item;
        x = w.pos;
        if (u && (t = e.get(u.id))) {
            if (t && e.isAncestor(r, t)) {
                c.purgeElement(t, true);
                r.removeChild(t);
            }
            if (v.get("selectedItem") == x) {
                x = x >= s ? s - 1 : x;
            }
        } else {
        }
        v._syncUiItems();
    },_syncUiForLazyLoading:function(v) {
        var z = this,x = z._carouselEl,t = z._itemsTable,w = t.items.length,y = t.items[v.last + 1],r,s;
        if (!y && v.last < w) {
            s = v.first;
            do{
                y = t.items[s];
                s++;
            } while (s < w && !y);
        }
        for (var u = v.first; u <= v.last; u++) {
            if (p.isUndefined(t.loading[u]) && p.isUndefined(t.items[u])) {
                r = z._createCarouselItem({className:z.CLASSES.ITEM_LOADING,content:z.STRINGS.ITEM_LOADING_CONTENT,id:e.generateId(),pos:u});
                if (r) {
                    if (y) {
                        y = e.get(y.id);
                        if (y) {
                            x.insertBefore(r, y);
                        } else {
                        }
                    } else {
                        x.appendChild(r);
                    }
                }
                t.loading[u] = r;
            }
        }
        z._syncUiItems();
    },_syncUiItems:function() {
        var u,y = this,w = y.get("numItems"),t,s = y._itemsTable,v = s.items,r = s.loading,z,x;
        for (t = 0; t < w; t++) {
            z = v[t] || r[t];
            if (z && z.id) {
                x = m.call(y, t);
                z.styles = z.styles || {};
                for (u in x) {
                    if (x.hasOwnProperty(u)) {
                        z.styles[u] = x[u];
                    }
                }
                G(e.get(z.id), x);
            }
        }
    },_updateNavButtons:function(v, s) {
        var t,r = this.CLASSES,w,u = v.parentNode;
        if (!u) {
            return;
        }
        w = u.parentNode;
        if (v.nodeName.toUpperCase() == "BUTTON" && e.hasClass(u, r.BUTTON)) {
            if (s) {
                if (w) {
                    t = e.getChildren(w);
                    if (t) {
                        e.removeClass(t, r.FOCUSSED_BUTTON);
                    }
                }
                e.addClass(u, r.FOCUSSED_BUTTON);
            } else {
                e.removeClass(u, r.FOCUSSED_BUTTON);
            }
        }
    },_updatePagerButtons:function() {
        var z = this,x = z.CLASSES,y = z._pages.cur,r,w,u,AA,s = z.get("numVisible"),v = z._pages.num,t = z._pages.el;
        if (v === 0 || !t) {
            return;
        }
        e.setStyle(t, "visibility", "hidden");
        while (t.firstChild) {
            t.removeChild(t.firstChild);
        }
        for (u = 0; u < v; u++) {
            r = document.createElement("LI");
            if (u === 0) {
                e.addClass(r, x.FIRST_PAGE);
            }
            if (u == y) {
                e.addClass(r, x.SELECTED_NAV);
            }
            w = "<a class=" + x.PAGER_ITEM + ' href="#' + (u + 1) + '" tabindex="0"><em>' + z.STRINGS.PAGER_PREFIX_TEXT + " " + (u + 1) + "</em></a>";
            r.innerHTML = w;
            t.appendChild(r);
        }
        e.setStyle(t, "visibility", "visible");
    },_updatePagerMenu:function() {
        var z = this,x = z.CLASSES,y = z._pages.cur,s,v,AA,t = z.get("numVisible"),w = z._pages.num,u = z._pages.el,r;
        if (w === 0) {
            return;
        }
        r = document.createElement("SELECT");
        if (!r) {
            return;
        }
        e.setStyle(u, "visibility", "hidden");
        while (u.firstChild) {
            u.removeChild(u.firstChild);
        }
        for (v = 0; v < w; v++) {
            s = document.createElement("OPTION");
            s.value = v + 1;
            s.innerHTML = z.STRINGS.PAGER_PREFIX_TEXT + " " + (v + 1);
            if (v == y) {
                s.setAttribute("selected", "selected");
            }
            r.appendChild(s);
        }
        s = document.createElement("FORM");
        if (!s) {
        } else {
            s.appendChild(r);
            u.appendChild(s);
        }
        c.addListener(r, "change", z._pagerChangeHandler, this, true);
        e.setStyle(u, "visibility", "visible");
    },_updateTabIndex:function(r) {
        var s = this;
        if (r) {
            if (s._focusableItemEl) {
                s._focusableItemEl.tabIndex = -1;
            }
            s._focusableItemEl = r;
            r.tabIndex = 0;
        }
    },_validateAnimation:function(r) {
        var s = true;
        if (p.isObject(r)) {
            if (r.speed) {
                s = s && p.isNumber(r.speed);
            }
            if (r.effect) {
                s = s && p.isFunction(r.effect);
            } else {
                if (!p.isUndefined(YAHOO.util.Easing)) {
                    r.effect = YAHOO.util.Easing.easeOut;
                }
            }
        } else {
            s = false;
        }
        return s;
    },_validateFirstVisible:function(t) {
        var s = this,r = s.get("numItems");
        if (p.isNumber(t)) {
            if (r === 0 && t == r) {
                return true;
            } else {
                return(t >= 0 && t < r);
            }
        }
        return false;
    },_validateNavigation:function(r) {
        var s;
        if (!p.isObject(r)) {
            return false;
        }
        if (r.prev) {
            if (!p.isArray(r.prev)) {
                return false;
            }
            for (s in r.prev) {
                if (r.prev.hasOwnProperty(s)) {
                    if (!p.isString(r.prev[s].nodeName)) {
                        return false;
                    }
                }
            }
        }
        if (r.next) {
            if (!p.isArray(r.next)) {
                return false;
            }
            for (s in r.next) {
                if (r.next.hasOwnProperty(s)) {
                    if (!p.isString(r.next[s].nodeName)) {
                        return false;
                    }
                }
            }
        }
        return true;
    },_validateNumItems:function(r) {
        return p.isNumber(r) && (r >= 0);
    },_validateNumVisible:function(r) {
        var s = false;
        if (p.isNumber(r)) {
            s = r > 0 && r <= this.get("numItems");
        } else {
            if (p.isArray(r)) {
                if (p.isNumber(r[0]) && p.isNumber(r[1])) {
                    s = r[0] * r[1] > 0 && r.length == 2;
                }
            }
        }
        return s;
    },_validateRevealAmount:function(r) {
        var s = false;
        if (p.isNumber(r)) {
            s = r >= 0 && r < 100;
        }
        return s;
    },_validateScrollIncrement:function(r) {
        var s = false;
        if (p.isNumber(r)) {
            s = (r > 0 && r < this.get("numItems"));
        }
        return s;
    }});
})();
YAHOO.register("carousel", YAHOO.widget.Carousel, {version:"2.8.0r4",build:"2449"});


/*
 Create multiple carousel
 */

YAHOO.namespace("tshcarousel");

YAHOO.util.Event.onDOMReady(
        function (ev) {
            YAHOO.tshcarousel.Carousel.init();
        });

YAHOO.tshcarousel.Carousel = {
    carousels: '',
    init: function()
    {
        this.carousels = YAHOO.util.Dom.getElementsByClassName('carousel-container');
        for (i = 0; i < this.carousels.length; i++)
        {
            this.setup(this.carousels[i]);
        }
    },
    setup: function(carousel_el) {
        var carousel = new YAHOO.widget.Carousel(carousel_el,
        {
            numVisible: 5,
            animation: { speed: 0.5 },
            isCircular: false
        });
        carousel.render();
        carousel.show();
    }
};

var showGrid = function(){


    var storeContainer = YAHOO.util.Selector.query('body',null,true)
    if (YAHOO.util.Dom.hasClass(storeContainer, 'storeTSH')) {
            var container = YAHOO.util.Selector.query('.zoBrowseProducts',null,true);
            YAHOO.util.Dom.addClass(container, 'grid');



            var el = YAHOO.util.Selector.query('.zoBrowseProducts .zoItem.first',null,true);
            var second = YAHOO.util.Dom.getNextSibling(el);

            YAHOO.util.Dom.addClass(second, 'second');
            var els = YAHOO.util.Selector.query('.zoBrowseProducts .zoItem');

            if ( els.length % 2 !== 0){

                var secondLastImpair = YAHOO.util.Dom.getLastChild(container);
               var lastImpair = YAHOO.util.Dom.getPreviousSibling(secondLastImpair);
               YAHOO.util.Dom.addClass(lastImpair, 'lastImpair');

            }

            for(i=0; i< els.length; i++){
                    YAHOO.util.Dom.setStyle(els[i], 'height', 'auto' );
            }

            /*    compute height   */
            for(i=0; i< els.length; i++){
                if( i % 2 !== 0){

                        var height;
                        if (els[i].offsetHeight < els[i-1].offsetHeight){
                            height = (els[i-1].offsetHeight-20)+'px';
                            YAHOO.util.Dom.setStyle(els[i], 'height', height );
                            YAHOO.util.Dom.setStyle(els[i-1], 'height', height);

                        } else {
                            height = (els[i].offsetHeight-20)+'px';
                            YAHOO.util.Dom.setStyle(els[i], 'height', height);
                            YAHOO.util.Dom.setStyle(els[i-1], 'height', height);
                        }
                }

    }            

    }


}

var showList = function(){

     var container = YAHOO.util.Selector.query('.zoBrowseProducts');
     YAHOO.util.Dom.removeClass(container, 'grid');


      var els = YAHOO.util.Selector.query('.zoBrowseProducts .zoItem');



    /*    compute height   */
    for(i=0; i< els.length; i++){
            YAHOO.util.Dom.setStyle(els[i], 'height', 'auto' );
    }
}

YAHOO.util.Event.addListener("view_grid", "click", showGrid);
YAHOO.util.Event.addListener("view_list", "click", showList);

function showResearchLayout(){

    var element = YAHOO.util.Dom.get("searchResultTSH");
    if (element && parseInt(element.value) > 1){
        showGrid();                                                 
    }else{
        showList();
    }
}

showResearchLayout();





