var VMENU_ITEM_TEXT_DECORATION_ON_MS_OVER = "underline";
var VMENU_ITEM_TEXT_DECORATION_ON_MS_OUT = "none";
var VMENU_ITEM_BORDER_COLOR_ON_MS_OVER = "#40688c";
var VMENU_ITEM_BORDER_COLOR_ON_MS_OUT = "#19376a";
var VMENU_ITEM_BG_COLOR_ON_MS_OVER = "#5081ae";
var VMENU_ITEM_BG_COLOR_ON_MS_OUT = "#19376a";

var _verticalMenuContainer = null;
var _verticalSubMenus = new Array();
var _verticalMenuItemUrlPrefix = null;
var _verticalMenuStyleSuffix = "";
var _documentUrl = null;

function CreateVerticalMenu(containerId, menuSource, urlPrefix)
{
  _verticalMenuContainer = document.getElementById(containerId);
  _verticalMenuItemUrlPrefix = urlPrefix;
  _documentUrl = window.location.href;
  
  if (_documentUrl.indexOf(".html") == -1)
  {
    _documentUrl += "index.html";
  }

  if (screen.width >= 1024 && screen.height >= 768)
  {
    _verticalMenuStyleSuffix = "1024x768";
  }

  var verticalMenu = ParseVerticalMenu(menuSource, 0);
  _verticalMenuContainer.appendChild(verticalMenu);
  _verticalMenuContainer.parentNode.style.height = (verticalMenu.offsetHeight + 8) + "px";
}

function ParseVerticalMenu(menuSource, level)
{
  var verticalMenu = CreateVerticalSubMenu(level);

  for (var i = 0; i < menuSource.childNodes.length; i++)
  {
    if (menuSource.childNodes[i].nodeType == 1 && menuSource.childNodes[i].hasChildNodes())
    {
      var menuItem = menuSource.childNodes[i];
      var text = null;
      var url = null;
      var target = null;
      var description = null;
      var subMenu = null;

      for (var j = 0; j < menuItem.childNodes.length; j++)
      {
        if (menuItem.childNodes[j].nodeType == 1 && menuItem.childNodes[j].hasChildNodes())
        {
          switch (menuItem.childNodes[j].nodeName.toLowerCase())
          {
            case "text":
              text = menuItem.childNodes[j].firstChild.nodeValue;
              break;

            case "url":
              url = menuItem.childNodes[j].firstChild.nodeValue;
              break;

            case "target":
              target = menuItem.childNodes[j].firstChild.nodeValue;
              break;

            case "description":
              description = CreateVerticalMenuItemDescription(ParseVerticalMenuItemDescription(menuItem.childNodes[j]));
              break;

            case "submenu":
              subMenu = ParseVerticalMenu(menuItem.childNodes[j], level + 1);
              break;
          }
        }
      }

      var verticalMenuItem = CreateVerticalMenuItem(text, url, target, description, subMenu, verticalMenu);
      verticalMenu.appendChild(verticalMenuItem);

      if (description != null)
      {
        _verticalMenuContainer.appendChild(description);
      }

      if (subMenu != null)
      {
        subMenu.parentMenuItem = verticalMenuItem;

        if (level == 0)
        {
          verticalMenu.appendChild(subMenu);
        }
        else
        {
          _verticalMenuContainer.appendChild(subMenu);
        }
      }

      if (_documentUrl.indexOf(url) != -1)
      {
        verticalMenuItem.selected = true;
        verticalMenuItem.style.borderColor = VMENU_ITEM_BORDER_COLOR_ON_MS_OVER;
        verticalMenuItem.style.backgroundColor = VMENU_ITEM_BG_COLOR_ON_MS_OVER;
      }
    }
  }

  return verticalMenu;
}

function CreateVerticalSubMenu(level)
{
  var obj = document.createElement("div");
  obj.id = "vMenu";
  obj.level = level;
  obj.parentMenuItem = null;
  obj.menuId = _verticalSubMenus.length;
  _verticalSubMenus[obj.menuId] = obj;
  obj.timeout = null;

  switch (level)
  {
    case 0:
      obj.className = "vMenu" + _verticalMenuStyleSuffix;
      break;

    case 1:
      obj.className = "vSubMenu" + _verticalMenuStyleSuffix;
      break;

    default:
      obj.className = "vSecondarySubMenu" + _verticalMenuStyleSuffix;
      break;
  }

  function msOver()
  {
    if (this.level > 1)
    {
      this.show();
      this.parentMenuItem.select();
    }
  }

  function msOut()
  {
    if (this.level > 1)
    {
      this.hide();
      this.parentMenuItem.unselect();
    }
  }

  function show()
  {
    if (this.timeout != null)
    {
      clearTimeout(this.timeout);
      this.timeout = null;
    }

    this.style.visibility = "visible";
  }

  function hide()
  {
    this.timeout = setTimeout("HideVerticalSubMenu(" + this.menuId + ")", 50);
  }

  obj.onmouseover = msOver;
  obj.onmouseout = msOut;
  obj.show = show;
  obj.hide = hide;
  return obj;
}

