(function($){
	
function resetCart()
{
	/* reset cart content */
	$.extend(AsknetCart, {
		version: '1.0',
		items: 0,
		_items: [],
		_itemsByProductId: {},
		total: '0.00',
		tax: '0.00',
		ship: '0.00',
		curr: 'USD',
		lang: 'EN'
	});
	
	//alert(LANGUAGE);
	
}

var allowedCartData = ["total", "tax", "ship", "curr", "lang"];
function parseCartData(cartData)
{
	var tokens = cartData.split('|');
	for (var i in tokens)
	{
		var pair = tokens[i].split('=');
		if (pair[0] == "items") 
		{
			AsknetCart[pair[0]] = parseInt(pair[1], 10) || 0;
		}
		else if ($.inArray(pair[0], allowedCartData) >= 0) 
		{
			AsknetCart[pair[0]] = pair[1];
		}
	}
}

var mustEscapeItemRow = ["pname", "text"];
var allowedItemRow = ["am", "pid", "mid", "up", "sp", "tp"];
function parseItemRow(itemData)
{
	var item = {};
	var tokens = itemData.split('|');
	for (var i in tokens)
	{
		var pair = tokens[i].split('=');
		if (pair[0] == "sid")
		{
			item[ pair[0] ] = pair[1];
			AsknetCart._itemsByProductId[ pair[1] ] = item;
		}
		else if ($.inArray(pair[0], mustEscapeItemRow) >= 0)
		{
			item[ pair[0] ] = unescape( pair[1] );
		}
		else if ($.inArray(pair[0], allowedItemRow) >= 0)
		{
			item[ pair[0] ] = pair[1];
		}
	}
	
	AsknetCart._items.push(item);
}

function parseCartCookie()
{
	resetCart();
	
	// find the cookie we are interested in
	var cartCookie = null; 
	var tokens = document.cookie.split("; ");
	for (var i in tokens)
	{
		var idx = tokens[i].indexOf('=');
		if (idx <= -1) continue;
		if ( tokens[i].substr(0, idx) != AsknetCart._cookieName ) continue;
		cartCookie = tokens[i].substr(idx + 1);
		break;
	}
	
	if (!cartCookie) return false;
	
	tokens = cartCookie.split('&');
	for (var i in tokens)
	{
		var idx = tokens[i].indexOf(':');
		if (idx <= -1) continue;
		switch(tokens[i].substr(0, idx).toLowerCase())
		{
			case 'version':
				AsknetCart.version = tokens[i].substr(idx+3); // caters for 'v=' in v=1.0
				break; 
				
			case 'cart':
				parseCartData( tokens[i].substr(idx+1) );
				break;
				 
			case 'pos':
				parseItemRow( tokens[i].substr(idx+1) );
				break; 
		}
	}
	
	return true;
}

	
/* Builds the AsknetCart Singleton object */
AsknetCart = {
	
	/* work variables */
	_timeout: 10, // 15000, // 15 seconds
	_cookieName: "muveemc",
	_renderFunction: mvRenderCart,
	
	/* cart API */
	setup: function(cookieName, currency)
	{
		this._cookieName = cookieName;
		this._currency = currency;
		
		parseCartCookie();
		this.displayCart();
	},
	
	isEmpty: function()
	{
		return this._items.length <= 0;
	},
	getNumberOfItems: function()
	{
		return this.items;
	},
	getTotal: function()
	{
		return this.total;
	},
	getTax: function()
	{
		return this.tax;
	},
	getShipping: function()
	{
		return this.ship;
	},
	getCurrency: function()
	{
		return this.curr;
	},
	getLanguage: function()
	{
		return this.lang;	
	},
	
	getItems: function()
	{
		return this._items.concat();
	},
	
	displayCart: function()
	{
		this._renderFunction.apply( this );
	},
	
	/* muvee specific APIs */
	setRenderingFunction: function( renderFunc )
	{
		this._renderFunction = renderFunc;
	},
	
	containsProduct: function( productId )
	{
		return !!this._itemsByProductId[ productId ];
	},
	
	addToCartByURL: function(url, goToCartPage, callback)
	{
		if ($.isFunction( goToCartPage ))
		{
			// function was called with just 2 parameters
			callback = goToCartPage;
			goToCartPage = false;
		}
		
		if (!goToCartPage)
		{
			$.getAny( url, function()
			{
				parseCartCookie();
				AsknetCart.displayCart();
				if (callback)
				{
					callback(true);
				}
			});
		} 
		else
		{
			location.href = url;
		}
	},
	
	removeProductFromCart: function(productId, goToCartPage)
	{
		var url = 'https://shop.muvee.com/cgi-bin/shop?AM=0&ID=' + productId;
		if (!goToCartPage)
		{
			$.getScript(url, function(){
				parseCartCookie();
				AsknetCart.displayCart();
			});
		} 
		else
		{
			location.href = url;
		}
	}
};

resetCart();


/* ===================================================== */
/* WARNING: muvee cart specific rendering function below */
/* WARNING: code is markup dependant!                    */
/* ===================================================== */

function mvRenderCart()
{
	var cartNode = $("#cart_bg").empty(); // clear all first!
	var numItems = AsknetCart.getNumberOfItems();
	
	// first, update main cart indicator at top of the page
	var itemCountString = i18n.translate(numItems <= 0 ? 'empty' : numItems <= 1 ? '1 item' : '${n} items', {n: numItems});
	$("#cart_n_items").text(itemCountString);

	if (numItems <= 0) {
		cartNode.append('<div class="cart_header">' + i18n.translate('Your cart is empty.') + '</div>');
		return;
	}
	
	cartNode
		.append('<div class="cart_header"> ' + i18n.translate('You have ${items} in your cart', {items: '<span class="cart_num_items">' + itemCountString + '</span>'}) + ':</div>')

	var table = $('<table />');
	/* NOTE: removed because asknet doesn't support removal of all items via URL
	var removeRow = function(evt)
	{
		AsknetCart.removeProductFromCart( evt.data );
	}
	/**/

	var items = AsknetCart.getItems();
	for (var i=0; i<items.length; i++)
	{
		/* NOTE: removed because asknet doesn't support removal of all items via URL
		var row = $('<tr class="item"><td class="icon"><div title="remove this item"/></td></tr>');
		row.find('div').bind('click', items[i].mid, removeRow);
		/**/
		table.append(
			$('<tr class="item" />')
				.append($('<td class="name" />').text(items[i].pname))
				.append($('<td class="price" />').html(AsknetCart.getCurrency() + "<br />" + items[i].tp))
		)
	}
	
	var CHECKOUT_BUTTON = '<a href="' + CART_BASE_URL + '" rev="btn_CheckOut" rel="CheckOut" id="cart_checkout" class="green_with_arrow button buyNow"><div class="btn_left"/><div class="btn_bg"><div>' + i18n.translate('Checkout') + '</div></div><div class="btn_right"/></a>';
	cartNode
		.append($('<div id="cart_items_wrapper" />').html(table))
		.append($('<div id="cart_items_total" />')
			.text(i18n.translate('TOTAL') + ": " + AsknetCart.getCurrency() + " " + AsknetCart.total)
		)
		.append($('<a id="cart_edit" href="' + CART_BASE_URL + '">' + i18n.translate('Edit Cart') + ' &raquo;</a>')		
			.bind("click", {cat:'EditCart', label:'txt_EditCart'}, trackBindEvent))
		.append(CHECKOUT_BUTTON)
			.bind("click", {cat:'CheckOut', label:'btn_CheckOut'}, trackBindEvent)
			
	
}

})(jQuery)
