var Ajax = {
	obj        : null,
	canProcess : true,
	httpStack  : new Array(),
	state      : ['uninitialized', 'loading', 'loaded', 'interactive', 'complete'],
	
	loadObject : function () {
		try { Ajax.obj = new ActiveXObject("Msxml2.XMLHTTP"); } 
		catch (e) 
		{
			try {Ajax.obj = new ActiveXObject("Microsoft.XMLHTTP"); } 
			catch (oc) { Ajax.obj = null; }
		}
		if(!Ajax.obj && typeof XMLHttpRequest != "undefined") 
			Ajax.obj = new XMLHttpRequest();
		
		return;
	},
	
	processResponse : function () {
		//try {
			if(typeof Ajax.httpStack[0]['waiting'] != 'undefined' && 
					  Ajax.httpStack[0]['waiting'] != null &&
					  Ajax.httpStack[0]['waiting'] != '') 
			{
				var callbackWaiting = eval(Ajax.httpStack[0]['waiting'].fn);
				if(callbackWaiting)
					callbackWaiting(Ajax.obj.readyState, Ajax.httpStack[0]['waiting'].params);
			}
			
			if (Ajax.state[Ajax.obj.readyState] != 'complete') return;
			
			if(typeof Ajax.httpStack[0]['callback'] != 'undefined' && 
					  Ajax.httpStack[0]['callback'] != null &&
					  Ajax.httpStack[0]['callback'] != '') 
			{
				var callback = null;
				if(typeof Ajax.httpStack[0]['callback'].fn == 'string')
					callback = eval(Ajax.httpStack[0]['callback'].fn);
				else
					callback = Ajax.httpStack[0]['callback'].fn;
				if(callback) {
					callback((Ajax.obj.responseXML ? Ajax.obj.responseXML.documentElement : null),
							  Ajax.obj.responseText,
							  Ajax.obj.status,
							  Ajax.httpStack[0]['callback'].params);
				}
			}
			Ajax.httpStack.shift();

			if (Ajax.httpStack.length > 0) Ajax.processNextRequest();
			else Ajax.canProcess = true;
		//}
		//catch (e) { } 
	},
	
	processNextRequest : function () {
		Ajax.loadObject();
		
		var request = Ajax.httpStack[0];
		
		Ajax.obj.onreadystatechange = Ajax.processResponse;
	
		try {
			Ajax.obj.open(request['method'], request['url'], request['async']);
			if (request['content'].length == 0) Ajax.obj.send(null);
			else {
				Ajax.obj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
				Ajax.obj.send(request['content']);
			}
		}
		catch(o) { }
	},
	
	loadXMLDoc : function (pUrl, pContent, pMethod, pCallback, pAsync, pWaiting) {
		Ajax.canProcess = false;
		
		if (!pAsync) {
			Ajax.processSyncRequest(pUrl, pContent, pMethod);
			return;
		}
	
		var request                = new Array;
		request['url']             = pUrl;
		request['content']         = pContent;
		request['method']          = pMethod;
		request['callback']        = pCallback;
		request['waiting']         = pWaiting;
		request['async']           = pAsync;
	
		Ajax.httpStack.push(request);
		if (Ajax.httpStack.length == 1) Ajax.processNextRequest();
	}
}