PageSourceSearch

https://www.oeh-salzburg.at/wp-content/uploads/_bb-plugin/cache/19…?ver=a181781c980b853ef1344e44d20712ea

js oeh-salzburg.at collected 2026-10-01 12:32:06 UTC 41,051 bytes, 1,540 lines download raw bytes

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

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.