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