1( function( $, elementor ) { 2 3 'use strict'; 4 5 var JetTricks = { 6 7 init: function() { 8 elementor.hooks.addAction( 'frontend/element_ready/section', JetTricks.elementorSection ); 9 elementor.hooks.addAction( 'frontend/element_ready/container', JetTricks.elementorSection ); 10 elementor.hooks.addAction( 'frontend/element_ready/container', JetTricks.elementorColumn ); 11 elementor.hooks.addAction( 'frontend/element_ready/column', JetTricks.elementorColumn ); 12 elementor.hooks.addAction( 'frontend/element_ready/widget', JetTricks.elementorWidget ); 13 14 var widgets = { 15 'jet-view-more.default' : JetTricks.widgetViewMore, 16 'jet-unfold.default' : JetTricks.widgetUnfold, 17 'jet-hotspots.default' : JetTricks.widgetHotspots 18 }; 19 20 $.each( widgets, function( widget, callback ) { 21 elementor.hooks.addAction( 'frontend/element_ready/' + widget, callback ); 22 }); 23 24 // Re-init widgets in nested tabs 25 window.elementorFrontend.elements.$window.on( 26 'elementor/nested-tabs/activate', 27 ( event, content ) => { 28 29 const $content = $( content ); 30 31 var $button = $content.find( '.jet-unfold__button' ); 32 33 $button.off( 'click.jetUnfold' ); 34 35 JetTricks.initWidgetsHandlers( $content ); 36 JetTricks.elementorSection( $content ); 37 38 } 39 ); 40 41 // Add an action when the Swiper Loop Carousel widget is ready on the frontend 42 var loopCarouselTypes = [ 43 'loop-carousel.post', 44 'loop-carousel.product', 45 'loop-carousel.post_taxonomy', 46 'loop-carousel.product_taxonomy' 47 ]; 48 49 loopCarouselTypes.forEach( function( carouselType ) { 50 elementorFrontend.hooks.addAction( 'frontend/element_ready/' + carouselType, function( $scope, $ ) { 51 52 $( window ).on( 'load', function() { 53 var loopCarousel = $scope.find( '.swiper' ), 54 swiperInstance = loopCarousel.data( 'swiper' ), 55 $button = $scope.find( '.jet-unfold__button' ); 56 57 if ( swiperInstance && $button ) { 58 59 $button.off( 'click.jetUnfold' ); 60 JetTricks.initLoopCarouselHandlers( $scope ); 61 62 swiperInstance.on( 'slideChange', function() { 63 $button.off( 'click.jetUnfold' ); 64 JetTricks.initLoopCarouselHandlers( $scope ); 65 }); 66 } 67 }); 68 }); 69 }); 70 }, 71 72 initLoopCarouselHandlers: function( $selector ) { 73 $selector.find( '.elementor-widget-jet-unfold' ).each( function() { 74 75 var $this = $( this ), 76 77 elementType = $this.data( 'element_type' ); 78 79 if ( !elementType ) { 80 return; 81 } 82 83 if ( 'widget' === elementType ) { 84 elementType = $this.data( 'widget_type' ); 85 window.elementorFrontend.hooks.doAction( 'frontend/element_ready/widget', $this, $ ); 86 } 87 88 window.elementorFrontend.hooks.doAction( 'frontend/element_ready/global', $this, $ ); 89 window.elementorFrontend.hooks.doAction( 'frontend/element_ready/' + elementType, $this, $ ); 90 91 92 } ); 93 }, 94 95 initWidgetsHandlers: function( $selector ) { 96 97 $selector.find( '[data-element_type]' ).each( function() { 98 99 var excludeWidgets = [ 100 'jet-woo-product-gallery-slider.default', 101 'accordion.default' 102 ]; 103 104 var $this = $( this ), 105 106 elementType = $this.data( 'element_type' ); 107 108 if ( !elementType ) { 109 return; 110 } 111 112 if ( 'widget' === elementType ) { 113 114 elementType = $this.data( 'widget_type' ); 115 116 if ( excludeWidgets.includes( elementType ) ) { 117 return; 118 } 119 120 window.elementorFrontend.hooks.doAction( 'frontend/element_ready/widget', $this, $ ); 121 } 122 123 window.elementorFrontend.hooks.doAction( 'frontend/element_ready/global', $this, $ ); 124 window.elementorFrontend.hooks.doAction( 'frontend/element_ready/' + elementType, $this, $ ); 125 126 127 } ); 128 }, 129 130 elementorSection: function( $scope ) { 131 var $target = $scope, 132 sectionId = $scope.data( 'id' ), 133 editMode = Boolean( elementor.isEditMode() ), 134 jetListing = $target.parents( '.elementor-widget-jet-listing-grid' ).data( 'id' ), 135 settings = {}; 136 137 if ( window.JetTricksSettings && window.JetTricksSettings.elements_data.sections.hasOwnProperty( sectionId ) ) { 138 settings = window.JetTricksSettings.elements_data.sections[ sectionId ]; 139 } 140 141 if ( editMode ) { 142 settings = JetTricks.sectionEditorSettings( $scope ); 143 } 144 145 if ( ! settings ) { 146 return false;
147 } 148 149 if ( jQuery.isEmptyObject( settings ) ) { 150 return false; 151 } 152 153 if ( 'false' === settings.particles || '' === settings.particles_json ) { 154 return false; 155 } 156 157 // Compatibility jet tricks particles with jet listing 158 159 if ( jetListing && $target.parent().data( 'elementor-type' ) === 'jet-listing-items' ){ 160 sectionId += jetListing + $target.parents( '.jet-listing-grid__item' ).data( 'post-id' ); 161 } 162 163 var particlesId = 'jet-tricks-particles-instance-' + sectionId, 164 particlesJson = JSON.parse( settings.particles_json ); 165 166 $scope.prepend( '<div id="' + particlesId + '" class="jet-tricks-particles-section__instance"></div>' ); 167 168 // Initialize particles based on library version 169 170 if ( typeof tsParticles !== 'undefined' && tsParticles.load && tsParticles.version && tsParticles.version.startsWith('3.') ) { 171 tsParticles.load({ 172 id: particlesId, 173 options: particlesJson 174 }); 175 } else if ( typeof tsParticles !== 'undefined' && tsParticles.load ) { 176 tsParticles.load( particlesId, particlesJson ); 177 } 178 179 }, 180 181 elementorColumn: function( $scope ) { 182 var $target = $scope, 183 $parentSection = $scope.closest( '.elementor-section' ), 184 isLegacyModeActive = !!$target.find( '> .elementor-column-wrap' ).length, 185 $window = $( window ), 186 columnId = $target.data( 'id' ), 187 editMode = Boolean( elementor.isEditMode() ), 188 settings = {}, 189 stickyInstance = null, 190 stickyInstanceOptions = { 191 topSpacing: 50, 192 bottomSpacing: 50, 193 containerSelector: isLegacyModeActive ? '.elementor-row' : '.elementor-container, .e-con-inner', 194 innerWrapperSelector: isLegacyModeActive ? '.elementor-column-wrap' : '.elementor-widget-wrap', 195 }, 196 $observerTarget = $target.find('.elementor-element'); 197 198 if ( ! editMode ) { 199 settings = $target.data( 'jet-settings' ); 200 201 if ( $target.hasClass( 'jet-sticky-column' ) ) { 202 203 if ( -1 !== settings['stickyOn'].indexOf( elementorFrontend.getCurrentDeviceMode() ) ) { 204 205 $target.each( function() { 206 207 var $this = $( this ), 208 209 elementType = $this.data( 'element_type' ); 210 211 if ( elementType !== 'container' ){ 212 213 stickyInstanceOptions.topSpacing = settings['topSpacing']; 214 stickyInstanceOptions.bottomSpacing = settings['bottomSpacing']; 215 216 imagesLoaded( $parentSection, function() { 217 $target.data( 'stickyColumnInit', true ); 218 stickyInstance = new StickySidebar( $target[0], stickyInstanceOptions ); 219 } ); 220 221 var targetMutation = $target[0], 222 config = { attributes: true, childList: true, subtree: true }; 223 224 var callbackMutation = function( mutationsList, observer ) { 225 for( var mutation of mutationsList ) { 226 if ( 'attributes' === mutation.type ) { 227 $target[0].style.height = 'auto'; 228 } 229 } 230 }; 231 232 var observer = new MutationObserver( callbackMutation ); 233 observer.observe( targetMutation, config ); 234 235 $window.on( 'resize.JetTricksStickyColumn orientationchange.JetTricksStickyColumn', JetTricksTools.debounce( 50, resizeDebounce ) ); 236 237 MutationObserver = window.MutationObserver || window.WebKitMutationObserver; 238 239 var observer = new MutationObserver( function( mutations ) { 240 if ( stickyInstance ) { 241 mutations.forEach( function(mutation){ 242 if (mutation.attributeName === 'class') { 243 setTimeout( function() { 244 stickyInstance.destroy(); 245 stickyInstance = new StickySidebar( $target[0], stickyInstanceOptions ); 246 }, 100 ); 247 } 248 } ) 249 } 250 } ); 251 252 $observerTarget.each( function(){ 253 observer.observe( $( this )[0], { 254 // subtree: true, 255 // childList: true, 256 attributes: true 257 } ); 258 } ) 259 260 } 261 else if ( settings['behavior'] === 'scroll_until_end' ){ 262 const stickyHeight = $this.outerHeight(); 263 const stickyContentBottom = $this.offset().top + stickyHeight; 264 const stickyViewportOffset = $window.height() - stickyHeight - settings['bottomSpacing']; 265 266 $('body').addClass('jet-sticky-container'); 267 268 $window.on( 'scroll.jetSticky', function () { 269 const scrollPosition = $window.scrollTop(); 270 271 if ( scrollPosition + $window.height() >= stickyContentBottom ) { 272 $this.css({ 273 position: 'sticky', 274 top: stickyViewportOffset + 'px', 275 bottom: 'auto', 276 left: 'auto', 277 zIndex: 1100, 278 }); 279 } 280 }); 281 282 $observerTarget.on( 'destroy.jetSticky', function () { 283 $window.off( 'scroll.jetSticky' ); 284 $('body').removeClass('jet-sticky-container'); 285 }); 286 287 } else{ 288 $('body').addClass('jet-sticky-container'); 289 $this.addClass( 'jet-sticky-container-sticky' ); 290 $this.css({ 291 'top': settings['topSpacing'], 292 'bottom': settings['bottomSpacing'] 293 }); 294 } 295 296 }); 297 } 298 } 299 300 } else { 301 302 return false;
303 304 // settings = JetTricks.columnEditorSettings( columnId ); 305 306 // if ( 'true' === settings['sticky'] ) { 307 // $target.addClass( 'jet-sticky-column' ); 308 309 // if ( -1 !== settings['stickyOn'].indexOf( elementorFrontend.getCurrentDeviceMode() ) ) { 310 // stickyInstanceOptions.topSpacing = settings['topSpacing']; 311 // stickyInstanceOptions.bottomSpacing = settings['bottomSpacing']; 312 313 // $target.data( 'stickyColumnInit', true ); 314 // stickyInstance = new StickySidebar( $target[0], stickyInstanceOptions ); 315 316 // $window.on( 'resize.JetTricksStickyColumn orientationchange.JetTricksStickyColumn', JetTricksTools.debounce( 50, resizeDebounce ) ); 317 // } 318 // } 319 } 320 321 function resizeDebounce() { 322 var currentDeviceMode = elementorFrontend.getCurrentDeviceMode(), 323 availableDevices = settings['stickyOn'] || [], 324 isInit = $target.data( 'stickyColumnInit' ); 325 326 if ( -1 !== availableDevices.indexOf( currentDeviceMode ) ) { 327 328 if ( ! isInit ) { 329 $target.data( 'stickyColumnInit', true ); 330 stickyInstance = new StickySidebar( $target[0], stickyInstanceOptions ); 331 stickyInstance.updateSticky(); 332 } 333 } else { 334 $target.data( 'stickyColumnInit', false ); 335 stickyInstance.destroy(); 336 } 337 } 338 339 }, 340 341 elementorWidget: function( $scope ) { 342 var parallaxInstance = null, 343 satelliteInstance = null, 344 tooltipInstance = null; 345 346 parallaxInstance = new jetWidgetParallax( $scope ); 347 parallaxInstance.init(); 348 349 satelliteInstance = new jetWidgetSatellite( $scope ); 350 satelliteInstance.init(); 351 352 tooltipInstance = new jetWidgetTooltip( $scope ); 353 tooltipInstance.init(); 354 355 }, 356 357 getElementorElementSettings: function( $scope ) { 358 359 if ( window.elementorFrontend && window.elementorFrontend.isEditMode() && $scope.hasClass( 'elementor-element-edit-mode' ) ) { 360 return JetTricks.getEditorElementSettings( $scope ); 361 } 362 363 return $scope.data( 'settings' ) || {}; 364 }, 365 366 getEditorElementSettings: function( $scope ) { 367 var modelCID = $scope.data( 'model-cid' ), 368 elementData; 369 370 if ( ! modelCID ) { 371 return {}; 372 } 373 374 if ( ! elementor.hasOwnProperty( 'config' ) ) { 375 return {}; 376 } 377 378 if ( ! elementor.config.hasOwnProperty( 'elements' ) ) { 379 return {}; 380 } 381 382 if ( ! elementor.config.elements.hasOwnProperty( 'data' ) ) { 383 return {}; 384 } 385 386 elementData = elementor.config.elements.data[ modelCID ]; 387 388 if ( ! elementData ) { 389 return {}; 390 } 391 392 return elementData.toJSON(); 393 }, 394 395 widgetViewMore: function( $scope ) { 396 var $target = $scope.find( '.jet-view-more' ), 397 instance = null, 398 settings = $target.data( 'settings' ); 399 400 instance = new jetViewMore( $target, settings ); 401 instance.init(); 402 }, 403 404 widgetUnfold: function( $scope ) { 405 var $target = $scope.find( '.jet-unfold' ), 406 $button = $( '.jet-unfold__button', $target ), 407 $mask = $( '.jet-unfold__mask', $target ), 408 $content = $( '.jet-unfold__content', $target ), 409 $contentInner = $( '.jet-unfold__content-inner', $target), 410 $trigger = $( '.jet-unfold__trigger', $target), 411 $separator = $( '.jet-unfold__separator', $target ), 412 settings = $.extend( {}, $target.data( 'settings' ), JetTricks.getElementorElementSettings( $scope ) ), 413 maskBreakpointsHeights = [], 414 prevBreakpoint = '', 415 unfoldDuration = settings['unfoldDuration'] || settings['unfold_duration'], 416 foldDuration = settings['foldDuration'] || settings['fold_duration'], 417 unfoldEasing = settings['unfoldEasing'] || settings['unfold_easing'], 418 foldEasing = settings['foldEasing'] || settings['fold_easing'], 419 maskHeightAdv = 20, 420 heightCalc = '', 421 autoHide = settings['autoHide'] || false, 422 autoHideTime = settings['autoHideTime'] && 0 != settings['autoHideTime']['size'] ? settings['autoHideTime']['size'] : 5, 423 hideOutsideClick = settings['hideOutsideClick'] || false, 424 autoHideTrigger, 425 activeBreakpoints = elementor.config.responsive.activeBreakpoints, 426 initialLoaded = false;
427 428 maskBreakpointsHeights['desktop'] = []; 429 maskBreakpointsHeights['widescreen'] = []; 430 431 maskBreakpointsHeights['desktop']['maskHeight'] = '' != settings['mask_height']['size'] ? settings['mask_height']['size'] : 50; 432 433 prevBreakpoint = 'desktop'; 434 435 Object.keys( activeBreakpoints ).reverse().forEach( function( breakpointName ) { 436 437 if ( 'widescreen' === breakpointName ) { 438 maskBreakpointsHeights['widescreen']['maskHeight'] = '' != settings['mask_height_widescreen']['size'] ? settings['mask_height_widescreen']['size'] : maskBreakpointsHeights['desktop']['maskHeight']; 439 } else { 440 maskBreakpointsHeights[breakpointName] = []; 441 442 maskBreakpointsHeights[breakpointName]['maskHeight'] = '' != settings['mask_height_' + breakpointName]['size'] ? settings['mask_height_' + breakpointName]['size'] : maskBreakpointsHeights[prevBreakpoint]['maskHeight']; 443 444 prevBreakpoint = breakpointName; 445 } 446 } ); 447 448 onLoaded(); 449 450 if ( 'true' === hideOutsideClick ) { 451 $( window ).on( 'mouseup', function( event ) { 452 let container = $target; 453 if ( !container.is( event.target ) && 0 === container.has( event.target ).length && $target.hasClass( 'jet-unfold-state' ) ) { 454 $button.trigger( 'click' ); 455 } 456 } ) 457 } 458 459 $target.one('transitionend webkitTransitionEnd oTransitionEnd', function() { 460 if ( !initialLoaded ) { 461 onLoaded(); 462 initialLoaded = true; 463 } 464 }); 465 466 function onLoaded() { 467 initialLoaded = true; 468 469 var deviceHeight = getDeviceHeight(); 470 471 heightCalc = +deviceHeight + maskHeightAdv; 472 473 if ( heightCalc < $contentInner.height() ) { 474 475 if ( ! $target.hasClass( 'jet-unfold-state' ) ) { 476 $separator.css( { 477 'opacity': '1' 478 } ); 479 } 480 481 if ( ! $target.hasClass( 'jet-unfold-state' ) ) { 482 $mask.css( { 483 'height': deviceHeight 484 } ); 485 } else { 486 $mask.css( { 487 'height': $contentInner.outerHeight() 488 } ); 489 } 490 $trigger.css( 'display', 'flex' ); 491 } else { 492 $trigger.hide(); 493 $mask.css( { 494 'height': '100%' 495 } ); 496 $content.css( { 497 'max-height': 'none' 498 } ); 499 $separator.css( { 500 'opacity': '0' 501 } ); 502 } 503 } 504 505 $( window ).on( 'resize.jetWidgetUnfold orientationchange.jetWidgetUnfold', JetTricksTools.debounce( 50, function(){ 506 initialLoaded = false; 507 onLoaded(); 508 } ) ); 509 510 $button.keypress( function( e ) { 511 if ( e.which == 13 ) { 512 $button.click(); 513 return false; 514 } 515 } ); 516 517 $button.on( 'click.jetUnfold', function(e) { 518 var $this = $( this ), 519 $buttonText = $( '.jet-unfold__button-text', $this ), 520 unfoldText = $this.data( 'unfold-text' ), 521 foldText = $this.data( 'fold-text' ), 522 $buttonIcon = $( '.jet-unfold__button-icon', $this ), 523 unfoldIcon = $this.data( 'unfold-icon' ), 524 foldIcon = $this.data( 'fold-icon' ), 525 contentHeight = $contentInner.outerHeight(), 526 deviceHeight = getDeviceHeight(); 527 528 e.preventDefault(); 529 530 if ( ! $target.hasClass( 'jet-unfold-state' ) ) { 531 $target.addClass( 'jet-unfold-state' ); 532 533 $separator.css( { 534 'opacity': '0' 535 } ); 536 537 $buttonIcon.html( foldIcon ); 538 $buttonText.html( foldText ); 539 540 anime( { 541 targets: $mask[0], 542 height: contentHeight, 543 duration: unfoldDuration['size'], 544 easing: unfoldEasing, 545 complete: function( anim ) { 546 // Recalculate listing masonry. 547 $( document ).trigger( 'jet-engine/listing/recalculate-masonry' ); 548 } 549 } ); 550 551 if ( 'true' === autoHide ) { 552 autoHideTrigger = setTimeout( function() { 553 $button.trigger( 'click' ); 554 }, autoHideTime * 1000 ); 555 } 556 } else { 557 clearTimeout( autoHideTrigger ); 558 559 $target.removeClass( 'jet-unfold-state' ); 560 561 $separator.css( { 562 'opacity': '1' 563 } ); 564 565 $buttonIcon.html( unfoldIcon ); 566 $buttonText.html( unfoldText ); 567 568 anime( { 569 targets: $mask[0], 570 height: deviceHeight, 571 duration: foldDuration['size'], 572 easing: foldEasing, 573 complete: function( anim ) { 574 if ( 'true' === settings['foldScrolling'] ) { 575 $( 'html, body' ).animate( { 576 scrollTop: $target.offset().top - settings['foldScrollOffset']['size'] 577 }, 'slow' ); 578 } 579 580 // Recalculate listing masonry. 581 $( document ).trigger( 'jet-engine/listing/recalculate-masonry' ); 582 } 583 } ); 584 } 585 } ); 586 587 function getDeviceHeight() { 588 let device = elementorFrontend.getCurrentDeviceMode(); 589 let heightSettings; 590 591 switch ( device ) { 592 593 case 'mobile': 594 heightSettings = settings.mask_height_mobile; 595 break; 596 597 case 'tablet': 598 heightSettings = settings.mask_height_tablet; 599 break; 600 601 default: 602 heightSettings = settings.mask_height; 603 604 } 605 606 if ( ! heightSettings || ! heightSettings.size || ! heightSettings.unit ) { 607 heightSettings = settings.mask_height; 608 } 609
610 switch ( heightSettings.unit ) { 611 612 case 'vh': 613 return ( window.innerHeight * heightSettings.size ) / 100; 614 615 case '%': 616 let parentHeight = $contentInner.parent().height(); 617 return ( parentHeight * heightSettings.size ) / 100; 618 619 default: 620 return heightSettings.size; 621 } 622 } 623 }, 624 625 widgetHotspots: function( $scope ) { 626 var $target = $scope.find( '.jet-hotspots' ), 627 $hotspots = $( '.jet-hotspots__item', $target), 628 settings = $target.data( 'settings' ), 629 editMode = Boolean( elementor.isEditMode() ), 630 itemActiveClass = 'jet-hotspots__item--active'; 631 632 $target.imagesLoaded().progress( function() { 633 $target.addClass( 'image-loaded' ); 634 } ); 635 636 $hotspots.each( function( index ) { 637 var $this = $( this ), 638 horizontal = $this.data( 'horizontal-position' ), 639 vertical = $this.data( 'vertical-position' ), 640 tooltipWidth = $this.data( 'tooltip-width' ) || null, 641 itemSelector = $this[0], 642 options = {}; 643 644 $this.css( { 645 'left': horizontal + '%', 646 'top': vertical + '%' 647 } ); 648 649 if ( itemSelector._tippy ) { 650 itemSelector._tippy.destroy(); 651 } 652 653 options = { 654 content: $this.data('tippy-content'), 655 arrow: settings['tooltipArrow'] ? true : false, 656 placement: settings['tooltipPlacement'], 657 trigger: settings['tooltipTrigger'], 658 appendTo: $target[0], 659 hideOnClick: 'manual' !== settings['tooltipTrigger'], 660 maxWidth: 'none', 661 offset: [0, settings['tooltipDistance']['size']], 662 allowHTML: true, 663 onShow( instance ) { 664 $( itemSelector ).addClass( itemActiveClass ); 665 666 if ( tooltipWidth ) { 667 instance.popper.querySelector( '.tippy-box' ).style.width = tooltipWidth; 668 } 669 670 }, 671 onHidden( instance ) { 672 $( itemSelector ).removeClass( itemActiveClass ); 673 } 674 } 675 676 if ( 'manual' != settings['tooltipTrigger'] ) { 677 options['duration'] = [ settings['tooltipShowDuration']['size'], settings['tooltipHideDuration']['size'] ]; 678 options['animation'] = settings['tooltipAnimation']; 679 options['delay'] = settings['tooltipDelay']; 680 } 681 682 tippy( [ itemSelector ], options ); 683 684 if ( 'manual' === settings['tooltipTrigger'] && itemSelector._tippy ) { 685 itemSelector._tippy.show(); 686 } 687 688 if ( settings['tooltipShowOnInit'] && itemSelector._tippy ) { 689 itemSelector._tippy.show(); 690 } 691 692 } ); 693 }, 694 695 columnEditorSettings: function( columnId ) { 696 var editorElements = null, 697 columnData = {}; 698 699 if ( ! window.elementor.hasOwnProperty( 'elements' ) ) { 700 return false; 701 } 702 703 editorElements = window.elementor.elements; 704 705 if ( ! editorElements.models ) { 706 return false; 707 } 708 709 $.each( editorElements.models, function( index, obj ) { 710 711 $.each( obj.attributes.elements.models, function( index, obj ) { 712 if ( columnId == obj.id ) { 713 columnData = obj.attributes.settings.attributes; 714 } 715 } ); 716 717 } ); 718 719 return { 720 'sticky': columnData['jet_tricks_column_sticky'] || false, 721 'topSpacing': columnData['jet_tricks_top_spacing'] || 50,
722 'bottomSpacing': columnData['jet_tricks_bottom_spacing'] || 50, 723 'stickyOn': columnData['jet_tricks_column_sticky_on'] || [ 'desktop', 'tablet', 'mobile'] 724 } 725 726 }, 727 728 sectionEditorSettings: function( $scope ) { 729 var editorElements = null, 730 sectionData = {}; 731 732 if ( ! window.elementor.hasOwnProperty( 'elements' ) ) { 733 return false; 734 } 735 736 sectionData = JetTricks.getElementorElementSettings( $scope ); 737 738 return { 739 'particles': sectionData['section_jet_tricks_particles'] || 'false', 740 'particles_json': sectionData['section_jet_tricks_particles_json'] || '', 741 } 742 743 } 744 745 }; 746 747 $( window ).on( 'elementor/frontend/init', JetTricks.init ); 748 749 var JetTricksTools = { 750 debounce: function( threshold, callback ) { 751 var timeout; 752 753 return function debounced( $event ) { 754 function delayed() { 755 callback.call( this, $event ); 756 timeout = null; 757 } 758 759 if ( timeout ) { 760 clearTimeout( timeout ); 761 } 762 763 timeout = setTimeout( delayed, threshold ); 764 }; 765 }, 766 767 widgetEditorSettings: function( widgetId ) { 768 var editorElements = null, 769 widgetData = {}; 770 771 if ( ! window.elementor.hasOwnProperty( 'elements' ) ) { 772 return false; 773 } 774 775 editorElements = window.elementor.elements; 776 777 if ( ! editorElements.models ) { 778 return false; 779 } 780 781 $.each( editorElements.models, function( index, obj ) { 782 783 $.each( obj.attributes.elements.models, function( index, obj ) { 784 785 $.each( obj.attributes.elements.models, function( index, obj ) { 786 if ( widgetId == obj.id ) { 787 widgetData = obj.attributes.settings.attributes; 788 } 789 } ); 790 791 } ); 792 793 } ); 794 795 return { 796 'speed': widgetData['jet_tricks_widget_parallax_speed'] || { 'size': 50, 'unit': '%'}, 797 'parallax': widgetData['jet_tricks_widget_parallax'] || 'false', 798 'invert': widgetData['jet_tricks_widget_parallax_invert'] || 'false', 799 'stickyOn': widgetData['jet_tricks_widget_parallax_on'] || [ 'desktop', 'tablet', 'mobile'], 800 'satellite': widgetData['jet_tricks_widget_satellite'] || 'false', 801 'satelliteType': widgetData['jet_tricks_widget_satellite_type'] || 'text', 802 'satellitePosition': widgetData['jet_tricks_widget_satellite_position'] || 'top-center', 803 'tooltip': widgetData['jet_tricks_widget_tooltip'] || 'false', 804 'tooltipDescription': widgetData['jet_tricks_widget_tooltip_description'] || 'Lorem Ipsum', 805 'tooltipPlacement': widgetData['jet_tricks_widget_tooltip_placement'] || 'top', 806 'tooltipArrow': 'true' === widgetData['jet_tricks_widget_tooltip_arrow'] ? true : false, 807 'xOffset': widgetData['jet_tricks_widget_tooltip_x_offset'] || 0, 808 'yOffset': widgetData['jet_tricks_widget_tooltip_y_offset'] || 0, 809 'tooltipAnimation': widgetData['jet_tricks_widget_tooltip_animation'] || 'shift-toward', 810 'tooltipTrigger': widgetData['jet_tricks_widget_tooltip_trigger'] || 'mouseenter', 811 'customSelector': widgetData['jet_tricks_widget_tooltip_custom_selector'] || '', 812 'zIndex': widgetData['jet_tricks_widget_tooltip_z_index'] || '999', 813 'delay': widgetData['jet_tricks_widget_tooltip_delay'] || '0' 814 } 815 } 816 } 817 818 /** 819 * Jet jetViewMore Class 820 * 821 * @return {void} 822 */ 823 window.jetViewMore = function( $selector, settings ) { 824 var self = this, 825 $window = $( window ), 826 $button = $( '.jet-view-more__button', $selector ), 827 defaultSettings = { 828 sections: {}, 829 effect: 'move-up', 830 showall: false 831 }, 832 settings = $.extend( {}, defaultSettings, settings ), 833 sections = settings['sections'], 834 sectionsData = {}, 835 buttonVisible = true, 836 editMode = Boolean( elementor.isEditMode() ); 837 838 /** 839 * Init 840 */ 841 self.init = function() { 842 self.setSectionsData(); 843 844 if ( editMode ) { 845 return false; 846 } 847 848 // Add Events 849 $button.on( 'click', function() { 850 851 for ( var section in sectionsData ) { 852 var $section = sectionsData[ section ]['selector']; 853 854 if ( ! settings.showall ) { 855 if ( ! sectionsData[ section ]['visible'] ) { 856 sectionsData[ section ]['visible'] = true; 857 $section.css('height', $section[0].scrollHeight + 'px'); 858 $section.addClass( 'view-more-visible' ); 859 $section.addClass( 'jet-tricks-' + settings['effect'] + '-effect' ); 860 861 break; 862 } 863 } else { 864 sectionsData[ section ]['visible'] = true; 865 $section.css('height', $section[0].scrollHeight + 'px'); 866 $section.addClass( 'view-more-visible' ); 867 $section.addClass( 'jet-tricks-' + settings['effect'] + '-effect' ); 868 } 869 870 } 871 872 for ( var section in sectionsData ) { 873 buttonVisible = true; 874 875 if ( sectionsData[ section ]['visible'] ) { 876 buttonVisible = false;
877 } 878 } 879 880 if ( ! buttonVisible ) { 881 $button.css( { 'display': 'none' } ); 882 } 883 884 } ); 885 886 $button.keydown( function( e ) { 887 var $which = e.which || e.keyCode; 888 889 if ( $which == 13 || $which == 32 ) { 890 for ( var section in sectionsData ) { 891 var $section = sectionsData[ section ]['selector']; 892 893 if ( ! settings.showall ) { 894 if ( ! sectionsData[ section ]['visible'] ) { 895 sectionsData[ section ]['visible'] = true; 896 $section.css('height', $section[0].scrollHeight + 'px'); 897 $section.addClass( 'view-more-visible' ); 898 $section.addClass( 'jet-tricks-' + settings['effect'] + '-effect' ); 899 900 break; 901 } 902 } else { 903 sectionsData[ section ]['visible'] = true; 904 $section.css('height', $section[0].scrollHeight + 'px'); 905 $section.addClass( 'view-more-visible' ); 906 $section.addClass( 'jet-tricks-' + settings['effect'] + '-effect' ); 907 } 908 909 } 910 911 for ( var section in sectionsData ) { 912 buttonVisible = true; 913 914 if ( sectionsData[ section ]['visible'] ) { 915 buttonVisible = false; 916 } 917 } 918 919 if ( ! buttonVisible ) { 920 $button.css( { 'display': 'none' } ); 921 } 922 } 923 } ); 924 }; 925 926 self.setSectionsData = function() { 927 928 for ( var section in sections ) { 929 var $selector = $( '#' + sections[ section ] ); 930 931 if ( ! editMode ) { 932 $selector.addClass( 'jet-view-more-section' ); 933 } else { 934 $selector.addClass( 'jet-view-more-section-edit-mode' ); 935 } 936 937 sectionsData[ section ] = { 938 'section_id': sections[ section ], 939 'selector': $selector, 940 'visible': false, 941 } 942 } 943 }; 944 }; 945 946 /** 947 * [jetWidgetParallax description] 948 * @param {[type]} $scope [description] 949 * @return {[type]} [description] 950 */ 951 window.jetWidgetParallax = function( $scope ) { 952 var self = this, 953 $target = $( '> .elementor-widget-container', $scope ), 954 $section = $scope.closest( '.elementor-top-section' ), 955 widgetId = $scope.data('id'), 956 settings = {}, 957 editMode = Boolean( elementor.isEditMode() ), 958 $window = $( window ), 959 isSafari = !!navigator.userAgent.match(/Version\/[\d\.]+.*Safari/), 960 platform = navigator.platform, 961 safariClass = isSafari ? 'is-safari' : '', 962 macClass = 'MacIntel' == platform ? ' is-mac' : ''; 963 964 /** 965 * Init 966 */ 967 self.init = function() { 968 969 $scope.addClass( macClass ); 970 971 if ( ! editMode ) { 972 settings = $scope.data( 'jet-tricks-settings' ); 973 } else { 974 settings = JetTricksTools.widgetEditorSettings( widgetId ); 975 } 976 977 if ( ! settings ) { 978 return false; 979 } 980 981 if ( 'undefined' === typeof settings ) { 982 return false; 983 } 984 985 if ( 'false' === settings['parallax'] || 'undefined' === typeof settings['parallax'] ) { 986 return false; 987 } 988 989 $window.on( 'scroll.jetWidgetParallax resize.jetWidgetParallax', self.scrollHandler ).trigger( 'resize.jetWidgetParallax' ); 990 }; 991 992 self.scrollHandler = function( event ) { 993 var speed = +settings['speed']['size'] * 0.01, 994 invert = 'true' == settings['invert'] ? -1 : 1, 995 winHeight = $window.height(), 996 winScrollTop = $window.scrollTop(), 997 offsetTop = $scope.offset().top, 998 thisHeight = $scope.outerHeight(), 999 sectionHeight = $section.outerHeight(), 1000 positionDelta = winScrollTop - offsetTop + ( winHeight / 2 ), 1001 abs = positionDelta > 0 ? 1 : -1, 1002 posY = abs * Math.pow( Math.abs( positionDelta ), 0.85 ), 1003 availableDevices = settings['stickyOn'] || [], 1004 currentDeviceMode = elementorFrontend.getCurrentDeviceMode(); 1005 1006 posY = invert * Math.ceil( speed * posY ); 1007 1008 if ( -1 !== availableDevices.indexOf( currentDeviceMode ) ) { 1009 $target.css( { 1010 'transform': 'translateY(' + posY + 'px)' 1011 } ); 1012 } else { 1013 $target.css( { 1014 'transform': 'translateY(0)' 1015 } ); 1016 } 1017 }; 1018 }; 1019 1020 /** 1021 * [jetWidgetSatellite description] 1022 * @param {[type]} $scope [description] 1023 * @return {[type]} [description] 1024 */ 1025 window.jetWidgetSatellite = function( $scope ) { 1026 var self = this, 1027 widgetId = $scope.data('id'), 1028 settings = {}, 1029 editMode = Boolean( elementor.isEditMode() ); 1030 1031 /** 1032 * Init 1033 */ 1034 self.init = function() { 1035 1036 if ( ! editMode ) { 1037 settings = $scope.data( 'jet-tricks-settings' ); 1038 } else { 1039 settings = JetTricksTools.widgetEditorSettings( widgetId ); 1040 } 1041 1042 if ( ! settings ) { 1043 return false;
1044 } 1045 1046 if ( 'undefined' === typeof settings ) { 1047 return false; 1048 } 1049 1050 if ( 'false' === settings['satellite'] || 'undefined' === typeof settings['satellite'] ) { 1051 return false; 1052 } 1053 1054 $scope.addClass( 'jet-satellite-widget' ); 1055 1056 $( '.jet-tricks-satellite', $scope ).addClass( 'jet-tricks-satellite--' + settings['satellitePosition'] ); 1057 }; 1058 }; 1059 1060 /** 1061 * [jetWidgetTooltip description] 1062 * @param {[type]} $scope [description] 1063 * @return {[type]} [description] 1064 */ 1065 window.jetWidgetTooltip = function( $scope ) { 1066 var self = this, 1067 widgetId = $scope.data('id'), 1068 widgetSelector = $scope[0], 1069 tooltipSelector = widgetSelector, 1070 settings = {}, 1071 editMode = Boolean( elementor.isEditMode() ), 1072 delay, 1073 tooltipEvent = editMode ? 'click' : 'mouseenter'; 1074 1075 /** 1076 * Init 1077 */ 1078 self.init = function() { 1079 1080 if ( ! editMode ) { 1081 settings = $scope.data( 'jet-tricks-settings' ); 1082 } else { 1083 settings = JetTricksTools.widgetEditorSettings( widgetId ); 1084 } 1085 1086 if ( widgetSelector._tippy ) { 1087 widgetSelector._tippy.destroy(); 1088 } 1089 1090 if ( ! settings ) { 1091 return false; 1092 } 1093 1094 if ( 'undefined' === typeof settings ) { 1095 return false; 1096 } 1097 1098 if ( 'false' === settings['tooltip'] || 'undefined' === typeof settings['tooltip'] || '' === settings['tooltipDescription'] ) { 1099 return false; 1100 } 1101 1102 $scope.addClass( 'jet-tooltip-widget' ); 1103 1104 if ( settings['customSelector'] ) { 1105 tooltipSelector = $( '.' + settings['customSelector'], $scope )[0]; 1106 } 1107 1108 if ( editMode && ! $( '#jet-tricks-tooltip-content-' + widgetId )[0] ) { 1109 var template = $( '<div>', { 1110 id: 'jet-tricks-tooltip-content-' + widgetId, 1111 class: 'jet-tooltip-widget__content' 1112 } ); 1113 1114 template.html( settings['tooltipDescription'] ); 1115 $scope.append( template ); 1116 } 1117 1118 tippy( 1119 [ tooltipSelector ], 1120 { 1121 content: $scope.find( '.jet-tooltip-widget__content' )[0].innerHTML, 1122 allowHTML: true, 1123 appendTo: widgetSelector, 1124 arrow: settings['tooltipArrow'] ? true : false, 1125 placement: settings['tooltipPlacement'], 1126 offset: [ settings['xOffset'], settings['yOffset'] ], 1127 animation: settings['tooltipAnimation'], 1128 trigger: settings['tooltipTrigger'], 1129 interactive: true, 1130 zIndex: settings['zIndex'], 1131 maxWidth: 'none', 1132 delay: settings['delay']['size'] ? settings['delay']['size'] : 0, 1133 } 1134 ); 1135 1136 if ( editMode && widgetSelector._tippy ) { 1137 widgetSelector._tippy.show(); 1138 } 1139 1140 }; 1141 }; 1142 1143}( jQuery, window.elementorFrontend ) );
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.