/*
CamjOM Slide Cart
Dependencies: jquery, cajOM 2.0

Instructions:
Include this JS file after jquery and camjOM 2.0.
Include slidecart.css (within which you can modify visual properties of slide cart).
Call initialiseSlideCart() in document.ready (example below).
You will require several HTML elements with unique IDs set in order to use the 
CamjOM Slide Cart, as follows:

#slideCartHook:
	The slideCartHook is the item on the page that will show the cart when you
	move your mouse over it, for example a "View Cart" link/button.
#slideCart:
	Should be a div or similar element, within which the actual slide cart will load.
	As such you should probably style this with a high z-index.
#slideCartLoading:
	Should be a hidden element on your page. The contents of this element
	will be displayed in the slide cart while the cart contents are still loading.
#slideCartBottom:
	Should be a hidden element on your page. This element is optional and the contained
	HTML will be appended to the slide cart drop-down. Typical use might be a hide button.



Slide Cart initialisation example using document.ready:

<script type="text/javascript">
jQuery(document).ready(function() {
	initialiseSlideCart();
});
</script>



*/


//Internal variables - do not change
var SLIDECART_STATE_HIDDEN = 0;
var SLIDECART_STATE_LOADING = 1;
var SLIDECART_STATE_SHOWING = 2;

var slideCart_state = SLIDECART_STATE_HIDDEN;

//Default settings
var slideCart_onHook = false;
var slideCart_showTimeout = null;
var slideCart_hideTimeout = null;
var slideCart_showDelay = 200;
var slideCart_hideDelay = 1000;
var slideCart_updateURL = "/shop/ajaxViewCart.do";

function initialiseSlideCart()
{

	/* SLIDE CART HOOK */

	jQuery("#slideCartHook").click(function ()
	{
		log("click: slideCartHook");
		if(slideCart_state == SLIDECART_STATE_HIDDEN)
		{
			if(slideCart_showTimeout != null)
			{
					clearTimeout(slideCart_showTimeout);
			}
			showSlideCart();
		}
	});

	jQuery("#slideCartHook").mouseover(function ()
	{
		log("mouseOver: slideCartHook");
		
		slideCart_onHook = true;
		
		if(slideCart_state == SLIDECART_STATE_HIDDEN)
		{
			if(slideCart_showTimeout != null)
			{
				clearTimeout(slideCart_showTimeout);
			}

			slideCart_showTimeout = setTimeout(checkShowSlideCart, slideCart_showDelay);
		}
	});

	jQuery("#slideCartHook").mouseout(function ()
	{
		log("mouseOut: slideCartHook");
		slideCart_onHook = false;
		
		if(slideCart_state == SLIDECART_STATE_SHOWING)
		{
			if(slideCart_hideTimeout != null)
			{
				clearTimeout(slideCart_hideTimeout);
			}

			slideCart_hideTimeout = setTimeout(checkHideSlideCart, slideCart_hideDelay);
		}
	});


	/* SLIDE CART */
	jQuery("#slideCart").mouseover(function()
	{
		log("mouseOver: slideCart");
		slideCart_onHook = true;
		if(slideCart_hideTimeout != null)
		{
			clearTimeout(slideCart_hideTimeout);
		}
	});

	jQuery("#slideCart").mouseout(function()
	{
		log("mouseOut: slideCart");
		slideCart_onHook = false;
		if(slideCart_hideTimeout != null)
		{
			clearTimeout(slideCart_hideTimeout);
		}

		if(slideCart_state == SLIDECART_STATE_SHOWING)
		{
			slideCart_hideTimeout = setTimeout(checkHideSlideCart, slideCart_hideDelay);
		}
	});
}

function checkHideSlideCart()
{
	if(!slideCart_onHook)
	{
		hideSlideCart();
	}
}

function checkShowSlideCart()
{
	if(slideCart_onHook)
	{
		showSlideCart();
	}
}

function hideSlideCart()
{
	log("** hiding slideCart **");
	slideCart_state = SLIDECART_STATE_HIDDEN;
	jQuery("#slideCart").slideUp();
}

