function CreateXMLHttpRequest(){
	var xmlrequest;
	//对于Firefox和Opera等浏览器
	if (window.XMLHttpRequest) {
		xmlrequest = new XMLHttpRequest();
	}
	else {
		var MSXML=['Msxml2.XMLHTTP.7.0','Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
		for (var i=0;i<MSXML.length;i++) {
			try {
				xmlrequest = new ActiveXObject(MSXML[i]);
				break;
			}
			catch (ex) {
			//	alert("Cannot create http request");
			}
		}
	}

	return xmlrequest;
}

/**
*用于XMLHttpRequest(xhr)回调, 根据xhr的readyState
*调用不同的函数
*/
function RequestListener(){
	//当xhr.readyState = 0时调用
	this.uninitialized = function(){}

	//当xhr.readyState = 1时调用
	this.loading = function(){}

	//当xhr.readyState = 2时调用
	this.loaded = function(){}

	//当xhr.readyState = 3时调用
	this.interactive = function(){}

	//当xhr.readyState = 4时调用
	this.complete = function(status, statusText, responseText, responseXML){}
}

/**
*RequestListener的子类型,用于扩展complet方法,
*当HTTP(xhr.status)应答状态为200时, 调用handleText和handleXML
*处理应答体;当状态为其它时,调用handleError.
*/
function RequestAdapter(){
	this.complete = function(status, statusText, responseText, responseXML) {
		if (status == 200) {
			this.handleText(responseText);
			this.handleXML(responseXML);
		}
		else {
			this.handleError(status, statusText);
		}
	}

	this.handleText = function(text){}
	this.handleXML = function(xml){}
	this.handleError = function(status, statusText) {alert('Http status: ' + status + ' , ' + statusText);}
}

RequestAdapter.prototype = new RequestListener();
RequestAdapter.prototype.constructor = RequestAdapter;

/**
*封装XMLHttpRequest,回调RequestListener的不同方法处理
*不同的应答状态.对外提供doGet, doPost方法处理不同方式的请求.
*使用例子如下:
* var l = new RequestAdapter();
* l.handleText = function(text){alert(text);}
* var req = new Request(l);
* req.doGet("hello.jsp");
*/

function Request(l) {
	var xhr = CreateXMLHttpRequest();
	var listener = l;
	if (!listener) {listener = new RequestListener();}

	this.setListener = function(l){listener = l;}

	this.doGet = function(url, asyn) {doProcess('GET', url, null, asyn);}

	this.doPost = function(url, reqBody, asyn) {doProcess('POST', url, params, asyn);}

	function doProcess(method, url, params, asyn) {
		if (asyn == undefined) {asyn = true}
		xhr.open(method, url, asyn);
		xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		xhr.send(params);

		if (asyn) {xhr.onreadystatechange = callback;}
		if (!asyn) {
			listener.complete(xhr.status, xhr.statusText, xhr.responseText, xhr.responseXML);
		}
	}

	function callback(){
		switch(xhr.readyState){
			case 0 : listener.uninitialized(); break;
			case 1 : listener.loading(); break;
			case 2 : listener.loaded(); break;
			case 3 : listener.interactive(); break;
			case 4 : listener.complete(xhr.status, xhr.statusText, xhr.responseText, xhr.responseXML); break;
			default : break;
		}
	}
}

