﻿/*
太原恒拓科技 Ajax
*/

/*
req.statusText = 状态码对应的字符串信息
req.responseText = 将响应信息作为字符串返回
req.responseXML = 将响应信息格式化为Xml Document对象并返回req.responseBody = 将响应信息正文以unsigned byte数组形式返回
req.responseStream = 以Ado Stream对象的形式返回响应信息
[其他方法]
req.getAllResponseHeaders() 获取响应的所有http头（labels and values），类型string
-----------------------------
Server:Microsoft-IIS/5.1
X-Powered-By:ASP.NET
Date:Sat, 07 Jun 2003 23:23:06 GMT
Content-Type:text/xml
Accept-Ranges:bytes
Last Modified:Sat, 06 Jun 2003 17:19:04 GMT
ETag:"a0e2eeba4f2cc31:97f"
Content-Length:9
-----------------------------
req.getResponseHeader("headerLabel") 返回响应的头部"headerLabel"的值，类型string


eg:
function myprocessing(req){
	switch(req){
		case 0:
			//uninitialized...
			break;
		case 1:
			//loading...
			break;
		case 2:
			//loaded...
			break;
		case 3:
			//interactive...
			break;
		case 5:
			//不支持XMLHttp...
			ajax.Dispose();
			break;
		case 6:
			//网页无法显示...
			ajax.Dispose();
			break;
		default:
			//正常 返回对象req...
			ajax.Dispose();
			break;
	}
}
var ajax=new AJAXRequest();
ajax.setRequestHeader("ContentType","text/xml;charset=utf-8");
ajax.setRequestHeader("SOAPAction","http://localhost/QXTService/SendSms");
ajax.Send("http://www.abc.com","myprocessing"[,Arg]);

*/

function AJAXRequest(){
    var req=null;
	var bparams=new Object();
	var RequestHeader=new Array();
	function CreateXMLHttpRequest(){
	    if(window.XMLHttpRequest){
		    try{
			    return new XMLHttpRequest();
		    }catch(e){
			    return null;
		    }
	    }else if(window.ActiveXObject){
		    try{
			    return new ActiveXObject("Msxml2.XMLHTTP.5.0");
		    }catch(e){
			    try{
				    return new ActiveXObject("Msxml2.XMLHTTP.4.0");
			    }catch(e){
				    try{
					    return new ActiveXObject("Msxml2.XMLHTTP");
				    }catch(e){
					    try{
						    return new ActiveXObject("Microsoft.XMLHTTP");
					    }catch(e){
						    return null;
					    }
				    }
			    }
		    }
	    }
	}
	function RandURL(u){
	    if(u.indexOf('?')>-1){
            u=u.replace(/[\&\?]sid=[^\&]+/,"");
        }
        if(u.indexOf('?')>-1){
            u+="&sid=" + Math.random();
        }
        else{
            u+="?sid=" + Math.random();
        }
        return u;
	}
	this.setRequestHeader=function(labels,values){
		RequestHeader[RequestHeader.length]=new Array(labels,values);
	}
	this.ClearRequestHeader=function(){
		RequestHeader.length=0;
	}
	this.Send=function(RemoteUrl,CallBack,RequestAll,Params,isrnd){
		var isAsync=typeof(CallBack)=="function";
		if(req==null){
		    req=CreateXMLHttpRequest();
		}
		if(req!=null&&typeof(req)=="object"){
			var method=Params?(Params=="HEAD"?"HEAD":"POST"):"GET";
			if(isAsync){
			    bparams.CallBack=CallBack;
				req.onreadystatechange=function(){
					if(req.readyState==4){
						if(RequestAll||req.status==200){
							CallBack(req);
						}else{
							CallBack(6);
						}
					}else{
						CallBack(req.readyState);
					}
				}
			}
			bparams.RequestAll=RequestAll;
			bparams.Method=method;
            bparams.RemoteUrl=RemoteUrl;
            bparams.IsAsync=isAsync;
            if(isrnd){
	            RemoteUrl=RandURL(RemoteUrl);
	        }
			req.open(method,RemoteUrl,isAsync);
			this.setRequestHeader("Connection","Keep-Alive");
			this.setRequestHeader("Alive-Condition","WPG");
			if(method=="POST"){
				this.setRequestHeader("Content-Length",Params.length);
				this.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
			}
			for(var i=0;i<RequestHeader.length;i++){
				req.setRequestHeader(RequestHeader[i][0],RequestHeader[i][1]);
			}
			bparams.Params=Params;
			req.send(Params);
		}else if(isAsync){
		    CallBack(5);
		}
	}
	this.ReSend=function(isrnd){
	    this.Stop();
	    req=CreateXMLHttpRequest();
	    if(req!=null&&typeof(req)=="object"){
	        if(isrnd){
	            bparams.RemoteUrl=RandURL(bparams.RemoteUrl);
	        }
	        if(bparams.IsAsync){
	            req.onreadystatechange=function(){
			        if(req.readyState==4){
				        if(bparams.RequestAll||req.status==200){
					        bparams.CallBack(req);
				        }else{
					        bparams.CallBack(6);
				        }
			        }else{
				        bparams.CallBack(req.readyState);
			        }
		        }
		    }
	        req.open(bparams.Method,bparams.RemoteUrl,bparams.IsAsync);
		    for(var i=0;i<RequestHeader.length;i++){
			    req.setRequestHeader(RequestHeader[i][0],RequestHeader[i][1]);
		    }
	        req.send(bparams.Params);
	    }else if(isAsync)CallBack(5);
	}
	this.Stop=function(){
	    if(req!=null&&typeof(req)=="object"){
	        req.abort();
	    }
	    req=null;
	}
	this.Dispose=function(){
	    this.Stop();
	    bparams=null;
	    RequestHeader=null;
	}
	this.Request=function(){return req;}
}