////////////////////////////////////////////////////////////////////////
// maxAjaxManager v2.0.2
// 2006-12-25 11:31:35
// SiC
////////////////////////////////////////////////////////////////////////
var maxAjaxManager = {};

// error object array
// {"code": 0, "text": "reason"}
maxAjaxManager.error = {};

// xmlhttp object array
maxAjaxManager.xmlhttp = {};

// callback function array
maxAjaxManager.callback = {};

// status array
// {"code": 0, "text": "reason"}
maxAjaxManager.status = {};

// result data array
maxAjaxManager.result = {};


//----------------------------------------------------------
// Create a XMLHTTP object
//----------------------------------------------------------
maxAjaxManager.createXMLHTTP = function(id){

	var objXMLHTTP;

	try{

		if(window.XMLHttpRequest){
			objXMLHTTP = new XMLHttpRequest();
		}else{
			objXMLHTTP = new ActiveXObject("Microsoft.XMLHTTP");
		}

	}catch(e){

		if(id){
			maxAjaxManager.error[id] = {
				"code": e.number,
				"text": e.description
			};
		}

		return null;

	}

	return objXMLHTTP;

}


//----------------------------------------------------------
// Short Wrapper for maxAjaxManager.call()
//----------------------------------------------------------
maxAjaxManager.get = function(id, url, callBackFunc, arrParams){
	return maxAjaxManager.call(id, "get", url, callBackFunc, arrParams);
}

maxAjaxManager.post = function(id, url, callBackFunc, requestString, arrParams){

	if(!arrParams) arrParams = {};
	arrParams["requestString"] = requestString;

	return maxAjaxManager.call(id, "post", url, callBackFunc, arrParams);

}


//----------------------------------------------------------
// Make a call with XMLHTTP
//----------------------------------------------------------
// [id] string : ID for indentifying this call when callback
// [callMethod] string : "get" or "post"
// [url] string : target url of this call
// [callBackFunc] function : the callback function handle
//		callBackFunc(id, isSuccess, status, statusText) parameters
//				"id" string: ID of this call
//				"isSuccess" bool: success or not
// [arrParams] object (optional) : an object contains extra parameters
//		"async" bool : whether this is a asynchronous call(default is true)
//		"requestHeaders" array : an Array of custom headers for this call
//		"requestString" string : "POST" method only, the request content sent to remote server
//		"responseType" string : response content mode(default is 0)
//				"text" - plain text
//				"xml" - xml (XMLHTTP will automatically parse and convert the content into Unicode)
//				"stream" - raw text stream (if you want to get the raw data for XMLDOM etc.)
//----------------------------------------------------------
maxAjaxManager.call = function(id, callMethod, url, callBackFunc, arrParams){

	// check parameters
	if(!arrParams) arrParams = {};
	if(!callMethod) callMethod = "GET";
	if(!arrParams['async']) arrParams['async'] = true;
	if(!arrParams['responseType']) arrParams['responseType'] = 0;
	if(!arrParams['requestString']) arrParams['requestString'] = '';

	if( (callMethod != "post") || (callMethod == "post" && arrParams['requestString'] == '') ){
		callMethod = "get";
	}

	// create xmlhttp obj
	if(!maxAjaxManager.xmlhttp[id]){
		maxAjaxManager.xmlhttp[id] = maxAjaxManager.createXMLHTTP(id);
		if(!maxAjaxManager.xmlhttp[id]) return false;
	}

	// store callback function handle
	maxAjaxManager.callback[id] = callBackFunc;

	// attach event for callback function
	maxAjaxManager.xmlhttp[id].onreadystatechange = function(){ return maxAjaxManager.checkState(id, arrParams['responseType']); };

	// set request headers if given
	if(arrParams['requestHeaders']){
		for(var i=0; i<arrParams['requestHeaders'].length; i++){
			maxAjaxManager.xmlhttp[id].setRequestHeader(arrParams['requestHeaders'][i][0], arrParams['requestHeaders'][i][1]);
		}
	}

	// make the call
	try{
		maxAjaxManager.xmlhttp[id].open(callMethod, url, arrParams['async']);
		maxAjaxManager.xmlhttp[id].send(arrParams['requestString']);
	}catch(e){
		maxAjaxManager.error[id] = {
			"code": e.number,
			"text": e.description
		};
		return false;
	}

	return true;

}


//----------------------------------------------------------
// Check XMLHTTP call state
//----------------------------------------------------------
maxAjaxManager.checkState = function(id, responseType){

	// check if done
	if(maxAjaxManager.xmlhttp[id].readyState!=4) return;

	// store result into array
	if(responseType == "xml"){
		maxAjaxManager.result[id] = maxAjaxManager.xmlhttp[id].responseXML.xml;
	}else if(responseType == "stream"){
		maxAjaxManager.result[id] = maxAjaxManager.xmlhttp[id].responseStream;
	}else{
		maxAjaxManager.result[id] = maxAjaxManager.xmlhttp[id].responseText;
	}

	// store status
	maxAjaxManager.status[id] = {
		"code": maxAjaxManager.xmlhttp[id].status,
		"text": maxAjaxManager.xmlhttp[id].statusText
	}

	// do the callback
	maxAjaxManager.callback[id](id, (maxAjaxManager.xmlhttp[id].status == 200 ? true : false));

	// clean up
	maxAjaxManager.xmlhttp[id].onreadystatechange = function(){};
	maxAjaxManager.xmlhttp[id] = null;
	maxAjaxManager.callback[id] = null;

}


//----------------------------------------------------------
// Dispose the data
//----------------------------------------------------------
maxAjaxManager.dispose = function(id){

	try{

		maxAjaxManager.xmlhttp[id].abort();
		maxAjaxManager.xmlhttp[id].onreadystatechange = function(){};
		maxAjaxManager.xmlhttp[id] = null;

		maxAjaxManager.callback[id] = null;

		maxAjaxManager.result[id] = null;

		maxAjaxManager.error[id] = null;

		maxAjaxManager.status[id] = null;

	}catch(e){}

}


//----------------------------------------------------------
// Clean up handles to avoid leak
//----------------------------------------------------------
maxAjaxManager.cleanUp = function(){

	try{

		for(var id in maxAjaxManager.xmlhttp){
			maxAjaxManager.xmlhttp[id].abort();
			maxAjaxManager.xmlhttp[id].onreadystatechange = function(){};
			maxAjaxManager.xmlhttp[id] = null;
		}

		for(var id in maxAjaxManager.callback){
			maxAjaxManager.callback[id] = null;
		}

		for(var id in maxAjaxManager.result){
			maxAjaxManager.result[id] = null;
		}

		for(var id in maxAjaxManager.error){
			maxAjaxManager.error[id] = null;
		}

		for(var id in maxAjaxManager.status){
			maxAjaxManager.status[id] = null;
		}

	}catch(e){}

}

//----------------------------------------------------------
// Avoid Memory leak
//----------------------------------------------------------
if(window.attachEvent){
	window.attachEvent("onunload", maxAjaxManager.cleanUp);
}else{
	window.addEventListener("unload", maxAjaxManager.cleanUp, false);
}
