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 */