/* Variables */
var posHolder = "headerTable";
var ajaxConn  = GetXmlHttpObject();
var xmlUrl = appURL + "/xml/cartRequest.w" + vParams2;
var myCart = new Cart("0");
var CartShown = false;
var SuppressError = false;
var cartTimer, addedTimer;
var orderType = "";  /* mmmmmm */
/***vv mmmmmm vv***/
var vStartLoad = false;
var currTime = new Date();
var currSecs  = (((currTime.getHours() * 60) + currTime.getMinutes()) * 60) + currTime.getSeconds();
var nocache = "&nocache=" + currSecs;
xmlUrl += nocache;
/***^^ mmmmmm ^^***/

// Get the XML HTTP Object
function GetXmlHttpObject()
{
	var xmlHttp;
	try	{ xmlHttp=new XMLHttpRequest(); }	// Firefox, Opera 8.0+, Safari
	catch (e) {
	    try { xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); }		// Internet Explorer
	    catch (e) {
			try	{ xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); }	// Internet Explorer
			catch (e) {												
				alert("Your browser does not support AJAX!");		// Unsupported
				return false;
			}
		}
	}
	return xmlHttp;
}

/* Replace with AJAX calls to grab cart into (possibly into similar JS structures to this) */
function CartLine(style, styleVal, color, colorVal, size, sizeVal, price, qty, tot)
{
	this.Style = style;
	this.StyleVal = styleVal;
	this.Color = color;
	this.ColorVal = colorVal;
	this.Size = size;
	this.SizeVal = sizeVal;
	this.Price = price;
	this.Quantity = qty;
	this.LineTotal = tot;
}
function AddedItem(style, styleVal, color, size, qty, image)
{
	this.Style = style;
	this.StyleVal = styleVal;
	this.Color = color;
	this.Size = size;
	this.Quantity = qty;
	this.ImagePath = image;
}

