增材制造
助力下一代增材制造工具。
从挤压成型到点胶,再到激光烧结,我们拥有丰富的经验和专业技术,可确保您的下一代增材制造机器引领全新的精度水平。
支持下一级 FDM
在全球所有运动供应商中,我们拥有更高的产能与精度比率。我们提供集成控制工具以协调材料挤压与运动控制。
"../../wp-content/uploads/sites/5/2022/05/Supporting-the-Next-Level-of-EDM-scaled-2.jpg"div> ../../wp-content/uploads/sites/5/2022/05/Supporting-the-Next-Level-of-EDM-scaled-2.jpge-text__../../wp-content/uploads/sites/5/2022/05/Supporting-the-Next-Level-of-EDM-scaled-2-300x200.jpgce="tru../../wp-content/uploads/sites/5/2022/05/Supporting-the-Next-Level-of-EDM-scaled-2-1024x683.jpg" width=../../wp-content/uploads/sites/5/2022/05/Supporting-the-Next-Level-of-EDM-scaled-2-768x512.jpg" class../../wp-content/uploads/sites/5/2022/05/Supporting-the-Next-Level-of-EDM-scaled-2-1536x1024.jpg.jpg 256../../wp-content/uploads/sites/5/2022/05/Supporting-the-Next-Level-of-EDM-scaled-2-2048x1366.jpgcontent/../../wp-content/uploads/sites/5/2022/05/Supporting-the-Next-Level-of-EDM-scaled-2-600x400.jpgites/5/../../wp-content/uploads/sites/5/2022/05/Supporting-the-Next-Level-of-EDM-scaled-2-225x150.jpgporting-the-Next-Level-of-EDM-scaled-2-1536x1024.jpg 1536w, ../../wp-content/uploads/sites/5/2022/05/Supporting-the-Next-Level-of-EDM-scaled-2-2048x1366.jpg 2048w, ../../wp-content/uploads/sites/5/2022/05/Supporting-the-Next-Level-of-EDM-scaled-2-600x400.jpg 600w, ../../wp-content/uploads/sites/5/2022/0"../../wp-content/themes/beaverwarrior-backup/fx-assets/imgs/grey-logo-bg.png"2560px" />通过激光烧结达成真正所需的精度
我们提供市面上更准确和能力更强大的激光扫描系统。对于敏感材料加工,我们通过调制激光脉冲频率、功率和能量的软件功能提高可控性。
支持柔性电子和生物打印
我们的控制器为复杂几何图形的打印提供集成的运动控制动态方案。我们拥有使用自身的集成控制工具来调整流量与运动控制的微点胶经验。
"../../wp-content/themes/beaverwarrior-backup/fx-assets/imgs/grey-logo-bg.png"up/fx-assets/imgs/grey-logo-bg.png" alt="Aerotech Icon gray" class="row-logo-img">
相关产品
View
Vi../../wp-content/uploads/sites/5/2022/09/Gantries-900x667-1-225x167.jpg
../../wp-content/uploads/sites/5/2022/09/Motors-900x667-1-768x569.jpgn>
../../wp-content/uploads/sites/5/2022/09/Motors-900x667-1-600x445.jpg
../../wp-content/uploads/sites/5/2022/09/CustomEngineeredSystems-900x667-1.jpg ../../wp-content/uploads/sites/5/2022/09/CustomEngineeredSystems-900x667-1-300x222.jpgv>
../../wp-content/uploads/sites/5/2022/09/CustomEngineeredSystems-900x667-1-768x569.jpg
"../../wp-content/themes/beaverwarrior-backup/fx-assets/css/innerpage/half-image-half-content.css"se64":false,"ajaxurl":"https:\/\/cn.aerotech.com\/wp-admin\/admin-ajax"../../wp-content/themes/beaverwarrior-backup/fx-assets/css/innerpage/related-products.css":"current_add.rf","utm_campaign":"current.cmp","utm_source":"cu"../../wp-content/themes/beaverwarrior-backup/fx-assets/css/innerpage/cta-block.css"rrent.trm","utm_source_platf"../../wp-includes/js/comment-reply.min.js"arketing_tactic":"current.tct","session_entry":"current_add.ep","session_start_time":"current_add.fd","session_pages":"session.pgs","session_count":"udata.vst","user_agent":"udata.uag"}};
"../../wp-content/plugins/ubermenu/assets/js/ubermenu.min.js"js" id="custom-fx-js-js">
= 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,
/**
* Breakpoint for"../../careers-cn/index.html"
*
* @since 1.4
* @property {String} stickyOn
*/
stickyOn: '',
/**
* A reference of the sticky and shrink he"../../careers-cn/index.html".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 */
自动化集成系统
../../wp-content/uploads/sites/5/2022/09/IntegratedAutomationSystems-900x667-1.jpg ../../wp-content/uploads/sites/5/2022/09/IntegratedAutomationSystems-900x667-1-300x222.jpgn class../../wp-content/uploads/sites/5/2022/09/IntegratedAutomationSystems-900x667-1-768x569.jpgp-conte../../wp-content/uploads/sites/5/2022/09/IntegratedAutomationSystems-900x667-1-600x445.jpgtent/up../../wp-content/uploads/sites/5/2022/09/IntegratedAutomationSystems-900x667-1-225x167.jpg300x95.jpg 300w, ../../wp-content/uploads/sites/5/2022/05/CTA-min-scaled-1-1024x323.jpg 1024w, ../../wp-content/uploads/sites/5/2022/05/CTA-min-scaled-1-768x242.jpg 768w, ../../wp-content/uploads/sites/5/2022/05/CTA-min-scaled-1-1536x484.jpg 1536w, ../../wp-content/uploads/sites/5/2022/05/CTA-min-scaled-1-2048x646.jpg 2048w, ../../wp-content/uploads/sites/5/2022/05/CTA-min-scaled-1-600x189.jpg 600w, ../../wp-content/uploads/sites/5/2022/05/CTA-min-scaled-1-225x71.jpg 225w" sizes"../../wp-content/uploads/sites/5/2022/05/CTA-min-scaled-1.jpg"lass="cta__full-wrap text-center">
<../../wp-content/uploads/sites/5/2022/05/CTA-min-scaled-1.jpg ../../wp-content/uploads/sites/5/2022/05/CTA-min-scaled-1-300x95.jpg 请../../wp-content/uploads/sites/5/2022/05/CTA-min-scaled-1-768x242.jpg