(function($){
    $.fn.extend({
    megamenu: function(options) {
        var defaults = {
            event: 'hover',         // not yet implement: hover, click
            eventdelay: 0,          // not yet implement
            openspeed: 250,
            openeffect: '',         // not yet implement
            closespeed: 500,
            closeeffect: '',        // not yet implement
            resettimer: 1000,
            mode: 0                //once=0, multiopen=1, tracking not yet implement=2
        };

        var opts = $.extend(defaults, options);
        var $this = $(this);
        
        var closetimer;
        var clickhandlercount = 0;
        var openAnim = false;
        var cursubmenu = null;
        var nextopensubmenu = null;
        var opensubmenu = null;
        var global_localsubmenu = null;
        var countopensubmenu = 0;
        var lastopensubmenu = null;
        var nextclosesubmenu = null;
        
        function setup() {
            resettimer();
            hideallsubmenu();
            
            $this.children('ul').children('li').each(function() {
               if ($(this).children('.submenu').is('.submenu') ) {
                    $(this).hover(function() {
                        var localcursubmenu = this;
                        global_localcursubmenu = localcursubmenu;
                        resettimer();              

                        cursubmenu = this;
                        nextopensubmenu = cursubmenu;
                        if ((openAnim == false) || (opts.mode == 1)) {
                           if (opts.mode == 1) {
                                if (lastopensubmenu != cursubmenu) {
                                    if (lastopensubmenu) {
                                        closesubmenu(lastopensubmenu);
                                        lastopensubmenu = null;
                                    }

                                    countopensubmenu++;
                                }
                           }
                           
                           showmenu(localcursubmenu);
                        }

                    }, 
                        function() { 
                            if (opts.mode == 1) {
                                settimer(global_localcursubmenu);
                                if (countopensubmenu > 1) {
                                    closesubmenu(global_localcursubmenu);
                                }
                                else {
                                    lastopensubmenu = global_localcursubmenu;
                                }
                            }
                            else {
                                nextopensubmenu = null;
                                settimer(opensubmenu);
                            }
                        }
                    );
                }
                else {
                    $(this).hover(function() 
                        {
                          resettimer();
                          closeallsubmenu();
                        },
                        function() {}
                    );
                }
            });
            
        }
                  
        function showmenu(submenu) {
           if (nextclosesubmenu) {
            return;
           }
           
           if (cursubmenu != opensubmenu) { // Animation starten, wenn das aktuelle Submenü sich vom offenen Submenü unterscheidet
                if (opts.mode == 1) {
                    opensubmenu = null;
                    nextopensubmenu = submenu;
                }
                
                if (opensubmenu) { // Wenn ein Submenu offen ist, diesen schließen und den nächsten öffen
                    // offenes Submenü schließen
                    openAnim = true;
                    $(opensubmenu).children('.submenu').slideUp(opts.closespeed, 
                        function() { 
                            cursubmenu = nextopensubmenu;
                            opensubmenu = cursubmenu;
                            openAnim = false;
                            // nextes Submenü öffnen
                            if (nextopensubmenu) {
                                openAnim = true;
                                $(nextopensubmenu).children('.submenu').slideDown(opts.openspeed, 
                                    function () {
                                        openAnim = false; // Animationsende markieren
                                        showmenu();       // Sobald die Animation abgeschlossen ist, prüfen ob ein anderes Submenü geöffnet werden soll */
                                    }
                                )
                            };
                        }
                    );
                }
                else { // Wenn kein Submenü offen ist, den nächsten Submenü öffen */
                    cursubmenu = nextopensubmenu;
                    opensubmenu = cursubmenu;
                    // aktuelles Submenü öffnen
                    openAnim = true;
                    $(opensubmenu).children('.submenu').slideDown(opts.openspeed, 
                        function () {
                            openAnim = false;   // Animationsende markieren
                            
                            if (opts.mode == 0) {
                                showmenu();         // Sobald die Animation abgeschlossen ist, prüfen ob ein anderes Submenü geöffnet werden soll
                            }
                        }
                    );
                }
            }
            else {  // Wenn das offene Submenü dem aktuellen Submenü entspricht wird keine Animation ausgeführt
                return;
            }
        }
        
        function hideallsubmenu() {
            $this.find('.submenu').hide();
            openAnim = false;
            if (opts.mode == 1) {
                countopensubmenu = 0;
            }
        }
        
        function closeallsubmenu() {
            $this.find('.submenu').stop(true, true);
            openAnim = false;
            $this.find('.submenu').each(function() {
                if ($(this).is(':visible')) {
                    openAnim = true;
                    nextclosesubmenu = true;
                    $(this).slideUp(opts.closespeed, 
                        function () {
                            openAnim = false;
                            opensubmenu = null;
                            nextclosesubmenu = false;
                            if (nextopensubmenu) {
                                showmenu(nextopensubmenu);
                            }
                        }
                    );
                }
            });
            
            if (opts.mode == 1) {
                countopensubmenu = 0;
            }
        }
        
        function closesubmenu(submenu_t) {
            openAnim = true;
            $(submenu_t).children('.submenu').slideUp(opts.closespeed, 
                function () {
                    openAnim = false;
                    opensubmenu = null;
                }
            );
            
            if (opts.mode == 1) {
                countopensubmenu--;
                if (countopensubmenu < 0) { countopensubmenu = 0; }
            }
        }
        
        function settimer(submenu) {
            closetimer = window.setTimeout(
                function() { 
                    //closesubmenu(submenu); 
                    closeallsubmenu();
                    $(document).unbind('click.oneclick');
                    if (opts.mode == 1) { 
                        lastopensubmenu = null; 
                    } 
                }, 
                opts.resettimer
            );
            
            if (opts.mode == 1) {
                $(document).unbind('click.oneclick');
                $(document).one('click.oneclick', function() {
                        resettimer();
                        closesubmenu(submenu);
                        lastopensubmenu = null;
                });
            }
            else {
                if (clickhandlercount <= 0) {
                    clickhandlercount++;
                    $(document).one('click.oneclick', function() {
                        resettimer();
                        closesubmenu(opensubmenu);
                        clickhandlercount--; 
                    });
                }
            }
        }
        
        function resettimer() {
             if(closetimer){  
                window.clearTimeout(closetimer);
                closetimer = null;
            }
        }
        
        setup();
    }
    
})})(jQuery)
