var wpAjaxUrl = 'https://t-hub.technion.ac.il/wp-admin/admin-ajax.php';var flBuilderUrl = 'https://t-hub.technion.ac.il/wp-content/plugins/bb-plugin/';var FLBuilderLayoutConfig = { anchorLinkAnimations : { duration : 1000, easing : 'swing', offset : 100 }, paths : { pluginUrl : 'https://t-hub.technion.ac.il/wp-content/plugins/bb-plugin/', wpAjaxUrl : 'https://t-hub.technion.ac.il/wp-admin/admin-ajax.php' }, breakpoints : { small : 900, medium : 1440, large : 1920 }, waypoint: { offset: 80 }, emptyColWidth: '0%' }; (function($){ if(typeof FLBuilderLayout != 'undefined') { return; } /** * Helper class with generic logic for a builder layout. * * @class FLBuilderLayout * @since 1.0 */ FLBuilderLayout = { /** * Initializes a builder layout. * * @since 1.0 * @method init */ init: function() { // Destroy existing layout events. FLBuilderLayout._destroy(); // Init CSS classes. FLBuilderLayout._initClasses(); // Init backgrounds. FLBuilderLayout._initBackgrounds(); // Init buttons. FLBuilderLayout._initButtons(); // Init row shape layer height. FLBuilderLayout._initRowShapeLayerHeight(); // Only init if the builder isn't active. if ( 0 === $('.fl-builder-edit').length ) { // Init anchor links. FLBuilderLayout._initAnchorLinks(); // Init the browser hash. FLBuilderLayout._initHash(); // Init forms. FLBuilderLayout._initForms(); FLBuilderLayout._reorderMenu(); } else { FLBuilderLayout._initNestedColsWidth(); } $('body').removeClass( 'fl-no-js' ); }, /** * Public method for refreshing Wookmark or MosaicFlow galleries * within an element. * * @since 1.7.4 * @method refreshGalleries */ refreshGalleries: function( element ) { var $element = 'undefined' == typeof element ? $( 'body' ) : $( element ), mfContent = $element.find( '.fl-mosaicflow-content' ), wmContent = $element.find( '.fl-gallery' ), mfObject = null; if ( mfContent ) { mfObject = mfContent.data( 'mosaicflow' ); if ( mfObject ) { mfObject.columns = $( [] ); mfObject.columnsHeights = []; mfContent.data( 'mosaicflow', mfObject ); mfContent.mosaicflow( 'refill' ); } } if ( wmContent ) { wmContent.trigger( 'refreshWookmark' ); } }, /** * Public method for refreshing Masonry within an element * * @since 1.8.1 * @method refreshGridLayout */ refreshGridLayout: function( element ) { var $element = 'undefined' == typeof element ? $( 'body' ) : $( element ), msnryContent = $element.find('.masonry'); if ( msnryContent.length ) { msnryContent.masonry('layout'); } }, /** * Public method for reloading BxSlider within an element * * @since 1.8.1 * @method reloadSlider */ reloadSlider: function( content ) { var $content = 'undefined' == typeof content ? $('body') : $(content); // reload sliders. if ($content.find('.bx-viewport > div').length > 0) { $.each($content.find('.bx-viewport > div'), function (key, slider) { setTimeout(function () { $(slider).data('bxSlider').reloadSlider(); }, 100); }); } }, /** * Public method for resizing WP audio player * * @since 1.8.2 * @method resizeAudio */ resizeAudio: function( element ) { var $element = 'undefined' == typeof element ? $( 'body' ) : $( element ), audioPlayers = $element.find('.wp-audio-shortcode.mejs-audio'), player = null, mejsPlayer = null, rail = null, railWidth = 400; if ( audioPlayers.length && typeof mejs !== 'undefined' ) { audioPlayers.each(function(){ player = $(this); mejsPlayer = mejs.players[player.attr('id')]; rail = player.find('.mejs-controls .mejs-time-rail'); var innerMejs = player.find('.mejs-inner'), total = player.find('.mejs-controls .mejs-time-total'); if ( typeof mejsPlayer !== 'undefined' ) { railWidth = Math.ceil(player.width() * 0.8); if ( innerMejs.length ) { rail.css('width', railWidth +'px!important'); //total.width(rail.width() - 10); mejsPlayer.options.autosizeProgress = true; // webkit has trouble doing this without a delay setTimeout(function () { mejsPlayer.setControlsSize(); }, 50); player.find('.mejs-inner').css({ visibility: 'visible', height: 'inherit' }); } } }); } }, /** * Public method for preloading WP audio player when it's inside the hidden element * * @since 1.8.2 * @method preloadAudio */ preloadAudio: function(element) { var $element = 'undefined' == typeof element ? $( 'body' ) : $( element ), contentWrap = $element.closest('.fl-accordion-item'), audioPlayers = $element.find('.wp-audio-shortcode.mejs-audio'); if ( ! contentWrap.hasClass('fl-accordion-item-active') && audioPlayers.find('.mejs-inner').length ) { audioPlayers.find('.mejs-inner').css({ visibility : 'hidden', height: 0 }); } }, /** * Public method for resizing slideshow momdule within the tab * * @since 1.10.5 * @method resizeSlideshow */ resizeSlideshow: function(){ if(typeof YUI !== 'undefined') { YUI().use('node-event-simulate', function(Y) { Y.one(window).simulate("resize"); }); } }, /** * Public method for reloading an embedded Google Map within the tabs or hidden element. * * @since 2.2 * @method reloadGoogleMap */ reloadGoogleMap: function(element){ var $element = 'undefined' == typeof element ? $( 'body' ) : $( element ), googleMap = $element.find( 'iframe[src*="google.com/maps"]' ); if ( googleMap.length ) { googleMap.attr( 'src', function(i, val) { return val; }); } }, /** * Unbinds builder layout events. * * @since 1.0 * @access private * @method _destroy */ _destroy: function() { var win = $(window); win.off('scroll.fl-bg-parallax'); win.off('resize.fl-bg-video'); }, /** * Checks to see if the current device has touch enabled. * * @since 1.0 * @access private * @method _isTouch * @return {Boolean} */ _isTouch: function() { if(('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)) { return true; } return false; }, /** * Checks to see if the current device is mobile. * * @since 1.7 * @access private * @method _isMobile * @return {Boolean} */ _isMobile: function() { return /Mobile|Android|Silk\/|Kindle|BlackBerry|Opera Mini|Opera Mobi|webOS/i.test( navigator.userAgent ); }, /** * Initializes builder body classes. * * @since 1.0 * @access private * @method _initClasses */ _initClasses: function() { var body = $( 'body' ), ua = navigator.userAgent; // Add the builder body class. if ( ! body.hasClass( 'archive' ) && $( '.fl-builder-content-primary' ).length > 0 ) { body.addClass('fl-builder'); } // Add the builder touch body class. if(FLBuilderLayout._isTouch()) { body.addClass('fl-builder-touch'); } // Add the builder mobile body class. if(FLBuilderLayout._isMobile()) { body.addClass('fl-builder-mobile'); } if ( $(window).width() < FLBuilderLayoutConfig.breakpoints.small ) { body.addClass( 'fl-builder-breakpoint-small' ); } if ( $(window).width() > FLBuilderLayoutConfig.breakpoints.small && $(window).width() < FLBuilderLayoutConfig.breakpoints.medium ) { body.addClass( 'fl-builder-breakpoint-medium' ); } if ( $(window).width() > FLBuilderLayoutConfig.breakpoints.medium && $(window).width() < FLBuilderLayoutConfig.breakpoints.large ) { body.addClass( 'fl-builder-breakpoint-large' ); } if ( $(window).width() > FLBuilderLayoutConfig.breakpoints.large ) { body.addClass( 'fl-builder-breakpoint-default' ); } // IE11 body class. if ( ua.indexOf( 'Trident/7.0' ) > -1 && ua.indexOf( 'rv:11.0' ) > -1 ) { body.addClass( 'fl-builder-ie-11' ); } }, /** * Initializes builder node backgrounds that require * additional JavaScript logic such as parallax. * * @since 1.1.4 * @access private * @method _initBackgrounds */ _initBackgrounds: function() { var win = $(window); // Init parallax backgrounds. if($('.fl-row-bg-parallax').length > 0 && !FLBuilderLayout._isMobile()) { FLBuilderLayout._scrollParallaxBackgrounds(); FLBuilderLayout._initParallaxBackgrounds(); win.on('resize.fl-bg-parallax', FLBuilderLayout._initParallaxBackgrounds); win.on('scroll.fl-bg-parallax', FLBuilderLayout._scrollParallaxBackgrounds); } // Init video backgrounds. if($('.fl-bg-video').length > 0) { FLBuilderLayout._initBgVideos(); FLBuilderLayout._resizeBgVideos(); // Ensure FLBuilderLayout._resizeBgVideos() is only called once on window resize. var resizeBGTimer = null; win.on('resize.fl-bg-video', function(e){ clearTimeout( resizeBGTimer ); resizeBGTimer = setTimeout(function() { FLBuilderLayout._resizeBgVideos(e); }, 100 ); }); } }, /** * Initializes all buttons in a layout. * * @since 2.10 * @access private * @method _initButtons */ _initButtons: function() { // Trigger click event on Enter or Space key press for deprecated button markup. $('a.fl-button[role="button"]').on('keydown', function(event) { if (event.key === 'Enter' || event.key === ' ') { // Necessary to prevent the default behavior of the space key from scrolling the page event.preventDefault(); $(this).trigger('click'); } }); }, /** * Initializes all parallax backgrounds in a layout. * * @since 1.1.4 * @access private * @method _initParallaxBackgrounds */ _initParallaxBackgrounds: function() { $('.fl-row-bg-parallax').each(FLBuilderLayout._initParallaxBackground); }, /** * Initializes a single parallax background. * * @since 1.1.4 * @access private * @method _initParallaxBackgrounds */ _initParallaxBackground: function() { var row = $(this), content = row.find('> .fl-row-content-wrap'), winWidth = $(window).width(), screenSize = '', imageSrc = { default: '', medium: '', responsive: '', }; imageSrc.default = row.data('parallax-image') || ''; imageSrc.medium = row.data('parallax-image-medium') || imageSrc.default; imageSrc.responsive = row.data('parallax-image-responsive') || imageSrc.medium; if (winWidth > FLBuilderLayoutConfig.breakpoints.medium) { screenSize = 'default'; } else if (winWidth > FLBuilderLayoutConfig.breakpoints.small && winWidth <= FLBuilderLayoutConfig.breakpoints.medium ) { screenSize = 'medium'; } else if (winWidth <= FLBuilderLayoutConfig.breakpoints.small) { screenSize = 'responsive'; } content.css('background-image', 'url(' + imageSrc[screenSize] + ')'); row.data('current-image-loaded', screenSize ); }, /** * Fires when the window is scrolled to adjust * parallax backgrounds. * * @since 1.1.4 * @access private * @method _scrollParallaxBackgrounds */ _scrollParallaxBackgrounds: function() { $('.fl-row-bg-parallax').each(FLBuilderLayout._scrollParallaxBackground); }, /** * Fires when the window is scrolled to adjust * a single parallax background. * * @since 1.1.4 * @access private * @method _scrollParallaxBackground */ _scrollParallaxBackground: function() { var win = $(window), row = $(this), content = row.find('> .fl-row-content-wrap'), speed = row.data('parallax-speed'), offset = content.offset(), yPos = -((win.scrollTop() - offset.top) / speed), initialOffset = ( row.data('parallax-offset') != null ) ? row.data('parallax-offset') : 0, totalOffset = yPos - initialOffset; content.css('background-position', 'center ' + totalOffset + 'px'); }, /** * Initializes all video backgrounds. * * @since 1.6.3.3 * @access private * @method _initBgVideos */ _initBgVideos: function() { $('.fl-bg-video').each(FLBuilderLayout._initBgVideo); }, /** * Initializes a video background. * * @since 1.6.3.3 * @access private * @method _initBgVideo */ _initBgVideo: function() { var wrap = $( this ), width = wrap.data( 'width' ), height = wrap.data( 'height' ), mp4 = wrap.data( 'mp4' ), youtube = wrap.data( 'youtube'), vimeo = wrap.data( 'vimeo'), mp4Type = wrap.data( 'mp4-type' ), webm = wrap.data( 'webm' ), webmType = wrap.data( 'webm-type' ), fallback = wrap.data( 'fallback' ), loaded = wrap.data( 'loaded' ), videoMobile = wrap.data( 'video-mobile' ), playPauseButton = wrap.find('.fl-bg-video-play-pause-control'), fallbackTag = '', videoTag = null, mp4Tag = null, webmTag = null; // Return if the video has been loaded for this row. if ( loaded ) { return; } videoTag = $( '' ); /** * Add poster image (fallback image) */ if( 'undefined' != typeof fallback && '' != fallback ) { videoTag.attr( 'poster', 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7' ) videoTag.css({ backgroundImage: 'url("' + fallback + '")', backgroundColor: 'transparent', backgroundRepeat: 'no-repeat', backgroundSize: 'cover', backgroundPosition: 'center center', }) } // MP4 Source Tag if ( 'undefined' != typeof mp4 && '' != mp4 ) { mp4Tag = $( '' ); mp4Tag.attr( 'src', mp4 ); mp4Tag.attr( 'type', mp4Type ); videoTag.append( mp4Tag ); } // WebM Source Tag if ( 'undefined' != typeof webm && '' != webm ) { webmTag = $( '' ); webmTag.attr( 'src', webm ); webmTag.attr( 'type', webmType ); videoTag.append( webmTag ); } // This is either desktop, or mobile is enabled. if ( ! FLBuilderLayout._isMobile() || ( FLBuilderLayout._isMobile() && "yes" == videoMobile ) ) { if ( 'undefined' != typeof youtube ) { FLBuilderLayout._initYoutubeBgVideo.apply( this ); } else if ( 'undefined' != typeof vimeo ) { FLBuilderLayout._initVimeoBgVideo.apply( this ); } else { wrap.append( videoTag ); if ( playPauseButton.length > 0 ) { var video = videoTag[0]; playPauseButton.on( 'click', { video: video }, function(e) { var video = e.data.video; if ( video.paused ) { video.play(); } else { video.pause(); } } ); $( video ).on( 'play playing', function () { playPauseButton.removeClass( 'fa-play' ).addClass( 'fa-pause' ); } ); $( video ).on( 'pause ended waiting', function () { playPauseButton.removeClass( 'fa-pause' ).addClass( 'fa-play' ); } ); } } } else { // if we are here, it means we are on mobile and NO is set so remove video src and use fallback videoTag.attr('src', '') wrap.append( videoTag ); } // Mark this video as loaded. wrap.data('loaded', true); }, /** * Initializes Youtube video background * * @since 1.9 * @access private * @method _initYoutubeBgVideo */ _initYoutubeBgVideo: function() { var playerWrap = $(this), videoId = playerWrap.data('video-id'), videoPlayer = playerWrap.find('.fl-bg-video-player'), enableAudio = playerWrap.data('enable-audio'), audioButton = playerWrap.find('.fl-bg-video-audio'), playPauseButton = playerWrap.find('.fl-bg-video-play-pause-control'), startTime = 'undefined' !== typeof playerWrap.data('start') ? playerWrap.data('start') : 0, startTime = 'undefined' !== typeof playerWrap.data('t') && startTime === 0 ? playerWrap.data('t') : startTime, endTime = 'undefined' !== typeof playerWrap.data('end') ? playerWrap.data('end') : 0, loop = 'undefined' !== typeof playerWrap.data('loop') ? playerWrap.data('loop') : 1, stateCount = 0, player,fallback_showing; if ( videoId ) { fallback = playerWrap.data('fallback') || false if( fallback ) { playerWrap.find('iframe').remove() fallbackTag = $( '
' ); fallbackTag.addClass( 'fl-bg-video-fallback' ); fallbackTag.css( 'background-image', 'url(' + playerWrap.data('fallback') + ')' ); fallbackTag.css( 'background-size', 'cover' ); fallbackTag.css( 'transition', 'background-image 1s') playerWrap.append( fallbackTag ); fallback_showing = true; } FLBuilderLayout._onYoutubeApiReady( function( YT ) { setTimeout( function() { player = new YT.Player( videoPlayer[0], { videoId: videoId, events: { onReady: function(event) { if ( "no" === enableAudio || FLBuilderLayout._isMobile() ) { event.target.mute(); } else if ( "yes" === enableAudio && event.target.isMuted ) { event.target.unMute(); } // Store an instance to a parent playerWrap.data('YTPlayer', player); FLBuilderLayout._resizeYoutubeBgVideo.apply(playerWrap); // Queue the video. event.target.playVideo(); if ( audioButton.length > 0 && ! FLBuilderLayout._isMobile() ) { audioButton.on( 'click', {button: audioButton, player: player}, FLBuilderLayout._toggleBgVideoAudio ); } if ( playPauseButton.length > 0 ) { playPauseButton.on( 'click', {player: player}, function(e) { var player = e.data.player; if ( 1 === player.getPlayerState() ) { player.pauseVideo(); } else { player.playVideo(); } }); } }, onStateChange: function( event ) { if ( event.data === 1 ) { if ( fallback_showing ) { $( '.fl-bg-video-fallback' ).css( 'background-image', 'url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)' ) } } // Manual check if video is not playable in some browsers. // StateChange order: [-1, 3, -1] if ( stateCount < 4 ) { stateCount++; } // Comply with the audio policy in some browsers like Chrome and Safari. if ( stateCount > 1 && -1 === event.data && "yes" === enableAudio ) { player.mute(); player.playVideo(); audioButton.show(); } if ( event.data === YT.PlayerState.ENDED && 1 === loop ) { if ( startTime > 0 ) { player.seekTo( startTime ); } else { player.playVideo(); } } if ( event.data === YT.PlayerState.PLAYING ) { playPauseButton.removeClass( 'fa-play' ).addClass( 'fa-pause' ); } else if ( event.data === YT.PlayerState.PAUSED ) { playPauseButton.removeClass( 'fa-pause' ).addClass( 'fa-play' ); } else if ( event.data === YT.PlayerState.BUFFERING ) { playPauseButton.removeClass( 'fa-play' ).addClass( 'fa-pause' ); } else if ( event.data === YT.PlayerState.CUED ) { playPauseButton.removeClass( 'fa-pause' ).addClass( 'fa-play' ); } else if ( event.data === YT.PlayerState.ENDED ) { playPauseButton.removeClass( 'fa-pause' ).addClass( 'fa-play' ); } }, onError: function(event) { console.info('YT Error: ' + event.data) FLBuilderLayout._onErrorYoutubeVimeo(playerWrap) } }, playerVars: { playsinline: FLBuilderLayout._isMobile() ? 1 : 0, controls: 0, showinfo: 0, rel : 0, start: startTime, end: endTime, } } ); }, 1 ); } ); } }, /** * On youtube or vimeo error show the fallback image if available. * @since 2.0.7 */ _onErrorYoutubeVimeo: function(playerWrap) { fallback = playerWrap.data('fallback') || false if( ! fallback ) { return false; } playerWrap.find('iframe').remove() fallbackTag = $( '
' ); fallbackTag.addClass( 'fl-bg-video-fallback' ); fallbackTag.css( 'background-image', 'url(' + playerWrap.data('fallback') + ')' ); playerWrap.append( fallbackTag ); }, /** * Check if Youtube API has been downloaded * * @since 1.9 * @access private * @method _onYoutubeApiReady * @param {Function} callback Method to call when YT API has been loaded */ _onYoutubeApiReady: function( callback ) { if ( window.YT && YT.loaded ) { callback( YT ); } else { // If not ready check again by timeout.. setTimeout( function() { FLBuilderLayout._onYoutubeApiReady( callback ); }, 350 ); } }, /** * Initializes Vimeo video background * * @since 1.9 * @access private * @method _initVimeoBgVideo */ _initVimeoBgVideo: function() { var playerWrap = $(this), videoId = playerWrap.data('video-id'), videoHash = playerWrap.data('video-hash'), videoPlayer = playerWrap.find('.fl-bg-video-player'), enableAudio = playerWrap.data('enable-audio'), audioButton = playerWrap.find('.fl-bg-video-audio'), playPauseButton = playerWrap.find('.fl-bg-video-play-pause-control'), playerState = '', player, width = playerWrap.outerWidth(), ua = navigator.userAgent; if ( typeof Vimeo !== 'undefined' && videoId ) { const vimOptions = { loop : true, title : false, portrait : false, background : true, autopause : false, muted : true, }; if ( videoHash.length ) { vimOptions.url = `https://player.vimeo.com/video/${ videoId }?h=${ videoHash }`; } else { vimOptions.id = videoId; } player = new Vimeo.Player(videoPlayer[0], vimOptions ); playerWrap.data('VMPlayer', player); if ( "no" === enableAudio ) { player.setVolume(0); } else if ("yes" === enableAudio ) { // Chrome, Safari, Firefox have audio policy restrictions for autoplay videos. if ( ua.indexOf("Safari") > -1 || ua.indexOf("Chrome") > -1 || ua.indexOf("Firefox") > -1 ) { player.setVolume(0); audioButton.show(); } else { player.setVolume(1); } } player.play().catch(function(error) { FLBuilderLayout._onErrorYoutubeVimeo(playerWrap) }); if ( audioButton.length > 0 ) { audioButton.on( 'click', {button: audioButton, player: player}, FLBuilderLayout._toggleBgVideoAudio ); } player.on( 'play', function() { playerState = 'play'; playPauseButton.removeClass( 'fa-play' ).addClass( 'fa-pause' ); } ); player.on( 'pause', function() { playerState = 'pause'; playPauseButton.removeClass( 'fa-pause' ).addClass( 'fa-play' ); } ); player.on( 'ended', function() { playerState = 'ended'; playPauseButton.removeClass( 'fa-pause' ).addClass( 'fa-play' ); } ); player.on( 'bufferstart', function() { playerState = 'bufferstart'; playPauseButton.removeClass( 'fa-play' ).addClass( 'fa-pause' ); } ); if ( playPauseButton.length > 0 ) { playPauseButton.on( 'click', { player: player }, function( e ) { var player = e.data.player; if ( playerState === 'play' ) { player.pause(); } else { player.play(); } } ); } } }, /** * Mute / unmute audio on row's video background. * It works for both Youtube and Vimeo. * * @since 2.1.3 * @access private * @method _toggleBgVideoAudio * @param {Object} e Method arguments */ _toggleBgVideoAudio: function( e ) { var player = e.data.player, control = e.data.button.find('.fl-audio-control'); if ( control.hasClass( 'fa-volume-off' ) ) { // Unmute control .removeClass( 'fa-volume-off' ) .addClass( 'fa-volume-up' ); e.data.button.find( '.fa-times' ).hide(); if ( 'function' === typeof player.unMute ) { player.unMute(); } else { player.setVolume( 1 ); } } else { // Mute control .removeClass( 'fa-volume-up' ) .addClass( 'fa-volume-off' ); e.data.button.find( '.fa-times' ).show(); if ( 'function' === typeof player.unMute ) { player.mute(); } else { player.setVolume( 0 ); } } }, /** * Fires when there is an error loading a video * background source and shows the fallback. * * @since 1.6.3.3 * @access private * @method _videoBgSourceError * @param {Object} e An event object * @deprecated 2.0.3 */ _videoBgSourceError: function( e ) { var source = $( e.target ), wrap = source.closest( '.fl-bg-video' ), vid = wrap.find( 'video' ), fallback = wrap.data( 'fallback' ), fallbackTag = ''; source.remove(); if ( vid.find( 'source' ).length ) { // Don't show the fallback if we still have other sources to check. return; } else if ( '' !== fallback ) { fallbackTag = $( '
' ); fallbackTag.addClass( 'fl-bg-video-fallback' ); fallbackTag.css( 'background-image', 'url(' + fallback + ')' ); wrap.append( fallbackTag ); vid.remove(); } }, /** * Fires when the window is resized to resize * all video backgrounds. * * @since 1.1.4 * @access private * @method _resizeBgVideos */ _resizeBgVideos: function() { $('.fl-bg-video').each( function() { FLBuilderLayout._resizeBgVideo.apply( this ); if ( $( this ).parent().find( 'img' ).length > 0 ) { $( this ).parent().imagesLoaded( $.proxy( FLBuilderLayout._resizeBgVideo, this ) ); } } ); }, /** * Fires when the window is resized to resize * a single video background. * * @since 1.1.4 * @access private * @method _resizeBgVideo */ _resizeBgVideo: function() { if ( 0 === $( this ).find( 'video' ).length && 0 === $( this ).find( 'iframe' ).length ) { return; } var wrap = $(this), wrapHeight = wrap.outerHeight(), wrapWidth = wrap.outerWidth(), vid = wrap.find('video'), vidHeight = wrap.data('height'), vidWidth = wrap.data('width'), newWidth = wrapWidth, newHeight = Math.round(vidHeight * wrapWidth/vidWidth), newLeft = 0, newTop = 0, iframe = wrap.find('iframe'), isRowFullHeight = $(this).closest('.fl-row-bg-video').hasClass('fl-row-full-height'), vidCSS = { top: '50%', left: '50%', transform: 'translate(-50%,-50%)', }; if ( vid.length ) { if(vidHeight === '' || typeof vidHeight === 'undefined' || vidWidth === '' || typeof vidWidth === 'undefined') { vid.css({ 'left' : '0px', 'top' : '0px', 'width' : newWidth + 'px' }); // Try to set the actual video dimension on 'loadedmetadata' when using URL as video source vid.on('loadedmetadata', FLBuilderLayout._resizeOnLoadedMeta); return; } if ( ! isRowFullHeight ) { if ( newHeight < wrapHeight ) { newHeight = wrapHeight; newLeft = -((newWidth - wrapWidth) / 2); newWidth = vidHeight ? Math.round(vidWidth * wrapHeight/vidHeight) : newWidth; } else { newTop = -((newHeight - wrapHeight)/2); } vidCSS = { left : newLeft + 'px', top : newTop + 'px', height : newHeight + 'px', width : newWidth + 'px', } } vid.css( vidCSS ); } else if ( iframe.length ) { // Resize Youtube video player within iframe tag if ( typeof wrap.data('youtube') !== 'undefined' ) { FLBuilderLayout._resizeYoutubeBgVideo.apply(this); } } }, /** * Fires when video meta has been loaded. * This will be Triggered when width/height attributes were not specified during video background resizing. * * @since 1.8.5 * @access private * @method _resizeOnLoadedMeta */ _resizeOnLoadedMeta: function(){ var video = $(this), wrapHeight = video.parent().outerHeight(), wrapWidth = video.parent().outerWidth(), vidWidth = video[0].videoWidth, vidHeight = video[0].videoHeight, newHeight = Math.round(vidHeight * wrapWidth/vidWidth), newWidth = wrapWidth, newLeft = 0, newTop = 0; if(newHeight < wrapHeight) { newHeight = wrapHeight; newWidth = Math.round(vidWidth * wrapHeight/vidHeight); newLeft = -((newWidth - wrapWidth)/2); } else { newTop = -((newHeight - wrapHeight)/2); } video.parent().data('width', vidWidth); video.parent().data('height', vidHeight); video.css({ 'left' : newLeft + 'px', 'top' : newTop + 'px', 'width' : newWidth + 'px', 'height' : newHeight + 'px' }); }, /** * Fires when the window is resized to resize * a single Youtube video background. * * @since 1.9 * @access private * @method _resizeYoutubeBgVideo */ _resizeYoutubeBgVideo: function() { var wrap = $(this), wrapWidth = wrap.outerWidth(), wrapHeight = wrap.outerHeight(), player = wrap.data('YTPlayer'), video = player ? player.getIframe() : null, aspectRatioSetting = '16:9', // Medium aspectRatioArray = aspectRatioSetting.split( ':' ), aspectRatio = aspectRatioArray[0] / aspectRatioArray[1], ratioWidth = wrapWidth / aspectRatio, ratioHeight = wrapHeight * aspectRatio, isWidthFixed = wrapWidth / wrapHeight > aspectRatio, width = isWidthFixed ? wrapWidth : ratioHeight, height = isWidthFixed ? ratioWidth : wrapHeight; if ( video ) { $(video).width( width ).height( height ); } }, /** * Opens a tab or accordion item if the browser hash is set * to the ID of one on the page. * * @since 1.6.0 * @access private * @method _initHash */ _initHash: function() { var hash = window.location.hash.replace( '#', '' ).split( '/' ).shift(), element = null, tabs = null, responsiveLabel = null, tabIndex = null, label = null; if ( '' !== hash ) { try { element = $( '#' + hash ); if ( element.length > 0 ) { if ( element.hasClass( 'fl-accordion-item' ) ) { setTimeout( function() { element.find( '.fl-accordion-button' ).trigger( 'click' ); }, 100 ); } if ( element.hasClass( 'fl-tabs-panel' ) ) { setTimeout( function() { tabs = element.closest( '.fl-tabs' ); responsiveLabel = element.find( '.fl-tabs-panel-label' ); tabIndex = responsiveLabel.data( 'index' ); label = tabs.find( '.fl-tabs-labels .fl-tabs-label[data-index=' + tabIndex + ']' ); label[0].click(); FLBuilderLayout._scrollToElement(element); }, 100 ); } } } catch( e ) {} } }, /** * Initializes all anchor links on the page for smooth scrolling. * * @since 1.4.9 * @access private * @method _initAnchorLinks */ _initAnchorLinks: function() { $( 'a' ).each( FLBuilderLayout._initAnchorLink ); }, /** * Initializes a single anchor link for smooth scrolling. * * @since 1.4.9 * @access private * @method _initAnchorLink */ _initAnchorLink: function() { var link = $( this ), href = link.attr( 'href' ), loc = window.location, id = null, element = null, flNode = false; if ( 'undefined' != typeof href && href.indexOf( '#' ) > -1 && link.closest('svg').length < 1 ) { if ( loc.pathname.replace( /^\//, '' ) == this.pathname.replace( /^\//, '' ) && loc.hostname == this.hostname ) { try { id = href.split( '#' ).pop(); // If there is no ID then we have nowhere to look // Fixes a quirk in jQuery and FireFox if( ! id ) { return; } element = $( '#' + id ); if ( element.length > 0 ) { flNode = element.hasClass( 'fl-row' ) || element.hasClass( 'fl-col' ) || element.hasClass( 'fl-module' ); if ( !element.hasClass( 'fl-no-scroll' ) && ( link.hasClass( 'fl-scroll-link' ) || flNode ) ) { $( link ).on( 'click', FLBuilderLayout._scrollToElementOnLinkClick ); } if ( element.hasClass( 'fl-accordion-item' ) ) { $( link ).on( 'click', FLBuilderLayout._scrollToAccordionOnLinkClick ); } if ( element.hasClass( 'fl-tabs-panel' ) ) { $( link ).on( 'click', FLBuilderLayout._scrollToTabOnLinkClick ); } } } catch( e ) {} } } }, /** * Scrolls to an element when an anchor link is clicked. * * @since 1.4.9 * @access private * @method _scrollToElementOnLinkClick * @param {Object} e An event object. * @param {Function} callback A function to call when the scroll is complete. */ _scrollToElementOnLinkClick: function( e, callback ) { var element = $( '#' + $( this ).attr( 'href' ).split( '#' ).pop() ); FLBuilderLayout._scrollToElement( element, callback ); e.preventDefault(); }, /** * Scrolls to an element. * * @since 1.6.4.5 * @access private * @method _scrollToElement * @param {Object} element The element to scroll to. * @param {Function} callback A function to call when the scroll is complete. */ _scrollToElement: function( element, callback ) { var config = FLBuilderLayoutConfig.anchorLinkAnimations, dest = 0, win = $( window ), doc = $( document ); if ( element.length > 0 ) { if ( 'fixed' === element.css('position') || 'fixed' === element.parent().css('position') ) { dest = element.position().top; } else if ( element.offset().top > doc.height() - win.height() ) { dest = doc.height() - win.height(); } else { dest = element.offset().top - config.offset; } $( 'html, body' ).stop( true ).animate( { scrollTop: dest }, config.duration, config.easing, function() { if ( 'undefined' != typeof callback ) { callback(); } if ( undefined != element.attr( 'id' ) && window.location.hash !== '#' + element.attr( 'id' ) ) { var firefox_version = window.navigator.userAgent.match( /Firefox\/(\d+)\./ ), firefox_version = firefox_version ? parseInt( firefox_version[1], 10 ) : null; if ( firefox_version !== null && firefox_version < 135 ) { window.location.hash = element.attr( 'id' ); } else { if ( history.pushState ) { history.pushState( null, null, '#' + element.attr( 'id' ) ); } else { window.location.hash = element.attr( 'id' ); } } } } ); } }, /** * Scrolls to an accordion item when a link is clicked. * * @since 1.5.9 * @access private * @method _scrollToAccordionOnLinkClick * @param {Object} e An event object. */ _scrollToAccordionOnLinkClick: function( e ) { var element = $( '#' + $( this ).attr( 'href' ).split( '#' ).pop() ); if ( element.length > 0 ) { var callback = function() { if ( element ) { element.find( '.fl-accordion-button' ).trigger( 'click' ); element = false; } }; FLBuilderLayout._scrollToElementOnLinkClick.call( this, e, callback ); } }, /** * Scrolls to a tab panel when a link is clicked. * * @since 1.5.9 * @access private * @method _scrollToTabOnLinkClick * @param {Object} e An event object. */ _scrollToTabOnLinkClick: function( e ) { var element = $( '#' + $( this ).attr( 'href' ).split( '#' ).pop() ), tabs = null, label = null, responsiveLabel = null; if ( element.length > 0 ) { tabs = element.closest( '.fl-tabs' ); responsiveLabel = element.find( '.fl-tabs-panel-label' ); tabIndex = responsiveLabel.data( 'index' ); label = tabs.find( '.fl-tabs-labels .fl-tabs-label[data-index=' + tabIndex + ']' ); if ( responsiveLabel.is( ':visible' ) ) { var callback = function() { if ( element ) { responsiveLabel.trigger( $.Event( 'click', { which: 1 } ) ); } }; FLBuilderLayout._scrollToElementOnLinkClick.call( this, e, callback ); } else { label[0].click(); FLBuilderLayout._scrollToElement( element ); } e.preventDefault(); } }, /** * Initializes all builder forms on a page. * * @since 1.5.4 * @access private * @method _initForms */ _initForms: function() { if ( ! FLBuilderLayout._hasPlaceholderSupport ) { $( '.fl-form-field input' ).each( FLBuilderLayout._initFormFieldPlaceholderFallback ); } $( '.fl-form-field input' ).on( 'focus', FLBuilderLayout._clearFormFieldError ); }, /** * Checks to see if the current device has HTML5 * placeholder support. * * @since 1.5.4 * @access private * @method _hasPlaceholderSupport * @return {Boolean} */ _hasPlaceholderSupport: function() { var input = document.createElement( 'input' ); return 'undefined' != input.placeholder; }, /** * Initializes the fallback for when placeholders aren't supported. * * @since 1.5.4 * @access private * @method _initFormFieldPlaceholderFallback */ _initFormFieldPlaceholderFallback: function() { var field = $( this ), val = field.val(), placeholder = field.attr( 'placeholder' ); if ( 'undefined' != placeholder && '' === val ) { field.val( placeholder ); field.on( 'focus', FLBuilderLayout._hideFormFieldPlaceholderFallback ); field.on( 'blur', FLBuilderLayout._showFormFieldPlaceholderFallback ); } }, /** * Hides a fallback placeholder on focus. * * @since 1.5.4 * @access private * @method _hideFormFieldPlaceholderFallback */ _hideFormFieldPlaceholderFallback: function() { var field = $( this ), val = field.val(), placeholder = field.attr( 'placeholder' ); if ( val == placeholder ) { field.val( '' ); } }, /** * Shows a fallback placeholder on blur. * * @since 1.5.4 * @access private * @method _showFormFieldPlaceholderFallback */ _showFormFieldPlaceholderFallback: function() { var field = $( this ), val = field.val(), placeholder = field.attr( 'placeholder' ); if ( '' === val ) { field.val( placeholder ); } }, /** * Clears a form field error message. * * @since 1.5.4 * @access private * @method _clearFormFieldError */ _clearFormFieldError: function() { var field = $( this ); field.removeAttr( 'aria-invalid' ); field.removeClass( 'fl-form-error' ); const message = field.attr('aria-describedby'); message ? $( '#' + message ).hide() : field.siblings( '.fl-form-error-message' ).hide(); }, /** * Init Row Shape Layer's height. * * @since 2.5.3 * @access private * @method _initRowShapeLayerHeight */ _initRowShapeLayerHeight: function () { FLBuilderLayout._adjustRowShapeLayerHeight(); $( window ).on( 'resize', FLBuilderLayout._adjustRowShapeLayerHeight ); }, /** * Set parent column width of nested columns when it's zero or blank. * * @since 2.7.4 * @access private * @method _initNestedColsWidth */ _initNestedColsWidth: function() { var nestedCols = $( '.fl-col-has-cols' ); if ( nestedCols.length <= 0 ) { return; } $( nestedCols ).each( function(index, col ){ if ( $( col ).width() <= 0 ) { $( col ).css( 'width', FLBuilderLayoutConfig.emptyColWidth ); } }); }, /** * Adjust Row Shape Layer's height to fix to remove the fine line that appears on certain screen sizes. * * @since 2.5.3 * @access private * @method _adjustRowShapeLayerHeight */ _adjustRowShapeLayerHeight: function() { var rowShapeLayers = $('.fl-builder-shape-layer'); $( rowShapeLayers ).each(function (index) { var rowShapeLayer = $(this), shape = $(rowShapeLayer).find('svg'), height = shape.height(), excludeShapes = '.fl-builder-shape-circle, .fl-builder-shape-dot-cluster, .fl-builder-shape-topography, .fl-builder-shape-rect'; if ( ! rowShapeLayer.is( excludeShapes ) ) { $(shape).css('height', Math.ceil( height ) ); } }); }, _string_to_slug: function( str ) { str = str.replace(/^\s+|\s+$/g, ''); // trim if ( 'undefined' == typeof window._fl_string_to_slug_regex ) { regex = new RegExp('[^a-zA-Z0-9\'":() !.,-_|]', 'g'); } else { regex = new RegExp('[^' + window._fl_string_to_slug_regex + '\'":\(\) !.,-_|\\\p{Letter}]', 'ug'); } str = str.replace(regex, '') // remove invalid chars .replace(/\s+/g, ' '); // collapse whitespace and replace by a space return str; }, _reorderMenu: function() { if ( $('#wp-admin-bar-fl-builder-frontend-edit-link-default li').length > 1 ) { $( '#wp-admin-bar-fl-builder-frontend-duplicate-link' ) .appendTo('#wp-admin-bar-fl-builder-frontend-edit-link-default') .css( 'padding-top', '5px' ) .css( 'border-top', '2px solid #1D2125' ) .css( 'margin-top', '5px' ) } } }; /* Initializes the builder layout. */ $(function(){ FLBuilderLayout.init(); }); })(jQuery); (function($){ if(typeof FLBuilderLayoutModules !== 'undefined') { return; } /** * Helper class with generic logic for builder modules. * If generic module code needs to work in both the block * editor and builder, it should go here. Otherwise, it * should go on FLBuilderLayout. * * @since 2.9 */ FLBuilderLayoutModules = { /** * Initializes builder module logic. * * @since 2.9 * @method init */ init: function() { // Only init if the builder isn't active. if ( 0 === $('.fl-builder-edit').length ) { // Init module animations. FLBuilderLayoutModules._initModuleAnimations(); } }, /** * Initializes module animations. * * @since 1.1.9 * @access private * @method _initModuleAnimations */ _initModuleAnimations: function() { if(typeof jQuery.fn.waypoint !== 'undefined') { $('.fl-animation').each( function() { var node = $( this ), nodeTop = node.offset().top, winHeight = $( window ).height(), bodyHeight = $( 'body' ).height(), waypoint = FLBuilderLayoutConfig.waypoint, offset = '80%'; if ( typeof waypoint.offset !== undefined ) { offset = FLBuilderLayoutConfig.waypoint.offset + '%'; } if ( bodyHeight - nodeTop < winHeight * 0.2 ) { offset = '100%'; } node.waypoint({ offset: offset, handler: FLBuilderLayoutModules._doModuleAnimation }); } ); } }, /** * Runs a module animation. * * @since 1.1.9 * @access private * @method _doModuleAnimation */ _doModuleAnimation: function() { var module = 'undefined' == typeof this.element ? $(this) : $(this.element), delay = parseFloat(module.data('animation-delay')), duration = parseFloat(module.data('animation-duration')); if ( ! isNaN( duration ) ) { module.css( 'animation-duration', duration + 's' ); } if(!isNaN(delay) && delay > 0) { setTimeout(function(){ module.addClass('fl-animated'); }, delay * 1000); } else { setTimeout(function(){ module.addClass('fl-animated'); }, 1); } } }; /* Initializes builder module logic. */ $(function(){ FLBuilderLayoutModules.init(); }); })(jQuery); /* Start Global JS */ /* End Global JS */ ;/* eslint-disable no-undef */ (function($) { /** * Class for Menu Module * * @since 1.6.1 */ FLBuilderMenu = function( settings ){ // set params this.nodeId = settings.id; this.nodeClass = '.fl-node-' + settings.id; this.wrapperClass = this.nodeClass + ' .fl-menu'; this.type = settings.type; this.mobileToggle = settings.mobile; this.mobileBelowRow = settings.mobileBelowRow; this.mobileFlyout = settings.mobileFlyout; this.breakPoints = settings.breakPoints; this.mobileBreakpoint = settings.mobileBreakpoint; this.currentBrowserWidth = $( window ).width(); this.postId = settings.postId; this.mobileStacked = settings.mobileStacked; this.submenuIcon = settings.submenuIcon; this.flyoutWidth = settings.flyoutWidth; // initialize the menu this._initMenu(); // check if viewport is resizing $( window ).on( 'resize', $.proxy( function() { var width = $( window ).width(); // if screen width is resized, reload the menu if( width != this.currentBrowserWidth ){ this.currentBrowserWidth = width; this._initMenu( true ); this._clickOrHover( true ); } this._resizeFlyoutMenuPanel(); }, this ) ); $( window ).on( 'scroll', $.proxy( function() { this._resizeFlyoutMenuPanel(); }, this ) ); // Move focus to the first menu item if the layout is set to BelowRow $( this.wrapperClass ).on( 'keydown', '.fl-menu-mobile-toggle, .menu-item:first a:first', $.proxy( function ( event ) { // Make sure it is a tab key with both the menu toggle enabled & below row layout set if ( event.key !== 'Tab' || ! this._isMenuToggle() || ! this._isMobileBelowRowEnabled() ) { return; } // Trigger focus on the mobile toggle button if the user is shift tabbing from the first menu item if ( event.shiftKey && $( event.target ).is( 'a' ) ) { event.preventDefault(); $( this.wrapperClass ).find( '.fl-menu-mobile-toggle' ).trigger( 'focus' ); } // Trigger focus on the first menu item if the user is tabbing from the mobile toggle button else if ( ! event.shiftKey && $( event.target ).hasClass( 'fl-menu-mobile-toggle' ) && $( event.target ).hasClass( 'fl-active' ) ) { event.preventDefault(); $( this.wrapperClass ).find( '.menu-item:first a:first' ).trigger( 'focus' ); } }, this ) ); // Close mobile menu or accordion when tabbing out from the first or last menu item $( this.wrapperClass ).on( 'focusout', $.proxy( function ( event ) { if ( $( this.wrapperClass + ' nav' ).has( $( event.relatedTarget ) ).length === 0 ) { if ( this.type === 'accordion' ) { this._toggleSubmenu( $( event.target ).parents( '.fl-has-submenu:last' ), false ); } else { this._clickOrHover( true ); } const mobileToggle = $( this.wrapperClass ).find( '.fl-menu-mobile-toggle' ); if ( this._isMenuToggle() && mobileToggle.hasClass( 'fl-active' ) && ! $( event.relatedTarget ).is( mobileToggle ) && 'expanded' !== this.mobileToggle ) { mobileToggle.trigger( 'click' ); } } }, this ) ); }; FLBuilderMenu.prototype = { nodeClass : '', wrapperClass: '', type : '', breakPoints : {}, $submenus : null, /** * Check if the screen size fits a mobile viewport. * * @since 1.6.1 * @return bool */ _isMobile: function(){ return this.currentBrowserWidth <= this.breakPoints.small ? true : false; }, /** * Check if the device is connected to a mouse. * * @since 2.9.0 * @return bool */ _isMouseAvailable: function(){ return window.matchMedia("(pointer: fine) and (hover: hover)").matches; }, /** * Check if the screen size fits a medium viewport. * * @since 1.10.5 * @return bool */ _isMedium: function(){ return this.currentBrowserWidth <= this.breakPoints.medium ? true : false; }, /** * Check if the screen size fits a large viewport. * * @since 1.10.5 * @return bool */ _isLarge: function(){ return this.currentBrowserWidth <= this.breakPoints.large ? true : false; }, /** * Check if the menu should toggle for the current viewport base on the selected breakpoint. * * @see this._isMobile() * @see this._isMedium() * @since 1.10.5 * @return bool */ _isMenuToggle: function(){ if ( ( 'always' == this.mobileBreakpoint || ( this._isMobile() && 'mobile' == this.mobileBreakpoint ) || ( this._isMedium() && 'medium-mobile' == this.mobileBreakpoint ) || ( this._isLarge() && 'large-mobile' == this.mobileBreakpoint ) ) && ( $( this.wrapperClass ).find( '.fl-menu-mobile-toggle' ).is(':visible') || 'expanded' == this.mobileToggle ) ) { return true; } return false; }, /** * Initialize the toggle logic for the menu. * * @see this._isMenuToggle() * @see this._menuOnCLick() * @see this._clickOrHover() * @see this._submenuOnRight() * @see this._submenuRowZindexFix() * @see this._toggleForMobile() * @since 1.6.1 * @return void */ _initMenu: function( resized = false ){ this._setupSubmenu(); if ( ! resized ) { this._menuOnFocus(); this._menuOnClick(); this._menuOnEscape(); } if ( $( this.nodeClass ).length && this.type == 'horizontal' ) { this._initMegaMenus(); } if( this._isMenuToggle() || this.type == 'accordion' ){ $( this.wrapperClass ).off( 'mouseenter mouseleave' ); this._clickOrHover(); } else { this._submenuOnRight(); this._submenuRowZindexFix(); } if( this.mobileToggle != 'expanded' ){ this._toggleForMobile(); } if( $( this.wrapperClass ).find( '.fl-menu-search-item' ).length ){ this._toggleMenuSearch(); } if( $( this.wrapperClass ).find( '.fl-menu-cart-item').length ){ this._wooUpdateParams(); } }, /** * Whether the toggle behavior for submenus is through hovering or not. * * @since 2.5 * @return void */ _setupSubmenu: function() { if ( ! this._isMouseAvailable() || this._isMenuToggle() || this.type === 'accordion' ) { $( this.wrapperClass ).addClass( 'no-hover' ); } else { $( this.wrapperClass ).removeClass( 'no-hover' ); } }, /** * Logic for menu items when focused. * * @since 1.9.0 * @return void */ _menuOnFocus: function(){ $( this.wrapperClass ).on( 'focus', 'a, .fl-menu-toggle', $.proxy( function( event ) { const focusedMenuItem = $( event.target ).closest( '.menu-item' ); const blurredMenuItem = $( event.relatedTarget ).closest( '.menu-item' ); // In case the blurred & focused items are siblings if ( focusedMenuItem.closest( 'ul' ).is( blurredMenuItem.closest( 'ul' ) ) ) { // Check if the focus event is not between the link & submenu icon of the same menu item if ( ! focusedMenuItem.is( blurredMenuItem ) ) { this._toggleSubmenu( blurredMenuItem, false ); } } // In case neither items are child & parent nor vice versa else if ( focusedMenuItem.has( blurredMenuItem ).length === blurredMenuItem.has( focusedMenuItem ).length ) { // Get the blurred item parent & is the sibling of the focused item blurredMenuItem.parents( '.fl-has-submenu' ).each( ( _, parent ) => { if ( focusedMenuItem.closest( 'ul' ).is( $( parent ).closest( 'ul' ) ) ) { this._toggleSubmenu( $( parent ), false ); return false; } } ); } // In case the blurred item is a child of the focused item else if ( focusedMenuItem.has( blurredMenuItem ).length ) { if ( this.type !== 'accordion' && this.submenuIcon === 'none' ) { this._toggleSubmenu( blurredMenuItem, false ); } } }, this ) ); }, /** * Logic for menu items when Escape key is pressed. * * @since 2.7.1 * @return void */ _menuOnEscape: function(){ $( this.wrapperClass ).on( 'keydown', $.proxy( function( event ){ if ( event.key !== 'Escape' ) return; const menuItem = $( event.target ).closest( '.menu-item' ); const mobileToggle = $( this.wrapperClass ).find( '.fl-menu-mobile-toggle' ); // In case there is a focused menu item if ( menuItem.length || $( event.target ).hasClass( 'fl-menu-mobile-close' ) ) { // Close all the submenus of the focused menu item if ( menuItem.hasClass( 'fl-has-submenu' ) && menuItem.find( '.sub-menu:first' ).is( ':visible' ) ) { this._toggleSubmenu( menuItem, false ); } else { // Shift focus to the parent while closing all its submenus const parentMenuItem = menuItem.parents( '.fl-has-submenu:not(.hide-heading):first' ); if ( parentMenuItem.length === 0 && this._isMenuToggle() && mobileToggle.hasClass( 'fl-active' ) ) { mobileToggle.trigger( 'focus' ); } else if ( parentMenuItem.length !== 0 ) { this._toggleSubmenu( parentMenuItem, false ); parentMenuItem.find( 'a:first' ).trigger( 'focus' ); } } } // Close the mobile menu if the mobile toggle is active else if ( $( event.target ).hasClass( 'fl-menu-mobile-toggle' ) && mobileToggle.hasClass( 'fl-active' ) ) { // Blur to trigger the focus-out event for closing the menu mobileToggle.trigger( 'blur' ).trigger( 'focus' ); } }, this ) ); }, /** * Logic for menu items when clicked. * * @since 1.6.1 * @return void */ _menuOnClick: function(){ // Fallback for span elements with role="button" to be clickable $( this.wrapperClass ).on( 'keydown', 'span.fl-menu-toggle', $.proxy( function( event ) { if ( event.key === 'Enter' || event.key === ' ' ) { event.preventDefault(); $( event.target ).trigger( 'click' ); } }, this ) ); $( this.wrapperClass ).on( 'click', 'a, .fl-menu-toggle', $.proxy( function( event ) { event.stopPropagation(); // Only allow mouse clicks with accordion & mobile menus if ( this._isMouseAvailable() && ! this._isMenuToggle() && event.detail && this.type !== 'accordion' ) return; // Links only open & do not toggle submenus if there is either a submenu icon or an accordion layout if ( $( event.target ).is( 'a' ) && ( this.submenuIcon !== 'none' || this.type === 'accordion' ) ) return; const menuItem = $( event.target ).closest( '.menu-item' ); const menuLink = menuItem.find( 'a:first' ).attr( 'href' ); const submenuHidden = menuItem.find( '.sub-menu:first' ).is( ':hidden' ); if ( typeof menuLink === 'undefined' || menuLink === '#' || submenuHidden ) { event.preventDefault(); } if ( $( event.target ).hasClass( 'fl-menu-toggle' ) || submenuHidden ) { this._toggleSubmenu( menuItem, submenuHidden ); } }, this ) ); }, /** * Controls toggling the visibility of all submenu items for desktop & mobile. * * @since 2.10 * @return void */ _toggleSubmenu: function ( menuItem, opened ) { const togglingClass = this._isMenuToggle() || this.type === 'accordion' ? 'fl-active' : 'focus'; const toggleElement = this.submenuIcon === 'none' ? 'a' : '.fl-menu-toggle'; if ( opened ) { menuItem.addClass( togglingClass ); menuItem.parent().find( '.fl-has-submenu:not(.hide-heading):first ' + toggleElement ).attr( 'aria-expanded', true ); if ( this._isMenuToggle() || this.type === 'accordion' ) { menuItem.find( '.sub-menu:first:hidden' ).slideDown(); } } else { menuItem.parent().find( '.menu-item' ).removeClass( togglingClass ); menuItem.parent().find( '.fl-has-submenu:not(.hide-heading) ' + toggleElement ).attr( 'aria-expanded', false ); if ( this._isMenuToggle() || this.type === 'accordion' ) { menuItem.find( '.sub-menu:visible' ).slideUp(); } } }, /** * Changes general styling and behavior of menus based on mobile / desktop viewport. * * @see this._isMenuToggle() * @since 1.6.1 * @return void */ _clickOrHover: function( clear = false ){ const selector = this._isMobileBelowRowEnabled() ? this.nodeClass + '-clone' : this.nodeClass; this.$submenus = this.$submenus || $( selector ).find( '.sub-menu' ); const className = this._isMenuToggle() || this.type === 'accordion' ? 'fl-active' : 'focus'; const toggleElement = this.submenuIcon === 'none' ? 'a' : '.fl-menu-toggle'; $( selector ).find( '.fl-has-submenu:not(.hide-heading)' ).each( function() { if( clear || ! $ ( this ).hasClass( className ) ){ if ( clear ) $( this ).removeClass( className ); $( this ).find( toggleElement + ':first' ).attr( 'aria-expanded', false ); if ( className === 'fl-active' ) { $( this ).find( '.sub-menu' ).fadeOut(); } else if ( className === 'focus' ) { $( this ).find( '.sub-menu' ).css( { 'display' : '', 'opacity' : '' } ); } } } ); }, /** * Logic to prevent submenus to go outside viewport boundaries. * * @since 1.6.1 * @return void */ _submenuOnRight: function(){ $( this.wrapperClass ) .on( 'mouseenter focus', '.fl-has-submenu', $.proxy( function( e ){ if( $ ( e.currentTarget ).find('.sub-menu').length === 0 ) { return; } var $link = $( e.currentTarget ), $parent = $link.parent(), $subMenu = $link.find( '.sub-menu' ), subMenuWidth = $subMenu.width(), subMenuPos = 0, bodyWidth = $( 'body' ).width(); if( $link.closest( '.fl-menu-submenu-right' ).length !== 0) { $link.addClass( 'fl-menu-submenu-right' ); } else if( $( 'body' ).hasClass( 'rtl' ) ) { subMenuPos = $parent.is( '.sub-menu' ) ? $parent.offset().left - subMenuWidth: $link.offset().left - $link.width() - subMenuWidth; if( subMenuPos <= 0 ) { $link.addClass( 'fl-menu-submenu-right' ); } } else { subMenuPos = $parent.is( '.sub-menu' ) ? $parent.offset().left + $parent.width() + subMenuWidth : $link.offset().left + $link.width() + subMenuWidth; if( subMenuPos > bodyWidth ) { $link.addClass('fl-menu-submenu-right'); } } }, this ) ) .on( 'mouseleave', '.fl-has-submenu', $.proxy( function( e ){ $( e.currentTarget ).removeClass( 'fl-menu-submenu-right' ); }, this ) ); }, /** * Logic to prevent submenus to go behind the next overlay row. * * @since 1.10.9 * @return void */ _submenuRowZindexFix: function(){ $( this.wrapperClass ) .on( 'mouseenter', 'ul.menu > .fl-has-submenu', $.proxy( function( e ){ if( $ ( e.currentTarget ).find('.sub-menu').length === 0 ) { return; } $( this.nodeClass ) .closest( '.fl-row' ) .find( '.fl-row-content' ) .css( 'z-index', '10' ); }, this ) ) .on( 'mouseleave', 'ul.menu > .fl-has-submenu', $.proxy( function(){ $( this.nodeClass ) .closest( '.fl-row' ) .find( '.fl-row-content' ) .css( 'z-index', '' ); }, this ) ); }, /** * Logic for the mobile menu button. * * @since 1.6.1 * @return void */ _toggleForMobile: function(){ var $wrapper = null, $menu = null, self = this; if( this._isMenuToggle() ){ if ( this._isMobileBelowRowEnabled() ) { this._placeMobileMenuBelowRow(); $wrapper = $( this.wrapperClass ); $menu = $( this.nodeClass + '-clone' ); $menu.find( 'ul.menu' ).show(); } else { $wrapper = $( this.wrapperClass ); $menu = $wrapper.find( '.menu' ); } if( !$wrapper.find( '.fl-menu-mobile-toggle' ).hasClass( 'fl-active' ) && ! self.mobileFlyout ){ $menu.css({ display: 'none' }); } // Flayout Menu if ( self.mobileFlyout ) { this._initFlyoutMenu(); } $wrapper.on( 'click', '.fl-menu-mobile-toggle', function( e ){ e.stopImmediatePropagation(); $( this ).toggleClass( 'fl-active' ); if ( self.mobileFlyout ) { self._toggleFlyoutMenu(); const flyoutWrapper = $( '.fl-menu-mobile-flyout' ); if ( $( this ).hasClass( 'fl-active' ) ) { flyoutWrapper.attr( 'aria-hidden', false ); flyoutWrapper.find( 'a[href], button, input, select, textarea, span.fl-menu-toggle, [tabindex="-1"]' ).attr( 'tabindex', 0 ); } else { flyoutWrapper.attr( 'aria-hidden', true ); flyoutWrapper.find( 'a[href], button, input, select, textarea, span.fl-menu-toggle, [tabindex]:not([tabindex="-1"])' ).attr( 'tabindex', -1 ); } } else { var targetMenu = null; if ( self.mobileBelowRow ) { var $closestCol = $( this ).parents( '.fl-col, .fl-module-box' ), $closestColGroup = $closestCol.length ? $closestCol.parent( '.fl-col-group' ) : null, targetMenu = $closestCol.length ? $closestCol.last().next( '.fl-menu-mobile-clone' ) : null; if ( $closestColGroup.length ) { if ( $closestColGroup.hasClass( 'fl-col-group-responsive-reversed' ) ) { $closestColGroup.find( '.fl-menu-mobile-clone' ).css( 'order', -1 ); } else if ( $closestColGroup ) { $closestColGroup.find( '.fl-menu-mobile-clone' ).css( 'order', 2 ); } } } else { targetMenu = $( this ).closest( '.fl-menu' ).find( 'ul.menu' ); } if ( targetMenu.length ) { $menu = $( targetMenu ); } $menu.slideToggle(); } e.stopPropagation(); } ); // Hide active menu when click on anchor link ID that exists on a page $menu.off().on( 'click', '.menu-item > a[href*="#"]:not([href="#"])', function(){ var $href = $(this).attr('href'), $targetID = $href.split('#')[1], element = $('#' + $targetID); if ( $('body').find(element).length > 0 ) { $( this ).toggleClass( 'fl-active' ); FLBuilderLayout._scrollToElement( element ); if ( ! self._isMenuToggle() ) { $menu.slideToggle(); } } }); } else { if ( this._isMobileBelowRowEnabled() ) { this._removeMenuFromBelowRow(); } $wrapper = $( this.wrapperClass ), $menu = $wrapper.find( 'ul.menu' ); $wrapper.find( '.fl-menu-mobile-toggle' ).removeClass( 'fl-active' ); $menu.css({ display: '' }); if ( ! this._isMobileBelowRowEnabled() ) { $menu.off( 'click', '.menu-item > a[href*="#"]:not([href="#"])' ); } if ( this.mobileFlyout && $wrapper.find( '.fl-menu-mobile-flyout' ).length > 0 ) { $( 'body' ).css( 'margin', '' ); $( '.fl-builder-ui-pinned-content-transform' ).css( 'transform', '' ); $menu.unwrap(); $wrapper.find( '.fl-menu-mobile-close' ).remove(); $wrapper.find( '.fl-menu-mobile-opacity' ).remove(); } } }, /** * Init any mega menus that exist. * * @see this._isMenuToggle() * @since 1.10.4 * @return void */ _initMegaMenus: function(){ var module = $( this.nodeClass ), rowContent = module.closest( '.fl-row-content' ), rowWidth = rowContent.width(), megas = module.find( '.mega-menu' ), disabled = module.find( '.mega-menu-disabled' ), isToggle = this._isMenuToggle(); if ( isToggle ) { megas.removeClass( 'mega-menu' ).addClass( 'mega-menu-disabled' ); module.find( 'li.mega-menu-disabled > ul.sub-menu' ).css( 'width', '' ); rowContent.css( 'position', '' ); } else { disabled.removeClass( 'mega-menu-disabled' ).addClass( 'mega-menu' ); module.find( 'li.mega-menu > ul.sub-menu' ).css( 'width', rowWidth + 'px' ); rowContent.css( 'position', 'relative' ); } }, /** * Check to see if Below Row should be enabled. * * @since 1.11 * @return boolean */ _isMobileBelowRowEnabled: function() { return this.mobileBelowRow && ( $( this.nodeClass ).parents( '.fl-col, .fl-module-box' ).length ); }, /** * Logic for putting the mobile menu below the menu's * column so it spans the full width of the page. * * @since 1.10 * @return void */ _placeMobileMenuBelowRow: function(){ if ( $( this.nodeClass + '-clone' ).length ) { return; } var module = $( this.nodeClass ), clone = null, col = module.parents( '.fl-col, .fl-module-box' ).last(); if ( module.length < 1 ) { return; } clone = ( module.length > 1 ) ? $( module[0] ).clone() : module.clone(); module.find( 'ul.menu' ).remove(); clone.addClass( ( this.nodeClass + '-clone' ).replace( '.', '' ) ); clone.addClass( 'fl-menu-mobile-clone' ); clone.find( '.fl-menu-mobile-toggle' ).remove(); col.after( clone ); // Removes animation when enabled if ( module.hasClass( 'fl-animation' ) ) { clone.removeClass( 'fl-animation' ); } this._menuOnFocus(); this._menuOnClick(); this._menuOnEscape(); }, /** * Logic for removing the mobile menu from below the menu's * column and putting it back in the main wrapper. * * @since 1.10 * @return void */ _removeMenuFromBelowRow: function(){ if ( ! $( this.nodeClass + '-clone' ).length ) { return; } var module = $( this.nodeClass ), clone = $( this.nodeClass + '-clone' ), menu = clone.find( 'ul.menu' ); module.find( '.fl-menu-mobile-toggle' ).after( menu ); clone.remove(); menu.find( 'a' ).each( FLBuilderLayout._initAnchorLink ); }, /** * Logic for Flyout responsive menu. * * @since 2.2 * @return void */ _initFlyoutMenu: function(){ var wrapper = $( this.wrapperClass ), menu = wrapper.find( 'ul.menu' ), button = wrapper.find( '.fl-menu-mobile-toggle' ); if ( 0 === wrapper.find( '.fl-menu-mobile-flyout' ).length ) { menu.wrap( '' ); } if ( 0 === wrapper.find( '.fl-menu-mobile-close' ).length ) { var close = window.fl_responsive_close || 'Close' wrapper.find( '.fl-menu-mobile-flyout' ).prepend( '' ); } // Push with opacity if ( wrapper.hasClass( 'fl-menu-responsive-flyout-push-opacity' ) && 0 === wrapper.find( '.fl-menu-mobile-opacity' ).length ) { wrapper.append( '
' ); } wrapper.off( 'click', '.fl-menu-mobile-opacity, .fl-menu-mobile-close' ).on( 'click', '.fl-menu-mobile-opacity, .fl-menu-mobile-close', function(e){ button.trigger('focus').trigger( 'click' ); e.stopPropagation(); }); if ( 'undefined' !== typeof FLBuilder ) { FLBuilder.addHook('restartEditingSession', function(){ $( '.fl-builder-ui-pinned-content-transform' ).css( 'transform', '' ); // Toggle active menu if ( button.hasClass( 'fl-active' ) ) { button.trigger( 'click' ); } }); } $( '.fl-menu-mobile-flyout' ).find( 'a[href], button, input, select, textarea, span.fl-menu-toggle, [tabindex]:not([tabindex="-1"])' ).attr( 'tabindex', -1 ); }, /** * Logic to enable/disable the Flyout menu on button click. * * @since 2.2 * @return void */ _toggleFlyoutMenu: function(){ var wrapper = $( this.wrapperClass ), button = wrapper.find( '.fl-menu-mobile-toggle' ), position = wrapper.hasClass( 'fl-flyout-right' ) ? 'right' : 'left', pushMenu = wrapper.hasClass( 'fl-menu-responsive-flyout-push' ) || wrapper.hasClass( 'fl-menu-responsive-flyout-push-opacity' ), opacity = wrapper.find( '.fl-menu-mobile-opacity' ), marginPos = {}, fixedPos = {}, fixedHeader = $('header, header > div'); this._resizeFlyoutMenuPanel(); // Fix the push menu when builder ui panel is pinned if ( $( '.fl-builder-ui-pinned-content-transform' ).length > 0 && ! $( 'body' ).hasClass( 'fl-builder-edit' ) ) { $( '.fl-builder-ui-pinned-content-transform' ).css( 'transform', 'none' ); } if ( pushMenu ) { marginPos[ 'margin-' + position ] = button.hasClass( 'fl-active' ) ? this.flyoutWidth + 'px' : '0px'; $( 'body' ).animate( marginPos, 200); // Fixed header if ( fixedHeader.length > 0 ) { fixedPos[ position] = button.hasClass( 'fl-active' ) ? this.flyoutWidth + 'px' : '0px'; fixedHeader.each(function(){ if ( 'fixed' == $( this ).css( 'position' ) ) { $( this ).css({ 'transition' : 'none' }); $( this ).animate( fixedPos, 200 ); } }); } } if ( opacity.length > 0 && button.hasClass( 'fl-active' ) ) { opacity.show(); } else { opacity.hide(); } }, /** * Resize or reposition the Flyout Menu Panel. * * @since 2.8.1 * @return void */ _resizeFlyoutMenuPanel: function(){ const wrapper = $( this.wrapperClass ); const wrapFlyout = wrapper.find( '.fl-menu-mobile-flyout' ); if ( wrapFlyout.length > 0 ) { wrapFlyout.css( this._getFlyoutMenuPanelPosition() ); } }, /** * Compute the Flyout Menu Panel's position on the screen. * * @since 2.8.1 * @return object */ _getFlyoutMenuPanelPosition: function() { var wrapper = $( this.wrapperClass ), button = wrapper.find( '.fl-menu-mobile-toggle' ), side = wrapper.hasClass( 'fl-flyout-right' ) ? 'right' : 'left', winHeight = $(window).outerHeight(), winTop = $(window).scrollTop(), adminBarHeight = $( '#wpadminbar' ).length ? $( '#wpadminbar' ).height() : 0, flyoutPosition = {}; flyoutPosition[ side ] = '-' + ( parseInt( this.flyoutWidth ) + 15 ) + 'px'; if ( ! button.hasClass( 'fl-active' ) ) { return flyoutPosition; } flyoutPosition[ side ] = '0px'; flyoutPosition[ 'height' ] = winHeight + 'px'; flyoutPosition[ 'top' ] = '0px'; if ( adminBarHeight > 0 ) { const diff = adminBarHeight - winTop; flyoutPosition[ 'top' ] = diff <= 0 ? '0px' : (diff) + 'px'; } return flyoutPosition; }, /** * Shows or hides the nav search form. * * @since 2.5 * @method _toggleMenuSearch */ _toggleMenuSearch: function(){ var wrapper = $( this.wrapperClass ).find('.fl-menu-search-item'), button = wrapper.find('.fl-button:is(a, button)'), form = wrapper.find('.fl-search-form-input-wrap'), self = this; button.attr( 'tabindex', 0 ); button.attr( 'aria-label', 'Search' ); button.on('click', function(e){ e.preventDefault(); if(form.is(':visible')) { form.stop().fadeOut(200); } else { form.stop().fadeIn(200); $('body').on('click.fl-menu-search', $.proxy(self._hideMenuSearch, self)); form.find('.fl-search-text').focus(); } }); }, /** * Hides the nav search form. * * @since 2.5 * @method _hideMenuSearch */ _hideMenuSearch: function(e){ var form = $( this.wrapperClass ).find('.fl-search-form-input-wrap'); if(e !== undefined) { if($(e.target).closest('.fl-menu-search-item').length > 0) { return; } } form.stop().fadeOut(200); $('body').off('click.fl-menu-search'); }, /** * Adds menu node and post ID to WooCommerce ajax URL requests. * * @since 2.5 * @return void */ _wooUpdateParams: function() { if ( 'undefined' !== typeof wc_cart_fragments_params ) { wc_cart_fragments_params.wc_ajax_url += '&fl-menu-node='+ this.nodeId +'&post-id='+ this.postId; } if ( 'undefined' !== typeof wc_add_to_cart_params ) { wc_add_to_cart_params.wc_ajax_url += '&fl-menu-node='+ this.nodeId +'&post-id='+ this.postId; } }, }; })(jQuery); (function($) { $(function() { new FLBuilderMenu({ id: 'kpunb3wt1frc', type: 'horizontal', mobile: 'hamburger', mobileBelowRow: false, mobileFlyout: false, breakPoints: { large: 1920, medium: 1440, small: 900 }, mobileBreakpoint: 'mobile', postId : '11439', mobileStacked: true, submenuIcon: 'arrows', flyoutWidth: '250', }); }); })(jQuery); ;(function($) { FLBuilderSearchForm = function(settings) { this.settings = settings; this.nodeClass = '.fl-node-' + settings.id; this.searchForm = $(this.nodeClass + ' .fl-search-form'); this.form = this.searchForm.find('form'); this.input = this.form.find('input[type=search]'); this.button = this.searchForm.find('.fl-button:is(a, button), .fl-button:is(a, button) *'); this.resultsEl = $(this.nodeClass + ' .fl-search-results-content'); this._init(); }; FLBuilderSearchForm.prototype = { settings: {}, nodeClass: '', searchForm: '', form: null, input: null, button: null, resultsEl: '', searching: false, prevSearchData: {}, request: null, _init: function() { this._bindEvents(); this._popupSearch(); }, _bindEvents: function(){ var $this = this, keyCode = null, keyType = null, enterPressed = false, t, et; this.button.on('click', $.proxy(this._buttonClick, this)); if ( 'ajax' == this.settings.result ) { $(document).on('click touchend', function(e){ if( $(e.target).is('input') ) return; $this._hideResults(); } ); $this.resultsEl.bind("click touchend", function (e) { e.stopImmediatePropagation(); }); // Disable form submit. $this.form.on( 'submit', function (e) { e.preventDefault(); }); this.input.on('keyup', function(e) { if (window.event) { keyCode = window.event.keyCode; keyType = window.event.type; } else if (e) { keyCode = e.which; keyType = e.type; } // Prevent rapid enter if ( 13 == keyCode ) { clearTimeout(et); et = setTimeout(function(){ enterPressed = false; }, 300); if ( enterPressed ) { return false; } else { enterPressed = true; } } if ( $this.input.val().length >= 3 && 'keyup' == keyType && 13 == keyCode ) { $this._search(e); return false; } }); this.input.on('click input', function(e) { if (window.event) { keyCode = window.event.keyCode; keyType = window.event.type; } else if (e) { keyCode = e.which; keyType = e.type; } // F1 to F12 if ( (keyCode >= 37 && keyCode <= 40) || (keyCode >= 112 && keyCode <= 123) ) { return; } if ($this.input.val().length < 3) { $this._hideLoader(); $this._hideResults(); if ($this.post != null) $this.post.abort(); clearTimeout(t); return; } if ( 'click' == keyType || keyCode == 32 ) { if ( $this.resultsEl.html().length != 0 ) { clearTimeout(t); if( $this.resultsEl.hasClass('fl-search-open') ) return; $this._showResults(); } else { $this._hideResults(); } return; } if ($this.request != null) $this.request.abort(); $this._hideLoader(); clearTimeout(t); t = setTimeout(function() { $this._search(e); }, 100); }); } }, _search: function(e) { e.preventDefault(); if ($.trim(this.input.val()).length < 1) { return; } if ( 'ajax' == this.settings.result ) { this._doAjaxSearch(); } else { this.form.submit(); // TODO: _doRedirectResults() } return false; }, _doAjaxSearch: function() { var searchText = this.input.val(), postId = this.searchForm.closest( '.fl-builder-content' ).data( 'post-id' ), templateId = this.searchForm.data( 'template-id' ), templateNodeId = this.searchForm.data( 'template-node-id' ), ajaxData = {}, self = this; if ( this.searching && 0 ) return; if ( searchText.length < 1 ) return; this.searching = true; // Show loader this._showLoader(); ajaxData = { action : 'fl_search_query', keyword : searchText, post_id : postId, template_id : templateId, template_node_id : templateNodeId, node_id : this.settings.id, } // Check to see if searching the same keywords. if ( JSON.stringify(ajaxData) === JSON.stringify(this.prevSearchData) ) { if ( ! this.resultsEl.hasClass('fl-search-open') ) { this._showResults(); } this._hideLoader(); return false; } // Send server request. this.request = $.post( FLBuilderLayoutConfig.paths.wpAjaxUrl, ajaxData, function(response){ self._hideLoader(); self.resultsEl.html(""); self.resultsEl.html(response); self._showResults(); self.prevSearchData = ajaxData; }); }, _popupSearch: function() { var inputWrap = this.searchForm.find('.fl-search-form-input-wrap'), $this = this; if ('button' != this.settings.layout || 'fullscreen' != this.settings.btnAction) { return; } this.button.off('click'); this.button.magnificPopup({ type: 'inline', mainClass: 'fl-node-' + this.settings.id, items: { src: inputWrap[0], }, alignTop: true, showCloseBtn: $this.settings.showCloseBtn, closeBtnInside: false, enableEscapeKey: true, closeOnBgClick: false, focus: 'input[type=search]', tLoading: '', callbacks: { open: function(){ $this.input.trigger('click'); } } }); this.resultsEl.appendTo( inputWrap ); }, _buttonClick: function(e) { e.stopImmediatePropagation(); if (this.searchForm.hasClass('fl-search-button-expand')) { this.searchForm.find('.fl-search-form-wrap').toggleClass('fl-search-expanded'); if (this.searchForm.find('.fl-search-form-wrap').hasClass('fl-search-expanded')) { this.input.focus(); } else { this._hideResults(); } return false; } else { this._search(e); } }, _showResults: function(){ // Close any search results in a page. this._hideResults(); this.resultsEl.addClass('fl-search-open'); if ('button' == this.settings.layout && 'expand' == this.settings.btnAction) { this.searchForm.find('.fl-search-form-input-wrap').css('overflow', 'visible'); } }, _hideResults: function(){ $('.fl-search-results-content').removeClass('fl-search-open'); if ('button' == this.settings.layout && 'expand' == this.settings.btnAction) { this.searchForm.find('.fl-search-form-input-wrap').removeAttr('style'); } }, _doRedirectResults: function(){ // TODO }, _showLoader: function(){ $(this.nodeClass + ' .fl-search-loader-wrap').show(); }, _hideLoader: function(){ this.searching = false; $(this.nodeClass + ' .fl-search-loader-wrap').hide(); }, _cleanInput: function(s) { return encodeURIComponent(s).replace(/\%20/g, '+'); } } })(jQuery); (function($) { $(function() { new FLBuilderSearchForm({ id: '32u6bdlxsyn8', layout: 'input', btnAction: 'expand', result: 'ajax', showCloseBtn: true, }); }); })(jQuery); jQuery(function($) { $(function() { $( '.fl-node-bv51oxmqyi2u .fl-photo-img' ) .on( 'mouseenter', function( e ) { $( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' ); } ) .on( 'mouseleave', function( e ){ $( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null ); } ); }); window._fl_string_to_slug_regex = 'a-zA-Z0-9'; }); jQuery(function($) { $(function() { $( '.fl-node-fodvuhywxltq .fl-photo-img' ) .on( 'mouseenter', function( e ) { $( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' ); } ) .on( 'mouseleave', function( e ){ $( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null ); } ); }); window._fl_string_to_slug_regex = 'a-zA-Z0-9'; }); (function($) { $(function() { new FLBuilderMenu({ id: 'wsl48cjarz9h', type: 'horizontal', mobile: 'hamburger', mobileBelowRow: false, mobileFlyout: false, breakPoints: { large: 1920, medium: 1440, small: 900 }, mobileBreakpoint: 'mobile', postId : '11439', mobileStacked: true, submenuIcon: 'none', flyoutWidth: '250', }); }); })(jQuery); jQuery(function($) { $(function() { $( '.fl-node-hei513ylx8va .fl-photo-img' ) .on( 'mouseenter', function( e ) { $( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' ); } ) .on( 'mouseleave', function( e ){ $( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null ); } ); }); window._fl_string_to_slug_regex = 'a-zA-Z0-9'; }); jQuery(function($) { $(function() { $( '.fl-node-f5txbkj2s84r .fl-photo-img' ) .on( 'mouseenter', function( e ) { $( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' ); } ) .on( 'mouseleave', function( e ){ $( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null ); } ); }); window._fl_string_to_slug_regex = 'a-zA-Z0-9'; }); jQuery(function($) { $(function() { $( '.fl-node-wkgq69sarmuv .fl-photo-img' ) .on( 'mouseenter', function( e ) { $( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' ); } ) .on( 'mouseleave', function( e ){ $( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null ); } ); }); window._fl_string_to_slug_regex = 'a-zA-Z0-9'; }); jQuery(function($) { $(function() { $( '.fl-node-9m47yevq2cno .fl-photo-img' ) .on( 'mouseenter', function( e ) { $( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' ); } ) .on( 'mouseleave', function( e ){ $( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null ); } ); }); window._fl_string_to_slug_regex = 'a-zA-Z0-9'; }); jQuery(function($) { $(function() { $( '.fl-node-6jgtus2w3xzh .fl-photo-img' ) .on( 'mouseenter', function( e ) { $( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' ); } ) .on( 'mouseleave', function( e ){ $( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null ); } ); }); window._fl_string_to_slug_regex = 'a-zA-Z0-9'; }); jQuery(function($) { $(function() { $( '.fl-node-u9gle270ra8n .fl-photo-img' ) .on( 'mouseenter', function( e ) { $( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' ); } ) .on( 'mouseleave', function( e ){ $( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null ); } ); }); window._fl_string_to_slug_regex = 'a-zA-Z0-9'; }); jQuery(function($) { $(function() { $( '.fl-node-g6zmljnovtuc .fl-photo-img' ) .on( 'mouseenter', function( e ) { $( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' ); } ) .on( 'mouseleave', function( e ){ $( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null ); } ); }); window._fl_string_to_slug_regex = 'a-zA-Z0-9'; }); (function($){ })(jQuery); (function($){ })(jQuery); jQuery(function($) { $(function() { $( '.fl-node-rexi3p0oya81 .fl-photo-img' ) .on( 'mouseenter', function( e ) { $( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' ); } ) .on( 'mouseleave', function( e ){ $( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null ); } ); }); window._fl_string_to_slug_regex = 'a-zA-Z0-9'; }); jQuery(function($) { $(function() { $( '.fl-node-th24rlpi0uma .fl-photo-img' ) .on( 'mouseenter', function( e ) { $( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' ); } ) .on( 'mouseleave', function( e ){ $( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null ); } ); }); window._fl_string_to_slug_regex = 'a-zA-Z0-9'; }); jQuery(function($) { $(function() { $( '.fl-node-zfxesd0cutwn .fl-photo-img' ) .on( 'mouseenter', function( e ) { $( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' ); } ) .on( 'mouseleave', function( e ){ $( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null ); } ); }); window._fl_string_to_slug_regex = 'a-zA-Z0-9'; }); jQuery(function($) { $(function() { $( '.fl-node-6m3ubyg0rced .fl-photo-img' ) .on( 'mouseenter', function( e ) { $( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' ); } ) .on( 'mouseleave', function( e ){ $( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null ); } ); }); window._fl_string_to_slug_regex = 'a-zA-Z0-9'; }); /* Start Global Node Custom JS */ /* End Global Node Custom JS */ /* Start Layout Custom JS */ /* End Layout Custom JS */