//require nuskin.util namespace
if(!window.nuskin || !window.nuskin.util) {
	alert("error: missing nuskin.util namespace");
}
//require nuskin.account namespace
if(!window.nuskin || !window.nuskin.account) {
	alert("error: missing nuskin.account namespace");
}
if(!nuskin.util.shopAppUrl) {
	if (window.console) {
		console.log("error: missing nuskin.util.shopAppUrl property")
	}
}
//don't override if present
if (!nuskin.shop) {
	function Shop() {
		var thisShop = this;
		var requestHeaders = {Accept:"application/json"};
		
		this.cartCookieName = "nuskin.shop.cart";
		this.modeCookieName = "nuskin.shop.mode";
		this.CART_MESSAGE_TYPE = "nuskin-shop-cart";
		this.ADD_TO_CART_MESSAGE_TYPE = "nuskin-shop-add-to-cart";
		
		var cartReturnHandler = function(result){
			try {
				dojox.secure.capability.validate(result, [], []);
				var resultObject = dojo.fromJson(result);
				thisShop.updateCartLocal(resultObject);
				return true;
			} catch(e) {
				if (window.console) {
					console.log(e);
				}
			}
			return false;
		}
		
		this.updateCartLocal = function(cart) {
			dojo.cookie(
					thisShop.cartCookieName, 
					dojo.toJson({itemCount: cart.itemCount}),
					{path:'/'});
			dojo.publish(thisShop.CART_MESSAGE_TYPE, [{itemCount: cart.itemCount}]);
		}
		
		this.getCart = function() {
			var parameters = {};
			parameters.cntryCd = nuskin.util.countryCode;
			if(nuskin.account.AccountManager.currentData) {
				parameters.id = nuskin.account.AccountManager.currentData.eid;
			}
			var deferred = dojo.xhrGet(
					{url:nuskin.util.shopAppUrl+"service/cart", 
					 content:parameters, headers:requestHeaders});
			deferred.addCallback(cartReturnHandler);
		}
		
		this.addToCart = function(sku, quantity) {
			var parameters = {};
			parameters.cntryCd = nuskin.util.countryCode;
			parameters.qty = quantity;
			var deferred = dojo.xhrPost(
					{url:nuskin.util.shopAppUrl+"service/order/item/"+sku,
					 content:parameters, headers:requestHeaders});
			deferred.addCallback(function(result) {
				if(cartReturnHandler(result)) {
					dojo.publish(thisShop.ADD_TO_CART_MESSAGE_TYPE, [{sku:sku, quantity:quantity}]);
				}
			});
		}
		
		this.addToAdrCart = function(sku, quantity) {
			var parameters = {};
			parameters.cntryCd = nuskin.util.countryCode;
			parameters.qty = quantity;
			var deferred = dojo.xhrPost(
					{url:nuskin.util.shopAppUrl+"service/adr/item/"+sku,
					 content:parameters, headers:requestHeaders});
			deferred.addCallback(function(result) {
				if(cartReturnHandler(result)) {
					dojo.publish(thisShop.ADD_TO_CART_MESSAGE_TYPE, [{sku:sku, quantity:quantity}]);
				}
			});
		}
		
		this.resetCart = function() {
			var deferred = dojo.xhrGet({url:nuskin.util.shopAppUrl+"clear-session"});
			deferred.addCallback(function(){
				thisShop.getCart();
			});
		}
		
		this.getShopMode = function() {
			var modeCookie = dojo.cookie(thisShop.modeCookieName);
			var mode = "cart";
			if(modeCookie && modeCookie != '') {
				if("ADR_EDIT" == modeCookie) {
					mode = "adr-edit";
				}
			}
			return mode;
		}
		
		nuskin.util.Initializer.addOnLoad( function(){
			var cartCookie = dojo.cookie(thisShop.cartCookieName);
			if (cartCookie) {
				dojox.secure.capability.validate(cartCookie, [], []);
				var cart = dojo.fromJson(cartCookie);
				dojo.publish(thisShop.CART_MESSAGE_TYPE, [cart]);
			}
		});
		dojo.subscribe(nuskin.account.INITIALIZATION_COMPLETE, function(object) {
			thisShop.getCart();
		});
		dojo.subscribe(nuskin.account.LOGOUT_MESSAGE_TYPE, function(object) {
			thisShop.resetCart();
		});
	}
	nuskin.shop = new Shop();
	nuskin.util.BIND.listenForMessageType(nuskin.shop.CART_MESSAGE_TYPE);
	
	//register a callback for the shop app
	var minicartCallback = function(cart) {
		nuskin.shop.updateCartLocal(cart);
	};
}