PageSourceSearch

https://rivistabancaria.it/wp-content/plugins/jet-menu/assets/publ…/jet-menu-public-scripts.js?ver=2.1.7

js rivistabancaria.it collected 2026-10-01 11:54:51 UTC 51,668 bytes, 1,772 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.templateApiUrl,
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['template_content'],
235						templateScripts   = responce['template_scripts'],
236						templateStyles    = responce['template_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.elementorTemplateId ? 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.elementorContent ) {
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									elementorContent: this.itemDataObject.elementorContent
1111								} );
1112							}
1113						}
1114					},
1115
1116					getElementorTemplate: function() {
1117						var vueInstance = this;
1118
1119						vueInstance.ajaxRequest = $.ajax( {
1120							type: 'GET',
1121							url: window.jetMenuPublicSettings.templateApiUrl,
1122							dataType: 'json',
1123							data: {
1124								'id': vueInstance.itemDataObject.elementorTemplateId,
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['template_content'],
1139								    templateScripts   = responce['template_scripts'],
1140								    templateStyles    = responce['template_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.elementorContent = templateContent;
1153
1154								jetMenu.eventBus.$emit( 'showTemplateContent', {
1155									menuUniqId: vueInstance.$root.menuOptions.menuUniqId,
1156									id: vueInstance.itemDataObject.id,
1157									name: vueInstance.itemDataObject.name,
1158									elementorContent: vueInstance.itemDataObject.elementorContent
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					this.ajaxPromises.push(
1213						new Promise( function( resolve, reject ) {
1214							$.ajax( {
1215								type: 'GET',
1216								url: window.jetMenuPublicSettings.menuItemsApiUrl,
1217								dataType: 'json',
1218								data: {
1219									'menu_id': vueInstance.menuId,
1220									'dev': window.jetMenuPublicSettings.devMode,
1221									'lang': window.jetMenuPublicSettings.wpmlLanguageCode || false
1222								},
1223								beforeSend: function( jqXHR, ajaxSettings ) {
1224									jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
1225								},
1226								success: function( responce, textStatus, jqXHR ) {
1227									let responceData = responce.data.items;
1228
1229									vueInstance.itemsRawData = responceData;
1230
1231									resolve();
1232								}
1233							} );
1234						} )
1235					);
1236
1237					if ( 0 !== +this.headerTemplate ) {
1238						this.ajaxPromises.push(
1239							new Promise( function( resolve, reject ) {
1240								$.ajax( {
1241									type: 'GET',
1242									url: window.jetMenuPublicSettings.templateApiUrl,
1243									dataType: 'json',
1244									data: {
1245										'id': vueInstance.headerTemplate,
1246										'dev': window.jetMenuPublicSettings.devMode
1247									},
1248									beforeSend: function( jqXHR, ajaxSettings ) {
1249										jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
1250									},
1251									success: function( responce, textStatus, jqXHR ) {
1252										let templateContent = responce['template_content'],
1253										    templateScripts = responce['template_scripts'],
1254										    templateStyles  = responce['template_styles'];
1255
1256										for ( let scriptHandler in templateScripts ) {
1257											jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) );
1258										}
1259
1260										for ( let styleHandler in templateStyles ) {
1261											jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) );
1262										}
1263
1264										vueInstance.headerContent = templateContent;
1265										vueInstance.headerTemplateVisible = true;
1266
1267										resolve();
1268									}
1269								} );
1270							} )
1271						);
1272					}
1273
1274					if ( 0 !== +this.beforeTemplate ) {
1275						this.ajaxPromises.push(
1276							new Promise( function( resolve, reject ) {
1277								$.ajax( {
1278									type: 'GET',
1279									url: window.jetMenuPublicSettings.templateApiUrl,
1280									dataType: 'json',
1281									data: {
1282										'id': vueInstance.beforeTemplate,
1283										'dev': window.jetMenuPublicSettings.devMode
1284									},
1285									beforeSend: function( jqXHR, ajaxSettings ) {
1286										jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
1287									},
1288									success: function( responce, textStatus, jqXHR ) {
1289										let templateContent = responce['template_content'],
1290										    templateScripts = responce['template_scripts'],
1291										    templateStyles  = responce['template_styles'];
1292
1293										for ( let scriptHandler in templateScripts ) {
1294											jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) );
1295										}
1296
1297										for ( let styleHandler in templateStyles ) {
1298											jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) );
1299										}
1300
1301										vueInstance.beforeContent = templateContent;
1302
1303										resolve();
1304									}
1305								} );
1306							} )
1307						);
1308					}
1309
1310					if ( 0 !== +this.afterTemplate ) {
1311						this.ajaxPromises.push(
1312							new Promise( function( resolve, reject ) {
1313								$.ajax( {
1314									type: 'GET',
1315									url: window.jetMenuPublicSettings.templateApiUrl,
1316									dataType: 'json',
1317									data: {
1318										'id': vueInstance.afterTemplate,
1319										'dev': window.jetMenuPublicSettings.devMode
1320									},
1321									beforeSend: function( jqXHR, ajaxSettings ) {
1322										jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
1323									},
1324									success: function( responce, textStatus, jqXHR ) {
1325										let templateContent = responce['template_content'],
1326										    templateScripts = responce['template_scripts'],
1327										    templateStyles  = responce['template_styles'];
1328
1329										for ( let scriptHandler in templateScripts ) {
1330											jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) );
1331										}
1332
1333										for ( let styleHandler in templateStyles ) {
1334											jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) );
1335										}
1336
1337										vueInstance.afterContent = templateContent;
1338										resolve();
1339									}
1340								} );
1341							} )
1342						);
1343					}
1344
1345					this.instanceLoadStatus = true;
1346
1347					Promise.all( this.ajaxPromises ).then( function() {
1348						vueInstance.instanceLoadStatus = false;
1349					}, function( reason ) {
1350						console.log( 'Script Loaded Error' );
1351					} );
1352
1353					jetMenu.eventBus.$on( 'itemsSubSwitch', function ( payLoad ) {
1354
1355						if ( vueInstance.$root.menuOptions.menuUniqId !== payLoad.menuUniqId ) {
1356							return;
1357						}
1358
1359						vueInstance.trail.push( payLoad.children );
1360						vueInstance.children = payLoad.children;
1361						vueInstance.animation = 'items-next-animation';
1362						vueInstance.breadcrumbsData.push( payLoad.name );
1363					} );
1364
1365					jetMenu.eventBus.$on( 'showTemplateContent', function ( payLoad ) {
1366
1367						if ( vueInstance.$root.menuOptions.menuUniqId !== payLoad.menuUniqId ) {
1368							return;
1369						}
1370
1371						vueInstance.itemTemplateContent = payLoad.elementorContent;
1372						vueInstance.templateVisible = true;
1373						vueInstance.breadcrumbsData.push( payLoad.name );
1374						vueInstance.animation = 'items-next-animation';
1375
1376						vueInstance.showTemplateContent();
1377					} );
1378
1379					jetMenu.eventBus.$on( 'closeMenu', function( payLoad ) {
1380
1381						if ( vueInstance.$root.menuOptions.menuUniqId !== payLoad.menuUniqId ) {
1382							return;
1383						}
1384
1385						vueInstance.closeMenu();
1386					} );
1387
1388				},
1389
1390				watch: {
1391					menuOpen: function( curr, prev ) {
1392
1393						if ( curr ) {
1394							jetMenu.$body.addClass( 'jet-mobile-menu-visible' );
1395
1396							if ( 'slide-out' === this.$root.menuOptions.menuLayout ) {
1397								jetMenu.$body.addClass( 'jet-menu-body-blocker' );
1398							}
1399
1400							this.initTemplatesContent();
1401						}
1402
1403						if ( ! curr ) {
1404							jetMenu.$body.removeClass( 'jet-mobile-menu-visible' );
1405
1406							if ( 'slide-out' === this.$root.menuOptions.menuLayout ) {
1407								jetMenu.$body.removeClass( 'jet-menu-body-blocker' );
1408							}
1409
1410							this.clearStates();
1411						}
1412					}
1413				},
1414
1415				computed: {
1416					instanceClass: function() {
1417						let classes = [
1418							'jet-mobile-menu__instance',
1419							'jet-mobile-menu__instance--' + this.$root.menuOptions.menuLayout + '-layout',
1420							this.$root.menuOptions.menuPosition + '-container-position',
1421							( this.$root.menuOptions.togglePosition || 'default' ) + '-toggle-position',
1422						];
1423
1424						return classes;
1425					},
1426
1427					menuContainerVisible: function() {
1428						return this.menuOpen && !this.instanceLoadStatus;
1429					},
1430
1431					menuId: function() {
1432
1433						if ( this.$root.menuOptions.mobileMenuId ) {
1434							return this.$root.menuOptions.mobileMenuId;
1435						}
1436
1437						return this.$root.menuOptions.menuId;
1438					},
1439
1440					coverVisible: function() {
1441
1442						let avaliableForLayout = [
1443							'slide-out'
1444						];
1445
1446						return avaliableForLayout.includes( this.$root.menuOptions.menuLayout );
1447					},
1448
1449					itemsList: function() {
1450
1451						if ( ! this.children ) {
1452							return this.itemsRawData;
1453						}
1454
1455						return this.children;
1456					},
1457
1458					isClose: function() {
1459						let avaliableForLayout = [
1460							'slide-out'
1461						];
1462
1463						return avaliableForLayout.includes( this.$root.menuOptions.menuLayout );
1464					},
1465
1466					isBack: function() {
1467						return this.children || this.templateVisible ? true : false;
1468					},
1469
1470					isBreadcrumbs: function() {
1471						return this.$root.menuOptions.useBreadcrumb && 0 !== this.breadcrumbsData.length ? true : false;
1472					},
1473
1474					breadcrumbsPathData: function() {
1475
1476						if ( 'minimal' === this.$root.$root.menuOptions.breadcrumbPath && 1 < this.breadcrumbsData.length ) {
1477							return this.breadcrumbsData.filter( ( item, index, breadcrumbsData ) => {
1478								return 	index === breadcrumbsData.length - 1;
1479							} );
1480						}
1481
1482						return this.breadcrumbsData;
1483					},
1484
1485					depth: function() {
1486						return this.trail.length;
1487					},
1488
1489					containerPosition: function() {
1490						return this.$root.menuOptions.menuPosition;
1491					},
1492
1493					showAnimation: function() {
1494
1495						let animation = false;
1496
1497						switch( this.$root.menuOptions.menuLayout ) {
1498
1499							case 'slide-out':
1500								animation = 'right' === this.containerPosition ? 'menu-container-left-animation' : 'menu-container-right-animation';
1501								break;
1502
1503							case 'dropdown':
1504								animation = 'menu-container-dropdown-animation';
1505								break;
1506
1507							case 'push':
1508								animation = 'menu-container-expand-animation';
1509								break;
1510						}
1511
1512						return animation;
1513					},
1514
1515					toggleClosedIcon: function() {
1516						return this.$root.refsHtml.toggleClosedIcon || '';
1517					},
1518
1519					toggleOpenedIcon: function() {
1520						return this.$root.refsHtml.toggleOpenedIcon || '';
1521					},
1522
1523					toggleText: function() {
1524						return '' !== this.$root.menuOptions.toggleText ? this.$root.menuOptions.toggleText : false;
1525					},
1526
1527					closeIcon: function() {
1528						return this.$root.refsHtml.closeIcon || '';
1529					},
1530
1531					backIcon: function() {
1532						let backIcon = this.$root.refsHtml.closeIcon || '',
1533						    backText = '' !== this.$root.menuOptions.backText ? '<span>' + this.$root.menuOptions.backText + '</span>' : '',
1534						    backHtml = backIcon + backText;
1535
1536						return backHtml;
1537					},
1538
1539					backText: function() {
1540						return '' !== this.$root.menuOptions.backText ? this.$root.menuOptions.backText : false;
1541					},
1542
1543					breadcrumbIcon: function() {
1544						return this.$root.refsHtml.breadcrumbIcon || '';
1545					},
1546
1547					loaderColor: function() {
1548						return this.$root.menuOptions.loaderColor || '#3a3a3a';
1549					},
1550
1551					toggleLoaderVisible: function() {
1552						return this.$root.menuOptions.toggleLoader && this.instanceLoadStatus && this.menuOpen ? true : false;
1553					},
1554
1555					beforeTemplateVisible: function() {
1556						return this.beforeContent ? true : false;
1557					},
1558
1559					afterTemplateVisible: function() {
1560						return this.afterContent ? true : false;
1561					}
1562
1563				},
1564
1565				methods: {
1566					menuToggle: function() {
1567						this.menuOpen = ! this.menuOpen;
1568					},
1569
1570					closeMenu: function() {
1571						this.menuOpen = false;
1572					},
1573
1574					clearStates: function() {
1575						this.trail = [];
1576						this.children = false;
1577						this.breadcrumbsData = [];
1578						this.templateVisible = false;
1579					},
1580
1581					goBack: function() {
1582
1583						this.animation = 'items-prev-animation';
1584
1585						if ( ! this.templateVisible ) {
1586							this.$delete( this.trail, this.trail.length - 1 );
1587							this.children = this.trail.slice(-1)[0] || false;
1588						} else {
1589							this.templateVisible = false;
1590						}
1591
1592						this.$delete(this.breadcrumbsData, this.breadcrumbsData.length - 1);
1593					},
1594
1595					escapeKeyHandler: function() {
1596
1597						if ( this.isBack ) {
1598							this.goBack();
1599						} else {
1600							this.closeMenu();
1601						}
1602					},
1603
1604					showTemplateContent: function() {
1605						let vueInstance = this;
1606
1607						this.$nextTick( function() {
1608							let $templateContainer = $( vueInstance.$refs['template-content'] ).find( '.jet-mobile-menu__template-content' );
1609
1610							jetMenu.elementorContentRender( $templateContainer );
1611						} );
1612					},
1613
1614					initTemplatesContent: function() {
1615						let vueInstance = this;
1616
1617						this.$nextTick( function() {
1618
1619							if ( vueInstance.headerContent ) {
1620								let $headerContainer = $( vueInstance.$refs['header-template-content'] );
1621
1622								jetMenu.elementorContentRender( $headerContainer );
1623							}
1624
1625							if ( vueInstance.beforeContent ) {
1626								let $beforeContainer = $( vueInstance.$refs['before-template-content'] );
1627
1628								jetMenu.elementorContentRender( $beforeContainer );
1629							}
1630
1631							if ( vueInstance.afterContent ) {
1632								let $afterContainer = $( vueInstance.$refs['after-template-content'] );
1633
1634								jetMenu.elementorContentRender( $afterContainer );
1635							}
1636						} );
1637					},
1638
1639					breadcrumbHandle: function( index ) {
1640
1641						if ( index === this.breadcrumbsData.length ) {
1642							return;
1643						}
1644
1645						if ( 'minimal' === this.$root.menuOptions.breadcrumbPath ) {
1646							this.goBack();
1647
1648							return;
1649						}
1650
1651						this.animation = 'items-prev-animation';
1652						this.trail = this.trail.slice( 0, index );
1653						this.children = this.trail.slice( -1 )[0] || false;
1654						this.templateVisible = false;
1655						this.breadcrumbsData = this.breadcrumbsData.slice( 0, index );
1656					}
1657
1658				}
1659			});
1660		},
1661
1662		loadScriptAsync: function( script, uri ) {
1663
1664			if ( jetMenu.addedScripts.hasOwnProperty( script ) ) {
1665				return script;
1666			}
1667
1668			jetMenu.addedScripts[ script ] = uri;
1669
1670			return new Promise( function( resolve, reject ) {
1671				var tag = document.createElement( 'script' );
1672
1673					tag.src    = uri;
1674					tag.async  = true;
1675					tag.onload = function() {
1676						resolve( script );
1677					};
1678
1679				document.head.appendChild( tag );
1680			} );
1681		},
1682
1683		loadStyle: function( style, uri ) {
1684
1685			if ( jetMenu.addedStyles.hasOwnProperty( style ) && jetMenu.addedStyles[ style ] ===  uri) {
1686				return style;
1687			}
1688
1689			jetMenu.addedStyles[ style ] = uri;
1690
1691			return new Promise( function( resolve, reject ) {
1692				var tag = document.createElement( 'link' );
1693
1694					tag.id      = style;
1695					tag.rel     = 'stylesheet';
1696					tag.href    = uri;
1697					tag.type    = 'text/css';
1698					tag.media   = 'all';
1699					tag.onload  = function() {
1700						resolve( style );
1701					};
1702
1703				document.head.appendChild( tag );
1704			});
1705		},
1706
1707		elementorContentRender: function( $templateContainer, templateContent ) {
1708			let content = templateContent || false;
1709
1710			Promise.all( jetMenu.addedAssetsPromises ).then( function( value ) {
1711
1712				if ( templateContent ) {
1713					$templateContainer.html( templateContent );
1714				}
1715
1716				// Before ajax frontend init
1717				$( window ).trigger( 'jet-menu/ajax/frontend-init/before', {
1718					$container: $templateContainer,
1719					content: content,
1720				} );
1721
1722				jetMenu.elementorFrontendInit( $templateContainer );
1723
1724				// Before ajax frontend init
1725				$( window ).trigger( 'jet-menu/ajax/frontend-init/after', {
1726					$container: $templateContainer,
1727					content: content,
1728				} );
1729			}, function( reason ) {
1730				console.log( 'Script Loaded Error' );
1731			});
1732		},
1733
1734		elementorFrontendInit: function( $templateContainer ) {
1735
1736			$templateContainer.find( 'div[data-element_type]' ).each( function() {
1737				var $this       = $( this ),
1738					elementType = $this.data( 'element_type' );
1739
1740				if ( ! elementType ) {
1741					return;
1742				}
1743
1744				try {
1745					if ( 'widget' === elementType ) {
1746						elementType = $this.data( 'widget_type' );
1747
1748						if ( window.elementorFrontend && window.elementorFrontend.hooks ) {
1749							window.elementorFrontend.hooks.doAction( 'frontend/element_ready/widget', $this, $ );
1750						}
1751					}
1752
1753					if ( window.elementorFrontend && window.elementorFrontend.hooks ) {
1754						window.elementorFrontend.hooks.doAction( 'frontend/element_ready/global', $this, $ );
1755						window.elementorFrontend.hooks.doAction( 'frontend/element_ready/' + elementType, $this, $ );
1756					}
1757
1758				} catch ( err ) {
1759					console.log(err);
1760
1761					$this.remove();
1762
1763					return false;
1764				}
1765			} );
1766		}
1767
1768	};
1769
1770	jetMenu.init();
1771
1772} ( 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.