var m_iMaxCalls = 1024;
var m_aoCalls   = new Array();
var m_iLastCall = 0;

function fnLoadComplete( iIndex )
{
	if ( iIndex == null ) return;

	var oCall = m_aoCalls[ iIndex ];
	try
	{
		var iReadyState = oCall.oXml.readyState;
	}
	catch(e)
	{
		return;
	}

    if (iReadyState != 4) return;

	if (oCall.oXml.status != 200)
	{
        //alert('There was a problem with the request: Status=' + oCall.oXml.status);
		return;
	}

    var xmldoc    = oCall.oXml.responseXML;
    var root_node = xmldoc.getElementsByTagName(oCall.node + 's');
    var cells     = new Array();
    var nid, nis;

    cells = xmldoc.getElementsByTagName(oCall.node);

    for (i=0; i< cells.length; i++)
	{
		nid = cells[i].getAttribute('\Id');
		nis = cells[i].getAttribute('\Status');
//        alert(nid + ", " + nis);
		if (nid != '' && nis != '') Function( oCall.handler + '(\'' + nid + '\',\'' + nis + '\');' ).call();
	}

	if (oCall.timeOut)
	{
		if (window.ActiveXObject)
		{
			oCall.oXml = null;
		}
		oCall.timeOutID = window.setTimeout("repeatCall( " + iIndex + " );", oCall.timeOut);
	}
	else
	{
		fnDeAllocCall(iIndex);
	}
	return;
}

function fnAllocCall()
{
	var iReturn = null;
	for (var i = 0; i < m_iMaxCalls && m_aoCalls[m_iLastCall] != null; i++)
	{
		m_iLastCall = (m_iLastCall + 1) % m_iMaxCalls;
	}
	if (i < m_iMaxCalls) iReturn = m_iLastCall;
	return iReturn;
}

function fnDeAllocCall( iCallIdx )
{
    m_aoCalls[iCallIdx] = null;
}


function GetXML( strXMLSrc , handler, node, timeOut )
{
	var iCall = fnAllocCall();

	var objXMLDoc = false;

	if (window.XMLHttpRequest)
	{
		objXMLDoc = new XMLHttpRequest();
		if (objXMLDoc.overrideMimeType) objXMLDoc.overrideMimeType('text/xml');
	}
	else if (window.ActiveXObject)
	{
		try
		{
			objXMLDoc = new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch(e){}
	}

	if (!objXMLDoc)
	{
		alert('Cannot create an XMLHTTP instance');
		return false;
	}

	m_aoCalls[iCall] = new CallObject( objXMLDoc, handler, node, strXMLSrc, timeOut, 0 );

	objXMLDoc.onreadystatechange = function() { fnLoadComplete(iCall); };

	objXMLDoc.open('GET', strXMLSrc, true);
	objXMLDoc.send(null);
	return iCall;
}

function repeatCall ( iIndex )
{
	if( iIndex == null ) return;
	var oCall = m_aoCalls[ iIndex ];

	if (window.ActiveXObject)
	{
		try
		{
			oCall.oXml = new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch (e) { }
	}

	if (!oCall.oXml)
	{
		alert('Cannot reuse an XMLHTTP instance');
		return false;
	}

	oCall.oXml.onreadystatechange = function() { fnLoadComplete(iIndex); };
	oCall.oXml.open('GET', oCall.strXMLSrc, true);
	oCall.oXml.send(null);

	return iIndex;
}

function changeSpeed ( iIndex, Speed )
{
	if( iIndex == null ) return;
	var oCall = m_aoCalls[ iIndex ];
	try
	{
		oCall.timeOut = Speed;
		if (oCall.timeOutID)
		{
			window.clearTimeout(oCall.timeOutID);
			oCall.timeOutID = window.setTimeout("repeatCall( " + iIndex + " );", oCall.timeOut);
		}
	}
	catch(e)
	{
		
	}
	return iIndex;
}


function CallObject( oXml, handler, node, strXMLSrc, timeOut, timeOutID )
{
    this.oXml = oXml;
    this.handler = handler;
    this.node = node;
    this.strXMLSrc = strXMLSrc;
    this.timeOut = timeOut;
    this.timeOutID = timeOutID;
}

