PageSourceSearch

https://rivistabancaria.it/wp-content/plugins/jet-engine/assets/js/frontend.js?ver=2.11.10

js rivistabancaria.it collected 2026-10-01 11:54:54 UTC 48,007 bytes, 1,833 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				page = parseInt( self.container.data( 'page' ), 10 );
1191
1192			page++;
1193
1194			self.button.css({
1195				pointerEvents: 'none',
1196				opacity: '0.5',
1197				cursor: 'default',
1198			});
1199
1200			JetEngine.ajaxGetListing( {
1201				handler: 'listing_load_more',
1202				container: self.container,
1203				masonry: self.masonry,
1204				slider: self.slider,
1205				append: true,
1206				query: self.settings.query,
1207				widgetSettings: self.settings.widget_settings,
1208				page: page,
1209			}, function( response ) {
1210
1211				self.button.removeAttr( 'style' );
1212
1213				if ( response.success && page === self.pages ) {
1214					self.button.css( 'display', 'none' );
1215				}
1216				$( document ).trigger( 'jet-engine/listing-grid/after-load-more', [ self, response ] );
1217			}, function() {
1218				self.button.removeAttr( 'style' );
1219			} );
1220
1221		},
1222
1223		handleInfiniteScroll: function( event ) {
1224			var self  = this,
1225				page  = parseInt( self.container.data( 'page' ), 10 ),
1226				pages = parseInt( self.container.data( 'pages' ), 10 );
1227
1228			if ( self.container.hasClass( 'jet-listing-not-found' ) ) {
1229				return;
1230			}
1231
1232			if ( page === pages ) {
1233				return;
1234			}
1235
1236			if ( JetEngine.lazyLoading ) {
1237				return;
1238			}
1239
1240			if ( ! self.container.outerHeight() ) {
1241				return;
1242			}
1243
1244			if ( $( window ).scrollTop() + $( window ).outerHeight() < self.container.offset().top + self.container.outerHeight() ) {
1245				return;
1246			}
1247
1248			page++;
1249			JetEngine.lazyLoading = true;
1250
1251			JetEngine.ajaxGetListing( {
1252				handler: 'listing_load_more',
1253				container: self.container,
1254				masonry: self.masonry,
1255				slider: self.slider,
1256				append: true,
1257				query: self.settings.query,
1258				widgetSettings: self.settings.widget_settings,
1259				page: page,
1260			}, function( response ) {
1261				JetEngine.lazyLoading = false;
1262				$( document ).trigger( 'jet-engine/listing-grid/after-load-more', [ self, response ] );
1263			}, function() {
1264				JetEngine.lazyLoading = false;
1265			} );
1266
1267		},
1268
1269		lazyLoadListing: function( args ) {
1270
1271			var $wrapper = args.container.find( '.jet-listing-grid' ),
1272				observer = new IntersectionObserver(
1273					function( entries, observer ) {
1274
1275						if ( entries[0].isIntersecting ) {
1276
1277							JetEngine.lazyLoading = true;
1278
1279							if ( ! $wrapper.length ) {
1280								$wrapper = args.container;
1281							}
1282
1283							$wrapper.addClass( 'jet-listing-grid-loading' );
1284
1285							JetEngine.ajaxGetListing( {
1286								handler: 'get_listing',
1287								container: args.container,
1288								masonry: false,
1289								slider: false,
1290								append: false,
1291								elementID: args.elementID,
1292								postID: args.postID,
1293								queriedID: args.queriedID,
1294								query: args.query,
1295								widgetSettings: args.widgetSettings,
1296								listingType: args.listingType,
1297								preventCSS: true,
1298							}, function( response ) {
1299
1300								$wrapper.removeClass( 'jet-listing-grid-loading' );
1301
1302								var $widget = args.container.closest( '.elementor-widget' );
1303
1304								if ( ! $widget.length ) {
1305									$widget = args.container.closest( '.jet-listing-grid--blocks' );
1306								}
1307
1308								if ( $widget.length ) {
1309									$widget.find( '.jet-listing-grid' ).removeClass( 'jet-listing-grid--lazy-load' );
1310								}
1311
1312								JetEngine.widgetListingGrid( $widget );
1313								JetEngine.lazyLoading = false;
1314
1315								var needReInitFilters = false,
1316									isEditMode = window.elementorFrontend && window.elementorFrontend.isEditMode();
1317
1318								if ( ! isEditMode && window.JetSmartFilterSettings ) {
1319
1320									if ( response.data.filters_data ) {
1321										$.each( response.data.filters_data, function( param, data ) {
1322											if ( window.JetSmartFilterSettings[ param ]['jet-engine'] ) {
1323												window.JetSmartFilterSettings[ param ]['jet-engine'] = $.extend(
1324													{},
1325													window.JetSmartFilterSettings[ param ]['jet-engine'],
1326													data
1327												);
1328											} else {
1329												window.JetSmartFilterSettings[ param ]['jet-engine'] = data;
1330											}
1331										});
1332
1333										needReInitFilters = true;
1334									}
1335
1336									if ( response.data.indexer_data ) {
1337										const {
1338											provider = false,
1339											query = {}
1340										} = response.data.indexer_data;
1341
1342										window.JetSmartFilters.setIndexedData( provider, query );
1343									}
1344								}
1345
1346								// ReInit filters
1347								if ( needReInitFilters && window.JetSmartFilters ) {
1348									window.JetSmartFilters.initializeFilters();
1349								}
1350
1351								$( document ).trigger( 'jet-engine/listing-grid/after-lazy-load', [ args, response ] );
1352
1353							}, function() {
1354								JetEngine.lazyLoading = false;
1355
1356								if ( ! $wrapper.length ) {
1357									$wrapper = args.container;
1358								}
1359
1360								$wrapper.removeClass( 'jet-listing-grid-loading' );
1361							} );
1362
1363							// Detach observer after the first load the listing
1364							observer.unobserve( entries[0].target );
1365						}
1366					},
1367					{
1368						rootMargin: '0% 0% ' + args.offset + ' 0%'
1369					}
1370				);
1371
1372			observer.observe( args.container[0] );
1373		},
1374
1375		initSlider: function( $slider, customOptions ) {
1376			var $eWidget    = $slider.closest( '.elementor-widget' ),
1377				options     = $slider.data( 'slider_options' ),
1378				windowWidth = $( window ).width(),
1379				tabletBP    = 1025,
1380				mobileBP    = 768,
1381				tabletSlides, mobileSlides, defaultOptions, slickOptions;
1382
1383			customOptions = customOptions || {};
1384
1385			options = $.extend( {}, options, customOptions );
1386
1387			if ( $eWidget.length ) {
1388				var settings     = JetEngine.getElementorElementSettings( $eWidget ),
1389					responsive   = [],
1390					deviceMode   = elementorFrontend.getCurrentDeviceMode(),
1391					eBreakpoints = window.elementorFrontend.config.responsive.activeBreakpoints;
1392
1393				options.slidesToShow = settings.columns_widescreen ? +settings.columns_widescreen : +settings.columns;
1394
1395				Object.keys( eBreakpoints ).reverse().forEach( function( breakpointName ) {
1396
1397					if ( settings['columns_' + breakpointName] ) {
1398
1399						if ( 'widescreen' === breakpointName ) {
1400
1401							responsive.push( {
1402								breakpoint: eBreakpoints[breakpointName].value,
1403								settings: {
1404									slidesToShow: +settings['columns'],
1405								}
1406							} );
1407
1408						} else {
1409							var breakpointSettings = {
1410									breakpoint: eBreakpoints[breakpointName].value + 1,
1411									settings:   {
1412										slidesToShow: +settings['columns_' + breakpointName],
1413									}
1414								};
1415
1416							if ( options.slidesToScroll > breakpointSettings.settings.slidesToShow ) {
1417								breakpointSettings.settings.slidesToScroll = breakpointSettings.settings.slidesToShow;
1418							}
1419
1420							if ( 'mobile' === breakpointName ) {
1421								breakpointSettings.settings.slidesToScroll = 1;
1422							}
1423
1424							responsive.push( breakpointSettings );
1425						}
1426					}
1427
1428				} );
1429
1430				options.responsive = responsive;
1431
1432			} else {
1433
1434				if ( options.itemsCount <= options.slidesToShow.desktop && windowWidth >= tabletBP ) { // 1025 - ...
1435					$slider.removeClass( 'jet-listing-grid__slider' );
1436					return;
1437				} else if ( options.itemsCount <= options.slidesToShow.tablet && tabletBP > windowWidth && windowWidth >= mobileBP ) { // 768 - 1024
1438					$slider.removeClass( 'jet-listing-grid__slider' );
1439					return;
1440				} else if ( options.itemsCount <= options.slidesToShow.mobile && windowWidth < mobileBP ) { // 0 - 767
1441					$slider.removeClass( 'jet-listing-grid__slider' );
1442					return;
1443				}
1444
1445				if ( options.slidesToShow.tablet ) {
1446					tabletSlides = options.slidesToShow.tablet;
1447				} else {
1448					tabletSlides = 1 === options.slidesToShow.desktop ? 1 : 2;
1449				}
1450
1451				if ( options.slidesToShow.mobile ) {
1452					mobileSlides = options.slidesToShow.mobile;
1453				} else {
1454					mobileSlides = 1;
1455				}
1456
1457				options.slidesToShow = options.slidesToShow.desktop;
1458
1459				options.responsive = [
1460					{
1461						breakpoint: 1025,
1462						settings: {
1463							slidesToShow: tabletSlides,
1464							slidesToScroll: options.slidesToScroll > tabletSlides ? tabletSlides : options.slidesToScroll
1465						}
1466					},
1467					{
1468						breakpoint: 768,
1469						settings: {
1470							slidesToShow: mobileSlides,
1471							slidesToScroll: 1
1472						}
1473					}
1474				];
1475			}
1476
1477			defaultOptions = {
1478				customPaging: function( slider, i ) {
1479					return $( '<span />' ).text( i + 1 ).attr( 'role', 'tab' );
1480				},
1481				slide: '.jet-listing-grid__item',
1482				dotsClass: 'jet-slick-dots',
1483			};
1484
1485			slickOptions = $.extend( {}, defaultOptions, options );
1486
1487			var $sliderItems = $slider.find( '> .jet-listing-grid__items' );
1488
1489			if ( slickOptions.infinite ) {
1490				$sliderItems.on( 'init', function() {
1491					var $items        = $( this ),
1492						$clonedSlides = $( '> .slick-list > .slick-track > .slick-cloned.jet-listing-grid__item', $items );
1493
1494					if ( !$clonedSlides.length ) {
1495						return;
1496					}
1497
1498					JetEngine.initElementsHandlers( $clonedSlides );
1499				} );
1500			}
1501
1502			if ( $sliderItems.hasClass( 'slick-initialized' ) ) {
1503				$sliderItems.slick( 'refresh', true );
1504				return;
1505			}
1506
1507			$sliderItems.slick( slickOptions );
1508		},
1509
1510		maybeReinitSlider: function( event, $scope ) {
1511			var $slider = $scope.find( '.jet-listing-grid__slider' );
1512
1513			if ( $slider.length ) {
1514				$slider.each( function() {
1515					JetEngine.initSlider( $( this ) );
1516				} );
1517			}
1518		},
1519
1520		widgetDynamicField: function( $scope ) {
1521
1522			var $slider = $scope.find( '.jet-engine-gallery-slider' );
1523
1524			if ( $slider.length ) {
1525				if ( $.isFunction( $.fn.imagesLoaded ) ) {
1526					$slider.imagesLoaded().always( function( instance ) {
1527
1528						var $eWidget = $slider.closest( '.elementor-widget' );
1529
1530						if ( $slider.hasClass( 'slick-initialized' ) ) {
1531							$slider.slick( 'refresh', true );
1532						} else {
1533							var atts = $slider.data( 'atts' );
1534
1535							if ( $eWidget.length ) {
1536								var settings     = JetEngine.getElementorElementSettings( $scope ),
1537									eBreakpoints = window.elementorFrontend.config.responsive.activeBreakpoints,
1538									responsive   = [];
1539
1540								if ( settings.img_slider_cols || settings.img_slider_cols_widescreen ) {
1541									atts.slidesToShow = settings.img_slider_cols_widescreen ? +settings.img_slider_cols_widescreen : +settings.img_slider_cols;
1542								}
1543
1544								Object.keys( eBreakpoints ).reverse().forEach( function( breakpointName ) {
1545
1546									if ( settings['img_slider_cols_' + breakpointName] ) {
1547
1548										if ( 'widescreen' === breakpointName ) {
1549
1550											responsive.push( {
1551												breakpoint: eBreakpoints[breakpointName].value,
1552												settings:   {
1553													slidesToShow: +settings['img_slider_cols'],
1554												}
1555											} );
1556
1557										} else {
1558											var breakpointSettings = {
1559												breakpoint: eBreakpoints[breakpointName].value + 1,
1560												settings:   {
1561													slidesToShow: +settings['img_slider_cols_' + breakpointName],
1562												}
1563											};
1564
1565											responsive.push( breakpointSettings );
1566										}
1567									}
1568
1569								} );
1570
1571								atts.responsive = responsive;
1572							}
1573
1574							$slider.slick( atts );
1575						}
1576					} );
1577				}
1578			}
1579
1580		},
1581
1582		switchCalendarMonth: function( $event ) {
1583
1584			var $this     = $( this ),
1585				$calendar = $this.closest( '.jet-calendar' ),
1586				$widget   = $calendar.closest( '.elementor-widget-container' ),
1587				settings  = $calendar.data( 'settings' ),
1588				post      = $calendar.data( 'post' ),
1589				month     = $this.data( 'month' );
1590
1591			if ( !$widget.length ) {
1592				$widget = $calendar.closest( '.jet-listing-calendar-block' )
1593			}
1594
1595			$calendar.addClass( 'jet-calendar-loading' );
1596
1597			JetEngine.currentRequest = {
1598				jet_engine_action: 'jet_engine_calendar_get_month',
1599				month: month,
1600				settings: settings,
1601				post: post,
1602			};
1603
1604			$( document ).trigger( 'jet-engine-request-calendar' );
1605
1606			$.ajax({
1607				url: JetEngineSettings.ajaxlisting,
1608				type: 'POST',
1609				dataType: 'json',
1610				data: JetEngine.currentRequest,
1611			}).done( function( response ) {
1612				if ( response.success ) {
1613					$widget.html( response.data.content );
1614					JetEngine.initElementsHandlers( $widget );
1615				}
1616				$calendar.removeClass( 'jet-calendar-loading' );
1617			} );
1618		},
1619
1620		initElementsHandlers: function( $selector ) {
1621			$selector.find( '[data-element_type]' ).each( function() {
1622				var $this       = $( this ),
1623					elementType = $this.data( 'element_type' );
1624
1625				if ( !elementType ) {
1626					return;
1627				}
1628
1629				if ( 'widget' === elementType ) {
1630					elementType = $this.data( 'widget_type' );
1631					window.elementorFrontend.hooks.doAction( 'frontend/element_ready/widget', $this, $ );
1632				}
1633
1634				window.elementorFrontend.hooks.doAction( 'frontend/element_ready/global', $this, $ );
1635				window.elementorFrontend.hooks.doAction( 'frontend/element_ready/' + elementType, $this, $ );
1636
1637			} );
1638		},
1639
1640		getElementorElementSettings: function( $scope ) {
1641
1642			if ( window.elementorFrontend && window.elementorFrontend.isEditMode() && $scope.hasClass( 'elementor-element-edit-mode' ) ) {
1643				return JetEngine.getEditorElementSettings( $scope );
1644			}
1645
1646			return $scope.data( 'settings' ) || {};
1647		},
1648
1649		getEditorElementSettings: function( $scope ) {
1650			var modelCID = $scope.data( 'model-cid' ),
1651				elementData;
1652
1653			if ( ! modelCID ) {
1654				return {};
1655			}
1656
1657			if ( ! window.elementorFrontend.hasOwnProperty( 'config' ) ) {
1658				return {};
1659			}
1660
1661			if ( ! window.elementorFrontend.config.hasOwnProperty( 'elements' ) ) {
1662				return {};
1663			}
1664
1665			if ( ! window.elementorFrontend.config.elements.hasOwnProperty( 'data' ) ) {
1666				return {};
1667			}
1668
1669			elementData = window.elementorFrontend.config.elements.data[ modelCID ];
1670
1671			if ( ! elementData ) {
1672				return {};
1673			}
1674
1675			return elementData.toJSON();
1676		},
1677
1678		debounce: function( threshold, callback ) {
1679			var timeout;
1680
1681			return function debounced( $event ) {
1682				function delayed() {
1683					callback.call( this, $event );
1684					timeout = null;
1685				}
1686
1687				if ( timeout ) {
1688					clearTimeout( timeout );
1689				}
1690
1691				timeout = setTimeout( delayed, threshold );
1692			};
1693		},
1694
1695		updateAddedStyles: function() {
1696			if ( window.JetEngineSettings && window.JetEngineSettings.addedPostCSS ) {
1697				$.each( window.JetEngineSettings.addedPostCSS, function( ind, cssID ) {
1698					JetEngine.addedStyles.push( 'elementor-post-' + cssID );
1699					JetEngine.addedPostCSS.push( cssID );
1700				} );
1701			}
1702		},
1703
1704		enqueueAssetsFromResponse: function( response ) {
1705			if ( response.data.scripts ) {
1706				JetEngine.enqueueScripts( response.data.scripts );
1707			}
1708
1709			if ( response.data.styles ) {
1710				JetEngine.enqueueStyles( response.data.styles );
1711			}
1712		},
1713
1714		enqueueScripts: function( scripts ) {
1715			$.each( scripts, function( handle, scriptHtml ) {
1716				JetEngine.enqueueScript( handle, scriptHtml )
1717			} );
1718		},
1719
1720		enqueueStyles: function( styles ) {
1721			$.each( styles, function( handle, styleHtml ) {
1722				JetEngine.enqueueStyle( handle, styleHtml )
1723			} );
1724		},
1725
1726		enqueueScript: function( handle, scriptHtml ) {
1727
1728			if ( -1 !== JetEngine.addedScripts.indexOf( handle ) ) {
1729				return;
1730			}
1731
1732			var selector = 'script[id="' + handle + '-js"]';
1733
1734			if ( $( selector ).length ) {
1735				return;
1736			}
1737
1738			$( 'body' ).append( scriptHtml );
1739
1740			JetEngine.addedScripts.push( handle );
1741		},
1742
1743		enqueueStyle: function( handle, styleHtml ) {
1744
1745			if ( -1 !== handle.indexOf( 'google-fonts' ) ) {
1746				JetEngine.enqueueGoogleFonts( handle, styleHtml );
1747				return;
1748			}
1749
1750			if ( -1 !== JetEngine.addedStyles.indexOf( handle ) ) {
1751				return;
1752			}
1753
1754			var selector = 'link[id="' + handle + '-css"],style[id="' + handle + '"]';
1755
1756			if ( $( selector ).length ) {
1757				return;
1758			}
1759
1760			$( 'head' ).append( styleHtml );
1761
1762			JetEngine.addedStyles.push( handle );
1763
1764			if ( -1 !== handle.indexOf( 'elementor-post' ) ) {
1765				var postID = handle.replace( 'elementor-post-', '' );
1766				JetEngine.addedPostCSS.push( postID );
1767			}
1768		},
1769
1770		enqueueGoogleFonts: function( handle, styleHtml ) {
1771
1772			var selector = 'link[id="' + handle + '-css"]';
1773
1774			if ( $( selector ).length ) {}
1775
1776			$( 'head' ).append( styleHtml );
1777		},
1778
1779		filters: ( function() {
1780
1781			var callbacks = {};
1782
1783			return {
1784
1785				addFilter: function( name, callback ) {
1786
1787					if ( ! callbacks.hasOwnProperty( name ) ) {
1788						callbacks[name] = [];
1789					}
1790
1791					callbacks[name].push(callback);
1792
1793				},
1794
1795				applyFilters: function( name, value, args ) {
1796
1797					if ( ! callbacks.hasOwnProperty( name ) ) {
1798						return value;
1799					}
1800
1801					if ( args === undefined ) {
1802						args = [];
1803					}
1804
1805					var container = callbacks[ name ];
1806					var cbLen     = container.length;
1807
1808					for (var i = 0; i < cbLen; i++) {
1809						if (typeof container[i] === 'function') {
1810							value = container[i](value, args);
1811						}
1812					}
1813
1814					return value;
1815				}
1816
1817			};
1818
1819		})()
1820
1821	};
1822
1823	$( window ).on( 'elementor/frontend/init', JetEngine.init );
1824
1825	window.JetEngine = JetEngine;
1826
1827	JetEngine.commonInit();
1828
1829	window.addEventListener( 'DOMContentLoaded', function() {
1830		JetEngine.initBlocks()
1831	} );
1832
1833}( 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.