DynamicContent = new function()
{
  function attachEvent(element, event, _function)
  {
    if(element.addEventListener)  // Firefox, Netscape, Opera
      element.addEventListener(event.replace(/^on/,""), _function, false);
    else if(element.attachEvent) // IE
      element.attachEvent(event, _function);
    else
      element[event] = _function;
  }

  var initialised = false;

  function initialise()
  {
    if(initialised)
      return;
    initialised = true;
    var iframe = document.getElementById('dynamicContentFrame');
    iframe.style.display = 'none';
    attachEvent(iframe, "onload", function(){DynamicContent.show()});

    var ul = document.getElementById("dynamicContentLinks");
    if(ul)
    {
      var lis = ul.getElementsByTagName("li");

      var isFirst = true;
      var isCollapsed = false;
      var lastCategory;

      for(var li = 0; li < lis.length; li++)
        if(lis[li].className == "category")
        {
          lastCategory = lis[li];
          var link = document.createElement("a");
          link.appendChild(document.createTextNode(lis[li].innerHTML));
          link.href="#";
          link.onclick = function()
          {
            expand(this.parentNode);
            return false;
          }
          lis[li].replaceChild(link, lis[li].firstChild);
          if(!isCollapsed)
          {
            collapse();
            isCollapsed = true;
          }
        }
        else
        {
          var link = lis[li].getElementsByTagName("a")[0];
          if(link)
          {
            link.onclick = function()
            {
              if(!location.search) // IE 6 quirk.  Cannot change location.hash if location.search without re-requesting the document.
                location.hash = this.innerHTML;
            };
            if(location.hash && location.hash == '#' + link.innerHTML || !location.hash && isFirst)
            {
              if(lastCategory) expand(lastCategory);

              link.focus();
              iframe.src = link.href;
              isFirst = false;
            }
          }
        }
    }
    iframe.src += '?' + new Date();
  }
  attachEvent(window, "onload", initialise);

  function collapse()
  {
    var ul = document.getElementById("dynamicContentLinks");
    if(ul)
    {
      var lis = ul.getElementsByTagName("li");

      for(var li = 0; li < lis.length; li++)
        if(lis[li].className != "category")
          lis[li].style.display = "none";
    }
  }

  function transpose(html)
  {
    return html.replace(/\.\.\//g, "");
  }

  function expand(categoryLi)
  {
    collapse();
    var isFirst = true;
    for(var next = categoryLi.nextSibling; next && next.className != "category"; next = next.nextSibling)
    {
      if(next.nodeType != 1)
        continue;

      next.style.display = "";
      if(isFirst)
      {
        var link = next.getElementsByTagName("a")[0];

        if(link.click) // IE
          link.click();
        else if(link.dispatchEvent) // Firefox, Netscape, Opera
        {
          var click = document.createEvent("MouseEvents");
          click.initEvent("click", true, true);
          link.dispatchEvent(click);
        }

        link.focus();
        if(!location.search)
          location.hash = link.innerHTML;

        isFirst = false;
      }
    }
  }

  this.show = function()
  {
    var iframe = document.getElementById('dynamicContentFrame');
    var targetNode = document.getElementById('dynamicContent');

    if(iframe.contentWindow) // IE, Firefox, Netscape
      targetNode.innerHTML = transpose(iframe.contentWindow.document.body.innerHTML);
    else if(iframe.contentDocument) // Firefox, Netscape
      targetNode.innerHTML = transpose(iframe.contentDocument.body.innerHTML);
    else if(document.frames && document.frames.dynamicContentFrame.document) // IE, Opera
      targetNode.innerHTML = transpose(document.frames.dynamicContentFrame.document.body.innerHTML);
    else
      iframe.style.display = 'block';
  }
}
