PageSourceSearch

https://verilymag.com/wp-content/plugins/mai-engine/assets/js/menus.js?ver=2.40.0.7920262049

js verilymag.com collected 2026-10-02 04:34:44 UTC 5,684 bytes, 173 lines download raw bytes

1( function() {
2	var maiMenuData      = typeof maiMenuVars === 'undefined' ? {} : maiMenuVars;
3	var body             = document.getElementsByTagName( 'body' )[ 0 ];
4	var siteHeaderWrap   = document.querySelector( '.site-header-wrap' );
5	var navHeaderLeft    = document.getElementsByClassName( 'nav-header-left' )[ 0 ];
6	var navHeaderRight   = document.getElementsByClassName( 'nav-header-right' )[ 0 ];
7	var navAfterHeader   = document.getElementsByClassName( 'nav-after-header' )[ 0 ];
8	var navMenus         = [ navHeaderLeft, navHeaderRight, navAfterHeader ];
9	var mobileMenu       = document.querySelector( '.mobile-menu' );
10	var mobileMenuWrap   = document.querySelector( '.mobile-menu .wrap' );
11	var mobileMenuList   = document.querySelector( '.mobile-menu .menu' );
12	var mobileMenuWidget = document.querySelector( '.mobile-menu .widget' );
13	var menuToggle       = document.getElementsByClassName( 'menu-toggle' )[ 0 ];
14
15	if ( ! siteHeaderWrap ) {
16		return;
17	}
18
19	var createMobileMenu = function() {
20		if ( mobileMenu ) {
21			return;
22		}
23
24		mobileMenu = document.createElement( 'div' );
25		mobileMenu.setAttribute( 'class', 'mobile-menu' );
26		mobileMenu.setAttribute( 'aria-label', maiMenuData.ariaLabel );
27
28		if ( ! maiMenuData.disableMicroData ) {
29			mobileMenu.setAttribute( 'itemscope', '' );
30			mobileMenu.setAttribute( 'itemtype', 'https://schema.org/SiteNavigationElement' );
31		}
32
33		if ( ! mobileMenuWrap ) {
34			mobileMenuWrap = document.createElement( 'div' );
35			mobileMenuWrap.setAttribute( 'class', 'wrap' );
36			mobileMenu.appendChild( mobileMenuWrap );
37		}
38
39		if ( ! mobileMenuList ) {
40			mobileMenuList = document.createElement( 'ul' );
41			mobileMenuList.setAttribute( 'class', 'menu' );
42			mobileMenuWrap.appendChild( mobileMenuList );
43		}
44
45		siteHeaderWrap.parentNode.insertBefore( mobileMenu, null );
46	};
47
48	var cloneMenuItems = function() {
49		if ( mobileMenu.classList.contains( 'template-part' ) ) {
50			return;
51		}
52
53		if ( mobileMenuWidget ) {
54			return;
55		}
56
57		navMenus.forEach( function( navMenu ) {
58			if ( ! navMenu ) {
59				return;
60			}
61
62			var menu = navMenu.querySelector( '.menu' );
63			if ( ! menu ) {
64				return;
65			}
66
67			var navMenuClone = menu.cloneNode( true );
68			navMenuClone.setAttribute( 'id', navMenu.getAttribute( 'id' ) + '-clone' );
69
70			Array.from( navMenuClone.children ).forEach( function( menuItem ) {
71				var lastClasses = menuItem.getAttribute( 'class' );
72
73				if ( ! lastClasses ) {
74					return;
75				}
76
77				var lastClass = lastClasses.split( ' ' ).pop();
78
79				menuItem.setAttribute( 'id', lastClass );
80
81				if ( mobileMenuList && null === mobileMenuList.querySelector( '#' + lastClass ) && ! menuItem.classList.contains( 'search' ) ) {
82					menuItem.removeAttribute( 'id' );
83					mobileMenuList.appendChild( menuItem );
84				}
85			} );
86		} );
87	};
88
89	var addMenuItemClasses = function() {
90		var menuItems = document.querySelectorAll( '.mobile-menu .menu-item' );
91		menuItems.forEach( function( menuItem ) {
92			menuItem.classList.add( 'mobile-menu-item' );
93		} );
94	};
95
96	var createSubMenuToggles = function() {
97		var subMenus = document.querySelectorAll( '.mobile-menu .sub-menu' );
98		subMenus.forEach( function( subMenu ) {
99			var subMenuToggle = document.createElement( 'button' );
100			var toggleText    = maiMenuData.subMenuToggle;
101			var parentItem    = subMenu.closest( '.menu-item' );
102
103			if ( parentItem ) {
104				var toggleTextName = parentItem.querySelector( 'span[itemprop="name"]' );
105				toggleTextName     = toggleTextName ? toggleTextName.innerText.trim() : '';
106
107				if ( toggleTextName ) {
108					toggleText = toggleTextName + ' ' + toggleText;
109				}
110			}
111
112			subMenuToggle.setAttribute( 'class', 'sub-menu-toggle' );
113			subMenuToggle.setAttribute( 'aria-expanded', 'false' );
114			subMenuToggle.setAttribute( 'aria-pressed', 'false' );
115			subMenuToggle.innerHTML = '<span class="sub-menu-toggle-icon"></span><span class="screen-reader-text">' + toggleText + '</span>';
116			subMenu.parentNode.insertBefore( subMenuToggle, subMenu );
117		} );
118	};
119
120	var toggleMobileMenu = function( event ) {
121		if ( ! menuToggle ) {
122			return;
123		}
124
125		maiToggleAriaValues( menuToggle );
126
127		body.classList.toggle( 'mobile-menu-visible' );
128
129		if ( body.classList.contains( 'mobile-menu-visible' ) ) {
130			body.addEventListener( 'keydown', maybeCloseMobileMenu, false );
131			body.addEventListener( 'click', maybeCloseMobileMenu, false );
132		} else {
133			body.removeEventListener( 'keydown', maybeCloseMobileMenu, false );
134			body.removeEventListener( 'click', maybeCloseMobileMenu, false );
135		}
136	};
137
138	var maybeCloseMobileMenu = function( event ) {
139		if ( ! event.target.closest( '.menu-toggle, .mobile-menu' ) || [ 'Escape', 'Esc' ].includes( event.key ) ) {
140			toggleMobileMenu( event );
141		}
142	};
143
144	var toggleSubMenu = function( event ) {
145		var subMenuToggle = event.target.classList.contains( 'sub-menu
145-toggle' ) ? event.target : event.target.parentNode;
146		subMenuToggle     = subMenuToggle.classList.contains( 'menu-item' ) ? subMenuToggle.getElementsByClassName( 'sub-menu-toggle' )[ 0 ] : subMenuToggle;
147		var subMenu       = subMenuToggle.nextSibling;
148
149		maiToggleAriaValues( subMenuToggle );
150
151		subMenuToggle.classList.toggle( 'active' );
152		subMenu.classList.toggle( 'visible' );
153	};
154
155	var onReady = function() {
156		createMobileMenu();
157		cloneMenuItems();
158		addMenuItemClasses();
159		createSubMenuToggles();
160
161		if ( menuToggle ) {
162			menuToggle.addEventListener( 'click', toggleMobileMenu, false );
163		}
164
165		document.addEventListener( 'click', function( event ) {
166			if ( event.target.classList.contains( 'sub-menu-toggle' ) || event.target.classList.contains( 'sub-menu-toggle-icon' ) ) {
167				toggleSubMenu( event );
168			}
169		}, false );
170	};
171
172	return onReady();
173} )();

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.