PageSourceSearch

https://www.crownpersonnel.com/wp-content/plugins/jet-tricks/assets/js/jet-tricks-frontend.js?ver=1.4.9

js crownpersonnel.com collected 2026-09-30 18:53:52 UTC 30,323 bytes, 1,034 lines download raw bytes

1( function( $, elementor ) {
2
3	'use strict';
4
5	var JetTricks = {
6
7		init: function() {
8			elementor.hooks.addAction( 'frontend/element_ready/section', JetTricks.elementorSection );
9			elementor.hooks.addAction( 'frontend/element_ready/container', JetTricks.elementorSection );
10			elementor.hooks.addAction( 'frontend/element_ready/container', JetTricks.elementorColumn );
11			elementor.hooks.addAction( 'frontend/element_ready/column', JetTricks.elementorColumn );
12			elementor.hooks.addAction( 'frontend/element_ready/widget', JetTricks.elementorWidget );
13
14			var widgets = {
15				'jet-view-more.default' : JetTricks.widgetViewMore,
16				'jet-unfold.default' : JetTricks.widgetUnfold,
17				'jet-hotspots.default' : JetTricks.widgetHotspots
18			};
19
20			$.each( widgets, function( widget, callback ) {
21				elementor.hooks.addAction( 'frontend/element_ready/' + widget, callback );
22			});
23
24			// Re-init widgets in nested tabs
25			window.elementorFrontend.elements.$window.on(
26				'elementor/nested-tabs/activate',
27				( event, content ) => {
28
29					const $content = $( content );
30
31					var $button  = $content.find( '.jet-unfold__button');
32
33					$button.off('click.jetUnfold');
34
35					JetTricks.initWidgetsHandlers( $content );
36					JetTricks.elementorSection( $content );
37
38				}
39			);
40
41			// Add an action when the Swiper Loop Carousel widget is ready on the frontend
42			elementorFrontend.hooks.addAction('frontend/element_ready/loop-carousel.post', function($scope, $) {
43
44				$(window).on('load', function() {
45
46					var loopCarousel = $scope.find('.swiper'),
47					swiperInstance = loopCarousel.data( 'swiper' ),
48					$button  = $scope.find( '.jet-unfold__button');
49
50					if( swiperInstance && $button ) {
51
52						swiperInstance.on('slideChange', function () {
53							$button.off('click.jetUnfold');
54							JetTricks.initLoopCarouselHandlers( $scope );
55						});
56					}
57				});	
58			});
59		},
60
61		initLoopCarouselHandlers: function( $selector ) {
62			$selector.find( '.elementor-widget-jet-unfold' ).each( function() {
63
64				var $this  = $( this ),
65
66				elementType = $this.data( 'element_type' );
67
68				if ( !elementType ) {
69					return;
70				}
71
72				if ( 'widget' === elementType ) {
73					elementType = $this.data( 'widget_type' );
74					window.elementorFrontend.hooks.doAction( 'frontend/element_ready/widget', $this, $ );
75				}
76
77				window.elementorFrontend.hooks.doAction( 'frontend/element_ready/global', $this, $ );
78				window.elementorFrontend.hooks.doAction( 'frontend/element_ready/' + elementType, $this, $ );
79
80
81			} );
82		},
83
84		initWidgetsHandlers: function( $selector ) {
85
86				$selector.find( '[data-element_type]' ).each( function() {
87
88					var $this  = $( this ),
89
90					elementType = $this.data( 'element_type' );
91
92					if ( !elementType ) {
93						return;
94					}
95
96					if ( 'widget' === elementType ) {
97						elementType = $this.data( 'widget_type' );
98						window.elementorFrontend.hooks.doAction( 'frontend/element_ready/widget', $this, $ );
99					}
100
101					window.elementorFrontend.hooks.doAction( 'frontend/element_ready/global', $this, $ );
102					window.elementorFrontend.hooks.doAction( 'frontend/element_ready/' + elementType, $this, $ );
103
104
105				} );
106		},
107
108		elementorSection: function( $scope ) {
109			var $target        = $scope,
110				sectionId      = $scope.data( 'id' ),
111				editMode       = Boolean( elementor.isEditMode() ),
112				jetListing     = $target.parents( '.elementor-widget-jet-listing-grid' ).data( 'id' ),
113				settings       = {};
114
115			if ( window.JetTricksSettings && window.JetTricksSettings.elements_data.sections.hasOwnProperty( sectionId ) ) {
116				settings = window.JetTricksSettings.elements_data.sections[ sectionId ];
117			}
118
119			if ( editMode ) {
120				settings = JetTricks.sectionEditorSettings( $scope );
121			}
122
123			if ( ! settings ) {
124				return false;
125			}
126
127			if ( jQuery.isEmptyObject( settings ) ) {
128				return false;
129			}
130
131			if ( 'false' === settings.particles || '' === settings.particles_json ) {
132				return false;
133			}
134
135			// Compatibility jet tricks particles with jet listing
136
137			if ( jetListing && $target.parent().data( 'elementor-type' ) === 'jet-listing-items' ){
138				sectionId += jetListing + $target.parents( '.jet-listing-grid__item' ).data( 'post-id' );
139			} 
140
141			var particlesId   = 'jet-tricks-particles-instance-' + sectionId,
142				particlesJson = JSON.parse( settings.particles_json );
143
144			$scope.prepend( '<div id="' + particlesId + '" class="jet-tricks-particles-section__instance"></div>' );
145
146			tsParticles.load( particlesId, particlesJson );
147
148		},
149
150		elementorColumn: function( $scope ) {
151			var $target  = $scope,
152				$parentSection = $scope.closest( '.elementor-section' ),
153				isLegacyModeActive = !!$target.find( '> .elementor-column-wrap' ).length,
154				$window  = $( window ),
155				columnId = $target.data( 'id' ),
156				editMode = Boolean( elementor.isEditMode() ),
157				settings = {},
158				stickyInstance = null,
159				stickyInstanceOptions = {
160					topSpacing: 50,
161					bottomSpacing: 50,
162					containerSelector: isLegacyModeActive ? '.elementor-row' : '.elementor-container, .e-con-inner',
163					innerWrapperSelector: isLegacyModeActive ? '.elementor-column-wrap' : '.elementor-widget-wrap',
164				},
165				$observerTarget = $target.find('.elementor-element');
166
167			if ( ! editMode ) {
168				settings = $target.data( 'jet-settings' );
169
170				if ( $target.hasClass( 'jet-sticky-column' ) ) {
171
172					if ( -1 !== settings['stickyOn'].indexOf( elementorFrontend.getCurrentDeviceMode() ) ) {
173
174						$target.each( function() {
175
176							var $this  = $( this ),
177
178							elementType = $this.data( 'element_type' );
179
180							if ( elementType !== 'container' ){
181
182								stickyInstanceOptions.topSpacing = settings['topSpacing'];
183								stickyInstanceOptions.bottomSpacing = settings['bottomSpacing'];
184
185								imagesLoaded( $parentSection, function() {
186									$target.data( 'stickyColumnInit', true );
187									stickyInstance = new StickySidebar( $target[0], stickyInstanceOptions );
188								} );
189
190								var targetMutation = $target[0],
191									config         = { attributes: true, childList: true, subtree: true };
192
193								var callbackMutation = function( mutationsList, observer ) {
194									for( var mutation of mutationsList ) {
195										if ( 'attributes' === mutation.type ) {
196											$target[0].style.height = 'auto';
197										}
198									}
199								};
200
201								var observer = new MutationObserver( callbackMutation );
202								observer.observe( targetMutation, config );
203
204								$window.on( 'resize.JetTricksStickyColumn orientationchange.JetTricksStickyColumn', JetTricksTools.debounce( 50, resizeDebounce ) );
205
206								MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
207
208								var observer = new MutationObserver( function( mutations ) {
209									if ( stickyInstance ) {
210										mutations.forEach( function(mutation){
211											if (mutation.attributeName === 'class') {
212												setTimeout( function() {
213													stickyInstance.destroy();
214													stickyInstance = new StickySidebar( $target[0], stickyInstanceOptions );
215												}, 100 );
216											}
217										} )
218									}
219								} );
220
221								$observerTarget.each( function(){
222									observer.observe( $( this )[0], {
223										// subtree: true,
224										// childList: true,
225										attributes: true
226									} );
227								} )
228							
229							} else{
230								$('body').addClass('jet-sticky-container');
231								$this.addClass( 'jet-sticky-container-sticky' );
232								$this.css({ 
233									'top': settings['topSpacing'], 
234									'bottom': settings['bottomSpacing']
235								});
236							}
237
238						});
239					}
240				}
241
242			} else {
243
244				return false;
245
246				// settings = JetTricks.columnEditorSettings( columnId );
247
248				// if ( 'true' === settings['sticky'] ) {
249				// 	$target.addClass( 'jet-sticky-column' );
250
251				// 	if ( -1 !== settings['stickyOn'].indexOf( elementorFrontend.getCurrentDeviceMode() ) ) {
252				// 		stickyInstanceOptions.topSpacing = settings['topSpacing'];
253				// 		stickyInstanceOptions.bottomSpacing = settings['bottomSpacing'];
254
255				// 		$target.data( 'stickyColumnInit', true );
256				// 		stickyInstance = new StickySidebar( $target[0], stickyInstanceOptions );
257
258				// 		$window.on( 'resize.JetTricksStickyColumn orientationchange.JetTricksStickyColumn', JetTricksTools.debounce( 50, resizeDebounce ) );
259				// 	}
260				// }
261			}
262
263			function resizeDebounce() {
264				var currentDeviceMode = elementorFrontend.getCurrentDeviceMode(),
265					availableDevices  = settings['stickyOn'] || [],
266					isInit            = $target.data( 'stickyColumnInit' );
267
268				if ( -1 !== availableDevices.indexOf( currentDeviceMode ) ) {
269
270					if ( ! isInit ) {
271						$target.data( 'stickyColumnInit', true );
272						stickyInstance = new StickySidebar( $target[0], stickyInstanceOptions );
273						stickyInstance.updateSticky();
274					}
275				} else {
276					$target.data( 'stickyColumnInit', false );
277					stickyInstance.destroy();
278				}
279			}
280
281		},
282
283		elementorWidget: function( $scope ) {
284			var parallaxInstance = null,
285				satelliteInstance = null,
286				tooltipInstance = null;
287
288			parallaxInstance = new jetWidgetParallax( $scope );
289			parallaxInstance.init();
290
291			satelliteInstance = new jetWidgetSatellite( $scope );
292			satelliteInstance.init();
293
294			tooltipInstance = new jetWidgetTooltip( $scope );
295			tooltipInstance.init();
296
297		},
298
299		getElementorElementSettings: function( $scope ) {
300
301			if ( window.elementorFrontend && window.elementorFrontend.isEditMode() && $scope.hasClass( 'elementor-element-edit-mode' ) ) {
302				return JetTricks.getEditorElementSettings( $scope );
303			}
304
305			return $scope.data( 'settings' ) || {};
306		},
307
308		getEditorElementSettings: function( $scope ) {
309			var modelCID = $scope.data( 'model-cid' ),
310				elementData;
311
312			if ( ! modelCID ) {
313				return {};
314			}
315
316			if ( ! elementor.hasOwnProperty( 'config' ) ) {
317				return {};
318			}
319
320			if ( ! elementor.config.hasOwnProperty( 'elements' ) ) {
321				return {};
322			}
323
324			if ( ! elementor.config.elements.hasOwnProperty( 'data' ) ) {
325				return {};
326			}
327
328			elementData = elementor.config.elements.data[ modelCID ];
329
330			if ( ! elementData ) {
331				return {};
332			}
333
334			return elementData.toJSON();
335		},
336
337		widgetViewMore: function( $scope ) {
338			var $target         = $scope.find( '.jet-view-more' ),
339				instance        = null,
340				settings        = $target.data( 'settings' );
341
342			instance = new jetViewMore( $target, settings );
343			instance.init();
344		},
345
346		widgetUnfold: function( $scope ) {
347			var $target                = $scope.find( '.jet-unfold' ),
348				$button                = $( '.jet-unfold__button', $target ),
349				$mask                  = $( '.jet-unfold__mask', $target ),
350				$content               = $( '.jet-unfold__content', $target ),
351				$contentInner          = $( '.jet-unfold__content-inner', $target),
352				$trigger               = $( '.jet-unfold__trigger', $target),
353				$separator             = $( '.jet-unfold__separator', $target ),
354				settings               = $.extend( {}, $target.data( 'settings' ), JetTricks.getElementorElementSettings( $scope ) ),
355				maskBreakpointsHeights = [],
356				prevBreakpoint         = '',
357				unfoldDuration         = settings['unfoldDuration'] || settings['unfold_duration'],
358				foldDuration           = settings['foldDuration'] || settings['fold_duration'],
359				unfoldEasing           = settings['unfoldEasing'] || settings['unfold_easing'],
360				foldEasing             = settings['foldEasing'] || settings['fold_easing'],
361				maskHeightAdv          = 20,
362				heightCalc             = '',
363				autoHide               = settings['autoHide'] || false,
364				autoHideTime           = settings['autoHideTime'] && 0 != settings['autoHideTime']['size'] ? settings['autoHideTime']['size'] : 5,
365				hideOutsideClick       = settings['hideOutsideClick'] || false,
366				autoHideTrigger,
367				activeBreakpoints      = elementor.config.responsive.activeBreakpoints;
368
369			maskBreakpointsHeights['desktop']    = [];
370			maskBreakpointsHeights['widescreen'] = [];
371
372			maskBreakpointsHeights['desktop']['maskHeight'] = '' != settings['mask_height']['size'] ? settings['mask_height']['size'] : 50;
373
374			prevBreakpoint = 'desktop';
375
376			Object.keys(  activeBreakpoints ).reverse().forEach(  function( breakpointName ) {
377
378				if ( 'widescreen' === breakpointName ) {
379					maskBreakpointsHeights['widescreen']['maskHeight'] = '' != settings['mask_height_widescreen']['size'] ? settings['mask_height_widescreen']['size'] : maskBreakpointsHeights['desktop']['maskHeight'];
380				} else {
381					maskBreakpointsHeights[breakpointName] = [];
382
383					maskBreakpointsHeights[breakpointName]['maskHeight'] = '' != settings['mask_height_' + breakpointName]['size'] ? settings['mask_height_' + breakpointName]['size'] : maskBreakpointsHeights[prevBreakpoint]['maskHeight'];
384
385					prevBreakpoint = breakpointName;
386				}
387			} );
388
389			onLoaded();
390
391			if ( 'true' === hideOutsideClick ) {
392				$( window ).on( 'mouseup', function( event ) {
393					let container = $target;
394					if ( !container.is( event.target ) && 0 === container.has( event.target ).length && $target.hasClass( 'jet-unfold-state' ) ) {
395						$button.trigger( 'click' );
396					}
397				} )
398			}
399
400			$target.one('transitionend webkitTransitionEnd oTransitionEnd', onLoaded );
401
402			function onLoaded() {
403				var deviceHeight = getDeviceHeight();
404
405				heightCalc = +deviceHeight + maskHeightAdv;
406
407				if ( heightCalc < $contentInner.height() ) {
408
409					if ( ! $target.hasClass( 'jet-unfold-state' ) ) {
410						$separator.css( {
411							'opacity': '1'
412						} );
413					}
414
415					if ( ! $target.hasClass( 'jet-unfold-state' ) ) {
416						$mask.css( {
417							'height': deviceHeight
418						} );
419					} else {
420						$mask.css( {
421							'height': $contentInner.outerHeight()
422						} );
423					}
424					$trigger.css( 'display', 'flex' );
425				} else {
426					$trigger.hide();
427					$mask.css( {
428						'height': '100%'
429					} );
430					$content.css( {
431						'max-height': 'none'
432					} );
433					$separator.css( {
434						'opacity': '0'
435					} );
436				}
437			}
438
439			$( window ).on( 'resize.jetWidgetUnfold orientationchange.jetWidgetUnfold', JetTricksTools.debounce( 50, function(){
440				onLoaded();
441			} ) );
442
443			$button.keypress( function( e ) {
444				if ( e.which == 13 ) {
445					$button.click();
446					return false;
447				}
448			} );
449
450			$button.on( 'click.jetUnfold', function(e) {
451				var $this         = $( this ),
452					$buttonText   = $( '.jet-unfold__button-text', $this ),
453					unfoldText    = $this.data( 'unfold-text' ),
454					foldText      = $this.data( 'fold-text' ),
455					$buttonIcon   = $( '.jet-unfold__button-icon', $this ),
456					unfoldIcon    = $this.data( 'unfold-icon' ),
457					foldIcon      = $this.data( 'fold-icon' ),
458					contentHeight = $contentInner.outerHeight(),
459					deviceHeight  = getDeviceHeight();
460
461				e.preventDefault();
462
463				if ( ! $target.hasClass( 'jet-unfold-state' ) ) {
464					$target.addClass( 'jet-unfold-state' );
465
466					$separator.css( {
467						'opacity': '0'
468					} );
469
470					$buttonIcon.html( foldIcon );
471					$buttonText.html( foldText );
472
473					anime( {
474						targets: $mask[0],
475						height: contentHeight,
476						duration: unfoldDuration['size'],
477						easing: unfoldEasing,
478						complete: function( anim ) {
479							// Recalculate listing masonry.
480							$( document ).trigger( 'jet-engine/listing/recalculate-masonry' );
481						}
482					} );
483
484					if ( 'true' === autoHide ) {
485						autoHideTrigger = setTimeout( function() {
486							$button.trigger( 'click' );
487						}, autoHideTime * 1000 );
488					}
489				} else {
490					clearTimeout( autoHideTrigger );
491
492					$target.removeClass( 'jet-unfold-state' );
493
494					$separator.css( {
495						'opacity': '1'
496					} );
497
498					$buttonIcon.html( unfoldIcon );
499					$buttonText.html( unfoldText );
500
501					anime( {
502						targets: $mask[0],
503						height: deviceHeight,
504						duration: foldDuration['size'],
505						easing: foldEasing,
506						complete: function( anim ) {
507							if ( 'true' === settings['foldScrolling'] ) {
508								$( 'html, body' ).animate( {
509									scrollTop: $target.offset().top - settings['foldScrollOffset']['size']
510								}, 'slow' );
511							}
512
513							// Recalculate listing masonry.
514							$( document ).trigger( 'jet-engine/listing/recalculate-masonry' );
515						}
516					} );
517				}
518			} );
519
520			function getDeviceHeight() {
521				var deviceMode = elementor.getCurrentDeviceMode();
522
523				return maskBreakpointsHeights[deviceMode]['maskHeight'];
524			}
525		},
526
527		widgetHotspots: function( $scope ) {
528			var $target   = $scope.find( '.jet-hotspots' ),
529				$hotspots = $( '.jet-hotspots__item', $target),
530				settings  = $target.data( 'settings' ),
531				editMode  = Boolean( elementor.isEditMode() ),
532				itemActiveClass = 'jet-hotspots__item--active';
533
534			$target.imagesLoaded().progress( function() {
535				$target.addClass( 'image-loaded' );
536			} );
537
538			$hotspots.each( function( index ) {
539				var $this          = $( this ),
540					horizontal     = $this.data( 'horizontal-position' ),
541					vertical       = $this.data( 'vertical-position' ),
542					itemSelector   = $this[0],
543					options        = {};
544
545				$this.css( {
546					'left': horizontal + '%',
547					'top': vertical + '%'
548				} );
549
550				if ( itemSelector._tippy ) {
551					itemSelector._tippy.destroy();
552				}
553
554				options = {
555					arrow: settings['tooltipArrow'] ? true : false,
556					placement: settings['tooltipPlacement'],
557					trigger: settings['tooltipTrigger'],
558					appendTo: $target[0],
559					hideOnClick: 'manual' !== settings['tooltipTrigger'],
560					maxWidth: 'none',
561					offset: [0, settings['tooltipDistance']['size']],
562					allowHTML: true,
563					onShow() {
564						$( itemSelector ).addClass( itemActiveClass );
565					},
566					onHidden() {
567						$( itemSelector ).removeClass( itemActiveClass );
568					}
569				}
570
571				if ( 'manual' != settings['tooltipTrigger'] ) {
572					options['duration']  = [ settings['tooltipShowDuration']['size'], settings['tooltipHideDuration']['size'] ];
573					options['animation'] = settings['tooltipAnimation'];
574					options['delay']     = settings['tooltipDelay'];
575				}
576
577				tippy( [ itemSelector ], options );
578
579				if ( 'manual' === settings['tooltipTrigger'] && itemSelector._tippy ) {
580					itemSelector._tippy.show();
581				}
582
583				if ( settings['tooltipShowOnInit'] && itemSelector._tippy ) {
584					itemSelector._tippy.show();
585				}
586
587			} );
588		},
589
590		columnEditorSettings: function( columnId ) {
591			var editorElements = null,
592				columnData     = {};
593
594			if ( ! window.elementor.hasOwnProperty( 'elements' ) ) {
595				return false;
596			}
597
598			editorElements = window.elementor.elements;
599
600			if ( ! editorElements.models ) {
601				return false;
602			}
603
604			$.each( editorElements.models, function( index, obj ) {
605
606				$.each( obj.attributes.elements.models, function( index, obj ) {
607					if ( columnId == obj.id ) {
608						columnData = obj.attributes.settings.attributes;
609					}
610				} );
611
612			} );
613
614			return {
615				'sticky': columnData['jet_tricks_column_sticky'] || false,
616				'topSpacing': columnData['jet_tricks_top_spacing'] || 50,
617				'bottomSpacing': columnData['jet_tricks_bottom_spacing'] || 50,
618				'stickyOn': columnData['jet_tricks_column_sticky_on'] || [ 'desktop', 'tablet', 'mobile']
619			}
620
621		},
622
623		sectionEditorSettings: function( $scope ) {
624			var editorElements = null,
625				sectionData     = {};
626
627			if ( ! window.elementor.hasOwnProperty( 'elements' ) ) {
628				return false;
629			}
630
631			sectionData = JetTricks.getElementorElementSettings( $scope );
632
633			return {
634				'particles': sectionData['section_jet_tricks_particles'] || 'false',
635				'particles_json': sectionData['section_jet_tricks_particles_json'] || '',
636			}
637
638		}
639
640	};
641
642	$( window ).on( 'elementor/frontend/init', JetTricks.init );
643
644	var JetTricksTools = {
645		debounce: function( threshold, callback ) {
646			var timeout;
647
648			return function debounced( $event ) {
649				function delayed() {
650					callback.call( this, $event );
651					timeout = null;
652				}
653
654				if ( timeout ) {
655					clearTimeout( timeout );
656				}
657
658				timeout = setTimeout( delayed, threshold );
659			};
660		},
661
662		widgetEditorSettings: function( widgetId ) {
663			var editorElements = null,
664				widgetData     = {};
665
666			if ( ! window.elementor.hasOwnProperty( 'elements' ) ) {
667				return false;
668			}
669
670			editorElements = window.elementor.elements;
671
672			if ( ! editorElements.models ) {
673				return false;
674			}
675
676			$.each( editorElements.models, function( index, obj ) {
677
678				$.each( obj.attributes.elements.models, function( index, obj ) {
679
680					$.each( obj.attributes.elements.models, function( index, obj ) {
681						if ( widgetId == obj.id ) {
682							widgetData = obj.attributes.settings.attributes;
683						}
684					} );
685
686				} );
687
688			} );
689
690			return {
691				'speed': widgetData['jet_tricks_widget_parallax_speed'] || { 'size': 50, 'unit': '%'},
692				'parallax': widgetData['jet_tricks_widget_parallax'] || 'false',
693				'invert': widgetData['jet_tricks_widget_parallax_invert'] || 'false',
694				'stickyOn': widgetData['jet_tricks_widget_parallax_on'] || [ 'desktop', 'tablet', 'mobile'],
695				'satellite': widgetData['jet_tricks_widget_satellite'] || 'false',
696				'satelliteType': widgetData['jet_tricks_widget_satellite_type'] || 'text',
697				'satellitePosition': widgetData['jet_tricks_widget_satellite_position'] || 'top-center',
698				'tooltip': widgetData['jet_tricks_widget_tooltip'] || 'false',
699				'tooltipDescription': widgetData['jet_tricks_widget_tooltip_description'] || 'Lorem Ipsum',
700				'tooltipPlacement': widgetData['jet_tricks_widget_tooltip_placement'] || 'top',
701				'tooltipArrow': 'true' === widgetData['jet_tricks_widget_tooltip_arrow'] ? true : false,
702				'xOffset': widgetData['jet_tricks_widget_tooltip_x_offset'] || 0,
703				'yOffset': widgetData['jet_tricks_widget_tooltip_y_offset'] || 0,
704				'tooltipAnimation': widgetData['jet_tricks_widget_tooltip_animation'] || 'shift-toward',
705				'tooltipTrigger': widgetData['jet_tricks_widget_tooltip_trigger'] || 'mouseenter',
706				'customSelector': widgetData['jet_tricks_widget_tooltip_custom_selector'] || '',
707				'zIndex': widgetData['jet_tricks_widget_tooltip_z_index'] || '999',
708				'delay': widgetData['jet_tricks_widget_tooltip_delay'] || '0'
709			}
710		}
711	}
712
713	/**
714	 * Jet jetViewMore Class
715	 *
716	 * @return {void}
717	 */
718	window.jetViewMore = function( $selector, settings ) {
719		var self            = this,
720			$window         = $( window ),
721			$button         = $( '.jet-view-more__button', $selector ),
722			defaultSettings = {
723				sections: {},
724				effect: 'move-up',
725				showall: false
726			},
727			settings        = $.extend( {}, defaultSettings, settings ),
728			sections        = settings['sections'],
729			sectionsData    = {},
730			buttonVisible   = true,
731			editMode        = Boolean( elementor.isEditMode() );
732
733		/**
734		 * Init
735		 */
736		self.init = function() {
737			self.setSectionsData();
738
739			if ( editMode ) {
740				return false;
741			}
742
743			// Add Events
744			$button.on( 'click', function() {
745
746				for ( var section in sectionsData ) {
747					var $section = sectionsData[ section ]['selector'];
748
749					if ( ! settings.showall ) {
750						if ( ! sectionsData[ section ]['visible'] ) {
751							sectionsData[ section ]['visible'] = true;
752							$section.addClass( 'view-more-visible' );
753							$section.addClass( 'jet-tricks-' + settings['effect'] + '-effect' );
754
755							break;
756						}
757					} else {
758						sectionsData[ section ]['visible'] = true;
759						$section.addClass( 'view-more-visible' );
760						$section.addClass( 'jet-tricks-' + settings['effect'] + '-effect' );
761					}
762
763				}
764
765				for ( var section in sectionsData ) {
766					buttonVisible = true;
767
768					if ( sectionsData[ section ]['visible'] ) {
769						buttonVisible = false;
770					}
771				}
772
773				if ( ! buttonVisible ) {
774					$button.css( { 'display': 'none' } );
775				}
776
777			} );
778
779			$button.keydown( function( e ) {
780				var $which = e.which || e.keyCode;
781
782					if ( $which == 13 || $which == 32 ) {
783						for ( var section in sectionsData ) {
784							var $section = sectionsData[ section ]['selector'];
785
786							if ( ! settings.showall ) {
787								if ( ! sectionsData[ section ]['visible'] ) {
788									sectionsData[ section ]['visible'] = true;
789									$section.addClass( 'view-more-visible' );
790									$section.addClass( 'jet-tricks-' + settings['effect'] + '-effect' );
791
792									break;
793								}
794							} else {
795								sectionsData[ section ]['visible'] = true;
796								$section.addClass( 'view-more-visible' );
797								$section.addClass( 'jet-tricks-' + settings['effect'] + '-effect' );
798							}
799
800						}
801
802						for ( var section in sectionsData ) {
803							buttonVisible = true;
804
805							if ( sectionsData[ section ]['visible'] ) {
806								buttonVisible = false;
807							}
808						}
809
810						if ( ! buttonVisible ) {
811							$button.css( { 'display': 'none' } );
812						}
813					}
814			} );
815		};
816
817		self.setSectionsData = function() {
818
819			for ( var section in sections ) {
820				var $selector = $( '#' + sections[ section ] );
821
822				if ( ! editMode ) {
823					$selector.addClass( 'jet-view-more-section' );
824				} else {
825					$selector.addClass( 'jet-view-more-section-edit-mode' );
826				}
827
828				sectionsData[ section ] = {
829					'section_id': sections[ section ],
830					'selector': $selector,
831					'visible': false,
832				}
833			}
834		};
835	};
836
837	/**
838	 * [jetWidgetParallax description]
839	 * @param  {[type]} $scope [description]
840	 * @return {[type]}        [description]
841	 */
842	window.jetWidgetParallax = function( $scope ) {
843		var self         = this,
844			$target      = $( '> .elementor-widget-container', $scope ),
845			$section     = $scope.closest( '.elementor-top-section' ),
846			widgetId     = $scope.data('id'),
847			settings     = {},
848			editMode     = Boolean( elementor.isEditMode() ),
849			$window      = $( window ),
850			isSafari     = !!navigator.userAgent.match(/Version\/[\d\.]+.*Safari/),
851			platform     = navigator.platform,
852			safariClass  = isSafari ? 'is-safari' : '',
853			macClass    = 'MacIntel' == platform ? ' is-mac' : '';
854
855		/**
856		 * Init
857		 */
858		self.init = function() {
859
860			$scope.addClass( macClass );
861
862			if ( ! editMode ) {
863				settings = $scope.data( 'jet-tricks-settings' );
864			} else {
865				settings = JetTricksTools.widgetEditorSettings( widgetId );
866			}
867
868			if ( ! settings ) {
869				return false;
870			}
871
872			if ( 'undefined' === typeof settings ) {
873				return false;
874			}
875
876			if ( 'false' === settings['parallax'] || 'undefined' === typeof settings['parallax'] ) {
877				return false;
878			}
879
880			$window.on( 'scroll.jetWidgetParallax resize.jetWidgetParallax', self.scrollHandler ).trigger( 'resize.jetWidgetParallax' );
881		};
882
883		self.scrollHandler = function( event ) {
884			var speed             = +settings['speed']['size'] * 0.01,
885				invert            = 'true' == settings['invert'] ? -1 : 1,
886				winHeight         = $window.height(),
887				winScrollTop      = $window.scrollTop(),
888				offsetTop         = $scope.offset().top,
889				thisHeight        = $scope.outerHeight(),
890				sectionHeight     = $section.outerHeight(),
891				positionDelta     = winScrollTop - offsetTop + ( winHeight / 2 ),
892				abs               = positionDelta > 0 ? 1 : -1,
893				posY              = abs * Math.pow( Math.abs( positionDelta ), 0.85 ),
894				availableDevices  = settings['stickyOn'] || [],
895				currentDeviceMode = elementorFrontend.getCurrentDeviceMode();
896
897			posY = invert * Math.ceil( speed * posY );
898
899			if ( -1 !== availableDevices.indexOf( currentDeviceMode ) ) {
900				$target.css( {
901					'transform': 'translateY(' + posY + 'px)'
902				} );
903			} else {
904				$target.css( {
905					'transform': 'translateY(0)'
906				} );
907			}
908		};
909	};
910
911	/**
912	 * [jetWidgetSatellite description]
913	 * @param  {[type]} $scope [description]
914	 * @return {[type]}        [description]
915	 */
916	window.jetWidgetSatellite = function( $scope ) {
917		var self     = this,
918			widgetId = $scope.data('id'),
919			settings = {},
920			editMode = Boolean( elementor.isEditMode() );
921
922		/**
923		 * Init
924		 */
925		self.init = function() {
926
927			if ( ! editMode ) {
928				settings = $scope.data( 'jet-tricks-settings' );
929			} else {
930				settings = JetTricksTools.widgetEditorSettings( widgetId );
931			}
932
933			if ( ! settings ) {
934				return false;
935			}
936
937			if ( 'undefined' === typeof settings ) {
938				return false;
939			}
940
941			if ( 'false' === settings['satellite'] || 'undefined' === typeof settings['satellite'] ) {
942				return false;
943			}
944
945			$scope.addClass( 'jet-satellite-widget' );
946
947			$( '.jet-tricks-satellite', $scope ).addClass( 'jet-tricks-satellite--' + settings['satellitePosition'] );
948		};
949	};
950
951	/**
952	 * [jetWidgetTooltip description]
953	 * @param  {[type]} $scope [description]
954	 * @return {[type]}        [description]
955	 */
956	window.jetWidgetTooltip = function( $scope ) {
957		var self            = this,
958			widgetId        = $scope.data('id'),
959			widgetSelector  = $scope[0],
960			tooltipSelector = widgetSelector,
961			settings        = {},
962			editMode        = Boolean( elementor.isEditMode() ),
963			delay,
964			tooltipEvent    = editMode ? 'click' : 'mouseenter';
965
966		/**
967		 * Init
968		 */
969		self.init = function() {
970
971			if ( ! editMode ) {
972				settings = $scope.data( 'jet-tricks-settings' );
973			} else {
974				settings = JetTricksTools.widgetEditorSettings( widgetId );
975			}
976
977			if ( widgetSelector._tippy ) {
978				widgetSelector._tippy.destroy();
979			}
980
981			if ( ! settings ) {
982				return false;
983			}
984
985			if ( 'undefined' === typeof settings ) {
986				return false;
987			}
988
989			if ( 'false' === settings['tooltip'] || 'undefined' === typeof settings['tooltip'] || '' === settings['tooltipDescription'] ) {
990				return false;
991			}
992
993			$scope.addClass( 'jet-tooltip-widget' );
994
995			if ( settings['customSelector'] ) {
996				tooltipSelector = $( '.' + settings['customSelector'], $scope )[0];
997			}
998
999			if ( editMode && ! $( '#jet-tricks-tooltip-content-' + widgetId )[0] ) {
1000				var template = $( '<div>', {
1001					id: 'jet-tricks-tooltip-content-' + widgetId,
1002					class: 'jet-tooltip-widget__content'
1003				} );
1004
1005				template.html( settings['tooltipDescription'] );
1006				$scope.append( template );
1007			}
1008
1009			tippy(
1010				[ tooltipSelector ],
1011				{
1012					content: $scope.find( '.jet-tooltip-widget__content' )[0].innerHTML,
1013					allowHTML: true,
1014					appendTo: widgetSelector,
1015					arrow: settings['tooltipArrow'] ? true : false,
1016					placement: settings['tooltipPlacement'],
1017					offset: [ settings['xOffset'], settings['yOffset'] ],
1018					animation: settings['tooltipAnimation'],
1019					trigger: settings['tooltipTrigger'],
1020					interactive: true,
1021					zIndex: settings['zIndex'],
1022					maxWidth: 'none',
1023					delay: settings['delay']['size'] ? settings['delay']['size'] : 0,
1024				}
1025			);
1026
1027			if ( editMode && widgetSelector._tippy ) {
1028				widgetSelector._tippy.show();
1029			}
1030
1031		};
1032	};
1033
1034}( jQuery, window.elementorFrontend ) );

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.