var debugMessages = false;
var debugString = '';

var currentOffset = 0;
var numCartItemOffset = 15;
var maxProducts = 20;
var currentMethod = 'letter';
var currentLetter = 'a';
var currentLike = '';
var showOutOfStock = 0;

//<carts>
//	<cart>
//		<cartNumber>#</cartNumber>
//		<cartStatus>open/closed</cartStatus>
//		<year>#</year>
//		<month>#</month>
//		<item>
//			<muzeItemID>#</muzeItemID>
//			<progressID>#</progressID>
//			<coverartname>text</coverartname>
//			<title>text</title>
//			<locked>TRUE/FALSE</locked>
//			<prevRented>TRUE/FALSE</prevRented>
//			<carryOver>#</carryOver>
//			<newRelease>TRUE/FALSE</newRelease>
//			<quantityNew>#</quantityNew>
//			<quantityUsed>#</quantityUsed>
//			<returnedNew>#</returnedNew>
//			<returnedUsed>#</returnedUsed>
//		</item>
//	</cart>
//</carts>

/****************************
Transaction Event Dispatcher
****************************/
function handleCartTransaction(o) {
	debug("\nTransaction Response: \n" + o.responseText + "\nEnd Transaction Response\n");
	//return false;
	try{
		var rootTransaction = o.responseXML.getElementsByTagName('transaction').item(0);

		var transactionList = rootTransaction.getElementsByTagName('transaction');
		
		for(var i = 0; i < transactionList.length; i++){
			
			var transObject = transactionList.item(i).getElementsByTagName('objectName').item(0).firstChild.nodeValue;
			var transMethod = transactionList.item(i).getElementsByTagName('methodName').item(0).firstChild.nodeValue;
			
			switch(transObject){										
				case 'Cart':			var cart = new Cart(o, transMethod);
										break;
										
				case 'Report':			var report = new Report(o, transMethod);
										break;
										
				case 'Product':			var product = new Product(o, transMethod);
										break;
										
				case 'ReportError':		var reportError = new ReportError(o, transMethod);
										break;
																				
				case 'CartError':		var cartError = new CartError(o, transMethod);
										break;
										
				case 'ProductError':	var productError = new ProductError(o, transMethod);
										break;
										
				case 'JWebError':		var jWebError = new JWebError(o, transMethod);
										break;
			}
		}
	}
	catch(e){
		debug('Transaction Exception Caught: ' + e);
	}
	
}

