| | | 版权 © 1994-2024 Aerotech China. 版权所有。
"../../wp-content/plugins/bb-plugin/js/jquery.magnificpopup.js"/related-product-slider.js" id="related-products-js""../../wp-content/plugins/bb-plugin/js/jquery.fitvids.min.js"/bowser
* MIT License | (c) Dustin Diaz 2015
*/
!function (name, definition) {
if (typeof module != 'undefined' && module.exports) module.exports = definition()
else if (typeof define == 'function' && d"../../wp-content/themes/bb-theme/js/theme.js"on()
}('bowser', function () {
/**
* S"../../wp-content/themes/beaverwarrior-backup/build/headerNav.js"tion detect(ua) {
function getFirstMatch(regex) {
var match = ua.match(regex);
return (match"../../wp-content/themes/beaverwarrior-backup/build/script.js"x) {
var match = ua.match(regex);"../../wp-content/themes/beaverwarrior-backup/assets/vendor/slick/slick/slick.min.js"(ipod|iphone|ipad)/i).toLowerCase()
, "../../wp-content/themes/beaverwarrior-backup/assets/vendor/swiper/swiper-bundle.min.js"Mobile = /nexus\s*[0-6]\s*/i.test(ua)
"../../wp-content/themes/beaverwarrior-backup/assets/js/custom-fx.js"st(ua)
, silk = /silk/i.test(ua)
"../../wp-content/themes/beaverwarrior-backup/fx-assets/js/innerpage/related-product-slider.js" , windowsphone = /windows phone/i.test(ua)
, windows = !windowsphone && /windows/i.test(ua)
, mac = !iosdevice && !silk && /macintosh/i.test(ua)
, linux = !android && !sailfish && !tizen && !webos && /linux/i.test(ua)
, edgeVersion = getFirstMatch(/edge\/(\d+(\.\d+)?)/i)
, versionIdentifier = getFirstMatch(/version\/(\d+(\.\d+)?)/i)
, tablet = /tablet/i.test(ua)
, mobile = !tablet && /[^-]mobi/i.test(ua)
, xbox = /xbox/i.test(ua)
, result
if (/opera|opr|opios/i.test(ua)) {
result = {
name: 'Opera'
, opera: t
, version: versionIdentifier || getFirstMatch(/(?:opera|opr|opios)[\s\/](\d+(\.\d+)?)/i)
}
}
else if (/coast/i.test(ua)) {
result = {
name: 'Opera Coast'
, coast: t
, version: versionIdentifier || getFirstMatch(/(?:coast)[\s\/](\d+(\.\d+)?)/i)
}
}
else if (/yabrowser/i.test(ua)) {
result = {
name: 'Yandex Browser'
, yandexbrowser: t
, version: versionIdentifier || getFirstMatch(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i)
}
}
else if (/ucbrowser/i.test(ua)) {
result = {
name: 'UC Browser'
, ucbrowser: t
, version: getFirstMatch(/(?:ucbrowser)[\s\/](\d+(?:\.\d+)+)/i)
}
}
else if (/mxios/i.test(ua)) {
result = {
name: 'Maxthon'
, maxthon: t
, version: getFirstMatch(/(?:mxios)[\s\/](\d+(?:\.\d+)+)/i)
}
}
else if (/epiphany/i.test(ua)) {
result = {
name: 'Epiphany'
, epiphany: t
, version: getFirstMatch(/(?:epiphany)[\s\/](\d+(?:\.\d+)+)/i)
}
}
else if (/puffin/i.test(ua)) {
result = {
name: 'Puffin'
, puffin: t
, version: getFirstMatch(/(?:puffin)[\s\/](\d+(?:\.\d+)?)/i)
}
}
else if (/sleipnir/i.test(ua)) {
result = {
name: 'Sleipnir'
, sleipnir: t
, version: getFirstMatch(/(?:sleipnir)[\s\/](\d+(?:\.\d+)+)/i)
}
}
else if (/k-meleon/i.test(ua)) {
result = {
name: 'K-Meleon'
, kMeleon: t
, version: getFirstMatch(/(?:k-meleon)[\s\/](\d+(?:\.\d+)+)/i)
}
}
else if (windowsphone) {
result = {
name: 'Windows Phone'
, windowsphone: t
}
if (edgeVersion) {
result.msedge = t
result.version = edgeVersion
}
else {
result.msie = t
result.version = getFirstMatch(/iemobile\/(\d+(\.\d+)?)/i)
}
}
else if (/msie|trident/i.test(ua)) {
result = {
name: 'Internet Explorer'
, msie: t
, version: getFirstMatch(/(?:msie |rv:)(\d+(\.\d+)?)/i)
}
} else if (chromeos) {
result = {
name: 'Chrome'
, chromeos: t
, chromeBook: t
, chrome: t
, version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)
}
} else if (/chrome.+? edge/i.test(ua)) {
result = {
name: 'Microsoft Edge'
, msedge: t
, version: edgeVersion
}
}
else if (/vivaldi/i.test(ua)) {
result = {
name: 'Vivaldi'
, vivaldi: t
, version: getFirstMatch(/vivaldi\/(\d+(\.\d+)?)/i) || versionIdentifier
}
}
else if (sailfish) {
result = {
name: 'Sailfish'
, sailfish: t
, version: getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i)
}
}
else if (/seamonkey\//i.test(ua)) {
result = {
name: 'SeaMonkey'
, seamonkey: t
, version: getFirstMatch(/seamonkey\/(\d+(\.\d+)?)/i)
}
}
else if (/firefox|iceweasel|fxios/i.test(ua)) {
result = {
name: 'Firefox'
, firefox: t
, version: getFirstMatch(/(?:firefox|iceweasel|fxios)[ \/](\d+(\.\d+)?)/i)
}
if (/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(ua)) {
result.firefoxos = t
}
}
else if (silk) {
result = {
name: 'Amazon Silk'
, silk: t
, version : getFirstMatch(/silk\/(\d+(\.\d+)?)/i)
}
}
else if (/phantom/i.test(ua)) {
result = {
name: 'PhantomJS'
, phantom: t
, version: getFirstMatch(/phantomjs\/(\d+(\.\d+)?)/i)
}
}
else if (/slimerjs/i.test(ua)) {
result = {
name: 'SlimerJS'
, slimer: t
, version: getFirstMatch(/slimerjs\/(\d+(\.\d+)?)/i)
}
}
else if (/blackberry|\bbb\d+/i.test(ua) || /rim\stablet/i.test(ua)) {
result = {
name: 'BlackBerry'
, blackberry: t
, version: versionIdentifier || getFirstMatch(/blackberry[\d]+\/(\d+(\.\d+)?)/i)
}
}
else if (webos) {
result = {
name: 'WebOS'
, webos: t
, version: versionIdentifier || getFirstMatch(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i)
};
if( /touchpad\//i.test(ua) ){
result.touchpad = t;
}
}
else if (/bada/i.test(ua)) {
result = {
name: 'Bada'
, bada: t
, version: getFirstMatch(/dolfin\/(\d+(\.\d+)?)/i)
};
}
else if (tizen) {
result = {
name: 'Tizen'
, tizen: t
, version: getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i) || versionIdentifier
};
}
else if (/qupzilla/i.test(ua)) {
result = {
name: 'QupZilla'
, qupzilla: t
, version: getFirstMatch(/(?:qupzilla)[\s\/](\d+(?:\.\d+)+)/i) || versionIdentifier
}
}
else if (/chromium/i.test(ua)) {
result = {
name: 'Chromium'
, chromium: t
, version: getFirstMatch(/(?:chromium)[\s\/](\d+(?:\.\d+)?)/i) || versionIdentifier
}
}
else if (/chrome|crios|crmo/i.test(ua)) {
result = {
name: 'Chrome'
, chrome: t
, version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)
}
}
else if (android) {
result = {
name: 'Android'
, version: versionIdentifier
}
}
else if (/safari|applewebkit/i.test(ua)) {
result = {
name: 'Safari'
, safari: t
}
if (versionIdentifier) {
result.version = versionIdentifier
}
}
else if (iosdevice) {
result = {
name : iosdevice == 'iphone' ? 'iPhone' : iosdevice == 'ipad' ? 'iPad' : 'iPod'
}
// WTF: version is not part of user agent in web apps
if (versionIdentifier) {
result.version = versionIdentifier
}
}
else if(/googlebot/i.test(ua)) {
result = {
name: 'Googlebot'
, googlebot: t
, version: getFirstMatch(/googlebot\/(\d+(\.\d+))/i) || versionIdentifier
}
}
else {
result = {
name: getFirstMatch(/^(.*)\/(.*) /),
version: getSecondMatch(/^(.*)\/(.*) /)
};
}
// set webkit or gecko flag for browsers based on these engines
if (!result.msedge && /(apple)?webkit/i.test(ua)) {
if (/(apple)?webkit\/537\.36/i.test(ua)) {
result.name = result.name || "Blink"
result.blink = t
} else {
result.name = result.name || "Webkit"
result.webkit = t
}
if (!result.version && versionIdentifier) {
result.version = versionIdentifier
}
} else if (!result.opera && /gecko\//i.test(ua)) {
result.name = result.name || "Gecko"
result.gecko = t
result.version = result.version || getFirstMatch(/gecko\/(\d+(\.\d+)?)/i)
}
// set OS flags for platforms that have multiple browsers
if (!result.msedge && (android || result.silk)) {
result.android = t
} else if (iosdevice) {
result[iosdevice] = t
result.ios = t
} else if (mac) {
result.mac = t
} else if (xbox) {
result.xbox = t
} else if (windows) {
result.windows = t
} else if (linux) {
result.linux = t
}
// OS version extraction
var osVersion = '';
if (result.windowsphone) {
osVersion = getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i);
} else if (iosdevice) {
osVersion = getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i);
osVersion = osVersion.replace(/[_\s]/g, '.');
} else if (android) {
osVersion = getFirstMatch(/android[ \/-](\d+(\.\d+)*)/i);
} else if (result.webos) {
osVersion = getFirstMatch(/(?:web|hpw)os\/(\d+(\.\d+)*)/i);
} else if (result.blackberry) {
osVersion = getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i);
} else if (result.bada) {
osVersion = getFirstMatch(/bada\/(\d+(\.\d+)*)/i);
} else if (result.tizen) {
osVersion = getFirstMatch(/tizen[\/\s](\d+(\.\d+)*)/i);
}
if (osVersion) {
result.osversion = osVersion;
}
// device type extraction
var osMajorVersion = osVersion.split('.')[0];
if (
tablet
|| nexusTablet
|| iosdevice == 'ipad'
|| (android && (osMajorVersion == 3 || (osMajorVersion >= 4 && !mobile)))
|| result.silk
) {
result.tablet = t
} else if (
mobile
|| iosdevice == 'iphone'
|| iosdevice == 'ipod'
|| android
|| nexusMobile
|| result.blackberry
|| result.webos
|| result.bada
) {
result.mobile = t
}
// Graded Browser Support
// http://developer.yahoo.com/yui/articles/gbs
if (result.msedge ||
(result.msie && result.version >= 10) ||
(result.yandexbrowser && result.version >= 15) ||
(result.vivaldi && result.version >= 1.0) ||
(result.chrome && result.version >= 20) ||
(result.firefox && result.version >= 20.0) ||
(result.safari && result.version >= 6) ||
(result.opera && result.version >= 10.0) ||
(result.ios && result.osversion && result.osversion.split(".")[0] >= 6) ||
(result.blackberry && result.version >= 10.1)
|| (result.chromium && result.version >= 20)
) {
result.a = t;
}
else if ((result.msie && result.version < 10) ||
(result.chrome && result.version < 20) ||
(result.firefox && result.version < 20.0) ||
(result.safari && result.version < 6) ||
(result.opera && result.version < 10.0) ||
(result.ios && result.osversion && result.osversion.split(".")[0] < 6)
|| (result.chromium && result.version < 20)
) {
result.c = t
} else result.x = t
return result
}
var bowser = detect(typeof navigator !== 'undefined' ? navigator.userAgent : '')
bowser.test = function (browserList) {
for (var i = 0; i < browserList.length; ++i) {
var browserItem = browserList[i];
if (typeof browserItem=== 'string') {
if (browserItem in bowser) {
return true;
}
}
}
return false;
}
/**
* Get version precisions count
*
* @example
* getVersionPrecision("1.10.3") // 3
*
* @param {string} version
* @return {number}
*/
function getVersionPrecision(version) {
return version.split(".").length;
}
/**
* Array::map polyfill
*
* @param {Array} arr
* @param {Function} iterator
* @return {Array}
*/
function map(arr, iterator) {
var result = [], i;
if (Array.prototype.map) {
return Array.prototype.map.call(arr, iterator);
}
for (i = 0; i < arr.length; i++) {
result.push(iterator(arr[i]));
}
return result;
}
/**
* Calculate browser version weight
*
* @example
* compareVersions(['1.10.2.1', '1.8.2.1.90']) // 1
* compareVersions(['1.010.2.1', '1.09.2.1.90']); // 1
* compareVersions(['1.10.2.1', '1.10.2.1']); // 0
* compareVersions(['1.10.2.1', '1.0800.2']); // -1
*
* @param {Array
} versions versions to compare
* @return {Number} comparison result
*/
function compareVersions(versions) {
// 1) get common precision for both versions, for example for "10.0" and "9" it should be 2
var precision = Math.max(getVersionPrecision(versions[0]), getVersionPrecision(versions[1]));
var chunks = map(versions, function (version) {
var delta = precision - getVersionPrecision(version);
// 2) "9" -> "9.0" (for precision = 2)
version = version + new Array(delta + 1).join(".0");
// 3) "9.0" -> ["000000000"", "000000009"]
return map(version.split("."), function (chunk) {
return new Array(20 - chunk.length).join("0") + chunk;
}).reverse();
});
// iterate in reverse order by reversed chunks array
while (--precision >= 0) {
// 4) compare: "000000009" > "000000010" = false (but "9" > "10" = true)
if (chunks[0][precision] > chunks[1][precision]) {
return 1;
}
else if (chunks[0][precision] === chunks[1][precision]) {
if (precision === 0) {
// all version chunks are same
return 0;
}
}
else {
return -1;
}
}
}
/**
* Check if browser is unsupported
*
* @example
* bowser.isUnsupportedBrowser({
* msie: "10",
* firefox: "23",
* chrome: "29",
* safari: "5.1",
* opera: "16",
* phantom: "534"
* });
*
* @param {Object} minVersions map of minimal version to browser
* @param {Boolean} [strictMode = false] flag to return false if browser wasn't found in map
* @param {String} [ua] user agent string
* @return {Boolean}
*/
function isUnsupportedBrowser(minVersions, strictMode, ua) {
var _bowser = bowser;
// make strictMode param optional with ua param usage
if (typeof strictMode === 'string') {
ua = strictMode;
strictMode = void(0);
}
if (strictMode === void(0)) {
strictMode = false;
}
if (ua) {
_bowser = detect(ua);
}
var version = "" + _bowser.version;
for (var browser in minVersions) {
if (minVersions.hasOwnProperty(browser)) {
if (_bowser[browser]) {
// browser version and min supported version.
return compareVersions([version, minVersions[browser]]) < 0;
}
}
}
return strictMode; // not found
}
/**
* Check if browser is supported
*
* @param {Object} minVersions map of minimal version to browser
* @param {Boolean} [strictMode = false] flag to return false if browser wasn't found in map
* @param {String} [ua] user agent string
* @return {Boolean}
*/
function check(minVersions, strictMode, ua) {
return !isUnsupportedBrowser(minVersions, strictMode, ua);
}
bowser.isUnsupportedBrowser = isUnsupportedBrowser;
bowser.compareVersions = compareVersions;
bowser.check = check;
/*
* Set our detect method to the main bowser object so we can
* reuse it to test other user agents.
* This is needed to implement future tests.
*/
bowser._detect = detect;
return bowser
});
(function($){
UABBTrigger = {
/**
* Trigger a hook.
*
* @since 1.1.0.3
* @method triggerHook
* @param {String} hook The hook to trigger.
* @param {Array} args An array of args to pass to the hook.
*/
triggerHook: function( hook, args )
{
$( 'body' ).trigger( 'uabb-trigger.' + hook, args );
},
/**
* Add a hook.
*
* @since 1.1.0.3
* @method addHook
* @param {String} hook The hook to add.
* @param {Function} callback A function to call when the hook is triggered.
*/
addHook: function( hook, callback )
{
$( 'body' ).on( 'uabb-trigger.' + hook, callback );
},
/**
* Remove a hook.
*
* @since 1.1.0.3
* @method removeHook
* @param {String} hook The hook to remove.
* @param {Function} callback The callback function to remove.
*/
removeHook: function( hook, callback )
{
$( 'body' ).off( 'uabb-trigger.' + hook, callback );
},
};
})(jQuery);
jQuery(document).ready(function( $ ) {
if( typeof bowser !== 'undefined' && bowser !== null ) {
var uabb_browser = bowser.name,
uabb_browser_v = bowser.version,
uabb_browser_class = uabb_browser.replace(/\s+/g, '-').toLowerCase(),
uabb_browser_v_class = uabb_browser_class + parseInt( uabb_browser_v );
$('html').addClass(uabb_browser_class).addClass(uabb_browser_v_class);
}
$('.uabb-row-separator').parents('html').css('overflow-x', 'hidden');
});
var wpAjaxUrl = 'https://cn.aerotech.com/wp-admin/admin-ajax.php';var flBuilderUrl = 'https://cn.aerotech.com/wp-content/plugins/bb-plugin/';var FLBuilderLayoutConfig = {
anchorLinkAnimations : {
duration : 1000,
easing : 'swing',
offset : 100
},
paths : {
pluginUrl : 'https://cn.aerotech.com/wp-content/plugins/bb-plugin/',
wpAjaxUrl : 'https://cn.aerotech.com/wp-admin/admin-ajax.php'
},
breakpoints : {
small : 640,
medium : 1024,
large : 1200 },
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 row shape layer height.
FLBuilderLayout._initRowShapeLayerHeight();
// Only init if the builder isn't active.
if ( 0 === $('.fl-builder-edit').length ) {
// Init module animations.
FLBuilderLayout._initModuleAnimations();
// Init anchor links.
FLBuilderLayout._initAnchorLinks();
// Init the browser hash.
FLBuilderLayout._initHash();
// Init forms.
FLBuilderLayout._initForms();
FLBuilderLayout._reorderMenu();
}
else {
FLBuilderLayout._initNestedColsWidth();
}
},
/**
* 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 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' ),
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 );
}
}
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'),
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 );
}
},
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 || 2 === 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();
}
}
},
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'),
videoPlayer = playerWrap.find('.fl-bg-video-player'),
enableAudio = playerWrap.data('enable-audio'),
audioButton = playerWrap.find('.fl-bg-video-audio'),
player,
width = playerWrap.outerWidth(),
ua = navigator.userAgent;
if ( typeof Vimeo !== 'undefined' && videoId ) {
player = new Vimeo.Player(videoPlayer[0], {
id : videoId,
loop : true,
title : false,
portrait : false,
background : true,
autopause : false,
muted : true
});
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 );
}
}
},
/**
* 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 );
}
},
/**
* 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: FLBuilderLayout._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);
}
},
/**
* 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' ).animate( { scrollTop: dest }, config.duration, config.easing, function() {
if ( 'undefined' != typeof callback ) {
callback();
}
if ( undefined != element.attr( 'id' ) ) {
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.removeClass( 'fl-form-error' );
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);
/* Start Global JS */
window.addEventListener('load', function(){
var button = document.querySelector(".aeroVideoModule");
if(button){
var b = button.querySelector(".mejs-overlay-button");
b.innerHTML = '';
};
var $ = jQuery;
$('.cn-buttons-container').prepend('Terms & Conditions Privacy Policy Cookie Policy');
});
jQuery(document).ready(function($){
// since firefox is ignoring selectors like options[value=""] we need to go around this.
var ensureSelectEmptyClass = function(select){
select.toggleClass('has-empty-value', select.val() === '')
}
var ensureSelectsEmptyClass = function(){
$('select').each(function(i, sel){ ensureSelectEmptyClass($(sel)) });
}
setInterval(ensureSelectsEmptyClass, 500);
$(document).on('change faux-change', 'select', function(e) {
ensureSelectEmptyClass($(e.currentTarget))
}).trigger('faux-change');
});
/* End Global JS */
jQuery(function($) {
$(function() {
$( '.fl-node-5f28365d73672 .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($) {
/**
* 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;
// initialize the menu
this._initMenu();
// check if viewport is resizing
$( window ).on( 'resize', $.proxy( function( e ) {
var width = $( window ).width();
// if screen width is resized, reload the menu
if( width != this.currentBrowserWidth ){
this.currentBrowserWidth = width;
this._initMenu();
this._clickOrHover();
}
}, this ) );
$( 'body' ).on( 'click', $.proxy( function( e ) {
if ( 'undefined' !== typeof FLBuilderConfig ){
return;
}
var activeMobileMenu = $(this.wrapperClass + ' .fl-menu-mobile-toggle.fl-active' );
if ( activeMobileMenu.length && ( 'expanded' !== this.mobileToggle ) ){
$( activeMobileMenu ).trigger('click');
}
$( this.wrapperClass ).find( '.fl-has-submenu' ).removeClass( 'focus' );
$( this.wrapperClass ).find( '.fl-has-submenu .sub-menu' ).removeClass( 'focus' );
}, this ) );
// Close Mobile menu when tabbing out from the last menu item.
$( this.wrapperClass + ' ul.menu > li:last-child' ).on( 'focusout', $.proxy(function (e) {
if ( $( this.wrapperClass ).find( '.fl-menu-mobile-toggle' ).hasClass( 'fl-active' ) && ( 'expanded' !== this.mobileToggle ) ) {
if ( ! $( e.relatedTarget ).parent().hasClass( 'menu-item' ) ) {
$( this.wrapperClass ).find( '.fl-menu-mobile-toggle' ).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 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(){
this._setupSubmenu();
this._menuOnFocus();
this._menuOnEscape();
this._submenuOnClick();
if ( $( this.nodeClass ).length && this.type == 'horizontal' ) {
this._initMegaMenus();
}
if( this._isMenuToggle() || this.type == 'accordion' ){
$( this.wrapperClass ).off( 'mouseenter mouseleave' );
this._menuOnClick();
this._clickOrHover();
} else {
$( this.wrapperClass ).off( 'click' );
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();
}
},
/**
* Initializes submenu dropdowns.
*
* @since 3.0
* @return void
*/
_setupSubmenu: function() {
$( this.wrapperClass + ' ul.sub-menu' ).each( function(){
$( this ).closest( 'li' ).attr( 'aria-haspopup', 'true' );
});
},
/**
* Adds a focus class to menu elements similar to be used similar to CSS :hover psuedo event
*
* @since 1.9.0
* @return void
*/
_menuOnFocus: function(){
var cKey = 0,
isShifted = false;
$( this.nodeClass ).off('keydown').on( 'keydown', 'a', function( e ){
cKey = e.which;
isShifted = e.shiftKey;
});
$( this.nodeClass ).off('focus').on( 'focus', 'a', $.proxy( function( e ){
var $menuItem = $( e.target ).parents( '.menu-item' ).first(),
$parents = $( e.target ).parentsUntil( this.wrapperClass );
$('.fl-menu .focus').removeClass('focus');
$parents.addClass('focus')
if ( ! $menuItem.closest('.fl-has-submenu').hasClass('escaped') ) {
$menuItem.addClass('focus')
}
else {
$menuItem.closest('.fl-has-submenu').removeClass('focus escaped')
}
}, this ) ).on( 'focusout', 'a', $.proxy( function( e ){
var el = $(e.target).parent(),
$megaMenu = el.closest( '.mega-menu' ),
$megaLastItem = $megaMenu.find('> .sub-menu > .menu-item:last-child'),
$lastItem = el.parents('.fl-has-submenu:last').find('.menu-item:last'),
isLastChild = ! $megaMenu.length && el.is( $lastItem );
if( $megaMenu.length ) {
isLastChild = el.is( $megaLastItem ) || el.is( $megaLastItem.find( '.menu-item:last-child' ) );
}
if ( isLastChild && cKey === 9 && isShifted ) {
isLastChild = false;
cKey = 0;
isShifted = false;
}
else if ( cKey === 27 ) {
isLastChild = false;
}
if ( isLastChild ) {
$( e.target ).parentsUntil( this.wrapperClass ).removeClass( 'focus' );
}
}, this ) );
},
/**
* Logic for submenu items when Escape key is pressed.
*
* @since 2.7.1
* @return void
*/
_menuOnEscape: function(){
$( 'body' ).off('keydown').on( 'keydown', $.proxy( function( e ){
if ( e.which !== 27 ) {
return;
}
if ( $( e.target ).closest('.menu-item').length ) {
var activeSubmenu = null,
menuItem = $( e.target ).closest('.menu-item'),
type = menuItem.closest('.fl-menu-accordion').length ? 'accordion' : 'horizontal';
if ( 'horizontal' === type ) {
if ( menuItem.hasClass( 'fl-has-submenu' ) && menuItem.hasClass( 'focus' ) ) {
activeSubmenu = menuItem.find('> ul.sub-menu');
}
else {
activeSubmenu = menuItem.closest('ul.sub-menu');
}
activeSubmenu.parent().addClass('escaped');
activeSubmenu.parent().find('a:first').focus();
}
else {
if ( menuItem.hasClass( 'fl-has-submenu' ) && 'accordion' === type && menuItem.hasClass( 'fl-active' ) ) {
activeSubmenu = menuItem.find('> ul.sub-menu');
}
else {
activeSubmenu = menuItem.closest('ul.sub-menu');
}
activeSubmenu.slideUp(400, function(){
if ( menuItem.hasClass( 'fl-has-submenu' ) && menuItem.hasClass( 'fl-active' ) ) {
activeSubmenu.parent().last().find('a:first').focus();
}
else {
menuItem.removeClass('focus');
menuItem.parents('.menu-item').first().find('a:first').focus();
}
activeSubmenu.parent().last().removeClass( 'fl-active' );
});
}
}
else {
$('.fl-menu').find( 'li.menu-item.focus' ).last().removeClass('focus');
}
}, this ) );
},
/**
* Logic for submenu toggling on accordions or mobile menus (vertical, horizontal)
*
* @since 1.6.1
* @return void
*/
_menuOnClick: function(){
$( this.wrapperClass ).off().on( 'click', '.fl-has-submenu-container', $.proxy( function( e ){
var $link = $( e.target ).parents( '.fl-has-submenu' ).first(),
$subMenu = $link.children( '.sub-menu' ).first(),
$href = $link.children('.fl-has-submenu-container').first().find('> a').attr('href'),
$subMenuParents = $( e.target ).parents( '.sub-menu' ),
$activeParents = $( e.target ).parents( '.fl-has-submenu.fl-active' );
if( !$subMenu.is(':visible') || $(e.target).hasClass('fl-menu-toggle')
|| ($subMenu.is(':visible') && (typeof $href === 'undefined' || $href == '#')) ){
e.preventDefault();
}
else {
e.stopPropagation();
window.location.href = $href;
return;
}
if ($(this.wrapperClass).hasClass('fl-menu-accordion-collapse')) {
if ( !$link.parents('.menu-item').hasClass('fl-active') ) {
$('.menu .fl-active', this.wrapperClass).not($link).removeClass('fl-active');
}
else if ($link.parents('.menu-item').hasClass('fl-active') && $link.parent('.sub-menu').length) {
$('.menu .fl-active', this.wrapperClass).not($link).not($activeParents).removeClass('fl-active');
}
$('.sub-menu', this.wrapperClass).not($subMenu).not($subMenuParents).slideUp('normal');
}
if ( ! this.mobileStacked && 'horizontal' == this.type && 'expanded' == this.mobileToggle ) {
$( this.wrapperClass ).find( '.fl-active' ).not($link).not($activeParents).removeClass( 'fl-active' );
}
else {
$subMenu.slideToggle();
}
$link.toggleClass( 'fl-active' );
e.stopPropagation();
}, this ) );
},
/**
* Logic for submenu items click event
*
* @since 1.10.6
* @return void
*/
_submenuOnClick: function(){
$( this.wrapperClass + ' .sub-menu' ).off().on( 'click', 'a', $.proxy( function( e ){
if ( $( e.target ).parent().hasClass('focus') ) {
$( e.target ).parentsUntil( this.wrapperClass ).removeClass('focus');
}
}, this ) );
},
/**
* Changes general styling and behavior of menus based on mobile / desktop viewport.
*
* @see this._isMenuToggle()
* @since 1.6.1
* @return void
*/
_clickOrHover: function(){
this.$submenus = this.$submenus || $( this.wrapperClass ).find( '.sub-menu' );
var $wrapper = $( this.wrapperClass ),
$menu = $wrapper.find( '.menu' );
$li = $wrapper.find( '.fl-has-submenu' );
if( this._isMenuToggle() ){
$li.each( function( el ){
if( !$(this).hasClass('fl-active') ){
$(this).find( '.sub-menu' ).fadeOut();
}
} );
} else {
$li.each( function( el ){
if( !$(this).hasClass('fl-active') ){
$(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( e ){
$( 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( e ){
$( 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 ){
$( this ).toggleClass( 'fl-active' );
if ( self.mobileFlyout ) {
self._toggleFlyoutMenu();
}
else {
var targetMenu = null;
if ( self.mobileBelowRow ) {
targetMenu = $( this ).closest( '.fl-col' ).next( '.fl-menu-mobile-clone' );
} 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(e){
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 ).closest( '.fl-col' ).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.closest( '.fl-col' );
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._menuOnClick();
},
/**
* 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 win = $( window ),
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 ) {
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.on( 'click', '.fl-menu-mobile-opacity, .fl-menu-mobile-close', function(e){
button.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' );
}
});
}
},
/**
* 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' ),
wrapFlyout = wrapper.find( '.fl-menu-mobile-flyout' ),
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 = {},
posAttr = {},
fixedPos = {},
winHeight = $(window).height(),
fixedHeader = $('header, header > div');
if ( button.hasClass( 'fl-active' ) ) {
posAttr[ position ] = '0px';
posAttr[ 'height' ] = winHeight + 'px';
} else {
posAttr[ position ] = '-267px';
}
wrapFlyout.css( posAttr );
// 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' ) ? '250px' : '0px';
$( 'body' ).animate( marginPos, 200);
// Fixed header
if ( fixedHeader.length > 0 ) {
fixedPos[ position] = button.hasClass( 'fl-active' ) ? '250px' : '0px';
fixedHeader.each(function(){
if ( 'fixed' == $( this ).css( 'position' ) ) {
$( this ).css({
'-webkit-transition': 'none',
'-o-transition' : 'none',
'transition' : 'none'
});
$( this ).animate( fixedPos, 200 );
}
});
}
}
if ( opacity.length > 0 && button.hasClass( 'fl-active' ) ) {
opacity.show();
}
else {
opacity.hide();
}
},
/**
* 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('a.fl-button'),
form = wrapper.find('.fl-search-form-input-wrap'),
self = this;
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 3.0
* @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: '5f29925ee052c',
type: 'horizontal',
mobile: 'hamburger',
mobileBelowRow: true,
mobileFlyout: false,
breakPoints: {
large: 1200,
medium: 1024,
small: 640 },
mobileBreakpoint: 'medium-mobile',
postId : '702',
mobileStacked: true,
});
});
})(jQuery);
jQuery(function($) {
$(function() {
$( '.fl-node-5fa9f5cb94203 .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';
});
"use strict";function _classCallCheck(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function _defineProperties(a,b){for(var c=0;c=0){
jQuery('.careersMenuItem').html('职业');
jQuery('header #menu-main-menu').find('.menu-item.careers').html('');
jQuery('header #menu-main-menu').find('.menu-item.contact').html('');
}
});
/* End Layout Custom JS */
(function($){
/**
* Helper class for header layout logic.
*
* @since 1.0
* @class FLThemeBuilderHeaderLayout
*/
FLThemeBuilderHeaderLayout = {
/**
* A reference to the window object for this page.
*
* @since 1.0
* @property {Object} win
*/
win : null,
/**
* A reference to the body object for this page.
*
* @since 1.0
* @property {Object} body
*/
body : null,
/**
* A reference to the header object for this page.
*
* @since 1.0
* @property {Object} header
*/
header : null,
/**
* Whether this header overlays the content or not.
*
* @since 1.0
* @property {Boolean} overlay
*/
overlay : false,
/**
* Whether the page has the WP admin bar or not.
*
* @since 1.0
* @property {Boolean} hasAdminBar
*/
hasAdminBar : false,
/**
* Breakpoi"../../careers-cn/index.html"apply.
*
* @since 1.4
* @property {String} stickyOn
*/
stickyOn: '',
/**
* A reference of the sticky and shr"../../careers-cn/index.html"ce 1.2.5
* @property {Number} breakpointWidth
*/
breakpointWidth: 0,
/**
* Initializes header layout logic.
*
* @since 1.0
* @method init
*/
init: function()
{
var editing = $( 'html.fl-builder-edit' ).length,
header = $( '.fl-builder-content[data-type=header]' ),
menuModule = header.find( '.fl-module-menu' ),
breakpoint = null;
if ( ! editing && header.length ) {
header.imagesLoaded( $.proxy( function() {
this.win = $( window );
this.body = $( 'body' );
this.header = header.eq( 0 );
this.overlay = !! Number( header.attr( 'data-overlay' ) );
this.hasAdminBar = !! $( 'body.admin-bar' ).length;
this.stickyOn = this.header.data( 'sticky-on' );
breakpoint = this.header.data( 'sticky-breakpoint' );
if ( '' == this.stickyOn ) {
if ( typeof FLBuilderLayoutConfig.breakpoints[ breakpoint ] !== undefined ) {
this.breakpointWidth = FLBuilderLayoutConfig.breakpoints[ breakpoint ];
}
else {
this.breakpointWidth = FLBuilderLayoutConfig.breakpoints.medium;
}
}
if ( Number( header.attr( 'data-sticky' ) ) ) {
this.header.data( 'original-top', this.header.offset().top );
this.win.on( 'resize', $.throttle( 500, $.proxy( this._initSticky, this ) ) );
this._initSticky();
}
}, this ) );
}
},
/**
* Initializes sticky logic for a header.
*
* @since 1.0
* @access private
* @method _initSticky
*/
_initSticky: function( e )
{
var header = $('.fl-builder-content[data-type=header]'),
windowSize = this.win.width(),
makeSticky = false;
makeSticky = this._makeWindowSticky( windowSize );
if ( makeSticky || ( this.breakpointWidth > 0 && windowSize >= this.breakpointWidth ) ) {
this.win.on( 'scroll.fl-theme-builder-header-sticky', $.proxy( this._doSticky, this ) );
//
// Check if Event Type is 'resize' then invoke this._doSticky()
// only if the 'fl-theme-builder-header-sticky' class is already present.
//
if ( e && 'resize' === e.type ) {
if ( this.header.hasClass( 'fl-theme-builder-header-sticky' ) ) {
this._doSticky( e );
}
this._adjustStickyHeaderWidth();
}
if ( Number( header.attr( 'data-shrink' ) ) ) {
this.header.data( 'original-height', this.header.outerHeight() );
this.win.on( 'resize', $.throttle( 500, $.proxy( this._initShrink, this ) ) );
this._initShrink();
}
this._initFlyoutMenuFix( e );
} else {
this.win.off( 'scroll.fl-theme-builder-header-sticky' );
this.win.off( 'resize.fl-theme-builder-header-sticky' );
this.header.removeClass( 'fl-theme-builder-header-sticky' );
this.header.removeAttr( 'style' );
this.header.parent().css( 'padding-top', '0' );
}
},
/**
* Check if Header should be sticky at a particular Window size.
*
* @since 1.4
* @access private
* @param widowSize
* @method _makeWindowSticky
*/
_makeWindowSticky: function ( windowSize )
{
var makeSticky = false;
switch (this.stickyOn) {
case 'xl':
makeSticky = windowSize > FLBuilderLayoutConfig.breakpoints['large'];
break;
case '': // Default
case 'desktop':
makeSticky = windowSize >= FLBuilderLayoutConfig.breakpoints['medium'];
break;
case 'desktop-medium':
makeSticky = windowSize > FLBuilderLayoutConfig.breakpoints['small'];
break;
case 'large':
makeSticky = windowSize > FLBuilderLayoutConfig.breakpoints['medium'] && windowSize <= FLBuilderLayoutConfig.breakpoints['large'];
break;
case 'large-medium':
makeSticky = windowSize > FLBuilderLayoutConfig.breakpoints['small'] && windowSize <= FLBuilderLayoutConfig.breakpoints['large'];
break;
case 'medium':
makeSticky = ( windowSize <= FLBuilderLayoutConfig.breakpoints['medium'] && windowSize > FLBuilderLayoutConfig.breakpoints['small'] );
break;
case 'medium-mobile':
makeSticky = (windowSize <= FLBuilderLayoutConfig.breakpoints['medium']);
break;
case 'mobile':
makeSticky = (windowSize <= FLBuilderLayoutConfig.breakpoints['small']);
break;
case 'all':
makeSticky = true;
break;
}
return makeSticky;
},
/**
* Sticks the header when the page is scrolled.
*
* @since 1.0
* @access private
* @method _doSticky
*/
_doSticky: function( e )
{
var winTop = Math.floor( this.win.scrollTop() ),
headerTop = Math.floor( this.header.data( 'original-top' ) ),
hasStickyClass = this.header.hasClass( 'fl-theme-builder-header-sticky' ),
hasScrolledClass = this.header.hasClass( 'fl-theme-builder-header-scrolled' ),
beforeHeader = this.header.prevAll( '.fl-builder-content' ),
bodyTopPadding = parseInt( jQuery('body').css('padding-top') ),
winBarHeight = $('#wpadminbar').length ? $('#wpadminbar').outerHeight() : 0,
headerHeight = 0;
if ( isNaN( bodyTopPadding ) ) {
bodyTopPadding = 0;
}
if ( this.hasAdminBar && this.win.width() > 600 ) {
winTop += Math.floor( winBarHeight );
}
if ( winTop > headerTop ) {
if ( ! hasStickyClass ) {
if ( e && ( 'scroll' === e.type || 'smartscroll' === e.type ) ) {
this.header.addClass( 'fl-theme-builder-header-sticky' );
if ( this.overlay && beforeHeader.length ) {
this.header.css( 'top', winBarHeight);
}
}
if ( ! this.overlay ) {
this._adjustHeaderHeight();
}
}
}
else if ( hasStickyClass ) {
this.header.removeClass( 'fl-theme-builder-header-sticky' );
this.header.removeAttr( 'style' );
this.header.parent().css( 'padding-top', '0' );
}
this._adjustStickyHeaderWidth();
if ( winTop > headerTop ) {
if ( ! hasScrolledClass ) {
this.header.addClass( 'fl-theme-builder-header-scrolled' );
}
} else if ( hasScrolledClass ) {
this.header.removeClass( 'fl-theme-builder-header-scrolled' );
}
this._flyoutMenuFix( e );
},
/**
* Initializes flyout menu fixes on sticky header.
*
* @since 1.4.1
* @method _initFlyoutMenuFix
*/
_initFlyoutMenuFix: function( e ) {
var header = this.header,
menuModule = header.find( '.fl-menu' ),
flyoutMenu = menuModule.find( '.fl-menu-mobile-flyout' ),
isPushMenu = menuModule.hasClass( 'fl-menu-responsive-flyout-push' ) || menuModule.hasClass( 'fl-menu-responsive-flyout-push-opacity' ),
isSticky = header.hasClass( 'fl-theme-builder-header-sticky' ),
isOverlay = menuModule.hasClass( 'fl-menu-responsive-flyout-overlay' ),
flyoutPos = menuModule.hasClass( 'fl-flyout-right' ) ? 'right' : 'left',
flyoutParent = header.parent().is( 'header' ) ? header.parent().parent() : header.parent();
isFullWidth = this.win.width() === header.width(),
flyoutLayout = '',
activePos = 250,
headerPos = 0;
if ( ! flyoutMenu.length ) {
return;
}
if ( this.win.width() > header.parent().width() ) {
headerPos = ( this.win.width() - header.width() ) / 2;
}
if ( isOverlay ) {
activePos = headerPos;
}
else if ( isPushMenu ) {
activePos = activePos + headerPos;
}
flyoutMenu.data( 'activePos', activePos );
if ( isPushMenu ) {
flyoutLayout = 'push-' + flyoutPos;
}
else if ( isOverlay ) {
flyoutLayout = 'overlay-' + flyoutPos;
}
if ( isPushMenu && ! $( 'html' ).hasClass( 'fl-theme-builder-has-flyout-menu' ) ) {
$( 'html' ).addClass( 'fl-theme-builder-has-flyout-menu' );
}
if ( ! flyoutParent.hasClass( 'fl-theme-builder-flyout-menu-' + flyoutLayout ) ) {
flyoutParent.addClass( 'fl-theme-builder-flyout-menu-' + flyoutLayout );
}
if ( ! header.hasClass( 'fl-theme-builder-flyout-menu-overlay' ) && isOverlay ) {
header.addClass( 'fl-theme-builder-flyout-menu-overlay' );
}
if ( ! header.hasClass( 'fl-theme-builder-header-full-width' ) && isFullWidth ) {
header.addClass( 'fl-theme-builder-header-full-width' );
}
else if ( ! isFullWidth ) {
header.removeClass( 'fl-theme-builder-header-full-width' );
}
menuModule.on( 'click', '.fl-menu-mobile-toggle', $.proxy( function( event ){
if ( menuModule.find( '.fl-menu-mobile-toggle.fl-active' ).length ) {
$( 'html' ).addClass( 'fl-theme-builder-flyout-menu-active' );
event.stopImmediatePropagation();
}
else {
$( 'html' ).removeClass( 'fl-theme-builder-flyout-menu-active' );
}
this._flyoutMenuFix( event );
}, this ) );
},
/**
* Fix flyout menu inside the sticky header.
*
* @since 1.4.1
* @method _flyoutMenuFix
*/
_flyoutMenuFix: function( e ){
var header = this.header,
menuModule = header.find( '.fl-menu' ),
flyoutMenu = menuModule.find( '.fl-menu-mobile-flyout' ),
isPushMenu = menuModule.hasClass( 'fl-menu-responsive-flyout-push' ) || menuModule.hasClass( 'fl-menu-responsive-flyout-push-opacity' ),
flyoutPos = menuModule.hasClass( 'fl-flyout-right' ) ? 'right' : 'left',
menuOpacity = menuModule.find( '.fl-menu-mobile-opacity' ),
isScroll = 'undefined' !== typeof e && 'scroll' === e.handleObj.type,
activePos = 'undefined' !== typeof flyoutMenu.data( 'activePos' ) ? flyoutMenu.data( 'activePos' ) : 0,
headerPos = ( this.win.width() - header.width() ) / 2,
inactivePos = headerPos > 0 ? activePos + 4 : 254;
if ( ! flyoutMenu.length ) {
return;
}
if ( this.overlay ) {
return;
}
if( $( '.fl-theme-builder-flyout-menu-active' ).length ) {
if ( isScroll && ! flyoutMenu.hasClass( 'fl-menu-disable-transition' ) ) {
flyoutMenu.addClass( 'fl-menu-disable-transition' );
}
if ( header.hasClass( 'fl-theme-builder-header-sticky' ) ) {
if ( ! isScroll ) {
setTimeout( $.proxy( function(){
flyoutMenu.css( flyoutPos, '-' + activePos + 'px' );
}, this ), 1 );
}
else {
flyoutMenu.css( flyoutPos, '-' + activePos + 'px' );
}
}
else {
flyoutMenu.css( flyoutPos, '0px' );
}
}
else {
if ( flyoutMenu.hasClass( 'fl-menu-disable-transition' ) ) {
flyoutMenu.removeClass( 'fl-menu-disable-transition' );
}
if ( header.hasClass( 'fl-theme-builder-flyout-menu-overlay' ) && headerPos > 0 && headerPos < 250 ) {
if ( header.hasClass( 'fl-theme-builder-header-sticky' ) ) {
inactivePos = headerPos + 254;
}
else {
inactivePos = 254;
}
}
if ( e && e.type === 'resize' ) {
inactivePos = headerPos + 254;
}
flyoutMenu.css( flyoutPos, '-' + inactivePos + 'px' );
}
if ( e && menuModule.is('.fl-menu-responsive-flyout-overlay') && $.infinitescroll ) {
e.stopImmediatePropagation();
}
if( menuOpacity.length ) {
if ( header.hasClass( 'fl-theme-builder-header-sticky' ) ) {
if ( '0px' === menuOpacity.css( 'left' ) ) {
menuOpacity.css( 'left', '-' + headerPos + 'px' );
}
}
else {
menuOpacity.css( 'left', '' );
}
}
},
/**
* Adjust sticky header width if BB Theme Boxed Layout is used.
*
* @since 1.4
* @access private
* @method _adjustStickyHeaderWidth
*/
_adjustStickyHeaderWidth: function () {
if ( $('body').hasClass( 'fl-fixed-width' ) ) {
var parentWidth = this.header.parent().width();
// Better if this is set in the stylesheet file.
if ( this.win.width() >= 992 ) {
this.header.css({
'margin': '0 auto',
'max-width': parentWidth,
});
}
else {
this.header.css({
'margin': '',
'max-width': '',
});
}
}
},
/**
* Adjust Sticky Header Height
*
* @since 1.4
* @access private
* @method _adjustHeaderHeight
*/
_adjustHeaderHeight: function () {
var beforeHeader = this.header.prevAll('.fl-builder-content'),
beforeHeaderHeight = 0,
beforeHeaderFix = 0,
headerHeight = Math.floor( this.header.outerHeight() ),
bodyTopPadding = parseInt( $( 'body' ).css( 'padding-top' ) ),
wpAdminBarHeight = 0,
totalHeaderHeight = 0;
if ( isNaN( bodyTopPadding ) ) {
bodyTopPadding = 0;
}
if ( beforeHeader.length ) {
$.each( beforeHeader, function() {
beforeHeaderHeight += Math.floor( $(this).outerHeight() );
});
// Subtract this value from the header parent's top padding.
beforeHeaderFix = 2;
}
if ( this.hasAdminBar && this.win.width() <= 600 ) {
wpAdminBarHeight = Math.floor( $('#wpadminbar').outerHeight() );
}
totalHeaderHeight = Math.floor( beforeHeaderHeight + headerHeight);
if ( headerHeight > 0 ) {
var headerParent = this.header.parent(),
headerParentTopPadding = 0;
// If the header's parent container is the BODY tag ignore its top padding.
if ( $( headerParent ).is('body') ) {
headerParentTopPadding = Math.floor( headerHeight - wpAdminBarHeight );
} else {
headerParentTopPadding = Math.floor( headerHeight - bodyTopPadding - wpAdminBarHeight );
}
$( headerParent ).css( 'padding-top', ( headerParentTopPadding - beforeHeaderFix ) + 'px' );
this.header.css({
'-webkit-transform': 'translate(0px, -' + totalHeaderHeight + 'px)',
'-ms-transform': 'translate(0px, -' + totalHeaderHeight + 'px)',
'transform': 'translate(0px, -' + totalHeaderHeight + 'px)'
});
}
},
/**
* Initializes shrink logic for a header.
*
* @since 1.0
* @access private
* @method _initShrink
*/
_initShrink: function( e )
{
if ( this.win.width() >= this.breakpointWidth ) {
this.win.on( 'scroll.fl-theme-builder-header-shrink', $.proxy( this._doShrink, this ) );
this._setImageMaxHeight();
if ( this.win.scrollTop() > 0 ){
this._doShrink();
}
} else {
this.header.parent().css( 'padding-top', '0' );
this.win.off( 'scroll.fl-theme-builder-header-shrink' );
this._removeShrink();
this._removeImageMaxHeight();
}
},
/**
* Shrinks the header when the page is scrolled.
*
* @since 1.0
* @access private
* @method _doShrink
*/
_doShrink: function( e )
{
var winTop = this.win.scrollTop(),
headerTop = this.header.data('original-top'),
headerHeight = this.header.data('original-height'),
shrinkImageHeight = this.header.data('shrink-image-height'),
windowSize = this.win.width(),
makeSticky = this._makeWindowSticky( windowSize ),
hasClass = this.header.hasClass( 'fl-theme-builder-header-shrink' );
if ( this.hasAdminBar ) {
winTop += 32;
}
if ( makeSticky && ( winTop > headerTop + headerHeight ) ) {
if ( ! hasClass ) {
this.header.addClass( 'fl-theme-builder-header-shrink' );
// Shrink images but don't include lightbox and menu images.
this.header.find('img').each( function( i ) {
var image = $( this ),
maxMegaMenu = image.closest( '.max-mega-menu' ).length,
imageInLightbox = image.closest( '.fl-button-lightbox-content' ).length,
imageInNavMenu = image.closest( 'li.menu-item' ).length;
if ( ! ( imageInLightbox || imageInNavMenu || maxMegaMenu ) ) {
image.css( 'max-height', shrinkImageHeight );
}
});
this.header.find( '.fl-row-content-wrap' ).each( function() {
var row = $( this );
if ( parseInt( row.css( 'padding-bottom' ) ) > 5 ) {
row.addClass( 'fl-theme-builder-header-shrink-row-bottom' );
}
if ( parseInt( row.css( 'padding-top' ) ) > 5 ) {
row.addClass( 'fl-theme-builder-header-shrink-row-top' );
}
} );
this.header.find( '.fl-module-content' ).each( function() {
var module = $( this );
if ( parseInt( module.css( 'margin-bottom' ) ) > 5 ) {
module.addClass( 'fl-theme-builder-header-shrink-module-bottom' );
}
if ( parseInt( module.css( 'margin-top' ) ) > 5 ) {
module.addClass( 'fl-theme-builder-header-shrink-module-top' );
}
} );
}
} else if (hasClass) {
this.header.find( 'img' ).css( 'max-height', '' );
this._removeShrink();
}
// Fixes Shrink header issue with BB Theme when window is scrolled then resized and back.
if ( 'undefined' === typeof( e ) && $('body').hasClass( 'fl-fixed-width' ) ) {
if ( ! this.overlay ) {
this._adjustHeaderHeight();
}
}
},
/**
* Removes the header shrink effect.
*
* @since 1.0
* @access private
* @method _removeShrink
*/
_removeShrink: function()
{
var rows = this.header.find( '.fl-row-content-wrap' ),
modules = this.header.find( '.fl-module-content' );
rows.removeClass( 'fl-theme-builder-header-shrink-row-bottom' );
rows.removeClass( 'fl-theme-builder-header-shrink-row-top' );
modules.removeClass( 'fl-theme-builder-header-shrink-module-bottom' );
modules.removeClass( 'fl-theme-builder-header-shrink-module-top' );
this.header.removeClass( 'fl-theme-builder-header-shrink' );
},
/**
* Adds max height to images in modules for smooth scrolling.
*
* @since 1.1.1
* @access private
* @method _setImageMaxHeight
*/
_setImageMaxHeight: function()
{
var head = $( 'head' ),
stylesId = 'fl-header-styles-' + this.header.data( 'post-id' ),
styles = '',
images = this.header.find( '.fl-module-content img' );
if ( $( '#' + stylesId ).length ) {
return;
}
images.each( function( i ) {
var image = $( this ),
height = image.height(),
node = image.closest( '.fl-module' ).data( 'node' ),
className = 'fl-node-' + node + '-img-' + i,
maxMegaMenu = image.closest( '.max-mega-menu' ).length,
imageInLightbox = image.closest( '.fl-button-lightbox-content' ).length,
imageInNavMenu = image.closest( 'li.menu-item' ).length;
if ( ! ( imageInLightbox || imageInNavMenu || maxMegaMenu ) ) {
image.addClass( className );
styles += '.' + className + ' { max-height: ' + ( height ? height : image[0].height ) + 'px }';
}
} );
if ( '' !== styles ) {
head.append( '' );
}
},
/**
* Removes max height on images in modules for smooth scrolling.
*
* @since 1.1.1
* @access private
* @method _removeImageMaxHeight
*/
_removeImageMaxHeight: function()
{
$( '#fl-header-styles-' + this.header.data( 'post-id' ) ).remove();
},
};
$( function() { FLThemeBuilderHeaderLayout.init(); } );
})(jQuery);
/*!
* Bowser - a browser detector
* https://github.com/ded/bowser
* MIT License | (c) Dustin Diaz 2015
*/
!function (name, definition) {
if (typeof module != 'undefined' && module.exports) module.exports = definition()
else if (typeof define == 'function' && define.amd) define(name, definition)
else this[name] = definition()
}('bowser', function () {
/**
* See useragents.js for examples of navigator.userAgent
*/
var t = true
function detect(ua) {
function getFirstMatch(regex) {
var match = ua.match(regex);
return (match && match.length > 1 && match[1]) || '';
}
function getSecondMatch(regex) {
var match = ua.match(regex);
return (match && match.length > 1 && match[2]) || '';
}
var iosdevice = getFirstMatch(/(ipod|iphone|ipad)/i).toLowerCase()
, likeAndroid = /like android/i.test(ua)
, android = !likeAndroid && /android/i.test(ua)
, nexusMobile = /nexus\s*[0-6]\s*/i.test(ua)
, nexusTablet = !nexusMobile && /nexus\s*[0-9]+/i.test(ua)
, chromeos = /CrOS/.test(ua)
, silk = /silk/i.test(ua)
, sailfish = /sailfish/i.test(ua)
, tizen = /tizen/i.test(ua)
, webos = /(web|hpw)os/i.test(ua)
, windowsphone = /windows phone/i.test(ua)
, windows = !windowsphone && /windows/i.test(ua)
, mac = !iosdevice && !silk && /macintosh/i.test(ua)
, linux = !android && !sailfish && !tizen && !webos && /linux/i.test(ua)
, edgeVersion = getFirstMatch(/edge\/(\d+(\.\d+)?)/i)
, versionIdentifier = getFirstMatch(/version\/(\d+(\.\d+)?)/i)
, tablet = /tablet/i.test(ua)
, mobile = !tablet && /[^-]mobi/i.test(ua)
, xbox = /xbox/i.test(ua)
, result
if (/opera|opr|opios/i.test(ua)) {
result = {
name: 'Opera'
, opera: t
, version: versionIdentifier || getFirstMatch(/(?:opera|opr|opios)[\s\/](\d+(\.\d+)?)/i)
}
}
else if (/coast/i.test(ua)) {
result = {
name: 'Opera Coast'
, coast: t
, version: versionIdentifier || getFirstMatch(/(?:coast)[\s\/](\d+(\.\d+)?)/i)
}
}
else if (/yabrowser/i.test(ua)) {
result = {
name: 'Yandex Browser'
, yandexbrowser: t
, version: versionIdentifier || getFirstMatch(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i)
}
}
else if (/ucbrowser/i.test(ua)) {
result = {
name: 'UC Browser'
, ucbrowser: t
, version: getFirstMatch(/(?:ucbrowser)[\s\/](\d+(?:\.\d+)+)/i)
}
}
else if (/mxios/i.test(ua)) {
result = {
name: 'Maxthon'
, maxthon: t
, version: getFirstMatch(/(?:mxios)[\s\/](\d+(?:\.\d+)+)/i)
}
}
else if (/epiphany/i.test(ua)) {
result = {
name: 'Epiphany'
, epiphany: t
, version: getFirstMatch(/(?:epiphany)[\s\/](\d+(?:\.\d+)+)/i)
}
}
else if (/puffin/i.test(ua)) {
result = {
name: 'Puffin'
, puffin: t
, version: getFirstMatch(/(?:puffin)[\s\/](\d+(?:\.\d+)?)/i)
}
}
else if (/sleipnir/i.test(ua)) {
result = {
name: 'Sleipnir'
, sleipnir: t
, version: getFirstMatch(/(?:sleipnir)[\s\/](\d+(?:\.\d+)+)/i)
}
}
else if (/k-meleon/i.test(ua)) {
result = {
name: 'K-Meleon'
, kMeleon: t
, version: getFirstMatch(/(?:k-meleon)[\s\/](\d+(?:\.\d+)+)/i)
}
}
else if (windowsphone) {
result = {
name: 'Windows Phone'
, windowsphone: t
}
if (edgeVersion) {
result.msedge = t
result.version = edgeVersion
}
else {
result.msie = t
result.version = getFirstMatch(/iemobile\/(\d+(\.\d+)?)/i)
}
}
else if (/msie|trident/i.test(ua)) {
result = {
name: 'Internet Explorer'
, msie: t
, version: getFirstMatch(/(?:msie |rv:)(\d+(\.\d+)?)/i)
}
} else if (chromeos) {
result = {
name: 'Chrome'
, chromeos: t
, chromeBook: t
, chrome: t
, version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)
}
} else if (/chrome.+? edge/i.test(ua)) {
result = {
name: 'Microsoft Edge'
, msedge: t
, version: edgeVersion
}
}
else if (/vivaldi/i.test(ua)) {
result = {
name: 'Vivaldi'
, vivaldi: t
, version: getFirstMatch(/vivaldi\/(\d+(\.\d+)?)/i) || versionIdentifier
}
}
else if (sailfish) {
result = {
name: 'Sailfish'
, sailfish: t
, version: getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i)
}
}
else if (/seamonkey\//i.test(ua)) {
result = {
name: 'SeaMonkey'
, seamonkey: t
, version: getFirstMatch(/seamonkey\/(\d+(\.\d+)?)/i)
}
}
else if (/firefox|iceweasel|fxios/i.test(ua)) {
result = {
name: 'Firefox'
, firefox: t
, version: getFirstMatch(/(?:firefox|iceweasel|fxios)[ \/](\d+(\.\d+)?)/i)
}
if (/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(ua)) {
result.firefoxos = t
}
}
else if (silk) {
result = {
name: 'Amazon Silk'
, silk: t
, version : getFirstMatch(/silk\/(\d+(\.\d+)?)/i)
}
}
else if (/phantom/i.test(ua)) {
result = {
name: 'PhantomJS'
, phantom: t
, version: getFirstMatch(/phantomjs\/(\d+(\.\d+)?)/i)
}
}
else if (/slimerjs/i.test(ua)) {
result = {
name: 'SlimerJS'
, slimer: t
, version: getFirstMatch(/slimerjs\/(\d+(\.\d+)?)/i)
}
}
else if (/blackberry|\bbb\d+/i.test(ua) || /rim\stablet/i.test(ua)) {
result = {
name: 'BlackBerry'
, blackberry: t
, version: versionIdentifier || getFirstMatch(/blackberry[\d]+\/(\d+(\.\d+)?)/i)
}
}
else if (webos) {
result = {
name: 'WebOS'
, webos: t
, version: versionIdentifier || getFirstMatch(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i)
};
if( /touchpad\//i.test(ua) ){
result.touchpad = t;
}
}
else if (/bada/i.test(ua)) {
result = {
name: 'Bada'
, bada: t
, version: getFirstMatch(/dolfin\/(\d+(\.\d+)?)/i)
};
}
else if (tizen) {
result = {
name: 'Tizen'
, tizen: t
, version: getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i) || versionIdentifier
};
}
else if (/qupzilla/i.test(ua)) {
result = {
name: 'QupZilla'
, qupzilla: t
, version: getFirstMatch(/(?:qupzilla)[\s\/](\d+(?:\.\d+)+)/i) || versionIdentifier
}
}
else if (/chromium/i.test(ua)) {
result = {
name: 'Chromium'
, chromium: t
, version: getFirstMatch(/(?:chromium)[\s\/](\d+(?:\.\d+)?)/i) || versionIdentifier
}
}
else if (/chrome|crios|crmo/i.test(ua)) {
result = {
name: 'Chrome'
, chrome: t
, version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)
}
}
else if (android) {
result = {
name: 'Android'
, version: versionIdentifier
}
}
else if (/safari|applewebkit/i.test(ua)) {
result = {
name: 'Safari'
, safari: t
}
if (versionIdentifier) {
result.version = versionIdentifier
}
}
else if (iosdevice) {
result = {
name : iosdevice == 'iphone' ? 'iPhone' : iosdevice == 'ipad' ? 'iPad' : 'iPod'
}
// WTF: version is not part of user agent in web apps
if (versionIdentifier) {
result.version = versionIdentifier
}
}
else if(/googlebot/i.test(ua)) {
result = {
name: 'Googlebot'
, googlebot: t
, version: getFirstMatch(/googlebot\/(\d+(\.\d+))/i) || versionIdentifier
}
}
else {
result = {
name: getFirstMatch(/^(.*)\/(.*) /),
version: getSecondMatch(/^(.*)\/(.*) /)
};
}
// set webkit or gecko flag for browsers based on these engines
if (!result.msedge && /(apple)?webkit/i.test(ua)) {
if (/(apple)?webkit\/537\.36/i.test(ua)) {
result.name = result.name || "Blink"
result.blink = t
} else {
result.name = result.name || "Webkit"
result.webkit = t
}
if (!result.version && versionIdentifier) {
result.version = versionIdentifier
}
} else if (!result.opera && /gecko\//i.test(ua)) {
result.name = result.name || "Gecko"
result.gecko = t
result.version = result.version || getFirstMatch(/gecko\/(\d+(\.\d+)?)/i)
}
// set OS flags for platforms that have multiple browsers
if (!result.msedge && (android || result.silk)) {
result.android = t
} else if (iosdevice) {
result[iosdevice] = t
result.ios = t
} else if (mac) {
result.mac = t
} else if (xbox) {
result.xbox = t
} else if (windows) {
result.windows = t
} else if (linux) {
result.linux = t
}
// OS version extraction
var osVersion = '';
if (result.windowsphone) {
osVersion = getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i);
} else if (iosdevice) {
osVersion = getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i);
osVersion = osVersion.replace(/[_\s]/g, '.');
} else if (android) {
osVersion = getFirstMatch(/android[ \/-](\d+(\.\d+)*)/i);
} else if (result.webos) {
osVersion = getFirstMatch(/(?:web|hpw)os\/(\d+(\.\d+)*)/i);
} else if (result.blackberry) {
osVersion = getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i);
} else if (result.bada) {
osVersion = getFirstMatch(/bada\/(\d+(\.\d+)*)/i);
} else if (result.tizen) {
osVersion = getFirstMatch(/tizen[\/\s](\d+(\.\d+)*)/i);
}
if (osVersion) {
result.osversion = osVersion;
}
// device type extraction
var osMajorVersion = osVersion.split('.')[0];
if (
tablet
|| nexusTablet
|| iosdevice == 'ipad'
|| (android && (osMajorVersion == 3 || (osMajorVersion >= 4 && !mobile)))
|| result.silk
) {
result.tablet = t
} else if (
mobile
|| iosdevice == 'iphone'
|| iosdevice == 'ipod'
|| android
|| nexusMobile
|| result.blackberry
|| result.webos
|| result.bada
) {
result.mobile = t
}
// Graded Browser Support
// http://developer.yahoo.com/yui/articles/gbs
if (result.msedge ||
(result.msie && result.version >= 10) ||
(result.yandexbrowser && result.version >= 15) ||
(result.vivaldi && result.version >= 1.0) ||
(result.chrome && result.version >= 20) ||
(result.firefox && result.version >= 20.0) ||
(result.safari && result.version >= 6) ||
(result.opera && result.version >= 10.0) ||
(result.ios && result.osversion && result.osversion.split(".")[0] >= 6) ||
(result.blackberry && result.version >= 10.1)
|| (result.chromium && result.version >= 20)
) {
result.a = t;
}
else if ((result.msie && result.version < 10) ||
(result.chrome && result.version < 20) ||
(result.firefox && result.version < 20.0) ||
(result.safari && result.version < 6) ||
(result.opera && result.version < 10.0) ||
(result.ios && result.osversion && result.osversion.split(".")[0] < 6)
|| (result.chromium && result.version < 20)
) {
result.c = t
} else result.x = t
return result
}
var bowser = detect(typeof navigator !== 'undefined' ? navigator.userAgent : '')
bowser.test = function (browserList) {
for (var i = 0; i < browserList.length; ++i) {
var browserItem = browserList[i];
if (typeof browserItem=== 'string') {
if (browserItem in bowser) {
return true;
}
}
}
return false;
}
/**
* Get version precisions count
*
* @example
* getVersionPrecision("1.10.3") // 3
*
* @param {string} version
* @return {number}
*/
function getVersionPrecision(version) {
return version.split(".").length;
}
/**
* Array::map polyfill
*
* @param {Array} arr
* @param {Function} iterator
* @return {Array}
*/
function map(arr, iterator) {
var result = [], i;
if (Array.prototype.map) {
return Array.prototype.map.call(arr, iterator);
}
for (i = 0; i < arr.length; i++) {
result.push(iterator(arr[i]));
}
return result;
}
/**
* Calculate browser version weight
*
* @example
* compareVersions(['1.10.2.1', '1.8.2.1.90']) // 1
* compareVersions(['1.010.2.1', '1.09.2.1.90']); // 1
* compareVersions(['1.10.2.1', '1.10.2.1']); // 0
* compareVersions(['1.10.2.1', '1.0800.2']); // -1
*
* @param {Array} versions versions to compare
* @return {Number} comparison result
*/
function compareVersions(versions) {
// 1) get common precision for both versions, for example for "10.0" and "9" it should be 2
var precision = Math.max(getVersionPrecision(versions[0]), getVersionPrecision(versions[1]));
var chunks = map(versions, function (version) {
var delta = precision - getVersionPrecision(version);
// 2) "9" -> "9.0" (for precision = 2)
version = version + new Array(delta + 1).join(".0");
// 3) "9.0" -> ["000000000"", "000000009"]
return map(version.split("."), function (chunk) {
return new Array(20 - chunk.length).join("0") + chunk;
}).reverse();
});
// iterate in reverse order by reversed chunks array
while (--precision >= 0) {
// 4) compare: "000000009" > "000000010" = false (but "9" > "10" = true)
if (chunks[0][precision] > chunks[1][precision]) {
return 1;
}
else if (chunks[0][precision] === chunks[1][precision]) {
if (precision === 0) {
// all version chunks are same
return 0;
}
}
else {
return -1;
}
}
}
/**
* Check if browser is unsupported
*
* @example
* bowser.isUnsupportedBrowser({
* msie: "10",
* firefox: "23",
* chrome: "29",
* safari: "5.1",
* opera: "16",
* phantom: "534"
* });
*
* @param {Object} minVersions map of minimal version to browser
* @param {Boolean} [strictMode = false] flag to return false if browser wasn't found in map
* @param {String} [ua] user agent string
* @return {Boolean}
*/
function isUnsupportedBrowser(minVersions, strictMode, ua) {
var _bowser = bowser;
// make strictMode param optional with ua param usage
if (typeof strictMode === 'string') {
ua = strictMode;
strictMode = void(0);
}
if (strictMode === void(0)) {
strictMode = false;
}
if (ua) {
_bowser = detect(ua);
}
var version = "" + _bowser.version;
for (var browser in minVersions) {
if (minVersions.hasOwnProperty(browser)) {
if (_bowser[browser]) {
// browser version and min supported version.
return compareVersions([version, minVersions[browser]]) < 0;
}
}
}
return strictMode; // not found
}
/**
* Check if browser is supported
*
* @param {Object} minVersions map of minimal version to browser
* @param {Boolean} [strictMode = false] flag to return false if browser wasn't found in map
* @param {String} [ua] user agent string
* @return {Boolean}
*/
function check(minVersions, strictMode, ua) {
return !isUnsupportedBrowser(minVersions, strictMode, ua);
}
bowser.isUnsupportedBrowser = isUnsupportedBrowser;
bowser.compareVersions = compareVersions;
bowser.check = check;
/*
* Set our detect method to the main bowser object so we can
* reuse it to test other user agents.
* This is needed to implement future tests.
*/
bowser._detect = detect;
return bowser
});
(function($){
UABBTrigger = {
/**
* Trigger a hook.
*
* @since 1.1.0.3
* @method triggerHook
* @param {String} hook The hook to trigger.
* @param {Array} args An array of args to pass to the hook.
*/
triggerHook: function( hook, args )
{
$( 'body' ).trigger( 'uabb-trigger.' + hook, args );
},
/**
* Add a hook.
*
* @since 1.1.0.3
* @method addHook
* @param {String} hook The hook to add.
* @param {Function} callback A function to call when the hook is triggered.
*/
addHook: function( hook, callback )
{
$( 'body' ).on( 'uabb-trigger.' + hook, callback );
},
/**
* Remove a hook.
*
* @since 1.1.0.3
* @method removeHook
* @param {String} hook The hook to remove.
* @param {Function} callback The callback function to remove.
*/
removeHook: function( hook, callback )
{
$( 'body' ).off( 'uabb-trigger.' + hook, callback );
},
};
})(jQuery);
jQuery(document).ready(function( $ ) {
if( typeof bowser !== 'undefined' && bowser !== null ) {
var uabb_browser = bowser.name,
uabb_browser_v = bowser.version,
uabb_browser_class = uabb_browser.replace(/\s+/g, '-').toLowerCase(),
uabb_browser_v_class = uabb_browser_class + parseInt( uabb_browser_v );
$('html').addClass(uabb_browser_class).addClass(uabb_browser_v_class);
}
$('.uabb-row-separator').parents('html').css('overflow-x', 'hidden');
});
(function($) {
$(function() {
new FLBuilderMenu({
id: '5f283fc885cc3',
type: 'vertical',
mobile: 'expanded',
mobileBelowRow: true,
mobileFlyout: false,
breakPoints: {
large: 1200,
medium: 1024,
small: 640 },
mobileBreakpoint: 'mobile',
postId : '718',
mobileStacked: true,
});
});
})(jQuery);
jQuery(function($) {
$(function() {
$( '.fl-node-5f2848a540c22 .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-5f2849cc1968b .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-5f284b0d5d4d8 .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: '5f28513342a24',
type: 'vertical',
mobile: 'expanded',
mobileBelowRow: true,
mobileFlyout: false,
breakPoints: {
large: 1200,
medium: 1024,
small: 640 },
mobileBreakpoint: 'mobile',
postId : '718',
mobileStacked: true,
});
});
})(jQuery);
jQuery(function($) {
$(function() {
$( '.fl-node-5f2980dbc0441 .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-5f2980eb00125 .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 Layout Custom JS */
/* End Layout Custom JS */