PageSourceSearch

https://pegasus.ru/wp-content/plugins/jet-tricks/assets/js/jet-tricks-frontend.js?ver=1.5.1

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