if (!bb) {
    var bb = {};
}
/**
 * CartButton is the base class for clickable elements that change the contents of the shopping cart.
 */
bb.CartButton = function(args) {
    var btnObj = {
        domNode: null,   
    	progressNode: null,
        progress: null,
        onSuccess: function() {},
        onFailure: function() {},
        cartMethod: "",
        cartArgs: {}
    };
    Object.extend(btnObj, args || {});
    btnObj.cartArgs.onSuccess = function () {
        if (btnObj.progress) {
    		btnObj.progress.revert();
    	}
		console.log("cart button success");
		args.onSuccess();
    };
	btnObj.cartArgs.onFailure = function () { 
	    if (btnObj.progress) {
			btnObj.progress.revert();
		}
		console.log("cart button failure");
		args.onFailure();
	};
    var _initProgress = function(btn) {
        if ($(btn.progressNode) && $(btn.domNode)) {
			btn.progress = bb.Progress({
				"progressNode": btn.progressNode, 
				"containerNode": btn.domNode
			});
		}
    };
    var _initEvent = function(btn) {
        if ($(btn.domNode)) {
            Event.observe(btn.domNode, 'click', function(evt) {
                _onClick(btn);
                evt.preventDefault();
            });
        }
    };
    var _onClick = function(btn) {
        console.log(enabled);
        if (btn.progress) {
            btn.progress.start();
        }
        console.log(btn.cartArgs);
        var cart_id = bb.cart[btn.cartMethod](btn.cartArgs);
    };
    _initProgress(btnObj);
    _initEvent(btnObj);
    var enabled = true;
    btnObj.setCartMethod = function(m) {
        if (typeof m === 'string' && m.length > 0) {
            this.cartMethod = m;
        }
    };
    btnObj.setCartArgs = function(mArgs) {
        Object.extend(this.cartArgs, mArgs || {});
    };
    btnObj.disable = function() {
        if (enabled) {
            this.domNode.stopObserving('click');
            Event.observe(this.domNode, 'click', function(evt) {
                evt.preventDefault();
            });
            enabled = false;
        }
    };
    btnObj.enable = function() {
        if (!enabled) {
            _initEvent(this);
            enabled = true;
        }
    };
    return btnObj;
};
//
 
bb.CartButton.Add = function(args) {
    var options = {
        cartMethod: 'add',
        cartArgs: {
            "increment" : true,		
    		"qty" : 1
        }
    };
    options.domNode = args.domNode;
    options.progressNode = args.progressNode;
    options.onSuccess = args.onSuccess;
    options.onFailure = args.onFailure;
    options.cartArgs.skuID = args.skuID;
    options.cartArgs.shoppingID = args.shoppingID;

    var btnObj = bb.CartButton(options);
    return btnObj;
};
 
 
 
bb.CartButton.Remove = function(args) {
    defaultArgs = {
        "domNode" : "",
        "progressNode" : "",
        cartMethod: 'remove',
        cartArgs: {
            "sku_id" : ""
        }
    };
    Object.extend(defaultArgs, args || {});
    var btnObj = bb.CartButton(defaultArgs);
    return btnObj;
};

bb.cart = function() {
    return {
        add : function(args) {
            
            if (bb.page.categoryID){
                var catid = bb.page.categoryID;
            }
            var jsonrpcArgs = {
                method : "cart.setqty",
                params : [{
                    "sku_id"      : args.skuID,
                    "shopping_id" : args.shoppingID,
                    "qty"         : args.qty,
                    "increment"   : 0,
                    "category_id"  : catid 
                }],
                onSuccess: function(response) {
                    var responseObj = response.responseText.evalJSON(true)
                    if (responseObj[0].error === null) {
                        console.log("cart success ", responseObj[0].result);
                         document.fire("cart:modify",responseObj[0],catid);
                         console.log("fire modify");
                    } else {
                        console.log("cart success w/error " + responseObj[0].error);
                    }
                    args.onSuccess();
                },
                onFailure: function(response) {
                    console.log("cart fail " + response);
                    args.onFailure();
                }
            };
            bb.JSONRPC.fetch(jsonrpcArgs); 
        }
    };
}();


        //
        // cart popup
bb.cart.popupView = function() {
    return {
        cartviewContainer : null,
        cartviewLink : null,
        display : function(args) {
            if (cartviewContainer) {
                args = args || { };
                bb.templateFactory.getTmpl(
                    "cart-popup-content", { SKU_ID: args.skuID }
                ).evaluateCallback({
                    callback: function(html) {
                        cartviewContainer.down('#cart-popup-content').innerHTML = html;
                        this._displaySwatch();
                        cartviewContainer.show();
                    }.bind(this)
                });
            }
        },
        _displaySwatch : function() {
            var content = $('cart-popup-content');
            var swatchHolder = $('cart-popup-content').down('.swatches');
            if (!swatchHolder) { return; }
            
            var hexText = swatchHolder.down('li').innerHTML;
            var hexVals = hexText.strip().split(',');

            var listItemNode = new Element("li");

            var aNode = new Element("a");
            var swatchNode = bb.page.getSwatchNode('#'+hexVals[0]);
            aNode.update(swatchNode);
            listItemNode.update(aNode);
            swatchNode.style.backgroundColor = '#'+hexVals[0];
            
            swatchHolder.innerHTML = '';
            swatchHolder.insert(listItemNode);
        },
        hide : function() {
            if (cartviewContainer) {
                cartviewContainer.hide();
            }
        } ,
        init: function() {

            var headerEle = $('header');

            cartviewContainer = headerEle.select("div#shopping_bag_overlay")[0];
            cartviewLink = headerEle.select("a#view_shopping_bag")[0];
            if (cartviewLink && cartviewContainer) {
                var leftOffsetValue = cartviewLink.getWidth() - cartviewContainer.getWidth() + 50;
    
                cartviewContainer.clonePosition(cartviewLink, {offsetTop: 30, offsetLeft: leftOffsetValue, setWidth: false, setHeight: false} );
    
                cartviewLink.observe("click", function() {
                    //bb.cart.popupView.display();
                    document.location.href = '/templates/transaction/viewbag.tmpl';
                });
                var closeLink = cartviewContainer.select("a.utilitynav-popup-close")[0];
                closeLink.observe("click", function(evt) {
                    bb.cart.popupView.hide();
                });
                document.observe("cart:add:success", function(evt) {
                    bb.cart.popupView.display({
                        skuID: evt.memo.skuID
                    });
                });
            }
        }
    };
}();

document.observe('dom:loaded', function () {
    bb.cart.popupView.init();
});