/************************
Transaction Event Objects
************************/
function Cart(responseObject, transMethod){
	this.respObj = responseObject;
	
	this.displayCurrentCart = function(){
		try{
			if(undefined != this.respObj.responseXML.getElementsByTagName('carts')){
				//We specify the 1 position, because the 0 position is occupied by the header.
				var cartDiv		= $("cart"); // Get the Div.
				var cartList	= $("cartList"); //Get the item list container.
				cartList.innerHTML = "";
				
				var rootNode = this.respObj.responseXML.getElementsByTagName('cart');
				
				//Make sure we got an XML Struct that is valid		
				if(rootNode.item(0).getElementsByTagName('item').length > 0){
					
					//Nodelist of Cart Items
					var itemList = rootNode.item(0).getElementsByTagName('item');
					
					for(var i = 0 ;i < itemList.length; i++){
						
						//Calculate the quantity of the Cart Item from the number of new and used items in the item.
						var quantity = parseInt(itemList.item(i).getElementsByTagName('quantityNew').item(0).firstChild.nodeValue);
						quantity += parseInt(itemList.item(i).getElementsByTagName('quantityUsed').item(0).firstChild.nodeValue);
						
						var itemObject = {
							progressID:		replaceWhiteSpace(itemList.item(i).getElementsByTagName('progressID').item(0).firstChild.nodeValue),
							muzeItemID:		replaceWhiteSpace(itemList.item(i).getElementsByTagName('muzeItemID').item(0).firstChild.nodeValue),
							title:			itemList.item(i).getElementsByTagName('title').item(0).firstChild.nodeValue,
							locked:			itemList.item(i).getElementsByTagName('locked').item(0).firstChild.nodeValue,
							newRelease:		itemList.item(i).getElementsByTagName('newRelease').item(0).firstChild.nodeValue,
							prevRented:		itemList.item(i).getElementsByTagName('prevRented').item(0).firstChild.nodeValue,
							coverartname:	itemList.item(i).getElementsByTagName('coverartname').item(0).firstChild.nodeValue,
							quantity:		quantity
						}
													
						//If a cart item is locked, we should not show it in this view.
						if(itemObject.locked == "true"){
							continue;
						}
						else {
							var newCartItem = new CartElement(itemObject);
							cartList.appendChild(newCartItem);		
						}
						
						hideCartProgress();
						
	
					}//end for
					
					
				}else {
					hideCartProgress();
					cartList.innerHTML = "Drag movies here!";
				}//end if
			}
			else {
				
			}//end if
		}
		catch(e){
			debug("Cart Exception Caught in Cart Object, displayCurrentCart method. Error: " + e + "\n");
		}

	}
	
	this.addItemToCart = function(){

		try{
			if(undefined != this.respObj.responseXML.getElementsByTagName('item')){
				var cartList	= $("cartList"); //Get the item list container.
				
				var item = this.respObj.responseXML.getElementsByTagName('item').item(0);
				
				var quantity = parseInt(item.getElementsByTagName('quantityNew').item(0).firstChild.nodeValue);
				quantity += parseInt(item.getElementsByTagName('quantityUsed').item(0).firstChild.nodeValue);
						
				var itemObject = {
					progressID:		replaceWhiteSpace(item.getElementsByTagName('progressID').item(0).firstChild.nodeValue),
					muzeItemID: 	item.getElementsByTagName('muzeItemID').item(0).firstChild.nodeValue,
					title:			item.getElementsByTagName('title').item(0).firstChild.nodeValue,
					locked:			item.getElementsByTagName('locked').item(0).firstChild.nodeValue,
					newRelease:		item.getElementsByTagName('newRelease').item(0).firstChild.nodeValue,
					prevRented:		item.getElementsByTagName('prevRented').item(0).firstChild.nodeValue,
					coverartname:	item.getElementsByTagName('coverartname').item(0).firstChild.nodeValue,
					quantity:		quantity
				}
				
				//Append the New Cart Item to the list.
				var newCartItem = new CartElement(itemObject);
				cartList.appendChild(newCartItem);
				
				hideCartProgress();
				
			}
			else{
				
			}
		}
		catch(e){
			debug("Cart Exception Caught in Cart Object, addItemToCart method. Error: " + e + "\n");
		}
	}
	
	this.removeItemFromCart = function(){
		
		try{
			if(undefined != this.respObj.responseXML.getElementsByTagName('item')){
				
				var muzeItemID = this.respObj.responseXML.getElementsByTagName('muzeItemID').item(0).firstChild.nodeValue;
				
				//Remove the Node from the DOM!
				var deletedNode = document.getElementById(muzeItemID);
				deletedNode.parentNode.removeChild(deletedNode);
				
				hideCartProgress();
			}
			else{
				
			}
		}
		catch(e){
			debug("Cart Exception Caught in Cart Object, removeItemFromCart method. Error: " + e + "\n");
		}

	}
	
	this.updateCartItemQuantity = function(){
		try{
			hideCartProgress();
		}
		catch(e){
			debug("Cart Exception Caught in Cart Object, updateCartItemQuantity method. Error: " + e + "\n");
		}
	}
	
	this.updateSelectionsTotals = function(){
		
		try{
			
			//We need to make sure that this element is on the page.
			if(undefined != document.getElementById('cartSelections')){
				var userMaxHandle = document.getElementById('userMaxPicks');
				var userPicksUsed = document.getElementById('picksUsed');
				var userPicksRemaining = document.getElementById('picksRemaining');
				var selectionsMessage = document.getElementById('selectionsMessage');
				var selectionsHelp = document.getElementById('selectionsHelp');
						
				var updateObject = {
					packageName: 			this.respObj.responseXML.getElementsByTagName('packageName').item(0).firstChild.nodeValue,
					userSelectableMax:		this.respObj.responseXML.getElementsByTagName('userSelectableMax').item(0).firstChild.nodeValue,
					numStandardCarryOver: 	this.respObj.responseXML.getElementsByTagName('numStandardCarryOver').item(0).firstChild.nodeValue,
					numStandardPicks: 		this.respObj.responseXML.getElementsByTagName('numStandardPicks').item(0).firstChild.nodeValue,
					remainingPicks: 		this.respObj.responseXML.getElementsByTagName('remainingPicks').item(0).firstChild.nodeValue
				}
				
				userMaxHandle.innerHTML = updateObject.userSelectableMax;
				userPicksUsed.innerHTML = updateObject.numStandardPicks;
				userPicksRemaining.innerHTML = updateObject.remainingPicks;
				
				selectionsMessage.updateObject = updateObject;
				
				//Show the question mark now that we have data!
				selectionsHelp.style.visibility = "visible";
			
			}
			else{
				//We dont need to do anything.
			}
		}
		catch(e){
			debug("Cart Exception Caught in Cart Object, updateSelectionsTotals method. Error: " + e + "\n");
		}
	}
	
	this.finishCart = function(){
		
		try{
			Element.hide('loading');
			Element.hide('lightbox');
			new Effect.Fade('overlay', { duration: 1});
			
			//We will relocate when we are doing this function correctly.
			window.location = serverURL;
		}
		catch(e){
			debug("Cart Exception Caught in Cart Object, finishCart method. Error: " + e + "\n");
		}
	}
		
	this.displayCartActions = function(){
		
		try{
			if(undefined != this.respObj.responseXML.getElementsByTagName('actions')){
				var actionDiv = document.getElementById('currentCart');
				var actions = this.respObj.responseXML.getElementsByTagName('actions');
				
				actionArray = new Array();
				
				for(i = 0; i < actions.length; i++){					
					actionObject = {};
					actionObject.name = this.respObj.responseXML.getElementsByTagName('name').item(i).firstChild.nodeValue;
					actionObject.value = this.respObj.responseXML.getElementsByTagName('value').item(i).firstChild.nodeValue;
					actionArray.push(actionObject);
				}
				
				
				for(j = 0; j < actionArray.length; j++){
					switch(actionArray[j].name){
						case 'userselect':
							if(actionArray[j].value > 0){
								
								cartInstructionsDiv = document.getElementById('instructions');
								contentString = "Welcome to Slackers Movie Library! You have successfully logged-in. If you haven't yet chosen your movies for the month, go ahead and start making your selections. If you have picked your movies for this month already, please come back between the 1st and 15th of next month to make your selections. If you have any questions, click <a href='/support'>here</a> for support.";								
								cartInstructionsDiv.innerHTML = contentString;
				
								selectionsLink = document.createElement('a');
								selectionsLink.href = serverURL + '?Cart&action=manageCart';
								selectionsButton = document.createElement('img');
								selectionsButton.src = "/pics/cart_pics/make_selections.gif";
								selectionsButton.height = 19;
								selectionsButton.width = 100;
								selectionsButton.border = 0;
								selectionsLink.appendChild(selectionsButton);
								actionDiv.appendChild(selectionsLink);
							}
							else{
								cartInstructionsDiv = document.getElementById('instructions');
								contentString = "Your cart is currently being processed.<br/>Please come back after the 1st of next month to make more selections.";
								cartInstructionsDiv.innerHTML = contentString;
							}
							
							break;
					}
				}
				
				
				
			}
			else{
				
			}
		}
		catch(e){
			debug("Cart Exception Caught in Cart Object, displayCartActions method. Error: " + e + "\n");
		}
	}
	
	switch(transMethod){
		case 'getCartActions':			this.displayCartActions();
										break;			
		case 'finishCart':				this.finishCart();
										break;	
		case 'getCurrentCart':			this.displayCurrentCart();
										break;		
		case 'addItemToCart':			this.addItemToCart();
										break;			
		case 'removeItemFromCart':		this.removeItemFromCart();
										break;			
		case 'updateCartItemQuantity':	this.updateCartItemQuantity();
										break;			
		case 'clearCart':				this.clearCart();
										break;				
		case 'updateSelectionsTotals':	this.updateSelectionsTotals();
										break;			
	}
	
}

function getContextHelpMessage(){
	var selectionsMessage = document.getElementById('selectionsMessage');
	var updateObj = selectionsMessage.updateObject;
	
	var helpMessageString = "";
	
	helpMessageString += "<p style='text-align:center'><strong>Package:</strong> <em>" + updateObj.packageName + "</em></p>";
	helpMessageString += "<hr/>";
	helpMessageString += "<strong>Total User Selectable Items:</strong> <em>" + updateObj.userSelectableMax + "</em> per month.<br>";
	helpMessageString += "<strong>Items Carrying Over:</strong> <em>" + updateObj.numStandardCarryOver + "</em>*<br/>";
	helpMessageString += "<small>(*Non-returned Selections.)</small><br/>";
	helpMessageString += "<strong>Current Selections:</strong> <em>" + updateObj.numStandardPicks + "</em>.<br/>";
	helpMessageString += "<strong>Selections Remaining:</strong> <em>" + updateObj.remainingPicks + "</em> for this month.<br/>";
	helpMessageString += "<a href='index.html' onclick='hideSelectionsMessage();return false;'>Close</a>";
		
	selectionsMessage.innerHTML = "";
	selectionsMessage.innerHTML = helpMessageString;
	new Effect.BlindDown('selectionsMessage');
}

