vendor: 14,874 bytes, lines 1-513
1/*! 2 * Bowser - a browser detector 3 * https://github.com/ded/bowser 4 * MIT License | (c) Dustin Diaz 2015 5 */ 6 7!function (name, definition) { 8 if (typeof module != 'undefined' && module.exports) module.exports = definition() 9 else if (typeof define == 'function' && define.amd) define(name, definition) 10 else this[name] = definition() 11}('bowser', function () { 12 /** 13 * See useragents.js for examples of navigator.userAgent 14 */ 15 16 var t = true 17 18 function detect(ua) { 19 20 function getFirstMatch(regex) { 21 var match = ua.match(regex); 22 return (match && match.length > 1 && match[1]) || ''; 23 } 24 25 function getSecondMatch(regex) { 26 var match = ua.match(regex); 27 return (match && match.length > 1 && match[2]) || ''; 28 } 29 30 var iosdevice = getFirstMatch(/(ipod|iphone|ipad)/i).toLowerCase() 31 , likeAndroid = /like android/i.test(ua) 32 , android = !likeAndroid && /android/i.test(ua) 33 , nexusMobile = /nexus\s*[0-6]\s*/i.test(ua) 34 , nexusTablet = !nexusMobile && /nexus\s*[0-9]+/i.test(ua) 35 , chromeos = /CrOS/.test(ua) 36 , silk = /silk/i.test(ua) 37 , sailfish = /sailfish/i.test(ua) 38 , tizen = /tizen/i.test(ua) 39 , webos = /(web|hpw)os/i.test(ua) 40 , windowsphone = /windows phone/i.test(ua) 41 , windows = !windowsphone && /windows/i.test(ua) 42 , mac = !iosdevice && !silk && /macintosh/i.test(ua) 43 , linux = !android && !sailfish && !tizen && !webos && /linux/i.test(ua) 44 , edgeVersion = getFirstMatch(/edge\/(\d+(\.\d+)?)/i) 45 , versionIdentifier = getFirstMatch(/version\/(\d+(\.\d+)?)/i) 46 , tablet = /tablet/i.test(ua) 47 , mobile = !tablet && /[^-]mobi/i.test(ua) 48 , xbox = /xbox/i.test(ua) 49 , result 50 51 if (/opera|opr|opios/i.test(ua)) { 52 result = { 53 name: 'Opera' 54 , opera: t 55 , version: versionIdentifier || getFirstMatch(/(?:opera|opr|opios)[\s\/](\d+(\.\d+)?)/i) 56 } 57 } 58 else if (/coast/i.test(ua)) { 59 result = { 60 name: 'Opera Coast' 61 , coast: t 62 , version: versionIdentifier || getFirstMatch(/(?:coast)[\s\/](\d+(\.\d+)?)/i) 63 } 64 } 65 else if (/yabrowser/i.test(ua)) { 66 result = { 67 name: 'Yandex Browser' 68 , yandexbrowser: t 69 , version: versionIdentifier || getFirstMatch(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i) 70 } 71 } 72 else if (/ucbrowser/i.test(ua)) { 73 result = { 74 name: 'UC Browser' 75 , ucbrowser: t 76 , version: getFirstMatch(/(?:ucbrowser)[\s\/](\d+(?:\.\d+)+)/i) 77 } 78 } 79 else if (/mxios/i.test(ua)) { 80 result = { 81 name: 'Maxthon' 82 , maxthon: t 83 , version: getFirstMatch(/(?:mxios)[\s\/](\d+(?:\.\d+)+)/i) 84 } 85 } 86 else if (/epiphany/i.test(ua)) { 87 result = { 88 name: 'Epiphany' 89 , epiphany: t 90 , version: getFirstMatch(/(?:epiphany)[\s\/](\d+(?:\.\d+)+)/i) 91 } 92 } 93 else if (/puffin/i.test(ua)) { 94 result = { 95 name: 'Puffin' 96 , puffin: t 97 , version: getFirstMatch(/(?:puffin)[\s\/](\d+(?:\.\d+)?)/i) 98 } 99 } 100 else if (/sleipnir/i.test(ua)) { 101 result = { 102 name: 'Sleipnir' 103 , sleipnir: t 104 , version: getFirstMatch(/(?:sleipnir)[\s\/](\d+(?:\.\d+)+)/i) 105 } 106 } 107 else if (/k-meleon/i.test(ua)) { 108 result = { 109 name: 'K-Meleon' 110 , kMeleon: t 111 , version: getFirstMatch(/(?:k-meleon)[\s\/](\d+(?:\.\d+)+)/i) 112 } 113 } 114 else if (windowsphone) { 115 result = { 116 name: 'Windows Phone' 117 , windowsphone: t 118 } 119 if (edgeVersion) { 120 result.msedge = t 121 result.version = edgeVersion 122 } 123 else { 124 result.msie = t 125 result.version = getFirstMatch(/iemobile\/(\d+(\.\d+)?)/i) 126 } 127 } 128 else if (/msie|trident/i.test(ua)) { 129 result = { 130 name: 'Internet Explorer' 131 , msie: t 132 , version: getFirstMatch(/(?:msie |rv:)(\d+(\.\d+)?)/i) 133 } 134 } else if (chromeos) { 135 result = { 136 name: 'Chrome' 137 , chromeos: t 138 , chromeBook: t 139 , chrome: t 140 , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i) 141 } 142 } else if (/chrome.+? edge/i.test(ua)) { 143 result = { 144 name: 'Microsoft Edge' 145 , msedge: t 146 , version: edgeVersion 147 } 148 } 149 else if (/vivaldi/i.test(ua)) { 150 result = { 151 name: 'Vivaldi' 152 , vivaldi: t 153 , version: getFirstMatch(/vivaldi\/(\d+(\.\d+)?)/i) || versionIdentifier 154 } 155 } 156 else if (sailfish) { 157 result = { 158 name: 'Sailfish' 159 , sailfish: t 160 , version: getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i) 161 } 162 } 163 else if (/seamonkey\//i.test(ua)) { 164 result = { 165 name: 'SeaMonkey' 166 , seamonkey: t 167 , version: getFirstMatch(/seamonkey\/(\d+(\.\d+)?)/i) 168 } 169 } 170 else if (/firefox|iceweasel|fxios/i.test(ua)) { 171 result = { 172 name: 'Firefox' 173 , firefox: t 174 , version: getFirstMatch(/(?:firefox|iceweasel|fxios)[ \/](\d+(\.\d+)?)/i) 175 } 176 if (/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(ua)) { 177 result.firefoxos = t 178 } 179 } 180 else if (silk) { 181 result = { 182 name: 'Amazon Silk' 183 , silk: t 184 , version : getFirstMatch(/silk\/(\d+(\.\d+)?)/i) 185 } 186 } 187 else if (/phantom/i.test(ua)) { 188 result = { 189 name: 'PhantomJS' 190 , phantom: t 191 , version: getFirstMatch(/phantomjs\/(\d+(\.\d+)?)/i) 192 } 193 } 194 else if (/slimerjs/i.test(ua)) { 195 result = { 196 name: 'SlimerJS' 197 , slimer: t 198 , version: getFirstMatch(/slimerjs\/(\d+(\.\d+)?)/i) 199 } 200 } 201 else if (/blackberry|\bbb\d+/i.test(ua) || /rim\stablet/i.test(ua)) { 202 result = { 203 name: 'BlackBerry' 204 , blackberry: t 205 , version: versionIdentifier || getFirstMatch(/blackberry[\d]+\/(\d+(\.\d+)?)/i) 206 } 207 } 208 else if (webos) { 209 result = { 210 name: 'WebOS' 211 , webos: t 212 , version: versionIdentifier || getFirstMatch(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i) 213 }; 214 if( /touchpad\//i.test(ua) ){ 215 result.touchpad = t; 216 } 217 } 218 else if (/bada/i.test(ua)) { 219 result = { 220 name: 'Bada' 221 , bada: t 222 , version: getFirstMatch(/dolfin\/(\d+(\.\d+)?)/i) 223 }; 224 } 225 else if (tizen) { 226 result = { 227 name: 'Tizen' 228 , tizen: t 229 , version: getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i) || versionIdentifier 230 }; 231 } 232 else if (/qupzilla/i.test(ua)) { 233 result = { 234 name: 'QupZilla' 235 , qupzilla: t 236 , version: getFirstMatch(/(?:qupzilla)[\s\/](\d+(?:\.\d+)+)/i) || versionIdentifier 237 } 238 } 239 else if (/chromium/i.test(ua)) { 240 result = { 241 name: 'Chromium' 242 , chromium: t 243 , version: getFirstMatch(/(?:chromium)[\s\/](\d+(?:\.\d+)?)/i) || versionIdentifier 244 } 245 } 246 else if (/chrome|crios|crmo/i.test(ua)) { 247 result = { 248 name: 'Chrome' 249 , chrome: t 250 , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i) 251 } 252 } 253 else if (android) { 254 result = { 255 name: 'Android' 256 , version: versionIdentifier 257 } 258 } 259 else if (/safari|applewebkit/i.test(ua)) { 260 result = { 261 name: 'Safari' 262 , safari: t 263 } 264 if (versionIdentifier) { 265 result.version = versionIdentifier 266 } 267 } 268 else if (iosdevice) { 269 result = { 270 name : iosdevice == 'iphone' ? 'iPhone' : iosdevice == 'ipad' ? 'iPad' : 'iPod' 271 } 272 // WTF: version is not part of user agent in web apps 273 if (versionIdentifier) { 274 result.version = versionIdentifier 275 } 276 } 277 else if(/googlebot/i.test(ua)) { 278 result = { 279 name: 'Googlebot' 280 , googlebot: t 281 , version: getFirstMatch(/googlebot\/(\d+(\.\d+))/i) || versionIdentifier 282 } 283 } 284 else { 285 result = { 286 name: getFirstMatch(/^(.*)\/(.*) /), 287 version: getSecondMatch(/^(.*)\/(.*) /) 288 }; 289 } 290 291 // set webkit or gecko flag for browsers based on these engines 292 if (!result.msedge && /(apple)?webkit/i.test(ua)) { 293 if (/(apple)?webkit\/537\.36/i.test(ua)) { 294 result.name = result.name || "Blink" 295 result.blink = t 296 } else { 297 result.name = result.name || "Webkit" 298 result.webkit = t 299 } 300 if (!result.version && versionIdentifier) { 301 result.version = versionIdentifier 302 } 303 } else if (!result.opera && /gecko\//i.test(ua)) { 304 result.name = result.name || "Gecko" 305 result.gecko = t 306 result.version = result.version || getFirstMatch(/gecko\/(\d+(\.\d+)?)/i) 307 } 308 309 // set OS flags for platforms that have multiple browsers 310 if (!result.msedge && (android || result.silk)) { 311 result.android = t 312 } else if (iosdevice) { 313 result[iosdevice] = t 314 result.ios = t 315 } else if (mac) { 316 result.mac = t 317 } else if (xbox) { 318 result.xbox = t 319 } else if (windows) { 320 result.windows = t 321 } else if (linux) { 322 result.linux = t 323 } 324 325 // OS version extraction 326 var osVersion = ''; 327 if (result.windowsphone) { 328 osVersion = getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i); 329 } else if (iosdevice) { 330 osVersion = getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i); 331 osVersion = osVersion.replace(/[_\s]/g, '.'); 332 } else if (android) { 333 osVersion = getFirstMatch(/android[ \/-](\d+(\.\d+)*)/i); 334 } else if (result.webos) { 335 osVersion = getFirstMatch(/(?:web|hpw)os\/(\d+(\.\d+)*)/i); 336 } else if (result.blackberry) { 337 osVersion = getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i); 338 } else if (result.bada) { 339 osVersion = getFirstMatch(/bada\/(\d+(\.\d+)*)/i); 340 } else if (result.tizen) { 341 osVersion = getFirstMatch(/tizen[\/\s](\d+(\.\d+)*)/i); 342 } 343 if (osVersion) { 344 result.osversion = osVersion; 345 } 346 347 // device type extraction 348 var osMajorVersion = osVersion.split('.')[0]; 349 if ( 350 tablet 351 || nexusTablet 352 || iosdevice == 'ipad' 353 || (android && (osMajorVersion == 3 || (osMajorVersion >= 4 && !mobile))) 354 || result.silk 355 ) { 356 result.tablet = t 357 } else if ( 358 mobile 359 || iosdevice == 'iphone' 360 || iosdevice == 'ipod' 361 || android 362 || nexusMobile 363 || result.blackberry 364 || result.webos 365 || result.bada 366 ) { 367 result.mobile = t 368 } 369 370 // Graded Browser Support 371 // http://developer.yahoo.com/yui/articles/gbs 372 if (result.msedge || 373 (result.msie && result.version >= 10) || 374 (result.yandexbrowser && result.version >= 15) || 375 (result.vivaldi && result.version >= 1.0) || 376 (result.chrome && result.version >= 20) || 377 (result.firefox && result.version >= 20.0) || 378 (result.safari && result.version >= 6) || 379 (result.opera && result.version >= 10.0) || 380 (result.ios && result.osversion && result.osversion.split(".")[0] >= 6) || 381 (result.blackberry && result.version >= 10.1) 382 || (result.chromium && result.version >= 20) 383 ) { 384 result.a = t; 385 } 386 else if ((result.msie && result.version < 10) || 387 (result.chrome && result.version < 20) || 388 (result.firefox && result.version < 20.0) || 389 (result.safari && result.version < 6) || 390 (result.opera && result.version < 10.0) || 391 (result.ios && result.osversion && result.osversion.split(".")[0] < 6) 392 || (result.chromium && result.version < 20) 393 ) { 394 result.c = t 395 } else result.x = t 396 397 return result 398 } 399 400 var bowser = detect(typeof navigator !== 'undefined' ? navigator.userAgent : '') 401 402 bowser.test = function (browserList) { 403 for (var i = 0; i < browserList.length; ++i) { 404 var browserItem = browserList[i]; 405 if (typeof browserItem=== 'string') { 406 if (browserItem in bowser) { 407 return true; 408 } 409 } 410 } 411 return false; 412 } 413 414 /** 415 * Get version precisions count 416 * 417 * @example 418 * getVersionPrecision("1.10.3") // 3 419 * 420 * @param {string} version 421 * @return {number} 422 */ 423 function getVersionPrecision(version) { 424 return version.split(".").length; 425 } 426 427 /** 428 * Array::map polyfill 429 * 430 * @param {Array} arr 431 * @param {Function} iterator 432 * @return {Array} 433 */ 434 function map(arr, iterator) { 435 var result = [], i; 436 if (Array.prototype.map) { 437 return Array.prototype.map.call(arr, iterator); 438 } 439 for (i = 0; i < arr.length; i++) { 440 result.push(iterator(arr[i])); 441 } 442 return result; 443 } 444 445 /** 446 * Calculate browser version weight 447 * 448 * @example 449 * compareVersions(['1.10.2.1', '1.8.2.1.90']) // 1 450 * compareVersions(['1.010.2.1', '1.09.2.1.90']); // 1 451 * compareVersions(['1.10.2.1', '1.10.2.1']); // 0 452 * compareVersions(['1.10.2.1', '1.0800.2']); // -1 453 * 454 * @param {Array<String>} versions versions to compare 455 * @return {Number} comparison result 456 */ 457 function compareVersions(versions) { 458 // 1) get common precision for both versions, for example for "10.0" and "9" it should be 2 459 var precision = Math.max(getVersionPrecision(versions[0]), getVersionPrecision(versions[1])); 460 var chunks = map(versions, function (version) { 461 var delta = precision - getVersionPrecision(version); 462 463 // 2) "9" -> "9.0" (for precision = 2) 464 version = version + new Array(delta + 1).join(".0"); 465 466 // 3) "9.0" -> ["000000000"", "000000009"] 467 return map(version.split("."), function (chunk) { 468 return new Array(20 - chunk.length).join("0") + chunk; 469 }).reverse(); 470 }); 471 472 // iterate in reverse order by reversed chunks array 473 while (--precision >= 0) { 474 // 4) compare: "000000009" > "000000010" = false (but "9" > "10" = true) 475 if (chunks[0][precision] > chunks[1][precision]) { 476 return 1; 477 } 478 else if (chunks[0][precision] === chunks[1][precision]) { 479 if (precision === 0) { 480 // all version chunks are same 481 return 0; 482 } 483 } 484 else { 485 return -1; 486 } 487 } 488 } 489 490 /** 491 * Check if browser is unsupported 492 * 493 * @example 494 * bowser.isUnsupportedBrowser({ 495 * msie: "10", 496 * firefox: "23", 497 * chrome: "29", 498 * safari: "5.1", 499 * opera: "16", 500 * phantom: "534" 501 * }); 502 * 503 * @param {Object} minVersions map of minimal version to browser 504 * @param {Boolean} [strictMode = false] flag to return false if browser wasn't found in map 505 * @param {String} [ua] user agent string 506 * @return {Boolean} 507 */ 508 function isUnsupportedBrowser(minVersions, strictMode, ua) { 509 var _bowser = bowser; 510 511 // make strictMode param optional with ua param usage 512 if (typeof strictMode === 'string') { 513 ua = strictMode;
514 strictMode = void(0); 515 } 516 517 if (strictMode === void(0)) { 518 strictMode = false; 519 } 520 if (ua) { 521 _bowser = detect(ua); 522 } 523 524 var version = "" + _bowser.version; 525 for (var browser in minVersions) { 526 if (minVersions.hasOwnProperty(browser)) { 527 if (_bowser[browser]) { 528 // browser version and min supported version. 529 return compareVersions([version, minVersions[browser]]) < 0; 530 } 531 } 532 } 533 534 return strictMode; // not found 535 } 536 537 /** 538 * Check if browser is supported 539 * 540 * @param {Object} minVersions map of minimal version to browser 541 * @param {Boolean} [strictMode = false] flag to return false if browser wasn't found in map 542 * @param {String} [ua] user agent string 543 * @return {Boolean} 544 */ 545 function check(minVersions, strictMode, ua) { 546 return !isUnsupportedBrowser(minVersions, strictMode, ua); 547 } 548 549 bowser.isUnsupportedBrowser = isUnsupportedBrowser; 550 bowser.compareVersions = compareVersions; 551 bowser.check = check; 552 553 /* 554 * Set our detect method to the main bowser object so we can 555 * reuse it to test other user agents. 556 * This is needed to implement future tests. 557 */ 558 bowser._detect = detect; 559 560 return bowser 561}); 562 563(function($){ 564 UABBTrigger = { 565 566 /** 567 * Trigger a hook. 568 * 569 * @since 1.1.0.3 570 * @method triggerHook 571 * @param {String} hook The hook to trigger. 572 * @param {Array} args An array of args to pass to the hook. 573 */ 574 triggerHook: function( hook, args ) 575 { 576 $( 'body' ).trigger( 'uabb-trigger.' + hook, args ); 577 }, 578 579 /** 580 * Add a hook. 581 * 582 * @since 1.1.0.3 583 * @method addHook 584 * @param {String} hook The hook to add. 585 * @param {Function} callback A function to call when the hook is triggered. 586 */ 587 addHook: function( hook, callback ) 588 { 589 $( 'body' ).on( 'uabb-trigger.' + hook, callback ); 590 }, 591 592 /** 593 * Remove a hook. 594 * 595 * @since 1.1.0.3 596 * @method removeHook 597 * @param {String} hook The hook to remove. 598 * @param {Function} callback The callback function to remove. 599 */ 600 removeHook: function( hook, callback ) 601 { 602 $( 'body' ).off( 'uabb-trigger.' + hook, callback ); 603 }, 604 }; 605})(jQuery); 606 607jQuery(document).ready(function( $ ) { 608 609 if( typeof bowser !== 'undefined' && bowser !== null ) { 610 611 var uabb_browser = bowser.name, 612 uabb_browser_v = bowser.version, 613 uabb_browser_class = uabb_browser.replace(/\s+/g, '-').toLowerCase(), 614 uabb_browser_v_class = uabb_browser_class + parseInt( uabb_browser_v ); 615 616 $('html').addClass(uabb_browser_class).addClass(uabb_browser_v_class); 617 618 } 619 620 $('.uabb-row-separator').parents('html').css('overflow-x', 'hidden'); 621}); 622 623/* Start Layout Custom JS */ 624 625/* End Layout Custom JS */ 626 627(function($){ 628 629 /** 630 * Helper class for header layout logic. 631 * 632 * @since 1.0 633 * @class FLThemeBuilderHeaderLayout 634 */ 635 FLThemeBuilderHeaderLayout = { 636 637 /** 638 * A reference to the window object for this page. 639 * 640 * @since 1.0 641 * @property {Object} win 642 */ 643 win : null, 644 645 /** 646 * A reference to the body object for this page. 647 * 648 * @since 1.0 649 * @property {Object} body 650 */ 651 body : null, 652 653 /** 654 * A reference to the header object for this page. 655 * 656 * @since 1.0 657 * @property {Object} header 658 */ 659 header : null, 660 661 /** 662 * Whether this header overlays the content or not. 663 * 664 * @since 1.0 665 * @property {Boolean} overlay 666 */ 667 overlay : false, 668 669 /** 670 * Whether the page has the WP admin bar or not. 671 * 672 * @since 1.0 673 * @property {Boolean} hasAdminBar 674 */ 675 hasAdminBar : false, 676 677 /** 678 * Breakpoint for when the sticky header should apply. 679 * 680 * @since 1.4 681 * @property {String} stickyOn 682 */ 683 stickyOn: '', 684 685 /** 686 * A reference of the sticky and shrink header breakpoint. 687 * 688 * @since 1.2.5 689 * @property {Number} breakpointWidth 690 */ 691 breakpointWidth: 0, 692 693 /** 694 * Whether this header can be pinned from page load. 695 * 696 * @since 1.6.1 697 * @property {Boolean} pinnable 698 */ 699 pinnable : false, 700 701 /** 702 * Initializes header layout logic. 703 * 704 * @since 1.0 705 * @method init 706 */ 707 init: function() 708 {
709 var editing = $( 'html.fl-builder-edit' ).length, 710 header = $( '.fl-builder-content[data-type=header]' ), 711 menuModule = header.find( '.fl-module-menu' ), 712 breakpoint = null, 713 adminBarHeight = 0; 714 715 if ( ! editing && header.length ) { 716 717 header.imagesLoaded( $.proxy( function() { 718 719 this.win = $( window ); 720 this.body = $( 'body' ); 721 this.header = header.eq( 0 ); 722 this.overlay = !! Number( header.attr( 'data-overlay' ) ); 723 this.hasAdminBar = !! $( 'body.admin-bar' ).length; 724 this.stickyOn = this.header.data( 'sticky-on' ); 725 breakpoint = this.header.data( 'sticky-breakpoint' ); 726 727 if ( '' == this.stickyOn ) { 728 if ( typeof FLBuilderLayoutConfig.breakpoints[ breakpoint ] !== undefined ) { 729 this.breakpointWidth = FLBuilderLayoutConfig.breakpoints[ breakpoint ]; 730 } 731 else { 732 this.breakpointWidth = FLBuilderLayoutConfig.breakpoints.medium; 733 } 734 } 735 736 if ( Number( header.attr( 'data-sticky' ) ) ) { 737 738 this.header.data( 'original-top', this.header.offset().top ); 739 740 // The pin decision is made once here, while the header offset and the admin bar height are read from the same layout. 741 adminBarHeight = $( '#wpadminbar' ).length ? $( '#wpadminbar' ).outerHeight() : 0; 742 this.pinnable = this.overlay && this.header.data( 'original-top' ) <= adminBarHeight; 743 744 this.win.on( 'resize', $.throttle( 500, $.proxy( this._initSticky, this ) ) ); 745 this._initSticky(); 746 747 } 748 749 }, this ) ); 750 } 751 }, 752 753 /** 754 * Initializes sticky logic for a header. 755 * 756 * @since 1.0 757 * @access private 758 * @method _initSticky 759 */ 760 _initSticky: function( e ) 761 { 762 var header = $('.fl-builder-content[data-type=header]'), 763 windowSize = this.win.width(), 764 makeSticky = false; 765 766 makeSticky = this._makeWindowSticky( windowSize ); 767 if ( makeSticky || ( this.breakpointWidth > 0 && windowSize >= this.breakpointWidth ) ) { 768 this.win.on( 'scroll.fl-theme-builder-header-sticky', $.proxy( this._doSticky, this ) ); 769 this._initPin(); 770
771 // Apply the sticky state on initial load when the page is 772 // already scrolled past the header — e.g. when the browser 773 // restores the scroll position on refresh. Overlay headers are 774 // out of scope here; this mirrors the shrink-on-load behavior 775 // in _initShrink(). 776 if ( ! e && ! this.overlay && ! this.header.hasClass( 'fl-theme-builder-header-sticky' ) ) { 777 var loadWinTop = this.win.scrollTop(), 778 loadHeaderTop = Math.floor( this.header.data( 'original-top' ) ); 779 780 if ( this.hasAdminBar && windowSize > 600 ) { 781 loadWinTop += Math.floor( $( '#wpadminbar' ).outerHeight() ); 782 } 783 784 if ( loadWinTop > loadHeaderTop ) { 785 this.header.addClass( 'fl-theme-builder-header-sticky' ); 786 this.header.addClass( 'fl-theme-builder-header-scrolled' ); 787 this._adjustHeaderHeight(); 788 this._adjustStickyHeaderWidth(); 789 } 790 } 791 792 // 793 // Check if Event Type is 'resize' then invoke this._doSticky() 794 // only if the 'fl-theme-builder-header-sticky' class is already present. 795 // 796 if ( e && 'resize' === e.type ) { 797 if ( this.header.hasClass( 'fl-theme-builder-header-sticky' ) ) { 798 this._doSticky( e ); 799 } 800 this._adjustStickyHeaderWidth(); 801 } 802 803 if ( Number( header.attr( 'data-shrink' ) ) ) { 804 this.header.data( 'original-height', this.header.outerHeight() ); 805 this.win.on( 'resize', $.throttle( 500, $.proxy( this._initShrink, this ) ) ); 806 this._initShrink(); 807 } 808 809 this._initFlyoutMenuFix( e ); 810 } else { 811 this.win.off( 'scroll.fl-theme-builder-header-sticky' ); 812 this.win.off( 'resize.fl-theme-builder-header-sticky' ); 813 814 this.header.removeClass( 'fl-theme-builder-header-sticky' ); 815 this.header.removeClass( 'fl-theme-builder-header-pinned' ); 816 this.header.removeAttr( 'style' ); 817 this.header.parent().css( 'padding-top', '0' ); 818 } 819 }, 820 821 /** 822 * Pins an overlay header with fixed positioning from page load, avoiding a position change that a scroll handler cannot apply before the compositor paints. 823 * 824 * @since 1.6.1 825 * @access private 826 * @method _initPin 827 */ 828 _initPin: function() 829 { 830 this.header.toggleClass( 'fl-theme-builder-header-pinned', this.pinnable ); 831 832 if ( ! this.pinnable ) { 833 return; 834 } 835 836 // Fixed positioning resolves the width against the viewport, so boxed layouts require their maximum width immediately. 837 this._adjustStickyHeaderWidth(); 838 839 // The header is visible from the first paint, so the scrolled state must reflect any restored scroll position. 840 if ( this.win.scrollTop() > Math.floor( this.header.data( 'original-top' ) ) ) { 841 this.header.addClass( 'fl-theme-builder-header-scrolled' ); 842 } 843 }, 844 845 /** 846 * Check if Header should be sticky at a particular Window size. 847 * 848 * @since 1.4 849 * @access private 850 * @param widowSize 851 * @method _makeWindowSticky 852 */ 853 _makeWindowSticky: function ( windowSize ) 854 { 855 var makeSticky = false; 856 857 switch (this.stickyOn) { 858 case 'xl': 859 makeSticky = windowSize > FLBuilderLayoutConfig.breakpoints['large']; 860 break; 861 case '': // Default 862 case 'desktop': 863 makeSticky = windowSize >= FLBuilderLayoutConfig.breakpoints['medium']; 864 break; 865 case 'desktop-medium': 866 makeSticky = windowSize > FLBuilderLayoutConfig.breakpoints['small']; 867 break; 868 case 'large': 869 makeSticky = windowSize > FLBuilderLayoutConfig.breakpoints['medium'] && windowSize <= FLBuilderLayoutConfig.breakpoints['large']; 870 break; 871 case 'large-medium': 872 makeSticky = windowSize > FLBuilderLayoutConfig.breakpoints['small'] && windowSize <= FLBuilderLayoutConfig.breakpoints['large']; 873 break; 874 case 'medium': 875 makeSticky = ( windowSize <= FLBuilderLayoutConfig.breakpoints['medium'] && windowSize > FLBuilderLayoutConfig.breakpoints['small'] ); 876 break; 877 case 'medium-mobile': 878 makeSticky = (windowSize <= FLBuilderLayoutConfig.breakpoints['medium']); 879 break; 880 case 'mobile': 881 makeSticky = (windowSize <= FLBuilderLayoutConfig.breakpoints['small']); 882 break; 883 case 'all':
884 makeSticky = true; 885 break; 886 } 887 888 return makeSticky; 889 }, 890 891 /** 892 * Sticks the header when the page is scrolled. 893 * 894 * @since 1.0 895 * @access private 896 * @method _doSticky 897 */ 898 _doSticky: function( e ) 899 { 900 var winTop = Math.floor( this.win.scrollTop() ), 901 headerTop = Math.floor( this.header.data( 'original-top' ) ), 902 hasStickyClass = this.header.hasClass( 'fl-theme-builder-header-sticky' ), 903 hasScrolledClass = this.header.hasClass( 'fl-theme-builder-header-scrolled' ), 904 beforeHeader = this.header.prevAll( '.fl-builder-content' ), 905 bodyTopPadding = parseInt( jQuery('body').css('padding-top') ), 906 winBarHeight = $('#wpadminbar').length ? $('#wpadminbar').outerHeight() : 0, 907 headerHeight = 0; 908 909 if ( isNaN( bodyTopPadding ) ) { 910 bodyTopPadding = 0; 911 } 912 913 if ( this.hasAdminBar && this.win.width() > 600 ) { 914 winTop += Math.floor( winBarHeight ); 915 } 916 917 if ( winTop > headerTop ) { 918 if ( ! hasStickyClass ) { 919 if ( e && ( 'scroll' === e.type || 'smartscroll' === e.type ) ) { 920 this.header.addClass( 'fl-theme-builder-header-sticky' ); 921 if ( this.overlay && beforeHeader.length ) { 922 this.header.css( 'top', winBarHeight); 923 } 924 } 925 926 if ( ! this.overlay ) { 927 this._adjustHeaderHeight(); 928 } 929 } 930 } 931 else if ( hasStickyClass ) { 932 this.header.removeClass( 'fl-theme-builder-header-sticky' ); 933 this.header.removeAttr( 'style' ); 934 this.header.parent().css( 'padding-top', '0' ); 935 } 936 937 this._adjustStickyHeaderWidth(); 938 939 if ( winTop > headerTop ) { 940 if ( ! hasScrolledClass ) { 941 this.header.addClass( 'fl-theme-builder-header-scrolled' ); 942 } 943 } else if ( hasScrolledClass ) { 944 this.header.removeClass( 'fl-theme-builder-header-scrolled' ); 945 } 946 947 this._flyoutMenuFix( e ); 948 }, 949 950 /** 951 * Initializes flyout menu fixes on sticky header. 952 * 953 * @since 1.4.1 954 * @method _initFlyoutMenuFix 955 */ 956 _initFlyoutMenuFix: function( e ) { 957 var header = this.header, 958 menuModule = header.closest( '.fl-menu' ), 959 flyoutMenu = menuModule.find( '.fl-menu-mobile-flyout' ), 960 isPushMenu = menuModule.hasClass( 'fl-menu-responsive-flyout-push' ) || menuModule.hasClass( 'fl-menu-responsive-flyout-push-opacity' ), 961 isOverlay = menuModule.hasClass( 'fl-menu-responsive-flyout-overlay' ), 962 flyoutPos = menuModule.hasClass( 'fl-flyout-right' ) ? 'right' : 'left', 963 flyoutParent = header.parent().is( 'header' ) ? header.parent().parent() : header.parent(); 964 isFullWidth = this.win.width() === header.width(), 965 flyoutLayout = '', 966 activePos = 250, 967 headerPos = 0; 968 969 if ( ! flyoutMenu.length ) { 970 return; 971 } 972 973 if ( this.win.width() > header.parent().width() ) { 974 headerPos = ( this.win.width() - header.width() ) / 2; 975 } 976 977 if ( isOverlay ) { 978 activePos = headerPos; 979 } 980 else if ( isPushMenu ) { 981 activePos = activePos + headerPos; 982 } 983 flyoutMenu.data( 'activePos', activePos ); 984 985 if ( isPushMenu ) { 986 flyoutLayout = 'push-' + flyoutPos; 987 } 988 else if ( isOverlay ) { 989 flyoutLayout = 'overlay-' + flyoutPos; 990 } 991 992 if ( isPushMenu && ! $( 'html' ).hasClass( 'fl-theme-builder-has-flyout-menu' ) ) { 993 $( 'html' ).addClass( 'fl-theme-builder-has-flyout-menu' ); 994 } 995 996 if ( ! flyoutParent.hasClass( 'fl-theme-builder-flyout-menu-' + flyoutLayout ) ) { 997 flyoutParent.addClass( 'fl-theme-builder-flyout-menu-' + flyoutLayout ); 998 } 999 1000 if ( ! header.hasClass( 'fl-theme-builder-flyout-menu-overlay' ) && isOverlay ) { 1001 header.addClass( 'fl-theme-builder-flyout-menu-overlay' ); 1002 } 1003 1004 if ( ! header.hasClass( 'fl-theme-builder-header-full-width' ) && isFullWidth ) { 1005 header.addClass( 'fl-theme-builder-header-full-width' ); 1006 } 1007 else if ( ! isFullWidth ) { 1008 header.removeClass( 'fl-theme-builder-header-full-width' ); 1009 } 1010 1011 menuModule.on( 'click', '.fl-menu-mobile-toggle', $.proxy( function( event ){ 1012 if ( menuModule.find( '.fl-menu-mobile-toggle.fl-active' ).length ) {
1013 $( 'html' ).addClass( 'fl-theme-builder-flyout-menu-active' ); 1014 event.stopImmediatePropagation(); 1015 } 1016 else { 1017 $( 'html' ).removeClass( 'fl-theme-builder-flyout-menu-active' ); 1018 } 1019 1020 this._flyoutMenuFix( event ); 1021 }, this ) ); 1022 }, 1023 1024 /** 1025 * Fix flyout menu inside the sticky header. 1026 * 1027 * @since 1.4.1 1028 * @method _flyoutMenuFix 1029 */ 1030 _flyoutMenuFix: function( e ){ 1031 var header = this.header, 1032 menuModule = $( e.target ).closest( '.fl-menu' ), 1033 flyoutMenu = menuModule.find( '.fl-menu-mobile-flyout' ), 1034 flyoutPos = menuModule.hasClass( 'fl-flyout-right' ) ? 'right' : 'left', 1035 menuOpacity = menuModule.find( '.fl-menu-mobile-opacity' ), 1036 isScroll = 'undefined' !== typeof e && 'scroll' === e.handleObj.type, 1037 activePos = 'undefined' !== typeof flyoutMenu.data( 'activePos' ) ? flyoutMenu.data( 'activePos' ) : 0, 1038 headerPos = ( this.win.width() - header.width() ) / 2, 1039 inactivePos = headerPos > 0 ? activePos + 4 : 254; 1040 1041 if ( ! flyoutMenu.length ) { 1042 return; 1043 } 1044 1045 if ( this.overlay ) { 1046 return; 1047 } 1048 1049 if( $( '.fl-theme-builder-flyout-menu-active' ).length ) { 1050 1051 if ( isScroll && ! flyoutMenu.hasClass( 'fl-menu-disable-transition' ) ) { 1052 flyoutMenu.addClass( 'fl-menu-disable-transition' ); 1053 } 1054 1055 if ( header.hasClass( 'fl-theme-builder-header-sticky' ) ) { 1056 if ( ! isScroll ) { 1057 setTimeout( $.proxy( function(){ 1058 flyoutMenu.css( flyoutPos, '-' + activePos + 'px' ); 1059 }, this ), 1 ); 1060 } 1061 else { 1062 flyoutMenu.css( flyoutPos, '-' + activePos + 'px' ); 1063 } 1064 } 1065 else { 1066 flyoutMenu.css( flyoutPos, '0px' ); 1067 } 1068 } 1069 else { 1070 if ( flyoutMenu.hasClass( 'fl-menu-disable-transition' ) ) { 1071 flyoutMenu.removeClass( 'fl-menu-disable-transition' ); 1072 } 1073 1074 if ( header.hasClass( 'fl-theme-builder-flyout-menu-overlay' ) && headerPos > 0 && headerPos < 250 ) { 1075 if ( header.hasClass( 'fl-theme-builder-header-sticky' ) ) { 1076 inactivePos = headerPos + 254; 1077 } 1078 else { 1079 inactivePos = 254; 1080 } 1081 } 1082 1083 if ( e && e.type === 'resize' ) { 1084 inactivePos = headerPos + 254; 1085 } 1086 1087 flyoutMenu.css( flyoutPos, '-' + inactivePos + 'px' ); 1088 } 1089 1090 if ( e && menuModule.is('.fl-menu-responsive-flyout-overlay') && $.infinitescroll ) { 1091 e.stopImmediatePropagation(); 1092 } 1093 1094 if( menuOpacity.length ) { 1095 if ( header.hasClass( 'fl-theme-builder-header-sticky' ) ) { 1096 if ( '0px' === menuOpacity.css( 'left' ) ) { 1097 menuOpacity.css( 'left', '-' + headerPos + 'px' ); 1098 } 1099 } 1100 else { 1101 menuOpacity.css( 'left', '' ); 1102 } 1103 } 1104 }, 1105 1106 /** 1107 * Adjust sticky header width if BB Theme Boxed Layout is used. 1108 * 1109 * @since 1.4 1110 * @access private 1111 * @method _adjustStickyHeaderWidth 1112 */ 1113 _adjustStickyHeaderWidth: function () { 1114 if ( $('body').hasClass( 'fl-fixed-width' ) ) { 1115 var parentWidth = this.header.parent().width(); 1116 1117 // Better if this is set in the stylesheet file. 1118 if ( this.win.width() >= 992 ) { 1119 this.header.css({ 1120 'margin': '0 auto', 1121 'max-width': parentWidth, 1122 }); 1123 } 1124 else { 1125 this.header.css({ 1126 'margin': '', 1127 'max-width': '', 1128 }); 1129 } 1130 } 1131 }, 1132 1133 /** 1134 * Adjust Sticky Header Height 1135 * 1136 * @since 1.4 1137 * @access private 1138 * @method _adjustHeaderHeight 1139 */ 1140 _adjustHeaderHeight: function () { 1141 var beforeHeader = this.header.prevAll('.fl-builder-content'), 1142 beforeHeaderHeight = 0, 1143 beforeHeaderFix = 0, 1144 headerHeight = Math.floor( this.header.outerHeight() ), 1145 bodyTopPadding = parseInt( $( 'body' ).css( 'padding-top' ) ), 1146 wpAdminBarHeight = 0, 1147 totalHeaderHeight = 0; 1148 1149 if ( isNaN( bodyTopPadding ) ) { 1150 bodyTopPadding = 0; 1151 } 1152 1153 if ( beforeHeader.length ) { 1154 $.each( beforeHeader, function() { 1155 beforeHeaderHeight += Math.floor( $(this).outerHeight() ); 1156 }); 1157 // Subtract this value from the header parent's top padding. 1158 beforeHeaderFix = 2; 1159 } 1160 1161 if ( this.hasAdminBar && this.win.width() <= 600 ) { 1162 wpAdminBarHeight = Math.floor( $('#wpadminbar').outerHeight() ); 1163 } 1164 1165 totalHeaderHeight = Math.floor( beforeHeaderHeight + headerHeight); 1166 1167 if ( headerHeight > 0 ) { 1168 var headerParent = this.header.parent(), 1169 headerParentTopPadding = 0; 1170 1171 // If the header's parent container is the BODY tag ignore its top padding. 1172 if ( $( headerParent ).is('body') ) { 1173 headerParentTopPadding = Math.floor( headerHeight - wpAdminBarHeight ); 1174 } else { 1175 headerParentTopPadding = Math.floor( headerHeight - bodyTopPadding - wpAdminBarHeight ); 1176 } 1177 1178 $( headerParent ).css( 'padding-top', ( headerParentTopPadding - beforeHeaderFix ) + 'px' ); 1179 1180 this.header.css({ 1181 '-webkit-transform': 'translate(0px, -' + totalHeaderHeight + 'px)', 1182 '-ms-transform': 'translate(0px, -' + totalHeaderHeight + 'px)', 1183 'transform': 'translate(0px, -' + totalHeaderHeight + 'px)' 1184 }); 1185 1186 } 1187 1188 }, 1189 1190 /** 1191 * Initializes shrink logic for a header. 1192 * 1193 * @since 1.0 1194 * @access private 1195 * @method _initShrink 1196 */ 1197 _initShrink: function( e ) 1198 { 1199 if ( this.win.width() >= this.breakpointWidth ) {
1200 this.win.on( 'scroll.fl-theme-builder-header-shrink', $.proxy( this._doShrink, this ) ); 1201 this._setImageMaxHeight(); 1202 1203 if ( this.win.scrollTop() > 0 ){ 1204 this._doShrink(); 1205 } 1206 1207 } else { 1208 this.header.parent().css( 'padding-top', '0' ); 1209 this.win.off( 'scroll.fl-theme-builder-header-shrink' ); 1210 this._removeShrink(); 1211 this._removeImageMaxHeight(); 1212 } 1213 }, 1214 1215 /** 1216 * Shrinks the header when the page is scrolled. 1217 * 1218 * @since 1.0 1219 * @access private 1220 * @method _doShrink 1221 */ 1222 _doShrink: function( e ) 1223 { 1224 var winTop = this.win.scrollTop(), 1225 headerTop = this.header.data('original-top'), 1226 headerHeight = this.header.data('original-height'), 1227 shrinkImageHeight = this.header.data('shrink-image-height'), 1228 windowSize = this.win.width(), 1229 makeSticky = this._makeWindowSticky( windowSize ), 1230 hasClass = this.header.hasClass( 'fl-theme-builder-header-shrink' ); 1231 1232 1233 if ( this.hasAdminBar ) { 1234 winTop += 32; 1235 } 1236 1237 if ( makeSticky && ( winTop > headerTop + headerHeight ) ) { 1238 if ( ! hasClass ) { 1239 1240 this.header.addClass( 'fl-theme-builder-header-shrink' ); 1241 1242 // Shrink images but don't include lightbox and menu images. 1243 this.header.find('img').each( function( i ) { 1244 var image = $( this ), 1245 maxMegaMenu = image.closest( '.max-mega-menu' ).length, 1246 imageInLightbox = image.closest( '.fl-button-lightbox-content' ).length, 1247 imageInNavMenu = image.closest( 'li.menu-item' ).length; 1248 1249 if ( ! ( imageInLightbox || imageInNavMenu || maxMegaMenu ) ) { 1250 image.css( 'max-height', shrinkImageHeight ); 1251 } 1252 1253 }); 1254 1255 this.header.find( '.fl-row-content-wrap' ).each( function() { 1256 1257 var row = $( this ); 1258 1259 if ( parseInt( row.css( 'padding-bottom' ) ) > 5 ) { 1260 row.addClass( 'fl-theme-builder-header-shrink-row-bottom' ); 1261 } 1262 1263 if ( parseInt( row.css( 'padding-top' ) ) > 5 ) { 1264 row.addClass( 'fl-theme-builder-header-shrink-row-top' ); 1265 } 1266 } ); 1267 1268 this.header.find( '.fl-module' ).each( function() { 1269 1270 var module = $( this ).find( '.fl-module-content' ).length ? $( this ).find( '.fl-module-content' ) : $( this ); 1271 1272 if ( parseInt( module.css( 'margin-bottom' ) ) > 5 ) { 1273 module.addClass( 'fl-theme-builder-header-shrink-module-bottom' ); 1274 } 1275 1276 if ( parseInt( module.css( 'margin-top' ) ) > 5 ) { 1277 module.addClass( 'fl-theme-builder-header-shrink-module-top' ); 1278 } 1279 } ); 1280 } 1281 } else if (hasClass) { 1282 this.header.find( 'img' ).css( 'max-height', '' ); 1283 this._removeShrink(); 1284 } 1285 1286 // Fixes Shrink header issue with BB Theme when window is scrolled then resized and back. 1287 if ( 'undefined' === typeof( e ) && $('body').hasClass( 'fl-fixed-width' ) ) { 1288 if ( ! this.overlay ) { 1289 this._adjustHeaderHeight(); 1290 } 1291 } 1292 1293 }, 1294 1295 /** 1296 * Removes the header shrink effect. 1297 * 1298 * @since 1.0 1299 * @access private 1300 * @method _removeShrink 1301 */ 1302 _removeShrink: function() 1303 { 1304 var rows = this.header.find( '.fl-row-content-wrap' ), 1305 modules = this.header.find('.fl-module, .fl-module-content'); 1306 1307 rows.removeClass( 'fl-theme-builder-header-shrink-row-bottom' ); 1308 rows.removeClass( 'fl-theme-builder-header-shrink-row-top' ); 1309 modules.removeClass( 'fl-theme-builder-header-shrink-module-bottom' ); 1310 modules.removeClass( 'fl-theme-builder-header-shrink-module-top' ); 1311 this.header.removeClass( 'fl-theme-builder-header-shrink' ); 1312 }, 1313 1314 /** 1315 * Adds max height to images in modules for smooth scrolling. 1316 * 1317 * @since 1.1.1 1318 * @access private 1319 * @method _setImageMaxHeight 1320 */ 1321 _setImageMaxHeight: function() 1322 { 1323 var head = $( 'head' ), 1324 stylesId = 'fl-header-styles-' + this.header.data( 'post-id' ), 1325 styles = '', 1326 images = this.header.find( '.fl-module img' ); 1327 1328 if ( $( '#' + stylesId ).length ) { 1329 return; 1330 } 1331 1332 images.each( function( i ) { 1333 var image = $( this ), 1334 height = image.height(), 1335 node = image.closest( '.fl-module' ).data( 'node' ), 1336 className = 'fl-node-' + node + '-img-' + i, 1337 maxMegaMenu = image.closest( '.max-mega-menu' ).length, 1338 imageInLightbox = image.closest( '.fl-button-lightbox-content' ).length, 1339 imageInNavMenu = image.closest( 'li.menu-item' ).length; 1340 1341 if ( ! ( imageInLightbox || imageInNavMenu || maxMegaMenu ) ) { 1342 image.addClass( className ); 1343 styles += '.' + className + ' { max-height: ' + ( height ? height : image[0].height ) + 'px }'; 1344 } 1345 1346 } ); 1347
1348 if ( '' !== styles ) { 1349 head.append( '<style id="' + stylesId + '">' + styles + '</style>' ); 1350 } 1351 }, 1352 1353 /** 1354 * Removes max height on images in modules for smooth scrolling. 1355 * 1356 * @since 1.1.1 1357 * @access private 1358 * @method _removeImageMaxHeight 1359 */ 1360 _removeImageMaxHeight: function() 1361 { 1362 $( '#fl-header-styles-' + this.header.data( 'post-id' ) ).remove(); 1363 }, 1364 }; 1365 1366 $( function() { FLThemeBuilderHeaderLayout.init(); } ); 1367 1368})(jQuery); 1369 1370/*! 1371 * Bowser - a browser detector 1372 * https://github.com/ded/bowser 1373 * MIT License | (c) Dustin Diaz 2015 1374 */ 1375 1376!function (name, definition) { 1377 if (typeof module != 'undefined' && module.exports) module.exports = definition() 1378 else if (typeof define == 'function' && define.amd) define(name, definition) 1379 else this[name] = definition() 1380}('bowser', function () { 1381 /** 1382 * See useragents.js for examples of navigator.userAgent 1383 */ 1384 1385 var t = true 1386 1387 function detect(ua) { 1388 1389 function getFirstMatch(regex) { 1390 var match = ua.match(regex); 1391 return (match && match.length > 1 && match[1]) || ''; 1392 } 1393 1394 function getSecondMatch(regex) { 1395 var match = ua.match(regex); 1396 return (match && match.length > 1 && match[2]) || ''; 1397 } 1398 1399 var iosdevice = getFirstMatch(/(ipod|iphone|ipad)/i).toLowerCase() 1400 , likeAndroid = /like android/i.test(ua) 1401 , android = !likeAndroid && /android/i.test(ua) 1402 , nexusMobile = /nexus\s*[0-6]\s*/i.test(ua) 1403 , nexusTablet = !nexusMobile && /nexus\s*[0-9]+/i.test(ua) 1404 , chromeos = /CrOS/.test(ua) 1405 , silk = /silk/i.test(ua) 1406 , sailfish = /sailfish/i.test(ua) 1407 , tizen = /tizen/i.test(ua) 1408 , webos = /(web|hpw)os/i.test(ua) 1409 , windowsphone = /windows phone/i.test(ua) 1410 , windows = !windowsphone && /windows/i.test(ua) 1411 , mac = !iosdevice && !silk && /macintosh/i.test(ua) 1412 , linux = !android && !sailfish && !tizen && !webos && /linux/i.test(ua) 1413 , edgeVersion = getFirstMatch(/edge\/(\d+(\.\d+)?)/i) 1414 , versionIdentifier = getFirstMatch(/version\/(\d+(\.\d+)?)/i) 1415 , tablet = /tablet/i.test(ua) 1416 , mobile = !tablet && /[^-]mobi/i.test(ua) 1417 , xbox = /xbox/i.test(ua) 1418 , result 1419 1420 if (/opera|opr|opios/i.test(ua)) { 1421 result = { 1422 name: 'Opera' 1423 , opera: t 1424 , version: versionIdentifier || getFirstMatch(/(?:opera|opr|opios)[\s\/](\d+(\.\d+)?)/i) 1425 } 1426 } 1427 else if (/coast/i.test(ua)) { 1428 result = { 1429 name: 'Opera Coast' 1430 , coast: t 1431 , version: versionIdentifier || getFirstMatch(/(?:coast)[\s\/](\d+(\.\d+)?)/i) 1432 } 1433 } 1434 else if (/yabrowser/i.test(ua)) { 1435 result = { 1436 name: 'Yandex Browser' 1437 , yandexbrowser: t 1438 , version: versionIdentifier || getFirstMatch(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i) 1439 } 1440 } 1441 else if (/ucbrowser/i.test(ua)) { 1442 result = { 1443 name: 'UC Browser' 1444 , ucbrowser: t 1445 , version: getFirstMatch(/(?:ucbrowser)[\s\/](\d+(?:\.\d+)+)/i) 1446 } 1447 } 1448 else if (/mxios/i.test(ua)) { 1449 result = { 1450 name: 'Maxthon' 1451 , maxthon: t 1452 , version: getFirstMatch(/(?:mxios)[\s\/](\d+(?:\.\d+)+)/i) 1453 } 1454 } 1455 else if (/epiphany/i.test(ua)) { 1456 result = { 1457 name: 'Epiphany' 1458 , epiphany: t 1459 , version: getFirstMatch(/(?:epiphany)[\s\/](\d+(?:\.\d+)+)/i) 1460 } 1461 } 1462 else if (/puffin/i.test(ua)) { 1463 result = { 1464 name: 'Puffin' 1465 , puffin: t 1466 , version: getFirstMatch(/(?:puffin)[\s\/](\d+(?:\.\d+)?)/i) 1467 } 1468 } 1469 else if (/sleipnir/i.test(ua)) { 1470 result = { 1471 name: 'Sleipnir' 1472 , sleipnir: t 1473 , version: getFirstMatch(/(?:sleipnir)[\s\/](\d+(?:\.\d+)+)/i) 1474 } 1475 } 1476 else if (/k-meleon/i.test(ua)) { 1477 result = { 1478 name: 'K-Meleon' 1479 , kMeleon: t 1480 , version: getFirstMatch(/(?:k-meleon)[\s\/](\d+(?:\.\d+)+)/i) 1481 } 1482 } 1483 else if (windowsphone) { 1484 result = { 1485 name: 'Windows Phone' 1486 , windowsphone: t 1487 } 1488 if (edgeVersion) { 1489 result.msedge = t 1490 result.version = edgeVersion 1491 } 1492 else { 1493 result.msie = t 1494 result.version = getFirstMatch(/iemobile\/(\d+(\.\d+)?)/i) 1495 } 1496 } 1497 else if (/msie|trident/i.test(ua)) { 1498 result = { 1499 name: 'Internet Explorer' 1500 , msie: t 1501 , version: getFirstMatch(/(?:msie |rv:)(\d+(\.\d+)?)/i) 1502 } 1503 } else if (chromeos) { 1504 result = { 1505 name: 'Chrome' 1506 , chromeos: t 1507 , chromeBook: t 1508 , chrome: t 1509 , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i) 1510 } 1511 } else if (/chrome.+? edge/i.test(ua)) { 1512 result = { 1513 name: 'Microsoft Edge' 1514 , msedge: t 1515 , version: edgeVersion 1516 } 1517 } 1518 else if (/vivaldi/i.test(ua)) { 1519 result = { 1520 name: 'Vivaldi' 1521 , vivaldi: t 1522 , version: getFirstMatch(/vivaldi\/(\d+(\.\d+)?)/i) || versionIdentifier 1523 } 1524 } 1525 else if (sailfish) { 1526 result = { 1527 name: 'Sailfish' 1528 , sailfish: t 1529 , version: getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i) 1530 } 1531 } 1532 else if (/seamonkey\//i.test(ua)) { 1533 result = { 1534 name: 'SeaMonkey' 1535 , seamonkey: t 1536 , version: getFirstMatch(/seamonkey\/(\d+(\.\d+)?)/i) 1537 } 1538 } 1539 else if (/firefox|iceweasel|fxios/i.test(ua)) { 1540 result = { 1541 name: 'Firefox' 1542 , firefox: t 1543 , version: getFirstMatch(/(?:firefox|iceweasel|fxios)[ \/](\d+(\.\d+)?)/i) 1544 } 1545 if (/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(ua)) { 1546 result.firefoxos = t 1547 } 1548 } 1549 else if (silk) { 1550 result = { 1551 name: 'Amazon Silk' 1552 , silk: t 1553 , version : getFirstMatch(/silk\/(\d+(\.\d+)?)/i) 1554 } 1555 } 1556 else if (/phantom/i.test(ua)) { 1557 result = { 1558 name: 'PhantomJS' 1559 , phantom: t 1560 , version: getFirstMatch(/phantomjs\/(\d+(\.\d+)?)/i) 1561 } 1562 } 1563 else if (/slimerjs/i.test(ua)) { 1564 result = { 1565 name: 'SlimerJS' 1566 , slimer: t 1567 , version: getFirstMatch(/slimerjs\/(\d+(\.\d+)?)/i) 1568 } 1569 } 1570 else if (/blackberry|\bbb\d+/i.test(ua) || /rim\stablet/i.test(ua)) { 1571 result = { 1572 name: 'BlackBerry' 1573 , blackberry: t 1574 , version: versionIdentifier || getFirstMatch(/blackberry[\d]+\/(\d+(\.\d+)?)/i) 1575 } 1576 } 1577 else if (webos) { 1578 result = { 1579 name: 'WebOS' 1580 , webos: t 1581 , version: versionIdentifier || getFirstMatch(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i) 1582 }; 1583 if( /touchpad\//i.test(ua) ){ 1584 result.touchpad = t; 1585 } 1586 } 1587 else if (/bada/i.test(ua)) { 1588 result = { 1589 name: 'Bada' 1590 , bada: t 1591 , version: getFirstMatch(/dolfin\/(\d+(\.\d+)?)/i) 1592 }; 1593 } 1594 else if (tizen) { 1595 result = { 1596 name: 'Tizen' 1597 , tizen: t 1598 , version: getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i) || versionIdentifier 1599 }; 1600 } 1601 else if (/qupzilla/i.test(ua)) { 1602 result = { 1603 name: 'QupZilla' 1604 , qupzilla: t 1605 , version: getFirstMatch(/(?:qupzilla)[\s\/](\d+(?:\.\d+)+)/i) || versionIdentifier 1606 } 1607 } 1608 else if (/chromium/i.test(ua)) { 1609 result = { 1610 name: 'Chromium' 1611 , chromium: t 1612 , version: getFirstMatch(/(?:chromium)[\s\/](\d+(?:\.\d+)?)/i) || versionIdentifier 1613 } 1614 } 1615 else if (/chrome|crios|crmo/i.test(ua)) { 1616 result = { 1617 name: 'Chrome' 1618 , chrome: t 1619 , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i) 1620 } 1621 } 1622 else if (android) { 1623 result = { 1624 name: 'Android' 1625 , version: versionIdentifier 1626 } 1627 } 1628 else if (/safari|applewebkit/i.test(ua)) { 1629 result = { 1630 name: 'Safari' 1631 , safari: t 1632 } 1633 if (versionIdentifier) { 1634 result.version = versionIdentifier 1635 } 1636 } 1637 else if (iosdevice) { 1638 result = { 1639 name : iosdevice == 'iphone' ? 'iPhone' : iosdevice == 'ipad' ? 'iPad' : 'iPod' 1640 } 1641 // WTF: version is not part of user agent in web apps 1642 if (versionIdentifier) { 1643 result.version = versionIdentifier 1644 } 1645 } 1646 else if(/googlebot/i.test(ua)) { 1647 result = { 1648 name: 'Googlebot' 1649 , googlebot: t 1650 , version: getFirstMatch(/googlebot\/(\d+(\.\d+))/i) || versionIdentifier 1651 } 1652 } 1653 else { 1654 result = { 1655 name: getFirstMatch(/^(.*)\/(.*) /), 1656 version: getSecondMatch(/^(.*)\/(.*) /) 1657 }; 1658 } 1659 1660 // set webkit or gecko flag for browsers based on these engines 1661 if (!result.msedge && /(apple)?webkit/i.test(ua)) { 1662 if (/(apple)?webkit\/537\.36/i.test(ua)) { 1663 result.name = result.name || "Blink" 1664 result.blink = t 1665 } else { 1666 result.name = result.name || "Webkit" 1667 result.webkit = t 1668 } 1669 if (!result.version && versionIdentifier) { 1670 result.version = versionIdentifier 1671 } 1672 } else if (!result.opera && /gecko\//i.test(ua)) { 1673 result.name = result.name || "Gecko" 1674 result.gecko = t 1675 result.version = result.version || getFirstMatch(/gecko\/(\d+(\.\d+)?)/i) 1676 } 1677 1678 // set OS flags for platforms that have multiple browsers 1679 if (!result.msedge && (android || result.silk)) { 1680 result.android = t 1681 } else if (iosdevice) { 1682 result[iosdevice] = t 1683 result.ios = t 1684 } else if (mac) { 1685 result.mac = t 1686 } else if (xbox) { 1687 result.xbox = t 1688 } else if (windows) { 1689 result.windows = t 1690 } else if (linux) { 1691 result.linux = t 1692 } 1693 1694 // OS version extraction 1695 var osVersion = ''; 1696 if (result.windowsphone) { 1697 osVersion = getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i); 1698 } else if (iosdevice) { 1699 osVersion = getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i); 1700 osVersion = osVersion.replace(/[_\s]/g, '.'); 1701 } else if (android) { 1702 osVersion = getFirstMatch(/android[ \/-](\d+(\.\d+)*)/i); 1703 } else if (result.webos) { 1704 osVersion = getFirstMatch(/(?:web|hpw)os\/(\d+(\.\d+)*)/i); 1705 } else if (result.blackberry) { 1706 osVersion = getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i); 1707 } else if (result.bada) { 1708 osVersion = getFirstMatch(/bada\/(\d+(\.\d+)*)/i); 1709 } else if (result.tizen) { 1710 osVersion = getFirstMatch(/tizen[\/\s](\d+(\.\d+)*)/i); 1711 } 1712 if (osVersion) { 1713 result.osversion = osVersion; 1714 } 1715 1716 // device type extraction 1717 var osMajorVersion = osVersion.split('.')[0]; 1718 if ( 1719 tablet 1720 || nexusTablet 1721 || iosdevice == 'ipad' 1722 || (android && (osMajorVersion == 3 || (osMajorVersion >= 4 && !mobile))) 1723 || result.silk 1724 ) { 1725 result.tablet = t 1726 } else if ( 1727 mobile 1728 || iosdevice == 'iphone' 1729 || iosdevice == 'ipod' 1730 || android 1731 || nexusMobile 1732 || result.blackberry 1733 || result.webos 1734 || result.bada 1735 ) { 1736 result.mobile = t 1737 } 1738 1739 // Graded Browser Support
vendor: 4,367 bytes, lines 1740-1882
1740 // http://developer.yahoo.com/yui/articles/gbs 1741 if (result.msedge || 1742 (result.msie && result.version >= 10) || 1743 (result.yandexbrowser && result.version >= 15) || 1744 (result.vivaldi && result.version >= 1.0) || 1745 (result.chrome && result.version >= 20) || 1746 (result.firefox && result.version >= 20.0) || 1747 (result.safari && result.version >= 6) || 1748 (result.opera && result.version >= 10.0) || 1749 (result.ios && result.osversion && result.osversion.split(".")[0] >= 6) || 1750 (result.blackberry && result.version >= 10.1) 1751 || (result.chromium && result.version >= 20) 1752 ) { 1753 result.a = t; 1754 } 1755 else if ((result.msie && result.version < 10) || 1756 (result.chrome && result.version < 20) || 1757 (result.firefox && result.version < 20.0) || 1758 (result.safari && result.version < 6) || 1759 (result.opera && result.version < 10.0) || 1760 (result.ios && result.osversion && result.osversion.split(".")[0] < 6) 1761 || (result.chromium && result.version < 20) 1762 ) { 1763 result.c = t 1764 } else result.x = t 1765 1766 return result 1767 } 1768 1769 var bowser = detect(typeof navigator !== 'undefined' ? navigator.userAgent : '') 1770 1771 bowser.test = function (browserList) { 1772 for (var i = 0; i < browserList.length; ++i) { 1773 var browserItem = browserList[i]; 1774 if (typeof browserItem=== 'string') { 1775 if (browserItem in bowser) { 1776 return true; 1777 } 1778 } 1779 } 1780 return false; 1781 } 1782 1783 /** 1784 * Get version precisions count 1785 * 1786 * @example 1787 * getVersionPrecision("1.10.3") // 3 1788 * 1789 * @param {string} version 1790 * @return {number} 1791 */ 1792 function getVersionPrecision(version) { 1793 return version.split(".").length; 1794 } 1795 1796 /** 1797 * Array::map polyfill 1798 * 1799 * @param {Array} arr 1800 * @param {Function} iterator 1801 * @return {Array} 1802 */ 1803 function map(arr, iterator) { 1804 var result = [], i; 1805 if (Array.prototype.map) { 1806 return Array.prototype.map.call(arr, iterator); 1807 } 1808 for (i = 0; i < arr.length; i++) { 1809 result.push(iterator(arr[i])); 1810 } 1811 return result; 1812 } 1813 1814 /** 1815 * Calculate browser version weight 1816 * 1817 * @example 1818 * compareVersions(['1.10.2.1', '1.8.2.1.90']) // 1 1819 * compareVersions(['1.010.2.1', '1.09.2.1.90']); // 1 1820 * compareVersions(['1.10.2.1', '1.10.2.1']); // 0 1821 * compareVersions(['1.10.2.1', '1.0800.2']); // -1 1822 * 1823 * @param {Array<String>} versions versions to compare 1824 * @return {Number} comparison result 1825 */ 1826 function compareVersions(versions) { 1827 // 1) get common precision for both versions, for example for "10.0" and "9" it should be 2 1828 var precision = Math.max(getVersionPrecision(versions[0]), getVersionPrecision(versions[1])); 1829 var chunks = map(versions, function (version) { 1830 var delta = precision - getVersionPrecision(version); 1831 1832 // 2) "9" -> "9.0" (for precision = 2) 1833 version = version + new Array(delta + 1).join(".0"); 1834 1835 // 3) "9.0" -> ["000000000"", "000000009"] 1836 return map(version.split("."), function (chunk) { 1837 return new Array(20 - chunk.length).join("0") + chunk; 1838 }).reverse(); 1839 }); 1840 1841 // iterate in reverse order by reversed chunks array 1842 while (--precision >= 0) { 1843 // 4) compare: "000000009" > "000000010" = false (but "9" > "10" = true) 1844 if (chunks[0][precision] > chunks[1][precision]) { 1845 return 1; 1846 } 1847 else if (chunks[0][precision] === chunks[1][precision]) { 1848 if (precision === 0) { 1849 // all version chunks are same 1850 return 0; 1851 } 1852 } 1853 else { 1854 return -1; 1855 } 1856 } 1857 } 1858 1859 /** 1860 * Check if browser is unsupported 1861 * 1862 * @example 1863 * bowser.isUnsupportedBrowser({ 1864 * msie: "10", 1865 * firefox: "23", 1866 * chrome: "29", 1867 * safari: "5.1", 1868 * opera: "16", 1869 * phantom: "534" 1870 * }); 1871 * 1872 * @param {Object} minVersions map of minimal version to browser 1873 * @param {Boolean} [strictMode = false] flag to return false if browser wasn't found in map 1874 * @param {String} [ua] user agent string 1875 * @return {Boolean} 1876 */ 1877 function isUnsupportedBrowser(minVersions, strictMode, ua) { 1878 var _bowser = bowser; 1879 1880 // make strictMode param optional with ua param usage 1881 if (typeof strictMode === 'string') { 1882 ua = strictMode;
1883 strictMode = void(0); 1884 } 1885 1886 if (strictMode === void(0)) { 1887 strictMode = false; 1888 } 1889 if (ua) { 1890 _bowser = detect(ua); 1891 } 1892 1893 var version = "" + _bowser.version; 1894 for (var browser in minVersions) { 1895 if (minVersions.hasOwnProperty(browser)) { 1896 if (_bowser[browser]) { 1897 // browser version and min supported version. 1898 return compareVersions([version, minVersions[browser]]) < 0; 1899 } 1900 } 1901 } 1902 1903 return strictMode; // not found 1904 } 1905 1906 /** 1907 * Check if browser is supported 1908 * 1909 * @param {Object} minVersions map of minimal version to browser 1910 * @param {Boolean} [strictMode = false] flag to return false if browser wasn't found in map 1911 * @param {String} [ua] user agent string 1912 * @return {Boolean} 1913 */ 1914 function check(minVersions, strictMode, ua) { 1915 return !isUnsupportedBrowser(minVersions, strictMode, ua); 1916 } 1917 1918 bowser.isUnsupportedBrowser = isUnsupportedBrowser; 1919 bowser.compareVersions = compareVersions; 1920 bowser.check = check; 1921 1922 /* 1923 * Set our detect method to the main bowser object so we can 1924 * reuse it to test other user agents. 1925 * This is needed to implement future tests. 1926 */ 1927 bowser._detect = detect; 1928 1929 return bowser 1930}); 1931 1932(function($){ 1933 UABBTrigger = { 1934 1935 /** 1936 * Trigger a hook. 1937 * 1938 * @since 1.1.0.3 1939 * @method triggerHook 1940 * @param {String} hook The hook to trigger. 1941 * @param {Array} args An array of args to pass to the hook. 1942 */ 1943 triggerHook: function( hook, args ) 1944 { 1945 $( 'body' ).trigger( 'uabb-trigger.' + hook, args ); 1946 }, 1947 1948 /** 1949 * Add a hook. 1950 * 1951 * @since 1.1.0.3 1952 * @method addHook 1953 * @param {String} hook The hook to add. 1954 * @param {Function} callback A function to call when the hook is triggered. 1955 */ 1956 addHook: function( hook, callback ) 1957 { 1958 $( 'body' ).on( 'uabb-trigger.' + hook, callback ); 1959 }, 1960 1961 /** 1962 * Remove a hook. 1963 * 1964 * @since 1.1.0.3 1965 * @method removeHook 1966 * @param {String} hook The hook to remove. 1967 * @param {Function} callback The callback function to remove. 1968 */ 1969 removeHook: function( hook, callback ) 1970 { 1971 $( 'body' ).off( 'uabb-trigger.' + hook, callback ); 1972 }, 1973 }; 1974})(jQuery); 1975 1976jQuery(document).ready(function( $ ) { 1977 1978 if( typeof bowser !== 'undefined' && bowser !== null ) { 1979 1980 var uabb_browser = bowser.name, 1981 uabb_browser_v = bowser.version, 1982 uabb_browser_class = uabb_browser.replace(/\s+/g, '-').toLowerCase(), 1983 uabb_browser_v_class = uabb_browser_class + parseInt( uabb_browser_v ); 1984 1985 $('html').addClass(uabb_browser_class).addClass(uabb_browser_v_class); 1986 1987 } 1988 1989 $('.uabb-row-separator').parents('html').css('overflow-x', 'hidden'); 1990}); 1991jQuery(function($) { 1992 1993 $(function() { 1994 $( '.fl-node-s0qhlrym7v54 .fl-photo-img' ) 1995 .on( 'mouseenter', function( e ) { 1996 $( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' ); 1997 } ) 1998 .on( 'mouseleave', function( e ){ 1999 $( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null ); 2000 } ); 2001 }); 2002 window._fl_string_to_slug_regex = 'a-zA-Z0-9'; 2003}); 2004 2005/* Start Layout Custom JS */ 2006 2007/* End Layout Custom JS */ 2008 2009
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.