PageSourceSearch

https://dataloop.ai/wp-content/plugins/jet-menu/assets/public/js/legacy/jet-menu-public-scripts.js?ver=2.4.7

js dataloop.ai collected 2026-10-01 11:37:56 UTC 52,987 bytes, 1,811 lines download raw bytes

1( function( $ ) {
2	'use strict';
3
4	var JetMenuPlugin = function( element, options ) {
5
6		this.defaultSettings = {
7			enabled: false,
8			mouseLeaveDelay: 500,
9			openSubType: 'click', // hover, click
10			ajaxLoad: true,
11			megaWidthType: 'container',
12			megaWidthSelector: '',
13			mainMenuSelector: '.jet-menu',
14			menuItemSelector: '.jet-menu-item',
15			moreMenuContent:  '···',
16			rollUpDelta: 0,
17		}
18
19		this.settings = $.extend( this.defaultSettings, options );
20
21		this.$window = $( window );
22
23		this.$document = $( document );
24
25		this.$element = $( element );
26
27		this.$instance = $( this.settings.mainMenuSelector, this.$element );
28
29		this.$menuItems = $( '>' + this.settings.menuItemSelector, this.$instance );
30
31		this.menuItemsData = this.$menuItems.toArray().map( ( item ) => {
32			return {
33				element: item,
34				outerWidth: $( item ).outerWidth( true ) + this.settings.rollUpDelta,
35			}
36		} );
37
38		this.$moreItemsInstance = null;
39
40		this.hiddenItemsArray = [];
41
42		this.createMenuInstance();
43
44		this.$instance.trigger( 'jetMenuCreated' );
45
46		return this;
47	}
48
49	JetMenuPlugin.prototype = {
50		constructor: JetMenuPlugin,
51
52		self: this,
53
54		createMenuInstance: function() {
55			var self = this,
56				mainMenuWidth,
57				totalVisibleItemsWidth = 0;
58
59			this.subMenuRebuild();
60			this.subMegaMenuRebuild();
61
62			// Add available items list
63			if ( ! tools.isEmpty( this.settings.moreMenuContent ) && self.settings.enabled ) {
64				self.$instance.append( '<li class="jet-menu-item jet-menu-item-has-children jet-simple-menu-item jet-responsive-menu-available-items" hidden><a href="#" class="top-level-link"><div class="jet-menu-item-wrapper">' + this.settings.moreMenuContent + '</div></a><ul class="jet-sub-menu"></ul></li>' );
65				self.$moreItemsInstance = $( '> .jet-responsive-menu-available-items', this.$instance );
66				self.$moreItemsInstance.attr( { 'hidden': 'hidden' } );
67			}
68
69			this.rebuildItems();
70
71			this.$instance.trigger( 'rebuildItems' ); // subMenu position rebuild
72
73			this.subMenuHandler();
74
75			this.watch();
76		},
77
78		/**
79		 * SubMenu items Handler.
80		 *
81		 * @return {void}
82		 */
83		subMenuHandler: function() {
84			var self = this,
85				transitionend = 'transitionend oTransitionEnd webkitTransitionEnd',
86				prevClickedItem = null,
87				menuItem,
88				menuItemParents,
89				timer;
90
91			switch ( this.settings.openSubType ) {
92				case 'hover':
93					this.$instance.on( 'mouseenter', '.jet-menu-item > a', { instance: this }, mouseEnterHandler );
94					this.$instance.on( 'mouseleave', '.jet-menu-item > a', mouseLeaveHandler );
95				break;
96
97				case 'click':
98					this.$instance.on( 'click', '.jet-menu-item > a', { instance: this }, clickHandler );
99				break;
100			}
101
102			this.$instance.on( 'mouseenter', '.jet-sub-menu, .jet-sub-mega-menu', mouseEnterSubMenuHandler );
103			this.$instance.on( 'mouseenter', mouseEnterInstanceHandler );
104			this.$instance.on( 'mouseleave', mouseLeaveInstanceHandler );
105
106			function clickHandler( event ) {
107				var $this,
108					$siblingsItems,
109					$link,
110					$currentTarget,
111					subMenu,
112					templateId,
113					instance = event.data.instance;
114
115				event.preventDefault();
116				event.stopPropagation();
117
118				$currentTarget = $( event.currentTarget );
119				$this          = $currentTarget.closest('.jet-menu-item');
120				$siblingsItems = $this.siblings( '.jet-menu-item.jet-menu-item-has-children' );
121				$link          = $( '> a', $this );
122				subMenu        = $( '.jet-sub-menu:first, .jet-sub-mega-menu', $this );
123				templateId     = subMenu.data( 'template-id' ) || false;
124
125				if ( $siblingsItems[0] ) {
126					$siblingsItems.removeClass( 'jet-menu-hover' );
127					$( 'jet-menu-item-has-children', $siblingsItems ).removeClass( 'jet-menu-hover' );
128				}
129
130				if ( ! $( '.jet-sub-menu, .jet-sub-mega-menu', $this )[0] || $this.hasClass('jet-menu-hover') ) {
131					let itemLink = $link.attr( 'href' ) || '#',
132						target   = $link.attr( 'target' ) || '_self';
133
134					window.open( itemLink, target );
135
136					return false;
137				}
138
139				if ( subMenu[0] ) {
140					$this.addClass( 'jet-menu-hover' );
141
142					if ( templateId ) {
143						instance.maybeTemplateLoad( templateId, subMenu );
144					}
145				}
146			}
147
148			function mouseEnterHandler( event ) {
149				var subMenu,
150					templateId,
151					instance;
152
153				menuItem   = $( event.target ).parents( '.jet-menu-item' );
154				subMenu    = menuItem.children( '.jet-sub-menu, .jet-sub-mega-menu' ).first();
155				templateId = subMenu.data( 'template-id' ) || false;
156				instance   = event.data.instance;
157
158				$( '.jet-menu-hover', this.$instance ).removeClass( 'jet-menu-hover' );
159
160				if ( subMenu[0] ) {
161					menuItem.addClass( 'jet-menu-hover' );
162
163					if ( templateId ) {
164						instance.maybeTemplateLoad( templateId, subMenu );
165					}
166				}
167			}
168
169			function mouseLeaveHandler( event ) {
170				// Item Mouse Leave Event
171			}
172
173			function mouseEnterSubMenuHandler( event ) {
174				clearTimeout( timer );
175			}
176
177			function mouseEnterInstanceHandler( event ) {
178				clearTimeout( timer );
179			}
180
181			function mouseLeaveInstanceHandler( event ) {
182				timer = setTimeout( function() {
183					$( '.jet-menu-hover', this.$instance ).removeClass( 'jet-menu-hover' );
184				}, self.settings.mouseLeaveDelay );
185			}
186
187			var windowWidth = $( window ).width();
188
189			self.$window.on( 'orientationchange resize', function( event ) {
190
191				// Do not trigger a change if the viewport hasn't actually changed.  Scrolling on iOS will trigger a resize.
192				if ( $( window ).width() === windowWidth ) {
193					return;
194				}
195
196				windowWidth = $( window ).width();
197
198				self.$instance.find( '.jet-menu-item' ).removeClass( 'jet-menu-hover' );
199			} );
200
201			self.$document.on( 'touchend', function( event ) {
202
203				if ( $( event.target ).closest( '.jet-menu-item' ).length ) {
204					return;
205				}
206
207				self.$instance.find( '.jet-menu-item' ).removeClass( 'jet-menu-hover' );
208			} );
209
210		},
211
212		maybeTemplateLoad: function( templateId, $templateContainer ) {
213
214			if ( ! this.settings.ajaxLoad ) {
215				return;
216			}
217
218			if ( $templateContainer.hasClass( 'template-loaded' ) ) {
219				return;
220			}
221
222			$.ajax( {
223				type: 'GET',
224				url: window.jetMenuPublicSettings.getElementorTemplateApiUrl,
225				dataType: 'json',
226				data: {
227					'id': templateId,
228					'dev': window.jetMenuPublicSettings.devMode
229				},
230				beforeSend: function( jqXHR, ajaxSettings ) {
231					jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
232				},
233				success: function( responce, textStatus, jqXHR ) {
234					var templateContent   = responce['content'],
235						templateScripts   = responce['scripts'],
236						templateStyles    = responce['styles'];
237
238					for ( var scriptHandler in templateScripts ) {
239						jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) );
240					}
241
242					for ( var styleHandler in templateStyles ) {
243						jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) );
244					}
245
246					$templateContainer.addClass( 'template-loaded' );
247
248					jetMenu.elementorContentRender( $templateContainer, templateContent );
249				}
250			} );
251		},
252
253		/**
254		 * Responsive menu watcher function.
255		 *
256		 * @param  {number} Watcher debounce delay.
257		 * @return {void}
258		 */
259		watch: function( delay ) {
260			var delay = delay || 10;
261
262			$( window ).on( 'resize.jetResponsiveMenu orientationchange.jetResponsiveMenu load.jetResponsiveMenu', this.debounce( delay, this.watcher.bind( this ) ) );
263			this.$instance.trigger( 'containerResize' );
264		},
265
266		/**
267		 * Responsive menu watcher callback.
268		 *
269		 * @param  {Object} Resize or Orientationchange event.
270		 * @return {void}
271		 */
272		watcher: function( event ) {
273			this.rebuildItems();
274			//this.$instance.trigger( 'rebuildItems' ); // subMenu position rebuild
275			this.$instance.trigger( 'containerResize' );
276		},
277
278		/**
279		 * Responsive Menu rebuilding function.
280		 *
281		 * @return {void}
282		 */
283		rebuildItems: function() {
284
285			if ( ! this.settings.enabled ) {
286				return false;
287			}
288
289			var self                       = this,
290				mainMenuWidth              = this.$instance.width(),
291				correctedMenuWidth         = this.$instance.width() - self.$moreItemsInstance.outerWidth( true ),
292				iterationVisibleItemsWidth = 0,
293				iterationHiddenItemsWidth  = this.getVisibleItemsWidth(),
294				visibleItemsArray          = [],
295				hiddenItemsArray           = [];
296
297			self.$menuItems.each( function() {
298				var $this = $( this );
299
300				iterationVisibleItemsWidth += $this.outerWidth( true );
301
302				if ( iterationVisibleItemsWidth > correctedMenuWidth && ! tools.inArray( this, hiddenItemsArray ) ) {
303					hiddenItemsArray.push( this );
304				} else {
305					visibleItemsArray.push( this );
306				}
307
308			} );
309
310			hiddenItemsArray.forEach( function( item ) {
311				var $item = $( item );
312
313				$item.attr( { 'hidden': 'hidden' } );
314			} );
315
316			visibleItemsArray.forEach( function( item, index ) {
317				var $item = $( item );
318
319				$item.removeAttr( 'hidden' );
320			} );
321
322			$( '> .jet-sub-menu', self.$moreItemsInstance ).empty();
323
324			hiddenItemsArray.forEach( function( item ) {
325				var $clone = $( item ).clone();
326
327				// Remove sub-mega-menu content
328				$( '.jet-sub-mega-menu', $clone ).remove();
329
330				$clone.addClass( 'jet-sub-menu-item' );
331
332				$clone.removeAttr( 'hidden' );
333
334				$( '> .top-level-link', $clone ).toggleClass( 'top-level-link sub-level-link' );
335
336				$( '> .jet-sub-menu', self.$moreItemsInstance ).append( $clone );
337			} );
338
339			if ( 0 == hiddenItemsArray.length ) {
340				self.$moreItemsInstance.attr( { 'hidden': 'hidden' } );
341				self.$moreItemsInstance.addClass( 'jet-empty' );
342			} else {
343				self.$moreItemsInstance.removeAttr( 'hidden' );
344				self.$moreItemsInstance.removeClass( 'jet-empty' );
345			}
346
347			self.hiddenItemsArray = hiddenItemsArray;
348		},
349
350		/*rebuildItems() {
351
352			if ( ! this.settings.enabled ) {
353				return false;
354			}
355
356			var self                       = this,
357				mainMenuWidth              = this.$instance.width(),
358				iterationVisibleItemsWidth = 0,
359				visibleItemsArray          = [],
360				hiddenItemsArray           = [];
361
362			$( '> .jet-sub-menu', self.$moreItemsInstance ).empty();
363
364			for ( let menuItem of self.menuItemsData ) {
365				let element = menuItem.element;
366
367				iterationVisibleItemsWidth += menuItem.outerWidth;
368
369				if ( iterationVisibleItemsWidth > mainMenuWidth ) {
370					element.hidden = true;
371					hiddenItemsArray.push( element );
372				} else {
373					element.hidden = false;
374					visibleItemsArray.push( element );
375				}
376			}
377
378			for ( let hiddenMenuItem of hiddenItemsArray ) {
379				let $hiddenClone = $( hiddenMenuItem ).clone();
380
381				$hiddenClone[0].hidden = false;
382
383				// Remove sub-mega-menu content
384				$( '.jet-sub-mega-menu', $hiddenClone ).remove();
385				$( '> .top-level-link', $hiddenClone ).toggleClass( 'top-level-link sub-level-link' );
386				$hiddenClone.addClass( 'jet-sub-menu-item' );
387				$( '> .jet-sub-menu', self.$moreItemsInstance ).append( $hiddenClone );
388			}
389
390			this.$moreItemsInstance[0].hidden = hiddenItemsArray.length ? false : true;
391
392			this.$instance.trigger( 'rebuildItems' );
393		},*/
394
395		/**
396		 * Sub Menu rebuilding function.
397		 *
398		 * @return {void}
399		 */
400		subMenuRebuild: function() {
401			var self = this,
402				initSubMenuPosition = false;
403
404			this.$instance.on( 'rebuildItems', function() {
405				var $subMenuList = $( '.jet-sub-menu', self.$instance ),
406					maxWidth     = self.$window.outerWidth( true ),
407					isRTL        = $( 'body' ).hasClass( 'rtl' );
408
409				if ( ! $subMenuList[0] ) {
410					return;
411				}
412
413				if ( initSubMenuPosition ) {
414					$subMenuList.removeClass( 'inverse-side' );
415					initSubMenuPosition = false;
416				}
417
418				$subMenuList.each( function() {
419					var $this = $( this ),
420						subMenuOffset = $this.offset().left,
421						subMenuPos    = subMenuOffset + $this.outerWidth( true );
422
423					if ( ! isRTL ) {
424						if ( subMenuPos >= maxWidth ) {
425							$this.addClass( 'inverse-side' );
426							$this.find( '.jet-sub-menu' ).addClass( 'inverse-side' );
427
428							initSubMenuPosition = true;
429						} else if ( subMenuOffset < 0 ) {
430							$this.removeClass( 'inverse-side' );
431							$this.find( '.jet-sub-menu' ).removeClass( 'inverse-side' );
432						}
433					} else {
434						if ( subMenuOffset < 0 ) {
435							$this.addClass( 'inverse-side' );
436							$this.find( '.jet-sub-menu' ).addClass( 'inverse-side' );
437
438							initSubMenuPosition = true;
439						} else if ( subMenuPos >= maxWidth ) {
440							$this.removeClass( 'inverse-side' );
441							$this.find( '.jet-sub-menu' ).removeClass( 'inverse-side' );
442						}
443					}
444
445				} );
446			} );
447		},
448
449		/**
450		 * Sub Mega Menu rebuilding function.
451		 *
452		 * @return {void}
453		 */
454		subMegaMenuRebuild: function() {
455			var self = this;
456
457			this.$instance.on( 'containerResize', function() {
458				var $megaMenuList = $( '.jet-sub-mega-menu', self.$instance ),
459					maxWidth      = $( 'body' ).outerWidth( true );
460
461				switch( self.settings.megaWidthType ) {
462					case 'items':
463						var visibleItemsWidth = self.getVisibleItemsWidth(),
464							firstOffset = $( '> .jet-menu-item:first', self.$instance ).position().left;
465
466						$megaMenuList.css( {
467							'width': visibleItemsWidth + 'px',
468							'left': firstOffset
469						} );
470					break;
471					case 'selector':
472						var customSelector       = $( self.settings.megaWidthSelector ),
473							instanceOffset       = null,
474							customSelectorOffset = null;
475
476						if ( customSelector[0] ) {
477							instanceOffset       = self.$instance.offset().left;
478							customSelectorOffset = customSelector.offset().left;
479
480							$megaMenuList.css( {
481								'width': customSelector.outerWidth(),
482								'left': (customSelectorOffset - instanceOffset ) + 'px'
483							} );
484						}
485
486					break;
487				}
488
489				if ( $megaMenuList[0] ) {
490					$megaMenuList.css( {
491						'maxWidth': ''
492					} );
493
494					$megaMenuList.each( function() {
495						var $this = $( this ),
496							megaMenuOffsetLeft = $this.offset().left,
497							megaMenuOffsetRight = megaMenuOffsetLeft + $this.outerWidth( true );
498
499						if ( megaMenuOffsetRight >= maxWidth ) {
500							$this.css( {
501								'maxWidth': maxWidth - megaMenuOffsetLeft
502							} );
503						}
504					} );
505				}
506			} );
507		},
508
509		/**
510		 * Get visible items total width
511		 *
512		 * @return {int}
513		 */
514		getVisibleItemsWidth: function() {
515			var totalVisibleItemsWidth = 0;
516
517			this.$menuItems.each( function() {
518				var $this = $( this );
519
520				if ( ! $this.hasAttr( 'hidden' ) ) {
521					totalVisibleItemsWidth += $this.outerWidth( true );
522				}
523			} );
524
525			return totalVisibleItemsWidth;
526		},
527
528		/**
529		 * Mobile and tablet check funcion.
530		 *
531		 * @return {boolean} Mobile Status
532		 */
533		mobileAndTabletcheck: function() {
534			var check = false;
535
536			(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 )|sy(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);
537
538			return check;
539		},
540
541		/**
542		 * Debounce the function call
543		 *
544		 * @param  {number}   threshold The delay.
545		 * @param  {Function} callback  The function.
546		 */
547		debounce: function ( threshold, callback ) {
548			var timeout;
549
550			return function debounced( $event ) {
551				function delayed() {
552					callback.call( this, $event );
553					timeout = null;
554				}
555
556				if ( timeout ) {
557					clearTimeout( timeout );
558				}
559
560				timeout = setTimeout( delayed, threshold );
561			};
562		}
563	}
564
565	/*
566	 * Js tools
567	 */
568	var tools = {
569		isEmpty: function( value ) {
570			return ( ( false === value ) || ( '' === value ) || ( null === value ) || ( undefined === value ));
571		},
572
573		isEmptyObject: function( value ) {
574			return ( true === this.isEmpty( value ) ) || ( 0 === value.length );
575		},
576
577		isString: function(value) {
578			return ( ( 'string' === typeof value ) || ( value instanceof String ) );
579		},
580
581		isArray: function( value ) {
582			return $.isArray( value );
583		},
584
585		inArray: function( value, array ) {
586			return ( $.inArray( value, array ) !== -1);
587		}
588	};
589
590	/*
591	 * Jq tools
592	 */
593	$.fn.hasAttr = function( name ) {
594		return this.attr( name ) !== undefined;
595	};
596
597	// jQuery plugin
598	$.fn.JetMenuPlugin = function( options ) {
599		return this.each( function() {
600			var $this         = $( this ),
601				pluginOptions = ( 'object' === typeof options ) ? options : {};
602
603			if ( ! $this.data( 'JetMenuPlugin' ) ) {
604
605				// create plugin instance (only if not exists) and expose the entire instance API
606				$this.data( 'JetMenuPlugin', new JetMenuPlugin( this, pluginOptions ) );
607			}
608		} );
609	};
610
611}( jQuery ) );
612
613( function( $ ) {
614	'use strict';
615
616	/**
617	 * JetMegaMenuClass
618	 */
619	class JetMegaMenuClass {
620
621		/**
622		 * [constructor description]
623		 * @return {[type]} [description]
624		 */
625		constructor( element, options ) {
626			this.defaultSettings = {
627				enabled: true,
628				threshold: 768, // Minimal menu width, when this plugin activates
629				mouseLeaveDelay: 500,
630				openSubType: 'hover', // hover, click
631				mainMenuSelector: '.menu',
632				menuItemSelector: '.menu-item',
633				moreMenuContent:  '&middot;&middot;&middot;',
634				templates: {
635					hasChildItemMarker: '<span class="has-child-marker"></span>'
636				},
637				labels: {
638					back: 'Back'
639				}
640			}
641
642			this.settings = $.extend( this.defaultSettings, options );
643
644			this.$window = $( window );
645
646			this.$document = $( document );
647
648			this.$element = $( element );
649
650			this.$document.on( 'mpi-theme-js/header/switch-to-mobile-layout/before', function() {
651				this.resetItems();
652			}.bind( this ) );
653
654			this.$document.on( 'mpi-theme-js/header/switch-to-desktop-layout/after', function() {
655				this.rebuildItems();
656			}.bind( this ) );
657
658			this.createInstance();
659		}
660
661		createInstance() {
662
663			this.$instance = $( this.settings.mainMenuSelector, this.$element );
664
665			this.$menuItems = $( '>' + this.settings.menuItemSelector, this.$instance );
666
667			this.menuItemsData = this.$menuItems.toArray().map( function( item ) {
668				return {
669					element: item,
670					outerWidth: $( item ).outerWidth( true ),
671				}
672			} );
673
674			// Add available items list
675			if ( '' !== this.settings.moreMenuContent && this.settings.enabled && ! $( '.menu-item--more', this.$instance )[0] ) {
676				this.$instance.append( '<li class="menu-item menu-item-has-children menu-item--more" hidden><a href="#">' + this.settings.moreMenuContent + '</a><ul class="sub-menu"></ul></li>' );
677				this.$moreItemsInstance = $( '> .menu-item--more', this.$instance );
678			}
679
680			this.watchTick();
681
682			this.rebuildWatcher();
683
684			this.$instance.addClass( 'menu--roll-up-inited' );
685
686			this.$document.trigger( 'MpiMenuCreated' );
687		}
688
689		/**
690		 * Responsive menu watcher function.
691		 *
692		 * @param  {number} Watcher debounce delay.
693		 * @return {void}
694		 */
695		rebuildWatcher( delay ) {
696			var delay = delay || 10;
697
698			$( window ).off( 'resize.MpiMenu' ).on( 'resize.MpiMenu orientationchange.MpiMenu', this.debounce( delay, this.watchTick.bind( this ) ) );
699
700			this.$instance.trigger( 'containerResize' );
701		}
702
703		/**
704		 * Responsive menu watcher callback.
705		 *
706		 * @param  {Object} Resize or Orientationchange event.
707		 * @return {void}
708		 */
709		watchTick( event ) {
710
711			if ( ! this.isThreshold() ) {
712				this.rebuildItems();
713			}
714		}
715
716		/**
717		 * Responsive Menu rebuilding function.
718		 *
719		 * @return {void}
720		 */
721		rebuildItems() {
722
723			if ( ! this.settings.enabled ) {
724				return false;
725			}
726
727			var self                       = this,
728				mainMenuWidth              = this.$instance.width(),
729				iterationVisibleItemsWidth = 0,
730				visibleItemsArray          = [],
731				hiddenItemsArray           = [];
732
733			$( '> .sub-menu', self.$moreItemsInstance ).empty();
734
735			for ( let menuItem of self.menuItemsData ) {
736				let element = menuItem.element;
737
738				iterationVisibleItemsWidth += menuItem.outerWidth;
739
740				if ( iterationVisibleItemsWidth > mainMenuWidth ) {
741					element.hidden = true;
742					hiddenItemsArray.push( element );
743				} else {
744					element.hidden = false;
745					visibleItemsArray.push( element );
746				}
747			}
748
749			for ( let hiddenMenuItem of hiddenItemsArray ) {
750				let $hiddenClone = $( hiddenMenuItem ).clone();
751
752				$hiddenClone[0].hidden = false;
753
754				$( '> .sub-menu', self.$moreItemsInstance ).append( $hiddenClone );
755			}
756
757			this.$moreItemsInstance[0].hidden = hiddenItemsArray.length ? false : true;
758
759			this.$instance.trigger( 'rebuildItems' );
760		}
761
762		/**
763		 * Reset Items
764		 * @return {[type]} [description]
765		 */
766		resetItems() {
767			$( '> .sub-menu', self.$moreItemsInstance ).empty();
768			this.$moreItemsInstance[0].hidden = true;
769
770			for ( let menuItem of this.menuItemsData ) {
771				let element = menuItem.element;
772
773				element.hidden = false;
774			}
775		}
776
777		/**
778		 * Get mobile status.
779		 *
780		 * @return {boolean} Mobile Status
781		 */
782		isThreshold() {
783			return ( this.$window.width() < this.settings.threshold ) ? true : false;
784		}
785
786		/**
787		 * Mobile and tablet check funcion.
788		 *
789		 * @return {boolean} Mobile Status
790		 */
791		mobileAndTabletcheck() {
792			var check = false;
793
794			(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 )|
794sy(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);
795
796			return check;
797		}
798
799		/**
800		 * Debounce the function call
801		 *
802		 * @param  {number}   threshold The delay.
803		 * @param  {Function} callback  The function.
804		 */
805		debounce( threshold, callback ) {
806			var timeout;
807
808			return function debounced( $event ) {
809				function delayed() {
810					callback.call( this, $event );
811					timeout = null;
812				}
813
814				if ( timeout ) {
815					clearTimeout( timeout );
816				}
817
818				timeout = setTimeout( delayed, threshold );
819			};
820		}
821	}
822
823	// jQuery plugin
824	$.fn.JetMegaMenu = function( options ) {
825		return this.each( function() {
826			var $this         = $( this ),
827				pluginOptions = ( 'object' === typeof options ) ? options : {};
828
829			if ( ! $this.data( 'JetMegaMenu' ) ) {
830				// create plugin instance (only if not exists) and expose the entire instance API
831				$this.data( 'JetMegaMenu', new JetMegaMenuClass( this, pluginOptions ) );
832			}
833		} );
834	};
835} ( jQuery ));
836
837( function( $ ) {
838	'use strict';
839
840	window.jetMenu = {
841
842		addedScripts: {},
843
844		addedStyles: {},
845
846		addedAssetsPromises: [],
847
848		initedMobileMenuInstance: [],
849
850		eventBus: new Vue(),
851
852		$body: $( 'body' ),
853
854		init: function() {
855			this.initDesktopMenu();
856			this.mobileVueComponents();
857			this.initMobileMenu();
858		},
859
860		initDesktopMenu: function() {
861			var rollUp                   = false,
862				jetMenuMouseleaveDelay   = 500,
863				jetMenuMegaWidthType     = 'container',
864				jetMenuMegaWidthSelector = '',
865				jetMenuMegaOpenSubType   = 'hover',
866				jetMenuMegaAjax          = false;
867
868			if ( window.jetMenuPublicSettings && window.jetMenuPublicSettings.menuSettings ) {
869				rollUp                   = ( 'true' === jetMenuPublicSettings.menuSettings.jetMenuRollUp ) ? true : false;
870				jetMenuMouseleaveDelay   = jetMenuPublicSettings.menuSettings.jetMenuMouseleaveDelay || 500;
871				jetMenuMegaWidthType     = jetMenuPublicSettings.menuSettings.jetMenuMegaWidthType || 'container';
872				jetMenuMegaWidthSelector = jetMenuPublicSettings.menuSettings.jetMenuMegaWidthSelector || '';
873				jetMenuMegaOpenSubType   = jetMenuPublicSettings.menuSettings.jetMenuMegaOpenSubType || 'hover';
874				jetMenuMegaAjax          = ( 'true' === jetMenuPublicSettings.menuSettings.jetMenuMegaAjax )  ? true : false;
875			}
876
877			$( '.jet-menu-container' ).JetMenuPlugin( {
878				enabled: rollUp,
879				mouseLeaveDelay: +jetMenuMouseleaveDelay,
880				megaWidthType: jetMenuMegaWidthType,
881				megaWidthSelector: jetMenuMegaWidthSelector,
882				openSubType: jetMenuMegaOpenSubType,
883				ajaxLoad: jetMenuMegaAjax,
884			} );
885
886		},
887
888		initMobileMenu: function() {
889
890			let mobileMenuList = $( '.jet-mobile-menu--location-wp-nav' );
891
892			if ( ! mobileMenuList[0] ) {
893				return false;
894			}
895
896			if ( 'true' === window.jetMenuPublicSettings.devMode ) {
897				Vue.config.devtools = true;
898			}
899
900			mobileMenuList.each( function() {
901				let $this          = $( this ),
902					menuInstanceId = $this.attr( 'id' ),
903					menuId         = $this.data( 'menu-id' ) || false,
904					menuOptions    = $this.data( 'menu-options' ) || {};
905
906				jetMenu.createMobileMenuInstance( menuInstanceId, menuId, menuOptions );
907			} );
908		},
909
910		createMobileMenuInstance: function( menuInstanceId, menuId, menuOptions ) {
911
912			if ( jetMenu.initedMobileMenuInstance.includes( menuInstanceId ) ) {
913				return;
914			}
915
916			jetMenu.initedMobileMenuInstance.push( menuInstanceId );
917
918			let mobileRenderInstance = new Vue( {
919				el: '#' + menuInstanceId,
920				data: {
921					uniqId: menuInstanceId,
922					menuOptions: menuOptions,
923					refsHtml: {},
924				},
925				mounted: function() {
926					let refsHtml = {};
927
928					for ( var ref in this.$refs ) {
929						Object.assign( refsHtml, { [ ref ]: this.$refs[ ref ].innerHTML } );
930					}
931
932					this.refsHtml = refsHtml;
933				}
934			} );
935		},
936
937		mobileVueComponents: function() {
938
939			Vue.component( 'mobile-menu-item', {
940				template: '#mobile-menu-item-template',
941
942				props: {
943					itemDataObject: Object,
944					depth: Number
945				},
946
947				data: function() {
948					return ( {
949						ajaxRequest: null,
950						templateLoadStatus: false,
951						subDropdownVisible: false
952					} )
953				},
954
955				computed: {
956
957					itemClasses: function() {
958						let itemClasses = [
959							'jet-mobile-menu__item',
960							'jet-menu-item-' + this.itemDataObject.itemId,
961							'jet-mobile-menu__item--sub-trigger-' + ( this.$root.menuOptions.subTrigger || 'item' ),
962						];
963
964						let customClasses = this.itemDataObject.classes;
965
966						if ( 0 !== customClasses.length ) {
967							itemClasses = itemClasses.concat( customClasses );
968						}
969
970						if ( window.location.href === this.itemDataObject.url ) {
971							itemClasses.push( 'jet-mobile-menu__item--active' );
972						}
973
974						return itemClasses;
975					},
976
977					itemLinkClasses: function() {
978						let classes = [
979							'mobile-link',
980							0 === this.depth ? 'mobile-top-level-link' : 'mobile-sub-level-link',
981						];
982
983						return classes;
984					},
985
986					isСhildrenDefine: function() {
987						return this.itemDataObject.children ? true : false;
988					},
989
990					isTemplateDefine: function() {
991						return false !== this.itemDataObject.megaTemplateId ? true : false;
992					},
993
994					isSub: function() {
995						return this.isСhildrenDefine || this.isTemplateDefine ? true : false;
996					},
997
998					isTopLevel: function() {
999						return 0 === this.depth ? true : false;
1000					},
1001
1002					isDropdownLayout: function() {
1003						return this.isSub && ! this.isTemplateDefine && 'dropdown' === this.$root.menuOptions.subOpenLayout;
1004					},
1005
1006					depthClass: function() {
1007						return 0 === this.depth ? 'mobile-top-level-link' : 'mobile-sub-level-link';
1008					},
1009
1010					dropdownIconHtml: function() {
1011						let dropdownIcon = this.$root.refsHtml.dropdownIcon ? this.$root.refsHtml.dropdownIcon : '<span class="dashicons dashicons-arrow-right"></span>',
1012						    dropdownOpenedIcon = this.$root.refsHtml.dropdownOpenedIcon ? this.$root.refsHtml.dropdownOpenedIcon : '<span class="dashicons dashicons-arrow-down"></span>';
1013
1014						if ( this.subDropdownVisible ) {
1015							dropdownIcon = dropdownOpenedIcon;
1016						}
1017
1018						return dropdownIcon;
1019					},
1020
1021					itemIconHtml: function() {
1022						return this.itemDataObject.itemIcon;
1023					},
1024
1025					isIconVisible: function() {
1026						let iconVisible = this.$root.menuOptions.itemIconVisible;
1027
1028						return ! iconVisible || '' === this.itemDataObject.itemIcon || ! this.itemDataObject.itemIcon ? false : true;
1029					},
1030
1031					isBadgeVisible: function() {
1032						let badgeVisible = this.$root.menuOptions.itemBadgeVisible;
1033
1034						return false === badgeVisible || '' === this.itemDataObject.badgeText || ! this.itemDataObject.badgeText ? false : true;
1035					},
1036
1037					isLabelVisible: function() {
1038						let labelVisible = ! this.itemDataObject.hideItemText;
1039
1040						return false === labelVisible || '' === this.itemDataObject.name || ! this.itemDataObject.name ? false : true;
1041					},
1042
1043					isDescVisible: function() {
1044						let descVisible = this.$root.menuOptions.itemDescVisible;
1045
1046						return false === descVisible || '' === this.itemDataObject.description || ! this.itemDataObject.description ? false : true;
1047					},
1048
1049					loaderColor: function() {
1050						return this.$root.menuOptions.loaderColor || '#3a3a3a';
1051					},
1052				},
1053
1054				methods: {
1055					itemSubHandler: function( event ) {
1056						let target     = event.target,
1057						    mobileLink = $( target ).closest( '.mobile-link' );
1058
1059						if ( 'item' !== this.$root.menuOptions.subTrigger ) {
1060							return;
1061						}
1062
1063						if ( this.isSub && mobileLink ) {
1064							event.preventDefault();
1065						}
1066
1067						if ( ! this.isSub && mobileLink && this.$root.menuOptions.closeAfterNavigate ) {
1068							jetMenu.eventBus.$emit( 'closeMenu', {
1069								menuUniqId: this.$root.menuOptions.menuUniqId,
1070							} );
1071						}
1072
1073						this.switchToSub( event );
1074					},
1075
1076					markerSubHandler: function( event ) {
1077
1078						if ( 'submarker' !== this.$root.menuOptions.subTrigger ) {
1079							return;
1080						}
1081
1082						this.switchToSub( event );
1083					},
1084
1085					switchToSub: function( event ) {
1086
1087						if ( ! this.isSub ) {
1088							return;
1089						}
1090
1091						if ( ! this.isTemplateDefine ) {
1092
1093							if ( this.isDropdownLayout ) {
1094								this.subDropdownVisible = !this.subDropdownVisible;
1095
1096								return;
1097							}
1098
1099							jetMenu.eventBus.$emit( 'itemsSubSwitch', {
1100								menuUniqId: this.$root.menuOptions.menuUniqId,
1101								id: this.itemDataObject.id,
1102								name: this.itemDataObject.name,
1103								children: this.itemDataObject.children || false
1104							} );
1105
1106						} else {
1107
1108							if ( ! this.itemDataObject.megaContent ) {
1109								this.getElementorTemplate();
1110							} else {
1111
1112								jetMenu.eventBus.$emit( 'showTemplateContent', {
1113									menuUniqId: this.$root.menuOptions.menuUniqId,
1114									id: this.itemDataObject.id,
1115									name: this.itemDataObject.name,
1116									megaContent: this.itemDataObject.megaContent
1117								} );
1118							}
1119						}
1120					},
1121
1122					getElementorTemplate: function() {
1123						var vueInstance = this;
1124
1125						vueInstance.ajaxRequest = $.ajax( {
1126							type: 'GET',
1127							url: window.jetMenuPublicSettings.getElementorTemplateApiUrl,
1128							dataType: 'json',
1129							data: {
1130								'id': vueInstance.itemDataObject.megaTemplateId,
1131								'dev': window.jetMenuPublicSettings.devMode
1132							},
1133							beforeSend: function( jqXHR, ajaxSettings ) {
1134
1135								if ( null !== vueInstance.ajaxRequest ) {
1136									vueInstance.ajaxRequest.abort();
1137								}
1138
1139								vueInstance.templateLoadStatus = true;
1140
1141								jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
1142							},
1143							success: function( responce, textStatus, jqXHR ) {
1144								var templateContent   = responce['content'],
1145								    templateScripts   = responce['scripts'],
1146								    templateStyles    = responce['styles'];
1147
1148								for ( var scriptHandler in templateScripts ) {
1149									jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) );
1150								}
1151
1152								for ( var styleHandler in templateStyles ) {
1153									jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) );
1154								}
1155
1156								vueInstance.templateLoadStatus = false;
1157
1158								vueInstance.itemDataObject.megaContent = templateContent;
1159
1160								jetMenu.eventBus.$emit( 'showTemplateContent', {
1161									menuUniqId: vueInstance.$root.menuOptions.menuUniqId,
1162									id: vueInstance.itemDataObject.id,
1163									name: vueInstance.itemDataObject.name,
1164									megaContent: vueInstance.itemDataObject.megaContent
1165								} );
1166							}
1167						} );
1168					}
1169				}
1170
1171			});
1172
1173			Vue.component( 'mobile-menu-list', {
1174				template: '#mobile-menu-list-template',
1175				props: {
1176					depth: Number,
1177					childrenObject: Object
1178				}
1179			} );
1180
1181			Vue.component( 'mobile-menu', {
1182				template: '#mobile-menu-template',
1183
1184				data: function() {
1185					return ( {
1186						menuOpen: false,
1187						children: false,
1188						itemsRawData: {},
1189						trail:[],
1190						breadcrumbsData: [],
1191						animation: 'items-next-animation',
1192						ajaxRequest: null,
1193						templateVisible: false,
1194						instanceLoadStatus: false,
1195						itemTemplateContent: false,
1196						headerTemplate: this.$root.menuOptions['headerTemplate'] || 0,
1197						headerContent: false,
1198						headerTemplateVisible: false,
1199						beforeTemplate: this.$root.menuOptions['beforeTemplate'] || 0,
1200						beforeContent: false,
1201						afterTemplate: this.$root.menuOptions['afterTemplate'] || 0,
1202						afterContent: false,
1203						ajaxPromises: [],
1204					} )
1205				},
1206
1207				mounted: function() {
1208					let vueInstance = this;
1209
1210					if ( this.menuOpen ) {
1211						jetMenu.$body.addClass( 'jet-mobile-menu-visible' );
1212
1213						if ( 'slide-out' === this.$root.menuOptions.menuLayout ) {
1214							jetMenu.$body.addClass( 'jet-menu-body-blocker' );
1215						}
1216					}
1217
1218					let menuInstanceRenderData = false,
1219						renderDataElement = document.getElementById( 'jetMenuMobileWidgetRenderData' + this.$root.menuOptions.menuUniqId );
1220
1221					if ( renderDataElement ) {
1222						eval( renderDataElement.innerHTML );
1223						menuInstanceRenderData = window[ 'jetMenuMobileWidgetRenderData' + this.$root.menuOptions.menuUniqId ] || false;
1224					}
1225
1226					if ( menuInstanceRenderData ) {
1227						this.itemsRawData = menuInstanceRenderData['items'];
1228
1229						const headerTemplateData = menuInstanceRenderData.headerTemplateData || false,
1230							beforeTemplateData = menuInstanceRenderData.beforeTemplateData || false,
1231							afterTemplateData = menuInstanceRenderData.afterTemplateData || false;
1232
1233						if ( headerTemplateData ) {
1234							this.headerContent = headerTemplateData.content;
1235						}
1236
1237						if ( beforeTemplateData ) {
1238							this.beforeContent = beforeTemplateData.content;
1239						}
1240
1241						if ( afterTemplateData ) {
1242							this.afterContent = afterTemplateData.content;
1243						}
1244					}
1245
1246					/*this.ajaxPromises.push(
1247						new Promise( function( resolve, reject ) {
1248							$.ajax( {
1249								type: 'GET',
1250								url: window.jetMenuPublicSettings.menuItemsApiUrl,
1251								dataType: 'json',
1252								data: {
1253									'menu_id': vueInstance.menuId,
1254									'dev': window.jetMenuPublicSettings.devMode,
1255									'lang': window.jetMenuPublicSettings.wpmlLanguageCode || false
1256								},
1257								beforeSend: function( jqXHR, ajaxSettings ) {
1258									jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
1259								},
1260								success: function( responce, textStatus, jqXHR ) {
1261									let responceData = responce.data.items;
1262
1263									vueInstance.itemsRawData = responceData;
1264
1265									resolve();
1266								}
1267							} );
1268						} )
1269					);*/
1270
1271					/*if ( 0 !== +this.headerTemplate ) {
1272						this.ajaxPromises.push(
1273							new Promise( function( resolve, reject ) {
1274								$.ajax( {
1275									type: 'GET',
1276									url: window.jetMenuPublicSettings.getElementorTemplateApiUrl,
1277									dataType: 'json',
1278									data: {
1279										'id': vueInstance.headerTemplate,
1280										'dev': window.jetMenuPublicSettings.devMode
1281									},
1282									beforeSend: function( jqXHR, ajaxSettings ) {
1283										jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
1284									},
1285									success: function( responce, textStatus, jqXHR ) {
1286										let templateContent = responce['content'],
1287										    templateScripts = responce['scripts'],
1288										    templateStyles  = responce['styles'];
1289
1290										for ( let scriptHandler in templateScripts ) {
1291											jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) );
1292										}
1293
1294										for ( let styleHandler in templateStyles ) {
1295											jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) );
1296										}
1297
1298										vueInstance.headerContent = templateContent;
1299										vueInstance.headerTemplateVisible = true;
1300
1301										resolve();
1302									}
1303								} );
1304							} )
1305						);
1306					}
1307
1308					if ( 0 !== +this.beforeTemplate ) {
1309						this.ajaxPromises.push(
1310							new Promise( function( resolve, reject ) {
1311								$.ajax( {
1312									type: 'GET',
1313									url: window.jetMenuPublicSettings.getElementorTemplateApiUrl,
1314									dataType: 'json',
1315									data: {
1316										'id': vueInstance.beforeTemplate,
1317										'dev': window.jetMenuPublicSettings.devMode
1318									},
1319									beforeSend: function( jqXHR, ajaxSettings ) {
1320										jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
1321									},
1322									success: function( responce, textStatus, jqXHR ) {
1323										let templateContent = responce['content'],
1324										    templateScripts = responce['scripts'],
1325										    templateStyles  = responce['styles'];
1326
1327										for ( let scriptHandler in templateScripts ) {
1328											jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) );
1329										}
1330
1331										for ( let styleHandler in templateStyles ) {
1332											jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) );
1333										}
1334
1335										vueInstance.beforeContent = templateContent;
1336
1337										resolve();
1338									}
1339								} );
1340							} )
1341						);
1342					}
1343
1344					if ( 0 !== +this.afterTemplate ) {
1345						this.ajaxPromises.push(
1346							new Promise( function( resolve, reject ) {
1347								$.ajax( {
1348									type: 'GET',
1349									url: window.jetMenuPublicSettings.getElementorTemplateApiUrl,
1350									dataType: 'json',
1351									data: {
1352										'id': vueInstance.afterTemplate,
1353										'dev': window.jetMenuPublicSettings.devMode
1354									},
1355									beforeSend: function( jqXHR, ajaxSettings ) {
1356										jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
1357									},
1358									success: function( responce, textStatus, jqXHR ) {
1359										let templateContent = responce['content'],
1360										    templateScripts = responce['scripts'],
1361										    templateStyles  = responce['styles'];
1362
1363										for ( let scriptHandler in templateScripts ) {
1364											jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) );
1365										}
1366
1367										for ( let styleHandler in templateStyles ) {
1368											jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) );
1369										}
1370
1371										vueInstance.afterContent = templateContent;
1372										resolve();
1373									}
1374								} );
1375							} )
1376						);
1377					}*/
1378
1379					this.instanceLoadStatus = true;
1380
1381					Promise.all( this.ajaxPromises ).then( function() {
1382						vueInstance.instanceLoadStatus = false;
1383					}, function( reason ) {
1384						console.log( 'Script Loaded Error' );
1385					} );
1386
1387					jetMenu.eventBus.$on( 'itemsSubSwitch', function ( payLoad ) {
1388
1389						if ( vueInstance.$root.menuOptions.menuUniqId !== payLoad.menuUniqId ) {
1390							return;
1391						}
1392
1393						vueInstance.trail.push( payLoad.children );
1394						vueInstance.children = payLoad.children;
1395						vueInstance.animation = 'items-next-animation';
1396						vueInstance.breadcrumbsData.push( payLoad.name );
1397					} );
1398
1399					jetMenu.eventBus.$on( 'showTemplateContent', function ( payLoad ) {
1400
1401						if ( vueInstance.$root.menuOptions.menuUniqId !== payLoad.menuUniqId ) {
1402							return;
1403						}
1404
1405						vueInstance.itemTemplateContent = payLoad.megaContent.content;
1406						vueInstance.templateVisible = true;
1407						vueInstance.breadcrumbsData.push( payLoad.name );
1408						vueInstance.animation = 'items-next-animation';
1409
1410						const templateData = {
1411							content: payLoad.megaContent.content,
1412							contentElements: payLoad.megaContent.contentElements,
1413						}
1414
1415						vueInstance.showTemplateContent( templateData );
1416					} );
1417
1418					jetMenu.eventBus.$on( 'closeMenu', function( payLoad ) {
1419
1420						if ( vueInstance.$root.menuOptions.menuUniqId !== payLoad.menuUniqId ) {
1421							return;
1422						}
1423
1424						vueInstance.closeMenu();
1425					} );
1426
1427				},
1428
1429				watch: {
1430					menuOpen: function( curr, prev ) {
1431
1432						if ( curr ) {
1433							jetMenu.$body.addClass( 'jet-mobile-menu-visible' );
1434
1435							if ( 'slide-out' === this.$root.menuOptions.menuLayout ) {
1436								jetMenu.$body.addClass( 'jet-menu-body-blocker' );
1437							}
1438
1439							this.initTemplatesContent();
1440						}
1441
1442						if ( ! curr ) {
1443							jetMenu.$body.removeClass( 'jet-mobile-menu-visible' );
1444
1445							if ( 'slide-out' === this.$root.menuOptions.menuLayout ) {
1446								jetMenu.$body.removeClass( 'jet-menu-body-blocker' );
1447							}
1448
1449							this.clearStates();
1450						}
1451					}
1452				},
1453
1454				computed: {
1455					instanceClass: function() {
1456						let classes = [
1457							'jet-mobile-menu__instance',
1458							'jet-mobile-menu__instance--' + this.$root.menuOptions.menuLayout + '-layout',
1459							this.$root.menuOptions.menuPosition + '-container-position',
1460							( this.$root.menuOptions.togglePosition || 'default' ) + '-toggle-position',
1461						];
1462
1463						return classes;
1464					},
1465
1466					menuContainerVisible: function() {
1467						return this.menuOpen && !this.instanceLoadStatus;
1468					},
1469
1470					menuId: function() {
1471
1472						if ( this.$root.menuOptions.mobileMenuId ) {
1473							return this.$root.menuOptions.mobileMenuId;
1474						}
1475
1476						return this.$root.menuOptions.menuId;
1477					},
1478
1479					coverVisible: function() {
1480
1481						let avaliableForLayout = [
1482							'slide-out'
1483						];
1484
1485						return avaliableForLayout.includes( this.$root.menuOptions.menuLayout );
1486					},
1487
1488					itemsList: function() {
1489
1490						if ( ! this.children ) {
1491							return this.itemsRawData;
1492						}
1493
1494						return this.children;
1495					},
1496
1497					isClose: function() {
1498						let avaliableForLayout = [
1499							'slide-out'
1500						];
1501
1502						return avaliableForLayout.includes( this.$root.menuOptions.menuLayout );
1503					},
1504
1505					isBack: function() {
1506						return this.children || this.templateVisible ? true : false;
1507					},
1508
1509					isBreadcrumbs: function() {
1510						return this.$root.menuOptions.useBreadcrumb && 0 !== this.breadcrumbsData.length ? true : false;
1511					},
1512
1513					breadcrumbsPathData: function() {
1514
1515						if ( 'minimal' === this.$root.$root.menuOptions.breadcrumbPath && 1 < this.breadcrumbsData.length ) {
1516							return this.breadcrumbsData.filter( ( item, index, breadcrumbsData ) => {
1517								return 	index === breadcrumbsData.length - 1;
1518							} );
1519						}
1520
1521						return this.breadcrumbsData;
1522					},
1523
1524					depth: function() {
1525						return this.trail.length;
1526					},
1527
1528					containerPosition: function() {
1529						return this.$root.menuOptions.menuPosition;
1530					},
1531
1532					showAnimation: function() {
1533
1534						let animation = false;
1535
1536						switch( this.$root.menuOptions.menuLayout ) {
1537
1538							case 'slide-out':
1539								animation = 'right' === this.containerPosition ? 'menu-container-left-animation' : 'menu-container-right-animation';
1540								break;
1541
1542							case 'dropdown':
1543								animation = 'menu-container-dropdown-animation';
1544								break;
1545
1546							case 'push':
1547								animation = 'menu-container-expand-animation';
1548								break;
1549						}
1550
1551						return animation;
1552					},
1553
1554					toggleClosedIcon: function() {
1555						return this.$root.refsHtml.toggleClosedIcon || '';
1556					},
1557
1558					toggleOpenedIcon: function() {
1559						return this.$root.refsHtml.toggleOpenedIcon || '';
1560					},
1561
1562					toggleText: function() {
1563						return '' !== this.$root.menuOptions.toggleText ? this.$root.menuOptions.toggleText : false;
1564					},
1565
1566					closeIcon: function() {
1567						return this.$root.refsHtml.closeIcon || '';
1568					},
1569
1570					backIcon: function() {
1571						let backIcon = this.$root.refsHtml.backIcon || '',
1572						    backText = '' !== this.$root.menuOptions.backText ? '<span>' + this.$root.menuOptions.backText + '</span>' : '',
1573						    backHtml = backIcon + backText;
1574
1575						return backHtml;
1576					},
1577
1578					backText: function() {
1579						return '' !== this.$root.menuOptions.backText ? this.$root.menuOptions.backText : false;
1580					},
1581
1582					breadcrumbIcon: function() {
1583						return this.$root.refsHtml.breadcrumbIcon || '';
1584					},
1585
1586					loaderColor: function() {
1587						return this.$root.menuOptions.loaderColor || '#3a3a3a';
1588					},
1589
1590					toggleLoaderVisible: function() {
1591						return this.$root.menuOptions.toggleLoader && this.instanceLoadStatus && this.menuOpen ? true : false;
1592					},
1593
1594					beforeTemplateVisible: function() {
1595						return this.beforeContent ? true : false;
1596					},
1597
1598					afterTemplateVisible: function() {
1599						return this.afterContent ? true : false;
1600					}
1601
1602				},
1603
1604				methods: {
1605					menuToggle: function() {
1606						this.menuOpen = ! this.menuOpen;
1607					},
1608
1609					closeMenu: function() {
1610						this.menuOpen = false;
1611					},
1612
1613					clearStates: function() {
1614						this.trail = [];
1615						this.children = false;
1616						this.breadcrumbsData = [];
1617						this.templateVisible = false;
1618					},
1619
1620					goBack: function() {
1621
1622						this.animation = 'items-prev-animation';
1623
1624						if ( ! this.templateVisible ) {
1625							this.$delete( this.trail, this.trail.length - 1 );
1626							this.children = this.trail.slice(-1)[0] || false;
1627						} else {
1628							this.templateVisible = false;
1629						}
1630
1631						this.$delete(this.breadcrumbsData, this.breadcrumbsData.length - 1);
1632					},
1633
1634					escapeKeyHandler: function() {
1635
1636						if ( this.isBack ) {
1637							this.goBack();
1638						} else {
1639							this.closeMenu();
1640						}
1641					},
1642
1643					showTemplateContent: function( templateData ) {
1644						let vueInstance = this;
1645
1646						this.$nextTick( function() {
1647							let $templateContainer = $( vueInstance.$refs['template-content'] ).find( '.jet-mobile-menu__template-content' );
1648
1649							jetMenu.elementorContentRender( $templateContainer, templateData.content );
1650						} );
1651					},
1652
1653					initTemplatesContent: function() {
1654						let vueInstance = this;
1655
1656						this.$nextTick( function() {
1657
1658							if ( vueInstance.headerContent ) {
1659								let $headerContainer = $( vueInstance.$refs['header-template-content'] );
1660
1661								jetMenu.elementorContentRender( $headerContainer );
1662							}
1663
1664							if ( vueInstance.beforeContent ) {
1665								let $beforeContainer = $( vueInstance.$refs['before-template-content'] );
1666
1667								jetMenu.elementorContentRender( $beforeContainer );
1668							}
1669
1670							if ( vueInstance.afterContent ) {
1671								let $afterContainer = $( vueInstance.$refs['after-template-content'] );
1672
1673								jetMenu.elementorContentRender( $afterContainer );
1674							}
1675						} );
1676					},
1677
1678					breadcrumbHandle: function( index ) {
1679
1680						if ( index === this.breadcrumbsData.length ) {
1681							return;
1682						}
1683
1684						if ( 'minimal' === this.$root.menuOptions.breadcrumbPath ) {
1685							this.goBack();
1686
1687							return;
1688						}
1689
1690						this.animation = 'items-prev-animation';
1691						this.trail = this.trail.slice( 0, index );
1692						this.children = this.trail.slice( -1 )[0] || false;
1693						this.templateVisible = false;
1694						this.breadcrumbsData = this.breadcrumbsData.slice( 0, index );
1695					}
1696
1697				}
1698			});
1699		},
1700
1701		loadScriptAsync: function( script, uri ) {
1702
1703			if ( jetMenu.addedScripts.hasOwnProperty( script ) ) {
1704				return script;
1705			}
1706
1707			jetMenu.addedScripts[ script ] = uri;
1708
1709			return new Promise( function( resolve, reject ) {
1710				var tag = document.createElement( 'script' );
1711
1712					tag.src    = uri;
1713					tag.async  = true;
1714					tag.onload = function() {
1715						resolve( script );
1716					};
1717
1718				document.head.appendChild( tag );
1719			} );
1720		},
1721
1722		loadStyle: function( style, uri ) {
1723
1724			if ( jetMenu.addedStyles.hasOwnProperty( style ) && jetMenu.addedStyles[ style ] ===  uri) {
1725				return style;
1726			}
1727
1728			jetMenu.addedStyles[ style ] = uri;
1729
1730			return new Promise( function( resolve, reject ) {
1731				var tag = document.createElement( 'link' );
1732
1733					tag.id      = style;
1734					tag.rel     = 'stylesheet';
1735					tag.href    = uri;
1736					tag.type    = 'text/css';
1737					tag.media   = 'all';
1738					tag.onload  = function() {
1739						resolve( style );
1740					};
1741
1742				document.head.appendChild( tag );
1743			});
1744		},
1745
1746		elementorContentRender: function( $templateContainer, templateContent ) {
1747			let content = templateContent || false;
1748
1749			Promise.all( jetMenu.addedAssetsPromises ).then( function( value ) {
1750
1751				if ( templateContent ) {
1752					$templateContainer.html( templateContent );
1753				}
1754
1755				// Before ajax frontend init
1756				$( window ).trigger( 'jet-menu/ajax/frontend-init/before', {
1757					$container: $templateContainer,
1758					content: content,
1759				} );
1760
1761				jetMenu.elementorFrontendInit( $templateContainer );
1762
1763				// Before ajax frontend init
1764				$( window ).trigger( 'jet-menu/ajax/frontend-init/after', {
1765					$container: $templateContainer,
1766					content: content,
1767				} );
1768			}, function( reason ) {
1769				console.log( 'Script Loaded Error' );
1770			});
1771		},
1772
1773		elementorFrontendInit: function( $templateContainer ) {
1774
1775			$templateContainer.find( 'div[data-element_type]' ).each( function() {
1776				var $this       = $( this ),
1777					elementType = $this.data( 'element_type' );
1778
1779				if ( ! elementType ) {
1780					return;
1781				}
1782
1783				try {
1784					if ( 'widget' === elementType ) {
1785						elementType = $this.data( 'widget_type' );
1786
1787						if ( window.elementorFrontend && window.elementorFrontend.hooks ) {
1788							window.elementorFrontend.hooks.doAction( 'frontend/element_ready/widget', $this, $ );
1789						}
1790					}
1791
1792					if ( window.elementorFrontend && window.elementorFrontend.hooks ) {
1793						window.elementorFrontend.hooks.doAction( 'frontend/element_ready/global', $this, $ );
1794						window.elementorFrontend.hooks.doAction( 'frontend/element_ready/' + elementType, $this, $ );
1795					}
1796
1797				} catch ( err ) {
1798					console.log(err);
1799
1800					$this.remove();
1801
1802					return false;
1803				}
1804			} );
1805		}
1806
1807	};
1808
1809	jetMenu.init();
1810
1811} ( 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.