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.