document.observe("dom:loaded", function() {
    $$('ul.submenu').each(function(item) {
	var selectedSubMenu = item.getElementsBySelector('li.selected');
	var parent = item.up();
	item.parentHeight = parent.offsetHeight;
	if(selectedSubMenu.length < 1) {
	    if(!parent.hasClassName('selected')) {
		item.opening = false;
		item.setOpacity(0);
		parent.observe("mouseover", function(event) {
		    menuEffect(item, item.parentHeight + item.offsetHeight, true);
		});
		parent.observe("mouseout", function() {
		    item.timer = menuEffect.delay(0.5, item, item.parentHeight, false);
		});
	    } else {
		$("menu").getElementsBySelector('li.selected').each(function(li) {
		    li.removeClassName("selected");
		});
		menuEffect(item, item.parentHeight + item.offsetHeight, true);
	    }
	} else {
	    $("menu").getElementsBySelector('li.selected').each(function(li) {
		if(li != selectedSubMenu[0]) {
		    li.removeClassName("selected");
		}
	    });
	    menuEffect(item, item.parentHeight + item.offsetHeight, true);
	}
    });
});

function menuEffect(item, to, opening) {
    if(item.timer) {
	window.clearTimeout(item.timer);
	item.timer = null;
    }
    
    var parent = item.up();
    var doEffect = false;
    item.opening = opening;
    
    if(opening && parent.offsetHeight == item.parentHeight) {
	parent.addClassName("selected");
	doEffect = true;
    } else if(!opening && parent.offsetHeight == item.parentHeight + item.offsetHeight) {
	doEffect = true;
    }
    
    if(doEffect) {
	if(item.effect) {
	    item.effect.cancel();
	}
        item.effect = new Effect.Parallel([
	    new Effect.Tween(null, item.up().offsetHeight, to, {sync: true},function(p) {
		item.up().style.height = p + "px";
	    }), 
	    new Effect.Opacity(item, {sync:true, to:(opening?1:0)}) 
        ], { 
            duration: 2,
            afterFinish: function() {
            	if(!opening) {
            	    item.up().removeClassName("selected");
            	}
            	if(opening != item.opening) {
            	    menuEffect(item, item.opening ? item.parentHeight + item.offsetHeight : item.parentHeight, item.opening);
            	}
            }
        });
    }
}
