			function stringToXmlDoc(str) {
				if (window.ActiveXObject) { // Internet Explorer
					var doc=new ActiveXObject("Microsoft.XMLDOM");
					doc.async="false";
					doc.loadXML(str);
					return doc;
				} else // Mozilla
					return (new DOMParser()).parseFromString(str,"text/xml");
			}

			function xmlDocToString(xmlDoc) {
				if (window.ActiveXObject) // Internet Explorer
					return xmlDoc.xml;
				else
					return (new XMLSerializer()).serializeToString(xmlDoc);
			}
			
			function doXSLTransform(xml, xslt) {
				if (window.ActiveXObject) { // Internet Explorer
					return xml.transformNode(xslt);
				} else { // Mozilla
					var xsltProcessor = new XSLTProcessor();
					xsltProcessor.importStylesheet(xslt);
					return xsltProcessor.transformToFragment(xml, xslt);
				}
			}

			function findModelNodeByAttribute(xml, attributeName, attributeValue) {
				var xpath = "//folder[@"+attributeName+" = '"+attributeValue+"']";
				if(window.ActiveXObject) // Internet Explorer
					return xml.selectSingleNode(xpath);
				else  // Mozilla
					return xml.evaluate(xpath, xml, null, 0, null).iterateNext();
			}

			function getXmlDocFromDOMNode(nodeId) {
				var elem = document.getElementById(nodeId);
				return stringToXmlDoc(elem.value);
			}

			function getXmlDocFromURL(url) {
				var xmlhttp = new XMLHttpRequest();
				xmlhttp.open("GET", url, false);
				xmlhttp.send(null);
				return stringToXmlDoc(xmlhttp.responseText);				
			}