PageSourceSearch

https://byfaithonline.com/wp-content/uploads/bb-plugin/cache/99b98…ece92554-layout-bundle.js?ver=2.9.1.1-1.6.1

js byfaithonline.com collected 2026-10-02 05:17:13 UTC 83,997 bytes, 2,861 lines download raw bytes

vendor: 14,874 bytes, lines 1-513
1/*!
2 * Bowser - a browser detector
3 * https://github.com/ded/bowser
4 * MIT License | (c) Dustin Diaz 2015
5 */
6
7!function (name, definition) {
8  if (typeof module != 'undefined' && module.exports) module.exports = definition()
9  else if (typeof define == 'function' && define.amd) define(name, definition)
10  else this[name] = definition()
11}('bowser', function () {
12  /**
13    * See useragents.js for examples of navigator.userAgent
14    */
15
16  var t = true
17
18  function detect(ua) {
19
20    function getFirstMatch(regex) {
21      var match = ua.match(regex);
22      return (match && match.length > 1 && match[1]) || '';
23    }
24
25    function getSecondMatch(regex) {
26      var match = ua.match(regex);
27      return (match && match.length > 1 && match[2]) || '';
28    }
29
30    var iosdevice = getFirstMatch(/(ipod|iphone|ipad)/i).toLowerCase()
31      , likeAndroid = /like android/i.test(ua)
32      , android = !likeAndroid && /android/i.test(ua)
33      , nexusMobile = /nexus\s*[0-6]\s*/i.test(ua)
34      , nexusTablet = !nexusMobile && /nexus\s*[0-9]+/i.test(ua)
35      , chromeos = /CrOS/.test(ua)
36      , silk = /silk/i.test(ua)
37      , sailfish = /sailfish/i.test(ua)
38      , tizen = /tizen/i.test(ua)
39      , webos = /(web|hpw)os/i.test(ua)
40      , windowsphone = /windows phone/i.test(ua)
41      , windows = !windowsphone && /windows/i.test(ua)
42      , mac = !iosdevice && !silk && /macintosh/i.test(ua)
43      , linux = !android && !sailfish && !tizen && !webos && /linux/i.test(ua)
44      , edgeVersion = getFirstMatch(/edge\/(\d+(\.\d+)?)/i)
45      , versionIdentifier = getFirstMatch(/version\/(\d+(\.\d+)?)/i)
46      , tablet = /tablet/i.test(ua)
47      , mobile = !tablet && /[^-]mobi/i.test(ua)
48      , xbox = /xbox/i.test(ua)
49      , result
50
51    if (/opera|opr|opios/i.test(ua)) {
52      result = {
53        name: 'Opera'
54      , opera: t
55      , version: versionIdentifier || getFirstMatch(/(?:opera|opr|opios)[\s\/](\d+(\.\d+)?)/i)
56      }
57    }
58    else if (/coast/i.test(ua)) {
59      result = {
60        name: 'Opera Coast'
61        , coast: t
62        , version: versionIdentifier || getFirstMatch(/(?:coast)[\s\/](\d+(\.\d+)?)/i)
63      }
64    }
65    else if (/yabrowser/i.test(ua)) {
66      result = {
67        name: 'Yandex Browser'
68      , yandexbrowser: t
69      , version: versionIdentifier || getFirstMatch(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i)
70      }
71    }
72    else if (/ucbrowser/i.test(ua)) {
73      result = {
74          name: 'UC Browser'
75        , ucbrowser: t
76        , version: getFirstMatch(/(?:ucbrowser)[\s\/](\d+(?:\.\d+)+)/i)
77      }
78    }
79    else if (/mxios/i.test(ua)) {
80      result = {
81        name: 'Maxthon'
82        , maxthon: t
83        , version: getFirstMatch(/(?:mxios)[\s\/](\d+(?:\.\d+)+)/i)
84      }
85    }
86    else if (/epiphany/i.test(ua)) {
87      result = {
88        name: 'Epiphany'
89        , epiphany: t
90        , version: getFirstMatch(/(?:epiphany)[\s\/](\d+(?:\.\d+)+)/i)
91      }
92    }
93    else if (/puffin/i.test(ua)) {
94      result = {
95        name: 'Puffin'
96        , puffin: t
97        , version: getFirstMatch(/(?:puffin)[\s\/](\d+(?:\.\d+)?)/i)
98      }
99    }
100    else if (/sleipnir/i.test(ua)) {
101      result = {
102        name: 'Sleipnir'
103        , sleipnir: t
104        , version: getFirstMatch(/(?:sleipnir)[\s\/](\d+(?:\.\d+)+)/i)
105      }
106    }
107    else if (/k-meleon/i.test(ua)) {
108      result = {
109        name: 'K-Meleon'
110        , kMeleon: t
111        , version: getFirstMatch(/(?:k-meleon)[\s\/](\d+(?:\.\d+)+)/i)
112      }
113    }
114    else if (windowsphone) {
115      result = {
116        name: 'Windows Phone'
117      , windowsphone: t
118      }
119      if (edgeVersion) {
120        result.msedge = t
121        result.version = edgeVersion
122      }
123      else {
124        result.msie = t
125        result.version = getFirstMatch(/iemobile\/(\d+(\.\d+)?)/i)
126      }
127    }
128    else if (/msie|trident/i.test(ua)) {
129      result = {
130        name: 'Internet Explorer'
131      , msie: t
132      , version: getFirstMatch(/(?:msie |rv:)(\d+(\.\d+)?)/i)
133      }
134    } else if (chromeos) {
135      result = {
136        name: 'Chrome'
137      , chromeos: t
138      , chromeBook: t
139      , chrome: t
140      , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)
141      }
142    } else if (/chrome.+? edge/i.test(ua)) {
143      result = {
144        name: 'Microsoft Edge'
145      , msedge: t
146      , version: edgeVersion
147      }
148    }
149    else if (/vivaldi/i.test(ua)) {
150      result = {
151        name: 'Vivaldi'
152        , vivaldi: t
153        , version: getFirstMatch(/vivaldi\/(\d+(\.\d+)?)/i) || versionIdentifier
154      }
155    }
156    else if (sailfish) {
157      result = {
158        name: 'Sailfish'
159      , sailfish: t
160      , version: getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i)
161      }
162    }
163    else if (/seamonkey\//i.test(ua)) {
164      result = {
165        name: 'SeaMonkey'
166      , seamonkey: t
167      , version: getFirstMatch(/seamonkey\/(\d+(\.\d+)?)/i)
168      }
169    }
170    else if (/firefox|iceweasel|fxios/i.test(ua)) {
171      result = {
172        name: 'Firefox'
173      , firefox: t
174      , version: getFirstMatch(/(?:firefox|iceweasel|fxios)[ \/](\d+(\.\d+)?)/i)
175      }
176      if (/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(ua)) {
177        result.firefoxos = t
178      }
179    }
180    else if (silk) {
181      result =  {
182        name: 'Amazon Silk'
183      , silk: t
184      , version : getFirstMatch(/silk\/(\d+(\.\d+)?)/i)
185      }
186    }
187    else if (/phantom/i.test(ua)) {
188      result = {
189        name: 'PhantomJS'
190      , phantom: t
191      , version: getFirstMatch(/phantomjs\/(\d+(\.\d+)?)/i)
192      }
193    }
194    else if (/slimerjs/i.test(ua)) {
195      result = {
196        name: 'SlimerJS'
197        , slimer: t
198        , version: getFirstMatch(/slimerjs\/(\d+(\.\d+)?)/i)
199      }
200    }
201    else if (/blackberry|\bbb\d+/i.test(ua) || /rim\stablet/i.test(ua)) {
202      result = {
203        name: 'BlackBerry'
204      , blackberry: t
205      , version: versionIdentifier || getFirstMatch(/blackberry[\d]+\/(\d+(\.\d+)?)/i)
206      }
207    }
208    else if (webos) {
209      result = {
210        name: 'WebOS'
211      , webos: t
212      , version: versionIdentifier || getFirstMatch(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i)
213      };
214      if( /touchpad\//i.test(ua) ){
215        result.touchpad = t;
216      }
217    }
218    else if (/bada/i.test(ua)) {
219      result = {
220        name: 'Bada'
221      , bada: t
222      , version: getFirstMatch(/dolfin\/(\d+(\.\d+)?)/i)
223      };
224    }
225    else if (tizen) {
226      result = {
227        name: 'Tizen'
228      , tizen: t
229      , version: getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i) || versionIdentifier
230      };
231    }
232    else if (/qupzilla/i.test(ua)) {
233      result = {
234        name: 'QupZilla'
235        , qupzilla: t
236        , version: getFirstMatch(/(?:qupzilla)[\s\/](\d+(?:\.\d+)+)/i) || versionIdentifier
237      }
238    }
239    else if (/chromium/i.test(ua)) {
240      result = {
241        name: 'Chromium'
242        , chromium: t
243        , version: getFirstMatch(/(?:chromium)[\s\/](\d+(?:\.\d+)?)/i) || versionIdentifier
244      }
245    }
246    else if (/chrome|crios|crmo/i.test(ua)) {
247      result = {
248        name: 'Chrome'
249        , chrome: t
250        , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)
251      }
252    }
253    else if (android) {
254      result = {
255        name: 'Android'
256        , version: versionIdentifier
257      }
258    }
259    else if (/safari|applewebkit/i.test(ua)) {
260      result = {
261        name: 'Safari'
262      , safari: t
263      }
264      if (versionIdentifier) {
265        result.version = versionIdentifier
266      }
267    }
268    else if (iosdevice) {
269      result = {
270        name : iosdevice == 'iphone' ? 'iPhone' : iosdevice == 'ipad' ? 'iPad' : 'iPod'
271      }
272      // WTF: version is not part of user agent in web apps
273      if (versionIdentifier) {
274        result.version = versionIdentifier
275      }
276    }
277    else if(/googlebot/i.test(ua)) {
278      result = {
279        name: 'Googlebot'
280      , googlebot: t
281      , version: getFirstMatch(/googlebot\/(\d+(\.\d+))/i) || versionIdentifier
282      }
283    }
284    else {
285      result = {
286        name: getFirstMatch(/^(.*)\/(.*) /),
287        version: getSecondMatch(/^(.*)\/(.*) /)
288     };
289   }
290
291    // set webkit or gecko flag for browsers based on these engines
292    if (!result.msedge && /(apple)?webkit/i.test(ua)) {
293      if (/(apple)?webkit\/537\.36/i.test(ua)) {
294        result.name = result.name || "Blink"
295        result.blink = t
296      } else {
297        result.name = result.name || "Webkit"
298        result.webkit = t
299      }
300      if (!result.version && versionIdentifier) {
301        result.version = versionIdentifier
302      }
303    } else if (!result.opera && /gecko\//i.test(ua)) {
304      result.name = result.name || "Gecko"
305      result.gecko = t
306      result.version = result.version || getFirstMatch(/gecko\/(\d+(\.\d+)?)/i)
307    }
308
309    // set OS flags for platforms that have multiple browsers
310    if (!result.msedge && (android || result.silk)) {
311      result.android = t
312    } else if (iosdevice) {
313      result[iosdevice] = t
314      result.ios = t
315    } else if (mac) {
316      result.mac = t
317    } else if (xbox) {
318      result.xbox = t
319    } else if (windows) {
320      result.windows = t
321    } else if (linux) {
322      result.linux = t
323    }
324
325    // OS version extraction
326    var osVersion = '';
327    if (result.windowsphone) {
328      osVersion = getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i);
329    } else if (iosdevice) {
330      osVersion = getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i);
331      osVersion = osVersion.replace(/[_\s]/g, '.');
332    } else if (android) {
333      osVersion = getFirstMatch(/android[ \/-](\d+(\.\d+)*)/i);
334    } else if (result.webos) {
335      osVersion = getFirstMatch(/(?:web|hpw)os\/(\d+(\.\d+)*)/i);
336    } else if (result.blackberry) {
337      osVersion = getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i);
338    } else if (result.bada) {
339      osVersion = getFirstMatch(/bada\/(\d+(\.\d+)*)/i);
340    } else if (result.tizen) {
341      osVersion = getFirstMatch(/tizen[\/\s](\d+(\.\d+)*)/i);
342    }
343    if (osVersion) {
344      result.osversion = osVersion;
345    }
346
347    // device type extraction
348    var osMajorVersion = osVersion.split('.')[0];
349    if (
350         tablet
351      || nexusTablet
352      || iosdevice == 'ipad'
353      || (android && (osMajorVersion == 3 || (osMajorVersion >= 4 && !mobile)))
354      || result.silk
355    ) {
356      result.tablet = t
357    } else if (
358         mobile
359      || iosdevice == 'iphone'
360      || iosdevice == 'ipod'
361      || android
362      || nexusMobile
363      || result.blackberry
364      || result.webos
365      || result.bada
366    ) {
367      result.mobile = t
368    }
369
370    // Graded Browser Support
371    // http://developer.yahoo.com/yui/articles/gbs
372    if (result.msedge ||
373        (result.msie && result.version >= 10) ||
374        (result.yandexbrowser && result.version >= 15) ||
375		    (result.vivaldi && result.version >= 1.0) ||
376        (result.chrome && result.version >= 20) ||
377        (result.firefox && result.version >= 20.0) ||
378        (result.safari && result.version >= 6) ||
379        (result.opera && result.version >= 10.0) ||
380        (result.ios && result.osversion && result.osversion.split(".")[0] >= 6) ||
381        (result.blackberry && result.version >= 10.1)
382        || (result.chromium && result.version >= 20)
383        ) {
384      result.a = t;
385    }
386    else if ((result.msie && result.version < 10) ||
387        (result.chrome && result.version < 20) ||
388        (result.firefox && result.version < 20.0) ||
389        (result.safari && result.version < 6) ||
390        (result.opera && result.version < 10.0) ||
391        (result.ios && result.osversion && result.osversion.split(".")[0] < 6)
392        || (result.chromium && result.version < 20)
393        ) {
394      result.c = t
395    } else result.x = t
396
397    return result
398  }
399
400  var bowser = detect(typeof navigator !== 'undefined' ? navigator.userAgent : '')
401
402  bowser.test = function (browserList) {
403    for (var i = 0; i < browserList.length; ++i) {
404      var browserItem = browserList[i];
405      if (typeof browserItem=== 'string') {
406        if (browserItem in bowser) {
407          return true;
408        }
409      }
410    }
411    return false;
412  }
413
414  /**
415   * Get version precisions count
416   *
417   * @example
418   *   getVersionPrecision("1.10.3") // 3
419   *
420   * @param  {string} version
421   * @return {number}
422   */
423  function getVersionPrecision(version) {
424    return version.split(".").length;
425  }
426
427  /**
428   * Array::map polyfill
429   *
430   * @param  {Array} arr
431   * @param  {Function} iterator
432   * @return {Array}
433   */
434  function map(arr, iterator) {
435    var result = [], i;
436    if (Array.prototype.map) {
437      return Array.prototype.map.call(arr, iterator);
438    }
439    for (i = 0; i < arr.length; i++) {
440      result.push(iterator(arr[i]));
441    }
442    return result;
443  }
444
445  /**
446   * Calculate browser version weight
447   *
448   * @example
449   *   compareVersions(['1.10.2.1',  '1.8.2.1.90'])    // 1
450   *   compareVersions(['1.010.2.1', '1.09.2.1.90']);  // 1
451   *   compareVersions(['1.10.2.1',  '1.10.2.1']);     // 0
452   *   compareVersions(['1.10.2.1',  '1.0800.2']);     // -1
453   *
454   * @param  {Array<String>} versions versions to compare
455   * @return {Number} comparison result
456   */
457  function compareVersions(versions) {
458    // 1) get common precision for both versions, for example for "10.0" and "9" it should be 2
459    var precision = Math.max(getVersionPrecision(versions[0]), getVersionPrecision(versions[1]));
460    var chunks = map(versions, function (version) {
461      var delta = precision - getVersionPrecision(version);
462
463      // 2) "9" -> "9.0" (for precision = 2)
464      version = version + new Array(delta + 1).join(".0");
465
466      // 3) "9.0" -> ["000000000"", "000000009"]
467      return map(version.split("."), function (chunk) {
468        return new Array(20 - chunk.length).join("0") + chunk;
469      }).reverse();
470    });
471
472    // iterate in reverse order by reversed chunks array
473    while (--precision >= 0) {
474      // 4) compare: "000000009" > "000000010" = false (but "9" > "10" = true)
475      if (chunks[0][precision] > chunks[1][precision]) {
476        return 1;
477      }
478      else if (chunks[0][precision] === chunks[1][precision]) {
479        if (precision === 0) {
480          // all version chunks are same
481          return 0;
482        }
483      }
484      else {
485        return -1;
486      }
487    }
488  }
489
490  /**
491   * Check if browser is unsupported
492   *
493   * @example
494   *   bowser.isUnsupportedBrowser({
495   *     msie: "10",
496   *     firefox: "23",
497   *     chrome: "29",
498   *     safari: "5.1",
499   *     opera: "16",
500   *     phantom: "534"
501   *   });
502   *
503   * @param  {Object}  minVersions map of minimal version to browser
504   * @param  {Boolean} [strictMode = false] flag to return false if browser wasn't found in map
505   * @param  {String}  [ua] user agent string
506   * @return {Boolean}
507   */
508  function isUnsupportedBrowser(minVersions, strictMode, ua) {
509    var _bowser = bowser;
510
511    // make strictMode param optional with ua param usage
512    if (typeof strictMode === 'string') {
513      ua = strictMode;
514      strictMode = void(0);
515    }
516
517    if (strictMode === void(0)) {
518      strictMode = false;
519    }
520    if (ua) {
521      _bowser = detect(ua);
522    }
523
524    var version = "" + _bowser.version;
525    for (var browser in minVersions) {
526      if (minVersions.hasOwnProperty(browser)) {
527        if (_bowser[browser]) {
528          // browser version and min supported version.
529          return compareVersions([version, minVersions[browser]]) < 0;
530        }
531      }
532    }
533
534    return strictMode; // not found
535  }
536
537  /**
538   * Check if browser is supported
539   *
540   * @param  {Object} minVersions map of minimal version to browser
541   * @param  {Boolean} [strictMode = false] flag to return false if browser wasn't found in map
542   * @param  {String}  [ua] user agent string
543   * @return {Boolean}
544   */
545  function check(minVersions, strictMode, ua) {
546    return !isUnsupportedBrowser(minVersions, strictMode, ua);
547  }
548
549  bowser.isUnsupportedBrowser = isUnsupportedBrowser;
550  bowser.compareVersions = compareVersions;
551  bowser.check = check;
552
553  /*
554   * Set our detect method to the main bowser object so we can
555   * reuse it to test other user agents.
556   * This is needed to implement future tests.
557   */
558  bowser._detect = detect;
559
560  return bowser
561});
562
563(function($){
564  UABBTrigger = {
565
566      /**
567       * Trigger a hook.
568       *
569       * @since 1.1.0.3
570       * @method triggerHook
571       * @param {String} hook The hook to trigger.
572       * @param {Array} args An array of args to pass to the hook.
573       */
574      triggerHook: function( hook, args )
575      {
576        $( 'body' ).trigger( 'uabb-trigger.' + hook, args );
577      },
578    
579      /**
580       * Add a hook.
581       *
582       * @since 1.1.0.3
583       * @method addHook
584       * @param {String} hook The hook to add.
585       * @param {Function} callback A function to call when the hook is triggered.
586       */
587      addHook: function( hook, callback )
588      {
589        $( 'body' ).on( 'uabb-trigger.' + hook, callback );
590      },
591    
592      /**
593       * Remove a hook.
594       *
595       * @since 1.1.0.3
596       * @method removeHook
597       * @param {String} hook The hook to remove.
598       * @param {Function} callback The callback function to remove.
599       */
600      removeHook: function( hook, callback )
601      {
602        $( 'body' ).off( 'uabb-trigger.' + hook, callback );
603      },
604  };
605})(jQuery);
606
607jQuery(document).ready(function( $ ) {
608
609    if( typeof bowser !== 'undefined' && bowser !== null ) {
610
611      var uabb_browser   = bowser.name,
612          uabb_browser_v = bowser.version,
613          uabb_browser_class = uabb_browser.replace(/\s+/g, '-').toLowerCase(),
614          uabb_browser_v_class = uabb_browser_class + parseInt( uabb_browser_v );
615      
616      $('html').addClass(uabb_browser_class).addClass(uabb_browser_v_class);
617      
618    }
619
620    $('.uabb-row-separator').parents('html').css('overflow-x', 'hidden');
621});
622var wpAjaxUrl = 'https://byfaithonline.com/wp-admin/admin-ajax.php';var flBuilderUrl = 'https://byfaithonline.com/wp-content/plugins/bb-plugin/';var FLBuilderLayoutConfig = {
623	anchorLinkAnimations : {
624		duration 	: 1000,
625		easing		: 'swing',
626		offset 		: 100
627	},
628	paths : {
629		pluginUrl : 'https://byfaithonline.com/wp-content/plugins/bb-plugin/',
630		wpAjaxUrl : 'https://byfaithonline.com/wp-admin/admin-ajax.php'
631	},
632	breakpoints : {
633		small  : 768,
634		medium : 992,
635		large : 1200	},
636	waypoint: {
637		offset: 80
638	},
639	emptyColWidth: '0%'
640};
641(function($){
642
643	if(typeof FLBuilderLayout != 'undefined') {
644		return;
645	}
646
647	/**
648	 * Helper class with generic logic for a builder layout.
649	 *
650	 * @class FLBuilderLayout
651	 * @since 1.0
652	 */
653	FLBuilderLayout = {
654
655		/**
656		 * Initializes a builder layout.
657		 *
658		 * @since 1.0
659		 * @method init
660		 */
661		init: function()
662		{
663			// Destroy existing layout events.
664			FLBuilderLayout._destroy();
665
666			// Init CSS classes.
667			FLBuilderLayout._initClasses();
668
669			// Init backgrounds.
670			FLBuilderLayout._initBackgrounds();
671
672			// Init row shape layer height.
673			FLBuilderLayout._initRowShapeLayerHeight();
674
675			// Only init if the builder isn't active.
676			if ( 0 === $('.fl-builder-edit').length ) {
677
678				// Init anchor links.
679				FLBuilderLayout._initAnchorLinks();
680
681				// Init the browser hash.
682				FLBuilderLayout._initHash();
683
684				// Init forms.
685				FLBuilderLayout._initForms();
686
687				FLBuilderLayout._reorderMenu();
688			}
689			else {
690				FLBuilderLayout._initNestedColsWidth();
691			}
692			$('body').removeClass( 'fl-no-js' );
693		},
694
695		/**
696		 * Public method for refreshing Wookmark or MosaicFlow galleries
697		 * within an element.
698		 *
699		 * @since 1.7.4
700		 * @method refreshGalleries
701		 */
702		refreshGalleries: function( element )
703		{
704			var $element  = 'undefined' == typeof element ? $( 'body' ) : $( element ),
705				mfContent = $element.find( '.fl-mosaicflow-content' ),
706				wmContent = $element.find( '.fl-gallery' ),
707				mfObject  = null;
708
709			if ( mfContent ) {
710
711				mfObject = mfContent.data( 'mosaicflow' );
712
713				if ( mfObject ) {
714					mfObject.columns = $( [] );
715					mfObject.columnsHeights = [];
716					mfContent.data( 'mosaicflow', mfObject );
717					mfContent.mosaicflow( 'refill' );
718				}
719			}
720			if ( wmContent ) {
721				wmContent.trigger( 'refreshWookmark' );
722			}
723		},
724
725		/**
726		 * Public method for refreshing Masonry within an element
727		 *
728		 * @since 1.8.1
729		 * @method refreshGridLayout
730		 */
731		refreshGridLayout: function( element )
732		{
733			var $element 		= 'undefined' == typeof element ? $( 'body' ) : $( element ),
734				msnryContent	= $element.find('.masonry');
735
736			if ( msnryContent.length )	{
737				msnryContent.masonry('layout');
738			}
739		},
740
741		/**
742		 * Public method for reloading BxSlider within an element
743		 *
744		 * @since 1.8.1
745		 * @method reloadSlider
746		 */
747		reloadSlider: function( content )
748		{
749			var $content = 'undefined' == typeof content ? $('body') : $(content);
750
751			// reload sliders.
752			if ($content.find('.bx-viewport > div').length > 0) {
753				$.each($content.find('.bx-viewport > div'), function (key, slider) {
754					setTimeout(function () {
755						$(slider).data('bxSlider').reloadSlider();
756					}, 100);
757				});
758			}
759		},
760
761		/**
762		 * Public method for resizing WP audio player
763		 *
764		 * @since 1.8.2
765		 * @method resizeAudio
766		 */
767		resizeAudio: function( element )
768		{
769			var $element 	 	= 'undefined' == typeof element ? $( 'body' ) : $( element ),
770				audioPlayers 	= $element.find('.wp-audio-shortcode.mejs-audio'),
771				player 		 	= null,
772				mejsPlayer 	 	= null,
773				rail 			= null,
774				railWidth 		= 400;
775
776			if ( audioPlayers.length && typeof mejs !== 'undefined' ) {
777            	audioPlayers.each(function(){
778	            	player 		= $(this);
779	            	mejsPlayer 	= mejs.players[player.attr('id')];
780	            	rail 		= player.find('.mejs-controls .mejs-time-rail');
781	            	var innerMejs = player.find('.mejs-inner'),
782	            		total 	  = player.find('.mejs-controls .mejs-time-total');
783
784	            	if ( typeof mejsPlayer !== 'undefined' ) {
785	            		railWidth = Math.ceil(player.width() * 0.8);
786
787	            		if ( innerMejs.length ) {
788
789		            		rail.css('width', railWidth +'px!important');
790		            		//total.width(rail.width() - 10);
791
792		            		mejsPlayer.options.autosizeProgress = true;
793
794		            		// webkit has trouble doing this without a delay
795							setTimeout(function () {
796								mejsPlayer.setControlsSize();
797							}, 50);
798
799			            	player.find('.mejs-inner').css({
800			            		visibility: 'visible',
801			            		height: 'inherit'
802			            	});
803		            	}
804		           	}
805	            });
806	        }
807		},
808
809		/**
810		 * Public method for preloading WP audio player when it's inside the hidden element
811		 *
812		 * @since 1.8.2
813		 * @method preloadAudio
814		 */
815		preloadAudio: function(element)
816		{
817			var $element 	 = 'undefined' == typeof element ? $( 'body' ) : $( element ),
818				contentWrap  = $element.closest('.fl-accordion-item'),
819				audioPlayers = $element.find('.wp-audio-shortcode.mejs-audio');
820
821			if ( ! contentWrap.hasClass('fl-accordion-item-active') && audioPlayers.find('.mejs-inner').length ) {
822				audioPlayers.find('.mejs-inner').css({
823					visibility : 'hidden',
824					height: 0
825				});
826			}
827		},
828
829		/**
830		 * Public method for resizing slideshow momdule within the tab
831		 *
832		 * @since 1.10.5
833		 * @method resizeSlideshow
834		 */
835		resizeSlideshow: function(){
836			if(typeof YUI !== 'undefined') {
837				YUI().use('node-event-simulate', function(Y) {
838					Y.one(window).simulate("resize");
839				});
840			}
841		},
842
843		/**
844		 * Public method for reloading an embedded Google Map within the tabs or hidden element.
845		 *
846		 * @since 2.2
847		 * @method reloadGoogleMap
848		 */
849		reloadGoogleMap: function(element){
850			var $element  = 'undefined' == typeof element ? $( 'body' ) : $( element ),
851			    googleMap = $element.find( 'iframe[src*="google.com/maps"]' );
852
853			if ( googleMap.length ) {
854			    googleMap.attr( 'src', function(i, val) {
855			        return val;
856			    });
857			}
858		},
859
860		/**
861		 * Unbinds builder layout events.
862		 *
863		 * @since 1.0
864		 * @access private
865		 * @method _destroy
866		 */
867		_destroy: function()
868		{
869			var win = $(window);
870
871			win.off('scroll.fl-bg-parallax');
872			win.off('resize.fl-bg-video');
873		},
874
875		/**
876		 * Checks to see if the current device has touch enabled.
877		 *
878		 * @since 1.0
879		 * @access private
880		 * @method _isTouch
881		 * @return {Boolean}
882		 */
883		_isTouch: function()
884		{
885			if(('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)) {
886				return true;
887			}
888
889			return false;
890		},
891
892		/**
893		 * Checks to see if the current device is mobile.
894		 *
895		 * @since 1.7
896		 * @access private
897		 * @method _isMobile
898		 * @return {Boolean}
899		 */
900		_isMobile: function()
901		{
902			return /Mobile|Android|Silk\/|Kindle|BlackBerry|Opera Mini|Opera Mobi|webOS/i.test( navigator.userAgent );
903		},
904
905		/**
906		 * Initializes builder body classes.
907		 *
908		 * @since 1.0
909		 * @access private
910		 * @method _initClasses
911		 */
912		_initClasses: function()
913		{
914			var body = $( 'body' ),
915				ua   = navigator.userAgent;
916
917			// Add the builder body class.
918			if ( ! body.hasClass( 'archive' ) && $( '.fl-builder-content-primary' ).length > 0 ) {
919				body.addClass('fl-builder');
920			}
921
922			// Add the builder touch body class.
923			if(FLBuilderLayout._isTouch()) {
924				body.addClass('fl-builder-touch');
925			}
926
927			// Add the builder mobile body class.
928			if(FLBuilderLayout._isMobile()) {
929				body.addClass('fl-builder-mobile');
930			}
931
932			if ( $(window).width() < FLBuilderLayoutConfig.breakpoints.small ) {
933				body.addClass( 'fl-builder-breakpoint-small' );
934			}
935
936			if ( $(window).width() > FLBuilderLayoutConfig.breakpoints.small && $(window).width() < FLBuilderLayoutConfig.breakpoints.medium ) {
937				body.addClass( 'fl-builder-breakpoint-medium' );
938			}
939
940			if ( $(window).width() > FLBuilderLayoutConfig.breakpoints.medium && $(window).width() < FLBuilderLayoutConfig.breakpoints.large ) {
941				body.addClass( 'fl-builder-breakpoint-large' );
942			}
943
944			if ( $(window).width() > FLBuilderLayoutConfig.breakpoints.large ) {
945				body.addClass( 'fl-builder-breakpoint-default' );
946			}
947
948			// IE11 body class.
949			if ( ua.indexOf( 'Trident/7.0' ) > -1 && ua.indexOf( 'rv:11.0' ) > -1 ) {
950				body.addClass( 'fl-builder-ie-11' );
951			}
952		},
953
954		/**
955		 * Initializes builder node backgrounds that require
956		 * additional JavaScript logic such as parallax.
957		 *
958		 * @since 1.1.4
959		 * @access private
960		 * @method _initBackgrounds
961		 */
962		_initBackgrounds: function()
963		{
964			var win = $(window);
965
966			// Init parallax backgrounds.
967			if($('.fl-row-bg-parallax').length > 0 && !FLBuilderLayout._isMobile()) {
968				FLBuilderLayout._scrollParallaxBackgrounds();
969				FLBuilderLayout._initParallaxBackgrounds();
970				win.on('resize.fl-bg-parallax', FLBuilderLayout._initParallaxBackgrounds);
971				win.on('scroll.fl-bg-parallax', FLBuilderLayout._scrollParallaxBackgrounds);
972			}
973
974			// Init video backgrounds.
975			if($('.fl-bg-video').length > 0) {
976				FLBuilderLayout._initBgVideos();
977				FLBuilderLayout._resizeBgVideos();
978
979				// Ensure FLBuilderLayout._resizeBgVideos() is only called once on window resize.
980				var resizeBGTimer = null;
981				win.on('resize.fl-bg-video', function(e){
982					clearTimeout( resizeBGTimer );
983					resizeBGTimer = setTimeout(function() {
984						FLBuilderLayout._resizeBgVideos(e);
985					}, 100 );
986				});
987			}
988		},
989
990		/**
991		 * Initializes all parallax backgrounds in a layout.
992		 *
993		 * @since 1.1.4
994		 * @access private
995		 * @method _initParallaxBackgrounds
996		 */
997		_initParallaxBackgrounds: function()
998		{
999			$('.fl-row-bg-parallax').each(FLBuilderLayout._initParallaxBackground);
1000		},
1001
1002		/**
1003		 * Initializes a single parallax background.
1004		 *
1005		 * @since 1.1.4
1006		 * @access private
1007		 * @method _initParallaxBackgrounds
1008		 */
1009		_initParallaxBackground: function()
1010		{
1011			var row     = $(this),
1012				content = row.find('> .fl-row-content-wrap'),
1013				winWidth = $(window).width(),
1014				screenSize = '',
1015				imageSrc = {
1016					default: '',
1017					medium: '',
1018					responsive: '',
1019				};
1020
1021			imageSrc.default = row.data('parallax-image') || '';
1022			imageSrc.medium = row.data('parallax-image-medium') || imageSrc.default;
1023			imageSrc.responsive = row.data('parallax-image-responsive') || imageSrc.medium;
1024
1025			if (winWidth > FLBuilderLayoutConfig.breakpoints.medium) {
1026				screenSize = 'default';
1027			} else if (winWidth > FLBuilderLayoutConfig.breakpoints.small && winWidth <= FLBuilderLayoutConfig.breakpoints.medium ) {
1028				screenSize = 'medium';
1029			} else if (winWidth <= FLBuilderLayoutConfig.breakpoints.small) {
1030				screenSize = 'responsive';
1031			}
1032
1033			content.css('background-image', 'url(' + imageSrc[screenSize] + ')');
1034			row.data('current-image-loaded', screenSize );
1035
1036		},
1037
1038		/**
1039		 * Fires when the window is scrolled to adjust
1040		 * parallax backgrounds.
1041		 *
1042		 * @since 1.1.4
1043		 * @access private
1044		 * @method _scrollParallaxBackgrounds
1045		 */
1046		_scrollParallaxBackgrounds: function()
1047		{
1048			$('.fl-row-bg-parallax').each(FLBuilderLayout._scrollParallaxBackground);
1049		},
1050
1051		/**
1052		 * Fires when the window is scrolled to adjust
1053		 * a single parallax background.
1054		 *
1055		 * @since 1.1.4
1056		 * @access private
1057		 * @method _scrollParallaxBackground
1058		 */
1059		_scrollParallaxBackground: function()
1060		{
1061			var win     	  = $(window),
1062				row     	  = $(this),
1063				content 	  = row.find('> .fl-row-content-wrap'),
1064				speed   	  = row.data('parallax-speed'),
1065				offset  	  = content.offset(),
1066				yPos		  = -((win.scrollTop() - offset.top) / speed),
1067				initialOffset = ( row.data('parallax-offset') != null ) ? row.data('parallax-offset') : 0,
1068				totalOffset   = yPos - initialOffset;
1069
1070			content.css('background-position', 'center ' + totalOffset + 'px');
1071		},
1072
1073		/**
1074		 * Initializes all video backgrounds.
1075		 *
1076		 * @since 1.6.3.3
1077		 * @access private
1078		 * @method _initBgVideos
1079		 */
1080		_initBgVideos: function()
1081		{
1082			$('.fl-bg-video').each(FLBuilderLayout._initBgVideo);
1083		},
1084
1085		/**
1086		 * Initializes a video background.
1087		 *
1088		 * @since 1.6.3.3
1089		 * @access private
1090		 * @method _initBgVideo
1091		 */
1092		_initBgVideo: function()
1093		{
1094			var wrap   = $( this ),
1095				width       = wrap.data( 'width' ),
1096				height      = wrap.data( 'height' ),
1097				mp4         = wrap.data( 'mp4' ),
1098				youtube     = wrap.data( 'youtube'),
1099				vimeo       = wrap.data( 'vimeo'),
1100				mp4Type     = wrap.data( 'mp4-type' ),
1101				webm        = wrap.data( 'webm' ),
1102				webmType    = wrap.data( 'webm-type' ),
1103				fallback    = wrap.data( 'fallback' ),
1104				loaded      = wrap.data( 'loaded' ),
1105				videoMobile = wrap.data( 'video-mobile' ),
1106				fallbackTag = '',
1107				videoTag    = null,
1108				mp4Tag      = null,
1109				webmTag     = null;
1110
1111			// Return if the video has been loaded for this row.
1112			if ( loaded ) {
1113				return;
1114			}
1115
1116			videoTag  = $( '<video autoplay loop muted playsinline></video>' );
1117
1118			/**
1119			 * Add poster image (fallback image)
1120			 */
1121			if( 'undefined' != typeof fallback && '' != fallback ) {
1122				videoTag.attr( 'poster', 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7' )
1123				videoTag.css({
1124					backgroundImage: 'url("' + fallback + '")',
1125					backgroundColor: 'transparent',
1126					backgroundRepeat: 'no-repeat',
1127					backgroundSize: 'cover',
1128					backgroundPosition: 'center center',
1129				})
1130			}
1131
1132			// MP4 Source Tag
1133			if ( 'undefined' != typeof mp4 && '' != mp4 ) {
1134
1135				mp4Tag = $( '<source />' );
1136				mp4Tag.attr( 'src', mp4 );
1137				mp4Tag.attr( 'type', mp4Type );
1138
1139				videoTag.append( mp4Tag );
1140			}
1141			// WebM Source Tag
1142			if ( 'undefined' != typeof webm && '' != webm ) {
1143
1144				webmTag = $( '<source />' );
1145				webmTag.attr( 'src', webm );
1146				webmTag.attr( 'type', webmType );
1147
1148				videoTag.append( webmTag );
1149			}
1150
1151			// This is either desktop, or mobile is enabled.
1152			if ( ! FLBuilderLayout._isMobile() || ( FLBuilderLayout._isMobile() && "yes" == videoMobile ) ) {
1153				if ( 'undefined' != typeof youtube ) {
1154					FLBuilderLayout._initYoutubeBgVideo.apply( this );
1155				}
1156				else if ( 'undefined' != typeof vimeo ) {
1157					FLBuilderLayout._initVimeoBgVideo.apply( this );
1158				}
1159				else {
1160					wrap.append( videoTag );
1161				}
1162			}
1163			else {
1164				// if we are here, it means we are on mobile and NO is set so remove video src and use fallback
1165				videoTag.attr('src', '')
1166				wrap.append( videoTag );
1167			}
1168
1169			// Mark this video as loaded.
1170			wrap.data('loaded', true);
1171		},
1172
1173		/**
1174		 * Initializes Youtube video background
1175		 *
1176		 * @since 1.9
1177		 * @access private
1178		 * @method _initYoutubeBgVideo
1179		 */
1180		_initYoutubeBgVideo: function()
1181		{
1182			var playerWrap  = $(this),
1183				videoId     = playerWrap.data('video-id'),
1184				videoPlayer = playerWrap.find('.fl-bg-video-player'),
1185				enableAudio = playerWrap.data('enable-audio'),
1186				audioButton = playerWrap.find('.fl-bg-video-audio'),
1187				startTime   = 'undefined' !== typeof playerWrap.data('start') ? playerWrap.data('start') : 0,
1188				startTime   = 'undefined' !== typeof playerWrap.data('t') && startTime === 0 ? playerWrap.data('t') : startTime,
1189				endTime     = 'undefined' !== typeof playerWrap.data('end') ? playerWrap.data('end') : 0,
1190				loop        = 'undefined' !== typeof playerWrap.data('loop') ? playerWrap.data('loop') : 1,
1191				stateCount  = 0,
1192				player,fallback_showing;
1193
1194			if ( videoId ) {
1195				fallback = playerWrap.data('fallback') || false
1196				if( fallback ) {
1197					playerWrap.find('iframe').remove()
1198					fallbackTag = $( '<div></div>' );
1199					fallbackTag.addClass( 'fl-bg-video-fallback' );
1200					fallbackTag.css( 'background-image', 'url(' + playerWrap.data('fallback') + ')' );
1201					fallbackTag.css( 'background-size', 'cover' );
1202					fallbackTag.css( 'transition', 'background-image 1s')
1203					playerWrap.append( fallbackTag );
1204					fallback_showing = true;
1205				}
1206				FLBuilderLayout._onYoutubeApiReady( function( YT ) {
1207					setTimeout( function() {
1208
1209						player = new YT.Player( videoPlayer[0], {
1210							videoId: videoId,
1211							events: {
1212								onReady: function(event) {
1213									if ( "no" === enableAudio || FLBuilderLayout._isMobile() ) {
1214										event.target.mute();
1215									}
1216									else if ( "yes" === enableAudio && event.target.isMuted ) {
1217										event.target.unMute();
1218									}
1219
1220									// Store an instance to a parent
1221									playerWrap.data('YTPlayer', player);
1222									FLBuilderLayout._resizeYoutubeBgVideo.apply(playerWrap);
1223
1224									// Queue the video.
1225									event.target.playVideo();
1226
1227									if ( audioButton.length > 0 && ! FLBuilderLayout._isMobile() ) {
1228										audioButton.on( 'click', {button: audioButton, player: player}, FLBuilderLayout._toggleBgVideoAudio );
1229									}
1230								},
1231								onStateChange: function( event ) {
1232
1233									if ( event.data === 1 ) {
1234										if ( fallback_showing ) {
1235											$( '.fl-bg-video-fallback' ).css( 'background-image', 'url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)' )
1236										}
1237									}
1238									// Manual check if video is not playable in some browsers.
1239									// StateChange order: [-1, 3, -1]
1240									if ( stateCount < 4 ) {
1241										stateCount++;
1242									}
1243
1244									// Comply with the audio policy in some browsers like Chrome and Safari.
1245									if ( stateCount > 1 && (-1 === event.data || 2 === event.data) && "yes" === enableAudio ) {
1246										player.mute();
1247										player.playVideo();
1248										audioButton.show();
1249									}
1250
1251									if ( event.data === YT.PlayerState.ENDED && 1 === loop ) {
1252										if ( startTime > 0 ) {
1253											player.seekTo( startTime );
1254										}
1255										else {
1256											player.playVideo();
1257										}
1258									}
1259								},
1260								onError: function(event) {
1261									console.info('YT Error: ' + event.data)
1262									FLBuilderLayout._onErrorYoutubeVimeo(playerWrap)
1263								}
1264							},
1265							playerVars: {
1266								playsinline: FLBuilderLayout._isMobile() ? 1 : 0,
1267								controls: 0,
1268								showinfo: 0,
1269								rel : 0,
1270								start: startTime,
1271								end: endTime,
1272							}
1273						} );
1274					}, 1 );
1275				} );
1276			}
1277		},
1278
1279		/**
1280		 * On youtube or vimeo error show the fallback image if available.
1281		 * @since 2.0.7
1282		 */
1283		_onErrorYoutubeVimeo: function(playerWrap) {
1284
1285			fallback = playerWrap.data('fallback') || false
1286			if( ! fallback ) {
1287				return false;
1288			}
1289			playerWrap.find('iframe').remove()
1290			fallbackTag = $( '<div></div>' );
1291			fallbackTag.addClass( 'fl-bg-video-fallback' );
1292			fallbackTag.css( 'background-image', 'url(' + playerWrap.data('fallback') + ')' );
1293			playerWrap.append( fallbackTag );
1294		},
1295
1296		/**
1297		 * Check if Youtube API has been downloaded
1298		 *
1299		 * @since 1.9
1300		 * @access private
1301		 * @method _onYoutubeApiReady
1302		 * @param  {Function} callback Method to call when YT API has been loaded
1303		 */
1304		_onYoutubeApiReady: function( callback ) {
1305			if ( window.YT && YT.loaded ) {
1306				callback( YT );
1307			} else {
1308				// If not ready check again by timeout..
1309				setTimeout( function() {
1310					FLBuilderLayout._onYoutubeApiReady( callback );
1311				}, 350 );
1312			}
1313		},
1314
1315		/**
1316		 * Initializes Vimeo video background
1317		 *
1318		 * @since 1.9
1319		 * @access private
1320		 * @method _initVimeoBgVideo
1321		 */
1322		_initVimeoBgVideo: function()
1323		{
1324			var playerWrap	= $(this),
1325				videoId 	= playerWrap.data('video-id'),
1326				videoHash 	= playerWrap.data('video-hash'),
1327				videoPlayer = playerWrap.find('.fl-bg-video-player'),
1328				enableAudio = playerWrap.data('enable-audio'),
1329				audioButton = playerWrap.find('.fl-bg-video-audio'),
1330				player,
1331				width = playerWrap.outerWidth(),
1332				ua    = navigator.userAgent;
1333
1334			if ( typeof Vimeo !== 'undefined' && videoId )	{
1335				
1336				const vimOptions = {
1337					loop       : true,
1338					title      : false,
1339					portrait   : false,
1340					background : true,
1341					autopause  : false,
1342					muted      : true,
1343				};
1344
1345				if ( videoHash.length ) {
1346					vimOptions.url = `https://player.vimeo.com/video/${ videoId }?h=${ videoHash }`;
1347				} else {
1348					vimOptions.id = videoId;
1349				}
1350
1351				player = new Vimeo.Player(videoPlayer[0], vimOptions );
1352				playerWrap.data('VMPlayer', player);
1353				if ( "no" === enableAudio ) {
1354					player.setVolume(0);
1355				}
1356				else if ("yes" === enableAudio ) {
1357					// Chrome, Safari, Firefox have audio policy restrictions for autoplay videos.
1358					if ( ua.indexOf("Safari") > -1 || ua.indexOf("Chrome") > -1 || ua.indexOf("Firefox") > -1 ) {
1359						player.setVolume(0);
1360						audioButton.show();
1361					}
1362					else {
1363						player.setVolume(1);
1364					}
1365				}
1366
1367				player.play().catch(function(error) {
1368					FLBuilderLayout._onErrorYoutubeVimeo(playerWrap)
1369				});
1370
1371				if ( audioButton.length > 0 ) {
1372					audioButton.on( 'click', {button: audioButton, player: player}, FLBuilderLayout._toggleBgVideoAudio );
1373				}
1374			}
1375		},
1376
1377		/**
1378		 * Mute / unmute audio on row's video background.
1379		 * It works for both Youtube and Vimeo.
1380		 *
1381		 * @since 2.1.3
1382		 * @access private
1383		 * @method _toggleBgVideoAudio
1384		 * @param {Object} e Method arguments
1385		 */
1386		_toggleBgVideoAudio: function( e ) {
1387			var player  = e.data.player,
1388			    control = e.data.button.find('.fl-audio-control');
1389
1390			if ( control.hasClass( 'fa-volume-off' ) ) {
1391				// Unmute
1392				control
1393					.removeClass( 'fa-volume-off' )
1394					.addClass( 'fa-volume-up' );
1395				e.data.button.find( '.fa-times' ).hide();
1396
1397				if ( 'function' === typeof player.unMute ) {
1398					player.unMute();
1399				}
1400				else {
1401					player.setVolume( 1 );
1402				}
1403			}
1404			else {
1405				// Mute
1406				control
1407					.removeClass( 'fa-volume-up' )
1408					.addClass( 'fa-volume-off' );
1409				e.data.button.find( '.fa-times' ).show();
1410
1411				if ( 'function' === typeof player.unMute ) {
1412					player.mute();
1413				}
1414				else {
1415					player.setVolume( 0 );
1416				}
1417			}
1418		},
1419
1420		/**
1421		 * Fires when there is an error loading a video
1422		 * background source and shows the fallback.
1423		 *
1424		 * @since 1.6.3.3
1425		 * @access private
1426		 * @method _videoBgSourceError
1427		 * @param {Object} e An event object
1428		 * @deprecated 2.0.3
1429		 */
1430		_videoBgSourceError: function( e )
1431		{
1432			var source 		= $( e.target ),
1433				wrap   		= source.closest( '.fl-bg-video' ),
1434				vid		    = wrap.find( 'video' ),
1435				fallback  	= wrap.data( 'fallback' ),
1436				fallbackTag = '';
1437			source.remove();
1438
1439			if ( vid.find( 'source' ).length ) {
1440				// Don't show the fallback if we still have other sources to check.
1441				return;
1442			} else if ( '' !== fallback ) {
1443				fallbackTag = $( '<div></div>' );
1444				fallbackTag.addClass( 'fl-bg-video-fallback' );
1445				fallbackTag.css( 'background-image', 'url(' + fallback + ')' );
1446				wrap.append( fallbackTag );
1447				vid.remove();
1448			}
1449		},
1450
1451		/**
1452		 * Fires when the window is resized to resize
1453		 * all video backgrounds.
1454		 *
1455		 * @since 1.1.4
1456		 * @access private
1457		 * @method _resizeBgVideos
1458		 */
1459		_resizeBgVideos: function()
1460		{
1461			$('.fl-bg-video').each( function() {
1462
1463				FLBuilderLayout._resizeBgVideo.apply( this );
1464
1465				if ( $( this ).parent().find( 'img' ).length > 0 ) {
1466					$( this ).parent().imagesLoaded( $.proxy( FLBuilderLayout._resizeBgVideo, this ) );
1467				}
1468			} );
1469		},
1470
1471		/**
1472		 * Fires when the window is resized to resize
1473		 * a single video background.
1474		 *
1475		 * @since 1.1.4
1476		 * @access private
1477		 * @method _resizeBgVideo
1478		 */
1479		_resizeBgVideo: function()
1480		{
1481			if ( 0 === $( this ).find( 'video' ).length && 0 === $( this ).find( 'iframe' ).length ) {
1482				return;
1483			}
1484
1485			var wrap        = $(this),
1486				wrapHeight  = wrap.outerHeight(),
1487				wrapWidth   = wrap.outerWidth(),
1488				vid         = wrap.find('video'),
1489				vidHeight   = wrap.data('height'),
1490				vidWidth    = wrap.data('width'),
1491				newWidth    = wrapWidth,
1492				newHeight   = Math.round(vidHeight * wrapWidth/vidWidth),
1493				newLeft     = 0,
1494				newTop      = 0,
1495				iframe 		= wrap.find('iframe'),
1496				isRowFullHeight = $(this).closest('.fl-row-bg-video').hasClass('fl-row-full-height'),
1497				vidCSS          = {
1498					top:       '50%',
1499					left:      '50%',
1500					transform: 'translate(-50%,-50%)',
1501				};
1502
1503			if ( vid.length ) {
1504				if(vidHeight === '' || typeof vidHeight === 'undefined' || vidWidth === '' || typeof vidWidth === 'undefined') {
1505					vid.css({
1506						'left'      : '0px',
1507						'top'       : '0px',
1508						'width'     : newWidth + 'px'
1509					});
1510
1511					// Try to set the actual video dimension on 'loadedmetadata' when using URL as video source
1512					vid.on('loadedmetadata', FLBuilderLayout._resizeOnLoadedMeta);
1513
1514					return;
1515				}
1516
1517				if ( ! isRowFullHeight ) {
1518					if ( newHeight < wrapHeight ) {
1519						newHeight = wrapHeight;
1520						newLeft   = -((newWidth - wrapWidth) / 2);
1521						newWidth  = vidHeight ? Math.round(vidWidth * wrapHeight/vidHeight) : newWidth;
1522					}
1523					else {
1524						newTop = -((newHeight - wrapHeight)/2);
1525					}
1526					vidCSS = {
1527						left   : newLeft + 'px',
1528						top    : newTop + 'px',
1529						height : newHeight + 'px',
1530						width  : newWidth + 'px',
1531					}
1532				}
1533
1534				vid.css( vidCSS );
1535
1536			}
1537			else if ( iframe.length ) {
1538
1539				// Resize Youtube video player within iframe tag
1540				if ( typeof wrap.data('youtube') !== 'undefined' ) {
1541					FLBuilderLayout._resizeYoutubeBgVideo.apply(this);
1542				}
1543			}
1544		},
1545
1546		/**
1547		 * Fires when video meta has been loaded.
1548		 * This will be Triggered when width/height attributes were not specified during video background resizing.
1549		 *
1550		 * @since 1.8.5
1551		 * @access private
1552		 * @method _resizeOnLoadedMeta
1553		 */
1554		_resizeOnLoadedMeta: function(){
1555			var video 		= $(this),
1556				wrapHeight 	= video.parent().outerHeight(),
1557				wrapWidth 	= video.parent().outerWidth(),
1558				vidWidth 	= video[0].videoWidth,
1559				vidHeight 	= video[0].videoHeight,
1560				newHeight   = Math.round(vidHeight * wrapWidth/vidWidth),
1561				newWidth    = wrapWidth,
1562				newLeft     = 0,
1563				newTop 		= 0;
1564
1565			if(newHeight < wrapHeight) {
1566				newHeight   = wrapHeight;
1567				newWidth    = Math.round(vidWidth * wrapHeight/vidHeight);
1568				newLeft     = -((newWidth - wrapWidth)/2);
1569			}
1570			else {
1571				newTop      = -((newHeight - wrapHeight)/2);
1572			}
1573
1574			video.parent().data('width', vidWidth);
1575			video.parent().data('height', vidHeight);
1576
1577			video.css({
1578				'left'      : newLeft + 'px',
1579				'top'       : newTop + 'px',
1580				'width'     : newWidth + 'px',
1581				'height' 	: newHeight + 'px'
1582			});
1583		},
1584
1585		/**
1586		 * Fires when the window is resized to resize
1587		 * a single Youtube video background.
1588		 *
1589		 * @since 1.9
1590		 * @access private
1591		 * @method _resizeYoutubeBgVideo
1592		 */
1593		_resizeYoutubeBgVideo: function()
1594		{
1595			var wrap				= $(this),
1596				wrapWidth 			= wrap.outerWidth(),
1597				wrapHeight 			= wrap.outerHeight(),
1598				player 				= wrap.data('YTPlayer'),
1599				video 				= player ? player.getIframe() : null,
1600				aspectRatioSetting 	= '16:9', // Medium
1601				aspectRatioArray 	= aspectRatioSetting.split( ':' ),
1602				aspectRatio 		= aspectRatioArray[0] / aspectRatioArray[1],
1603				ratioWidth 			= wrapWidth / aspectRatio,
1604				ratioHeight 		= wrapHeight * aspectRatio,
1605				isWidthFixed 		= wrapWidth / wrapHeight > aspectRatio,
1606				width 				= isWidthFixed ? wrapWidth : ratioHeight,
1607				height 				= isWidthFixed ? ratioWidth : wrapHeight;
1608
1609			if ( video ) {
1610				$(video).width( width ).height( height );
1611			}
1612		},
1613
1614		/**
1615		 * Opens a tab or accordion item if the browser hash is set
1616		 * to the ID of one on the page.
1617		 *
1618		 * @since 1.6.0
1619		 * @access private
1620		 * @method _initHash
1621		 */
1622		_initHash: function()
1623		{
1624			var hash 			= window.location.hash.replace( '#', '' ).split( '/' ).shift(),
1625				element 		= null,
1626				tabs			= null,
1627				responsiveLabel	= null,
1628				tabIndex		= null,
1629				label			= null;
1630
1631			if ( '' !== hash ) {
1632
1633				try {
1634
1635					element = $( '#' + hash );
1636
1637					if ( element.length > 0 ) {
1638
1639						if ( element.hasClass( 'fl-accordion-item' ) ) {
1640							setTimeout( function() {
1641								element.find( '.fl-accordion-button' ).trigger( 'click' );
1642							}, 100 );
1643						}
1644						if ( element.hasClass( 'fl-tabs-panel' ) ) {
1645							setTimeout( function() {
1646								tabs 			= element.closest( '.fl-tabs' );
1647								responsiveLabel = element.find( '.fl-tabs-panel-label' );
1648								tabIndex 		= responsiveLabel.data( 'index' );
1649								label 			= tabs.find( '.fl-tabs-labels .fl-tabs-label[data-index=' + tabIndex + ']' );
1650
1651								label[0].click();
1652								FLBuilderLayout._scrollToElement(element);
1653							}, 100 );
1654						}
1655					}
1656				}
1657				catch( e ) {}
1658			}
1659		},
1660
1661		/**
1662		 * Initializes all anchor links on the page for smooth scrolling.
1663		 *
1664		 * @since 1.4.9
1665		 * @access private
1666		 * @method _initAnchorLinks
1667		 */
1668		_initAnchorLinks: function()
1669		{
1670			$( 'a' ).each( FLBuilderLayout._initAnchorLink );
1671		},
1672
1673		/**
1674		 * Initializes a single anchor link for smooth scrolling.
1675		 *
1676		 * @since 1.4.9
1677		 * @access private
1678		 * @method _initAnchorLink
1679		 */
1680		_initAnchorLink: function()
1681		{
1682			var link    = $( this ),
1683				href    = link.attr( 'href' ),
1684				loc     = window.location,
1685				id      = null,
1686				element = null,
1687				flNode  = false;
1688
1689			if ( 'undefined' != typeof href && href.indexOf( '#' ) > -1 && link.closest('svg').length < 1 ) {
1690
1691				if ( loc.pathname.replace( /^\//, '' ) == this.pathname.replace( /^\//, '' ) && loc.hostname == this.hostname ) {
1692
1693					try {
1694
1695						id      = href.split( '#' ).pop();
1696						// If there is no ID then we have nowhere to look
1697						// Fixes a quirk in jQuery and FireFox
1698						if( ! id ) {
1699							return;
1700						}
1701						element = $( '#' + id );
1702
1703						if ( element.length > 0 ) {
1704							flNode = element.hasClass( 'fl-row' ) || element.hasClass( 'fl-col' ) || element.hasClass( 'fl-module' );
1705							if ( !element.hasClass( 'fl-no-scroll' ) && ( link.hasClass( 'fl-scroll-link' ) || flNode ) ) {
1706								$( link ).on( 'click', FLBuilderLayout._scrollToElementOnLinkClick );
1707							}
1708							if ( element.hasClass( 'fl-accordion-item' ) ) {
1709								$( link ).on( 'click', FLBuilderLayout._scrollToAccordionOnLinkClick );
1710							}
1711							if ( element.hasClass( 'fl-tabs-panel' ) ) {
1712								$( link ).on( 'click', FLBuilderLayout._scrollToTabOnLinkClick );
1713							}
1714						}
1715					}
1716					catch( e ) {}
1717				}
1718			}
1719		},
1720
1721		/**
1722		 * Scrolls to an element when an anchor link is clicked.
1723		 *
1724		 * @since 1.4.9
1725		 * @access private
1726		 * @method _scrollToElementOnLinkClick
1727		 * @param {Object} e An event object.
1728		 * @param {Function} callback A function to call when the scroll is complete.
1729		 */
1730		_scrollToElementOnLinkClick: function( e, callback )
1731		{
1732			var element = $( '#' + $( this ).attr( 'href' ).split( '#' ).pop() );
1733
1734			FLBuilderLayout._scrollToElement( element, callback );
1735
1736			e.preventDefault();
1737		},
1738
1739		/**
1740		 * Scrolls to an element.
1741		 *
1742		 * @since 1.6.4.5
1743		 * @access private
1744		 * @method _scrollToElement
1745		 * @param {Object} element The element to scroll to.
1746		 * @param {Function} callback A function to call when the scroll is complete.
1747		 */
1748		_scrollToElement: function( element, callback )
1749		{
1750			var config  = FLBuilderLayoutConfig.anchorLinkAnimations,
1751				dest    = 0,
1752				win     = $( window ),
1753				doc     = $( document );
1754
1755			if ( element.length > 0 ) {
1756
1757				if ( 'fixed' === element.css('position') || 'fixed' === element.parent().css('position') ) {
1758					dest = element.position().top;
1759				}
1760				else if ( element.offset().top > doc.height() - win.height() ) {
1761					dest = doc.height() - win.height();
1762				}
1763				else {
1764					dest = element.offset().top - config.offset;
1765				}
1766
1767				$( 'html, body' ).stop( true ).animate( { scrollTop: dest }, config.duration, config.easing, function() {
1768
1769					if ( 'undefined' != typeof callback ) {
1770						callback();
1771					}
1772
1773					if ( undefined != element.attr( 'id' ) && window.location.hash !== '#' + element.attr( 'id' ) ) {
1774
1775						if ( history.pushState ) {
1776							history.pushState( null, null, '#' + element.attr( 'id' ) );
1777						}
1778						else {
1779							window.location.hash = element.attr( 'id' );
1780						}
1781					}
1782				} );
1783			}
1784		},
1785
1786		/**
1787		 * Scrolls to an accordion item when a link is clicked.
1788		 *
1789		 * @since 1.5.9
1790		 * @access private
1791		 * @method _scrollToAccordionOnLinkClick
1792		 * @param {Object} e An event object.
1793		 */
1794		_scrollToAccordionOnLinkClick: function( e )
1795		{
1796			var element = $( '#' + $( this ).attr( 'href' ).split( '#' ).pop() );
1797
1798			if ( element.length > 0 ) {
1799
1800				var callback = function() {
1801					if ( element ) {
1802						element.find( '.fl-accordion-button' ).trigger( 'click' );
1803						element = false;
1804					}
1805				};
1806
1807				FLBuilderLayout._scrollToElementOnLinkClick.call( this, e, callback );
1808			}
1809		},
1810
1811		/**
1812		 * Scrolls to a tab panel when a link is clicked.
1813		 *
1814		 * @since 1.5.9
1815		 * @access private
1816		 * @method _scrollToTabOnLinkClick
1817		 * @param {Object} e An event object.
1818		 */
1819		_scrollToTabOnLinkClick: function( e )
1820		{
1821			var element 		= $( '#' + $( this ).attr( 'href' ).split( '#' ).pop() ),
1822				tabs			= null,
1823				label   		= null,
1824				responsiveLabel = null;
1825
1826			if ( element.length > 0 ) {
1827
1828				tabs 			= element.closest( '.fl-tabs' );
1829				responsiveLabel = element.find( '.fl-tabs-panel-label' );
1830				tabIndex 		= responsiveLabel.data( 'index' );
1831				label 			= tabs.find( '.fl-tabs-labels .fl-tabs-label[data-index=' + tabIndex + ']' );
1832
1833				if ( responsiveLabel.is( ':visible' ) ) {
1834
1835					var callback = function() {
1836						if ( element ) {
1837							responsiveLabel.trigger( $.Event( 'click', { which: 1 } ) );
1838						}
1839					};
1840
1841					FLBuilderLayout._scrollToElementOnLinkClick.call( this, e, callback );
1842				}
1843				else {
1844					label[0].click();
1845					FLBuilderLayout._scrollToElement( element );
1846				}
1847
1848				e.preventDefault();
1849			}
1850		},
1851
1852		/**
1853		 * Initializes all builder forms on a page.
1854		 *
1855		 * @since 1.5.4
1856		 * @access private
1857		 * @method _initForms
1858		 */
1859		_initForms: function()
1860		{
1861			if ( ! FLBuilderLayout._hasPlaceholderSupport ) {
1862				$( '.fl-form-field input' ).each( FLBuilderLayout._initFormFieldPlaceholderFallback );
1863			}
1864
1865			$( '.fl-form-field input' ).on( 'focus', FLBuilderLayout._clearFormFieldError );
1866		},
1867
1868		/**
1869		 * Checks to see if the current device has HTML5
1870		 * placeholder support.
1871		 *
1872		 * @since 1.5.4
1873		 * @access private
1874		 * @method _hasPlaceholderSupport
1875		 * @return {Boolean}
1876		 */
1877		_hasPlaceholderSupport: function()
1878		{
1879			var input = document.createElement( 'input' );
1880
1881			return 'undefined' != input.placeholder;
1882		},
1883
1884		/**
1885		 * Initializes the fallback for when placeholders aren't supported.
1886		 *
1887		 * @since 1.5.4
1888		 * @access private
1889		 * @method _initFormFieldPlaceholderFallback
1890		 */
1891		_initFormFieldPlaceholderFallback: function()
1892		{
1893			var field       = $( this ),
1894				val         = field.val(),
1895				placeholder = field.attr( 'placeholder' );
1896
1897			if ( 'undefined' != placeholder && '' === val ) {
1898				field.val( placeholder );
1899				field.on( 'focus', FLBuilderLayout._hideFormFieldPlaceholderFallback );
1900				field.on( 'blur', FLBuilderLayout._showFormFieldPlaceholderFallback );
1901			}
1902		},
1903
1904		/**
1905		 * Hides a fallback placeholder on focus.
1906		 *
1907		 * @since 1.5.4
1908		 * @access private
1909		 * @method _hideFormFieldPlaceholderFallback
1910		 */
1911		_hideFormFieldPlaceholderFallback: function()
1912		{
1913			var field       = $( this ),
1914				val         = field.val(),
1915				placeholder = field.attr( 'placeholder' );
1916
1917			if ( val == placeholder ) {
1918				field.val( '' );
1919			}
1920		},
1921
1922		/**
1923		 * Shows a fallback placeholder on blur.
1924		 *
1925		 * @since 1.5.4
1926		 * @access private
1927		 * @method _showFormFieldPlaceholderFallback
1928		 */
1929		_showFormFieldPlaceholderFallback: function()
1930		{
1931			var field       = $( this ),
1932				val         = field.val(),
1933				placeholder = field.attr( 'placeholder' );
1934
1935			if ( '' === val ) {
1936				field.val( placeholder );
1937			}
1938		},
1939
1940		/**
1941		 * Clears a form field error message.
1942		 *
1943		 * @since 1.5.4
1944		 * @access private
1945		 * @method _clearFormFieldError
1946		 */
1947		_clearFormFieldError: function()
1948		{
1949			var field = $( this );
1950
1951			field.removeClass( 'fl-form-error' );
1952			field.siblings( '.fl-form-error-message' ).hide();
1953		},
1954
1955		/**
1956		 * Init Row Shape Layer's height.
1957		 *
1958		 * @since 2.5.3
1959		 * @access private
1960		 * @method _initRowShapeLayerHeight
1961		 */
1962		_initRowShapeLayerHeight: function () {
1963			FLBuilderLayout._adjustRowShapeLayerHeight();
1964			$( window ).on( 'resize', FLBuilderLayout._adjustRowShapeLayerHeight );
1965		},
1966
1967		/**
1968		 * Set parent column width of nested columns when it's zero or blank.
1969		 *
1970		 * @since 2.7.4
1971		 * @access private
1972		 * @method _initNestedColsWidth
1973		 */
1974		_initNestedColsWidth: function()
1975		{
1976			var nestedCols = $( '.fl-col-has-cols' );
1977
1978			if ( nestedCols.length <= 0 ) {
1979				return;
1980			}
1981
1982			$( nestedCols ).each( function(index, col ){
1983				if ( $( col ).width() <= 0 ) {
1984					$( col ).css( 'width', FLBuilderLayoutConfig.emptyColWidth );
1985				}
1986			});
1987		},
1988
1989		/**
1990		 * Adjust Row Shape Layer's height to fix to remove the fine line that appears on certain screen sizes.
1991		 *
1992		 * @since 2.5.3
1993		 * @access private
1994		 * @method _adjustRowShapeLayerHeight
1995		 */
1996		_adjustRowShapeLayerHeight: function() {
1997			var rowShapeLayers = $('.fl-builder-shape-layer');
1998
1999			$( rowShapeLayers ).each(function (index) {
2000				var rowShapeLayer = $(this),
2001					shape = $(rowShapeLayer).find('svg'),
2002					height = shape.height(),
2003					excludeShapes = '.fl-builder-shape-circle, .fl-builder-shape-dot-cluster, .fl-builder-shape-topography, .fl-builder-shape-rect';
2004
2005				if ( ! rowShapeLayer.is( excludeShapes ) ) {
2006					$(shape).css('height', Math.ceil( height ) );
2007				}
2008			});
2009		},
2010		_string_to_slug: function( str ) {
2011			str = str.replace(/^\s+|\s+$/g, ''); // trim
2012			if ( 'undefined' == typeof window._fl_string_to_slug_regex ) {
2013				regex = new RegExp('[^a-zA-Z0-9\'":() !.,-_|]', 'g');
2014			} else {
2015				regex = new RegExp('[^' + window._fl_string_to_slug_regex + '\'":\(\) !.,-_|\\\p{Letter}]', 'ug');
2016			}
2017			str = str.replace(regex, '') // remove invalid chars
2018				.replace(/\s+/g, ' '); // collapse whitespace and replace by a space
2019			return str;
2020		},
2021		_reorderMenu: function() {
2022			if ( $('#wp-admin-bar-fl-builder-frontend-edit-link-default li').length > 1 ) {
2023					$( '#wp-admin-bar-fl-builder-frontend-duplicate-link' )
2024					.appendTo('#wp-admin-bar-fl-builder-frontend-edit-link-default')
2025					.css( 'padding-top', '5px' )
2026					.css( 'border-top', '2px solid #1D2125' )
2027					.css( 'margin-top', '5px' )
2028				}
2029		}
2030	};
2031
2032	/* Initializes the builder layout. */
2033	$(function(){
2034		FLBuilderLayout.init();
2035	});
2036
2037})(jQuery);
2038(function($){
2039
2040	if(typeof FLBuilderLayoutModules !== 'undefined') {
2041		return;
2042	}
2043
2044	/**
2045	 * Helper class with generic logic for builder modules.
2046	 * If generic module code needs to work in both the block
2047	 * editor and builder, it should go here. Otherwise, it
2048	 * should go on FLBuilderLayout.
2049	 *
2050	 * @since 2.9
2051	 */
2052	FLBuilderLayoutModules = {
2053
2054		/**
2055		 * Initializes builder module logic.
2056		 *
2057		 * @since 2.9
2058		 * @method init
2059		 */
2060		init: function()
2061		{
2062			// Only init if the builder isn't active.
2063			if ( 0 === $('.fl-builder-edit').length ) {
2064
2065				// Init module animations.
2066				FLBuilderLayoutModules._initModuleAnimations();
2067			}
2068		},
2069
2070		/**
2071		 * Initializes module animations.
2072		 *
2073		 * @since 1.1.9
2074		 * @access private
2075		 * @method _initModuleAnimations
2076		 */
2077		_initModuleAnimations: function()
2078		{
2079			if(typeof jQuery.fn.waypoint !== 'undefined') {
2080				$('.fl-animation').each( function() {
2081					var node = $( this ),
2082						nodeTop = node.offset().top,
2083						winHeight = $( window ).height(),
2084						bodyHeight = $( 'body' ).height(),
2085						waypoint = FLBuilderLayoutConfig.waypoint,
2086						offset = '80%';
2087
2088					if ( typeof waypoint.offset !== undefined ) {
2089						offset = FLBuilderLayoutConfig.waypoint.offset + '%';
2090					}
2091
2092					if ( bodyHeight - nodeTop < winHeight * 0.2 ) {
2093						offset = '100%';
2094					}
2095
2096					node.waypoint({
2097						offset: offset,
2098						handler: FLBuilderLayoutModules._doModuleAnimation
2099					});
2100				} );
2101			}
2102		},
2103
2104		/**
2105		 * Runs a module animation.
2106		 *
2107		 * @since 1.1.9
2108		 * @access private
2109		 * @method _doModuleAnimation
2110		 */
2111		_doModuleAnimation: function()
2112		{
2113			var module = 'undefined' == typeof this.element ? $(this) : $(this.element),
2114				delay = parseFloat(module.data('animation-delay')),
2115				duration = parseFloat(module.data('animation-duration'));
2116
2117			if ( ! isNaN( duration ) ) {
2118				module.css( 'animation-duration', duration + 's' );
2119			}
2120
2121			if(!isNaN(delay) && delay > 0) {
2122				setTimeout(function(){
2123					module.addClass('fl-animated');
2124				}, delay * 1000);
2125			} else {
2126				setTimeout(function(){
2127					module.addClass('fl-animated');
2128				}, 1);
2129			}
2130		}
2131	};
2132
2133	/* Initializes builder module logic. */
2134	$(function(){
2135		FLBuilderLayoutModules.init();
2136	});
2137
2138})(jQuery);
2139
2140/* Start Global JS */
2141
2142/* End Global JS */
2143
2144
2145;
2146var UABBBlogPosts;
2147
2148(function($) {
2149
2150    /**
2151     * Class for Blog Posts Module
2152     *
2153     * @since 1.6.1
2154     */
2155    UABBBlogPosts = function( settings ){
2156
2157        // set params
2158        this.nodeClass           = '.fl-node-' + settings.id;
2159        this.id                 = settings.id;
2160        this.wrapperClass        = this.nodeClass + ' .uabb-blog-posts';
2161        this.postClass          = this.nodeClass + ' .uabb-post-wrapper';
2162        this.pagination         = settings.pagination;
2163        this.is_carousel         = settings.is_carousel;
2164        this.infinite         = settings.infinite;
2165        this.arrows         = settings.arrows;
2166        this.desktop         = settings.desktop;
2167        this.moduleUrl  = settings.moduleUrl;
2168        this.loaderUrl  = settings.loaderUrl;
2169        this.prevArrow  = settings.prevArrow;
2170        this.nextArrow  = settings.nextArrow;
2171        this.medium         = settings.medium;
2172        this.small         = settings.small;
2173        this.slidesToScroll         = settings.slidesToScroll;
2174        this.autoplay         = settings.autoplay;
2175        this.autoplaySpeed         = settings.autoplaySpeed;
2176        this.dots = settings.dots;
2177        this.small_breakpoint         = settings.small_breakpoint;
2178        this.medium_breakpoint         = settings.medium_breakpoint;
2179        this.equal_height_box         = settings.equal_height_box;
2180        this.mesonry_equal_height      = settings.mesonry_equal_height;
2181        this.uabb_masonary_filter_type = settings.uabb_masonary_filter_type;
2182        this.element_space = settings.element_space;
2183
2184        if( this.is_carousel == 'carousel' ) {
2185            this._uabbBlogPostCarousel();
2186            if( this.equal_height_box == 'yes' ) {
2187                jQuery( this.nodeClass ).find( '.uabb-blog-posts-carousel' ).on('afterChange', this._uabbBlogPostCarouselHeight );
2188                jQuery( this.nodeClass ).find( '.uabb-blog-posts-carousel' ).on('init', $.proxy( this._uabbBlogPostCarouselEqualHeight, this ) );
2189            }
2190        } else if ( this.is_carousel == 'masonary' ) {
2191            this._uabbBlogPostMasonary();
2192        } else if ( this.is_carousel == 'grid' ) {
2193            this._uabbBlogPostGrid();
2194        }
2195
2196        if( settings.blog_image_position == 'background' ) {
2197            this._uabbBlogPostImageResize();
2198        }
2199
2200        if(this._hasPosts()) {
2201               this._initInfiniteScroll();
2202        }
2203
2204        this._openOnLink();
2205    };
2206
2207    UABBBlogPosts.prototype = {
2208        nodeClass               : '',
2209        wrapperClass            : '',
2210        is_carousel             : 'grid',
2211        infinite                : '',
2212        arrows                  : '',
2213        desktop                 : '',
2214        medium                  : '',
2215        small                   : '',
2216        slidesToScroll          : '',
2217        autoplay                : '',
2218        autoplaySpeed           : '',
2219        small_breakpoint        : '',
2220        medium_breakpoint       : '',
2221        equal_height_box        : 'yes',
2222        mesonry_equal_height    : 'no',
2223        uabb_masonary_filter_type : 'buttons',
2224
2225        _hasPosts: function()
2226        {
2227            return $(this.postClass).length > 0;
2228        },
2229
2230        _initInfiniteScroll: function()
2231        {
2232            if(this.pagination == 'scroll' && typeof FLBuilder === 'undefined') {
2233                var $this = this;
2234                setTimeout(function(){
2235                   $this._infiniteScroll();
2236                }, 500);
2237            }
2238        },
2239
2240        _infiniteScroll: function(settings)
2241        {
2242            var $this = this,
2243                path        = $($this.nodeClass + ' .uabb-blogs-pagination a.next').attr('href');
2244                pagePattern = /(.*?(\/|\&|\?)paged-[0-9]{1,}(\/|=))([0-9]{1,})+(.*)/;
2245                wpPattern   = /^(.*?\/?page\/?)(?:\d+)(.*?$)/;
2246                pageMatched = null;
2247
2248                scrollData = {
2249                    navSelector     : $this.nodeClass + ' .uabb-blogs-pagination',
2250                    nextSelector    : $this.nodeClass + ' .uabb-blogs-pagination a.next',
2251                    itemSelector    : $this.postClass,
2252                    prefill         : true,
2253                    bufferPx        : 200,
2254                    loading         : {
2255                        msgText         : 'Loading',
2256                        finishedMsg     : '',
2257                        img             : $this.moduleUrl + '/img/ajax-loader-grey.gif',
2258                        speed           : 10,
2259                    }
2260                };
2261            if ( pagePattern.test( path ) ) {
2262                scrollData.path = function( currPage ){
2263                    pageMatched = path.match( pagePattern );
2264                    path = pageMatched[1] + currPage + pageMatched[5];
2265                    return path;
2266                }
2267            }
2268            else if ( wpPattern.test( path ) ) {
2269                scrollData.path = path.match( wpPattern ).slice( 1 );
2270            }
2271
2272            $($this.wrapperClass).infinitescroll( scrollData, $.proxy($this._infiniteScrollComplete, $this) );
2273            setTimeout(function(){
2274                $(window).trigger('resize');
2275            }, 100);
2276        },
2277
2278        _infiniteScrollComplete: function(elements)
2279        {
2280            var $this = this,
2281            wrap = $($this.wrapperClass);
2282            elements = $(elements);
2283            if( $this.is_carousel == 'masonary' ) {
2284                wrap.isotope('appended', elements);
2285            } else if ( $this.is_carousel == 'grid' ) {
2286                wrap.imagesLoaded( $.proxy( function() {
2287                if( $this.equal_height_box == 'yes' ) {
2288                    $this._uabbBlogPostMesonryHeight();
2289                }
2290                wrap.isotope('appended', elements);
2291                wrap.isotope('layout');
2292                }, $this ) );
2293            }
2294        },
2295
2296        _uabbBlogPostCarousel: function() {
2297            var $this = this;
2298            if( $this.equal_height_box == 'yes' ) {
2299                $this._uabbBlogPostCarouselEqualHeight();
2300            }
2301
2302            var grid = jQuery( $this.nodeClass ).find( '.uabb-blog-posts-carousel' );
2303
2304            jQuery( $this.nodeClass ).find( '.uabb-blog-posts-carousel' ).uabbslick({
2305                dots: $this.dots,
2306                infinite: $this.infinite,
2307                arrows: $this.arrows,
2308                lazyLoad: 'ondemand',
2309                slidesToShow: $this.desktop,
2310                slidesToScroll: $this.slidesToScroll,
2311                autoplay: $this.autoplay,
2312                prevArrow: '<button type="button" data-role="none" class="slick-prev" aria-label="Previous" tabindex="0" role="button"><i class=" '+ $this.prevArrow +' "></i></button>',
2313                nextArrow: '<button type="button" data-role="none" class="slick-next" aria-label="Next" tabindex="0" role="button"><i class="'+ $this.nextArrow +' "></i></button>',
2314                autoplaySpeed: $this.autoplaySpeed,
2315                adaptiveHeight: false,
2316                responsive: [
2317                    {
2318                        breakpoint: $this.medium_breakpoint,
2319                        settings: {
2320                            slidesToShow: $this.medium,
2321                            slidesToScroll: $this.medium,
2322                        }
2323                    },
2324                    {
2325                        breakpoint: $this.small_breakpoint,
2326                        settings: {
2327                            slidesToShow: $this.small,
2328                            slidesToScroll: $this.small,
2329                        }
2330                    }
2331                ]
2332            });
2333        },
2334
2335        _uabbBlogPostMasonary: function() {
2336
2337            var $this = this,
2338                id = $this.id,
2339                nodeClass = $this.nodeClass;
2340
2341            if( $this.mesonry_equal_height == 'yes' ) {
2342                LayoutMode = 'fitRows';
2343            }
2344            else {
2345                LayoutMode = 'masonry';
2346            }
2347
2348            $grid = jQuery( nodeClass ).find('.uabb-blog-posts-masonary').isotope({
2349                layoutMode: LayoutMode,
2350                itemSelector: '.uabb-blog-posts-masonary-item-' + $this.id,
2351                masonry: {
2352                    columnWidth: '.uabb-blog-posts-masonary-item-' + $this.id
2353                }
2354            });
2355
2356            if( $this.uabb_masonary_filter_type == 'drop-down' ) {
2357
2358                jQuery( nodeClass ).find('.uabb-masonary-filters').on('change', function() {
2359                    value = jQuery( nodeClass ).find('.uabb-masonary-filters option:selected').data('filter');
2360                    jQuery( nodeClass + ' .uabb-blog-posts-masonary' ).isotope( { filter: value } )
2361                });
2362            }
2363            else {
2364                jQuery( nodeClass ).find('.uabb-masonary-filters .uabb-masonary-filter-' + id).on('click', function(){
2365                    jQuery( this ).siblings().removeClass( 'uabb-masonary-current' );
2366                    jQuery( this ).addClass( 'uabb-masonary-current' );
2367                    var value = jQuery( this ).data( 'filter' );
2368                    jQuery( nodeClass + ' .uabb-blog-posts-masonary' ).isotope( { filter: value } )
2369                });
2370				jQuery( nodeClass ).find('.uabb-masonary-filters .uabb-masonary-filter-' + id).off( 'keyup' ).on( 'keyup', function( e ) {
2371                    if ( 9 == e.keyCode ) {
2372						jQuery( this ).siblings().removeClass( 'uabb-masonary-current' );
2373                    	jQuery( this ).addClass( 'uabb-masonary-current' );
2374					}
2375					if ( 13 === e.keyCode ) {
2376                    	var value = jQuery( this ).data( 'filter' );
2377                    	jQuery( nodeClass + ' .uabb-blog-posts-masonary' ).isotope( { filter: value } )
2378					}
2379                });
2380            }
2381
2382
2383            if( $this.mesonry_equal_height == 'yes' ) {
2384                $this._uabbBlogPostMesonryHeight();
2385            }
2386        },
2387
2388        _uabbBlogPostGrid: function() {
2389
2390            var $this = this,
2391                id = $this.id,
2392                nodeClass = $this.nodeClass,
2393                LayoutMode = 'fitRows';
2394
2395            $grid = jQuery( nodeClass ).find('.uabb-blog-posts-grid').isotope({
2396                layoutMode: LayoutMode,
2397                itemSelector: '.uabb-blog-posts-grid-item-' + $this.id,
2398				percentPosition: true,
2399                fitRows: {
2400                    columnWidth: '.uabb-blog-posts-grid-item-' + $this.id,
2401				  },
2402                transitionDuration  : 0,
2403            });
2404
2405            if( $this.uabb_masonary_filter_type == 'drop-down' ) {
2406
2407                jQuery( nodeClass ).find('.uabb-masonary-filters').on('change', function() {
2408                    value = jQuery( nodeClass ).find('.uabb-masonary-filters option:selected').data('filter');
2409                    jQuery( nodeClass + ' .uabb-blog-posts-grid' ).isotope( { filter: value } )
2410                });
2411            }
2412            else {
2413                jQuery( nodeClass ).find('.uabb-masonary-filters .uabb-masonary-filter-' + id).on('click', function(){
2414                    jQuery( this ).siblings().removeClass( 'uabb-masonary-current' );
2415                    jQuery( this ).addClass( 'uabb-masonary-current' );
2416                    var value = jQuery( this ).data( 'filter' );
2417                    jQuery( nodeClass + ' .uabb-blog-posts-grid' ).isotope( { filter: value } )
2418                });
2419				jQuery( nodeClass ).find('.uabb-masonary-filters .uabb-masonary-filter-' + id).off( 'keyup' ).on( 'keyup', function( e ) {
2420                    if ( 9 == e.keyCode ) {
2421						jQuery( this ).siblings().removeClass( 'uabb-masonary-current' );
2422                    	jQuery( this ).addClass( 'uabb-masonary-current' );
2423					}
2424					if ( 13 === e.keyCode ) {
2425						var value = jQuery( this ).data( 'filter' );
2426                    	jQuery( nodeClass + ' .uabb-blog-posts-grid' ).isotope( { filter: value } )
2427					}
2428				});
2429            }
2430            if( $this.equal_height_box == 'yes' ) {
2431                jQuery( nodeClass + ' .uabb-blog-posts-grid' ).imagesLoaded( $.proxy( function() {
2432                    this._uabbBlogPostMesonryHeight();
2433                    setTimeout(() => {
2434                        jQuery( nodeClass + ' .uabb-blog-posts-grid' ).isotope('layout');
2435                    }, 150);
2436                }, this ) );
2437            }
2438            $(window).scroll(function() {
2439                clearTimeout($.data(this, 'scrollTimer'));
2440                $.data(this, 'scrollTimer', setTimeout(function() {
2441                    jQuery( nodeClass + ' .uabb-blog-posts-grid' ).isotope('layout');
2442                }, 25));
2443            });
2444        },
2445
2446        _openOnLink : function() {
2447            var $this = this,
2448   
2448             nodeClass       = jQuery($this.nodeClass);
2449            if ( $this.is_carousel == 'masonary' ) {
2450                var layoutClass = '.uabb-blog-posts-masonary';
2451            } else if ( $this.is_carousel == 'grid' ) {
2452                var layoutClass = '.uabb-blog-posts-grid';
2453            }
2454
2455            // Regexp for validating user input as ID : https://regex101.com/r/KGj6I6/1
2456            var pattern = new RegExp('^[\\w\\-]+$');
2457
2458                var id = window.location.hash.substring(1);
2459
2460            if ( pattern.test( id ) ) {
2461
2462                $( $this.nodeClass + layoutClass ).each( function() {
2463                var selector    = $(this);
2464
2465                    var filters = nodeClass.find( '.uabb-masonary-filters' );
2466
2467                    if ( filters.length > 0 ) {
2468
2469                        if ( '' !== id ) {
2470
2471                            id = '.' + id.toLowerCase();
2472                            def_cat = id;
2473
2474                            def_cat_sel = filters.find( '[data-filter="' + id + '"]' );
2475
2476                            if ( 0 === def_cat_sel.length ) {
2477                                return;
2478                            }
2479
2480                            if ( def_cat_sel.length > 0 ) {
2481
2482                                def_cat_sel.siblings().removeClass( 'uabb-masonary-current' );
2483
2484                                def_cat_sel.addClass( 'uabb-masonary-current' );
2485                            }
2486                        }
2487                    }
2488
2489                        selector.isotope({
2490                            filter: def_cat,
2491                        });
2492
2493                });
2494            }
2495        },
2496
2497        _uabbBlogPostCarouselEqualHeight: function() {
2498
2499            var $this = this,
2500                id = $this.id,
2501                nodeClass = $this.nodeClass,
2502                small_breakpoint = $this.small_breakpoint,
2503                medium_breakpoint = $this.medium_breakpoint,
2504                desktop = $this.desktop,
2505                medium = $this.medium,
2506                small = $this.small,
2507                node = jQuery( nodeClass ),
2508                grid = node.find( '.uabb-blog-posts' ),
2509                post_wrapper = grid.find('.uabb-post-wrapper'),
2510                post_active = grid.find('.uabb-post-wrapper.slick-active'),
2511                max_height = -1,
2512                wrapper_height = -1,
2513                i = 1,
2514                counter = parseInt( desktop ),
2515                childEleCount = post_wrapper.length,
2516                remainingNodes = ( childEleCount % counter );
2517
2518                if( window.innerWidth <= small_breakpoint ) {
2519                    counter = parseInt( small );
2520                } else if( window.innerWidth > medium_breakpoint ) {
2521                    counter = parseInt( desktop );
2522                } else {
2523                    counter = parseInt( medium );
2524                }
2525
2526                post_active.each(function() {
2527                    var $this = jQuery( this ),
2528                        this_height = $this.outerHeight(),
2529                        selector = $this.find( '.uabb-blog-posts-shadow' ),
2530                        blog_post = $this.find( '.uabb-blog-post-inner-wrap' ),
2531                        selector_height = selector.outerHeight(),
2532                        blog_post_height = blog_post.outerHeight();
2533
2534                    if( max_height < blog_post_height ) {
2535                        max_height = blog_post_height;
2536                    }
2537
2538                    if ( wrapper_height < this_height ) {
2539                        wrapper_height = this_height
2540                    }
2541                });
2542
2543                post_active.each(function() {
2544                    var $this = jQuery( this );
2545
2546                    $this.find( '.uabb-blog-posts-shadow' ).css( 'height', max_height - 8 );
2547                });
2548
2549                grid.find('.slick-list.draggable').animate({ height: max_height }, { duration: 200, easing: 'linear' });
2550
2551                max_height = -1;
2552                wrapper_height = -1;
2553
2554                post_wrapper.each(function() {
2555                    $this = jQuery( this ),
2556                    selector = $this.find( '.uabb-blog-posts-sha
2556dow' ),
2557                    selector_height = selector.outerHeight();
2558
2559                    if ( $this.hasClass('slick-active') ) {
2560                        return true;
2561                    }
2562
2563                    selector.css( 'height', selector_height );
2564                });
2565        },
2566
2567        _uabbBlogPostCarouselHeight: function( slick, currentSlide ) {
2568
2569            var $this = $( this ),
2570                id = $this.parents( '.fl-module-blog-posts' ).data( 'node' ),
2571                nodeClass = '.fl-node-' + id,
2572                grid = $( nodeClass ).find( '.uabb-blog-posts-carousel' ),
2573                post_wrapper = grid.find('.uabb-post-wrapper'),
2574                post_active = grid.find('.uabb-post-wrapper.slick-active'),
2575                max_height = -1,
2576                wrapper_height = -1;
2577
2578            post_active.each(function( i ) {
2579                var $this = $( this ),
2580                    this_height = $this.outerHeight(),
2581                    blog_post = $this.find( '.uabb-blog-post-inner-wrap' ),
2582                    blog_post_height = blog_post.outerHeight();
2583
2584                if( max_height < blog_post_height ) {
2585                    max_height = blog_post_height;
2586                }
2587
2588                if ( wrapper_height < this_height ) {
2589                    wrapper_height = this_height
2590                }
2591            });
2592
2593            post_active.each( function( i ) {
2594                var selector = jQuery( this ).find( '.uabb-blog-posts-shadow' );
2595                selector.css( "height", max_height );
2596            });
2597
2598            grid.find('.slick-list.draggable').animate({ height: max_height }, { duration: 200, easing: 'linear' });
2599
2600            max_height = -1;
2601            wrapper_height = -1;
2602
2603            post_wrapper.each(function() {
2604                var $this = jQuery( this ),
2605                    selector = $this.find( '.uabb-blog-posts-shadow' ),
2606                    blog_post = $this.find( '.uabb-blog-post-inner-wrap' ),
2607                    blog_post_height = blog_post.outerHeight();
2608
2609                if ( $this.hasClass('slick-active') ) {
2610                    return true;
2611                }
2612
2613                selector.css( 'height', blog_post_height );
2614            });
2615        },
2616
2617        _uabbBlogPostMesonryHeight: function() {
2618
2619            var $this = this,
2620                id = $this.id,
2621                nodeClass = '.fl-node-' + id,
2622                max_height = -1,
2623                wrapper_height = -1;
2624
2625            if ( $this.is_carousel == 'masonary' ) {
2626                var grid = $( nodeClass ).find( '.uabb-blog-posts-masonary' );
2627            } else if ( $this.is_carousel == 'grid' ) {
2628                var grid = $( nodeClass ).find( '.uabb-blog-posts-grid' );
2629            }
2630            var post_wrapper = grid.find('.uabb-post-wrapper');
2631
2632            post_wrapper.each(function( i ) {
2633                var this_height = $( this ).outerHeight(),
2634                    blog_post = $( this ).find( '.uabb-blog-post-inner-wrap' ),
2635                    blog_post_height = blog_post.outerHeight();
2636
2637                if( max_height < blog_post_height ) {
2638                    max_height = blog_post_height;
2639                }
2640
2641                if ( wrapper_height < this_height ) {
2642                    wrapper_height = this_height
2643                }
2644
2645            });
2646
2647            post_wrapper.each( function( i ) {
2648                var selector = jQuery( this ).find( '.uabb-blog-posts-shadow' );
2649                selector.css( "height", max_height );
2650            });
2651        },
2652
2653        _uabbBlogPostImageResize: function() {
2654            var $this = this,
2655                id = $this.id,
2656                nodeClass = $this.nodeClass,
2657                small_breakpoint = $this.small_breakpoint,
2658                medium_breakpoint = $this.medium_breakpoint,
2659                node = jQuery( nodeClass ),
2660                grid = node.find( '.uabb-blog-posts' );
2661
2662            grid.find( '.uabb-post-wrapper' ).each(function() {
2663                var img_selector = jQuery(this).find('.uabb-post-thumbnail'),
2664                    img_wrap_height = parseInt( img_selector.height() ),
2665                    img_height = parseInt( img_selector.find('img').height() );
2666
2667                if( !isNaN( img_wrap_height ) && !isNaN( img_height ) ) {
2668                    if( img_wrap_height >= img_height ) {
2669                        img_selector.find('img').css( 'min-height', '100%' );
2670
2671                    } else {
2672                        img_selector.find('img').css( 'min-height', '' );
2673                    }
2674                }
2675            });
2676        }
2677    };
2678
2679})(jQuery);
2680(function($) {
2681
2682	var document_width, document_height;
2683		var args = {
2684		id: '5fb2cae4b6606',
2685		pagination: 'numbers',
2686		is_carousel: 'feed',
2687		infinite: true,
2688		arrows: true,
2689		desktop: 1,
2690		moduleUrl: 'https://byfaithonline.com/wp-content/plugins/bb-ultimate-addon/modules/blog-posts',
2691		medium: 1,
2692		small: 1,
2693		slidesToScroll: 1,
2694		prevArrow: 'fas fa-angle-left',
2695		nextArrow: 'fas fa-angle-right',
2696		autoplay: false,
2697		autoplaySpeed: 1000,
2698		dots:false,
2699		small_breakpoint: 768,
2700		medium_breakpoint: 992,
2701		equal_height_box: 'yes',
2702		uabb_masonary_filter_type: 'buttons',
2703		mesonry_equal_height: 'no',
2704		blog_image_position: 'top',
2705		element_space: '0'
2706	};
2707
2708	jQuery(document).ready( function() {
2709
2710		jQuery( '.uabb-masonary-filters .uabb-masonary-current' ).trigger('click');
2711
2712		var pattern = new RegExp('^\\d+$');
2713
2714		var hashval = window.location.hash.substring(1);
2715
2716		if ( pattern.test( hashval ) ) {
2717
2718
2719			if( hashval != '' ) {
2720
2721				jQuery('.fl-node-5fb2cae4b6606 .uabb-masonary-filters li').removeClass('uabb-masonary-current');
2722
2723				jQuery('.fl-node-5fb2cae4b6606 .uabb-masonary-filters li[data-filter=".uabb-masonary-cat-' + hashval + '"]').addClass('uabb-masonary-current');
2724
2725				jQuery( '.fl-node-5fb2cae4b6606 .uabb-masonary-filters .uabb-masonary-filter-5fb2cae4b6606.uabb-masonary-current' ).trigger('click');
2726			}
2727		}
2728
2729
2730		document_width = $( document ).width();
2731		document_height = $( document ).height();
2732
2733		/* Accordion Click Trigger */
2734		UABBTrigger.addHook( 'uabb-accordion-click', function( argument, selector ) {
2735
2736			var is_carousel = 'feed';
2737
2738			var child_id = jQuery(selector+' .fl-module-blog-posts').data('node');
2739			if( child_id !== null ) {
2740
2741				if( is_carousel === 'carousel' ) {
2742					jQuery( '.fl-node-' + child_id ).find( '.uabb-blog-posts-carousel' ).uabbslick('unslick');
2743				}
2744
2745				var child_args = {
2746					id: child_id,
2747					is_carousel: 'feed',
2748					infinite: true,
2749					arrows: true,
2750					desktop: 1,
2751					medium: 1,
2752					small: 1,
2753					slidesToScroll: 1,
2754					autoplay: false,
2755					autoplaySpeed: 1000,
2756					small_breakpoint: 768,
2757					medium_breakpoint: 992,
2758					equal_height_box: 'yes',
2759					blog_image_position: 'top'
2760				};
2761				new UABBBlogPosts( child_args );
2762			}
2763		});
2764
2765		/* Accordion Click Trigger */
2766		UABBTrigger.addHook( 'uabb-modal-click', function( argument, selector ) {
2767
2768			var is_carousel = 'feed';
2769
2770			var child_id = jQuery(selector+' .fl-module-blog-posts').data('node');
2771			if( child_id !== null ) {
2772
2773				if( is_carousel === 'carousel' ) {
2774					jQuery( '.fl-node-' + child_id ).find( '.uabb-blog-posts-carousel' ).uabbslick('unslick');
2775				}
2776
2777				var child_args = {
2778					id: child_id,
2779					is_carousel: 'feed',
2780					infinite: true,
2781					arrows: true,
2782					desktop: 1,
2783					medium: 1,
2784					small: 1,
2785					slidesToScroll: 1,
2786					autoplay: false,
2787					autoplaySpeed: 1000,
2788					small_breakpoint: 768,
2789					medium_breakpoint: 992,
2790					equal_height_box: 'yes',
2791					blog_image_position: 'top'
2792				};
2793				new UABBBlogPosts( child_args );
2794			}
2795		});
2796
2797		/* Tab Click Trigger */
2798		UABBTrigger.addHook( 'uabb-tab-click', function( argument, selector ) {
2799			var is_carousel = 'feed';
2800
2801			var child_id = jQuery(selector+' .fl-module-blog-posts').data('node');
2802			if( child_id !== null ) {
2803
2804				if( is_carousel === 'carousel' ) {
2805					jQuery( '.fl-node-' + child_id ).find( '.uabb-blog-posts-carousel' ).uabbslick('unslick');
2806				}
2807
2808				var child_args = {
2809					id: child_id,
2810					is_carousel: 'feed',
2811					infinite: true,
2812					arrows: true,
2813					desktop: 1,
2814					medium: 1,
2815					small: 1,
2816					slidesToScroll: 1,
2817					autoplay: false,
2818					autoplaySpeed: 1000,
2819					small_breakpoint: 768,
2820					medium_breakpoint: 992,
2821					equal_height_box: 'yes',
2822					blog_image_position: 'top'
2823				};
2824				new UABBBlogPosts( child_args );
2825				if( is_carousel === 'grid' ) {
2826					new UABBBlogPosts( child_args );
2827					jQuery( '.fl-node-' + child_id + '.uabb-blog-posts-grid').isotope('layout');
2828				}
2829			}
2830
2831		});
2832
2833	});
2834
2835	jQuery(window).on("load", function() {
2836
2837		new UABBBlogPosts( args );
2838	});
2839
2840	jQuery(window).resize( function() {
2841		if( document_width !== $( document ).width() || document_height !== $( document ).height() ) {
2842			document_width = $( document ).width();
2843			document_height = $( document ).height();
2844			new UABBBlogPosts( args );
2845		}
2846	});
2847
2848	new UABBBlogPosts( args );
2849	
2850})(jQuery);
2851
2852/* Start Global Node Custom JS */
2853
2854/* End Global Node Custom JS */
2855
2856
2857/* Start Layout Custom JS */
2858
2859/* End Layout Custom JS */
2860
2861

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.