/*
* ==============================================================================
*  Name     : Ajax Class
*  Author   : Su Zewei(Aron)
*  Version  : 1.1.0
*  Copyright: AronSoft
*  E-mail   : AronStudio@21cn.com
*  HomePage : http://Aron888.blog.163.com
*  Modified : 2009-03-04
* ==============================================================================
*  param             type             default

*  ajax_count        int              0

*  timeout           int              360000
*  url(*)            String           null
*  id                String           null
*  content           String           null
*  method            String           GET
*  async             boolean          true
*  isxml             boolean          false

*  onstart           function         null
*  onend             function         null
*  onchange          function         null
*  oncomplete        function         null
*  ontimeout         function         null
*  onerror           function         null
* ==============================================================================
*  <script type="text/javascript" src="ajax.js"></script>
*
*  Send Data:
*    1. Send data without return;
*       ajax({url:"service.php?act=get"});
*
*    2. Send data and return the result;
*    ajax({url:"service.php?act=get",oncomplete:onComplete});
*
*    3. Send data with method post and return the result;
*    ajax({url:"service.php?act=get",method:"post",oncomplete:onComplete,
*      content:"data1=123456&data2=654321"});
*
*  Return Data:
*    function onComplete(obj)
*    {
*		obj.id;			Process id;
*		obj.data;		Return Data;
*		obj.time;		Spend Time;
*    }
*
*    function onTimeout(obj)	//onstart/onend/onchange/ontimeout/onerror
*    {
*		obj.url;		Request url;
*		obj.content;	Request content;
*		obj.method;		Request method;
*		obj.id;			Process id;
*		obj.isxml;		Request type;
*    }
* ==============================================================================
*/

var ajax_count=0;

function ajax(){
	var arg=arguments.length>0?typeof(arguments[0])=="object"?arguments[0]:{}:{};
	function getValue(arg,v){return arg!=undefined?arg:v;}
	var ef=function(){};
	var param=['url','content','method','timeout','async','isxml','oncomplete','onstart','onend','onchange','ontimeout','onerror','id'];
	var defval=['','','GET',360000,true,false,ef,ef,ef,ef,ef,ef,''],l=param.length;
	while(l--){this[param[l]]=getValue(arg[param[l]],defval[l]);}

	var st,et;
	st=new Date();
	var AJAX={oncomplete:this.oncomplete,onstart:this.onstart,onend:this.onend,onchange:this.onchange,ontimeout:this.ontimeout,onerror:this.onerror};
	var ev={url:this.url,content:this.content,method:this.method,id:this.id,isxml:this.isxml};

	if(!this.url||this.url.indexOf("http://")==0)return false;

	var http=null;
	var xmlVersion=['MSXML2.XMLHTTP','Microsoft.XMLHTTP'];
	try{
		http=new XMLHttpRequest;
	}
	catch(e){
		for(i=0;i<xmlVersion.length;i++){
			try{http=new ActiveXObject(xmlVersion[i]);}catch(e2){continue;}
			break;
		}
	}
	if(!http)return false;

	this.url += (this.url.indexOf('?')>0 ? '&' : '?')+'rnd='+Math.random();

	http.open(this.method,this.url,this.async);
	if(this.method.toUpperCase()=='POST')http.setRequestHeader('content-type','application/x-www-form-urlencoded');
	this.onstart(ev);
	ajax_count++;
	this.onchange(ev);

	var cancel=false;
	var timer=setTimeout(function(){ajax_count--;AJAX.onchange(ev);AJAX.ontimeout(ev);cancel=true;http.abort();AJAX.onend(ev);},this.timeout);

	http.send(this.content);

	if(!this.async){
		try{clearTimeout(timer);}catch(e){};
		handle();
	}

	http.onreadystatechange=handle;

	function handle(){
		et=new Date();
		if(http.readyState==4 && !cancel){
			ajax_count--;AJAX.onchange(ev);
			try{clearTimeout(timer);}catch(e){};
			try{if(http.status==200)callback();else onerror(ev);}
			catch(e){onerror(ev);}
		}
	}

	function callback(){
		if(ev.isxml){
			var xml=http.responseXML;
			if(xml==null){
				var parser=new DOMParser();
				xml=parser.parseFromString(http.responseText,'text/xml');
			}
			AJAX.oncomplete({'data':xml,'id':ev.id,'time':et-st});
		}
		else
		{
			AJAX.oncomplete({'data':http.responseText,'id':ev.id,'time':et-st});
		}
		AJAX.onend(ev);
	}

	return true;
}
