/**===================================================================================

更新日志

v 1.00
	2009.7.23
	创建 Ajax方法

v 1.01
	2009.7.27
	创建一些常用方法，以及图片的处理方法

v 1.02
	2009.11.9
	更新了模拟对话的样式，图片通过网络读取
	更新了模拟对话的可拖动模式。

v 1.03
	2009.12.17
	更新了Ajax.getXmlObj中的错误

====================================================================================**/








/* ======================================================================================
		一些常用的方法

		tr.$(id)				返回对象，或者对象组
		tr.fliter.isInt(i)		判断是否是整数
		tr.fliter.isPosInt(i)	判断是否是正整数
		tr.fliter.isNegInt(i)	判断是否是负整数
		tr.fliter.isNonInt(i)	判断是否是非负整数
		tr.fliter.isMoney(i)	判断是否是仅带2位小数的数字
		tr.fliter.isFloat(i)	判断是否是浮点数
		
		code by Zhangxb 2009.7.27

=========================================================================================*/


tr = {
	$:function(id){
		if (document.getElementsByName(id).length>1 && Browser.IE){
			return document.getElementsByName(id);
		}		/*先做此步是因为如果IE底下有多个Name='id'的对象，则返回第一个对象*/
		if (document.getElementById(id)){
			return document.getElementById(id);
		}
		if (document.getElementsByName(id).length==1){
			return document.getElementsByName(id)[0];
		}else{
			return document.getElementsByName(id);
		}
	},
	fliter:{
		r1:/^[0-9]*[1-9][0-9]*$/,																//正整数 
		r2:/^-[0-9]*[1-9][0-9]*$/,																//负整数
		r3:/^\d+$/,																				//非负整数（正整数 + 0）
		r4:/^-?\d+$/,　　　																		//整数
		r5:/^(-[0-9]|[0-9]|([.]*\d{1,2})|(-(0[.])))[0-9]{0,}(([.]*\d{1,2})|[0-9]{0,})$/,		//最多带2位小数的数字
		r6:/^-?\d+\.?\d+$/,																		//浮点数
		isInt:function(i){
			return this.r4.test(i);
		},
		isPosInt:function(i){
			return this.r1.test(i);
		},
		isNegInt:function(i){
			return this.r2.test(i);
		},
		isNonInt:function(i){
			return this.r3.test(i);
		},
		isMoney:function(i){
			return this.r5.test(i);
		},
		isFloat:function(i){
			return this.r6.test(i);
		}
	}
}








/* ======================================================================================

	浏览器信息获取
	Browser
	.IE / .FF          Boolean 
	.getName()         返回浏览器名称
	.getVer()          返回浏览器版本

	code by Zhangxb 2008.10.8

=========================================================================================*/

Browser = {

	IE:document.all?true:false,
	FF:document.all?false:true,
	getName:function(){
		return navigator.appName;
	},
	getVer:function(){
		return navigator.appVersion;
	}
}

/*
Browser = {
	isIE:function(){
		if (navigator.userAgent.indexOf("MSIE")>0){
			return true;
		}else{
			return false;
		}
	},
	isFireFox:function(){
		if (navigator.userAgent.indexOf("Firefox")>0){
			return true;
		}else{
			return false;
		}
	},
	isChrome:function(){
		if (navigator.userAgent.indexOf("Chrome")>0){
			return true;
		}else{
			return false;
		}
	},
	IE:this.isIE()?true:false,
	FF:this.isFireFox()?true:false,
	GC:this.isChrome()?true:false,
	getName:function(){
		return navigator.appName;
	},
	getVer:function(){
		return navigator.appVersion;
	}
}
*/

/* ======================================================================================

	事件管理器:
	EventManager.addEvent(要添加事件的对象,要添加的事件类型,添加对象的方法名,[参数1,参数2,...]);
	添加对象的方法必须以event为第一个参数，后面再跟其他参数。
	ex:
		EventManager.addEvent(object,"click","myFunction",arg1,arg2);
		myFunction = function(e,arg1,arg2){
			dosomething;
		}
	EventManager.removeEvent(要添加事件的对象,要添加的事件类型,添加对象的方法);
	
	
	EventManager 自动绑定事件卸载防止泄露。EventManager.removeAllEvent 将卸载所有通过EventManager绑定的事件.


	code by Zhangxb 2008.10.8

=========================================================================================*/

