/*

	Shopping Cart Class

	Author : Chonlasith Jucksriporn

	Requirement :	Javascript 1.1
					prototype.js (1.4 or newer)
					AjaxMini.js (Release 23/8/2549 or newer)

	Description : Shopping Cart is Javascript-based shopping cart.
	
	Note : The original code has limitation from cookie limitaion (4K limitation).
	This version move cart repository from cookie to database.
	
	Revision :
	9/8/2549  - U/Release
	16/8/2549 - U/Add price into cart item
	16/8/2549 - Mix/change function setItem from [+ "price:" + price + ","] to [+ "price:\"" + price + "\","]
	16/8/2549 - Mix/Add "type" and "world" into cart item
	23/8/2549 - U/Major changes!
	8/9/2549  - U/Add cart ID
			  - U/Add functions for cart#2
	11/9/2549 - U/Add ref1 for collect any referencing item
	19/9/2549 - U/Modify functions for cart#1 to pass cart number
	6/10/2549 - U/Fix addItem. Error when add item having & in it info
*/
var MY_CART_ENCODING = "UTF-8";
var MY_CART_RPC = "http://truemusic.truelife.com/home/inc/inc_proxy_cart.php";

function clsShoppingCart()
{
	var cart = {
		/* RPC */
		rpc:null,

		/* Common functions */
		createCommand:function(cmdname, parameters)
		{
			var xml = "<?xml version=\"1.0\" encoding=\"" + MY_CART_ENCODING + "\"?>"
					+ "<cart-request>"
					+ "<command>" + cmdname + "</command>"
					+ "<parameters>";
			if (parameters)
			{
				var p = null;
				for (p in parameters)
					xml += ("<parameter name=\"" + p + "\"><![CDATA[" + eval("parameters." + p) + "]]></parameter>");
			}
			xml = xml + "</parameters>"
				+ "</cart-request>";
			//dbg.write("COMMAND:" + xml);
			return (xml);
		},
		parseReturn:function(cmdname, returnxml)
		{
			var node = returnxml.selectSingleNode("/cart-response[@code='200']");
			var v = 0;
			if (node)
			{
				var command = node.selectSingleNode("command");
				if (command)
				{
					//dbg.write("COMMAND NODE FOUND: OK");
					if (command.text == cmdname)
					{ 
						//dbg.write("COMMAND MATCH: OK");
						rtnValue = node.selectSingleNode("returnvalue");
						if (rtnValue)
						{
							return "OK";
						}
						else
						{
							return "INVALID_RESPONSE";
						}
					}
					else
					{
						return "INVALID_COMMAND";
					}
				}
				else
				{
					return "INVALID_RESPONSE";
				}
			}
			else
				return "ERROR";
		},
		grepReturnValue:function(cmdname, returnxml, defaultvalue)
		{
			var rtn = "";
			if (this.parseReturn(cmdname, returnxml)=="OK")
			{
				rtn = returnxml.selectSingleNode("/cart-response[@code='200']/returnvalue").text;
				//dbg.write("GREP VALUE:" + rtn);
				return rtn;
			}
			return defaultvalue;
		},
		grepReturnXMLValue:function(cmdname, returnxml, defaultvalue)
		{
			var rtn = "";
			var rtnvaluenode = null;
			if (this.parseReturn(cmdname, returnxml)=="OK")
			{
				rtnvaluenode = returnxml.selectSingleNode("/cart-response[@code='200']/returnvalue").firstChild;
				if (rtnvaluenode)
					rtn = rtnvaluenode.xml;
				else
					rtn = "";
				//dbg.write("GREP VALUE:" + rtn);
				return rtn;
			}
			return defaultvalue;
		},

		/* Cart#1 */
		count:function(centralid, cartid)
		{
			if (cartid==null) cartid = "1";
			var rtn = this.rpc.RPCCall(MY_CART_RPC, 
					  this.createCommand("count", 
						{
							CartID:cartid,
							CentralID:centralid
						}));
			//dbg.write("RETURN XML count : " + rtn.xml);
			var v = parseInt(this.grepReturnValue("count", rtn, "0"));
			return v;
		},
		addItem:function(centralid, title, contentid, serviceid, price, world, type, quantity, ref1, cartid)
		{
			//dbg.write("param= centralid:" + centralid + " title:"+ title + " contentid:" + contentid +" serviceid:"+serviceid +" price: "+price +" world:"+world +" type:"+type +" quantity:"+quantity +" :ref1"+ref1+" cartid:"+cartid);
			if (cartid==null) cartid = "1";
			// fix for xml

			title = title.replace("&", "&amp;").replace("<","&lt;").replace(">","&gt;").replace("\"","&quot;");
			ref1 = ref1.replace("&", "&amp;").replace("<","&lt;").replace(">","&gt;").replace("\"","&quot;");
			var rtn = this.rpc.RPCCall(MY_CART_RPC, 
					  this.createCommand("add", 
						{
							CartID:cartid,
							CentralID:centralid,
							Title:title,
							ContentID:contentid,
							ServiceID:serviceid,
							Price:price,
							World:world,
							Type:type,
							Quantity:quantity,
							Ref1:ref1
						}));
			//dbg.write("RETURN XML addItem: " + rtn.xml);
			var v = this.grepReturnValue("add", rtn, "");
			//this.showDebug();
			return v;
		},
		addItem_streamguid:function(centralid, title, streamguid, serviceid, price, world, type, quantity, ref1, cartid)
		{
			//dbg.write("param= centralid:" + centralid + " title:"+ title + " contentid:" + songguid +" serviceid:"+serviceid +" price: "+price +" world:"+world +" type:"+type +" quantity:"+quantity +" :ref1"+ref1+" cartid:"+cartid);
			if (cartid==null) cartid = "1";
			// fix for xml

			title = title.replace("&", "&amp;").replace("<","&lt;").replace(">","&gt;").replace("\"","&quot;");
			ref1 = ref1.replace("&", "&amp;").replace("<","&lt;").replace(">","&gt;").replace("\"","&quot;");
			var rtn = this.rpc.RPCCall(MY_CART_RPC, 
					  this.createCommand("add_streamguid", 
						{
							CartID:cartid,
							CentralID:centralid,
							Title:title,
							ContentID:streamguid,
							ServiceID:serviceid,
							Price:price,
							World:world,
							Type:type,
							Quantity:quantity,
							Ref1:ref1
						}));
			//dbg.write("RETURN XML addItem: " + rtn.xml);
			var v = this.grepReturnValue("add", rtn, "");
			//this.showDebug();
			return v;
		},
		addItem_gumix:function(centralid, title, contentid, serviceid, price, world, type, quantity, ref1, cartid)
		{
			alert("title="+title);
			alert("ref1="+ref1);
			/*//dbg.write("param= centralid:" + centralid + " title:"+ title + " contentid:" + contentid +" serviceid:"+serviceid +" price: "+price +" world:"+world +" type:"+type +" quantity:"+quantity +" :ref1"+ref1+" cartid:"+cartid);
			if (cartid==null) cartid = "1";
			// fix for xml

			title = title.replace("&", "&amp;").replace("<","&lt;").replace(">","&gt;").replace("\"","&quot;");
			ref1 = ref1.replace("&", "&amp;").replace("<","&lt;").replace(">","&gt;").replace("\"","&quot;");
			var rtn = this.rpc.RPCCall(MY_CART_RPC, 
					  this.createCommand("add", 
						{
							CartID:cartid,
							CentralID:centralid,
							Title:title,
							ContentID:contentid,
							ServiceID:serviceid,
							Price:price,
							World:world,
							Type:type,
							Quantity:quantity,
							Ref1:ref1
						}));
			//dbg.write("RETURN XML addItem: " + rtn.xml);
			var v = this.grepReturnValue("add", rtn, "");
			//this.showDebug();
			return v;
			*/
		},
		removeItem:function(centralid, contentid, serviceid, cartid)
		{
			if (cartid==null) cartid = "1";
			var rtn = this.rpc.RPCCall(MY_CART_RPC, 
					  this.createCommand("remove", 
						{
							CartID:cartid,
							CentralID:centralid,
							ContentID:contentid,
							ServiceID:serviceid
						}));
			//dbg.write("RETURN XML: " + rtn.xml);
			var v = this.grepReturnValue("remove", rtn, "");
			//this.showDebug();
			return v;
		},
		getItem:function(centralid, contentid, serviceid, cartid)
		{
			if (cartid==null) cartid = "1";
			if (this.exists(centralid, contentid, serviceid, cartid))
			{
				var rtn = this.rpc.RPCCall(MY_CART_RPC, 
						  this.createCommand("getitem", 
							{
								CartID:cartid,
								CentralID:centralid,
								ContentID:contentid,
								ServiceID:serviceid
							}));
				//dbg.write("RETURN XML: " + rtn.xml);
				var v = "";
				var node = rtn.selectSingleNode("/cart-response[@code='200']/returnvalue/item");
				var child = null;
				if (node)
				{
					//dbg.write("ITEM FOUND: OK");
					children = node.childNodes;
					while(child=children.nextNode())
					{
						//dbg.write("CONSTRUCT ITEM: " + child.nodeName + "=" + child.text);
						if (v!="") v += ",";
						v += child.nodeName + ":\"" + child.text + "\"";
					}
					//dbg.write("CONSTRUCTOR DONE");
					v = "{" + v + "}";
					eval("var item=" + v);
					return item;
				}
			}
			return null;
		},
		exists:function(centralid, contentid, serviceid, cartid)
		{
			if (cartid==null) cartid = "1";
			var rtn = this.rpc.RPCCall(MY_CART_RPC, 
					  this.createCommand("exists", 
						{
							CartID:cartid,
							CentralID:centralid,
							ContentID:contentid,
							ServiceID:serviceid
						}));
			//dbg.write("RETURN XML: " + rtn.xml);
			var v = this.grepReturnValue("exists", rtn, "FALSE");
			return (v == "TRUE");
		},
		exists_streamguid:function(centralid, streamguid, serviceid, cartid)
		{
			if (cartid==null) cartid = "1";
			var rtn = this.rpc.RPCCall(MY_CART_RPC, 
					  this.createCommand("exists_streamguid", 
						{
							CartID:cartid,
							CentralID:centralid,
							ContentID:streamguid,
							ServiceID:serviceid
						}));
			//dbg.write("RETURN XML: " + rtn.xml);
			var v = this.grepReturnValue("exists", rtn, "FALSE");
			return (v == "TRUE");
		},
		existsEx:function(centralid, contentid, serviceid, cartid)
		{
			if (cartid==null) cartid = "1";
			if (this.exists(centralid, contentid, serviceid, cartid))
			{
				return this.getItem(centralid, contentid, serviceid, cartid);
			}
			return null;
		},
		empty:function(centralid, cartid)
		{
			if (cartid==null) cartid = "1";
			var rtn = this.rpc.RPCCall(MY_CART_RPC, 
					  this.createCommand("empty", 
						{
							CartID:cartid,
							CentralID:centralid
						}));
			//dbg.write("RETURN XML: " + rtn.xml);
			var v = this.grepReturnValue("empty", rtn, "");
			//this.showDebug();
			return v;
		},
		getXMLString:function(centralid, cartid)
		{
			if (cartid==null) cartid = "1";
			var rtn = this.rpc.RPCCall(MY_CART_RPC, 
					  this.createCommand("getxml", 
						{
							CartID:cartid,
							CentralID:centralid
						}));
			//dbg.write("RETURN XML: " + rtn.xml);
			var v = "<?xml version=\"1.0\" encoding=\"" + MY_CART_ENCODING + "\"?>" + this.grepReturnXMLValue("getxml", rtn, "<cart-object/>");
			return v;
		},
		getXML:function(centralid, cartid)
		{
			if (cartid==null) cartid = "1";
			var xml = new ActiveXObject("Msxml2.DomDocument");
			var xmlString = "";
			
			if (xml)
			{
				xmlString = this.getXMLString(centralid, cartid);
				//dbg.write("XML RETURN:" + xmlString);
				if (xml.loadXML(xmlString))
				{
					return xml;
				}
				else
				{
					alert("Error loading XML");
				}
			}
			return null;
		},



		/* Cart#2 - Cart#2 can hold only 1 item at a time. */
		count2:function(centralid)
		{
			var rtn = this.rpc.RPCCall(MY_CART_RPC, 
					  this.createCommand("count", 
						{
							CartID:"2",
							CentralID:centralid
						}));
			//dbg.write("RETURN XML: " + rtn.xml);
			var v = parseInt(this.grepReturnValue("count", rtn, "0"));
			return v;
		},
		addItem2:function(centralid, title, contentid, serviceid, price, world, type, quantity, ref1)
		{
			this.empty2(centralid);
			// fix for xml
			title = title.replace("&", "&amp;").replace("<","&lt;").replace(">","&gt;").replace("\"","&quot;");
			ref1 = ref1.replace("&", "&amp;").replace("<","&lt;").replace(">","&gt;").replace("\"","&quot;");
			var rtn = this.rpc.RPCCall(MY_CART_RPC, 
					  this.createCommand("add", 
						{
							CartID:"2",
							CentralID:centralid,
							Title:title,
							ContentID:contentid,
							ServiceID:serviceid,
							Price:price,
							World:world,
							Type:type,
							Quantity:quantity,
							Ref1:ref1
						}));
			//dbg.write("RETURN XML: " + rtn.xml);
			var v = this.grepReturnValue("add", rtn, "");
			//this.showDebug();
			return v;
		},
		removeItem2:function(centralid, contentid, serviceid)
		{
			var rtn = this.rpc.RPCCall(MY_CART_RPC, 
					  this.createCommand("remove", 
						{
							CartID:"2",
							CentralID:centralid,
							ContentID:contentid,
							ServiceID:serviceid
						}));
			//dbg.write("RETURN XML: " + rtn.xml);
			var v = this.grepReturnValue("remove", rtn, "");
			//this.showDebug();
			return v;
		},
		getItem2:function(centralid, contentid, serviceid)
		{
			if (this.exists2(centralid, contentid, serviceid))
			{
				var rtn = this.rpc.RPCCall(MY_CART_RPC, 
						  this.createCommand("getitem", 
							{
								CartID:"2",
								CentralID:centralid,
								ContentID:contentid,
								ServiceID:serviceid
							}));
				//dbg.write("RETURN XML: " + rtn.xml);
				var v = "";
				var node = rtn.selectSingleNode("/cart-response[@code='200']/returnvalue/item");
				var child = null;
				if (node)
				{
					//dbg.write("ITEM FOUND: OK");
					children = node.childNodes;
					while(child=children.nextNode())
					{
						//dbg.write("CONSTRUCT ITEM: " + child.nodeName + "=" + child.text);
						if (v!="") v += ",";
						v += child.nodeName + ":\"" + child.text + "\"";
					}
					//dbg.write("CONSTRUCTOR DONE");
					v = "{" + v + "}";
					eval("var item=" + v);
					return item;
				}
			}
			return null;
		},
		exists2:function(centralid, contentid, serviceid)
		{
			var rtn = this.rpc.RPCCall(MY_CART_RPC, 
					  this.createCommand("exists", 
						{
							CartID:"2",
							CentralID:centralid,
							ContentID:contentid,
							ServiceID:serviceid
						}));
			//dbg.write("RETURN XML: " + rtn.xml);
			var v = this.grepReturnValue("exists", rtn, "FALSE");
			return (v == "TRUE");
		},
		existsEx2:function(centralid, contentid, serviceid)
		{
			if (this.exists(centralid, contentid, serviceid))
			{
				return this.getItem2(centralid, contentid, serviceid);
			}
			return null;
		},
		empty2:function(centralid)
		{
			var rtn = this.rpc.RPCCall(MY_CART_RPC, 
					  this.createCommand("empty", 
						{
							CartID:"2",
							CentralID:centralid
						}));
			//dbg.write("RETURN XML: " + rtn.xml);
			var v = this.grepReturnValue("empty", rtn, "");
			//this.showDebug();
			return v;
		},
		getXMLString2:function(centralid)
		{
			var rtn = this.rpc.RPCCall(MY_CART_RPC, 
					  this.createCommand("getxml", 
						{
							CartID:"2",
							CentralID:centralid
						}));
			//dbg.write("RETURN XML: " + rtn.xml);
			var v = "<?xml version=\"1.0\" encoding=\"" + MY_CART_ENCODING + "\"?>" + this.grepReturnXMLValue("getxml", rtn, "<cart-object/>");
			return v;
		},
		getXMLString2:function(centralid)
		{
			var rtn = this.rpc.RPCCall(MY_CART_RPC, 
					  this.createCommand("getxml", 
						{
							CartID:"2",
							CentralID:centralid
						}));
			//dbg.write("RETURN XML: " + rtn.xml);
			var v = "<?xml version=\"1.0\" encoding=\"" + MY_CART_ENCODING + "\"?>" + this.grepReturnXMLValue("getxml", rtn, "<cart-object/>");
			return v;
		},
		getXML2:function(centralid)
		{
			
			var xml = new ActiveXObject("Msxml2.DomDocument");
			var xmlString = "";
			
			if (xml)
			{
				xmlString = this.getXMLString2(centralid);
				//dbg.write("XML RETURN:" + xmlString);
				if (xml.loadXML(xmlString))
				{
					return xml;
				}
				else
				{
					alert("Error loading XML");
				}
			}
			return null;
		}

	};

	cart.rpc = new clsAjaxMini();

	return cart;
}

