PageSourceSearch

https://lolly.global/wp-content/plugins/jet-menu/assets/public/js/jet-menu-public-scripts.js?ver=2.1.7

js lolly.global collected 2026-10-07 11:51:25 UTC 45,016 bytes, 1,439 lines download raw bytes

1( function( $ ) {
2	'use strict';
3
4	/**
5	 * JetMegaMenuClass
6	 */
7	class JetMegaMenuClass {
8
9		/**
10		 * [constructor description]
11		 * @return {[type]} [description]
12		 */
13		constructor( instance, options ) {
14			this.defaultSettings = {
15				menuId: '0',
16				menuUniqId: window.jetMenu.getUniqId(),
17				layout: 'horizontal',
18				subTrigger: 'item', // item, submarker
19				subEvent: 'click', // hover, click
20				rollUp: true,
21				breakpoint: 768, // Minimal menu width, when this plugin activates
22				mouseLeaveDelay: 500,
23				megaWidthType: 'container',
24				megaWidthSelector: '',
25				classes: {
26					instance: 'menu',
27					menuContainer: 'menu-container',
28					menuList: 'menu-list',
29					menuItem: 'menu-item',
30					menuItemLink: 'menu-item__link',
31					subMenuContainer: 'sub-menu',
32					subMenuList: 'sub-menu__list',
33					megaContainer: 'mega-container',
34				}
35			}
36
37			this.$instance = $( instance );
38			this.settings = $.extend( this.defaultSettings, options );
39			this.$window = $( window );
40			this.$document = $( document );
41			this.$body = $( 'body' );
42			this.isRTL = this.$body.hasClass( 'rtl' );
43			this.isDropdownState = false;
44
45			this.createInstance();
46		}
47
48		createInstance() {
49			this.$menuList = $( `.${ this.settings.classes.menuList }`, this.$instance );
50			this.$menuItems = $( `>.${ this.settings.classes.menuItem }:not(.${ this.settings.classes.menuItem }--roll-up)`, this.$menuList );
51			this.$rollUpItem = $( `>.${ this.settings.classes.menuItem }--roll-up`, this.$menuList );
52
53			this.menuItemsData = this.$menuItems.toArray().map( function( item ) {
54				return {
55					element: item,
56					outerWidth: $( item ).outerWidth( true ),
57					offsetLeft: $( item )[0].offsetLeft,
58				}
59			} );
60
61			this.initWatcher( 50 );
62			this.initEvents();
63			this.maybeRollUpItems();
64			this.rebuildSubContainers();
65			this.watchTick();
66
67			this.$instance.addClass( `${ this.settings.classes.instance }--inited` );
68			this.$document.trigger( 'JetMegaMenuInited' );
69		}
70
71		initEvents() {
72			let debounceTimer,
73				eventHandler = 'JetMegaMenu',
74				$itemTargetSelector = 'item' === this.settings.subTrigger ? `.${ this.settings.classes.menuItem } > .${ this.settings.classes.menuItem }__inner` : `.${ this.settings.classes.menuItem } > .${ this.settings.classes.menuItem }__inner .${ this.settings.classes.menuItem }__dropdown`;
75
76			switch ( this.settings.subEvent ) {
77				case 'hover':
78					this.$instance.on( `mouseenter.${ eventHandler }`, `.${ this.settings.classes.menuItem } > .${ this.settings.classes.menuItem }__inner`, { instance: this }, ( event ) => {
79						let $target       = $( event.target ),
80							$menuItem     = $target.parents( `.${ this.settings.classes.menuItem }` ),
81							$subContainer = $( `.${ this.settings.classes.subMenuContainer }:first, .${ this.settings.classes.megaContainer }:first`, $menuItem ),
82							templateId    = $subContainer.data( 'template-id' ) || false;
83
84						$( `.${ this.settings.classes.menuItem }--hover`, this.$instance ).removeClass( `${ this.settings.classes.menuItem }--hover` );
85
86						if ( $menuItem.hasClass( `${ this.settings.classes.menuItem }-has-children` ) ) {
87							$menuItem.addClass( `${ this.settings.classes.menuItem }--hover` );
88
89							if ( templateId ) {
90								//instance.maybeTemplateLoad( templateId, subMenu );
91							}
92						}
93					} );
94
95					this.$instance.on( `mouseleave.${ eventHandler }`, `.${ this.settings.classes.menuItem } > .${ this.settings.classes.menuItem }__inner`, ( event ) => { /* Item Mouse Leave Event */ } );
96					break;
97
98				case 'click':
99
100					this.$instance.on( `click.${ eventHandler }`, $itemTargetSelector, ( event ) => {
101						event.preventDefault();
102						event.stopPropagation();
103
104						let $currentTarget = $( event.currentTarget ),
105							$menuItem      = $currentTarget.closest( `.${ this.settings.classes.menuItem }` ),
106							$siblingsItems = $menuItem.siblings(`.${ this.settings.classes.menuItem }-has-children` ),
107							$subContainer  = $( `.${ this.settings.classes.subMenuContainer }:first, .${ this.settings.classes.megaContainer }`, $menuItem ),
108							templateId     = $subContainer.data( 'template-id' ) || false;
109
110						if ( $siblingsItems.length ) {
111							$siblingsItems.removeClass( `${ this.settings.classes.menuItem }--hover` );
112							$( `.${ this.settings.classes.menuItem }-has-children`, $siblingsItems ).removeClass( `${ this.settings.classes.menuItem }--hover` );
113						}
114
115						if ( $menuItem.hasClass( `${ this.settings.classes.menuItem }-has-children` ) ) {
116							if ( ! $menuItem.hasClass( `${ this.settings.classes.menuItem }--hover` ) ) {
117								$menuItem.addClass( `${ this.settings.classes.menuItem }--hover` );
118							} else {
119								$menuItem.removeClass( `${ this.settings.classes.menuItem }--hover` );
120							}
121
122							if ( templateId ) {
123								//instance.maybeTemplateLoad( templateId, subMenu );
124							}
125						} else {
126							
127						}
128					} );
129					break;
130			}
131
132			this.$instance.on( `mouseenter.${ eventHandler }`, `.${ this.settings.classes.subMenuContainer }, .${ this.settings.classes.megaContainer }`, ( event ) => {
133				clearTimeout( debounceTimer );
134			} );
135
136			this.$instance.on( `mouseenter.${ eventHandler }`, ( event ) => {
137				clearTimeout( debounceTimer );
138			} );
139
140			this.$instance.on( `mouseleave.${ eventHandler }`, ( event ) => {
141				debounceTimer = setTimeout( () => {
142					$( `.${ this.settings.classes.menuItem }--hover`, this.$instance ).removeClass( `${ this.settings.classes.menuItem }--hover` );
143				}, this.settings.mouseLeaveDelay );
144			} );
145
146			this.$window.on( `orientationchange.${ eventHandler } resize.${ eventHandler }`, ( event ) => {
147				$( `.${ this.settings.classes.menuItem }`, this.$instance ).removeClass( `${ this.settings.classes.menuItem }--hover` );
148				this.$instance.removeClass( `${ this.settings.classes.instance }--dropdown-open` );
149			} );
150
151			this.$document.on( `touchend.${ eventHandler }`, ( event ) => {
152
153				if ( $( event.target ).closest( `.${ this.settings.classes.menuItem }` ).length ) {
154					return;
155				}
156
157				$( `.${ this.settings.classes.menuItem }`, this.$instance ).removeClass( `${ this.settings.classes.menuItem }--hover` );
158			} );
159
160			this.$instance.on( 'watchTickEventResetRegularState', ( event ) => {
161				this.resetRegularState();
162
163				if ( this.$rollUpItem[0] ) {
164					$( `.${ this.settings.classes.subMenuList }:first`, this.$rollUpItem ).empty();
165					this.$rollUpItem[0].hidden = true;
166				}
167
168				for ( let index = 0; index < this.menuItemsData.length; index++ ) {
169					this.menuItemsData[ index ].element.hidden = false;
170				}
171			} );
172
173			this.$instance.on( 'watchTickEventResetDropdownState', ( event ) => {
174				this.resetDropdownState();
175				this.$instance.removeClass( `${ this.settings.classes.instance }--dropdown-open` );
176			} );
177
178			this.$instance.on( `click.${ eventHandler }`, `.${ this.settings.classes.instance }-toggle`,   ( event ) => {
179
180				if ( ! this.$instance.hasClass( `${ this.settings.classes.instance }--dropdown-open` ) ) {
181					this.$instance.addClass( `${ this.settings.classes.instance }--dropdown-open` );
182				} else {
183					this.$instance.removeClass( `${ this.settings.classes.instance }--dropdown-open` );
184				}
185			} );
186
187		}
188
189		/**
190		 * Init watcher function.
191		 *
192		 * @param  {number} Watcher debounce delay.
193		 * @return {void}
194		 */
195		initWatcher( delay = 10 ) {
196			$( window ).off( `resize.JetMegaMenu${ this.settings['menuUniqId'] }` ).on( `resize.JetMegaMenu${ this.settings['menuUniqId'] } orientationchange.JetMegaMenu${ this.settings['menuUniqId'] }`, this.debounce( delay, this.watchTick.bind( this ) ) );
197			this.$instance.trigger( 'containerResize' );
198		}
199
200		/**
201		 * Responsive menu watcher callback.
202		 *
203		 * @param  {Object} Resize or Orientationchange event.
204		 * @return {void}
205		 */
206		watchTick( event ) {
207
208			if ( this.isDropdown() ) {
209
210				if ( ! this.isDropdownState ) {
211					this.$instance.trigger( 'watchTickEventResetRegularState' );
212				}
213
214				this.isDropdownState = true;
215				this.$instance.removeClass( `${ this.settings.classes.instance }--layout-horizontal ${ this.settings.classes.instance }--layout-vertical` );
216				this.$instance.addClass( `${ this.settings.classes.instance }--layout-dropdown` );
217				this.$instance.trigger( 'watchTickEventDropdown' );
218			} else {
219
220				if ( this.isDropdownState ) {
221					this.$instance.trigger( 'watchTickEventResetDropdownState' );
222				}
223
224				this.isDropdownState = false;
225				this.$instance.removeClass( `${ this.settings.classes.instance }--layout-dropdown` );
226				this.$instance.addClass( `${ this.settings.classes.instance }--layout-${ this.settings.layout }` );
227				this.$instance.trigger( `watchTickEventRegular` );
228				this.$instance.trigger( `watchTickEventRegular--${ this.settings.layout }` );
229			}
230
231			this.$instance.trigger( 'watchTickEvent' );
232		}
233
234		/**
235		 * Rollup rebuilding function.
236		 *
237		 * @return {void}
238		 */
239		maybeRollUpItems() {
240			this.$instance.on( 'watchTickEventRegular--horizontal', ( event ) => {
241
242				if ( ! this.settings.rollUp ) {
243					return false;
244				}
245
246				let mainMenuWidth     = this.$instance.width(),
247				    visibleItemsArray = [],
248				    hiddenItemsArray  = [];
249
250				for ( let index = 0; index < this.menuItemsData.length; index++ ) {
251					let itemData     = this.menuItemsData[ index ],
252					    nextItemData = this.menuItemsData[ index + 1 ] || false,
253					    offsetLeft   = nextItemData ? nextItemData.offsetLeft : itemData.offsetLeft + itemData.outerWidth,
254					    item         = itemData.element;
255
256					if ( offsetLeft + this.$rollUpItem.outerWidth( true ) > mainMenuWidth ) {
257						item.hidden = true;
258						hiddenItemsArray.push( item );
259					} else {
260						item.hidden = false;
261						visibleItemsArray.push( item );
262					}
263				}
264
265				$( `.${ this.settings.classes.subMenuList }:first`, this.$rollUpItem ).empty();
266				for ( let hiddenMenuItem of hiddenItemsArray ) {
267					let $hiddenClone = $( hiddenMenuItem ).clone();
268
269					$hiddenClone[0].hidden = false;
270
271					$( `>.${ this.settings.classes.menuItem }__inner >.${ this.settings.classes.menuItemLink }`, $hiddenClone ).toggleClass( `${ this.settings.classes.menuItemLink }--top-level ${ this.settings.classes.menuItemLink }--sub-level` );
272					$( `.${ this.settings.classes.subMenuList }:first`, this.$rollUpItem ).append( $hiddenClone );
273				}
274
275				this.$rollUpItem[0].hidden = hiddenItemsArray.length ? false : true;
276
277				this.$instance.trigger( 'rollUpItemsEvent' );
278			} )
279		}
280
281		/**
282		 * Rebuild SubContainers function.
283		 *
284		 * @return {void}
285		 */
286		rebuildSubContainers() {
287			this.$instance.on( 'watchTickEventRegular--horizontal', ( event ) => {
288				let $megaMenuList   = $( `.${ this.settings.classes.megaContainer }`, this.$instance ),
289				    $subMenuList    = $( `.${ this.settings.classes.subMenuContainer }`, this.$instance ),
290				    subInverseClass = `${ this.settings.classes.subMenuContainer }--inverse`,
291				    instanceWidth   = this.$instance.width(),
292				    instanceOffset  = this.$instance.offset();
293
294				$subMenuList.each( ( index, element ) => {
295					let $element = $( element );
296
297					if ( this.isOffscreenX( element ) ) {
298						$element.addClass( subInverseClass );
299					} else {
300						$element.removeClass( subInverseClass );
301					}
302				} );
303
304				switch( this.settings.megaWidthType ) {
305					case 'container':
306						$megaMenuList.each( ( index, element ) => {
307							let $element           = $( element ),
308							    $elementPosition = $element.data( 'position' ),
309							    elementOffset      = $element.offset(),
310							    elementDeltaOffset = 'default' === $elementPosition ? ( instanceOffset.left - elementOffset.left ) : 0;
311
312							$element.css( {
313								'--jmm-submenu-width': `${ instanceWidth }px`,
314								'--jmm-submenu-delta-x-offset': `${ elementDeltaOffset }px`
315							} );
316						} );
317
318						break;
319					case 'selector':
320						let $customSelector = $( this.settings.megaWidthSelector );
321
322						if ( $customSelector[0] ) {
323							let selectorWidth = $customSelector.width(),
324							    selectorOffset = $customSelector.offset();
325
326							$megaMenuList.each( ( index, element ) => {
327								let $element           = $( element ),
328								    $elementPosition   = $element.data( 'position' ),
329								    elementOffset      = $element.offset(),
330								    elementDeltaOffset = 'default' === $elementPosition ? ( selectorOffset.left - elementOffset.left ) : 0;
331
332								$element.css( {
333									'--jmm-submenu-width': `${ selectorWidth }px`,
334									'--jmm-submenu-delta-x-offset': `${ elementDeltaOffset }px`
335								} );
336							} );
337
338						}
339
340						break;
341					case 'items':
342						let $lastItem        = $( `.${ this.settings.classes.menuItem }--top-level:not([hidden]):last`, this.$instance ),
343						    $firstItem        = $( `.${ this.settings.classes.menuItem }--top-level:not([hidden]):first`, this.$instance ),
344						    lastItemBounding = $lastItem[0].getBoundingClientRect(),
345						    firstItemBounding = $firstItem[0].getBoundingClientRect(),
346						    itemsWidth       = lastItemBounding.x + lastItemBounding.width  - firstItemBounding.x;
347
348						$megaMenuList.each( ( index, element ) => {
349							let $element           = $( element ),
350							    $elementPosition   = $element.data( 'position' ),
351							    elementOffset      = $element.offset(),
352							    elementDeltaOffset = 'default' === $elementPosition ? ( instanceOffset.left - elementOffset.left ) : 0;
353
354							$element.css( {
355								'--jmm-submenu-width': `${ itemsWidth }px`,
356								'--jmm-submenu-delta-x-offset': `${ elementDeltaOffset }px`
357							} );
358						} );
359						break;
360				}
361			} );
362
363			this.$instance.on( 'watchTickEventRegular--vertical', ( event ) => {
364				let $megaMenuList    = $( `.${ this.settings.classes.megaContainer }`, this.$instance ),
365				    $subMenuList     = $( `.${ this.settings.classes.subMenuContainer }`, this.$instance ),
366				    instanceWidth    = this.$instance.width(),
367				    instanceHeight   = this.$instance.height(),
368				    instanceOffset   = this.$instance.offset(),
369					windowWidth      = this.$window.outerWidth( true ),
370					subInverseClass  = `${ this.settings.classes.subMenuContainer }--inverse`,
371					megaInverseClass = `${ this.settings.classes.megaContainer }--inverse`;
372
373				$subMenuList.each( ( index, element ) => {
374					let $element = $( element );
375
376					if ( this.isOffscreenX( element ) ) {
377						$element.addClass( subInverseClass );
378					} else {
379						$element.removeClass( subInverseClass );
380					}
381				} );
382
383				$megaMenuList.each( ( index, element ) => {
384					let $element            = $( element ),
385					    $elementPosition    = $element.data( 'position' ),
386					    $parentElement      = $element.parent(),
387					    elementOffset       = $element.offset(),
388					    elementDeltaOffsetX = ( instanceOffset.left - elementOffset.left ) + instanceWidth,
389					    elementDeltaOffsetY = 'default' === $elementPosition ? ( instanceOffset.top - elementOffset.top ) : 0,
390					    elementDeltaWidth   = ( elementDeltaOffsetX + $element.width() );
391
392					if ( $parentElement.hasClass(`${ this.settings.classes.menuItem }--top-level` ) ) {
393						$element.css( {
394							//'--jmm-submenu-width': `${ instanceWidth }px`,
395							'--jmm-submenu-min-height': `${ instanceHeight }px`,
396							//'--jmm-submenu-delta-x-offset': `${ elementDeltaOffsetX }px`,
397							'--jmm-submenu-delta-y-offset': `${ elementDeltaOffsetY }px`
398						} );
399					}
400
401					if ( this.isOffscreenX( element ) ) {
402						$element.addClass( megaInverseClass );
403					} else {
404						$element.removeClass( megaInverseClass );
405					}
406				} );
407			} );
408		}
409
410		/**
411		 * Reset Regular State
412		 *
413		 * @return {void}
414		 */
415		resetRegularState() {}
416
417		/**
418		 * Reset Dropdown State
419		 *
420		 * @return {void}
421		 */
422		resetDropdownState() {}
423
424		/**
425		 * Get mobile status.
426		 *
427		 * @return {boolean} Mobile Status
428		 */
429		isDropdown() {
430			return ( this.$window.width() < this.settings.breakpoint || 'dropdown' === this.settings.layout ) ? true : false;
431		}
432
433		/**
434		 *
435		 * @param element
436		 * @returns {boolean}
437		 */
438		isOffscreenX( element ) {
439			let rect = element.getBoundingClientRect();
440
441			return (
442				rect.x < 0 || ( rect.x + rect.width ) > window.innerWidth
443			);
444		}
445
446		/**
447		 * Mobile and tablet check funcion.
448		 *
449		 * @return {boolean} Mobile Status
450		 */
451		mobileAndTabletcheck() {
452			let check = false;
453
454			(function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|
454sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);
455
456			return check;
457		}
458
459		/**
460		 * Debounce the function call
461		 *
462		 * @param  {number}   threshold The delay.
463		 * @param  {Function} callback  The function.
464		 */
465		debounce( threshold, callback ) {
466			let timeout;
467
468			return function debounced( $event ) {
469				function delayed() {
470					callback.call( this, $event );
471					timeout = null;
472				}
473
474				if ( timeout ) {
475					clearTimeout( timeout );
476				}
477
478				timeout = setTimeout( delayed, threshold );
479			};
480		}
481	}
482
483	// jQuery plugin
484	$.fn.JetMegaMenu = function( options ) {
485		return this.each( function() {
486			let $this         = $( this ),
487				pluginOptions = ( 'object' === typeof options ) ? options : {};
488
489			if ( ! $this.data( 'JetMegaMenu' ) ) {
490				// create plugin instance (only if not exists) and expose the entire instance API
491				$this.data( 'JetMegaMenu', new JetMegaMenuClass( this, pluginOptions ) );
492			}
493		} );
494	};
495} ( jQuery ));
496
497// JetMenu Public Scripts
498( function( $ ) {
499	'use strict';
500
501	window.jetMenu = {
502
503		addedScripts: {},
504
505		addedStyles: {},
506
507		addedAssetsPromises: [],
508
509		initedMobileRenderInstance: [],
510
511		eventBus: new Vue(),
512
513		$body: $( 'body' ),
514
515		init: function() {
516			this.initLocationMenuRender();
517			this.mobileVueComponents();
518			this.initMobileRender();
519		},
520
521		initLocationMenuRender: function() {
522
523			let $megaMenu = $( '.jet-mega-menu--location-wp-nav' );
524
525			if ( $megaMenu[0] ) {
526				let settings = $megaMenu.data( 'settings' );
527
528				$megaMenu.JetMegaMenu( {
529					rollUp: settings.rollUp,
530					layout: settings.layout,
531					subTrigger: settings.subTrigger,
532					subEvent: settings.subEvent,
533					breakpoint: settings.breakpoint,
534					megaWidthType: settings.megaWidthType,
535					megaWidthSelector: settings.megaWidthSelector,
536					classes: {
537						instance: 'jet-mega-menu',
538						menuContainer: 'jet-mega-menu-container',
539						menuList: 'jet-mega-menu-list',
540						menuItem: 'jet-mega-menu-item',
541						menuItemLink: 'jet-mega-menu-item__link',
542						subMenuContainer: 'jet-mega-menu-sub-menu',
543						subMenuList: 'jet-mega-menu-sub-menu__list',
544						megaContainer: 'jet-mega-menu-mega-container',
545					}
546				} );
547			}
548
549		},
550
551		initMobileRender: function() {
552
553			let mobileMenuList = $( '.jet-mobile-menu--location-wp-nav' );
554
555			if ( ! mobileMenuList[0] ) {
556				return false;
557			}
558
559			if ( 'true' === window.jetMenuPublicSettings.devMode ) {
560				Vue.config.devtools = true;
561			}
562
563			mobileMenuList.each( function() {
564				let $this          = $( this ),
565					menuInstanceId = $this.attr( 'id' ),
566					menuId         = $this.data( 'menu-id' ) || false,
567					menuOptions    = $this.data( 'menu-options' ) || {};
568
569				jetMenu.createMobileRenderInstance( menuInstanceId, menuId, menuOptions );
570			} );
571		},
572
573		createMobileRenderInstance: function( menuInstanceId, menuId, menuOptions ) {
574
575			if ( jetMenu.initedMobileRenderInstance.includes( menuInstanceId ) ) {
576				return;
577			}
578
579			jetMenu.initedMobileRenderInstance.push( menuInstanceId );
580
581			let mobileRenderInstance = new Vue( {
582				el: '#' + menuInstanceId,
583				data: {
584					uniqId: menuInstanceId,
585					menuOptions: menuOptions,
586					refsHtml: {},
587				},
588				mounted: function() {
589					let refsHtml = {};
590
591					for ( var ref in this.$refs ) {
592						Object.assign( refsHtml, { [ ref ]: this.$refs[ ref ].innerHTML } );
593					}
594
595					this.refsHtml = refsHtml;
596				}
597			} );
598		},
599
600		mobileVueComponents: function() {
601
602			Vue.component( 'mobile-menu-item', {
603				template: '#mobile-menu-item-template',
604
605				props: {
606					itemDataObject: Object,
607					depth: Number
608				},
609
610				data: function() {
611					return ( {
612						ajaxRequest: null,
613						templateLoadStatus: false,
614						subDropdownVisible: false
615					} )
616				},
617
618				computed: {
619
620					itemClasses: function() {
621						let itemClasses = [
622							'jet-mobile-menu__item',
623							'jet-menu-item-' + this.itemDataObject.itemId,
624							'jet-mobile-menu__item--sub-trigger-' + ( this.$root.menuOptions.subTrigger || 'item' ),
625						];
626
627						let customClasses = this.itemDataObject.classes;
628
629						if ( 0 !== customClasses.length ) {
630							itemClasses = itemClasses.concat( customClasses );
631						}
632
633						if ( window.location.href === this.itemDataObject.url ) {
634							itemClasses.push( 'jet-mobile-menu__item--active' );
635						}
636
637						return itemClasses;
638					},
639
640					itemLinkClasses: function() {
641						let classes = [
642							'mobile-link',
643							0 === this.depth ? 'mobile-top-level-link' : 'mobile-sub-level-link',
644						];
645
646						return classes;
647					},
648
649					isСhildrenDefine: function() {
650						return this.itemDataObject.children ? true : false;
651					},
652
653					isTemplateDefine: function() {
654						return false !== this.itemDataObject.elementorTemplateId ? true : false;
655					},
656
657					isSub: function() {
658						return this.isСhildrenDefine || this.isTemplateDefine ? true : false;
659					},
660
661					isTopLevel: function() {
662						return 0 === this.depth ? true : false;
663					},
664
665					isDropdownLayout: function() {
666						return this.isSub && ! this.isTemplateDefine && 'dropdown' === this.$root.menuOptions.subOpenLayout;
667					},
668
669					depthClass: function() {
670						return 0 === this.depth ? 'mobile-top-level-link' : 'mobile-sub-level-link';
671					},
672
673					dropdownIconHtml: function() {
674						let dropdownIcon = this.$root.refsHtml.dropdownIcon ? this.$root.refsHtml.dropdownIcon : '<span class="dashicons dashicons-arrow-right"></span>',
675							dropdownOpenedIcon = this.$root.refsHtml.dropdownOpenedIcon ? this.$root.refsHtml.dropdownOpenedIcon : '<span class="dashicons dashicons-arrow-down"></span>';
676
677						if ( this.subDropdownVisible ) {
678							dropdownIcon = dropdownOpenedIcon;
679						}
680
681						return dropdownIcon;
682					},
683
684					itemIconHtml: function() {
685						return this.itemDataObject.itemIcon;
686					},
687
688					isIconVisible: function() {
689						let iconVisible = this.$root.menuOptions.itemIconVisible;
690
691						return ! iconVisible || '' === this.itemDataObject.itemIcon || ! this.itemDataObject.itemIcon ? false : true;
692					},
693
694					isBadgeVisible: function() {
695						let badgeVisible = this.$root.menuOptions.itemBadgeVisible;
696
697						return false === badgeVisible || '' === this.itemDataObject.badgeText || ! this.itemDataObject.badgeText ? false : true;
698					},
699
700					isDescVisible: function() {
701						let descVisible = this.$root.menuOptions.itemDescVisible;
702
703						return false === descVisible || '' === this.itemDataObject.description || ! this.itemDataObject.description ? false : true;
704					},
705
706					loaderColor: function() {
707						return this.$root.menuOptions.loaderColor || '#3a3a3a';
708					},
709				},
710
711				methods: {
712					itemSubHandler: function( event ) {
713						let target     = event.target,
714							mobileLink = $( target ).closest( '.mobile-link' );
715
716						if ( 'item' !== this.$root.menuOptions.subTrigger ) {
717							return;
718						}
719
720						if ( this.isSub && mobileLink ) {
721							event.preventDefault();
722						}
723
724						if ( ! this.isSub && mobileLink && this.$root.menuOptions.closeAfterNavigate ) {
725							jetMenu.eventBus.$emit( 'closeMenu', {
726								menuUniqId: this.$root.menuOptions.menuUniqId,
727							} );
728						}
729
730						this.switchToSub( event );
731					},
732
733					markerSubHandler: function( event ) {
734
735						if ( 'submarker' !== this.$root.menuOptions.subTrigger ) {
736							return;
737						}
738
739						this.switchToSub( event );
740					},
741
742					switchToSub: function( event ) {
743
744						if ( ! this.isSub ) {
745							return;
746						}
747
748						if ( ! this.isTemplateDefine ) {
749
750							if ( this.isDropdownLayout ) {
751								this.subDropdownVisible = !this.subDropdownVisible;
752
753								return;
754							}
755
756							jetMenu.eventBus.$emit( 'itemsSubSwitch', {
757								menuUniqId: this.$root.menuOptions.menuUniqId,
758								id: this.itemDataObject.id,
759								name: this.itemDataObject.name,
760								children: this.itemDataObject.children || false
761							} );
762
763						} else {
764
765							if ( ! this.itemDataObject.elementorContent ) {
766								this.getElementorTemplate();
767							} else {
768
769								jetMenu.eventBus.$emit( 'showTemplateContent', {
770									menuUniqId: this.$root.menuOptions.menuUniqId,
771									id: this.itemDataObject.id,
772									name: this.itemDataObject.name,
773									elementorContent: this.itemDataObject.elementorContent
774								} );
775							}
776						}
777					},
778
779					getElementorTemplate: function() {
780						var vueInstance = this;
781
782						vueInstance.ajaxRequest = $.ajax( {
783							type: 'GET',
784							url: window.jetMenuPublicSettings.templateApiUrl,
785							dataType: 'json',
786							data: {
787								'id': vueInstance.itemDataObject.elementorTemplateId,
788								'dev': window.jetMenuPublicSettings.devMode
789							},
790							beforeSend: function( jqXHR, ajaxSettings ) {
791
792								if ( null !== vueInstance.ajaxRequest ) {
793									vueInstance.ajaxRequest.abort();
794								}
795
796								vueInstance.templateLoadStatus = true;
797
798								jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
799							},
800							success: function( responce, textStatus, jqXHR ) {
801								var templateContent   = responce['template_content'],
802									templateScripts   = responce['template_scripts'],
803									templateStyles    = responce['template_styles'];
804
805								for ( var scriptHandler in templateScripts ) {
806									jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) );
807								}
808
809								for ( var styleHandler in templateStyles ) {
810									jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) );
811								}
812
813								vueInstance.templateLoadStatus = false;
814
815								vueInstance.itemDataObject.elementorContent = templateContent;
816
817								jetMenu.eventBus.$emit( 'showTemplateContent', {
818									menuUniqId: vueInstance.$root.menuOptions.menuUniqId,
819									id: vueInstance.itemDataObject.id,
820									name: vueInstance.itemDataObject.name,
821									elementorContent: vueInstance.itemDataObject.elementorContent
822								} );
823							}
824						} );
825					}
826				}
827
828			});
829
830			Vue.component( 'mobile-menu-list', {
831				template: '#mobile-menu-list-template',
832				props: {
833					depth: Number,
834					childrenObject: Object
835				}
836			} );
837
838			Vue.component( 'mobile-menu', {
839				template: '#mobile-menu-template',
840
841				data: function() {
842					return ( {
843						menuOpen: false,
844						children: false,
845						itemsRawData: {},
846						trail:[],
847						breadcrumbsData: [],
848						animation: 'items-next-animation',
849						ajaxRequest: null,
850						templateVisible: false,
851						instanceLoadStatus: false,
852						itemTemplateContent: false,
853						headerTemplate: this.$root.menuOptions['headerTemplate'] || 0,
854						headerContent: false,
855						headerTemplateVisible: false,
856						beforeTemplate: this.$root.menuOptions['beforeTemplate'] || 0,
857						beforeContent: false,
858						afterTemplate: this.$root.menuOptions['afterTemplate'] || 0,
859						afterContent: false,
860						ajaxPromises: [],
861					} )
862				},
863
864				mounted: function() {
865					let vueInstance = this;
866
867					if ( this.menuOpen ) {
868						jetMenu.$body.addClass( 'jet-mobile-menu-visible' );
869
870						if ( 'slide-out' === this.$root.menuOptions.menuLayout ) {
871							jetMenu.$body.addClass( 'jet-menu-body-blocker' );
872						}
873					}
874
875					this.ajaxPromises.push(
876						new Promise( function( resolve, reject ) {
877							$.ajax( {
878								type: 'GET',
879								url: window.jetMenuPublicSettings.menuItemsApiUrl,
880								dataType: 'json',
881								data: {
882									'menu_id': vueInstance.menuId,
883									'dev': window.jetMenuPublicSettings.devMode,
884									'lang': window.jetMenuPublicSettings.wpmlLanguageCode || false
885								},
886								beforeSend: function( jqXHR, ajaxSettings ) {
887									jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
888								},
889								success: function( responce, textStatus, jqXHR ) {
890									let responceData = responce.data.items;
891
892									vueInstance.itemsRawData = responceData;
893
894									resolve();
895								}
896							} );
897						} )
898					);
899
900					if ( 0 !== +this.headerTemplate ) {
901						this.ajaxPromises.push(
902							new Promise( function( resolve, reject ) {
903								$.ajax( {
904									type: 'GET',
905									url: window.jetMenuPublicSettings.templateApiUrl,
906									dataType: 'json',
907									data: {
908										'id': vueInstance.headerTemplate,
909										'dev': window.jetMenuPublicSettings.devMode
910									},
911									beforeSend: function( jqXHR, ajaxSettings ) {
912										jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
913									},
914									success: function( responce, textStatus, jqXHR ) {
915										let templateContent = responce['template_content'],
916											templateScripts = responce['template_scripts'],
917											templateStyles  = responce['template_styles'];
918
919										for ( let scriptHandler in templateScripts ) {
920											jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) );
921										}
922
923										for ( let styleHandler in templateStyles ) {
924											jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) );
925										}
926
927										vueInstance.headerContent = templateContent;
928										vueInstance.headerTemplateVisible = true;
929
930										resolve();
931									}
932								} );
933							} )
934						);
935					}
936
937					if ( 0 !== +this.beforeTemplate ) {
938						this.ajaxPromises.push(
939							new Promise( function( resolve, reject ) {
940								$.ajax( {
941									type: 'GET',
942									url: window.jetMenuPublicSettings.templateApiUrl,
943									dataType: 'json',
944									data: {
945										'id': vueInstance.beforeTemplate,
946										'dev': window.jetMenuPublicSettings.devMode
947									},
948									beforeSend: function( jqXHR, ajaxSettings ) {
949										jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
950									},
951									success: function( responce, textStatus, jqXHR ) {
952										let templateContent = responce['template_content'],
953											templateScripts = responce['template_scripts'],
954											templateStyles  = responce['template_styles'];
955
956										for ( let scriptHandler in templateScripts ) {
957											jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) );
958										}
959
960										for ( let styleHandler in templateStyles ) {
961											jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) );
962										}
963
964										vueInstance.beforeContent = templateContent;
965
966										resolve();
967									}
968								} );
969							} )
970						);
971					}
972
973					if ( 0 !== +this.afterTemplate ) {
974						this.ajaxPromises.push(
975							new Promise( function( resolve, reject ) {
976								$.ajax( {
977									type: 'GET',
978									url: window.jetMenuPublicSettings.templateApiUrl,
979									dataType: 'json',
980									data: {
981										'id': vueInstance.afterTemplate,
982										'dev': window.jetMenuPublicSettings.devMode
983									},
984									beforeSend: function( jqXHR, ajaxSettings ) {
985										jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
986									},
987									success: function( responce, textStatus, jqXHR ) {
988										let templateContent = responce['template_content'],
989											templateScripts = responce['template_scripts'],
990											templateStyles  = responce['template_styles'];
991
992										for ( let scriptHandler in templateScripts ) {
993											jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) );
994										}
995
996										for ( let styleHandler in templateStyles ) {
997											jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) );
998										}
999
1000										vueInstance.afterContent = templateContent;
1001										resolve();
1002									}
1003								} );
1004							} )
1005						);
1006					}
1007
1008					this.instanceLoadStatus = true;
1009
1010					Promise.all( this.ajaxPromises ).then( function() {
1011						vueInstance.instanceLoadStatus = false;
1012					}, function( reason ) {
1013						console.log( 'Script Loaded Error' );
1014					} );
1015
1016					jetMenu.eventBus.$on( 'itemsSubSwitch', function ( payLoad ) {
1017
1018						if ( vueInstance.$root.menuOptions.menuUniqId !== payLoad.menuUniqId ) {
1019							return;
1020						}
1021
1022						vueInstance.trail.push( payLoad.children );
1023						vueInstance.children = payLoad.children;
1024						vueInstance.animation = 'items-next-animation';
1025						vueInstance.breadcrumbsData.push( payLoad.name );
1026					} );
1027
1028					jetMenu.eventBus.$on( 'showTemplateContent', function ( payLoad ) {
1029
1030						if ( vueInstance.$root.menuOptions.menuUniqId !== payLoad.menuUniqId ) {
1031							return;
1032						}
1033
1034						vueInstance.itemTemplateContent = payLoad.elementorContent;
1035						vueInstance.templateVisible = true;
1036						vueInstance.breadcrumbsData.push( payLoad.name );
1037						vueInstance.animation = 'items-next-animation';
1038
1039						vueInstance.showTemplateContent();
1040					} );
1041
1042					jetMenu.eventBus.$on( 'closeMenu', function( payLoad ) {
1043
1044						if ( vueInstance.$root.menuOptions.menuUniqId !== payLoad.menuUniqId ) {
1045							return;
1046						}
1047
1048						vueInstance.closeMenu();
1049					} );
1050
1051				},
1052
1053				watch: {
1054					menuOpen: function( curr, prev ) {
1055
1056						if ( curr ) {
1057							jetMenu.$body.addClass( 'jet-mobile-menu-visible' );
1058
1059							if ( 'slide-out' === this.$root.menuOptions.menuLayout ) {
1060								jetMenu.$body.addClass( 'jet-menu-body-blocker' );
1061							}
1062
1063							this.initTemplatesContent();
1064						}
1065
1066						if ( ! curr ) {
1067							jetMenu.$body.removeClass( 'jet-mobile-menu-visible' );
1068
1069							if ( 'slide-out' === this.$root.menuOptions.menuLayout ) {
1070								jetMenu.$body.removeClass( 'jet-menu-body-blocker' );
1071							}
1072
1073							this.clearStates();
1074						}
1075					}
1076				},
1077
1078				computed: {
1079					instanceClass: function() {
1080						let classes = [
1081							'jet-mobile-menu__instance',
1082							'jet-mobile-menu__instance--' + this.$root.menuOptions.menuLayout + '-layout',
1083							this.$root.menuOptions.menuPosition + '-container-position',
1084							( this.$root.menuOptions.togglePosition || 'default' ) + '-toggle-position',
1085						];
1086
1087						return classes;
1088					},
1089
1090					menuContainerVisible: function() {
1091						return this.menuOpen && !this.instanceLoadStatus;
1092					},
1093
1094					menuId: function() {
1095
1096						if ( this.$root.menuOptions.mobileMenuId ) {
1097							return this.$root.menuOptions.mobileMenuId;
1098						}
1099
1100						return this.$root.menuOptions.menuId;
1101					},
1102
1103					coverVisible: function() {
1104
1105						let avaliableForLayout = [
1106							'slide-out'
1107						];
1108
1109						return avaliableForLayout.includes( this.$root.menuOptions.menuLayout );
1110					},
1111
1112					itemsList: function() {
1113
1114						if ( ! this.children ) {
1115							return this.itemsRawData;
1116						}
1117
1118						return this.children;
1119					},
1120
1121					isClose: function() {
1122						let avaliableForLayout = [
1123							'slide-out'
1124						];
1125
1126						return avaliableForLayout.includes( this.$root.menuOptions.menuLayout );
1127					},
1128
1129					isBack: function() {
1130						return this.children || this.templateVisible ? true : false;
1131					},
1132
1133					isBreadcrumbs: function() {
1134						return this.$root.menuOptions.useBreadcrumb && 0 !== this.breadcrumbsData.length ? true : false;
1135					},
1136
1137					breadcrumbsPathData: function() {
1138
1139						if ( 'minimal' === this.$root.$root.menuOptions.breadcrumbPath && 1 < this.breadcrumbsData.length ) {
1140							return this.breadcrumbsData.filter( ( item, index, breadcrumbsData ) => {
1141								return 	index === breadcrumbsData.length - 1;
1142							} );
1143						}
1144
1145						return this.breadcrumbsData;
1146					},
1147
1148					depth: function() {
1149						return this.trail.length;
1150					},
1151
1152					containerPosition: function() {
1153						return this.$root.menuOptions.menuPosition;
1154					},
1155
1156					showAnimation: function() {
1157
1158						let animation = false;
1159
1160						switch( this.$root.menuOptions.menuLayout ) {
1161
1162							case 'slide-out':
1163								animation = 'right' === this.containerPosition ? 'menu-container-left-animation' : 'menu-container-right-animation';
1164								break;
1165
1166							case 'dropdown':
1167								animation = 'menu-container-dropdown-animation';
1168								break;
1169
1170							case 'push':
1171								animation = 'menu-container-expand-animation';
1172								break;
1173						}
1174
1175						return animation;
1176					},
1177
1178					toggleClosedIcon: function() {
1179						return this.$root.refsHtml.toggleClosedIcon || '';
1180					},
1181
1182					toggleOpenedIcon: function() {
1183						return this.$root.refsHtml.toggleOpenedIcon || '';
1184					},
1185
1186					toggleText: function() {
1187						return '' !== this.$root.menuOptions.toggleText ? this.$root.menuOptions.toggleText : false;
1188					},
1189
1190					closeIcon: function() {
1191						return this.$root.refsHtml.closeIcon || '';
1192					},
1193
1194					backIcon: function() {
1195						let backIcon = this.$root.refsHtml.backIcon || '',
1196							backText = '' !== this.$root.menuOptions.backText ? '<span>' + this.$root.menuOptions.backText + '</span>' : '',
1197							backHtml = backIcon + backText;
1198
1199						return backHtml;
1200					},
1201
1202					backText: function() {
1203						return '' !== this.$root.menuOptions.backText ? this.$root.menuOptions.backText : false;
1204					},
1205
1206					breadcrumbIcon: function() {
1207						return this.$root.refsHtml.breadcrumbIcon || '';
1208					},
1209
1210					loaderColor: function() {
1211						return this.$root.menuOptions.loaderColor || '#3a3a3a';
1212					},
1213
1214					toggleLoaderVisible: function() {
1215						return this.$root.menuOptions.toggleLoader && this.instanceLoadStatus && this.menuOpen ? true : false;
1216					},
1217
1218					beforeTemplateVisible: function() {
1219						return this.beforeContent ? true : false;
1220					},
1221
1222					afterTemplateVisible: function() {
1223						return this.afterContent ? true : false;
1224					}
1225
1226				},
1227
1228				methods: {
1229					menuToggle: function() {
1230						this.menuOpen = ! this.menuOpen;
1231					},
1232
1233					closeMenu: function() {
1234						this.menuOpen = false;
1235					},
1236
1237					clearStates: function() {
1238						this.trail = [];
1239						this.children = false;
1240						this.breadcrumbsData = [];
1241						this.templateVisible = false;
1242					},
1243
1244					goBack: function() {
1245
1246						this.animation = 'items-prev-animation';
1247
1248						if ( ! this.templateVisible ) {
1249							this.$delete( this.trail, this.trail.length - 1 );
1250							this.children = this.trail.slice(-1)[0] || false;
1251						} else {
1252							this.templateVisible = false;
1253						}
1254
1255						this.$delete(this.breadcrumbsData, this.breadcrumbsData.length - 1);
1256					},
1257
1258					escapeKeyHandler: function() {
1259
1260						if ( this.isBack ) {
1261							this.goBack();
1262						} else {
1263							this.closeMenu();
1264						}
1265					},
1266
1267					showTemplateContent: function() {
1268						let vueInstance = this;
1269
1270						this.$nextTick( function() {
1271							let $templateContainer = $( vueInstance.$refs['template-content'] ).find( '.jet-mobile-menu__template-content' );
1272
1273							jetMenu.elementorContentRender( $templateContainer );
1274						} );
1275					},
1276
1277					initTemplatesContent: function() {
1278						let vueInstance = this;
1279
1280						this.$nextTick( function() {
1281
1282							if ( vueInstance.headerContent ) {
1283								let $headerContainer = $( vueInstance.$refs['header-template-content'] );
1284
1285								jetMenu.elementorContentRender( $headerContainer );
1286							}
1287
1288							if ( vueInstance.beforeContent ) {
1289								let $beforeContainer = $( vueInstance.$refs['before-template-content'] );
1290
1291								jetMenu.elementorContentRender( $beforeContainer );
1292							}
1293
1294							if ( vueInstance.afterContent ) {
1295								let $afterContainer = $( vueInstance.$refs['after-template-content'] );
1296
1297								jetMenu.elementorContentRender( $afterContainer );
1298							}
1299						} );
1300					},
1301
1302					breadcrumbHandle: function( index ) {
1303
1304						if ( index === this.breadcrumbsData.length ) {
1305							return;
1306						}
1307
1308						if ( 'minimal' === this.$root.menuOptions.breadcrumbPath ) {
1309							this.goBack();
1310
1311							return;
1312						}
1313
1314						this.animation = 'items-prev-animation';
1315						this.trail = this.trail.slice( 0, index );
1316						this.children = this.trail.slice( -1 )[0] || false;
1317						this.templateVisible = false;
1318						this.breadcrumbsData = this.breadcrumbsData.slice( 0, index );
1319					}
1320
1321				}
1322			});
1323		},
1324
1325		loadScriptAsync: function( script, uri ) {
1326
1327			if ( jetMenu.addedScripts.hasOwnProperty( script ) ) {
1328				return script;
1329			}
1330
1331			jetMenu.addedScripts[ script ] = uri;
1332
1333			return new Promise( function( resolve, reject ) {
1334				var tag = document.createElement( 'script' );
1335
1336					tag.src    = uri;
1337					tag.async  = true;
1338					tag.onload = function() {
1339						resolve( script );
1340					};
1341
1342				document.head.appendChild( tag );
1343			} );
1344		},
1345
1346		loadStyle: function( style, uri ) {
1347
1348			if ( jetMenu.addedStyles.hasOwnProperty( style ) && jetMenu.addedStyles[ style ] ===  uri) {
1349				return style;
1350			}
1351
1352			jetMenu.addedStyles[ style ] = uri;
1353
1354			return new Promise( function( resolve, reject ) {
1355				var tag = document.createElement( 'link' );
1356
1357					tag.id      = style;
1358					tag.rel     = 'stylesheet';
1359					tag.href    = uri;
1360					tag.type    = 'text/css';
1361					tag.media   = 'all';
1362					tag.onload  = function() {
1363						resolve( style );
1364					};
1365
1366				document.head.appendChild( tag );
1367			});
1368		},
1369
1370		elementorContentRender: function( $templateContainer, templateContent ) {
1371			let content = templateContent || false;
1372
1373			Promise.all( jetMenu.addedAssetsPromises ).then( function( value ) {
1374
1375				if ( templateContent ) {
1376					$templateContainer.html( templateContent );
1377				}
1378
1379				// Before ajax frontend init
1380				$( window ).trigger( 'jet-menu/ajax/frontend-init/before', {
1381					$container: $templateContainer,
1382					content: content,
1383				} );
1384
1385				jetMenu.elementorFrontendInit( $templateContainer );
1386
1387				// Before ajax frontend init
1388				$( window ).trigger( 'jet-menu/ajax/frontend-init/after', {
1389					$container: $templateContainer,
1390					content: content,
1391				} );
1392			}, function( reason ) {
1393				console.log( 'Script Loaded Error' );
1394			});
1395		},
1396
1397		elementorFrontendInit: function( $templateContainer ) {
1398
1399			$templateContainer.find( 'div[data-element_type]' ).each( function() {
1400				var $this       = $( this ),
1401					elementType = $this.data( 'element_type' );
1402
1403				if ( ! elementType ) {
1404					return;
1405				}
1406
1407				try {
1408					if ( 'widget' === elementType ) {
1409						elementType = $this.data( 'widget_type' );
1410
1411						if ( window.elementorFrontend && window.elementorFrontend.hooks ) {
1412							window.elementorFrontend.hooks.doAction( 'frontend/element_ready/widget', $this, $ );
1413						}
1414					}
1415
1416					if ( window.elementorFrontend && window.elementorFrontend.hooks ) {
1417						window.elementorFrontend.hooks.doAction( 'frontend/element_ready/global', $this, $ );
1418						window.elementorFrontend.hooks.doAction( 'frontend/element_ready/' + elementType, $this, $ );
1419					}
1420
1421				} catch ( err ) {
1422					console.log(err);
1423
1424					$this.remove();
1425
1426					return false;
1427				}
1428			} );
1429		},
1430
1431		getUniqId: function() {
1432			return Math.random().toString( 36 ).substr( 2, 9 );
1433		},
1434
1435	};
1436
1437	jetMenu.init();
1438
1439} ( 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.