{"version":3,"names":[],"mappings":"","sources":["multilevel-nav.js"],"sourcesContent":["/*!\r\n * Multilevel nav v3.2\r\n */\r\n \r\nvar mlnCurrent = 1;\r\n\r\n// Get browser width with or without scrollbar\r\nfunction mlnViewport() {\r\n var view = window;\r\n var viewString = 'inner';\r\n\r\n if (!('innerWidth' in window)) {\r\n viewString = 'client';\r\n view = document.documentElement || document.body;\r\n }\r\n\r\n return {\r\n width: view[viewString + 'Width'],\r\n height: view[viewString + 'Height']\r\n };\r\n}\r\n\r\n(function ($) {\r\n 'use strict';\r\n \r\n // Global variables\r\n var $document = $(document);\r\n var $body = $('body');\r\n var $window = $(window);\r\n \r\n // Resize delay\r\n var windowWidth = $window.width();\r\n $window.resize(function () {\r\n var newWindowWidth = $window.width();\r\n\r\n if (windowWidth !== newWindowWidth) {\r\n if (this.resizeTO) {\r\n clearTimeout(this.resizeTO);\r\n }\r\n this.resizeTO = setTimeout(function () {\r\n $(this).trigger($.Event('mlnResizeEnd'));\r\n }, 150);\r\n }\r\n windowWidth = newWindowWidth;\r\n });\r\n \r\n $.fn.multilevelNav = function (options) {\r\n $(this).each(function () {\r\n var $mln = $(this);\r\n var mlnParentList = $('.mln__list', $mln);\r\n var mlnExpander = $('.mln__expander', $mln);\r\n var mlnDataBreakpoint = $mln.attr('data-mln-breakpoint');\r\n var mlnIsPageLoaded = false;\r\n var mlnToggleBtnVerbiage = 'Toggle items under';\r\n var mlnTransitionEnd = 'transitionend';\r\n var settings;\r\n\r\n // Setting defaults\r\n settings = $.extend({\r\n 'hoverIntent': false,\r\n 'hoverIntentTimeout': 250,\r\n 'autoCloseNavbarMenus': true,\r\n 'autoDirection': true,\r\n 'toggleOnClickOnly': false,\r\n 'expandActiveItem': false,\r\n 'offCanvasScrollToActiveItem': false,\r\n 'wholeLinkToggler': false,\r\n 'topLevelWholeLinkToggler': false,\r\n 'navbarMenuBackdrop': false,\r\n 'navbarMegaMenuBackdrop': false,\r\n 'activeSelector': '.active',\r\n 'menuCloseOnInPageAnchorClick': false,\r\n 'expanderCloseOnInPageAnchorClick': false,\r\n 'autoCloseInactiveMenu': true,\r\n 'excludeLevel': '-1',\r\n 'childMenuTogglerSymbol': ''\r\n }, options);\r\n\r\n // Show/hide menu(s)\r\n function mlnToggleChild(el, action, animate) {\r\n var collapseHeight = 0;\r\n var mlnHasChild = el.closest('.mln__has-child');\r\n var mlnChildToggler = mlnHasChild.find('.mln__toggle-btn, .mln__toggle-link').first();\r\n var mlnToggleChildCollapse = mlnHasChild.find('> .mln__child__collapse').first();\r\n var ariaExpandedValue;\r\n var ariaHiddenValue;\r\n var mlnAnyShowing;\r\n\r\n // Figure out what aria values to use\r\n if (action === 'show') {\r\n ariaExpandedValue = 'true';\r\n ariaHiddenValue = 'false';\r\n } else if (action === 'hide' || action === undefined) {\r\n ariaExpandedValue = 'false';\r\n ariaHiddenValue = 'true';\r\n }\r\n \r\n mlnHasChild.trigger($.Event('transition.mln.child'));\r\n\r\n // Correct toggler attributes\r\n mlnChildToggler.attr('aria-expanded', ariaExpandedValue);\r\n\r\n // Grab height of inner collapse elements\r\n collapseHeight = $('.mln__child__collapse__helper', mlnToggleChildCollapse).outerHeight();\r\n\r\n // Show collapsible child elements\r\n if (action === 'show') {\r\n mlnHasChild.addClass('mln__has-child--showing');\r\n\r\n mlnAnyShowing = $mln.find('.mln__has-child--showing');\r\n\r\n // Add class to body for regular menu backdrop\r\n if (\r\n mlnAnyShowing.length && $mln.hasClass('mln--navbar') &&\r\n settings.navbarMenuBackdrop === true\r\n ) {\r\n $body.addClass('js-mln-menu-showing');\r\n }\r\n\r\n // Add class to body for mega menu backdrop\r\n if (\r\n mlnHasChild.hasClass('mln__has-child--mega-menu') &&\r\n $mln.hasClass('mln--navbar') &&\r\n settings.navbarMegaMenuBackdrop === true\r\n ) {\r\n $body.addClass('js-mln-mega-menu-showing');\r\n }\r\n \r\n mlnHasChild.trigger($.Event('show.mln.child'));\r\n\r\n if (animate === true) {\r\n mlnToggleChildCollapse\r\n .addClass('mln__child--transitioning')\r\n .css('height', collapseHeight + 'px')\r\n .attr('aria-hidden', ariaHiddenValue)\r\n .one(mlnTransitionEnd, function () {\r\n mlnToggleChildCollapse\r\n .css('height', 'auto')\r\n .removeClass('mln__child--transitioning')\r\n .css('height', '');\r\n \r\n if (mlnToggleChildCollapse.attr('aria-hidden') === 'false') {\r\n mlnToggleChildCollapse.addClass('mln--height-auto');\r\n mlnToggleChildCollapse.addClass('mln__child--overflow-visible');\r\n }\r\n \r\n mlnHasChild\r\n .trigger($.Event('shown.mln.child'))\r\n .trigger($.Event('transitioned.mln.child'));\r\n });\r\n } else {\r\n mlnToggleChildCollapse\r\n .css('height', 'auto')\r\n .addClass('mln--height-auto')\r\n .attr('aria-hidden', ariaHiddenValue)\r\n .css('height', '')\r\n .addClass('mln__child--overflow-visible');\r\n \r\n mlnHasChild\r\n .trigger($.Event('shown.mln.child'))\r\n .trigger($.Event('transitioned.mln.child'));\r\n }\r\n }\r\n\r\n // Hide collapsible child elements\r\n if (action === 'hide') {\r\n mlnHasChild.removeClass('mln__has-child--showing');\r\n\r\n mlnAnyShowing = $('.mln--navbar').find('.mln__has-child--showing');\r\n\r\n if (\r\n !mlnAnyShowing.length &&\r\n $('.mln--navbar').length\r\n ) {\r\n $body.removeClass('js-mln-menu-showing');\r\n }\r\n\r\n if (\r\n mlnHasChild.hasClass('mln__has-child--mega-menu') &&\r\n !$('.mln__has-child--mega-menu').hasClass('mln__has-child--showing') &&\r\n $mln.hasClass('mln--navbar')\r\n ) {\r\n $body.removeClass('js-mln-mega-menu-showing');\r\n }\r\n \r\n mlnHasChild.trigger($.Event('hide.mln.child'));\r\n \r\n if (animate === true) {\r\n mlnToggleChildCollapse\r\n .css({\r\n 'height': collapseHeight,\r\n 'min-height': collapseHeight\r\n })\r\n .removeClass('mln__child--overflow-visible mln--height-auto')\r\n .attr('aria-hidden', ariaHiddenValue)\r\n .addClass('mln__child--transitioning');\r\n \r\n setTimeout(function(){\r\n mlnToggleChildCollapse.css({\r\n 'height': '',\r\n 'min-height': ''\r\n }).one(mlnTransitionEnd, function () { \r\n mlnToggleChildCollapse.removeClass('mln__child--transitioning'); \r\n mlnHasChild\r\n .trigger($.Event('hidden.mln.child'))\r\n .trigger($.Event('transitioned.mln.child'));\r\n }).children().on(mlnTransitionEnd, function () {\r\n return false;\r\n });\r\n }, 30);\r\n } else {\r\n mlnToggleChildCollapse\r\n .removeClass('mln__child--overflow-visible mln--height-auto')\r\n .attr('aria-hidden', ariaHiddenValue)\r\n .css('height', '');\r\n mlnHasChild\r\n .trigger($.Event('hidden.mln.child'))\r\n .trigger($.Event('transitioned.mln.child'));\r\n }\r\n }\r\n }\r\n\r\n // Show/hide expander items\r\n function mlnToggleExpander(animate) {\r\n var collapseHeight = 0;\r\n var collapseHelper = $('.mln__expander__helper', $mln);\r\n\r\n if (animate !== false) {\r\n collapseHeight = collapseHelper.outerHeight();\r\n\r\n if (!mlnExpander.hasClass('mln__expander--showing')) {\r\n \r\n mlnExpander.trigger($.Event('showing.mln.expander'));\r\n \r\n mlnExpander\r\n .addClass('mln__expander--transitioning')\r\n .css('height', collapseHeight)\r\n .attr('aria-hidden', 'false')\r\n .parent()\r\n .find('.mln__expand-btn')\r\n .attr('aria-expanded', 'true');\r\n\r\n mlnExpander\r\n .one(mlnTransitionEnd, function () {\r\n $(this)\r\n .css('height', 'auto')\r\n .css('height', '')\r\n .addClass('mln__expander--showing')\r\n .removeClass('mln__expander--transitioning');\r\n mlnExpander.trigger($.Event('shown.mln.expander'));\r\n }).children().on(mlnTransitionEnd, function () {\r\n return false;\r\n });\r\n } else {\r\n mlnExpander.trigger($.Event('hiding.mln.expander'));\r\n mlnExpander\r\n .addClass('mln__expander--transitioning')\r\n .css('height', collapseHeight)\r\n .attr('aria-hidden', 'true')\r\n .parent()\r\n .find('.mln__expand-btn')\r\n .attr('aria-expanded', 'false');\r\n\r\n setTimeout(function () {\r\n mlnExpander\r\n .removeClass('mln__expander--showing')\r\n .css('height', '');\r\n }, 10);\r\n\r\n mlnExpander\r\n .one(mlnTransitionEnd, function () {\r\n $(this).removeClass('mln__expander--transitioning');\r\n mlnExpander.trigger($.Event('hidden.mln.expander'));\r\n }).children().on(mlnTransitionEnd, function () {\r\n return false;\r\n });\r\n }\r\n }\r\n\r\n // Adjust attributes without animating the expander menu\r\n if (animate === false && $mln.closest('.mln--navbar').length) {\r\n if (mlnViewport().width < mlnDataBreakpoint) {\r\n mlnExpander\r\n .removeClass('mln__expander--showing')\r\n .attr('aria-hidden', 'true')\r\n .parent().find('.mln__expand-btn')\r\n .attr('aria-expanded', 'false');\r\n } else {\r\n mlnExpander\r\n .attr('aria-hidden', 'false')\r\n .parent().find('.mln__expand-btn')\r\n .attr('aria-expanded', 'true');\r\n }\r\n }\r\n\r\n if (animate === false && $mln.hasClass('mln--expand-above-breakpoint')) {\r\n if (mlnViewport().width < mlnDataBreakpoint) {\r\n mlnExpander\r\n .removeClass('mln__expander--showing')\r\n .attr('aria-hidden', 'true')\r\n .parent().find('.mln__expand-btn')\r\n .attr('aria-expanded', 'false');\r\n } else {\r\n mlnExpander\r\n .addClass('mln__expander--showing')\r\n .attr('aria-hidden', 'false')\r\n .parent().find('.mln__expand-btn')\r\n .attr('aria-expanded', 'true');\r\n }\r\n }\r\n }\r\n\r\n // Assign class to child items that run off the edge of the screen\r\n function assignFlowDirection() {\r\n if (settings.autoDirection === true) {\r\n setTimeout(function () {\r\n hasChild.each(function () {\r\n var $hasChild = $(this);\r\n var mlnToggleChildOffset = ($hasChild.offset().left - $body.offset().left) + ($hasChild.outerWidth() * 2);\r\n\r\n if (mlnToggleChildOffset > mlnViewport().width && mlnViewport().width >= mlnDataBreakpoint) {\r\n $hasChild.addClass('mln__child--flow-right');\r\n } else {\r\n $hasChild.removeClass('mln__child--flow-right');\r\n }\r\n });\r\n }, 300);\r\n }\r\n }\r\n\r\n // Keep items and parents with active class expanded on load\r\n function expandActiveItem() {\r\n if (settings.expandActiveItem === true) {\r\n var activeSelector = settings.activeSelector;\r\n\r\n $(activeSelector, mlnParentList).each(function () {\r\n var $activeItem = $(this);\r\n\r\n $activeItem\r\n .addClass('mln__has-child--expand-on-load')\r\n .parents('.mln__has-child')\r\n .last()\r\n .addClass('mln__has-child--expand-on-load')\r\n .end()\r\n .parents('.mln__has-child.mln__has-child')\r\n .addClass('mln__has-child--expand-on-load');\r\n });\r\n\r\n $('.mln__has-child--expand-on-load', mlnParentList).each(function () {\r\n if (\r\n !mlnIsPageLoaded || mlnParentList.closest($mln).hasClass('mln--navbar') &&\r\n mlnViewport().width < mlnDataBreakpoint &&\r\n !mlnIsPageLoaded\r\n ) {\r\n mlnToggleChild($(this), 'show', false);\r\n }\r\n\r\n if (\r\n mlnParentList.closest($mln).hasClass('mln--navbar') &&\r\n mlnViewport().width >= mlnDataBreakpoint\r\n ) {\r\n mlnToggleChild($(this), 'hide', false);\r\n }\r\n });\r\n \r\n if (settings.offCanvasScrollToActiveItem === true) {\r\n var lastActiveItem = $mln.find(settings.activeSelector).last();\r\n if (lastActiveItem.length) {\r\n var scrollToLoc = lastActiveItem.position().top;\r\n \r\n $('#offCanvasArea').animate({\r\n scrollTop: scrollToLoc\r\n }, 1);\r\n }\r\n setTimeout(function(){\r\n $body.addClass('js-off-canvas-scrolled');\r\n }, 2);\r\n }\r\n\r\n mlnIsPageLoaded = true;\r\n }\r\n }\r\n\r\n // Start modifying the DOM\r\n if (mlnParentList.length) {\r\n\r\n // Add helper div inside expander\r\n mlnExpander.wrapInner('
');\r\n\r\n // Open/close menu expander\r\n var expanderButton = $('.mln__expand-btn', $mln);\r\n expanderButton.on('click', function () {\r\n mlnToggleExpander();\r\n });\r\n\r\n // Add depth class to nested list items\r\n var nestedLi = $('li:not(.mln__child__mega-menu li)', mlnParentList);\r\n nestedLi.each(function () {\r\n var $li = $(this);\r\n var levelClass = 'mln__level-' + ($li.parents('li').length + 1);\r\n\r\n $li.addClass(levelClass);\r\n });\r\n\r\n // Find and modify mega menus\r\n mlnParentList\r\n .find('.mln__child__mega-menu')\r\n .wrap('')\r\n .wrap('')\r\n .closest('li')\r\n .addClass('mln__has-child');\r\n\r\n // Add mega menu backdrop\r\n if (settings.navbarMegaMenuBackdrop === true && !$('.mln-backdrop').length) {\r\n $body.append('');\r\n }\r\n\r\n // Find and modify child lists\r\n mlnParentList\r\n .find('ul')\r\n .not('.mln__level-' + settings.excludeLevel +' > ul')\r\n .not('.mln__level-' + settings.excludeLevel +' > ul ul')\r\n .each(function () {\r\n var $parentList = $(this);\r\n\r\n if ($parentList.siblings('.mln__child__collapse').length) {\r\n var parentCollapse = $parentList.parent()\r\n .find('.mln__child__collapse__helper');\r\n\r\n $parentList\r\n .addClass('mln__child__list')\r\n .prependTo(parentCollapse);\r\n\r\n } else if (!$parentList.closest('.mln__child__mega-menu').length) {\r\n $parentList\r\n .addClass('mln__child__list')\r\n .wrap('')\r\n .wrap('')\r\n .closest('li')\r\n .addClass('mln__has-child');\r\n }\r\n });\r\n\r\n // Add mega menu modifier class to top level\r\n var megaMenu = $('.mln__child__mega-menu', mlnParentList);\r\n megaMenu.each(function () {\r\n $(this)\r\n .closest('li')\r\n .addClass('mln__has-child--mega-menu');\r\n });\r\n\r\n // Wrap the parent tag in it's own div\r\n var hasChild = $('.mln__has-child', mlnParentList);\r\n hasChild.each(function () {\r\n $(this)\r\n .find('> a')\r\n .wrap('');\r\n });\r\n\r\n // Add a toggle button to list items with children\r\n var childNav = $('.mln__child-controls', mlnParentList);\r\n childNav.each(function () {\r\n var $childNav = $(this);\r\n var linkText= $childNav.find('> a').text();\r\n var ariaLabelValue = mlnToggleBtnVerbiage + ' ' + linkText;\r\n\r\n $('')\r\n .addClass('mln__toggle-btn')\r\n .attr('type', 'button')\r\n .attr('aria-label', ariaLabelValue)\r\n .html(settings.childMenuTogglerSymbol)\r\n .appendTo($childNav);\r\n });\r\n\r\n // Assign IDs and attributes to child menu elements\r\n var childCollapse = $('.mln__child__collapse', mlnParentList);\r\n childCollapse.each(function (index) {\r\n var $childCollapseId = 'mln' + mlnCurrent + 'ChildCollapse' + (index + 1);\r\n\r\n $(this)\r\n .attr('aria-hidden', 'true')\r\n .attr('data-mln-active-status', 'off')\r\n .attr('id', $childCollapseId)\r\n .parent()\r\n .find('.mln__toggle-btn')\r\n .attr('aria-expanded', 'false')\r\n .attr('aria-controls', $childCollapseId);\r\n });\r\n\r\n // Assign IDs and aria attributes to expander elements\r\n mlnExpander.each(function (index) {\r\n var $mlnExpanderId = 'mln' + mlnCurrent + 'Expander' + (index + 1);\r\n\r\n $(this)\r\n .attr('aria-hidden', 'true')\r\n .attr('id', $mlnExpanderId)\r\n .parent()\r\n .find('.mln__expand-btn')\r\n .attr('aria-expanded', 'false')\r\n .attr('aria-controls', $mlnExpanderId);\r\n });\r\n\r\n // Close main nav child menu if in page anchor is clicked\r\n if (settings.menuCloseOnInPageAnchorClick === true) {\r\n $('a', $mln).each(function () {\r\n var $anchor = $(this);\r\n var firstChar = $anchor.attr('href').charAt(0);\r\n var pageAnchor = ((firstChar === '#') ? true : false);\r\n\r\n $anchor.on('click', function (e) {\r\n if (\r\n pageAnchor &&\r\n !$(e.target).closest('.mln__toggle-link').length &&\r\n mlnViewport().width >= mlnDataBreakpoint\r\n ) {\r\n mlnToggleChild($('.mln__has-child--showing', $mln), 'hide', true);\r\n }\r\n });\r\n });\r\n }\r\n\r\n // Close expander if in page anchor is clicked\r\n if (settings.expanderCloseOnInPageAnchorClick === true) {\r\n $('a', $mln).each(function () {\r\n var $anchor = $(this);\r\n var firstChar = $anchor.attr('href').charAt(0);\r\n var pageAnchor = ((firstChar === '#') ? true : false);\r\n\r\n $anchor.on('click', function (e) {\r\n if (\r\n pageAnchor &&\r\n !$(e.target).closest('.mln__toggle-link').length\r\n ) {\r\n mlnToggleExpander('hide');\r\n }\r\n });\r\n });\r\n }\r\n\r\n // Whole link click expand and/or top level whole link expand\r\n if (\r\n settings.wholeLinkToggler === true ||\r\n settings.topLevelWholeLinkToggler === true\r\n ) {\r\n var wholeElement;\r\n\r\n if (settings.wholeLinkToggler === true) {\r\n wholeElement = $('.mln__child-controls > a', mlnParentList);\r\n\r\n $(mlnParentList)\r\n .closest($mln)\r\n .addClass('mln--whole-link-expand');\r\n }\r\n\r\n if (settings.topLevelWholeLinkToggler === true) {\r\n wholeElement = $('> .mln__has-child', mlnParentList).find('> .mln__child-controls > a') || $('> .mln__has-child', mlnParentList)\r\n .siblings('.mln__has-child')\r\n .find('> .mln__child-controls > a');\r\n\r\n $(mlnParentList)\r\n .closest($mln)\r\n .removeClass('mln--whole-link-expand')\r\n .addClass('mln--top-level-whole-link-expand');\r\n }\r\n\r\n wholeElement.each(function () {\r\n var $wholeElement = $(this);\r\n var closestToggleBtn = $wholeElement.closest('.mln__has-child')\r\n .find('.mln__toggle-btn')\r\n .first();\r\n \r\n var ariaExpandedValue = closestToggleBtn.attr('aria-expanded');\r\n var ariaControlsValue = closestToggleBtn.attr('aria-controls');\r\n\r\n $('')\r\n .addClass('mln__toggle-indicator')\r\n .html(settings.childMenuTogglerSymbol)\r\n .appendTo($wholeElement);\r\n\r\n $wholeElement\r\n .addClass('mln__toggle-link')\r\n .attr('role', 'button')\r\n .attr('aria-expanded', ariaExpandedValue)\r\n .attr('aria-controls', ariaControlsValue)\r\n .on('click', function (e) {\r\n $wholeElement.focus();\r\n e.preventDefault();\r\n });\r\n\r\n closestToggleBtn.remove();\r\n });\r\n }\r\n\r\n // Toggle-button click\r\n var toggleButton = $('.mln__toggle-btn, .mln__toggle-link', mlnParentList);\r\n var touchDrag = false;\r\n\r\n // Checking touchmove/touchend and applying a hack to get the\r\n // toggle button to work on first click for iOS\r\n toggleButton.on('touchmove', function () {\r\n touchDrag = true;\r\n }).on('touchend click', function (e) {\r\n\r\n // Prevent first click focus on iOS\r\n e.stopPropagation();\r\n e.preventDefault();\r\n\r\n var $toggleButton = $(this);\r\n var hasChildParent = $toggleButton.closest('.mln__has-child');\r\n var associatedMenu = $toggleButton.closest(hasChildParent)\r\n .find('.mln__child__collapse')\r\n .first();\r\n var hasChildSiblings = hasChildParent.parent()\r\n .find('.mln__has-child--showing')\r\n .not(hasChildParent);\r\n\r\n if (\r\n e.type === 'click' ||\r\n e.type === 'touchend' &&\r\n !touchDrag &&\r\n !$mln.find('.mln__has-child--showing.mln__child--transitioning').length\r\n ) {\r\n if (\r\n mlnViewport().width >= mlnDataBreakpoint &&\r\n settings.autoCloseNavbarMenus === true &&\r\n !$toggleButton.closest($mln).hasClass('mln--expand-above-breakpoint') &&\r\n $toggleButton.closest($mln).hasClass('mln--navbar')\r\n ) {\r\n associatedMenu.attr('data-mln-active-status', 'off');\r\n mlnToggleChild(hasChildSiblings, 'hide', true);\r\n }\r\n\r\n if ($toggleButton.closest('.mln__has-child').hasClass('mln__has-child--showing')) {\r\n mlnToggleChild($toggleButton, 'hide', true);\r\n associatedMenu.attr('data-mln-active-status', 'off');\r\n } else {\r\n mlnToggleChild($toggleButton, 'show', true);\r\n associatedMenu.attr('data-mln-active-status', 'on');\r\n }\r\n }\r\n\r\n touchDrag = false;\r\n });\r\n\r\n // Show/hide child menus with hoverIntent or just regular hover\r\n if (\r\n settings.hoverIntent === true &&\r\n settings.toggleOnClickOnly === false\r\n ) {\r\n hasChild.each(function () {\r\n var $hasChild = $(this);\r\n var associatedMenu = $hasChild.find('.mln__child__collapse').first();\r\n\r\n $hasChild.hoverIntent({\r\n over: function () {\r\n associatedMenu.attr('data-mln-active-status', 'on');\r\n if (\r\n mlnViewport().width >= mlnDataBreakpoint &&\r\n $hasChild.closest('.mln--navbar').length\r\n ) {\r\n mlnToggleChild($hasChild, 'show', true);\r\n }\r\n },\r\n timeout: settings.hoverIntentTimeout,\r\n out: function () {\r\n associatedMenu.attr('data-mln-active-status', 'off');\r\n if (\r\n mlnViewport().width >= mlnDataBreakpoint &&\r\n associatedMenu.attr('aria-hidden') === 'false' &&\r\n $hasChild.closest('.mln--navbar').length\r\n ) {\r\n mlnToggleChild($hasChild, 'hide', true);\r\n }\r\n },\r\n delay: settings.hoverIntentTimeout\r\n });\r\n });\r\n } else if (settings.toggleOnClickOnly === false) {\r\n hasChild.each(function () {\r\n var $hasChild = $(this);\r\n var associatedMenu = $hasChild.find('.mln__child__collapse').first();\r\n\r\n $hasChild.hover(function () {\r\n if (\r\n mlnViewport().width >= mlnDataBreakpoint &&\r\n $hasChild.closest('.mln--navbar').length\r\n ) {\r\n if ($(this).closest('.mln__has-child').hasClass('mln__has-child--showing')) {\r\n associatedMenu.attr('data-mln-active-status', 'off');\r\n mlnToggleChild($(this), 'hide', true);\r\n } else {\r\n associatedMenu.attr('data-mln-active-status', 'on');\r\n mlnToggleChild($(this), 'show', true);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n // Keyboarding\r\n mlnParentList.each(function () {\r\n var $mlnParentList = $(this);\r\n var isCurrentMenuFocused;\r\n var isCurrentMlnList;\r\n\r\n $mlnParentList.on('keydown', function (e) {\r\n var pressedKeyCode = e.keyCode;\r\n var eTarget = $(e.target);\r\n\r\n // Escape key pressed\r\n if (pressedKeyCode === 27) {\r\n var associatedMenu = eTarget.closest('.mln__has-child--showing');\r\n\r\n // Set focus on parent toggle button\r\n if (associatedMenu.length) {\r\n associatedMenu\r\n .closest('.mln__has-child')\r\n .find('.mln__toggle-btn, .mln__toggle-link')\r\n .get(0)\r\n .focus();\r\n\r\n // Hide associated or closest parent menu\r\n mlnToggleChild(associatedMenu, 'hide', true);\r\n }\r\n }\r\n\r\n // Prevent tabbing into closing menu\r\n if (\r\n pressedKeyCode === 9 &&\r\n eTarget.attr('aria-expanded') ==='false' &&\r\n eTarget.parent().siblings('.mln__child__collapse').hasClass('mln__child--transitioning')\r\n ) {\r\n var nextFocusableAnchor = eTarget.closest('.mln__has-child').next().find('a').first();\r\n \r\n if (!nextFocusableAnchor.length) {\r\n nextFocusableAnchor = eTarget.closest('.mln__level-1').next().find('a').first();\r\n $('.mln__has-child--showing', $mln).each(function(){\r\n mlnToggleChild($(this), 'hide', true);\r\n });\r\n }\r\n e.preventDefault();\r\n nextFocusableAnchor.focus();\r\n }\r\n });\r\n\r\n // Close inactive menus when tabbing out of them\r\n $mlnParentList.on('keyup', function(e){\r\n var eTarget = $(e.target);\r\n \r\n if (\r\n !eTarget.closest('.mln__has-child--showing').length &&\r\n mlnViewport().width >= mlnDataBreakpoint &&\r\n settings.autoCloseInactiveMenu === true &&\r\n eTarget.closest('.mln--navbar').length\r\n ) { \r\n $('.mln__has-child--showing', $mln).each(function(){\r\n mlnToggleChild($(this), 'hide', true);\r\n });\r\n }\r\n });\r\n\r\n // Close any menu when leaving currently focused menu parent\r\n $mlnParentList.on('focusout', function (e) {\r\n setTimeout(function () {\r\n if (mlnViewport().width >= mlnDataBreakpoint) {\r\n var nonActiveMenus = $('.mln--navbar:not(:has(:focus))');\r\n $('.mln__has-child--showing', nonActiveMenus ).each(function(){\r\n mlnToggleChild($(this), 'hide', true);\r\n });\r\n }\r\n\r\n isCurrentMenuFocused = ( $(document.activeElement).closest('.mln--navbar').length && $(document.activeElement).closest('.mln__list').length ) ? true : false;\r\n \r\n if (\r\n isCurrentMenuFocused === false &&\r\n mlnViewport().width >= mlnDataBreakpoint &&\r\n e.type !== 'keydown' &&\r\n settings.autoCloseNavbarMenus === true &&\r\n $(e.target).closest('.mln--navbar').length &&\r\n !$(e.target).closest('.mln__has-child--showing').length\r\n ) {\r\n mlnToggleChild($('.mln__has-child--showing', $mln), 'hide', true);\r\n }\r\n }, 150);\r\n });\r\n });\r\n \r\n // Add special class to the current showing menu\r\n $mln.on('transition.mln.child', function() {\r\n $mln\r\n .find('.mln__visible-menu')\r\n .removeClass('mln__visible-menu');\r\n }).on('hide.mln.child show.mln.child initialized.mln', function() {\r\n if (!$mln.find('.mln__has-child--showing').length) {\r\n $mln\r\n .find('.mln__list')\r\n .addClass('mln__visible-menu');\r\n } else {\r\n $mln.find('.mln__has-child--showing')\r\n .last()\r\n .addClass('mln__visible-menu'); \r\n }\r\n });\r\n\r\n\r\n // Resizer\r\n $window.on('mlnResizeEnd', function () {\r\n if (\r\n mlnViewport().width >= mlnDataBreakpoint &&\r\n settings.autoCloseNavbarMenus === true &&\r\n settings.expandActiveItem === false\r\n ) {\r\n mlnToggleChild($('.mln__has-child--showing', $mln), 'hide', false);\r\n mlnExpander\r\n .css('height', '')\r\n .removeClass('mln__expander--showing');\r\n }\r\n\r\n // Run functions after resize\r\n expandActiveItem();\r\n mlnToggleExpander(false);\r\n assignFlowDirection();\r\n });\r\n\r\n // Run functions on load\r\n expandActiveItem();\r\n mlnToggleExpander(false);\r\n assignFlowDirection();\r\n \r\n // Add loaded class\r\n $mln.addClass('mln--js-loaded');\r\n }\r\n $mln.trigger($.Event('initialized.mln'));\r\n mlnCurrent++;\r\n });\r\n };\r\n}(jQuery));"],"file":"vendor/multilevel-nav.js"}