var isIE = (document.getElementById && document.all)?true:false;
var isNS4 = (document.layers)?true:false;
var isNS6 = (document.getElementById && !document.all)?true:false;
function myGetElementById (id)
{
    if ( isIE )
    {
	var str = "document.all('" + id + "')";
	var o = eval(str);
	return o;
    }

    return document.getElementById(id);
}

function createRequestObject() {
    var ro;
    var browser = navigator.appName;
    if(browser == "Microsoft Internet Explorer"){
        ro = new ActiveXObject("Microsoft.XMLHTTP");
    }else{
        ro = new XMLHttpRequest();
    }
    return ro;
}

var requestId = new Array();
var readyStateStr = new Array (
    "uninitialized (0)",
    "loading (1)",
    "loaded (2)",
    "interactive (3)",
    "complete (4)"
);


/* debug text */
function debug (str)
{
    var obj = myGetElementById('debug');
    if ( obj )
	obj.innerHTML = str;
}

/* make loading label visible */
function showLoading ()
{
    var obj = myGetElementById('loading');
    if ( obj )
	obj.style.visibility = 'visible';
}

/* make loading label hidden */
function hideLoading ()
{
    var obj = myGetElementById('loading');
    if ( obj )
	obj.style.visibility = 'hidden';
    hideLoadingStatus();
}

function showLoadingStatus ()
{
    var obj = myGetElementById('loadingStatus');
    if ( obj )
    {
	obj.style.visibility = 'visible';
	obj.style.display = 'block';
    }
}

function hideLoadingStatus ()
{
    var obj = myGetElementById('loadingStatus');
    if ( obj )
    {
	obj.style.visibility = 'hidden';
	obj.style.display = 'none';
    }
}

/* make loading visible or hidden based on any activity */
function updateLoading ()
{
    for (var i = 0; i < requestId.length; i++ )
    {
	if ( requestId[i] )
	{
	    showLoading();
	    return;
	}
    }
    hideLoading();
}

/* set loading status text (which also makes it visible) */
function setLoadingStatus (text, append)
{
    var obj = myGetElementById('loadingStatus');

    if ( obj )
    {
	// memory saver
	if (obj.innerHTML.length > 8192) append = 0;

	if ( append )
	    obj.innerHTML += (text + "<BR>");
	else
	    obj.innerHTML = (text + "<BR>");

//        if ( obj.style.visibility != "visible" )
//	    obj.style.visibility = 'visible'; 
    }
}

function getRequestSlot ()
{
    var slot = -1;
    var xmlhttp = createRequestObject();

    if ( ! xmlhttp )
	return -1;

    for (var i = 0; i < requestId.length; i++ )
    {
	if ( requestId[i] == null )
	{
	    slot = i;
	    break;
	}
    }

    if ( slot == -1 ) 
	slot = i;

    requestId[slot] = xmlhttp;

    return slot;
}

function freeRequestSlot (slot, abort)
{
    if ( abort && requestId[slot] )
    {
	setLoadingStatus ("Aborting request in slot " + slot, 1);
	requestId[slot].abort();	// abort any pending requests
    }

    requestId[slot] = null;

    var active = new Array();
    for (var i = 0; i < requestId.length; i++ )
	if ( requestId[i] != null )
	    active.push(i);

    setLoadingStatus ("Freed slot " + slot + ", active = " + active.join (', ') , 1);
    updateLoading();
}

var sndActive = new Object();

function sndReq (targetId, url, callback, arg, arg2, arg3)
{
    var slot;

    // don't allow two sends for the same targetId
    if ( sndActive[targetId] )
    {
	setLoadingStatus ("Already loading into " + targetId + ": " + sndActive[targetId], 1);
	return;
    }

    if ( (slot = getRequestSlot()) == -1 )
    {
	alert ("XMLHttpRequest Error");
	return;
    }

    sndActive[targetId] = url;
    setLoadingStatus ("Loading " + slot + " into " + targetId + ": " + url, 1);
    updateLoading ();

    requestId[slot].onreadystatechange =
	function (e) { handleResponse(e, slot, targetId, callback, arg, arg2, arg3); };

    try { requestId[slot].open('get', url, true); }
    catch (e) { alert (e); freeRequestSlot (slot); return; }

    requestId[slot].send(null);
}

function postReq (targetId, url, form)
{
    var slot;

    var queryString = "";
    var str = "";
    for ( var i = 0; i < form.elements.length; i++ )
    {
	if ( form.elements[i].type == "reset"
	    || form.elements[i].type == "submit"
	    || form.elements[i].type == "button" )
	{
	    continue;
	}

	/*
	str += "element["+i+"]="
	    + form.elements[i].name
	    + "/" + form.elements[i].type
	    + "/" + form.elements[i].value
	    + "\n";
	*/

	queryString += escape(form.elements[i].name) + "=" + escape(form.elements[i].value) + "&";
    }
    /*
    alert ("url=" + url + "; form=" + queryString);
    return;
    */

    // don't allow two sends for the same targetId
    if ( sndActive[targetId] )
    {
	setLoadingStatus ("Already loading into " + targetId + ": " + sndActive[targetId], 1);
	return;
    }

    if ( (slot = getRequestSlot()) == -1 )
    {
	alert ("XMLHttpRequest Error");
	return;
    }

    sndActive[targetId] = url;
    setLoadingStatus ("Loading " + slot + " into " + targetId + ": " + url, 1);
    updateLoading ();

    requestId[slot].onreadystatechange =
	function (e) { handleResponse(e, slot, targetId); };

    try { requestId[slot].open('POST', url, true); }
    catch (e) { alert (e); freeRequestSlot (slot); return; }

    requestId[slot].setRequestHeader('Content-Type',
	'application/x-www-form-urlencoded');
    requestId[slot].send (queryString);
}

function handleResponse(result, slot, targetId, callback, arg, arg2, arg3)
{
    setLoadingStatus ("request " + slot + " got reply readystate = " + readyStateStr[requestId[slot].readyState] + " [" + requestId[slot].readyState + "]", 1);

    if ( requestId[slot].readyState == 4 )
    {
	var response = requestId[slot].responseText;
	var status = requestId[slot].status;
	var statusText = requestId[slot].statusText;
	var url = sndActive[targetId];

	// it's important to do this before callbacks/etc in case
	// a javascript error aborts us out before we can clear this
	freeRequestSlot (slot);
	// delete sndActive[targetId];	// breaks on IE windows?
	sndActive[targetId] = undefined;

	if ( status == "404")
	{
	    alert ("Error: URL not found");
	}
	else if ( status != "200")
	{
	    alert ("Error2: " + status + " " + statusText);
	}
	else
	{
	    var obj = myGetElementById(targetId);
	    if ( obj )
		obj.innerHTML = response;
	    if ( callback )
		callback(url, targetId, arg, arg2, arg3);
	}
    }
}

