﻿function XMLObject()
{
	var xmlhttp = null;
	var xmldoc = null;
	var _ProcessFun = "";
	if (window.ActiveXObject)
	{
		xmlhttp = new ActiveXObject("MSXML2.XMLHTTP");
	}
	else
	{
		xmlhttp = new XMLHttpRequest();
		
		//使firefox支持xpath
        // check for XPath implementation 
        if( document.implementation.hasFeature("XPath", "3.0") ) 
        { 
           // prototying the XMLDocument 
           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; 
           } 
        
           // prototying the Element 
           Element.prototype.selectNodes = function(cXPathString) 
           { 
              if(this.ownerDocument.selectNodes) 
              { 
                 return this.ownerDocument.selectNodes(cXPathString, this); 
              } 
              else{throw "For XML Elements Only";} 
           }
           
           // prototying the XMLDocument 
           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; 
              } 
           } 
            
           // prototying the Element 
           Element.prototype.selectSingleNode = function(cXPathString) 
           {     
              if(this.ownerDocument.selectSingleNode) 
              { 
                 return this.ownerDocument.selectSingleNode(cXPathString, this); 
              } 
              else{throw "For XML Elements Only";} 
           } 
        } 
	}
	
	this.OpenXML = function (fn, funName)
	{
		try
		{
			if (_ProcessFun == "")
				_ProcessFun = funName;
			xmlhttp.open("get", fn + "?" + Date.parse(new Date()), true);
			xmlhttp.onreadystatechange = this.LoadData ;
			xmlhttp.send(null);			
		}
		catch(e)
		{
		}
	};
	
	var xmldata = "", o_xmldata = "";
	this.LoadData = function ()
	{
		if (xmlhttp.readyState != 4 || (xmlhttp.status != 200 && xmlhttp.status != 0))
			return;
		if (window.ActiveXObject)
		{
			xmldoc = xmlhttp.responseXML;
			xmldata = xmldoc.xml;
		}
		else
		{
			xmldoc = (new DOMParser()).parseFromString(xmlhttp.responseText, "text/xml");
			if (xmldoc.documentElement.tagName == "parsererror")
				return;
			xmldata = (new XMLSerializer()).serializeToString(xmldoc.documentElement);
		}
		if(xmldata == "" || xmldata == o_xmldata)
			return;
			
		var root = xmldoc.documentElement;
		if (_ProcessFun != "")
			eval(_ProcessFun + "(root)");
	};
}
