document.writeln("<script   type=\"text/javascript\"   src=\"http://images.zhenai.com/edition201004271007/zhenai3/js/api/dom/domcore.js\"><\/script>");
/**
 * @author	zhouxiaoming
 * 针对d3API的重构
 * 在这个对象中，如果要针对服务器返回信息做一些复杂的处理，请采用回调函数的方式。
 * 
 * 
 * 所谓回调函数，即：
 * 将函数名称（不可以引号，不然作字符串处理）当作参数传入另一个对象的方法中，在接收到服务器返回信息时，
 * 这个对象会根据传入的函数名称，调用函数。那么这个传入的函数就叫回调函数。
 * 
 * 关于回调函数的用法比较灵活，现在针对Ajax对象举二个简单的例子
 * 
 * 以下定义了一个对象A
 * function A(){
 * 		var method1 = function(xxx){
 * 			.......省略
 * 		}
 * 		var method2 = function(){
 *  		.......省略
 * 		}
 * 		
 * 		参数txt	服务器返回信息的文本格式
 * 		参数xml	服务器返回信息的xml格式
 * 		说明：    一般情况下，如果不使用服务器返回的xml数据，可以不定义这个参数。javascript的参数用法是很灵活的，这里不细说。
 * 		this.method = function(txt,xml){
 * 			.......省略
 * 			var xx = ....省略
 * 			method1(xxx);
 * 			method2();
 * 			....省略
 * 		}
 * }
 * 
 * function b(){
 * 		.......省略
 * }
 * var a = new A();
 * 
 * 然后将a.method或者b()传入,Ajax.doGet,Ajax.doPost,new Ajax().callServer其中任何一个方法中，那么在接受到服务器返回数据时，就会调用A.method方法。
 * 
 */
function Ajax(){
	
	var tip = null;//放置提示用户等待的信息的对象。
	var disResponseObject = null;//显示服务器返回信息的对象。
	var callMethod = null; //服务器返回后，调用的方法。
	
	/**
	 * 请求服务器
	 * @param	reqUrl           请求的url，String类型
	 * @param	postStr          发送给服务器的内容，当有post为null对象时，默认为get方式请求，反之是post
	 * @param	disResponseObj   显示服务器返回信息的html元素对象，可以是null。
	 * @param	callBack         接收到服务器返回信息后回调的函数，值是方法名称(不必加任何引号)，可以是null。方法也可以是这种形式：对象.方法名称，如:A.do。
	 * @param	flag             请求是否对用户匿名，参数是boolean类型。为false表示匿名，不显示提示用户等待的信息；反之则有。
	 * @param   synchronize      同步标志，为boolean值，可以为null。为true表示是同步请求，为null或者false表示异步请求
	 */
	this.callServer = function(reqUrl,postStr,disResponseObj,callBack,flag,synchronize){
		disResponseObject = disResponseObj;
		callMethod = callBack;
		if(flag)
			setWaitInfo();
		if(reqUrl.indexOf("pageCacheFlag")==-1){
        	if(reqUrl.indexOf("?")==-1)
        		reqUrl+="?pageCacheFlag=0";
        	else
        		reqUrl+="&pageCacheFlag=0";      	
        } 
        reqUrl+="&ajax=true";
		service(reqUrl,postStr,synchronize);
	}
	
	/**
	 * 提供ajax请求服务
	 */
	var service = function(reqUrl,postStr,synchronize){
		var req = getRequest();
		req.onreadystatechange = function() {
			if (req.readyState == 4)
				handleResponse(req.responseXML, req.responseText);
		}
		var method = null==postStr? "get":"post";
		if(!synchronize) req.open(method,reqUrl,true);
		else req.open(method,reqUrl,false);
		if("post"==method){
			req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			req.setRequestHeader("Content-Length",postStr.length);	
			req.send(postStr);
		}
		req.send(null);
	}
	
	/**
	 * 处理服务器返回的信息。
	 */
	var handleResponse = function(xml,txt){
		if(null!=tip)//如果设置了提示用户等待信息，则在此取消。
			document.body.removeChild(tip)
		if(null!=disResponseObject)//如果放置返回信息的html对象存在，就将内容转入。
			disResponseObject.innerHTML = txt;
		if(null!=callMethod)//如果回调函数存在，则调用。
			callMethod(txt,xml);
	}
	
	/**
	 * 得到ajax请求组件
	 */
	var getRequest = function(){
		var req = null
		if (window.XMLHttpRequest) //for firefox etc..	
			req = new XMLHttpRequest();
		else if (window.ActiveXObject)//for IE
			req = new ActiveXObject("Microsoft.XMLHTTP");
		return req;	          	
	}
	
	/**
	 * 设置等待信息，改善用户体验。
	 * @param tip 放置提示用户等待的信息的对象。
	 * @param flag 是否对用户显示等待信息，是boolean类型。
	 */
	var setWaitInfo = function(){
		tip = document.createElement("span");
		tip.innerHTML= "在取得数据,请稍候 ........................";
		document.body.appendChild(tip);
		var style = "position:absolute;left:50%;top:250px;margin:0 0 0 -50px; display:block; padding:10px 20px; background:#E5E5E5; border:1px #999 solid;";
		Dom.setCss(tip,style);
	}
}

/**
 * 以get方式请求服务器
 * @param	reqUrl           请求的url，String类型
 * @param	disResponseObj   显示服务器返回信息的html元素对象，可以是null。
 * @param	callBack         接收到服务器返回信息后回调的函数，值是方法名称(不必加任何引号)，可以是null。方法也可以是这种形式：对象.方法名称，如:A.do
 * @param	flag             请求是否对用户匿名，参数是boolean类型。为false表示匿名，不显示提示用户等待的信息；反之则有。
 * @param   synchronize      同步标志，为boolean值，可以为null。为true表示是同步请求，为null或者false表示异步请求
 */
Ajax.doGet = function(reqUrl,disResponseObj,callBack,flag,synchronize){
	var ajax = new Ajax();
	ajax.callServer(reqUrl,null,disResponseObj,callBack,flag,synchronize);
}

/**
 * 以post方式请求服务器
 * @param	reqUrl           请求的url，String类型
 * @param	postStr          发送给服务器的内容。
 * @param	disResponseObj   显示服务器返回信息的html元素对象，可以是null。
 * @param	callBack         接收到服务器返回信息后回调的函数，值是方法名称(不必加任何引号)，可以是null。方法也可以是这种形式：对象.方法名称，如:A.do。
 * @param	flag             请求是否对用户匿名，参数是boolean类型。为false表示匿名，不显示提示用户等待的信息；反之则有。
 * @param   synchronize      同步标志，为boolean值，可以为null。为true表示是同步请求，为null或者false表示异步请求
 */
Ajax.doPost = function(reqUrl,postStr,disResponseObj,callBack,flag,synchronize){
	var ajax = new Ajax();
	ajax.callServer(reqUrl,postStr,disResponseObj,callBack,flag,synchronize);
}
