
// 游戏分区服务器联动下拉js脚本

// developed by: 高显华
// created date: 2004.11.26


// 王凌
// 2005.3.24
// 修改增加Firefox兼容性代码


// ------------------------------------------------------------------------------------------

// js对象Area2Server

// 属性 xmldoc  初始化的xml对象

// 方法 Area2Server(xmlurl)  对象构造方法
// 方法 initArea(objSelect)  页面"分区"下拉单选框对象初始化
// 方法 initServer(objSelect)  页面"服务器"下拉单选框对象初始化
// 方法 selectServerByArea (area,objSelect)  根据分区信息,刷新服务器下拉单选框


/* 

使用示例

请把本文件和XML文件置于网站根目录下XML目录 如: http://do.poptang.com/xml/area_server.js


声明对象 ---------------------------------------------------------------------

以下方式均可,推荐使用相对路径访问。

当使用第一种方式时,客户端访问地址和该url必须使用同一域名,否则IE有可能限制访问!

var area2server = new Area2Server("http://do.poptang.com/do_area_server.xml");

var area2server = new Area2Server("../../xml/do_area_server.xml");
var area2server = new Area2Server("/xml/do_area_server.xml");



初始化页面控件-----------------------------------------------------------------

area2server.initArea(document.all.area);

如果该页面需要获取真实服务器名,例如当申请金牌帐号时
area2server.initServer(document.all.server,true);

一般情况该页面不需要获取真实服务器名
area2server.initServer(document.all.server,false);


当分区变化时刷新服务器信息
<select name="area"
		onChange="area2server.selectServerByArea(this.value,document.all.server,false)">
</select>


*/

// ------------------------------------------------------------------------------------------

var browser_iexplorer	= window.ActiveXObject
var browser_firefox		= document.implementation && document.implementation.createDocument

// 对象初始化

// para:file   分区服务器信息xml格式文件 url或本地地址均可

function Area2Server(file)
{
	this.xmldoc= LoadXML(file);

	this.initArea = initArea;
	this.initServer = initServer;
	this.selectServerByArea = selectServerByArea;
}



// 加载xml文件

// para:file   分区服务器信息xml格式文件 url或本地地址均可 由对象构造方法传入

function LoadXML(file)
{
	var xmldoc;
	
	try
	{
		//load url by XMLHTTP
		var xmlhttp = XmlHttp.create();
		xmlhttp.open("GET", file, false);
		xmlhttp.send(null);

		xmldoc = XmlDocument.create();
		xmldoc.loadXML(xmlhttp.responseText);
	}
	catch (e)
	{
		//显示错误信息
		//alert(e.description);
	}	

	return xmldoc;

}

// 分区下拉单选框初始化

// para:objSelect		分区下拉单选框页面控件 例如 document.all("area")

function initArea(objSelect)
{
	var oNodes = XmlDocument.getNodeList(this.xmldoc , "//AreaServerList/Game/Area");
	
	while (objSelect.options.length > 0)
	{
		objSelect.removeChildNode(0);
	}

	for (i=0; i<oNodes.length; i++)
	{
		
		oNode = oNodes[i];

		if (oNode!=null)
		{
		
			if(oNode.getAttribute("Title")==null || oNode.getAttribute("Title").length==0)
			{
				objSelect.options[i] = new Option(oNode.getAttribute("Name"),oNode.getAttribute("Name"));
			}
			else
			{
				
				objSelect.options[i] = new Option(oNode.getAttribute("Title"),oNode.getAttribute("Name"));
				
				
			}
			
		}
		
		
		
	}	
	
}

// 服务器下拉单选框初始化

// para:objSelect		服务器下拉单选框页面控件 例如 document.all("server")
// para:tsreal				该值为true则服务器选项value值为服务器真实名

function initServer(objSelect,isreal)
{
	var oNodes =  XmlDocument.getNodeList(this.xmldoc ,"//AreaServerList/Game/Area[" + (browser_iexplorer ? 0 : 1) + "]/Server");

	setServer( oNodes, objSelect, isreal);
	
}


// 根据分区value刷新服务器下拉单选框

// para:area				分区信息 字符串
// para:objSelect		服务器下拉单选框页面控件 例如 document.all("server")
// para:tsreal				该值为true则服务器选项value值为服务器真实名

function selectServerByArea (area, objSelect, isreal)
{
	var oNodes =  XmlDocument.getNodeList(this.xmldoc ,"//AreaServerList/Game/Area");

	for (i=0; i<oNodes.length; i++)
	{
		oNode = oNodes[i];
		if (oNode!=null)
	   {
			if(oNode.getAttribute("Name")==area)
			{
				oNodes = XmlDocument.getNodeList(this.xmldoc ,"//AreaServerList/Game/Area["+(i + (browser_iexplorer ? 0 : 1)) +"]/Server");

				setServer( oNodes, objSelect, isreal );

				return;
				
			}
			
	   }
	}	
}



// 根据获得的xml节点组刷新下拉单选框

