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