var requests = new Array();

HttpRequest = function()
{
	var request = null;
	if(window.XMLHttpRequest)
	{ //Mozilla 浏览器
		request = new XMLHttpRequest();
		if (request.overrideMimeType) 
		{//设置MiME类别
			request.overrideMimeType("text/xml");
		}
	}
	else
	{  
	    var MSXML = ["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];
        for(var n = 0; n < MSXML.length; n ++)
        {
            try
            {
                request = new ActiveXObject(MSXML[n]);        
                break;
            }
            catch(e)
            {
            }
        }
	}
	if (!request) { // 异常，创建对象实例失败
		window.alert("不能创建XMLHttpRequest对象实例.");
		return null;
	}
	return request;
}

//停止请求
function request_stop()
{
	for(var i=0; i<requests.length; i++)
	{
		if(requests[i] != null)
			requests[i].obj.abort();
	}
}

//创建新的请求
function create_request(context)
{
    for(var i=0; i<requests.length; i++)
	{
		if(requests[i].context == "")
		{
			requests[i].obj.abort();
			requests[i].context = context;
			return requests[i];
		}
	}
	var pos = requests.length;
	requests[pos] = Object();
	requests[pos].obj = new HttpRequest();
	requests[pos].context = context;
	return requests[pos];
}

//发送请求，用POST方法
function send_request(method,url,data,callback,context)
{
	var request = create_request(context);
	var async = typeof(callback) == 'function';

	if(async) request.obj.onreadystatechange = function()
	{
		if(request.obj.readyState == 4)
			callback(new response(request));
	}
	if (url.indexOf("?") > 0)
    {
        url += "&randnum=" + Math.random();
    }
    else
    {
        url += "?randnum=" + Math.random();
    }
	request.obj.open(method, url, true);
	request.obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	request.obj.setRequestHeader("CharSet","gb2312");
	request.obj.send(data);
	
	if(!async)
		return new response(request);
}

function response(request)
{
	this.request = request.obj;
	this.error = null;
	this.value = null;
	this.context = request.context;
	
	if(request.obj.status == 200)
	{
		try
		{
		    
			this.value = returnValue(request);
			if(this.value && this.value.error)
			{
				this.error = this.value.error;
				this.value = null;
			}
		}
		catch(e)
		{
			this.error = new request_error(e.name, e.description, e.number);
		}
	}
	else
	{
		this.error = new request_error('HTTP request failed with status: ' + request.obj.status, request.obj.status);
	}
	
	return this;
}

function enc(s)
{
	return s.toString().replace(/\%/g, "%26").replace(/=/g, "%3D");
}

function returnValue(request)
{
	if(request.obj.responseXML != null && request.obj.responseXML.xml != null && request.obj.responseXML.xml != '')
		return request.obj.responseXML;
	else
	return request.obj.responseText;

}

function request_error(name, description, number)
{
	this.name = name;
	this.description = description;
	this.number = number;
	return this;
}

request_error.prototype.toString = function()
{
	return this.name + " " + this.description;
}

