/*
 * stock common.js v2.0 2007-6-13
 *
 * Created by Hobo
 * Http://www.qq.com/
 * Tencent Technologies (Shenzhen) Company Limited
 * All rights reserved
 */

/************************检测浏览器类型*************************************************/
var Browser = new Object();

Browser.ua = window.navigator.userAgent.toLowerCase();
Browser.ie = /msie/.test(Browser.ua);
Browser.moz = /gecko/.test(Browser.ua);
Browser.opera = /opera/.test(Browser.ua);

/************************为document增加快捷方式************************/
var $ = function(s)
{
	return (typeof s == "object") ? s: document.getElementById(s);
};

var $N = function(s)
{
	return (typeof s == "object") ? s: document.getElementsByName(s);
};

var $T = function(s)
{
	return (typeof s == "object") ? s: document.getElementsByTagName(s);
};

var $C = function(tag)
{
	return document.createElement(tag);
};

var $A = function(a)//将参数转为数组
{
	if (!a)
	{
		return new Array();
	}
	else
	{
		var r = new Array();

		for (var i=0; i<a.length; i++)
		{
			r.push(a[i]);
		}

		return r;
	}
};
/************************增加一些方法********************************************/
String.prototype.trim = function()
{
	return this.replace(/^\s*|\s*$/ig, "");
};

String.format = function(s)
{
	for (var i=1; i<arguments.length; i++)
	{
		s = s.replace(new RegExp("\\{"+(i-1)+"\\}", "g"), arguments[i]);
	}

	return s;
};

//parse Json
String.prototype.parseJSON = function()
{
	try
	{
		return eval('(' + this + ')');
	}
	catch (e)
	{
		return null;
	}
};
Array.prototype.repeat = function()
{
	return /(\x0f[^\x0f]+)\x0f[\s\S]*\1\x0f/
		.test("\x0f" + this.join("\x0f\x0f") + "\x0f");
};

//Math.random extension
if (!window._rnd)
{
	window._rnd = Math.random;

	Math.random = function(n)
	{
		if (n == undefined)
		{
			return window._rnd();
		}
		else if (n.toString().match(/^\-?\d*$/g))
		{
			return Math.ceil(window._rnd() * n);
		}
		else
		{
			return null;
		}
	};
}

//Element
var Element = {
	isEmpty: function(e)
	{
		return /^\s*$/.test($(e).innerHTML);
	},

	isVisible: function(e)
	{
		return $(e).style.display != 'none';
	},

	show: function(s)
	{
		if (s == undefined)
		{
			s = "";
		}
		for (var i=1; i<arguments.length; i++)
		{
			$(arguments[i]).style.display = s;
		}
	},

	hide: function()
	{
		for (var i=0; i<arguments.length; i++)
		{
			$(arguments[i]).style.display = "none";
		}
	},

	toggle: function()
	{
		for (var i=0; i<arguments.length; i++)
		{
			Element[Element.isVisible($(arguments[i])) ? 'hide': 'show']($(arguments[i]));
		}
	},
	
	toggleA: function(a)
	{
		if (a == undefined)
		{
			return;
		}
		for (var i=0; i<a.length; i++)
		{
			Element[Element.isVisible($(a[i])) ? 'hide': 'show']($(a[i]));
		}
	},
	
	remove: function()
	{
		for (var i=0; i<arguments.length; i++)
		{
			try
			{
				$(arguments[i]).parentNode.removeChild($(arguments[i]));
			}
			catch (e)
			{
			}
		}
	}
};

//UrlParser
var UrlParser = function(sUrl)
{
	this.__construct(sUrl);
};

UrlParser.prototype = {
	__construct: function(sUrl)
	{
		this._href = sUrl || document.location.href;
	},

	getDomain: function()
	{
		if (this._href.match(new RegExp('^(([a-z]+)://([^\\/]+)\/?)(.*)', 'i')))
		{
			return RegExp.$1;
		}
		else
		{
			return null;
		}
	},

	getParam: function(sName)
	{
		if (this._href.match(new RegExp("(&|\\u003F)" + sName + "=([^&]*)(&|$)")))
		{
			return RegExp.$2;
		}
		else
		{
			return null;
		}
	}
};

