PageSourceSearch

https://fahrradstrasse-bi.de/wp-content/plugins/jet-tricks/assets/js/jet-tricks-frontend.js?ver=1.1.9

js fahrradstrasse-bi.de collected 2026-10-05 11:31:59 UTC 19,609 bytes, 698 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/column', JetTricks.elementorColumn );
10			elementor.hooks.addAction( 'frontend/element_ready/widget', JetTricks.elementorWidget );
11
12			var widgets = {
13				'jet-view-more.default' : JetTricks.widgetViewMore,
14				'jet-unfold.default' : JetTricks.widgetUnfold,
15				'jet-hotspots.default' : JetTricks.widgetHotspots
16			};
17
18			$.each( widgets, function( widget, callback ) {
19				elementor.hooks.addAction( 'frontend/element_ready/' + widget, callback );
20			});
21		},
22
23		elementorSection: function( $scope ) {
24			var $target        = $scope,
25				sectionId      = $scope.data( 'id' ),
26				editMode       = Boolean( elementor.isEditMode() ),
27				settings       = {};
28
29			if ( window.JetTricksSettings && window.JetTricksSettings.elements_data.sections.hasOwnProperty( sectionId ) ) {
30				settings = window.JetTricksSettings.elements_data.sections[ sectionId ];
31			}
32
33			if ( editMode ) {
34				settings = JetTricks.sectionEditorSettings( sectionId );
35			}
36
37			if ( ! settings ) {
38				return false;
39			}
40
41			if ( jQuery.isEmptyObject( settings ) ) {
42				return false;
43			}
44
45			if ( 'false' === settings.particles || '' === settings.particles_json ) {
46				return false;
47			}
48
49			var particlesId = 'jet-tricks-particles-instance-' + sectionId,
50				particlesJson = JSON.parse( settings.particles_json );
51
52			$scope.prepend( '<div id="' + particlesId + '" class="jet-tricks-particles-section__instance"></div>' );
53
54			particlesJS( particlesId, particlesJson );
55
56		},
57
58		elementorColumn: function( $scope ) {
59			var $target  = $scope,
60				$window  = $( window ),
61				columnId = $target.data( 'id' ),
62				editMode = Boolean( elementor.isEditMode() ),
63				settings = {},
64				stickyInstance = null,
65				stickyInstanceOptions = {
66					topSpacing: 50,
67					bottomSpacing: 50,
68					containerSelector: '.elementor-row',
69					innerWrapperSelector: '.elementor-column-wrap',
70				};
71
72			if ( ! editMode ) {
73				settings = $target.data( 'settings' );
74
75				if ( $target.hasClass( 'jet-sticky-column' ) ) {
76
77					if ( -1 !== settings['stickyOn'].indexOf( elementorFrontend.getCurrentDeviceMode() ) ) {
78
79						stickyInstanceOptions.topSpacing = settings['topSpacing'];
80						stickyInstanceOptions.bottomSpacing = settings['bottomSpacing'];
81
82						$target.data( 'stickyColumnInit', true );
83						stickyInstance = new StickySidebar( $target[0], stickyInstanceOptions );
84
85						$window.on( 'resize.JetTricksStickyColumn orientationchange.JetTricksStickyColumn', JetTricksTools.debounce( 50, resizeDebounce ) );
86					}
87				}
88			} else {
89				settings = JetTricks.columnEditorSettings( columnId );
90
91				if ( 'true' === settings['sticky'] ) {
92					$target.addClass( 'jet-sticky-column' );
93
94					if ( -1 !== settings['stickyOn'].indexOf( elementorFrontend.getCurrentDeviceMode() ) ) {
95						stickyInstanceOptions.topSpacing = settings['topSpacing'];
96						stickyInstanceOptions.bottomSpacing = settings['bottomSpacing'];
97
98						$target.data( 'stickyColumnInit', true );
99						stickyInstance = new StickySidebar( $target[0], stickyInstanceOptions );
100
101						$window.on( 'resize.JetTricksStickyColumn orientationchange.JetTricksStickyColumn', JetTricksTools.debounce( 50, resizeDebounce ) );
102					}
103				}
104			}
105
106			function resizeDebounce() {
107				var currentDeviceMode = elementorFrontend.getCurrentDeviceMode(),
108					availableDevices  = settings['stickyOn'] || [],
109					isInit            = $target.data( 'stickyColumnInit' );
110
111				if ( -1 !== availableDevices.indexOf( currentDeviceMode ) ) {
112
113					if ( ! isInit ) {
114						$target.data( 'stickyColumnInit', true );
115						stickyInstance = new StickySidebar( $target[0], stickyInstanceOptions );
116						stickyInstance.updateSticky();
117					}
118				} else {
119					$target.data( 'stickyColumnInit', false );
120					stickyInstance.destroy();
121				}
122			}
123
124		},
125
126		elementorWidget: function( $scope ) {
127			var parallaxInstance = null,
128				satelliteInstance = null,
129				tooltipInstance = null;
130
131			parallaxInstance = new jetWidgetParallax( $scope );
132			parallaxInstance.init();
133
134			satelliteInstance = new jetWidgetSatellite( $scope );
135			satelliteInstance.init();
136
137			tooltipInstance = new jetWidgetTooltip( $scope );
138			tooltipInstance.init();
139
140		},
141
142		widgetViewMore: function( $scope ) {
143			var $target         = $scope.find( '.jet-view-more' ),
144				instance        = null,
145				settings        = $target.data( 'settings' );
146
147			instance = new jetViewMore( $target, settings );
148			instance.init();
149		},
150
151		widgetUnfold: function( $scope ) {
152			var $target          = $scope.find( '.jet-unfold' ),
153				$body            = $( 'body' ),
154				$button          = $( '.jet-unfold__button', $target ),
155				$mask            = $( '.jet-unfold__mask', $target ),
156				$content         = $( '.jet-unfold__content', $target ),
157				settings         = $target.data( 'settings' ),
158				maskHeight       = +settings['height']['size'] || 100,
159				maskTabletHeight = +settings['heightTablet']['size'] || maskHeight,
160				maskMobileHeight = +settings['heightMobile']['size'] || maskHeight,
161				separatorHeight  = +settings['separatorHeight']['size'] || 20,
162				unfoldDuration   = settings['unfoldDuration'],
163				foldDuration     = settings['unfoldDuration'],
164				unfoldEasing     = settings['unfoldEasing'],
165				foldEasing       = settings['foldEasing'];
166
167			if ( ! $target.hasClass( 'jet-unfold-state' ) ) {
168				$mask.css( {
169					'height': maskHeight
170				} );
171			}
172
173			$button.on( 'click.jetUnfold', function() {
174				var $this         = $( this ),
175					$buttonText   = $( '.jet-unfold__button-text', $this ),
176					unfoldText    = $this.data( 'unfold-text' ),
177					foldText      = $this.data( 'fold-text' ),
178					$buttonIcon   = $( '.jet-unfold__button-icon', $this ),
179					unfoldIcon    = $this.data( 'unfold-icon' ),
180					foldIcon      = $this.data( 'fold-icon' ),
181					contentHeight = $content.outerHeight(),
182					deviceHeight  = getDeviceHeight();
183
184				if ( ! $target.hasClass( 'jet-unfold-state' ) ) {
185					$target.addClass( 'jet-unfold-state' );
186
187					$buttonIcon.html( '<i class="' + foldIcon + '"></i>' );
188					$buttonText.html( foldText );
189
190					anime( {
191						targets: $mask[0],
192						height: contentHeight,
193						duration: unfoldDuration['size'],
194						easing: unfoldEasing
195					} );
196				} else {
197					$target.removeClass( 'jet-unfold-state' );
198
199					$buttonIcon.html( '<i class="' + unfoldIcon + '"></i>' );
200					$buttonText.html( unfoldText );
201
202					anime( {
203						targets: $mask[0],
204						height: deviceHeight,
205						duration: foldDuration['size'],
206						easing: foldEasing
207					} );
208				}
209			} );
210
211			$( window ).on( 'resize.jetWidgetUnfold orientationchange.jetWidgetUnfold', JetTricksTools.debounce( 50, function(){
212
213				var deviceHeight  = getDeviceHeight(),
214					contentHeight = $content.outerHeight();
215
216				if ( ! $target.hasClass( 'jet-unfold-state' ) ) {
217					$mask.css( {
218						'height': deviceHeight
219					} );
220				} else {
221					$mask.css( {
222						'height': contentHeight
223					} );
224				}
225
226			} ) );
227
228			function getDeviceHeight() {
229				var $deviceMode  = elementor.getCurrentDeviceMode(),
230					deviceHeight = maskHeight;
231
232				switch ( $deviceMode ) {
233					case 'desktop':
234						deviceHeight = maskHeight;
235						break;
236
237					case 'tablet':
238						deviceHeight = maskTabletHeight;
239						break;
240
241					case 'mobile':
242						deviceHeight = maskMobileHeight;
243						break;
244				}
245
246				return deviceHeight;
247			}
248		},
249
250		widgetHotspots: function( $scope ) {
251			var $target   = $scope.find( '.jet-hotspots' ),
252				$hotspots = $( '.jet-hotspots__item', $target),
253				settings  = $target.data( 'settings' ),
254				editMode  = Boolean( elementor.isEditMode() );
255
256			$target.imagesLoaded().progress( function() {
257				$target.addClass( 'image-loaded' );
258			} );
259
260			$hotspots.each( function( index ) {
261				var $this          = $( this ),
262					horizontal     = $this.data( 'horizontal-position' ),
263					vertical       = $this.data( 'vertical-position' ),
264					itemSelector   = $this[0];
265
266				$this.css( {
267					'left': horizontal + '%',
268					'top': vertical + '%'
269				} );
270
271				if ( itemSelector._tippy ) {
272					itemSelector._tippy.destroy();
273				}
274
275				tippy( [ itemSelector ], {
276					arrow: settings['tooltipArrow'],
277					arrowType: settings['tooltipArrowType'],
278					arrowTransform: settings['tooltipArrowSize'],
279					duration: [ settings['tooltipShowDuration']['size'], settings['tooltipHideDuration']['size'] ],
280					distance: settings['tooltipDistance']['size'],
281					placement: settings['tooltipPlacement'],
282					trigger: settings['tooltipTrigger'],
283					animation: settings['tooltipAnimation'],
284					flipBehavior: 'clockwise',
285					appendTo: itemSelector,
286					hideOnClick: 'manual' !== settings['tooltipTrigger'],
287				} );
288
289				if ( 'manual' === settings['tooltipTrigger'] && itemSelector._tippy ) {
290					itemSelector._tippy.show();
291				}
292
293				if ( settings['tooltipShowOnInit'] && itemSelector._tippy ) {
294					itemSelector._tippy.show();
295				}
296
297				if ( editMode && itemSelector._tippy ) {
298					itemSelector._tippy.show();
299				}
300
301			} );
302		},
303
304		columnEditorSettings: function( columnId ) {
305			var editorElements = null,
306				columnData     = {};
307
308			if ( ! window.elementor.hasOwnProperty( 'elements' ) ) {
309				return false;
310			}
311
312			editorElements = window.elementor.elements;
313
314			if ( ! editorElements.models ) {
315				return false;
316			}
317
318			$.each( editorElements.models, function( index, obj ) {
319
320				$.each( obj.attributes.elements.models, function( index, obj ) {
321					if ( columnId == obj.id ) {
322						columnData = obj.attributes.settings.attributes;
323					}
324				} );
325
326			} );
327
328			return {
329				'sticky': columnData['jet_tricks_column_sticky'] || false,
330				'topSpacing': columnData['jet_tricks_top_spacing'] || 50,
331				'bottomSpacing': columnData['jet_tricks_bottom_spacing'] || 50,
332				'stickyOn': columnData['jet_tricks_column_sticky_on'] || [ 'desktop', 'tablet', 'mobile']
333			}
334
335		},
336
337		sectionEditorSettings: function( sectionId ) {
338			var editorElements = null,
339				sectionData     = {};
340
341			if ( ! window.elementor.hasOwnProperty( 'elements' ) ) {
342				return false;
343			}
344
345			editorElements = window.elementor.elements;
346
347			if ( ! editorElements.models ) {
348				return false;
349			}
350
351			$.each( editorElements.models, function( index, obj ) {
352				if ( sectionId == obj.id ) {
353					sectionData = obj.attributes.settings.attributes;
354				}
355			} );
356
357			return {
358				'particles': sectionData['section_jet_tricks_particles'] || 'false',
359				'particles_json': sectionData['section_jet_tricks_particles_json'] || '',
360			}
361
362		}
363
364	};
365
366	$( window ).on( 'elementor/frontend/init', JetTricks.init );
367
368	var JetTricksTools = {
369		debounce: function( threshold, callback ) {
370			var timeout;
371
372			return function debounced( $event ) {
373				function delayed() {
374					callback.call( this, $event );
375					timeout = null;
376				}
377
378				if ( timeout ) {
379					clearTimeout( timeout );
380				}
381
382				timeout = setTimeout( delayed, threshold );
383			};
384		},
385
386		widgetEditorSettings: function( widgetId ) {
387			var editorElements = null,
388				widgetData     = {};
389
390			if ( ! window.elementor.hasOwnProperty( 'elements' ) ) {
391				return false;
392			}
393
394			editorElements = window.elementor.elements;
395
396			if ( ! editorElements.models ) {
397				return false;
398			}
399
400			$.each( editorElements.models, function( index, obj ) {
401
402				$.each( obj.attributes.elements.models, function( index, obj ) {
403
404					$.each( obj.attributes.elements.models, function( index, obj ) {
405						if ( widgetId == obj.id ) {
406							widgetData = obj.attributes.settings.attributes;
407						}
408					} );
409
410				} );
411
412			} );
413
414			return {
415				'speed': widgetData['jet_tricks_widget_parallax_speed'] || { 'size': 50, 'unit': '%'},
416				'parallax': widgetData['jet_tricks_widget_parallax'] || 'false',
417				'invert': widgetData['jet_tricks_widget_parallax_invert'] || 'false',
418				'stickyOn': widgetData['jet_tricks_widget_parallax_on'] || [ 'desktop', 'tablet', 'mobile'],
419				'satellite': widgetData['jet_tricks_widget_satellite'] || 'false',
420				'satelliteType': widgetData['jet_tricks_widget_satellite_type'] || 'text',
421				'satellitePosition': widgetData['jet_tricks_widget_satellite_position'] || 'top-center',
422				'tooltip': widgetData['jet_tricks_widget_tooltip'] || 'false',
423				'tooltipDescription': widgetData['jet_tricks_widget_tooltip_description'] || 'Lorem Ipsum',
424				'tooltipPlacement': widgetData['jet_tricks_widget_tooltip_placement'] || 'top',
425				'xOffset': widgetData['jet_tricks_widget_tooltip_x_offset'] || 0,
426				'yOffset': widgetData['jet_tricks_widget_tooltip_y_offset'] || 0,
427				'tooltipAnimation': widgetData['jet_tricks_widget_tooltip_animation'] || 'shift-toward',
428				'zIndex': widgetData['jet_tricks_widget_tooltip_z_index'] || '999'
429			}
430		}
431	}
432
433	/**
434	 * Jet jetViewMore Class
435	 *
436	 * @return {void}
437	 */
438	window.jetViewMore = function( $selector, settings ) {
439		var self            = this,
440			$window         = $( window ),
441			$button         = $( '.jet-view-more__button', $selector ),
442			defaultSettings = {
443				sections: {},
444				effect: 'move-up',
445				showall: false
446			},
447			settings        = $.extend( {}, defaultSettings, settings ),
448			sections        = settings['sections'],
449			sectionsData    = {},
450			buttonVisible   = true,
451			editMode        = Boolean( elementor.isEditMode() );
452
453		/**
454		 * Init
455		 */
456		self.init = function() {
457			self.setSectionsData();
458
459			if ( editMode ) {
460				return false;
461			}
462
463			// Add Events
464			$button.on( 'click', function() {
465
466				for ( var section in sectionsData ) {
467					var $section = sectionsData[ section ]['selector'];
468
469					if ( ! settings.showall ) {
470						if ( ! sectionsData[ section ]['visible'] ) {
471							sectionsData[ section ]['visible'] = true;
472							$section.addClass( 'view-more-visible' );
473							$section.addClass( 'jet-tricks-' + settings['effect'] + '-effect' );
474
475							break;
476						}
477					} else {
478						sectionsData[ section ]['visible'] = true;
479						$section.addClass( 'view-more-visible' );
480						$section.addClass( 'jet-tricks-' + settings['effect'] + '-effect' );
481					}
482
483				}
484
485				for ( var section in sectionsData ) {
486					buttonVisible = true;
487
488					if ( sectionsData[ section ]['visible'] ) {
489						buttonVisible = false;
490					}
491				}
492
493				if ( ! buttonVisible ) {
494					$button.css( { 'display': 'none' } );
495				}
496
497			} );
498		};
499
500		self.setSectionsData = function() {
501
502			for ( var section in sections ) {
503				var $selector = $( '#' + sections[ section ] );
504
505				if ( ! editMode ) {
506					$selector.addClass( 'jet-view-more-section' );
507				} else {
508					$selector.addClass( 'jet-view-more-section-edit-mode' );
509				}
510
511				sectionsData[ section ] = {
512					'section_id': sections[ section ],
513					'selector': $selector,
514					'visible': false,
515				}
516			}
517		};
518	};
519
520	/**
521	 * [jetWidgetParallax description]
522	 * @param  {[type]} $scope [description]
523	 * @return {[type]}        [description]
524	 */
525	window.jetWidgetParallax = function( $scope ) {
526		var self         = this,
527			$target      = $( '> .elementor-widget-container', $scope ),
528			$section     = $scope.closest( '.elementor-top-section' ),
529			widgetId     = $scope.data('id'),
530			settings     = {},
531			editMode     = Boolean( elementor.isEditMode() ),
532			$window      = $( window ),
533			isSafari     = !!navigator.userAgent.match(/Version\/[\d\.]+.*Safari/),
534			platform     = navigator.platform,
535			safariClass  = isSafari ? 'is-safari' : '',
536			macClass    = 'MacIntel' == platform ? ' is-mac' : '';
537
538		/**
539		 * Init
540		 */
541		self.init = function() {
542
543			$scope.addClass( macClass );
544
545			if ( ! editMode ) {
546				settings = $scope.data( 'jet-tricks-settings' );
547			} else {
548				settings = JetTricksTools.widgetEditorSettings( widgetId );
549			}
550
551			if ( ! settings ) {
552				return false;
553			}
554
555			if ( 'undefined' === typeof settings ) {
556				return false;
557			}
558
559			if ( 'false' === settings['parallax'] || 'undefined' === typeof settings['parallax'] ) {
560				return false;
561			}
562
563			$window.on( 'scroll.jetWidgetParallax resize.jetWidgetParallax', self.scrollHandler ).trigger( 'resize.jetWidgetParallax' );
564		};
565
566		self.scrollHandler = function( event ) {
567			var speed             = +settings['speed']['size'] * 0.01,
568				invert            = 'true' == settings['invert'] ? -1 : 1,
569				winHeight         = $window.height(),
570				winScrollTop      = $window.scrollTop(),
571				offsetTop         = $scope.offset().top,
572				thisHeight        = $scope.outerHeight(),
573				sectionHeight     = $section.outerHeight(),
574				positionDelta     = winScrollTop - offsetTop + ( winHeight / 2 ),
575				abs               = positionDelta > 0 ? 1 : -1,
576				posY              = abs * Math.pow( Math.abs( positionDelta ), 0.85 ),
577				availableDevices  = settings['stickyOn'] || [],
578				currentDeviceMode = elementorFrontend.getCurrentDeviceMode();
579
580			posY = invert * Math.ceil( speed * posY );
581
582			if ( -1 !== availableDevices.indexOf( currentDeviceMode ) ) {
583				$target.css( {
584					'transform': 'translateY(' + posY + 'px)'
585				} );
586			} else {
587				$target.css( {
588					'transform': 'translateY(0)'
589				} );
590			}
591		};
592	};
593
594	/**
595	 * [jetWidgetSatellite description]
596	 * @param  {[type]} $scope [description]
597	 * @return {[type]}        [description]
598	 */
599	window.jetWidgetSatellite = function( $scope ) {
600		var self     = this,
601			widgetId = $scope.data('id'),
602			settings = {},
603			editMode = Boolean( elementor.isEditMode() );
604
605		/**
606		 * Init
607		 */
608		self.init = function() {
609
610			if ( ! editMode ) {
611				settings = $scope.data( 'jet-tricks-settings' );
612			} else {
613				settings = JetTricksTools.widgetEditorSettings( widgetId );
614			}
615
616			if ( ! settings ) {
617				return false;
618			}
619
620			if ( 'undefined' === typeof settings ) {
621				return false;
622			}
623
624			if ( 'false' === settings['satellite'] || 'undefined' === typeof settings['satellite'] ) {
625				return false;
626			}
627
628			$scope.addClass( 'jet-satellite-widget' );
629
630			$( '.jet-tricks-satellite', $scope ).addClass( 'jet-tricks-satellite--' + settings['satellitePosition'] );
631		};
632	};
633
634	/**
635	 * [jetWidgetTooltip description]
636	 * @param  {[type]} $scope [description]
637	 * @return {[type]}        [description]
638	 */
639	window.jetWidgetTooltip = function( $scope ) {
640		var self           = this,
641			widgetId       = $scope.data('id'),
642			widgetSelector = $scope[0],
643			settings       = {},
644			editMode       = Boolean( elementor.isEditMode() ),
645			tooltipEvent   = editMode ? 'click' : 'mouseenter';
646
647		/**
648		 * Init
649		 */
650		self.init = function() {
651
652			if ( ! editMode ) {
653				settings = $scope.data( 'jet-tricks-settings' );
654			} else {
655				settings = JetTricksTools.widgetEditorSettings( widgetId );
656			}
657
658			if ( ! settings ) {
659				return false;
660			}
661
662			if ( 'undefined' === typeof settings ) {
663				return false;
664			}
665
666			if ( 'false' === settings['tooltip'] || 'undefined' === typeof settings['tooltip'] || '' === settings['tooltipDescription'] ) {
667				return false;
668			}
669
670			$scope.addClass( 'jet-tooltip-widget' );
671
672			if ( widgetSelector._tippy ) {
673				widgetSelector._tippy.destroy();
674			}
675
676			var tippyInstance = tippy(
677				[ widgetSelector ],
678				{
679					html: document.querySelector( '#jet-tricks-tooltip-content-' + widgetId ),
680					appendTo: widgetSelector,
681					arrow: true,
682					placement: settings['tooltipPlacement'],
683					flipBehavior: 'clockwise',
684					trigger: tooltipEvent,
685					offset: settings['xOffset'] + ', ' + settings['yOffset'],
686					animation: settings['tooltipAnimation'],
687					zIndex: settings['zIndex']
688				}
689			);
690
691			if ( editMode && widgetSelector._tippy ) {
692				widgetSelector._tippy.show();
693			}
694
695		};
696	};
697
698}( 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.