PageSourceSearch

https://www.925theticket.com/wp-content/plugins/jet-menu/assets/public/js/jet-menu-public-script.js?ver=2.0.9

js 925theticket.com collected 2026-10-04 08:39:36 UTC 43,817 bytes, 1,535 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	window.jetMenu = {
617
618		addedScripts: {},
619
620		addedStyles: {},
621
622		addedAssetsPromises: [],
623
624		initedMobileMenuInstance: [],
625
626		eventBus: new Vue(),
627
628		$body: $( 'body' ),
629
630		init: function() {
631			this.initDesktopMenu();
632			this.mobileVueComponents();
633			this.initMobileMenu();
634		},
635
636		initDesktopMenu: function() {
637			var rollUp                   = false,
638				jetMenuMouseleaveDelay   = 500,
639				jetMenuMegaWidthType     = 'container',
640				jetMenuMegaWidthSelector = '',
641				jetMenuMegaOpenSubType   = 'hover',
642				jetMenuMegaAjax          = false;
643
644			if ( window.jetMenuPublicSettings && window.jetMenuPublicSettings.menuSettings ) {
645				rollUp                   = ( 'true' === jetMenuPublicSettings.menuSettings.jetMenuRollUp ) ? true : false;
646				jetMenuMouseleaveDelay   = jetMenuPublicSettings.menuSettings.jetMenuMouseleaveDelay || 500;
647				jetMenuMegaWidthType     = jetMenuPublicSettings.menuSettings.jetMenuMegaWidthType || 'container';
648				jetMenuMegaWidthSelector = jetMenuPublicSettings.menuSettings.jetMenuMegaWidthSelector || '';
649				jetMenuMegaOpenSubType   = jetMenuPublicSettings.menuSettings.jetMenuMegaOpenSubType || 'hover';
650				jetMenuMegaAjax          = ( 'true' === jetMenuPublicSettings.menuSettings.jetMenuMegaAjax )  ? true : false;
651			}
652
653			$( '.jet-menu-container' ).JetMenuPlugin( {
654				enabled: rollUp,
655				mouseLeaveDelay: +jetMenuMouseleaveDelay,
656				megaWidthType: jetMenuMegaWidthType,
657				megaWidthSelector: jetMenuMegaWidthSelector,
658				openSubType: jetMenuMegaOpenSubType,
659				ajaxLoad: jetMenuMegaAjax,
660			} );
661
662		},
663
664		initMobileMenu: function() {
665
666			let mobileMenuList = $( '.jet-mobile-menu-single' );
667
668			if ( ! mobileMenuList[0] ) {
669				return false;
670			}
671
672			if ( 'true' === window.jetMenuPublicSettings.devMode ) {
673				Vue.config.devtools = true;
674			}
675
676			mobileMenuList.each( function() {
677				let $this          = $( this ),
678					menuInstanceId = $this.attr( 'id' ),
679					menuId         = $this.data( 'menu-id' ) || false,
680					menuOptions    = $this.data( 'menu-options' ) || {};
681
682				jetMenu.createMobileMenuInstance( menuInstanceId, menuId, menuOptions );
683			} );
684		},
685
686		createMobileMenuInstance: function( menuInstanceId, menuId, menuOptions ) {
687
688			if ( jetMenu.initedMobileMenuInstance.includes( menuInstanceId ) ) {
689				return;
690			}
691
692			jetMenu.initedMobileMenuInstance.push( menuInstanceId );
693
694			let mobileMenuInstance = new Vue( {
695				el: '#' + menuInstanceId,
696				data: {
697					'uniqId': menuInstanceId,
698					'menuOptions': menuOptions,
699				}
700			} );
701		},
702
703		mobileVueComponents: function() {
704
705			Vue.component( 'mobile-menu-item', {
706				template: '#mobile-menu-item-template',
707
708				props: {
709					itemDataObject: Object,
710					depth: Number,
711					menuOptions: Object
712				},
713
714				data: function() {
715					return ( {
716						ajaxRequest: null,
717						templateLoadStatus: false,
718						subDropdownVisible: false
719					} )
720				},
721
722				computed: {
723
724					itemClasses: function() {
725						let itemClasses = [
726							'jet-mobile-menu__item',
727							'jet-menu-item-' + this.itemDataObject.itemId,
728							'jet-mobile-menu__item--sub-trigger-' + ( this.menuOptions.subTrigger || 'item' ),
729						];
730
731						let customClasses = this.itemDataObject.classes;
732
733						if ( 0 !== customClasses.length ) {
734							itemClasses = itemClasses.concat( customClasses );
735						}
736
737						if ( window.location.href === this.itemDataObject.url ) {
738							itemClasses.push( 'jet-mobile-menu__item--active' );
739						}
740
741						return itemClasses;
742					},
743
744					itemLinkClasses: function() {
745						let classes = [
746							'mobile-link',
747							0 === this.depth ? 'mobile-top-level-link' : 'mobile-sub-level-link',
748						];
749
750						return classes;
751					},
752
753					isСhildrenDefine: function() {
754						return this.itemDataObject.children ? true : false;
755					},
756
757					isTemplateDefine: function() {
758						return false !== this.itemDataObject.elementorTemplateId ? true : false;
759					},
760
761					isSub: function() {
762						return this.isСhildrenDefine || this.isTemplateDefine ? true : false;
763					},
764
765					isTopLevel: function() {
766						return 0 === this.depth ? true : false;
767					},
768
769					isDropdownLayout: function() {
770						return this.isSub && ! this.isTemplateDefine && 'dropdown' === this.menuOptions.subOpenLayout;
771					},
772
773					depthClass: function() {
774						return 0 === this.depth ? 'mobile-top-level-link' : 'mobile-sub-level-link';
775					},
776
777					dropdownIconHtml: function() {
778						let dropdownIcon = '' !== this.menuOptions.dropdownIcon ? this.menuOptions.dropdownIcon : '<i class="fas fa-angle-right"></i>',
779							dropdownOpenedIcon = '' !== this.menuOptions.dropdownOpenedIcon ? this.menuOptions.dropdownOpenedIcon : '<i class="fas fa-angle-down"></i>';
780
781						if ( this.subDropdownVisible ) {
782							dropdownIcon = dropdownOpenedIcon;
783						}
784
785						return dropdownIcon;
786					},
787
788					itemIconHtml: function() {
789						return this.itemDataObject.itemIcon;
790					},
791
792					isIconVisible: function() {
793						let iconVisible = this.menuOptions['itemIconVisible'] || 'true';
794
795						return 'false' === iconVisible || '' === this.itemDataObject.itemIcon || ! this.itemDataObject.itemIcon ? false : true;
796					},
797
798					isBadgeVisible: function() {
799						let badgeVisible = this.menuOptions['itemBadgeVisible'] || 'true';
800
801						return 'false' === badgeVisible || '' === this.itemDataObject.badgeText || ! this.itemDataObject.badgeText ? false : true;
802					},
803
804					isDescVisible: function() {
805						let descVisible = this.menuOptions['itemDescVisible'] || 'false';
806
807						return 'false' === descVisible || '' === this.itemDataObject.description || ! this.itemDataObject.description ? false : true;
808					},
809
810					loaderColor: function() {
811						return this.menuOptions.loaderColor || '#3a3a3a';
812					},
813				},
814
815				methods: {
816					itemSubHandler: function( event ) {
817						let target     = event.target,
818							mobileLink = $( target ).closest( '.mobile-link' );
819
820						if ( 'item' !== this.menuOptions.subTrigger ) {
821							return;
822						}
823
824						if ( this.isSub && mobileLink ) {
825							event.preventDefault();
826						}
827
828						if ( ! this.isSub && mobileLink && this.menuOptions.closeAfterNavigate ) {
829							jetMenu.eventBus.$emit( 'closeMenu', {
830								menuUniqId: this.menuOptions.menuUniqId,
831							} );
832						}
833
834						this.switchToSub( event );
835					},
836
837					markerSubHandler: function( event ) {
838
839						if ( 'submarker' !== this.menuOptions.subTrigger ) {
840							return;
841						}
842
843						this.switchToSub( event );
844					},
845
846					switchToSub: function( event ) {
847
848						if ( ! this.isSub ) {
849							return;
850						}
851
852						if ( ! this.isTemplateDefine ) {
853
854							if ( this.isDropdownLayout ) {
855								this.subDropdownVisible = !this.subDropdownVisible;
856
857								return;
858							}
859
860							jetMenu.eventBus.$emit( 'itemsSubSwitch', {
861								menuUniqId: this.menuOptions.menuUniqId,
862								id: this.itemDataObject.id,
863								name: this.itemDataObject.name,
864								children: this.itemDataObject.children || false
865							} );
866
867						} else {
868
869							if ( ! this.itemDataObject.elementorContent ) {
870								this.getElementorTemplate();
871							} else {
872
873								jetMenu.eventBus.$emit( 'showTemplateContent', {
874									menuUniqId: this.menuOptions.menuUniqId,
875									id: this.itemDataObject.id,
876									name: this.itemDataObject.name,
877									elementorContent: this.itemDataObject.elementorContent
878								} );
879							}
880						}
881					},
882
883					getElementorTemplate: function() {
884						var vueInstance = this;
885
886						vueInstance.ajaxRequest = $.ajax( {
887							type: 'GET',
888							url: window.jetMenuPublicSettings.templateApiUrl,
889							dataType: 'json',
890							data: {
891								'id': vueInstance.itemDataObject.elementorTemplateId,
892								'dev': window.jetMenuPublicSettings.devMode
893							},
894							beforeSend: function( jqXHR, ajaxSettings ) {
895
896								if ( null !== vueInstance.ajaxRequest ) {
897									vueInstance.ajaxRequest.abort();
898								}
899
900								vueInstance.templateLoadStatus = true;
901
902								jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
903							},
904							success: function( responce, textStatus, jqXHR ) {
905								var templateContent   = responce['template_content'],
906									templateScripts   = responce['template_scripts'],
907									templateStyles    = responce['template_styles'];
908
909								for ( var scriptHandler in templateScripts ) {
910									jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) );
911								}
912
913								for ( var styleHandler in templateStyles ) {
914									jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) );
915								}
916
917								vueInstance.templateLoadStatus = false;
918
919								vueInstance.itemDataObject.elementorContent = templateContent;
920
921								jetMenu.eventBus.$emit( 'showTemplateContent', {
922									menuUniqId: vueInstance.menuOptions.menuUniqId,
923									id: vueInstance.itemDataObject.id,
924									name: vueInstance.itemDataObject.name,
925									elementorContent: vueInstance.itemDataObject.elementorContent
926								} );
927							}
928						} );
929					}
930				}
931
932			});
933
934			Vue.component( 'mobile-menu-list', {
935				template: '#mobile-menu-list-template',
936
937				props: {
938					depth: Number,
939					childrenObject: Object,
940					menuOptions: Object
941				}
942
943			});
944
945			Vue.component( 'mobile-menu', {
946				template: '#mobile-menu-template',
947
948				props: {
949					menuOptions: {
950						type: Object,
951						default: {}
952					},
953				},
954
955				data: function() {
956					return ( {
957						menuOpen: false,
958						children: false,
959						itemsRawData: {},
960						trail:[],
961						breadcrumbsData:[],
962						animation: 'items-next-animation',
963						ajaxRequest: null,
964						templateVisible: false,
965						instanceLoadStatus: false,
966						itemTemplateContent: false,
967
968						headerTemplate: this.menuOptions['headerTemplate'] || 0,
969						headerContent: false,
970						headerTemplateVisible: false,
971						beforeTemplate: this.menuOptions['beforeTemplate'] || 0,
972						beforeContent: false,
973						afterTemplate: this.menuOptions['afterTemplate'] || 0,
974						afterContent: false,
975
976						ajaxPromises: []
977					} )
978				},
979
980				mounted: function() {
981					let vueInstance = this;
982
983					if ( this.menuOpen ) {
984						jetMenu.$body.addClass( 'jet-mobile-menu-visible' );
985
986						if ( 'slide-out' === this.menuOptions.menuLayout ) {
987							jetMenu.$body.addClass( 'jet-menu-body-blocker' );
988						}
989					}
990
991					this.ajaxPromises.push(
992						new Promise( function( resolve, reject ) {
993							$.ajax( {
994								type: 'GET',
995								url: window.jetMenuPublicSettings.menuItemsApiUrl,
996								dataType: 'json',
997								data: {
998									'menu_id': vueInstance.menuId,
999									'dev': window.jetMenuPublicSettings.devMode,
1000									'lang': window.jetMenuPublicSettings.wpmlLanguageCode || false
1001								},
1002								beforeSend: function( jqXHR, ajaxSettings ) {
1003									jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
1004								},
1005								success: function( responce, textStatus, jqXHR ) {
1006									let responceData = responce.data.items;
1007
1008									vueInstance.itemsRawData = responceData;
1009
1010									resolve();
1011								}
1012							} );
1013						} )
1014					);
1015
1016					if ( 0 !== +this.headerTemplate ) {
1017						this.ajaxPromises.push(
1018							new Promise( function( resolve, reject ) {
1019								$.ajax( {
1020									type: 'GET',
1021									url: window.jetMenuPublicSettings.templateApiUrl,
1022									dataType: 'json',
1023									data: {
1024										'id': vueInstance.headerTemplate,
1025										'dev': window.jetMenuPublicSettings.devMode
1026									},
1027									beforeSend: function( jqXHR, ajaxSettings ) {
1028										jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
1029									},
1030									success: function( responce, textStatus, jqXHR ) {
1031										let templateContent = responce['template_content'],
1032											templateScripts = responce['template_scripts'],
1033											templateStyles  = responce['template_styles'];
1034
1035										for ( let scriptHandler in templateScripts ) {
1036											jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) );
1037										}
1038
1039										for ( let styleHandler in templateStyles ) {
1040											jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) );
1041										}
1042
1043										vueInstance.headerContent = templateContent;
1044										vueInstance.headerTemplateVisible = true;
1045
1046										resolve();
1047									}
1048								} );
1049							} )
1050						);
1051					}
1052
1053					if ( 0 !== +this.beforeTemplate ) {
1054						this.ajaxPromises.push(
1055							new Promise( function( resolve, reject ) {
1056								$.ajax( {
1057									type: 'GET',
1058									url: window.jetMenuPublicSettings.templateApiUrl,
1059									dataType: 'json',
1060									data: {
1061										'id': vueInstance.beforeTemplate,
1062										'dev': window.jetMenuPublicSettings.devMode
1063									},
1064									beforeSend: function( jqXHR, ajaxSettings ) {
1065										jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
1066									},
1067									success: function( responce, textStatus, jqXHR ) {
1068										let templateContent = responce['template_content'],
1069											templateScripts = responce['template_scripts'],
1070											templateStyles  = responce['template_styles'];
1071
1072										for ( let scriptHandler in templateScripts ) {
1073											jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) );
1074										}
1075
1076										for ( let styleHandler in templateStyles ) {
1077											jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) );
1078										}
1079
1080										vueInstance.beforeContent = templateContent;
1081
1082										resolve();
1083									}
1084								} );
1085							} )
1086						);
1087					}
1088
1089					if ( 0 !== +this.afterTemplate ) {
1090						this.ajaxPromises.push(
1091							new Promise( function( resolve, reject ) {
1092								$.ajax( {
1093									type: 'GET',
1094									url: window.jetMenuPublicSettings.templateApiUrl,
1095									dataType: 'json',
1096									data: {
1097										'id': vueInstance.afterTemplate,
1098										'dev': window.jetMenuPublicSettings.devMode
1099									},
1100									beforeSend: function( jqXHR, ajaxSettings ) {
1101										jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce );
1102									},
1103									success: function( responce, textStatus, jqXHR ) {
1104										let templateContent = responce['template_content'],
1105											templateScripts = responce['template_scripts'],
1106											templateStyles  = responce['template_styles'];
1107
1108										for ( let scriptHandler in templateScripts ) {
1109											jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) );
1110										}
1111
1112										for ( let styleHandler in templateStyles ) {
1113											jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) );
1114										}
1115
1116										vueInstance.afterContent = templateContent;
1117										resolve();
1118									}
1119								} );
1120							} )
1121						);
1122					}
1123
1124					this.instanceLoadStatus = true;
1125
1126					Promise.all( this.ajaxPromises ).then( function() {
1127						vueInstance.instanceLoadStatus = false;
1128					}, function( reason ) {
1129						console.log( 'Script Loaded Error' );
1130					} );
1131
1132					jetMenu.eventBus.$on( 'itemsSubSwitch', function ( payLoad ) {
1133
1134						if ( vueInstance.menuOptions.menuUniqId !== payLoad.menuUniqId ) {
1135							return;
1136						}
1137
1138						vueInstance.trail.push( payLoad.children );
1139						vueInstance.children = payLoad.children;
1140						vueInstance.breadcrumbsData.push( payLoad.name );
1141						vueInstance.animation = 'items-next-animation';
1142					} );
1143
1144					jetMenu.eventBus.$on( 'showTemplateContent', function ( payLoad ) {
1145
1146						if ( vueInstance.menuOptions.menuUniqId !== payLoad.menuUniqId ) {
1147							return;
1148						}
1149
1150						vueInstance.itemTemplateContent = payLoad.elementorContent;
1151						vueInstance.templateVisible = true;
1152						vueInstance.breadcrumbsData.push( payLoad.name );
1153						vueInstance.animation = 'items-next-animation';
1154
1155						vueInstance.showTemplateContent();
1156					} );
1157
1158					jetMenu.eventBus.$on( 'closeMenu', function( payLoad ) {
1159
1160						if ( vueInstance.menuOptions.menuUniqId !== payLoad.menuUniqId ) {
1161							return;
1162						}
1163
1164						vueInstance.closeMenu();
1165					} );
1166
1167				},
1168
1169				watch: {
1170					menuOpen: function( curr, prev ) {
1171
1172						if ( curr ) {
1173							jetMenu.$body.addClass( 'jet-mobile-menu-visible' );
1174
1175							if ( 'slide-out' === this.menuOptions.menuLayout ) {
1176								jetMenu.$body.addClass( 'jet-menu-body-blocker' );
1177							}
1178
1179							this.initTemplatesContent();
1180						}
1181
1182						if ( ! curr ) {
1183							jetMenu.$body.removeClass( 'jet-mobile-menu-visible' );
1184
1185							if ( 'slide-out' === this.menuOptions.menuLayout ) {
1186								jetMenu.$body.removeClass( 'jet-menu-body-blocker' );
1187							}
1188
1189							this.clearStates();
1190						}
1191					}
1192				},
1193
1194				computed: {
1195					instanceClass: function() {
1196						let classes = [
1197							'jet-mobile-menu__instance',
1198							'jet-mobile-menu__instance--' + this.menuOptions.menuLayout + '-layout',
1199							this.menuOptions.menuPosition + '-container-position',
1200							( this.menuOptions.togglePosition || 'default' ) + '-toggle-position',
1201						];
1202
1203						return classes;
1204					},
1205
1206					menuContainerVisible: function() {
1207						return this.menuOpen && !this.instanceLoadStatus;
1208					},
1209
1210					menuId: function() {
1211
1212						if ( this.menuOptions.mobileMenuId ) {
1213							return this.menuOptions.mobileMenuId;
1214						}
1215
1216						return this.menuOptions.menuId;
1217					},
1218
1219					coverVisible: function() {
1220
1221						let avaliableForLayout = [
1222							'slide-out'
1223						];
1224
1225						return avaliableForLayout.includes( this.menuOptions.menuLayout );
1226					},
1227
1228					itemsList: function() {
1229
1230						if ( ! this.children ) {
1231							return this.itemsRawData;
1232						}
1233
1234						return this.children;
1235					},
1236
1237					isClose: function() {
1238						let avaliableForLayout = [
1239							'slide-out'
1240						];
1241
1242						return avaliableForLayout.includes( this.menuOptions.menuLayout );
1243					},
1244
1245					isBack: function() {
1246						return this.children || this.templateVisible ? true : false;
1247					},
1248
1249					isBreadcrumbs: function() {
1250						return this.menuOptions.useBreadcrumb && 0 !== this.breadcrumbsData.length ? true : false;
1251					},
1252
1253					depth: function() {
1254						return this.trail.length;
1255					},
1256
1257					containerPosition: function() {
1258						return this.menuOptions['menuPosition'];
1259					},
1260
1261					showAnimation: function() {
1262
1263						let animation = false;
1264
1265						switch( this.menuOptions.menuLayout ) {
1266
1267							case 'slide-out':
1268								animation = 'right' === this.containerPosition ? 'menu-container-left-animation' : 'menu-container-right-animation';
1269								break;
1270
1271							case 'dropdown':
1272								animation = 'menu-container-dropdown-animation';
1273								break;
1274
1275							case 'push':
1276								animation = 'menu-container-expand-animation';
1277								break;
1278						}
1279
1280						return animation;
1281					},
1282
1283					toggleClosedIcon: function() {
1284						return '' !== this.menuOptions.toggleClosedIcon ? this.menuOptions.toggleClosedIcon : '<i class="fas fa-bars"></i>';
1285					},
1286
1287					toggleOpenedIcon: function() {
1288						return '' !== this.menuOptions.toggleOpenedIcon ? this.menuOptions.toggleOpenedIcon : '<i class="fas fa-times"></i>';
1289					},
1290
1291					toggleText: function() {
1292						return '' !== this.menuOptions.toggleText ? this.menuOptions.toggleText : false;
1293					},
1294
1295					closeIcon: function() {
1296						return '' !== this.menuOptions.closeIcon ? this.menuOptions.closeIcon : '<i class="fas fa-times"></i>';
1297					},
1298
1299					backIcon: function() {
1300						let backIcon = '' !== this.menuOptions.backIcon ? this.menuOptions.backIcon : '<i class="fas fa-arrow-left"></i>',
1301							backText = '' !== this.menuOptions.backText ? '<span>' + this.menuOptions.backText + '</span>' : '',
1302							backHtml = backIcon + backText;
1303
1304						return backHtml;
1305					},
1306
1307					backText: function() {
1308						return '' !== this.menuOptions.backText ? this.menuOptions.backText : false;
1309					},
1310
1311					breadcrumbIcon: function() {
1312						return '' !== this.menuOptions.breadcrumbIcon ? this.menuOptions.breadcrumbIcon : '<i class="fas fa-angle-rightt"></i>';
1313					},
1314
1315					loaderColor: function() {
1316						return this.menuOptions.loaderColor || '#3a3a3a';
1317					},
1318
1319					toggleLoaderVisible: function() {
1320						return this.menuOptions.toggleLoader && this.instanceLoadStatus && this.menuOpen ? true : false;
1321					},
1322
1323					beforeTemplateVisible: function() {
1324						return this.beforeContent ? true : false;
1325					},
1326
1327					afterTemplateVisible: function() {
1328						return this.afterContent ? true : false;
1329					}
1330
1331				},
1332
1333				methods: {
1334					menuToggle: function() {
1335						this.menuOpen = ! this.menuOpen;
1336					},
1337
1338					closeMenu: function() {
1339						this.menuOpen = false;
1340					},
1341
1342					clearStates: function() {
1343						this.trail = [];
1344						this.children = false;
1345						this.breadcrumbsData = [];
1346						this.templateVisible = false;
1347					},
1348
1349					goBack: function() {
1350
1351						this.animation = 'items-prev-animation';
1352
1353						if ( ! this.templateVisible ) {
1354							this.$delete( this.trail, this.trail.length - 1 );
1355							this.children = this.trail.slice(-1)[0] || false;
1356						} else {
1357							this.templateVisible = false;
1358						}
1359
1360						this.$delete(this.breadcrumbsData, this.breadcrumbsData.length - 1);
1361					},
1362
1363					escapeKeyHandler: function() {
1364
1365						if ( this.isBack ) {
1366							this.goBack();
1367						} else {
1368							this.closeMenu();
1369						}
1370					},
1371
1372					showTemplateContent: function() {
1373						let vueInstance = this;
1374
1375						this.$nextTick( function() {
1376							let $templateContainer = $( vueInstance.$refs['template-content'] ).find( '.jet-mobile-menu__template-content' );
1377
1378							jetMenu.elementorContentRender( $templateContainer );
1379						} );
1380					},
1381
1382					initTemplatesContent: function() {
1383						let vueInstance = this;
1384
1385						this.$nextTick( function() {
1386
1387							if ( vueInstance.headerContent ) {
1388								let $headerContainer = $( vueInstance.$refs['header-template-content'] );
1389
1390								jetMenu.elementorContentRender( $headerContainer );
1391							}
1392
1393							if ( vueInstance.beforeContent ) {
1394								let $beforeContainer = $( vueInstance.$refs['before-template-content'] );
1395
1396								jetMenu.elementorContentRender( $beforeContainer );
1397							}
1398
1399							if ( vueInstance.afterContent ) {
1400								let $afterContainer = $( vueInstance.$refs['after-template-content'] );
1401
1402								jetMenu.elementorContentRender( $afterContainer );
1403							}
1404						} );
1405					},
1406
1407					breadcrumbHandle: function( index ) {
1408
1409						if ( index === this.breadcrumbsData.length ) {
1410							return;
1411						}
1412
1413						this.animation = 'items-prev-animation';
1414
1415						this.trail = this.trail.slice( 0, index );
1416						this.children = this.trail.slice( -1 )[0] || false;
1417						this.templateVisible = false;
1418						this.breadcrumbsData = this.breadcrumbsData.slice( 0, index );
1419					}
1420
1421				}
1422			});
1423		},
1424
1425		loadScriptAsync: function( script, uri ) {
1426
1427			if ( jetMenu.addedScripts.hasOwnProperty( script ) ) {
1428				return script;
1429			}
1430
1431			jetMenu.addedScripts[ script ] = uri;
1432
1433			return new Promise( function( resolve, reject ) {
1434				var tag = document.createElement( 'script' );
1435
1436					tag.src    = uri;
1437					tag.async  = true;
1438					tag.onload = function() {
1439						resolve( script );
1440					};
1441
1442				document.head.appendChild( tag );
1443			} );
1444		},
1445
1446		loadStyle: function( style, uri ) {
1447
1448			if ( jetMenu.addedStyles.hasOwnProperty( style ) && jetMenu.addedStyles[ style ] ===  uri) {
1449				return style;
1450			}
1451
1452			jetMenu.addedStyles[ style ] = uri;
1453
1454			return new Promise( function( resolve, reject ) {
1455				var tag = document.createElement( 'link' );
1456
1457					tag.id      = style;
1458					tag.rel     = 'stylesheet';
1459					tag.href    = uri;
1460					tag.type    = 'text/css';
1461					tag.media   = 'all';
1462					tag.onload  = function() {
1463						resolve( style );
1464					};
1465
1466				document.head.appendChild( tag );
1467			});
1468		},
1469
1470		elementorContentRender: function( $templateContainer, templateContent ) {
1471			let content = templateContent || false;
1472
1473			Promise.all( jetMenu.addedAssetsPromises ).then( function( value ) {
1474
1475				if ( templateContent ) {
1476					$templateContainer.html( templateContent );
1477				}
1478
1479				// Before ajax frontend init
1480				$( window ).trigger( 'jet-menu/ajax/frontend-init/before', {
1481					$container: $templateContainer,
1482					content: content,
1483				} );
1484
1485				jetMenu.elementorFrontendInit( $templateContainer );
1486
1487				// Before ajax frontend init
1488				$( window ).trigger( 'jet-menu/ajax/frontend-init/after', {
1489					$container: $templateContainer,
1490					content: content,
1491				} );
1492			}, function( reason ) {
1493				console.log( 'Script Loaded Error' );
1494			});
1495		},
1496
1497		elementorFrontendInit: function( $templateContainer ) {
1498
1499			$templateContainer.find( 'div[data-element_type]' ).each( function() {
1500				var $this       = $( this ),
1501					elementType = $this.data( 'element_type' );
1502
1503				if ( ! elementType ) {
1504					return;
1505				}
1506
1507				try {
1508					if ( 'widget' === elementType ) {
1509						elementType = $this.data( 'widget_type' );
1510
1511						if ( window.elementorFrontend && window.elementorFrontend.hooks ) {
1512							window.elementorFrontend.hooks.doAction( 'frontend/element_ready/widget', $this, $ );
1513						}
1514					}
1515
1516					if ( window.elementorFrontend && window.elementorFrontend.hooks ) {
1517						window.elementorFrontend.hooks.doAction( 'frontend/element_ready/global', $this, $ );
1518						window.elementorFrontend.hooks.doAction( 'frontend/element_ready/' + elementType, $this, $ );
1519					}
1520
1521				} catch ( err ) {
1522					console.log(err);
1523
1524					$this.remove();
1525
1526					return false;
1527				}
1528			} );
1529		}
1530
1531	};
1532
1533	jetMenu.init();
1534
1535} ( 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.