1(function($){ 2"use strict"; 3let instanceCounter=0; 4$.maxmegamenu=function(menu, options){ 5const plugin=this; 6const $menu=$(menu); 7const $wrap=$menu.parent(); 8const $toggle_bar=$menu.siblings(".mega-menu-toggle"); 9const menuId=$menu.attr("id"); 10const instanceId=menuId + '-' + (++instanceCounter); 11const docEventNamespace='.megamenu-' + instanceId; 12const items_with_submenus=$([ 13"li.mega-menu-megamenu.mega-menu-item-has-children", 14"li.mega-menu-flyout.mega-menu-item-has-children", 15"li.mega-menu-tabbed > ul.mega-sub-menu > li.mega-menu-item-has-children", 16"li.mega-menu-flyout li.mega-menu-item-has-children" 17].join(","), $menu); 18const collapse_children_parents=$("li.mega-menu-megamenu li.mega-menu-item-has-children.mega-collapse-children > a.mega-menu-link", $menu); 19const focusable_selector="a.mega-menu-link, button.mega-menu-link, .mega-search span[role=button]"; 20const tab_key="Tab"; 21const escape_key="Escape"; 22const enter_key="Enter"; 23const space_key=" "; 24const left_arrow_key="ArrowLeft"; 25const up_arrow_key="ArrowUp"; 26const right_arrow_key="ArrowRight"; 27const down_arrow_key="ArrowDown"; 28const defaults={ 29event: $menu.attr("data-event"), 30effect: $menu.attr("data-effect"), 31effect_speed: parseInt($menu.attr("data-effect-speed")), 32effect_mobile: $menu.attr("data-effect-mobile"), 33effect_speed_mobile: parseInt($menu.attr("data-effect-speed-mobile")), 34panel_width: $menu.attr("data-panel-width"), 35panel_inner_width: $menu.attr("data-panel-inner-width"), 36mobile_force_width: $menu.attr("data-mobile-force-width"), 37mobile_overlay: $menu.attr("data-mobile-overlay"), 38mobile_state: $menu.attr("data-mobile-state"), 39mobile_direction: $menu.attr("data-mobile-direction"), 40second_click: $menu.attr("data-second-click"), 41vertical_behaviour: $menu.attr("data-vertical-behaviour"), 42document_click: $menu.attr("data-document-click"), 43breakpoint: $menu.attr("data-breakpoint"), 44unbind_events: $menu.attr("data-unbind"), 45hover_intent_timeout: $menu.attr("data-hover-intent-timeout") ?? 300, 46hover_intent_interval: $menu.attr("data-hover-intent-interval") ?? 100 47}; 48plugin.settings={}; 49let html_body_class_timeout; 50plugin.addAnimatingClass=function(element){ 51if(plugin.settings.effect==="disabled"){ 52return; 53} 54$(".mega-animating", $wrap).removeClass("mega-animating"); 55const timeout=plugin.settings.effect_speed + parseInt(plugin.settings.hover_intent_timeout, 10); 56element.addClass("mega-animating"); 57setTimeout(function(){ 58element.removeClass("mega-animating"); 59}, timeout); 60}; 61plugin.hideAllPanels=function(){ 62$(".mega-toggle-on > a.mega-menu-link", $menu).each(function(){ 63plugin.hidePanel($(this), false); 64}); 65}; 66plugin.expandMobileSubMenus=function(){ 67if(plugin.settings.mobile_direction!=='vertical'){ 68return; 69} 70$(".mega-menu-item-has-children.mega-expand-on-mobile > a.mega-menu-link", $menu).each(function(){ 71plugin.showPanel($(this), true); 72}); 73if(plugin.settings.mobile_state==='expand_all'){ 74$(".mega-menu-item-has-children:not(.mega-toggle-on) > a.mega-menu-link", $menu).each(function(){ 75plugin.showPanel($(this), true); 76}); 77} 78if(plugin.settings.mobile_state==='expand_active'){ 79const activeItemSelectors=[ 80"li.mega-current-menu-ancestor.mega-menu-item-has-children > a.mega-menu-link", 81"li.mega-current-menu-item.mega-menu-item-has-children > a.mega-menu-link", 82"li.mega-current-menu-parent.mega-menu-item-has-children > a.mega-menu-link", 83"li.mega-current_page_ancestor.mega-menu-item-has-children > a.mega-menu-link", 84"li.mega-current_page_item.mega-menu-item-has-children > a.mega-menu-link" 85]; 86$menu.find(activeItemSelectors.join(', ')).each(function(){ 87plugin.showPanel($(this), true); 88}); 89}}; 90plugin.hideSiblingPanels=function(anchor, immediate){ 91anchor.parent().parent().find(".mega-toggle-on").children("a.mega-menu-link").each(function(){ 92plugin.hidePanel($(this), immediate); 93}); 94}; 95plugin.isDesktopView=function(){ 96const width=Math.max(document.documentElement.clientWidth||0, window.innerWidth||0); 97return width > plugin.settings.breakpoint; 98}; 99plugin.isMobileView=function(){ 100return !plugin.isDesktopView(); 101}; 102plugin.isHorizontalMobileSubmenuMode=function(){ 103return plugin.isMobileView()&&plugin.isMobileOffCanvas()&&plugin.settings.mobile_direction==="horizontal"; 104}; 105const getBackLink=function($submenu){ 106return $submenu.find("> li.mega-mobile-back:visible > button.mega-mobile-back-link").first(); 107}; 108const getDeepestOpenPanel=function(){ 109return $("li.mega-toggle-on:not(.mega-collapse-children) > ul.mega-sub-menu", $menu).last(); 110}; 111plugin.getFocusableItemsInSubmenu=function($submenu){ 112return $submenu 113.find(focusable_selector) 114.not(".mega-mobile-back-link") 115.filter(function(){ 116return $(this).is(":visible")&&window.getComputedStyle(this).visibility!=='hidden'; 117}); 118}; 119plugin.focusFirstItemInOpenedSubmenu=function($item){ 120if(! plugin.isHorizontalMobileSubmenuMode()||! $wrap.hasClass("mega-keyboard-navigation")){ 121return; 122} 123const $submenu=$item.children("ul.mega-sub-menu"); 124if(!$submenu.length){ 125return; 126} 127const $firstFocusable=$submenu 128.find(focusable_selector) 129.not(".mega-mobile-back-link") 130.filter(":visible") 131.first(); 132if($firstFocusable.length){ 133$firstFocusable.trigger("focus"); 134}else{ 135getBackLink($submenu).trigger("focus"); 136}}; 137plugin.deferFocusFirstItemInOpenedSubmenu=function($item){ 138const delay=Math.min(120, parseInt(plugin.settings.effect_speed_mobile, 10)||0); 139setTimeout(function(){ 140plugin.focusFirstItemInOpenedSubmenu($item); 141setTimeout(function(){ 142const focusedInSubmenu=$item.find("ul.mega-sub-menu").has(document.activeElement).length!==0; 143if(!focusedInSubmenu){ 144plugin.focusFirstItemInOpenedSubmenu($item); 145}}, 40); 146}, delay); 147}; 148const resolveAnchor=function(anchor){ 149if(typeof anchor==='number'||(typeof anchor==='string'&&anchor.trim()!==''&&!isNaN(anchor))){ 150return $("li.mega-menu-item-" + anchor, $menu).find("a.mega-menu-link").first(); 151} 152if(anchor.is("li.mega-menu-item")){ 153return anchor.find("a.mega-menu-link").first(); 154} 155return anchor; 156}; 157plugin.showPanel=function(anchor, immediate){ 158anchor=resolveAnchor(anchor); 159const $item=anchor.parent(); 160const isDesktop=plugin.isDesktopView(); 161const isMobile = !isDesktop; 162$item.triggerHandler("before_open_panel"); 163$item.find("[aria-expanded]").first().attr("aria-expanded", "true"); 164$(".mega-animating", $wrap).removeClass("mega-animating"); 165if(isMobile&&$item.hasClass("mega-hide-sub-menu-on-mobile")){ 166return; 167} 168if(isDesktop&&($menu.hasClass("mega-menu-horizontal")||$menu.hasClass("mega-menu-vertical"))&&!$item.hasClass("mega-collapse-children")){ 169plugin.hideSiblingPanels(anchor, true); 170} 171if((isMobile&&$wrap.hasClass("mega-keyboard-navigation"))||plugin.settings.vertical_behaviour==="accordion"){ 172plugin.hideSiblingPanels(anchor, false); 173} 174plugin.calculateDynamicSubmenuWidths(anchor); 175if(plugin.shouldUseSlideAnimation(anchor, immediate)){ 176const speed=isMobile ? plugin.settings.effect_speed_mobile:plugin.settings.effect_speed; 177anchor.siblings(".mega-sub-menu").css("display", "none").animate({"height":"show", "paddingTop":"show", "paddingBottom":"show", "minHeight":"show"}, speed, function(){ 178$(this).css("display", ""); 179}); 180} 181$item.addClass("mega-toggle-on").triggerHandler("open_panel"); 182plugin.deferFocusFirstItemInOpenedSubmenu($item); 183}; 184plugin.shouldUseSlideAnimation=function(anchor, immediate){ 185if(immediate===true){ 186return false;
187} 188if(anchor.parent().hasClass("mega-collapse-children")){ 189return true; 190} 191const isDesktop=plugin.isDesktopView(); 192if(isDesktop&&plugin.settings.effect==="slide"){ 193return true; 194} 195if(!isDesktop){ 196if(plugin.settings.effect_mobile==="slide"){ 197return true; 198} 199if(plugin.isMobileOffCanvas()){ 200return plugin.settings.mobile_direction!=="horizontal"; 201}} 202return false; 203}; 204plugin.hidePanel=function(anchor, immediate){ 205anchor=resolveAnchor(anchor); 206const $item=anchor.parent(); 207const $submenu=anchor.siblings(".mega-sub-menu"); 208const isMobile=plugin.isMobileView(); 209$item.triggerHandler("before_close_panel"); 210$item.find("[aria-expanded]").first().attr("aria-expanded", "false"); 211if(plugin.shouldUseSlideAnimation(anchor)){ 212const speed=isMobile ? plugin.settings.effect_speed_mobile:plugin.settings.effect_speed; 213$submenu.animate({"height":"hide", "paddingTop":"hide", "paddingBottom":"hide", "minHeight":"hide"}, speed, function(){ 214$submenu.css("display", ""); 215$item.removeClass("mega-toggle-on").triggerHandler("close_panel"); 216}); 217return; 218} 219if(immediate){ 220$submenu.css("display", "none").delay(plugin.settings.effect_speed).queue(function(){ 221$(this).css("display", "").dequeue(); 222}); 223} 224$submenu.find(".widget_media_video video").each(function(){ 225if(this.player){ 226this.player.pause(); 227}}); 228$item.removeClass("mega-toggle-on").triggerHandler("close_panel"); 229plugin.addAnimatingClass($item); 230}; 231const resolveWidthEl=function(val){ 232return val==='$menu' ? $menu:val==='$wrap' ? $wrap:$(val); 233}; 234plugin.calculateDynamicSubmenuWidths=function(anchor){ 235const $item=anchor.parent(); 236const $submenu=anchor.siblings(".mega-sub-menu"); 237const isDesktop=plugin.isDesktopView(); 238const isTopLevelMegamenu=$item.hasClass("mega-menu-megamenu")&&$item.parent().hasClass("max-mega-menu"); 239if(isTopLevelMegamenu&&plugin.settings.panel_width){ 240if(isDesktop){ 241const submenu_offset=$menu.offset(); 242if(plugin.settings.panel_width==='100vw'){ 243const target_offset=$('body').offset(); 244$submenu.css({ 245left: (target_offset.left - submenu_offset.left) + "px" 246}); 247}else{ 248const $panel_width_el=resolveWidthEl(plugin.settings.panel_width); 249if($panel_width_el.length > 0){ 250$submenu.css({ 251width: $panel_width_el.outerWidth(), 252left: ($panel_width_el.offset().left - submenu_offset.left) + "px" 253}); 254}} 255}else{ 256$submenu.css({ 257width: "", 258left: "" 259}); 260}} 261if(isTopLevelMegamenu&&plugin.settings.panel_inner_width){ 262const $panel_inner_width_el=resolveWidthEl(plugin.settings.panel_inner_width); 263if($panel_inner_width_el.length > 0){ 264const target_width=parseInt($panel_inner_width_el.width(), 10); 265$submenu.css({ 266"paddingLeft": "", 267"paddingRight": "" 268}); 269const submenu_width=parseInt($submenu.innerWidth(), 10); 270if(isDesktop&&target_width > 0&&target_width < submenu_width){ 271$submenu.css({ 272"paddingLeft": (submenu_width - target_width) / 2 + "px", 273"paddingRight": (submenu_width - target_width) / 2 + "px" 274}); 275}} 276}}; 277const recalculateSubmenuWidths=function(){ 278plugin.calculateDynamicSubmenuWidths($("> li.mega-menu-megamenu > a.mega-menu-link", $menu)); 279}; 280plugin.bindClickEvents=function(){ 281plugin.unbindClickEvents(); 282let dragging=false; 283$(document).on({ 284["touchmove" + docEventNamespace]: function(){ dragging=true; }, 285["touchstart" + docEventNamespace]: function(){ dragging=false; }}); 286$(document).on("click" + docEventNamespace + " touchend" + docEventNamespace, function(e){ 287if(!dragging&&plugin.settings.document_click==="collapse"&&! $(e.target).closest(".mega-menu-wrap").length){ 288plugin.hideAllPanels(); 289plugin.hideMobileMenu(); 290} 291dragging=false; 292}); 293collapse_children_parents.off("click.megamenu touchend.megamenu"); 294const clickable_parents=$("> a.mega-menu-link", items_with_submenus).add(collapse_children_parents); 295clickable_parents.on("touchend.megamenu", function(e){ 296if(plugin.settings.event==="hover_intent"){ 297plugin.unbindHoverIntentEvents(); 298} 299if(plugin.settings.event==="hover"){ 300plugin.unbindHoverEvents(); 301}}); 302clickable_parents.on("click.megamenu", function(e){ 303if($(e.target).hasClass('mega-indicator')){ 304return; 305} 306if(plugin.isDesktopView()&&$(this).parent().hasClass("mega-toggle-on")&&$(this).closest("ul.mega-sub-menu").parent().hasClass("mega-menu-tabbed")){ 307if(plugin.settings.second_click==="go"){ 308return; 309}else{ 310e.preventDefault(); 311return; 312}} 313if(dragging){ 314return; 315} 316if(plugin.isMobileView()&&$(this).parent().hasClass("mega-hide-sub-menu-on-mobile")){ 317return; 318} 319if((plugin.settings.second_click==="go"||$(this).parent().hasClass("mega-click-click-go"))&&$(this).attr("href")!==undefined){ 320if(!$(this).parent().hasClass("mega-toggle-on")){ 321e.preventDefault(); 322plugin.showPanel($(this)); 323}}else{ 324e.preventDefault(); 325if($(this).parent().hasClass("mega-toggle-on")){ 326plugin.hidePanel($(this), false); 327}else{ 328plugin.showPanel($(this)); 329}} 330}); 331if(plugin.settings.second_click==="disabled"){ 332clickable_parents.off("click.megamenu"); 333} 334$(".mega-close-after-click:not(.mega-menu-item-has-children) > a.mega-menu-link", $menu).on("click.megamenu", function(){ 335plugin.hideAllPanels(); 336plugin.hideMobileMenu(); 337}); 338$("button.mega-close", $wrap).on("click.megamenu", function(e){ 339plugin.hideMobileMenu(); 340}); 341}; 342plugin.bindHoverEvents=function(){ 343items_with_submenus.on({ 344"mouseenter.megamenu":function(){ 345plugin.unbindClickEvents(); 346if(! $(this).hasClass("mega-toggle-on")){ 347plugin.showPanel($(this).children("a.mega-menu-link")); 348}}, 349"mouseleave.megamenu":function(){ 350if($(this).hasClass("mega-toggle-on")&&! $(this).hasClass("mega-disable-collapse")&&! $(this).parent().parent().hasClass("mega-menu-tabbed")){ 351plugin.hidePanel($(this).children("a.mega-menu-link"), false); 352}} 353}); 354}; 355plugin.bindHoverIntentEvents=function(){ 356items_with_submenus.hoverIntent({ 357over: function (){ 358plugin.unbindClickEvents(); 359if(! $(this).hasClass("mega-toggle-on")){ 360plugin.showPanel($(this).children("a.mega-menu-link")); 361}}, 362out: function (){ 363if($(this).hasClass("mega-toggle-on")&&! $(this).hasClass("mega-disable-collapse")&&! $(this).parent().parent().hasClass("mega-menu-tabbed")){ 364plugin.hidePanel($(this).children("a.mega-menu-link"), false); 365}}, 366timeout: plugin.settings.hover_intent_timeout, 367interval: plugin.settings.hover_intent_interval 368}); 369}; 370plugin.isMobileOffCanvas=function(){ 371return plugin.settings.effect_mobile==='slide_left'||plugin.settings.effect_mobile==='slide_right';
372}; 373plugin.shouldGoToNextTopLevelItem=function(key){ 374return(( key===right_arrow_key&&plugin.isDesktopView())||(key===down_arrow_key&&plugin.isMobileView()))&&$menu.hasClass("mega-menu-horizontal"); 375}; 376plugin.shouldGoToPreviousTopLevelItem=function(key){ 377return(( key===left_arrow_key&&plugin.isDesktopView())||(key===up_arrow_key&&plugin.isMobileView()))&&$menu.hasClass("mega-menu-horizontal"); 378}; 379plugin.bindKeyboardEvents=function(){ 380const $firstFocusable=$menu.find("a.mega-menu-link").first(); 381const $lastFocusable=$wrap.find("button.mega-close").first(); 382const focusableLinkSelector=focusable_selector.split(", ").map(s=> "> " + s).join(", "); 383const togglePanelForAnchor=function(anchor){ 384if(!anchor||!anchor.length) return; 385if(anchor.parent().hasClass("mega-toggle-on")&&!anchor.closest("ul.mega-sub-menu").parent().hasClass("mega-menu-tabbed")){ 386plugin.hidePanel(anchor); 387}else{ 388plugin.showPanel(anchor); 389}}; 390const closeNearestOpenPanelAndRefocus=function(){ 391const $focused=$menu[0].contains(document.activeElement) ? $(document.activeElement):$(); 392const $parentAnchor=$("> a.mega-menu-link", $focused.closest(".mega-toggle-on")); 393if($parentAnchor.length){ 394plugin.hidePanel($parentAnchor); 395$parentAnchor.trigger("focus"); 396return true; 397} 398return false; 399}; 400const handleTabKey=function(e, $active, isOffCanvasHorizontal, isMobileOffCanvas){ 401if($active.is($lastFocusable)&&isMobileOffCanvas){ 402if(!e.shiftKey){ 403e.preventDefault(); 404const $backLink=isOffCanvasHorizontal ? getBackLink(getDeepestOpenPanel()):$(); 405($backLink.length ? $backLink:$firstFocusable).trigger('focus'); 406}else if(isOffCanvasHorizontal){ 407const $last=plugin.getFocusableItemsInSubmenu(getDeepestOpenPanel()).last(); 408if($last.length){ e.preventDefault(); $last.trigger('focus'); }} 409return; 410} 411if(isMobileOffCanvas&&e.shiftKey&&$active.is($firstFocusable)){ 412e.preventDefault(); 413$lastFocusable.trigger('focus'); 414return; 415} 416if(isOffCanvasHorizontal){ 417const $deepestPanel=getDeepestOpenPanel(); 418if($deepestPanel.length&&!$deepestPanel.has($active).length){ 419e.preventDefault(); 420if(!e.shiftKey){ 421const $backLink=getBackLink($deepestPanel); 422($backLink.length ? $backLink:plugin.getFocusableItemsInSubmenu($deepestPanel).first()).trigger('focus'); 423}else{ 424$lastFocusable.trigger('focus'); 425} 426return; 427} 428const $submenu=$active.parentsUntil($menu, "ul.mega-sub-menu") 429.filter(function(){ 430const $p=$(this).parent(); 431return $p.hasClass("mega-toggle-on")&&!$p.hasClass("mega-collapse-children"); 432}) 433.first(); 434if($submenu.length){ 435if(!e.shiftKey){ 436const $items=plugin.getFocusableItemsInSubmenu($submenu); 437if($items.length&&$active.is($items.last())){ 438e.preventDefault(); 439$lastFocusable.trigger('focus'); 440}}else if($active.hasClass("mega-mobile-back-link")){ 441e.preventDefault(); 442$lastFocusable.trigger('focus'); 443}else{ 444const $items=plugin.getFocusableItemsInSubmenu($submenu); 445const $backLink=getBackLink($submenu); 446if($items.length&&$backLink.length&&$active.is($items.first())){ 447e.preventDefault(); 448$backLink.trigger('focus'); 449}} 450}} 451}; 452const handleToggleBarTrigger=function(e){ 453e.preventDefault(); 454if($toggle_bar.hasClass("mega-menu-open")){ 455plugin.hideMobileMenu(); 456}else{ 457plugin.showMobileMenu(); 458html_body_class_timeout=setTimeout(function(){ 459$menu.find("a.mega-menu-link").first().trigger('focus'); 460}, plugin.settings.effect_speed_mobile); 461}}; 462const handleSpaceKey=function(e, $active){ 463if($active.is("a.mega-menu-link")){ 464e.preventDefault(); 465if($active.parent().is(items_with_submenus)) togglePanelForAnchor($active); 466}else if($active.is(".mega-indicator")){ 467e.preventDefault(); 468togglePanelForAnchor($active.parent()); 469}}; 470const handleEscapeKey=function(){ 471const submenu_open=$(".mega-toggle-on", $menu).length!==0; 472if(submenu_open&&closeNearestOpenPanelAndRefocus()) return; 473if(plugin.isMobileView()&&!submenu_open) plugin.hideMobileMenu(); 474}; 475const handleEnterKey=function(e, $active){ 476if($active.is(".mega-indicator")){ 477togglePanelForAnchor($active.parent()); 478return; 479} 480if($active.parent().is(items_with_submenus)){ 481if(plugin.isMobileView()&&$active.parent().is(".mega-hide-sub-menu-on-mobile")) return; 482if(!$active.is("[href]")){ togglePanelForAnchor($active); return; } 483if($active.parent().hasClass("mega-toggle-on")&&!$active.closest("ul.mega-sub-menu").parent().hasClass("mega-menu-tabbed")) return; 484e.preventDefault(); 485plugin.showPanel($active); 486}}; 487const handleArrowUpDown=function(e, goingDown){ 488e.preventDefault(); 489const $activeSubmenu=getDeepestOpenPanel(); 490if($activeSubmenu.length){ 491const $backLink=getBackLink($activeSubmenu); 492const $items=plugin.getFocusableItemsInSubmenu($activeSubmenu); 493const focusOrder=[]; 494if($backLink.length) focusOrder.push($backLink[0]); 495$items.each(function(){ focusOrder.push(this); }); 496if($lastFocusable.length) focusOrder.push($lastFocusable[0]); 497const idx=focusOrder.indexOf(document.activeElement); 498const nextIdx=(idx < 0) 499? (goingDown ? 0:focusOrder.length - 1) 500: (idx + (goingDown ? 1:-1) + focusOrder.length) % focusOrder.length; 501$(focusOrder[nextIdx]).trigger('focus'); 502}else{ 503const $topLinks=$menu.children("li.mega-menu-item:visible").find(focusableLinkSelector); 504const idx=$topLinks.index(document.activeElement); 505if(idx >=0){ 506const nextIdx=(idx + (goingDown ? 1:-1) + $topLinks.length) % $topLinks.length; 507$topLinks.eq(nextIdx).trigger('focus'); 508}} 509}; 510const handleArrowLeftRight=function(e, goingToNext){ 511e.preventDefault(); 512const $topLinks=$menu.children("li.mega-menu-item:visible").find(focusableLinkSelector); 513const $topLink=$(document.activeElement) 514.closest($menu.children("li.mega-menu-item")) 515.find(focusableLinkSelector).first(); 516const idx=$topLinks.index($topLink); 517const nextIdx=goingToNext ? idx + 1:idx - 1; 518if(idx >=0&&nextIdx >=0){ 519plugin.hideAllPanels(); 520$topLinks.eq(nextIdx).trigger('focus'); 521}}; 522$wrap.on("keyup.megamenu", ".max-mega-menu, .mega-menu-toggle", function(e){ 523if(e.key!==tab_key) return; 524$wrap.addClass("mega-keyboard-navigation"); 525plugin.bindClickEvents(); 526const $target=$(e.target); 527if(plugin.isDesktopView()&&$target.is(".mega-menu-link")&&$target.parent().parent().hasClass('max-mega-menu')){ 528plugin.hideAllPanels(); 529}}); 530$wrap.on("keydown.megamenu", "a.mega-menu-link, button.mega-menu-link, button.mega-mobile-back-link, .mega-indicator, .mega-menu-toggle-block, .mega-menu-toggle-animated-block button, button.mega-close", function(e){ 531if(!$wrap.hasClass("mega-keyboard-navigation")) return; 532const key=e.key; 533const $active=$(e.target); 534const isOffCanvasHorizontal=plugin.isHorizontalMobileSubmenuMode(); 535const isMobileOffCanvas=plugin.isMobileView()&&plugin.isMobileOffCanvas(); 536switch (key){ 537case tab_key:
538handleTabKey(e, $active, isOffCanvasHorizontal, isMobileOffCanvas); 539break; 540case space_key: 541if($active.is(".mega-menu-toggle-block button, .mega-menu-toggle-animated-block button")){ 542handleToggleBarTrigger(e); 543}else{ 544handleSpaceKey(e, $active); 545} 546break; 547case enter_key: 548if($active.is(".mega-menu-toggle-block button, .mega-menu-toggle-animated-block button")){ 549handleToggleBarTrigger(e); 550}else{ 551handleEnterKey(e, $active); 552} 553break; 554case escape_key: 555handleEscapeKey(); 556break; 557case up_arrow_key: 558case down_arrow_key: 559if(isOffCanvasHorizontal){ 560handleArrowUpDown(e, key===down_arrow_key); 561} 562break; 563case left_arrow_key: 564case right_arrow_key: 565const goingToNext=plugin.shouldGoToNextTopLevelItem(key); 566const goingToPrev=plugin.shouldGoToPreviousTopLevelItem(key); 567if(goingToNext||goingToPrev){ 568handleArrowLeftRight(e, goingToNext); 569} 570break; 571}}); 572$wrap.on("focusout.megamenu", function(e){ 573if($wrap.hasClass("mega-keyboard-navigation")){ 574setTimeout(function(){ 575if(!$wrap[0].contains(document.activeElement)){ 576$wrap.removeClass("mega-keyboard-navigation"); 577plugin.hideAllPanels(); 578plugin.hideMobileMenu(); 579}}, 10); 580}}); 581}; 582plugin.unbindAllEvents=function(){ 583$(document).off(docEventNamespace); 584$("ul.mega-sub-menu, li.mega-menu-item, li.mega-menu-row, li.mega-menu-column, a.mega-menu-link, .mega-indicator", $menu).off(); 585}; 586plugin.unbindClickEvents=function(){ 587if($wrap.hasClass('mega-keyboard-navigation')){ 588return; 589} 590$(document).off(docEventNamespace); 591$("> a.mega-menu-link", items_with_submenus).not(collapse_children_parents).off("click.megamenu touchend.megamenu"); 592}; 593plugin.unbindHoverEvents=function(){ 594items_with_submenus.off("mouseenter.megamenu mouseleave.megamenu"); 595}; 596plugin.unbindHoverIntentEvents=function(){ 597items_with_submenus.off("mouseenter mouseleave").removeProp("hoverIntent_t").removeProp("hoverIntent_s"); 598}; 599plugin.unbindKeyboardEvents=function(){ 600$wrap.off("keyup.megamenu keydown.megamenu focusout.megamenu"); 601}; 602plugin.unbindMegaMenuEvents=function(){ 603if(plugin.settings.event==="hover_intent"){ 604plugin.unbindHoverIntentEvents(); 605} 606if(plugin.settings.event==="hover"){ 607plugin.unbindHoverEvents(); 608} 609plugin.unbindClickEvents(); 610plugin.unbindKeyboardEvents(); 611}; 612plugin.bindMegaMenuEvents=function(){ 613plugin.unbindMegaMenuEvents(); 614const isDesktop=plugin.isDesktopView(); 615if(isDesktop&&plugin.settings.event==="hover_intent"){ 616plugin.bindHoverIntentEvents(); 617} 618if(isDesktop&&plugin.settings.event==="hover"){ 619plugin.bindHoverEvents(); 620} 621plugin.bindClickEvents(); 622plugin.bindKeyboardEvents(); 623}; 624plugin.checkWidth=function(){ 625if(plugin.isMobileView()&&$menu.data("view")==="desktop"){ 626plugin.switchToMobile(); 627} 628if(plugin.isDesktopView()&&$menu.data("view")==="mobile"){ 629plugin.switchToDesktop(); 630} 631recalculateSubmenuWidths(); 632}; 633plugin.reverseRightAlignedItems=function(){ 634if(! $("body").hasClass("rtl")&&$menu.hasClass("mega-menu-horizontal")&&$menu.css("display")!=='flex'){ 635$menu.append($menu.children("li.mega-item-align-right").get().reverse()); 636}}; 637plugin.addClearClassesToMobileItems=function(){ 638$(".mega-menu-row", $menu).each(function(){ 639$("> .mega-sub-menu > .mega-menu-column:not(.mega-hide-on-mobile)", $(this)).filter(":even").addClass("mega-menu-clear"); 640}); 641}; 642plugin.initDesktop=function(){ 643$menu.data("view", "desktop"); 644plugin.bindMegaMenuEvents(); 645plugin.initIndicators(); 646$menu.trigger("mmm:switchToDesktop"); 647}; 648plugin.initMobile=function(){ 649plugin.switchToMobile(); 650}; 651plugin.switchToDesktop=function(){ 652$menu.data("view", "desktop"); 653plugin.bindMegaMenuEvents(); 654plugin.reverseRightAlignedItems(); 655plugin.hideAllPanels(); 656plugin.hideMobileMenu(true); 657$menu.removeAttr('role'); 658$menu.removeAttr('aria-modal'); 659$menu.removeAttr('aria-hidden'); 660$menu.trigger("mmm:switchToDesktop"); 661}; 662plugin.switchToMobile=function(){ 663$menu.data("view", "mobile"); 664if(plugin.isMobileOffCanvas()&&$toggle_bar.is(":visible")){ 665$menu.attr('role', 'dialog'); 666$menu.attr('aria-modal', 'true'); 667$menu.attr('aria-hidden', 'true'); 668} 669plugin.bindMegaMenuEvents(); 670plugin.initIndicators(); 671plugin.reverseRightAlignedItems(); 672plugin.addClearClassesToMobileItems(); 673plugin.hideAllPanels(); 674plugin.expandMobileSubMenus(); 675$menu.trigger("mmm:switchToMobile"); 676}; 677plugin.initToggleBar=function(){ 678$toggle_bar.on("click", function(e){ 679const isToggleTrigger=$(e.target).closest(".mega-menu-toggle-block, button.mega-toggle-animated, .mega-menu-toggle-custom-block", this).length; 680if(isToggleTrigger){ 681e.preventDefault(); 682if($(this).hasClass("mega-menu-open")){ 683plugin.hideMobileMenu(); 684}else{ 685plugin.showMobileMenu(); 686}}else if(e.target===this&&plugin.isMobileOffCanvas()){ 687plugin.hideMobileMenu(); 688}}); 689}; 690plugin.initIndicators=function(){ 691$menu.off('click.megamenu', '.mega-indicator'); 692$menu.on('click.megamenu', '.mega-indicator', function(e){ 693e.preventDefault(); 694e.stopPropagation(); 695if($(this).closest(".mega-menu-item").hasClass("mega-toggle-on")){ 696if(! $(this).closest("ul.mega-sub-menu").parent().hasClass("mega-menu-tabbed")||plugin.isMobileView()){ 697plugin.hidePanel($(this).parent(), false); 698}}else{ 699plugin.showPanel($(this).parent(), false); 700}}); 701}; 702plugin.hideMobileMenu=function(force=false){ 703if(! $toggle_bar.is(":visible")&&! force){ 704return; 705} 706$menu.attr("aria-hidden", "true"); 707clearTimeout(html_body_class_timeout); 708html_body_class_timeout=setTimeout(function(){ 709$("body").removeClass(menuId + "-mobile-open"); 710$("html").removeClass(menuId + "-off-canvas-open"); 711}, plugin.settings.effect_speed_mobile); 712if($wrap.hasClass("mega-keyboard-navigation")){ 713$(".mega-menu-toggle-block button, button.mega-toggle-animated", $toggle_bar).first().trigger('focus'); 714} 715$(".mega-toggle-label, .mega-toggle-animated", $toggle_bar).attr("aria-expanded", "false"); 716const resetMenuStyles=function(){ 717$menu.css({ 718width: "", 719left: "", 720display: "" 721}); 722$toggle_bar.removeClass("mega-menu-open"); 723}; 724if(plugin.settings.effect_mobile==="slide"&&! force){ 725$menu.animate({"height":"hide"}, plugin.settings.effect_speed_mobile, resetMenuStyles); 726}else{ 727resetMenuStyles(); 728} 729$menu.triggerHandler("mmm:hideMobileMenu"); 730}; 731plugin.showMobileMenu=function(){ 732if(! $toggle_bar.is(":visible")){ 733return; 734} 735clearTimeout(html_body_class_timeout); 736$("body").addClass(menuId + "-mobile-open"); 737plugin.expandMobileSubMenus(); 738if(plugin.isMobileOffCanvas()){ 739$("html").addClass(menuId + "-off-canvas-open"); 740} 741if(plugin.settings.effect_mobile==="slide"){ 742$menu.animate({"height":"show"}, plugin.settings.effect_speed_mobile, function(){ 743$(this).css("display", ""); 744}); 745} 746$(".mega-toggle-label, .mega-toggle-animated", $toggle_bar).attr("aria-expanded", "true"); 747$toggle_bar.addClass("mega-menu-open"); 748plugin.toggleBarForceWidth(); 749$menu.attr("aria-hidden", "false"); 750$menu.triggerHandler("mmm:showMobileMenu"); 751}; 752plugin.toggleBarForceWidth=function(){ 753const $force_width_el=$(plugin.settings.mobile_force_width); 754if($force_width_el.length&&(plugin.settings.effect_mobile==="slide"||plugin.settings.effect_mobile==="disabled")){ 755const submenu_offset=$toggle_bar.offset(); 756const target_offset=$force_width_el.offset(); 757$menu.css({ 758width: $force_width_el.outerWidth(), 759left: (target_offset.left - submenu_offset.left) + "px" 760}); 761}}; 762plugin.doConsoleChecks=function(){ 763if(plugin.settings.mobile_force_width!=="false"&&! $(plugin.settings.mobile_force_width).length&&(plugin.settings.effect_mobile==="slide"||plugin.settings.effect_mobile==="disabled")){ 764console.warn('Max Mega Menu #' + $wrap.attr('id') + ': Mobile Force Width element (' + plugin.settings.mobile_force_width + ') not found'); 765} 766const cssWidthRegex=/^((\d+(\.\d+)?(px|%|em|rem|vw|vh|ch|ex|cm|mm|in|pt|pc))|auto)$/i; 767if(plugin.settings.panel_width!==undefined&&! cssWidthRegex.test(plugin.settings.panel_width)&&! resolveWidthEl(plugin.settings.panel_width).length){ 768console.warn('Max Mega Menu #' + $wrap.attr('id') + ': Panel Width (Outer) element (' + plugin.settings.panel_width + ') not found'); 769} 770if(plugin.settings.panel_inner_width!==undefined&&! cssWidthRegex.test(plugin.settings.panel_inner_width)&&! resolveWidthEl(plugin.settings.panel_inner_width).length){ 771console.warn('Max Mega Menu #' + $wrap.attr('id') + ': Panel Width (Inner) element (' + plugin.settings.panel_inner_width + ') not found'); 772}}; 773plugin.init=function(){ 774$menu.triggerHandler("before_mega_menu_init"); 775plugin.settings=$.extend({}, defaults, options); 776if(window.console){ 777plugin.doConsoleChecks(); 778} 779$menu.removeClass("mega-no-js"); 780plugin.initToggleBar(); 781if(plugin.settings.unbind_events==="true"){ 782plugin.unbindAllEvents(); 783}
784if(document.readyState==='complete'){ 785recalculateSubmenuWidths(); 786}else{ 787$(window).on("load", recalculateSubmenuWidths); 788} 789if(plugin.isDesktopView()){ 790plugin.initDesktop(); 791}else{ 792plugin.initMobile(); 793} 794$(window).on("resize", function(){ 795plugin.checkWidth(); 796}); 797$menu.triggerHandler("after_mega_menu_init"); 798}; 799plugin.init(); 800}; 801$.fn.maxmegamenu=function(options){ 802return this.each(function(){ 803if(undefined===$(this).data("maxmegamenu")){ 804const plugin=new $.maxmegamenu(this, options); 805$(this).data("maxmegamenu", plugin); 806}}); 807}; 808$(function(){ 809$(".max-mega-menu").maxmegamenu(); 810}); 811}(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.