﻿

//创建XMLHttpRequest对象的实例
function createXMLHttpRequest()
{
    var xmlhttp = false    //定义一个XMLHTTP变量，初始值为false
    if(window.XMLHttpRequest)    //如果支持XMLHTTP则创建XMLHTTP对象
    {
        xmlhttp = new XMLHttpRequest();
        if(xmlhttp.overrideMimeType)
        {
            xmlhttp.overrideMimeType('text/xml');
        }
    }
    else if(window.ActiveXObject)    //是否支持XMLHTTP ActiveX
    { 
        try
        {
            xmlhttp = new ActiveXObject('Msxml2.XMLHTTP');    //IE高版本中创建XMLHTTP对象
        }
        catch(e)
        {
            try
            {
                xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');    //IE低版本中创建
            }
            catch(e)    //都不能创建对象，返回false
            {}
        }
    }
    return xmlhttp;
}




//封装XMLHTTP的Request类的代码 
var Request = new Object();
//定义一个XMLHTTP的数组
Request.reqList = [];




//封装XMLHTTP向服务器发送请求的操作
//url:向服务器请求的路径；method：请求的方法，即是GET还是POST；asyn：异步模式，即是true还是false；callbackByOk：当服务器成功返回结果时，调用的函数；
//data：向服务器请求时附带的数据；urlencoded：url是否编码；callbackByError;当服务器返回错误时调用的函数；
//loading：加载的提示；loaded：加载完之后的提示；
Request.send = function(url,method,asyn,callbackByOk,data,urlencoded,callbackByError,loading,loaded)
{
    var xmlhttp=createXMLHttpRequest();  //得到一个XMLHTTP的实例
    
	//当XMLHTTP的请求状态发生改变时调用
    xmlhttp.onreadystatechange = function() 
    {
	    //当请求已经加载
        if(xmlhttp.readyState == 4) 
        {
            //当请求返回成功
            if(xmlhttp.status < 400)
            {
                //当定义了成功回调函数时，执行成功回调函数
			    if(callbackByOk)
			    {
			        callbackByOk(xmlhttp,data);
			    }
		    }
		    //当请求返回错误
		    else
		    {
		        //当定义了失败回调函数时，执行失败回调函数
		        if(callbackByError)
		        {
		            callbackByError(xmlhttp,data);
		        }
		    }
		    //服务器已经进行了处理，更改界面提示信息
		    if(loaded)
		    {
		        loaded();
		    }
		    //删除XMLHTTP，释放资源
		    try
		    {
		        delete xmlhttp;
		        xmlhttp = null;
		    }
		    catch (e) {}
	    }
	}
	
    //如果以POST方式回发服务器
	if (method=="POST")
	{
	    //异步模式
	    if(asyn)
	    {
	        xmlhttp.open("POST",url,true);
	    }
	    else
	    {
	        xmlhttp.open("POST",url,false);
	    }
	    
		//请求需要编码
		if (urlencoded)
		{
		    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		}
		xmlhttp.send(data);
		Request.reqList.push(xmlhttp);
	}
	//以GET方式请求
	else 
	{
	    //异步模式
	    if(asyn)
	    {
	        xmlhttp.open("GET",url,true);
	    }
	    else
	    {
	        xmlhttp.open("GET",url,false);
	    }
		xmlhttp.send(null);
		Request.reqList.push(xmlhttp);
	}
	//正在向服务器发送请求，页面显示正在加载的提示
	if(loading)
	{
	  loading();
	}
	return xmlhttp;
}




//全部清除XMLHTTP数组元素，释放资源
Request.clearReqList = function() 
{
    var ln = Request.reqList.length;
	for (var i=0; i<ln; i++)
	{
	    var req = Request.reqList[i];
		if (req) 
		{
		    try 
		    {
			    delete req;
			}
			catch(e) {}
		}
	}
	Request.reqList = [];
}




//进一步封装XMLHTTP以POST方式发送请求时的代码
Request.sendPOST = function(url,data,asyn,callbackByOk,callbackByError,loading,loaded) 
{
    Request.clearReqList();
	Request.send(url,"POST",asyn,callbackByOk,data,true,callbackByError,loading,loaded);
}




//进一步封装XMLHTTP以GET方式发送请求时的代码
Request.sendGET = function(url,args,asyn,callbackByOk,callbackByError,loading,loaded) 
{
    Request.clearReqList();
	return Request.send(url,"GET",asyn,callbackByOk,args,false,callbackByError,loading,loaded);
}




//加载用户控件的工具方法
function loadControl(controlName,loginBox,msgBox)
{
    var d = new Date();    //创建一个随机时间，防止浏览器缓存
	var strURL = controlName+"?type=0&guid=" + d.getTime();    //请求的url
	
	//创建XMLHTTP
	var xmlhttp=createXMLHttpRequest();
	//打开
	xmlhttp.Open("get",strURL ,true);
	//注册客户端回调函数
	xmlhttp.onreadystatechange = function(){
	    if (xmlhttp.readyState == 4 )    //已经加载
	    {
	        if(xmlhttp.status == 200)    //服务器返回成功
	        {
	            if(loginBox)
	            {
	                loginBox.innerHTML = xmlhttp.responseText;
	            }
	            if(msgBox)
	            {
	                msgBox.style.display = 'none';
	            }
	        }
	        else    //出现错误
	        {
	            if(msgBox)
	            {
	                msgBox.innerHTML = "向服务器请求数据时出现错误!";
	            }
	        }
	    }
	}
	//发送
	xmlhttp.Send(xmlhttp);
	
	//显示加载的提示效果
	if(msgBox)
	{
	    msgBox.style.display = '';
	}
}