/* Copyright (C) Jon-Eirik Pettersen 2006 */

function requestElement(req, id, callback, params) {
  this.request = req;
  this.id = id;
  this.callback = callback;
  this.retryCount = 0;
  this.params = params;
}

var retryCount = 0;

var Xrequests = Array();

function createUrl(params, id) {
  var url = "/sys/index.php";
  var intParams = new Array();
  var oldUrl = "" + top.location;
  var urlparts = oldUrl.split("?");
  urlparts.shift();
  var origParams = urlparts.join("?");
  paramsParts = origParams.split("&");
  
  for (var i in paramsParts) {
    var element = paramsParts[i];
    var varparts = element.split("=");
    var key = varparts.shift();
    var value = varparts.join("=");
    intParams[key] = value;
  }
  
  intParams["module_name"] = module_name;
  intParams["sub"] = sub_id;
  
  for (var i in params) {
    var param = params[i];
    intParams[param[0]] = param[1];
  }
  
  var c = 0;
  for (var key in intParams) {
    var value = intParams[key];
    if (c++ == 0) {
      url += "?";
    } else {
      url += "&";
    }
    url += key + "=" + value;
  }
  
  return url;
}

function response_callback() {
  var request;
  var ok;
  
  var i;
  var length;
  
  try {
    for (i in Xrequests) {
    
      if (Xrequests[i] != null) {
        ok = false;
        var requestObject = Xrequests[i];
        var request = requestObject.request;
        var id = requestObject.id;
        var callback = requestObject.callback;
        var params = requestObject.params;
        
        if (request.readyState == 4) {
          switch (request.status) {
            case 500:
              if (retryCount++ < 10) {
                ajax_call(params, id, callback);
              }
              break;
            case 200:
              var elements;
              var childNodes;
              
              try {
                elements = request.responseXML.getElementsByTagName('response')[0];
                childNodes = elements.childNodes;
              } catch (exception) {
                var responseText = request.responseText;
                var error = "Error in Xml Communication. Unable to parse Xml Response Object: "
                              +"\n\n" + exception.message + "\n\n" + responseText;
                              
                document.getElementsByTagName("body")[0].innerText = error;
                return;
              }
              var responseId;
              var responseText;
              var redirect;
              
              var i2;
              for (i2=0; i2 <= childNodes.length; i2++) {
                var node = childNodes[i2];
                var nodeValue;
                
                try {
                  var i3;
                  if (node.childNodes) {
                    nodeValue = parseXmlParts(node);
                    switch (node.nodeName) {
                      case "responseId":
                        responseId = nodeValue;
                        break;
                      case "responseText":
                        responseText = nodeValue;
                        break;
                      case "redirect":
                        redirect = nodeValue;
                        break;
                        
                      case "backParams":
                        var rawParams = nodeValue.split("|-split-|");
                        backParams = Array();
                        for (var i4 = -1; i4 <= rawParams.length; i4++) {
                          var key = rawParams[i4];
                          var value = rawParams[++i4];
                          backParams[key] = value;
                        }
                        break;
                      case "backModule":
                        backModule = nodeValue;
                        break;
                      case "backSub":
                        backSub = nodeValue;
                        break;
                      
                      case "forwardParams":
                        var rawParams = nodeValue.split("|-split-|");
                        forwardParams = Array();
                        for (var i4 = 0; i4 <= rawParams.length; i4++) {
                          forwardParams[rawParams[i4]] = rawParams[++i4];
                        }
                        break;
                      case "forwardModule":
                        forwardModule = nodeValue;
                        break;
                      case "forwardSub":
                        forwardSub = nodeValue;
                        break;
                    }
                  }
                } catch (exception) {
                }
              }
              
              if (redirect) {
                window.location = redirect;
                return;
              }
              
              callback(responseId, responseText);
              break;
          }
           Xrequests[i] = null;
        }
      }
    }
  } catch (exception) { }
  refreshLoadIndicator();
}


function ajax_call(params, id, callback) {
  var request = false;
  
  params.push(new Array("__ajax_id", id));
  
  var url = createUrl(params, id);
  
  if (window.XMLHttpRequest) {
    try {
      request = new XMLHttpRequest();
    } catch (e) {
      request = false;
    }
  } else if (window.ActiveXObject) {
    try {
      request = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      request = false;
    }
  }
  
  if (request) {
    request.open("GET", url, true);
    request.setRequestHeader("X-DcvCP-Js-Callback", "true");
    request.send(null);
  
    request.onreadystatechange = response_callback;
    
    requestObject = new requestElement(request, id, callback, params);
    Xrequests.push(requestObject);
  }
  
  refreshLoadIndicator();
}

function refreshLoadIndicator() {
  var element = document.getElementById("load_indicator");
  
  element.style.visibility = "hidden";
  for (var i in Xrequests) {
    if (Xrequests[i] != null) {
      element.style.visibility = "visible";
    }
  }
}

