//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//	Title			: Asynchronous Javascript And XML
//	Project			: Apothysis
//	Date Created	: 21 - Feb - 2006
//  Last Updated	: 18 - Jan - 2007
//	Programmer		: Horizon
//	Brief			: Rapid Dynamic Web Page Retreval Script.
//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

//alert("Javascript - AJAX Class Loaded ...");

var http1 = createRequestObject();
var http2 = createRequestObject();

var dynamicArea1 = "";
var dynamicArea2 = "";

var url1 = "";
var url2 = "";

var params1 = "";
var params2 = "";

//-------------------------------------
// - Create RequestObject Function - ||
//-------------------------------------
function createRequestObject()
{
	var request_o;
	
	try
  	{
  		// Firefox, Opera 8.0+, Safari
  		request_o = new XMLHttpRequest();
  	}
	catch (e)
  	{
  		// Internet Explorer
  		try
    	{
    		request_o = new ActiveXObject("Msxml2.XMLHTTP");
    	}
  		catch (e)
    	{
    		request_o = new ActiveXObject("Microsoft.XMLHTTP");
    	}
  	}

	return request_o;
	
	/*
	// Native XMLHttpRequest object	
	if (window.XMLHttpRequest)
	{
		request_o = new XMLHttpRequest();
	}
	
	//IE/Windows ActiveX version
	else if (window.ActiveXObject)
	{
		request_o = new ActiveXObject("Microsoft.XMLHTTP");
	}*/	
}

//-----------------------------
// - Get Updates Functions - ||
//-----------------------------
function getUpdates1()
{
	//alert("Executing getUpdates1"+"\nQueue :"+ajax_queue.count());
	dateVar1 = new Date();
	http1.open('get',url1+'?datetostopcache='+dateVar1+params1);
	http1.onreadystatechange = handleUpdates1;
	http1.send(null);
}
function getUpdates2()
{
	//alert("Executing getUpdates2"+"\nQueue :"+ajax_queue.count());
	dateVar2 = new Date();
	http2.open('get',url2+'?datetostopcache='+dateVar2+params2);
	http2.onreadystatechange = handleUpdates2;
	http2.send(null);
}
//--------------------------------
// - Handle Updates Functions - ||
//--------------------------------
function handleUpdates1()
{
	//alert("Executing handleUpdates1 : http1.readyState = " + http1.readyState+"\nQueue :"+ajax_queue.count());
	if(http1.readyState == 4 || http1.readyState == "complete")
	{
		var response1 = http1.responseText;
		if(response1 != "" && dynamicArea1 != "")
		{
			document.getElementById(dynamicArea1).innerHTML = response1;
		}
	}
}
function handleUpdates2()
{
	//alert("Executing handleUpdates2 : http2.readyState = " + http2.readyState+"\nQueue :"+ajax_queue.count());
	if(http2.readyState == 4 || http2.readyState == "complete")
	{
		var response2 = http2.responseText;
		if(response2 != "" && dynamicArea2 != "")
		{
			document.getElementById(dynamicArea2).innerHTML = response2;
		}
	}
}

//------------------------------------------------------------
// - Main function to call, starts of entire AJAX process - ||
//------------------------------------------------------------
function getPage1(dynamicArea1In, url1In, params1In)
{
	//alert("Executing getPage1 \n"+dynamicArea1In+"\n"+url1In+"\n"+params1In+"\nQueue :"+ajax_queue.count());
	dynamicArea1 = dynamicArea1In;
	url1 = url1In;
	params1 = params1In;
	getUpdates1();	
}
function getPage2(dynamicArea2In, url2In, params2In)
{
	//alert("Executing getPage2 \n"+dynamicArea2In+"\n"+url2In+"\n"+params2In+"\nQueue :"+ajax_queue.count());
	dynamicArea2 = dynamicArea2In;
	url2 = url2In;
	params2 = params2In;
	getUpdates2();
}

// Create AJAX Queue.
ajax_queue = new Queue();

// Function call to ask for a page.
function queuePage(dynamicAreaIn, urlIn, paramsIn)
{
	// Add data to queue
	//alert("Adding new Page Request into AJAX engine ...\n"+dynamicAreaIn+"\n"+urlIn+"\n"+paramsIn+"\nQueue :"+ajax_queue.count());
	_temp = new Array();
	_temp[0] = dynamicAreaIn;
	_temp[1] = urlIn;
	_temp[2] = paramsIn;
	
	ajax_queue.push(_temp);
	
	//alert("Status 1 : " + http1.readyState +"\n Status 2 : "+ http2.readyState+"\nQueue :"+ajax_queue.count());
}

// Check AJAX Queue for Processing.
function processQueue()
{
	//Check to see if there is anythign in the queue.
	queueLength = ajax_queue.count();
	
	if(queueLength > 0)
	{
		//alert("Checking AJAX Channels ..."+"\nQueue :"+ajax_queue.count());
		// Check to see if channel 1 is busy
		if(http1.readyState == 4 || http1.readyState == 0 || http1.readyState == "complete")
		{
			// Pop array and pass onto http1
			_temp = ajax_queue.get();
			//alert("Processing Page Request in AJAX engine : Channel 01 ...\n"+_temp[0]+"\n"+_temp[1]+"\n"+_temp[2]+"\nQueue :"+ajax_queue.count());
			getPage1(_temp[0],_temp[1],_temp[2]);
			ajax_queue.pop();
		}
		// Check to see if channel 2 is busy
		else if(http2.readyState == 4 || http2.readyState == 0 || http2.readyState == "complete")
		{
			// Pop array and pass onto http2
			_temp = ajax_queue.get();
			//alert("Processing Page Request in AJAX engine : Channel 02 ...\n"+_temp[0]+"\n"+_temp[1]+"\n"+_temp[2]+"\nQueue :"+ajax_queue.count());			
			getPage2(_temp[0],_temp[1],_temp[2]);
			ajax_queue.pop();
		}
		else
		{
			// Do Nothing ...
		}
	}
}

// Class Queue
function Queue()
{
	this.data = new Array();
	
	this.push = function(strIn)
	{
		this.data[this.data.length] = strIn;
	}
	
	this.pop = function()
	{
		td = this.data[0];
		
		for(i = 0; i<(this.data.length-1); i++)
		{
			this.data[i] = this.data[i+1];
		}
		this.data[this.data.length-1] == null;
		this.data.pop();
		return td;
	}
	
	this.get = function()
	{
		return this.data[0];
	}
	
	this.count = function()
	{
		return this.data.length;
	}		
}

window.setInterval("processQueue()", 1);
