// --------------------------------------------------------------------------------
// 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"); });