//window.setTimeout extension
if (!window._sT)
{
	window._sT = window.setTimeout;

	window.setTimeout = function(fCallback, nDelay, oObject)
	{
		if (typeof fCallback == 'function')
		{
			if (!oObject)
			{
				oObject = window;
			}

			var argu = Array.prototype.slice.call(arguments, 3);
			var newFunc = (function(){ fCallback.apply(oObject, argu); });

			return window._sT(newFunc, nDelay);
		}

		return window._sT(fCallback, nDelay);
	};
}

/********************针对ff中跨域加载loadXML错误的补丁************************/
function getXmlDoc(s)
{
	var xmlDocument = new XmlDocument();
	if (Browser.moz)
	{
		var parser = new DOMParser();
		xmlDocument = parser.parseFromString(s, "text/xml");
	}
	else
	{
		xmlDocument.loadXML(s);
	}
	return xmlDocument;
}
/************************如果为firefox浏览器,增加属性及方法****/
if (Browser.moz)
{
	XMLDocument.prototype.loadXML = function(s)
	{
		var parser = new DOMParser();
		var doc2 = parser.parseFromString(s, "text/xml");

		while (this.hasChildNodes())
		{
			this.removeChild(this.lastChild);
		}
		var cs=doc2.childNodes;
		var l = cs.length;

		for (var i = 0; i < l; i++)
		{
			this.appendChild(this.importNode(cs[i], true));
		}
	};
	
	Node.prototype.__defineGetter__
	(
		"xml",
		function()
		{
			return (new XMLSerializer()).serializeToString(this,"text/xml");
		}
	);

	Node.prototype.__defineGetter__
	(
		"text",
		function()
		{
			return this.xml.replace(/<\/?[^>]+>/ig, "");
		}
	);

	Node.prototype.selectNodes = function(sExpr)
	{
		var doc = this.nodeType==9 ? this : this.ownerDocument;
		var nsRes = doc.createNSResolver(this.nodeType==9 ? this.documentElement : this);
		var nsRes2;

		if (doc._selectionNamespaces)
		{
			nsRes2 = function(s)
			{
				if (s in doc._selectionNamespaces)
				{
					return doc._selectionNamespaces[s];
				}

				return nsRes.lookupNamespaceURI(s);
			};
		}
		else
		{
			nsRes2=nsRes;
		}

		var xpRes = doc.evaluate(sExpr, this, nsRes2, 5, null);
		var res=[];
		var item;

		while ((item = xpRes.iterateNext()))
		res.push(item);

		return res;
	};

	Node.prototype.selectSingleNode = function(sExpr)
	{
		var doc = this.nodeType==9 ? this : this.ownerDocument;
		var nsRes = doc.createNSResolver(this.nodeType==9 ? this.documentElement : this);
		var nsRes2;

		if (doc._selectionNamespaces)
		{
			nsRes2 = function(s)
			{
				if (s in doc._selectionNamespaces)
				{
					return doc._selectionNamespaces[s];
				}

				return nsRes.lookupNamespaceURI(s);
			};
		}
		else 
		{
			nsRes2 = nsRes;
		}

		var xpRes = doc.evaluate(sExpr, this, nsRes2, 9, null);
	
		return xpRes.singleNodeValue;
	};

	Node.prototype.transformNode = function(oXsltNode)
	{
		var doc = this.nodeType==9 ? this : this.ownerDocument;
		var processor = new XSLTProcessor();
		processor.importStylesheet(oXsltNode);
		var df = processor.transformToFragment(this, doc);

		return df.xml;
	};
}

/************************XmlHttp***********************************************************/
var XmlHttp = function()
{
	if (Browser.ie)
	{
		var msxmls = ["MSXML3", "MSXML2", "Microsoft"]

		for (var i = 0; i < msxmls.length; i++) 
		{
			try 
			{
				return new ActiveXObject(msxmls[i] + ".XmlHttp");
			}
			catch (e) 
			{
			}
		}
	}
	else
	{
		return new XMLHttpRequest();
	}
};

