PageSourceSearch

https://www.capicua101.es/wp-content/plugins/jet-engine/assets/js/frontend.js?ver=3.0.2

js capicua101.es collected 2026-10-06 08:16:45 UTC 48,477 bytes, 1,842 lines download raw bytes

1( function( $ ) {
2
3	"use strict";
4
5	var JetEngineRegisteredStores = window.JetEngineRegisteredStores || {};
6	var JetEngineStores           = window.JetEngineStores || {};
7
8	var JetEngine = {
9
10		currentMonth: null,
11		currentRequest: {},
12		activeCalendarDay: null,
13		lazyLoading: false,
14		addedScripts: [],
15		addedStyles: [],
16		addedPostCSS: [],
17
18		commonInit: function() {
19
20			$( document )
21				.on( 'click.JetEngine', '.jet-calendar-nav__link', JetEngine.switchCalendarMonth )
22				.on( 'click.JetEngine', '.jet-calendar-week__day-mobile-overlay', JetEngine.showCalendarEvent )
23				.on( 'click.JetEngine', '.jet-listing-dynamic-link__link[data-delete-link="1"]', JetEngine.showConfirmDeleteDialog )
24				.on( 'jet-filter-content-rendered', JetEngine.maybeReinitSlider )
25				.on( 'click.JetEngine', '.jet-add-to-store', JetEngine.addToStore )
26				.on( 'click.JetEngine', '.jet-remove-from-store', JetEngine.removeFromStore )
27				.on( 'click.JetEngine', '.jet-engine-listing-overlay-wrap:not([data-url*="event=hover"])', JetEngine.handleListingItemClick )
28				.on( 'jet-filter-content-rendered', JetEngine.filtersCompatibility )
29				.on( 'click.JetEngine', '.jet-container[data-url]', JetEngine.handleContainerURL );
30
31			$( window ).on( 'jet-popup/render-content/ajax/success', JetEngine.initStores );
32
33			JetEngine.initStores();
34			JetEngine.customUrlActions.init();
35
36		},
37
38		handleContainerURL: function() {
39			var $this  = $( this ),
40				url    = $this.data( 'url' ),
41				target = $this.data( 'target' );
42
43			if ( ! target ) {
44				window.location = url;
45			} else {
46				window.open( url, '_blank' ).focus();
47			}
48
49		},
50
51		filtersCompatibility: function( event, $provider, filtersInstance, providerType ) {
52
53			if ( 'jet-engine' !== providerType ) {
54				return;
55			}
56
57			var $blocksListing = $provider.closest( '.jet-listing-grid--blocks' );
58
59			if ( $blocksListing.length ) {
60				JetEngine.widgetListingGrid( $blocksListing );
61			}
62
63		},
64
65		init: function() {
66
67			var widgets = {
68				'jet-listing-dynamic-field.default' : JetEngine.widgetDynamicField,
69				'jet-listing-grid.default': JetEngine.widgetListingGrid,
70			};
71
72			$.each( widgets, function( widget, callback ) {
73				window.elementorFrontend.hooks.addAction( 'frontend/element_ready/' + widget, callback );
74			});
75
76			window.elementorFrontend.hooks.addFilter(
77				'jet-popup/widget-extensions/popup-data',
78				JetEngine.prepareJetPopup
79			);
80
81			JetEngine.updateAddedStyles();
82		},
83
84		initBlocks: function( $scope ) {
85
86			$scope = $scope || $( 'body' );
87
88			var $blocks = $( '.jet-listing-grid--blocks', $scope );
89
90			if ( $blocks.length ) {
91				$blocks.each( function( index, el ) {
92					var $scope = $( this );
93					JetEngine.widgetListingGrid( $scope );
94				} );
95			}
96
97			var $dynamicFieldBlock = $( '.jet-listing-dynamic-field-block', $scope );
98
99			if ( $dynamicFieldBlock.length ) {
100				$dynamicFieldBlock.each( function( index, el ) {
101					var $scope = $( this );
102					JetEngine.widgetDynamicField( $scope );
103				} );
104			}
105
106		},
107
108		initFrontStores: function( $scope ) {
109
110			$scope = $scope || $( 'body' );
111
112			$( '.jet-add-to-store.is-front-store', $scope ).each( function() {
113
114				var $this = $( this ),
115					args  = $this.data( 'args' ),
116					store = JetEngineStores[ args.store.type ],
117					count = 0;
118
119				if ( ! store ) {
120					return;
121				}
122
123				if ( store.inStore( args.store.slug, '' + args.post_id ) ) {
124					JetEngine.switchDataStoreStatus( $this );
125				}
126
127			} );
128
129			$( '.jet-remove-from-store.is-front-store', $scope ).each( function() {
130
131				var $this = $( this ),
132					args  = $this.data( 'args' ),
133					store = JetEngineStores[ args.store.type ],
134					count = 0;
135
136				if ( ! store ) {
137					return;
138				}
139
140				if ( ! store.inStore( args.store.slug, '' + args.post_id ) ) {
141					$this.addClass( 'is-hidden' );
142				} else {
143					$this.removeClass( 'is-hidden' );
144				}
145
146			} );
147
148		},
149
150		initStores: function() {
151
152			JetEngine.initFrontStores();
153
154			$.each( JetEngineRegisteredStores, function( storeSlug, storeType ) {
155
156				var store = JetEngineStores[ storeType ],
157					storeData = null,
158					count = 0;
159
160				if ( ! store ) {
161					return;
162				}
163
164				storeData = store.getStore( storeSlug );
165
166				if ( storeData && storeData.length ) {
167					count = storeData.length;
168				}
169
170				$( 'span.jet-engine-data-store-count[data-store="' + storeSlug + '"]' ).text( count );
171
172			} );
173
174			$( '.jet-listing-not-found.jet-listing-grid__items' ).each( function() {
175
176				var $this   = $( this ),
177					nav     = $this.data( 'nav' ),
178					isStore = $this.data( 'is-store-listing' ),
179					query   = nav.query;
180
181				if ( query.post__in && query.post__in.length && 0 >= query.post__in.indexOf( 'is-front' ) ) {
182
183					var storeType  = query.post__in[1],
184						storeSlug  = query.post__in[2],
185						store      = JetEngineStores[ storeType ],
186						posts      = [],
187						$container = $this.closest( '.elementor-widget-container' );
188
189					if ( ! $container.length ) {
190						$container = $this.closest( '.jet-listing-grid--blocks' );
191					}
192
193					if ( ! store ) {
194						return;
195					}
196
197					posts = store.getStore( storeSlug );
198
199					if ( ! posts.length ) {
200						return;
201					}
202
203					query.post__in = posts;
204					query.is_front_store = true;
205
206					JetEngine.ajaxGetListing( {
207						handler: 'get_listing',
208						container: $container,
209						masonry: false,
210						slider: false,
211						append: false,
212						query: query,
213						widgetSettings: nav.widget_settings,
214					}, function( response ) {
215						JetEngine.widgetListingGrid( $container );
216					} );
217
218				} else if ( isStore ) {
219					$( document ).trigger( 'jet-listing-grid-init-store', $this );
220				}
221
222			} );
223
224		},
225
226		removeFromStore: function( event ) {
227
228			event.preventDefault();
229			event.stopPropagation();
230
231			var $this = $( this ),
232				args  = $this.data( 'args' ),
233				isDataStoreBtn = $this.hasClass( 'jet-data-store-link' );
234
235			if ( args.store.is_front ) {
236
237				var store = JetEngineStores[ args.store.type ],
238					count = 0;
239
240				if ( ! store ) {
241					return;
242				}
243
244				if ( ! store.inStore( args.store.slug, '' + args.post_id ) ) {
245					var storePosts = store.getStore( args.store.slug );
246					count = storePosts.length;
247				} else {
248					count = store.remove( args.store.slug, args.post_id );
249				}
250
251				$( '.jet-add-to-store[data-store="' + args.store.slug + '"][data-post="' + args.post_id + '"]' ).each( function() {
252					JetEngine.switchDataStoreStatus( $( this ), true );
253				} );
254
255				$( '.jet-data-store-link.jet-remove-from-store[data-store="' + args.store.slug + '"][data-post="' + args.post_id + '"]' ).each( function() {
256					JetEngine.switchDataStoreStatus( $( this ), true );
257				} );
258
259				$( 'span.jet-engine-data-store-count[data-store="' + args.store.slug + '"]' ).text( count );
260
261				if ( args.remove_from_listing ) {
262					$this.closest( '.jet-listing-dynamic-post-' + args.post_id ).remove();
263				}
264
265				if ( args.synch_id ) {
266					var $container     = $( '#' + args.synch_id ),
267						$elemContainer = $container.find( '> .elementor-widget-container' ),
268						$items         = $container.find( '.jet-listing-grid__items' ),
269						posts          = [],
270						nav            = $items.data( 'nav' ) || {},
271						query          = nav.query || {};
272
273					posts = store.getStore( args.store.slug );
274
275					if ( ! posts.length ) {
276						posts = [ 'is-front', args.store.type, args.store.slug ];
277					}
278
279					query.post__in = posts;
280					query.is_front_store = true;
281
282					JetEngine.ajaxGetListing( {
283						handler: 'get_listing',
284						container: $elemContainer.length ? $elemContainer : $container,
285						masonry: false,
286						slider: false,
287						append: false,
288						query: query,
289						widgetSettings: nav.widget_settings,
290						postID: window.elementorFrontendConfig.post.id,
291						elementID: $container.data( 'id' ),
292					}, function( response ) {
293						JetEngine.widgetListingGrid( $container );
294					} );
295				}
296
297				$( document ).trigger( 'jet-engine-data-stores-on-remove', args );
298
299				return;
300
301			}
302
303			$this.css( 'opacity', 0.3 );
304
305			$.ajax({
306				url: JetEngineSettings.ajaxurl,
307				type: 'POST',
308				dataType: 'json',
309				data: {
310					action: 'jet_engine_remove_from_store_' + args.store.slug,
311					store: args.store.slug,
312					post_id: args.post_id,
313				},
314			}).done( function( response ) {
315
316				$this.css( 'opacity', 1 );
317
318				if ( response.success ) {
319
320					if ( ! isDataStoreBtn ) {
321						$this.addClass( 'is-hidden' );
322					}
323
324					$( '.jet-add-to-store[data-store="' + args.store.slug + '"][data-post="' + args.post_id + '"]' ).each( function() {
325						JetEngine.switchDataStoreStatus( $( this ), true );
326					} );
327
328					$( '.jet-data-store-link.jet-remove-from-store[data-store="' + args.store.slug + '"][data-post="' + args.post_id + '"]' ).each( function() {
329						JetEngine.switchDataStoreStatus( $( this ), true );
330					} );
331
332					if ( args.synch_id ) {
333						var $container     = $( '#' + args.synch_id ),
334							$elemContainer = $container.find( '> .elementor-widget-container' ),
335							$items         = $container.find( '.jet-listing-grid__items' ),
336							nav            = $items.data( 'nav' ),
337							query          = nav.query;
338
339						JetEngine.ajaxGetListing( {
340							handler: 'get_listing',
341							container: $elemContainer.length ? $elemContainer : $container,
342							masonry: false,
343							slider: false,
344							append: false,
345							query: query,
346							widgetSettings: nav.widget_settings,
347							postID: window.elementorFrontendConfig.post.id,
348							elementID: $container.data( 'id' ),
349						}, function( response ) {
350							JetEngine.widgetListingGrid( $container );
351						} );
352
353					}
354
355					if ( args.remove_from_listing ) {
356						$this.closest( '.jet-listing-grid__item[data-post="' + args.post_id + '"]' ).remove();
357					}
358
359					if ( response.data.fragments ) {
360						$.each( response.data.fragments, function( selector, value ) {
361							$( selector ).html( value );
362						} );
363					}
364
365					$( document ).trigger( 'jet-engine-data-stores-on-remove', args );
366
367				} else {
368					alert( response.data.message );
369				}
370
371				return response;
372
373			} ).done( function( response ) {
374
375				if ( args.remove_from_listing ) {
376					$this.closest( '.jet-listing-grid__item' ).remove();
377				}
378
379				if ( response.success ) {
380					$( 'span.jet-engine-data-store-count[data-store="' + args.store.slug + '"]' ).text( response.data.count );
381				}
382
383			} ).fail( function( jqXHR, textStatus, errorThrown ) {
384				$this.css( 'opacity', 1 );
385				alert( errorThrown );
386			} );
387
388		},
389
390		triggerPopup: function( popupID, isJetEngine, postID ) {
391
392			if ( ! popupID ) {
393				return;
394			}
395
396			var popupData = {
397				popupId: 'jet-popup-' + popupID,
398			};
399
400			if ( isJetEngine ) {
401				popupData.isJetEngine = true;
402				popupData.postId      = postID;
403			}
404
405			$( window ).trigger( {
406				type: 'jet-popup-open-trigger',
407				popupData: popupData
408			} );
409
410		},
411
412		addToStore: function( event ) {
413
414			event.preventDefault();
415			event.stopPropagation();
416
417			var $this = $( this ),
418				args  = $this.data( 'args' );
419
420			if ( $this.hasClass( 'in-store' ) ) {
421				if ( args.popup ) {
422					JetEngine.triggerPopup( args.popup, args.isJetEngine, args.post_id );
423				} else if ( '_blank' === $this.attr( 'target' ) ) {
424					window.open( $this.attr( 'href' ) );
425				} else {
426					window.location = $this.attr( 'href' );
427				}
428				return;
429			}
430
431			if ( args.store.is_front ) {
432
433				var store = JetEngineStores[ args.store.type ],
434					count = 0;
435
436				if ( ! store ) {
437					return;
438				}
439
440				if ( store.inStore( args.store.slug, '' + args.post_id ) ) {
441					var storePosts = store.getStore( args.store.slug );
442					count = storePosts.length;
443				} else {
444
445					count = store.addToStore( args.store.slug, args.post_id, args.store.size );
446
447					if ( false === count ) {
448						return;
449					}
450
451				}
452
453				if ( args.popup ) {
454					JetEngine.triggerPopup( args.popup, args.isJetEngine, args.post_id );
455				}
456
457				JetEngine.switchDataStoreStatus( $this );
458				$( 'span.jet-engine-data-store-count[data-store="' + args.store.slug + '"]' ).text( count );
459				$( '.jet-remove-from-store[data-store="' + args.store.slug + '"][data-post="' + args.post_id + '"]' ).removeClass( 'is-hidden' );
460
461				if ( args.synch_id ) {
462					var $container     = $( '#' + args.synch_id ),
463						$elemContainer = $container.find( '> .elementor-widget-container' ),
464						$items         = $container.find( '.jet-listing-grid__items' ),
465						posts          = [],
466						nav            = $items.data( 'nav' ) || {},
467						query          = nav.query || {};
468
469					posts = store.getStore( args.store.slug );
470
471					query.post__in = posts;
472					query.is_front_store = true;
473
474					JetEngine.ajaxGetListing( {
475						handler: 'get_listing',
476						container: $elemContainer.length ? $elemContainer : $container,
477						masonry: false,
478						slider: false,
479						append: false,
480						query: query,
481						widgetSettings: nav.widget_settings,
482						postID: window.elementorFrontendConfig.post.id,
483						elementID: $container.data( 'id' ),
484					}, function( response ) {
485						JetEngine.widgetListingGrid( $container );
486					} );
487				}
488
489				$( document ).trigger( 'jet-engine-data-stores-on-add', args );
490
491				return;
492			}
493
494			$this.css( 'opacity', 0.3 );
495
496			$( document ).trigger( 'jet-engine-on-add-to-store', [ $this, args ] );
497
498			$.ajax({
499				url: JetEngineSettings.ajaxurl,
500				type: 'POST',
501				dataType: 'json',
502				data: {
503					action: 'jet_engine_add_to_store_' + args.store.slug,
504					store: args.store.slug,
505					post_id: args.post_id,
506				},
507			}).done( function( response ) {
508
509				$this.css( 'opacity', 1 );
510
511				if ( response.success ) {
512
513					JetEngine.switchDataStoreStatus( $this );
514					$( '.jet-remove-from-store[data-store="' + args.store.slug + '"][data-post="' + args.post_id + '"]' ).removeClass( 'is-hidden' );
515
516					if ( response.data.fragments ) {
517						$.each( response.data.fragments, function( selector, value ) {
518							$( selector ).html( value );
519						} );
520					}
521
522					if ( args.synch_id ) {
523
524						var $container     = $( '#' + args.synch_id ),
525							$elemContainer = $container.find( '> .elementor-widget-container' ),
526							$items         = $container.find( '.jet-listing-grid__items' ),
527							nav            = $items.data( 'nav' ),
528							query          = nav.query;
529
530						JetEngine.ajaxGetListing( {
531							handler: 'get_listing',
532							container: $elemContainer.length ? $elemContainer : $container,
533							masonry: false,
534							slider: false,
535							append: false,
536							query: query,
537							widgetSettings: nav.widget_settings,
538							postID: window.elementorFrontendConfig.post.id,
539							elementID: $container.data( 'id' ),
540						}, function( response ) {
541							JetEngine.widgetListingGrid( $container );
542						} );
543
544					}
545
546					if ( args.popup ) {
547						JetEngine.triggerPopup( args.popup, args.isJetEngine, args.post_id );
548					}
549
550				} else {
551					alert( response.data.message );
552				}
553
554				$( document ).trigger( 'jet-engine-data-stores-on-add', args );
555
556				return response;
557
558			} ).done( function( response ) {
559
560				if ( response.success ) {
561					$( 'span.jet-engine-data-store-count[data-store="' + args.store.slug + '"]' ).text( response.data.count );
562				}
563
564			} ).fail( function( jqXHR, textStatus, errorThrown ) {
565				$this.css( 'opacity', 1 );
566				alert( errorThrown );
567			} );
568
569		},
570
571		switchDataStoreStatus: function( $item, toInitial ) {
572
573			var isDataStoreLink = $item.hasClass( 'jet-data-store-link' ),
574				$label = $item.find( '.jet-listing-dynamic-link__label, .jet-data-store-link__label' ),
575				$icon  = $item.find( '.jet-listing-dynamic-link__icon, .jet-data-store-link__icon' ),
576				args   = $item.data( 'args' ),
577				replaceLabel,
578				replaceURL,
579				replaceIcon;
580
581			toInitial = toInitial || false;
582
583			if ( isDataStoreLink ) {
584
585				switch ( args.action_after_added ) {
586					case 'remove_from_store':
587
588						if ( toInitial ) {
589							$item.addClass( 'jet-add-to-store' );
590							$item.removeClass( 'jet-remove-from-store' );
591
592							$item.removeClass( 'in-store' );
593						} else {
594							$item.addClass( 'jet-remove-from-store' );
595							$item.removeClass( 'jet-add-to-store' );
596
597							$item.addClass( 'in-store' );
598
599						}
600
601						break;
602
603					case 'hide':
604
605						if ( toInitial ) {
606							$item.removeClass( 'is-hidden' );
607						} else {
608							$item.addClass( 'is-hidden' );
609						}
610
611						return;
612				}
613
614			}
615
616			if ( toInitial ) {
617				replaceLabel = args.label;
618				replaceIcon  = args.icon;
619				replaceURL   = '#';
620			} else {
621				replaceLabel = args.added_label;
622				replaceIcon  = args.added_icon;
623				replaceURL   = args.added_url;
624			}
625
626			if ( $label.length ) {
627				$label.replaceWith( replaceLabel );
628			} else {
629				$item.append( replaceLabel );
630			}
631
632			if ( $icon.length ) {
633				$icon.replaceWith( replaceIcon );
634			} else {
635				$item.prepend( replaceIcon );
636			}
637
638			if ( isDataStoreLink && 'remove_from_store' === args.action_after_added ) {
639				return;
640			}
641
642			$item.attr( 'href', replaceURL );
643
644			if ( toInitial ) {
645				$item.removeClass( 'in-store' );
646			} else if ( ! $item.hasClass( 'in-store' ) ) {
647				$item.addClass( 'in-store' );
648			}
649
650
651		},
652
653		showConfirmDeleteDialog: function( event ) {
654			event.preventDefault();
655			event.stopPropagation();
656
657			var $this = $( this );
658
659			if ( window.confirm( $this.data( 'delete-message' ) ) ) {
660				window.location = $this.attr( 'href' );
661			}
662
663		},
664
665		handleListingItemClick: function( event ) {
666
667			var url    = $( this ).data( 'url' ),
668				target = $( this ).data( 'target' ) || false;
669
670			if ( url ) {
671
672				event.preventDefault();
673
674				if ( window.elementorFrontend && window.elementorFrontend.isEditMode() ) {
675					return;
676				}
677
678				if ( -1 !== url.indexOf( 'action=open_map_listing_popup' ) ) {
679
680					JetEngine.customUrlActions.runAction( url );
681
682				} else {
683
684					if ( '_blank' === target ) {
685						window.open( url );
686						return;
687					}
688
689					window.location = url;
690				}
691			}
692
693		},
694
695		customUrlActions: {
696			selectorOnClick: 'a[href^="#jet-engine-action"][href*="event=click"]',
697			selectorOnHover: 'a[href^="#jet-engine-action"][href*="event=hover"], [data-url^="#jet-engine-action"][data-url*="event=hover"]',
698
699			init: function() {
700				var timeout = null;
701
702				$( document ).on( 'click.JetEngine', this.selectorOnClick, function( event ) {
703					event.preventDefault();
704					JetEngine.customUrlActions.actionHandler( event )
705				} );
706
707				$( document ).on( 'click.JetEngine', this.selectorOnHover, function( event ) {
708					if ( 'A' === event.currentTarget.nodeName ) {
709						event.preventDefault();
710					}
711				} );
712
713				$( document ).on( {
714					'mouseenter.JetEngine': function( event ) {
715
716						if ( timeout ) {
717							clearTimeout( timeout );
718						}
719
720						timeout = setTimeout( function() {
721							JetEngine.customUrlActions.actionHandler( event )
722						}, window.JetEngineSettings.mapPopupTimeout );
723					},
724					'mouseleave.JetEngine': function() {
725						if ( timeout ) {
726							clearTimeout( timeout );
727							timeout = null;
728						}
729					},
730				}, this.selectorOnHover );
731			},
732
733			actions: {
734				'open_map_listing_popup': function( settings ) {
735
736					if ( ! window.google || ! window.JetEngineMaps ) {
737						return;
738					}
739
740					if ( ! settings.id ) {
741						return;
742					}
743
744					var popupID = settings.id;
745
746					if ( undefined === JetEngineMaps.markersData[ popupID ] ) {
747						return;
748					}
749
750					for ( var i = 0; i < JetEngineMaps.markersData[ popupID ].length; i++ ) {
751
752						var marker = JetEngineMaps.markersData[ popupID ][i].marker,
753							map = marker.getMap();
754
755						if ( !map ) {
756							// A marker inside a cluster
757							var clustererIndex   = JetEngineMaps.markersData[ popupID ][i].clustererIndex,
758								markersClusterer = JetEngineMaps.clusterersData[ clustererIndex ];
759
760							JetEngineMaps.fitMapToMarker( marker, markersClusterer );
761						}
762
763						google.maps.event.trigger( marker, 'click' );
764					}
765				}
766			},
767
768			actionHandler: function( event ) {
769				var url = $( event.currentTarget ).attr( 'href' ) || $( event.currentTarget ).attr( 'data-url' );
770
771				this.runAction( url );
772			},
773
774			runAction: function( url ) {
775				var queryParts = url.split( '&' ),
776					settings = {};
777
778				queryParts.forEach( function( item ) {
779					if ( -1 !== item.indexOf( '=' ) ) {
780						var pair = item.split( '=' );
781
782						settings[ pair[0] ] = decodeURIComponent( pair[1] );
783					}
784				} );
785
786				if ( ! settings.action ) {
787					return;
788				}
789
790				var actionCb = this.actions[ settings.action ];
791
792				if ( ! actionCb ) {
793					return;
794				}
795
796				actionCb( settings );
797			}
798		},
799
800		prepareJetPopup: function( popupData, widgetData, $scope ) {
801
802			var postId = null;
803
804			if ( widgetData['is-jet-engine'] ) {
805				popupData['isJetEngine'] = true;
806
807				var $gridItems    = $scope.closest( '.jet-listing-grid__items' ),
808					$gridItem     = $scope.closest( '.jet-listing-grid__item' ),
809					$calendarItem = $scope.closest( '.jet-calendar-week__day-event' ),
810					$itemObject   = $scope.closest( '[data-item-object]' );
811
812				if ( $gridItems.length ) {
813					popupData['listingSource'] = $gridItems.data( 'listing-source' );
814				}
815
816				if ( $gridItem.length ) {
817					popupData['postId'] = $gridItem.data( 'post-id' );
818				} else if ( $calendarItem.length ) {
819					popupData['postId'] = $calendarItem.data( 'post-id' );
820				} else if ( $itemObject ) {
821					popupData['postId'] = $itemObject.data( 'item-object' );
822				} else if ( window.elementorFrontendConfig && window.elementorFrontendConfig.post ) {
823					popupData['postId'] = window.elementorFrontendConfig.post.id;
824				}
825
826				if ( window.JetEngineFormsEditor && window.JetEngineFormsEditor.hasEditor ) {
827					popupData['hasEditor'] = true;
828				}
829
830			}
831
832			return popupData;
833
834		},
835
836		showCalendarEvent: function( event ) {
837
838			var $this       = $( this ),
839				$day        = $this.closest( '.jet-calendar-week__day' ),
840				$week       = $day.closest( '.jet-calendar-week' ),
841				$events     = $day.find( '.jet-calendar-week__day-content' ),
842				activeClass = 'calendar-event-active';
843
844			if ( $day.hasClass( activeClass ) ) {
845				$day.removeClass( activeClass );
846				JetEngine.activeCalendarDay.remove();
847				JetEngine.activeCalendarDay = null;
848				return;
849			}
850
851			if ( JetEngine.activeCalendarDay ) {
852				JetEngine.activeCalendarDay.remove();
853				$( '.' + activeClass ).removeClass( activeClass );
854				JetEngine.activeCalendarDay = null;
855			}
856
857			$day.addClass( 'calendar-event-active' );
858
859			JetEngine.activeCalendarDay = $( '<tr class="jet-calendar-week"><td colspan="7" class="jet-calendar-week__day jet-calendar-week__day-mobile"><div class="jet-calendar-week__day-mobile-event">' + $events.html() + '</div></td></tr>' );
860
861			// Need for re-init popup events
862			JetEngine.activeCalendarDay.find( '.jet-popup-attach-event-inited' ).removeClass( 'jet-popup-attach-event-inited' );
863			JetEngine.initElementsHandlers( JetEngine.activeCalendarDay );
864
865			JetEngine.activeCalendarDay.insertAfter( $week );
866
867		},
868
869		widgetListingGrid: function( $scope ) {
870
871			var widgetID    = $scope.closest( '.elementor-widget' ).data( 'id' ),
872				$wrapper    = $scope.find( '.jet-listing-grid' ).first(),
873				hasLazyLoad = $wrapper.hasClass( 'jet-listing-grid--lazy-load' ),
874				$listing    = $scope.find( '.jet-listing-grid__items' ).first(),
875				$slider     = $listing.parent( '.jet-listing-grid__slider' ),
876				$masonry    = $listing.hasClass( 'jet-listing-grid__masonry' ) ? $listing : false,
877				navSettings = $listing.data( 'nav' ),
878				masonryGrid = false,
879				listingType = 'elementor';
880
881			if ( hasLazyLoad ) {
882
883				var lazyLoadOptions = $wrapper.data( 'lazy-load' ),
884					widgetSettings = {},
885					$container = $scope.find( '.elementor-widget-container' );
886
887				// Get widget settings from `elementorFrontend` in Editor.
888				if ( window.elementorFrontend && window.elementorFrontend.isEditMode()
889					&& $wrapper.closest( '.elementor[data-elementor-type]' ).hasClass( 'elementor-edit-mode' )
890				) {
891					widgetSettings = JetEngine.getEditorElementSettings( $scope.closest( '.elementor-widget' ) );
892					widgetID       = false; // for avoid get widget settings from document in editor
893				}
894
895				if ( ! $container.length ) {
896					$container = $wrapper;
897					widgetSettings = $scope.data( 'widget-settings' );
898				}
899
900				if ( ! widgetID ) {
901					widgetID    = $scope.data( 'element-id' );
902					listingType = $scope.data( 'listing-type' );
903				}
904
905				JetEngine.lazyLoadListing( {
906					container:      $container,
907					elementID:      widgetID,
908					postID:         lazyLoadOptions.post_id,
909					queriedID:      lazyLoadOptions.queried_id || false,
910					offset:         lazyLoadOptions.offset || '0px',
911					query:          lazyLoadOptions.query || {},
912					listingType:    listingType,
913					widgetSettings: widgetSettings,
914				} );
915
916				return;
917			}
918
919			if ( $slider.length ) {
920				JetEngine.initSlider( $slider );
921			}
922
923			if ( $masonry && $masonry.length ) {
924
925				JetEngine.initMasonry( $masonry );
926
927				/* Looks like this code not needed anymore, but keep commented just in case
928				$( window ).on( 'load', function() {
929					JetEngine.runMasonry( $masonry );
930				} );
931				 */
932
933			}
934
935			if ( navSettings && navSettings.enabled ) {
936
937				var loadMoreType = navSettings.type || 'click';
938
939				switch ( loadMoreType ) {
940					case 'click':
941
942						if ( navSettings.more_el ) {
943
944							var $button = $( navSettings.more_el ),
945								page    = parseInt( $listing.data( 'page' ), 10 ) || 0,
946								pages   = parseInt( $listing.data( 'pages' ), 10 ) || 0;
947
948							if ( $button.length ) {
949
950								if ( page === pages && ! window.elementor ) {
951									$button.css( 'display', 'none' );
952								} else {
953									$button.removeAttr( 'style' );
954								}
955
956								$( document ).off( 'click', navSettings.more_el ).on( 'click', navSettings.more_el, JetEngine.handleMore.bind( {
957									container: $listing,
958									button: $button,
959									settings: navSettings,
960									pages: pages,
961									masonry: $masonry,
962									slider: $slider,
963								} ) );
964
965							}
966						}
967
968						break;
969
970					case 'scroll':
971
972						if ( ( ! window.elementorFrontend || ! window.elementorFrontend.isEditMode() ) && ! $slider.length ) {
973
974							$( window )
975								.off( 'scroll.JetEngineInfinityScroll/' + widgetID )
976								.on( 'scroll.JetEngineInfinityScroll/' + widgetID, JetEngine.debounce( 250, JetEngine.handleInfiniteScroll.bind( {
977									container: $listing,
978									settings:  navSettings,
979									masonry:   $masonry,
980									slider:    $slider,
981								} ) ) );
982
983						}
984
985						break;
986				}
987			}
988
989		},
990
991		initMasonry: function( $masonry ) {
992			imagesLoaded( $masonry, function() {
993				JetEngine.runMasonry( $masonry );
994			} );
995		},
996
997		runMasonry: function( $masonry ) {
998			var $eWidget = $masonry.closest( '.elementor-widget' ),
999				$items  = $( '> .jet-listing-grid__item', $masonry ),
1000				options = $masonry.data( 'masonry-grid-options' );
1001
1002			// Reset masonry
1003			$items.css( {
1004				marginTop: ''
1005			} );
1006
1007			var args = {
1008				container: $masonry[0],
1009				margin: 0,
1010			};
1011
1012			if ( $eWidget.length ) {
1013				var settings     = JetEngine.getElementorElementSettings( $eWidget ),
1014					breakpoints  = {},
1015					eBreakpoints = window.elementorFrontend.config.responsive.activeBreakpoints;
1016
1017				args.columns = settings.columns_widescreen ? +settings.columns_widescreen : +settings.columns;
1018
1019				Object.keys( eBreakpoints ).reverse().forEach( function( breakpointName ) {
1020
1021					if ( settings['columns_' + breakpointName] ) {
1022						if ( 'widescreen' === breakpointName ) {
1023							breakpoints[eBreakpoints[breakpointName].value - 1] = +settings['columns'];
1024						} else {
1025							breakpoints[eBreakpoints[breakpointName].value] = +settings['columns_' + breakpointName];
1026						}
1027					}
1028
1029				} );
1030
1031				args.breakAt = breakpoints;
1032
1033			} else {
1034				args.columns = options.columns.desktop;
1035				args.breakAt = {
1036					1025: options.columns.tablet,
1037					768:  options.columns.mobile,
1038				};
1039			}
1040
1041			var masonryInstance = Macy( args );
1042
1043			masonryInstance.runOnImageLoad( function () {
1044				masonryInstance.recalculate( true );
1045			}, true );
1046
1047			// Event to recalculate current masonry listings.
1048			$masonry.on( 'jet-engine/listing/recalculate-masonry-listing', function() {
1049				masonryInstance.runOnImageLoad( function () {
1050					masonryInstance.recalculate( true );
1051				}, true );
1052			} );
1053
1054			// Event to recalculate all masonry listings.
1055			$( document ).on( 'jet-engine/listing/recalculate-masonry', function() {
1056				masonryInstance.recalculate( true );
1057			} );
1058
1059		},
1060
1061		ajaxGetListing: function( options, doneCallback, failCallback ) {
1062
1063			var container = options.container || false,
1064				handler = options.handler || false,
1065				masonry = options.masonry || false,
1066				slider = options.slider || false,
1067				append = options.append || false,
1068				query = options.query || {},
1069				widgetSettings = options.widgetSettings || {},
1070				postID = options.postID || false,
1071				queriedID = options.queriedID || false,
1072				elementID = options.elementID || false,
1073				page = options.page || 1,
1074				preventCSS = options.preventCSS || false,
1075				listingType = options.listingType || false,
1076				isEditMode = window.elementorFrontend && window.elementorFrontend.isEditMode();
1077
1078			doneCallback = doneCallback || function( response ) {};
1079
1080			if ( ! container|| ! handler ) {
1081				return;
1082			}
1083
1084			if ( ! preventCSS ) {
1085				container.css({
1086					pointerEvents: 'none',
1087					opacity: '0.5',
1088					cursor: 'default',
1089				});
1090			}
1091
1092			$.ajax({
1093				url: JetEngineSettings.ajaxlisting,
1094				type: 'POST',
1095				dataType: 'json',
1096				data: {
1097					action: 'jet_engine_ajax',
1098					handler: handler,
1099					query: query,
1100					widget_settings: widgetSettings,
1101					page_settings: {
1102						post_id: postID,
1103						queried_id: queriedID,
1104						element_id: elementID,
1105						page: page,
1106					},
1107					listing_type: listingType,
1108					isEditMode: isEditMode,
1109					addedPostCSS: JetEngine.addedPostCSS
1110				},
1111			}).done( function( response ) {
1112
1113				// container.removeAttr( 'style' );
1114
1115				// Manual reset container style to prevent removal of masonry styles.
1116				if ( !preventCSS ) {
1117					container.css( {
1118						pointerEvents: '',
1119						opacity: '',
1120						cursor: '',
1121					} );
1122				}
1123
1124				if ( response.success ) {
1125
1126					JetEngine.enqueueAssetsFromResponse( response );
1127
1128					container.data( 'page', page );
1129
1130					var $html = $( response.data.html );
1131
1132					JetEngine.initFrontStores( $html );
1133
1134					if ( slider && slider.length ) {
1135
1136						var $slider = slider.find( '> .jet-listing-grid__items' );
1137
1138						if ( ! $slider.hasClass( 'slick-initialized' ) ) {
1139
1140							if ( append ) {
1141								container.append( $html );
1142							} else {
1143								container.html( $html );
1144							}
1145
1146							var itemsCount = container.find( '> .jet-listing-grid__item' ).length;
1147
1148							slider.addClass( 'jet-listing-grid__slider' );
1149							JetEngine.initSlider( slider, { itemsCount: itemsCount } );
1150
1151						} else {
1152							$html.each( function( index, el ) {
1153								$slider.slick( 'slickAdd', el );
1154							});
1155						}
1156
1157					} else {
1158
1159						if ( append ) {
1160							container.append( $html );
1161						} else {
1162							container.html( $html );
1163						}
1164
1165						if ( masonry && masonry.length ) {
1166							//JetEngine.initMasonry( masonry );
1167							masonry.trigger( 'jet-engine/listing/recalculate-masonry-listing' );
1168						}
1169
1170					}
1171
1172					JetEngine.initElementsHandlers( $html );
1173				}
1174
1175			} ).done( doneCallback ).fail( function() {
1176				container.removeAttr( 'style' );
1177				if ( failCallback ) {
1178					failCallback.call();
1179				}
1180
1181			} );
1182
1183		},
1184
1185		handleMore: function( event ) {
1186
1187			event.preventDefault();
1188
1189			var self     = this,
1190				$wrapper = self.container.closest( '.jet-listing-grid' ),
1191				page     = parseInt( self.container.data( 'page' ), 10 );
1192
1193			page++;
1194
1195			self.button.css({
1196				pointerEvents: 'none',
1197				opacity: '0.5',
1198				cursor: 'default',
1199			});
1200
1201			$wrapper.addClass( 'jet-listing-grid-loading' );
1202
1203			JetEngine.ajaxGetListing( {
1204				handler: 'listing_load_more',
1205				container: self.container,
1206				masonry: self.masonry,
1207				slider: self.slider,
1208				append: true,
1209				query: self.settings.query,
1210				widgetSettings: self.settings.widget_settings,
1211				page: page,
1212			}, function( response ) {
1213
1214				$wrapper.removeClass( 'jet-listing-grid-loading' );
1215				self.button.removeAttr( 'style' );
1216
1217				if ( response.success && page === self.pages ) {
1218					self.button.css( 'display', 'none' );
1219				}
1220				$( document ).trigger( 'jet-engine/listing-grid/after-load-more', [ self, response ] );
1221			}, function() {
1222				$wrapper.removeClass( 'jet-listing-grid-loading' );
1223				self.button.removeAttr( 'style' );
1224			} );
1225
1226		},
1227
1228		handleInfiniteScroll: function( event ) {
1229			var self     = this,
1230				$wrapper = self.container.closest( '.jet-listing-grid' ),
1231				page     = parseInt( self.container.data( 'page' ), 10 ),
1232				pages    = parseInt( self.container.data( 'pages' ), 10 );
1233
1234			if ( self.container.hasClass( 'jet-listing-not-found' ) ) {
1235				return;
1236			}
1237
1238			if ( page === pages ) {
1239				return;
1240			}
1241
1242			if ( JetEngine.lazyLoading ) {
1243				return;
1244			}
1245
1246			if ( ! self.container.outerHeight() ) {
1247				return;
1248			}
1249
1250			if ( $( window ).scrollTop() + $( window ).outerHeight() < self.container.offset().top + self.container.outerHeight() ) {
1251				return;
1252			}
1253
1254			page++;
1255			JetEngine.lazyLoading = true;
1256			$wrapper.addClass( 'jet-listing-grid-loading' );
1257
1258			JetEngine.ajaxGetListing( {
1259				handler: 'listing_load_more',
1260				container: self.container,
1261				masonry: self.masonry,
1262				slider: self.slider,
1263				append: true,
1264				query: self.settings.query,
1265				widgetSettings: self.settings.widget_settings,
1266				page: page,
1267			}, function( response ) {
1268				JetEngine.lazyLoading = false;
1269				$wrapper.removeClass( 'jet-listing-grid-loading' );
1270				$( document ).trigger( 'jet-engine/listing-grid/after-load-more', [ self, response ] );
1271			}, function() {
1272				JetEngine.lazyLoading = false;
1273				$wrapper.removeClass( 'jet-listing-grid-loading' );
1274			} );
1275
1276		},
1277
1278		lazyLoadListing: function( args ) {
1279
1280			var $wrapper = args.container.find( '.jet-listing-grid' ),
1281				observer = new IntersectionObserver(
1282					function( entries, observer ) {
1283
1284						if ( entries[0].isIntersecting ) {
1285
1286							JetEngine.lazyLoading = true;
1287
1288							if ( ! $wrapper.length ) {
1289								$wrapper = args.container;
1290							}
1291
1292							$wrapper.addClass( 'jet-listing-grid-loading' );
1293
1294							JetEngine.ajaxGetListing( {
1295								handler: 'get_listing',
1296								container: args.container,
1297								masonry: false,
1298								slider: false,
1299								append: false,
1300								elementID: args.elementID,
1301								postID: args.postID,
1302								queriedID: args.queriedID,
1303								query: args.query,
1304								widgetSettings: args.widgetSettings,
1305								listingType: args.listingType,
1306								preventCSS: true,
1307							}, function( response ) {
1308
1309								$wrapper.removeClass( 'jet-listing-grid-loading' );
1310
1311								var $widget = args.container.closest( '.elementor-widget' );
1312
1313								if ( ! $widget.length ) {
1314									$widget = args.container.closest( '.jet-listing-grid--blocks' );
1315								}
1316
1317								if ( $widget.length ) {
1318									$widget.find( '.jet-listing-grid' ).removeClass( 'jet-listing-grid--lazy-load' );
1319								}
1320
1321								JetEngine.widgetListingGrid( $widget );
1322								JetEngine.lazyLoading = false;
1323
1324								var needReInitFilters = false,
1325									isEditMode = window.elementorFrontend && window.elementorFrontend.isEditMode();
1326
1327								if ( ! isEditMode && window.JetSmartFilterSettings ) {
1328
1329									if ( response.data.filters_data ) {
1330										$.each( response.data.filters_data, function( param, data ) {
1331											if ( window.JetSmartFilterSettings[ param ]['jet-engine'] ) {
1332												window.JetSmartFilterSettings[ param ]['jet-engine'] = $.extend(
1333													{},
1334													window.JetSmartFilterSettings[ param ]['jet-engine'],
1335													data
1336												);
1337											} else {
1338												window.JetSmartFilterSettings[ param ]['jet-engine'] = data;
1339											}
1340										});
1341
1342										needReInitFilters = true;
1343									}
1344
1345									if ( response.data.indexer_data ) {
1346										const {
1347											provider = false,
1348											query = {}
1349										} = response.data.indexer_data;
1350
1351										window.JetSmartFilters.setIndexedData( provider, query );
1352									}
1353								}
1354
1355								// ReInit filters
1356								if ( needReInitFilters && window.JetSmartFilters ) {
1357									window.JetSmartFilters.initializeFilters();
1358								}
1359
1360								$( document ).trigger( 'jet-engine/listing-grid/after-lazy-load', [ args, response ] );
1361
1362							}, function() {
1363								JetEngine.lazyLoading = false;
1364
1365								if ( ! $wrapper.length ) {
1366									$wrapper = args.container;
1367								}
1368
1369								$wrapper.removeClass( 'jet-listing-grid-loading' );
1370							} );
1371
1372							// Detach observer after the first load the listing
1373							observer.unobserve( entries[0].target );
1374						}
1375					},
1376					{
1377						rootMargin: '0% 0% ' + args.offset + ' 0%'
1378					}
1379				);
1380
1381			observer.observe( args.container[0] );
1382		},
1383
1384		initSlider: function( $slider, customOptions ) {
1385			var $eWidget    = $slider.closest( '.elementor-widget' ),
1386				options     = $slider.data( 'slider_options' ),
1387				windowWidth = $( window ).width(),
1388				tabletBP    = 1025,
1389				mobileBP    = 768,
1390				tabletSlides, mobileSlides, defaultOptions, slickOptions;
1391
1392			customOptions = customOptions || {};
1393
1394			options = $.extend( {}, options, customOptions );
1395
1396			if ( $eWidget.length ) {
1397				var settings     = JetEngine.getElementorElementSettings( $eWidget ),
1398					responsive   = [],
1399					deviceMode   = elementorFrontend.getCurrentDeviceMode(),
1400					eBreakpoints = window.elementorFrontend.config.responsive.activeBreakpoints;
1401
1402				options.slidesToShow = settings.columns_widescreen ? +settings.columns_widescreen : +settings.columns;
1403
1404				Object.keys( eBreakpoints ).reverse().forEach( function( breakpointName ) {
1405
1406					if ( settings['columns_' + breakpointName] ) {
1407
1408						if ( 'widescreen' === breakpointName ) {
1409
1410							responsive.push( {
1411								breakpoint: eBreakpoints[breakpointName].value,
1412								settings: {
1413									slidesToShow: +settings['columns'],
1414								}
1415							} );
1416
1417						} else {
1418							var breakpointSettings = {
1419									breakpoint: eBreakpoints[breakpointName].value + 1,
1420									settings:   {
1421										slidesToShow: +settings['columns_' + breakpointName],
1422									}
1423								};
1424
1425							if ( options.slidesToScroll > breakpointSettings.settings.slidesToShow ) {
1426								breakpointSettings.settings.slidesToScroll = breakpointSettings.settings.slidesToShow;
1427							}
1428
1429							if ( 'mobile' === breakpointName ) {
1430								breakpointSettings.settings.slidesToScroll = 1;
1431							}
1432
1433							responsive.push( breakpointSettings );
1434						}
1435					}
1436
1437				} );
1438
1439				options.responsive = responsive;
1440
1441			} else {
1442
1443				if ( options.itemsCount <= options.slidesToShow.desktop && windowWidth >= tabletBP ) { // 1025 - ...
1444					$slider.removeClass( 'jet-listing-grid__slider' );
1445					return;
1446				} else if ( options.itemsCount <= options.slidesToShow.tablet && tabletBP > windowWidth && windowWidth >= mobileBP ) { // 768 - 1024
1447					$slider.removeClass( 'jet-listing-grid__slider' );
1448					return;
1449				} else if ( options.itemsCount <= options.slidesToShow.mobile && windowWidth < mobileBP ) { // 0 - 767
1450					$slider.removeClass( 'jet-listing-grid__slider' );
1451					return;
1452				}
1453
1454				if ( options.slidesToShow.tablet ) {
1455					tabletSlides = options.slidesToShow.tablet;
1456				} else {
1457					tabletSlides = 1 === options.slidesToShow.desktop ? 1 : 2;
1458				}
1459
1460				if ( options.slidesToShow.mobile ) {
1461					mobileSlides = options.slidesToShow.mobile;
1462				} else {
1463					mobileSlides = 1;
1464				}
1465
1466				options.slidesToShow = options.slidesToShow.desktop;
1467
1468				options.responsive = [
1469					{
1470						breakpoint: 1025,
1471						settings: {
1472							slidesToShow: tabletSlides,
1473							slidesToScroll: options.slidesToScroll > tabletSlides ? tabletSlides : options.slidesToScroll
1474						}
1475					},
1476					{
1477						breakpoint: 768,
1478						settings: {
1479							slidesToShow: mobileSlides,
1480							slidesToScroll: 1
1481						}
1482					}
1483				];
1484			}
1485
1486			defaultOptions = {
1487				customPaging: function( slider, i ) {
1488					return $( '<span />' ).text( i + 1 ).attr( 'role', 'tab' );
1489				},
1490				slide: '.jet-listing-grid__item',
1491				dotsClass: 'jet-slick-dots',
1492			};
1493
1494			slickOptions = $.extend( {}, defaultOptions, options );
1495
1496			var $sliderItems = $slider.find( '> .jet-listing-grid__items' );
1497
1498			if ( slickOptions.infinite ) {
1499				$sliderItems.on( 'init', function() {
1500					var $items        = $( this ),
1501						$clonedSlides = $( '> .slick-list > .slick-track > .slick-cloned.jet-listing-grid__item', $items );
1502
1503					if ( !$clonedSlides.length ) {
1504						return;
1505					}
1506
1507					JetEngine.initElementsHandlers( $clonedSlides );
1508				} );
1509			}
1510
1511			if ( $sliderItems.hasClass( 'slick-initialized' ) ) {
1512				$sliderItems.slick( 'refresh', true );
1513				return;
1514			}
1515
1516			$sliderItems.slick( slickOptions );
1517		},
1518
1519		maybeReinitSlider: function( event, $scope ) {
1520			var $slider = $scope.find( '.jet-listing-grid__slider' );
1521
1522			if ( $slider.length ) {
1523				$slider.each( function() {
1524					JetEngine.initSlider( $( this ) );
1525				} );
1526			}
1527		},
1528
1529		widgetDynamicField: function( $scope ) {
1530
1531			var $slider = $scope.find( '.jet-engine-gallery-slider' );
1532
1533			if ( $slider.length ) {
1534				if ( $.isFunction( $.fn.imagesLoaded ) ) {
1535					$slider.imagesLoaded().always( function( instance ) {
1536
1537						var $eWidget = $slider.closest( '.elementor-widget' );
1538
1539						if ( $slider.hasClass( 'slick-initialized' ) ) {
1540							$slider.slick( 'refresh', true );
1541						} else {
1542							var atts = $slider.data( 'atts' );
1543
1544							if ( $eWidget.length ) {
1545								var settings     = JetEngine.getElementorElementSettings( $scope ),
1546									eBreakpoints = window.elementorFrontend.config.responsive.activeBreakpoints,
1547									responsive   = [];
1548
1549								if ( settings.img_slider_cols || settings.img_slider_cols_widescreen ) {
1550									atts.slidesToShow = settings.img_slider_cols_widescreen ? +settings.img_slider_cols_widescreen : +settings.img_slider_cols;
1551								}
1552
1553								Object.keys( eBreakpoints ).reverse().forEach( function( breakpointName ) {
1554
1555									if ( settings['img_slider_cols_' + breakpointName] ) {
1556
1557										if ( 'widescreen' === breakpointName ) {
1558
1559											responsive.push( {
1560												breakpoint: eBreakpoints[breakpointName].value,
1561												settings:   {
1562													slidesToShow: +settings['img_slider_cols'],
1563												}
1564											} );
1565
1566										} else {
1567											var breakpointSettings = {
1568												breakpoint: eBreakpoints[breakpointName].value + 1,
1569												settings:   {
1570													slidesToShow: +settings['img_slider_cols_' + breakpointName],
1571												}
1572											};
1573
1574											responsive.push( breakpointSettings );
1575										}
1576									}
1577
1578								} );
1579
1580								atts.responsive = responsive;
1581							}
1582
1583							$slider.slick( atts );
1584						}
1585					} );
1586				}
1587			}
1588
1589		},
1590
1591		switchCalendarMonth: function( $event ) {
1592
1593			var $this     = $( this ),
1594				$calendar = $this.closest( '.jet-calendar' ),
1595				$widget   = $calendar.closest( '.elementor-widget-container' ),
1596				settings  = $calendar.data( 'settings' ),
1597				post      = $calendar.data( 'post' ),
1598				month     = $this.data( 'month' );
1599
1600			if ( !$widget.length ) {
1601				$widget = $calendar.closest( '.jet-listing-calendar-block' )
1602			}
1603
1604			$calendar.addClass( 'jet-calendar-loading' );
1605
1606			JetEngine.currentRequest = {
1607				jet_engine_action: 'jet_engine_calendar_get_month',
1608				month: month,
1609				settings: settings,
1610				post: post,
1611			};
1612
1613			$( document ).trigger( 'jet-engine-request-calendar' );
1614
1615			$.ajax({
1616				url: JetEngineSettings.ajaxlisting,
1617				type: 'POST',
1618				dataType: 'json',
1619				data: JetEngine.currentRequest,
1620			}).done( function( response ) {
1621				if ( response.success ) {
1622					$widget.html( response.data.content );
1623					JetEngine.initElementsHandlers( $widget );
1624				}
1625				$calendar.removeClass( 'jet-calendar-loading' );
1626			} );
1627		},
1628
1629		initElementsHandlers: function( $selector ) {
1630			$selector.find( '[data-element_type]' ).each( function() {
1631				var $this       = $( this ),
1632					elementType = $this.data( 'element_type' );
1633
1634				if ( !elementType ) {
1635					return;
1636				}
1637
1638				if ( 'widget' === elementType ) {
1639					elementType = $this.data( 'widget_type' );
1640					window.elementorFrontend.hooks.doAction( 'frontend/element_ready/widget', $this, $ );
1641				}
1642
1643				window.elementorFrontend.hooks.doAction( 'frontend/element_ready/global', $this, $ );
1644				window.elementorFrontend.hooks.doAction( 'frontend/element_ready/' + elementType, $this, $ );
1645
1646			} );
1647		},
1648
1649		getElementorElementSettings: function( $scope ) {
1650
1651			if ( window.elementorFrontend && window.elementorFrontend.isEditMode() && $scope.hasClass( 'elementor-element-edit-mode' ) ) {
1652				return JetEngine.getEditorElementSettings( $scope );
1653			}
1654
1655			return $scope.data( 'settings' ) || {};
1656		},
1657
1658		getEditorElementSettings: function( $scope ) {
1659			var modelCID = $scope.data( 'model-cid' ),
1660				elementData;
1661
1662			if ( ! modelCID ) {
1663				return {};
1664			}
1665
1666			if ( ! window.elementorFrontend.hasOwnProperty( 'config' ) ) {
1667				return {};
1668			}
1669
1670			if ( ! window.elementorFrontend.config.hasOwnProperty( 'elements' ) ) {
1671				return {};
1672			}
1673
1674			if ( ! window.elementorFrontend.config.elements.hasOwnProperty( 'data' ) ) {
1675				return {};
1676			}
1677
1678			elementData = window.elementorFrontend.config.elements.data[ modelCID ];
1679
1680			if ( ! elementData ) {
1681				return {};
1682			}
1683
1684			return elementData.toJSON();
1685		},
1686
1687		debounce: function( threshold, callback ) {
1688			var timeout;
1689
1690			return function debounced( $event ) {
1691				function delayed() {
1692					callback.call( this, $event );
1693					timeout = null;
1694				}
1695
1696				if ( timeout ) {
1697					clearTimeout( timeout );
1698				}
1699
1700				timeout = setTimeout( delayed, threshold );
1701			};
1702		},
1703
1704		updateAddedStyles: function() {
1705			if ( window.JetEngineSettings && window.JetEngineSettings.addedPostCSS ) {
1706				$.each( window.JetEngineSettings.addedPostCSS, function( ind, cssID ) {
1707					JetEngine.addedStyles.push( 'elementor-post-' + cssID );
1708					JetEngine.addedPostCSS.push( cssID );
1709				} );
1710			}
1711		},
1712
1713		enqueueAssetsFromResponse: function( response ) {
1714			if ( response.data.scripts ) {
1715				JetEngine.enqueueScripts( response.data.scripts );
1716			}
1717
1718			if ( response.data.styles ) {
1719				JetEngine.enqueueStyles( response.data.styles );
1720			}
1721		},
1722
1723		enqueueScripts: function( scripts ) {
1724			$.each( scripts, function( handle, scriptHtml ) {
1725				JetEngine.enqueueScript( handle, scriptHtml )
1726			} );
1727		},
1728
1729		enqueueStyles: function( styles ) {
1730			$.each( styles, function( handle, styleHtml ) {
1731				JetEngine.enqueueStyle( handle, styleHtml )
1732			} );
1733		},
1734
1735		enqueueScript: function( handle, scriptHtml ) {
1736
1737			if ( -1 !== JetEngine.addedScripts.indexOf( handle ) ) {
1738				return;
1739			}
1740
1741			var selector = 'script[id="' + handle + '-js"]';
1742
1743			if ( $( selector ).length ) {
1744				return;
1745			}
1746
1747			$( 'body' ).append( scriptHtml );
1748
1749			JetEngine.addedScripts.push( handle );
1750		},
1751
1752		enqueueStyle: function( handle, styleHtml ) {
1753
1754			if ( -1 !== handle.indexOf( 'google-fonts' ) ) {
1755				JetEngine.enqueueGoogleFonts( handle, styleHtml );
1756				return;
1757			}
1758
1759			if ( -1 !== JetEngine.addedStyles.indexOf( handle ) ) {
1760				return;
1761			}
1762
1763			var selector = 'link[id="' + handle + '-css"],style[id="' + handle + '"]';
1764
1765			if ( $( selector ).length ) {
1766				return;
1767			}
1768
1769			$( 'head' ).append( styleHtml );
1770
1771			JetEngine.addedStyles.push( handle );
1772
1773			if ( -1 !== handle.indexOf( 'elementor-post' ) ) {
1774				var postID = handle.replace( 'elementor-post-', '' );
1775				JetEngine.addedPostCSS.push( postID );
1776			}
1777		},
1778
1779		enqueueGoogleFonts: function( handle, styleHtml ) {
1780
1781			var selector = 'link[id="' + handle + '-css"]';
1782
1783			if ( $( selector ).length ) {}
1784
1785			$( 'head' ).append( styleHtml );
1786		},
1787
1788		filters: ( function() {
1789
1790			var callbacks = {};
1791
1792			return {
1793
1794				addFilter: function( name, callback ) {
1795
1796					if ( ! callbacks.hasOwnProperty( name ) ) {
1797						callbacks[name] = [];
1798					}
1799
1800					callbacks[name].push(callback);
1801
1802				},
1803
1804				applyFilters: function( name, value, args ) {
1805
1806					if ( ! callbacks.hasOwnProperty( name ) ) {
1807						return value;
1808					}
1809
1810					if ( args === undefined ) {
1811						args = [];
1812					}
1813
1814					var container = callbacks[ name ];
1815					var cbLen     = container.length;
1816
1817					for (var i = 0; i < cbLen; i++) {
1818						if (typeof container[i] === 'function') {
1819							value = container[i](value, args);
1820						}
1821					}
1822
1823					return value;
1824				}
1825
1826			};
1827
1828		})()
1829
1830	};
1831
1832	$( window ).on( 'elementor/frontend/init', JetEngine.init );
1833
1834	window.JetEngine = JetEngine;
1835
1836	JetEngine.commonInit();
1837
1838	window.addEventListener( 'DOMContentLoaded', function() {
1839		JetEngine.initBlocks()
1840	} );
1841
1842}( jQuery ) );

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.