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