﻿/*AjaxControl控制器
接受参数:无/ajax对象
返回类型:无

应用技术：
javascript、ajax

制作人：
黄若儒 Roy.Huang

注意:
1、本控制用于对Ajax应用中的多种状态进行独立控制
2、本对象应用分实例化应用以及对象化应用
3、一个AjaxControl实例并不是Ajax对象，其自身无有send\open\set...\get...等Ajax对象中的方法！AjaxControl实例主要用于对传入Ajax对象进行状态控制
4、当实例化时不传入Ajax对象，AjaxControl将调用AjaxControl.createAjax()方法自行创建，若想得到该自动创建的Ajax对象，可通过(实例.ajax)获取
5、全部采用静态/prototype写法，方便继承重载
*/
var AjaxControl=function(){};

try{//设置命名空间
	Class.setNameSpace("org.developerworld.net.AjaxControl",AjaxControl);
}
catch(e){}

AjaxControl.prototype.ajax=null;//存放Ajax对象
AjaxControl.prototype.timeout=60*60*1000;//执行超时时间
AjaxControl.prototype.isRunning=false;//Ajax执行状态
AjaxControl.prototype.setTimeOutFunction=null;

//状态事件
AjaxControl.prototype.onLoading=function(){};
AjaxControl.prototype.onLoaded=function(){};
AjaxControl.prototype.onInteractive=function(){};
AjaxControl.prototype.onComplete=function(){};
AjaxControl.prototype.onTimeOut=function(){};
AjaxControl.prototype.onStatusError=function(){AjaxControl.onError(1,arguments[0]);};

AjaxControl.prototype.abort=function(){//清空实例
	var base=this;
	base.ajax.abort();
	base.isRunning=false;
	base.ajax.onreadystatechange=function(){base.onreadystatechange()};
};

AjaxControl.prototype.onreadystatechange=function(){//状态监听
	var base=this;
	if(!base.isRunning){
		base.setTimeOutFunction=setTimeout(function(){
												base.abort();
												base.onTimeOut();
											},base.timeout);
		base.isRunning=true;
	}
	
	switch(base.ajax.readyState){
		case 1:base.onLoading();break;
		case 2:base.onLoaded();break;
		case 3:base.onInteractive();break;
		case 4:
			clearTimeout(base.setTimeOutFunction);
			base.isRunning=false;
			if(base.ajax.status==200 || base.ajax.status==0)
				base.onComplete();
			else
				base.onStatusError(base.ajax.status);
			break;
		default:break;
	}
};

AjaxControl.prototype.init=function(){//完全实例化对象
	var base=this;
	if(arguments[0]!=null)
		base.ajax=arguments[0];
	else
		base.ajax=AjaxControl.createAjax();
	if(base.ajax)
		base.ajax.onreadystatechange=function(){base.onreadystatechange()};
	else
		return false;
	return true;
};

//========================================静态方法========================================

//判断创建途径
AjaxControl.useActiveXObject=(typeof(ActiveXObject) != "undefined");
AjaxControl.useXMLHttpRequest=(typeof(XMLHttpRequest) != "undefined");
AjaxControl.versions=["MSXML2.XMLHttp.5.0","MSXML2.XMLHttp.4.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp","Microsoft.XMLHttp"];//Ajax创建版本

AjaxControl.createAjax=function(){//创建Ajax对象
	var ajax=null;
	if(this.useXMLHttpRequest){
		ajax=new XMLHttpRequest();
		if(ajax.overrideMimeType)
			ajax.overrideMimeType("text/xml");
	}
	else if(this.useActiveXObject){
		for(var i=0;i<this.versions.length;i++){
			try{
				ajax=new ActiveXObject(this.versions[i]);
			}
			catch(e){}
		}
	}
	if(!ajax) this.onError(0);
	return ajax;
};

AjaxControl.isSupported=function(){//判断是否支持Ajax
    return (this.useActiveXObject || this.useXMLHttpRequest);
};

AjaxControl.onError=function(){//报错函数
	switch(arguments[0]){
		case 0:alert("无法创建Ajax对象(Can't create Ajax Object)");break;
		case 1:alert("服务器端发生 "+arguments[1]+" 异常(The server have "+arguments[1]+" error)");break;
		default:alert(e);break;
	}
	return false;
};

AjaxControl.init=function(){//获取完全实例化对象的静态方法
	var c=new this();
	c.init(arguments[0]);
	return c;
}