/**
 * Menu Class
 * Aron Rotteveel
 * 
 * Gebruik: new Menu('id_van_menu');
 *
 * @requires prototype 1.6.0.2 +
 * @version 1.0
 * @lastmod 12-09-08
 */
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();
    }
    
});