var XPathConstants = {
	NODE: 'node',
	NODESET: 'nodeset',
	NUMBER: 'number',
	STRING: 'string'
};

var XPath = {
	evaluate: function(expression, contextNode, resultType) {
		//alert('browser = ' + BrowserDetect.browser + '\nversion = ' + BrowserDetect.version + '\nOS = ' + BrowserDetect.OS);
		if (BrowserDetect.browser=='Firefox' && BrowserDetect.version==2) {

			/*alert(contextNode);
			var node = document.importNode(contextNode.firstChild);
			alert(2);
			var result = document.evaluate(expression, contextNode, null, XPathResult.ANY_TYPE, null);
			alert(result);*/

		} else
		if (BrowserDetect.browser=='Firefox' && BrowserDetect.version==3) {

			// Ref: http://developer.mozilla.org/en/docs/Using_XPath
			var xpath = new XPathEvaluator();
			var res = null;
			//var nsResolver = xpath.createNSResolver(aNode.ownerDocument==null ? aNode.documentElement : aNode.ownerDocument.documentElement);
			var result = xpath.evaluate(expression, contextNode, null, XPathResult.ANY_TYPE, null);
			if (resultType==XPathConstants.NODE) {
				return (res=result.iterateNext() ? res : null);
			}
			if (resultType==XPathConstants.NODESET) {
				var nodes = [];
				while (res=result.iterateNext()) {
					nodes.push(res);
				}
				return nodes;
			}
			if (resultType==XPathConstants.NUMBER) {
				res = result.iterateNext();
				return (res ? parseFloat(res.nodeValue) : null);
			}
			if (resultType==XPathConstants.STRING) {
				res = result.iterateNext();
				return (res ? res.nodeValue : null);
			}

		} else
		if (BrowserDetect.browser=='Explorer') {

			var nodes = contextNode.selectNodes(expression);
			if (resultType==XPathConstants.NODE) {
				return (nodes.length>0 ? nodes[0] : null);
			}
			if (resultType==XPathConstants.NODESET) {
				return nodes;
			}
			if (resultType==XPathConstants.NUMBER) {
				return (nodes.length>0 ? parseFloat(nodes[0].nodeValue) : null);
			}
			if (resultType==XPathConstants.STRING) {
				return (nodes.length>0 ? nodes[0].nodeValue : null);
			}

		}
	}
};