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.