// --------------------------------------------------------------------------------
// ow_navigation.js
// unknown author (possibly Matthew Hogg?) - code added to OneWeb build 2007-04-18
// Drives the dropdown navigation for the front-end of a site.
// --------------------------------------------------------------------------------
///<reference path="~/ow_util.js">


OneWeb.Menus = {
  "nav": null,

  "DDNavigator": function(NodeTag) {

    this.NodeTag = NodeTag.split(",");
    this.NodeClass = "ow_mainNav";
    this.Opened = "";
    this.Closing = true;
    this.Selects;

    this.GetElementsByClass = function(cls, tag) {
      var arr = new Array();
      var pattern = "(^" + cls + "$|\\s" + cls + "\\s|\\s" + cls + "\\s|^" + cls + "\\s|\\s" + cls + "$)";
      var j = 0;
      var i;
      var elm = document.getElementsByTagName(tag.toLowerCase());
      for (i = 0; i < elm.length; i++) {
        var rex = new RegExp(pattern, "gi");
        if (rex.test(elm[i].className)) arr[arr.length] = elm[i];
      }
      return arr;
    }

    this.SetEvent = function(elm, ev, fn) {
      if (elm.addEventListener) elm.addEventListener(ev, fn, false);
      else if (elm.attachEvent) elm.attachEvent("on" + ev, fn);
      else elm.setAttribute("on" + ev, fn);
    }

    this.GetStyle = function(elm, prop) {
      if (window.getComputedStyle) {
        return window.getComputedStyle(elm, null).getPropertyValue(prop);
      } else if (elm.currentStyle) {
        var ieProp = "";
        if (prop.indexOf("-") != -1) {
          for (var i = 0; i < prop.length; i++) {
            if (prop.charAt(i) == "-") {
              i++;
              ieProp += prop.charAt(i).toUpperCase();
            } else {
              ieProp += prop.charAt(i);
            }
          }
        } else {
          ieProp = prop;
        }
        return eval("elm.currentStyle." + ieProp);
      }
    }

    this.GetOffset = function(elm, dir) {
      var n = 0;
      var item = eval("elm");
      var off = "offsetTop";
      var padding = "padding-top";
      if (dir == "x") {
        off = "offsetLeft";
        padding = "padding-left";
      }
      do {
        n += eval("item." + off);
        item = eval("item.offsetParent");
      } while (item != null);
      return n;
    }

    this.PositionY = function(elm) { var y = OneWeb.Menus.nav.GetOffset(elm, "y"); y += elm.offsetHeight; return y; }

    this.PositionX = function(elm) { var x = OneWeb.Menus.nav.GetOffset(elm, "x"); return x; }

    this.Overlapping = function(a, b) {
      var ax = OneWeb.Menus.nav.GetOffset(a, "x");
      var ay = OneWeb.Menus.nav.GetOffset(a, "y");
      var aw = a.offsetWidth;
      var ah = a.offsetHeight;
      var bx = OneWeb.Menus.nav.GetOffset(b, "x");
      var by = OneWeb.Menus.nav.GetOffset(b, "y");
      var bw = b.offsetWidth;
      var bh = b.offsetHeight;
      if (((ax + aw) < bx) || (ax > (bx + bw)) || ((ay + ah) < by) || (ay > (by + bh))) return false;
      else return true;
    }

    this.CheckTag = function(t) {
      var found = false;
      for (var i = OneWeb.Menus.nav.NodeTag.length - 1; i >= 0; i--) {
        if (t.toLowerCase() == OneWeb.Menus.nav.NodeTag[i].toLowerCase()) {
          found = true;
          break;
        }
      }
      return found;
    }

    this.FixSelects = function() { if (document.all) for (var i = OneWeb.Menus.nav.Selects.length - 1; i >= 0; i--) if (OneWeb.Menus.nav.Selects[i].style.visibility == "hidden") OneWeb.Menus.nav.Selects[i].style.visibility = "visible"; }

    this.HuntMenu = function() { OneWeb.Menus.nav.Closing = true; setTimeout("OneWeb.Menus.nav.KillMenu('" + OneWeb.Menus.nav.Opened + "')", 550); }

    this.KillMenu = function(m) { if (OneWeb.Menus.nav.Closing && document.getElementById(m)) OneWeb.Menus.nav.CloseMenu(m); }

    this.CloseMenu = function(m) {
      var n = (m).replace("_menu", "");
      var menu = document.getElementById(m);
      var node = document.getElementById(n);
      node.className = (node.className).replace(" " + OneWeb.Menus.nav.NodeClass + "_on", "");
      menu.style.display = "none";
      OneWeb.Menus.nav.FixSelects();
    }

    this.MaintainMenu = function() { OneWeb.Menus.nav.Closing = false; }

    this.ShowMenu = function(e) {
      if (!e) var e = window.event;
      if (e.target) var elm = e.target;
      else var elm = e.srcElement;
      if (elm.nodeType == 3) elm = elm.parentNode; // defeat Safari bug
      while (!OneWeb.Menus.nav.CheckTag(elm.tagName)) elm = elm.parentNode;
      if (OneWeb.Menus.nav.Opened != "") OneWeb.Menus.nav.CloseMenu(OneWeb.Menus.nav.Opened);
      var menu = document.getElementById(elm.id + "_menu");
      if (menu) {
        if (menu.childNodes.length > 0) {
          elm.className = (elm.className).replace(" " + OneWeb.Menus.nav.NodeClass + "_on", "");
          elm.className = elm.className + " " + OneWeb.Menus.nav.NodeClass + "_on";
          var x = OneWeb.Menus.nav.PositionX(elm);
          var y = OneWeb.Menus.nav.PositionY(elm);
          menu.style.left = x + "px"
          menu.style.top = y + "px";
          menu.style.display = "block";
          if (document.all) for (var i = OneWeb.Menus.nav.Selects.length - 1; i >= 0; i--) if (OneWeb.Menus.nav.Overlapping(menu, OneWeb.Menus.nav.Selects[i])) OneWeb.Menus.nav.Selects[i].style.visibility = "hidden";
          if (OneWeb.Menus.nav.GetStyle(menu, "display") != "none") {
            OneWeb.Menus.nav.SetEvent(menu, "mouseover", OneWeb.Menus.nav.MaintainMenu);
            OneWeb.Menus.nav.SetEvent(menu, "mouseout", OneWeb.Menus.nav.HuntMenu);
            OneWeb.Menus.nav.Opened = menu.id;
          } else OneWeb.Menus.nav.Opened = "";
        }
      } else OneWeb.Menus.nav.Opened = "";
      OneWeb.Menus.nav.Closing = false;
    }

    // INITIALIZATION.	

    if (document.getElementById) {
      var ieMac = (document.all && navigator.userAgent.indexOf("Mac") != -1);
      if (!ieMac) {
        var node = new Array();
        for (var i = this.NodeTag.length - 1; i >= 0; i--) {
          var arr = this.GetElementsByClass(this.NodeClass, this.NodeTag[i]);
          for (var j = arr.length - 1; j >= 0; j--) node.push(arr[j]);
        }
        for (var i = node.length - 1; i >= 0; i--) {
          this.SetEvent(node[i], "mouseover", this.ShowMenu);
          this.SetEvent(node[i], "mouseout", this.HuntMenu);
        }
        if (document.all) this.Selects = document.getElementsByTagName("select");
      }
    }
  }
};

// initialize the menus
OneWeb.Util.appendInitEvent(function () { OneWeb.Menus.nav = new OneWeb.Menus.DDNavigator("a"); });
