if (window.DOMParser &&
		window.XMLSerializer &&
		window.Node && Node.prototype && Node.prototype.__defineGetter__) {

	if (!Document.prototype.loadXML) {
		Document.prototype.loadXML = function (s) {
			var doc2 = (new DOMParser()).parseFromString(s, "text/xml");
			while (this.hasChildNodes())
				this.removeChild(this.lastChild);

			for (var i = 0; i < doc2.childNodes.length; i++) {
				this.appendChild(this.importNode(doc2.childNodes[i], true));
			}
		};
	}

	Document.prototype.__defineGetter__("xml",
			function () {
				return (new XMLSerializer()).serializeToString(this);
			}
			);
}
var XmlUtils = {
	createXmlDocument: function() {
		if (document.implementation && document.implementation.createDocument) {
			var doc = document.implementation.createDocument("", "", null);

			if (doc.readyState == null) {
				doc.readyState = 1;
				doc.addEventListener("load", function () {
					doc.readyState = 4;
					if (typeof doc.onreadystatechange == "function")
						doc.onreadystatechange();
				}, false);
			}

			return doc;
		}

		if (window.ActiveXObject)
			return Try.these(
					function() {
						return new ActiveXObject('MSXML2.DomDocument')
					},
					function() {
						return new ActiveXObject('Microsoft.DomDocument')
					},
					function() {
						return new ActiveXObject('MSXML.DomDocument')
					},
					function() {
						return new ActiveXObject('MSXML3.DomDocument')
					}
					) || false;

		return null;
	},

	getContentAsString: function(parentNode) {
		return parentNode.xml != undefined ?
					 this._getContentAsStringIE(parentNode) :
					 this._getContentAsStringMozilla(parentNode);
	},

	_getContentAsStringIE: function(parentNode) {
		var contentStr = "";
		for (var i = 0; i < parentNode.childNodes.length; i++) {
			var n = parentNode.childNodes[i];
			if (n.nodeType == 4) {
				contentStr += n.nodeValue;
			}
			else {
				contentStr += n.xml;
			}
		}
		return contentStr;
	},

	_getContentAsStringMozilla: function(parentNode) {
		var xmlSerializer = new XMLSerializer();
		var contentStr = "";
		for (var i = 0; i < parentNode.childNodes.length; i++) {
			var n = parentNode.childNodes[i];
			if (n.nodeType == 4) { // CDATA node
				contentStr += n.nodeValue;
			}
			else {
				contentStr += xmlSerializer.serializeToString(n);
			}
		}
		return contentStr;
	}
}