function CartError(responseObject,transMethod){
	
	this.respObj = responseObject;
	
	this.showAddItemError = function(){
		try{
			if(undefined != this.respObj.responseXML.getElementsByTagName('message').item(0)){
				var message = this.respObj.responseXML.getElementsByTagName('message').item(0).firstChild.nodeValue;
				hideCartProgress();
				outputMessage(message,"mainCartMessage");
			}
			else{
				hideCartProgress();
			}
			
		}
		catch(e){
			
		}
	}	
	
	this.showCartItemQuantityError = function(){
		try{
			if(undefined != this.respObj.responseXML.getElementsByTagName('message').item(0)){
				var message = this.respObj.responseXML.getElementsByTagName('message').item(0).firstChild.nodeValue;
				var errorData = this.respObj.responseXML.getElementsByTagName('errorData').item(0);
				hideCartProgress();
				outputMessage(message,"mainCartMessage");
				
				var errorSelectElement = errorData.getElementsByTagName('muzeItemId').item(0).firstChild.nodeValue;
				var errorSelectValue = errorData.getElementsByTagName('previousValue').item(0).firstChild.nodeValue;
				
				var elemSelect = $('select' + errorSelectElement);
				elemSelect.selectedIndex = errorSelectValue -1;
				elemSelect.value = errorSelectValue;
			}
			else{
				hideCartProgress();
			}
			
		}
		catch(e){
			
		}
	}
	
	this.showRemoveItemError = function(){
		debug("Show Remove Item Error");
	}
	
	this.showItemQuantityError = function(){
		debug("Show Item Quantity Error");
	}
	
	switch(transMethod){
		case 'addItemToCart':					this.showAddItemError();
												break;
												
		case 'removeItemFromCart':				this.showRemoveItemError();
												break;
												
		case 'updateCartItemQuantity':			this.showCartItemQuantityError();
												break;
												
		case 'updateSelectionsTotals':			this.updateSelectionsTotalsError();
												break;
	}
}

