PageSourceSearch

https://www.divshare.com/wp-content/uploads/bb-plugin/cache/1788-l…?ver=63debf6080fa3da3326ada0624c209a3

js divshare.com collected 2026-09-24 08:34:37 UTC 73,126 bytes, 2,746 lines download raw bytes

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://www.divshare.com/wp-admin/admin-ajax.php';var flBuilderUrl = 'https://www.divshare.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://www.divshare.com/wp-content/plugins/bb-plugin/',
630		wpAjaxUrl : 'https://www.divshare.com/wp-admin/admin-ajax.php'
631	},
632	breakpoints : {
633		small  : 768,
634		medium : 992	},
635	waypoint: {
636		offset: 80
637	}
638};
639(function($){
640
641	if(typeof FLBuilderLayout != 'undefined') {
642		return;
643	}
644
645	/**
646	 * Helper class with generic logic for a builder layout.
647	 *
648	 * @class FLBuilderLayout
649	 * @since 1.0
650	 */
651	FLBuilderLayout = {
652
653		/**
654		 * Initializes a builder layout.
655		 *
656		 * @since 1.0
657		 * @method init
658		 */
659		init: function()
660		{
661			// Destroy existing layout events.
662			FLBuilderLayout._destroy();
663
664			// Init CSS classes.
665			FLBuilderLayout._initClasses();
666
667			// Init backgrounds.
668			FLBuilderLayout._initBackgrounds();
669
670			// Only init if the builder isn't active.
671			if ( 0 === $('.fl-builder-edit').length ) {
672
673				// Init module animations.
674				FLBuilderLayout._initModuleAnimations();
675
676				// Init anchor links.
677				FLBuilderLayout._initAnchorLinks();
678
679				// Init the browser hash.
680				FLBuilderLayout._initHash();
681
682				// Init forms.
683				FLBuilderLayout._initForms();
684			}
685		},
686
687		/**
688		 * Public method for refreshing Wookmark or MosaicFlow galleries
689		 * within an element.
690		 *
691		 * @since 1.7.4
692		 * @method refreshGalleries
693		 */
694		refreshGalleries: function( element )
695		{
696			var $element  = 'undefined' == typeof element ? $( 'body' ) : $( element ),
697				mfContent = $element.find( '.fl-mosaicflow-content' ),
698				wmContent = $element.find( '.fl-gallery' ),
699				mfObject  = null;
700
701			if ( mfContent ) {
702
703				mfObject = mfContent.data( 'mosaicflow' );
704
705				if ( mfObject ) {
706					mfObject.columns = $( [] );
707					mfObject.columnsHeights = [];
708					mfContent.data( 'mosaicflow', mfObject );
709					mfContent.mosaicflow( 'refill' );
710				}
711			}
712			if ( wmContent ) {
713				wmContent.trigger( 'refreshWookmark' );
714			}
715		},
716
717		/**
718		 * Public method for refreshing Masonry within an element
719		 *
720		 * @since 1.8.1
721		 * @method refreshGridLayout
722		 */
723		refreshGridLayout: function( element )
724		{
725			var $element 		= 'undefined' == typeof element ? $( 'body' ) : $( element ),
726				msnryContent	= $element.find('.masonry');
727
728			if ( msnryContent.length )	{
729				msnryContent.masonry('layout');
730			}
731		},
732
733		/**
734		 * Public method for reloading BxSlider within an element
735		 *
736		 * @since 1.8.1
737		 * @method reloadSlider
738		 */
739		reloadSlider: function( element )
740		{
741			var $element 	= 'undefined' == typeof element ? $( 'body' ) : $( element ),
742				bxContent	= $element.find('.bx-viewport > div').eq(0),
743				bxObject   	= null;
744
745			if ( bxContent.length ) {
746				bxObject = bxContent.data( 'bxSlider');
747				if ( bxObject ) {
748					bxObject.reloadSlider();
749				}
750			}
751		},
752
753		/**
754		 * Public method for resizing WP audio player
755		 *
756		 * @since 1.8.2
757		 * @method resizeAudio
758		 */
759		resizeAudio: function( element )
760		{
761			var $element 	 	= 'undefined' == typeof element ? $( 'body' ) : $( element ),
762				audioPlayers 	= $element.find('.wp-audio-shortcode.mejs-audio'),
763				player 		 	= null,
764				mejsPlayer 	 	= null,
765				rail 			= null,
766				railWidth 		= 400;
767
768			if ( audioPlayers.length && typeof mejs !== 'undefined' ) {
769            	audioPlayers.each(function(){
770	            	player 		= $(this);
771	            	mejsPlayer 	= mejs.players[player.attr('id')];
772	            	rail 		= player.find('.mejs-controls .mejs-time-rail');
773	            	var innerMejs = player.find('.mejs-inner'),
774	            		total 	  = player.find('.mejs-controls .mejs-time-total');
775
776	            	if ( typeof mejsPlayer !== 'undefined' ) {
777	            		railWidth = Math.ceil(player.width() * 0.8);
778
779	            		if ( innerMejs.length ) {
780
781		            		rail.css('width', railWidth +'px!important');
782		            		//total.width(rail.width() - 10);
783
784		            		mejsPlayer.options.autosizeProgress = true;
785
786		            		// webkit has trouble doing this without a delay
787							setTimeout(function () {
788								mejsPlayer.setControlsSize();
789							}, 50);
790
791			            	player.find('.mejs-inner').css({
792			            		visibility: 'visible',
793			            		height: 'inherit'
794			            	});
795		            	}
796		           	}
797	            });
798	        }
799		},
800
801		/**
802		 * Public method for preloading WP audio player when it's inside the hidden element
803		 *
804		 * @since 1.8.2
805		 * @method preloadAudio
806		 */
807		preloadAudio: function(element)
808		{
809			var $element 	 = 'undefined' == typeof element ? $( 'body' ) : $( element ),
810				contentWrap  = $element.closest('.fl-accordion-item'),
811				audioPlayers = $element.find('.wp-audio-shortcode.mejs-audio');
812
813			if ( ! contentWrap.hasClass('fl-accordion-item-active') && audioPlayers.find('.mejs-inner').length ) {
814				audioPlayers.find('.mejs-inner').css({
815					visibility : 'hidden',
816					height: 0
817				});
818			}
819		},
820
821		/**
822		 * Public method for resizing slideshow momdule within the tab
823		 *
824		 * @since 1.10.5
825		 * @method resizeSlideshow
826		 */
827		resizeSlideshow: function(){
828			if(typeof YUI !== 'undefined') {
829				YUI().use('node-event-simulate', function(Y) {
830					Y.one(window).simulate("resize");
831				});
832			}
833		},
834
835		/**
836		 * Public method for reloading an embedded Google Map within the tabs or hidden element.
837		 *
838		 * @since 2.2
839		 * @method reloadGoogleMap
840		 */
841		reloadGoogleMap: function(element){
842			var $element  = 'undefined' == typeof element ? $( 'body' ) : $( element ),
843			    googleMap = $element.find( 'iframe[src*="google.com/maps"]' );
844
845			if ( googleMap.length ) {
846			    googleMap.attr( 'src', function(i, val) {
847			        return val;
848			    });
849			}
850		},
851
852		/**
853		 * Unbinds builder layout events.
854		 *
855		 * @since 1.0
856		 * @access private
857		 * @method _destroy
858		 */
859		_destroy: function()
860		{
861			var win = $(window);
862
863			win.off('scroll.fl-bg-parallax');
864			win.off('resize.fl-bg-video');
865		},
866
867		/**
868		 * Checks to see if the current device has touch enabled.
869		 *
870		 * @since 1.0
871		 * @access private
872		 * @method _isTouch
873		 * @return {Boolean}
874		 */
875		_isTouch: function()
876		{
877			if(('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)) {
878				return true;
879			}
880
881			return false;
882		},
883
884		/**
885		 * Checks to see if the current device is mobile.
886		 *
887		 * @since 1.7
888		 * @access private
889		 * @method _isMobile
890		 * @return {Boolean}
891		 */
892		_isMobile: function()
893		{
894			return /Mobile|Android|Silk\/|Kindle|BlackBerry|Opera Mini|Opera Mobi|webOS/i.test( navigator.userAgent );
895		},
896
897		/**
898		 * Initializes builder body classes.
899		 *
900		 * @since 1.0
901		 * @access private
902		 * @method _initClasses
903		 */
904		_initClasses: function()
905		{
906			var body = $( 'body' ),
907				ua   = navigator.userAgent;
908
909			// Add the builder body class.
910			if ( ! body.hasClass( 'archive' ) && $( '.fl-builder-content-primary' ).length > 0 ) {
911				body.addClass('fl-builder');
912			}
913
914			// Add the builder touch body class.
915			if(FLBuilderLayout._isTouch()) {
916				body.addClass('fl-builder-touch');
917			}
918
919			// Add the builder mobile body class.
920			if(FLBuilderLayout._isMobile()) {
921				body.addClass('fl-builder-mobile');
922			}
923
924			if ( $(window).width() < FLBuilderLayoutConfig.breakpoints.small ) {
925				body.addClass( 'fl-builder-breakpoint-small' );
926			}
927
928			if ( $(window).width() > FLBuilderLayoutConfig.breakpoints.small && $(window).width() < FLBuilderLayoutConfig.breakpoints.medium ) {
929				body.addClass( 'fl-builder-breakpoint-medium' );
930			}
931
932			if ( $(window).width() > FLBuilderLayoutConfig.breakpoints.medium ) {
933				body.addClass( 'fl-builder-breakpoint-large' );
934			}
935
936			// IE11 body class.
937			if ( ua.indexOf( 'Trident/7.0' ) > -1 && ua.indexOf( 'rv:11.0' ) > -1 ) {
938				body.addClass( 'fl-builder-ie-11' );
939			}
940		},
941
942		/**
943		 * Initializes builder node backgrounds that require
944		 * additional JavaScript logic such as parallax.
945		 *
946		 * @since 1.1.4
947		 * @access private
948		 * @method _initBackgrounds
949		 */
950		_initBackgrounds: function()
951		{
952			var win = $(window);
953
954			// Init parallax backgrounds.
955			if($('.fl-row-bg-parallax').length > 0 && !FLBuilderLayout._isMobile()) {
956				FLBuilderLayout._scrollParallaxBackgrounds();
957				FLBuilderLayout._initParallaxBackgrounds();
958				win.on('scroll.fl-bg-parallax', FLBuilderLayout._scrollParallaxBackgrounds);
959			}
960
961			// Init video backgrounds.
962			if($('.fl-bg-video').length > 0) {
963				FLBuilderLayout._initBgVideos();
964				FLBuilderLayout._resizeBgVideos();
965				win.on('resize.fl-bg-video', FLBuilderLayout._resizeBgVideos);
966			}
967		},
968
969		/**
970		 * Initializes all parallax backgrounds in a layout.
971		 *
972		 * @since 1.1.4
973		 * @access private
974		 * @method _initParallaxBackgrounds
975		 */
976		_initParallaxBackgrounds: function()
977		{
978			$('.fl-row-bg-parallax').each(FLBuilderLayout._initParallaxBackground);
979		},
980
981		/**
982		 * Initializes a single parallax background.
983		 *
984		 * @since 1.1.4
985		 * @access private
986		 * @method _initParallaxBackgrounds
987		 */
988		_initParallaxBackground: function()
989		{
990			var row     = $(this),
991				content = row.find('> .fl-row-content-wrap'),
992				src     = row.data('parallax-image'),
993				loaded  = row.data('parallax-loaded'),
994				img     = new Image();
995
996			if(loaded) {
997				return;
998			}
999			else if(typeof src != 'undefined') {
1000
1001				$(img).on('load', function() {
1002					content.css('background-image', 'url(' + src + ')');
1003					row.data('parallax-loaded', true);
1004				});
1005
1006				img.src = src;
1007			}
1008		},
1009
1010		/**
1011		 * Fires when the window is scrolled to adjust
1012		 * parallax backgrounds.
1013		 *
1014		 * @since 1.1.4
1015		 * @access private
1016		 * @method _scrollParallaxBackgrounds
1017		 */
1018		_scrollParallaxBackgrounds: function()
1019		{
1020			$('.fl-row-bg-parallax').each(FLBuilderLayout._scrollParallaxBackground);
1021		},
1022
1023		/**
1024		 * Fires when the window is scrolled to adjust
1025		 * a single parallax background.
1026		 *
1027		 * @since 1.1.4
1028		 * @access private
1029		 * @method _scrollParallaxBackground
1030		 */
1031		_scrollParallaxBackground: function()
1032		{
1033			var win     = $(window),
1034				row     = $(this),
1035				content = row.find('> .fl-row-content-wrap'),
1036				speed   = row.data('parallax-speed'),
1037				offset  = content.offset(),
1038				yPos    = -((win.scrollTop() - offset.top) / speed);
1039
1040			content.css('background-position', 'center ' + yPos + 'px');
1041		},
1042
1043		/**
1044		 * Initializes all video backgrounds.
1045		 *
1046		 * @since 1.6.3.3
1047		 * @access private
1048		 * @method _initBgVideos
1049		 */
1050		_initBgVideos: function()
1051		{
1052			$('.fl-bg-video').each(FLBuilderLayout._initBgVideo);
1053		},
1054
1055		/**
1056		 * Initializes a video background.
1057		 *
1058		 * @since 1.6.3.3
1059		 * @access private
1060		 * @method _initBgVideo
1061		 */
1062		_initBgVideo: function()
1063		{
1064			var wrap   = $( this ),
1065				width       = wrap.data( 'width' ),
1066				height      = wrap.data( 'height' ),
1067				mp4         = wrap.data( 'mp4' ),
1068				youtube     = wrap.data( 'youtube'),
1069				vimeo       = wrap.data( 'vimeo'),
1070				mp4Type     = wrap.data( 'mp4-type' ),
1071				webm        = wrap.data( 'webm' ),
1072				webmType    = wrap.data( 'webm-type' ),
1073				fallback    = wrap.data( 'fallback' ),
1074				loaded      = wrap.data( 'loaded' ),
1075				videoMobile = wrap.data( 'video-mobile' ),
1076				fallbackTag = '',
1077				videoTag    = null,
1078				mp4Tag      = null,
1079				webmTag     = null;
1080
1081			// Return if the video has been loaded for this row.
1082			if ( loaded ) {
1083				return;
1084			}
1085
1086			videoTag  = $( '<video autoplay loop muted playsinline></video>' );
1087
1088			/**
1089			 * Add poster image (fallback image)
1090			 */
1091			if( 'undefined' != typeof fallback && '' != fallback ) {
1092				videoTag.attr( 'poster', 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7' )
1093				videoTag.css( 'background', 'transparent url("' + fallback + '") no-repeat center center' )
1094				videoTag.css( 'background-size', 'cover' )
1095				videoTag.css( 'height', '100%' )
1096			}
1097
1098			// MP4 Source Tag
1099			if ( 'undefined' != typeof mp4 && '' != mp4 ) {
1100
1101				mp4Tag = $( '<source />' );
1102				mp4Tag.attr( 'src', mp4 );
1103				mp4Tag.attr( 'type', mp4Type );
1104
1105				videoTag.append( mp4Tag );
1106			}
1107			// WebM Source Tag
1108			if ( 'undefined' != typeof webm && '' != webm ) {
1109
1110				webmTag = $( '<source />' );
1111				webmTag.attr( 'src', webm );
1112				webmTag.attr( 'type', webmType );
1113
1114				videoTag.append( webmTag );
1115			}
1116
1117			// This is either desktop, or mobile is enabled.
1118			if ( ! FLBuilderLayout._isMobile() || ( FLBuilderLayout._isMobile() && "yes" == videoMobile ) ) {
1119				if ( 'undefined' != typeof youtube ) {
1120					FLBuilderLayout._initYoutubeBgVideo.apply( this );
1121				}
1122				else if ( 'undefined' != typeof vimeo ) {
1123					FLBuilderLayout._initVimeoBgVideo.apply( this );
1124				}
1125				else {
1126					wrap.append( videoTag );
1127				}
1128			}
1129			else {
1130				// if we are here, it means we are on mobile and NO is set so remove video src and use fallback
1131				videoTag.attr('src', '')
1132				wrap.append( videoTag );
1133			}
1134
1135			// Mark this video as loaded.
1136			wrap.data('loaded', true);
1137		},
1138
1139		/**
1140		 * Initializes Youtube video background
1141		 *
1142		 * @since 1.9
1143		 * @access private
1144		 * @method _initYoutubeBgVideo
1145		 */
1146		_initYoutubeBgVideo: function()
1147		{
1148			var playerWrap  = $(this),
1149				videoId     = playerWrap.data('video-id'),
1150				videoPlayer = playerWrap.find('.fl-bg-video-player'),
1151				enableAudio = playerWrap.data('enable-audio'),
1152				audioButton = playerWrap.find('.fl-bg-video-audio'),
1153				startTime   = 'undefined' !== typeof playerWrap.data('start') ? playerWrap.data('start') 
1153: 0,
1154				endTime     = 'undefined' !== typeof playerWrap.data('end') ? playerWrap.data('end') : 0,
1155				loop        = 'undefined' !== typeof playerWrap.data('loop') ? playerWrap.data('loop') : 1,
1156				stateCount  = 0,
1157				player,fallback_showing;
1158
1159			if ( videoId ) {
1160				fallback = playerWrap.data('fallback') || false
1161				if( fallback ) {
1162					playerWrap.find('iframe').remove()
1163					fallbackTag = $( '<div></div>' );
1164					fallbackTag.addClass( 'fl-bg-video-fallback' );
1165					fallbackTag.css( 'background-image', 'url(' + playerWrap.data('fallback') + ')' );
1166					fallbackTag.css( 'background-size', 'cover' );
1167					fallbackTag.css( 'transition', 'background-image 1s')
1168					playerWrap.append( fallbackTag );
1169					fallback_showing = true;
1170				}
1171				FLBuilderLayout._onYoutubeApiReady( function( YT ) {
1172					setTimeout( function() {
1173
1174						player = new YT.Player( videoPlayer[0], {
1175							videoId: videoId,
1176							events: {
1177								onReady: function(event) {
1178									if ( "no" === enableAudio || FLBuilderLayout._isMobile() ) {
1179										event.target.mute();
1180									}
1181									else if ( "yes" === enableAudio && event.target.isMuted ) {
1182										event.target.unMute();
1183									}
1184
1185									// Store an instance to a parent
1186									playerWrap.data('YTPlayer', player);
1187									FLBuilderLayout._resizeYoutubeBgVideo.apply(playerWrap);
1188
1189									// Queue the video.
1190									event.target.playVideo();
1191
1192									if ( audioButton.length > 0 && ! FLBuilderLayout._isMobile() ) {
1193										audioButton.on( 'click', {button: audioButton, player: player}, FLBuilderLayout._toggleBgVideoAudio );
1194									}
1195								},
1196								onStateChange: function( event ) {
1197
1198									if ( event.data === 1 ) {
1199										if ( fallback_showing ) {
1200											$( '.fl-bg-video-fallback' ).css( 'background-image', 'url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)' )
1201										}
1202									}
1203									// Manual check if video is not playable in some browsers.
1204									// StateChange order: [-1, 3, -1]
1205									if ( stateCount < 4 ) {
1206										stateCount++;
1207									}
1208
1209									// Comply with the audio policy in some browsers like Chrome and Safari.
1210									if ( stateCount > 1 && (-1 === event.data || 2 === event.data) && "yes" === enableAudio ) {
1211										player.mute();
1212										player.playVideo();
1213										audioButton.show();
1214									}
1215
1216									if ( event.data === YT.PlayerState.ENDED && 1 === loop ) {
1217										if ( startTime > 0 ) {
1218											player.seekTo( startTime );
1219										}
1220										else {
1221											player.playVideo();
1222										}
1223									}
1224								},
1225								onError: function(event) {
1226									console.info('YT Error: ' + event.data)
1227									FLBuilderLayout._onErrorYoutubeVimeo(playerWrap)
1228								}
1229							},
1230							playerVars: {
1231								playsinline: FLBuilderLayout._isMobile() ? 1 : 0,
1232								controls: 0,
1233								showinfo: 0,
1234								rel : 0,
1235								start: startTime,
1236								end: endTime,
1237							}
1238						} );
1239					}, 1 );
1240				} );
1241			}
1242		},
1243
1244		/**
1245		 * On youtube or vimeo error show the fallback image if available.
1246		 * @since 2.0.7
1247		 */
1248		_onErrorYoutubeVimeo: function(playerWrap) {
1249
1250			fallback = playerWrap.data('fallback') || false
1251			if( ! fallback ) {
1252				return false;
1253			}
1254			playerWrap.find('iframe').remove()
1255			fallbackTag = $( '<div></div>' );
1256			fallbackTag.addClass( 'fl-bg-video-fallback' );
1257			fallbackTag.css( 'background-image', 'url(' + playerWrap.data('fallback') + ')' );
1258			playerWrap.append( fallbackTag );
1259		},
1260
1261		/**
1262		 * Check if Youtube API has been downloaded
1263		 *
1264		 * @since 1.9
1265		 * @access private
1266		 * @method _onYoutubeApiReady
1267		 * @param  {Function} callback Method to call when YT API has been loaded
1268		 */
1269		_onYoutubeApiReady: function( callback ) {
1270			if ( window.YT && YT.loaded ) {
1271				callback( YT );
1272			} else {
1273				// If not ready check again by timeout..
1274				setTimeout( function() {
1275					FLBuilderLayout._onYoutubeApiReady( callback );
1276				}, 350 );
1277			}
1278		},
1279
1280		/**
1281		 * Initializes Vimeo video background
1282		 *
1283		 * @since 1.9
1284		 * @access private
1285		 * @method _initVimeoBgVideo
1286		 */
1287		_initVimeoBgVideo: function()
1288		{
1289			var playerWrap	= $(this),
1290				videoId 	= playerWrap.data('video-id'),
1291				videoPlayer = playerWrap.find('.fl-bg-video-player'),
1292				enableAudio = playerWrap.data('enable-audio'),
1293				audioButton = playerWrap.find('.fl-bg-video-audio'),
1294				player,
1295				width = playerWrap.outerWidth();
1296
1297			if ( typeof Vimeo !== 'undefined' && videoId )	{
1298				player = new Vimeo.Player(videoPlayer[0], {
1299					id         : videoId,
1300					loop       : true,
1301					title      : false,
1302					portrait   : false,
1303					background : true,
1304					autopause  : false,
1305					muted      : true
1306				});
1307
1308				playerWrap.data('VMPlayer', player);
1309				if ( "no" === enableAudio ) {
1310					player.setVolume(0);
1311				}
1312				else if ("yes" === enableAudio ) {
1313					// Chrome and Safari have audio policy restrictions for autoplay videos.
1314					if ( $.browser.safari || $.browser.chrome ) {
1315						player.setVolume(0);
1316						audioButton.show();
1317					}
1318					else {
1319						player.setVolume(1);
1320					}
1321				}
1322
1323				player.play().catch(function(error) {
1324					FLBuilderLayout._onErrorYoutubeVimeo(playerWrap)
1325				});
1326
1327				if ( audioButton.length > 0 ) {
1328					audioButton.on( 'click', {button: audioButton, player: player}, FLBuilderLayout._toggleBgVideoAudio );
1329				}
1330			}
1331		},
1332
1333		/**
1334		 * Mute / unmute audio on row's video background.
1335		 * It works for both Youtube and Vimeo.
1336		 *
1337		 * @since 2.1.3
1338		 * @access private
1339		 * @method _toggleBgVideoAudio
1340		 * @param {Object} e Method arguments
1341		 */
1342		_toggleBgVideoAudio: function( e ) {
1343			var player  = e.data.player,
1344			    control = e.data.button.find('.fl-audio-control');
1345
1346			if ( control.hasClass( 'fa-volume-off' ) ) {
1347				// Unmute
1348				control
1349					.removeClass( 'fa-volume-off' )
1350					.addClass( 'fa-volume-up' );
1351				e.data.button.find( '.fa-times' ).hide();
1352
1353				if ( 'function' === typeof player.unMute ) {
1354					player.unMute();
1355				}
1356				else {
1357					player.setVolume( 1 );
1358				}
1359			}
1360			else {
1361				// Mute
1362				control
1363					.removeClass( 'fa-volume-up' )
1364					.addClass( 'fa-volume-off' );
1365				e.data.button.find( '.fa-times' ).show();
1366
1367				if ( 'function' === typeof player.unMute ) {
1368					player.mute();
1369				}
1370				else {
1371					player.setVolume( 0 );
1372				}
1373			}
1374		},
1375
1376		/**
1377		 * Fires when there is an error loading a video
1378		 * background source and shows the fallback.
1379		 *
1380		 * @since 1.6.3.3
1381		 * @access private
1382		 * @method _videoBgSourceError
1383		 * @param {Object} e An event object
1384		 * @deprecated 2.0.3
1385		 */
1386		_videoBgSourceError: function( e )
1387		{
1388			var source 		= $( e.target ),
1389				wrap   		= source.closest( '.fl-bg-video' ),
1390				vid		    = wrap.find( 'video' ),
1391				fallback  	= wrap.data( 'fallback' ),
1392				fallbackTag = '';
1393			source.remove();
1394
1395			if ( vid.find( 'source' ).length ) {
1396				// Don't show the fallback if we still have other sources to check.
1397				return;
1398			} else if ( '' !== fallback ) {
1399				fallbackTag = $( '<div></div>' );
1400				fallbackTag.addClass( 'fl-bg-video-fallback' );
1401				fallbackTag.css( 'background-image', 'url(' + fallback + ')' );
1402				wrap.append( fallbackTag );
1403				vid.remove();
1404			}
1405		},
1406
1407		/**
1408		 * Fires when the window is resized to resize
1409		 * all video backgrounds.
1410		 *
1411		 * @since 1.1.4
1412		 * @access private
1413		 * @method _resizeBgVideos
1414		 */
1415		_resizeBgVideos: function()
1416		{
1417			$('.fl-bg-video').each( function() {
1418
1419				FLBuilderLayout._resizeBgVideo.apply( this );
1420
1421				if ( $( this ).parent().find( 'img' ).length > 0 ) {
1422					$( this ).parent().imagesLoaded( $.proxy( FLBuilderLayout._resizeBgVideo, this ) );
1423				}
1424			} );
1425		},
1426
1427		/**
1428		 * Fires when the window is resized to resize
1429		 * a single video background.
1430		 *
1431		 * @since 1.1.4
1432		 * @access private
1433		 * @method _resizeBgVideo
1434		 */
1435		_resizeBgVideo: function()
1436		{
1437			if ( 0 === $( this ).find( 'video' ).length && 0 === $( this ).find( 'iframe' ).length ) {
1438				return;
1439			}
1440
1441			var wrap        = $(this),
1442				wrapHeight  = wrap.outerHeight(),
1443				wrapWidth   = wrap.outerWidth(),
1444				vid         = wrap.find('video'),
1445				vidHeight   = wrap.data('height'),
1446				vidWidth    = wrap.data('width'),
1447				newWidth    = wrapWidth,
1448				newHeight   = Math.round(vidHeight * wrapWidth/vidWidth),
1449				newLeft     = 0,
1450				newTop      = 0,
1451				iframe 		= wrap.find('iframe');
1452
1453			if ( vid.length ) {
1454				if(vidHeight === '' || typeof vidHeight === 'undefined' || vidWidth === '' || typeof vidWidth === 'undefined') {
1455					vid.css({
1456						'left'      : '0px',
1457						'top'       : '0px',
1458						'width'     : newWidth + 'px'
1459					});
1460
1461					// Try to set the actual video dimension on 'loadedmetadata' when using URL as video source
1462					vid.on('loadedmetadata', FLBuilderLayout._resizeOnLoadedMeta);
1463
1464				}
1465				else {
1466
1467					if(newHeight < wrapHeight) {
1468						newHeight   = wrapHeight;
1469						newWidth    = Math.round(vidWidth * wrapHeight/vidHeight);
1470						newLeft     = -((newWidth - wrapWidth)/2);
1471					}
1472					else {
1473						newTop      = -((newHeight - wrapHeight)/2);
1474					}
1475
1476					vid.css({
1477						'left'      : newLeft + 'px',
1478						'top'       : newTop + 'px',
1479						'height'    : newHeight + 'px',
1480						'width'     : newWidth + 'px'
1481					});
1482				}
1483			}
1484			else if ( iframe.length ) {
1485
1486				// Resize Youtube video player within iframe tag
1487				if ( typeof wrap.data('youtube') !== 'undefined' ) {
1488					FLBuilderLayout._resizeYoutubeBgVideo.apply(this);
1489				}
1490			}
1491		},
1492
1493		/**
1494		 * Fires when video meta has been loaded.
1495		 * This will be Triggered when width/height attributes were not specified during video background resizing.
1496		 *
1497		 * @since 1.8.5
1498		 * @access private
1499		 * @method _resizeOnLoadedMeta
1500		 */
1501		_resizeOnLoadedMeta: function(){
1502			var video 		= $(this),
1503				wrapHeight 	= video.parent().outerHeight(),
1504				wrapWidth 	= video.parent().outerWidth(),
1505				vidWidth 	= video[0].videoWidth,
1506				vidHeight 	= video[0].videoHeight,
1507				newHeight   = Math.round(vidHeight * wrapWidth/vidWidth),
1508				newWidth    = wrapWidth,
1509				newLeft     = 0,
1510				newTop 		= 0;
1511
1512			if(newHeight < wrapHeight) {
1513				newHeight   = wrapHeight;
1514				newWidth    = Math.round(vidWidth * wrapHeight/vidHeight);
1515				newLeft     = -((newWidth - wrapWidth)/2);
1516			}
1517			else {
1518				newTop      = -((newHeight - wrapHeight)/2);
1519			}
1520
1521			video.parent().data('width', vidWidth);
1522			video.parent().data('height', vidHeight);
1523
1524			video.css({
1525				'left'      : newLeft + 'px',
1526				'top'       : newTop + 'px',
1527				'width'     : newWidth + 'px',
1528				'height' 	: newHeight + 'px'
1529			});
1530		},
1531
1532		/**
1533		 * Fires when the window is resized to resize
1534		 * a single Youtube video background.
1535		 *
1536		 * @since 1.9
1537		 * @access private
1538		 * @method _resizeYoutubeBgVideo
1539		 */
1540		_resizeYoutubeBgVideo: function()
1541		{
1542			var wrap				= $(this),
1543				wrapWidth 			= wrap.outerWidth(),
1544				wrapHeight 			= wrap.outerHeight(),
1545				player 				= wrap.data('YTPlayer'),
1546				video 				= player ? player.getIframe() : null,
1547				aspectRatioSetting 	= '16:9', // Medium
1548				aspectRatioArray 	= aspectRatioSetting.split( ':' ),
1549				aspectRatio 		= aspectRatioArray[0] / aspectRatioArray[1],
1550				ratioWidth 			= wrapWidth / aspectRatio,
1551				ratioHeight 		= wrapHeight * aspectRatio,
1552				isWidthFixed 		= wrapWidth / wrapHeight > aspectRatio,
1553				width 				= isWidthFixed ? wrapWidth : ratioHeight,
1554				height 				= isWidthFixed ? ratioWidth : wrapHeight;
1555
1556			if ( video ) {
1557				$(video).width( width ).height( height );
1558			}
1559		},
1560
1561		/**
1562		 * Initializes module animations.
1563		 *
1564		 * @since 1.1.9
1565		 * @access private
1566		 * @method _initModuleAnimations
1567		 */
1568		_initModuleAnimations: function()
1569		{
1570			if(typeof jQuery.fn.waypoint !== 'undefined') {
1571				$('.fl-animation').each( function() {
1572					var node = $( this ),
1573						nodeTop = node.offset().top,
1574						winHeight = $( window ).height(),
1575						bodyHeight = $( 'body' ).height(),
1576						waypoint = FLBuilderLayoutConfig.waypoint,
1577						offset = '80%';
1578
1579					if ( typeof waypoint.offset !== undefined ) {
1580						offset = FLBuilderLayoutConfig.waypoint.offset + '%';
1581					}
1582
1583					if ( bodyHeight - nodeTop < winHeight * 0.2 ) {
1584						offset = '100%';
1585					}
1586
1587					node.waypoint({
1588						offset: offset,
1589						handler: FLBuilderLayout._doModuleAnimation
1590					});
1591				} );
1592			}
1593		},
1594
1595		/**
1596		 * Runs a module animation.
1597		 *
1598		 * @since 1.1.9
1599		 * @access private
1600		 * @method _doModuleAnimation
1601		 */
1602		_doModuleAnimation: function()
1603		{
1604			var module = 'undefined' == typeof this.element ? $(this) : $(this.element),
1605				delay = parseFloat(module.data('animation-delay')),
1606				duration = parseFloat(module.data('animation-duration'));
1607
1608			if ( ! isNaN( duration ) ) {
1609				module.css( 'animation-duration', duration + 's' );
1610			}
1611
1612			if(!isNaN(delay) && delay > 0) {
1613				setTimeout(function(){
1614					module.addClass('fl-animated');
1615				}, delay * 1000);
1616			} else {
1617				setTimeout(function(){
1618					module.addClass('fl-animated');
1619				}, 1);
1620			}
1621		},
1622
1623		/**
1624		 * Opens a tab or accordion item if the browser hash is set
1625		 * to the ID of one on the page.
1626		 *
1627		 * @since 1.6.0
1628		 * @access private
1629		 * @method _initHash
1630		 */
1631		_initHash: function()
1632		{
1633			var hash 			= window.location.hash.replace( '#', '' ).split( '/' ).shift(),
1634				element 		= null,
1635				tabs			= null,
1636				responsiveLabel	= null,
1637				tabIndex		= null,
1638				label			= null;
1639
1640			if ( '' !== hash ) {
1641
1642				try {
1643
1644					element = $( '#' + hash );
1645
1646					if ( element.length > 0 ) {
1647
1648						if ( element.hasClass( 'fl-accordion-item' ) ) {
1649							setTimeout( function() {
1650								element.find( '.fl-accordion-button' ).trigger( 'click' );
1651							}, 100 );
1652						}
1653						if ( element.hasClass( 'fl-tabs-panel' ) ) {
1654
1655							setTimeout( function() {
1656
1657								tabs 			= element.closest( '.fl-tabs' );
1658								responsiveLabel = element.find( '.fl-tabs-panel-label' );
1659								tabIndex 		= responsiveLabel.data( 'index' );
1660								label 			= tabs.find( '.fl-tabs-labels .fl-tabs-label[data-index=' + tabIndex + ']' );
1661
1662								if ( responsiveLabel.is( ':visible' ) ) {
1663									responsiveLabel.trigger( 'click' );
1664								}
1665								else {
1666									label[0].click();
1667									FLBuilderLayout._scrollToElement( element );
1668								}
1669
1670							}, 100 );
1671						}
1672					}
1673				}
1674				catch( e ) {}
1675			}
1676		},
1677
1678		/**
1679		 * Initializes all anchor links on the page for smooth scrolling.
1680		 *
1681		 * @since 1.4.9
1682		 * @access private
1683		 * @method _initAnchorLinks
1684		 */
1685		_initAnchorLinks: function()
1686		{
1687			$( 'a' ).each( FLBuilderLayout._initAnchorLink );
1688		},
1689
1690		/**
1691		 * Initializes a single anchor link for smooth scrolling.
1692		 *
1693		 * @since 1.4.9
1694		 * @access private
1695		 * @method _initAnchorLink
1696		 */
1697		_initAnchorLink: function()
1698		{
1699			var link    = $( this ),
1700				href    = link.attr( 'href' ),
1701				loc     = window.location,
1702				id      = null,
1703				element = null;
1704			if ( 'undefined' != typeof href && href.indexOf( '#' ) > -1 && link.closest('svg').length < 1 ) {
1705
1706				if ( loc.pathname.replace( /^\//, '' ) == this.pathname.replace( /^\//, '' ) && loc.hostname == this.hostname ) {
1707
1708					try {
1709
1710						id      = href.split( '#' ).pop();
1711						// If there is no ID then we have nowhere to look
1712						// Fixes a quirk in jQuery and FireFox
1713						if( ! id ) {
1714							return;
1715						}
1716						element = $( '#' + id );
1717
1718						if ( element.length > 0 ) {
1719							if ( link.hasClass( 'fl-scroll-link' ) || element.hasClass( 'fl-row' ) || element.hasClass( 'fl-col' ) || element.hasClass( 'fl-module' ) ) {
1720								$( link ).on( 'click', FLBuilderLayout._scrollToElementOnLinkClick );
1721							}
1722							if ( element.hasClass( 'fl-accordion-item' ) ) {
1723								$( link ).on( 'click', FLBuilderLayout._scrollToAccordionOnLinkClick );
1724							}
1725							if ( element.hasClass( 'fl-tabs-panel' ) ) {
1726								$( link ).on( 'click', FLBuilderLayout._scrollToTabOnLinkClick );
1727							}
1728						}
1729					}
1730					catch( e ) {}
1731				}
1732			}
1733		},
1734
1735		/**
1736		 * Scrolls to an element when an anchor link is clicked.
1737		 *
1738		 * @since 1.4.9
1739		 * @access private
1740		 * @method _scrollToElementOnLinkClick
1741		 * @param {Object} e An event object.
1742		 * @param {Function} callback A function to call when the scroll is complete.
1743		 */
1744		_scrollToElementOnLinkClick: function( e, callback )
1745		{
1746			var element = $( '#' + $( this ).attr( 'href' ).split( '#' ).pop() );
1747
1748			FLBuilderLayout._scrollToElement( element, callback );
1749
1750			e.preventDefault();
1751		},
1752
1753		/**
1754		 * Scrolls to an element.
1755		 *
1756		 * @since 1.6.4.5
1757		 * @access private
1758		 * @method _scrollToElement
1759		 * @param {Object} element The element to scroll to.
1760		 * @param {Function} callback A function to call when the scroll is complete.
1761		 */
1762		_scrollToElement: function( element, callback )
1763		{
1764			var config  = FLBuilderLayoutConfig.anchorLinkAnimations,
1765				dest    = 0,
1766				win     = $( window ),
1767				doc     = $( document );
1768
1769			if ( element.length > 0 ) {
1770
1771				if ( element.offset().top > doc.height() - win.height() ) {
1772					dest = doc.height() - win.height();
1773				}
1774				else {
1775					dest = element.offset().top - config.offset;
1776				}
1777
1778				$( 'html, body' ).animate( { scrollTop: dest }, config.duration, config.easing, function() {
1779
1780					if ( 'undefined' != typeof callback ) {
1781						callback();
1782					}
1783
1784					if ( undefined != element.attr( 'id' ) ) {
1785
1786						if ( history.pushState ) {
1787							history.pushState( null, null, '#' + element.attr( 'id' ) );
1788						}
1789						else {
1790							window.location.hash = element.attr( 'id' );
1791						}
1792					}
1793				} );
1794			}
1795		},
1796
1797		/**
1798		 * Scrolls to an accordion item when a link is clicked.
1799		 *
1800		 * @since 1.5.9
1801		 * @access private
1802		 * @method _scrollToAccordionOnLinkClick
1803		 * @param {Object} e An event object.
1804		 */
1805		_scrollToAccordionOnLinkClick: function( e )
1806		{
1807			var element = $( '#' + $( this ).attr( 'href' ).split( '#' ).pop() );
1808
1809			if ( element.length > 0 ) {
1810
1811				var callback = function() {
1812					if ( element ) {
1813						element.find( '.fl-accordion-button' ).trigger( 'click' );
1814						element = false;
1815					}
1816				};
1817
1818				FLBuilderLayout._scrollToElementOnLinkClick.call( this, e, callback );
1819			}
1820		},
1821
1822		/**
1823		 * Scrolls to a tab panel when a link is clicked.
1824		 *
1825		 * @since 1.5.9
1826		 * @access private
1827		 * @method _scrollToTabOnLinkClick
1828		 * @param {Object} e An event object.
1829		 */
1830		_scrollToTabOnLinkClick: function( e )
1831		{
1832			var element 		= $( '#' + $( this ).attr( 'href' ).split( '#' ).pop() ),
1833				tabs			= null,
1834				label   		= null,
1835				responsiveLabel = null;
1836
1837			if ( element.length > 0 ) {
1838
1839				tabs 			= element.closest( '.fl-tabs' );
1840				responsiveLabel = element.find( '.fl-tabs-panel-label' );
1841				tabIndex 		= responsiveLabel.data( 'index' );
1842				label 			= tabs.find( '.fl-tabs-labels .fl-tabs-label[data-index=' + tabIndex + ']' );
1843
1844				if ( responsiveLabel.is( ':visible' ) ) {
1845
1846					var callback = function() {
1847						if ( element ) {
1848							responsiveLabel.trigger( 'click' );
1849							element = false;
1850						}
1851					};
1852
1853					FLBuilderLayout._scrollToElementOnLinkClick.call( this, e, callback );
1854				}
1855				else {
1856					label[0].click();
1857					FLBuilderLayout._scrollToElement( element );
1858				}
1859
1860				e.preventDefault();
1861			}
1862		},
1863
1864		/**
1865		 * Initializes all builder forms on a page.
1866		 *
1867		 * @since 1.5.4
1868		 * @access private
1869		 * @method _initForms
1870		 */
1871		_initForms: function()
1872		{
1873			if ( ! FLBuilderLayout._hasPlaceholderSupport ) {
1874				$( '.fl-form-field input' ).each( FLBuilderLayout._initFormFieldPlaceholderFallback );
1875			}
1876
1877			$( '.fl-form-field input' ).on( 'focus', FLBuilderLayout._clearFormFieldError );
1878		},
1879
1880		/**
1881		 * Checks to see if the current device has HTML5
1882		 * placeholder support.
1883		 *
1884		 * @since 1.5.4
1885		 * @access private
1886		 * @method _hasPlaceholderSupport
1887		 * @return {Boolean}
1888		 */
1889		_hasPlaceholderSupport: function()
1890		{
1891			var input = document.createElement( 'input' );
1892
1893			return 'undefined' != input.placeholder;
1894		},
1895
1896		/**
1897		 * Initializes the fallback for when placeholders aren't supported.
1898		 *
1899		 * @since 1.5.4
1900		 * @access private
1901		 * @method _initFormFieldPlaceholderFallback
1902		 */
1903		_initFormFieldPlaceholderFallback: function()
1904		{
1905			var field       = $( this ),
1906				val         = field.val(),
1907				placeholder = field.attr( 'placeholder' );
1908
1909			if ( 'undefined' != placeholder && '' === val ) {
1910				field.val( placeholder );
1911				field.on( 'focus', FLBuilderLayout._hideFormFieldPlaceholderFallback );
1912				field.on( 'blur', FLBuilderLayout._showFormFieldPlaceholderFallback );
1913			}
1914		},
1915
1916		/**
1917		 * Hides a fallback placeholder on focus.
1918		 *
1919		 * @since 1.5.4
1920		 * @access private
1921		 * @method _hideFormFieldPlaceholderFallback
1922		 */
1923		_hideFormFieldPlaceholderFallback: function()
1924		{
1925			var field       = $( this ),
1926				val         = field.val(),
1927				placeholder = field.attr( 'placeholder' );
1928
1929			if ( val == placeholder ) {
1930				field.val( '' );
1931			}
1932		},
1933
1934		/**
1935		 * Shows a fallback placeholder on blur.
1936		 *
1937		 * @since 1.5.4
1938		 * @access private
1939		 * @method _showFormFieldPlaceholderFallback
1940		 */
1941		_showFormFieldPlaceholderFallback: function()
1942		{
1943			var field       = $( this ),
1944				val         = field.val(),
1945				placeholder = field.attr( 'placeholder' );
1946
1947			if ( '' === val ) {
1948				field.val( placeholder );
1949			}
1950		},
1951
1952		/**
1953		 * Clears a form field error message.
1954		 *
1955		 * @since 1.5.4
1956		 * @access private
1957		 * @method _clearFormFieldError
1958		 */
1959		_clearFormFieldError: function()
1960		{
1961			var field = $( this );
1962
1963			field.removeClass( 'fl-form-error' );
1964			field.siblings( '.fl-form-error-message' ).hide();
1965		}
1966	};
1967
1968	/* Initializes the builder layout. */
1969	$(function(){
1970		FLBuilderLayout.init();
1971	});
1972
1973})(jQuery);
1974
1975/* Start Global JS */
1976
1977/* End Global JS */
1978
1979
1980(function($) {
1981
1982	PPAdvancedTabs = function( settings )
1983	{
1984		this.settings 	= settings;
1985		this.nodeClass  = '.fl-node-' + settings.id;
1986		this._init();
1987	};
1988
1989	PPAdvancedTabs.prototype = {
1990
1991		settings	: {},
1992		nodeClass   : '',
1993
1994		_init: function()
1995		{
1996			var win = $(window);
1997
1998			$(this.nodeClass + ' .pp-tabs-labels .pp-tabs-label').click($.proxy(this._labelClick, this));
1999			$(this.nodeClass + ' .pp-tabs-panels .pp-tabs-label').click($.proxy(this._responsiveLabelClick, this));
2000
2001			this._responsiveCollapsed();
2002
2003			if($(this.nodeClass + ' .pp-tabs-vertical').length > 0) {
2004				this._resize();
2005				win.off('resize' + this.nodeClass);
2006				win.on('resize' + this.nodeClass, $.proxy(this._resize, this));
2007			}
2008
2009			this._hashChange();
2010
2011			$(window).on('hashchange', $.proxy( this._hashChange, this ));
2012			//$(window).on('resize', $.proxy( this._responsiveCollapsed, this ));
2013		},
2014
2015		_hashChange: function()
2016		{
2017			if( location.hash && $(location.hash).length > 0 ) {
2018				var element = $(location.hash + '.pp-tabs-label');
2019				if ( element && element.length > 0 ) {
2020					var header = $('.fl-theme-builder-header-sticky');
2021					var offset = header.length > 0 ? header.height() + 32 : 120;
2022					location.href = '#';
2023					$('html, body').animate({
2024						scrollTop: element.parents('.pp-tabs').offset().top - offset
2025					}, 50, function() {
2026						if ( ! element.hasClass('pp-tab-active') ) {
2027							element.trigger('click');
2028						}
2029					});
2030				}
2031			}
2032		},
2033
2034		_labelClick: function(e)
2035		{
2036			var label       = $(e.target).closest('.pp-tabs-label'),
2037				index       = label.data('index'),
2038				wrap        = label.closest('.pp-tabs'),
2039				allIcons    = wrap.find('.pp-tabs-label .fa'),
2040				icon        = wrap.find('.pp-tabs-label[data-index="' + index + '"] .fa');
2041
2042			// Toggle the responsive icons.
2043			//allIcons.addClass('fa-plus');
2044			//icon.removeClass('fa-plus');
2045
2046			if ( wrap.hasClass('pp-tabs-vertical') ) {
2047				var header = $('.fl-theme-builder-header-sticky');
2048				var offset = header.length > 0 ? header.height() + 32 : 120;
2049				$('html, body').animate({
2050					scrollTop: wrap.offset().top - offset
2051				}, 500 );
2052			}
2053
2054			// Toggle the tabs.
2055			wrap.find('.pp-tabs-labels:first > .pp-tab-active').removeClass('pp-tab-active');
2056			wrap.find('.pp-tabs-panels:first > .pp-tabs-panel > .pp-tab-active').removeClass('pp-tab-active');
2057			wrap.find('.pp-tabs-panels:first > .pp-tabs-panel > .pp-tabs-label').removeClass('pp-tab-active');
2058
2059			wrap.find('.pp-tabs-labels:first > .pp-tabs-label[data-index="' + index + '"]').addClass('pp-tab-active');
2060			wrap.find('.pp-tabs-panels:first > .pp-tabs-panel > .pp-tabs-panel-content[data-index="' + index + '"]').addClass('pp-tab-active');
2061			wrap.find('.pp-tabs-panels:first > .pp-tabs-panel > .pp-tabs-label[data-index="' + index + '"]').addClass('pp-tab-active');
2062
2063			// Gallery module support.
2064			FLBuilderLayout.refreshGalleries( wrap.find('.pp-tabs-panel-content[data-index="' + index + '"]') );
2065
2066			// Content Grid module support.
2067			if ( 'undefined' !== typeof $.fn.isotope ) {
2068				wrap.find('.pp-tabs-panel-content[data-index="' + index + '"] .pp-content-post-grid').isotope('layout');
2069				this._gridLayoutMatchHeight();
2070			}
2071
2072			$(document).trigger('pp-tabs-switched', [ wrap.find( '.pp-tabs-panel-content[data-index="' + index + '"]' ) ]);
2073		},
2074
2075		_responsiveLabelClick: function(e)
2076		{
2077			var label           = $(e.target).closest('.pp-tabs-label'),
2078				wrap            = label.closest('.pp-tabs'),
2079				index           = label.data('index'),
2080				content         = label.siblings('.pp-tabs-panel-content'),
2081				activeContent   = wrap.find('.pp-tabs-panel-content.pp-tab-active'),
2082				activeIndex     = activeContent.data('index'),
2083				allIcons        = wrap.find('.pp-tabs-label .fa'),
2084				icon            = label.find('.fa');
2085
2086			// Should we proceed?
2087			if(index == activeIndex) {
2088				activeContent.slideUp('normal');
2089				activeContent.removeClass('pp-tab-active');
2090				$(this.nodeClass + ' .pp-tabs-panels .pp-tabs-label').removeClass('pp-tab-active');
2091				wrap.removeClass('pp-tabs-animation');
2092				return;
2093			}
2094			if(wrap.hasClass('pp-tabs-animation')) {
2095				return;
2096			}
2097
2098			// Toggle the icons.
2099			//allIcons.addClass('fa-plus');
2100			//icon.removeClass('fa-plus');
2101
2102			// Run the animations.
2103			wrap.addClass('pp-tabs-animation');
2104			activeContent.slideUp('normal');
2105
2106
2107			content.slideDown('normal', function(){
2108
2109				wrap.find('.pp-tab-active').removeClass('pp-tab-active');
2110				wrap.find('.pp-tabs-label[data-index="' + index + '"]').addClass('pp-tab-active');
2111				content.addClass('pp-tab-active');
2112				wrap.removeClass('pp-tabs-animation');
2113
2114				// Gallery module support.
2115				FLBuilderLayout.refreshGalleries( content );
2116
2117				// Content Grid module support.
2118				if ( 'undefined' !== typeof $.fn.isotope ) {
2119					content.find('.pp-content-post-grid').isotope('layout');
2120				}
2121
2122				if(label.offset().top < $(window).scrollTop() + 100) {
2123					$('html, body').animate({ scrollTop: label.offset().top - 100 }, 500, 'swing');
2124				}
2125
2126				$(document).trigger('pp-tabs-switched', [ content ]);
2127			});
2128		},
2129
2130		_resize: function()
2131		{
2132			$(this.nodeClass + ' .pp-tabs-vertical').each($.proxy(this._resizeVertical, this));
2133		},
2134
2135		_resizeVertical: function(e)
2136		{
2137			var wrap    = $(this.nodeClass + ' .pp-tabs-vertical'),
2138				labels  = wrap.find('.pp-tabs-labels'),
2139				panels  = wrap.find('.pp-tabs-panels');
2140
2141			panels.css('min-height', labels.height() + 'px');
2142		},
2143
2144		_gridLayoutMatchHeight: function()
2145		{
2146			var highestBox = 0;
2147			var contentHeight = 0;
2148
2149            $(this.nodeClass).find('.pp-equal-height .pp-content-post').css('height', '').each(function(){
2150
2151                if($(this).height() > highestBox) {
2152                	highestBox = $(this).height();
2153                	contentHeight = $(this).find('.pp-content-post-data').outerHeight();
2154                }
2155            });
2156
2157            $(this.nodeClass).find('.pp-equal-height .pp-content-post').height(highestBox);
2158            //$(this.postClass).find('.pp-content-post-data').css('min-height', contentHeight + 'px').addClass('pp-content-relative');
2159		},
2160
2161		_responsiveCollapsed: function()
2162		{
2163			if ( $(window).innerWidth() < 769 ) {
2164				if ( this.settings.responsiveClosed ) {
2165					$(this.nodeClass + ' .pp-tabs-panels .pp-tabs-label.pp-tab-active').trigger('click');
2166				}
2167				$(this.nodeClass + ' .pp-tabs-panels').css('visibility', 'visible');
2168			}
2169		}
2170	};
2171
2172})(jQuery);
2173;(function($) {
2174
2175	$(function() {
2176
2177		new PPAdvancedTabs({
2178			id: '5e9f870d3a019',
2179			responsiveClosed: false,
2180		});
2181
2182		$('.fl-node-5e9f870d3a019 .pp-tabs-style-2 .pp-tabs-label.pp-tab-active').prev().addClass('pp-no-border');
2183		$('.fl-node-5e9f870d3a019 .pp-tabs-style-2 .pp-tabs-label').on('click', function() {
2184			$('.fl-node-5e9f870d3a019 .pp-tabs-style-2 .pp-tabs-label').removeClass('pp-no-border');
2185			$('.fl-node-5e9f870d3a019 .pp-tabs-style-2 .pp-tabs-label.pp-tab-active').prev().addClass('pp-no-border');
2186		});
2187
2188		if($(window).width() > 768) {
2189			$('.fl-node-5e9f870d3a019 .pp-tabs-vertical .pp-tabs-panel-content').css('min-height', $('.fl-node-5e9f870d3a019 .pp-tabs-vertical .pp-tabs-labels').outerHeight() + 'px');
2190		}
2191
2192		if( $(window).width() <= 768 ) {
2193			$('.fl-node-5e9f870d3a019 .pp-tabs-label .pp-tab-close').on('click', function() {
2194				$(this).parents('.pp-tabs-label').removeClass('pp-tab-active');
2195			});
2196		}
2197	});
2198
2199})(jQuery);
2200
2201/**
2202 * This file should contain frontend logic for 
2203 * all module instances.
2204 *//**
2205 * This file should contain frontend JavaScript that
2206 * will be applied to individual module instances.
2207 *
2208 * $module An instance of your module class.
2209 * $id The module's ID.
2210 * $settings The module's settings.
2211 */
2212jQuery(function($) {
2213	
2214		$(function() {
2215		$( '.fl-node-5e9f8b713f8b0 .fl-photo-img' )
2216			.on( 'mouseenter', function( e ) {
2217				$( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' );
2218			} )
2219			.on( 'mouseleave', function( e ){
2220				$( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null );
2221			} );
2222	});
2223	});
2224jQuery(function($) {
2225	
2226		$(function() {
2227		$( '.fl-node-5e9f8c50d57d7 .fl-photo-img' )
2228			.on( 'mouseenter', function( e ) {
2229				$( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' );
2230			} )
2231			.on( 'mouseleave', function( e ){
2232				$( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null );
2233			} );
2234	});
2235	});
2236jQuery(function($) {
2237	
2238		$(function() {
2239		$( '.fl-node-5e9f923c56798 .fl-photo-img' )
2240			.on( 'mouseenter', function( e ) {
2241				$( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' );
2242			} )
2243			.on( 'mouseleave', function( e ){
2244				$( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null );
2245			} );
2246	});
2247	});
2248(function($) {
2249
2250        $(".fl-node-5e9f925080ced table.pp-table-content tbody tr:nth-child(odd)").addClass("odd");
2251		$(".fl-node-5e9f925080ced table.pp-table-content tbody tr:nth-child(even)").addClass("even");
2252
2253		$( document ).trigger( "enhance.tablesaw" );
2254
2255		$(document).on('pp-tabs-switched', function(e, selector) {
2256			if ( selector.find('.pp-table-content').length > 0 ) {
2257				$( window ).trigger( "resize" );
2258			}
2259		});
2260
2261})(jQuery);
2262jQuery(function($) {
2263	
2264		$(function() {
2265		$( '.fl-node-5e9f91bf4e618 .fl-photo-img' )
2266			.on( 'mouseenter', function( e ) {
2267				$( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' );
2268			} )
2269			.on( 'mouseleave', function( e ){
2270				$( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null );
2271			} );
2272	});
2273	});
2274jQuery(function($) {
2275	
2276		$(function() {
2277		$( '.fl-node-5e9f938762f9c .fl-photo-img' )
2278			.on( 'mouseenter', function( e ) {
2279				$( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' );
2280			} )
2281			.on( 'mouseleave', function( e ){
2282				$( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null );
2283			} );
2284	});
2285	});
2286jQuery(function($) {
2287	
2288		$(function() {
2289		$( '.fl-node-5e9f99734b6c7 .fl-photo-img' )
2290			.on( 'mouseenter', function( e ) {
2291				$( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' );
2292			} )
2293			.on( 'mouseleave', function( e ){
2294				$( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null );
2295			} );
2296	});
2297	});
2298(function($) {
2299
2300        $(".fl-node-5e9f9978865a5 table.pp-table-content tbody tr:nth-child(odd)").addClass("odd");
2301		$(".fl-node-5e9f9978865a5 table.pp-table-content tbody tr:nth-child(even)").addClass("even");
2302
2303		$( document ).trigger( "enhance.tablesaw" );
2304
2305		$(document).on('pp-tabs-switched', function(e, selector) {
2306			if ( selector.find('.pp-table-content').length > 0 ) {
2307				$( window ).trigger( "resize" );
2308			}
2309		});
2310
2311})(jQuery);
2312jQuery(function($) {
2313	
2314		$(function() {
2315		$( '.fl-node-5e9f9964943c9 .fl-photo-img' )
2316			.on( 'mouseenter', function( e ) {
2317				$( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' );
2318			} )
2319			.on( 'mouseleave', function( e ){
2320				$( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null );
2321			} );
2322	});
2323	});
2324jQuery(function($) {
2325	
2326		$(function() {
2327		$( '.fl-node-5e9f992b2a4d0 .fl-photo-img' )
2328			.on( 'mouseenter', function( e ) {
2329				$( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' );
2330			} )
2331			.on( 'mouseleave', function( e ){
2332				$( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null );
2333			} );
2334	});
2335	});
2336
2337; (function ($) {
2338
2339	PPCategoryGridSlider = function (settings) {
2340		this.id = settings.id;
2341		this.nodeClass = '.fl-node-' + settings.id;
2342		this.wrapperClass = this.nodeClass + ' .swiper-wrapper';
2343		this.elements = '';
2344		this.slidesPerView = settings.slidesPerView;
2345		this.slidesToScroll = settings.slidesToScroll;
2346		this.settings = settings;
2347		this.swipers = {};
2348
2349		if (typeof Swiper === 'undefined') {
2350			$(window).load($.proxy(function () {
2351				if (typeof Swiper === 'undefined') {
2352					return;
2353				} else {
2354					this._init();
2355				}
2356			}, this));
2357		} else {
2358			this._init();
2359		}
2360	};
2361
2362	PPCategoryGridSlider.prototype = {
2363		id: '',
2364		nodeClass: '',
2365		wrapperClass: '',
2366		elements: '',
2367		slidesPerView: {},
2368		slidesToScroll: {},
2369		settings: {},
2370		swipers: {},
2371
2372		_init: function () {
2373			this.elements = {
2374				mainSwiper: this.nodeClass + ' .swiper-container'
2375			};
2376
2377			this.elements.swiperSlide = $(this.elements.mainSwiper).find('.swiper-slide');
2378
2379
2380			if (1 >= this._getSlidesCount()) {
2381				return;
2382			}
2383
2384			var swiperOptions = this._getSwiperOptions();
2385
2386			this.swipers.main = new Swiper(this.elements.mainSwiper, swiperOptions.main);
2387		},
2388
2389		_getEffect: function () {
2390			return this.settings.effect;
2391		},
2392
2393		_getSlidesCount: function () {
2394			return this.elements.swiperSlide.length;
2395		},
2396
2397		_getInitialSlide: function () {
2398			return this.settings.initialSlide;
2399		},
2400
2401		_getSpaceBetween: function () {
2402			var space = this.settings.spaceBetween.desktop,
2403				space = parseInt(space);
2404
2405			if (isNaN(space)) {
2406				space = 20;
2407			}
2408
2409			return space;
2410		},
2411
2412		_getSpaceBetweenTablet: function () {
2413			var space = this.settings.spaceBetween.tablet,
2414				space = parseInt(space);
2415
2416			if (isNaN(space)) {
2417				space = this._getSpaceBetween();
2418			}
2419
2420			return space;
2421		},
2422
2423		_getSpaceBetweenMobile: function () {
2424			var space = this.settings.spaceBetween.mobile,
2425				space = parseInt(space);
2426
2427			if (isNaN(space)) {
2428				space = this._getSpaceBetweenTablet();
2429			}
2430
2431			return space;
2432		},
2433
2434		_getSlidesPerView: function () {
2435			if (this._isSlideshow()) {
2436				return 1;
2437			}
2438
2439			var slidesPerView = this.slidesPerView.desktop;
2440
2441			return Math.min(this._getSlidesCount(), +slidesPerView);
2442		},
2443
2444		_getSlidesPerViewTablet: function () {
2445			if (this._isSlideshow()) {
2446				return 1;
2447			}
2448
2449			var slidesPerView = this.slidesPerView.tablet;
2450
2451			if (slidesPerView === '' || slidesPerView === 0) {
2452				slidesPerView = this.slidesPerView.desktop
2453			}
2454
2455			if (!slidesPerView && 'coverflow' === this.settings.type) {
2456				return Math.min(this._getSlidesCount(), 3);
2457			}
2458
2459			return Math.min(this._getSlidesCount(), +slidesPerView);
2460		},
2461
2462		_getSlidesPerViewMobile: function () {
2463			if (this._isSlideshow()) {
2464				return 1;
2465			}
2466
2467			var slidesPerView = this.slidesPerView.mobile;
2468
2469			if (slidesPerView === '' || slidesPerView === 0) {
2470				slidesPerView = this._getSlidesPerViewTablet();
2471			}
2472
2473			if (!slidesPerView && 'coverflow' === this.settings.type) {
2474				return Math.min(this._getSlidesCount(), 3);
2475			}
2476
2477			return Math.min(this._getSlidesCount(), +slidesPerView);
2478		},
2479
2480		_getSlidesToScroll: function (device) {
2481			if (!this._isSlideshow() && 'slide' === this._getEffect()) {
2482				var slides = this.slidesToScroll[device];
2483
2484				return Math.min(this._getSlidesCount(), +slides || 1);
2485			}
2486
2487			return 1;
2488		},
2489
2490		_getSlidesToScrollDesktop: function () {
2491			return this._getSlidesToScroll('desktop');
2492		},
2493
2494		_getSlidesToScrollTablet: function () {
2495			return this._getSlidesToScroll('tablet');
2496		},
2497
2498		_getSlidesToScrollMobile: function () {
2499			return this._getSlidesToScroll('mobile');
2500		},
2501
2502		_getSwiperOptions: function () {
2503
2504			var medium_breakpoint = this.settings.breakpoint.medium,
2505				responsive_breakpoint = this.settings.breakpoint.responsive;
2506
2507			var options = {
2508				navigation: {
2509					prevEl: '.pp-categories-container .swiper-button-prev',
2510					nextEl: '.pp-categories-container .swiper-button-next'
2511				},
2512				pagination: {
2513					el: '.pp-categories-container .swiper-pagination',
2514					type: this.settings.pagination,
2515					clickable: true
2516				},
2517				grabCursor: true,
2518				effect: this._getEffect(),
2519				initialSlide: this._getInitialSlide(),
2520				slidesPerView: this._getSlidesPerView(),
2521				slidesPerGroup: this._getSlidesToScrollDesktop(),
2522				spaceBetween: this._getSpaceBetween(),
2523				loop: true,
2524				loopedSlides: this._getSlidesCount(),
2525				speed: this.settings.speed,
2526				breakpoints: {},
2527				initialSlide : 0
2528			};
2529
2530			if (!this.settings.isBuilderActive && this.settings.autoplay_speed !== false) {
2531				options.autoplay = {
2532					delay: this.settings.autoplay_speed,
2533					disableOnInteraction: this.settings.pause_on_interaction
2534				};
2535			}
2536
2537			if ('cube' !== this._getEffect()) {
2538				options.breakpoints[medium_breakpoint] = {
2539					slidesPerView: this._getSlidesPerViewTablet(),
2540					slidesPerGroup: this._getSlidesToScrollTablet(),
2541					spaceBetween: this._getSpaceBetweenTablet()
2542				};
2543				options.breakpoints[responsive_breakpoint] = {
2544					slidesPerView: this._getSlidesPerViewMobile(),
2545					slidesPerGroup: this._getSlidesToScrollMobile(),
2546					spaceBetween: this._getSpaceBetweenMobile()
2547				};
2548			}
2549
2550			if ( 'coverflow' === this.settings.type ) {
2551				options.effect = 'coverflow';
2552				options.slidesPerView = 3;
2553				options.slidesPerGroup = 1;
2554				options.breakpoints[medium_breakpoint] = {
2555					slidesPerView: 1,
2556					slidesPerGroup: 1,
2557				};
2558				options.breakpoints[responsive_breakpoint] = {
2559					slidesPerView: 1,
2560					slidesPerGroup: 1,
2561				};
2562			}
2563
2564			if (this._isSlideshow()) {
2565				options.slidesPerView = 1;
2566
2567				delete options.pagination;
2568				delete options.breakpoints;
2569			}
2570
2571			return {
2572				main: options,
2573			};
2574		},
2575
2576		_isSlideshow: function () {
2577			return 'slideshow' === this.settings.type;
2578		},
2579
2580		_onElementChange: function (property) {
2581			if (0 === property.indexOf('width')) {
2582				this.swipers.main.onResize();
2583			}
2584
2585			if (0 === property.indexOf('spaceBetween')) {
2586				this._updateSpaceBetween(this.swipers.main, property);
2587			}
2588		},
2589
2590		_updateSpaceBetween: function (swiper, property) {
2591			var newSpaceBw = this._getSpaceBetween(),
2592				deviceMatch = property.match('space_between_(.*)');
2593
2594			if (deviceMatch) {
2595				var breakpoints = {
2596					tablet: this.settings.breakpoint.medium,
2597					mobile: this.settings.breakpoint.responsive
2598				};
2599
2600				swiper.params.breakpoints[breakpoints[deviceMatch[1]]].spaceBetween = newSpaceBw;
2601			} else {
2602				swiper.originalParams.spaceBetween = newSpaceBw;
2603			}
2604
2605			swiper.params.spaceBetween = newSpaceBw;
2606
2607			swiper.onResize();
2608		},
2609	};
2610
2611})(jQuery);var carousel_5eab8dd055481 = '';
2612;(function($) {
2613	
2614	
2615	var settings = {
2616		id: '5eab8dd055481',
2617		type: 'carousel',
2618		initialSlide: 0,
2619		slidesPerView: {
2620			desktop: 3,
2621			tablet: 3,
2622			mobile: 3,
2623		},
2624		slidesToScroll: {
2625			desktop: 1,
2626			tablet: 1,
2627			mobile: 1,
2628		},
2629		slideshow_slidesPerView: {
2630			desktop: '',
2631			tablet: '',
2632			mobile: '',
2633		},
2634		spaceBetween: {
2635			desktop: '10',
2636			tablet: '',
2637			mobile: '',
2638		},
2639		isBuilderActive: false,
2640		pagination: 'bullets',
2641		autoplay_speed: 5000,
2642		pause_on_interaction: true,
2643		effect: 'slide',
2644		speed: 1000,
2645		breakpoint: {
2646			medium: 992,
2647			responsive: 768		},
2648	};
2649
2650	
2651
2652})(jQuery);
2653var carousel_5eab8dde65536 = '';
2654;(function($) {
2655	
2656	
2657	var settings = {
2658		id: '5eab8dde65536',
2659		type: 'carousel',
2660		initialSlide: 0,
2661		slidesPerView: {
2662			desktop: 3,
2663			tablet: 3,
2664			mobile: 3,
2665		},
2666		slidesToScroll: {
2667			desktop: 1,
2668			tablet: 1,
2669			mobile: 1,
2670		},
2671		slideshow_slidesPerView: {
2672			desktop: '',
2673			tablet: '',
2674			mobile: '',
2675		},
2676		spaceBetween: {
2677			desktop: '10',
2678			tablet: '',
2679			mobile: '',
2680		},
2681		isBuilderActive: false,
2682		pagination: 'bullets',
2683		autoplay_speed: 5000,
2684		pause_on_interaction: true,
2685		effect: 'slide',
2686		speed: 1000,
2687		breakpoint: {
2688			medium: 992,
2689			responsive: 768		},
2690	};
2691
2692	
2693
2694})(jQuery);
2695/**
2696 * This file should contain frontend JavaScript that
2697 * will be applied to individual module instances.
2698 *
2699 * $module An instance of your module class.
2700 * $id The module's ID.
2701 * $settings The module's settings.
2702 */
2703
2704/* Start Global Node Custom JS */
2705
2706/* End Global Node Custom JS */
2707
2708
2709/* Start Layout Custom JS */
2710
2711/* End Layout Custom JS */
2712
2713(function($) {
2714
2715	
2716	// generating html structure
2717	var html = '<div class="bb-er-row">';
2718		 html += '<div class="bb-er-title-section">';
2719		 			 html += '<span class="bb-er-title">Show More</span>';
2720		 html += '</div>';
2721		 html += '</div>';
2722
2723	// appending html structure on respective row
2724	$('.fl-row.fl-node-5eab902c646ae').prepend(html);
2725	
2726	// after click on row
2727	$('.fl-node-5eab902c646ae .bb-er-row').click(function() {
2728
2729		// appear effect
2730					$('.fl-node-5eab902c646ae .fl-row-content-wrap').slideToggle();
2731		
2732		// toggle class
2733		$('.fl-node-5eab902c646ae .bb-er-row').toggleClass("bber-expanded");
2734		
2735		// toggle title
2736		( $('.fl-node-5eab902c646ae  .bb-er-title').text() == 'Show More' ) ? $('.fl-node-5eab902c646ae  .bb-er-title').text('Show Less') : $('.fl-node-5eab902c646ae  .bb-er-title').text('Show More');
2737
2738		// toggle icon
2739		
2740		// toggle background
2741		
2742		// toggle image icon
2743		
2744	});
2745
2746})(jQuery);

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