////////////////////////////////////////////
// PostBack and AjaxPostBack
////////////////////////////////////////////

  qcodo.postBack = function(strForm, strControl, strEvent, strParameter) {
    var objForm = document.getElementById(strForm);
    objForm.Qform__FormControl.value = strControl;
    objForm.Qform__FormEvent.value = strEvent;
    objForm.Qform__FormParameter.value = strParameter;
    objForm.Qform__FormCallType.value = "Server";
    objForm.Qform__FormUpdates.value = this.formUpdates();
    objForm.Qform__FormCheckableControls.value = this.formCheckableControls(strForm, "Server");
    objForm.submit();
  };

  qcodo.formUpdates = function() {
    var strToReturn = "";
    for (var intIndex = 0; intIndex < qcodo.controlModifications.length; intIndex++) {
      strToReturn += qcodo.controlModifications[intIndex] + "\n";
    };

    qcodo.controlModifications = new Array();
    return strToReturn;
  };

  qcodo.formCheckableControls = function(strForm, strCallType) {
    var objForm = document.getElementById(strForm);
    var strToReturn = "";

    for (var intIndex = 0; intIndex < objForm.elements.length; intIndex++) {
      if (((objForm.elements[intIndex].type == "checkbox") ||
         (objForm.elements[intIndex].type == "radio")) &&
        ((strCallType == "Ajax") ||
        (!objForm.elements[intIndex].disabled)))
        strToReturn += " " + objForm.elements[intIndex].id;
    };

    if (strToReturn.length > 0)
      return strToReturn.substring(1);
    else
      return "";
  };

  qcodo.ajaxQueue = new Array();

  qcodo.postAjax = function(strForm, strControl, strEvent, strParameter, strWaitIconControlId) {
    // alert(strForm + " " + strControl + " " + strEvent + " " + strParameter);

    // Figure out if Queue is Empty
    var blnQueueEmpty = false;
    if (qcodo.ajaxQueue.length == 0)
      blnQueueEmpty = true;

    // Enqueue the AJAX Request
    qcodo.ajaxQueue.push(new Array(strForm, strControl, strEvent, strParameter, strWaitIconControlId));

    // If the Queue was originally empty, call the Dequeue
    if (blnQueueEmpty)
      qcodo.dequeueAjaxQueue();
  };

  qcodo.clearAjaxQueue = function() {
    qcodo.ajaxQueue = new Array();
  };

  qcodo.objAjaxWaitIcon = null;

  qcodo.dequeueAjaxQueue = function() {
    if (qcodo.ajaxQueue.length > 0) {
      strForm = this.ajaxQueue[0][0];
      strControl = this.ajaxQueue[0][1];
      strEvent = this.ajaxQueue[0][2];
      strParameter = this.ajaxQueue[0][3];
      strWaitIconControlId = this.ajaxQueue[0][4];

      // Display WaitIcon (if applicable)
      if (strWaitIconControlId) {
        this.objAjaxWaitIcon = this.getWrapper(strWaitIconControlId);
        if (this.objAjaxWaitIcon)
          this.objAjaxWaitIcon.style.display = 'inline';
      };

      var objForm = document.getElementById(strForm);
      objForm.Qform__FormControl.value = strControl;
      objForm.Qform__FormEvent.value = strEvent;
      objForm.Qform__FormParameter.value = strParameter;
      objForm.Qform__FormCallType.value = "Ajax";
      objForm.Qform__FormUpdates.value = qcodo.formUpdates();
      objForm.Qform__FormCheckableControls.value = this.formCheckableControls(strForm, "Ajax");

      var strPostData = "";
      for (var i = 0; i < objForm.elements.length; i++) {
        switch (objForm.elements[i].type) {
          case "checkbox":
          case "radio":
            if (objForm.elements[i].checked) {
              var strTestName = objForm.elements[i].name + "_";
              if (objForm.elements[i].id.substring(0, strTestName.length) == strTestName)
                strPostData += "&" + objForm.elements[i].name + "=" + objForm.elements[i].id.substring(strTestName.length);
              else
                strPostData += "&" + objForm.elements[i].id + "=" + "1";
            };
            break;

          case "select-multiple":
            var blnOneSelected = false;
            for (var intIndex = 0; intIndex < objForm.elements[i].options.length; intIndex++)
              if (objForm.elements[i].options[intIndex].selected) {
                strPostData += "&" + objForm.elements[i].name + "=";
                strPostData += objForm.elements[i].options[intIndex].value;
              };
            break;

          default:
            strPostData += "&" + objForm.elements[i].id + "=";

            // For Internationalization -- we must escape the element's value properly
            var strPostValue = objForm.elements[i].value;
            if (strPostValue) {
              strPostValue = strPostValue.replace(/&/g, escape('&'));
              strPostValue = strPostValue.replace(/\+/g, "%2B");
            };
            strPostData += strPostValue;
            break;
        };
      };

      var strUri = objForm.action;

      var objRequest;
      if (window.XMLHttpRequest) {
        objRequest = new XMLHttpRequest();
      } else if (typeof ActiveXObject != "undefined") {
        objRequest = new ActiveXObject("Microsoft.XMLHTTP");
      };

      if (objRequest) {
        objRequest.open("POST", strUri, true);
        objRequest.setRequestHeader("Method", "POST " + strUri + " HTTP/1.1");
        objRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

        objRequest.onreadystatechange = function() {
          if (!qcodo.unloadFlag && objRequest.readyState == 4) {
            try {
              var objXmlDoc = objRequest.responseXML;
//                qcodo.logMessage(objRequest.responseText, true);
//                alert('AJAX Response Received');

              if ((!objXmlDoc)) {
                alert("An error occurred during AJAX Response parsing.\r\n\r\nThe error response will appear in a new popup.");
                var objErrorWindow = window.open('about:blank', 'qcodo_error','menubar=no,toolbar=no,location=no,status=no,scrollbars=yes,resizable=yes,width=1000,height=700,left=50,top=50');
                objErrorWindow.focus();
                objErrorWindow.document.write(objRequest.responseText);
                return;
              } else {
                var intLength = 0;

                // Go through Controls
                var objXmlControls = objXmlDoc.getElementsByTagName('control');
                intLength = objXmlControls.length;

                for (var intIndex = 0; intIndex < intLength; intIndex++) {
                  var strControlId = objXmlControls[intIndex].attributes.getNamedItem('id').nodeValue;

                  var strControlHtml = "";
                  if (objXmlControls[intIndex].firstChild)
                    strControlHtml = objXmlControls[intIndex].firstChild.nodeValue;
                  if (qcodo.isBrowser(qcodo.FIREFOX))
                    strControlHtml = objXmlControls[intIndex].textContent;

                  // Perform Callback Responsibility
                  if (strControlId == "Qform__FormState") {
                    var objFormState = document.getElementById(strControlId);
                    objFormState.value = strControlHtml;
                  } else {
                    var objSpan = document.getElementById(strControlId + "_ctl");
                    if (objSpan)
                      objSpan.innerHTML = strControlHtml;
                  };
                };

                // Go through Commands
                var objXmlCommands = objXmlDoc.getElementsByTagName('command');
                intLength = objXmlCommands.length;

                for (var intIndex = 0; intIndex < intLength; intIndex++) {
                  if (objXmlCommands[intIndex] && objXmlCommands[intIndex].firstChild) {
                    var strCommand = "";
                    intChildLength = objXmlCommands[intIndex].childNodes.length;
                    for (var intChildIndex = 0; intChildIndex < intChildLength; intChildIndex++)
                      strCommand += objXmlCommands[intIndex].childNodes[intChildIndex].nodeValue;
                    eval(strCommand);
                  };
                };
              };
            } catch (objExc) {
              alert(objExc.message + "\r\non line number " + objExc.lineNumber + "\r\nin file " + objExc.fileName);
              alert("An error occurred during AJAX Response handling.\r\n\r\nThe error response will appear in a new popup.");
              var objErrorWindow = window.open('about:blank', 'qcodo_error','menubar=no,toolbar=no,location=no,status=no,scrollbars=yes,resizable=yes,width=1000,height=700,left=50,top=50');
              objErrorWindow.focus();
              objErrorWindow.document.write(objRequest.responseText);
              return;
            };

            // Perform the Dequeue
            qcodo.ajaxQueue.reverse();
            qcodo.ajaxQueue.pop();
            qcodo.ajaxQueue.reverse();

            // Hid the WaitIcon (if applicable)
            if (qcodo.objAjaxWaitIcon)
              qcodo.objAjaxWaitIcon.style.display = 'none';

            // If there are still AjaxEvents in the queue, go ahead and process/dequeue them
            if (qcodo.ajaxQueue.length > 0)
              qcodo.dequeueAjaxQueue();
          };
        };

        objRequest.send(strPostData);
      };
    };
  };



//////////////////
// Qcodo Shortcuts
//////////////////

  qc.pB = qcodo.postBack;
  qc.pA = qcodo.postAjax;
