//////////////////////////////////////////////////////////////////////////////////////////////////
/// xml_http_lib.js
/// fightop@create 2006.11.4
//////////////////////////////////////////////////////////////////////////////////////////////////


// 取有效XMLDocument处理ActiveX Control
// 参数： 无
// 用法： getDomDocumentPrefix()
// 返回： 无
function getDomDocumentPrefix() 
{
	if (getDomDocumentPrefix.prefix)
		return getDomDocumentPrefix.prefix;
	
	var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
	var o;
	for (var i = 0; i < prefixes.length; i++) 
	{
		try 
		{
			o = new ActiveXObject(prefixes[i] + ".DomDocument");
			return getDomDocumentPrefix.prefix = prefixes[i];
		}
		catch (ex) {};
	}
	
	throw new Error("您的浏览器不支持 XmlDocument objects");
}

// 取有效XmlHttp处理ActiveX Control
// 参数： 无
// 用法： getXmlHttpPrefix()
// 返回： 无
function getXmlHttpPrefix() 
{
	if (getXmlHttpPrefix.prefix)
		return getXmlHttpPrefix.prefix;
	
	var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
	var o;
	for (var i = 0; i < prefixes.length; i++) 
	{
		try 
		{
			o = new ActiveXObject(prefixes[i] + ".XmlHttp");
			return getXmlHttpPrefix.prefix = prefixes[i];
		}
		catch (ex) {};
	}
	
	throw new Error("您的浏览器不支持  XMLHttp object");
}


// XmlHttp 工厂
// 参数： 无
// 用法： var xmlHttp = XmlHttp.create()
// 返回： 无
function XmlHttp() {}

XmlHttp.create = function () 
{
	try 
	{
		// NS & MOZ
		if (window.XMLHttpRequest) 
		{
			var req = new XMLHttpRequest();
			
			if (req.readyState == null) 
			{
				req.readyState = 1;
				req.addEventListener("load", function () 
				{
					req.readyState = 4;
					if (typeof req.onreadystatechange == "function")
						req.onreadystatechange();
				}, false);
			}
			
			return req;
		}
		// IE
		if (window.ActiveXObject) 
		{
			return new ActiveXObject(getXmlHttpPrefix() + ".XmlHttp");
		}
	}
	catch (ex) {}
	// Fail
	throw new Error("您的浏览器不支持 XmlHttp objects");
};


// XmlDocument 工厂
// 参数： 无
// 用法： var xmlDocument = XmlDocument.create()
// 返回： 无
function XmlDocument() {}

XmlDocument.create = function () 
{
	try 
	{
		if (document.implementation && document.implementation.createDocument) 
		{
			var doc = document.implementation.createDocument("", "", null);
			
			if (doc.readyState == null) 
			{
				doc.readyState = 1;
				doc.addEventListener("load", function () {
					doc.readyState = 4;
					if (typeof doc.onreadystatechange == "function")
						doc.onreadystatechange();
				}, false);
			}
			
			return doc;
		}
		if (window.ActiveXObject)
			return new ActiveXObject(getDomDocumentPrefix() + ".DomDocument");
	}
	catch (ex) {}
	throw new Error("您的浏览器不支持 XmlDocument objects");
};

if (window.DOMParser &&
	window.XMLSerializer &&
	window.Node && Node.prototype && Node.prototype.__defineGetter__) 
{

	Document.prototype.loadXML = function (s) 
	{
		
		var doc2 = (new DOMParser()).parseFromString(s, "text/xml");
		
		while (this.hasChildNodes())
			this.removeChild(this.lastChild);
			
		for (var i = 0; i < doc2.childNodes.length; i++) 
		{
			this.appendChild(this.importNode(doc2.childNodes[i], true));
		}
	};
	
	
	Document.prototype.__defineGetter__("xml", function () 
	{
		return (new XMLSerializer()).serializeToString(this);
	});
}


// xmlHttp 对象池数组
var XmlHttpPoolArr = new Array();

// xmlHttp 对象池在小
var XmlHttpPoolSize = 100;

// xmlHttp 对象池活动对象索引
var XHPCurrentAvailableID = 0;

// xmlHttp 对象池
// 参数： 无
// 用法： var xmlhttpObj = XmlHttpPool.pick()
// 返回： 无
function XmlHttpPool() {}

XmlHttpPool.pick = function() 
{
	var pos = XHPCurrentAvailableID;
	XmlHttpPoolArr[pos] =  XmlHttp.create();
	
	XHPCurrentAvailableID >= (XmlHttpPoolSize-1) ? 0 : XHPCurrentAvailableID++
	
	return XmlHttpPoolArr[pos];
}

// 创建公用XmlHttp实列
var xmlHttp = XmlHttpPool.pick();