    var addItemRequest = null;
    
	Icon.Instances = new Array();
	
	function HTTPRequest(url, fpCallback){
	    this.request = new XMLHttpRequest();
	    this.request.open("GET", url, true);
	    
	    var tempRequest = this.request;
	    
	    function request_readystatechange(){
	        if (tempRequest.readyState == 4){
	            if (tempRequest.states = 200){
	                fpCallback(tempRequest);
	            } else {
	                alert("An error occurred while connecting to the server.");
	            }
	        }
	    }
	    
	    this.request.onreadystatechange = request_readystatechange;
	}
	
	HTTPRequest.prototype.send = function(){ this.request.send(null);}
	
	function CartDisplay(itemListID, cartTotalLabelID, itemCountLabelID){
	    this.itemList = document.getElementById(itemListID);
	    this.cartTotalLabel = document.getElementById(cartTotalLabelID);
	    this.itemCountLabel = document.getElementById(itemCountLabelID);
	    this.items = new Array()
	}
	
	function Item(itemNum, qty, desc){
	    this.quantity = qty;
	    this.description = desc;
	    this.itemNumber = itemNum;
	    this.listItem = document.createElement("li");
	    
	    var endGetDescription = function(req){
            var doc = req.responseXML;
            var e = doc.getElementsByTagName("Description");
            
            if (e.length == 1){
                if (typeof e[0].textContent != "undefined")
                    req.item.description = e[0].textContent;
                else
                    req.item.description = e[0].text;
                    
                req.item.listItem.innerHTML = req.item.quantity + " x " + req.item.description;
            }
	    };
	    
	    this.beginGetDescription = function(){
	        var req = new HTTPRequest("/library/cart/getitemdetails.ashx?ItemNumber=" + itemNum, endGetDescription);
	        req.request.item = this;
	        req.send();
	        
	        this.listItem.innerHTML = this.quantity + " x Loading...";
	    };
	    
	}

	function Icon(iconURL, x, y)
	{
	    var image = document.createElement("img");
	    var timerID;
	    var xStep;
	    var yStep;
	    var numberOfSteps; 
	    var shrinkStepX;   
	    var shrinkStepY;   
	    var MIN_WIDTH = 50;
	    
	    
        //Icon.Timers = new Array();
        
	    image.src = iconURL;
	    image.style.position = "absolute";
	    image.style.display = "block";
	    image.style.left = x + "px";
	    image.style.top = y + "px";
	    image.style.zIndex = 999;
	    image.style.height = image.height + "px";
	    image.style.width = image.width + "px";
	    
	    this.id = Icon.Instances.length;
        Icon.Instances[this.id] = this;
        
	    
	    //Perform the initialization calculations for performing the slide.
	    var initSlide = function(targetX, targetY){
	        var numberOfSteps = 0;
		    var totalDistX = (targetX - parseInt(x));
		    var totalDistY = (targetY - parseInt(y));
		    
		    if (Math.abs(totalDistX) > Math.abs(totalDistY)) {
			    numberOfSteps = Math.abs((totalDistX / 100) * 2);
		    } else {
			    numberOfSteps = Math.abs((totalDistY / 100) * 2);		
		    };

		    xStep =  totalDistX / numberOfSteps;
		    yStep =  totalDistY / numberOfSteps;
		    shrinkStepX = (image.width - MIN_WIDTH) / numberOfSteps;
		    shrinkStepY = shrinkStepX * (image.height / image.width);
	    };
	    
	    //Adds the image to the document
	    var addToDocument = function(){
	        document.body.appendChild(image);
	    };
	    
	    //Removes the image from the document
	    var removeFromDocument = function(){
	        window.clearInterval(timerID);
	        document.body.removeChild(image);
	        dispose();
	    };
	    
	    var dispose = function(){ Icon.Instances[this.id] = null;};
	    
	    //Moves the icon to the next increment step.
	    this.moveNextIncrement = function(targetX, targetY){
	        var left = parseInt(image.style.left);
    		var top = parseInt(image.style.top);
	        var moveX = !((left <= targetX && xStep < 0) || (left >= targetX && xStep > 0));
		    var moveY = !((top <= targetY && yStep < 0) || (top >= targetY && yStep > 0));
    			    
		    if (moveX)
			    image.style.left = left + xStep + "px";
		    		       		
    		if (moveY)
			    image.style.top = top + yStep + "px";
		    		    				        				
		    if (image.width >= MIN_WIDTH){ 
			    image.style.width = parseInt(image.style.width) - shrinkStepX + "px";
			    image.style.height = parseInt(image.style.height) - shrinkStepY + "px";
		    }
    		
		    if(!moveY && !moveX)
			    removeFromDocument();
			
	    };
	    
	    
	    //Slides the icon to the target location
	    this.slideTo = function(targetX, targetY){
	        initSlide(targetX, targetY);
	        addToDocument();
	        timerID = window.setInterval("Icon.Instances[" + this.id + "].moveNextIncrement(" + targetX + ", " + targetY + ")", 17);
	        
	    };
	};

    
    
    //Only use if the request is the latest request.
	function endAddItemRequest(req){
        if(req === addItemRequest){
            var doc = req.responseXML;
            var e = doc.getElementsByTagName("TotalValue");
            
            if (e.length == 1){
                if (typeof e[0].textContent != "undefined")
                    Carts[req.saleType].cartTotalLabel.innerHTML = e[0].textContent;
                else
                    Carts[req.saleType].cartTotalLabel.innerHTML = e[0].text;
            }
        }
    }
	
	function beginAddItemRequest(saleType, itemNumber, qty){
	    var req = new HTTPRequest("/library/cart/GetCartDetails.aspx?SaleType=" + parseInt(saleType + 1) + "&I=" + itemNumber + "&Q=" + qty, endAddItemRequest);
	    req.request.saleType = saleType;
	    
	    addItemRequest = req.request;
	    
	    req.send();
	    
	    Carts[saleType].cartTotalLabel.innerHTML  = "Updating...";
	}

	function getRandomNumber(MaxValue){
		return Math.floor(Math.random() * MaxValue);
	};

    function AddToCart(ItemNumber, Quantity, RowNumber, IconIndex, SaleType){
		var imgCartTotal;
		var q = document.getElementById("q" + RowNumber);
		var lblItemCount;

		if(q != null )
			if(q.value != '')
				Quantity = parseInt(q.value);
		
		beginAddItemRequest(SaleType, ItemNumber, Quantity);
		
		var item = addItemToCart(SaleType, ItemNumber, Quantity, "");
        
        if (item.description == "" || item.description == null)
            item.beginGetDescription();
        
		if (imgIcons[IconIndex] != null){
		    var iconX = getOffsetLeft(document.getElementById("r" + RowNumber)) - (imgIcons[IconIndex].width / 2);
		    var iconY = getOffsetTop(document.getElementById("r" + RowNumber)) - (imgIcons[IconIndex].height / 2);
		    var icon = new Icon(imgIcons[IconIndex].src, iconX, iconY);
		    
		    icon.slideTo(getOffsetLeft(Carts[SaleType].cartTotalLabel), getOffsetTop(Carts[SaleType].cartTotalLabel));
        };
  	};
			
	function addItemToCart(saleType, itemNumber, quantity, description){
	   		
		if (Carts[saleType].itemCountLabel !== null)
		    Carts[saleType].itemCountLabel.innerHTML = parseInt(Carts[saleType].itemCountLabel.innerHTML) + quantity;		
	    
	    
	    if (Carts[saleType].itemList !== null){
	        if (typeof(Carts[saleType].items[itemNumber]) === "undefined"){
	            var item = new Item(itemNumber, quantity, description);
    	        
	            Carts[saleType].items[itemNumber] = item;
    	        
	            item.listItem.innerHTML = quantity + " x " + item.description;
	            Carts[saleType].itemList.appendChild(item.listItem);
	        } else {
	            var item = Carts[saleType].items[itemNumber];
    	        
	            item.quantity = parseInt(item.quantity) + quantity;
	            item.listItem.innerHTML = item.quantity + " x " + Carts[saleType].items[itemNumber].description;
	        }  
	    }
	    
	    return Carts[saleType].items[itemNumber];
	}
			
	function getOffsetLeft(Item){
		var p = Item.offsetParent;
		var Value = Item.offsetLeft;
		
		while (p.offsetParent != null){
			Value += p.offsetLeft;
			p = p.offsetParent;
		};
		return Value;
	};

	function getOffsetTop(Item){
		var p = Item.offsetParent;
		var Value = Item.offsetTop;
		
		while (p.offsetParent != null){
			Value += p.offsetTop;
			p = p.offsetParent;
		};
		return Value;
	};	