function Allxml() {
	this.serializeObjectToXmlString = function(obj) {
		var xObj = '<variable type="'+typeof(obj)+'">';
		switch (typeof(obj)) {
			case "object":
				for (prop in obj) {
					if (typeof(obj[prop]) != "function") {
						switch (typeof(obj[prop])) {
							case "object":
								xObj += '<property name="'+prop+'" type="object">' + this.serializeObjectToXmlString(obj[prop]) + '</property>';
								break;
							case "boolean":
							case "number":
								xObj += '<property name="'+prop+'" type="' + typeof(obj[prop]) + '">' + obj[prop] + '</property>';
								break;
							case "string":
							default:
								if (obj[prop] == "") {
									xObj += '<property name="'+prop+'" type="' + typeof(obj[prop]) + '"/>';
								} else if ((obj[prop].indexOf('<') >= 0) || (obj[prop].indexOf('>') >= 0) || (obj[prop].indexOf('&') >= 0)) {
									xObj += '<property name="'+prop+'" type="' + typeof(obj[prop]) + '"><![CDATA[' + obj[prop] + ']]></property>';
								} else {
									xObj += '<property name="'+prop+'" type="' + typeof(obj[prop]) + '">' + obj[prop] + '</property>';
								}
								break;
						}
					}
				}
				break;
			case "number":
			case "boolean":
			case "string":
				xObj += obj.toString();
				break;
		}
		xObj += "</variable>";
		return xObj;
	}
	
	this.serializeObject = function(obj) {
		return this.deserialize(this.serializeObjectToXmlString(obj));
	}
}

function IExml() {
	this._allxml = Allxml;
	this._allxml();
	
	this.create = function() {
		var dom = new ActiveXObject("Msxml2.FreeThreadedDOMDocument");
		dom.async = false;
		return dom;
	}
	this.deserialize = function(str) {
		var xml = this.create();
		xml.loadXML(str);
		return xml;
	}
	this.serialize = function(xml) {
		return xml.xml;
	}
	this.load = function(url) {
		var dom = new ActiveXObject("Msxml2.FreeThreadedDOMDocument");
		dom.async = false;
		dom.load(url);
		return dom;
	}
}

function FFxml() {
	this._allxml = Allxml;
	this._allxml();
	
	this.create = function() {
		var dom = document.implementation.createDocument("", "", null);
		dom.async = false;
		return dom;
	}
	this.deserialize = function(str) {
		var domP = new DOMParser();
		return domP.parseFromString(str, "text/xml");
	}
	this.serialize = function(xml) {
		var domS = new XMLSerializer();
		return domS.serializeToString(xml);
	}
	this.load = function(url) {
		var dom = document.implementation.createDocument("", "", null);
		dom.async = false;
		dom.load(url);
		return dom;
	}
}

if (ivy.browser.isIE) {
	ivy.xml = new IExml();
} else {
	ivy.xml = new FFxml();
}