EventManager = {
	evtList:[],
	addEvent:function(eventTarget,eventType,funcName){
		var tmpFunc;
		var tmpi=3;
		var evtTypeIE = "on"+eventType;
		var evtTypeFF = eventType;
		var args = [];
		for (var i=3;i<arguments.length;i++){
			args.push(arguments[i]);
		}
		tmpFunc = function(event){
			var tmpObj = funcName.split(".");
			var tmpObjstr = "";
			if (tmpObj.length>0){
				tmpObjstr = tmpObj.splice(0,tmpObj.length-1).join(".");
			}else{
				tmpObjstr = "this";
			}
			var tmpargs = [event].concat(args);
			eval(funcName).apply(eval(tmpObjstr),tmpargs);
		}
		if(evtTypeFF=="mousewheel"){
			evtTypeFF="DOMMouseScroll";
		}
		Browser.IE?eventTarget.attachEvent(evtTypeIE,tmpFunc):eventTarget.addEventListener(evtTypeFF,tmpFunc,true);
		this.evtList.push({target:eventTarget,type:eventType,func:tmpFunc});
	},
	removeEvent:function(eventTarget,eventType,func){
		var el = this.evtList
		for (var i=0;i<el.length;i++){
			if (el[i].target == eventTarget){
				Browser.IE?eventTarget.detachEvent("on"+eventType,el[i].func):eventTarget.removeEventListener(eventType,el[i].func,true);
				this.evtList.splice(i,1);
			}
		}
	},
	removeAllEvent:function(){
		var tar;
		var typ;
		var fun;
		while (this.evtList.length>0){
			tar = this.evtList[0].target;
			typ = this.evtList[0].type;
			fun = this.evtList[0].func;
			Browser.IE?tar.detachEvent("on"+typ,fun):tar.removeEventListener(typ,fun,true);
			this.evtList.splice(0,1);
		}
	},
	init:function(){
		this.addEvent(window,"unload","EventManager.removeAllEvent");
	}
}
EventManager.init();










/** =======================================================================

	Ajax 方式获取数据，分为同步与异步两种方式

	1、同步方式
		Ajax.xmlHttpGet(请求的服务器地址)
		返回字符串

	2、异步方式
		Ajax.xmlHttpGetAsy(请求的服务器地址,处理返回值的函数)
		第二个参数为一个方法，该方法用来处理异步请求返回的数据。该方法默认
		Ex:
		
		Ajax.xmlHttpGetAsy("serverURL",myFunction);

		myFunction = function(str){
			Data processing
		}
		参数既为服务器返回的方法。
	
	3、数据提交(异步)
		Ajax.xmlHttpPostAsy(请求的服务器地址,处理返回值的函数,提交的数据)
		前两个参数同上，第三个参数由一个字符串组成，结构为：
		"a=xxxx&b=xxxxx&c=xxxxxx"
		在后台程序页面则以form获取形式获得数据。该方法不受URL长度限制。

	4、其他
		Ajax
			.startLoading()			当开始发送请求时触发的的事件
			.endLoading()			请求完成时触发的事件
			.loadingState(状态)		请求中状态改变时触发的函数
				0 － （未初始化）还没有调用send()方法
				1 － （载入）已调用send()方法，正在发送请求
				2 － （载入完成）send()方法执行完成，已经接收到全部响应内容
				3 － （交互）正在解析响应内容
				4 － （完成）响应内容解析完成，可以在客户端调用了
	
	xmlHttp对象在处理请求完后已被释放，经测试没有内存泄露。多线程处理未知。


	Code by zhangxb 2009.7.23
=========================================================================**/


