var cartList; //This is a list of Book in the shopping cart, it will be persisted to a document everytime something is added/removed 				 //but i want them on hand so we can use themfunction CartEntry (){	this.unid;	//the unid of the document the entry relates to	this.desc; //what shows as the description in the cart	this.price;	this.qty;		this.listNumber;} //end function cart entry//Class for cart manipulationfunction ShoppingCart (){	//prototypes	this.cartUNID;	this.totalCost;	this.checkOutVisible;	this.addToCart = addToCart;	this.removeFromCart = removeFromCart;	this.clearCart = clearCart;	this.drawCheckOut = drawCheckOut;	this.drawCartHTML = drawCartHTML;	this.updateUserCart = updateUserCart;	this.isMember = isMember;	this.initialiseCart = initialiseCart;	this.updateQuantity = updateQuantity;	this.retrieveCart = retrieveCart;	this.continueShopping = continueShopping;	this.drawConfirmationPage = drawConfirmationPage ;	this.getItemListHTML = getItemListHTML;	this.submitOrder = submitOrder;	function initialiseCart ()	{			cartList = new Array ();				cart.cartUNID = "";		cart.totalCost = 0;		cart.checkOutVisible = false;					//when we initialise we try and retireve a cart for that user if there is one that hasn't been checked out		cart.retrieveCart ();	} //end initialiseCart	//checks if a specified document is in the shopping cart	function isMember (doc)	{		for (i=0; i<cartList.length; i++)		{			if (cartList [i].unid == doc.unid)			{				doc.isInCart = true;				return true;				}		}	} //end isInCart		function addToCart (doc)	{		var elNum = cartList.length;		var tEl = new CartEntry ();		tEl.unid = doc.unid;		tEl.desc = doc.shortTitle;		tEl.price = doc.price;		tEl.qty = 1;		cart.totalCost += doc.price;		cartList [elNum] = tEl;		cartList[elNum].listNumber = elNum;		doc.isInCart = true;			//update the notes document		cart.updateUserCart (tEl);				//redraw the cart		cart.drawCartHTML ();			} //end addToCart		function removeFromCart (doc)	{		//need to find the document in the cart list - if we're saying remove from the docs in a view then		for (var i = 0; i < cartList.length; i++)		{			if (cartList [i].unid == doc.unid)			{				cart.totalCost -= (cartList[i].price * cartList[i].qty);				cartList[i].qty=0;				//update the notes document				cart.updateUserCart (cartList[i]);				cartList.removeElement (i);				i = cartList.length + 1;							}		}				doc.isInCart = false;								//redraw the cart		cart.drawCartHTML ();			} //end removeFromCart		function clearCart ()	{		//clear out the list		for (i=0; i<cartList.length; i++)		{			delete cartList[i];		}		delete cartList;		cartList = new Array();		cart.totalCost = 0;				var xmlhttp = new XMLHttpRequest ();			xmlhttp.open ("POST", "(ag.Eastend.ClearCart)?OpenAgent", true) //open the agent to send the request			//Add a listener so we know when the agent has finished retrieving information		function clearCartHandler ()		{			//only process if we get a ready state of 4			if (xmlhttp.readyState == 4)			{				//Check if we did it ok or if we got an error				if (xmlhttp.responseXML.getElementsByTagName ("Error").length >0 ){						alert ( xmlhttp.responseXML.getElementsByTagName ("Error")[0].firstChild.nodeValue);				 }				hideLoading ();						//redraw the cart				cart.drawCartHTML ();			}		}		//tell the http request what to run when we're ready		xmlhttp.onreadystatechange = clearCartHandler;			//Draw the loading DIV so the user knows we're doing something		showLoading ();	     xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');    		xmlhttp.send("&CARTUNID=" + cart.cartUNID);			}	//end clearCart		function continueShopping ()	{		removeHiddenClass ("Navigator");		addHiddenClass ("NavigatorSpacer");		removeHiddenClass ("ShoppingCart");		removeHiddenClass ("Searchbar");					cart.checkOutVisible = false;		cart.drawCartHTML ();		var el = document.getElementById ("ViewData")		el.innerHTML = "";					} //end continue shopping		function drawConfirmationPage ()	{		//draws the confirmation screen - total price, any contact details etc		var html = "";		var actionsHTML =htmlStartTag ("div", "CheckoutActions ralign", "", "") + "<a id=\"PrevAction\" href='#' onClick=\"cart.drawCheckOut (); return false;\"><< Prev</a>" +sp + sp;		actionsHTML += "<a href='#' onClick=\"cart.continueShopping (); return false;\">Continue Shopping</a>" + de;		html += actionsHTML;		html += htmlStartTag ("div", "CheckoutHeader", "", "") + "Purchase Confirmation:"+ de;		//list the items - uneditable		html += htmlStartTag ("table", "", "", "ItemsTable");		html += cart.getItemListHTML (false);				html += te				//Extra Details		html += htmlStartTag ("div", "FloatLeft", "", "PONumber") + "Purchase Order Number:" + sp + sp + "<input size=20 class=\"small\" name=\"purchasOrderNo\" id=\"purchasOrderNo\">" + de;				//Submit Action		html += htmlStartTag ("div", "FloatRight", "", "SubmitActions") + "<a href='#' onClick=\"cart.submitOrder (); return false; \">Submit Order</a>";				var el = document.getElementById ("ViewData")		el.innerHTML = html;				resetScreen ();		html += te;			}		function getItemListHTML (modify)	{		var html = "";		html += htmlStartTag ("tr", "", "", "");		html += htmlStartTag ("td", "", "10px", "") + sp + ce;		html += htmlStartTag ("td", "", "300px", "")  + "Item Description" + ce;		html += htmlStartTag ("td", "", "50px", "") + "Quantity" + ce;		html += htmlStartTag ("td", "priceCell ralign", "100px", "") + "Cost (ex-GST)" + ce + re		html += "<tr><td class='RowSpacer small' colspan=4>" + sp + ce+ re			for (var i = 0; i < cartList.length; i++)		{			html += htmlStartTag ("tr", "", "", "");			html += htmlStartTag ("td", "", "10px", "");			if (modify) html += "<a href=\"#\" onClick=\"cart.removeFromCart (cartList[" + i +"]); return false;\">X</a>"; else html += sp;			html += ce;			html += htmlStartTag ("td", "", "300px", "")  + cartList[i].desc + ce;			html += htmlStartTag ("td", "", "50px", ""); 			if (modify) html += "<input size=1 class=\"small\" name=\"qty" + cartList[i].listNumber +"\" value=" + cartList[i].qty + " onBlur=\"cart.updateQuantity (cartList[" + i + "])\">"; else html +=  cartList[i].qty;			html += ce;			html += htmlStartTag ("td", "priceCell ralign", "100px", "") + formatCurrency (cartList[i].price) + ce + re		}		html += "<tr><td class='RowSpacer small' colspan=4>" + sp + ce+ re		html += htmlStartTag ("tr", "", "", "") + "<td colspan=2>" + sp + ce;		html += htmlStartTag ("td", "", "100px", "") + "Total (ex-GST):" + ce;		html += htmlStartTag ("td", "ralign", "", "") +formatCurrency (cart.totalCost) + ce + re;		html += "<tr><td class='RowSpacer small' colspan=4>" + sp + ce+ re						return (html);	}		function drawCheckOut ()	{		var html = "";		//.1 Hide all current sections - viewdata, navigator and cart		addHiddenClass ("Navigator");		removeHiddenClass ("NavigatorSpacer");		addHiddenClass ("ShoppingCart");		var actionsHTML =htmlStartTag ("div", "CheckoutActions ralign", "", "") + "<a href='#' onClick=\"cart.continueShopping (); return false;\">Continue Shopping</a>" + sp + sp;		actionsHTML += "<a href='#' onClick=\"cart.drawConfirmationPage (); return false;\">Next >></a>" + de;				//.2 Write all of the Cart elements to the screen - this could be a lot but we can change it at a later stage if needed		html += actionsHTML;		html += htmlStartTag ("div", "CheckoutHeader", "", "") + "Items:"+ de;				html += htmlStartTag ("table", "", "", "ItemsTable");		html += cart.getItemListHTML (true);			html += te;		html += actionsHTML;		var el = document.getElementById ("ViewData")		el.innerHTML = html;				resetScreen ();				cart.checkOutVisible = true;	}	//end CheckOut		function drawCartHTML (startNo)	{		//if the checkout is visible then dont draw this draw that		if (cart.checkOutVisible) return (cart.drawCheckOut());				removeHiddenClass ("ShoppingCart");				var html ="";		var cartStart = cartList.length-1;		if (startNo)		{			cartStart = startNo;		}		if (cartList.length > 0)		{			html += htmlStartTag ("div", "CartHeader ralign", "", "") + "My Items"+ de;		}		var cost = 0;		//documents added		html += htmlStartTag ("table", "", "", "CartItems");			//we wont show all cause it could get messy, so we'll do 10 at the most		for (i=cartStart; i>cartStart-10 && i>=0; i--)		{			html += htmlStartTag ("tr", "", "", "");			html += htmlStartTag ("td", "", "5px", "") + "<a href=\"#\" onClick=\"cart.removeFromCart (cartList[" + i +"]); return false;\">X</a>" + ce;			html += htmlStartTag ("td", "", "150px", "")  + cartList[i].desc + ce;			html += htmlStartTag ("td", "priceCell ralign", "15px", "") + formatCurrency (cartList[i].price) + ce + re			html += htmlStartTag ("tr", "", "", "");			html += "<td colspan=2 class=\"ralign\">Qty: " + "<input size=1 class=\"small\" name=\"qty" + cartList[i].listNumber +"\" value=" + cartList[i].qty + " onBlur=\"cart.updateQuantity (cartList[" + i + "])\">" +ce + "<td>" +sp + ce + re; 			if (!(cartList.length-1==0 && i==0))			{				html += "<tr><td class='RowSpacer' colspan=3>" + sp + ce+ re			}			cost += (cartList[i].price * cartList[i].qty);		}					//if we dont display all then we need a 'more' link		cartStart -= 10;		if (cartStart>0)		{			html += htmlStartTag ("tr", "", "", "");			html += "<td colspan=3 class=\"ralign\"><a href='#' onClick=\"cart.drawCartHTML(" + cartStart+ "); return false;\">more entries</a>" +ce + re;		}				html += te;			//total cost		if (cost != 0)		{			html += htmlStartTag ("table", "", "", "Totals");			html += "<tr><td class='RowSpacer' colspan=2>" + sp + ce+ re			html += htmlStartTag ("tr", "", "", "");			html += htmlStartTag ("td", "", "50px", "") + "Sub-Total:" + ce;			html += htmlStartTag ("td", "ralign", "", "") +formatCurrency (cost) + ce + re;			html += htmlStartTag ("tr", "", "", "");			html += htmlStartTag ("td", "", "50px", "") + "Cart Total:" + ce;			html += htmlStartTag ("td", "ralign", "", "") +formatCurrency (cart.totalCost) + ce + re;			html += re + te;		}		var el = document.getElementById ("CartContent");		el.innerHTML = html;			if (cartList.length > 0)		{			removeHiddenClass ('CartActions');		}else		{			addHiddenClass ('CartActions');		}					resetScreen ();		}	//end drawCartHTML	function updateQuantity (el)	{		var tItem = document.getElementsByName ("qty" + el.listNumber);		var oldQty = el.qty;			el.qty = tItem[0].value;		if (oldQty != el.qty)			{				//subtract the old val			cart.totalCost -= (el.price * oldQty);			//update total cost - add the current val			cart.totalCost += (el.price * el.qty) 					if (el.qty <= 0)			{				cart.removeFromCart (el);				cart.updateUserCart (el);			}else				{				//update the notes document				cart.updateUserCart (el);				cart.drawCartHTML ();			}		}	} //end updateQuantity		function retrieveCart ()	{		//get the unid for an unchecked out cart for the user		var xmlhttp = new XMLHttpRequest ();			xmlhttp.open ("POST", "(ag.Eastend.RetrieveCart)?OpenAgent", true) //open the view ready to send the request			//Add a listener so we know when the agent has finished retrieving information		function retrieveCartHandler ()		{			//only process if we get a ready state of 4			if (xmlhttp.readyState == 4)			{				//Check if we did it ok or if we got an error				if (xmlhttp.responseXML.getElementsByTagName ("Error").length >0 ){						alert ( xmlhttp.responseXML.getElementsByTagName ("Error")[0].firstChild.nodeValue);				 }else				{					//get the cart unid if there is one, other wise we dont do anything					if (xmlhttp.responseXML.getElementsByTagName ("CARTUNID").length > 0)					{						cart.cartUNID = xmlhttp.responseXML.getElementsByTagName ("CARTUNID")[0].firstChild.nodeValue;						//process the rest						if (processRetrievedCart (xmlhttp.responseXML))						{							cart.retrieveCart ();						}else						{							cart.drawCartHTML ();						}					}else					{							cart.drawCartHTML ();					}				}					hideLoading ();			}		}		//tell the http request what to run when we're ready		xmlhttp.onreadystatechange = retrieveCartHandler;			//Draw the loading DIV so the user knows we're doing something		showLoading ();		var pos = cartList.length;	     xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');		xmlhttp.send("&USERNAME=" + currentUser + "&POSITION=" +pos + "&CARTUNID=" + cart.cartUNID);	} //end retrieveCart	function processRetrievedCart (oDomDoc)	{			var tEl;		if (oDomDoc.getElementsByTagName ("CARTELEMENT").length>0)		{			var cartEls = oDomDoc.getElementsByTagName ("CARTELEMENT");			for (i=0; i<cartEls.length; i++)			{				tEl = new CartEntry ();				tEl.unid = cartEls[i].getAttribute ("UNID");				tEl.desc = cartEls[i].getAttribute ("DESC");				tEl.price = cartEls[i].getAttribute ("PRICE");				tEl.qty = cartEls[i].getAttribute ("QTY");				tEl.listNumber = cartList.length;				cartList [cartList.length] = tEl;				cart.totalCost += (tEl.price * tEl.qty)			}		} //end cart els			if (oDomDoc.getElementsByTagName ("NOMOREDOCS").length>0)		{			return (false);		}else{			return (true);		} 	} //end processRetrievedCart		function updateUserCart (el)	{		//if check out we tell the agent to finalise the purchase and check out		var xmlhttp = new XMLHttpRequest ();			xmlhttp.open ("POST", "(ag.Eastend.UpdateCart)?OpenAgent", true) //open the agent ready to send the request			//Add a listener so we know when the agent has finished retrieving information		function updateCartHandler ()		{			//only process if we get a ready state of 4			if (xmlhttp.readyState == 4)			{				//Check if we did it ok or if we got an error				if (xmlhttp.responseXML.getElementsByTagName ("Error").length >0 ){						alert ( xmlhttp.responseXML.getElementsByTagName ("Error")[0].firstChild.nodeValue);				 }else				{					//get the cart unid					if (xmlhttp.responseXML.getElementsByTagName ("CartUNID").length > 0)					{						cart.cartUNID = xmlhttp.responseXML.getElementsByTagName ("CartUNID")[0].firstChild.nodeValue;					}				}					hideLoading ();			}		}		//tell the http request what to run when we're ready		xmlhttp.onreadystatechange = updateCartHandler;			//Draw the loading DIV so the user knows we're doing something		showLoading ();	     xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');	     var sendHTML= "&CARTUNID=" + cart.cartUNID + "&DOCUNID=" + el.unid + "&QTY=" + el.qty + "&USERNAME=" + currentUser;;    		xmlhttp.send(sendHTML);		} //end updateUserCart		function submitOrder ()	{		//1. hide all other divs and show just the submitting one, this will stop them from hitting it twice or anything		addHiddenClass ("Navigator");		removeHiddenClass ("NavigatorSpacer");		addHiddenClass ("ShoppingCart");		addHiddenClass ("ViewData");		addHiddenClass ("Searchbar");				removeHiddenClass ("SubmitLayer");		resetScreen ();		//2. submit the cart, this will validate it as well - it in the agent and save it and mark it as closed		var xmlhttp;			xmlhttp = new XMLHttpRequest ();			xmlhttp.open ("POST", "(ag.Eastend.SubmitCart)?OpenAgent", false) //open the agent ready to send the request		xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');		xmlhttp.send("&CARTUNID=" + cart.cartUNID + "&PONUMBER=" + document.getElementById ("purchasOrderNo").value);		if(xmlhttp.responseXML.parseError != 0 || xmlhttp.responseXML.getElementsByTagName ("Error").length >0 ){			  // construct a human readable error description			 if (xmlhttp.responseXML.parseError != 0) alert(Sarissa.getParseErrorText(xmlhttp.responseXML)); else alert ( xmlhttp.responseXML.getElementsByTagName ("Error")[0].firstChild.nodeValue);			 //unhide the search and the view data			removeHiddenClass ("ViewData");			removeHiddenClass ("Searchbar");					addHiddenClass ("SubmitLayer");					 		}else{					//Display the Order Details so they can Print it if they want, also let them email it to an email address.			addHiddenClass ("SubmitActions");			addHiddenClass ("PrevAction");			removeHiddenClass ("ViewData");			//removeHiddenClass ("Searchbar");					var poHTML = "<br><br><span class='bold'>Purchase Order Number: " + document.getElementById ("purchasOrderNo").value + "</span>";			document.getElementById ("PONumber").innerHTML = poHTML;						addHiddenClass ("SubmitLayer");					//Submit went perfectly so clear out this cart			for (i=0; i<cartList.length; i++)			{				delete cartList[i];			}			delete cartList;			cartList = new Array();			cart.totalCost = 0;			cart.unid = ""		}						} //end submitOrder		} //end class
