PageSourceSearch

https://idxsti.co.id/assets/js/navigation.js

js idxsti.co.id collected 2026-09-24 13:50:56 UTC 19,964 bytes, 500 lines download raw bytes

1 
2;(function ( $, window, document, undefined ){
3 
4    $.navigation = function(element, options){
5 
6        var defaults = {
7            responsive: true,
8            mobileBreakpoint: 1000,
9            showDuration: 300,
10            hideDuration: 300,
11            showDelayDuration: 0,
12            hideDelayDuration: 0,
13            submenuTrigger: "hover",
14            effect: "fade",
15            submenuIndicator: true,
16			submenuIndicatorTrigger: false,
17            hideSubWhenGoOut: true,
18            visibleSubmenusOnMobile: false,
19            overlay: true,
20            overlayColor: "rgba(0, 0, 0, 0.7)",
21            hidden: false,
22			hiddenOnMobile: false,
23            offCanvasSide: "left",
24			offCanvasCloseButton: true,
25			animationOnShow: "",
26			animationOnHide: "",
27			hideScrollBar: true,
28            onInit: function() {},
29			onLandscape: function() {},
30			onPortrait: function() {},
31            onShowOffCanvas: function() {},
32            onHideOffCanvas: function() {}
33        };
34 
35        var plugin = this,
36            bigScreenFlag = Number.MAX_VALUE,
37            smallScreenFlag = 1,
38            clickTouchEvents = "click.nav touchstart.nav",
39            hoverShowEvents = "mouseenter focusin",
40            hoverHideEvents = "mouseleave focusout";
41        plugin.settings = {};
42        var $element = $(element), element = element;
43        
44        if($(element).find(".nav-search").length > 0){
45            $(element).find(".nav-search").find("form").prepend("<span class='nav-search-close-button' tabindex='0'>&#10005;</span>");
46        }
47 
48        plugin.init = function(){
49            plugin.settings = $.extend({}, defaults, options);
50			
51			if(plugin.settings.offCanvasCloseButton){
52				$(element).find(".nav-menus-wrapper").prepend("<span class='nav-menus-wrapper-close-button'>&#10005;</span>");
53			}
54            
55            if(plugin.settings.offCanvasSide == "right"){
56                $(element).find(".nav-menus-wrapper").addClass("nav-menus-wrapper-right");
57            }
58            
59            if(plugin.settings.hidden){
60                $(element).addClass("navigation-hidden");
61                plugin.settings.mobileBreakpoint = 99999;
62            }
63            
64            checkSubmenus();
65            
66            $(element).find(".nav-toggle").on("click touchstart", function(e){
67                e.stopPropagation(); 
68                e.preventDefault();
69                plugin.showOffcanvas();
70                if(options !== undefined){
71                    plugin.callback("onShowOffCanvas");
72                }
73            });
74            
75            $(element).find(".nav-menus-wrapper-close-button").on("click touchstart", function(){
76                plugin.hideOffcanvas();
77                if(options !== undefined){
78                    plugin.callback("onHideOffCanvas");
79                }
80            });         
81 
82            $(element).find(".nav-search-button, .nav-search-close-button").on("click touchstart keydown", function(e){
83                e.stopPropagation(); 
84                e.preventDefault();
85				var code = e.keyCode || e.which;
86				if(e.type === "click" || e.type === "touchstart" || (e.type === "keydown" && code == 13)){
87					plugin.toggleSearch();
88				}
89				else{
90					if(code == 9){
91						$(e.target).blur();
92					}
93				}
94            });
95            
96            $(window).resize(function(){
97                plugin.initNavigationMode(windowWidth());
98                fixSubmenuRightPosition();
99				if(plugin.settings.hiddenOnMobile){
100					hideNavbarPortrait();
101				}
102            });
103            
104            plugin.initNavigationMode(windowWidth());
105			
106			if(plugin.settings.hiddenOnMobile){
107				hideNavbarPortrait();
108			}
109			
110			if(plugin.settings.overlay){
111                $(element).append("<div class='nav-overlay-panel'></div>");
112			}
113			
114			if($(element).find(".megamenu-tabs").length > 0){
115                activateTabs();
116            }
117            
118            if(options !== undefined){
119                plugin.callback("onInit");
120            }
121        };
122		
123		// reset submenus
124		var resetSubmenus = function(){
125			$(element).find(".nav-submenu").hide(0);
126			$(element).find("li").removeClass("focus");
127		};
128        
129        // check the existence of submenus/add indicators to them
130        var checkSubmenus = function(){
131            $(element).find("li").each(function(){
132                if($(this).children(".nav-dropdown,.megamenu-panel").length > 0){
133                    $(this).children(".nav-dropdown,.megamenu-panel").addClass("nav-submenu");
134                    if(plugin.settings.submenuIndicator){
135                        $(this).children("a").append(
136                            "<span class='submenu-indicator'>" + 
137                                "<span class='submenu-indicator-chevron'></span>" +
138                            "</span>"
139                        );
140                    }
141                }
142            });
143        };
144		
145		//hide navbar on portrait mode
146		var hideNavbarPortrait = function(){
147			if($(element).hasClass("navigation-portrait")){
148				$(element).addClass("navigation-hidden");
149			}
150			else{
151				$(element).removeClass("navigation-hidden");
152			}
153		};
154        
155        // show a submenu
156        plugin.showSubmenu = function(parentItem, submenuEffect){
157            if(windowWidth() > plugin.settings.mobileBreakpoint){
158                $(element).find(".nav-search").find("form").fadeOut();
159            }
160            if(submenuEffect == "fade"){
161                $(parentItem).children(".nav-submenu")
162                    .stop(true, true)
163                    .delay(plugin.settings.showDelayDuration)
164                    .fadeIn(plugin.settings.showDuration)
165					.removeClass(plugin.settings.animationOnHide)
166					.addClass(plugin.settings.animationOnShow);
167            }
168            else{
169                $(parentItem).children(".nav-submenu")
170                    .stop(true, true)
171                    .delay(plugin.settings.showDelayDuration)
172                    .slideDown(plugin.settings.showDuration)
173					.removeClass(plugin.settings.animationOnHide)
174					.addClass(plugin.settings.animationOnShow);
175            }
176			$(parentItem).addClass("focus");
177        };
178        
179        // hide a submenu
180        plugin.hideSubmenu = function(parentItem, submenuEffect){
181            if(submenuEffect == "fade"){
182                $(parentItem).find(".nav-submenu")
183                    .stop(true, true)
184                    .delay(plugin.settings.hideDelayDuration)
185                    .fadeOut(plugin.settings.hideDuration)
186					.removeClass(plugin.settings.animationOnShow)
187					.addClass(plugin.settings.animationOnHide);
188            }
189            else{
190                $(parentItem).find(".nav-submenu")
191                    .stop(true, true)
192                    .delay(plugin.settings.hideDelayDuration)
193                    .slideUp(plugin.settings.hideDuration)
194					.removeClass(plugin.settings.animationOnShow)
195					.addClass(plugin.settings.animationOnHide);
196            }
197			$(parentItem).removeClass("focus").find(".focus").removeClass("focus");
198        };
199        
200        // show the overlay panel
201        var showOverlay = function(){
202			if(plugin.settings.hideScrollBar){
203				$("body").addClass("no-scroll");
204			}
205            if(plugin.settings.overlay){
206                $(element).find(".nav-overlay-panel")
207                    .css("background-color", plugin.settings.overlayColor)
208                    .fadeIn(300)
209                    .on("click touchstart", function(){
210                        plugin.hideOffcanvas();
211                    });
212            }
213        };
214        
215        // hide the overlay panel
216        var hideOverlay = function(){
217			if(plugin.settings.hideScrollBar){
218				$("body").removeClass("no-scroll");
219			}
220            if(plugin.settings.overlay){
221                $(element).find(".nav-overlay-panel").fadeOut(400);
222            }
223        };
224 
225        // show offcanvas
226        plugin.showOffcanvas = function(){
227            showOverlay();
228            if(plugin.settings.offCanvasSide == "left"){
229                $(element).find(".nav-menus-wrapper").css("transition-property", "left").addClass("nav-menus-wrapper-open");
230            }
231            else{
232                $(element).find(".nav-menus-wrapper").css("transition-property", "right").addClass("nav-menus-wrapper-open");
233            }
234        };
235        
236        // hide offcanvas 
237        plugin.hideOffcanvas = function(){          
238            $(element).find(".nav-menus-wrapper").removeClass("nav-menus-wrapper-open")
239                .on("webkitTransitionEnd moztransitionend transitionend oTransitionEnd", function(){
240                    $(element).find(".nav-menus-wrapper")
241                        .css("transition-property", "none")
242                        .off();
243            });
244            hideOverlay();
245        };
246        
247        // toggle offcanvas
248        plugin.toggleOffcanvas = function(){
249            if(windowWidth() <= plugin.settings.mobileBreakpoint){
250                if($(element).find(".nav-menus-wrapper").hasClass("nav-menus-wrapper-open")){
251                    plugin.hideOffcanvas();
252                    if(options !== undefined){
253                        plugin.callback("onHideOffCanvas");
254                    }
255                }
256                else{
257                    plugin.showOffcanvas();
258                    if(options !== undefined){
259                        plugin.callback("onShowOffCanvas");
260                    }
261                }
262            }
263        };
264        
265        // show/hide the search form
266        plugin.toggleSearch = function(){
267            if($(element).find(".nav-search").find("form").css("display") == "none"){
268                $(element).find(".nav-search").find("form").fadeIn(200);
269				$(element).find(".nav-search").find("input").focus();
270            }
271            else{
272                $(element).find(".nav-search").find("form").fadeOut(200);
273				$(element).find(".nav-search").find("input").blur();
274            }
275        };
276        
277        // set the navigation mode and others configs
278        plugin.initNavigationMode = function(screenWidth){
279            if(plugin.settings.responsive){
280                if(screenWidth <= plugin.settings.mobileBreakpoint && bigScreenFlag > plugin.settings.mobileBreakpoint){
281                    $(element).addClass("navigation-portrait").removeClass("navigation-landscape");
282                    portraitMode();
283					if(options !== undefined){
284						plugin.callback("onPortrait");
285					}
286                }
287                if(screenWidth > plugin.settings.mobileBreakpoint && smallScreenFlag <= plugin.settings.mobileBreakpoint){
288                    $(element).addClass("navigation-landscape").removeClass("navigation-portrait");
289                    landscapeMode();
290                    hideOverlay();
291                    plugin.hideOffcanvas();
292					if(options !== undefined){
293						plugin.callback("onLandscape");
294					}
295                }
296                bigScreenFlag = screenWidth;
297                smallScreenFlag = screenWidth;
298            }
299            else{
300				$(element).addClass("navigation-landscape");
301                landscapeMode();
302				if(options !== undefined){
303					plugin.callback("onLandscape");
304				}
305            }
306        };
307        
308         // hide submenus/form when click/touch outside
309        var goOut = function(){
310            $("html").on("click.body touchstart.body", function(e){
311                if($(e.target).closest(".navigation").length === 0){
312					$(element).find(".nav-submenu").fadeOut();
313					$(element).find(".focus").removeClass("focus");
314                    $(element).find(".nav-search").find("form").fadeOut();
315                }
316            });
317        };
318        
319        // return the window's width
320        var windowWidth = function(){
321            return window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
322        };
323        
324        // unbind events
325        var unbindEvents = function(mode){
326			if(mode == "landscape")
327				$(element).find(".nav-menu").find("li, a").off(clickTouchEvents)
328			else
329                $(element).find(".nav-menu").find("li, a").off(hoverShowEvents).off(hoverHideEvents);
330        };
331        
332        // fix submenu right position
333        var fixSubmenuRightPosition = function(){
334            if(windowWidth() > plugin.settings.mobileBreakpoint){
335                var navWidth = $(element).outerWidth();
336                $(element).find(".nav-menu").children("li").children(".nav-submenu").each(function(){
337                    if($(this).parent().position().left + $(this).outerWidth() > navWidth){
338                        $(this).css("right", 0);
339                    }
340                    else{
341                        $(this).css("right", "auto");
342                    }
343                });
344            }
345        };
346        
347        // activate the tabs
348        var activateTabs = function(){          
349            function initTabs(tabs){
350                var navs = $(tabs).children(".megamenu-tabs-nav").children("li");
351                var panes = $(tabs).children(".megamenu-tabs-pane");
352                $(navs).on("mouseenter.tabs click.tabs touchstart.tabs", function(e){
353                    e.stopPropagation(); 
354                    e.preventDefault();
355                    $(navs).removeClass("active");
356                    $(this).addClass("active");
357                    $(panes).hide(0).removeClass("active");
358                    $(panes[$(this).index()]).show(0).addClass("active");
359                });
360            }
361            
362            if($(element).find(".megamenu-tabs").length > 0){
363                var navigationTabs = $(element).find(".megamenu-tabs");
364                for(var i = 0; i < navigationTabs.length; i++){
365                    initTabs(navigationTabs[i]);
366                }
367            }
368        };
369        
370        // set the landscape mode
371        var landscapeMode = function(){
372            unbindEvents("landscape");
373            resetSubmenus();
374            if(navigator.userAgent.match(/Mobi/i) || navigator.maxTouchPoints > 0 || plugin.settings.submenuTrigger == "click"){
375                $(element).find(".nav-menu, .nav-dropdown").children("li").children("a").on(clickTouchEvents, function(e){
376                    plugin.hideSubmenu($(this).parent("li").siblings("li"), plugin.settings.effect);
377                    $(this).closest(".nav-menu").siblings(".nav-menu").find(".nav-submenu").fadeOut(plugin.settings.hideDuration);
378                    if($(this).siblings(".nav-submenu").length > 0){
379                        e.stopPropagation(); 
380                        e.preventDefault();
381                        if($(this).siblings(".nav-submenu").css("display") == "none"){
382                            plugin.showSubmenu($(this).parent("li"), plugin.settings.effect);
383                            fixSubmenuRightPosition();
384							return false; 
385                        }
386                        else{
387                            plugin.hideSubmenu($(this).parent("li"), plugin.settings.effect);
388                        }
389                        if($(this).attr("target") === "_blank" || $(this).attr("target") === "blank"){
390                            window.open($(this).attr("href"));
391                        }
392                        else{
393							if($(this).attr("href") === "#" || $(this).attr("href") === "" || $(this).attr("href") === "javascript:void(0)"){
394								return false;
395							}
396							else{
397								window.location.href = $(this).attr("href");
398							}
399                        }
400                    }
401                });
402            }
403            else{
404                $(element).find(".nav-menu").find("li").on(hoverShowEvents, function(){
405                    plugin.showSubmenu(this,  plugin.settings.effect);
406                    fixSubmenuRightPosition();
407                }).on(hoverHideEvents, function(){
408                    plugin.hideSubmenu(this, plugin.settings.effect);
409                });
410            }
411			if(plugin.settings.hideSubWhenGoOut){
412				goOut();
413			}
414        };
415        
416        // set the portrait mode
417        var portraitMode = function(){
418            unbindEvents("portrait");
419            resetSubmenus();
420            if(plugin.settings.visibleSubmenusOnMobile){
421                $(element).find(".nav-submenu").show(0);
422            }
423            else{
424                $(element).find(".submenu-indicator").removeClass("submenu-indicator-up");
425                if(plugin.settings.submenuIndicator && plugin.settings.submenuIndicatorTrigger){
426                    $(element).find(".submenu-indicator").on(clickTouchEvents, function(e){
427                        e.stopPropagation(); 
428                        e.preventDefault();
429                        plugin.hideSubmenu($(this).parent("a").parent("li").siblings("li"), "slide");
430						plugin.hideSubmenu($(this).closest(".nav-menu").siblings(".nav-menu").children("li"), "slide");
431                        if($(this).parent("a").siblings(".nav-submenu").css("display") == "none"){
432                            $(this).addClass("submenu-indicator-up");
433                            $(this).parent("a").parent("li").siblings("li").find(".submenu-indicator").removeClass("submenu-indicator-up");
434							$(this).closest(".nav-menu").siblings(".nav-menu").find(".submenu-indicator").removeClass("submenu-indicator-up");
435                            plugin.showSubmenu($(this).parent("a").parent("li"), "slide");
436                            return false; 
437                        }
438                        else{
439                            $(this).parent("a").parent("li").find(".submenu-indicator").removeClass("submenu-indicator-up");
440                            plugin.hideSubmenu($(this).parent("a").parent("li"), "slide");
441                        }
442                    });
443                }
444                else{
445					$(element).find(".nav-menu, .nav-dropdown").children("li").children("a").each(function(){
446						if($(this).siblings(".nav-submenu").length > 0){
447							$(this).on(clickTouchEvents, function(e){
448								e.stopPropagation(); 
449								e.preventDefault();
450								plugin.hideSubmenu($(this).parent("li").siblings("li"), plugin.settings.effect);
451								plugin.hideSubmenu($(this).closest(".nav-menu").siblings(".nav-menu").children("li"), "slide");
452								if($(this).siblings(".nav-submenu").css("display") == "none"){
453									$(this).children(".submenu-indicator").addClass("submenu-indicator-up");
454									$(this).parent("li").siblings("li").find(".submenu-indicator").removeClass("submenu-indicator-up");
455									$(this).closest(".nav-menu").siblings(".nav-menu").find(".submenu-indicator").removeClass("submenu-indicator-up");
456									plugin.showSubmenu($(this).parent("li"), "slide");
457									return false; 
458								}
459								else{
460									$(this).parent("li").find(".submenu-indicator").removeClass("submenu-indicator-up");
461									plugin.hideSubmenu($(this).parent("li"), "slide");
462								}
463								if($(this).attr("target") === "_blank" || $(this).attr("target") === "blank"){
464									window.open($(this).attr("href"));
465								}
466								else{
467									if($(this).attr("href") === "#" || $(this).attr("href") === "" || $(this).attr("href") === "javascript:void(0)"){
468										return false;
469									}
470									else{
471										window.location.href = $(this).attr("href");
472									}
473								}
474							});
475						}
476					});
477                }
478            }
479        };
480        
481        plugin.callback = function(func) {
482            if (options[func] !== undefined) {
483                options[func].call(element);
484            }
485        };
486 
487        plugin.init();
488 
489    };
490 
491    $.fn.navigation = function(options){
492        return this.each(function(){
493            if (undefined === $(this).data("navigation")){
494                var plugin = new $.navigation(this, options);
495                $(this).data("navigation", plugin);
496            }
497        });
498    };
499 
500})( jQuery, window, document );

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.