PageSourceSearch

https://www.nenwell.com/uploads/bb-plugin/cache/8648-layout.js?ver=2fcd5b08579d15eb3319ba43753c1938

js nenwell.com collected 2026-10-05 04:00:44 UTC 36,078 bytes, 1,470 lines download raw bytes

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

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.