/**
 *@version:1.1
 *@lastModified:2008-04-25
 *@author:zhangweiit@yahoo.com
 */

function ETRequest()
{
	//following variables set with arguments
	var mUrl = '';
	var mMethod = 'get';
	var mPostData = null;
	var mAsync = true;
	var mTimeout = 3000;
	var mTimeoutHandler = null;
	var mResponseHandler = null;
	var mParamResponseHandler = null;
	var mTextResponseHandler = null;
	var mXmlResponseHandler = null;
	var mRequest = null;
	var mTimer = null;
	var mRequesting = false;
	var mNeedTimeStamp = true;

	this.setAsync = _setAsync;
	this.getAsync = _getAsync;
	this.setTimeout = _setTimeout;
	this.getTimeout = _getTimeout;
	this.setResponseHandler = _setResponseHandler;
	this.getResponseHandler = _getResponseHandler;
	this.setParamResponseHandler = _setParamResponseHandler;
	this.getParamResponseHandler = _getParamResponseHandler;
	this.setTextResponseHandler = _setTextResponseHandler;
	this.getTextResponseHandler = _getTextResponseHandler;
	this.setXmlResponseHandler = _setXmlResponseHandler;
	this.getXmlResponseHandler = _getXmlResponseHandler;
	this.setTimeoutHandler = _setTimeoutHandler;
	this.getTimeoutHandler = _getTimeoutHandler;
	this.setNeedTimeStamp = _setNeedTimeStamp;
	this.getNeedTimeStamp = _getNeedTimeStamp;
	this.setUrl = _setUrl;
	this.getUrl = _getUrl;
	this.setMethod = _setMethod;
	this.getMethod = _getMethod;
	this.setPostData = _setPostData;
	this.getPostData = _getPostData;
	this.isRequesting = _isRequesting;
	this.getRequest = _getRequest;
	this.start = _start;
	this.stop =_stop;

	function _addTimeStamp(aUrl)
	{
		var ret = aUrl;
		var date = new Date();
		var timestamp = date.getTime();
		if(ret.indexOf('?') == -1)
		{
			ret += '?timestamp=' + timestamp;
		}
		else
		{
			ret += '&timestamp=' + timestamp;
		}
		return ret;
	}

	function _createXHRequest()
	{
		var request = null;
		if(window.XMLHttpRequest)
		{
			request = new XMLHttpRequest();
		}
		else if(window.ActiveXObject)
		{
			request = new ActiveXObject('Microsoft.XMLHTTP');
		}
		else
		{
			window.status = 'we are sorry , but your browse does not support XMLHttpRequest';
			return null;
		}
		return request;
	}

	function _start()
	{
		mRequesting = true;
		if(!mRequest)
		{
			mRequest = _createXHRequest();
		}
		if(mTimeout > 0 && mTimeoutHandler && (typeof mTimeoutHandler == 'function'))
		{
			mTimer = window.setTimeout
					(function()
					 { 
						_stop(); 
						try{
							mTimeoutHandler(mUrl); 
						}catch(err){
							window.status = err;
						}
					 }
					 , mTimeout
					);
		}

		try
		{
			mRequest.onreadystatechange = _onStateChange;
			var url = mUrl;
			if(mNeedTimeStamp)
			{
				url = _addTimeStamp(mUrl);
			}
			if('undefined' != typeof ET_API_KEY){
				url = url + '&et_api_key=' + ET_API_KEY;
			}
			mRequest.open(mMethod, url, mAsync);
			if(mMethod.toLowerCase() == 'post')
			{
				mRequest.setRequestHeader('content-type',	
					'application/x-www-form-urlencoded;charset=utf-8;');
			}
			mRequest.send(mPostData);
		}
		catch(err)
		{
			window.status = err.message;
		}
	}

	function _stop()
	{
		if(mRequest && (mRequest != 'undefined'))
		{
			mRequest.abort();
		}
		clearTimeout(mTimer);
		mTimer = null;
		mRequesting = false;
	}

	function _onStateChange()
	{
		try
		{
			if(!mRequest)
			{
				return;
			}

			if(mRequest.readyState != 4){
				return;
			}

			if(mRequest.status != 200){
				return;
			}	
			clearTimeout(mTimer);
			mTimer = null;
			try{
				if(mResponseHandler && (typeof mResponseHandler == 'function')){
					mResponseHandler(mRequest);
				}else if(mParamResponseHandler && (typeof mParamResponseHandler == 'function')){
					
					var responseText = mRequest.responseText + '';
					if(responseText.indexOf('{') != 0){
						mParamResponseHandler(null,null);
					}else{
						
						var msgObj = et_eval(responseText);
						
						if(typeof msgObj.param != 'undefined' && typeof msgObj.result != 'undefined'){
							
							var paramObj = msgObj.param;
							if(typeof msgObj.param != 'object'){
								paramObj = et_param_csv2obj(msgObj.param);
							}
							
							mParamResponseHandler(msgObj.entity,msgObj.method,paramObj,msgObj.result);
							//et_trace(paramObj.csv);
						}
					}
					
				}else if(mTextResponseHandler && (typeof mTextResponseHandler == 'function')){
					mTextResponseHandler(mRequest.responseText);

				}else if(mXmlResponseHandler && (typeof mXmlResponseHandler == 'function')){
					mXmlResponseHandler(mRequest.responseXml);
				}
			}catch(err){
				window.status = err;
			}
			mRequesting = false;
			mRequest.abort();
				//et_trace('ok');
			
		}
		catch(err)
		{
			window.status = err.message;
		}
	}

	function _getRequest()
	{
		return mRequest;
	}

	function _isRequesting()
	{
		return mRequesting;
	}

	function _setAsync(aAsync)
	{
		mAsync = aAsync;
	}

	function _getAsync()
	{
		return mAsync;
	}

	function _setTimeout(aTimeout)
	{
		mTimeout = aTimeout;
	}

	function _getTimeout()
	{
		return mTimeout;
	}

	function _setResponseHandler(aResponseHandler)
	{
		mResponseHandler = aResponseHandler;
	}

	function _getResponseHandler()
	{
		return mResponseHandler;
	}

	function _setParamResponseHandler(aResponseHandler)
	{
		mParamResponseHandler = aResponseHandler;
	}

	function _getParamResponseHandler()
	{
		return mParamResponseHandler;
	}

	function _setTextResponseHandler(aResponseHandler)
	{
		mTextResponseHandler = aResponseHandler;
	}

	function _getTextResponseHandler()
	{
		return mTextResponseHandler;
	}

	function _setXmlResponseHandler(aResponseHandler)
	{
		mXmlResponseHandler = aResponseHandler;
	}

	function _getXmlResponseHandler()
	{
		return mXmlResponseHandler;
	}

	function _setTimeoutHandler(aTimeoutHandler)
	{
		mTimeoutHandler = aTimeoutHandler;
	}

	function _getTimeoutHandler()
	{
		return mTimeoutHandler;
	}

	function _setNeedTimeStamp(aNeedTimeStamp)
	{
		mNeedTimeStamp = aNeedTimeStamp;
	}

	function _getNeedTimeStamp()
	{
		return mNeedTimeStamp;
	}

	function _setUrl(aUrl)
	{
		mUrl = aUrl;
	}

	function _getUrl()
	{
		return mUrl;
	}

	function _setMethod(aMethod)
	{
		mMethod = aMethod;
	}

	function _getMethod()
	{
		return mMethod;
	}

	function _setPostData(aPostData)
	{
		mPostData = aPostData;
	}

	function _getPostData()
	{
		return mPostData;
	}

	function _setResponseHandler(aResponseHandler)
	{
		mResponseHandler = aResponseHandler;
	}

	function _getResponseHandler()
	{
		return mResponseHandler;
	}
}

var et_request_js = 1;