PageSourceSearch

https://destroyerhistory.org/scripts/mnav.js

js destroyerhistory.org collected 2026-09-24 09:48:57 UTC 5,538 bytes, 120 lines download raw bytes

1(function($) {
2    var Mnav = {
3        init: function(options, elem) { // Initialize
4            var base = this;
5            base.$elem = $(elem);
6            base.options = $.extend({}, $.fn.Mnav.options, base.$elem.data(), options);
7            base.userOptions = options;
8            base.prepContainer();
9            base.buildWidget();
10        },
11        /** This is where the buttons are added to the nav **/
12        buildWidget: function() {
13            var base = this;
14            var mobileContainer = $('<div/>', {
15                class: "mnav-mobile-btn"
16            });
17            base.$elem.addClass(base.options.theme);
18            base.$elem.prepend(mobileContainer);
19            
20            if(base.options.mobileButtonPos === 'left') {
21                mobileContainer.css({left:0});
22            } else if(base.options.mobileButtonPos === 'right') {
23                mobileContainer.css({right:0});
24            } else if(base.options.mobileButtonPos === 'center') {
25                mobileContainer.css({margin:'auto',position:'relative'});
26                base.$elem.css({padding:'0'});
27            }
28            
29            if(!base.options.subMenuOpen) {
30                base.$elem.children('.mnav-menu').children('.mnav-menu-item').has('ul').prepend('<span class="mnav-open-close"><b class="mnav-mobile-arrow"></b></span>'); 
31            }
32            base.addListeners();
33        },
34        /** Adds listeners to the buttons **/
35        addListeners: function() {
36            var base = this;
37            // Open the main menu
38            base.$elem.children('.mnav-mobile-btn').on('click', function() {
39                base.openMenu();      
40            });
41            // Eww jQuery dropwdown for when we're in desktop view (hover)
42            base.$elem.children('.mnav-menu').on('mouseenter', '.mnav-menu-item', function(e) {
43                if(!base.$elem.children('.mnav-mobile-btn').is(':visible')) {
44                    $(this).children('.mnav-submenu').slideToggle(base.options.subMenuSpeed);
45                }
46            });
47            // Same as abot but when the mouse leaves
48            base.$elem.children('.mnav-menu').on('mouseleave', '.mnav-menu-item', function(e) {
49                if(!base.$elem.children('.mnav-mobile-btn').is(':visible')) {
50                    $(this).children('.mnav-submenu').delay(base.options.delayCloseSpeed).slideToggle(base.options.subMenuSpeed);
51                }          
52            });
53            if(!base.options.subMenuOpen) {
54                // Showing sub menus
55                base.$elem.children('.mnav-menu').on('click', '.mnav-open-close', function() {
56                    $(this).siblings('.mnav-submenu:not(li)').slideToggle(base.options.subMenuSpeed);
57                    $(this).children('.mnav-mobile-arrow').toggleClass('mnav-mobile-arrow-mirror');
58                });
59            }
60            // Show the menu again just in case
61            $(window).resize(function() {
62                if(!base.$elem.children('.mnav-mobile-btn').is(':visible')) {
63                    base.$elem.find('.mnav-submenu').hide();    
64                }
65                if(!base.$elem.children('.mnav-mobile-btn').is(':visible') && !base.$elem.children('.mnav-menu').is(':visible')) {
66                    base.$elem.children('.mnav-menu').show();
67                }
68                if(base.$elem.children('.mnav-mobile-btn').is(':visible') && base.options.subMenuOpen) {
69                    base.$elem.find('.mnav-submenu').show();
70                }
71            });
72        },
73        /** **/
74        prepEvents: function() {
75            var base = this;
76            base.$elem.on('mnav.open', function() {
77                base.openMenu();
78            });
79        },
80        /** This is where the necessary classes are added to the elements in your  nav **/
81        prepContainer: function() {
82            var base = this; 
83            base.$elem.children('ul').addClass('mnav-menu');
84            base.$elem.children('.mnav-menu')
85                .children('li').addClass('mnav-menu-item');
86            base.$elem.children('.mnav-menu')
87                .children('li')
88                    .children('ul').addClass('mnav-submenu');
89            base.$elem.children('.mnav-menu')
90                .children('li').children('ul')
91                    .children('li')
92                        .addClass('mnav-submenu-item');    
93        },
94        openMenu: function() {
95            var base = this;
96            if(base.options.subMenuOpen) {
97                base.$elem.find('.mnav-submenu').show();
98            }
99            base.$elem.children('.mnav-menu:not(li)').slideToggle(base.options.mainMenu
99Speed);            
100        }
101    };
102    $.fn.Mnav = function(options) {
103        return this.each(function() {
104          var mnav = Object.create(Mnav);
105          mnav.init(options, this);
106          $.data(this, 'Mnav', mnav);
107        });
108    };
109    $.fn.Mnav.options = {
110        theme: null,                // Base class to be used
111        
112        mainMenuSpeed: 200,         // How fast will the main menu slide down?
113        subMenuSpeed: 200,          // How fast will the sub menu slide down?
114        delayCloseSpeed: 250,       // How long to wait before the dropdown closes
115        
116        mobileButtonPos: 'center',   // Which side will the button be?
117        
118        subMenuOpen: false,         // Sub Menu open by default?
119    };
120})(jQuery);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.