﻿/**
 *Ajax通信包装类
 *@Author Zhan Song
 *@Date 2007.07.02
 *@Version 1.0
 */ 

 /**
  *定义Ajax调用结果包装类  
  */
 if( !SongSoft.Web.AjaxResponse )
 {
	 SongSoft.Web.AjaxResponse = function()
	 {
	 };
	 SongSoft.Web.AjaxResponse.prototype = 
	 {
		 isSuccess : false,
		 callbackArgs : null,
		 status : null,
		 responseText : null,
		 responseXML : null,
		 statusText : null,
		 allResponseHeaders : null,
		 getXmlNodes : function(tagName)
		 {
			 if( !this.responseXML )
			 	return null;
			var ele = this.responseXML.documentElement;
			return ele.getElementsByTagName(tagName);
		 },
		 getXmlNodeValue : function(tagName)
		 {
			 if( !this.responseXML )
			 	return null;
			var ele = this.responseXML.documentElement;
			var childElement = ele.getElementsByTagName(tagName)[0];
			if( childElement == null )
			    return null;
		    return ( childElement.text != undefined ) ? childElement.text : childElement.textContent;
		 },
		 getNodeValue : function(node)
		 {
		    return ( node.text != undefined ) ? node.text : node.textContent;
		 },
		 getElementById : function(id)
		 {
		    if(!this.responseXML) return null;
		    if(SongSoft.isIE) return this.responseXML.selectSingleNode('//*[@id="'+id+'"]');
		    else return this.responseXML.getElementById(id);
		 },
		 getNodeInnerHTML : function(node)
		 {
		    if(!node) return null;
		    if(SongSoft.isIE) return node.xml;
		    else return node.innerHTML;
		 },
		 getSubNodeValue : function(node,subNodeTagName)
		 {
		     if( !node )
			 	return null;
			var ele = node;
			var childElement = ele.getElementsByTagName(subNodeTagName)[0];
		    return ( childElement.text != undefined ) ? childElement.text : childElement.textContent;
		 }
	 }
 };
	
/**
*定义Ajax通信包装类
*/
if( !SongSoft.Web.Ajax )
{
	SongSoft.Web.Ajax = 
	{
		//微软XMLHTTP对象ID列表
		msXMLHTTP : ['MSXML2.XMLHTTP.5.0','MSXML2.XMLHTTP.4.0','MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP','Microsoft.XMLHTTP'],
		READY_STATE_UNINITIALIZED:0,
		READY_STATE_LOADING:1,
		READY_STATE_LOADED:2,
		READY_STATE_INTERACTIVE:3,
		READY_STATE_COMPLETE:4,
		/**
		 *向服务器提交一个Get请求
		 *@param uri {String} 要请求的服务器页面地址
		 *@param params {String} 在提交请求时需要传递的参数
		 *@param callback {Function}  当请求返回或者错误时执行的回调通知方法
		 *@param callbackArg {Object} 当调用回调方法时要向方法传递的参数
		 *@param disableCache {Boolean} 是否需要禁用浏览器请求Cache(IE浏览器会对同一uri的请求自动cache)，默认为True
		 *@return {SongSoft.Web.AjaxResponse} Ajax调用的返回结果
		 */
		get:function(uri,params,callback,callbackArg,disableCache)
		{		
			return this.request('GET',uri,params,callback,callbackArg,disableCache);
		},
		/**
		 *向服务器提交一个Post请求
		 *@param uri {String} 要请求的服务器页面地址 
		 *@param postData {String} 要提交的数据内容（以Url参数串的方式进行提交）
		 *@param callback {Function} 当请求返回或者错误时执行的回调通知方法
		 *@param callbackArg {Object} 当调用回调方法时要向方法传递的参数
		 *@return  {SongSoft.Web.AjaxResponse} Ajax调用的返回结果
		 */
		post:function(uri,postData,callback,callbackArg)
		{
			return this.request('POST',uri,postData,callback,callbackArg,false);
		},
		getCallbackResult:function(http,callbackArg,e)
		{
			var obj = new SongSoft.Web.AjaxResponse();
			if( http != null )
			{
				obj.status = http.status;
				obj.statusText = http.statusText;
				var httpStatus = http.status;
				if( httpStatus == 200 || httpStatus == 0 || httpStatus)
				{
					obj.isSuccess = true;
				}
				else            
				{
					obj.isSuccess = false;
				}
				obj.allResponseHeaders = http.getAllResponseHeaders();
				obj.responseText = http.responseText;
				obj.responseXML = http.responseXML;
			}
			else
			{
				obj.isSuccess = false;
				obj.exception = e;
			}
			if(callbackArg)
			{
				obj.callbackArgs = callbackArg;
			}
		
			return obj;
		},
		/**
		 *向服务器提交一个Get 或 Post 请求
		 *@param method {String}  Get | Post
		 *@param uri {String} 要请求的服务器页面地址
		 *@param callback {Function} 服务器返回响应或者发生错误以后要指定的回调方法
		 *@param callbackArg {Object} 在执行回调方法时需要向方法传奇的参数
		 *@param disableCache {Boolean} 是否需要防止浏览器对请求进行客户端缓存
		 *@return  {SongSoft.Web.AjaxResponse} Ajax调用的返回结果
		 */
		request:function(method,uri,params,callback,callbackArg,disableCache)
		{
			var http = null;
			try
			{			
				http = new XMLHttpRequest();		
			}
			catch(e)
			{
				for(var i=0; i<this.msXMLHTTP.length; ++i)
				{
					try
					{	
						http = new ActiveXObject(this.msXMLHTTP[i]);			
					}
					catch(e){}
				}
			}
	
			if(!http)
			{
				return null;
			}
			else
			{
				try
				{
					var oAjax = this;
					http.onreadystatechange = function()
					{
						 
						var ready = http.readyState;
						if( ready == oAjax.READY_STATE_COMPLETE)
						{
							var result = oAjax.getCallbackResult(http,callbackArg);
							callback.call(result);
						}
					}
					if( method == 'GET' )
					{
						if( params == null )
							params = '';
						if(disableCache)
						{
						  if( params.length != 0 )
							 params += "&a="+Math.random();
						  else
							 params = "a="+Math.random();
						}    				
				       
						http.open(method,uri+"?"+params,true);    
						http.send(null);                
					}
					else
					{
					   http.open(method,uri,true); 
					   http.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
					
					   http.send(params);                
					}
				}
				catch(e)
				{
				alert(e);
					var result = this.getCallbackResult(null,callbackArg,e);
					callback.call(result);
				}
			}
		},
		/**
		 *终止指定的http请求
		 *@param http {XMLHttp}要终止的http请求对象
		 */
		abort:function(http)
		{
			if(this.isCallInProgress(http))
			{
				o.conn.abort();
				this.releaseObject(o);
			}
		},
		/**
		 *判断指定的http请求是否仍然处于请求状态
		 *@param http {XMLHttp}
		 */
		isCallInProgress:function(http)
		{
			if(http){
				return http.readyState != this.READY_STATE_COMPLETE && http.readyState != this.READY_STATE_UNINITIALIZED;
			}
		},
		/**
		 *释放指定的http请求对象
		 *@param http {XMLHttp}
		 */
		releaseObject:function(http)
		{
			http = null;		
		}
	}
}