﻿DropMenu = {};
DropMenu.SubMenuVisible = false;
DropMenu.Loaded = false;

DropMenu.Init = function(root) {
	var linkContainers = $(root).getElements(".linkContainer");

	var mainMenuID = "mainMenu";
	var categoryMenuID = "categoryMenu";

	var isCategoryMenu = (root == categoryMenuID);
	var activeLink = null;

	for (var i = 0; i < linkContainers.length; i++) {
		var linkContainer = linkContainers[i];
		var parent = linkContainer.getParent();

		linkContainer.Parent = linkContainer.getParent(".linkContainer");
		linkContainer.IsCategoryMenu = isCategoryMenu;

		linkContainer.SubMenu = linkContainer.getElement(".subMenu");
		linkContainer.Link = linkContainer.getElement("A");

		linkContainer.IsCurrent = (linkContainer.Link && location.href.indexOf(linkContainer.Link.get("href")) > -1) ? true : false;

		// Insert the arrow that indicates this link has a submenu.
		if (linkContainer.SubMenu != null) {
			var counter = new Element("SPAN");
			var linkWrapper = linkContainer.getElement(".linkWrapper");

			counter.addClass("counter");

			if (linkWrapper) {
				counter.inject(linkWrapper, "top");
			} else {
				counter.inject(linkContainer, "top");
			}

			if (linkWrapper) {
				linkWrapper.addClass("linkSubMenu");
			}
		}

		// Determine if this is a first level item in the drop down.
		if (parent.get("id") == mainMenuID || parent.get("id") == categoryMenuID) {
			linkContainer.IsFirstLevelItem = true;
		} else {
			linkContainer.IsFirstLevelItem = false;
		}

		// For the first item in the category menu, the menu opens on click.
		if (linkContainer.IsCategoryMenu && linkContainer.IsFirstLevelItem) {
			linkContainer.Link.addEvent("click", function() {
				var linkContainer = this.getParent();

				if (linkContainer.IsActive == true) {
					DropMenu.LinkOut(linkContainer);
				} else {
					DropMenu.LinkOver(linkContainer);
				}
			});

		} else {
			linkContainer.addEvent("mouseover", function() { DropMenu.LinkOver(this); });
			linkContainer.addEvent("mouseout", function() { DropMenu.LinkOut(this); });
		}

		if (linkContainer.IsCurrent) {
			activeLink = linkContainer;
		}
	}

	// Open the current item in the category menu.
	if (isCategoryMenu && activeLink) {
		var rootParent = activeLink.Parent;

		if (rootParent != null) {
			while (true) {
				rootParent.Link.addClass("currentItem");

				if (rootParent.Parent) {
					rootParent = rootParent.Parent;
				} else {
					break;
				}
			}

			DropMenu.LinkOver(rootParent, true);
		}
	}

	DropMenu.Loaded = true;
}

DropMenu.Setup = function(linkContainer) {
	linkContainer = $(linkContainer);
	
	if (linkContainer.IsCategoryMenu) {
		if (linkContainer.SubMenu != null) {

			// If this is a first level item, it needs to scroll up and down.
			if (linkContainer.IsFirstLevelItem) {
				linkContainer.SubMenu.Inner = linkContainer.SubMenu.getFirst();

				linkContainer.SubMenu.setStyle("display", "block");
				linkContainer.SubMenu.Inner.Size = linkContainer.SubMenu.getSize();
				linkContainer.SubMenu.setStyle("display", "none");

				linkContainer.SubMenu.Inner.setStyle("margin-top", (linkContainer.SubMenu.Inner.Size.y * -1) + "px");

				// Otherwise, it should just popup.
			} else {
				var size = linkContainer.Link.getSize();
				linkContainer.SubMenu.setStyle("margin-top", (size.y * -1) + "px");
			}
		}
	}

	linkContainer.Loaded = true;
}

DropMenu.LinkOver = function(linkContainer, instant) {
	if (linkContainer.Loaded != true) {
		DropMenu.Setup(linkContainer);
	}

	linkContainer = $(linkContainer);
	linkContainer.IsActive = true;

	DropMenu.ShowSubMenu(linkContainer, instant);

	linkContainer.addClass("overLink");
	linkContainer.getElement("A:not(.counter)").addClass("overLinkText");
}

DropMenu.ShowSubMenu = function(linkContainer, instant) {
	var subMenu = linkContainer.SubMenu;

	if (subMenu) {
		subMenu.IsActive = true;
		subMenu.addClass("activeSubMenu");
		subMenu.setStyle("display", "block");

		if (linkContainer.IsCategoryMenu) {
			if (linkContainer.IsFirstLevelItem) {
				if (subMenu.Inner.Effect) { subMenu.Inner.Effect.cancel(); }

				subMenu.Inner.Effect = new Fx.Morph(subMenu.Inner, { duration: 300 });

				if (instant == true) {
					subMenu.Inner.Effect.set({ 'margin-top': '0px' });
				} else {
					subMenu.Inner.Effect.start({ 'margin-top': '0px' });
				}

			} else {
				if (Website.isMSIE6) {
					DropMenu.ToggleSelects("hidden");
					DropMenu.SubMenuVisible = true;
				}
			}
		}
	}
}

DropMenu.LinkOut = function(linkContainer) {
	linkContainer = $(linkContainer);
	linkContainer.IsActive = false;

	DropMenu.HideSubMenu(linkContainer);

	var timeout = null;
	function delay() {
		if (!linkContainer.IsActive) {
			linkContainer.removeClass("overLink");
			linkContainer.getElement("A:not(.counter)").removeClass("overLinkText");
		}

		clearTimeout(timeout);
	}

	timeout = setTimeout(delay, 10);
}

DropMenu.HideSubMenu = function(linkContainer) {
	var subMenu = linkContainer.SubMenu;

	if (subMenu) {
		var timeout = null;
		var globalTimeout = null;

		subMenu.IsActive = false;
		DropMenu.SubMenuVisible = false;

		function delay() {
			if (!subMenu.IsActive) {
				function complete() {
					subMenu.removeClass("activeSubMenu");
					subMenu.setStyle("display", "none");
				}

				if (linkContainer.IsCategoryMenu && linkContainer.IsFirstLevelItem) {
					if (subMenu.Inner.Effect) { subMenu.Inner.Effect.cancel(); }

					subMenu.Inner.Effect = new Fx.Morph(subMenu.Inner, { duration: 300, complete: complete });
					subMenu.Inner.Effect.start({ 'margin-top': (subMenu.Inner.Size.y * -1) + 'px' });
				
				} else {
					complete();
				}
			}

			clearTimeout(timeout);
		}

		function showSelectBoxes() {
			DropMenu.ToggleSelects("visible");
		}

		timeout = setTimeout(delay, 10);

		if (Website.isMSIE6) {
			globalTimeout = setTimeout(showSelectBoxes, 100);
		}
	}
}

DropMenu.ToggleSelects = function(visibility) {
	if (DropMenu.Loaded && !DropMenu.SubMenuVisible) {
		var selects = $(document.body).getElements("SELECT");

		for (var s = 0; s < selects.length; s++) {
			selects[s].setStyle("visibility", visibility);
		}
	}
}
