// XML Utility Functions - For Use in City Of Sydney Online Applications
// Ali Chamas (c) created 10-11-2006 dragonworxau@yahoo.com.au
// City of Sydney Council www.cityofsydney.nsw.gov.au
// Version History
//		AC 19/03/07 - moved functions into global static XmlUtil object

// create global static object to contain XML Utility functions
function XmlUtil() {}

// Cross-browser way of accessing CDATA nodes of XMLElement's - by Ali Chamas 13/11/06
// IE will list 1 child node of an element with CDATA, and the "text" property will return the data
// Mozilla lists 3 elements, the first and last element are treated as declaration nodes, and the second is the actual CDATA node and is accessed with the "nodeValue" property
XmlUtil.getCData = function(elm) {
	if (elm.childNodes.length == 3) {
		// is the Mozilla way
		return elm.childNodes[1].nodeValue;
	}
	else {
		// is the IE way
		return elm.childNodes[0].text;
	}
}

// Cross-browser way to access the text node of an element
XmlUtil.getText = function (elm) {
	// is the Mozilla way
	if (elm.childNodes[0].nodeValue) return elm.childNodes[0].nodeValue;
	// is the IE way
	if (elm.childNodes[0].text) return elm.childNodes[0].text;
	return null;
}

// Shorter way of accessing child nodes
XmlUtil.getChild = function (elm, childTagName) {
	return elm.getElementsByTagName(childTagName)[0];
}

// Shorter way of accessing child nodes text
XmlUtil.getChildText = function (elm, childTagName) {
	return XmlUtil.getText(XmlUtil.getChild(elm, childTagName));
}

// -- Mozilla XPath functions for compatibility --
// mozXPath [http://km0ti0n.blunted.co.uk/mozxpath/] km0ti0n@gmail.com
// Code licensed under Creative Commons Attribution-ShareAlike License 
// http://creativecommons.org/licenses/by-sa/2.5/
if( document.implementation.hasFeature("XPath", "3.0") ){
	if( typeof XMLDocument == "undefined" ){ XMLDocument = Document; }

	XMLDocument.prototype.selectNodes = function(cXPathString, xNode) {
    if( !xNode ) { xNode = this; } 
		var oNSResolver = this.createNSResolver(this.documentElement)
		var aItems = this.evaluate(cXPathString, xNode, oNSResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
		var aResult = [];
		for( var i = 0; i < aItems.snapshotLength; i++){aResult[i] =  aItems.snapshotItem(i);	}
		return aResult;
	}

	XMLDocument.prototype.selectSingleNode = function(cXPathString, xNode) {
		if( !xNode ) { xNode = this; } 
		var xItems = this.selectNodes(cXPathString, xNode);
		if( xItems.length > 0 ){return xItems[0];	}
		else{return null;	}
	}

	Element.prototype.selectNodes = function(cXPathString) {
		if(this.ownerDocument.selectNodes){	return this.ownerDocument.selectNodes(cXPathString, this);}
		else{throw "For XML Elements Only";}
	}

	Element.prototype.selectSingleNode = function(cXPathString) {
		if(this.ownerDocument.selectSingleNode){return this.ownerDocument.selectSingleNode(cXPathString, this);	}
		else{throw "For XML Elements Only";}
	}
}
