var DataDia = {};

DataDia.Config = {
	lang : null,
	path : 'xml/cart.xml.php',

	getPath : function () {
		return this.path + (this.lang ? "?lang=" + escape(this.lang) : "");
	}
}

DataDia.Util = {
	hasElementAttribute : function(element, attributeName) {
		if (element.hasAttribute) {
			return element.hasAttribute(attributeName);
		} else {
			return (element.getAttributeNode(attributeName) ? true : false);
		}
	},

	getXMLRequest : function() {
		var request;

		if(navigator.appName == "Microsoft Internet Explorer") {
			request = new ActiveXObject("Microsoft.XMLHTTP");
		} else {
			request = new XMLHttpRequest();
		}

		return request;
	}
}

DataDia.Cart = {
	id : null,
	name : null,
	currency : null,
	customer : null,
	recipient : null,
	recipientCount : 0,
	items : new Array(),
	total : 0,
	transport : 0,
	loadHandlers : new Array(),
	errorHandlers : new Array(),

	activate : function(customer, func) {
		var request = DataDia.Util.getXMLRequest();

		request.onreadystatechange = function () {
			if (request.readyState == 1) {
				document.body.style.cursor = 'progress';
			}
			if(request.readyState == 4) {
				if (request.responseXML) {
					DataDia.Cart.loadXML(request.responseXML, func);
				}
				document.body.style.cursor = 'default';
				request = null;
			}
		};
		request.open("post", DataDia.Config.getPath());
		request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		request.send(
			'submit=customer' +
			'&customer=' + escape(customer.id) +
			'&customer_zipcode=' + escape(customer.zipcode) +
			'&customer_username=' + escape(customer.username) +
			'&customer_password=' + escape(customer.password) +
			'&customer_optin=' + (customer.optin ? 1 : 0)
		);
	},

	add : function(product, quantity, func) {
		var request = DataDia.Util.getXMLRequest();

		request.onreadystatechange = function () {
			if (request.readyState == 1) {
				document.body.style.cursor = 'progress';
			}
			if(request.readyState == 4) {
				if (request.responseXML) {
					DataDia.Cart.loadXML(request.responseXML, func);
				}
				document.body.style.cursor = 'default';
				request = null;
			}
		};
		request.open("post", DataDia.Config.getPath());
		request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		request.send("submit=add&product=" + escape(product) + "&quantity=" + escape(quantity));
	},

	clear : function(func) {
		var request = DataDia.Util.getXMLRequest();

		request.onreadystatechange = function () {
			if (request.readyState == 1) {
				document.body.style.cursor = 'progress';
			}
			if(request.readyState == 4) {
				if (request.responseXML) {
					DataDia.Cart.loadXML(request.responseXML, func);
				}
				document.body.style.cursor = 'default';
				request = null;
			}
		};
		request.open("post", DataDia.Config.getPath());
		request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		request.send("submit=clear");
	},

	load : function(func) {
		var request = DataDia.Util.getXMLRequest();

		request.onreadystatechange = function () {
			if (request.readyState == 1) {
				document.body.style.cursor = 'progress';
			}
			if (request.readyState == 4) {
				if (request.responseXML) {
					DataDia.Cart.loadXML(request.responseXML, func);
				}
				document.body.style.cursor = 'default';
				request = null;
			}
		};
		request.open("get", DataDia.Config.getPath());
		request.send(null);
	},

	loadXML : function(xmldoc, func) {
		if (xmldoc.documentElement.tagName == 'error') {
			var errorType = xmldoc.documentElement.getAttribute("type");
			var errorMessage = xmldoc.documentElement.textContent;

			for (var i=0; i<this.errorHandlers.length; i++) {
				this.errorHandlers[i](errorType, errorMessage);
			}
		} else {
			this.id = xmldoc.documentElement.getAttribute("id");
			this.name = xmldoc.documentElement.getAttribute("n");
			this.currency = xmldoc.documentElement.getAttribute("cy");
			this.total = parseFloat(xmldoc.documentElement.getAttribute("tt"));

			this.recipientCount = (DataDia.Util.hasElementAttribute(xmldoc.documentElement, "rc") ? parseInt(xmldoc.documentElement.getAttribute("rc")) : 0);

			this.customer = null;
			this.recipient = null;
			if (xmldoc.documentElement.firstChild && xmldoc.documentElement.firstChild.tagName == 'customer') {
				var customer = xmldoc.documentElement.firstChild;

				this.customer = new DataDia.CartContact();
				this.customer.id = customer.getAttribute("id");
				this.customer.name = customer.getAttribute("n");
				this.customer.address = customer.getAttribute("ad");
				this.customer.zipcode = customer.getAttribute("zc");
				this.customer.city = customer.getAttribute("ci");
				this.customer.state = customer.getAttribute("st");
				this.customer.country = customer.getAttribute("co");
				this.customer.phone = customer.getAttribute("ph");
				this.customer.fax = customer.getAttribute("fax");
				this.customer.gsm = customer.getAttribute("gsm");
				this.customer.email = customer.getAttribute("em");
				this.customer.im = customer.getAttribute("im");

				if (customer.nextSibling && customer.nextSibling.tagName == 'recipient') {
					var recipient = customer.nextSibling;

					this.recipient = new DataDia.CartContact();
					this.recipient.id = recipient.getAttribute("id");
					this.recipient.name = recipient.getAttribute("n");
					this.recipient.address = recipient.getAttribute("ad");
					this.recipient.zipcode = recipient.getAttribute("zc");
					this.recipient.city = recipient.getAttribute("ci");
					this.recipient.state = recipient.getAttribute("st");
					this.recipient.country = recipient.getAttribute("co");
					this.recipient.phone = recipient.getAttribute("ph");
					this.recipient.fax = recipient.getAttribute("fax");
					this.recipient.gsm = recipient.getAttribute("gsm");
					this.recipient.email = recipient.getAttribute("em");
					this.recipient.im = recipient.getAttribute("im");
				}
			}

			this.items = new Array();
			var items = xmldoc.documentElement.getElementsByTagName("i");
			for (var i=0; i<items.length; i++) {
				this.items[i] = new DataDia.CartItem();
				this.items[i].product = items[i].getAttribute("p");
				this.items[i].name = items[i].getAttribute("n");
				this.items[i].description = items[i].getAttribute("d");
				this.items[i].dimensions = items[i].getAttribute("di");
				this.items[i].finishing = items[i].getAttribute("fi");
				this.items[i].color = items[i].getAttribute("co");
				this.items[i].image = items[i].getAttribute("i");
				this.items[i].quantity = parseFloat(items[i].getAttribute("q"));
				this.items[i].price = parseFloat(items[i].getAttribute("pr"));
				this.items[i].currency = items[i].getAttribute("cy");
				this.items[i].total = parseFloat(items[i].getAttribute("tt"));
				this.items[i].vat = parseFloat(items[i].getAttribute("v"));
				this.items[i].ondemand = (parseInt(items[i].getAttribute("od")) == 1);
			}

			var transport = xmldoc.documentElement.getElementsByTagName("transport");
			if (transport[0]) {
				this.transport = parseFloat(transport[0].getAttribute("pr"));
			} else {
				this.transport = 0;
			}

			for (var i=0; i<this.loadHandlers.length; i++) {
				this.loadHandlers[i]();
			}

			if (func) {
				func();
			}
		}
	},

	newCustomer : function (customer, func) {
		var request = DataDia.Util.getXMLRequest();

		request.onreadystatechange = function () {
			if (request.readyState == 1) {
				document.body.style.cursor = 'progress';
			}
			if(request.readyState == 4) {
				if (request.responseXML) {
					DataDia.Cart.loadXML(request.responseXML, func);
				}
				document.body.style.cursor = 'default';
				request = null;
			}
		};
		request.open("post", DataDia.Config.getPath());
		request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		request.send((new Array(
			'submit=customer' +
			'&customer=' +
			'&customer_name=' + escape(customer.name) +
			'&customer_address=' + escape(customer.address) +
			'&customer_zipcode=' + escape(customer.zipcode) +
			'&customer_city=' + escape(customer.city) +
			'&customer_state=' + escape(customer.state) +
			'&customer_country=' + escape(customer.country) +
			'&customer_phone=' + escape(customer.phone) +
			'&customer_fax=' + escape(customer.fax) +
			'&customer_mobile=' + escape(customer.mobile) +
			'&customer_email=' + escape(customer.email) +
			'&customer_im=' + escape(customer.im) +
			'&customer_optin=' + (customer.optin ? 1 : 0) +
			'&customer_username=' + escape(customer.username) +
			'&customer_password=' + escape(customer.password) +
			'&customer_webcode=' + escape(customer.webcode)
		)).join('&'));
	},

	onLoad : function (handler) {
		this.loadHandlers[this.loadHandlers.length] = handler;
	},

	onError : function (handler) {
		this.errorHandlers[this.errorHandlers.length] = handler;
	},

	remove : function(index, func) {
		var request = DataDia.Util.getXMLRequest();

		request.onreadystatechange = function () {
			if (request.readyState == 1) {
				document.body.style.cursor = 'progress';
			}
			if(request.readyState == 4) {
				if (request.responseXML) {
					DataDia.Cart.loadXML(request.responseXML, func);
				}
				document.body.style.cursor = 'default';
				request = null;
			}
		};
		request.open("post", DataDia.Config.getPath());
		request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		request.send('submit=remove&item=' + escape(index));
	},

	reset : function (func) {
		var request = DataDia.Util.getXMLRequest();

		request.onreadystatechange = function () {
			if (request.readyState == 1) {
				document.body.style.cursor = 'progress';
			}
			if(request.readyState == 4) {
				if (request.responseXML) {
					DataDia.Cart.loadXML(request.responseXML, func);
				}
				document.body.style.cursor = 'default';
				request = null;
			}
		};
		request.open("post", DataDia.Config.getPath());
		request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		request.send('submit=reset');
	},

	roundNumber : function(number, precision) {
		var result;

		if (number.toFixed) {
			//if browser supports toFixed() method
			result = number.toFixed(precision);
		} else {
			//if browser doesn't support toFixed() method
			//simply round float
			var factor = 10 ^ precision;
			result = round(number * factor) / factor;
		}

		return result;
	},

	setRecipient : function(recipient, func) {
		var request = DataDia.Util.getXMLRequest();

		request.onreadystatechange = function () {
			if (request.readyState == 1) {
				document.body.style.cursor = "progress";
			}
			if(request.readyState == 4) {
				if (request.responseXML) {
					DataDia.Cart.loadXML(request.responseXML, func);
				}
				document.body.style.cursor = "default";
				request = null;
			}
		};

		request.open("post", DataDia.Config.getPath());
		request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

		if ((typeof recipient == "object") && (recipient != null)) {
			//assume CartContact
			request.send(
				'submit=recipient' +
				'&recipient=' + escape(recipient.id) +
				'&recipient_address=' + escape(recipient.address) +
				'&recipient_zipcode=' + escape(recipient.zipcode) +
				'&recipient_city=' + escape(recipient.city) +
				'&recipient_state=' + escape(recipient.state) +
				'&recipient_country=' + escape(recipient.country)+
				'&recipient_phone=' + escape(recipient.phone)
			);
		} else {
			//assume recipient id
			request.send("submit=recipient&recipient=" + escape(recipient));
		}
	},

	signin : function(username, password, func) {
		var request = DataDia.Util.getXMLRequest();

		request.onreadystatechange = function () {
			if (request.readyState == 1) {
				document.body.style.cursor = 'progress';
			}
			if(request.readyState == 4) {
				if (request.responseXML) {
					DataDia.Cart.loadXML(request.responseXML, func);
				}
				document.body.style.cursor = 'default';
				request = null;
			}
		};
		request.open("post", DataDia.Config.getPath());
		request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		request.send("submit=customer&username=" + escape(username) + '&password=' + escape(password));
	},

	submit : function(func) {
		var request = DataDia.Util.getXMLRequest();

		request.onreadystatechange = function () {
			if (request.readyState == 1) {
				document.body.style.cursor = 'progress';
			}
			if(request.readyState == 4) {
				if (request.responseXML) {
					DataDia.Cart.loadXML(request.responseXML, func);
				}
				document.body.style.cursor = 'default';
				request = null;
			}
		};
		request.open("post", DataDia.Config.getPath());
		request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		request.send("submit=submit");
	},

	updateQuantities : function(quantities, func) {
		var temp = new Array();
		for (var i=0; i<quantities.length; i++) {
			temp[i] = 'quantity[' + i + ']=' + escape(quantities[i]);
		}
		var request = DataDia.Util.getXMLRequest();

		if (temp.length > 0) {
			request.onreadystatechange = function () {
				if (request.readyState == 1) {
					document.body.style.cursor = 'progress';
				}
				if(request.readyState == 4) {
					if (request.responseXML) {
						DataDia.Cart.loadXML(request.responseXML, func);
					}
					document.body.style.cursor = 'default';
					request = null;
				}
			};
			request.open("post", DataDia.Config.getPath());
			request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			request.send("submit=update&" + temp.join('&'));
		}
	}
}





DataDia.CartItem = function() {
	this.product;
	this.name;
	this.description;
	this.dimensions;
	this.finishing;
	this.color;
	this.image;
	this.quantity;
	this.price;
	this.currency;
	this.total;
	this.vat;
	this.ondemand;
}





DataDia.CartContact = function() {
	this.id;
	this.username;
	this.password;
	this.webcode;
	this.name;
	this.address;
	this.zipcode;
	this.city;
	this.state;
	this.country;
	this.phone;
	this.fax;
	this.gsm;
	this.email;
	this.optin;
	this.im;
};