
/**
 * Create a new Document object. If no arguments are specified,
 * the document will be empty. If a root tag is specified, the document
 * will contain that single root tag. If the root tag has a namespace
 * prefix, the second argument must specify the URL that identifies the
 *namespace.
 */
XML.newDocument = function(rootTagName, namespaceURL) {
    if (!rootTagName) rootTagName = "";
    if (!namespaceURL) namespaceURL = "";

    if (document.implementation && document.implementation.createDocument) {
        // This is the W3C standard way to do it
        return document.implementation.createDocument(namespaceURL, 
                       rootTagName, null);
    }
    else { // This is the IE way to do it
        // Create an empty document as an ActiveX object
        // If there is no root element, this is all we have to do
        var doc = new ActiveXObject("MSXML2.DOMDocument");

        // If there is a root tag, initialize the document
        if (rootTagName) {
            // Look for a namespace prefix
            var prefix = "";
            var tagname = rootTagName;
            var p = rootTagName.indexOf(':');
            if (p != -1) {
                prefix = rootTagName.substring(0, p);
                tagname = rootTagName.substring(p+1);
            }

            // If we have a namespace, we must have a namespace prefix
            // If we don't have a namespace, we discard any prefix
            if (namespaceURL) {
                if (!prefix) prefix = "a0"; // What Firefox uses
            }
            else prefix = "";

            // Create the root element (with optional namespace) as a
            // string of text
            var text = "<" + (prefix?(prefix+":"):"") + tagname +
                (namespaceURL
                 ?(" xmlns:" + prefix + '="' + namespaceURL +'"')
                 :"") +
                "/>";
            // And parse that text into the empty document
            doc.loadXML(text);
        }
        return doc;
    }
}; 

XML.parse = function(text) { 
	if (typeof DOMParser != "undefined") { 
		// Mozilla, Firefox, and related browsers 
		return (new DOMParser()).parseFromString(text, "application/xml"); 
	} 
	else if (typeof ActiveXObject != "undefined") { 
		// Internet Explorer. 
	    var doc = XML.newDocument();  // Create an empty document 
	        doc.loadXML(text);            // Parse text into it 
	        return doc;                   // Return it 
	    } 
	    else { 
	        // As a last resort, try loading the document from a data: URL 
	        // This is supposed to work in Safari. Thanks to Manos Batsis and 
	        // his Sarissa library (sarissa.sourceforge.net) for this technique. 
	        var url = "data:text/xml;charset=utf-8," + encodeURIComponent(text); 
	        var request = new XMLHttpRequest(); 
	        request.open("GET", url, false); 
	        request.send(null); 
	        return request.responseXML; 
	    } 
	}; 

XML.toString = function(xmlDoc) {
    if (document.implementation && document.implementation.createDocument) {
	    // firefox
	    return (new XMLSerializer()).serializeToString(xmlDoc);
	} else {
		// IE
		return xmlDoc.xml;
	}
};

// xml is an XML document object, not a string. use (XML.newDocument).loadXML(...) to get that
XML.transform = function(xml,xslloc) {
		//var xml = createXMLDoc(xmlString);
		var xsl = XML.loadXMLDoc(xslloc);
		//alert(XML.toString(xsl));
		// code for IE
		if (window.ActiveXObject)
  		{
  			ex=xml.transformNode(xsl);
  			return ex;
  		}
		// code for Mozilla, Firefox, Opera, etc.
		else if (document.implementation 
			&& document.implementation.createDocument)
  		{
  			xsltProcessor=new XSLTProcessor();
  			xsltProcessor.importStylesheet(xsl);
  			resultDocument = xsltProcessor.transformToFragment(xml,document);
  			return resultDocument;
  		}
	};
	
XML.loadXMLDoc = function(fname)
	{
		var xmlDoc;
		// code for IE
		if (window.ActiveXObject)
  		{
  			xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  		}
		// code for Mozilla, Firefox, Opera, etc.
		else if (document.implementation 
			&& document.implementation.createDocument)
  		{
  			xmlDoc=document.implementation.createDocument("","",null);
  		}
		else
  		{
  			alert('Your browser cannot handle this script');
  		}
		xmlDoc.async=false;
		xmlDoc.load(fname);
		return(xmlDoc);
	};

XML.removeAllChildren = function(node) {
	if ( node.hasChildNodes() )
	{
    	while ( node.childNodes.length >= 1 )
    	{
        	node.removeChild( node.firstChild );       
    	} 
	}
};

XML.xpathNode = function(xpathStr,xmlDoc,parentNode) {
	var results = [];
    var query = xmlDoc.evaluate(xpathStr, $(parentNode) || document,
      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    for (var i = 0, length = query.snapshotLength; i < length; i++)
      results.push(Element.extend(query.snapshotItem(i)));
    return results[0];
};

XML.childNodeText = function(node,childElementName) {
	var children = node.getElementsByTagName(childElementName);
	return children[0].nodeValue();
}
