﻿var IsTimeOut = true;
//封装XMLHTTP的Request类的代码 
var Request = new Object();
//定义一个XMLHTTP的数组
Request.reqList = [];
//创建一个XMLHTTP对象，兼容不同的浏览器
function getAjax()
{
    var ajax=false; 
    try 
    { 
     ajax = new ActiveXObject("Msxml2.XMLHTTP"); 
    } 
    catch (e)
     { 
      try 
      { 
      ajax = new ActiveXObject("Microsoft.XMLHTTP"); 
      } 
     catch (E)
      { 
      ajax = false; 
      } 
    }
    if (!ajax && typeof XMLHttpRequest!='undefined') 
    { 
     ajax = new XMLHttpRequest(); 
    } 
    return ajax;
}
//封装XMLHTTP向服务器发送请求的操作
//url:向服务器请求的路径；method：请求的方法，即是GET还是POST；callback：当服务器成功返回结果时，调用的函数
//data：向服务器请求时附带的数据；urlencoded：url是否编码；callback2;当服务器返回错误时调用的函数
Request.send = function(url, method, callback, data, urlencoded, callback2)
 { 
    
    var req=getAjax();  //得到一个XMLHTTP的实例
	//当XMLHTTP的请求状态发生改变时调用
    req.onreadystatechange = function() 
    {
        
	    // 当请求已经加载
        if (req.readyState == 4) 
        {
			// 当请求返回成功
			if (req.status < 400) 
			{
			   IsTimeOut = false;
			   // 当定义了成功回调函数时，执行成功回调函数
			   //alert(data)
			   if(callback)
			    {
				    callback(req,data);
				}
				
			} 
			// 当请求返回错误
			else 
			{
				alert("当加载数据时发生错误 :\n" + req.status+ "/" + req.statusText);
				//当定义了失败回调函数时，执行失败回调函数
				if (callback2) 
				callback2(req,data);
			}
			//删除XMLHTTP，释放资源
			try {
				delete req;
				req = null;
			} catch (e) {}
		}
	}
	//如果以POST方式回发服务器
	if (method=="POST")
	{
		req.open("POST", url, true);
		setTimeout(function(){
		    if(IsTimeOut)
		    {
		        //删除XMLHTTP，释放资源
		        try {
				delete req;
				req = null;
			    } catch (e) {}
    			
		        if (callback2) 
				    callback2(req,data);
		    }		    
		},1000*20);
		
		//请求需要编码
		if (urlencoded) 
		    req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');		
		req.send(data);
		Request.reqList.push(req);
	}
	//以GET方式请求
	else 
	{
		req.open("GET", url, true);
		req.send(null);
		Request.reqList.push(req);
	}
	return req;
}

//全部清除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方式发送请求时的代码
//clear：是否清除XMLHTTP数组的所有元素；其他参数的意义参见Request.send
Request.sendPOST = function(url, data, callback, clear, callback2) 
{
	if (clear)
        Request.clearReqList();
	Request.send(url, "POST", callback, data, true, callback2);
}
//进一步封装XMLHTTP以GET方式发送请求时的代码
Request.sendGET = function(url, callback, args, clear, callback2) 
{
	if (clear)
		Request.clearReqList();
	return Request.send(url, "GET", callback, args, false, callback2);
}