// para:oNodes			获取的xml节点集合
// para:objSelect		服务器下拉单选框页面控件 例如 document.all("server")
// para:isreal				该值为true则服务器选项value值为服务器真实名

function setServer( oNodes, objSelect, isreal )
{
	while (objSelect.options.length > 0)
	{
		objSelect.remove(0);
	}

	for (i=0; i<oNodes.length; i++)
	{
		oNode = oNodes[i];
		if (oNode!=null)
	   {
			if(isreal)
		   {
				if(oNode.getAttribute("Name")==null || oNode.getAttribute("Name").length==0)
					objSelect.options[i] = new Option(oNode.firstChild.nodeValue,oNode.firstChild.nodeValue);
				else
					objSelect.options[i] = new Option(oNode.firstChild.nodeValue,oNode.getAttribute("Name"));
			}
			else			
				objSelect.options[i] = new Option(oNode.firstChild.nodeValue,oNode.getAttribute("Name"));
	   }
	}
}


// firefox/ie xmlhttp 兼容代码 --------------------------------------------------------------------------------------------------------------------------


//<script>
//////////////////
// Helper Stuff //
//////////////////

// used to find the Automation server name
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 {
			// try to create the objects
			o = new ActiveXObject(prefixes[i] + ".DomDocument");
			return getDomDocumentPrefix.prefix = prefixes[i];
		}
		catch (ex) {};
	}
	
	throw new Error("Could not find an installed XML parser");
}

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 {
			// try to create the objects
			o = new ActiveXObject(prefixes[i] + ".XmlHttp");
			return getXmlHttpPrefix.prefix = prefixes[i];
		}
		catch (ex) {};
	}
	
	throw new Error("Could not find an installed XML parser");
}

//////////////////////////
// Start the Real stuff //
//////////////////////////


// XmlHttp factory
function XmlHttp() {}

XmlHttp.create = function () {
	try {
		if (window.XMLHttpRequest) {
			var req = new XMLHttpRequest();
			
			// some versions of Moz do not support the readyState property
			// and the onreadystate event so we patch it!
			if (req.readyState == null) {
				req.readyState = 1;
				req.addEventListener("load", function () {
					req.readyState = 4;
					if (typeof req.onreadystatechange == "function")
						req.onreadystatechange();
				}, false);
			}
			
			return req;
		}
		if (window.ActiveXObject) {
			return new ActiveXObject(getXmlHttpPrefix() + ".XmlHttp");
		}
	}
	catch (ex) {}
	// fell through
	throw new Error("Your browser does not support XmlHttp objects");
};

// XmlDocument factory
function XmlDocument() {}

XmlDocument.create = function () {
	try {
		// DOM2
		if (document.implementation && document.implementation.createDocument) {
			var doc = document.implementation.createDocument("", "", null);
			
			// some versions of Moz do not support the readyState property
			// and the onreadystate event so we patch it!
			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("Your browser does not support XmlDocument objects");
};

// Create the loadXML method and xml getter for Mozilla
if (window.DOMParser &&
	window.XMLSerializer &&
	window.Node && Node.prototype && Node.prototype.__defineGetter__) {

	// XMLDocument did not extend the Document interface in some versions
	// of Mozilla. Extend both!
	//XMLDocument.prototype.loadXML = 
	Document.prototype.loadXML = function (s) {
		
		// parse the string to a new doc	
		var doc2 = (new DOMParser()).parseFromString(s, "text/xml");
		
		// remove all initial children
		while (this.hasChildNodes())
			this.removeChild(this.lastChild);
			
		// insert and import nodes
		for (var i = 0; i < doc2.childNodes.length; i++) {
			this.appendChild(this.importNode(doc2.childNodes[i], true));
		}
	};
	
	
	/*
	 * xml getter
	 *
	 * This serializes the DOM tree to an XML String
	 *
	 * Usage: var sXml = oNode.xml
	 *
	 */
	// XMLDocument did not extend the Document interface in some versions
	// of Mozilla. Extend both!
	/*
	XMLDocument.prototype.__defineGetter__("xml", function () {
		return (new XMLSerializer()).serializeToString(this);
	});
	*/
	Document.prototype.__defineGetter__("xml", function () {
		return (new XMLSerializer()).serializeToString(this);
	});
}

// get all of Nodes with XPath
XmlDocument.getNodeList = function (xmldoc , xpath)
{
	var nodeList	= new Array();

	// DOM 2
	if (document.implementation && document.implementation.createDocument)
	{
		var selectedNodes = xmldoc.evaluate(xpath, xmldoc, null, 0, null);

		while (true)
		{
			var currentNode	= selectedNodes.iterateNext();
			
			if (currentNode != null)
			{
				nodeList.push(currentNode);
			}
			else
			{
				break;
			}
		}
	}

	if (window.ActiveXObject)
	{
		var selectedNodes	= xmldoc.selectNodes(xpath);

		//Convert Object to Array
		for (var i=0; i<selectedNodes.length; i++)
		{
			nodeList.push(selectedNodes[i]);
		}
	}

	return nodeList;
}

//---------------------------------------------------------------------------------------------------------------------