PageSourceSearch

https://tracyharris.co/wp-content/uploads/bb-plugin/cache/84b41570…c7dd51-layout-bundle.js?ver=2.7.4.2-1.4.9.1

js tracyharris.co collected 2026-10-06 16:29:09 UTC 100,927 bytes, 3,503 lines download raw bytes

vendor: 15,387 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});
622jQuery(function($) {
623	
624		$(function() {
625		$( '.fl-node-5eeaf226dad32 .fl-photo-img' )
626			.on( 'mouseenter', function( e ) {
627				$( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' );
628			} )
629			.on( 'mouseleave', function( e ){
630				$( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null );
631			} );
632	});
633		window._fl_string_to_slug_regex = 'a-zA-Z0-9';
634});
635jQuery(function($) {
636	
637		$(function() {
638		$( '.fl-node-5ef432300d302 .fl-photo-img' )
639			.on( 'mouseenter', function( e ) {
640				$( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' );
641			} )
642			.on( 'mouseleave', function( e ){
643				$( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null );
644			} );
645	});
646		window._fl_string_to_slug_regex = 'a-zA-Z0-9';
647});
648
649/* Start Layout Custom JS */
650
651/* End Layout Custom JS */
652
653/*!
654 * Bowser - a browser detector
655 * https://github.com/ded/bowser
656 * MIT License | (c) Dustin Diaz 2015
657 */
658
659!function (name, definition) {
660  if (typeof module != 'undefined' && module.exports) module.exports = definition()
661  else if (typeof define == 'function' && define.amd) define(name, definition)
662  else this[name] = definition()
663}('bowser', function () {
664  /**
665    * See useragents.js for examples of navigator.userAgent
666    */
667
668  var t = true
669
670  function detect(ua) {
671
672    function getFirstMatch(regex) {
673      var match = ua.match(regex);
674      return (match && match.length > 1 && match[1]) || '';
675    }
676
677    function getSecondMatch(regex) {
678      var match = ua.match(regex);
679      return (match && match.length > 1 && match[2]) || '';
680    }
681
682    var iosdevice = getFirstMatch(/(ipod|iphone|ipad)/i).toLowerCase()
683      , likeAndroid = /like android/i.test(ua)
684      , android = !likeAndroid && /android/i.test(ua)
685      , nexusMobile = /nexus\s*[0-6]\s*/i.test(ua)
686      , nexusTablet = !nexusMobile && /nexus\s*[0-9]+/i.test(ua)
687      , chromeos = /CrOS/.test(ua)
688      , silk = /silk/i.test(ua)
689      , sailfish = /sailfish/i.test(ua)
690      , tizen = /tizen/i.test(ua)
691      , webos = /(web|hpw)os/i.test(ua)
692      , windowsphone = /windows phone/i.test(ua)
693      , windows = !windowsphone && /windows/i.test(ua)
694      , mac = !iosdevice && !silk && /macintosh/i.test(ua)
695      , linux = !android && !sailfish && !tizen && !webos && /linux/i.test(ua)
696      , edgeVersion = getFirstMatch(/edge\/(\d+(\.\d+)?)/i)
697      , versionIdentifier = getFirstMatch(/version\/(\d+(\.\d+)?)/i)
698      , tablet = /tablet/i.test(ua)
699      , mobile = !tablet && /[^-]mobi/i.test(ua)
700      , xbox = /xbox/i.test(ua)
701      , result
702
703    if (/opera|opr|opios/i.test(ua)) {
704      result = {
705        name: 'Opera'
706      , opera: t
707      , version: versionIdentifier || getFirstMatch(/(?:opera|opr|opios)[\s\/](\d+(\.\d+)?)/i)
708      }
709    }
710    else if (/coast/i.test(ua)) {
711      result = {
712        name: 'Opera Coast'
713        , coast: t
714        , version: versionIdentifier || getFirstMatch(/(?:coast)[\s\/](\d+(\.\d+)?)/i)
715      }
716    }
717    else if (/yabrowser/i.test(ua)) {
718      result = {
719        name: 'Yandex Browser'
720      , yandexbrowser: t
721      , version: versionIdentifier || getFirstMatch(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i)
722      }
723    }
724    else if (/ucbrowser/i.test(ua)) {
725      result = {
726          name: 'UC Browser'
727        , ucbrowser: t
728        , version: getFirstMatch(/(?:ucbrowser)[\s\/](\d+(?:\.\d+)+)/i)
729      }
730    }
731    else if (/mxios/i.test(ua)) {
732      result = {
733        name: 'Maxthon'
734        , maxthon: t
735        , version: getFirstMatch(/(?:mxios)[\s\/](\d+(?:\.\d+)+)/i)
736      }
737    }
738    else if (/epiphany/i.test(ua)) {
739      result = {
740        name: 'Epiphany'
741        , epiphany: t
742        , version: getFirstMatch(/(?:epiphany)[\s\/](\d+(?:\.\d+)+)/i)
743      }
744    }
745    else if (/puffin/i.test(ua)) {
746      result = {
747        name: 'Puffin'
748        , puffin: t
749        , version: getFirstMatch(/(?:puffin)[\s\/](\d+(?:\.\d+)?)/i)
750      }
751    }
752    else if (/sleipnir/i.test(ua)) {
753      result = {
754        name: 'Sleipnir'
vendor: 12,125 bytes, lines 755-1165
755        , sleipnir: t
756        , version: getFirstMatch(/(?:sleipnir)[\s\/](\d+(?:\.\d+)+)/i)
757      }
758    }
759    else if (/k-meleon/i.test(ua)) {
760      result = {
761        name: 'K-Meleon'
762        , kMeleon: t
763        , version: getFirstMatch(/(?:k-meleon)[\s\/](\d+(?:\.\d+)+)/i)
764      }
765    }
766    else if (windowsphone) {
767      result = {
768        name: 'Windows Phone'
769      , windowsphone: t
770      }
771      if (edgeVersion) {
772        result.msedge = t
773        result.version = edgeVersion
774      }
775      else {
776        result.msie = t
777        result.version = getFirstMatch(/iemobile\/(\d+(\.\d+)?)/i)
778      }
779    }
780    else if (/msie|trident/i.test(ua)) {
781      result = {
782        name: 'Internet Explorer'
783      , msie: t
784      , version: getFirstMatch(/(?:msie |rv:)(\d+(\.\d+)?)/i)
785      }
786    } else if (chromeos) {
787      result = {
788        name: 'Chrome'
789      , chromeos: t
790      , chromeBook: t
791      , chrome: t
792      , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)
793      }
794    } else if (/chrome.+? edge/i.test(ua)) {
795      result = {
796        name: 'Microsoft Edge'
797      , msedge: t
798      , version: edgeVersion
799      }
800    }
801    else if (/vivaldi/i.test(ua)) {
802      result = {
803        name: 'Vivaldi'
804        , vivaldi: t
805        , version: getFirstMatch(/vivaldi\/(\d+(\.\d+)?)/i) || versionIdentifier
806      }
807    }
808    else if (sailfish) {
809      result = {
810        name: 'Sailfish'
811      , sailfish: t
812      , version: getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i)
813      }
814    }
815    else if (/seamonkey\//i.test(ua)) {
816      result = {
817        name: 'SeaMonkey'
818      , seamonkey: t
819      , version: getFirstMatch(/seamonkey\/(\d+(\.\d+)?)/i)
820      }
821    }
822    else if (/firefox|iceweasel|fxios/i.test(ua)) {
823      result = {
824        name: 'Firefox'
825      , firefox: t
826      , version: getFirstMatch(/(?:firefox|iceweasel|fxios)[ \/](\d+(\.\d+)?)/i)
827      }
828      if (/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(ua)) {
829        result.firefoxos = t
830      }
831    }
832    else if (silk) {
833      result =  {
834        name: 'Amazon Silk'
835      , silk: t
836      , version : getFirstMatch(/silk\/(\d+(\.\d+)?)/i)
837      }
838    }
839    else if (/phantom/i.test(ua)) {
840      result = {
841        name: 'PhantomJS'
842      , phantom: t
843      , version: getFirstMatch(/phantomjs\/(\d+(\.\d+)?)/i)
844      }
845    }
846    else if (/slimerjs/i.test(ua)) {
847      result = {
848        name: 'SlimerJS'
849        , slimer: t
850        , version: getFirstMatch(/slimerjs\/(\d+(\.\d+)?)/i)
851      }
852    }
853    else if (/blackberry|\bbb\d+/i.test(ua) || /rim\stablet/i.test(ua)) {
854      result = {
855        name: 'BlackBerry'
856      , blackberry: t
857      , version: versionIdentifier || getFirstMatch(/blackberry[\d]+\/(\d+(\.\d+)?)/i)
858      }
859    }
860    else if (webos) {
861      result = {
862        name: 'WebOS'
863      , webos: t
864      , version: versionIdentifier || getFirstMatch(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i)
865      };
866      if( /touchpad\//i.test(ua) ){
867        result.touchpad = t;
868      }
869    }
870    else if (/bada/i.test(ua)) {
871      result = {
872        name: 'Bada'
873      , bada: t
874      , version: getFirstMatch(/dolfin\/(\d+(\.\d+)?)/i)
875      };
876    }
877    else if (tizen) {
878      result = {
879        name: 'Tizen'
880      , tizen: t
881      , version: getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i) || versionIdentifier
882      };
883    }
884    else if (/qupzilla/i.test(ua)) {
885      result = {
886        name: 'QupZilla'
887        , qupzilla: t
888        , version: getFirstMatch(/(?:qupzilla)[\s\/](\d+(?:\.\d+)+)/i) || versionIdentifier
889      }
890    }
891    else if (/chromium/i.test(ua)) {
892      result = {
893        name: 'Chromium'
894        , chromium: t
895        , version: getFirstMatch(/(?:chromium)[\s\/](\d+(?:\.\d+)?)/i) || versionIdentifier
896      }
897    }
898    else if (/chrome|crios|crmo/i.test(ua)) {
899      result = {
900        name: 'Chrome'
901        , chrome: t
902        , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)
903      }
904    }
905    else if (android) {
906      result = {
907        name: 'Android'
908        , version: versionIdentifier
909      }
910    }
911    else if (/safari|applewebkit/i.test(ua)) {
912      result = {
913        name: 'Safari'
914      , safari: t
915      }
916      if (versionIdentifier) {
917        result.version = versionIdentifier
918      }
919    }
920    else if (iosdevice) {
921      result = {
922        name : iosdevice == 'iphone' ? 'iPhone' : iosdevice == 'ipad' ? 'iPad' : 'iPod'
923      }
924      // WTF: version is not part of user agent in web apps
925      if (versionIdentifier) {
926        result.version = versionIdentifier
927      }
928    }
929    else if(/googlebot/i.test(ua)) {
930      result = {
931        name: 'Googlebot'
932      , googlebot: t
933      , version: getFirstMatch(/googlebot\/(\d+(\.\d+))/i) || versionIdentifier
934      }
935    }
936    else {
937      result = {
938        name: getFirstMatch(/^(.*)\/(.*) /),
939        version: getSecondMatch(/^(.*)\/(.*) /)
940     };
941   }
942
943    // set webkit or gecko flag for browsers based on these engines
944    if (!result.msedge && /(apple)?webkit/i.test(ua)) {
945      if (/(apple)?webkit\/537\.36/i.test(ua)) {
946        result.name = result.name || "Blink"
947        result.blink = t
948      } else {
949        result.name = result.name || "Webkit"
950        result.webkit = t
951      }
952      if (!result.version && versionIdentifier) {
953        result.version = versionIdentifier
954      }
955    } else if (!result.opera && /gecko\//i.test(ua)) {
956      result.name = result.name || "Gecko"
957      result.gecko = t
958      result.version = result.version || getFirstMatch(/gecko\/(\d+(\.\d+)?)/i)
959    }
960
961    // set OS flags for platforms that have multiple browsers
962    if (!result.msedge && (android || result.silk)) {
963      result.android = t
964    } else if (iosdevice) {
965      result[iosdevice] = t
966      result.ios = t
967    } else if (mac) {
968      result.mac = t
969    } else if (xbox) {
970      result.xbox = t
971    } else if (windows) {
972      result.windows = t
973    } else if (linux) {
974      result.linux = t
975    }
976
977    // OS version extraction
978    var osVersion = '';
979    if (result.windowsphone) {
980      osVersion = getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i);
981    } else if (iosdevice) {
982      osVersion = getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i);
983      osVersion = osVersion.replace(/[_\s]/g, '.');
984    } else if (android) {
985      osVersion = getFirstMatch(/android[ \/-](\d+(\.\d+)*)/i);
986    } else if (result.webos) {
987      osVersion = getFirstMatch(/(?:web|hpw)os\/(\d+(\.\d+)*)/i);
988    } else if (result.blackberry) {
989      osVersion = getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i);
990    } else if (result.bada) {
991      osVersion = getFirstMatch(/bada\/(\d+(\.\d+)*)/i);
992    } else if (result.tizen) {
993      osVersion = getFirstMatch(/tizen[\/\s](\d+(\.\d+)*)/i);
994    }
995    if (osVersion) {
996      result.osversion = osVersion;
997    }
998
999    // device type extraction
1000    var osMajorVersion = osVersion.split('.')[0];
1001    if (
1002         tablet
1003      || nexusTablet
1004      || iosdevice == 'ipad'
1005      || (android && (osMajorVersion == 3 || (osMajorVersion >= 4 && !mobile)))
1006      || result.silk
1007    ) {
1008      result.tablet = t
1009    } else if (
1010         mobile
1011      || iosdevice == 'iphone'
1012      || iosdevice == 'ipod'
1013      || android
1014      || nexusMobile
1015      || result.blackberry
1016      || result.webos
1017      || result.bada
1018    ) {
1019      result.mobile = t
1020    }
1021
1022    // Graded Browser Support
1023    // http://developer.yahoo.com/yui/articles/gbs
1024    if (result.msedge ||
1025        (result.msie && result.version >= 10) ||
1026        (result.yandexbrowser && result.version >= 15) ||
1027		    (result.vivaldi && result.version >= 1.0) ||
1028        (result.chrome && result.version >= 20) ||
1029        (result.firefox && result.version >= 20.0) ||
1030        (result.safari && result.version >= 6) ||
1031        (result.opera && result.version >= 10.0) ||
1032        (result.ios && result.osversion && result.osversion.split(".")[0] >= 6) ||
1033        (result.blackberry && result.version >= 10.1)
1034        || (result.chromium && result.version >= 20)
1035        ) {
1036      result.a = t;
1037    }
1038    else if ((result.msie && result.version < 10) ||
1039        (result.chrome && result.version < 20) ||
1040        (result.firefox && result.version < 20.0) ||
1041        (result.safari && result.version < 6) ||
1042        (result.opera && result.version < 10.0) ||
1043        (result.ios && result.osversion && result.osversion.split(".")[0] < 6)
1044        || (result.chromium && result.version < 20)
1045        ) {
1046      result.c = t
1047    } else result.x = t
1048
1049    return result
1050  }
1051
1052  var bowser = detect(typeof navigator !== 'undefined' ? navigator.userAgent : '')
1053
1054  bowser.test = function (browserList) {
1055    for (var i = 0; i < browserList.length; ++i) {
1056      var browserItem = browserList[i];
1057      if (typeof browserItem=== 'string') {
1058        if (browserItem in bowser) {
1059          return true;
1060        }
1061      }
1062    }
1063    return false;
1064  }
1065
1066  /**
1067   * Get version precisions count
1068   *
1069   * @example
1070   *   getVersionPrecision("1.10.3") // 3
1071   *
1072   * @param  {string} version
1073   * @return {number}
1074   */
1075  function getVersionPrecision(version) {
1076    return version.split(".").length;
1077  }
1078
1079  /**
1080   * Array::map polyfill
1081   *
1082   * @param  {Array} arr
1083   * @param  {Function} iterator
1084   * @return {Array}
1085   */
1086  function map(arr, iterator) {
1087    var result = [], i;
1088    if (Array.prototype.map) {
1089      return Array.prototype.map.call(arr, iterator);
1090    }
1091    for (i = 0; i < arr.length; i++) {
1092      result.push(iterator(arr[i]));
1093    }
1094    return result;
1095  }
1096
1097  /**
1098   * Calculate browser version weight
1099   *
1100   * @example
1101   *   compareVersions(['1.10.2.1',  '1.8.2.1.90'])    // 1
1102   *   compareVersions(['1.010.2.1', '1.09.2.1.90']);  // 1
1103   *   compareVersions(['1.10.2.1',  '1.10.2.1']);     // 0
1104   *   compareVersions(['1.10.2.1',  '1.0800.2']);     // -1
1105   *
1106   * @param  {Array<String>} versions versions to compare
1107   * @return {Number} comparison result
1108   */
1109  function compareVersions(versions) {
1110    // 1) get common precision for both versions, for example for "10.0" and "9" it should be 2
1111    var precision = Math.max(getVersionPrecision(versions[0]), getVersionPrecision(versions[1]));
1112    var chunks = map(versions, function (version) {
1113      var delta = precision - getVersionPrecision(version);
1114
1115      // 2) "9" -> "9.0" (for precision = 2)
1116      version = version + new Array(delta + 1).join(".0");
1117
1118      // 3) "9.0" -> ["000000000"", "000000009"]
1119      return map(version.split("."), function (chunk) {
1120        return new Array(20 - chunk.length).join("0") + chunk;
1121      }).reverse();
1122    });
1123
1124    // iterate in reverse order by reversed chunks array
1125    while (--precision >= 0) {
1126      // 4) compare: "000000009" > "000000010" = false (but "9" > "10" = true)
1127      if (chunks[0][precision] > chunks[1][precision]) {
1128        return 1;
1129      }
1130      else if (chunks[0][precision] === chunks[1][precision]) {
1131        if (precision === 0) {
1132          // all version chunks are same
1133          return 0;
1134        }
1135      }
1136      else {
1137        return -1;
1138      }
1139    }
1140  }
1141
1142  /**
1143   * Check if browser is unsupported
1144   *
1145   * @example
1146   *   bowser.isUnsupportedBrowser({
1147   *     msie: "10",
1148   *     firefox: "23",
1149   *     chrome: "29",
1150   *     safari: "5.1",
1151   *     opera: "16",
1152   *     phantom: "534"
1153   *   });
1154   *
1155   * @param  {Object}  minVersions map of minimal version to browser
1156   * @param  {Boolean} [strictMode = false] flag to return false if browser wasn't found in map
1157   * @param  {String}  [ua] user agent string
1158   * @return {Boolean}
1159   */
1160  function isUnsupportedBrowser(minVersions, strictMode, ua) {
1161    var _bowser = bowser;
1162
1163    // make strictMode param optional with ua param usage
1164    if (typeof strictMode === 'string') {
1165      ua = strictMode;
1166      strictMode = void(0);
1167    }
1168
1169    if (strictMode === void(0)) {
1170      strictMode = false;
1171    }
1172    if (ua) {
1173      _bowser = detect(ua);
1174    }
1175
1176    var version = "" + _bowser.version;
1177    for (var browser in minVersions) {
1178      if (minVersions.hasOwnProperty(browser)) {
1179        if (_bowser[browser]) {
1180          // browser version and min supported version.
1181          return compareVersions([version, minVersions[browser]]) < 0;
1182        }
1183      }
1184    }
1185
1186    return strictMode; // not found
1187  }
1188
1189  /**
1190   * Check if browser is supported
1191   *
1192   * @param  {Object} minVersions map of minimal version to browser
1193   * @param  {Boolean} [strictMode = false] flag to return false if browser wasn't found in map
1194   * @param  {String}  [ua] user agent string
1195   * @return {Boolean}
1196   */
1197  function check(minVersions, strictMode, ua) {
1198    return !isUnsupportedBrowser(minVersions, strictMode, ua);
1199  }
1200
1201  bowser.isUnsupportedBrowser = isUnsupportedBrowser;
1202  bowser.compareVersions = compareVersions;
1203  bowser.check = check;
1204
1205  /*
1206   * Set our detect method to the main bowser object so we can
1207   * reuse it to test other user agents.
1208   * This is needed to implement future tests.
1209   */
1210  bowser._detect = detect;
1211
1212  return bowser
1213});
1214
1215(function($){
1216  UABBTrigger = {
1217
1218      /**
1219       * Trigger a hook.
1220       *
1221       * @since 1.1.0.3
1222       * @method triggerHook
1223       * @param {String} hook The hook to trigger.
1224       * @param {Array} args An array of args to pass to the hook.
1225       */
1226      triggerHook: function( hook, args )
1227      {
1228        $( 'body' ).trigger( 'uabb-trigger.' + hook, args );
1229      },
1230    
1231      /**
1232       * Add a hook.
1233       *
1234       * @since 1.1.0.3
1235       * @method addHook
1236       * @param {String} hook The hook to add.
1237       * @param {Function} callback A function to call when the hook is triggered.
1238       */
1239      addHook: function( hook, callback )
1240      {
1241        $( 'body' ).on( 'uabb-trigger.' + hook, callback );
1242      },
1243    
1244      /**
1245       * Remove a hook.
1246       *
1247       * @since 1.1.0.3
1248       * @method removeHook
1249       * @param {String} hook The hook to remove.
1250       * @param {Function} callback The callback function to remove.
1251       */
1252      removeHook: function( hook, callback )
1253      {
1254        $( 'body' ).off( 'uabb-trigger.' + hook, callback );
1255      },
1256  };
1257})(jQuery);
1258
1259jQuery(document).ready(function( $ ) {
1260
1261    if( typeof bowser !== 'undefined' && bowser !== null ) {
1262
1263      var uabb_browser   = bowser.name,
1264          uabb_browser_v = bowser.version,
1265          uabb_browser_class = uabb_browser.replace(/\s+/g, '-').toLowerCase(),
1266          uabb_browser_v_class = uabb_browser_class + parseInt( uabb_browser_v );
1267      
1268      $('html').addClass(uabb_browser_class).addClass(uabb_browser_v_class);
1269      
1270    }
1271
1272    $('.uabb-row-separator').parents('html').css('overflow-x', 'hidden');
1273});
1274jQuery(function($) {
1275	
1276		$(function() {
1277		$( '.fl-node-5f4733df907f2 .fl-photo-img' )
1278			.on( 'mouseenter', function( e ) {
1279				$( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' );
1280			} )
1281			.on( 'mouseleave', function( e ){
1282				$( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null );
1283			} );
1284	});
1285		window._fl_string_to_slug_regex = 'a-zA-Z0-9';
1286});
1287
1288(function($) {
1289
1290	/**
1291	 * Class for Menu Module
1292	 *
1293	 * @since 1.6.1
1294	 */
1295	FLBuilderMenu = function( settings ){
1296
1297		// set params
1298		this.nodeId              = settings.id;
1299		this.nodeClass           = '.fl-node-' + settings.id;
1300		this.wrapperClass        = this.nodeClass + ' .fl-menu';
1301		this.type				 = settings.type;
1302		this.mobileToggle		 = settings.mobile;
1303		this.mobileBelowRow		 = settings.mobileBelowRow;
1304		this.mobileFlyout		 = settings.mobileFlyout;
1305		this.breakPoints         = settings.breakPoints;
1306		this.mobileBreakpoint	 = settings.mobileBreakpoint;
1307		this.currentBrowserWidth = $( window ).width();
1308		this.postId              = settings.postId;
1309		this.mobileStacked       = settings.mobileStacked;
1310
1311		// initialize the menu
1312		this._initMenu();
1313
1314		// check if viewport is resizing
1315		$( window ).on( 'resize', $.proxy( function( e ) {
1316
1317			var width = $( window ).width();
1318
1319			// if screen width is resized, reload the menu
1320		    if( width != this.currentBrowserWidth ){
1321
1322				this.currentBrowserWidth = width;
1323				this._initMenu();
1324 				this._clickOrHover();
1325			}
1326
1327		}, this ) );
1328
1329		$( 'body' ).on( 'click', $.proxy( function( e ) {
1330			if ( 'undefined' !== typeof FLBuilderConfig ){
1331				return;
1332			}
1333
1334			var activeMobileMenu = $(this.wrapperClass + ' .fl-menu-mobile-toggle.fl-active' );
1335			if ( activeMobileMenu.length && ( 'expanded' !== this.mobileToggle ) ){
1336				$( activeMobileMenu ).trigger('click');
1337			}
1338
1339			$( this.wrapperClass ).find( '.fl-has-submenu' ).removeClass( 'focus' );
1340			$( this.wrapperClass ).find( '.fl-has-submenu .sub-menu' ).removeClass( 'focus' );
1341
1342		}, this ) );
1343
1344		// Close Mobile menu when tabbing out from the last menu item.
1345		$( this.wrapperClass + ' ul.menu > li:last-child' ).on( 'focusout', $.proxy(function (e) {
1346			if ( $( this.wrapperClass ).find( '.fl-menu-mobile-toggle' ).hasClass( 'fl-active' ) && ( 'expanded' !== this.mobileToggle ) ) {
1347				if ( ! $( e.relatedTarget ).parent().hasClass( 'menu-item' ) ) {
1348					$( this.wrapperClass ).find( '.fl-menu-mobile-toggle' ).trigger( 'click' );	
1349				}
1350			}
1351		}, this ) );
1352
1353	};
1354
1355	FLBuilderMenu.prototype = {
1356		nodeClass               : '',
1357		wrapperClass            : '',
1358		type 	                : '',
1359		breakPoints 			: {},
1360		$submenus				: null,
1361
1362		/**
1363		 * Check if the screen size fits a mobile viewport.
1364		 *
1365		 * @since  1.6.1
1366		 * @return bool
1367		 */
1368		_isMobile: function(){
1369			return this.currentBrowserWidth <= this.breakPoints.small ? true : false;
1370		},
1371
1372		/**
1373		 * Check if the screen size fits a medium viewport.
1374		 *
1375		 * @since  1.10.5
1376		 * @return bool
1377		 */
1378		_isMedium: function(){
1379			return this.currentBrowserWidth <= this.breakPoints.medium ? true : false;
1380		},
1381
1382		/**
1383		 * Check if the screen size fits a large viewport.
1384		 *
1385		 * @since  1.10.5
1386		 * @return bool
1387		 */
1388		_isLarge: function(){
1389			return this.currentBrowserWidth <= this.breakPoints.large ? true : false;
1390		},
1391
1392		/**
1393		 * Check if the menu should toggle for the current viewport base on the selected breakpoint
1394		 *
1395		 * @see 	this._isMobile()
1396		 * @see 	this._isMedium()
1397		 * @since  	1.10.5
1398		 * @return bool
1399		 */
1400		_isMenuToggle: function(){
1401			if ( ( 'always' == this.mobileBreakpoint
1402				|| ( this._isMobile() && 'mobile' == this.mobileBreakpoint )
1403				|| ( this._isMedium() && 'medium-mobile' == this.mobileBreakpoint )
1404				|| ( this._isLarge() && 'large-mobile' == this.mobileBreakpoint )
1405			) && ( $( this.wrapperClass ).find( '.fl-menu-mobile-toggle' ).is(':visible') || 'expanded' == this.mobileToggle ) ) {
1406				return true;
1407			}
1408
1409			return false;
1410		},
1411
1412		/**
1413		 * Initialize the toggle logic for the menu.
1414		 *
1415		 * @see    this._isMenuToggle()
1416		 * @see    this._menuOnCLick()
1417		 * @see    this._clickOrHover()
1418		 * @see    this._submenuOnRight()
1419		 * @see    this._submenuRowZindexFix()
1420		 * @see    this._toggleForMobile()
1421		 * @since  1.6.1
1422		 * @return void
1423		 */
1424		_initMenu: function(){
1425			this._setupSubmenu();
1426			this._menuOnFocus();
1427			this._menuOnEscape();
1428			this._submenuOnClick();
1429			if ( $( this.nodeClass ).length && this.type == 'horizontal' ) {
1430				this._initMegaMenus();
1431			}
1432
1433			if( this._isMenuToggle() || this.type == 'accordion' ){
1434
1435				$( this.wrapperClass ).off( 'mouseenter mouseleave' );
1436				this._menuOnClick();
1437				this._clickOrHover();
1438
1439			} else {
1440				$( this.wrapperClass ).off( 'click' );
1441				this._submenuOnRight();
1442				this._submenuRowZindexFix();
1443			}
1444
1445			if( this.mobileToggle != 'expanded' ){
1446				this._toggleForMobile();
1447			}
1448
1449			if( $( this.wrapperClass ).find( '.fl-menu-search-item' ).length ){
1450				this._toggleMenuSearch();
1451			}
1452
1453			if( $( this.wrapperClass ).find( '.fl-menu-cart-item').length ){
1454				this._wooUpdateParams();
1455			}
1456		},
1457
1458		/**
1459		 * Initializes submenu dropdowns.
1460		 *
1461		 * @since 3.0
1462		 * @return void
1463		 */
1464		_setupSubmenu: function() {
1465			$( this.wrapperClass + ' ul.sub-menu' ).each( function(){
1466				$( this ).closest( 'li' ).attr( 'aria-haspopup', 'true' );
1467			});
1468		},
1469
1470		/**
1471		 * Adds a focus class to menu elements similar to be used similar to CSS :hover psuedo event
1472		 *
1473		 * @since  1.9.0
1474		 * @return void
1475		 */
1476		_menuOnFocus: function(){
1477			var cKey      = 0,
1478			    isShifted = false;
1479
1480			$( this.nodeClass ).off('keydown').on( 'keydown', 'a', function( e ){
1481				cKey      = e.which;
1482				isShifted = e.shiftKey;
1483			});
1484
1485			$( this.nodeClass ).off('focus').on( 'focus', 'a', $.proxy( function( e ){
1486				var $menuItem	= $( e.target ).parents( '.menu-item' ).first(),
1487					$parents	= $( e.target ).parentsUntil( this.wrapperClass );
1488
1489				$('.fl-menu .focus').removeClass('focus');
1490
1491				$parents.addClass('focus')
1492
1493				if ( ! $menuItem.closest('.fl-has-submenu').hasClass('escaped') ) {
1494					$menuItem.addClass('focus')
1495				}
1496				else {
1497					$menuItem.closest('.fl-has-submenu').removeClass('focus escaped')
1498				}
1499			}, this ) ).on( 'focusout', 'a', $.proxy( function( e ){
1500				var el            = $(e.target).parent(),
1501		            $megaMenu     = el.closest( '.mega-menu' ),
1502		            $megaLastItem = $megaMenu.find('> .sub-menu > .menu-item:last-child'),
1503					$lastItem     = el.parents('.fl-has-submenu:last').find('.menu-item:last'),
1504					isLastChild   = ! $megaMenu.length && el.is( $lastItem );
1505
1506		        if( $megaMenu.length ) {
1507					isLastChild = el.is( $megaLastItem ) || el.is( $megaLastItem.find( '.menu-item:last-child' ) );
1508				}
1509
1510				if ( isLastChild && cKey === 9 && isShifted ) {
1511					isLastChild = false;
1512					cKey       = 0;
1513					isShifted  = false;
1514				}
1515				else if ( cKey === 27 ) {
1516					isLastChild = false;
1517				}
1518
1519				if ( isLastChild ) {
1520					$( e.target ).parentsUntil( this.wrapperClass ).removeClass( 'focus' );
1521				}
1522
1523			}, this ) );
1524		},
1525
1526		/**
1527		 * Logic for submenu items when Escape key is pressed.
1528		 *
1529		 * @since  2.7.1
1530		 * @return void
1531		 */
1532		_menuOnEscape: function(){
1533			$( 'body' ).off('keydown').on( 'keydown', $.proxy( function( e ){
1534				if ( e.which !== 27 ) {
1535					return;
1536				}
1537
1538				if ( $( e.target ).closest('.menu-item').length ) {
1539					var activeSubmenu = null,
1540						menuItem      = $( e.target ).closest('.menu-item'),
1541						type          = menuItem.closest('.fl-menu-accordion').length ? 'accordion' : 'horizontal';
1542
1543					if ( 'horizontal' === type ) {
1544						if ( menuItem.hasClass( 'fl-has-submenu' ) && menuItem.hasClass( 'focus' ) ) {
1545							activeSubmenu = menuItem.find('> ul.sub-menu');
1546						}
1547						else {
1548							activeSubmenu = menuItem.closest('ul.sub-menu');
1549						}
1550						activeSubmenu.parent().addClass('escaped');
1551						activeSubmenu.parent().find('a:first').focus();
1552					}
1553					else {
1554						if ( menuItem.hasClass( 'fl-has-submenu' ) && 'accordion' === type && menuItem.hasClass( 'fl-active' ) ) {
1555							activeSubmenu = menuItem.find('> ul.sub-menu');
1556						}
1557						else {
1558							activeSubmenu = menuItem.closest('ul.sub-menu');
1559						}
1560
1561						activeSubmenu.slideUp(400, function(){
1562							if ( menuItem.hasClass( 'fl-has-submenu' ) && menuItem.hasClass( 'fl-active' ) ) {
1563								activeSubmenu.parent().last().find('a:first').focus();
1564							}
1565							else {
1566								menuItem.removeClass('focus');
1567								menuItem.parents('.menu-item').first().find('a:first').focus();
1568							}
1569							activeSubmenu.parent().last().removeClass( 'fl-active' );
1570						});
1571
1572					}
1573				}
1574				else {
1575					$('.fl-menu').find( 'li.menu-item.focus' ).last().removeClass('focus');
1576				}
1577			}, this ) );
1578		},
1579
1580		/**
1581		 * Logic for submenu toggling on accordions or mobile menus (vertical, horizontal)
1582		 *
1583		 * @since  1.6.1
1584		 * @return void
1585		 */
1586		_menuOnClick: function(){
1587			$( this.wrapperClass ).off().on( 'click', '.fl-has-submenu-container', $.proxy( function( e ){
1588
1589				var $link			= $( e.target ).parents( '.fl-has-submenu' ).first(),
1590					$subMenu 		= $link.children( '.sub-menu' ).first(),
1591					$href	 		= $link.children('.fl-has-submenu-container').first().find('> a').attr('href'),
1592					$subMenuParents = $( e.target ).parents( '.sub-menu' ),
1593					$activeParents 	= $( e.target ).parents( '.fl-has-submenu.fl-active' );
1594
1595				if( !$subMenu.is(':visible') || $(e.target).hasClass('fl-menu-toggle')
1596					|| ($subMenu.is(':visible') && (typeof $href === 'undefined' || $href == '#')) ){
1597					e.preventDefault();
1598				}
1599				else {
1600					e.stopPropagation();
1601					window.location.href = $href;
1602					return;
1603				}
1604
1605				if ($(this.wrapperClass).hasClass('fl-menu-accordion-collapse')) {
1606
1607					if ( !$link.parents('.menu-item').hasClass('fl-active') ) {
1608						$('.menu .fl-active', this.wrapperClass).not($link).removeClass('fl-active');
1609					}
1610					else if ($link.parents('.menu-item').hasClass('fl-active') && $link.parent('.sub-menu').length) {
1611						$('.menu .fl-active', this.wrapperClass).not($link).not($activeParents).removeClass('fl-active');
1612					}
1613
1614					$('.sub-menu', this.wrapperClass).not($subMenu).not($subMenuParents).slideUp('normal');
1615				}
1616
1617				if ( ! this.mobileStacked && 'horizontal' == this.type && 'expanded' == this.mobileToggle ) {
1618					$( this.wrapperClass ).find( '.fl-active' ).not($link).not($activeParents).removeClass( 'fl-active' );
1619				}
1620				else {
1621					$subMenu.slideToggle();
1622				}
1623
1624				$link.toggleClass( 'fl-active' );
1625				e.stopPropagation();
1626
1627			}, this ) );
1628
1629		},
1630
1631		/**
1632		 * Logic for submenu items click event
1633		 *
1634		 * @since  1.10.6
1635		 * @return void
1636		 */
1637		_submenuOnClick: function(){
1638			$( this.wrapperClass + ' .sub-menu' ).off().on( 'click', 'a', $.proxy( function( e ){
1639				if ( $( e.target ).parent().hasClass('focus') ) {
1640					$( e.target ).parentsUntil( this.wrapperClass ).removeClass('focus');
1641				}
1642			}, this ) );
1643		},
1644
1645		/**
1646		 * Changes general styling and behavior of menus based on mobile / desktop viewport.
1647		 *
1648		 * @see    this._isMenuToggle()
1649		 * @since  1.6.1
1650		 * @return void
1651		 */
1652		_clickOrHover: function(){
1653			this.$submenus = this.$submenus || $( this.wrapperClass ).find( '.sub-menu' );
1654			var $wrapper   = $( this.wrapperClass ),
1655				$menu      = $wrapper.find( '.menu' );
1656				$li        = $wrapper.find( '.fl-has-submenu' );
1657
1658			if( this._isMenuToggle() ){
1659				$li.each( function( el ){
1660					if( !$(this).hasClass('fl-active') ){
1661						$(this).find( '.sub-menu' ).fadeOut();
1662					}
1663				} );
1664			} else {
1665				$li.each( function( el ){
1666					if( !$(this).hasClass('fl-active') ){
1667						$(this).find( '.sub-menu' ).css( {
1668							'display' : '',
1669							'opacity' : ''
1670						} );
1671					}
1672				} );
1673			}
1674		},
1675
1676		/**
1677		 * Logic to prevent submenus to go outside viewport boundaries.
1678		 *
1679		 * @since  1.6.1
1680		 * @return void
1681		 */
1682		_submenuOnRight: function(){
1683
1684			$( this.wrapperClass )
1685				.on( 'mouseenter focus', '.fl-has-submenu', $.proxy( function( e ){
1686
1687					if( $ ( e.currentTarget ).find('.sub-menu').length === 0 ) {
1688						return;
1689					}
1690
1691					var $link           = $( e.currentTarget ),
1692						$parent         = $link.parent(),
1693						$subMenu        = $link.find( '.sub-menu' ),
1694						subMenuWidth    = $subMenu.width(),
1695						subMenuPos      = 0,
1696						bodyWidth       = $( 'body' ).width();
1697
1698					if( $link.closest( '.fl-menu-submenu-right' ).length !== 0) {
1699
1700						$link.addClass( 'fl-menu-submenu-right' );
1701
1702					} else if( $( 'body' ).hasClass( 'rtl' ) ) {
1703
1704						subMenuPos = $parent.is( '.sub-menu' ) ?
1705									 $parent.offset().left - subMenuWidth:
1706									 $link.offset().left - $link.width() - subMenuWidth;
1707
1708						if( subMenuPos <= 0 ) {
1709							$link.addClass( 'fl-menu-submenu-right' );
1710						}
1711
1712					} else {
1713
1714						subMenuPos = $parent.is( '.sub-menu' ) ?
1715									 $parent.offset().left + $parent.width() + subMenuWidth :
1716									 $link.offset().left + $link.width() + subMenuWidth;
1717
1718						if( subMenuPos > bodyWidth ) {
1719							$link.addClass('fl-menu-submenu-right');
1720						}
1721					}
1722				}, this ) )
1723				.on( 'mouseleave', '.fl-has-submenu', $.proxy( function( e ){
1724					$( e.currentTarget ).removeClass( 'fl-menu-submenu-right' );
1725				}, this ) );
1726
1727		},
1728
1729		/**
1730		 * Logic to prevent submenus to go behind the next overlay row.
1731		 *
1732		 * @since  1.10.9
1733		 * @return void
1734		 */
1735		_submenuRowZindexFix: function( e ){
1736
1737			$( this.wrapperClass )
1738				.on( 'mouseenter', 'ul.menu > .fl-has-submenu', $.proxy( function( e ){
1739
1740					if( $ ( e.currentTarget ).find('.sub-menu').length === 0 ) {
1741						return;
1742					}
1743
1744					$( this.nodeClass )
1745						.closest( '.fl-row' )
1746						.find( '.fl-row-content' )
1747						.css( 'z-index', '10' );
1748
1749				}, this ) )
1750				.on( 'mouseleave', 'ul.menu > .fl-has-submenu', $.proxy( function( e ){
1751
1752					$( this.nodeClass )
1753						.closest( '.fl-row' )
1754						.find( '.fl-row-content' )
1755						.css( 'z-index', '' );
1756
1757				}, this ) );
1758		},
1759
1760		/**
1761		 * Logic for the mobile menu button.
1762		 *
1763		 * @since  1.6.1
1764		 * @return void
1765		 */
1766		_toggleForMobile: function(){
1767
1768			var $wrapper = null,
1769				$menu    = null,
1770				self     = this;
1771
1772			if( this._isMenuToggle() ){
1773
1774				if ( this._isMobileBelowRowEnabled() ) {
1775					this._placeMobileMenuBelowRow();
1776					$wrapper = $( this.wrapperClass );
1777					$menu    = $( this.nodeClass + '-clone' );
1778					$menu.find( 'ul.menu' ).show();
1779				}
1780				else {
1781					$wrapper = $( this.wrapperClass );
1782					$menu    = $wrapper.find( '.menu' );
1783				}
1784
1785				if( !$wrapper.find( '.fl-menu-mobile-toggle' ).hasClass( 'fl-active' ) && ! self.mobileFlyout ){
1786					$menu.css({ display: 'none' });
1787				}
1788
1789				// Flayout Menu
1790				if ( self.mobileFlyout ) {
1791					this._initFlyoutMenu();
1792				}
1793
1794				$wrapper.on( 'click', '.fl-menu-mobile-toggle', function( e ){
1795
1796					$( this ).toggleClass( 'fl-active' );
1797
1798					if ( self.mobileFlyout ) {
1799						self._toggleFlyoutMenu();
1800					}
1801					else {
1802						var targetMenu = null;
1803						
1804						if ( self.mobileBelowRow ) {
1805							targetMenu = $( this ).closest( '.fl-col' ).next( '.fl-menu-mobile-clone' );
1806						} else {
1807							targetMenu = $( this ).closest( '.fl-menu' ).find( 'ul.menu' );
1808						}
1809						
1810						if ( targetMenu.length ) {
1811							$menu = $( targetMenu );
1812						}
1813
1814						$menu.slideToggle();
1815					}
1816
1817					e.stopPropagation();
1818				} );
1819
1820				// Hide active menu when click on anchor link ID that exists on a page.
1821				$menu.off().on( 'click', '.menu-item > a[href*="#"]:not([href="#"])', function(e){
1822					var $href = $(this).attr('href'),
1823						$targetID = $href.split('#')[1],
1824						element = $('#' + $targetID);
1825					if ( $('body').find(element).length > 0 ) {
1826						$( this ).toggleClass( 'fl-active' );
1827						FLBuilderLayout._scrollToElement( element );
1828						if ( ! self._isMenuToggle() ) {
1829							$menu.slideToggle();
1830						}
1831					}
1832				});
1833			}
1834			else {
1835
1836				if ( this._isMobileBelowRowEnabled() ) {
1837					this._removeMenuFromBelowRow();
1838				}
1839
1840				$wrapper = $( this.wrapperClass ),
1841				$menu    = $wrapper.find( 'ul.menu' );
1842				$wrapper.find( '.fl-menu-mobile-toggle' ).removeClass( 'fl-active' );
1843				$menu.css({ display: '' });
1844
1845				if ( ! this._isMobileBelowRowEnabled() ) {
1846					$menu.off( 'click', '.menu-item > a[href*="#"]:not([href="#"])' );
1847				}
1848
1849				if ( this.mobileFlyout && $wrapper.find( '.fl-menu-mobile-flyout' ).length > 0 ) {
1850					$( 'body' ).css( 'margin', '' );
1851					$( '.fl-builder-ui-pinned-content-transform' ).css( 'transform', '' );
1852					$menu.unwrap();
1853					$wrapper.find( '.fl-menu-mobile-close' ).remove();
1854					$wrapper.find( '.fl-menu-mobile-opacity' ).remove();
1855				}
1856			}
1857		},
1858
1859		/**
1860		 * Init any mega menus that exist.
1861		 *
1862		 * @see 	this._isMenuToggle()
1863		 * @since  	1.10.4
1864		 * @return void
1865		 */
1866		_initMegaMenus: function(){
1867
1868			var module     = $( this.nodeClass ),
1869				rowContent = module.closest( '.fl-row-content' ),
1870				rowWidth   = rowContent.width(),
1871				megas      = module.find( '.mega-menu' ),
1872				disabled   = module.find( '.mega-menu-disabled' ),
1873				isToggle   = this._isMenuToggle();
1874
1875			if ( isToggle ) {
1876				megas.removeClass( 'mega-menu' ).addClass( 'mega-menu-disabled' );
1877				module.find( 'li.mega-menu-disabled > ul.sub-menu' ).css( 'width', '' );
1878				rowContent.css( 'position', '' );
1879			} else {
1880				disabled.removeClass( 'mega-menu-disabled' ).addClass( 'mega-menu' );
1881				module.find( 'li.mega-menu > ul.sub-menu' ).css( 'width', rowWidth + 'px' );
1882				rowContent.css( 'position', 'relative' );
1883			}
1884		},
1885
1886		/**
1887		 * Check to see if Below Row should be enabled.
1888		 *
1889		 * @since  	1.11
1890		 * @return boolean
1891		 */
1892		_isMobileBelowRowEnabled: function() {
1893			return this.mobileBelowRow && $( this.nodeClass ).closest( '.fl-col' ).length;
1894		},
1895
1896		/**
1897		 * Logic for putting the mobile menu below the menu's
1898		 * column so it spans the full width of the page.
1899		 *
1900		 * @since  1.10
1901		 * @return void
1902		 */
1903		_placeMobileMenuBelowRow: function(){
1904
1905			if ( $( this.nodeClass + '-clone' ).length ) {
1906				return;
1907			}
1908
1909			var module = $( this.nodeClass ),
1910				clone  = null,
1911				col    = module.closest( '.fl-col' );
1912
1913			if ( module.length < 1 ) {
1914				return;
1915			}
1916
1917			clone = ( module.length > 1 ) ? $( module[0] ).clone() : module.clone();
1918			module.find( 'ul.menu' ).remove();
1919			clone.addClass( ( this.nodeClass + '-clone' ).replace( '.', '' ) );
1920			clone.addClass( 'fl-menu-mobile-clone' );
1921			clone.find( '.fl-menu-mobile-toggle' ).remove();
1922			col.after( clone );
1923
1924			// Removes animation when enabled.
1925			if ( module.hasClass( 'fl-animation' ) ) {
1926				clone.removeClass( 'fl-animation' );
1927			}
1928
1929			this._menuOnClick();
1930		},
1931
1932		/**
1933		 * Logic for removing the mobile menu from below the menu's
1934		 * column and putting it back in the main wrapper.
1935		 *
1936		 * @since  1.10
1937		 * @return void
1938		 */
1939		_removeMenuFromBelowRow: function(){
1940
1941			if ( ! $( this.nodeClass + '-clone' ).length ) {
1942				return;
1943			}
1944
1945			var module = $( this.nodeClass ),
1946				clone  = $( this.nodeClass + '-clone' ),
1947				menu   = clone.find( 'ul.menu' );
1948
1949			module.find( '.fl-menu-mobile-toggle' ).after( menu );
1950			clone.remove();
1951			menu.find( 'a' ).each( FLBuilderLayout._initAnchorLink );
1952		},
1953
1954		/**
1955		 * Logic for Flyout responsive menu.
1956		 *
1957		 * @since 2.2
1958		 * @return void
1959		 */
1960		_initFlyoutMenu: function(){
1961			var win     = $( window ),
1962				wrapper = $( this.wrapperClass ),
1963				menu  	= wrapper.find( 'ul.menu' ),
1964				button	= wrapper.find( '.fl-menu-mobile-toggle' );
1965
1966			if ( 0 === wrapper.find( '.fl-menu-mobile-flyout' ).length ) {
1967				menu.wrap( '<div class="fl-menu-mobile-flyout"></div>' );
1968			}
1969
1970			if ( 0 === wrapper.find( '.fl-menu-mobile-close' ).length ) {
1971				close = window.fl_responsive_close || 'Close'
1972				wrapper.find( '.fl-menu-mobile-flyout' )
1973					.prepend( '<button class="fl-menu-mobile-close" aria-label="' + close + '"><i class="fas fa-times" aria-hidden="true"></i></button>' );
1974			}
1975
1976			// Push with opacity
1977			if ( wrapper.hasClass( 'fl-menu-responsive-flyout-push-opacity' ) && 0 === wrapper.find( '.fl-menu-mobile-opacity' ).length ) {
1978				wrapper.append( '<div class="fl-menu-mobile-opacity"></div>' );
1979			}
1980
1981			wrapper.on( 'click', '.fl-menu-mobile-opacity, .fl-menu-mobile-close', function(e){
1982				button.trigger( 'click' );
1983				e.stopPropagation();
1984			});
1985
1986			if ( 'undefined' !== typeof FLBuilder ) {
1987				FLBuilder.addHook('restartEditingSession', function(){
1988					$( '.fl-builder-ui-pinned-content-transform' ).css( 'transform', '' );
1989
1990					// Toggle active menu.
1991					if ( button.hasClass( 'fl-active' ) ) {
1992						button.trigger( 'click' );
1993					}
1994				});
1995			}
1996		},
1997
1998		/**
1999		 * Logic to enable/disable the Flyout menu on button click.
2000		 *
2001		 * @since 2.2
2002		 * @return void
2003		 */
2004		_toggleFlyoutMenu: function(){
2005			var wrapper		= $( this.wrapperClass ),
2006				button		= wrapper.find( '.fl-menu-mobile-toggle' ),
2007				wrapFlyout	= wrapper.find( '.fl-menu-mobile-flyout' ),
2008				position 	= wrapper.hasClass( 'fl-flyout-right' ) ? 'right' : 'left',
2009				pushMenu 	= wrapper.hasClass( 'fl-menu-responsive-flyout-push' ) || wrapper.hasClass( 'fl-menu-responsive-flyout-push-opacity' ),
2010				opacity		= wrapper.find( '.fl-menu-mobile-opacity' ),
2011				marginPos	= {},
2012				posAttr		= {},
2013				fixedPos 	= {},
2014				winHeight	= $(window).height(),
2015				fixedHeader	= $('header, header > div');
2016
2017			if ( button.hasClass( 'fl-active' ) ) {
2018				posAttr[ position ]  = '0px';
2019				posAttr[ 'height' ]  = winHeight + 'px';
2020			} else {
2021				posAttr[ position ]  = '-267px';
2022			}
2023
2024			wrapFlyout.css( posAttr );
2025
2026			// Fix the push menu when builder ui panel is pinned.
2027			if ( $( '.fl-builder-ui-pinned-content-transform' ).length > 0 && ! $( 'body' ).hasClass( 'fl-builder-edit' ) ) {
2028				$( '.fl-builder-ui-pinned-content-transform' ).css( 'transform', 'none' );
2029			}
2030
2031			if ( pushMenu ) {
2032				marginPos[ 'margin-' + position ] = button.hasClass( 'fl-active' ) ? '250px' : '0px';
2033				$( 'body' ).animate( marginPos, 200);
2034
2035				// Fixed header
2036				if ( fixedHeader.length > 0 ) {
2037					fixedPos[ position] = button.hasClass( 'fl-active' ) ? '250px' : '0px';
2038					fixedHeader.each(function(){
2039						if ( 'fixed' == $( this ).css( 'position' ) ) {
2040							$( this ).css({
2041								'-webkit-transition': 'none',
2042								'-o-transition'		: 'none',
2043								'transition'		: 'none'
2044							});
2045							$( this ).animate( fixedPos, 200 );
2046						}
2047					});
2048				}
2049			}
2050
2051			if ( opacity.length > 0 && button.hasClass( 'fl-active' ) ) {
2052				opacity.show();
2053			}
2054			else {
2055				opacity.hide();
2056			}
2057		},
2058
2059		/**
2060		 * Shows or hides the nav search form.
2061		 *
2062		 * @since 2.5
2063		 * @method _toggleMenuSearch
2064		 */
2065		_toggleMenuSearch: function(){
2066			var wrapper = $( this.wrapperClass ).find('.fl-menu-search-item'),
2067				button  = wrapper.find('a.fl-button'),
2068				form    = wrapper.find('.fl-search-form-input-wrap'),
2069				self    = this;
2070
2071			button.on('click', function(e){
2072				e.preventDefault();
2073
2074				if(form.is(':visible')) {
2075					form.stop().fadeOut(200);
2076				}
2077				else {
2078					form.stop().fadeIn(200);
2079					$('body').on('click.fl-menu-search', $.proxy(self._hideMenuSearch, self));
2080					form.find('.fl-search-text').focus();
2081				}
2082			});
2083		},
2084
2085		/**
2086		 * Hides the nav search form.
2087		 *
2088		 * @since 2.5
2089		 * @method _hideMenuSearch
2090		 */
2091		_hideMenuSearch: function(e){
2092			var form = $( this.wrapperClass ).find('.fl-search-form-input-wrap');
2093
2094			if(e !== undefined) {
2095				if($(e.target).closest('.fl-menu-search-item').length > 0) {
2096					return;
2097				}
2098			}
2099
2100			form.stop().fadeOut(200);
2101			$('body').off('click.fl-menu-search');
2102		},
2103
2104		/**
2105		 * Adds menu node and post ID to WooCommerce ajax URL requests.
2106		 *
2107		 * @since  3.0
2108		 * @return void
2109		 */
2110		_wooUpdateParams: function() {
2111			if ( 'undefined' !== typeof wc_cart_fragments_params ) {
2112				wc_cart_fragments_params.wc_ajax_url += '&fl-menu-node='+ this.nodeId +'&post-id='+ this.postId;
2113			}
2114			if ( 'undefined' !== typeof wc_add_to_cart_params ) {
2115				wc_add_to_cart_params.wc_ajax_url += '&fl-menu-node='+ this.nodeId +'&post-id='+ this.postId;
2116			}
2117		},
2118	};
2119
2120})(jQuery);
2121
2122(function($) {
2123
2124	$(function() {
2125
2126		new FLBuilderMenu({
2127			id: '5f4733df907f3',
2128			type: 'vertical',
2129			mobile: 'hamburger-label',
2130			mobileBelowRow: false,
2131			mobileFlyout: false,
2132			breakPoints: {
2133				large: 1200,
2134				medium: 1080,
2135				small: 768			},
2136			mobileBreakpoint: 'always',
2137			postId : '541',
2138			mobileStacked: true,
2139		});
2140
2141	});
2142
2143})(jQuery);
2144
2145(function($) {
2146
2147	$(function() {
2148
2149		new FLBuilderMenu({
2150			id: '5ff27f75780ef',
2151			type: 'vertical',
2152			mobile: 'hamburger-label',
2153			mobileBelowRow: false,
2154			mobileFlyout: true,
2155			breakPoints: {
2156				large: 1200,
2157				medium: 1080,
2158				small: 768			},
2159			mobileBreakpoint: 'always',
2160			postId : '541',
2161			mobileStacked: true,
2162		});
2163
2164	});
2165
2166})(jQuery);
2167
2168/* Start Layout Custom JS */
2169
2170/* End Layout Custom JS */
2171
2172(function($){
2173
2174	/**
2175	 * Helper class for header layout logic.
2176	 *
2177	 * @since 1.0
2178	 * @class FLThemeBuilderHeaderLayout
2179	 */
2180	FLThemeBuilderHeaderLayout = {
2181
2182		/**
2183		 * A reference to the window object for this page.
2184		 *
2185		 * @since 1.0
2186		 * @property {Object} win
2187		 */
2188		win : null,
2189
2190		/**
2191		 * A reference to the body object for this page.
2192		 *
2193		 * @since 1.0
2194		 * @property {Object} body
2195		 */
2196		body : null,
2197
2198		/**
2199		 * A reference to the header object for this page.
2200		 *
2201		 * @since 1.0
2202		 * @property {Object} header
2203		 */
2204		header : null,
2205
2206		/**
2207		 * Whether this header overlays the content or not.
2208		 *
2209		 * @since 1.0
2210		 * @property {Boolean} overlay
2211		 */
2212		overlay : false,
2213
2214		/**
2215		 * Whether the page has the WP admin bar or not.
2216		 *
2217		 * @since 1.0
2218		 * @property {Boolean} hasAdminBar
2219		 */
2220		hasAdminBar : false,
2221
2222		/**
2223		 * Breakpoint for when the sticky header should apply.
2224		 *
2225		 * @since 1.4
2226		 * @property {String} stickyOn
2227		 */
2228		stickyOn: '',
2229
2230		/**
2231		 * A reference of the sticky and shrink header breakpoint.
2232		 *
2233		 * @since 1.2.5
2234		 * @property {Number} breakpointWidth
2235		 */
2236		breakpointWidth: 0,
2237
2238		/**
2239		 * Initializes header layout logic.
2240		 *
2241		 * @since 1.0
2242		 * @method init
2243		 */
2244		init: function()
2245		{
2246			var editing          = $( 'html.fl-builder-edit' ).length,
2247				header           = $( '.fl-builder-content[data-type=header]' ),
2248				menuModule       = header.find( '.fl-module-menu' ),
2249				breakpoint       = null;
2250
2251			if ( ! editing && header.length ) {
2252
2253				header.imagesLoaded( $.proxy( function() {
2254
2255					this.win         = $( window );
2256					this.body        = $( 'body' );
2257					this.header      = header.eq( 0 );
2258					this.overlay     = !! Number( header.attr( 'data-overlay' ) );
2259					this.hasAdminBar = !! $( 'body.admin-bar' ).length;
2260					this.stickyOn    = this.header.data( 'sticky-on' );
2261					breakpoint       = this.header.data( 'sticky-breakpoint' );
2262
2263					if ( '' == this.stickyOn ) {
2264						if ( typeof FLBuilderLayoutConfig.breakpoints[ breakpoint ] !== undefined ) {
2265							this.breakpointWidth = FLBuilderLayoutConfig.breakpoints[ breakpoint ];
2266						}
2267						else {
2268							this.breakpointWidth = FLBuilderLayoutConfig.breakpoints.medium;
2269						}
2270					}
2271
2272					if ( Number( header.attr( 'data-sticky' ) ) ) {
2273
2274						this.header.data( 'original-top', this.header.offset().top );
2275						this.win.on( 'resize', $.throttle( 500, $.proxy( this._initSticky, this ) ) );
2276						this._initSticky();
2277
2278					}
2279
2280				}, this ) );
2281			}
2282		},
2283
2284		/**
2285		 * Initializes sticky logic for a header.
2286		 *
2287		 * @since 1.0
2288		 * @access private
2289		 * @method _initSticky
2290		 */
2291		_initSticky: function( e )
2292		{
2293			var header     = $('.fl-builder-content[data-type=header]'),
2294				windowSize = this.win.width(),
2295				makeSticky = false;
2296
2297			makeSticky = this._makeWindowSticky( windowSize );
2298			if ( makeSticky || ( this.breakpointWidth > 0 && windowSize >= this.breakpointWidth ) ) {
2299				this.win.on( 'scroll.fl-theme-builder-header-sticky', $.proxy( this._doSticky, this ) );
2300				//
2301				// Check if Event Type is 'resize' then invoke this._doSticky()
2302				// only if the 'fl-theme-builder-header-sticky' class is already present.
2303				//
2304				if ( e && 'resize' === e.type ) {
2305					if ( this.header.hasClass( 'fl-theme-builder-header-sticky' ) ) {
2306						this._doSticky( e );
2307					}
2308					this._adjustStickyHeaderWidth();
2309				}
2310
2311				if ( Number( header.attr( 'data-shrink' ) ) ) {
2312					this.header.data( 'original-height', this.header.outerHeight() );
2313					this.win.on( 'resize', $.throttle( 500, $.proxy( this._initShrink, this ) ) );
2314					this._initShrink();
2315				}
2316
2317				this._initFlyoutMenuFix( e );
2318			} else {
2319				this.win.off( 'scroll.fl-theme-builder-header-sticky' );
2320				this.win.off( 'resize.fl-theme-builder-header-sticky' );
2321
2322				this.header.removeClass( 'fl-theme-builder-header-sticky' );
2323				this.header.removeAttr( 'style' );
2324				this.header.parent().css( 'padding-top', '0' );
2325			}
2326		},
2327
2328		/**
2329		 * Check if Header should be sticky at a particular Window size.
2330		 *
2331		 * @since 1.4
2332		 * @access private
2333		 * @param  widowSize
2334		 * @method _makeWindowSticky
2335		 */
2336		_makeWindowSticky: function ( windowSize )
2337		{
2338			var makeSticky = false;
2339
2340			switch (this.stickyOn) {
2341				case 'xl':
2342					makeSticky = windowSize > FLBuilderLayoutConfig.breakpoints['large'];
2343					break;
2344				case '': // Default
2345				case 'desktop':
2346					makeSticky = windowSize >= FLBuilderLayoutConfig.breakpoints['medium'];
2347					break;
2348				case 'desktop-medium':
2349					makeSticky = windowSize > FLBuilderLayoutConfig.breakpoints['small'];
2350					break;
2351				case 'large':
2352					makeSticky = windowSize > FLBuilderLayoutConfig.breakpoints['medium'] && windowSize <= FLBuilderLayoutConfig.breakpoints['large'];
2353					break;
2354				case 'large-medium':
2355					makeSticky = windowSize > FLBuilderLayoutConfig.breakpoints['small'] && windowSize <= FLBuilderLayoutConfig.breakpoints['large'];
2356					break;
2357				case 'medium':
2358					makeSticky = ( windowSize <= FLBuilderLayoutConfig.breakpoints['medium'] && windowSize > FLBuilderLayoutConfig.breakpoints['small'] );
2359					break;
2360				case 'medium-mobile':
2361					makeSticky = (windowSize <= FLBuilderLayoutConfig.breakpoints['medium']);
2362					break;
2363				case 'mobile':
2364					makeSticky = (windowSize <= FLBuilderLayoutConfig.breakpoints['small']);
2365					break;
2366				case 'all':
2367					makeSticky = true;
2368					break;
2369			}
2370
2371			return makeSticky;
2372		},
2373
2374		/**
2375		 * Sticks the header when the page is scrolled.
2376		 *
2377		 * @since 1.0
2378		 * @access private
2379		 * @method _doSticky
2380		 */
2381		_doSticky: function( e )
2382		{
2383			var winTop    		  = Math.floor( this.win.scrollTop() ),
2384				headerTop 		  = Math.floor( this.header.data( 'original-top' ) ),
2385				hasStickyClass    = this.header.hasClass( 'fl-theme-builder-header-sticky' ),
2386				hasScrolledClass  = this.header.hasClass( 'fl-theme-builder-header-scrolled' ),
2387				beforeHeader      = this.header.prevAll( '.fl-builder-content' ),
2388				bodyTopPadding    = parseInt( jQuery('body').css('padding-top') ),
2389				winBarHeight      = $('#wpadminbar').length ? $('#wpadminbar').outerHeight() : 0,
2390				headerHeight      = 0;
2391
2392			if ( isNaN( bodyTopPadding ) ) {
2393				bodyTopPadding = 0;
2394			}
2395
2396			if ( this.hasAdminBar && this.win.width() > 600 ) {
2397				winTop += Math.floor( winBarHeight );
2398			}
2399
2400			if ( winTop > headerTop ) {
2401				if ( ! hasStickyClass ) {
2402					if ( e && ( 'scroll' === e.type || 'smartscroll' === e.type ) ) {
2403					 	this.header.addClass( 'fl-theme-builder-header-sticky' );
2404						if ( this.overlay && beforeHeader.length ) {
2405							this.header.css( 'top', winBarHeight);
2406						}
2407					}
2408
2409					if ( ! this.overlay ) {
2410						this._adjustHeaderHeight();
2411					}
2412				}
2413			}
2414			else if ( hasStickyClass ) {
2415				this.header.removeClass( 'fl-theme-builder-header-sticky' );
2416				this.header.removeAttr( 'style' );
2417				this.header.parent().css( 'padding-top', '0' );
2418			}
2419
2420			this._adjustStickyHeaderWidth();
2421
2422			if ( winTop > headerTop ) {
2423				if ( ! hasScrolledClass ) {
2424					this.header.addClass( 'fl-theme-builder-header-scrolled' );
2425				}
2426			} else if ( hasScrolledClass ) {
2427				this.header.removeClass( 'fl-theme-builder-header-scrolled' );
2428			}
2429
2430			this._flyoutMenuFix( e );
2431		},
2432
2433		/**
2434		 * Initializes flyout menu fixes on sticky header.
2435		 *
2436		 * @since 1.4.1
2437		 * @method _initFlyoutMenuFix
2438		 */
2439		_initFlyoutMenuFix: function( e ) {
2440			var header       = this.header,
2441			    menuModule   = header.find( '.fl-menu' ),
2442				flyoutMenu   = menuModule.find( '.fl-menu-mobile-flyout' ),
2443				isPushMenu   = menuModule.hasClass( 'fl-menu-responsive-flyout-push' ) || menuModule.hasClass( 'fl-menu-responsive-flyout-push-opacity' ),
2444				isSticky     = header.hasClass( 'fl-theme-builder-header-sticky' ),
2445				isOverlay    = menuModule.hasClass( 'fl-menu-responsive-flyout-overlay' ),
2446				flyoutPos    = menuModule.hasClass( 'fl-flyout-right' ) ? 'right' : 'left',
2447				flyoutParent = header.parent().is( 'header' ) ? header.parent().parent() : header.parent();
2448				isFullWidth  = this.win.width() === header.width(),
2449				flyoutLayout = '',
2450				activePos    = 250,
2451				headerPos    = 0;
2452
2453			if ( ! flyoutMenu.length ) {
2454				return;
2455			}
2456
2457			if ( this.win.width() > header.parent().width() ) {
2458				headerPos = ( this.win.width() - header.width() ) / 2;
2459			}
2460
2461			if ( isOverlay ) {
2462				activePos = headerPos;
2463			}
2464			else if ( isPushMenu ) {
2465				activePos = activePos + headerPos;
2466			}
2467			flyoutMenu.data( 'activePos', activePos );
2468
2469			if ( isPushMenu ) {
2470				flyoutLayout = 'push-' + flyoutPos;
2471			}
2472			else if ( isOverlay ) {
2473				flyoutLayout = 'overlay-' + flyoutPos;
2474			}
2475
2476			if ( isPushMenu && ! $( 'html' ).hasClass( 'fl-theme-builder-has-flyout-menu' ) ) {
2477				$( 'html' ).addClass( 'fl-theme-builder-has-flyout-menu' );
2478			}
2479
2480			if ( ! flyoutParent.hasClass( 'fl-theme-builder-flyout-menu-' + flyoutLayout ) ) {
2481				flyoutParent.addClass( 'fl-theme-builder-flyout-menu-' + flyoutLayout );
2482			}
2483
2484			if ( ! header.hasClass( 'fl-theme-builder-flyout-menu-overlay' ) && isOverlay ) {
2485				header.addClass( 'fl-theme-builder-flyout-menu-overlay' );
2486			}
2487
2488			if ( ! header.hasClass( 'fl-theme-builder-header-full-width' ) && isFullWidth ) {
2489			   header.addClass( 'fl-theme-builder-header-full-width' );
2490		    }
2491			else if ( ! isFullWidth ) {
2492				header.removeClass( 'fl-theme-builder-header-full-width' );
2493			}
2494
2495			menuModule.on( 'click', '.fl-menu-mobile-toggle', $.proxy( function( event ){
2496				if ( menuModule.find( '.fl-menu-mobile-toggle.fl-active' ).length ) {
2497					$( 'html' ).addClass( 'fl-theme-builder-flyout-menu-active' );
2498					event.stopImmediatePropagation();
2499				}
2500				else {
2501					$( 'html' ).removeClass( 'fl-theme-builder-flyout-menu-active' );
2502				}
2503
2504				this._flyoutMenuFix( event );
2505			}, this ) );
2506		},
2507
2508		/**
2509		 * Fix flyout menu inside the sticky header.
2510		 *
2511		 * @since 1.4.1
2512		 * @method _flyoutMenuFix
2513		 */
2514		_flyoutMenuFix: function( e ){
2515			var header      = this.header,
2516			    menuModule  = header.find( '.fl-menu' ),
2517				flyoutMenu  = menuModule.find( '.fl-menu-mobile-flyout' ),
2518				isPushMenu  = menuModule.hasClass( 'fl-menu-responsive-flyout-push' ) || menuModule.hasClass( 'fl-menu-responsive-flyout-push-opacity' ),
2519				flyoutPos   = menuModule.hasClass( 'fl-flyout-right' ) ? 'right' : 'left',
2520				menuOpacity = menuModule.find( '.fl-menu-mobile-opacity' ),
2521				isScroll    = 'undefined' !== typeof e && 'scroll' === e.handleObj.type,
2522				activePos   = 'undefined' !== typeof flyoutMenu.data( 'activePos' ) ? flyoutMenu.data( 'activePos' ) : 0,
2523				headerPos   = ( this.win.width() - header.width() ) / 2,
2524				inactivePos = headerPos > 0 ? activePos + 4 : 254;
2525
2526			if ( ! flyoutMenu.length ) {
2527				return;
2528			}
2529
2530			if ( this.overlay ) {
2531				return;
2532			}
2533
2534			if( $( '.fl-theme-builder-flyout-menu-active' ).length ) {
2535
2536				if ( isScroll && ! flyoutMenu.hasClass( 'fl-menu-disable-transition' ) ) {
2537					flyoutMenu.addClass( 'fl-menu-disable-transition' );
2538				}
2539
2540				if ( header.hasClass( 'fl-theme-builder-header-sticky' ) ) {
2541					if ( ! isScroll ) {
2542						setTimeout( $.proxy( function(){
2543							flyoutMenu.css( flyoutPos, '-' + activePos + 'px' );
2544						}, this ), 1 );
2545					}
2546					else {
2547						flyoutMenu.css( flyoutPos, '-' + activePos + 'px' );
2548					}
2549				}
2550				else {
2551					flyoutMenu.css( flyoutPos, '0px' );
2552				}
2553			}
2554			else {
2555				if ( flyoutMenu.hasClass( 'fl-menu-disable-transition' ) ) {
2556					flyoutMenu.removeClass( 'fl-menu-disable-transition' );
2557				}
2558
2559				if ( header.hasClass( 'fl-theme-builder-flyout-menu-overlay' ) && headerPos > 0 && headerPos < 250 ) {
2560					if ( header.hasClass( 'fl-theme-builder-header-sticky' ) ) {
2561						inactivePos = headerPos + 254;
2562					}
2563					else {
2564						inactivePos = 254;
2565					}
2566				}
2567
2568				if ( e && e.type === 'resize' ) {
2569					inactivePos = headerPos + 254;
2570				}
2571
2572				flyoutMenu.css( flyoutPos, '-' + inactivePos + 'px' );
2573			}
2574
2575			if ( e && menuModule.is('.fl-menu-responsive-flyout-overlay') && $.infinitescroll ) {
2576				e.stopImmediatePropagation();
2577			}
2578
2579			if( menuOpacity.length ) {
2580				if ( header.hasClass( 'fl-theme-builder-header-sticky' ) ) {
2581					if ( '0px' === menuOpacity.css( 'left' ) ) {
2582						menuOpacity.css( 'left', '-' + headerPos + 'px' );
2583					}
2584				}
2585				else {
2586					menuOpacity.css( 'left', '' );
2587				}
2588			}
2589		},
2590
2591		/**
2592		 * Adjust sticky header width if BB Theme Boxed Layout is used.
2593		 *
2594		 * @since 1.4
2595		 * @access private
2596		 * @method _adjustStickyHeaderWidth
2597		 */
2598		_adjustStickyHeaderWidth: function () {
2599			if ( $('body').hasClass( 'fl-fixed-width' ) ) {
2600				var parentWidth = this.header.parent().width();
2601
2602				// Better if this is set in the stylesheet file.
2603				if ( this.win.width() >= 992 ) {
2604					this.header.css({
2605						'margin': '0 auto',
2606						'max-width': parentWidth,
2607					});
2608				}
2609				else {
2610					this.header.css({
2611						'margin': '',
2612						'max-width': '',
2613					});
2614				}
2615			}
2616		},
2617
2618		/**
2619		 * Adjust Sticky Header Height
2620		 *
2621		 * @since 1.4
2622		 * @access private
2623		 * @method _adjustHeaderHeight
2624		 */
2625		_adjustHeaderHeight: function () {
2626			var beforeHeader = this.header.prevAll('.fl-builder-content'),
2627				beforeHeaderHeight = 0,
2628				beforeHeaderFix = 0,
2629				headerHeight = Math.floor( this.header.outerHeight() ),
2630				bodyTopPadding = parseInt( $( 'body' ).css( 'padding-top' ) ),
2631				wpAdminBarHeight = 0,
2632				totalHeaderHeight = 0;
2633
2634			if ( isNaN( bodyTopPadding ) ) {
2635				bodyTopPadding = 0;
2636			}
2637
2638			if ( beforeHeader.length ) {
2639				$.each( beforeHeader, function() {
2640					beforeHeaderHeight += Math.floor( $(this).outerHeight() );
2641				});
2642				// Subtract this value from the header parent's top padding.
2643				beforeHeaderFix = 2;
2644			}
2645
2646			if ( this.hasAdminBar && this.win.width() <= 600 ) {
2647				wpAdminBarHeight = Math.floor( $('#wpadminbar').outerHeight() );
2648			}
2649
2650			totalHeaderHeight = Math.floor( beforeHeaderHeight + headerHeight);
2651
2652			if ( headerHeight > 0 ) {
2653				var headerParent = this.header.parent(),
2654					headerParentTopPadding = 0;
2655
2656				// If the header's parent container is the BODY tag ignore its top padding.
2657				if ( $( headerParent ).is('body') ) {
2658					headerParentTopPadding = Math.floor( headerHeight - wpAdminBarHeight );
2659				} else {
2660					headerParentTopPadding = Math.floor( headerHeight - bodyTopPadding - wpAdminBarHeight );
2661				}
2662
2663				$( headerParent ).css( 'padding-top',  ( headerParentTopPadding - beforeHeaderFix ) + 'px' );
2664
2665				this.header.css({
2666					'-webkit-transform': 'translate(0px, -' + totalHeaderHeight + 'px)',
2667					'-ms-transform': 'translate(0px, -' + totalHeaderHeight + 'px)',
2668					'transform': 'translate(0px, -' + totalHeaderHeight + 'px)'
2669				});
2670
2671			}
2672
2673		},
2674
2675		/**
2676		 * Initializes shrink logic for a header.
2677		 *
2678		 * @since 1.0
2679		 * @access private
2680		 * @method _initShrink
2681		 */
2682		_initShrink: function( e )
2683		{
2684			if ( this.win.width() >= this.breakpointWidth ) {
2685				this.win.on( 'scroll.fl-theme-builder-header-shrink', $.proxy( this._doShrink, this ) );
2686				this._setImageMaxHeight();
2687
2688				if ( this.win.scrollTop() > 0 ){
2689					this._doShrink();
2690				}
2691
2692			} else {
2693				this.header.parent().css( 'padding-top', '0' );
2694				this.win.off( 'scroll.fl-theme-builder-header-shrink' );
2695				this._removeShrink();
2696				this._removeImageMaxHeight();
2697			}
2698		},
2699
2700		/**
2701		 * Shrinks the header when the page is scrolled.
2702		 *
2703		 * @since 1.0
2704		 * @access private
2705		 * @method _doShrink
2706		 */
2707		_doShrink: function( e )
2708		{
2709			var winTop 			  = this.win.scrollTop(),
2710				headerTop 		  = this.header.data('original-top'),
2711				headerHeight 	  = this.header.data('original-height'),
2712				shrinkImageHeight = this.header.data('shrink-image-height'),
2713				windowSize   	  = this.win.width(),
2714				makeSticky   	  = this._makeWindowSticky( windowSize ),
2715				hasClass     	  = this.header.hasClass( 'fl-theme-builder-header-shrink' );
2716
2717
2718			if ( this.hasAdminBar ) {
2719				winTop += 32;
2720			}
2721
2722			if ( makeSticky && ( winTop > headerTop + headerHeight ) ) {
2723				if ( ! hasClass ) {
2724
2725					this.header.addClass( 'fl-theme-builder-header-shrink' );
2726
2727					// Shrink images but don't include lightbox and menu images.
2728					this.header.find('img').each( function( i ) {
2729						var image           = $( this ),
2730							maxMegaMenu     = image.closest( '.max-mega-menu' ).length,
2731							imageInLightbox = image.closest( '.fl-button-lightbox-content' ).length,
2732							imageInNavMenu  = image.closest( 'li.menu-item' ).length;
2733
2734						if ( ! ( imageInLightbox || imageInNavMenu || maxMegaMenu ) ) {
2735							image.css( 'max-height', shrinkImageHeight );
2736						}
2737
2738					});
2739
2740					this.header.find( '.fl-row-content-wrap' ).each( function() {
2741
2742						var row = $( this );
2743
2744						if ( parseInt( row.css( 'padding-bottom' ) ) > 5 ) {
2745							row.addClass( 'fl-theme-builder-header-shrink-row-bottom' );
2746						}
2747
2748						if ( parseInt( row.css( 'padding-top' ) ) > 5 ) {
2749							row.addClass( 'fl-theme-builder-header-shrink-row-top' );
2750						}
2751					} );
2752
2753					this.header.find( '.fl-module-content' ).each( function() {
2754
2755						var module = $( this );
2756
2757						if ( parseInt( module.css( 'margin-bottom' ) ) > 5 ) {
2758							module.addClass( 'fl-theme-builder-header-shrink-module-bottom' );
2759						}
2760
2761						if ( parseInt( module.css( 'margin-top' ) ) > 5 ) {
2762							module.addClass( 'fl-theme-builder-header-shrink-module-top' );
2763						}
2764					} );
2765				}
2766			} else if (hasClass) {
2767				this.header.find( 'img' ).css( 'max-height', '' );
2768				this._removeShrink();
2769			}
2770
2771			// Fixes Shrink header issue with BB Theme when window is scrolled then resized and back.
2772			if ( 'undefined' === typeof( e ) && $('body').hasClass( 'fl-fixed-width' ) ) {
2773				if ( ! this.overlay ) {
2774					this._adjustHeaderHeight();
2775				}
2776			}
2777
2778		},
2779
2780		/**
2781		 * Removes the header shrink effect.
2782		 *
2783		 * @since 1.0
2784		 * @access private
2785		 * @method _removeShrink
2786		 */
2787		_removeShrink: function()
2788		{
2789			var rows    = this.header.find( '.fl-row-content-wrap' ),
2790				modules = this.header.find( '.fl-module-content' );
2791
2792			rows.removeClass( 'fl-theme-builder-header-shrink-row-bottom' );
2793			rows.removeClass( 'fl-theme-builder-header-shrink-row-top' );
2794			modules.removeClass( 'fl-theme-builder-header-shrink-module-bottom' );
2795			modules.removeClass( 'fl-theme-builder-header-shrink-module-top' );
2796			this.header.removeClass( 'fl-theme-builder-header-shrink' );
2797		},
2798
2799		/**
2800		 * Adds max height to images in modules for smooth scrolling.
2801		 *
2802		 * @since 1.1.1
2803		 * @access private
2804		 * @method _setImageMaxHeight
2805		 */
2806		_setImageMaxHeight: function()
2807		{
2808			var head = $( 'head' ),
2809				stylesId = 'fl-header-styles-' + this.header.data( 'post-id' ),
2810				styles = '',
2811				images = this.header.find( '.fl-module-content img' );
2812
2813			if ( $( '#' + stylesId ).length ) {
2814				return;
2815			}
2816
2817			images.each( function( i ) {
2818				var image           = $( this ),
2819					height          = image.height(),
2820					node            = image.closest( '.fl-module' ).data( 'node' ),
2821					className       = 'fl-node-' + node + '-img-' + i,
2822					maxMegaMenu     = image.closest( '.max-mega-menu' ).length,
2823					imageInLightbox = image.closest( '.fl-button-lightbox-content' ).length,
2824					imageInNavMenu  = image.closest( 'li.menu-item' ).length;
2825
2826				if ( ! ( imageInLightbox || imageInNavMenu || maxMegaMenu  ) ) {
2827					image.addClass( className );
2828					styles += '.' + className + ' { max-height: ' + ( height ? height : image[0].height )  + 'px }';
2829				}
2830
2831			} );
2832
2833			if ( '' !== styles ) {
2834				head.append( '<style id="' + stylesId + '">' + styles + '</style>' );
2835			}
2836		},
2837
2838		/**
2839		 * Removes max height on images in modules for smooth scrolling.
2840		 *
2841		 * @since 1.1.1
2842		 * @access private
2843		 * @method _removeImageMaxHeight
2844		 */
2845		_removeImageMaxHeight: function()
2846		{
2847			$( '#fl-header-styles-' + this.header.data( 'post-id' ) ).remove();
2848		},
2849	};
2850
2851	$( function() { FLThemeBuilderHeaderLayout.init(); } );
2852
2853})(jQuery);
2854/*!
2855 * Bowser - a browser detector
2856 * https://github.com/ded/bowser
2857 * MIT License | (c) Dustin Diaz 2015
2858 */
2859
2860!function (name, definition) {
2861  if (typeof module != 'undefined' && module.exports) module.exports = definition()
2862  else if (typeof define == 'function' && define.amd) define(name, definition)
2863  else this[name] = definition()
2864}('bowser', function () {
2865  /**
2866    * See useragents.js for examples of navigator.userAgent
2867    */
2868
2869  var t = true
2870
2871  function detect(ua) {
2872
2873    function getFirstMatch(regex) {
2874      var match = ua.match(regex);
2875      return (match && match.length > 1 && match[1]) || '';
2876    }
2877
2878    function getSecondMatch(regex) {
2879      var match = ua.match(regex);
2880      return (match && match.length > 1 && match[2]) || '';
2881    }
2882
2883    var iosdevice = getFirstMatch(/(ipod|iphone|ipad)/i).toLowerCase()
2884      , likeAndroid = /like android/i.test(ua)
2885      , android = !likeAndroid && /android/i.test(ua)
2886      , nexusMobile = /nexus\s*[0-6]\s*/i.test(ua)
2887      , nexusTablet = !nexusMobile && /nexus\s*[0-9]+/i.test(ua)
2888      , chromeos = /CrOS/.test(ua)
2889      , silk = /silk/i.test(ua)
2890      , sailfish = /sailfish/i.test(ua)
2891      , tizen = /tizen/i.test(ua)
2892      , webos = /(web|hpw)os/i.test(ua)
2893      , windowsphone = /windows phone/i.test(ua)
2894      , windows = !windowsphone && /windows/i.test(ua)
2895      , mac = !iosdevice && !silk && /macintosh/i.test(ua)
2896      , linux = !android && !sailfish && !tizen && !webos && /linux/i.test(ua)
2897      , edgeVersion = getFirstMatch(/edge\/(\d+(\.\d+)?)/i)
2898      , versionIdentifier = getFirstMatch(/version\/(\d+(\.\d+)?)/i)
2899      , tablet = /tablet/i.test(ua)
2900      , mobile = !tablet && /[^-]mobi/i.test(ua)
2901      , xbox = /xbox/i.test(ua)
2902      , result
2903
2904    if (/opera|opr|opios/i.test(ua)) {
2905      result = {
2906        name: 'Opera'
2907      , opera: t
2908      , version: versionIdentifier || getFirstMatch(/(?:opera|opr|opios)[\s\/](\d+(\.\d+)?)/i)
2909      }
2910    }
2911    else if (/coast/i.test(ua)) {
2912      result = {
2913        name: 'Opera Coast'
2914        , coast: t
2915        , version: versionIdentifier || getFirstMatch(/(?:coast)[\s\/](\d+(\.\d+)?)/i)
2916      }
2917    }
2918    else if (/yabrowser/i.test(ua)) {
2919      result = {
2920        name: 'Yandex Browser'
2921      , yandexbrowser: t
2922      , version: versionIdentifier || getFirstMatch(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i)
2923      }
2924    }
2925    else if (/ucbrowser/i.test(ua)) {
2926      result = {
2927          name: 'UC Browser'
2928        , ucbrowser: t
2929        , version: getFirstMatch(/(?:ucbrowser)[\s\/](\d+(?:\.\d+)+)/i)
2930      }
2931    }
2932    else if (/mxios/i.test(ua)) {
2933      result = {
2934        name: 'Maxthon'
2935        , maxthon: t
2936        , version: getFirstMatch(/(?:mxios)[\s\/](\d+(?:\.\d+)+)/i)
2937      }
2938    }
2939    else if (/epiphany/i.test(ua)) {
2940      result = {
2941        name: 'Epiphany'
2942        , epiphany: t
2943        , version: getFirstMatch(/(?:epiphany)[\s\/](\d+(?:\.\d+)+)/i)
2944      }
2945    }
2946    else if (/puffin/i.test(ua)) {
2947      result = {
2948        name: 'Puffin'
2949        , puffin: t
2950        , version: getFirstMatch(/(?:puffin)[\s\/](\d+(?:\.\d+)?)/i)
2951      }
2952    }
2953    else if (/sleipnir/i.test(ua)) {
2954      result = {
2955        name: 'Sleipnir'
2956        , sleipnir: t
2957        , version: getFirstMatch(/(?:sleipnir)[\s\/](\d+(?:\.\d+)+)/i)
2958      }
2959    }
2960    else if (/k-meleon/i.test(ua)) {
2961      result = {
2962        name: 'K-Meleon'
2963        , kMeleon: t
2964        , version: getFirstMatch(/(?:k-meleon)[\s\/](\d+(?:\.\d+)+)/i)
2965      }
2966    }
2967    else if (windowsphone) {
2968      result = {
2969        name: 'Windows Phone'
2970      , windowsphone: t
2971      }
2972      if (edgeVersion) {
2973        result.msedge = t
2974        result.version = edgeVersion
2975      }
2976      else {
2977        result.msie = t
2978        result.version = getFirstMatch(/iemobile\/(\d+(\.\d+)?)/i)
2979      }
2980    }
2981    else if (/msie|trident/i.test(ua)) {
2982      result = {
2983        name: 'Internet Explorer'
2984      , msie: t
2985      , version: getFirstMatch(/(?:msie |rv:)(\d+(\.\d+)?)/i)
2986      }
2987    } else if (chromeos) {
2988      result = {
2989        name: 'Chrome'
2990      , chromeos: t
2991      , chromeBook: t
2992      , chrome: t
2993      , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)
2994      }
2995    } else if (/chrome.+? edge/i.test(ua)) {
2996      result = {
2997        name: 'Microsoft Edge'
2998      , msedge: t
2999      , version: edgeVersion
3000      }
3001    }
3002    else if (/vivaldi/i.test(ua)) {
3003      result = {
3004        name: 'Vivaldi'
3005        , vivaldi: t
3006        , version: getFirstMatch(/vivaldi\/(\d+(\.\d+)?)/i) || versionIdentifier
3007      }
3008    }
3009    else if (sailfish) {
3010      result = {
3011        name: 'Sailfish'
3012      , sailfish: t
3013      , version: getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i)
3014      }
3015    }
3016    else if (/seamonkey\//i.test(ua)) {
3017      result = {
3018        name: 'SeaMonkey'
3019      , seamonkey: t
3020      , version: getFirstMatch(/seamonkey\/(\d+(\.\d+)?)/i)
3021      }
3022    }
3023    else if (/firefox|iceweasel|fxios/i.test(ua)) {
3024      result = {
3025        name: 'Firefox'
3026      , firefox: t
3027      , version: getFirstMatch(/(?:firefox|iceweasel|fxios)[ \/](\d+(\.\d+)?)/i)
3028      }
3029      if (/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(ua)) {
3030        result.firefoxos = t
3031      }
3032    }
3033    else if (silk) {
3034      result =  {
3035        name: 'Amazon Silk'
3036      , silk: t
3037      , version : getFirstMatch(/silk\/(\d+(\.\d+)?)/i)
3038      }
3039    }
3040    else if (/phantom/i.test(ua)) {
3041      result = {
3042        name: 'PhantomJS'
3043      , phantom: t
3044      , version: getFirstMatch(/phantomjs\/(\d+(\.\d+)?)/i)
3045      }
3046    }
3047    else if (/slimerjs/i.test(ua)) {
3048      result = {
3049        name: 'SlimerJS'
3050        , slimer: t
3051        , version: getFirstMatch(/slimerjs\/(\d+(\.\d+)?)/i)
3052      }
3053    }
3054    else if (/blackberry|\bbb\d+/i.test(ua) || /rim\stablet/i.test(ua)) {
3055      result = {
3056        name: 'BlackBerry'
3057      , blackberry: t
3058      , version: versionIdentifier || getFirstMatch(/blackberry[\d]+\/(\d+(\.\d+)?)/i)
3059      }
3060    }
3061    else if (webos) {
3062      result = {
3063        name: 'WebOS'
3064      , webos: t
3065      , version: versionIdentifier || getFirstMatch(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i)
3066      };
3067      if( /touchpad\//i.test(ua) ){
3068        result.touchpad = t;
3069      }
3070    }
3071    else if (/bada/i.test(ua)) {
3072      result = {
3073        name: 'Bada'
3074      , bada: t
3075      , version: getFirstMatch(/dolfin\/(\d+(\.\d+)?)/i)
3076      };
3077    }
3078    else if (tizen) {
3079      result = {
3080        name: 'Tizen'
3081      , tizen: t
3082      , version: getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i) || versionIdentifier
3083      };
3084    }
3085    else if (/qupzilla/i.test(ua)) {
3086      result = {
3087        name: 'QupZilla'
3088        , qupzilla: t
3089        , version: getFirstMatch(/(?:qupzilla)[\s\/](\d+(?:\.\d+)+)/i) || versionIdentifier
3090      }
3091    }
3092    else if (/chromium/i.test(ua)) {
3093      result = {
3094        name: 'Chromium'
3095        , chromium: t
3096        , version: getFirstMatch(/(?:chromium)[\s\/](\d+(?:\.\d+)?)/i) || versionIdentifier
3097      }
3098    }
3099    else if (/chrome|crios|crmo/i.test(ua)) {
3100      result = {
3101        name: 'Chrome'
3102        , chrome: t
3103        , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)
3104      }
3105    }
3106    else if (android) {
3107      result = {
3108        name: 'Android'
3109        , version: versionIdentifier
3110      }
3111    }
3112    else if (/safari|applewebkit/i.test(ua)) {
3113      result = {
3114        name: 'Safari'
3115      , safari: t
3116      }
3117      if (versionIdentifier) {
3118        result.version = versionIdentifier
3119      }
3120    }
3121    else if (iosdevice) {
3122      result = {
3123        name : iosdevice == 'iphone' ? 'iPhone' : iosdevice == 'ipad' ? 'iPad' : 'iPod'
3124      }
3125      // WTF: version is not part of user agent in web apps
3126      if (versionIdentifier) {
3127        result.version = versionIdentifier
3128      }
3129    }
3130    else if(/googlebot/i.test(ua)) {
3131      result = {
3132        name: 'Googlebot'
3133      , googlebot: t
3134      , version: getFirstMatch(/googlebot\/(\d+(\.\d+))/i) || versionIdentifier
3135      }
3136    }
3137    else {
3138      result = {
3139        name: getFirstMatch(/^(.*)\/(.*) /),
3140        version: getSecondMatch(/^(.*)\/(.*) /)
3141     };
3142   }
3143
3144    // set webkit or gecko flag for browsers based on these engines
3145    if (!result.msedge && /(apple)?webkit/i.test(ua)) {
3146      if (/(apple)?webkit\/537\.36/i.test(ua)) {
3147        result.name = result.name || "Blink"
3148        result.blink = t
3149      } else {
3150        result.name = result.name || "Webkit"
3151        result.webkit = t
3152      }
3153      if (!result.version && versionIdentifier) {
3154        result.version = versionIdentifier
3155      }
3156    } else if (!result.opera && /gecko\//i.test(ua)) {
3157      result.name = result.name || "Gecko"
3158      result.gecko = t
3159      result.version = result.version || getFirstMatch(/gecko\/(\d+(\.\d+)?)/i)
3160    }
3161
3162    // set OS flags for platforms that have multiple browsers
3163    if (!result.msedge && (android || result.silk)) {
3164      result.android = t
3165    } else if (iosdevice) {
3166      result[iosdevice] = t
3167      result.ios = t
3168    } else if (mac) {
3169      result.mac = t
3170    } else if (xbox) {
3171      result.xbox = t
3172    } else if (windows) {
3173      result.windows = t
3174    } else if (linux) {
3175      result.linux = t
3176    }
3177
3178    // OS version extraction
3179    var osVersion = '';
3180    if (result.windowsphone) {
3181      osVersion = getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i);
3182    } else if (iosdevice) {
3183      osVersion = getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i);
3184      osVersion = osVersion.replace(/[_\s]/g, '.');
3185    } else if (android) {
3186      osVersion = getFirstMatch(/android[ \/-](\d+(\.\d+)*)/i);
3187    } else if (result.webos) {
3188      osVersion = getFirstMatch(/(?:web|hpw)os\/(\d+(\.\d+)*)/i);
3189    } else if (result.blackberry) {
3190      osVersion = getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i);
3191    } else if (result.bada) {
3192      osVersion = getFirstMatch(/bada\/(\d+(\.\d+)*)/i);
3193    } else if (result.tizen) {
3194      osVersion = getFirstMatch(/tizen[\/\s](\d+(\.\d+)*)/i);
3195    }
3196    if (osVersion) {
3197      result.osversion = osVersion;
3198    }
3199
3200    // device type extraction
3201    var osMajorVersion = osVersion.split('.')[0];
3202    if (
3203         tablet
3204      || nexusTablet
3205      || iosdevice == 'ipad'
3206      || (android && (osMajorVersion == 3 || (osMajorVersion >= 4 && !mobile)))
3207      || result.silk
3208    ) {
3209      result.tablet = t
3210    } else if (
3211         mobile
3212      || iosdevice == 'iphone'
3213      || iosdevice == 'ipod'
3214      || android
3215      || nexusMobile
3216      || result.blackberry
3217      || result.webos
3218      || result.bada
3219    ) {
3220      result.mobile = t
3221    }
3222
3223    // Graded Browser Support
vendor: 4,510 bytes, lines 3224-3366
3224    // http://developer.yahoo.com/yui/articles/gbs
3225    if (result.msedge ||
3226        (result.msie && result.version >= 10) ||
3227        (result.yandexbrowser && result.version >= 15) ||
3228		    (result.vivaldi && result.version >= 1.0) ||
3229        (result.chrome && result.version >= 20) ||
3230        (result.firefox && result.version >= 20.0) ||
3231        (result.safari && result.version >= 6) ||
3232        (result.opera && result.version >= 10.0) ||
3233        (result.ios && result.osversion && result.osversion.split(".")[0] >= 6) ||
3234        (result.blackberry && result.version >= 10.1)
3235        || (result.chromium && result.version >= 20)
3236        ) {
3237      result.a = t;
3238    }
3239    else if ((result.msie && result.version < 10) ||
3240        (result.chrome && result.version < 20) ||
3241        (result.firefox && result.version < 20.0) ||
3242        (result.safari && result.version < 6) ||
3243        (result.opera && result.version < 10.0) ||
3244        (result.ios && result.osversion && result.osversion.split(".")[0] < 6)
3245        || (result.chromium && result.version < 20)
3246        ) {
3247      result.c = t
3248    } else result.x = t
3249
3250    return result
3251  }
3252
3253  var bowser = detect(typeof navigator !== 'undefined' ? navigator.userAgent : '')
3254
3255  bowser.test = function (browserList) {
3256    for (var i = 0; i < browserList.length; ++i) {
3257      var browserItem = browserList[i];
3258      if (typeof browserItem=== 'string') {
3259        if (browserItem in bowser) {
3260          return true;
3261        }
3262      }
3263    }
3264    return false;
3265  }
3266
3267  /**
3268   * Get version precisions count
3269   *
3270   * @example
3271   *   getVersionPrecision("1.10.3") // 3
3272   *
3273   * @param  {string} version
3274   * @return {number}
3275   */
3276  function getVersionPrecision(version) {
3277    return version.split(".").length;
3278  }
3279
3280  /**
3281   * Array::map polyfill
3282   *
3283   * @param  {Array} arr
3284   * @param  {Function} iterator
3285   * @return {Array}
3286   */
3287  function map(arr, iterator) {
3288    var result = [], i;
3289    if (Array.prototype.map) {
3290      return Array.prototype.map.call(arr, iterator);
3291    }
3292    for (i = 0; i < arr.length; i++) {
3293      result.push(iterator(arr[i]));
3294    }
3295    return result;
3296  }
3297
3298  /**
3299   * Calculate browser version weight
3300   *
3301   * @example
3302   *   compareVersions(['1.10.2.1',  '1.8.2.1.90'])    // 1
3303   *   compareVersions(['1.010.2.1', '1.09.2.1.90']);  // 1
3304   *   compareVersions(['1.10.2.1',  '1.10.2.1']);     // 0
3305   *   compareVersions(['1.10.2.1',  '1.0800.2']);     // -1
3306   *
3307   * @param  {Array<String>} versions versions to compare
3308   * @return {Number} comparison result
3309   */
3310  function compareVersions(versions) {
3311    // 1) get common precision for both versions, for example for "10.0" and "9" it should be 2
3312    var precision = Math.max(getVersionPrecision(versions[0]), getVersionPrecision(versions[1]));
3313    var chunks = map(versions, function (version) {
3314      var delta = precision - getVersionPrecision(version);
3315
3316      // 2) "9" -> "9.0" (for precision = 2)
3317      version = version + new Array(delta + 1).join(".0");
3318
3319      // 3) "9.0" -> ["000000000"", "000000009"]
3320      return map(version.split("."), function (chunk) {
3321        return new Array(20 - chunk.length).join("0") + chunk;
3322      }).reverse();
3323    });
3324
3325    // iterate in reverse order by reversed chunks array
3326    while (--precision >= 0) {
3327      // 4) compare: "000000009" > "000000010" = false (but "9" > "10" = true)
3328      if (chunks[0][precision] > chunks[1][precision]) {
3329        return 1;
3330      }
3331      else if (chunks[0][precision] === chunks[1][precision]) {
3332        if (precision === 0) {
3333          // all version chunks are same
3334          return 0;
3335        }
3336      }
3337      else {
3338        return -1;
3339      }
3340    }
3341  }
3342
3343  /**
3344   * Check if browser is unsupported
3345   *
3346   * @example
3347   *   bowser.isUnsupportedBrowser({
3348   *     msie: "10",
3349   *     firefox: "23",
3350   *     chrome: "29",
3351   *     safari: "5.1",
3352   *     opera: "16",
3353   *     phantom: "534"
3354   *   });
3355   *
3356   * @param  {Object}  minVersions map of minimal version to browser
3357   * @param  {Boolean} [strictMode = false] flag to return false if browser wasn't found in map
3358   * @param  {String}  [ua] user agent string
3359   * @return {Boolean}
3360   */
3361  function isUnsupportedBrowser(minVersions, strictMode, ua) {
3362    var _bowser = bowser;
3363
3364    // make strictMode param optional with ua param usage
3365    if (typeof strictMode === 'string') {
3366      ua = strictMode;
3367      strictMode = void(0);
3368    }
3369
3370    if (strictMode === void(0)) {
3371      strictMode = false;
3372    }
3373    if (ua) {
3374      _bowser = detect(ua);
3375    }
3376
3377    var version = "" + _bowser.version;
3378    for (var browser in minVersions) {
3379      if (minVersions.hasOwnProperty(browser)) {
3380        if (_bowser[browser]) {
3381          // browser version and min supported version.
3382          return compareVersions([version, minVersions[browser]]) < 0;
3383        }
3384      }
3385    }
3386
3387    return strictMode; // not found
3388  }
3389
3390  /**
3391   * Check if browser is supported
3392   *
3393   * @param  {Object} minVersions map of minimal version to browser
3394   * @param  {Boolean} [strictMode = false] flag to return false if browser wasn't found in map
3395   * @param  {String}  [ua] user agent string
3396   * @return {Boolean}
3397   */
3398  function check(minVersions, strictMode, ua) {
3399    return !isUnsupportedBrowser(minVersions, strictMode, ua);
3400  }
3401
3402  bowser.isUnsupportedBrowser = isUnsupportedBrowser;
3403  bowser.compareVersions = compareVersions;
3404  bowser.check = check;
3405
3406  /*
3407   * Set our detect method to the main bowser object so we can
3408   * reuse it to test other user agents.
3409   * This is needed to implement future tests.
3410   */
3411  bowser._detect = detect;
3412
3413  return bowser
3414});
3415
3416(function($){
3417  UABBTrigger = {
3418
3419      /**
3420       * Trigger a hook.
3421       *
3422       * @since 1.1.0.3
3423       * @method triggerHook
3424       * @param {String} hook The hook to trigger.
3425       * @param {Array} args An array of args to pass to the hook.
3426       */
3427      triggerHook: function( hook, args )
3428      {
3429        $( 'body' ).trigger( 'uabb-trigger.' + hook, args );
3430      },
3431    
3432      /**
3433       * Add a hook.
3434       *
3435       * @since 1.1.0.3
3436       * @method addHook
3437       * @param {String} hook The hook to add.
3438       * @param {Function} callback A function to call when the hook is triggered.
3439       */
3440      addHook: function( hook, callback )
3441      {
3442        $( 'body' ).on( 'uabb-trigger.' + hook, callback );
3443      },
3444    
3445      /**
3446       * Remove a hook.
3447       *
3448       * @since 1.1.0.3
3449       * @method removeHook
3450       * @param {String} hook The hook to remove.
3451       * @param {Function} callback The callback function to remove.
3452       */
3453      removeHook: function( hook, callback )
3454      {
3455        $( 'body' ).off( 'uabb-trigger.' + hook, callback );
3456      },
3457  };
3458})(jQuery);
3459
3460jQuery(document).ready(function( $ ) {
3461
3462    if( typeof bowser !== 'undefined' && bowser !== null ) {
3463
3464      var uabb_browser   = bowser.name,
3465          uabb_browser_v = bowser.version,
3466          uabb_browser_class = uabb_browser.replace(/\s+/g, '-').toLowerCase(),
3467          uabb_browser_v_class = uabb_browser_class + parseInt( uabb_browser_v );
3468      
3469      $('html').addClass(uabb_browser_class).addClass(uabb_browser_v_class);
3470      
3471    }
3472
3473    $('.uabb-row-separator').parents('html').css('overflow-x', 'hidden');
3474});
3475jQuery(function($) {
3476	
3477		$(function() {
3478		$( '.fl-node-r5k419jmptz0 .fl-photo-img' )
3479			.on( 'mouseenter', function( e ) {
3480				$( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' );
3481			} )
3482			.on( 'mouseleave', function( e ){
3483				$( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null );
3484			} );
3485	});
3486		window._fl_string_to_slug_regex = 'a-zA-Z0-9';
3487});
3488(function($) {
3489	$(function() {
3490
3491		new FLBuilderSubscribeForm({
3492			id: '18p53hqmozew',
3493			successAction: 'redirect',
3494			successUrl: 'https://elite.tracyharris.co/mwh-digest-ty/',
3495		});
3496	});
3497
3498})(jQuery);
3499
3500/* Start Layout Custom JS */
3501
3502/* End Layout Custom JS */
3503

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.