var req;
var is_req_on = false;
var reqTimeoutID = null;
var reqData = "";
var reqURL = "";
var reqRetryCNT = 0;
var reqQueue = Array();

function loadXMLDoc(url,data,cnt,tmout) 
{
 if(!is_req_on)
 {
    is_req_on = true;
    req = null;
    reqData = data;
    reqURL = url;
    
    if(cnt)
     reqRetryCNT = cnt;
    else
     reqRetryCNT = 1;
        
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
        req.onreadystatechange = processReqChange;
        req.open('POST', url, true);
        req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
        req.send(data);
    } else if (window.ActiveXObject) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
        if (req) {
            req.onreadystatechange = processReqChange;
            req.open('POST', url, true);
            req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
            req.send(data);
        }
    }
    
    if(!req)
    {
     is_req_on = false;
     alert("Unable to send the request");
    }
    else if(tmout == undefined || tmout>0)
    {
     reqTimeoutID = window.setTimeout("reqTimeout();", tmout == undefined?60000:tmout);
    }
 }
 else
  reqQueue.push({'url':url,'data':data});
}

function processReqChange() 
{
 if(req.readyState == 4) 
 {
  if(req.status == 200) 
  {
   is_req_on = false;
  
   if(reqTimeoutID)
    window.clearTimeout(reqTimeoutID);
  
//   alert(req.responseText);
  
   try
   {
    xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async="false";
    xmlDoc.loadXML(req.responseText);
   }
   catch(e)
   {
    try
    {
     parser=new DOMParser();
     xmlDoc=parser.parseFromString(req.responseText,"text/xml");
    }
    catch(e)
    {
     alert(e.message);
     return;
    }
   }  

   if(xmlDoc.getElementsByTagName('method')[0] != null && xmlDoc.getElementsByTagName('method')[0] != undefined)
   {
    var method = xmlDoc.getElementsByTagName('method')[0].childNodes[0].nodeValue;
    var result = xmlDoc.getElementsByTagName('result')[0]; 

    eval(method + '(result)');
   }
   else
    XMLCommError();
    
   if(reqQueue.length > 0)
   {
    var r = reqQueue.pop();
    loadXMLDoc(r.url,r.data);
   }
  }
//  else
//   alert("XML response error (no 200 response)");  
 }
// else 
//  alert("readyState = " + req.readyState);
  
/*
0 = open has not yet been called
1 = send has not yet been called but open has been called
2 = send has been called but no response from server
3 = data is in the process of being received from the server
4 = response from server has arrived
*/  
}

function reqTimeout()
{
 if(req)
  req.abort();

 req = null;

 is_req_on = false;
 
 if(reqRetryCNT<5)
 {
 // alert("Request timed out - repeating");
  loadXMLDoc(reqURL,reqData,reqRetryCNT+1);
 }
 else
 {
  showWait(false);
  alert("Request timed out - giving up");

  if(reqQueue.length > 0)
  {
   var r = reqQueue.pop();
   loadXMLDoc(r.url,r.data);
  }
 }
}
