var mmjQuery = jQuery.noConflict();
var AddQuantityWarning = true;
var AddOnSaleWarning = true;

(function (mmjQuery) {
    mmjQuery.toJSON = function (o) {
        if (typeof (JSON) == 'object' && JSON.stringify)
            return JSON.stringify(o);

        var type = typeof (o);

        if (o === null)
            return "null";

        if (type == "undefined")
            return undefined;

        if (type == "number" || type == "boolean")
            return o + "";

        if (type == "string")
            return mmjQuery.quoteString(o);

        if (type == 'object') {
            if (typeof o.toJSON == "function")
                return mmjQuery.toJSON(o.toJSON());

            if (o.constructor === Date) {
                var month = o.getUTCMonth() + 1;
                if (month < 10) month = '0' + month;

                var day = o.getUTCDate();
                if (day < 10) day = '0' + day;

                var year = o.getUTCFullYear();

                var hours = o.getUTCHours();
                if (hours < 10) hours = '0' + hours;

                var minutes = o.getUTCMinutes();
                if (minutes < 10) minutes = '0' + minutes;

                var seconds = o.getUTCSeconds();
                if (seconds < 10) seconds = '0' + seconds;

                var milli = o.getUTCMilliseconds();
                if (milli < 100) milli = '0' + milli;
                if (milli < 10) milli = '0' + milli;

                return '"' + year + '-' + month + '-' + day + 'T' +
                             hours + ':' + minutes + ':' + seconds +
                             '.' + milli + 'Z"';
            }

            if (o.constructor === Array) {
                var ret = [];
                for (var i = 0; i < o.length; i++)
                    ret.push(mmjQuery.toJSON(o[i]) || "null");

                return "[" + ret.join(",") + "]";
            }

            var pairs = [];
            for (var k in o) {
                var name;
                var type = typeof k;

                if (type == "number")
                    name = '"' + k + '"';
                else if (type == "string")
                    name = mmjQuery.quoteString(k);
                else
                    continue;  //skip non-string or number keys

                if (typeof o[k] == "function")
                    continue;  //skip pairs where the value is a function.

                var val = mmjQuery.toJSON(o[k]);

                pairs.push(name + ":" + val);
            }

            return "{" + pairs.join(", ") + "}";
        }
    };

    mmjQuery.evalJSON = function (src) {
        if (typeof (JSON) == 'object' && JSON.parse)
            return JSON.parse(src);
        return eval("(" + src + ")");
    };

    mmjQuery.secureEvalJSON = function (src) {
        if (typeof (JSON) == 'object' && JSON.parse)
            return JSON.parse(src);

        var filtered = src;
        filtered = filtered.replace(/\\["\\\/bfnrtu]/g, '@');
        filtered = filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
        filtered = filtered.replace(/(?:^|:|,)(?:\s*\[)+/g, '');

        if (/^[\],:{}\s]*$/.test(filtered))
            return eval("(" + src + ")");
        else
            throw new SyntaxError("Error parsing JSON, source is not valid.");
    };

    mmjQuery.quoteString = function (string) {
        if (string.match(_escapeable)) {
            return '"' + string.replace(_escapeable, function (a) {
                var c = _meta[a];
                if (typeof c === 'string') return c;
                c = a.charCodeAt();
                return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
            }) + '"';
        }
        return '"' + string + '"';
    };

    var _escapeable = /["\\\x00-\x1f\x7f-\x9f]/g;

    var _meta = {
        '\b': '\\b',
        '\t': '\\t',
        '\n': '\\n',
        '\f': '\\f',
        '\r': '\\r',
        '"': '\\"',
        '\\': '\\\\'
    };
})(jQuery);


mmjQuery.cookie = function (name, value, options) {
    if (typeof value != 'undefined') {
        options = options || {};
        if (value === null) {
            value = '';
            options.expires = -1;
        }
        var expires = '';
        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
            var date;
            if (typeof options.expires == 'number') {
                date = new Date();
                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
            } else {
                date = options.expires;
            }
            expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
        }

        var path = options.path ? '; path=' + (options.path) : '';
        var domain = options.domain ? '; domain=' + (options.domain) : '';
        var secure = options.secure ? '; secure' : '';
        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
    }
    else {
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);

                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
};


var ShoppingCartItemsArray = null;
var AddOnSaleArray = null;

var ShoppingCart = {

    AddItem: function (CurrentShoppingCartItem, UpdateDisplay) {
        if (ShoppingCartItemsArray == null) {
            ShoppingCartItemsArray = new Array(CurrentShoppingCartItem);
            this.Show();
            this.AddOnSaleValidateItem(CurrentShoppingCartItem);
        }
        else {
            NewItem = true;
            for (i = 0; i < ShoppingCartItemsArray.length; i++) {
                if (ShoppingCartItemsArray[i].Sku == CurrentShoppingCartItem.Sku) {
                    this.UpdateQuantity(CurrentShoppingCartItem.Sku, true);
                    NewItem = false;
                    break;
                }
            }
            if (NewItem) {
                ShoppingCartItemsArray.push(CurrentShoppingCartItem);
            }
        }
        if (UpdateDisplay) {
            this.Save();
            this.Display();
        }
    },
    RemoveItem: function (Sku) {
        for (i = 0; i < ShoppingCartItemsArray.length; i++) {
            if (ShoppingCartItemsArray[i].Sku == Sku) {
                ShoppingCartItemsArray.remove(i);
            }
        }
        if (ShoppingCartItemsArray.length == 0) {
            this.Clear();
        }
        else {
            this.Save();
            this.Display();
        }
    },
    FindBySku: function (Sku) {
        if (ShoppingCartItemsArray != null && ShoppingCartItemsArray.length > 0) {
            ShoppingCartItemIndex = FindIndexByKeyValue(ShoppingCartItemsArray, "Sku", Sku);
            if (ShoppingCartItemIndex != null) {
                return ShoppingCartItemsArray[ShoppingCartItemIndex];
            }
        }
        return null;
    },
    FindByProductID: function (ProductID) {
        if (ShoppingCartItemsArray != null && ShoppingCartItemsArray.length > 0) {
            ShoppingCartItemIndex = FindIndexByKeyValue(ShoppingCartItemsArray, "ProductID", ProductID);
            if (ShoppingCartItemIndex != null) {
                return ShoppingCartItemsArray[ShoppingCartItemIndex];
            }
        }
        return null;
    },
    UpdateQuantity: function (Sku, IncreaseQuantity) {
        CurrentProductInShoppingCart = this.FindBySku(Sku);
        if (CurrentProductInShoppingCart != null) {
            if (IncreaseQuantity) {
                if (CurrentProductInShoppingCart.Quantity == 25) {
                    if (AddQuantityWarning) {
                        alert('You are only allowed to purchase up to 25 of any one item.  For orders larger than this please contact us MapleMusic 1-877-944-5144.');
                        AddQuantityWarning = false;
                    }
                }
                else {
                    CurrentProductInShoppingCart.Quantity++;
                }
            }
            else {
                CurrentProductInShoppingCart.Quantity--;
                if (CurrentProductInShoppingCart.Quantity == 0) {
                    this.RemoveItem(Sku);
                }
            }
        }
        this.AddOnSaleValidateItem(CurrentProductInShoppingCart);
        this.Save();
        this.Display();
    },
    Clear: function () {
        ShoppingCartItemsArray = null;
        this.Save();
        this.Display();
        this.Hide();
    },
    Checkout: function () {
        if (ShoppingCartItemsArray == null || ShoppingCartItemsArray.length == 0) {
            alert("Your Shopping Cart is empty.");
            return;
        }
        var order = "http://www.maplemusic.com/outside_orderform.asp?order=";
        for (i = 0; i < ShoppingCartItemsArray.length; i++) {
            CurrentShoppingCartItem = ShoppingCartItemsArray[i];
            order = order + CurrentShoppingCartItem.Sku + ":" + CurrentShoppingCartItem.Quantity + "|";
        }
        order = order.substring(0, order.length - 1);
        order = order + "&artist=" + wlpc.WhiteLabelProductContainer.DepartmentID;
        order = order + "&ref=" + getQueryString()["ref"];
        window.open(order, "maplemusic", "scrollbars,location,resizable,status");
    },
    Show: function () {
        mmjQuery('#mmShoppingCartShow').css("display", "none");
        mmjQuery('#mmShoppingCartHide').css("display", "inline");
        mmjQuery('#mmShoppingCartItemsWrapper').css("display", "inline");
    },
    Hide: function () {
        mmjQuery('#mmShoppingCartItemsWrapper').css("display", "none");
        mmjQuery('#mmShoppingCartHide').css("display", "none");
        mmjQuery('#mmShoppingCartShow').css("display", "inline");
    },
    Save: function () {
        mmjQuery.cookie('mmShoppingCartCookie', mmjQuery.toJSON(ShoppingCartItemsArray), { expires: 7, path: '/' });
    },
    Load: function () {
        AddOnSaleWarning = false;
        TempShoppingCartItemsArray = mmjQuery.secureEvalJSON(mmjQuery.cookie('mmShoppingCartCookie'));
        if (TempShoppingCartItemsArray != null) {
            AddQuantityWarning = false;
            for (i = 0; i < TempShoppingCartItemsArray.length; i++) {
                NewShoppingCartItem = new ShoppingCartItem();
                NewShoppingCartItem.Name = TempShoppingCartItemsArray[i].Name;
                NewShoppingCartItem.ListPrice = TempShoppingCartItemsArray[i].ListPrice;
                NewShoppingCartItem.Sku = TempShoppingCartItemsArray[i].Sku;
                NewShoppingCartItem.ProductID = TempShoppingCartItemsArray[i].ProductID;
                NewShoppingCartItem.Quantity = TempShoppingCartItemsArray[i].Quantity;
                NewShoppingCartItem.Image = TempShoppingCartItemsArray[i].Image;
                ShoppingCart.AddItem(NewShoppingCartItem, false);
            }
        }
        this.Display();
        AddOnSaleWarning = true;
    },
    Display: function () {
        mmjQuery('#mmShoppingCart').empty();
        mmjQuery('#mmShoppingClearCart').empty();
        mmjQuery('#mmShoppingCartItemsInCart').empty();
        ItemsInCart = 0;
        if (ShoppingCartItemsArray != null && ShoppingCartItemsArray.length > 0) {
            mmjQuery('#mmShoppingClearCart').append('<div class="mmShoppingCartClear"><a onclick="ShoppingCart.Clear();"><span class="mmShoppingCartClearSpan">Clear Cart</span></a></div>');
            ShoppingCartULID = 'mmShoppingCartUL';
            mmjQuery('#mmShoppingCart').append('<ul id="' + ShoppingCartULID + '"class="' + ShoppingCartULID + '">');
            ShoppingCartUL = mmjQuery('#' + ShoppingCartULID + '');
            ShoppingCartTotal = 0;
            for (i = 0; i < ShoppingCartItemsArray.length; i++) {
                ShoppingCartUL.append('<li class="mmShoppingCartLI">' + ShoppingCartItemsArray[i].DisplayHTML() + '</li>');
                ShoppingCartTotal += ShoppingCartItemsArray[i].Quantity * ShoppingCartItemsArray[i].ListPrice;
                ItemsInCart += ShoppingCartItemsArray[i].Quantity;
            }
            mmjQuery('#mmShoppingCart').append('<div class="mmShoppingCartTotal"><span class="mmShoppingCartTotalSpan"> Total : ' + DisplayPrice(ShoppingCartTotal) + '</span></div>');
            mmjQuery('#mmShoppingCart').append('<div id="mmShoppingCartCheckoutInside"><a onclick="ShoppingCart.Checkout();"><span class="mmShoppingCartCheckoutInsideSpan">Checkout</span></a></div>');
            mmjQuery('#mmShoppingCart').append('<div id="mmShoppingCartHideInside"><a onclick="ShoppingCart.Hide();"><span class="mmShoppingCartHideInsideSpan">Hide Cart</span></a></div>');
        }
        mmjQuery('#mmShoppingCartItemsInCart').append('<span class="mmShoppingCartItemsInCartSpan">(' + ItemsInCart + ')</span>');
        if (ItemsInCart == 0) {
            mmjQuery('#mmShoppingCart').append('<div class="mmShoppingCartEmpty"><span class="mmShoppingCartEmptySpan">Your Shopping Cart is empty.</span></div>');
        }
    },
    AddOnSaleAddCondition: function (CurrentAddOnSaleCondition) {
        if (AddOnSaleArray == null) {
            AddOnSaleArray = new Array(CurrentAddOnSaleCondition);
        }
        else {
            NewCondition = true;
            for (u = 0; u < AddOnSaleArray.length; u++) {
                if (AddOnSaleArray[u].RequiredProductID == CurrentAddOnSaleCondition.RequiredProductID &&
                    AddOnSaleArray[u].RequiredQuantity == CurrentAddOnSaleCondition.RequiredQuantity &&
                    AddOnSaleArray[u].AddOnProductID == CurrentAddOnSaleCondition.AddOnProductID &&
                    AddOnSaleArray[u].AddOnQuantity == CurrentAddOnSaleCondition.AddOnQuantity) {
                    NewCondition = false;
                    break;
                }
            }
            if (NewCondition) {
                AddOnSaleArray.push(CurrentAddOnSaleCondition);
            }
        }

    },
    AddOnSaleValidateItem: function (CurrentShoppingCartItem) {
        if (AddOnSaleWarning) {
            var ValidAddOnSaleItems = null;
            var CurrentProduct = FindStoreProductBySku(CurrentShoppingCartItem.Sku);
            var CurrentProductInShoppingCart = this.FindBySku(CurrentShoppingCartItem.Sku);
            if (AddOnSaleArray != null && CurrentProductInShoppingCart != null && CurrentProduct != null) {
                for (a = 0; a < AddOnSaleArray.length; a++) {
                    CurrentAddOnSaleItem = AddOnSaleArray[a];
                    if (CurrentAddOnSaleItem.RequiredProductID == CurrentProduct.ProductID) {
                        if (CurrentAddOnSaleItem.RequiredQuantity == CurrentProductInShoppingCart.Quantity) {
                            if (ValidAddOnSaleItems == null) {
                                ValidAddOnSaleItems = new Array(CurrentAddOnSaleItem);
                            }
                            else {
                                ValidAddOnSaleItems.push(CurrentAddOnSaleItem);
                            }

                        }
                    }
                }
            }
            if (ValidAddOnSaleItems != null) {
                this.AddOnSaleDisplayOffer(ValidAddOnSaleItems);
            }
        }
    },

    AddOnSaleDisplayOffer: function (ValidAddOnSaleItemsArray) {
        if (ValidAddOnSaleItemsArray != null) {
            var AddBundleClick = '';
            var HasRequiredItems = false;
            mmjQuery('#mmProductsAddOnSale').empty();
            mmjQuery('#mmProductsAddOnSale').append('<div id="mmProductAddOnSaleHide"><a onclick="HideProductAddOnSale();"><span class="mmProductAddOnSaleHideSpan">Close</span></a></div>');
            mmjQuery('#mmProductsAddOnSale').append('<div id="mmProductAddOnSaleText"><span class="mmProductAddOnSaleTextRequiredSpan">You have ' + ValidAddOnSaleItemsArray[0].RequiredQuantity + ' ' + FindStoreProductByProductID(ValidAddOnSaleItemsArray[0].RequiredProductID).Name + ' in your cart.</span><span class="mmProductAddOnSaleTextAddOnSpan"> You can create a bundle and save by adding the following items:</span></div>');
            for (c = 0; c < ValidAddOnSaleItemsArray.length; c++) {
                CurrentAddOnSaleItem = ValidAddOnSaleItemsArray[c];
                var CurrentRequiredProduct = FindStoreProductByProductID(CurrentAddOnSaleItem.RequiredProductID);
                var CurrentAddOnProduct = FindStoreProductByProductID(CurrentAddOnSaleItem.AddOnProductID);
                var AddOnQuantity = CurrentAddOnSaleItem.AddOnQuantity;
                var AddOnQuantityAlreadyInCart = 0;
                for (d = 0; d < CurrentAddOnProduct.WhiteLabelProductVariantArray.length; d++) {
                    var CurrentAddOnProductVariant = CurrentProduct.WhiteLabelProductVariantArray[d];
                    var CurrentAddOnProductVariantShoppingCartItem = this.FindBySku(CurrentAddOnProductVariant.Sku);
                    if (CurrentAddOnProductVariantShoppingCartItem != null) {
                        AddOnQuantity -= CurrentAddOnProductVariantShoppingCartItem.Quantity;
                        AddOnQuantityAlreadyInCart += CurrentAddOnProductVariantShoppingCartItem.Quantity;
                    }
                }
                if (AddOnQuantityAlreadyInCart > CurrentAddOnSaleItem.AddOnQuantity) { AddOnQuantityAlreadyInCart = CurrentAddOnSaleItem.AddOnQuantity; }
                for (b = 0; b < AddOnQuantity; b++) {
                    AddBundleClick += AddProduct(CurrentAddOnProduct, b, mmjQuery('#mmProductsAddOnSale'), false, true, false);
                    HasRequiredItems = true;
                }
                for (e = 0; e < AddOnQuantityAlreadyInCart; e++) {
                    AddProduct(CurrentAddOnProduct, e + 'InCart', mmjQuery('#mmProductsAddOnSale'), false, false, true);
                }
            }
            if (HasRequiredItems) {
                mmjQuery('#mmProductsAddOnSale').append('<div id="mmProductAddOnSaleYes"><a onclick="' + AddBundleClick + 'HideProductAddOnSale();"><span class="mmProductAddOnSaleYesSpan">Yes</span></a></div>');
                mmjQuery('#mmProductsAddOnSale').append('<div id="mmProductAddOnSaleNo"><a onclick="HideProductAddOnSale();"><span class="mmProductAddOnSaleNoSpan">No</span></a></div>');
            }
            else {
                mmjQuery('#mmProductsAddOnSale').append('<div id="mmProductAddOnSaleOk"><a onclick="HideProductAddOnSale();"><span class="mmProductAddOnSaleOkSpan">Ok</span></a></div>');
            }

            mmjQuery('#mmProductsAddOnSale').css("display", "inline");
        }
    }
}

Array.prototype.remove = function (from, to) {
    var rest = this.slice((to || from) + 1 || this.length);
    this.length = from < 0 ? this.length + from : from;
    return this.push.apply(this, rest);
};


function AddOnSaleCondition() {
    this.RequiredProductID = "";
    this.RequiredQuantity = 0;
    this.AddOnProductID = "";
    this.AddOnQuantity = 0;
}

function ShoppingCartItem() {
    this.Name = "ShoppingCartItem";
    this.ListPrice = 0;
    this.Sku = "0";
    this.ProductID = "0";
    this.Quantity = 1;
    this.Image = "";

    this.DisplayHTML = function () {
        DisplayString = '<div class="mmShoppingCartItemImage"><img src="http://www.maplemusic.com/assets/product_images/' + this.Image + '" /></div>';
        DisplayString += '<div class="mmShoppingCartItemName">' + this.Name + '</div>';
        DisplayString += '<div class="mmShoppingCartItemSku">' + this.Sku + '</div>';
        DisplayString += '<div class="mmShoppingCartItemProductID">' + this.ProductID + '</div>';
        DisplayString += '<div class="mmShoppingCartItemListPrice">' + DisplayPrice(this.ListPrice) + '</div>';
        DisplayString += '<div class="mmShoppingCartItemDecreaseQuantity"><a onclick="ShoppingCart.UpdateQuantity(\'' + this.Sku + '\',false);"><span class="mmShoppingCartDecreaseQuantitySpan">-</span></a></div>';
        DisplayString += '<div class="mmShoppingCartItemQuantity">' + this.Quantity + '</div>';
        DisplayString += '<div class="mmShoppingCartItemListPriceSum">' + DisplayPrice(this.Quantity * this.ListPrice) + '</div>';
        DisplayString += '<div class="mmShoppingCartItemIncreaseQuantity"><a onclick="ShoppingCart.UpdateQuantity(\'' + this.Sku + '\',true);"><span class="mmShoppingCartIncreaseQuantitySpan">+</span></a></div>';
        DisplayString += '<div class="mmShoppingCartItemRemove"><a onclick="ShoppingCart.RemoveItem(\'' + this.Sku + '\',true);"><span class="mmShoppingCartRemoveSpan">x</span></a></div>';
        return DisplayString;
    }
}

function getQueryString() {
    var result = {}, queryString = location.search.substring(1),
      re = /([^&=]+)=([^&]*)/g, m;

    while (m = re.exec(queryString)) {
        result[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
    }

    return result;
}


function DisplayPrice(price) {
    price = price / 100; //convert from cents
    temp = Math.round(price * 100);
    cents = String(temp % 100);
    if (cents.length === 0) {
        cents = "00";
    }
    else if (cents.length == 1) {
        cents = "0" + cents;
    }
    dollars = String(Math.floor(temp / 100));
    return "$" + dollars + "." + cents;
};

function FindIndexByKeyValue(obj, key, value) {
    for (var i = 0; i < obj.length; i++) {
        if (obj[i][key] == value) {
            return i;
        }
    }
    return null;
}

function FindStoreProductByProductID(ProductID) {
    for (p = 0; p < wlpc.WhiteLabelProductContainer.DepartmentsArray.length; p++) {
        CurrentDepartment = wlpc.WhiteLabelProductContainer.DepartmentsArray[p];

        for (q = 0; q < CurrentDepartment.WhiteLabelProductsArray.length; q++) {
            CurrentProduct = CurrentDepartment.WhiteLabelProductsArray[q];
            if (CurrentProduct.ProductID == ProductID) {
                return CurrentProduct;
            }
        }
    }
    return null;
}

function FindStoreProductBySku(Sku) {
    for (p = 0; p < wlpc.WhiteLabelProductContainer.DepartmentsArray.length; p++) {
        CurrentDepartment = wlpc.WhiteLabelProductContainer.DepartmentsArray[p];

        for (q = 0; q < CurrentDepartment.WhiteLabelProductsArray.length; q++) {
            CurrentProduct = CurrentDepartment.WhiteLabelProductsArray[q];

            for (r = 0; r < CurrentProduct.WhiteLabelProductVariantArray.length; r++) {
                CurrentVariant = CurrentProduct.WhiteLabelProductVariantArray[r];
                if (CurrentVariant.Sku == Sku) {
                    return CurrentProduct;
                }
            }
        }
    }
    return null;
}

function FindProductCreateShoppingCartData(Sku, ProductDiv, CurrentProductID, mmProduct, mmProductClassModifier, mmProductIDModifier) {
    FoundProductInformation = '';
    FoundProductName = 'Extra Product';
    FoundProductPrice = 0;
    FoundProduct = false;
    for (p = 0; p < wlpc.WhiteLabelProductContainer.DepartmentsArray.length; p++) {
        if (FoundProduct) { break; }
        CurrentDepartment = wlpc.WhiteLabelProductContainer.DepartmentsArray[p];

        for (q = 0; q < CurrentDepartment.WhiteLabelProductsArray.length; q++) {
            if (FoundProduct) { break; }
            CurrentProduct = CurrentDepartment.WhiteLabelProductsArray[q];

            for (r = 0; r < CurrentProduct.WhiteLabelProductVariantArray.length; r++) {
                if (FoundProduct) { break; }
                CurrentVariant = CurrentProduct.WhiteLabelProductVariantArray[r];
                if (CurrentVariant.Sku == Sku) {
                    FoundProductName = CurrentProduct.Name + ' - ' + CurrentVariant.Attribute1;
                    FoundProductPrice = CurrentProduct.ListPrice;
                    FoundProductInformation = CleanText(CreateShoppingCartData(CurrentProduct.Name + ' - ' + CurrentVariant.Attribute1, CurrentProduct.ListPrice, CurrentVariant.Sku, CurrentProduct.ProductID, CurrentProduct.ImageFile));
                    FoundProduct = true;
                }
            }
        }
    }

    if (FoundProduct == false) {
        FoundProductInformation = CleanText(CreateShoppingCartData('Extra Product', 0, Sku, 0, null));
    }

    CurrentProductExtraDropDownID = mmProductIDModifier + 'ExtraDropDown' + CurrentProductID + '-' + Sku;
    ExtraProductDivID = mmProductIDModifier + 'ExtraWrapper' + CurrentProductID + '-' + Sku;

    ProductDiv.append('<li class="' + mmProduct + 'ExtraWrapper' + mmProductClassModifier + '" id="' + ExtraProductDivID + '">' + FoundProductName + ' ' + DisplayPrice(FoundProductPrice) + ' </li>');
    mmjQuery('#' + ExtraProductDivID).append('<select class="' + mmProduct + 'ExtraDropDown' + mmProductClassModifier + '" id="' + CurrentProductExtraDropDownID + '">');

    for (s = 0; s <= 10; s++) {
        mmjQuery('#' + CurrentProductExtraDropDownID + '').append('<option class="' + mmProduct + 'ExtraOption' + mmProductClassModifier + ' ' + mmProduct + 'ExtraOption' + mmProductClassModifier + Sku + '" value="' + FoundProductInformation + '">' + s + '</option>');
    }

    return 'GetSelectedExtraProduct(\'' + CurrentProductExtraDropDownID + '\');';
}

function CleanText(text) {
    retVal = '';
    for (i = 0; i < text.length; i++) {
        switch (text[i]) {
            case "'":
                retVal += '`';
                break;
            default:
                retVal += text[i];
        }
    }
    return retVal;
}


function GetSelectedVariant(CurrentProductVarientDropDownID) {
    SelectedVarientValue = mmjQuery("#" + CurrentProductVarientDropDownID + " option:selected").val();
    if (SelectedVarientValue == 'SELECT_OPTION') {
        alert('Please select an option to add to your cart from the pull down list.');
    }
    else {
        AddProductToCart(SelectedVarientValue, 1);
    }
}

function GetSelectedExtraProduct(CurrentProductVarientDropDownID) {
    Quantity = parseInt(mmjQuery("#" + CurrentProductVarientDropDownID + " option:selected").text())
    SelectedExtraProductValue = mmjQuery("#" + CurrentProductVarientDropDownID + " option:selected").val();
    if (Quantity > 0) {
        AddProductToCart(SelectedExtraProductValue, Quantity);
    }
}

function CreateShoppingCartData(Name, Price, Sku, ProductID, Image) {
    return Name + '|' + Price + '|' + Sku + '|' + ProductID + '|' + Image;
}

function AddProductToCart(ShoppingCartData, Quantity) {
    AddQuantityWarning = true;
    for (t = 0; t < Quantity; t++) {
        ShoppingCartDataArray = ShoppingCartData.split("|");
        NewShoppingCartItem = new ShoppingCartItem();
        NewShoppingCartItem.Name = ShoppingCartDataArray[0];
        NewShoppingCartItem.ListPrice = ShoppingCartDataArray[1];
        NewShoppingCartItem.Sku = ShoppingCartDataArray[2];
        NewShoppingCartItem.ProductID = ShoppingCartDataArray[3];
        NewShoppingCartItem.Image = ShoppingCartDataArray[4];
        NewShoppingCartItem.Quantity = 1;
        ShoppingCart.AddItem(NewShoppingCartItem, true);
    }
}

function AddProductMoreInfo(MoreInfo) {
    mmjQuery('#mmProductsMoreInfo').empty();
    mmjQuery('#mmProductsMoreInfo').append('<div id="mmProductMoreInfoHide"><a onclick="HideProductMoreInfo();"><span class="mmProductMoreInfoHideSpan">Close</span></a></div>');
    AddProduct(mmjQuery.secureEvalJSON(decodeURIComponent(MoreInfo)), '', mmjQuery('#mmProductsMoreInfo'), true, false, false);
    mmjQuery('#mmProducts').css("display", "none");
    mmjQuery('#mmProductsMoreInfo').css("display", "inline");
}

function HideProductMoreInfo() {
    mmjQuery('#mmProductsMoreInfo').css("display", "none");
    mmjQuery('#mmProducts').css("display", "inline");
}

function HideProductAddOnSale() {
    mmjQuery('#mmProductsAddOnSale').css("display", "none");
}

function Pulse(Element) {
    mmjQuery(Element).fadeToggle('slow', 'linear');
    mmjQuery(Element).fadeToggle('slow', 'linear');
}

function AddProduct(CurrentProduct, UniqueID, ProductDiv, IsMoreInfo, IsAddOnSaleOffer, IsAddOnSaleOfferAlreadyInCart) {
    if (IsMoreInfo == false) { HideProductMoreInfo(); }
    mmProductMoreInfoClass = (IsMoreInfo) ? 'mmMoreInfo' : '';
    mmProductMoreInfoTicketClass = (IsMoreInfo && CurrentProduct.IsTicket) ? 'mmMoreInfoTicket' : '';
    mmProductMoreInfoSingleClass = (IsMoreInfo && CurrentProduct.IsSingle) ? 'mmMoreInfoSingle' : '';

    mmProductAddOnSaleOfferClass = (IsAddOnSaleOffer) ? 'mmAddOnSale' : '';
    mmProductAddOnSaleOfferAlreadyInCartClass = (IsAddOnSaleOfferAlreadyInCart) ? 'mmAddOnSaleOfferAlreadyInCart' : '';
    mmTicketClass = (CurrentProduct.IsTicket && IsMoreInfo == false) ? 'mmTicket' : '';
    mmSingleClass = (CurrentProduct.IsSingle && IsMoreInfo == false) ? 'mmSingle' : '';
    mmNormalClass = (CurrentProduct.IsTicket == false && CurrentProduct.IsSingle == false && IsAddOnSaleOfferAlreadyInCart == false && IsAddOnSaleOffer == false && IsMoreInfo == false) ? 'mmNormal' : '';
    mmProduct = 'mmProduct';

    mmProductClassModifier = ' ' + mmNormalClass + ' ' + mmProductMoreInfoClass + ' ' + mmProductAddOnSaleOfferClass + ' ' + mmProductAddOnSaleOfferAlreadyInCartClass + ' ' + mmTicketClass + ' ' + mmSingleClass + ' ' + mmProductMoreInfoTicketClass + ' ' + mmProductMoreInfoSingleClass + ' ';
    mmProductIDModifier = mmNormalClass + mmProductMoreInfoClass + mmProductAddOnSaleOfferClass + mmProductAddOnSaleOfferAlreadyInCartClass + mmTicketClass + mmSingleClass + mmProductMoreInfoTicketClass + mmProductMoreInfoSingleClass;

    CurrentProductULID = mmProduct + mmProductIDModifier + CurrentProduct.ProductID + UniqueID;

    ProductDiv.append('<ul id="' + CurrentProductULID + '" class="' + mmProduct + 'UL' + mmProductClassModifier + '">');
    ProductUL = mmjQuery('#' + CurrentProductULID + '');
    if (IsMoreInfo || IsAddOnSaleOffer || IsAddOnSaleOfferAlreadyInCart) {
        ProductUL.append('<li class="' + mmProduct + 'Image' + mmProductClassModifier + '"><img src="http://www.maplemusic.com/assets/product_images/' + CurrentProduct.ImageFile + '"/></li>');
        if (CurrentProduct.Image2 != null) { ProductUL.append('<li class="' + mmProduct + 'Image2' + mmProductClassModifier + '"><img src="http://www.maplemusic.com/assets/product_images/' + CurrentProduct.Image2 + '"/></li>'); }
        if (CurrentProduct.Image3 != null) { ProductUL.append('<li class="' + mmProduct + 'Image3' + mmProductClassModifier + '"><img src="http://www.maplemusic.com/assets/product_images/' + CurrentProduct.Image3 + '"/></li>'); }
    }
    else {
        ProductUL.append('<li class="' + mmProduct + 'Image' + mmProductClassModifier + '"><a onclick="AddProductMoreInfo(\'' + CleanText(encodeURIComponent(mmjQuery.toJSON(CurrentProduct))) + '\');"><img src="http://www.maplemusic.com/assets/product_images/' + CurrentProduct.ImageFile + '"/></a></li>');
        if (CurrentProduct.Image2 != null) { ProductUL.append('<li class="' + mmProduct + 'Image2' + mmProductClassModifier + '"><a onclick="AddProductMoreInfo(\'' + CleanText(encodeURIComponent(mmjQuery.toJSON(CurrentProduct))) + '\');"><img src="http://www.maplemusic.com/assets/product_images/' + CurrentProduct.Image2 + '"/></a></li>'); }
        if (CurrentProduct.Image3 != null) { ProductUL.append('<li class="' + mmProduct + 'Image3' + mmProductClassModifier + '"><a onclick="AddProductMoreInfo(\'' + CleanText(encodeURIComponent(mmjQuery.toJSON(CurrentProduct))) + '\');"><img src="http://www.maplemusic.com/assets/product_images/' + CurrentProduct.Image3 + '"/></a></li>'); }
        ProductUL.append('<li class="' + mmProduct + 'MoreInfoText' + mmProductClassModifier + '"><a onclick="AddProductMoreInfo(\'' + CleanText(encodeURIComponent(mmjQuery.toJSON(CurrentProduct))) + '\');"><span class="' + mmProduct + '' + mmProductClassModifier + 'MoreInfoTextSpan">More Info</span></a></li>');
    }

    ProductUL.append('<li class="' + mmProduct + 'ID' + mmProductClassModifier + '">' + CurrentProduct.ProductID + '</li>');
    ProductUL.append('<li class="' + mmProduct + 'Name' + mmProductClassModifier + '">' + CurrentProduct.Name + '</li>');
    ProductUL.append('<li class="' + mmProduct + 'Description' + mmProductClassModifier + '">' + CurrentProduct.Description + '</li>');
    ProductUL.append('<li class="' + mmProduct + 'PreOrderDate' + mmProductClassModifier + '">' + CurrentProduct.PreOrderDate + '</li>');

    HasExtraProduct = false;
    ExtraProductClick = '';
    AddProductClick = '';
    if (IsAddOnSaleOffer == false && IsAddOnSaleOfferAlreadyInCart == false) {
        for (n = 0; n < CurrentProduct.WhiteLabelProductAttributeArray.length; n++) {
            CurrentAttribute = CurrentProduct.WhiteLabelProductAttributeArray[n];
            ProductUL.append('<li class="' + mmProduct + 'Attribute' + mmProductClassModifier + 'mmAttribute' + CurrentAttribute.Name + ' ">' + CurrentAttribute.Value + '</li>');

            if (CurrentAttribute.Name == "EXTRA_PRODUCT_SUGGESTION_SKUS") {
                ExtraProductArray = CurrentAttribute.Value.split("|");
                for (v = 0; v < ExtraProductArray.length; v++) {
                    ExtraProductClick += FindProductCreateShoppingCartData(ExtraProductArray[v], ProductUL, CurrentProduct.ProductID, mmProduct, mmProductClassModifier, mmProductIDModifier);
                }
                HasExtraProduct = true;
            }
            if (CurrentAttribute.Name == "EXTRA_PRODUCT_POPUP_PRODUCTIDS") {
                CurrentAddOnSaleArray = CurrentAttribute.Value.split("|");
                if (CurrentAddOnSaleArray != null && CurrentAddOnSaleArray.length % 3 == 0) {
                    for (w = 0; w < CurrentAddOnSaleArray.length; w += 3) {
                        NewAddOnSaleCondition = new AddOnSaleCondition();
                        NewAddOnSaleCondition.RequiredProductID = CurrentProduct.ProductID;
                        NewAddOnSaleCondition.RequiredQuantity = CurrentAddOnSaleArray[0 + w];
                        NewAddOnSaleCondition.AddOnProductID = CurrentAddOnSaleArray[1 + w];
                        NewAddOnSaleCondition.AddOnQuantity = CurrentAddOnSaleArray[2 + w];
                        ShoppingCart.AddOnSaleAddCondition(NewAddOnSaleCondition);
                    }
                }
            }
        }
    }

    if (CurrentProduct.IsSingleSku == false) {
        ProductUL.append('<li class="' + mmProduct + 'Variants' + mmProductClassModifier + '">');

        CurrentProductVarientDropDownID = CurrentProductULID + 'VariantsDropDown';

        if (IsAddOnSaleOfferAlreadyInCart == false) {
            ProductUL.append('<select class="' + mmProduct + 'VariantsDropDown' + mmProductClassModifier + '" id="' + CurrentProductVarientDropDownID + '">');

            for (m = 0; m < CurrentProduct.WhiteLabelProductVariantArray.length; m++) {
                CurrentVariant = CurrentProduct.WhiteLabelProductVariantArray[m];

                if (m == 0) { mmjQuery('#' + CurrentProductVarientDropDownID + '').append('<option class="' + mmProduct + 'VariantsOption' + mmProductClassModifier + ' ' + mmProduct + 'VariantsOption' + mmProductClassModifier + 'SelectOption' + '" value="SELECT_OPTION">Select Option</option>'); }

                if (CurrentVariant.Quantity > 0) {
                    mmjQuery('#' + CurrentProductVarientDropDownID + '').append('<option class="' + mmProduct + 'VariantsOption' + mmProductClassModifier + ' ' + mmProduct + 'VariantsOption' + mmProductClassModifier + CurrentVariant.Sku + '" value="' + CleanText(CreateShoppingCartData(CurrentProduct.Name + ' - ' + CurrentVariant.Attribute1, CurrentProduct.ListPrice, CurrentVariant.Sku, CurrentProduct.ProductID, CurrentProduct.ImageFile)) + '">' + CurrentVariant.Attribute1 + '</option>');
                }
                else {
                    mmjQuery('#' + CurrentProductVarientDropDownID + '').append('<option disabled="disabled" class="' + mmProduct + 'VariantsOption' + mmProductClassModifier + ' ' + mmProduct + 'VariantsOption' + mmProductClassModifier + CurrentVariant.Sku + '" value="' + CreateShoppingCartData(CurrentProduct.Name + ' - ' + CurrentVariant.Attribute1, CurrentProduct.ListPrice, CurrentVariant.Sku, CurrentProduct.ProductID, CurrentProduct.ImageFile) + '">OUT OF STOCK - ' + CurrentVariant.Attribute1 + '</option>');
                }
            }
        }
        ProductUL.append('</li>');
        AddProductClick = 'GetSelectedVariant(\'' + CurrentProductVarientDropDownID + '\');Pulse(this);';
        if (IsAddOnSaleOffer == false && IsAddOnSaleOfferAlreadyInCart == false) {
            if (CurrentProduct.Available) {
                ProductUL.append('<li class="' + mmProduct + 'AddToCart' + mmProductClassModifier + '"><a onclick="' + AddProductClick + ExtraProductClick + '"><span class="' + mmProduct + 'AddToCartText' + mmProductClassModifier + '">Add to Cart</span></a></li>');
            }
            else {
                ProductUL.append('<li class="' + mmProduct + 'NotAvailable' + mmProductClassModifier + '"><span class="' + mmProduct + 'NotAvailableText' + mmProductClassModifier + '">OUT OF STOCK</span></li>');
            }
        }
    }
    else {
        if (CurrentProduct.WhiteLabelProductVariantArray.length = 1) {
            CurrentVariant = CurrentProduct.WhiteLabelProductVariantArray[0];
            AddProductClick = 'AddProductToCart(\'' + CleanText(CreateShoppingCartData(CurrentProduct.Name, CurrentProduct.ListPrice, CurrentVariant.Sku, CurrentProduct.ProductID, CurrentProduct.ImageFile)) + '\', 1);Pulse(this);';
            if (IsAddOnSaleOffer == false && IsAddOnSaleOfferAlreadyInCart == false) {
                if (CurrentProduct.Available) {
                    ProductUL.append('<li class="' + mmProduct + 'AddToCart' + mmProductClassModifier + '"><a onclick="' + AddProductClick + ExtraProductClick + '"><span class="' + mmProduct + 'AddToCartText' + mmProductClassModifier + '">Add to Cart</span></a></li>');
                }
                else {
                    ProductUL.append('<li class="' + mmProduct + 'NotAvailable' + mmProductClassModifier + '"><span class="' + mmProduct + 'NotAvailableText' + mmProductClassModifier + '">OUT OF STOCK</span></li>');
                }
            }
        }
    }
    if (IsAddOnSaleOfferAlreadyInCart) {
        ProductUL.append('<li class="' + mmProduct + 'AlreadyInCartText' + mmProductClassModifier + '">ALREADY IN CART</li>');
    }

    ProductUL.append('<li class="' + mmProduct + 'Price' + mmProductClassModifier + '">' + DisplayPrice(CurrentProduct.ListPrice) + '</li>');
    return AddProductClick;
}


function LoadDepartment(DepartmentID) {
    mmjQuery('#mmProducts').empty();
    DepartmentID = (isNaN(DepartmentID.id) == false) ? DepartmentID.id : DepartmentID;
    var DepartmentIndex = FindIndexByKeyValue(wlpc.WhiteLabelProductContainer.DepartmentsArray, "DepartmentID", DepartmentID);
    for (j = 0; j < wlpc.WhiteLabelProductContainer.DepartmentsArray[DepartmentIndex].WhiteLabelProductsArray.length; j++) {
        CurrentProduct = wlpc.WhiteLabelProductContainer.DepartmentsArray[DepartmentIndex].WhiteLabelProductsArray[j];
        AddProduct(CurrentProduct, '', mmjQuery('#mmProducts'), false, false, false);
    }
}




document.writeln('<div id="mmStore">');
if (mmjQuery.browser.msie && parseInt(mmjQuery.browser.version) <= 7) {
	document.writeln('<p class="nosupport">The browser you are using is unsupported by the MapleMusic.com Store. Please view a compatible version <a href="http://www.maplemusic.com" target="_blank">here.</a></p>');
}
document.writeln('<div id="mmShoppingCartWrapper">');
document.writeln('<div id="mmShoppingCartNavWrapper">');
document.writeln('<div id="mmShoppingCartHide"><a onclick="ShoppingCart.Hide();"><span class="mmShoppingCartHideSpan">Hide Cart</span></a></div>');
document.writeln('<div id="mmShoppingCartShow"><a onclick="ShoppingCart.Show();"><span class="mmShoppingCartShowSpan">Show Cart</span></a></div>');
document.writeln('<div id="mmShoppingCartItemsInCart"></div>');
document.writeln('</div>');
document.writeln('<div id="mmShoppingCartItemsWrapper">');
document.writeln('<div id="mmShoppingCart"></div>');
document.writeln('</div>');
document.writeln('<div id="mmShoppingCartFooterWrapper">');
document.writeln('<div id="mmShoppingCartInfo"><span class="mmShoppingCartInfoSpan"><strong>Questions?</strong> Call 1-877-944-5144 or email <a href="mailto:info@maplemusic.com">info@maplemusic.com</a></span></div>');
document.writeln('<div id="mmShoppingClearCart"></div>');
document.writeln('<div id="mmShoppingCartCheckout"><a onclick="ShoppingCart.Checkout();"><span class="mmShoppingCartCheckoutSpan">Checkout</span></a></div>');
document.writeln('<div id="mmShoppingCartPaymentOptions"></div>');
document.writeln('</div>');
document.writeln('</div>');
document.writeln('<div id="mmNavWrapper">');
document.writeln('<ul id="mmNav">');

var DefaultDepartment = (typeof mmDefaultDepartment == "undefined") ? 0 : mmDefaultDepartment;
for (i = 0; i < wlpc.WhiteLabelProductContainer.DepartmentsArray.length; i++) {
    CurrentDepartment = wlpc.WhiteLabelProductContainer.DepartmentsArray[i];
    if (i == 0 && typeof mmDefaultDepartment == "undefined") {
        DefaultDepartment = CurrentDepartment.DepartmentID;
    }
    document.writeln('<li class="mmDept mmDept_' + CurrentDepartment.DepartmentID + ' " ');
    document.writeln('id="' + CurrentDepartment.DepartmentID + '" ');
    document.writeln('onClick="LoadDepartment(this);">');
    document.writeln(CurrentDepartment.DepartmentName.replace(wlpc.WhiteLabelProductContainer.DepartmentName, ''));
    document.writeln('</li>');
	var reference = getQueryString()["dept"];
	if (reference) {
		DefaultDepartment = reference;
	}
}

document.writeln('</ul>');
document.writeln('</div>');
document.writeln('<div id="mmProducts"></div>');
document.writeln('<div id="mmProductsMoreInfo"></div>');
document.writeln('<div id="mmProductsAddOnSale"></div>');
document.writeln('</div>');
ShoppingCart.Hide();
document.onload = ShoppingCart.Load();
LoadDepartment(DefaultDepartment);