function Report(responseObject, transMethod){
	this.respObj = responseObject;
	
	this.displayCurrentCartReport = function (){
		try{
			
			if(undefined != this.respObj.responseXML.getElementsByTagName('carts').item(0)){
				var cms			= $( "currentCart");		
				var NRCUR 		= $( "newReleaseCurrent");
				var NRCO 		= $( "newReleaseCarryOver");
				var RGCUR 		= $( "regularCurrent");
				var RGCO 		= $( "regularCarryOver");
				var NRHEADER 	= $( "nrHeader");
				var CSHEADER 	= $( "csHeader");
				
				//We only will ever want the first cart in the list.
				var cartNode = this.respObj.responseXML.getElementsByTagName('carts').item(0);
				
				var numNRCurrent = 0;
				var numNRCarryOver = 0;
				var numRegCurrent = 0;
				var numRegCarryOver = 0;
					
				var newNRCurrentHTML = '';
				var newNRCarryOverHTML = '';
				var newRegCurrentHTML = '';
				var newRegCarryOverHTML = '';
				var nrHeaderHTML = '';
				var csHeaderHTML = '';
				
				if("closed" != cartNode.getElementsByTagName('cartStatus').item(0).firstChild.nodeValue){
					
					var itemList = cartNode.getElementsByTagName('item');
					var cartID = cartNode.getElementsByTagName('cartNumber').item(0).firstChild.nodeValue;

					for(var i = 0 ;i < itemList.length; i++){
						var itemObject = {};
						
						var quantity = parseInt(itemList.item(i).getElementsByTagName('quantityNew').item(0).firstChild.nodeValue);
						quantity += parseInt(itemList.item(i).getElementsByTagName('quantityUsed').item(0).firstChild.nodeValue);
						
						var itemObject = {
							progressID: 	itemList.item(i).getElementsByTagName('progressID').item(0).firstChild.nodeValue,
							muzeItemID:		itemList.item(i).getElementsByTagName('muzeItemID').item(0).firstChild.nodeValue,
							title:			itemList.item(i).getElementsByTagName('title').item(0).firstChild.nodeValue,
							locked:			itemList.item(i).getElementsByTagName('locked').item(0).firstChild.nodeValue,
							carryOver:		itemList.item(i).getElementsByTagName('carryOver').item(0).firstChild.nodeValue,
							newRelease:		itemList.item(i).getElementsByTagName('newRelease').item(0).firstChild.nodeValue,
							quantity:		quantity
						}
						//debug("Item Object: " + i + "\nitemID: " + itemObject.itemID + "\nTitle: " + itemObject.title + "\nLocked: " + itemObject.locked + "\nCarryOver: " + itemObject.carryOver + "\nNew Release: " + itemObject.newRelease + "\n\n");
						//Current New Releases
						if(itemObject.locked == "true" && itemObject.newRelease =="true" && itemObject.carryOver == "false"){
							numNRCurrent += itemObject.quantity;
							newNRCurrentHTML += "<br/>";
							newNRCurrentHTML += itemObject.title;
							newNRCurrentHTML += "\n";
							
						}
						
						//New Release Carryover
						if(itemObject.locked == "true" && itemObject.newRelease == "true" && itemObject.carryOver == "true"){
							numNRCarryOver += itemObject.quantity;
							newNRCarryOverHTML += "<br/>";
							newNRCarryOverHTML += itemObject.title;
							newNRCarryOverHTML += "\n";
						}
						
						//Regular Current
						if(itemObject.locked == "false" && itemObject.newRelease == "false" && itemObject.carryOver == "false"){
							numRegCurrent += itemObject.quantity;
							newRegCurrentHTML += "<br/>";
							newRegCurrentHTML += itemObject.title;
							newRegCurrentHTML += "\n";
						}
						
						//Regular Carryover
						if(itemObject.locked  == "true" && itemObject.newRelease == "false" && itemObject.carryOver == "true"){
							numRegCarryOver += itemObject.quantity;
							newRegCarryOverHTML += "<br/>";
							newRegCarryOverHTML += itemObject.title;
							newRegCarryOverHTML += "\n";
						}
			
					}//end for
					
					//Add Section Headers
					newNRCurrentHTML 	= "<br/><b>Current  (" + numNRCurrent + ")</b>" + newNRCurrentHTML;
					newNRCarryOverHTML	= "<br/><b>Rollover  (" + numNRCurrent + ")</b>" + newNRCarryOverHTML;
					newRegCurrentHTML	= "<br/><b>Current  (" + numRegCurrent + ")</b>" + newRegCurrentHTML;
					newRegCarryOverHTML	= "<br/><b>Rollover  (" + numRegCarryOver + ")</b>" + newRegCarryOverHTML;
					nrHeaderHTML		+= "<span>Packaged New Releases<span>";
					csHeaderHTML		+= '<span>Current Selections</span>&nbsp;&nbsp;<a href="' + serverURL + '?Cart&action=manageCart&cartID=' + cartID + '"><img src="/pics/cart_pics/edit_selections.gif" border="0" height="19" width="100" /></a>';
					
					//Insert the HTML into the page.
					NRCUR.innerHTML = newNRCurrentHTML;
					NRCO.innerHTML = newNRCarryOverHTML;
					RGCUR.innerHTML = newRegCurrentHTML; 
					RGCO.innerHTML = newRegCarryOverHTML;
					NRHEADER.innerHTML = nrHeaderHTML;
					CSHEADER.innerHTML = csHeaderHTML;
					
				}else {
					outputMessage("Cart in process.  Please check back after first of the month to create your next cart!")
					cms.innerHTML = "Cart in process.  Please check back after first of the month to create your next cart!";
				}//end if
			}
			else {
				
			}//end if
		}
		catch(e){
			debug("Report Exception Caught: " + e);
		}
		
	}
	
	this.displayArchivedCarts = function(){
		
		try{
			cms = document.getElementById( "archivedCarts") ;
			
			if(undefined != this.respObj.responseXML.getElementsByTagName('cart')){
				carts = this.respObj.responseXML.getElementsByTagName('cart');
				numCarts = carts.length;
				inner = '';
				
				for( i = 0; i < numCarts; i++){
					var year = carts.item(i).getElementsByTagName('year').item(0).firstChild.nodeValue;
					var month = carts.item(i).getElementsByTagName('month').item(0).firstChild.nodeValue;
					var cartID = carts.item(i).getElementsByTagName('cartNumber').item(0).firstChild.nodeValue;
					inner += '<br/><a href="/index.html?Cart&action=viewArchiveCartReport&cartID=' + cartID + '&month=' + month + '&year=' + year + '&monthName=' + getMonthString(month) + '">view</a> &nbsp; ' +  year + ' &nbsp; ' +  getMonthString(month);
				
				}
				
				cms.innerHTML = inner ;
			}
			else{
				cms.innerHTML = "No Previous Months found.";
			}

		}
		catch(e){
			debug("Report Exception Caught: " + e);
		}


	}
	
	this.displayArchivedCartReport = function() {
		
		try{
			if(undefined != this.respObj.responseXML.getElementsByTagName('cart').item(0)){
				var archivedCart 	= $( "archivedCart");		
				var header 			= $( "header");
				var movieListings	= $( "movieListings");
				
				//We only will ever want the first cart in the list.
				var cartNode = this.respObj.responseXML.getElementsByTagName('cart').item(0);
				
				var numMovies = 0;
					
				var headerHTML = '';
				var movieHTML = '';
				
				if("open" != cartNode.getElementsByTagName('cartStatus').item(0).firstChild.nodeValue){
					
					var itemList = cartNode.getElementsByTagName('item');
					var cartID = cartNode.getElementsByTagName('cartNumber').item(0).firstChild.nodeValue;

					for(var i = 0 ;i < itemList.length; i++){
						var itemObject = {};
						var itemObject = {
							progressID: 	itemList.item(i).getElementsByTagName('progressID').item(0).firstChild.nodeValue,
							muzeItemID: 	itemList.item(i).getElementsByTagName('muzeItemID').item(0).firstChild.nodeValue,
							title:			itemList.item(i).getElementsByTagName('title').item(0).firstChild.nodeValue,
							locked:			itemList.item(i).getElementsByTagName('locked').item(0).firstChild.nodeValue,
							carryOver:		itemList.item(i).getElementsByTagName('carryOver').item(0).firstChild.nodeValue,
							newRelease:		itemList.item(i).getElementsByTagName('newRelease').item(0).firstChild.nodeValue
						}
						//debug("Item Object: " + i + "\nitemID: " + itemObject.itemID + "\nTitle: " + itemObject.title + "\nLocked: " + itemObject.locked + "\nCarryOver: " + itemObject.carryOver + "\nNew Release: " + itemObject.newRelease + "\n\n");
						numMovies++;
						movieHTML += "<br/>";
						movieHTML += itemObject.title;
						movieHTML += "\n";

			
					}//end for
					
					//Add Section Headers
					headerHTML		+= "<b>Movies (" + numMovies + ")</b>";
					
					//Insert the HTML into the page.
					header.innerHTML = headerHTML;

					movieListings.innerHTML = movieHTML;
					
				}else {
					outputMessage("Cart could not be found.")
					archivedCart.innerHTML = "Cart in process.  Please check back after first of the month to create your next cart!";
				}//end if
			}
			else {
				
			}//end if
		}
		catch(e){
			debug("Report Exception Caught: " + e);
		}
		
	}
	
	switch(transMethod){			
		case 'getCurrentCartReport':	this.displayCurrentCartReport();
										break;
		case 'getArchivedCartsReport':	this.displayArchivedCarts();
										break;	
		case 'getArchivedCartReport':	this.displayArchivedCartReport();
										break;	
	}
}

function ReportError(responseObject,transMethod){
	
	this.respObj = responseObject;
	
	this.showArchivedCartsError = function(){
		if(undefined != document.getElementById( "archivedCarts")){
			cms = document.getElementById( "archivedCarts") ;
			cms.innerHTML = "No Previous Carts Found";
		}

	}
	
	this.showCurrentCartError = function(){
		
	}
	
	this.showArchivedCartError = function(){
		
	}
	
	switch(transMethod){
		case 'getCurrentCart':			this.showCurrentCartError();
										break;
		case 'getArchivedCarts':		this.showArchivedCartsError();
										break;
		case 'getArchivedCart':			this.showArchivedCartError();
										break;
	}
}

