var overButton  = false;
var overSubmenu = false;

var currentSubmenus = new Array();
var currentButton = null;
var currentTimer = null;

var mouseOutCloseDelay = 0.7;  //hier delay bis Menü schließt.
var fadeInDuration = 0.5;
var fadeOutDuration = 0.5;
var submenuAlpha = 0.95;
var activeButtonClassName = 'menu_active';

function openSubmenu( parent, submenuId )
{
	if( currentButton != null ) currentButton.removeClassName( activeButtonClassName );
	currentButton = parent;
	currentButton.addClassName( activeButtonClassName );
	
	currentSubmenus.each( function(e){
		e.hide().setStyle({opacity: 0.0});
	});
	
	currentSubmenus.clear();
	
	currentSubmenu = $(submenuId);
	
	currentSubmenu.hide().setStyle({opacity: 0.0});
	var topOffset = Element.getHeight( parent );
	Position.clone( parent, currentSubmenu, { setWidth:false, setHeight:false, offsetTop:topOffset } );
	var width = Element.getWidth( parent );
	currentSubmenu.style.width = width + "px";
	
	var queue = Effect.Queues.get('menuscope');
	queue.each(function(e) { e.cancel() });
	
	new Effect.Fade( currentSubmenu, { duration:fadeInDuration, from:0.0, to:submenuAlpha, queue: {position:'end', scope:'menuscope', limit:1} } );
	currentSubmenu.show();

	currentSubmenus.push( currentSubmenu );
	
	if ( currentTimer != null )
	{
		currentTimer.stop();
		currentTimer = null;
	}
}

function delayedCloseSubmenu()
{
	if ( currentTimer != null )
	{
		currentTimer.stop();
		currentTimer = null;
	}
	currentTimer = new PeriodicalExecuter( function( pe )
	{
		if ( !overButton && !overSubmenu && currentSubmenus.size() > 0 )
		{
			var queue = Effect.Queues.get('menuscope');
			var position;
			if ( queue.toArray().size() > 0 )
				position = queue.toArray().first().position;
			else
				position = null;
			if ( position == null ) position = submenuAlpha;
			queue.each( function(e) { e.cancel() } );
			
			currentSubmenu = currentSubmenus.first();
			
			currentSubmenus.shift();
			
			new Effect.Fade( currentSubmenu, { duration:fadeOutDuration, from:position, to:0.0, queue: {position:'end', scope:'menuscope', limit:1} } );
			if ( currentButton )
			{
				currentButton.removeClassName( activeButtonClassName );		
				currentButton  = null;			
			}
		}
		pe.stop();
	}, mouseOutCloseDelay );
}