function Cart(subtotal)
{
	if (subtotal.length < 1)
		subtotal = 0.00;

	this.SubTotal		= subtotal;
	this.CartLines		= new Array();
	this.JustAdded		= new Array();
	this.HiddenPages	= new Array();
	this.IsLoading		= false;
 /******v mmmmmmm v******/
 if (orderType == "Q")
	   this.LoadingMessage = "Loading Wishlist...";
 else
    this.LoadingMessage = "Loading Bag...";
 /******^ mmmmmmm ^******/
	this.ToHtmlStub		= function()
	{
		var ret = "<a class=\"cartStubLink\" href=\"javascript:golink('b2c/retail-shop-list.w','main');\">";
		if (this.CartLines.length < 1)
			   ret += "No items in your bag.";
		else
		{
			var itemTotal = 0;
			for (var i=0; i<this.CartLines.length; i++)
			{
				var tItem = this.CartLines[i];
				if (isNaN(tItem.Quantity))
					itemTotal += 1;
				else
					itemTotal += parseInt(tItem.Quantity);
			}

			ret += "Items: " + itemTotal + ", Subtotal: " + this.SubTotal;
		}
		ret += "</a>";
		return ret;
	}
	this.ToHtml		= function()
	{
		if (this.CartLines.length < 1)
		{
			return "<table class=\"cartTable\"><tbody><tr>" +
				   "<td class=\"cartCell\" style=\"text-align: center\">No Items.</td>" +
				   "</tr></table>";
		}

		var msg = "<table class=\"cartTable\"><tbody>";
		var itemTotal = 0;
		for (var i=0; i<this.CartLines.length; i++)
		{
			var tItem = this.CartLines[i];
			msg += "<tr><td class=\"cartCell\" style=\"text-align: left; width: 70%;\">" +
							"<a href=\"javascript:golink('b2c/product.w?product=" + tItem.StyleVal + "','main');\">" + tItem.Style + "</a>" +
						"</td>\n" +
					    "<td class=\"cartCell\" style=\"text-align: right; width: 30%;\">" + tItem.Quantity + "@ " + tItem.Price + "</td></tr>\n" +
				   "<tr><td class=\"cartSubCell\" style=\"text-align: left;\" colspan=\"2\">" + tItem.Size + ", " + tItem.Color + "</td></tr>\n";

			if (isNaN(tItem.Quantity))
				itemTotal += 1;
			else
				itemTotal += parseInt(tItem.Quantity);
		}
		msg += "<tr><td colspan=\"2\"><hr class=\"cartSep\"></td></tr>\n" +
			   "<tr><td class=\"cartFooter\" style=\"text-align: left;\">" + itemTotal + " Items</td>\n" +
			   "<td class=\"cartFooter\" style=\"text-align: right; width: 75%;\">Subtotal: " +
				this.SubTotal + "</td></tr></tbody></table>\n";
		return msg;
	}
	this.ErrorMessage	= function (msg)
	{
		return "<table class=\"cartTable\"><tbody><tr>" +
			   "<td class=\"cartCell\" style=\"text-align: center\">" + msg + "</td>" +
			   "</tr></table>";
	}
	this.JustAddedHtml	= function ()
	{
		// This shouldn't ever really be called when there are no items, however on the off chance it was...
		if (this.JustAdded.length < 1)
		{
			return "<table class=\"cartTable\"><tbody><tr>" +
				   "<td class=\"cartCell\" style=\"text-align: center\">No items were recently added.</td>" +
				   "</tr></table>";
		}

		var msg = "<table class=\"cartTable\"><tbody>";
		for (var i = 0; i<this.JustAdded.length; i++)
		{
			var tItem = this.JustAdded[i];
			msg += "<tr><td class=\"cartCell\" style=\"text-align: left;\">" +
						"<a class=\"cartLink\" href=\"javascript:golink('b2c/product.w?product=" + tItem.StyleVal + "','main');\">" +
							tItem.ImagePath + "</a></td><td class=\"cartCell\" style=\"text-align: center;\">" +
  						"<span class=\"cartAddedText\">Added ";
			if (tItem.Quantity > 1)
				msg += tItem.Quantity + " of ";

   /******v mmmmmmm v******/
   if (orderType == "Q")
   			msg += "<br /><a href=\"javascript:golink('b2c/product.w?product=" + tItem.StyleVal + "','main');\">" +
   						tItem.Style + "</a><br /> to your wishlist.</span><br /><br />" +
   				   "<a href=\"javascript:golink('b2c/retail-wishlist.w','main');\">" +
   				   "<img src=\"/live/images/buttons/View-Wishlist.jpg\" alt=\"View Wishlist\" /></a>" +
   				   "</td></tr>";
   else
   			msg += "<br /><a href=\"javascript:golink('b2c/product.w?product=" + tItem.StyleVal + "','main');\">" +
   						tItem.Style + "</a><br /> to your bag.</span><br /><br />" +
   				   "<a href=\"javascript:golink('b2c/retail-shop-list.w','main');\">" +
   				   "<img src=\"/live/images/buttons/View-Bag.jpg\" alt=\"View Bag\" /></a>" +
   				   "</td></tr>";
   /******^ mmmmmmm ^******/
		}

		return msg;
	}
	this.IsHiddenHere	= function (page)
	{
		// Loop through HiddenPages array and search the page string for it.
		if (this.HiddenPages.length < 1)
			return false;

		if (page == null)
			page = document.location.href;

		//alert(page);	

		for (var i = 0; i<this.HiddenPages.length; i++)
		{
			var tPage = this.HiddenPages[i];
			// If we find it, return true (that it's hidden)
			if (page.toUpperCase().indexOf(tPage.toUpperCase()) >= 0)	
				return true;
		}
		return false;
	}
}