function Product (responseObject, transMethod){
	
	this.respObj = responseObject;
	
	this.displayProducts = function(){
		
		try{
			var productList = this.respObj.responseXML.getElementsByTagName( 'product');
			var productTable = document.getElementById("products").getElementsByTagName("tbody")[0]; 
			
			productCount = productList.length;
				
			//Create the first row.
			var productRow = document.createElement('tr');
			var numRows = 0;
			for( var i = 0; i < productCount; i++){
				
				if(!(i % 4) && (i > 0)){
					//Add the row to the table
					numRows++;
					productTable.appendChild(productRow);
					productRow = "";
					productRow = document.createElement("tr");
					
				}
	
				//Populate an object with data from the XML.
				var productData = {
					inventory: 				productList.item(i).getElementsByTagName('inventory').item(0).firstChild.nodeValue,
					progressID: 			replaceWhiteSpace(productList.item(i).getElementsByTagName('upc').item(0).firstChild.nodeValue),
					muzeItemID: 			replaceWhiteSpace(productList.item(i).getElementsByTagName('originalupc').item(0).firstChild.nodeValue),
					title: 					productList.item(i).getElementsByTagName('title').item(0).firstChild.nodeValue,
					coverartname: 			productList.item(i).getElementsByTagName('coverartname').item(0).firstChild.nodeValue,
					newRelease: 			productList.item(i).getElementsByTagName('newRelease').item(0).firstChild.nodeValue,
					prevRented: 			productList.item(i).getElementsByTagName('prevRented').item(0).firstChild.nodeValue
				}
				
				var newProductContainer = document.createElement('td');
				newProductContainer.setAttribute("width","25%");
				newProductContainer.setAttribute("align","center");
				newProductContainer.setAttribute("valign","top");
				
				
				var newProduct = document.createElement('div');
				var newBreakElement = document.createElement('br');
				var newProdImg = document.createElement('img');
				var newProdNewReleaseImg = document.createElement('img');
				var newProdUnavailableImg = document.createElement('img');
				var newProdPrevRentedImg = document.createElement('img');
				var newProdTitle = document.createElement('div');
				
				newProduct.id = "product" + productData.muzeItemID;
				newProduct.movieTitle = productData.title;
				newProduct.progressID = productData.progressID;
				newProduct.setAttribute("align", "left");
				newProduct.setAttribute("align", "left");
						
				var imgSubDir = productData.coverartname.substring(productData.coverartname.length-2, productData.coverartname.length);
				//alert("original: " + coverartname + " num #s" + imgSubDir);
				newProdImg.src = "/pics/dvd/" + imgSubDir + "/" + productData.coverartname + ".jpg";
				newProdImg.height = 98;
				newProdImg.width= 71;
				newProdImg.setAttribute("vspace", "4");
				
				newProdNewReleaseImg.id = "NR" + productData.muzeItemID;
				newProdNewReleaseImg.height = 16;
				newProdNewReleaseImg.width = 16;
				newProdNewReleaseImg.setAttribute("alt", "");
				newProdNewReleaseImg.setAttribute("border", "0");
				newProdNewReleaseImg.setAttribute("hspace", "3");
				
				//Product is a New Release?
				if(productData.newRelease == "true"){
					newProdNewReleaseImg.src = "/pics/cart_pics/blue_star.gif";
				}
				else{
					newProdNewReleaseImg.src = "/pics/cart_pics/trans.gif";
				}
				
				
				
				//Product is Unavailable?
				if(parseInt(productData.inventory) > 0){
					newProduct.className = 'box';
					newProdUnavailableImg.src = "/pics/cart_pics/trans.gif";

				}
				else{
					newProduct.className = 'boxno';
					newProdUnavailableImg.src = "/pics/cart_pics/black_star.gif";
				}
				
				newProdUnavailableImg.id = "UA" + productData.muzeItemID;
				newProdUnavailableImg.height = 16;
				newProdUnavailableImg.width = 16;
				newProdUnavailableImg.setAttribute("alt", "");
				newProdUnavailableImg.setAttribute("border", "0");
				newProdUnavailableImg.setAttribute("hspace", "3");
				
				//Product was Previously Rented?
				if(productData.prevRented == "true"){
					newProdPrevRentedImg.src = "/pics/cart_pics/gold_star.gif";
				}
				else{
					newProdPrevRentedImg.src = "/pics/cart_pics/trans.gif";
				}
				
				newProdPrevRentedImg.id = "PR" + productData.muzeItemID;
				newProdPrevRentedImg.height = 16;
				newProdPrevRentedImg.width = 16;
				newProdPrevRentedImg.setAttribute("alt", "");
				newProdPrevRentedImg.setAttribute("border", "0");
				newProdPrevRentedImg.setAttribute("hspace", "3");
				
				//Set the Title
				newProdTitle.setAttribute("align", "center");
				newProdTitle.appendChild(document.createTextNode(productData.title));
				
				//Add all of the Element to the Product
				newProduct.appendChild(newProdUnavailableImg);
				newProduct.appendChild(newProdNewReleaseImg);
				newProduct.appendChild(newProdPrevRentedImg);
				newProduct.appendChild(newBreakElement);
				newProduct.appendChild(newProdImg);
				newProduct.appendChild(newProdTitle);
				
				//Now Add the new Product Div to the Table Cell.
				newProductContainer.appendChild(newProduct);
				productRow.appendChild(newProductContainer);
				
			}
			
			//Add the last row
			productTable.appendChild(productRow);
			
			//Get number of product divs here.
			var numDragProd = document.getElementsByClassName('box');
			var numNonDragProd = document.getElementsByClassName('boxno');
			var numTotalProd = numDragProd.length + numNonDragProd.length;
			
			updateProductPaging(currentOffset, numTotalProd);
			
			//Now that we have the dom elements, make them draggable
			makeDraggables();
			hideProductsProgress();
			
		}
		catch(e){
			debug('Products Exception Caught: ' + e);
		}
	}
	
	this.updateProductStatus = function(){
		
		try{
			var productID = this.respObj.responseXML.getElementsByTagName('product').item(0).firstChild.nodeValue;
			var hasInventory = this.respObj.responseXML.getElementsByTagName('hasInventory').item(0).firstChild.nodeValue;
			
			//Update the inventory of the product.
			if(hasInventory == "false"){
				
				//We need to make sure that this product is on the page!
				if(undefined != document.getElementById("product" + productID)){
					var product = document.getElementById("product" + productID);
					var prodAvailableImage = document.getElementById("UA" + productID);	
					product.className = "boxno";
					prodAvailableImage.src = "/pics/cart_pics/black_star.gif";
					//We need to do this to populate the Draggables List.
					makeDraggables();	
				}
				else{
					return false;
				}
				

				
			}
			else{
				//We need to make sure that this product is on the page!
				if(undefined != document.getElementById("product" + productID)){
					var product = document.getElementById("product" + productID);
					var prodAvailableImage = document.getElementById("UA" + productID);	
					product.className = "box";
					prodAvailableImage.src = "/pics/cart_pics/trans.gif";
					//We need to do this to populate the Draggables List.
					makeDraggables();	
				}
				else{
					return false;
				}
			}
		}
		catch(e){
			debug('Product Update Exception Caught: ' + e);
		}
	}
	
	this.displayProductSums = function (){
		try{
			var sumDiv = $('numProducts');
			var numProducts = this.respObj.responseXML.getElementsByTagName('numProducts').item(0).firstChild.nodeValue;
			sumDiv.innerHTML = numProducts;
		}
		catch(e){
			debug('Product Sum Exception Caught: ' + e);
		}
	}
	
	switch(transMethod){
		case 'displayProducts':			this.displayProducts();
										break;
		case 'displayProductSums':		this.displayProductSums();
										break;
		case 'updateProductStatus':		this.updateProductStatus();
										break;
	}
	

}

