var requests = new Array();
var processors = new Array();

function addEvent(elm, evType, fn, useCapture)
{
   if (elm.addEventListener)
   {
      elm.addEventListener(evType, fn, useCapture);
      return true;
   }
   else if (elm.attachEvent)
   {
      var r = elm.attachEvent('on' + evType, fn);
   }
   else
   {
      elm['on'+evType] = fn;
   }
}

function init()
{
   var all_divs = document.getElementsByTagName('div');
   for (i=0; i < all_divs.length; i++)
   {
      addModuleEvents(all_divs[i]);
   }
}

function addModuleEvents(elem)
{
   if (elem.id.indexOf('Module', 0) > 0)
   {
      var module = elem.id.substring(0, elem.id.indexOf('Module', 0));
      processors[module] = function() {
         if (requests[module].readyState == 4)
         {
            if (requests[module].status == 200)
            {
               loadModule(module, requests[module].responseText);
            }
         }
      }
      loadModule(module, '');
   }
}

function loadModule(module, response)
{
   if (response != '')
   {
      code = response.substring(response.indexOf('\n'), response.length);
      code = code.replace(/<[bB][rR]><\/[bB][rR]>/, '<br/>');
      document.getElementById(module + 'Module').innerHTML = code;
      return;
   }

   var url = "/modules/" + module;
   if (module_params.length)
   {
      url += "?" + parseParameters(module_params, module);
   }

   ModuleXmlHttpRequest(url, module);
}

function parseParameters(params, module, url, inside)
{
   var i;
   url = url || '';
   inside = inside || false;

   for (i = 0; i < params.length; i++)
   {
      if (typeof(params[i][1]) != "object")
      {
         url = addParameter(url, params[i][0], params[i][1], inside);
      }
      else if (typeof(params[i][1].length) != "undefined" &&
            params[i][0] == module)
      {
         url = parseParameters(params[i][1], module, url, true);
      }
   }

   return url;
}

function addParameter(url, key, val, overWrite)
{
   var keyExists = url.indexOf(key + "=", 0) >= 0;

   if (keyExists)
   {
      if (overWrite)
      {
         var start = url.indexOf(key + "=", 0);
         var end = url.indexOf("&", start);
         if (start) start--;
         if (end < 0) end = url.length;
         url = url.substr(0, start) + url.substr(end, url.length);
         if (url.length)
            return url + "&" + key + "=" + val;
         return key + "=" + val;
      }
      return url;
   }

   if (url.length)
      return url + "&" + key + "=" + val;
   return url + key + "=" + val;
}

function ModuleXmlHttpRequest(url, module)
{
   if (window.XMLHttpRequest)
   {
      try
      {
         requests[module] = new XMLHttpRequest();
         self.setTimeout('requests["' + module + '"].abort()', 10000);
         requests[module].onreadystatechange = processors[module];
         requests[module].open("GET", url, true);
         requests[module].send(null);
      }
      catch(e)
      {
      }
   }
   else if (window.ActiveXObject)
   {
      requests[module] = new ActiveXObject("Microsoft.XMLHTTP");
      self.setTimeout('requests["' + module + '"].abort()', 10000);
      if (requests[module])
      {
         requests[module].onreadystatechange = processors[module];
         requests[module].open("GET", url, true);
         requests[module].send();
      }
   }
}

addEvent(window, 'load', init, false);
