(function(){
var createDocument,getXml,setXml,getText,selectNodes,selectSingleNode;
function parseNS(defaults,mydoc){
    var root = mydoc.documentElement;
    var ret = {};
    for(var i = 0;i< root.attributes.length;i++){
        var attr = root.attributes[i];
        //alert("tagname:" +attr.name);
        var tagName = attr.name;
        if (tagName.indexOf("xmlns")>=0){
            var s = tagName.split(":");
            s.shift();
            var nsName = s.join();
            
            ret[nsName || defaults] = attr.value;
        }
	}
	return ret;
    
}
if (window.ActiveXObject){
	createDocument =  function(xmlStr,ns){
		var mydoc = new ActiveXObject("Msxml2.DOMDocument");
		if (xmlStr)mydoc.loadXML(xmlStr);
		if (ns){
		    if (typeof(ns)==="string")  ns = parseNS(ns,mydoc);
			var nsStr = "";
			for(var n in ns){
				nsStr += "xmlns:" + n + "=\"" + ns[n] + "\" ";
			}
		}
		mydoc.setProperty("SelectionNamespaces", nsStr);
		return mydoc;
	}
	getXml = function(node){return node.xml;}
	getText = function(node){if (!node)return null;return node.text || node.value;}
	selectNodes = function(node,xpath){return node.selectNodes(xpath);}
	selectSingleNode = function(node,xpath){return node.selectSingleNode(xpath);}
}else if (document.implementation.hasFeature("XPath","3.0")){
	createDocument = function(xmlStr,ns){
		var oParser = new DOMParser();
		var doc = oParser.parseFromString(xmlStr||"","text/xml");
		if(ns){
		    if (typeof(ns)==="string")  ns = parseNS(ns,doc);
			doc._resolver = {
				lookupNamespaceURI : function(prefix){
					var ret = ns[prefix];
					//alert(ret + " " + doc.documentElement.namespaceURI);
					return ret || "";
				}
			}
		}
		return doc;
	}
	getXml = function(node){
		var oSerializer = new XMLSerializer();
	    return oSerializer.serializeToString(node);
	}
	getText = function(node){
	    if (!node) return null;
		var sText = [],n = node.childNodes.length;
		for (var i = 0; i < n; i++) {
			var nd = node.childNodes[i];
		   if (nd.hasChildNodes())
			   sText.push(getText(nd));
		   else
			   sText.push(nd.nodeValue || nd.value);
		}
		return sText.join("");
	}
	
	selectNodes = function(node,xpath){
		var doc = node.ownerDocument || node;
		var root = doc.documentElement;
		var resolver=doc._resolver || doc.createNSResolver(root);
	
		

		//alert("ns--->" + doc.namespaceURI);
		var items=doc.evaluate(xpath,node,resolver,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
		var ret=[];
		for (var i=0;i<items.snapshotLength;i++)ret.push(items.snapshotItem(i));
		return ret;
	}
	selectSingleNode = function(node,xpath){
		var ret = selectNodes(node,xpath);
		if(ret.length==0) return null;
		else return ret[0];
	}
}else{
	createDocument=getXml=setXml=getText=selectNodes=selectSingleNode=function(){
		throw "function is unavailable.Your browser does not suport XPath3.0";
	}
}
Eanyee.Xml = {};
Eanyee.Xml.createDocument = createDocument;
Eanyee.Xml.getXml = getXml;
Eanyee.Xml.getText = getText;
Eanyee.Xml.selectNodes = selectNodes;
Eanyee.Xml.selectSingleNode = selectSingleNode;
})();