function ProductError(responseObject,transMethod){
	this.respObj = responseObject;
	
	this.showProductsError = function(){
		try{
			if(undefined != this.respObj.responseXML.getElementsByTagName('message').item(0)){
				var message = this.respObj.responseXML.getElementsByTagName('message').item(0).firstChild.nodeValue;
				var message2 = '<br/><a href="index.html" onclick="showProducts( currentLetter, currentOffset); return false;">Show Products</a>';
				
				message = message + message2;
				hideProductsProgress();
				outputMessage(message,"mainCartMessage", 10000);
			}
			else{
				hideProductsProgress();
			}
			
		}
		catch(e){
			debug('Show products error: ' + e);
		}
	}
	
	switch(transMethod){
		case 'displayProducts':			this.showProductsError();
										break;
		case 'searchProducts':			this.showProductsError();
										break;
	}
}


/*******************
Cart Builder Objects
*******************/
function CartElement(itemObject) {
	this.itemQuantityMax = 5;
	this.cartItemElement = document.createElement("li");
	this.cartItemElement.id = itemObject.muzeItemID;
	var cartItem = document.createElement('div');
	cartItem.className = "cartItem";
	cartItem.progressID = itemObject.progressID;
		
	//Create the Span where the attribute images will be displayed.
	var attrImageSpan = document.createElement("span");
	attrImageSpan.className = "attrImages";
	
	//Add the New Release Image or a transparent Place Holder for it.
	if(itemObject.newRelease == "true"){
		var newReleaseImage = document.createElement("img");
		newReleaseImage.src = "/pics/cart_pics/blue_star.gif";
		newReleaseImage.setAttribute("alt","New Release");
	}
	else {
		var newReleaseImage = document.createElement("img");
		newReleaseImage.src = "/pics/cart_pics/trans.gif";
		newReleaseImage.setAttribute("alt","");
	}
	
	attrImageSpan.appendChild(newReleaseImage);
	attrImageSpan.appendChild(document.createElement('br'));
	
	//Add the Previously Rented Image or a transparent Place Holder for it.
	var prevRentedImage = document.createElement("img");
	
	if(itemObject.prevRented == "true"){
		prevRentedImage.src = "/pics/cart_pics/gold_star.gif";
		prevRentedImage.setAttribute("alt","Previously Rented Item");
	}
	else {
		prevRentedImage.src = "/pics/cart_pics/trans.gif";
		prevRentedImage.setAttribute("alt","");
	}
	
	//Add the second Attribute Image to the Span
	attrImageSpan.appendChild(prevRentedImage);
	
	//Add the span to the Item Element
	cartItem.appendChild(attrImageSpan);
	
	
	//Add the Product Image to the Cart Item
	var itemProdImage = document.createElement('img');
	var imgSubDir = itemObject.coverartname.substring(itemObject.coverartname.length-2, itemObject.coverartname.length);
	
	
	//Replace this with the thumb graphic when it is made.
	//itemProdImage.src = "/pics/dvd/" + imgSubDir + "/" + itemObject.coverartname + "_thumb.jpg";
	itemProdImage.src = "/pics/dvd/" + imgSubDir + "/" + itemObject.coverartname + ".jpg";
	itemProdImage.className = "prodImage";
	itemProdImage.setAttribute("alt",itemObject.title);
	cartItem.appendChild(itemProdImage);
	
	//Create the item Title Cell
	var itemTitleSpan = document.createElement('span');
	itemTitleSpan.appendChild(document.createTextNode(itemObject.title));
	itemTitleSpan.className = "cartItemTitle";
	cartItem.appendChild(itemTitleSpan);
	
	
	//Here we are building the Quantity Select Element
	var itemQuantitySelect = document.createElement('select');
	itemQuantitySelect.id = "select" + itemObject.muzeItemID;

	for(var i = 0; i < this.itemQuantityMax; i++){
		var option = document.createElement("option");
		var optionText = document.createTextNode((i+1));
		option.appendChild(optionText);	
		option.setAttribute("value",(i+1));

		if((i+1) == itemObject.quantity){
			option.setAttribute("selected", "true");
		}
		
		itemQuantitySelect.appendChild(option);
	}
	
	
	var itemQuantityForm = document.createElement('form');
	//itemQuantitySelect.setAttribute("onchange","requestSetCartItemQuantity(this);");
	itemQuantitySelect.onchange = function(){ updateCartItemQuantity(itemQuantitySelect.id); };
	itemQuantityForm.appendChild(itemQuantitySelect);
	
	//Add the select input to the Cart Element.
	cartItem.appendChild(itemQuantityForm);
	
	//Add the Delete Product Image to the Cart Item
	var itemDelImage = document.createElement('img');
	itemDelImage.src = "/pics/cart_pics/X.gif";
	itemDelImage.className = "delImage";
	itemDelImage.setAttribute("alt","Remove Item(s) from Cart");
	itemDelImage.setAttribute("title","Remove Item(s) from Cart");
	itemDelImage.onclick = function(){ removeItemFromCart(itemObject.muzeItemID);};
	cartItem.appendChild(itemDelImage);
	
	//Append the newly created Item Div to the Item LI
	this.cartItemElement.appendChild(cartItem);
		
	return this.cartItemElement;
}

