// JavaScript Document
function FEAjaxHandler(__root,paraObj)
{
	var _root = __root ;
	var _this = this ;//指向本类的指针
	this.send = _send ;//进行异步申请
/*
###cross-browser
默认最大线程数要根据浏览器版本进行判断
cross-browser###
*/
/*
###advice
应该将form结合进来
advice###
*/
	var _threadMaxCount = 2 ;
	var _threadCount = 0 ;
	var _threadArray = new Array() ;
	var _requestIndex = 0 ;
	//alert(_root.toString())
	var _baseUrlKeyPool = _root.getOtherHandler().getDictionary() ;
	var _requestPool = _root.getOtherHandler().getDictionary();
	//alert()

	function _send( _sendStr , _baseUrlKey , _url , _callbackfunc , _para , _flag )
	{
		var sendStr , baseUrlKey , url , callbackfunc , para , flag ;
		sendStr = _root.getOtherHandler().getVar( _sendStr , "" ) ;
		baseUrlKey = _root.getOtherHandler().getVar( _baseUrlKey , "" ) ;
		url = _root.getOtherHandler().getVar( _url , "" ) ;
		callbackfunc = _root.getOtherHandler().getVar( _callbackfunc , null ) ;
		para = _root.getOtherHandler().getVar( _para , "" ) ;
		flag = _root.getOtherHandler().getVar( _flag , false ) ;
		
		if( ( typeof url ) != "undefined" || arguments.length < 3 )
		{
			flag = 	para ;
			para = callbackfunc ;
			callbackfunc = url ;
			url = baseUrlKey ;
			baseUrlKey = "" ;
		}
		
		if( _threadCount < _threadMaxCount )
		{
			_threadCount++ ;
			sendAction( sendStr , baseUrlKey , url , callbackfunc , para , flag );
			return ;
		}
	
		var requestObj = new Object();
		requestObj.sendStr = sendStr ;
		requestObj.baseUrlKey = baseUrlKey ;
		requestObj.url = url ;
		requestObj.callbackfunc = callbackfunc ;
		requestObj.para = para ;
		requestObj.flag = flag ;
		_threadArray[ _threadArray.length ] = requestObj ;
	}

	function endAction()
	{
		_threadCount-- ;
		if( _threadArray.length == 0  )
		{
			return ;	
		}
		var requestObj = _threadArray.pop() ;
		var sendStr = requestObj.sendStr ;
		var baseUrlKey = requestObj.baseUrlKey ;
		var url = requestObj.url ;
		var callbackfunc = requestObj.callbackfunc ;
		var para = requestObj.para ;
		var flag = requestObj.flag ;
		requestObj = null ;
		_threadCount++ ;
		sendAction( sendStr , baseUrlKey , url , callbackfunc , para , flag ) ;
	}

	function sendAction( _sendStr , _baseUrlKey , _url , _callbackfunc , _para , _flag )
	{
/*
进行申请
其中,_sendStr是所申请的数据,url是地址
_callbackfunc是用户指明的回调函数的指针,para是伴随申请传入的参数,可以是任何类型的数据.建议定为字典对象.此参数将返回给回调函数
flag参数指明了是否强制重新从服务器上获取.如果不指明或为false,则对于静态文件,将从浏览器的缓存里获取
*/
		var f = false ;
		if( ( typeof flag ) != "undefined" )
		{
//查看是否指明flag参数,如果未指定则使用默认值false
			f = flag ;
		}
		setTimeout( preAction , 10 ) ;
		function preAction()
		{
			_root.addDeBugMsg( _sendStr )
			var hrefBaseUrl = "" ;
			if( _baseUrlKey != null && _baseUrlKey.trim() != "" )
			{
				hrefBaseUrl = getBaseUrlByKey( _baseUrlKey ) ;
			}
			getBaseUrlByKey( _baseUrlKey )
//调用requestDataByAsync函数,开始申请
			requestDataByAsync( hrefBaseUrl + _url , _sendStr , mainAction ,f )

			function mainAction( _str , _state )
			{
//申请完成,开始处理后续工作
//_str是申请所得到的字符串数据,_state是申请状态,200为正常,否则为不正常
				_root.addDeBugMsg( _str )
				
				var newKey = addRequestToPool( _sendStr , _url , _para , _flag , _str , _state )
				if( ( typeof _callbackfunc ) != "undefined" )
				{
//进行回调,返还申请得到的_str和_state,以及随着此次申请而来的参数para
					_callbackfunc( _str , _state , _para , newKey )
				}
				endAction()
			}
		}
	}

	
	function requestDataByAsync( _url , _sData , _callbackfunc , _async )
	{
/*发起异步申请的函数*/
/*url是所申请的地址*/
/*sData是所申请的数据.值得一提的是,如果这个数据为空字符串,则将发起GET请求,否则将发起POST请求,请求中所递交的数据即为sData*/
/*_callbackfunc是申请结束时的回调函数指针.
在回调的时候,将自动传入 _str , _state 这两个参数.
_str代表请求结果返回的字符串数据,_state代表请求结果的状态*/
/*_async是指明是否强制重新从服务器申请数据,而不使用缓存*/
/*本函数并无返回值,将调用_callbackfunc函数指针完成回调的工作*/
/*需要注意的是,发送时,将发送escape函数处理之后的代码*/
		var _str , _state ;
		var _tFlag = false ;
		var theTemp = "?temp=" + Math.random()
		if( ( typeof _async ) != "undefined" )
		{
			_tFlag = _async ;
		}
		var xmlDoc = _root.getOtherHandler().getXMLHTTP() ;
		//alert( typeof xmlDoc.setRequestHeader )
		xmlDoc.abort() ;
		if( _sData == "" )
		{
//如果数据为空字符串,则将发起GET请求
			xmlDoc.open( "GET" , _url , true );
			xmlDoc.onreadystatechange = _requestDataByAsync ;//指定onreadystatechange事件
			if( _tFlag )
			{
//如果指明强制重新从服务器获取
				xmlDoc.setRequestHeader("Cache-Control","no-cache"); 
				xmlDoc.setRequestHeader("If-Modified-Since","0");
			}
			xmlDoc.send() ;		
		}
		else
		{
//如果数据不为空字符串,则将发起POST请求
			xmlDoc.open( "POST", url , true );
			xmlDoc.onreadystatechange = _requestDataByAsync ;//指定onreadystatechange事件
	
			xmlDoc.setRequestHeader("Content-Length",  sData.length );  
			xmlDoc.setRequestHeader("CONTENT-TYPE","application/x-www-form-urlencoded");
			if( _tFlag )
			{
//如果指明强制重新从服务器获取
				xmlDoc.setRequestHeader("Cache-Control","no-cache"); 
				xmlDoc.setRequestHeader("If-Modified-Since","0");
			}
			
			xmlDoc.send( sData ) ;
		
		}
	
		function _requestDataByAsync()
		{
//异步请求完成,服务器返回了结果
			if( xmlDoc == null )
			{
				return ;
			}
			try
			{
				var a = xmlDoc.readyState ;
			}catch(e){return ;}
			if( xmlDoc.readyState != 4 )
			{ 
				return ;
			}
			try{
				_state = xmlDoc.status ;
				if( _state == 200 )
				{
//如果结果状态正常
					if( xmlDoc.responseXML.parseError.errorCode == 0 && xmlDoc.responseXML.xml != "" )
					{
						_str = xmlDoc.responseXML.xml ;
					}
					else
					{
						_str = xmlDoc.responseText ;
					}
				}
				else
				{
//如果结果状态不正常
					_str = bytes2BSTR( xmlDoc.responseBody ) ;
				}

			}catch(e){return ;}
			
			xmlDoc = null ;
			if( ( typeof _callbackfunc ) == "function" )
			{
//开始回调
				_callbackfunc( _str , _state ) ;
			}
			return ;
		}
	}
	
	function getBaseUrlByKey( key )
	{
		if( key == null || key.trim() == "" )
		{
			return "";
		}
		if( _baseUrlKeyPool.Exists( key ) )
		{
			return "" ;	
		}
		return _baseUrlKeyPool.Item( key ) ;
	}
	
	function addRequestToPool( _sendStr , _url , _para , _flag ,  _str , _state )
	{
/*
将请求的条件和结果加入到池
待完成
*/
//向_requestPool填充内容
		return "AjaxRequest_" + ( _requestIndex++ ) ;
	}
}