$.fn.droppy = function() 
{
	this.each(function() 
	{
		var root = this, zIndex = 1000;
		$('ul', this).hide();
		$('ul', this).css("opacity", "1.0");
		
		//---
		function getSubnav(ele) 
		{
			if (ele.nodeName.toLowerCase() == 'li') 
			{
				var subnav = $('> ul', ele);
				return subnav.length ? subnav[0] : null;
			} 
			else 
			{
				return ele;
			}
		}
		//---
		function getActuator(ele) 
		{
			if (ele.nodeName.toLowerCase() == 'ul') 
			{
				return $(ele).parents('li')[0];
			} 
			else 
			{
				return ele;
			}
		}
		//---
		function hide() 
		{
			var subnav = getSubnav(this);
			if (!subnav) return;
			$.data(subnav, 'cancelHide', false);
			$.data(subnav, 'cancelShow', true);
			setTimeout(function() 
			{
				if (!$.data(subnav, 'cancelHide')) 
				{
					$(subnav).slideUp('fast');
					setTimeout(function() { $.data(subnav, 'cancelShow', false); }, 250);
				}
			}, 100);	
		}
		//---
		function show() 
		{
			var subnav = getSubnav(this);
			if (!subnav) return;
			
			$.data(subnav, 'cancelHide', true);
			
			if (!$.data(subnav, 'cancelShow')) $(subnav).css({zIndex: zIndex++}).slideDown('fast');
			
			if (this.nodeName.toLowerCase() == 'ul') 
			{
				$(getActuator(this)).addClass('hover');
			}
		}
		//---
		$('ul, li', this).hover(show, hide);
		$('li', this).hover(
      function() { $('> a', this).addClass('hover'); },
      function() { $('> a', this).removeClass('hover'); }
		)
	
	})
}

