
var ajaxHelper = {

	// Number of requests in progress.
	requestCounter : 0,
	
	// Request id counter, used to identify request/response.
	requestId : 0,

	// private function
	_getHttpReqObject : function () {
		xmlHttpReq=null;
		try { // Firefox, Opera 8.0+, Safari
			xmlHttpReq=new XMLHttpRequest();
		} catch (e) {
			try { // Internet Explorer
				xmlHttpReq=new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e2) {
				try {
					xmlHttpReq=new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e4) {
					alert("Your browser does not support AJAX!");
				}
			}
		}
		
		if (!xmlHttpReq && typeof XMLHttpRequest!='undefined') {
			try {
				xmlHttpReq = new XMLHttpRequest();
			} catch (e) {
				xmlHttpReq=false;
			}
		}
	 
		if (!xmlHttpReq && window.createRequest) {
			try {
				xmlHttpReq = window.createRequest();
			} catch (e) {
				xmlHttpReq=false;
			}
		}
		return xmlHttpReq;
	},

	// private function
	_loadXMLDoc : function(requestObj, url, handler) {
		if (requestObj) {
			this.requestCounter++;
			requestObj.onreadystatechange = function() { handler(requestObj); };
			requestObj.open("GET", url, true);
			requestObj.send(null);
	   	}
	},

	// private function
	_parseResponse : function(xmlDoc) {
		var response = {
			id : -1,
			data : null
		};
		
		if (xmlDoc.tagName != "error") {
			// Get transaction id
			response.id = parseInt(xmlDoc.attributes.getNamedItem("id").value);
			
			// Get response data
			for (i = 0; i < xmlDoc.childNodes.length; i++) {
				var node = xmlDoc.childNodes[i];
				
				if (node.tagName == "basketinfo") {
					// readBasketInfo
					response.data = this._parseBasketInfo(node);
				} else if (node.tagName == "basketitems") {
					// readBasketItems
					response.data = this._parseBasketItems(node);
				} else if (node.tagName == "orderitems") {
					// addToOrder
					response.data = this._parseOrderItems(node); 
				} else if (node.tagName == "deleted") {
					// deleteFromOrder
					response.data = true;
				}
			}
		}
		return response;
	},
	
	// private function
	_parseBasketInfo : function(basketInfoNode) {
		var basketInfo = {
			price : 0,
			numberOfItems : 0
		};
		
		var nodes = basketInfoNode.childNodes;
		for (i = 0; i < nodes.length; i++) {
			var node = nodes[i];

			if (node.tagName == "price") {
				basketInfo.price = node.firstChild.nodeValue;
			} else if (node.tagName == "numberofitems") {
				basketInfo.numberOfItems = node.firstChild.nodeValue;
			}
		}
		
		return basketInfo;
	},
	
	// private function
	_parseBasketItems : function(basketItemsNode) {
		basketItems = [];
		var nodes = basketItemsNode.childNodes;

		// Loop through each basket item
		for (index = 0; index < nodes.length; index++) {
			var item = {};
			
			// Loop through each node in the basket item
			for (i = 0; i < nodes[index].childNodes.length; i++) {
				var itemNode = nodes[index].childNodes[i];
				if (itemNode.tagName == "artist") {
					item.artist = itemNode.firstChild.nodeValue;
				} else if (itemNode.tagName == "format") {
					item.format = itemNode.firstChild.nodeValue;
				} else if (itemNode.tagName == "orderitemid") {
					item.orderItemId = itemNode.firstChild.nodeValue;
				} else if (itemNode.tagName == "price") {
					item.price = itemNode.firstChild.nodeValue;
				} else if (itemNode.tagName == "rentable") {
					if (itemNode.firstChild.nodeValue == "true") {
						item.rentable = true;
					} else {
						item.rentable = false;
					}
				} else if (itemNode.tagName == "buyable") {
					if (itemNode.firstChild.nodeValue == "true") {
						item.buyable = true;
					} else {
						item.buyable = false;
					}
				} else if (itemNode.tagName == "title") {
					item.title = itemNode.firstChild.nodeValue;
				} else if (itemNode.tagName == "type") {
					item.type = itemNode.firstChild.nodeValue;
				} else if (itemNode.tagName == "viewid") {
					item.viewId = itemNode.firstChild.nodeValue;
				}
			}
			basketItems.push(item);
		}
		
		return basketItems;
	},

	// private function
	_parseOrderItems : function(orderItemsNode) {
		var orderItemIds = [];	
		var nodes = orderItemsNode.childNodes;
		
		// Loop through each order item.
		for (i = 0; i < nodes.length; i++) {
			orderItemIds.push(nodes[i].attributes.getNamedItem("id").value);
		}
		
		return orderItemIds;	
	},
	
	// private function
	_showIndicator : function(id) {
		document.getElementById(id).style.visibility = 'visible';
	},
	
	// private function
	_hideIndicator : function(id) {
		if (this.requestCounter < 1) {
			document.getElementById(id).style.visibility = 'hidden';
		}
	},

	// public function
	addToOrder : function(catEntryIds, singleItem, options) {
		var reqObject = this._getHttpReqObject();
		var parameters = "";
		
		if (options.storeId) {
			parameters += "&storeId=" + options.storeId;
		}
		for (i = 0; i < catEntryIds.length; i++) {
			parameters += "&itemId=" + catEntryIds[i];
		}
		
		var url = '/Magellan/pages/ajax/ajaxHelper.jsp?action=addToOrder' + parameters + '&singleItem=' + singleItem + '&requestId=' + this.requestId++;
		var that = this;
		
		var handler = function(httpRequest, helper)
			{
				if (httpRequest.readyState == 4 && httpRequest.status == 200) {
					var xmlDoc = httpRequest.responseXML.documentElement;					
					var response = that._parseResponse(xmlDoc);

					that.requestCounter--;
					
					if (options.onComplete) {		
						options.onComplete(response);
					}
					if (options.indicator) {
						that._hideIndicator(options.indicator);
					}
				}
			};

		if (options.indicator) {
			this._showIndicator(options.indicator);
		}
		this._loadXMLDoc(reqObject, url, handler);
	},

	// public function
	deleteFromOrder : function(orderItemId, options) {
		var reqObject = this._getHttpReqObject();
		var url = '/Magellan/pages/ajax/ajaxHelper.jsp?action=deleteFromOrder&orderItemId=' + orderItemId + '&requestId=' + this.requestId++;
		var that = this;
		
		var handler = function(httpRequest) {
				if (httpRequest.readyState == 4 && httpRequest.status == 200) {
					var xmlDoc = httpRequest.responseXML.documentElement;
					var response = that._parseResponse(xmlDoc);

					that.requestCounter--;

					if (options.onComplete) {		
						options.onComplete(response);
					}
					if (options.indicator) {
						that._hideIndicator(options.indicator);
					}
				}
			};
			
		if (options.indicator) {
			this._showIndicator(options.indicator);
		}
		this._loadXMLDoc(reqObject, url, handler);
	},

	// public function
	readBasketInfo : function(options) {
		var reqObject = this._getHttpReqObject();
		var url = '/Magellan/pages/ajax/ajaxHelper.jsp?action=readBasketInfo' + '&requestId=' + this.requestId++;// + (new Date()).getTime();
		var that = this;
		
		var handler = function(httpRequest) {
				if (httpRequest.readyState == 4 && httpRequest.status == 200) {
					var xmlDoc = httpRequest.responseXML.documentElement;
					var response = that._parseResponse(xmlDoc);

					that.requestCounter--;
					
					if (options.onComplete) {		
						options.onComplete(response);
					}
					if (options.indicator) {
						that._hideIndicator(options.indicator);
					}
				}
			};
		
		if (options.indicator) {
			this._showIndicator(options.indicator);
		}
		this._loadXMLDoc(reqObject, url, handler);
	},
	
	// public function
	readBasketItems : function(orderItemIds, options) {
		var reqObject = this._getHttpReqObject();
		var parameters = "";
		for (i = 0; i < orderItemIds.length; i++) {
			parameters += "&orderItemId=" + orderItemIds[i];
		}
		
		var url = '/Magellan/pages/ajax/ajaxHelper.jsp?action=readBasketItems' + parameters + '&requestId=' + this.requestId++;
		var that = this;
		
		var handler = function(httpRequest) {
				if (httpRequest.readyState == 4 && httpRequest.status == 200) {
					var xmlDoc = httpRequest.responseXML.documentElement;
					var response = that._parseResponse(xmlDoc);

					that.requestCounter--;

					if (options.onComplete) {
						options.onComplete(response);
					}
					if (options.indicator) {
						that._hideIndicator(options.indicator);
					}
				}
			};
		
		if (options.indicator) {
			this._showIndicator(options.indicator);
		}
		this._loadXMLDoc(reqObject, url, handler);
	}
}
