/*##########################################
#                                          #
#    Author: David                         #
#    Date: 24/10/2008                      #
#                                          #                 
##########################################*/

/**************
*** OPTIONS ***
***************
gebruik: var CMenu = new Menu({'name':value});
bv: var CMenu = new Menu({'slide':true,'openOn':'click'});

- id: {} REQUIRED!
  --> id van het menu dat moet gebruikt worden. 
  
- openOn: {'click', 'mouseenter'} default: 'mouseenter'       
  --> wanneer moet het menu openen?
  
- closeOn: {'click', 'mouseleave'} default: 'mouseleave'                   
  --> wanneer moet het menu sluiten?
  
- singleOpen: {true, false} default: true                           
  --> mag er maar één menu tegelijk open zijn?

- transIn: {'regular', 'fade', 'slide'} default: 'regular'
  --> hoe moet het menu openen?

- transIn: {'regular', 'fade', 'slide'} default: 'regular'
  --> hoe moet het menu sluiten?
*/

window.addEvent('domready', function() {
var CMenu = new Menu({ 'id': 'TopNavigation', 'transIn': 'slide', 'transOut': 'slide', 'singleOpen': 'true' });
    var div = document.getElementById("TopNavigation");
    var uls = div.getChildren()[0].getElementsByTagName("ul");
    for(var i=0; i<uls.length; i++)
        uls[i].style.display = 'block';
});

var Menu = new Class({
    id: '',
    openOnEvent: 'mouseenter',
    closeOnEvent: 'mouseleave',
    singleOpen: true,
    transIn: 'slide',
    transOut: 'slide',

    initialize: function(options) {
        this.analyzeOptions(options);

        var openOnEvent = this.openOnEvent;
        var closeOnEvent = this.closeOnEvent;
        var singleOpen = this.singleOpen; //wordt nog niet gebruikt!
        var transIn = this.transIn;
        var transOut = this.transOut;

        if (this.id == '') {
            alert("Er is geen id opgegeven.");
            return;
        }
        var ul = $(this.id);
        if (ul == undefined) {
            alert("Het element met id '" + this.id + "' werd niet gevonden.");
        }

        ul.getElements('li').each(function(el, i) {
            el.getChildren().each(function(e) {
                //if (e == '[object HTMLUListElement]') {
                if (e.tagName == 'UL') {

                    /***********
                    *** INIT ***
                    ***********/
                    if (transIn == 'regular' && transOut == 'regular') {
                        e.style.display = 'none';
                    }
                    if ((transIn == 'slide' && transOut == 'fade') || (transIn == 'fade' && transOut == 'slide')) {
                        var slider = new Fx.Slide(e, { 'duration': 400 });
                        slider.hide();
                        e.style.position = 'relative';
                        e.getParent().fade('hide');
                    }
                    else {
                        if (transIn == 'slide' || transOut == 'slide') {
                            var slider = new Fx.Slide(e, { 'duration': 175 });
                            slider.hide();
                            e.style.filter = 'alpha(opacity = 0)';
                            e.style.position = 'relative';
                        }
                        if (transIn == 'fade' || transOut == 'fade') {
                            e.style.display = 'none';
                            e.fade('hide');
                        }
                    }

                    /***********
                    *** OPEN ***
                    ************/
                    el.addEvent(openOnEvent, function() {
                    e.style.filter = 'alpha(opacity = 80)';
                        switch (transIn) {
                            case 'regular':
                                switch (transOut) {
                                    case 'regular':
                                        if (e.style.display != 'block')
                                            e.style.display = 'block';
                                        else
                                            e.style.display = 'none';
                                        break;
                                    case 'slide':
                                        slider.show();
                                        
                                        break;
                                    case 'fade':
                                        e.style.display = 'block';
                                        e.fade('show');
                                        break;
                                }
                                break;
                            case 'slide':
                                slider.cancel();
                                if (transOut == 'fade') {
                                    slider.hide();
                                    e.getParent().fade('show');
                                }
                                slider.slideIn();
                                break;
                            case 'fade':
                                switch (transOut) {
                                    case 'regular':
                                    case 'fade':
                                        e.style.display = 'block';
                                        e.fade(1);
                                        break;
                                    case 'slide':
                                        e.getParent().fade('hide');
                                        slider.show();
                                        e.getParent().fade(1);
                                        break;
                                }
                                break;
                        }
                    });

                    /************
                    *** CLOSE ***
                    *************/
                    if (openOnEvent != closeOnEvent) {
                        el.addEvent(closeOnEvent, function() {
                            switch (transOut) {
                                case 'regular':
                                    switch (transIn) {
                                        case 'regular':
                                            e.style.display = 'none';
                                            break;
                                        case 'slide':
                                            slider.hide();
                                            break;
                                        case 'fade':
                                            e.fade('hide');
                                            break;
                                    }
                                    break;
                                case 'slide':
                                    slider.cancel();
                                    slider.slideOut();
                                    break;
                                case 'fade':
                                    switch (transIn) {
                                        case 'regular':
                                            e.fade(0);
                                            break;
                                        case 'slide':
                                            e.getParent().fade(0);
                                            break;
                                        case 'fade':
                                            e.fade(0);
                                            break;
                                    }

                                    break;
                            }
                        });
                    }
                }
            });
        });
    },

    analyzeOptions: function(options) {
        if (options == undefined) return;

        if (options.id != undefined)
            this.id = options.id;

        if (options.openOn != undefined)
            this.openOnEvent = options.openOn;

        if (options.closeOn != undefined)
            this.closeOnEvent = options.closeOn;

        if (options.singleOpen != undefined)
            this.singleOpen = options.singleOpen;

        if (options.transIn != undefined)
            this.transIn = options.transIn;

        if (options.transOut != undefined)
            this.transOut = options.transOut;
    }
});
