
//charset=uft-8
function Ajax(){   	
    // 默认出错处理   
    this._eh = Ajax._error;   
}
Ajax.debug_enable = false;   

// GET 请求   
//（URL, 回调函数[, 回调函数附加数据, 是否异步]）   
Ajax.prototype.get = function (url, callback, asyn){   	 
    asyn = (asyn === undefined)? true: asyn;   
    var _self = this;   
  
    var X = Ajax._object();   
    if(asyn)   
        X.onreadystatechange = function()   
        { Ajax._callback(X, callback, _self); };   
    X.open('GET', url, asyn);   
    
    if(Ajax.debug_enable)   
        Ajax._debugger(callback);   
  
    X.send(null);   
  
    if(asyn){   
        return X;   
    }else{   
        Ajax._callback(X, callback, _self);   
    }   
}   
// POST 请求   
//（URL, POST数据, 回调函数[, 回调函数附加数据, 是否异步]）   
Ajax.prototype.post = function (url, sdata, callback, asyn){
	asyn = (asyn === undefined)? true: asyn;   
    var _self = this;         
    var X = Ajax._object();           
    if(asyn)   
        X.onreadystatechange = function()   
        { Ajax._callback(X, callback, _self); };   
    X.open('POST', url, asyn);   
        
    if(Ajax.debug_enable)   
        Ajax._debugger(callback);   
	
	if(sdata && typeof sdata == "object"){
	  	X.setRequestHeader('Content-length', sdata.length);   
   		X.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');    
    	//X.setRequestHeader('contentType','text/html;charset=uft-8');    
   		X.send(sdata);               	
	}else{
		var contentType = "text/html;charset=uft-8";
		//if(datatype ==  "xml") contentType = "text/xml;charset=uft-8";
		X.setRequestHeader("contentType", contentType);
	    X.send(null);  	
	 
	}
    if(asyn){   
        return X;   
    }else{   
        Ajax._callback(X, callback, _self);   
    }   

}

// 设置出错处理函数   
Ajax.prototype.e_handler = function (func)   
{   
    if(func !== undefined) this._eh = func;   
}   
  
// 创建一个兼容的XHR对象。   
// 改了一下：IE7中优先采用Native XHR   
Ajax._object = function()   
{   
    var A;   
    if(typeof XMLHttpRequest != 'undefined') {   
        A = new XMLHttpRequest();   
    }else{   
        var _msxmlhttp = new Array(   
            'Msxml2.XMLHTTP.6.0',   
            'Msxml2.XMLHTTP.3.0',   
            'Msxml2.XMLHTTP',   
            'Microsoft.XMLHTTP');   
        for(var i = 0; i < _msxmlhttp.length; i++) {   
            try {   
                if(A = new ActiveXObject(_msxmlhttp[i])) break;   
            } catch (e) {   
                A = null;   
            }   
        }   
    }   
    if(!A)   
        alert("Could not create connection object.");   
    return A;   
}   
  
//-- 私有函数 -----------------------------------------------------------------   
Ajax._callback = function (req, callback, obj)   
{   
    if(req.readyState == 4) {   
        if(req.status != 200) {   
            //req.onreadystatechange = null;   
            if(obj._eh) obj._eh(req, callback);   
        }else{   
        	callback(req,obj);   
            //req.onreadystatechange = null;   
        }   
    }   
}   
  
// Debug: 显示采用的回调函数。   
Ajax._debugger = function (func)   
{   
    alert('running: ' + Ajax._fname(func));   
}   
  
Ajax._errorBySelf = function(msg){
	alert(msg);
}
// 默认的出错处理   
Ajax._error = function (req, callback){   
    alert(req.statusText + '\nShould run: ' + Ajax._fname(callback));   
}   
  
// 提取函数名（含参数）   
Ajax._fname = function (func){   
    var S = func.toString();   
    return S.slice(9, S.indexOf(')', 10)) + ')';   
}   
var Class = {
  create: function() {
    return function() {
      this.initialize.apply(this, arguments);
    }
  }
}
Ajax.Updater = Class.create();
Ajax.Updater.prototype ={
	 initialize:function(container, url, options){
 		if(typeof container !="object")
	 		container = document.getElementById(container);	 		 	
		var obj = new Ajax();
		obj.container = container;
		if(obj.container != null){
			var method = options.method;
			if (typeof options.parameters == 'string'){				
		  		//options.parameters =escape(options.parameters);
		   	}
		   	if(url.indexOf("?") != -1){
		   		url = url+"&"+options.parameters;
		   	}else{
		   		url = url+"?"+options.parameters;
		   	}
		 
		   url=encodeURI(url); 
		   url=encodeURI(url); 
		 
			if(!method){
				method = "get";
			}			
			if(method.toUpperCase() == "GET"){
				obj.get(url,this.callBack,true);
			}else if(method.toUpperCase() == "POST"){
				obj.post(url,null,this.callBack,true)  ;
			}
		}else{
			Ajax._errorBySelf("要替换的容器ID不存在！");	
		}
	 },
	 callBack:function(datafromServer,obj){		 	
		obj.container.innerHTML = datafromServer.responseText;
	 }
}

Ajax.Request = Class.create();
Ajax.Request.prototype ={
	 initialize:function(url, options){
		var obj = new Ajax();
		var method = options.method;
		if(options.e_handler) obj.e_handler(options.e_handler);
		if (typeof options.parameters == 'string'){				
	  		//options.parameters =escape(options.parameters);
	   	}
	   	if(url.indexOf("?") != -1){
	   		url = url+"&"+options.parameters;
	   	}else{
	   		url = url+"?"+options.parameters;
	   	}
	    url = encodeURI(url); 
		//url=encodeURI(url); 
		if(!method){
			method = "get";
		}			
		var asyn = options.asyn? options.asyn: true;
		if(method.toUpperCase() == "GET"){
		   obj.get(url,options.onComplete,asyn);
		}else if(method.toUpperCase() == "POST"){
			obj.post(url,null,options.onComplete,asyn);
		}
	 }
}


function $(mtxt){
  if (document.getElementById) {      
      m=document.getElementById(mtxt);      
  } else if (document.all) {      
      m=document.all[mtxt];      
  } else if (document.layers) {      
      m=document.layers[mtxt];      
  }      
  return m;      
}  
 

/** 异步用到,不能删*/
Function.prototype.bindAsEventListener = function(object) {
  var __method = this, args = $A(arguments), object = args.shift();
  return function(event) {
    return __method.apply(object, [event || window.event].concat(args));
  }
}


/** bindAsEventListener用到,不能删*/
var $A = Array.from = function(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) {
    return iterable.toArray();
  } else {
    var results = [];
    for (var i = 0, length = iterable.length; i < length; i++)
      results.push(iterable[i]);
    return results;
  }
}

 
/////////////////end:Ajax/////////////////////////////////////////////////////////////