/* Events */
function cartInitialize()
{
	var floatingCart = document.getElementById("floatingCart");
	var shopStub = document.getElementById("shopStub");
	var posEle = document.getElementById(posHolder);
	//floatingCart.style.width = 250; // shopStub.offsetWidth * 1.2; // 120% of the width
	//floatingCart.style.left = document.getElementsByTagName("body")[0].offsetWidth / 2 + 70;
	//floatingCart.style.top = posEle.offsetHeight + shopStub.offsetHeight + 0; // 4 px overlap.
 if(vStartLoad==false)
 loadMyCart();
}
function dataLoaded()
{
	if (ajaxConn.readyState == 4)
	{
		myCart.IsLoading = false;
		if (ajaxConn.responseXML == null)
			return;

		var cart = ajaxConn.responseXML.documentElement;		
		if (! cart) // we got an invalid value back
			return;

		myCart = new Cart(cart.attributes.getNamedItem("total").value);
		var hiddenPages = cart.attributes.getNamedItem("hideOnPages");
		if (hiddenPages != null)
		{
			var tArr = hiddenPages.value.split(",");
			for (var i = 0; i< tArr.length; i++)
			{
				myCart.HiddenPages.push(tArr[i]);
			}
		}

		var errorMessage = cart.attributes.getNamedItem("error");
		// Check for the error attribute on the Cart element
		if (errorMessage != null && SuppressError == false)
		{
   alert(errorMessage.value); /* mmmmmm */
		}

		SuppressError = false;

		hideCartNow();
		clearTimeout(addedTimer);

		/* <added> */
		var added = cart.getElementsByTagName("added");
		myCart.JustAdded = new Array();
		if (added.length > 0)
		{
			for (var i = 0; i<added.length; i++) {
				var addItem = added[i];
				/* <style /> Style */
				var styleEle = addItem.getElementsByTagName("style")[0];
				var style = styleEle.attributes.getNamedItem("desc").value;

                /*vvv SB 08.12.31 protect null refs vvv*/

				var styleVal = 0;
				if (styleEle.childNodes.length > 0) styleVal = styleEle.childNodes[0].nodeValue;

				/* <color /> Color -- Unused atm. */	
				var color = 0;
				if (addItem.getElementsByTagName("color")[0].childNodes.length > 0)
                    color = addItem.getElementsByTagName("color")[0].childNodes[0].nodeValue;

				/* <size /> Size */
				var size = 0;
				if (addItem.getElementsByTagName("size")[0].childNodes.length > 0)
                    size = addItem.getElementsByTagName("size")[0].childNodes[0].nodeValue;

				/* <qty /> Quantity */
				var qty = 0;
                if (addItem.getElementsByTagName("qty")[0].childNodes.length > 0)
                    qty = addItem.getElementsByTagName("qty")[0].childNodes[0].nodeValue;

                /*^^^ SB 08.12.31 protect null refs ^^^*/

				/* <image /> Image */
				var imageEle = addItem.getElementsByTagName("image")[0];
				var image = null;
				if (imageEle.childNodes.length > 0)
					image = imageEle.childNodes[0].nodeValue;

				//alert(style);
				myCart.JustAdded.push(new AddedItem(style, styleVal, color, size, qty, image));
			}
			// Show the cart display with a message in it.
			displayCartNow(myCart.JustAddedHtml());

			// Hide the display just before loading
			addedTimer = setTimeout(function()
				{
					hideCart();
					setTimeout( function() { updateShopStub(); }, 400);
				}, 4500);
		}
		/* </added> */

		/* <cartLine> */
		var cartLines = cart.getElementsByTagName("cartLine");

		for (var i = 0; i<cartLines.length; i++)
		{
			var line = cartLines[i];

            /*vvv SB 08.12.31 protect null refs vvv*/

			/* <style /> Style */
			var styleEle = line.getElementsByTagName("style")[0];
			var style = styleEle.attributes.getNamedItem("desc").value;
			var styleVal = 0;
            if (styleEle.childNodes.length > 0)
                styleVal = styleEle.childNodes[0].nodeValue;

			/* <color /> Color */
			var colorEle = line.getElementsByTagName("color")[0];
			var color = colorEle.attributes.getNamedItem("desc").value;
			var colorVal = 0;
            if (colorEle.childNodes.length > 0)
                colorVal = colorEle.childNodes[0].nodeValue;

			/* <size /> Size */
			var sizeEle = line.getElementsByTagName("size")[0];	
			var size = sizeEle.attributes.getNamedItem("desc").value;
			var sizeVal = 0;
            if (sizeEle.childNodes.length > 0)
                sizeVal = sizeEle.childNodes[0].nodeValue;

			/* <price /> Item Price */
			var price = 0;
            if (line.getElementsByTagName("price")[0].childNodes.length > 0)
                price = line.getElementsByTagName("price")[0].childNodes[0].nodeValue;

			/* <qty /> Quantity */
			var quantity = 0;
            if (line.getElementsByTagName("qty")[0].childNodes.length > 0)
                quantity = line.getElementsByTagName("qty")[0].childNodes[0].nodeValue;

            /*^^^ SB 08.12.31 protect null refs ^^^*/

			/* <total /> Line Total */
			var lineTotal = line.attributes.getNamedItem("total").value;

			myCart.CartLines.push(new CartLine(style, styleVal, color, colorVal, size, sizeVal, price, quantity, lineTotal));
		}
		/* </cartLine> */
  if (orderType != "Q")                                   /* mmmmmm */
		document.getElementById("shopStub").innerHTML = myCart.ToHtmlStub();
	}
}