function showSelectionMessage(messageText){
	
	var cartMessage	= $('selectionDisplay');
	cartMessage.innerHTML = "";
	cartMessage.innerHTML = messageText;
	new Effect.BlindDown('selectionDisplay');
}

function showCartProgress(messageText){
	
	var cartMessage	= $('cartMessage');
	cartMessage.innerHTML = "";
	cartMessage.innerHTML = messageText + '<img src="/pics/cart_pics/indicator.gif" height="16" width="16" alt="Progress Indicator"/>';
	new Effect.BlindDown('cartProgress');
}

function hideCartProgress(){
	var cartMessage	= $('cartMessage');
	//cartMessage.innerHTML = "";
	//new Effect.BlindUp('cartProgress', {duration:1});
	setTimeout(function(){new Effect.BlindUp('cartProgress', {duration:.3, fps:40})},1000);
}

function hideSelectionsMessage(){
	var cartMessage	= $('selectionsMessage');
	//cartMessage.innerHTML = "";
	//new Effect.BlindUp('cartProgress', {duration:1});
	setTimeout(function(){new Effect.BlindUp('selectionsMessage', {duration:.3, fps:40})},250);
}


function showProductsProgress(){
	Element.show('productProgress');
}

function hideProductsProgress(){
	/*new Effect.BlindUp('productProgress', {duration:3});*/
	Element.hide('productProgress');
	//setTimeout(function(){new Effect.BlindUp('productProgress', {duration:.3, fps:40})},2000);
}


function replaceWhiteSpace(sString){
	return sString.replace(/[ ]([^ ]*)/g, '_$1').replace(/[_]$/g,'');
}

function getTransactionMessage(o){
	if(undefined != o.responseXML.getElementsByTagName('message').item(0).firstChild.nodeValue){
		return o.responseXML.getElementsByTagName('message').item(0).firstChild.nodeValue;
	}
	else {
		return false;
	}
}


function addProductToCart(element, dropon, event) {
	
	debug("Movie Title: " + element.movieTitle + "\n");
	
	//We need to remove the "product" part of the product id and replace the underscores with spaces.
	var tempID = element.id;
	//tempID = tempID.replace( /product(.*)/, "$1").replace(/^[_]/g, " ");
	tempID = tempID.replace( /product(.*)/, "$1");
	//debug("\n***** Adding 1 product '" + tempID + "' to the cart  *****\n");
	debug("Element ID: " + element.id + " New ID: {" + tempID + "}");
	var pars   = 'Cart&action=addItemToCart&muzeItemID=' + tempID + '&progressID='+ element.progressID +'&title=' + element.movieTitle;
	var myAjax = new Ajax.Request( serverURL, {method: 'post', parameters: pars, onLoading: showCartProgress("Adding Product to your Cart."), onComplete: handleCartTransaction} );
}

//This is the function that will make a request to add or subtract more of a quantity of an item.
function updateCartItemQuantity(id){
	
	var element = document.getElementById(id);
	var elementID = element.id;
	var elementID = elementID.replace( /select(.*)/, "$1");
	var requestedQuantity = element.value;
	//Determine the itemID, itemQuantity, and cartID!
	debug("***** Requesting Update for Item Quantity of '" + elementID + " Quantity: " + requestedQuantity + "' *****\n");

	var pars   = 'Cart&action=setCartItemQuantity&muzeItemID=' + elementID + '&requestedQuantity=' + requestedQuantity;
	var myAjax = new Ajax.Request( serverURL, {method: 'post', parameters: pars, onLoading: showCartProgress("Updating Quantity..."), onComplete: handleCartTransaction} );
	
}

function removeItemFromCart (id) {
	
	var element = document.getElementById(id);
	
	debug("\nAttempting to Remove Item: " + element.id);
	
	
	var pars   = 'Cart&action=removeItemFromCart&muzeItemID=' + element.id + "&progressID=" + element.progressID;
	var myAjax = new Ajax.Request( serverURL, {method: 'post', parameters: pars, onLoading: showCartProgress('Removing Item...'), onComplete: handleCartTransaction} );
}

function removeAllProductsFromCart (cartID) {
	debug("***** Attempting to Remove All Products from the Current Cart  *****\n");
	var pars   = 'Cart&action=ClearCurrentCart&cartID=' + cartID;
	var myAjax = new Ajax.Request( serverURL, {method: 'post', parameters: pars, onLoading: showCartProgress("removeAll"), onComplete: handleCartTransaction} );
}

function makeDraggables(){
	var products = document.getElementsByClassName('box');
	for (var i = 0; i < products.length; i++) {
		products[i].dragManager = new Draggable(products[i].id, {revert:true });	
	}
	var products = document.getElementsByClassName('boxno');
	for (var i = 0; i < products.length; i++) {
		if(undefined != products[i].dragManager){
			products[i].dragManager.destroy();
		}
	}
}

function toggleInventoryDisplay(){
	var toggleLink = $('toggleInventoryLink');
	
	if(showOutOfStock == 0){
		toggleLink.innerHTML = "Hide Out of Stock Titles";
		showOutOfStock = 1;
		showProducts( currentLetter, currentOffset);
	}
	else{
		toggleLink.innerHTML = "Show Out of Stock Titles";
		showOutOfStock = 0;
		showProducts( currentLetter, currentOffset);
	}
}

function nextPage(){
	
	switch( currentMethod){
		case 'letter':
			showProducts( currentLetter, currentOffset + 20);
		break;
		case 'like':
			searchProducts( currentLike, currentOffset + 20);
		break;
	}
}

function prevPage(){
	
	newOffset = currentOffset - 20;
	if( newOffset < 0) newOffset = 0;
	switch( currentMethod){
		case 'letter':
			showProducts( currentLetter, newOffset);
		break;
		case 'like':
			searchProducts( currentLike, newOffset);
		break;
	}
}

function showProducts( startLetter, offset){
	currentMethod = 'letter';
	currentLetter = startLetter ;
	
	showProductsProgress();
	
	productTable = $('products');
	while (productTable.rows.length>0) //deletes all rows of a table
	productTable.deleteRow(0) //delete first row of contracting table until there are none left
	
	currentOffset = offset ;
	
/*	debug( "Called from: showProducts\n");
	debug( "Start Letter: " + startLetter + "\n");
	debug( "Current Method: " + currentMethod + "\n");
	debug("Cur Offset: " + currentOffset + "\n");*/
	
	//todo validate ascii letter in start letter and offset is an int
	var pars   = 'Cart&action=displayProducts&startLetter=' + startLetter + '&offset=' + offset + '&showOutOfStock=' + showOutOfStock;
	var myAjax = new Ajax.Request( serverURL, {method: 'post', parameters: pars, onComplete: handleCartTransaction} );

}


