PageSourceSearch

https://www.getgordon.com/wp-content/uploads/bb-plugin/cache/a4cc5…11c3a31e9-layout-bundle.js?ver=2.11.1-1.6.1

js getgordon.com collected 2026-10-01 13:15:13 UTC 57,848 bytes, 2,009 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});
622
623/* Start Layout Custom JS */
624
625/* End Layout Custom JS */
626
627(function($){
628
629	/**
630	 * Helper class for header layout logic.
631	 *
632	 * @since 1.0
633	 * @class FLThemeBuilderHeaderLayout
634	 */
635	FLThemeBuilderHeaderLayout = {
636
637		/**
638		 * A reference to the window object for this page.
639		 *
640		 * @since 1.0
641		 * @property {Object} win
642		 */
643		win : null,
644
645		/**
646		 * A reference to the body object for this page.
647		 *
648		 * @since 1.0
649		 * @property {Object} body
650		 */
651		body : null,
652
653		/**
654		 * A reference to the header object for this page.
655		 *
656		 * @since 1.0
657		 * @property {Object} header
658		 */
659		header : null,
660
661		/**
662		 * Whether this header overlays the content or not.
663		 *
664		 * @since 1.0
665		 * @property {Boolean} overlay
666		 */
667		overlay : false,
668
669		/**
670		 * Whether the page has the WP admin bar or not.
671		 *
672		 * @since 1.0
673		 * @property {Boolean} hasAdminBar
674		 */
675		hasAdminBar : false,
676
677		/**
678		 * Breakpoint for when the sticky header should apply.
679		 *
680		 * @since 1.4
681		 * @property {String} stickyOn
682		 */
683		stickyOn: '',
684
685		/**
686		 * A reference of the sticky and shrink header breakpoint.
687		 *
688		 * @since 1.2.5
689		 * @property {Number} breakpointWidth
690		 */
691		breakpointWidth: 0,
692
693		/**
694		 * Whether this header can be pinned from page load.
695		 *
696		 * @since 1.6.1
697		 * @property {Boolean} pinnable
698		 */
699		pinnable : false,
700
701		/**
702		 * Initializes header layout logic.
703		 *
704		 * @since 1.0
705		 * @method init
706		 */
707		init: function()
708		{
709			var editing          = $( 'html.fl-builder-edit' ).length,
710				header           = $( '.fl-builder-content[data-type=header]' ),
711				menuModule       = header.find( '.fl-module-menu' ),
712				breakpoint       = null,
713				adminBarHeight   = 0;
714
715			if ( ! editing && header.length ) {
716
717				header.imagesLoaded( $.proxy( function() {
718
719					this.win         = $( window );
720					this.body        = $( 'body' );
721					this.header      = header.eq( 0 );
722					this.overlay     = !! Number( header.attr( 'data-overlay' ) );
723					this.hasAdminBar = !! $( 'body.admin-bar' ).length;
724					this.stickyOn    = this.header.data( 'sticky-on' );
725					breakpoint       = this.header.data( 'sticky-breakpoint' );
726
727					if ( '' == this.stickyOn ) {
728						if ( typeof FLBuilderLayoutConfig.breakpoints[ breakpoint ] !== undefined ) {
729							this.breakpointWidth = FLBuilderLayoutConfig.breakpoints[ breakpoint ];
730						}
731						else {
732							this.breakpointWidth = FLBuilderLayoutConfig.breakpoints.medium;
733						}
734					}
735
736					if ( Number( header.attr( 'data-sticky' ) ) ) {
737
738						this.header.data( 'original-top', this.header.offset().top );
739
740						// The pin decision is made once here, while the header offset and the admin bar height are read from the same layout.
741						adminBarHeight = $( '#wpadminbar' ).length ? $( '#wpadminbar' ).outerHeight() : 0;
742						this.pinnable  = this.overlay && this.header.data( 'original-top' ) <= adminBarHeight;
743
744						this.win.on( 'resize', $.throttle( 500, $.proxy( this._initSticky, this ) ) );
745						this._initSticky();
746
747					}
748
749				}, this ) );
750			}
751		},
752
753		/**
754		 * Initializes sticky logic for a header.
755		 *
756		 * @since 1.0
757		 * @access private
758		 * @method _initSticky
759		 */
760		_initSticky: function( e )
761		{
762			var header     = $('.fl-builder-content[data-type=header]'),
763				windowSize = this.win.width(),
764				makeSticky = false;
765
766			makeSticky = this._makeWindowSticky( windowSize );
767			if ( makeSticky || ( this.breakpointWidth > 0 && windowSize >= this.breakpointWidth ) ) {
768				this.win.on( 'scroll.fl-theme-builder-header-sticky', $.proxy( this._doSticky, this ) );
769				this._initPin();
770
771				// Apply the sticky state on initial load when the page is
772				// already scrolled past the header — e.g. when the browser
773				// restores the scroll position on refresh. Overlay headers are
774				// out of scope here; this mirrors the shrink-on-load behavior
775				// in _initShrink().
776				if ( ! e && ! this.overlay && ! this.header.hasClass( 'fl-theme-builder-header-sticky' ) ) {
777					var loadWinTop    = this.win.scrollTop(),
778						loadHeaderTop = Math.floor( this.header.data( 'original-top' ) );
779
780					if ( this.hasAdminBar && windowSize > 600 ) {
781						loadWinTop += Math.floor( $( '#wpadminbar' ).outerHeight() );
782					}
783
784					if ( loadWinTop > loadHeaderTop ) {
785						this.header.addClass( 'fl-theme-builder-header-sticky' );
786						this.header.addClass( 'fl-theme-builder-header-scrolled' );
787						this._adjustHeaderHeight();
788						this._adjustStickyHeaderWidth();
789					}
790				}
791
792				//
793				// Check if Event Type is 'resize' then invoke this._doSticky()
794				// only if the 'fl-theme-builder-header-sticky' class is already present.
795				//
796				if ( e && 'resize' === e.type ) {
797					if ( this.header.hasClass( 'fl-theme-builder-header-sticky' ) ) {
798						this._doSticky( e );
799					}
800					this._adjustStickyHeaderWidth();
801				}
802
803				if ( Number( header.attr( 'data-shrink' ) ) ) {
804					this.header.data( 'original-height', this.header.outerHeight() );
805					this.win.on( 'resize', $.throttle( 500, $.proxy( this._initShrink, this ) ) );
806					this._initShrink();
807				}
808
809				this._initFlyoutMenuFix( e );
810			} else {
811				this.win.off( 'scroll.fl-theme-builder-header-sticky' );
812				this.win.off( 'resize.fl-theme-builder-header-sticky' );
813
814				this.header.removeClass( 'fl-theme-builder-header-sticky' );
815				this.header.removeClass( 'fl-theme-builder-header-pinned' );
816				this.header.removeAttr( 'style' );
817				this.header.parent().css( 'padding-top', '0' );
818			}
819		},
820
821		/**
822		 * Pins an overlay header with fixed positioning from page load, avoiding a position change that a scroll handler cannot apply before the compositor paints.
823		 *
824		 * @since 1.6.1
825		 * @access private
826		 * @method _initPin
827		 */
828		_initPin: function()
829		{
830			this.header.toggleClass( 'fl-theme-builder-header-pinned', this.pinnable );
831
832			if ( ! this.pinnable ) {
833				return;
834			}
835
836			// Fixed positioning resolves the width against the viewport, so boxed layouts require their maximum width immediately.
837			this._adjustStickyHeaderWidth();
838
839			// The header is visible from the first paint, so the scrolled state must reflect any restored scroll position.
840			if ( this.win.scrollTop() > Math.floor( this.header.data( 'original-top' ) ) ) {
841				this.header.addClass( 'fl-theme-builder-header-scrolled' );
842			}
843		},
844
845		/**
846		 * Check if Header should be sticky at a particular Window size.
847		 *
848		 * @since 1.4
849		 * @access private
850		 * @param  widowSize
851		 * @method _makeWindowSticky
852		 */
853		_makeWindowSticky: function ( windowSize )
854		{
855			var makeSticky = false;
856
857			switch (this.stickyOn) {
858				case 'xl':
859					makeSticky = windowSize > FLBuilderLayoutConfig.breakpoints['large'];
860					break;
861				case '': // Default
862				case 'desktop':
863					makeSticky = windowSize >= FLBuilderLayoutConfig.breakpoints['medium'];
864					break;
865				case 'desktop-medium':
866					makeSticky = windowSize > FLBuilderLayoutConfig.breakpoints['small'];
867					break;
868				case 'large':
869					makeSticky = windowSize > FLBuilderLayoutConfig.breakpoints['medium'] && windowSize <= FLBuilderLayoutConfig.breakpoints['large'];
870					break;
871				case 'large-medium':
872					makeSticky = windowSize > FLBuilderLayoutConfig.breakpoints['small'] && windowSize <= FLBuilderLayoutConfig.breakpoints['large'];
873					break;
874				case 'medium':
875					makeSticky = ( windowSize <= FLBuilderLayoutConfig.breakpoints['medium'] && windowSize > FLBuilderLayoutConfig.breakpoints['small'] );
876					break;
877				case 'medium-mobile':
878					makeSticky = (windowSize <= FLBuilderLayoutConfig.breakpoints['medium']);
879					break;
880				case 'mobile':
881					makeSticky = (windowSize <= FLBuilderLayoutConfig.breakpoints['small']);
882					break;
883				case 'all':
884					makeSticky = true;
885					break;
886			}
887
888			return makeSticky;
889		},
890
891		/**
892		 * Sticks the header when the page is scrolled.
893		 *
894		 * @since 1.0
895		 * @access private
896		 * @method _doSticky
897		 */
898		_doSticky: function( e )
899		{
900			var winTop    		  = Math.floor( this.win.scrollTop() ),
901				headerTop 		  = Math.floor( this.header.data( 'original-top' ) ),
902				hasStickyClass    = this.header.hasClass( 'fl-theme-builder-header-sticky' ),
903				hasScrolledClass  = this.header.hasClass( 'fl-theme-builder-header-scrolled' ),
904				beforeHeader      = this.header.prevAll( '.fl-builder-content' ),
905				bodyTopPadding    = parseInt( jQuery('body').css('padding-top') ),
906				winBarHeight      = $('#wpadminbar').length ? $('#wpadminbar').outerHeight() : 0,
907				headerHeight      = 0;
908
909			if ( isNaN( bodyTopPadding ) ) {
910				bodyTopPadding = 0;
911			}
912
913			if ( this.hasAdminBar && this.win.width() > 600 ) {
914				winTop += Math.floor( winBarHeight );
915			}
916
917			if ( winTop > headerTop ) {
918				if ( ! hasStickyClass ) {
919					if ( e && ( 'scroll' === e.type || 'smartscroll' === e.type ) ) {
920					 	this.header.addClass( 'fl-theme-builder-header-sticky' );
921						if ( this.overlay && beforeHeader.length ) {
922							this.header.css( 'top', winBarHeight);
923						}
924					}
925
926					if ( ! this.overlay ) {
927						this._adjustHeaderHeight();
928					}
929				}
930			}
931			else if ( hasStickyClass ) {
932				this.header.removeClass( 'fl-theme-builder-header-sticky' );
933				this.header.removeAttr( 'style' );
934				this.header.parent().css( 'padding-top', '0' );
935			}
936
937			this._adjustStickyHeaderWidth();
938
939			if ( winTop > headerTop ) {
940				if ( ! hasScrolledClass ) {
941					this.header.addClass( 'fl-theme-builder-header-scrolled' );
942				}
943			} else if ( hasScrolledClass ) {
944				this.header.removeClass( 'fl-theme-builder-header-scrolled' );
945			}
946
947			this._flyoutMenuFix( e );
948		},
949
950		/**
951		 * Initializes flyout menu fixes on sticky header.
952		 *
953		 * @since 1.4.1
954		 * @method _initFlyoutMenuFix
955		 */
956		_initFlyoutMenuFix: function( e ) {
957			var header       = this.header,
958				menuModule   = header.closest( '.fl-menu' ),
959				flyoutMenu   = menuModule.find( '.fl-menu-mobile-flyout' ),
960				isPushMenu   = menuModule.hasClass( 'fl-menu-responsive-flyout-push' ) || menuModule.hasClass( 'fl-menu-responsive-flyout-push-opacity' ),
961				isOverlay    = menuModule.hasClass( 'fl-menu-responsive-flyout-overlay' ),
962				flyoutPos    = menuModule.hasClass( 'fl-flyout-right' ) ? 'right' : 'left',
963				flyoutParent = header.parent().is( 'header' ) ? header.parent().parent() : header.parent();
964				isFullWidth  = this.win.width() === header.width(),
965				flyoutLayout = '',
966				activePos    = 250,
967				headerPos    = 0;
968
969			if ( ! flyoutMenu.length ) {
970				return;
971			}
972
973			if ( this.win.width() > header.parent().width() ) {
974				headerPos = ( this.win.width() - header.width() ) / 2;
975			}
976
977			if ( isOverlay ) {
978				activePos = headerPos;
979			}
980			else if ( isPushMenu ) {
981				activePos = activePos + headerPos;
982			}
983			flyoutMenu.data( 'activePos', activePos );
984
985			if ( isPushMenu ) {
986				flyoutLayout = 'push-' + flyoutPos;
987			}
988			else if ( isOverlay ) {
989				flyoutLayout = 'overlay-' + flyoutPos;
990			}
991
992			if ( isPushMenu && ! $( 'html' ).hasClass( 'fl-theme-builder-has-flyout-menu' ) ) {
993				$( 'html' ).addClass( 'fl-theme-builder-has-flyout-menu' );
994			}
995
996			if ( ! flyoutParent.hasClass( 'fl-theme-builder-flyout-menu-' + flyoutLayout ) ) {
997				flyoutParent.addClass( 'fl-theme-builder-flyout-menu-' + flyoutLayout );
998			}
999
1000			if ( ! header.hasClass( 'fl-theme-builder-flyout-menu-overlay' ) && isOverlay ) {
1001				header.addClass( 'fl-theme-builder-flyout-menu-overlay' );
1002			}
1003
1004			if ( ! header.hasClass( 'fl-theme-builder-header-full-width' ) && isFullWidth ) {
1005			   header.addClass( 'fl-theme-builder-header-full-width' );
1006		    }
1007			else if ( ! isFullWidth ) {
1008				header.removeClass( 'fl-theme-builder-header-full-width' );
1009			}
1010
1011			menuModule.on( 'click', '.fl-menu-mobile-toggle', $.proxy( function( event ){
1012				if ( menuModule.find( '.fl-menu-mobile-toggle.fl-active' ).length ) {
1013					$( 'html' ).addClass( 'fl-theme-builder-flyout-menu-active' );
1014					event.stopImmediatePropagation();
1015				}
1016				else {
1017					$( 'html' ).removeClass( 'fl-theme-builder-flyout-menu-active' );
1018				}
1019
1020				this._flyoutMenuFix( event );
1021			}, this ) );
1022		},
1023
1024		/**
1025		 * Fix flyout menu inside the sticky header.
1026		 *
1027		 * @since 1.4.1
1028		 * @method _flyoutMenuFix
1029		 */
1030		_flyoutMenuFix: function( e ){
1031			var header      = this.header,
1032			    menuModule  = $( e.target ).closest( '.fl-menu' ),
1033				flyoutMenu  = menuModule.find( '.fl-menu-mobile-flyout' ),
1034				flyoutPos   = menuModule.hasClass( 'fl-flyout-right' ) ? 'right' : 'left',
1035				menuOpacity = menuModule.find( '.fl-menu-mobile-opacity' ),
1036				isScroll    = 'undefined' !== typeof e && 'scroll' === e.handleObj.type,
1037				activePos   = 'undefined' !== typeof flyoutMenu.data( 'activePos' ) ? flyoutMenu.data( 'activePos' ) : 0,
1038				headerPos   = ( this.win.width() - header.width() ) / 2,
1039				inactivePos = headerPos > 0 ? activePos + 4 : 254;
1040
1041			if ( ! flyoutMenu.length ) {
1042				return;
1043			}
1044
1045			if ( this.overlay ) {
1046				return;
1047			}
1048
1049			if( $( '.fl-theme-builder-flyout-menu-active' ).length ) {
1050
1051				if ( isScroll && ! flyoutMenu.hasClass( 'fl-menu-disable-transition' ) ) {
1052					flyoutMenu.addClass( 'fl-menu-disable-transition' );
1053				}
1054
1055				if ( header.hasClass( 'fl-theme-builder-header-sticky' ) ) {
1056					if ( ! isScroll ) {
1057						setTimeout( $.proxy( function(){
1058							flyoutMenu.css( flyoutPos, '-' + activePos + 'px' );
1059						}, this ), 1 );
1060					}
1061					else {
1062						flyoutMenu.css( flyoutPos, '-' + activePos + 'px' );
1063					}
1064				}
1065				else {
1066					flyoutMenu.css( flyoutPos, '0px' );
1067				}
1068			}
1069			else {
1070				if ( flyoutMenu.hasClass( 'fl-menu-disable-transition' ) ) {
1071					flyoutMenu.removeClass( 'fl-menu-disable-transition' );
1072				}
1073
1074				if ( header.hasClass( 'fl-theme-builder-flyout-menu-overlay' ) && headerPos > 0 && headerPos < 250 ) {
1075					if ( header.hasClass( 'fl-theme-builder-header-sticky' ) ) {
1076						inactivePos = headerPos + 254;
1077					}
1078					else {
1079						inactivePos = 254;
1080					}
1081				}
1082
1083				if ( e && e.type === 'resize' ) {
1084					inactivePos = headerPos + 254;
1085				}
1086
1087				flyoutMenu.css( flyoutPos, '-' + inactivePos + 'px' );
1088			}
1089
1090			if ( e && menuModule.is('.fl-menu-responsive-flyout-overlay') && $.infinitescroll ) {
1091				e.stopImmediatePropagation();
1092			}
1093
1094			if( menuOpacity.length ) {
1095				if ( header.hasClass( 'fl-theme-builder-header-sticky' ) ) {
1096					if ( '0px' === menuOpacity.css( 'left' ) ) {
1097						menuOpacity.css( 'left', '-' + headerPos + 'px' );
1098					}
1099				}
1100				else {
1101					menuOpacity.css( 'left', '' );
1102				}
1103			}
1104		},
1105
1106		/**
1107		 * Adjust sticky header width if BB Theme Boxed Layout is used.
1108		 *
1109		 * @since 1.4
1110		 * @access private
1111		 * @method _adjustStickyHeaderWidth
1112		 */
1113		_adjustStickyHeaderWidth: function () {
1114			if ( $('body').hasClass( 'fl-fixed-width' ) ) {
1115				var parentWidth = this.header.parent().width();
1116
1117				// Better if this is set in the stylesheet file.
1118				if ( this.win.width() >= 992 ) {
1119					this.header.css({
1120						'margin': '0 auto',
1121						'max-width': parentWidth,
1122					});
1123				}
1124				else {
1125					this.header.css({
1126						'margin': '',
1127						'max-width': '',
1128					});
1129				}
1130			}
1131		},
1132
1133		/**
1134		 * Adjust Sticky Header Height
1135		 *
1136		 * @since 1.4
1137		 * @access private
1138		 * @method _adjustHeaderHeight
1139		 */
1140		_adjustHeaderHeight: function () {
1141			var beforeHeader = this.header.prevAll('.fl-builder-content'),
1142				beforeHeaderHeight = 0,
1143				beforeHeaderFix = 0,
1144				headerHeight = Math.floor( this.header.outerHeight() ),
1145				bodyTopPadding = parseInt( $( 'body' ).css( 'padding-top' ) ),
1146				wpAdminBarHeight = 0,
1147				totalHeaderHeight = 0;
1148
1149			if ( isNaN( bodyTopPadding ) ) {
1150				bodyTopPadding = 0;
1151			}
1152
1153			if ( beforeHeader.length ) {
1154				$.each( beforeHeader, function() {
1155					beforeHeaderHeight += Math.floor( $(this).outerHeight() );
1156				});
1157				// Subtract this value from the header parent's top padding.
1158				beforeHeaderFix = 2;
1159			}
1160
1161			if ( this.hasAdminBar && this.win.width() <= 600 ) {
1162				wpAdminBarHeight = Math.floor( $('#wpadminbar').outerHeight() );
1163			}
1164
1165			totalHeaderHeight = Math.floor( beforeHeaderHeight + headerHeight);
1166
1167			if ( headerHeight > 0 ) {
1168				var headerParent = this.header.parent(),
1169					headerParentTopPadding = 0;
1170
1171				// If the header's parent container is the BODY tag ignore its top padding.
1172				if ( $( headerParent ).is('body') ) {
1173					headerParentTopPadding = Math.floor( headerHeight - wpAdminBarHeight );
1174				} else {
1175					headerParentTopPadding = Math.floor( headerHeight - bodyTopPadding - wpAdminBarHeight );
1176				}
1177
1178				$( headerParent ).css( 'padding-top',  ( headerParentTopPadding - beforeHeaderFix ) + 'px' );
1179
1180				this.header.css({
1181					'-webkit-transform': 'translate(0px, -' + totalHeaderHeight + 'px)',
1182					'-ms-transform': 'translate(0px, -' + totalHeaderHeight + 'px)',
1183					'transform': 'translate(0px, -' + totalHeaderHeight + 'px)'
1184				});
1185
1186			}
1187
1188		},
1189
1190		/**
1191		 * Initializes shrink logic for a header.
1192		 *
1193		 * @since 1.0
1194		 * @access private
1195		 * @method _initShrink
1196		 */
1197		_initShrink: function( e )
1198		{
1199			if ( this.win.width() >= this.breakpointWidth ) {
1200				this.win.on( 'scroll.fl-theme-builder-header-shrink', $.proxy( this._doShrink, this ) );
1201				this._setImageMaxHeight();
1202
1203				if ( this.win.scrollTop() > 0 ){
1204					this._doShrink();
1205				}
1206
1207			} else {
1208				this.header.parent().css( 'padding-top', '0' );
1209				this.win.off( 'scroll.fl-theme-builder-header-shrink' );
1210				this._removeShrink();
1211				this._removeImageMaxHeight();
1212			}
1213		},
1214
1215		/**
1216		 * Shrinks the header when the page is scrolled.
1217		 *
1218		 * @since 1.0
1219		 * @access private
1220		 * @method _doShrink
1221		 */
1222		_doShrink: function( e )
1223		{
1224			var winTop 			  = this.win.scrollTop(),
1225				headerTop 		  = this.header.data('original-top'),
1226				headerHeight 	  = this.header.data('original-height'),
1227				shrinkImageHeight = this.header.data('shrink-image-height'),
1228				windowSize   	  = this.win.width(),
1229				makeSticky   	  = this._makeWindowSticky( windowSize ),
1230				hasClass     	  = this.header.hasClass( 'fl-theme-builder-header-shrink' );
1231
1232
1233			if ( this.hasAdminBar ) {
1234				winTop += 32;
1235			}
1236
1237			if ( makeSticky && ( winTop > headerTop + headerHeight ) ) {
1238				if ( ! hasClass ) {
1239
1240					this.header.addClass( 'fl-theme-builder-header-shrink' );
1241
1242					// Shrink images but don't include lightbox and menu images.
1243					this.header.find('img').each( function( i ) {
1244						var image           = $( this ),
1245							maxMegaMenu     = image.closest( '.max-mega-menu' ).length,
1246							imageInLightbox = image.closest( '.fl-button-lightbox-content' ).length,
1247							imageInNavMenu  = image.closest( 'li.menu-item' ).length;
1248
1249						if ( ! ( imageInLightbox || imageInNavMenu || maxMegaMenu ) ) {
1250							image.css( 'max-height', shrinkImageHeight );
1251						}
1252
1253					});
1254
1255					this.header.find( '.fl-row-content-wrap' ).each( function() {
1256
1257						var row = $( this );
1258
1259						if ( parseInt( row.css( 'padding-bottom' ) ) > 5 ) {
1260							row.addClass( 'fl-theme-builder-header-shrink-row-bottom' );
1261						}
1262
1263						if ( parseInt( row.css( 'padding-top' ) ) > 5 ) {
1264							row.addClass( 'fl-theme-builder-header-shrink-row-top' );
1265						}
1266					} );
1267
1268					this.header.find( '.fl-module' ).each( function() {
1269
1270						var module = $( this ).find( '.fl-module-content' ).length ? $( this ).find( '.fl-module-content' ) : $( this );
1271
1272						if ( parseInt( module.css( 'margin-bottom' ) ) > 5 ) {
1273							module.addClass( 'fl-theme-builder-header-shrink-module-bottom' );
1274						}
1275
1276						if ( parseInt( module.css( 'margin-top' ) ) > 5 ) {
1277							module.addClass( 'fl-theme-builder-header-shrink-module-top' );
1278						}
1279					} );
1280				}
1281			} else if (hasClass) {
1282				this.header.find( 'img' ).css( 'max-height', '' );
1283				this._removeShrink();
1284			}
1285
1286			// Fixes Shrink header issue with BB Theme when window is scrolled then resized and back.
1287			if ( 'undefined' === typeof( e ) && $('body').hasClass( 'fl-fixed-width' ) ) {
1288				if ( ! this.overlay ) {
1289					this._adjustHeaderHeight();
1290				}
1291			}
1292
1293		},
1294
1295		/**
1296		 * Removes the header shrink effect.
1297		 *
1298		 * @since 1.0
1299		 * @access private
1300		 * @method _removeShrink
1301		 */
1302		_removeShrink: function()
1303		{
1304			var rows    = this.header.find( '.fl-row-content-wrap' ),
1305				modules = this.header.find('.fl-module, .fl-module-content');
1306
1307			rows.removeClass( 'fl-theme-builder-header-shrink-row-bottom' );
1308			rows.removeClass( 'fl-theme-builder-header-shrink-row-top' );
1309			modules.removeClass( 'fl-theme-builder-header-shrink-module-bottom' );
1310			modules.removeClass( 'fl-theme-builder-header-shrink-module-top' );
1311			this.header.removeClass( 'fl-theme-builder-header-shrink' );
1312		},
1313
1314		/**
1315		 * Adds max height to images in modules for smooth scrolling.
1316		 *
1317		 * @since 1.1.1
1318		 * @access private
1319		 * @method _setImageMaxHeight
1320		 */
1321		_setImageMaxHeight: function()
1322		{
1323			var head = $( 'head' ),
1324				stylesId = 'fl-header-styles-' + this.header.data( 'post-id' ),
1325				styles = '',
1326				images = this.header.find( '.fl-module img' );
1327
1328			if ( $( '#' + stylesId ).length ) {
1329				return;
1330			}
1331
1332			images.each( function( i ) {
1333				var image           = $( this ),
1334					height          = image.height(),
1335					node            = image.closest( '.fl-module' ).data( 'node' ),
1336					className       = 'fl-node-' + node + '-img-' + i,
1337					maxMegaMenu     = image.closest( '.max-mega-menu' ).length,
1338					imageInLightbox = image.closest( '.fl-button-lightbox-content' ).length,
1339					imageInNavMenu  = image.closest( 'li.menu-item' ).length;
1340
1341				if ( ! ( imageInLightbox || imageInNavMenu || maxMegaMenu  ) ) {
1342					image.addClass( className );
1343					styles += '.' + className + ' { max-height: ' + ( height ? height : image[0].height )  + 'px }';
1344				}
1345
1346			} );
1347
1348			if ( '' !== styles ) {
1349				head.append( '<style id="' + stylesId + '">' + styles + '</style>' );
1350			}
1351		},
1352
1353		/**
1354		 * Removes max height on images in modules for smooth scrolling.
1355		 *
1356		 * @since 1.1.1
1357		 * @access private
1358		 * @method _removeImageMaxHeight
1359		 */
1360		_removeImageMaxHeight: function()
1361		{
1362			$( '#fl-header-styles-' + this.header.data( 'post-id' ) ).remove();
1363		},
1364	};
1365
1366	$( function() { FLThemeBuilderHeaderLayout.init(); } );
1367
1368})(jQuery);
1369
1370/*!
1371 * Bowser - a browser detector
1372 * https://github.com/ded/bowser
1373 * MIT License | (c) Dustin Diaz 2015
1374 */
1375
1376!function (name, definition) {
1377  if (typeof module != 'undefined' && module.exports) module.exports = definition()
1378  else if (typeof define == 'function' && define.amd) define(name, definition)
1379  else this[name] = definition()
1380}('bowser', function () {
1381  /**
1382    * See useragents.js for examples of navigator.userAgent
1383    */
1384
1385  var t = true
1386
1387  function detect(ua) {
1388
1389    function getFirstMatch(regex) {
1390      var match = ua.match(regex);
1391      return (match && match.length > 1 && match[1]) || '';
1392    }
1393
1394    function getSecondMatch(regex) {
1395      var match = ua.match(regex);
1396      return (match && match.length > 1 && match[2]) || '';
1397    }
1398
1399    var iosdevice = getFirstMatch(/(ipod|iphone|ipad)/i).toLowerCase()
1400      , likeAndroid = /like android/i.test(ua)
1401      , android = !likeAndroid && /android/i.test(ua)
1402      , nexusMobile = /nexus\s*[0-6]\s*/i.test(ua)
1403      , nexusTablet = !nexusMobile && /nexus\s*[0-9]+/i.test(ua)
1404      , chromeos = /CrOS/.test(ua)
1405      , silk = /silk/i.test(ua)
1406      , sailfish = /sailfish/i.test(ua)
1407      , tizen = /tizen/i.test(ua)
1408      , webos = /(web|hpw)os/i.test(ua)
1409      , windowsphone = /windows phone/i.test(ua)
1410      , windows = !windowsphone && /windows/i.test(ua)
1411      , mac = !iosdevice && !silk && /macintosh/i.test(ua)
1412      , linux = !android && !sailfish && !tizen && !webos && /linux/i.test(ua)
1413      , edgeVersion = getFirstMatch(/edge\/(\d+(\.\d+)?)/i)
1414      , versionIdentifier = getFirstMatch(/version\/(\d+(\.\d+)?)/i)
1415      , tablet = /tablet/i.test(ua)
1416      , mobile = !tablet && /[^-]mobi/i.test(ua)
1417      , xbox = /xbox/i.test(ua)
1418      , result
1419
1420    if (/opera|opr|opios/i.test(ua)) {
1421      result = {
1422        name: 'Opera'
1423      , opera: t
1424      , version: versionIdentifier || getFirstMatch(/(?:opera|opr|opios)[\s\/](\d+(\.\d+)?)/i)
1425      }
1426    }
1427    else if (/coast/i.test(ua)) {
1428      result = {
1429        name: 'Opera Coast'
1430        , coast: t
1431        , version: versionIdentifier || getFirstMatch(/(?:coast)[\s\/](\d+(\.\d+)?)/i)
1432      }
1433    }
1434    else if (/yabrowser/i.test(ua)) {
1435      result = {
1436        name: 'Yandex Browser'
1437      , yandexbrowser: t
1438      , version: versionIdentifier || getFirstMatch(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i)
1439      }
1440    }
1441    else if (/ucbrowser/i.test(ua)) {
1442      result = {
1443          name: 'UC Browser'
1444        , ucbrowser: t
1445        , version: getFirstMatch(/(?:ucbrowser)[\s\/](\d+(?:\.\d+)+)/i)
1446      }
1447    }
1448    else if (/mxios/i.test(ua)) {
1449      result = {
1450        name: 'Maxthon'
1451        , maxthon: t
1452        , version: getFirstMatch(/(?:mxios)[\s\/](\d+(?:\.\d+)+)/i)
1453      }
1454    }
1455    else if (/epiphany/i.test(ua)) {
1456      result = {
1457        name: 'Epiphany'
1458        , epiphany: t
1459        , version: getFirstMatch(/(?:epiphany)[\s\/](\d+(?:\.\d+)+)/i)
1460      }
1461    }
1462    else if (/puffin/i.test(ua)) {
1463      result = {
1464        name: 'Puffin'
1465        , puffin: t
1466        , version: getFirstMatch(/(?:puffin)[\s\/](\d+(?:\.\d+)?)/i)
1467      }
1468    }
1469    else if (/sleipnir/i.test(ua)) {
1470      result = {
1471        name: 'Sleipnir'
1472        , sleipnir: t
1473        , version: getFirstMatch(/(?:sleipnir)[\s\/](\d+(?:\.\d+)+)/i)
1474      }
1475    }
1476    else if (/k-meleon/i.test(ua)) {
1477      result = {
1478        name: 'K-Meleon'
1479        , kMeleon: t
1480        , version: getFirstMatch(/(?:k-meleon)[\s\/](\d+(?:\.\d+)+)/i)
1481      }
1482    }
1483    else if (windowsphone) {
1484      result = {
1485        name: 'Windows Phone'
1486      , windowsphone: t
1487      }
1488      if (edgeVersion) {
1489        result.msedge = t
1490        result.version = edgeVersion
1491      }
1492      else {
1493        result.msie = t
1494        result.version = getFirstMatch(/iemobile\/(\d+(\.\d+)?)/i)
1495      }
1496    }
1497    else if (/msie|trident/i.test(ua)) {
1498      result = {
1499        name: 'Internet Explorer'
1500      , msie: t
1501      , version: getFirstMatch(/(?:msie |rv:)(\d+(\.\d+)?)/i)
1502      }
1503    } else if (chromeos) {
1504      result = {
1505        name: 'Chrome'
1506      , chromeos: t
1507      , chromeBook: t
1508      , chrome: t
1509      , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)
1510      }
1511    } else if (/chrome.+? edge/i.test(ua)) {
1512      result = {
1513        name: 'Microsoft Edge'
1514      , msedge: t
1515      , version: edgeVersion
1516      }
1517    }
1518    else if (/vivaldi/i.test(ua)) {
1519      result = {
1520        name: 'Vivaldi'
1521        , vivaldi: t
1522        , version: getFirstMatch(/vivaldi\/(\d+(\.\d+)?)/i) || versionIdentifier
1523      }
1524    }
1525    else if (sailfish) {
1526      result = {
1527        name: 'Sailfish'
1528      , sailfish: t
1529      , version: getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i)
1530      }
1531    }
1532    else if (/seamonkey\//i.test(ua)) {
1533      result = {
1534        name: 'SeaMonkey'
1535      , seamonkey: t
1536      , version: getFirstMatch(/seamonkey\/(\d+(\.\d+)?)/i)
1537      }
1538    }
1539    else if (/firefox|iceweasel|fxios/i.test(ua)) {
1540      result = {
1541        name: 'Firefox'
1542      , firefox: t
1543      , version: getFirstMatch(/(?:firefox|iceweasel|fxios)[ \/](\d+(\.\d+)?)/i)
1544      }
1545      if (/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(ua)) {
1546        result.firefoxos = t
1547      }
1548    }
1549    else if (silk) {
1550      result =  {
1551        name: 'Amazon Silk'
1552      , silk: t
1553      , version : getFirstMatch(/silk\/(\d+(\.\d+)?)/i)
1554      }
1555    }
1556    else if (/phantom/i.test(ua)) {
1557      result = {
1558        name: 'PhantomJS'
1559      , phantom: t
1560      , version: getFirstMatch(/phantomjs\/(\d+(\.\d+)?)/i)
1561      }
1562    }
1563    else if (/slimerjs/i.test(ua)) {
1564      result = {
1565        name: 'SlimerJS'
1566        , slimer: t
1567        , version: getFirstMatch(/slimerjs\/(\d+(\.\d+)?)/i)
1568      }
1569    }
1570    else if (/blackberry|\bbb\d+/i.test(ua) || /rim\stablet/i.test(ua)) {
1571      result = {
1572        name: 'BlackBerry'
1573      , blackberry: t
1574      , version: versionIdentifier || getFirstMatch(/blackberry[\d]+\/(\d+(\.\d+)?)/i)
1575      }
1576    }
1577    else if (webos) {
1578      result = {
1579        name: 'WebOS'
1580      , webos: t
1581      , version: versionIdentifier || getFirstMatch(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i)
1582      };
1583      if( /touchpad\//i.test(ua) ){
1584        result.touchpad = t;
1585      }
1586    }
1587    else if (/bada/i.test(ua)) {
1588      result = {
1589        name: 'Bada'
1590      , bada: t
1591      , version: getFirstMatch(/dolfin\/(\d+(\.\d+)?)/i)
1592      };
1593    }
1594    else if (tizen) {
1595      result = {
1596        name: 'Tizen'
1597      , tizen: t
1598      , version: getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i) || versionIdentifier
1599      };
1600    }
1601    else if (/qupzilla/i.test(ua)) {
1602      result = {
1603        name: 'QupZilla'
1604        , qupzilla: t
1605        , version: getFirstMatch(/(?:qupzilla)[\s\/](\d+(?:\.\d+)+)/i) || versionIdentifier
1606      }
1607    }
1608    else if (/chromium/i.test(ua)) {
1609      result = {
1610        name: 'Chromium'
1611        , chromium: t
1612        , version: getFirstMatch(/(?:chromium)[\s\/](\d+(?:\.\d+)?)/i) || versionIdentifier
1613      }
1614    }
1615    else if (/chrome|crios|crmo/i.test(ua)) {
1616      result = {
1617        name: 'Chrome'
1618        , chrome: t
1619        , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)
1620      }
1621    }
1622    else if (android) {
1623      result = {
1624        name: 'Android'
1625        , version: versionIdentifier
1626      }
1627    }
1628    else if (/safari|applewebkit/i.test(ua)) {
1629      result = {
1630        name: 'Safari'
1631      , safari: t
1632      }
1633      if (versionIdentifier) {
1634        result.version = versionIdentifier
1635      }
1636    }
1637    else if (iosdevice) {
1638      result = {
1639        name : iosdevice == 'iphone' ? 'iPhone' : iosdevice == 'ipad' ? 'iPad' : 'iPod'
1640      }
1641      // WTF: version is not part of user agent in web apps
1642      if (versionIdentifier) {
1643        result.version = versionIdentifier
1644      }
1645    }
1646    else if(/googlebot/i.test(ua)) {
1647      result = {
1648        name: 'Googlebot'
1649      , googlebot: t
1650      , version: getFirstMatch(/googlebot\/(\d+(\.\d+))/i) || versionIdentifier
1651      }
1652    }
1653    else {
1654      result = {
1655        name: getFirstMatch(/^(.*)\/(.*) /),
1656        version: getSecondMatch(/^(.*)\/(.*) /)
1657     };
1658   }
1659
1660    // set webkit or gecko flag for browsers based on these engines
1661    if (!result.msedge && /(apple)?webkit/i.test(ua)) {
1662      if (/(apple)?webkit\/537\.36/i.test(ua)) {
1663        result.name = result.name || "Blink"
1664        result.blink = t
1665      } else {
1666        result.name = result.name || "Webkit"
1667        result.webkit = t
1668      }
1669      if (!result.version && versionIdentifier) {
1670        result.version = versionIdentifier
1671      }
1672    } else if (!result.opera && /gecko\//i.test(ua)) {
1673      result.name = result.name || "Gecko"
1674      result.gecko = t
1675      result.version = result.version || getFirstMatch(/gecko\/(\d+(\.\d+)?)/i)
1676    }
1677
1678    // set OS flags for platforms that have multiple browsers
1679    if (!result.msedge && (android || result.silk)) {
1680      result.android = t
1681    } else if (iosdevice) {
1682      result[iosdevice] = t
1683      result.ios = t
1684    } else if (mac) {
1685      result.mac = t
1686    } else if (xbox) {
1687      result.xbox = t
1688    } else if (windows) {
1689      result.windows = t
1690    } else if (linux) {
1691      result.linux = t
1692    }
1693
1694    // OS version extraction
1695    var osVersion = '';
1696    if (result.windowsphone) {
1697      osVersion = getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i);
1698    } else if (iosdevice) {
1699      osVersion = getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i);
1700      osVersion = osVersion.replace(/[_\s]/g, '.');
1701    } else if (android) {
1702      osVersion = getFirstMatch(/android[ \/-](\d+(\.\d+)*)/i);
1703    } else if (result.webos) {
1704      osVersion = getFirstMatch(/(?:web|hpw)os\/(\d+(\.\d+)*)/i);
1705    } else if (result.blackberry) {
1706      osVersion = getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i);
1707    } else if (result.bada) {
1708      osVersion = getFirstMatch(/bada\/(\d+(\.\d+)*)/i);
1709    } else if (result.tizen) {
1710      osVersion = getFirstMatch(/tizen[\/\s](\d+(\.\d+)*)/i);
1711    }
1712    if (osVersion) {
1713      result.osversion = osVersion;
1714    }
1715
1716    // device type extraction
1717    var osMajorVersion = osVersion.split('.')[0];
1718    if (
1719         tablet
1720      || nexusTablet
1721      || iosdevice == 'ipad'
1722      || (android && (osMajorVersion == 3 || (osMajorVersion >= 4 && !mobile)))
1723      || result.silk
1724    ) {
1725      result.tablet = t
1726    } else if (
1727         mobile
1728      || iosdevice == 'iphone'
1729      || iosdevice == 'ipod'
1730      || android
1731      || nexusMobile
1732      || result.blackberry
1733      || result.webos
1734      || result.bada
1735    ) {
1736      result.mobile = t
1737    }
1738
1739    // Graded Browser Support
vendor: 4,367 bytes, lines 1740-1882
1740    // http://developer.yahoo.com/yui/articles/gbs
1741    if (result.msedge ||
1742        (result.msie && result.version >= 10) ||
1743        (result.yandexbrowser && result.version >= 15) ||
1744		    (result.vivaldi && result.version >= 1.0) ||
1745        (result.chrome && result.version >= 20) ||
1746        (result.firefox && result.version >= 20.0) ||
1747        (result.safari && result.version >= 6) ||
1748        (result.opera && result.version >= 10.0) ||
1749        (result.ios && result.osversion && result.osversion.split(".")[0] >= 6) ||
1750        (result.blackberry && result.version >= 10.1)
1751        || (result.chromium && result.version >= 20)
1752        ) {
1753      result.a = t;
1754    }
1755    else if ((result.msie && result.version < 10) ||
1756        (result.chrome && result.version < 20) ||
1757        (result.firefox && result.version < 20.0) ||
1758        (result.safari && result.version < 6) ||
1759        (result.opera && result.version < 10.0) ||
1760        (result.ios && result.osversion && result.osversion.split(".")[0] < 6)
1761        || (result.chromium && result.version < 20)
1762        ) {
1763      result.c = t
1764    } else result.x = t
1765
1766    return result
1767  }
1768
1769  var bowser = detect(typeof navigator !== 'undefined' ? navigator.userAgent : '')
1770
1771  bowser.test = function (browserList) {
1772    for (var i = 0; i < browserList.length; ++i) {
1773      var browserItem = browserList[i];
1774      if (typeof browserItem=== 'string') {
1775        if (browserItem in bowser) {
1776          return true;
1777        }
1778      }
1779    }
1780    return false;
1781  }
1782
1783  /**
1784   * Get version precisions count
1785   *
1786   * @example
1787   *   getVersionPrecision("1.10.3") // 3
1788   *
1789   * @param  {string} version
1790   * @return {number}
1791   */
1792  function getVersionPrecision(version) {
1793    return version.split(".").length;
1794  }
1795
1796  /**
1797   * Array::map polyfill
1798   *
1799   * @param  {Array} arr
1800   * @param  {Function} iterator
1801   * @return {Array}
1802   */
1803  function map(arr, iterator) {
1804    var result = [], i;
1805    if (Array.prototype.map) {
1806      return Array.prototype.map.call(arr, iterator);
1807    }
1808    for (i = 0; i < arr.length; i++) {
1809      result.push(iterator(arr[i]));
1810    }
1811    return result;
1812  }
1813
1814  /**
1815   * Calculate browser version weight
1816   *
1817   * @example
1818   *   compareVersions(['1.10.2.1',  '1.8.2.1.90'])    // 1
1819   *   compareVersions(['1.010.2.1', '1.09.2.1.90']);  // 1
1820   *   compareVersions(['1.10.2.1',  '1.10.2.1']);     // 0
1821   *   compareVersions(['1.10.2.1',  '1.0800.2']);     // -1
1822   *
1823   * @param  {Array<String>} versions versions to compare
1824   * @return {Number} comparison result
1825   */
1826  function compareVersions(versions) {
1827    // 1) get common precision for both versions, for example for "10.0" and "9" it should be 2
1828    var precision = Math.max(getVersionPrecision(versions[0]), getVersionPrecision(versions[1]));
1829    var chunks = map(versions, function (version) {
1830      var delta = precision - getVersionPrecision(version);
1831
1832      // 2) "9" -> "9.0" (for precision = 2)
1833      version = version + new Array(delta + 1).join(".0");
1834
1835      // 3) "9.0" -> ["000000000"", "000000009"]
1836      return map(version.split("."), function (chunk) {
1837        return new Array(20 - chunk.length).join("0") + chunk;
1838      }).reverse();
1839    });
1840
1841    // iterate in reverse order by reversed chunks array
1842    while (--precision >= 0) {
1843      // 4) compare: "000000009" > "000000010" = false (but "9" > "10" = true)
1844      if (chunks[0][precision] > chunks[1][precision]) {
1845        return 1;
1846      }
1847      else if (chunks[0][precision] === chunks[1][precision]) {
1848        if (precision === 0) {
1849          // all version chunks are same
1850          return 0;
1851        }
1852      }
1853      else {
1854        return -1;
1855      }
1856    }
1857  }
1858
1859  /**
1860   * Check if browser is unsupported
1861   *
1862   * @example
1863   *   bowser.isUnsupportedBrowser({
1864   *     msie: "10",
1865   *     firefox: "23",
1866   *     chrome: "29",
1867   *     safari: "5.1",
1868   *     opera: "16",
1869   *     phantom: "534"
1870   *   });
1871   *
1872   * @param  {Object}  minVersions map of minimal version to browser
1873   * @param  {Boolean} [strictMode = false] flag to return false if browser wasn't found in map
1874   * @param  {String}  [ua] user agent string
1875   * @return {Boolean}
1876   */
1877  function isUnsupportedBrowser(minVersions, strictMode, ua) {
1878    var _bowser = bowser;
1879
1880    // make strictMode param optional with ua param usage
1881    if (typeof strictMode === 'string') {
1882      ua = strictMode;
1883      strictMode = void(0);
1884    }
1885
1886    if (strictMode === void(0)) {
1887      strictMode = false;
1888    }
1889    if (ua) {
1890      _bowser = detect(ua);
1891    }
1892
1893    var version = "" + _bowser.version;
1894    for (var browser in minVersions) {
1895      if (minVersions.hasOwnProperty(browser)) {
1896        if (_bowser[browser]) {
1897          // browser version and min supported version.
1898          return compareVersions([version, minVersions[browser]]) < 0;
1899        }
1900      }
1901    }
1902
1903    return strictMode; // not found
1904  }
1905
1906  /**
1907   * Check if browser is supported
1908   *
1909   * @param  {Object} minVersions map of minimal version to browser
1910   * @param  {Boolean} [strictMode = false] flag to return false if browser wasn't found in map
1911   * @param  {String}  [ua] user agent string
1912   * @return {Boolean}
1913   */
1914  function check(minVersions, strictMode, ua) {
1915    return !isUnsupportedBrowser(minVersions, strictMode, ua);
1916  }
1917
1918  bowser.isUnsupportedBrowser = isUnsupportedBrowser;
1919  bowser.compareVersions = compareVersions;
1920  bowser.check = check;
1921
1922  /*
1923   * Set our detect method to the main bowser object so we can
1924   * reuse it to test other user agents.
1925   * This is needed to implement future tests.
1926   */
1927  bowser._detect = detect;
1928
1929  return bowser
1930});
1931
1932(function($){
1933  UABBTrigger = {
1934
1935      /**
1936       * Trigger a hook.
1937       *
1938       * @since 1.1.0.3
1939       * @method triggerHook
1940       * @param {String} hook The hook to trigger.
1941       * @param {Array} args An array of args to pass to the hook.
1942       */
1943      triggerHook: function( hook, args )
1944      {
1945        $( 'body' ).trigger( 'uabb-trigger.' + hook, args );
1946      },
1947    
1948      /**
1949       * Add a hook.
1950       *
1951       * @since 1.1.0.3
1952       * @method addHook
1953       * @param {String} hook The hook to add.
1954       * @param {Function} callback A function to call when the hook is triggered.
1955       */
1956      addHook: function( hook, callback )
1957      {
1958        $( 'body' ).on( 'uabb-trigger.' + hook, callback );
1959      },
1960    
1961      /**
1962       * Remove a hook.
1963       *
1964       * @since 1.1.0.3
1965       * @method removeHook
1966       * @param {String} hook The hook to remove.
1967       * @param {Function} callback The callback function to remove.
1968       */
1969      removeHook: function( hook, callback )
1970      {
1971        $( 'body' ).off( 'uabb-trigger.' + hook, callback );
1972      },
1973  };
1974})(jQuery);
1975
1976jQuery(document).ready(function( $ ) {
1977
1978    if( typeof bowser !== 'undefined' && bowser !== null ) {
1979
1980      var uabb_browser   = bowser.name,
1981          uabb_browser_v = bowser.version,
1982          uabb_browser_class = uabb_browser.replace(/\s+/g, '-').toLowerCase(),
1983          uabb_browser_v_class = uabb_browser_class + parseInt( uabb_browser_v );
1984      
1985      $('html').addClass(uabb_browser_class).addClass(uabb_browser_v_class);
1986      
1987    }
1988
1989    $('.uabb-row-separator').parents('html').css('overflow-x', 'hidden');
1990});
1991jQuery(function($) {
1992	
1993		$(function() {
1994		$( '.fl-node-s0qhlrym7v54 .fl-photo-img' )
1995			.on( 'mouseenter', function( e ) {
1996				$( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' );
1997			} )
1998			.on( 'mouseleave', function( e ){
1999				$( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null );
2000			} );
2001	});
2002		window._fl_string_to_slug_regex = 'a-zA-Z0-9';
2003});
2004
2005/* Start Layout Custom JS */
2006
2007/* End Layout Custom JS */
2008
2009

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.