PageSourceSearch

https://www.comodo.com/wp-content/plugins/jet-menu/assets/public/j…/jet-menu-public-scripts.js?ver=2.4.0

js comodo.com collected 2026-09-24 06:59:32 UTC 52,765 bytes, 1,805 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					isDescVisible: function() {
1038						let descVisible = this.$root.menuOptions.itemDescVisible;
1039
1040						return false === descVisible || '' === this.itemDataObject.description || ! this.itemDataObject.description ? false : true;
1041					},
1042
1043					loaderColor: function() {
1044						return this.$root.menuOptions.loaderColor || '#3a3a3a';
1045					},
1046				},
1047
1048				methods: {
1049					itemSubHandler: function( event ) {
1050						let target     = event.target,
1051						    mobileLink = $( target ).closest( '.mobile-link' );
1052
1053						if ( 'item' !== this.$root.menuOptions.subTrigger ) {
1054							return;
1055						}
1056
1057						if ( this.isSub && mobileLink ) {
1058							event.preventDefault();
1059						}
1060
1061						if ( ! this.isSub && mobileLink && this.$root.menuOptions.closeAfterNavigate ) {
1062							jetMenu.eventBus.$emit( 'closeMenu', {
1063								menuUniqId: this.$root.menuOptions.menuUniqId,
1064							} );
1065						}
1066
1067						this.switchToSub( event );
1068					},
1069
1070					markerSubHandler: function( event ) {
1071
1072						if ( 'submarker' !== this.$root.menuOptions.subTrigger ) {
1073							return;
1074						}
1075
1076						this.switchToSub( event );
1077					},
1078
1079					switchToSub: function( event ) {
1080
1081						if ( ! this.isSub ) {
1082							return;
1083						}
1084
1085						if ( ! this.isTemplateDefine ) {
1086
1087							if ( this.isDropdownLayout ) {
1088								this.subDropdownVisible = !this.subDropdownVisible;
1089
1090								return;
1091							}
1092
1093							jetMenu.eventBus.$emit( 'itemsSubSwitch', {
1094								menuUniqId: this.$root.menuOptions.menuUniqId,
1095								id: this.itemDataObject.id,
1096								name: this.itemDataObject.name,
1097								children: this.itemDataObject.children || false
1098							} );
1099
1100						} else {
1101
1102							if ( ! this.itemDataObject.megaContent ) {
1103								this.getElementorTemplate();
1104							} else {
1105
1106								jetMenu.eventBus.$emit( 'showTemplateContent', {
1107									menuUniqId: this.$root.menuOptions.menuUniqId,
1108									id: this.itemDataObject.id,
1109									name: this.itemDataObject.name,
1110									megaContent: this.itemDataObject.megaContent
1111								} );
1112							}
1113						}
1114					},
1115
1116					getElementorTemplate: function() {
1117						var vueInstance = this;
1118
1119						vueInstance.ajaxRequest = $.ajax( {
1120							type: 'GET',
1121							url: window.jetMenuPublicSettings.getElementorTemplateApiUrl,
1122							dataType: 'json',
1123							data: {
1124								'id': vueInstance.itemDataObject.megaTemplateId,
1125								'dev': window.jetMenuPublicSettings.devMode
1126							},
1127							beforeSend: function( jqXHR, ajaxSettings ) {
1128
1129								if ( null !== vueInstance.ajaxRequest ) {
1130									vueInstance.ajaxRequest.abort();
1131								}
1132
1133								vueInstance.templateLoadStatus = true;
1134
1135								jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
1136							},
1137							success: function( responce, textStatus, jqXHR ) {
1138								var templateContent   = responce['content'],
1139								    templateScripts   = responce['scripts'],
1140								    templateStyles    = responce['styles'];
1141
1142								for ( var scriptHandler in templateScripts ) {
1143									jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) );
1144								}
1145
1146								for ( var styleHandler in templateStyles ) {
1147									jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) );
1148								}
1149
1150								vueInstance.templateLoadStatus = false;
1151
1152								vueInstance.itemDataObject.megaContent = templateContent;
1153
1154								jetMenu.eventBus.$emit( 'showTemplateContent', {
1155									menuUniqId: vueInstance.$root.menuOptions.menuUniqId,
1156									id: vueInstance.itemDataObject.id,
1157									name: vueInstance.itemDataObject.name,
1158									megaContent: vueInstance.itemDataObject.megaContent
1159								} );
1160							}
1161						} );
1162					}
1163				}
1164
1165			});
1166
1167			Vue.component( 'mobile-menu-list', {
1168				template: '#mobile-menu-list-template',
1169				props: {
1170					depth: Number,
1171					childrenObject: Object
1172				}
1173			} );
1174
1175			Vue.component( 'mobile-menu', {
1176				template: '#mobile-menu-template',
1177
1178				data: function() {
1179					return ( {
1180						menuOpen: false,
1181						children: false,
1182						itemsRawData: {},
1183						trail:[],
1184						breadcrumbsData: [],
1185						animation: 'items-next-animation',
1186						ajaxRequest: null,
1187						templateVisible: false,
1188						instanceLoadStatus: false,
1189						itemTemplateContent: false,
1190						headerTemplate: this.$root.menuOptions['headerTemplate'] || 0,
1191						headerContent: false,
1192						headerTemplateVisible: false,
1193						beforeTemplate: this.$root.menuOptions['beforeTemplate'] || 0,
1194						beforeContent: false,
1195						afterTemplate: this.$root.menuOptions['afterTemplate'] || 0,
1196						afterContent: false,
1197						ajaxPromises: [],
1198					} )
1199				},
1200
1201				mounted: function() {
1202					let vueInstance = this;
1203
1204					if ( this.menuOpen ) {
1205						jetMenu.$body.addClass( 'jet-mobile-menu-visible' );
1206
1207						if ( 'slide-out' === this.$root.menuOptions.menuLayout ) {
1208							jetMenu.$body.addClass( 'jet-menu-body-blocker' );
1209						}
1210					}
1211
1212					let menuInstanceRenderData = false,
1213						renderDataElement = document.getElementById( 'jetMenuMobileWidgetRenderData' + this.$root.menuOptions.menuUniqId );
1214
1215					if ( renderDataElement ) {
1216						eval( renderDataElement.innerHTML );
1217						menuInstanceRenderData = window[ 'jetMenuMobileWidgetRenderData' + this.$root.menuOptions.menuUniqId ] || false;
1218					}
1219
1220					if ( menuInstanceRenderData ) {
1221						this.itemsRawData = menuInstanceRenderData['items'];
1222
1223						const headerTemplateData = menuInstanceRenderData.headerTemplateData || false,
1224							beforeTemplateData = menuInstanceRenderData.beforeTemplateData || false,
1225							afterTemplateData = menuInstanceRenderData.afterTemplateData || false;
1226
1227						if ( headerTemplateData ) {
1228							this.headerContent = headerTemplateData.content;
1229						}
1230
1231						if ( beforeTemplateData ) {
1232							this.beforeContent = beforeTemplateData.content;
1233						}
1234
1235						if ( afterTemplateData ) {
1236							this.afterContent = afterTemplateData.content;
1237						}
1238					}
1239
1240					/*this.ajaxPromises.push(
1241						new Promise( function( resolve, reject ) {
1242							$.ajax( {
1243								type: 'GET',
1244								url: window.jetMenuPublicSettings.menuItemsApiUrl,
1245								dataType: 'json',
1246								data: {
1247									'menu_id': vueInstance.menuId,
1248									'dev': window.jetMenuPublicSettings.devMode,
1249									'lang': window.jetMenuPublicSettings.wpmlLanguageCode || false
1250								},
1251								beforeSend: function( jqXHR, ajaxSettings ) {
1252									jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
1253								},
1254								success: function( responce, textStatus, jqXHR ) {
1255									let responceData = responce.data.items;
1256
1257									vueInstance.itemsRawData = responceData;
1258
1259									resolve();
1260								}
1261							} );
1262						} )
1263					);*/
1264
1265					/*if ( 0 !== +this.headerTemplate ) {
1266						this.ajaxPromises.push(
1267							new Promise( function( resolve, reject ) {
1268								$.ajax( {
1269									type: 'GET',
1270									url: window.jetMenuPublicSettings.getElementorTemplateApiUrl,
1271									dataType: 'json',
1272									data: {
1273										'id': vueInstance.headerTemplate,
1274										'dev': window.jetMenuPublicSettings.devMode
1275									},
1276									beforeSend: function( jqXHR, ajaxSettings ) {
1277										jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
1278									},
1279									success: function( responce, textStatus, jqXHR ) {
1280										let templateContent = responce['content'],
1281										    templateScripts = responce['scripts'],
1282										    templateStyles  = responce['styles'];
1283
1284										for ( let scriptHandler in templateScripts ) {
1285											jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) );
1286										}
1287
1288										for ( let styleHandler in templateStyles ) {
1289											jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) );
1290										}
1291
1292										vueInstance.headerContent = templateContent;
1293										vueInstance.headerTemplateVisible = true;
1294
1295										resolve();
1296									}
1297								} );
1298							} )
1299						);
1300					}
1301
1302					if ( 0 !== +this.beforeTemplate ) {
1303						this.ajaxPromises.push(
1304							new Promise( function( resolve, reject ) {
1305								$.ajax( {
1306									type: 'GET',
1307									url: window.jetMenuPublicSettings.getElementorTemplateApiUrl,
1308									dataType: 'json',
1309									data: {
1310										'id': vueInstance.beforeTemplate,
1311										'dev': window.jetMenuPublicSettings.devMode
1312									},
1313									beforeSend: function( jqXHR, ajaxSettings ) {
1314										jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
1315									},
1316									success: function( responce, textStatus, jqXHR ) {
1317										let templateContent = responce['content'],
1318										    templateScripts = responce['scripts'],
1319										    templateStyles  = responce['styles'];
1320
1321										for ( let scriptHandler in templateScripts ) {
1322											jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) );
1323										}
1324
1325										for ( let styleHandler in templateStyles ) {
1326											jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) );
1327										}
1328
1329										vueInstance.beforeContent = templateContent;
1330
1331										resolve();
1332									}
1333								} );
1334							} )
1335						);
1336					}
1337
1338					if ( 0 !== +this.afterTemplate ) {
1339						this.ajaxPromises.push(
1340							new Promise( function( resolve, reject ) {
1341								$.ajax( {
1342									type: 'GET',
1343									url: window.jetMenuPublicSettings.getElementorTemplateApiUrl,
1344									dataType: 'json',
1345									data: {
1346										'id': vueInstance.afterTemplate,
1347										'dev': window.jetMenuPublicSettings.devMode
1348									},
1349									beforeSend: function( jqXHR, ajaxSettings ) {
1350										jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
1351									},
1352									success: function( responce, textStatus, jqXHR ) {
1353										let templateContent = responce['content'],
1354										    templateScripts = responce['scripts'],
1355										    templateStyles  = responce['styles'];
1356
1357										for ( let scriptHandler in templateScripts ) {
1358											jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) );
1359										}
1360
1361										for ( let styleHandler in templateStyles ) {
1362											jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) );
1363										}
1364
1365										vueInstance.afterContent = templateContent;
1366										resolve();
1367									}
1368								} );
1369							} )
1370						);
1371					}*/
1372
1373					this.instanceLoadStatus = true;
1374
1375					Promise.all( this.ajaxPromises ).then( function() {
1376						vueInstance.instanceLoadStatus = false;
1377					}, function( reason ) {
1378						console.log( 'Script Loaded Error' );
1379					} );
1380
1381					jetMenu.eventBus.$on( 'itemsSubSwitch', function ( payLoad ) {
1382
1383						if ( vueInstance.$root.menuOptions.menuUniqId !== payLoad.menuUniqId ) {
1384							return;
1385						}
1386
1387						vueInstance.trail.push( payLoad.children );
1388						vueInstance.children = payLoad.children;
1389						vueInstance.animation = 'items-next-animation';
1390						vueInstance.breadcrumbsData.push( payLoad.name );
1391					} );
1392
1393					jetMenu.eventBus.$on( 'showTemplateContent', function ( payLoad ) {
1394
1395						if ( vueInstance.$root.menuOptions.menuUniqId !== payLoad.menuUniqId ) {
1396							return;
1397						}
1398
1399						vueInstance.itemTemplateContent = payLoad.megaContent.content;
1400						vueInstance.templateVisible = true;
1401						vueInstance.breadcrumbsData.push( payLoad.name );
1402						vueInstance.animation = 'items-next-animation';
1403
1404						const templateData = {
1405							content: payLoad.megaContent.content,
1406							contentElements: payLoad.megaContent.contentElements,
1407						}
1408
1409						vueInstance.showTemplateContent( templateData );
1410					} );
1411
1412					jetMenu.eventBus.$on( 'closeMenu', function( payLoad ) {
1413
1414						if ( vueInstance.$root.menuOptions.menuUniqId !== payLoad.menuUniqId ) {
1415							return;
1416						}
1417
1418						vueInstance.closeMenu();
1419					} );
1420
1421				},
1422
1423				watch: {
1424					menuOpen: function( curr, prev ) {
1425
1426						if ( curr ) {
1427							jetMenu.$body.addClass( 'jet-mobile-menu-visible' );
1428
1429							if ( 'slide-out' === this.$root.menuOptions.menuLayout ) {
1430								jetMenu.$body.addClass( 'jet-menu-body-blocker' );
1431							}
1432
1433							this.initTemplatesContent();
1434						}
1435
1436						if ( ! curr ) {
1437							jetMenu.$body.removeClass( 'jet-mobile-menu-visible' );
1438
1439							if ( 'slide-out' === this.$root.menuOptions.menuLayout ) {
1440								jetMenu.$body.removeClass( 'jet-menu-body-blocker' );
1441							}
1442
1443							this.clearStates();
1444						}
1445					}
1446				},
1447
1448				computed: {
1449					instanceClass: function() {
1450						let classes = [
1451							'jet-mobile-menu__instance',
1452							'jet-mobile-menu__instance--' + this.$root.menuOptions.menuLayout + '-layout',
1453							this.$root.menuOptions.menuPosition + '-container-position',
1454							( this.$root.menuOptions.togglePosition || 'default' ) + '-toggle-position',
1455						];
1456
1457						return classes;
1458					},
1459
1460					menuContainerVisible: function() {
1461						return this.menuOpen && !this.instanceLoadStatus;
1462					},
1463
1464					menuId: function() {
1465
1466						if ( this.$root.menuOptions.mobileMenuId ) {
1467							return this.$root.menuOptions.mobileMenuId;
1468						}
1469
1470						return this.$root.menuOptions.menuId;
1471					},
1472
1473					coverVisible: function() {
1474
1475						let avaliableForLayout = [
1476							'slide-out'
1477						];
1478
1479						return avaliableForLayout.includes( this.$root.menuOptions.menuLayout );
1480					},
1481
1482					itemsList: function() {
1483
1484						if ( ! this.children ) {
1485							return this.itemsRawData;
1486						}
1487
1488						return this.children;
1489					},
1490
1491					isClose: function() {
1492						let avaliableForLayout = [
1493							'slide-out'
1494						];
1495
1496						return avaliableForLayout.includes( this.$root.menuOptions.menuLayout );
1497					},
1498
1499					isBack: function() {
1500						return this.children || this.templateVisible ? true : false;
1501					},
1502
1503					isBreadcrumbs: function() {
1504						return this.$root.menuOptions.useBreadcrumb && 0 !== this.breadcrumbsData.length ? true : false;
1505					},
1506
1507					breadcrumbsPathData: function() {
1508
1509						if ( 'minimal' === this.$root.$root.menuOptions.breadcrumbPath && 1 < this.breadcrumbsData.length ) {
1510							return this.breadcrumbsData.filter( ( item, index, breadcrumbsData ) => {
1511								return 	index === breadcrumbsData.length - 1;
1512							} );
1513						}
1514
1515						return this.breadcrumbsData;
1516					},
1517
1518					depth: function() {
1519						return this.trail.length;
1520					},
1521
1522					containerPosition: function() {
1523						return this.$root.menuOptions.menuPosition;
1524					},
1525
1526					showAnimation: function() {
1527
1528						let animation = false;
1529
1530						switch( this.$root.menuOptions.menuLayout ) {
1531
1532							case 'slide-out':
1533								animation = 'right' === this.containerPosition ? 'menu-container-left-animation' : 'menu-container-right-animation';
1534								break;
1535
1536							case 'dropdown':
1537								animation = 'menu-container-dropdown-animation';
1538								break;
1539
1540							case 'push':
1541								animation = 'menu-container-expand-animation';
1542								break;
1543						}
1544
1545						return animation;
1546					},
1547
1548					toggleClosedIcon: function() {
1549						return this.$root.refsHtml.toggleClosedIcon || '';
1550					},
1551
1552					toggleOpenedIcon: function() {
1553						return this.$root.refsHtml.toggleOpenedIcon || '';
1554					},
1555
1556					toggleText: function() {
1557						return '' !== this.$root.menuOptions.toggleText ? this.$root.menuOptions.toggleText : false;
1558					},
1559
1560					closeIcon: function() {
1561						return this.$root.refsHtml.closeIcon || '';
1562					},
1563
1564					backIcon: function() {
1565						let backIcon = this.$root.refsHtml.backIcon || '',
1566						    backText = '' !== this.$root.menuOptions.backText ? '<span>' + this.$root.menuOptions.backText + '</span>' : '',
1567						    backHtml = backIcon + backText;
1568
1569						return backHtml;
1570					},
1571
1572					backText: function() {
1573						return '' !== this.$root.menuOptions.backText ? this.$root.menuOptions.backText : false;
1574					},
1575
1576					breadcrumbIcon: function() {
1577						return this.$root.refsHtml.breadcrumbIcon || '';
1578					},
1579
1580					loaderColor: function() {
1581						return this.$root.menuOptions.loaderColor || '#3a3a3a';
1582					},
1583
1584					toggleLoaderVisible: function() {
1585						return this.$root.menuOptions.toggleLoader && this.instanceLoadStatus && this.menuOpen ? true : false;
1586					},
1587
1588					beforeTemplateVisible: function() {
1589						return this.beforeContent ? true : false;
1590					},
1591
1592					afterTemplateVisible: function() {
1593						return this.afterContent ? true : false;
1594					}
1595
1596				},
1597
1598				methods: {
1599					menuToggle: function() {
1600						this.menuOpen = ! this.menuOpen;
1601					},
1602
1603					closeMenu: function() {
1604						this.menuOpen = false;
1605					},
1606
1607					clearStates: function() {
1608						this.trail = [];
1609						this.children = false;
1610						this.breadcrumbsData = [];
1611						this.templateVisible = false;
1612					},
1613
1614					goBack: function() {
1615
1616						this.animation = 'items-prev-animation';
1617
1618						if ( ! this.templateVisible ) {
1619							this.$delete( this.trail, this.trail.length - 1 );
1620							this.children = this.trail.slice(-1)[0] || false;
1621						} else {
1622							this.templateVisible = false;
1623						}
1624
1625						this.$delete(this.breadcrumbsData, this.breadcrumbsData.length - 1);
1626					},
1627
1628					escapeKeyHandler: function() {
1629
1630						if ( this.isBack ) {
1631							this.goBack();
1632						} else {
1633							this.closeMenu();
1634						}
1635					},
1636
1637					showTemplateContent: function( templateData ) {
1638						let vueInstance = this;
1639
1640						this.$nextTick( function() {
1641							let $templateContainer = $( vueInstance.$refs['template-content'] ).find( '.jet-mobile-menu__template-content' );
1642
1643							jetMenu.elementorContentRender( $templateContainer, templateData.content );
1644						} );
1645					},
1646
1647					initTemplatesContent: function() {
1648						let vueInstance = this;
1649
1650						this.$nextTick( function() {
1651
1652							if ( vueInstance.headerContent ) {
1653								let $headerContainer = $( vueInstance.$refs['header-template-content'] );
1654
1655								jetMenu.elementorContentRender( $headerContainer );
1656							}
1657
1658							if ( vueInstance.beforeContent ) {
1659								let $beforeContainer = $( vueInstance.$refs['before-template-content'] );
1660
1661								jetMenu.elementorContentRender( $beforeContainer );
1662							}
1663
1664							if ( vueInstance.afterContent ) {
1665								let $afterContainer = $( vueInstance.$refs['after-template-content'] );
1666
1667								jetMenu.elementorContentRender( $afterContainer );
1668							}
1669						} );
1670					},
1671
1672					breadcrumbHandle: function( index ) {
1673
1674						if ( index === this.breadcrumbsData.length ) {
1675							return;
1676						}
1677
1678						if ( 'minimal' === this.$root.menuOptions.breadcrumbPath ) {
1679							this.goBack();
1680
1681							return;
1682						}
1683
1684						this.animation = 'items-prev-animation';
1685						this.trail = this.trail.slice( 0, index );
1686						this.children = this.trail.slice( -1 )[0] || false;
1687						this.templateVisible = false;
1688						this.breadcrumbsData = this.breadcrumbsData.slice( 0, index );
1689					}
1690
1691				}
1692			});
1693		},
1694
1695		loadScriptAsync: function( script, uri ) {
1696
1697			if ( jetMenu.addedScripts.hasOwnProperty( script ) ) {
1698				return script;
1699			}
1700
1701			jetMenu.addedScripts[ script ] = uri;
1702
1703			return new Promise( function( resolve, reject ) {
1704				var tag = document.createElement( 'script' );
1705
1706					tag.src    = uri;
1707					tag.async  = true;
1708					tag.onload = function() {
1709						resolve( script );
1710					};
1711
1712				document.head.appendChild( tag );
1713			} );
1714		},
1715
1716		loadStyle: function( style, uri ) {
1717
1718			if ( jetMenu.addedStyles.hasOwnProperty( style ) && jetMenu.addedStyles[ style ] ===  uri) {
1719				return style;
1720			}
1721
1722			jetMenu.addedStyles[ style ] = uri;
1723
1724			return new Promise( function( resolve, reject ) {
1725				var tag = document.createElement( 'link' );
1726
1727					tag.id      = style;
1728					tag.rel     = 'stylesheet';
1729					tag.href    = uri;
1730					tag.type    = 'text/css';
1731					tag.media   = 'all';
1732					tag.onload  = function() {
1733						resolve( style );
1734					};
1735
1736				document.head.appendChild( tag );
1737			});
1738		},
1739
1740		elementorContentRender: function( $templateContainer, templateContent ) {
1741			let content = templateContent || false;
1742
1743			Promise.all( jetMenu.addedAssetsPromises ).then( function( value ) {
1744
1745				if ( templateContent ) {
1746					$templateContainer.html( templateContent );
1747				}
1748
1749				// Before ajax frontend init
1750				$( window ).trigger( 'jet-menu/ajax/frontend-init/before', {
1751					$container: $templateContainer,
1752					content: content,
1753				} );
1754
1755				jetMenu.elementorFrontendInit( $templateContainer );
1756
1757				// Before ajax frontend init
1758				$( window ).trigger( 'jet-menu/ajax/frontend-init/after', {
1759					$container: $templateContainer,
1760					content: content,
1761				} );
1762			}, function( reason ) {
1763				console.log( 'Script Loaded Error' );
1764			});
1765		},
1766
1767		elementorFrontendInit: function( $templateContainer ) {
1768
1769			$templateContainer.find( 'div[data-element_type]' ).each( function() {
1770				var $this       = $( this ),
1771					elementType = $this.data( 'element_type' );
1772
1773				if ( ! elementType ) {
1774					return;
1775				}
1776
1777				try {
1778					if ( 'widget' === elementType ) {
1779						elementType = $this.data( 'widget_type' );
1780
1781						if ( window.elementorFrontend && window.elementorFrontend.hooks ) {
1782							window.elementorFrontend.hooks.doAction( 'frontend/element_ready/widget', $this, $ );
1783						}
1784					}
1785
1786					if ( window.elementorFrontend && window.elementorFrontend.hooks ) {
1787						window.elementorFrontend.hooks.doAction( 'frontend/element_ready/global', $this, $ );
1788						window.elementorFrontend.hooks.doAction( 'frontend/element_ready/' + elementType, $this, $ );
1789					}
1790
1791				} catch ( err ) {
1792					console.log(err);
1793
1794					$this.remove();
1795
1796					return false;
1797				}
1798			} );
1799		}
1800
1801	};
1802
1803	jetMenu.init();
1804
1805} ( 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.