var parseXML = function(xml)
{
	var doc = null;
	if (window.ActiveXObject)
	{
		doc = new ActiveXObject('Microsoft.XMLDOM');
		doc.async = false;
		doc.loadXML(xml);
	}
	else
	{
		doc = new DOMParser().parseFromString(xml, 'text/xml');
		doc.parseError={ 'errorCode':0 };
	}
	return doc;
};

var getNodeValue = function(node, defaultValue)
{
	defaultValue = (defaultValue) ? defaultValue : "";
	return (node) ? node.nodeValue : defaultValue;
}



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";
		}
	}
}