/* Methods */
function loadMyCart(mode,style,color,size,qty,vOrderType) /* mmmmmm */
{
	myCart.IsLoading = true;
 vStartLoad = true;
 orderType = vOrderType;                                  /* mmmmmm */
	var realUrl = xmlUrl;
	ajaxConn = GetXmlHttpObject();

	if (mode == "add") // Add something to cart mode.
	{
		realUrl +=  "&cartMode=add&style=" + style + "&color=" + color + "&size=" + size + "&qty=" + qty + "&ordertype=" + vOrderType; /* mmmmmm */
	}
	ajaxConn.onreadystatechange = dataLoaded;
	ajaxConn.open("GET", realUrl, true);
	ajaxConn.send(null);
}
function addToCart(style,color,size,qty,vOrderType) /* mmmmmm */
{
	loadMyCart("add",style,color,size,qty,vOrderType); /* mmmmmm */
}
function updateShopStub()
{
	// Update the non-cart values now that the cart is built.
	if (myCart.IsLoading)
	{
		document.getElementById("shopStub").innerHTML = myCart.LoadingMessage;
	}
	else
	{
//		document.getElementById("shopStub").innerHTML = myCart.ToHtmlStub();
		document.getElementById("floatingCart").innerHTML = myCart.ToHtml();
	}
}

function displayCart(val)
{
	if (myCart.IsHiddenHere() || myCart.CartLines.length < 1) // Don't show
		return;
	displayCartNow(val);
}
function displayCartNow(val)
{
	clearTimeout(cartTimer);
	if (! CartShown && myCart.IsLoading == false)
	{
		if (val == null)
			val = myCart.ToHtml();

		var floatingCart = document.getElementById("floatingCart");
		floatingCart.innerHTML = val;
		floatingCart.style.visibility = "visible";
		floatingCart.style.display = "block";
		CartShown = true;
	}
}

function hideCart()
{
	cartTimer = setTimeout(function() { hideCartNow() }, 250);
}
function hideCartNow()
{
	if (CartShown && SuppressError == false)
	{
		var floatingCart = document.getElementById("floatingCart");
		floatingCart.style.visibility = "hidden";
		floatingCart.style.display = "none";
		CartShown = false;
	}
}
