1var wpAjaxUrl = 'https://www.oeh-salzburg.at/wp-admin/admin-ajax.php';var flBuilderUrl = 'https://www.oeh-salzburg.at/wp-content/plugins/_bb-plugin/';var FLBuilderLayoutConfig = { 2 anchorLinkAnimations : { 3 duration : 1000, 4 easing : 'swing', 5 offset : 100 6 }, 7 paths : { 8 pluginUrl : 'https://www.oeh-salzburg.at/wp-content/plugins/_bb-plugin/', 9 wpAjaxUrl : 'https://www.oeh-salzburg.at/wp-admin/admin-ajax.php' 10 }, 11 breakpoints : { 12 small : 768, 13 medium : 992 }, 14 waypoint: { 15 offset: 80 16 } 17}; 18(function($){ 19 20 if(typeof FLBuilderLayout != 'undefined') { 21 return; 22 } 23 24 /** 25 * Helper class with generic logic for a builder layout. 26 * 27 * @class FLBuilderLayout 28 * @since 1.0 29 */ 30 FLBuilderLayout = { 31 32 /** 33 * Initializes a builder layout. 34 * 35 * @since 1.0 36 * @method init 37 */ 38 init: function() 39 { 40 // Destroy existing layout events. 41 FLBuilderLayout._destroy(); 42 43 // Init CSS classes. 44 FLBuilderLayout._initClasses(); 45 46 // Init backgrounds. 47 FLBuilderLayout._initBackgrounds(); 48 49 // Only init if the builder isn't active. 50 if ( 0 === $('.fl-builder-edit').length ) { 51 52 // Init module animations. 53 FLBuilderLayout._initModuleAnimations(); 54 55 // Init anchor links. 56 FLBuilderLayout._initAnchorLinks(); 57 58 // Init the browser hash. 59 FLBuilderLayout._initHash(); 60 61 // Init forms. 62 FLBuilderLayout._initForms(); 63 } 64 }, 65 66 /** 67 * Public method for refreshing Wookmark or MosaicFlow galleries 68 * within an element. 69 * 70 * @since 1.7.4 71 * @method refreshGalleries 72 */ 73 refreshGalleries: function( element ) 74 { 75 var $element = 'undefined' == typeof element ? $( 'body' ) : $( element ), 76 mfContent = $element.find( '.fl-mosaicflow-content' ), 77 wmContent = $element.find( '.fl-gallery' ), 78 mfObject = null; 79 80 if ( mfContent ) { 81 82 mfObject = mfContent.data( 'mosaicflow' ); 83 84 if ( mfObject ) { 85 mfObject.columns = $( [] ); 86 mfObject.columnsHeights = []; 87 mfContent.data( 'mosaicflow', mfObject ); 88 mfContent.mosaicflow( 'refill' ); 89 } 90 } 91 if ( wmContent ) { 92 wmContent.trigger( 'refreshWookmark' ); 93 } 94 }, 95 96 /** 97 * Public method for refreshing Masonry within an element 98 * 99 * @since 1.8.1 100 * @method refreshGridLayout 101 */ 102 refreshGridLayout: function( element ) 103 { 104 var $element = 'undefined' == typeof element ? $( 'body' ) : $( element ), 105 msnryContent = $element.find('.masonry'); 106 107 if ( msnryContent.length ) { 108 msnryContent.masonry('layout'); 109 } 110 }, 111 112 /** 113 * Public method for reloading BxSlider within an element 114 * 115 * @since 1.8.1 116 * @method reloadSlider 117 */ 118 reloadSlider: function( element ) 119 { 120 var $element = 'undefined' == typeof element ? $( 'body' ) : $( element ), 121 bxContent = $element.find('.bx-viewport > div').eq(0), 122 bxObject = null; 123 124 if ( bxContent.length ) { 125 bxObject = bxContent.data( 'bxSlider'); 126 if ( bxObject ) { 127 bxObject.reloadSlider(); 128 } 129 } 130 }, 131 132 /** 133 * Public method for resizing WP audio player 134 * 135 * @since 1.8.2 136 * @method resizeAudio 137 */ 138 resizeAudio: function( element ) 139 { 140 var $element = 'undefined' == typeof element ? $( 'body' ) : $( element ), 141 audioPlayers = $element.find('.wp-audio-shortcode.mejs-audio'), 142 player = null, 143 mejsPlayer = null, 144 rail = null, 145 railWidth = 400; 146 147 if ( audioPlayers.length && typeof mejs !== 'undefined' ) { 148 audioPlayers.each(function(){ 149 player = $(this); 150 mejsPlayer = mejs.players[player.attr('id')]; 151 rail = player.find('.mejs-controls .mejs-time-rail'); 152 var innerMejs = player.find('.mejs-inner'), 153 total = player.find('.mejs-controls .mejs-time-total'); 154 155 if ( typeof mejsPlayer !== 'undefined' ) { 156 railWidth = Math.ceil(player.width() * 0.8); 157 158 if ( innerMejs.length ) { 159 160 rail.css('width', railWidth +'px!important'); 161 //total.width(rail.width() - 10); 162 163 mejsPlayer.options.autosizeProgress = true; 164 165 // webkit has trouble doing this without a delay 166 setTimeout(function () { 167 mejsPlayer.setControlsSize(); 168 }, 50); 169 170 player.find('.mejs-inner').css({ 171 visibility: 'visible', 172 height: 'inherit' 173 }); 174 } 175 } 176 }); 177 } 178 }, 179 180 /** 181 * Public method for preloading WP audio player when it's inside the hidden element 182 * 183 * @since 1.8.2 184 * @method preloadAudio 185 */ 186 preloadAudio: function(element) 187 { 188 var $element = 'undefined' == typeof element ? $( 'body' ) : $( element ), 189 contentWrap = $element.closest('.fl-accordion-item'), 190 audioPlayers = $element.find('.wp-audio-shortcode.mejs-audio'); 191 192 if ( ! contentWrap.hasClass('fl-accordion-item-active') && audioPlayers.find('.mejs-inner').length ) { 193 audioPlayers.find('.mejs-inner').css({ 194 visibility : 'hidden', 195 height: 0 196 }); 197 } 198 }, 199 200 /** 201 * Public method for resizing slideshow momdule within the tab 202 * 203 * @since 1.10.5 204 * @method resizeSlideshow 205 */ 206 resizeSlideshow: function(){ 207 if(typeof YUI !== 'undefined') { 208 YUI().use('node-event-simulate', function(Y) { 209 Y.one(window).simulate("resize"); 210 }); 211 } 212 }, 213 214 /** 215 * Public method for reloading an embedded Google Map within the tabs or hidden element. 216 * 217 * @since 2.2 218 * @method reloadGoogleMap 219 */ 220 reloadGoogleMap: function(element){ 221 var $element = 'undefined' == typeof element ? $( 'body' ) : $( element ),
222 googleMap = $element.find( 'iframe[src*="google.com/maps"]' ); 223 224 if ( googleMap.length ) { 225 googleMap.attr( 'src', function(i, val) { 226 return val; 227 }); 228 } 229 }, 230 231 /** 232 * Unbinds builder layout events. 233 * 234 * @since 1.0 235 * @access private 236 * @method _destroy 237 */ 238 _destroy: function() 239 { 240 var win = $(window); 241 242 win.off('scroll.fl-bg-parallax'); 243 win.off('resize.fl-bg-video'); 244 }, 245 246 /** 247 * Checks to see if the current device has touch enabled. 248 * 249 * @since 1.0 250 * @access private 251 * @method _isTouch 252 * @return {Boolean} 253 */ 254 _isTouch: function() 255 { 256 if(('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)) { 257 return true; 258 } 259 260 return false; 261 }, 262 263 /** 264 * Checks to see if the current device is mobile. 265 * 266 * @since 1.7 267 * @access private 268 * @method _isMobile 269 * @return {Boolean} 270 */ 271 _isMobile: function() 272 { 273 return /Mobile|Android|Silk\/|Kindle|BlackBerry|Opera Mini|Opera Mobi|webOS/i.test( navigator.userAgent ); 274 }, 275 276 /** 277 * Initializes builder body classes. 278 * 279 * @since 1.0 280 * @access private 281 * @method _initClasses 282 */ 283 _initClasses: function() 284 { 285 var body = $( 'body' ), 286 ua = navigator.userAgent; 287 288 // Add the builder body class. 289 if ( ! body.hasClass( 'archive' ) && $( '.fl-builder-content-primary' ).length > 0 ) { 290 body.addClass('fl-builder'); 291 } 292 293 // Add the builder touch body class. 294 if(FLBuilderLayout._isTouch()) { 295 body.addClass('fl-builder-touch'); 296 } 297 298 // Add the builder mobile body class. 299 if(FLBuilderLayout._isMobile()) { 300 body.addClass('fl-builder-mobile'); 301 } 302 303 if ( $(window).width() < FLBuilderLayoutConfig.breakpoints.small ) { 304 body.addClass( 'fl-builder-breakpoint-small' ); 305 } 306 307 if ( $(window).width() > FLBuilderLayoutConfig.breakpoints.small && $(window).width() < FLBuilderLayoutConfig.breakpoints.medium ) { 308 body.addClass( 'fl-builder-breakpoint-medium' ); 309 } 310 311 if ( $(window).width() > FLBuilderLayoutConfig.breakpoints.medium ) { 312 body.addClass( 'fl-builder-breakpoint-large' ); 313 } 314 315 // IE11 body class. 316 if ( ua.indexOf( 'Trident/7.0' ) > -1 && ua.indexOf( 'rv:11.0' ) > -1 ) { 317 body.addClass( 'fl-builder-ie-11' ); 318 } 319 }, 320 321 /** 322 * Initializes builder node backgrounds that require 323 * additional JavaScript logic such as parallax. 324 * 325 * @since 1.1.4 326 * @access private
327 * @method _initBackgrounds 328 */ 329 _initBackgrounds: function() 330 { 331 var win = $(window); 332 333 // Init parallax backgrounds. 334 if($('.fl-row-bg-parallax').length > 0 && !FLBuilderLayout._isMobile()) { 335 FLBuilderLayout._scrollParallaxBackgrounds(); 336 FLBuilderLayout._initParallaxBackgrounds(); 337 win.on('scroll.fl-bg-parallax', FLBuilderLayout._scrollParallaxBackgrounds); 338 } 339 340 // Init video backgrounds. 341 if($('.fl-bg-video').length > 0) { 342 FLBuilderLayout._initBgVideos(); 343 FLBuilderLayout._resizeBgVideos(); 344 win.on('resize.fl-bg-video', FLBuilderLayout._resizeBgVideos); 345 } 346 }, 347 348 /** 349 * Initializes all parallax backgrounds in a layout. 350 * 351 * @since 1.1.4 352 * @access private 353 * @method _initParallaxBackgrounds 354 */ 355 _initParallaxBackgrounds: function() 356 { 357 $('.fl-row-bg-parallax').each(FLBuilderLayout._initParallaxBackground); 358 }, 359 360 /** 361 * Initializes a single parallax background. 362 * 363 * @since 1.1.4 364 * @access private 365 * @method _initParallaxBackgrounds 366 */ 367 _initParallaxBackground: function() 368 { 369 var row = $(this), 370 content = row.find('> .fl-row-content-wrap'), 371 src = row.data('parallax-image'), 372 loaded = row.data('parallax-loaded'), 373 img = new Image(); 374 375 if(loaded) { 376 return; 377 } 378 else if(typeof src != 'undefined') { 379 380 $(img).on('load', function() { 381 content.css('background-image', 'url(' + src + ')'); 382 row.data('parallax-loaded', true); 383 }); 384 385 img.src = src; 386 } 387 }, 388 389 /** 390 * Fires when the window is scrolled to adjust 391 * parallax backgrounds. 392 * 393 * @since 1.1.4 394 * @access private 395 * @method _scrollParallaxBackgrounds 396 */ 397 _scrollParallaxBackgrounds: function() 398 { 399 $('.fl-row-bg-parallax').each(FLBuilderLayout._scrollParallaxBackground); 400 }, 401 402 /** 403 * Fires when the window is scrolled to adjust 404 * a single parallax background. 405 * 406 * @since 1.1.4 407 * @access private 408 * @method _scrollParallaxBackground 409 */ 410 _scrollParallaxBackground: function() 411 { 412 var win = $(window), 413 row = $(this), 414 content = row.find('> .fl-row-content-wrap'), 415 speed = row.data('parallax-speed'), 416 offset = content.offset(), 417 yPos = -((win.scrollTop() - offset.top) / speed); 418 419 content.css('background-position', 'center ' + yPos + 'px'); 420 }, 421 422 /** 423 * Initializes all video backgrounds. 424 * 425 * @since 1.6.3.3 426 * @access private 427 * @method _initBgVideos 428 */ 429 _initBgVideos: function() 430 { 431 $('.fl-bg-video').each(FLBuilderLayout._initBgVideo); 432 }, 433 434 /** 435 * Initializes a video background. 436 * 437 * @since 1.6.3.3 438 * @access private 439 * @method _initBgVideo 440 */ 441 _initBgVideo: function() 442 { 443 var wrap = $( this ), 444 width = wrap.data( 'width' ), 445 height = wrap.data( 'height' ), 446 mp4 = wrap.data( 'mp4' ), 447 youtube = wrap.data( 'youtube'), 448 vimeo = wrap.data( 'vimeo'), 449 mp4Type = wrap.data( 'mp4-type' ), 450 webm = wrap.data( 'webm' ), 451 webmType = wrap.data( 'webm-type' ), 452 fallback = wrap.data( 'fallback' ), 453 loaded = wrap.data( 'loaded' ), 454 videoMobile = wrap.data( 'video-mobile' ), 455 fallbackTag = '', 456 videoTag = null, 457 mp4Tag = null, 458 webmTag = null; 459 460 // Return if the video has been loaded for this row. 461 if ( loaded ) { 462 return; 463 } 464 465 videoTag = $( '<video autoplay loop muted playsinline></video>' ); 466 467 /** 468 * Add poster image (fallback image) 469 */ 470 if( 'undefined' != typeof fallback && '' != fallback ) { 471 videoTag.attr( 'poster', 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7' ) 472 videoTag.css( 'background', 'transparent url("' + fallback + '") no-repeat center center' ) 473 videoTag.css( 'background-size', 'cover' ) 474 videoTag.css( 'height', '100%' ) 475 } 476 477 // MP4 Source Tag 478 if ( 'undefined' != typeof mp4 && '' != mp4 ) { 479 480 mp4Tag = $( '<source />' ); 481 mp4Tag.attr( 'src', mp4 ); 482 mp4Tag.attr( 'type', mp4Type ); 483 484 videoTag.append( mp4Tag ); 485 } 486 // WebM Source Tag 487 if ( 'undefined' != typeof webm && '' != webm ) { 488 489 webmTag = $( '<source />' ); 490 webmTag.attr( 'src', webm ); 491 webmTag.attr( 'type', webmType ); 492 493 videoTag.append( webmTag ); 494 } 495 496 // This is either desktop, or mobile is enabled. 497 if ( ! FLBuilderLayout._isMobile() || ( FLBuilderLayout._isMobile() && "yes" == videoMobile ) ) { 498 if ( 'undefined' != typeof youtube ) { 499 FLBuilderLayout._initYoutubeBgVideo.apply( this ); 500 } 501 else if ( 'undefined' != typeof vimeo ) { 502 FLBuilderLayout._initVimeoBgVideo.apply( this ); 503 } 504 else { 505 wrap.append( videoTag ); 506 } 507 } 508 else { 509 // if we are here, it means we are on mobile and NO is set so remove video src and use fallback 510 videoTag.attr('src', '') 511 wrap.append( videoTag ); 512 } 513 514 // Mark this video as loaded. 515 wrap.data('loaded', true); 516 }, 517 518 /** 519 * Initializes Youtube video background 520 * 521 * @since 1.9 522 * @access private 523 * @method _initYoutubeBgVideo 524 */ 525 _initYoutubeBgVideo: function() 526 { 527 var playerWrap = $(this), 528 videoId = playerWrap.data('video-id'), 529 videoPlayer = playerWrap.find('.fl-bg-video-player'), 530 enableAudio = playerWrap.data('enable-audio'), 531 audioButton = playerWrap.find('.fl-bg-video-audio'), 532 startTime = 'undefined' !== typeof playerWrap.data('start') ? playerWrap.data('start')
532: 0, 533 endTime = 'undefined' !== typeof playerWrap.data('end') ? playerWrap.data('end') : 0, 534 loop = 'undefined' !== typeof playerWrap.data('loop') ? playerWrap.data('loop') : 1, 535 stateCount = 0, 536 player,fallback_showing; 537 538 if ( videoId ) { 539 fallback = playerWrap.data('fallback') || false 540 if( fallback ) { 541 playerWrap.find('iframe').remove() 542 fallbackTag = $( '<div></div>' ); 543 fallbackTag.addClass( 'fl-bg-video-fallback' ); 544 fallbackTag.css( 'background-image', 'url(' + playerWrap.data('fallback') + ')' ); 545 fallbackTag.css( 'background-size', 'cover' ); 546 fallbackTag.css( 'transition', 'background-image 1s') 547 playerWrap.append( fallbackTag ); 548 fallback_showing = true; 549 } 550 FLBuilderLayout._onYoutubeApiReady( function( YT ) { 551 setTimeout( function() { 552 553 player = new YT.Player( videoPlayer[0], { 554 videoId: videoId, 555 events: { 556 onReady: function(event) { 557 if ( "no" === enableAudio || FLBuilderLayout._isMobile() ) { 558 event.target.mute(); 559 } 560 else if ( "yes" === enableAudio && event.target.isMuted ) { 561 event.target.unMute(); 562 } 563 564 // Store an instance to a parent 565 playerWrap.data('YTPlayer', player); 566 FLBuilderLayout._resizeYoutubeBgVideo.apply(playerWrap); 567 568 // Queue the video. 569 event.target.playVideo(); 570 571 if ( audioButton.length > 0 && ! FLBuilderLayout._isMobile() ) { 572 audioButton.on( 'click', {button: audioButton, player: player}, FLBuilderLayout._toggleBgVideoAudio ); 573 } 574 }, 575 onStateChange: function( event ) { 576 577 if ( event.data === 1 ) { 578 if ( fallback_showing ) { 579 $( '.fl-bg-video-fallback' ).css( 'background-image', 'url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)' ) 580 } 581 } 582 // Manual check if video is not playable in some browsers. 583 // StateChange order: [-1, 3, -1] 584 if ( stateCount < 4 ) { 585 stateCount++; 586 } 587 588 // Comply with the audio policy in some browsers like Chrome and Safari. 589 if ( stateCount > 1 && (-1 === event.data || 2 === event.data) && "yes" === enableAudio ) { 590 player.mute(); 591 player.playVideo(); 592 audioButton.show(); 593 } 594 595 if ( event.data === YT.PlayerState.ENDED && 1 === loop ) { 596 if ( startTime > 0 ) { 597 player.seekTo( startTime ); 598 } 599 else { 600 player.playVideo(); 601 } 602 } 603 }, 604 onError: function(event) { 605 console.info('YT Error: ' + event.data) 606 FLBuilderLayout._onErrorYoutubeVimeo(playerWrap) 607 } 608 }, 609 playerVars: { 610 playsinline: FLBuilderLayout._isMobile() ? 1 : 0, 611 controls: 0, 612 showinfo: 0, 613 rel : 0, 614 start: startTime, 615 end: endTime, 616 } 617 } ); 618 }, 1 ); 619 } ); 620 } 621 }, 622 623 /** 624 * On youtube or vimeo error show the fallback image if available. 625 * @since 2.0.7 626 */ 627 _onErrorYoutubeVimeo: function(playerWrap) { 628 629 fallback = playerWrap.data('fallback') || false 630 if( ! fallback ) { 631 return false; 632 } 633 playerWrap.find('iframe').remove() 634 fallbackTag = $( '<div></div>' ); 635 fallbackTag.addClass( 'fl-bg-video-fallback' ); 636 fallbackTag.css( 'background-image', 'url(' + playerWrap.data('fallback') + ')' ); 637 playerWrap.append( fallbackTag ); 638 }, 639 640 /** 641 * Check if Youtube API has been downloaded 642 * 643 * @since 1.9 644 * @access private 645 * @method _onYoutubeApiReady 646 * @param {Function} callback Method to call when YT API has been loaded 647 */ 648 _onYoutubeApiReady: function( callback ) { 649 if ( window.YT && YT.loaded ) { 650 callback( YT ); 651 } else { 652 // If not ready check again by timeout.. 653 setTimeout( function() { 654 FLBuilderLayout._onYoutubeApiReady( callback ); 655 }, 350 ); 656 } 657 }, 658 659 /** 660 * Initializes Vimeo video background 661 * 662 * @since 1.9 663 * @access private 664 * @method _initVimeoBgVideo 665 */ 666 _initVimeoBgVideo: function() 667 { 668 var playerWrap = $(this), 669 videoId = playerWrap.data('video-id'), 670 videoPlayer = playerWrap.find('.fl-bg-video-player'), 671 enableAudio = playerWrap.data('enable-audio'), 672 audioButton = playerWrap.find('.fl-bg-video-audio'), 673 player, 674 width = playerWrap.outerWidth(), 675 ua = navigator.userAgent; 676 677 if ( typeof Vimeo !== 'undefined' && videoId ) { 678 player = new Vimeo.Player(videoPlayer[0], { 679 id : videoId, 680 loop : true, 681 title : false, 682 portrait : false, 683 background : true, 684 autopause : false, 685 muted : true 686 }); 687 688 playerWrap.data('VMPlayer', player); 689 if ( "no" === enableAudio ) { 690 player.setVolume(0); 691 } 692 else if ("yes" === enableAudio ) { 693 // Chrome and Safari have audio policy restrictions for autoplay videos. 694 if ( ua.indexOf("Safari") > -1 || ua.indexOf("Chrome") > -1 ) { 695 player.setVolume(0); 696 audioButton.show(); 697 } 698 else { 699 player.setVolume(1); 700 } 701 } 702 703 player.play().catch(function(error) { 704 FLBuilderLayout._onErrorYoutubeVimeo(playerWrap) 705 }); 706 707 if ( audioButton.length > 0 ) {
708 audioButton.on( 'click', {button: audioButton, player: player}, FLBuilderLayout._toggleBgVideoAudio ); 709 } 710 } 711 }, 712 713 /** 714 * Mute / unmute audio on row's video background. 715 * It works for both Youtube and Vimeo. 716 * 717 * @since 2.1.3 718 * @access private 719 * @method _toggleBgVideoAudio 720 * @param {Object} e Method arguments 721 */ 722 _toggleBgVideoAudio: function( e ) { 723 var player = e.data.player, 724 control = e.data.button.find('.fl-audio-control'); 725 726 if ( control.hasClass( 'fa-volume-off' ) ) { 727 // Unmute 728 control 729 .removeClass( 'fa-volume-off' ) 730 .addClass( 'fa-volume-up' ); 731 e.data.button.find( '.fa-times' ).hide(); 732 733 if ( 'function' === typeof player.unMute ) { 734 player.unMute(); 735 } 736 else { 737 player.setVolume( 1 ); 738 } 739 } 740 else { 741 // Mute 742 control 743 .removeClass( 'fa-volume-up' ) 744 .addClass( 'fa-volume-off' ); 745 e.data.button.find( '.fa-times' ).show(); 746 747 if ( 'function' === typeof player.unMute ) { 748 player.mute(); 749 } 750 else { 751 player.setVolume( 0 ); 752 } 753 } 754 }, 755 756 /** 757 * Fires when there is an error loading a video 758 * background source and shows the fallback. 759 * 760 * @since 1.6.3.3 761 * @access private 762 * @method _videoBgSourceError 763 * @param {Object} e An event object 764 * @deprecated 2.0.3 765 */ 766 _videoBgSourceError: function( e ) 767 { 768 var source = $( e.target ), 769 wrap = source.closest( '.fl-bg-video' ), 770 vid = wrap.find( 'video' ), 771 fallback = wrap.data( 'fallback' ), 772 fallbackTag = ''; 773 source.remove(); 774 775 if ( vid.find( 'source' ).length ) { 776 // Don't show the fallback if we still have other sources to check. 777 return; 778 } else if ( '' !== fallback ) { 779 fallbackTag = $( '<div></div>' ); 780 fallbackTag.addClass( 'fl-bg-video-fallback' ); 781 fallbackTag.css( 'background-image', 'url(' + fallback + ')' ); 782 wrap.append( fallbackTag ); 783 vid.remove(); 784 } 785 }, 786 787 /** 788 * Fires when the window is resized to resize 789 * all video backgrounds. 790 * 791 * @since 1.1.4 792 * @access private 793 * @method _resizeBgVideos 794 */ 795 _resizeBgVideos: function() 796 { 797 $('.fl-bg-video').each( function() { 798 799 FLBuilderLayout._resizeBgVideo.apply( this ); 800 801 if ( $( this ).parent().find( 'img' ).length > 0 ) { 802 $( this ).parent().imagesLoaded( $.proxy( FLBuilderLayout._resizeBgVideo, this ) ); 803 } 804 } ); 805 }, 806 807 /** 808 * Fires when the window is resized to resize 809 * a single video background. 810 * 811 * @since 1.1.4 812 * @access private 813 * @method _resizeBgVideo 814 */ 815 _resizeBgVideo: function() 816 { 817 if ( 0 === $( this ).find( 'video' ).length && 0 === $( this ).find( 'iframe' ).length ) { 818 return; 819 } 820 821 var wrap = $(this), 822 wrapHeight = wrap.outerHeight(), 823 wrapWidth = wrap.outerWidth(), 824 vid = wrap.find('video'), 825 vidHeight = wrap.data('height'), 826 vidWidth = wrap.data('width'), 827 newWidth = wrapWidth, 828 newHeight = Math.round(vidHeight * wrapWidth/vidWidth), 829 newLeft = 0, 830 newTop = 0, 831 iframe = wrap.find('iframe'); 832 833 if ( vid.length ) { 834 if(vidHeight === '' || typeof vidHeight === 'undefined' || vidWidth === '' || typeof vidWidth === 'undefined') { 835 vid.css({ 836 'left' : '0px', 837 'top' : '0px', 838 'width' : newWidth + 'px' 839 }); 840 841 // Try to set the actual video dimension on 'loadedmetadata' when using URL as video source 842 vid.on('loadedmetadata', FLBuilderLayout._resizeOnLoadedMeta); 843 844 } 845 else { 846 847 if(newHeight < wrapHeight) { 848 newHeight = wrapHeight; 849 newWidth = Math.round(vidWidth * wrapHeight/vidHeight); 850 newLeft = -((newWidth - wrapWidth)/2); 851 } 852 else { 853 newTop = -((newHeight - wrapHeight)/2); 854 } 855 856 vid.css({ 857 'left' : newLeft + 'px', 858 'top' : newTop + 'px', 859 'height' : newHeight + 'px', 860 'width' : newWidth + 'px' 861 }); 862 } 863 } 864 else if ( iframe.length ) { 865 866 // Resize Youtube video player within iframe tag 867 if ( typeof wrap.data('youtube') !== 'undefined' ) { 868 FLBuilderLayout._resizeYoutubeBgVideo.apply(this); 869 } 870 } 871 }, 872 873 /** 874 * Fires when video meta has been loaded. 875 * This will be Triggered when width/height attributes were not specified during video background resizing. 876 * 877 * @since 1.8.5 878 * @access private 879 * @method _resizeOnLoadedMeta 880 */ 881 _resizeOnLoadedMeta: function(){ 882 var video = $(this), 883 wrapHeight = video.parent().outerHeight(), 884 wrapWidth = video.parent().outerWidth(), 885 vidWidth = video[0].videoWidth, 886 vidHeight = video[0].videoHeight, 887 newHeight = Math.round(vidHeight * wrapWidth/vidWidth), 888 newWidth = wrapWidth, 889 newLeft = 0, 890 newTop = 0; 891 892 if(newHeight < wrapHeight) { 893 newHeight = wrapHeight; 894 newWidth = Math.round(vidWidth * wrapHeight/vidHeight); 895 newLeft = -((newWidth - wrapWidth)/2); 896 } 897 else { 898 newTop = -((newHeight - wrapHeight)/2); 899 } 900 901 video.parent().data('width', vidWidth); 902 video.parent().data('height', vidHeight); 903 904 video.css({ 905 'left' : newLeft + 'px', 906 'top' : newTop + 'px', 907 'width' : newWidth + 'px', 908 'height' : newHeight + 'px' 909 }); 910 }, 911 912 /** 913 * Fires when the window is resized to resize 914 * a single Youtube video background. 915 * 916 * @since 1.9 917 * @access private 918 * @method _resizeYoutubeBgVideo 919 */ 920 _resizeYoutubeBgVideo: function() 921 { 922 var wrap = $(this), 923 wrapWidth = wrap.outerWidth(), 924 wrapHeight = wrap.outerHeight(), 925 player = wrap.data('YTPlayer'), 926 video = player ? player.getIframe() : null, 927 aspectRatioSetting = '16:9', // Medium 928 aspectRatioArray = aspectRatioSetting.split( ':' ),
929 aspectRatio = aspectRatioArray[0] / aspectRatioArray[1], 930 ratioWidth = wrapWidth / aspectRatio, 931 ratioHeight = wrapHeight * aspectRatio, 932 isWidthFixed = wrapWidth / wrapHeight > aspectRatio, 933 width = isWidthFixed ? wrapWidth : ratioHeight, 934 height = isWidthFixed ? ratioWidth : wrapHeight; 935 936 if ( video ) { 937 $(video).width( width ).height( height ); 938 } 939 }, 940 941 /** 942 * Initializes module animations. 943 * 944 * @since 1.1.9 945 * @access private 946 * @method _initModuleAnimations 947 */ 948 _initModuleAnimations: function() 949 { 950 if(typeof jQuery.fn.waypoint !== 'undefined') { 951 $('.fl-animation').each( function() { 952 var node = $( this ), 953 nodeTop = node.offset().top, 954 winHeight = $( window ).height(), 955 bodyHeight = $( 'body' ).height(), 956 waypoint = FLBuilderLayoutConfig.waypoint, 957 offset = '80%'; 958 959 if ( typeof waypoint.offset !== undefined ) { 960 offset = FLBuilderLayoutConfig.waypoint.offset + '%'; 961 } 962 963 if ( bodyHeight - nodeTop < winHeight * 0.2 ) { 964 offset = '100%'; 965 } 966 967 node.waypoint({ 968 offset: offset, 969 handler: FLBuilderLayout._doModuleAnimation 970 }); 971 } ); 972 } 973 }, 974 975 /** 976 * Runs a module animation. 977 * 978 * @since 1.1.9 979 * @access private 980 * @method _doModuleAnimation 981 */ 982 _doModuleAnimation: function() 983 { 984 var module = 'undefined' == typeof this.element ? $(this) : $(this.element), 985 delay = parseFloat(module.data('animation-delay')), 986 duration = parseFloat(module.data('animation-duration')); 987 988 if ( ! isNaN( duration ) ) { 989 module.css( 'animation-duration', duration + 's' ); 990 } 991 992 if(!isNaN(delay) && delay > 0) { 993 setTimeout(function(){ 994 module.addClass('fl-animated'); 995 }, delay * 1000); 996 } else { 997 setTimeout(function(){ 998 module.addClass('fl-animated'); 999 }, 1); 1000 } 1001 }, 1002 1003 /** 1004 * Opens a tab or accordion item if the browser hash is set 1005 * to the ID of one on the page. 1006 * 1007 * @since 1.6.0 1008 * @access private 1009 * @method _initHash 1010 */ 1011 _initHash: function() 1012 { 1013 var hash = window.location.hash.replace( '#', '' ).split( '/' ).shift(), 1014 element = null, 1015 tabs = null, 1016 responsiveLabel = null, 1017 tabIndex = null, 1018 label = null; 1019 1020 if ( '' !== hash ) { 1021 1022 try { 1023 1024 element = $( '#' + hash ); 1025 1026 if ( element.length > 0 ) { 1027 1028 if ( element.hasClass( 'fl-accordion-item' ) ) { 1029 setTimeout( function() { 1030 element.find( '.fl-accordion-button' ).trigger( 'click' ); 1031 }, 100 ); 1032 } 1033 if ( element.hasClass( 'fl-tabs-panel' ) ) { 1034 1035 setTimeout( function() { 1036 1037 tabs = element.closest( '.fl-tabs' ); 1038 responsiveLabel = element.find( '.fl-tabs-panel-label' ); 1039 tabIndex = responsiveLabel.data( 'index' ); 1040 label = tabs.find( '.fl-tabs-labels .fl-tabs-label[data-index=' + tabIndex + ']' ); 1041 1042 if ( responsiveLabel.is( ':visible' ) ) { 1043 responsiveLabel.trigger( 'click' ); 1044 } 1045 else { 1046 label[0].click(); 1047 FLBuilderLayout._scrollToElement( element ); 1048 } 1049 1050 }, 100 ); 1051 } 1052 } 1053 } 1054 catch( e ) {} 1055 } 1056 }, 1057 1058 /** 1059 * Initializes all anchor links on the page for smooth scrolling. 1060 * 1061 * @since 1.4.9 1062 * @access private 1063 * @method _initAnchorLinks 1064 */ 1065 _initAnchorLinks: function() 1066 { 1067 $( 'a' ).each( FLBuilderLayout._initAnchorLink ); 1068 }, 1069 1070 /** 1071 * Initializes a single anchor link for smooth scrolling. 1072 * 1073 * @since 1.4.9 1074 * @access private 1075 * @method _initAnchorLink 1076 */ 1077 _initAnchorLink: function() 1078 { 1079 var link = $( this ), 1080 href = link.attr( 'href' ), 1081 loc = window.location, 1082 id = null, 1083 element = null; 1084 if ( 'undefined' != typeof href && href.indexOf( '#' ) > -1 && link.closest('svg').length < 1 ) { 1085 1086 if ( loc.pathname.replace( /^\//, '' ) == this.pathname.replace( /^\//, '' ) && loc.hostname == this.hostname ) { 1087 1088 try { 1089 1090 id = href.split( '#' ).pop(); 1091 // If there is no ID then we have nowhere to look 1092 // Fixes a quirk in jQuery and FireFox 1093 if( ! id ) { 1094 return; 1095 } 1096 element = $( '#' + id ); 1097 1098 if ( element.length > 0 ) { 1099 if ( link.hasClass( 'fl-scroll-link' ) || element.hasClass( 'fl-row' ) || element.hasClass( 'fl-col' ) || element.hasClass( 'fl-module' ) ) { 1100 $( link ).on( 'click', FLBuilderLayout._scrollToElementOnLinkClick ); 1101 } 1102 if ( element.hasClass( 'fl-accordion-item' ) ) { 1103 $( link ).on( 'click', FLBuilderLayout._scrollToAccordionOnLinkClick ); 1104 } 1105 if ( element.hasClass( 'fl-tabs-panel' ) ) { 1106 $( link ).on( 'click', FLBuilderLayout._scrollToTabOnLinkClick ); 1107 } 1108 } 1109 } 1110 catch( e ) {} 1111 } 1112 } 1113 }, 1114 1115 /** 1116 * Scrolls to an element when an anchor link is clicked. 1117 * 1118 * @since 1.4.9 1119 * @access private 1120 * @method _scrollToElementOnLinkClick 1121 * @param {Object} e An event object. 1122 * @param {Function} callback A function to call when the scroll is complete. 1123 */ 1124 _scrollToElementOnLinkClick: function( e, callback ) 1125 { 1126 var element = $( '#' + $( this ).attr( 'href' ).split( '#' ).pop() ); 1127 1128 FLBuilderLayout._scrollToElement( element, callback ); 1129 1130 e.preventDefault(); 1131 }, 1132 1133 /** 1134 * Scrolls to an element. 1135 * 1136 * @since 1.6.4.5 1137 * @access private 1138 * @method _scrollToElement 1139 * @param {Object} element The element to scroll to. 1140 * @param {Function} callback A function to call when the scroll is complete. 1141 */ 1142 _scrollToElement: function( element, callback ) 1143 { 1144 var config = FLBuilderLayoutConfig.anchorLinkAnimations, 1145 dest = 0, 1146 win = $( window ), 1147 doc = $( document ); 1148 1149 if ( element.length > 0 ) { 1150 1151 if ( element.offset().top > doc.height() - win.height() ) { 1152 dest = doc.height() - win.height(); 1153 } 1154 else { 1155 dest = element.offset().top - config.offset; 1156 } 1157 1158 $( 'html, body' ).animate( { scrollTop: dest }, config.duration, config.easing, function() { 1159 1160 if ( 'undefined' != typeof callback ) { 1161 callback(); 1162 } 1163 1164 if ( undefined != element.attr( 'id' ) ) { 1165 1166 if ( history.pushState ) { 1167 history.pushState( null, null, '#' + element.attr( 'id' ) ); 1168 } 1169 else { 1170 window.location.hash = element.attr( 'id' ); 1171 } 1172 } 1173 } ); 1174 } 1175 }, 1176 1177 /** 1178 * Scrolls to an accordion item when a link is clicked. 1179 * 1180 * @since 1.5.9 1181 * @access private 1182 * @method _scrollToAccordionOnLinkClick 1183 * @param {Object} e An event object. 1184 */ 1185 _scrollToAccordionOnLinkClick: function( e ) 1186 { 1187 var element = $( '#' + $( this ).attr( 'href' ).split( '#' ).pop() ); 1188 1189 if ( element.length > 0 ) { 1190 1191 var callback = function() { 1192 if ( element ) { 1193 element.find( '.fl-accordion-button' ).trigger( 'click' ); 1194 element = false;
1195 } 1196 }; 1197 1198 FLBuilderLayout._scrollToElementOnLinkClick.call( this, e, callback ); 1199 } 1200 }, 1201 1202 /** 1203 * Scrolls to a tab panel when a link is clicked. 1204 * 1205 * @since 1.5.9 1206 * @access private 1207 * @method _scrollToTabOnLinkClick 1208 * @param {Object} e An event object. 1209 */ 1210 _scrollToTabOnLinkClick: function( e ) 1211 { 1212 var element = $( '#' + $( this ).attr( 'href' ).split( '#' ).pop() ), 1213 tabs = null, 1214 label = null, 1215 responsiveLabel = null; 1216 1217 if ( element.length > 0 ) { 1218 1219 tabs = element.closest( '.fl-tabs' ); 1220 responsiveLabel = element.find( '.fl-tabs-panel-label' ); 1221 tabIndex = responsiveLabel.data( 'index' ); 1222 label = tabs.find( '.fl-tabs-labels .fl-tabs-label[data-index=' + tabIndex + ']' ); 1223 1224 if ( responsiveLabel.is( ':visible' ) ) { 1225 1226 var callback = function() { 1227 if ( element ) { 1228 responsiveLabel.trigger( 'click' ); 1229 element = false; 1230 } 1231 }; 1232 1233 FLBuilderLayout._scrollToElementOnLinkClick.call( this, e, callback ); 1234 } 1235 else { 1236 label[0].click(); 1237 FLBuilderLayout._scrollToElement( element ); 1238 } 1239 1240 e.preventDefault(); 1241 } 1242 }, 1243 1244 /** 1245 * Initializes all builder forms on a page. 1246 * 1247 * @since 1.5.4 1248 * @access private 1249 * @method _initForms 1250 */ 1251 _initForms: function() 1252 { 1253 if ( ! FLBuilderLayout._hasPlaceholderSupport ) { 1254 $( '.fl-form-field input' ).each( FLBuilderLayout._initFormFieldPlaceholderFallback ); 1255 } 1256 1257 $( '.fl-form-field input' ).on( 'focus', FLBuilderLayout._clearFormFieldError ); 1258 }, 1259 1260 /** 1261 * Checks to see if the current device has HTML5 1262 * placeholder support. 1263 * 1264 * @since 1.5.4 1265 * @access private 1266 * @method _hasPlaceholderSupport 1267 * @return {Boolean} 1268 */ 1269 _hasPlaceholderSupport: function() 1270 { 1271 var input = document.createElement( 'input' ); 1272 1273 return 'undefined' != input.placeholder; 1274 }, 1275 1276 /** 1277 * Initializes the fallback for when placeholders aren't supported. 1278 * 1279 * @since 1.5.4 1280 * @access private 1281 * @method _initFormFieldPlaceholderFallback 1282 */ 1283 _initFormFieldPlaceholderFallback: function() 1284 { 1285 var field = $( this ), 1286 val = field.val(), 1287 placeholder = field.attr( 'placeholder' ); 1288 1289 if ( 'undefined' != placeholder && '' === val ) { 1290 field.val( placeholder ); 1291 field.on( 'focus', FLBuilderLayout._hideFormFieldPlaceholderFallback ); 1292 field.on( 'blur', FLBuilderLayout._showFormFieldPlaceholderFallback ); 1293 } 1294 }, 1295 1296 /** 1297 * Hides a fallback placeholder on focus. 1298 * 1299 * @since 1.5.4 1300 * @access private 1301 * @method _hideFormFieldPlaceholderFallback 1302 */ 1303 _hideFormFieldPlaceholderFallback: function() 1304 { 1305 var field = $( this ), 1306 val = field.val(), 1307 placeholder = field.attr( 'placeholder' ); 1308 1309 if ( val == placeholder ) { 1310 field.val( '' ); 1311 } 1312 }, 1313 1314 /** 1315 * Shows a fallback placeholder on blur. 1316 * 1317 * @since 1.5.4 1318 * @access private 1319 * @method _showFormFieldPlaceholderFallback 1320 */ 1321 _showFormFieldPlaceholderFallback: function() 1322 { 1323 var field = $( this ), 1324 val = field.val(), 1325 placeholder = field.attr( 'placeholder' ); 1326 1327 if ( '' === val ) { 1328 field.val( placeholder ); 1329 } 1330 }, 1331 1332 /** 1333 * Clears a form field error message. 1334 * 1335 * @since 1.5.4 1336 * @access private 1337 * @method _clearFormFieldError 1338 */ 1339 _clearFormFieldError: function() 1340 { 1341 var field = $( this ); 1342 1343 field.removeClass( 'fl-form-error' ); 1344 field.siblings( '.fl-form-error-message' ).hide(); 1345 } 1346 }; 1347 1348 /* Initializes the builder layout. */ 1349 $(function(){ 1350 FLBuilderLayout.init(); 1351 }); 1352 1353})(jQuery); 1354 1355/* Start Global JS */ 1356 1357/* End Global JS */ 1358 1359 1360(function($) { 1361 1362 FLBuilderTabs = function( settings ) 1363 { 1364 this.settings = settings; 1365 this.nodeClass = '.fl-node-' + settings.id; 1366 this._init(); 1367 }; 1368 1369 FLBuilderTabs.prototype = { 1370 1371 settings : {}, 1372 nodeClass : '', 1373 1374 _init: function() 1375 { 1376 var win = $(window); 1377 1378 $(this.nodeClass + ' .fl-tabs-labels .fl-tabs-label').click($.proxy(this._labelClick, this)); 1379 $(this.nodeClass + ' .fl-tabs-labels .fl-tabs-label').on('keypress', $.proxy(this._labelClick, this)); 1380 $(this.nodeClass + ' .fl-tabs-panels .fl-tabs-label').click($.proxy(this._responsiveLabelClick, this)); 1381 $(this.nodeClass + ' .fl-tabs-panels .fl-tabs-label').on('keypress', $.proxy(this._responsiveLabelClick, this)); 1382
1383 if($(this.nodeClass + ' .fl-tabs-vertical').length > 0) { 1384 this._resize(); 1385 win.off('resize' + this.nodeClass); 1386 win.on('resize' + this.nodeClass, $.proxy(this._resize, this)); 1387 } 1388 1389 FLBuilderLayout.preloadAudio( this.nodeClass + ' .fl-tabs-panel-content' ); 1390 }, 1391 1392 _labelClick: function(e) 1393 { 1394 var label = $(e.target).closest('.fl-tabs-label'), 1395 index = label.data('index'), 1396 wrap = label.closest('.fl-tabs'), 1397 allIcons = wrap.find('.fl-tabs-panels .fl-tabs-label .fas'), 1398 icon = wrap.find('.fl-tabs-panels .fl-tabs-label[data-index="' + index + '"] .fas'); 1399 1400 // Click or keyboard (enter or space) input? 1401 if(!this._validClick(e)) { 1402 return; 1403 } 1404 1405 // Toggle the responsive icons. 1406 allIcons.addClass('fa-plus'); 1407 icon.removeClass('fa-plus'); 1408 1409 // Toggle the tabs. 1410 wrap.find('.fl-tabs-labels:first > .fl-tab-active').removeClass('fl-tab-active').attr('aria-selected', 'false').attr('aria-expanded', 'false'); 1411 wrap.find('.fl-tabs-panels:first > .fl-tabs-panel > .fl-tab-active').removeClass('fl-tab-active'); 1412 wrap.find('.fl-tabs-panels:first > .fl-tabs-panel > .fl-tabs-panel-content').attr('aria-hidden', 'true').css('display', ''); 1413 1414 wrap.find('.fl-tabs-labels:first > .fl-tabs-label[data-index="' + index + '"]').addClass('fl-tab-active').attr('aria-selected', 'true').attr('aria-expanded', 'true'); 1415 wrap.find('.fl-tabs-panels:first > .fl-tabs-panel > .fl-tabs-panel-content[data-index="' + index + '"]').addClass('fl-tab-active').attr('aria-hidden', 'false'); 1416 1417 // Gallery module support. 1418 FLBuilderLayout.refreshGalleries( wrap.find('.fl-tabs-panel-content[data-index="' + index + '"]') ); 1419 1420 // Grid layout support (uses Masonry) 1421 FLBuilderLayout.refreshGridLayout( wrap.find('.fl-tabs-panel-content[data-index="' + index + '"]') ); 1422 1423 // Post Carousel support (uses BxSlider) 1424 FLBuilderLayout.reloadSlider( wrap.find('.fl-tabs-panel-content[data-index="' + index + '"]') ); 1425 1426 // WP audio shortcode support 1427 FLBuilderLayout.resizeAudio( wrap.find('.fl-tabs-panel-content[data-index="' + index + '"]') ); 1428 1429 // Slideshow module support. 1430 FLBuilderLayout.resizeSlideshow(); 1431 1432 // Reload Google Map embed. 1433 FLBuilderLayout.reloadGoogleMap( wrap.find('.fl-tabs-panel-content[data-index="' + index + '"]') ); 1434 1435 e.preventDefault(); 1436 }, 1437 1438 _responsiveLabelClick: function(e) 1439 { 1440 var label = $(e.target).closest('.fl-tabs-label'), 1441 wrap = label.closest('.fl-tabs'), 1442 index = label.data('index'), 1443 content = label.siblings('.fl-tabs-panel-content'), 1444 activeContent = wrap.find('.fl-tabs-panel-content.fl-tab-active'), 1445 activeIndex = activeContent.data('index'), 1446 allIcons = wrap.find('.fl-tabs-panels .fl-tabs-label > .fas'), 1447 icon = label.find('.fas'); 1448 1449 // Click or keyboard (enter or space) input? 1450 if(!this._validClick(e)) { 1451 return; 1452 } 1453 1454 // Should we proceed? 1455 if(index == activeIndex) { 1456 return; 1457 } 1458 if(wrap.hasClass('fl-tabs-animation')) { 1459 return; 1460 } 1461 1462 // Toggle the icons. 1463 allIcons.addClass('fa-plus'); 1464 icon.removeClass('fa-plus'); 1465 1466 // Run the animations. 1467 wrap.addClass('fl-tabs-animation'); 1468 activeContent.slideUp('normal'); 1469 1470 content.slideDown('normal', function(){ 1471 1472 wrap.find('.fl-tab-active').removeClass('fl-tab-active').attr('aria-hidden', 'true'); 1473 wrap.find('.fl-tabs-panels:first > .fl-tabs-panel > .fl-tabs-panel-content').attr('aria-hidden', 'true'); 1474 wrap.find('.fl-tabs-label[data-index="' + index + '"]').addClass('fl-tab-active').attr('aria-hidden', 'false'); 1475 wrap.find('.fl-tabs-panels:first > .fl-tabs-panel > .fl-tabs-panel-content[data-index="' + index + '"]').attr('aria-hidden', 'false'); 1476 content.addClass('fl-tab-active'); 1477 wrap.removeClass('fl-tabs-animation'); 1478 1479 // Gallery module support. 1480 FLBuilderLayout.refreshGalleries( content ); 1481 1482 // Grid layout support (uses Masonry) 1483 FLBuilderLayout.refreshGridLayout( content ); 1484 1485 // Post Carousel support (uses BxSlider) 1486 FLBuilderLayout.reloadSlider( content ); 1487 1488 // WP audio shortcode support 1489 FLBuilderLayout.resizeAudio( content ); 1490 1491 // Reload Google Map embed. 1492 FLBuilderLayout.reloadGoogleMap( wrap.find('.fl-tabs-panel-content[data-index="' + index + '"]') ); 1493 1494 if(label.offset().top < $(window).scrollTop() + 100) { 1495 $('html, body').animate({ scrollTop: label.offset().top - 100 }, 500, 'swing'); 1496 } 1497 }); 1498 }, 1499 1500 _resize: function() 1501 {
1502 $(this.nodeClass + ' .fl-tabs-vertical').each($.proxy(this._resizeVertical, this)); 1503 }, 1504 1505 _resizeVertical: function(e) 1506 { 1507 var wrap = $(this.nodeClass + ' .fl-tabs-vertical'), 1508 labels = wrap.find('.fl-tabs-labels'), 1509 panels = wrap.find('.fl-tabs-panels'); 1510 1511 panels.css('min-height', labels.height() + 'px'); 1512 }, 1513 1514 _validClick: function(e) 1515 { 1516 return (e.which == 1 || e.which == 13 || e.which == 32) ? true : false; 1517 } 1518 }; 1519 1520})(jQuery); 1521(function($) { 1522 1523 $(function() { 1524 1525 new FLBuilderTabs({ 1526 id: '5b8d1392f3ce3' 1527 }); 1528 }); 1529 1530})(jQuery); 1531 1532/* Start Global Node Custom JS */ 1533 1534/* End Global Node Custom JS */ 1535 1536 1537/* Start Layout Custom JS */ 1538 1539/* End Layout Custom JS */ 1540
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.