/*
	DropDownMenu Script by Martijn Wieringa, info@php-solutions.nl
*/

function DropDownMenuObject()
{
	this.TIMER = null;
	this.TIMER_DELAY = 500;

	// Parse UL/LI list to dropdown menu
	this.load = function(f_wrapper_id, f_menu_item_height, f_menu_item_width, f_menu_margin_top, f_menu_margin_left, f_menu_zindex, f_menu_border_size, f_submenu_margin)
	{
		var oWrapper = document.getElementById(f_wrapper_id);

		if(oWrapper)
		{
			var a = oWrapper.getElementsByTagName('ul');

			if(a.length > 0)
			{
				// Add div.dropdownmenu_main
				var oDIV = document.createElement('div');
				oDIV.className = 'dropdownmenu_main';
				oDIV.style.zIndex = f_menu_zindex;

				oWrapper.appendChild(oDIV);

				this.parse(f_wrapper_id, oDIV, a[0], f_menu_item_height, f_menu_item_width, f_menu_margin_top, f_menu_margin_left, f_menu_zindex + 1, f_menu_border_size, f_submenu_margin);

				// Remove childnode from wrapper
				oWrapper.removeChild(a[0]);
			}
		}
	}

	this.parse = function(f_wrapper_id, f_wrapper, f_ul, f_menu_item_height, f_menu_item_width, f_menu_margin_top, f_menu_margin_left, f_menu_zindex, f_menu_border_size, f_submenu_margin)
	{
		// Parse inner LI's
		var iCount = 0;

		for(var i = 0; i < f_ul.childNodes.length; i++)
		{
			if((f_ul.childNodes[i].nodeType == 1) && (f_ul.childNodes[i].tagName.toLowerCase() == 'li'))
			{
				this.parseItem(f_wrapper_id, f_wrapper, f_ul.childNodes[i], 0, iCount, f_menu_item_height, f_menu_item_width, f_menu_margin_top, f_menu_margin_left, f_menu_zindex + 1, f_menu_border_size, f_submenu_margin, 'dropdownmenu_' + f_wrapper_id + '_' + iCount);
				iCount++;
			}
		}
	}

	// Fix LI (force styling & events)
	this.parseItem = function(f_wrapper_id, f_wrapper, f_li, f_layer, f_index, f_menu_item_height, f_menu_item_width, f_menu_margin_top, f_menu_margin_left, f_menu_zindex, f_menu_border_size, f_submenu_margin, f_prefix)
	{
		var oDIV = document.createElement('div');
		oDIV.className = 'dropdownmenu_item' + (f_li.className ? ' ' + f_li.className : ''); 

		oDIV.onmouseover = function() { var p = f_prefix; DROPDOWNMENU.show(this, p); }
		oDIV.onmouseout = function() { DROPDOWNMENU.hide(true); }


		// Parse inner <a>
		var a = f_li.getElementsByTagName('a');

		if(a.length)
		{
			if(f_layer > 0)
			{
				a[0].style.height = f_menu_item_height + 'px';
				a[0].style.lineHeight = f_menu_item_height + 'px';
			}

			oDIV.appendChild(a[0]);
			f_wrapper.appendChild(oDIV);


			// Parse inner <ul>
			var a = f_li.getElementsByTagName('ul');

			if(a.length)
			{
				this.parseSub(f_wrapper_id, a[0], f_layer + 1, f_index, f_menu_item_height, f_menu_item_width, f_menu_margin_top, f_menu_margin_left, f_menu_zindex + 1, f_menu_border_size, f_submenu_margin, f_prefix);
			}
		}
	}

	// Fix UL (force styling & events)
	this.parseSub = function(f_wrapper_id, f_ul, f_layer, f_index, f_menu_item_height, f_menu_item_width, f_menu_margin_top, f_menu_margin_left, f_menu_zindex, f_menu_border_size, f_submenu_margin, f_prefix)
	{
		var oDIV = document.createElement('div');

		oDIV.id = f_prefix;
		oDIV.className = 'dropdownmenu_sub dropdownmenu_sub_' + f_wrapper_id;
		oDIV.style.width = f_menu_item_width + 'px';
		oDIV.style.overflow = 'hidden';
		oDIV.style.zIndex = f_menu_zindex;

		if(f_layer > 1)
		{
			oDIV.setAttribute('__TOP', 0);
		}
		else
		{
			oDIV.setAttribute('__TOP', f_menu_margin_top);
		}

		if(f_layer > 1)
		{
			if(navigator.userAgent && (navigator.userAgent.indexOf('Firefox') != -1))
			{
				oDIV.setAttribute('__LEFT', f_menu_item_width + f_submenu_margin - f_menu_border_size);
			}
			else
			{
				oDIV.setAttribute('__LEFT', f_menu_item_width + f_submenu_margin);
			}
		}
		else
		{
			oDIV.setAttribute('__LEFT', f_menu_margin_left);
		}


		// Parse inner <li>'s
		var iCount = 0;

		for(var i = 0; i < f_ul.childNodes.length; i++)
		{
			if((f_ul.childNodes[i].nodeType == 1) && (f_ul.childNodes[i].tagName.toLowerCase() == 'li'))
			{
				this.parseItem(f_wrapper_id, oDIV, f_ul.childNodes[i], f_layer, iCount, f_menu_item_height, f_menu_item_width, f_menu_margin_top, f_menu_margin_left, f_menu_zindex + 1, f_menu_border_size, f_submenu_margin, f_prefix + '_' + iCount);
				iCount++;
			}
		}

		document.body.appendChild(oDIV);
	}

	this.show = function(f_element, f_name)
	{
		this.resetTimer();

		var a = document.getElementsByTagName('div');

		for(var i = 0; i < a.length; i++)
		{
			if(a[i].className.substr(0, 16) == 'dropdownmenu_sub')
			{
				if(f_name == a[i].id) // Self
				{
					if(f_element)
					{
						a[i].style.left = (DROPDOWNMENU.getOffsetLeft(f_element) + parseInt(a[i].getAttribute('__LEFT'))) + 'px'; 
						a[i].style.top = (DROPDOWNMENU.getOffsetTop(f_element) + parseInt(a[i].getAttribute('__TOP'))) + 'px';
					}

					a[i].style.display = 'block';
				}
				else if(a[i].id == f_name.substr(0, a[i].id.length)) // Show ancestors
				{
					a[i].style.display = 'block';
				}
				else
				{
					a[i].style.display = 'none';
				}
			}
		}
	}

	this.hide = function(f_delay)
	{
		this.resetTimer();

		if(f_delay) // Close all menu's with delay
		{
			DROPDOWNMENU.TIMER = setTimeout('DROPDOWNMENU.hide()', DROPDOWNMENU.TIMER_DELAY);
		}
		else // Hide ALL dropdownmenu_sub
		{
			var a = document.getElementsByTagName('div');

			for(var i = 0; i < a.length; i++)
			{
				if(a[i].className.substr(0, 16) == 'dropdownmenu_sub')
				{
					a[i].style.display = 'none';
				}
			}
		}
	}

	this.resetTimer = function()
	{
		if(DROPDOWNMENU.TIMER)
		{
			clearTimeout(DROPDOWNMENU.TIMER);
		}
	}

	// UTIL's
	this.getOffsetLeft = function(f_object)
	{
		var left = 0;

		do
		{
			left += f_object.offsetLeft;
		} 
		while(f_object = f_object.offsetParent);

		return left;
	}

	this.getOffsetTop = function(f_object)
	{
		var top = 0;

		do
		{
			top += f_object.offsetTop;
		} 
		while(f_object = f_object.offsetParent);

		return top;
	}
}

var DROPDOWNMENU = new DropDownMenuObject();
