/*  
	File : ajax.js
	Class: Ajax
	Desc : 封装XMLHttpRequest
	Date : 2007/08/21
	By   : zhangping
	
	完整用法示例:	
		var url = '/myservlet.jsp'; 
		var options = {
			method:'post', 						//请求方法	default: post
			params:'p1=abc&p2=def',				//请求体	default: null
			asyn: true,							//是否异步	default: true
			container: 'myDivId', 				//更新内容的html容器id名
			onComplete: function(transport){	//回调函数
				alert(transport.responseText);
			}, 						
			onException: function (e){			//异常处理函数
				throw(e);
			}
		};			
		Ajax.dispatch(url, options);			//发送请求
		
	简单用法示例:	
		//更新html容器的内容，即将请求返回的文本直接填充到指定容器
		Ajax.dispatch('/myservlet.jsp', {params:'p1=abc&p2=def',container: 'myDivId'});
		 
		//使用回调函数处理返回结果
		Ajax.dispatch('/myservlet.jsp', {params:'p1=abc&p2=def',onComplete: myCallbackFunction});
		function myCallbackFunction(transport){ alert(transport.responseText); };

*/

var Ajax = new Object();
Ajax.dispatch = function(url, options){
	new Transport(url, options);
}

function Transport(url, options) {
	var self = this;	
	self.asyn = options.asyn || true;
	self.method = options.method || 'post';
	self.params = options.params || null;
	self.container = options.container || null;
	self.onComplete = options.onComplete || null;
	self.onException = options.onException || null;
		
	self.getTransport = function(){
		if (window.ActiveXObject) return new ActiveXObject('Microsoft.XMLHTTP');
		else if (window.XMLHttpRequest) return new XMLHttpRequest();
		else return false;
	}
	
	self.dispatch = function(){
		self.transport.open(self.method, url, self.asyn);
		self.transport.onreadystatechange = self.onStateChange;
		if (self.method == 'post') {
			self.transport.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
			if (self.transport.overrideMimeType) self.transport.setRequestHeader('Connection', 'close');
		}
		self.transport.send(self.params);		
	}
	
	self.onStateChange = function(){		
		if (self.transport.readyState == 4 && self.transport.status == 200) {			
			if (self.onComplete) setTimeout(function(){self.onComplete(self.transport);}, 10);
			if (self.container)  setTimeout(function(){document.getElementById(self.container).innerHTML = self.transport.responseText;}, 10);
			self.transport.onreadystatechange = function(){};
		}
	}
			
	try { self.transport = self.getTransport(); self.dispatch(); }
	catch(e) { if(self.onException)	self.onException(e); }		
}
