PageSourceSearch

https://www.oggiscuola.com/web/wp-content/plugins/jet-tricks/assets/js/jet-tricks-frontend.js?ver=1.4.4

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