function CreateVerticalMenuItem(text, url, target, description, subMenu, parentMenu)
{
  var obj = document.createElement("div");
  obj.id = "vMenuItem";
  obj.appendChild(document.createTextNode(text));
  obj.parentMenu = parentMenu;
  obj.url = url != null ? (url.indexOf("http://") != -1 && url.indexOf("http://") == 0 ? url : _verticalMenuItemUrlPrefix + url) : null;
  obj.target = target;
  obj.description = description;
  obj.subMenu = parentMenu.level > 0 ? subMenu : null;
  obj.active = true;
  obj.selected = false;

  if (parentMenu.level == 0)
  {
    obj.className = subMenu != null ? "vMenuItemWithSubMenu" : "vMenuItem";
  }
  else
  {
    obj.className = subMenu != null ? "vSubMenuItemWithSubMenu" : "vSubMenuItem";
  }

  if (document.all)
  {
    obj.style.width = "100%";
  }

  function highlight()
  {
    this.style.cursor = "pointer";
    this.style.textDecoration = VMENU_ITEM_TEXT_DECORATION_ON_MS_OVER;
    this.style.borderColor = VMENU_ITEM_BORDER_COLOR_ON_MS_OVER;
    this.style.backgroundColor = VMENU_ITEM_BG_COLOR_ON_MS_OVER;
  }

  function normalize()
  {
    this.style.textDecoration = VMENU_ITEM_TEXT_DECORATION_ON_MS_OUT;

    if (!this.selected)
    {
      this.style.borderColor = VMENU_ITEM_BORDER_COLOR_ON_MS_OUT;
      this.style.backgroundColor = VMENU_ITEM_BG_COLOR_ON_MS_OUT;
    }
  }

  function select()
  {
    this.highlight();

    if (this.parentMenu.level > 1)
    {
      this.parentMenu.show();
      this.parentMenu.parentMenuItem.select();
    }
  }

  function unselect()
  {
    this.normalize();

    if (this.parentMenu.level > 1)
    {
      this.parentMenu.hide();
      this.parentMenu.parentMenuItem.unselect();
    }
  }

  function msOver()
  {
    if (this.active)
    {
      this.highlight();

      if (this.subMenu != null)
      {
        this.subMenu.style.top = (this.offsetTop + (this.parentMenu.level > 1 ? this.parentMenu.offsetTop : -1) - 1) + "px";
        this.subMenu.style.left = (this.offsetLeft + this.offsetWidth + (this.parentMenu.level > 1 ? this.parentMenu.offsetLeft + 3 : 2)) + "px";
        this.subMenu.show();
      }
      else if (this.description != null)
      {
        this.description.style.top = (this.offsetTop + (this.parentMenu.level > 1 ? this.parentMenu.offsetTop + 1 : 0)) + "px";
        this.description.style.left = (this.offsetLeft + this.offsetWidth + (this.parentMenu.level > 1 ? this.parentMenu.offsetLeft + 4 : 7)) + "px";
        this.description.show();
      }
    }
  }

  function msOut()
  {
    if (this.active)
    {
      this.normalize();

      if (this.subMenu != null)
      {
        this.subMenu.hide();
      }
      else if (this.description != null)
      {
        this.description.hide();
      }
    }
  }

  function msClick()
  {
    if (this.active && this.url != null)
    {
      if (this.target == "_blank")
      {
        window.open(this.url, "");
      }
      else
      {
        window.location = this.url;
      }
    }
  }

  obj.highlight = highlight;
  obj.normalize = normalize;
  obj.select = select;
  obj.unselect = unselect;
  obj.onmouseover = msOver;
  obj.onmouseout = msOut;
  obj.onclick = msClick;
  return obj;
}

function ParseVerticalMenuItemDescription(descriptionSource)
{
  var html = "";

  for (var i = 0; i < descriptionSource.childNodes.length; i++)
  {
    if (descriptionSource.childNodes[i].nodeType == 1)
    {
      html += "<" + descriptionSource.childNodes[i].nodeName + ">";

      if (descriptionSource.childNodes[i].hasChildNodes())
      {
        html += ParseVerticalMenuItemDescription(descriptionSource.childNodes[i]) + "</" + descriptionSource.childNodes[i].nodeName + ">";
      }
    }
    else if (descriptionSource.childNodes[i].nodeType == 3)
    {
      html += descriptionSource.childNodes[i].nodeValue;
    }
  }

  return html;
}

function CreateVerticalMenuItemDescription(html)
{
  var obj = document.createElement("div");
  obj.innerHTML = html;
  obj.className = "vMenuItemDescription";

  function show()
  {
    this.style.visibility = "visible";
  }

  function hide()
  {
    this.style.visibility = "hidden";
  }

  obj.show = show;
  obj.hide = hide;
  return obj;
}

function HideVerticalSubMenu(subMenuId)
{
  _verticalSubMenus[subMenuId].style.visibility = "hidden";
}