Ajax = {
	startLoading:function(){
		/*SomeCode StartLoading*/
		
	},
	endLoading:function(){
		/*SomeCode StartLoading*/
		
	},
	loadingState:function(st){
		/*SomeCode of loadingstate*/
		
	},
	getXmlObj:function(){
		var xmlObj;
		if (window.XMLHttpRequest){
			xmlObj = new XMLHttpRequest();
		}else if (window.ActiveXObject){
			try{
				xmlObj=new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch (e){
				xmlObj=new ActiveXObject("Microsoft.XMLHTTP");
			}
		}else{
			return;
		}
		return xmlObj;
	},
	xmlHttpGet:function(url){
		if (url==null || url==""){
			return "错误的URL";
		}
		var xmlObj = this.getXmlObj();
		var asynchronous=false;
		var post=false;
		
		if (post){
			alert("error!This method only support GET method.");
		}
		xmlObj.open("GET",url,asynchronous);
		xmlObj.send(null);
		var rtn=xmlObj.responseText;
		xmlObj.abort();
		xmlObj=null;
		return rtn;
	},
	xmlHttpGetAsy:function(url,func){
		var xmlObj;
		xmlObj = this.getXmlObj();
		Ajax.startLoading();
		xmlObj.onreadystatechange = function(){Ajax.xmlHttpGetAsyLoaded(xmlObj,func)};
		xmlObj.open("GET",url,true);
		xmlObj.send(""); 
	},
	xmlHttpPostAsy:function(url,func,para){
		var xmlObj;
		xmlObj = this.getXmlObj();
		Ajax.startLoading();
		xmlObj.onreadystatechange = function(){Ajax.xmlHttpGetAsyLoaded(xmlObj,func)};
		xmlObj.open("POST",url,true);
		xmlObj.setRequestHeader('Content-type','application/x-www-form-urlencoded');
		xmlObj.send(para); 
	},
	xmlHttpGetAsyLoaded:function(xmlObj,func){
		var rtnStr="";
		if (xmlObj.readyState != 4){
			Ajax.loadingState(xmlObj.readyState);
		}
		if (xmlObj.readyState == 4){
			if (xmlObj.status == 200){
				var data = xmlObj.responseText;
				rtnStr = data;
			}else{
				rtnStr = xmlObj.status;
			}
			Ajax.endLoading();
			xmlObj.abort();
			xmlObj=null;
			Ajax.returnAjaxValue(rtnStr,func);
		}
	},
	returnAjaxValue:function(rtn,func){
		func(rtn);
	}
};





/*====================================================================================

		虚拟窗口对话：

		Dialog
		
		Dialog.width					宽度
		Dialog.height					高度
		Dialog.msg(标题，内容)			模拟对话
		Dialog.close()					关闭对话

		Code by zhangxb 2008.9.20
==================================================================================*/



Dialog = {
	height:400,
	width:600,
	bg:"",
	imgPath:"",
	wh:function(){return Math.max(document.body.clientHeight,document.body.scrollHeight);},
	ww:function(){return Math.max(document.body.clientWidth,document.body.scrollWidth);},
	top:function(){return parseInt((document.body.clientHeight-this.height)/2)+document.body.scrollTop},
	left:function(){return parseInt((this.ww()-this.width)/2)},
	msg:function(title,str){
		var sels = document.body.getElementsByTagName("SELECT")
		for (var i=0;i<sels.length;i++){
			sels[i].style.display="none";
		}
		var masker = document.getElementById("Masker");
		if (!masker){
			var div = document.createElement("DIV");
			div.style.backgroundColor="#ffffff";
			div.style.width=this.ww()+"px";
			div.style.height=this.wh()+"px";
			div.style.position="absolute";
			div.style.top="0px";
			div.style.left="0px";
			div.style.zIndex="99";
			div.style.opacity="0.80";
			div.style.filter="progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=80,finishOpacity=100)";
			div.setAttribute("id","Masker");
			document.body.appendChild(div);
			div=null;
		}else{
			masker.style.display='';
			masker.style.height="0px";
			masker.style.width=this.ww()+"px";
			masker.style.height=this.wh()+"px";
		}
		var win = document.getElementById("Win");
		if (!win){
			var div = document.createElement("DIV");
			div.style.backgroundColor="#FFFFFF";
			div.style.width=this.width+"px";
			div.style.height=this.height+"px";
			div.style.position="absolute";
			div.style.top=Math.max(this.top(),0)+"px";
			div.style.left=this.left()+"px";
			div.style.zIndex="999";
			div.style.border="1px solid #777777";
			div.style.opacity="0.80";
			div.style.filter="progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=80,finishOpacity=100)";
			div.setAttribute("id","Win");
			document.body.appendChild(div);
			var ttldiv =  document.createElement("DIV");
			ttldiv.style.backgroundColor="#333333";
			ttldiv.style.backgroundImage="url('"+this.imgPath+"images/Dialog_title_bg.gif')";
			//if (document.all) ttldiv.style.width=this.width+"px";// else ttldiv.style.width=(this.width)+"px";
			//if (document.all) ttldiv.style.height="30px"; else ttldiv.style.height="23px";
			ttldiv.style.width = this.width+"px";
			ttldiv.style.border = "0px";
			ttldiv.style.height = "30px";
			ttldiv.style.color="#ffffff";
			ttldiv.style.fontSize="12px";
			//ttldiv.style.paddingTop="8px";
			//ttldiv.style.paddingLeft="5px";
			//ttldiv.style.paddingRight="5px";
			//ttldiv.style.textAlign="right";
			ttldiv.style.fontWeight="bold";
			ttldiv.setAttribute("id","Win_title")
			
			ttldiv.innerHTML += "<span style='float:left;color:#ffffff;margin-left:10px;margin-top:8px;letter-spacing:3px;'>"+title+"</span>";
			//ttldiv.innerHTML += "<span style='background-color:#FEFEFE;padding:1px;color:#000000;border:1px solid #999999;font-size:7px;cursor:pointer;' onclick='Dialog.close()' onmouseover=\"this.style.border='1px solid #ffffff';\" onmouseout=\"this.style.border='1px solid #999999';\" title='关闭'>&#9587;</span>";
			ttldiv.innerHTML += "<span style=\"background-image:url('"+this.imgPath+"images/Dialog_title_close_btn.gif');cursor:pointer;float:right;width:50px;height:19px;margin-right:5px;\"  onclick='Dialog.close()' onmouseover=\"this.style.backgroundPosition='0px 19px';\" onmouseout=\"this.style.backgroundPosition='0px 0px';\" title='关闭' />";
			div.appendChild(ttldiv);
			var evt;
			EventManager.addEvent(ttldiv,"mousedown","Dialog.drag",evt)


			var bodydiv = document.createElement("DIV");
			if (document.all) bodydiv.style.width=(this.width)+"px";// else bodydiv.style.width=(this.width-11)+"px";
			if (document.all) bodydiv.style.height=(this.height-24)+"px"; else bodydiv.style.height=(this.height-40)+"px";
			bodydiv.style.borderTop = "0px";
			bodydiv.style.padding="5px";
			bodydiv.style.marginLeft="0px";
			bodydiv.style.marginRight="0px";
			bodydiv.style.color="#333333";
			bodydiv.style.overflow="auto";
			bodydiv.style.textAlign="left";
			bodydiv.innerHTML = str;
			bodydiv.setAttribute("id","Win_body")
			//if (this.bg!=''){
			//	bodydiv.style.backgroundImage="url('"+this.bg+"')";
			//}
			bodydiv.style.backgroundColor="#efefef";
			bodydiv.style.backgroundImage="url('"+this.imgPath+"images/Dialog_win_bg.gif')";
			bodydiv.style.backgroundRepeat="repeat-x";
			div.appendChild(bodydiv);
			div=null;
		}else{
			win.style.display='';
			win.style.width=this.width+"px";
			win.style.height=this.height+"px";
			win.style.top=this.top()+"px";
			win.style.left=this.left()+"px";
			var wt = document.getElementById("Win_title");
			var wb = document.getElementById("Win_body");

			if (document.all) wt.style.width=(this.width)+"px"; else wt.style.width=(this.width-12)+"px";
			if (document.all) wb.style.width=(this.width-2)+"px"; else wb.style.width=(this.width-11)+"px";
			if (document.all) wb.style.height=(this.height-24)+"px"; else wb.style.height=(this.height-35)+"px";

			wt.getElementsByTagName("SPAN")[0].innerHTML = title;
			wb.innerHTML = str;
		}
	},
	close:function(){
		if (!document.getElementById("Win")){
			return;
		}
		var sels = document.body.getElementsByTagName("SELECT")
		for (var i=0;i<sels.length;i++){
			sels[i].style.display="";
		}
		var masker = document.getElementById("Masker");
		var win = document.getElementById("Win");
		masker.style.display='none';
		win.style.display='none';
		document.getElementById("Win_body").innerHTML="";
		win.innerHTML = "";
		this.clear();
	},
	clear:function(){
		var win = document.getElementById("Win");
		document.body.removeChild(win);
	},
	drag:function(event){
		var evt = event;
		var obj=tr.$('Win');
		var deltaX = event.clientX - parseInt(obj.style.left);
		var deltaY = event.clientY - parseInt(obj.style.top);

		if (document.addEventListener)
		{
			document.addEventListener("mousemove",moveHandler,true);
			document.addEventListener("mouseup",upHandler,true);
		}else if(document.attachEvent){
			document.attachEvent("onmousemove", moveHandler);
			document.attachEvent("onmouseup",upHandler);
		}else{
			var oldmovehandler = document.onmouseover;
			var olduphandler = document.onmouseup;
			document.onmousemove = moveHandler;
			document.onmouseup = upHandler;
		}

		if (event.stopPropagation)
		{
			event.stopPropagation();
		}else{
			event.cancelBubble = true;
		}

		if (event.preventDefault)
		{
			event.preventDefault();
		}else{
			event.returnValue = false;	
		}


		function moveHandler(e){
			if (!e) e = window.event;
			
			if (e.clientX<0 || e.clientY<0){
				return;
			}

			obj.style.left = (e.clientX - deltaX) + "px";
			obj.style.top = (e.clientY - deltaY) + "px";

			if (document.getElementById("Masker")){
				document.getElementById("Masker").style.width = (Math.max(document.body.clientWidth,document.body.scrollWidth))+"px";
				document.getElementById("Masker").style.height = (Math.max(document.body.clientHeight,document.body.scrollHeight))+"px";
			}

			if (e.stopPropagation)
			{
				e.stopPropagation();
			}else{
				e.cancelBubble = true;
			}
		}


		function upHandler(e){
			if (!e) e = window.event;

			if (document.removeEventListener)
			{
				document.removeEventListener("mouseup",upHandler,true);
				document.removeEventListener("mousemove",moveHandler,true);
			}else if (document.detachEvent)
			{
				document.detachEvent("onmouseup",upHandler);
				document.detachEvent("onmousemove",moveHandler);
			}else{
				document.onmouseup = olduphandler;
				document.onmousemove = oldmovehandler;
			}

			if (e.stopPropagation)
			{
				e.stopPropagation();
			}else{
				e.cancelBubble = true;
			}

		}
	}
}










/* =======================================================================================

		图片过大处理
		
		Img.resize(图片对象,设置宽度，设置高度,[点击事件名称])

		当图片读取后显示过大的时候，设置其大小，及其点击事件.如果没有设置点击事件，则默认以Dialog形式打开图片。
		当高度值为0的时候，表示不对图片进行强制变形处理。

		ex:

		<img src="xxxx.jpg" onload="Img.resize(this,100,100,'viewImg')">

		function viewImg(e,imgObj){
			window.open(imgObj.src);
		}

		*注意自定义的方法参数2个，第一个是事件，第二个是图片对象。

		Code by zhangxb 2009.7.27

=======================================================================================*/


Img = {
	resize:function(obj,w,h,funcName){
		var fw = obj.offsetWidth;
		var fh = obj.offsetHeight;
		var flag = false;
		
		if (fw>w){
			obj.style.width=w+"px";
			flag = true;
		}

		if (fh>h && h!=0){
			obj.style.height=h+"px";
			flag=true;
		}
		
		if (h==0){
			obj.style.height=w/fw*fh;
			flag=true;
		}

		if (!flag){
			return;
		}
		
		obj.style.cursor="pointer";
		if (funcName){
			EventManager.addEvent(obj,"click",funcName,obj,fw,fh);
		}else{
			EventManager.addEvent(obj,"click","Img.defaultClick",obj,fw,fh);
		}
	},
	defaultClick:function(e,obj,fw,fh){
		tmpW = Dialog.width;
		tmpH = Dialog.height;
		Dialog.width = Math.min(fw+12,Math.max(document.body.scrollWidth,document.body.clientWidth)-20);
		Dialog.height = Math.min(fh+40,Math.max(document.body.scrollHeight,document.body.clientHeight)-40);
		Dialog.msg('图像浏览','<img src=\''+obj.src+'\'>');
		Dialog.width = tmpW;
		Dialog.height = tmpH;
	}
}



/*================================================================================================

		默认值设定: select checkbox radio text textarea

		setDefVal.set(webform对象，值)

		当webform对象为 checkbox 或者 radio 时,webform对象为一个数组 getElementsByName("对象名称")
		当webform对象为 checkbox 时，值得组成规则如 : "值1,值3,值5,值4, .." 
		
		Code by zhangxb 2009.7.27
==================================================================================================*/

setDefVal={
	set:function(obj,v){
		try{
			if (obj.tagName=="SELECT"){
				this.setSel(obj,v);
				return;
			}
			if (obj.tagName=="INPUT" && obj.getAttribute("type")=="text"){
				obj.value=v;
				return;
			}

			if (obj.tagName=="TEXTAREA"){
				obj.value=v;
				return;
			}

			if (obj[0].tagName=="INPUT"){
				if (obj[0].getAttribute("type")=="checkbox"){
					this.setChk(obj,v);
					return;
				}
				if (obj[0].getAttribute("type")=="radio"){
					this.setRdo(obj,v);
					return;
				}
			}
		}
		catch (e){
			alert(e.message);
		}
	},
	setSel:function(obj,v){
		for (i=0;i<obj.options.length;i++){
			if (obj.options[i].value==v){
				obj.options[i].selected=true;
				break;
			}
		}
	},
	setChk:function(obj,v){
		var vs = v.split(",");
		for (var i=0;i<v.length;i++){
			for (var j=0;j<obj.length;j++){
				if (obj[j].value==vs[i]){
					obj[j].checked=true;
				}
			}
		}
	},
	setRdo:function(obj,v){
		for (var j=0;j<obj.length;j++){
			if (obj[j].value==v){
				obj[j].checked=true;
				break;
			}
		}
	}
}







/*================================================================================================

		XML Reader

		EX:


		
		Code by zhangxb 2009.7.27
==================================================================================================*/


XMLReader = {
	get:function(x){
		var xmlhttp = null;
		if (window.ActiveXObject){
			try{
				xmlhttp = new ActiveXObject("Microsoft.XMLDOM");//实例化dom对象
				/*
				这个地方很多朋友不明白，我写详细点
				设置异步处理 
				本函数不需要在XML文件读取完成之前进行任何操作， 
				因此关闭异步处理功能。
				*/
				xmlhttp.async = false;                              
				xmlhttp.load(x);//加载xml文件
				return (xmlhttp);
			}
			catch (e){
				xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
			}
		}else if (window.XMLHttpRequest){
			xmlhttp=new XMLHttpRequest();
		}

		if (xmlhttp!=null){  
			xmlhttp.open("GET",x,false);
			xmlhttp.send(null);
		}else{
			alert("Your browser does not support XMLHTTP.11");
			return false;
		}
		return (xmlhttp.responseXML);
	},
	nextSibling:function(n){
		var y=n.nextSibling;
		while (y.nodeType!=1){
			y=y.nextSibling;
		}
		return y;
	},
	previousSibling:function(n){
		var y=n.previousSibling;
		while (y.nodeType!=1){
			y=y.previousSibling;
		}
		return y;
	},
	firstChild:function(n){
		var y=n.firstChild;
		while (y.nodeType!=1){
			y=y.nextSibling;
		}
		return y;
	},
	lastChild:function(n){
		var y=n.lastChild;
		while (y.nodeType!=1){
			y=y.previousSibling;
		}
		return y;
	}
}
