var connector = new ajax_connection_manager();
connector.init();

function ajax_connection_manager()
{

var maxConnections = 10;

var connections = new Array();
var requestList = new Array();

this.maxConnections = maxConnections;
this.connections = connections;
this.requestList = requestList;
this.processForm = processForm;
//this.checkRequest = checkRequest;
this.flush = flush;
this.pendingRequests = function(){return requestList.length;}
this.connectionsInUse = function()
{var cnt = 0;
for(var i=0;i<connections.length;i++)
{if (connections[i].inUse == true)
{cnt = cnt + 1;}
}
return cnt;
}

this.init = init;
this.request = request;

function init()
{for(var i=0;i<maxConnections;i++)
{connections[i] = new ajax_connector();}
}

function request(url,method,handler)
{var requestHandled = false;
for(var i=0;i<maxConnections;i++)
{if(connections[i].inUse==false)
{connections[i].request(url,method,handler);
requestHandled = true;
break;}
}
if(requestHandled==false)
{requestList[requestList.length] = new Array(url,method,handler);}
}

function processForm(url,method,form,handler)
{var requestHandled = false;
for(var i=0;i<maxConnections;i++)
{if(connections[i].inUse==false)
{connections[i].processForm(url,method,form,handler);
requestHandled = true;
break;}
}
if(requestHandled==false)
{requestList[requestList.length] = new Array(url,form,handler);}
}


function flush()
{for(var i=0;i<maxConnections;i++)
{if(connections[i].inUse==true)
{connections[i].inUse=false;}}
}

//function checkRequest()
//{for(var i=0;i<requestList.length;i++)
//{request(requestList[i][0],requestList[i][1],requestList[i][2]);
//requestList.splice(i,1);}
//setTimeout("checkRequest",30);
//}
//this.checkRequest();
}

function ajax_connector()
{

var inUse=false;

this.inUse = false;

var req;
var hndlr;

this.request = request;
this.processRequest = processRequest;
this.processForm = processForm;

function processForm(url,method,frm,handler)
{
this.inUse=true;
hndlr=handler;
 queryString="";
    var numberElements =  frm.elements.length;
    for(var i = 0; i < numberElements; i++) {
        if(i < numberElements-1) {
		if(frm.elements[i].type=='checkbox')
		{if(frm.elements[i].checked==true){
		queryString += frm.elements[i].name+"="+
                 encodeURIComponent(frm.elements[i].value)+"&";}}
		else
    		{queryString += frm.elements[i].name+"="+
                 encodeURIComponent(frm.elements[i].value)+"&";}
        } else {
		if(frm.elements[i].type=="checkbox")
		{if(frm.elements[i].checked==true){
		queryString += frm.elements[i].name+"="+
                 encodeURIComponent(frm.elements[i].value);}}
		else
    		{
            queryString += frm.elements[i].name+"="+
                           encodeURIComponent(frm.elements[i].value);}
        	}

    }
if(method=='POST')
{
if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
if (req.overrideMimeType)
{ req.overrideMimeType('text/html');}

        req.onreadystatechange = this.processRequest;
        req.open(method, url, true);
        req.send(queryString);
    // branch for IE/Windows ActiveX version
    } else if (window.ActiveXObject) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
        if (req) {
            req.onreadystatechange = this.processRequest;
            req.open(method, url, true);
            req.send(queryString);
        }
    }

}
else
{
if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
if (req.overrideMimeType)
{ req.overrideMimeType('text/html');}

        req.onreadystatechange = this.processRequest;
        req.open(method, url+'?'+queryString, true);
        req.send(null);
    // branch for IE/Windows ActiveX version
    } else if (window.ActiveXObject) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
        if (req) {
            req.onreadystatechange = this.processRequest;
            req.open(method, url+'?'+queryString, true);
            req.send();
        }
    }

}


}

function request(url,method,handler)
{this.inUse = true;  
hndlr = handler;
  // branch for native XMLHttpRequest object
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
        req.onreadystatechange = this.processRequest;
        req.open("GET", url, true);
        req.send(null);
    // branch for IE/Windows ActiveX version
    } else if (window.ActiveXObject) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
        if (req) {
            req.onreadystatechange = this.processRequest;
            req.open("GET", url, true);
            req.send();
        }
    }}

function processRequest()
{ if (req.readyState == 4) {
        // only if "OK"
        if (req.status == 200) {
if(req.responseText.substring(0,1)=='{'){
var doc = eval('(' + req.responseText + ')');
}
else
{var doc = req.responseText;}
	//alert(hndlr);
	hndlr(doc);
	this.inUse = false;
        } else {
            alert("There was a problem retrieving the XML data:\n" + req.statusText);
        }
    }}

}
