/*
* AjaxManager class
* @author: Marco Hoeck <marco.hoeck@tvi-services.de>
* @copyright	TV Information Services 2007
* @since		20.09.2007 - 10:00:00
*/

function AjaxManager()
{
	this.interval = null;
	this.requestIndex = -1;
	this.requestTimestamp = 0;
	this.requests = new Array();
	this.onLoadSuccess = null;
	var manager = null;

	if(typeof XMLHttpRequest != 'undefined')
	{
		this.httpRequest = new XMLHttpRequest();
	}
	/* IE6 */
	if(!this.httpRequest)
	{
		try
		{
			this.httpRequest  = new ActiveXObject("Msxml2.XMLHTTP");
   		}
		catch(e)
		{
			try
			{
				this.httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch(e)
			{
				this.httpRequest = null;
			}
		}
	}

	if(this.httpRequest)
	{
		manager = this;
		httpRequest = this.httpRequest;
	}

	/*
	* addRequest
	*/
	this.addRequest = function (request)
	{
		if(request.node)
		{
			request.node.className += " ajax-process";
			request.node.innerHTML = "<div> </div>";
		}
		this.requests.push(request);
	}

	/*
	* removeRequest
	*/
	this.removeRequest = function (index)
	{
		if(index < 0)
			return false;

		if(!this.requests[index])
			return false;

		this.requests.splice(index, 1);

		return true;
	}

	/*
	* trigger
	*/
	this.trigger = function ()
	{
		var now = new Date();

		if(this.requestIndex < 0)
		{
			this.sendRequest(0);
		}
		else if((now.getTime() - this.requestTimestamp) > 15000)
		{
			this.httpRequest.abort();
			this.removeRequest(this.requestIndex);
			this.sendRequest(0);
		}
	}

	/*
	* sendRequest
	*/
	this.sendRequest = function (index)
	{
		if(!this.httpRequest)
			return false;

		if(!this.requests[index])
			return false;

		if(this.requestIndex >= 0)
			return false;

		var now = new Date();
		this.requestIndex = index;
		this.requestTimestamp = now.getTime();

		var requestType = 'GET';
		var requestData = null;
		if(this.requests[index].post != null)
		{
			requestType = 'POST';
			requestData = this.requests[index].post;
		}

		var async = true;
		if(this.requests[index].async == false)
			async = false;

		var httpRequest = this.httpRequest;
		this.httpRequest.open(requestType, this.requests[index].url, async);
		this.httpRequest.onreadystatechange = function () { manager.onStateChange(httpRequest); };
		this.httpRequest.send(requestData);
		this.httpRequest.onreadystatechange = function () { manager.onStateChange(httpRequest); };
	}

	/*
	* onStateChange
	*/
	this.onStateChange = function (httpRequest)
	{
		if(httpRequest.readyState != 4)
			return;

		try
		{
			if(httpRequest.status)
				var httpStatus = httpRequest.status;
		}
		catch(e)
		{
			var httpStatus = -1;
		}

		if(httpStatus == 200)
		{
			if(manager.requests[manager.requestIndex].xmlFnc != null)
			{
				manager.requests[manager.requestIndex].xmlFnc(httpRequest.responseText, httpRequest.responseXML);
			}
			else if(manager.requests[manager.requestIndex].node != null)
			{
				manager.requests[manager.requestIndex].node.innerHTML = '<span class="ajax-scriptfix" style="display: none;">&nbsp;</span>' + httpRequest.responseText; // '<span class="ajax-scriptfix" style="display: none;">&nbsp;</span>' + 
				document.runScriptTags(manager.requests[manager.requestIndex].node);
				manager.requests[manager.requestIndex].node.removeChild(manager.requests[manager.requestIndex].node.firstChild);
			}

			if(manager.onLoadSuccess != null)
				manager.onLoadSuccess();
		}

		if(manager.requests[manager.requestIndex].node)
		{
			manager.requests[manager.requestIndex].node.className = manager.requests[manager.requestIndex].node.className.replace(/ajax-process/g, "");
		}

		manager.removeRequest(0);
		manager.requestIndex = -1;

		//httpRequest.manager.trigger(); // Opera incompatible
	}
}


/*
* AjaxRequest
*/
function AjaxRequest(node, url, post, xmlFnc, async)
{
	this.url = url;
	this.post = post;
	this.node = node;
	this.xmlFnc = xmlFnc;
	this.async = async;
}


/*
* document.runScriptTags
*/
document.runScriptTags = function(node)
{
	var scriptNodes = node.getElementsByTagName('SCRIPT');
	for(var i = 0; i < scriptNodes.length; i++)
	{
		var scriptNode = scriptNodes[i];
		var parentNode = null;
		if(scriptNode.parentNode)
			parentNode = scriptNode.parentNode;

		if(scriptNode.parentNode)
		{		     
			var replaceNode = document.createElement('SCRIPT');
			replaceNode.type = "text/javascript";
			//replaceNode.innerHTML = scriptNode.innerHTML;
			replaceNode.text = scriptNode.text;
			if(scriptNode.src)
				replaceNode.src = scriptNode.src;
			parentNode.replaceChild(replaceNode, scriptNode);

			/* teh evil code :D
			if(parentNode)
			{
				var outputNode = document.createElement('SCRIPT');
				outputNode.type = "text/javascript";
				outputNode.text = 'document.writeBufferFlush();';

				parentNode.appendChild(outputNode);
				//document.getElementsByTagName('HEAD')[0].appendChild(outputNode);

				var writeTarget = new WriteBufferTarget(parentNode, outputNode);
				writeTarget.name = parentNode.id;
				document.writeBufferTargets.push(writeTarget);
			}
			*/
		}
	}
}

// Create AjaxManager object
document.ajaxManager = new AjaxManager();
document.ajaxManager.interval = window.setInterval("document.ajaxManager.trigger();", 100);