var Menu = Class.create({
    
    /**
     * constructor. kinda :)
     */
    initialize: function(element) { 
        this.element = $(element);
        var items = $A(this.element.getElementsByTagName('li'));
        items.each(function(item) { 
            Event.observe(item, 'mouseover', function() {
                this.showMenu(item);
            }.bind(this));
        }.bind(this) );
        Event.observe(this.element, 'mouseover', this._menuMouseOverEvent.bindAsEventListener(this));
        Event.observe(this.element, 'mouseout', this._menuMouseOutEvent.bindAsEventListener(this));
    },
    
    /**
     * Menu laten zien
     */
    showMenu: function(element) {
        
        var ul = element.parentNode;
    	while (ul) {
    		if (ul.tagName.toLowerCase() == 'ul') {
    			this.hideMenu(ul, element);
    			break;
    		}
    
    		ul = ul.parentNode;
    	}
    
    	ul = element.firstChild;
    	while (ul) {
    		if (ul.nodeType == 1 && ul.tagName.toLowerCase() == 'ul') {
    			ul.style.display = 'block';
    			ul.style.visibility = ''; // necessary for IE
    			break;
    		}
    
    		ul = ul.nextSibling;
    	}
    
    },
    
    /**
     * Menu verbergen
     */
    hideMenu: function(level, listitem) { 
    	var stack = [level], i = 0, li, j, el, tag;
    	do
    	{
    		li = stack[i].childNodes, j = li.length;
    		while (j--)
    		{
    			el = li[j];
    			if (el.nodeType == 1 && el != listitem)
    			{
    				tag = el.tagName.toLowerCase();
    				if (tag == 'li')
    				{
    					stack[i++] = el;
    				}
    				else if (tag == 'ul' && el.style.display == 'block')
    				{
    					stack[i++] = el;
    					el.style.display = 'none';
    					el.style.visibility = 'hidden'; // necessary for IE
    				}
    			}
    		}
    	}
    	while (i--);    
    },
    
    /**
     * Timer starten
     */
    setTimer: function() { 
        this.timer = setTimeout(function() {
            this.hideMenu(this.element, null);            
        }.bind(this), 1000);
    },
    
    /**
     * Timer verwijderen
     */
    clearTimer: function() { 
        if (this.timer) {
            clearTimeout(this.timer);
            this.timer = undefined;
        }
    },
    
    /**
     * Menu mouse over
     */
    _menuMouseOverEvent: function(event) { 
        this.clearTimer();
    },
    
    /**
     * Menu mouse out
     */
    _menuMouseOutEvent: function(event) { 
        this.setTimer();
    }
    
});