function showSlideCart()
{
	log("** showing slideCart **");
	if(slideCart_hideTimeout != null)
	{
		clearTimeout(slideCart_hideTimeout);
	}
	if(slideCart_state == SLIDECART_STATE_HIDDEN)
	{
		jQuery("#slideCart").slideDown();
	}

	jQuery("#slideCart").get(0).innerHTML = jQuery("#slideCartLoading").get(0).innerHTML;
	slideCart_state = SLIDECART_STATE_LOADING;

	camjaxController.sendAjax(slideCart_updateURL, null, function(responseText)
	{
		var cartBottomHtml = "";
		if(jQuery("#slideCartBottom") != null)
		{
			cartBottomHtml = jQuery("#slideCartBottom").get(0).innerHTML;
		}
		jQuery("#slideCart").get(0).innerHTML = responseText + cartBottomHtml;
		slideCart_state = SLIDECART_STATE_SHOWING;

		if(!slideCart_onHook)
		{
			if(slideCart_hideTimeout != null)
			{
				clearTimeout(slideCart_hideTimeout);
			}

			slideCart_hideTimeout = setTimeout(checkHideSlideCart, slideCart_hideDelay);
		}
	});
}

function prepareRemoveFromCart(orderLineId)
{
	camjOM.removeFromCart(orderLineId);
	jQuery("#camjOMOrderLine" + orderLineId).slideUp(200);
}

function prepareClearAllFromCart()
{
	if(slideCart_hideTimeout != null)
	{
		clearTimeout(slideCart_hideTimeout);
	}

	jQuery("#slideCart").slideDown();
	jQuery("#slideCart").get(0).innerHTML = jQuery("#slideCartLoading").get(0).innerHTML;
	slideCart_state = SLIDECART_STATE_LOADING;
	camjOM.clearAllFromCart();
}

function updateChangeOrderLineQuantity(order, changedOrderLine)
{
	var slideCartOrderLineCostField = document.getElementById("camjOMCartOrderLineCost" + changedOrderLine.id);
	var slideCartOrderLineQuantityField = document.getElementById("camjOM_orderLineQuantity" + changedOrderLine.id);
	if(slideCartOrderLineCostField != null)
	{
		slideCartOrderLineCostField.innerHTML = "$" + changedOrderLine.totalCost;
	}

	if(slideCartOrderLineQuantityField != null)
	{
		slideCartOrderLineQuantityField.value = changedOrderLine.quantity;
	}

	updateOrderFields(order);
}


function updateRemoveFromCart(order, removedOrderLineId)
{
	updateOrderFields(order);
}

function updateClearAllFromCart(order)
{
	updateOrderFields(order);
	showSlideCart();
}

function updateOrderFields(order)
{
	var menuOrderTotal = document.getElementById("menuOrderTotal");
	var slideCartOrderTotal = document.getElementById("camjOMCartOrderTotal");
	menuOrderTotal.innerHTML = "$" + order.total;
	if(slideCartOrderTotal != null)
	{
		slideCartOrderTotal.innerHTML = "$" + order.total;
	}

	updateTotalItemCount(order);
}

function updateTotalItemCount(order)
{
	var totalItems = 0;
	for(var i = 0; i < order.orderLines.length; i ++)
	{
		totalItems += order.orderLines[i].quantity;
	}

	var itemCountMessage = totalItems;
	if(totalItems != 1)
	{
		itemCountMessage += " items";
	}
	else
	{
		itemCountMessage += " item";
	}

	document.getElementById("shoppingCartItemCount").innerHTML = itemCountMessage;
}

function log(message)
{
	//document.getElementById("logFile").innerHTML += message + "<br />";
}

camjOM.updateFunction_removeFromCart = updateRemoveFromCart;
camjOM.updateFunction_clearAllFromCart = updateClearAllFromCart;
camjOM.updateFunction_changeOrderLineQuantity = updateChangeOrderLineQuantity;
