/*
---
description: This provides a simple Drop Down menu with infinit levels

license: MIT-style

authors:
- Arian Stolwijk

requires:
  - Core/Class.Extras
  - Core/Element.Event
  - Core/Selectors

provides: [MooDropMenu, Element.MooDropMenu]

...
*/

var MooDropMenu = new Class({

    Implements: [Options, Events],

    options: {
            onOpen: function(el){
                    el.removeClass('close').addClass('open');
            },
            onClose: function(el){
                    el.removeClass('open').addClass('close');
            },
            onInitialize: function(el){
                    el.removeClass('open').addClass('close');
            },
            mouseoutDelay: 200,
            mouseoverDelay: 0,
            listSelector: 'ul',
            itemSelector: 'li',
            openEvent: 'mouseenter',
            closeEvent: 'mouseleave'
    },

    initialize: function(menu, options, level){
            this.setOptions(options);
            options = this.options;

            var menu = this.menu = document.id(menu);

            menu.getElements(options.itemSelector + ' > ' + options.listSelector).each(function(el){

                    this.fireEvent('initialize', el);

                    var parent = el.getParent(options.itemSelector),
                            timer;

                    parent.addEvent(options.openEvent, function(){
                            parent.store('DropDownOpen', true);

                            clearTimeout(timer);
                            if (options.mouseoverDelay) timer = this.fireEvent.delay(options.mouseoverDelay, this, ['open', el]);
                            else this.fireEvent('open', el);

                    }.bind(this)).addEvent(options.closeEvent, function(){
                            parent.store('DropDownOpen', false);

                            clearTimeout(timer);
                            timer = (function(){
                                    if (!parent.retrieve('DropDownOpen')) this.fireEvent('close', el);
                            }).delay(options.mouseoutDelay, this);

                    }.bind(this));

            }, this);
    },

    toElement: function(){
            return this.menu
    }

});

/* So you can do like this $('nav').MooDropMenu(); or even $('nav').MooDropMenu().setStyle('border',1); */
Element.implement({
    MooDropMenu: function(options){
            return this.store('MooDropMenu', new MooDropMenu(this, options));
    }
});