function searchProducts( like, offset){
	currentMethod = 'like';
	currentLike = like;
	
	showProductsProgress();
	
	productTable = $('products');
	while (productTable.rows.length>0) //deletes all rows of a table
	productTable.deleteRow(0) //delete first row of contracting table until there are none left
	
	currentOffset = offset ;
		 
	//todo validate ascii letter in start letter and offset is an int 
	var pars   = encodeURI('Cart&action=searchProducts&like=' + like + '&offset=' + offset + '&showOutOfStock=' + showOutOfStock) ;
	//var pars   = 'Cart&action=searchProducts&like=' + like + '&offset=' + offset + '&showOutOfStock=' + showOutOfStock;
	//alert( pars);
	var myAjax = new Ajax.Request( serverURL, {method: 'post', parameters: pars, onComplete: handleCartTransaction} );

}

function updateProductPaging(startOffset, numProds){
	var productPaging = document.getElementById('productPaging');
	var prevPagingButton = document.getElementById('inventoryPreviousButton');
	var nextPagingButton = document.getElementById('inventoryNextButton');
	
	if(startOffset > 0){
		prevPagingButton.src = "/pics/cart_pics/prev-on.gif";
		prevPagingButton.onclick = function() { prevPage(); };
		prevPagingButton.className = "pagingActive";
	}
	else{
		prevPagingButton.src = "/pics/cart_pics/prev-off.gif";
		prevPagingButton.onclick = function() { return false; };
		prevPagingButton.className = "";
	}
	
	if(numProds < maxProducts){
		nextPagingButton.src = "/pics/cart_pics/next-off.gif";
		nextPagingButton.onclick = function() { return false; };
		nextPagingButton.className = "";
	}
	else{
		nextPagingButton.src = "/pics/cart_pics/next-on.gif";
		nextPagingButton.onclick = function() { nextPage(); };
		nextPagingButton.className = "pagingActive";
	}
	
	productPaging.innerHTML = (startOffset+1) + "-" + (startOffset+numProds);
	//alert('StartOffset: ' + startOffset + " Number of Results: " + numProds + " Resulting set: Viewing results " + (startOffset+1) + "-" + (startOffset+numProds));
}

function getCurrentCart(){
	//todo validate ascii letter in start letter and offset is an int
	showCartProgress("Loading Your Current Cart");
	var pars   = 'Cart&action=getCurrentCartData';
	var myAjax = new Ajax.Request( serverURL, {method: 'post', parameters: pars, onComplete: handleCartTransaction} );
}

function getCurrentCartReport(){
	//debug("Calling get Current Month Cart\n");
	var pars   = encodeURI('Cart&action=getCurrentCartReport');
	var myAjax = new Ajax.Request( serverURL, {method: 'post', parameters: pars, onSuccess: handleCartTransaction} );
}

function getCartActions(){
	var pars   = encodeURI('Cart&action=getCartActions');
	var myAjax = new Ajax.Request( serverURL, {method: 'post', parameters: pars, onSuccess: handleCartTransaction} );
}

function getArchivedCartsReport(){
	var pars   = encodeURI('Cart&action=getArchivedCartsReport');
	var myAjax = new Ajax.Request( serverURL, {method: 'post', parameters: pars, onSuccess: handleCartTransaction} );
}

function getArchivedCartReport(month,year){
	var pars   = encodeURI('Cart&action=getArchivedCartReportData&month=' + month + '&year=' + year);
	var myAjax = new Ajax.Request( serverURL, {method: 'post', parameters: pars, onSuccess: handleCartTransaction} );
}


function getMonthString(monthInt){
	var monthString = "";
	switch(monthInt){
		case '1':
			monthString += "January";
			break;
		case '2':
			monthString += "February";
			break;
		case '3':
			monthString += "March";
			break;
		case '4':
			monthString += "April";
			break;
		case '5':
			monthString += "May";	
			break;
		case '6':
			monthString += "June";
			break;
		case '7':
			monthString += "July";
			break;
		case '8':
			monthString += "August";
			break;
		case '9':
			monthString += "September";
			break;
		case '10':
			monthString += "October";
			break;
		case '11':
			monthString += "November";
			break;
		case '12':
			monthString += "December";
			break;
		default:
			break;
			
	}
	return monthString;
}

function outputMessage(text, messageArea, timeOutLength){
	var messageDiv = document.getElementById(messageArea);
	var messageText = document.getElementById(messageArea + 'Text');
	
	if (typeof optional == "undefined") {
		var timeOutLength = 5000;
	}
	
	messageDiv.style.display = "block";
	messageText.style.display = "block";
	messageDiv.style.visibility = "visible";
	messageText.style.visibility = "visible";
	messageText.innerHTML = text;
	
	setTimeout(function(){new Effect.BlindUp(messageArea, {duration:.3, fps:40})}, timeOutLength);
}

function clearProducts(){
	var prodMessage = $('productMessage');
	prodMessage.innerHTML = "";
	
	productTable = $('products');
	while (productTable.rows.length>0) //deletes all rows of a table
	productTable.deleteRow(0) //delete first row of contracting table until there are none left
}
function outputProductMessage(text){
	var productDiv = document.getElementById('productProgress');
	var productText = document.getElementById('productMessage');
	
	productDiv.style.visibility = "visible";
	productText.style.visibility = "visible";		
	productText.innerHTML = text;
}

/**
 * Show or hide an element
 * @param elementID String - ID of the element to show or hide
 * @param display String - "show" or "hide" the element
 */
function showHide(elementID, display) {
	var element = $(elementID);

	switch (display) {
	
		case ("show") :
			element.style.visibility = "visible";
			element.style.display = "block";
			break;
			
		case ("hide") :
			element.style.visibility = "hidden";
			element.style.display = "none";
			break;
		
		default :
			break;
	}
}

/**
 * Display debug messages
 * @param message String - Message to display
 */
function debug(message) {
	// return immediately if debugging is not turned on
	//if (!debugMessages) return;
	var container = $("debugContainer");
	
	if(debugMessages){
		showHide("debugContainer", "show");
		if (container.style.display == "block") {
			debugString += message;
			container.value = debugString;
		}
	}
	else {
		showHide("debugContainer", "hide");
		return;
	}
}