/************************XmlDocument*********************************************************/
var XmlDocument = function()
{
	if (Browser.ie)
	{
		var msxmls = ["MSXML3", "MSXML2", "Microsoft"]

		for (var i = 0; i < msxmls.length; i++) 
		{
			try 
			{
				return new ActiveXObject(msxmls[i] + ".XmlDom");
			}
			catch (e) 
			{
			}
		}
	}
	else
	{
		var doc = document.implementation.createDocument("", "", null);
		doc.addEventListener("load", function(e){this.readyState=4;}, false);
		doc.readyState = 4;

		return doc;
	}
};

//AsynLoader
var AsynLoader = {
	queueCount: 5, //最大并发数
	curQueue: 0,   //当前并发数

	load: function(sUrl, oOption)
	{
		AsynLoader.initOption(oOption);

		if (AsynLoader.curQueue >= AsynLoader.queueCount)
		{
			if (typeof oOption.onQueue == "function")
			{
				oOption.onQueue();
			}
			window.setTimeout(AsynLoader.load, 1000, window, sUrl, oOption);
			return;
		}
		else
		{
			AsynLoader.curQueue++;
		}

		var xmlHttp = new XmlHttp();
		xmlHttp.open(oOption.method, sUrl, true);
		var _loadCount = 0;
		var _tmpDecay = 0;
		
		xmlHttp.onreadystatechange = function()
		{
			if (xmlHttp.readyState == 4)
			{
				if (_loadCount == 0)
				{
					_loadCount++;
					AsynLoader.curQueue--;
					oOption.count++;//加载次数
					
					if (AsynLoader.isSuccess(xmlHttp))
					{
						var _xmlHttp = {
							status: xmlHttp.status,
							responseXML: xmlHttp.responseXML,
							responseText: xmlHttp.responseText,
							responseJS: xmlHttp.responseText.parseJSON(),
							count: oOption.count-_tmpDecay
						};
						oOption.onSuccess(_xmlHttp);
					}
					else
					{
						if (--oOption.decay)
						{
							_tmpDecay++;
							AsynLoader.load(sUrl, oOption);
						}
						else
						{
							if (typeof oOption.onFailure == "function")
							{
								oOption.onFailure(_xmlHttp);
							}
						}
					}
				}
			}
		}

		xmlHttp.send(oOption.data);
	},

	initOption: function(oOption)
	{
		oOption.method = (typeof oOption.data == "undefined" || oOption.data == null) ? "get" : "post";
		oOption.asyn = oOption.asyn || true;
		oOption.decay = oOption.decay || 1;
		oOption.count = oOption.count || 0;//加载次数

		if (typeof oOption.data != "string" && oOption.data != null)
		{
			oOption.data = oOption.data.toJSONString();
		}
		else if (typeof oOption.data == "undefined")
		{
			oOption.data = null;
		}
	},

	isSuccess: function(oXmlHttp)
	{
		return oXmlHttp.status == undefined
			|| oXmlHttp.status == 0
			|| (oXmlHttp.status >= 200 && oXmlHttp.status < 300);
	}
};

//ProxyLoader
var ProxyLoader = {
	config: {
		queueCount: 5, //最大并发数
		curQueue: 0,
		proxyStatus: {},
		proxyQueue: {}
	},

	load: function(sPageName, sUrl, oOption)
	{
		var proxyDomain = new UrlParser(sUrl).getDomain();
		var proxyPage = proxyDomain + sPageName;
		var proxyFrames = document.getElementsByTagName("iframe");
		
		for (var i=0; i<proxyFrames.length; i++)
		{
			if (proxyFrames[i].src == proxyPage)
			{
				if (typeof ProxyLoader.config.proxyStatus[proxyDomain] != "undefined")
				{
					window.frames[i].AsynLoader.load(sUrl, oOption);
				}
				else
				{
					if (typeof ProxyLoader.config.proxyQueue[proxyDomain] == "undefined")
					{
						ProxyLoader.config.proxyQueue[proxyDomain] = new Array();
					}

					ProxyLoader.config.proxyQueue[proxyDomain].push(new Array(sUrl, oOption));
				}

				return;
			}
		}

		if (typeof ProxyLoader.config.proxyQueue[proxyDomain] == "undefined")
		{
			ProxyLoader.config.proxyQueue[proxyDomain] = new Array();
		}
		ProxyLoader.config.proxyQueue[proxyDomain].push(new Array(sUrl, oOption));

		ProxyLoader.createProxyPage(proxyPage);
	},

	createProxyPage: function(proxyPage, iframeName)
	{
		var proxyFrames = document.getElementsByTagName("iframe");

		for (var i=0; i<proxyFrames.length; i++)
		{
			if (proxyFrames[i].src == proxyPage)
			{
				return;
			}
		}

		var _iframe = document.createElement("iframe");

		_iframe.style.display = "none";
		_iframe.src = proxyPage;
		
		if (typeof Object.prototype.isPrototypeOf == "undefined")
		{
			document.getElementsByTagName("head")[0].innerHTML += _iframe.outerHTML;
		}
		else
		{
			document.getElementsByTagName("head")[0].appendChild(_iframe);
		}
	}
};

