if (typeof(beejjs.xml) != "object" || beejjs.xml == null) {

	beejjs.xml = {

		/**
		 * Returns an xmlHttp object
		 */
		getXmlHttp: function() {
			var xmlHttp;

			try {
				// Firefox, Opera 8.0+, Safari
				xmlHttp = new XMLHttpRequest();
			} catch(e) {
				// Internet Explorer
				try {
					xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
				} catch(e) {
					try {
						xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
					} catch(e) {
						//alert("Your browser does not support AJAX!");
						return null;
					}
				}
			}

			return xmlHttp;
		},

		/**
		 * loadXML from a file into a DOM
		 */
		loadXMLFile: function(fileURL) {
			try { // Internet Explorer
				xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
			} catch(e) {
				try { // Firefox, Mozilla, Opera, etc.
					xmlDoc = document.implementation.createDocument("","",null);
				} catch(e) {
					//alert(e.message);
					return null;
				}
			}
			xmlDoc.async = false;
			xmlDoc.load(fileURL);

			return xmlDoc;
		},

		/**
		 * parse an XML string to a DOM object
		 */
		parseXML: function(xmlStr) {
			try { // Internet Explorer
				xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
				xmlDoc.async = false;
				xmlDoc.loadXML(xmlStr);
			} catch(e) {
				try { // Firefox, Mozilla, Opera, etc.
					parser = new DOMParser();
					xmlDoc = parser.parseFromString(xmlStr, "text/xml");
				} catch(e) {
					//alert(e.message);
					return null;
				}
			}

			return xmlDoc;
		},

		/**
		 * Convert an XML DOM tree to something more JSON-like
		 */
		xmlToObject: function(xml) {
			var i;
			var node;
			var obj;
			var normNodeName;

			var hasSubNodes = false;
			var text = "";

			obj = {};

			//beejjs.debug.write("=== " + xml.nodeName + " has " + xml.childNodes.length + " children");
			for (i = 0; i < xml.childNodes.length; i++) {
				node = xml.childNodes[i];
				//beejjs.debug.write(xml.nodeName + " has child: " + node.nodeName + " (" + node.nodeType + ")");

				switch (node.nodeType) {

				case 1: // normal element
					hasSubNodes = true;
					//beejjs.debug.write("recursing into " + node.nodeName);
					normNodeName = node.nodeName.replace(/:/g, '_');
					obj[normNodeName] = this.xmlToObject(node);
					//beejjs.debug.write("set obj[" + normNodeName + "] = " + obj[node.nodeName]);
					break;

				case 3: // text node
					text += node.nodeValue;
					break;
				}
			}

			if (!hasSubNodes) { // just got text nodes
				return text;
			}

			return obj;
		},

		/**
		 * remove child element and text nodes from a node.
		 */
		deleteChildren: function(xmlNode) {
			while(xmlNode.hasChildNodes()) {
				xmlNode.removeChild(xmlNode.firstChild);
			}
		},

		/**
		 * remove child element and text nodes from a node.
		 */
		deleteVisibleChildren: function(xmlNode) {
			var i;

			for(i = xmlNode.childNodes.length-1; i >= 0; i--) {
				var type = xmlNode.childNodes[i].nodeType;
				if (type == 1 || type == 3) {
					xmlNode.removeChild(xmlNode.childNodes[i]);
				}
			}
		}

	} // beejjs.xml
}

