PageSourceSearch

https://mankindcannabis.com/wp-content/plugins/jet-tricks/assets/js/jet-tricks-frontend.js?ver=1.4.8

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