﻿// creates a new drop-down menu
DropMenu = function(id)
{
	var me = this;
	
	this.element = document.all ? document.all[id] : document.getElementById(id);
	this.fixHover = document.all && navigator.appVersion.indexOf("MSIE 7.0") < 0;
	this.items = new Array();
	
	if (document.getElementsByTagName)
	{
		me.initialize();
	}
}

// initializes the menu
DropMenu.prototype.initialize = function()
{
	var root = this.element;
	var list = root.getElementsByTagName("li");
	
	// discover menu items
	for (var i = 0; i < list.length; i++)
	{
		var item = list[i];
		
		if (item.parentNode != null && item.parentNode.parentNode == root)
		{
			this.items.push(new DropMenuItem(item, this));
		}
	}
	
	// fix menu z-order when popping over form elements in IE
	if (document.all)
	{
		var subs = root.getElementsByTagName("ul");
		
		for (var i = 0; i < subs.length; i++)
		{
			var frameMenu = subs[i];
			var frame = frameMenu.appendChild(document.createElement("iframe"));
								
			frame.frameBorder = "0";
			frame.scrolling = "no";
			frame.src = "about:blank";
			frame.style.filter = "progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)";
			frame.style.left = "0px";
			frame.style.height = frameMenu.offsetHeight + "px";
			frame.style.position = "absolute";
			frame.style.top = "0px";
			frame.style.visibility = "hidden";
			frame.style.width = frameMenu.offsetWidth + "px";
			frame.style.zIndex = "-1";
			frameMenu.style.zIndex = "101";
		}
	}

	return this;
}

// creates a new item
DropMenuItem = function(element, menu, parent)
{
	var me = this;
	
	this.childItems = new Array();
	this.element = element;
	this.menu = menu;
	this.parent = parent;
	
	// hover fix for IE6
	if (this.menu.fixHover)
	{
		element.onmouseover = function()
		{
			this.classNameOld = this.className;
			this.className += " hover";
			this.toggleSubmenus();
		}
				
		element.onmouseout = function()
		{
			this.className = this.classNameOld;
			this.toggleSubmenus();
		}
		
		element.toggleSubmenus = function()
		{
			var frames = this.getElementsByTagName("iframe");
			
			for (var i = 0; i < frames.length; i++)
			{
				frames[i].style.visibility = frames[i].parentNode.currentStyle.visibility;

				if (!frames[i].positioned)
				{
					frames[i].style.height = frames[i].parentNode.offsetHeight + "px";
					frames[i].style.width = frames[i].parentNode.offsetWidth + "px";
					frames[i].positioned = true;
				}
			}
		}
	}
	
	// initialize the menu
	if (document.getElementsByTagName)
	{
		me.initialize();
	}
}

// gets the nesting depth of the menu
DropMenuItem.prototype.getDepth = function()
{
	if (this.parent != null)
	{
		return this.parent.getDepth() + 1;
	}
	
	return 0;
}

// gets the width of the item
DropMenuItem.prototype.getWidth = function()
{
	if (this.element != null)
	{
		return this.element.offsetWidth;
	}
	
	return 0;
}

// initializes the item
DropMenuItem.prototype.initialize = function()
{
	var root = this.element;
	var list = root.getElementsByTagName("li");
	var size = Math.max(this.parent != null ? this.parent.getWidth() : 0, this.getWidth());
	
	// add child items to the menu
	for (var i = 0; i < list.length; i++)
	{
		var item = list[i];
		
		if (item.parentNode != null && item.parentNode.parentNode == root)
		{
			this.childItems.push(new DropMenuItem(item, this.menu, this));
		}
	}

	// get the maximum size of any child items and set the menu width
	if (size > this.element.parentNode.offsetWidth)
	{
		this.element.parentNode.style.width = size + "px";
	}
	
	if (this.parent != null)
	{
		this.element.style.width = "100%";
	}
}

