﻿//Collection of function for shopping cart
SiteUI.ShoppingCartControl = function (options) {
    //default options //related data example "mode=related&productId={0}
    var defaultsOpt = {
};

var options = $.extend(defaultsOpt, options);
var baseUI = BaseUI; //use baseUI from the global Base UI

var openerSelector = ".myCart a";
var popupControlSelector = ".popupCartSummary"
var contentSelector = popupControlSelector + " .contentContainer";

var btnAjaxRefreshShoppingCartSummaryBoxSelector = ".btnAjaxRefreshShoppingCartSummaryBox";

var shoppingCartPanelSelector = ".shopControlPanel";


var closestParentItemSelector = ".item";
var addToCartSelector = ".addToCart";

var addSelectedItemToCartSelector = ".btnAddSelectedItemToCart";

var productIDSelector = ".phProductID input";
var variationIDSelector = ".phVariationID input";
var qtySelector = ".phQty input";


var firstTime = true; //indicate that this control is load for the first time, there is no data exists

var checkToReload = function () {   //check only the first time
    if (firstTime) {
        baseUI.showHideLoadingOnContent(contentSelector, true);
        //reload control
        reloadControl();
        firstTime = false;
    }
};

//reload Control
var reloadControl = function () {
    $(btnAjaxRefreshShoppingCartSummaryBoxSelector).click(); //this will prevent default        
};

//add to cart
var addToCart = function (productID, variantID, qty) {
    var relatedData = {
        productID: productID,
        variantID: variantID,
        qty: qty
    };

    baseUI.loadContent("/usercontrols/inventory/shoppingCart/ajax/AddToCart.aspx", relatedData, "",
                            function (responseText) {
                                if (responseText != "") {
                                    //means there is error
                                    alert("Error: adding this item to shopping cart : '" + responseText + "'. Please try again later.");
                                }
                                else {

                                    //if success call reload control
                                    reloadControl();

                                    //show control
                                    showControl(true);

                                    //makesure the shopping cart panel is shown and message box are shown
                                    $(shoppingCartPanelSelector).show();

                                }
                            }
                          );

}

var addToCartBatch = function (itemList) {
    var relatedData = {
        itemList: itemList
    };

    baseUI.loadContent("/usercontrols/inventory/shoppingCart/ajax/AddToCartBatch.aspx", relatedData, "",
                            function (responseText) {
                                if (responseText != "") {
                                    //means there is error
                                    alert("Error: adding this item to shopping cart : '" + responseText + "'. Please try again later.");
                                }
                                else {

                                    //if success call reload control
                                    reloadControl();

                                    //show control
                                    showControl(true);

                                    //makesure the shopping cart panel is shown and message box are shown
                                    $(shoppingCartPanelSelector).show();

                                }
                            }
                          );

}

//show control
var showControl = function (isShow) {
    if (isShow) {   //show
        $(openerSelector).controlToggleItem('show');

    }
    else {   //hide
        $(openerSelector).controlToggleItem('hide');
    }

};

var setupEvents = function () {
    $(addToCartSelector).live("click", function (e) {
        //Prevents the browser from executing the default action. Use the method isDefaultPrevented to know whether this method was ever called (on that event object).
        e.preventDefault();


        //get closest ancestor
        var parentItem = $(this).closest(closestParentItemSelector);

        var productID = parentItem.find(productIDSelector).val();
        var variantID = parentItem.find(variationIDSelector).val();
        var qty = parentItem.find(qtySelector).val();

        // check qty - no need to check this, let this pass so there will be a validation error
        // if (qty == '0' || qty == '') return;


        //show loading before postback - later will be cleared on success/failed ajax call
        baseUI.showLoadingBeforePostback(this);


        baseUI.hidePageLoader(); //hide for IE
        //add to cart
        addToCart(productID, variantID, qty);

        //Stops the bubbling of an event to parent elements, preventing any parent handlers from being notified of the event. must be put at the buttom
        e.stopPropagation();

    });

    $(addSelectedItemToCartSelector).live("click", function (e) {
        //Prevents the browser from executing the default action. Use the method isDefaultPrevented to know whether this method was ever called (on that event object).
        e.preventDefault();

        var itemList = "";

        $(qtySelector).each(function (index, value) {
            var qty = $(this).val();
            if (qty != '0' && qty != '') {
                //get closest ancestor
                var parentItem = $(this).closest(closestParentItemSelector);

                var productID = parentItem.find(productIDSelector).val();
                var variantID = parentItem.find(variationIDSelector).val();

                itemList += productID + "|" + variantID + "|" + qty + ";";
            }
        });


        //show loading before postback - later will be cleared on success/failed ajax call
        baseUI.showLoadingBeforePostback(this);

        baseUI.hidePageLoader(); //hide for IE

        //add to cart
        addToCartBatch(itemList);

        //Stops the bubbling of an event to parent elements, preventing any parent handlers from being notified of the event. must be put at the buttom
        e.stopPropagation();
    });
};


//Bind Control
var bindControl = function () {
};


/*Constructor*/
var init = function () {
    //run this async
    setTimeout(function () {
        setupEvents();
    }, 0);
} ();

return {
    reloadControl: reloadControl,
    openerSelector: openerSelector,
    popupControlSelector: popupControlSelector,
    checkToReload: checkToReload
};
}