//JsLoader
var JsLoader = {
	load: function(sId, sUrl, fCallback)
	{
		Element.remove(sId);

		var _script = document.createElement("script");
		_script.setAttribute("id", sId);
		_script.setAttribute("type", "text/javascript");
		_script.setAttribute("src", sUrl);
		document.getElementsByTagName("head")[0].appendChild(_script);

		if (Browser.ie)
		{
			_script.onreadystatechange = function()
			{
				if (this.readyState=="loaded" || this.readyState=="complete")
				{
					Element.remove(_script);
					fCallback();
				}
			};
		}
		else
		{
			_script.onload = function()
			{
				Element.remove(_script);
				fCallback();
			};
		}
	}
};
/************************Cookie*******************************/
var Cookie = {
	setCookie : function(name, value, path, domain, secure)
	{
		var expires = new Date();  
		expires.setTime(expires.getTime() + 2 * 30 * 24 * 60 * 60 * 1000);//2个月有效期(预警时间有60天)
		document.cookie = name + "=" + escape(value) + "; expires=" + expires.toGMTString() +
			"; path=/" +
			"; domain=.qq.com";
	},
	
	getCookie : function(name)
	{
		var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"));

		if (arr != null)
		{
			return unescape(arr[2]);
		}
		return null;
	},

	clearCookie : function(name, path, domain)
	{
		if (Cookie.getCookie(name))
		{
			 document.cookie = name + "=" +
				((path) ? "; path=" + path : "; path=/") +
				((domain) ? "; domain=" + domain : "") +
				";expires=Fri, 02-Jan-1970 00:00:00 GMT";
		}
	}
};
/************************配置信息******************************************************/
var _Config = function(aUrl)
{
	iRefreshTime = (arguments[1]!="undefined")?arguments[1]:0;
	aXsl = (arguments[2]!="undefined")?arguments[2]:null;
	aName = (arguments[3]!="undefined")?arguments[3]:null;
	this.__construct(aUrl,iRefreshTime,aXsl,aName);
};

_Config.prototype = {
	_DataUrl		: null,	//xml路径
	_XslName		: null,	//xsl模版名称
	_ShowName       : null,//show div
	_RefreshTime	: 0,	//刷新时间
	_Timer			: null,	//定时器
	_XmlData		: null,
	_FirstVisit		: true,
	
	__construct: function(aUrl,iRefreshTime,aXsl,aName)
	{
		this._DataUrl = aUrl;
		this._RefreshTime = iRefreshTime;
		this._XslName = aXsl;
		this._ShowName = aName;
	}
};
/*********************************针对股票输入的验证**************************************/
function CheckStockInput(s)
{
	s = s.replace(/ /ig,"");
	if (s==""||s=="代码/名称/拼音")
	{
		return 1;//未输入查询条件
	}
	if(/^[\*\/0-9a-zA-Z\u4e00-\u9fa5]+$/.test(s))//判断是否是汉字、数字、字母和*
	{
		if (/[\\\/<>#\$&]/g.test(s))
		{
			return 2;//请输入汉字、数字、字母或*号
		}
		else
		{
			return 0;//通过
		}
	}
	else
	{
		return 2;//请输入汉字、数字、字母或*号
	}
}