// global request array
var xmlRequestArray = new Array();
var callbackInProgress = false;
var scriptsInProgress = false;

// an object that takes an XMLHttpRequest object and a javascript callback method.
function CPRSRequest(xmlreq, callbackHandler) {
  this.request = xmlreq;
  this.callback = callbackHandler;
}

// a function to check if a given browser supports XMLHttpRequests.
function supportsAjax() {
  if (getNewXMLHttpRequest()) {
    return true;
  }
  return false;
}

// a function that will return a new XMLHttpRequest object.
// or false if one cannot be created.
function getNewXMLHttpRequest() {
  if (window.XMLHttpRequest) {
    return new XMLHttpRequest();
  }
  else if (window.ActiveXObject) {
    try {
      return new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (e1) {
      try {
        return new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch (e2) {
        return false;
      }
    }
  }
  return false;
}

// the main function for remote scripting.  if the browser can handle XMLHttpRequests,
// then use that, otherwise default to jsrs.
// Parameters:
// serverFunctionName - a String representing the method that will be called on the server (in SiPSRemoteScriptingServlet).
// callbackFunction - a javascript function that will be called upon the completion of the remote call.
// parameters - a String or Array of parameters.  (similar to the original jsrsExecute() parameters).
function cprsExecute(serverFunctionName, callbackFunction, parameters) {
  var requestObject = getNewXMLHttpRequest();
  if (requestObject) {
    xmlRequestArray.push(new CPRSRequest(requestObject, callbackFunction));

    requestObject.onreadystatechange = cprsCallback;
    requestObject.open("POST", '/ajax/', true);
    requestObject.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    var parameterList = '';
    parameterList = 'F=' + serverFunctionName;
    if (parameters != null) {
      if (typeof(parameters) == "string") {
        parameterList += '&P0=[' + parameters + ']';
      }
      else {
        for (var k=0; k < parameters.length; k++) {
          parameterList += '&P' + k + '=[' + parameters[k] + ']';
        }
      }
    }
    scriptsInProgress = true;
    requestObject.send(parameterList);
  }
  else {
    jsrsExecute('/rs/', callbackFunction, serverFunctionName, parameters);
  }
}

var failureTimeout = 0;
function cprsCallback() {
  if (scriptsInProgress) {
    if (!callbackInProgress) {
      callbackInProgress = true;
      for (var i=0; i < xmlRequestArray.length; i++) {
        var xmlRequest = xmlRequestArray[i];
        if (xmlRequest.request != null && xmlRequest.request.readyState == 4) {
          if (xmlRequest.request.status == 200) {
            var responseText = xmlRequest.request.responseText;
            if (responseText == " ") // fixes a bug in safari where the responseText should be empty.
              responseText = "";
            xmlRequest.callback(responseText);
            xmlRequestArray.splice(i, 1);
            i--;
          }
          else {
            // error
            alert("An Error Occured While Processing This Request\n" + unescape(xmlRequest.request.statusText));
            xmlRequestArray.splice(i, 1);
            i--;
          }
        }
      }
      callbackInProgress = false;
    }
    else {
      if (failureTimeout > 500) {
        failureTimeout = 0;
        callbackInProgress = false;
      }
      else {
        failureTimeout++;
      }

      setTimeout('cprsCallback()', 500);
    }
  }
}