1/*! 2 * Bowser - a browser detector 3 * https://github.com/ded/bowser 4 * MIT License | (c) Dustin Diaz 2015 5 */ 6 7!function (name, definition) { 8 if (typeof module != 'undefined' && module.exports) module.exports = definition() 9 else if (typeof define == 'function' && define.amd) define(name, definition) 10 else this[name] = definition() 11}('bowser', function () { 12 /** 13 * See useragents.js for examples of navigator.userAgent 14 */ 15 16 var t = true 17 18 function detect(ua) { 19 20 function getFirstMatch(regex) { 21 var match = ua.match(regex); 22 return (match && match.length > 1 && match[1]) || ''; 23 } 24 25 function getSecondMatch(regex) { 26 var match = ua.match(regex); 27 return (match && match.length > 1 && match[2]) || ''; 28 } 29 30 var iosdevice = getFirstMatch(/(ipod|iphone|ipad)/i).toLowerCase() 31 , likeAndroid = /like android/i.test(ua) 32 , android = !likeAndroid && /android/i.test(ua) 33 , nexusMobile = /nexus\s*[0-6]\s*/i.test(ua) 34 , nexusTablet = !nexusMobile && /nexus\s*[0-9]+/i.test(ua) 35 , chromeos = /CrOS/.test(ua) 36 , silk = /silk/i.test(ua) 37 , sailfish = /sailfish/i.test(ua) 38 , tizen = /tizen/i.test(ua) 39 , webos = /(web|hpw)os/i.test(ua) 40 , windowsphone = /windows phone/i.test(ua) 41 , windows = !windowsphone && /windows/i.test(ua) 42 , mac = !iosdevice && !silk && /macintosh/i.test(ua) 43 , linux = !android && !sailfish && !tizen && !webos && /linux/i.test(ua) 44 , edgeVersion = getFirstMatch(/edge\/(\d+(\.\d+)?)/i) 45 , versionIdentifier = getFirstMatch(/version\/(\d+(\.\d+)?)/i) 46 , tablet = /tablet/i.test(ua) 47 , mobile = !tablet && /[^-]mobi/i.test(ua) 48 , xbox = /xbox/i.test(ua) 49 , result 50 51 if (/opera|opr|opios/i.test(ua)) { 52 result = { 53 name: 'Opera' 54 , opera: t 55 , version: versionIdentifier || getFirstMatch(/(?:opera|opr|opios)[\s\/](\d+(\.\d+)?)/i) 56 } 57 } 58 else if (/coast/i.test(ua)) { 59 result = { 60 name: 'Opera Coast' 61 , coast: t 62 , version: versionIdentifier || getFirstMatch(/(?:coast)[\s\/](\d+(\.\d+)?)/i) 63 } 64 } 65 else if (/yabrowser/i.test(ua)) { 66 result = { 67 name: 'Yandex Browser' 68 , yandexbrowser: t 69 , version: versionIdentifier || getFirstMatch(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i) 70 } 71 } 72 else if (/ucbrowser/i.test(ua)) { 73 result = { 74 name: 'UC Browser' 75 , ucbrowser: t 76 , version: getFirstMatch(/(?:ucbrowser)[\s\/](\d+(?:\.\d+)+)/i) 77 } 78 } 79 else if (/mxios/i.test(ua)) { 80 result = { 81 name: 'Maxthon' 82 , maxthon: t 83 , version: getFirstMatch(/(?:mxios)[\s\/](\d+(?:\.\d+)+)/i) 84 } 85 } 86 else if (/epiphany/i.test(ua)) { 87 result = { 88 name: 'Epiphany' 89 , epiphany: t 90 , version: getFirstMatch(/(?:epiphany)[\s\/](\d+(?:\.\d+)+)/i) 91 } 92 } 93 else if (/puffin/i.test(ua)) { 94 result = { 95 name: 'Puffin' 96 , puffin: t 97 , version: getFirstMatch(/(?:puffin)[\s\/](\d+(?:\.\d+)?)/i) 98 } 99 } 100 else if (/sleipnir/i.test(ua)) { 101 result = { 102 name: 'Sleipnir' 103 , sleipnir: t 104 , version: getFirstMatch(/(?:sleipnir)[\s\/](\d+(?:\.\d+)+)/i) 105 } 106 } 107 else if (/k-meleon/i.test(ua)) { 108 result = { 109 name: 'K-Meleon' 110 , kMeleon: t 111 , version: getFirstMatch(/(?:k-meleon)[\s\/](\d+(?:\.\d+)+)/i) 112 } 113 } 114 else if (windowsphone) { 115 result = { 116 name: 'Windows Phone' 117 , windowsphone: t 118 } 119 if (edgeVersion) { 120 result.msedge = t 121 result.version = edgeVersion 122 } 123 else { 124 result.msie = t 125 result.version = getFirstMatch(/iemobile\/(\d+(\.\d+)?)/i) 126 } 127 } 128 else if (/msie|trident/i.test(ua)) { 129 result = { 130 name: 'Internet Explorer' 131 , msie: t 132 , version: getFirstMatch(/(?:msie |rv:)(\d+(\.\d+)?)/i) 133 } 134 } else if (chromeos) { 135 result = { 136 name: 'Chrome' 137 , chromeos: t 138 , chromeBook: t 139 , chrome: t 140 , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i) 141 } 142 } else if (/chrome.+? edge/i.test(ua)) { 143 result = { 144 name: 'Microsoft Edge' 145 , msedge: t 146 , version: edgeVersion 147 } 148 } 149 else if (/vivaldi/i.test(ua)) { 150 result = { 151 name: 'Vivaldi' 152 , vivaldi: t 153 , version: getFirstMatch(/vivaldi\/(\d+(\.\d+)?)/i) || versionIdentifier 154 } 155 } 156 else if (sailfish) { 157 result = { 158 name: 'Sailfish' 159 , sailfish: t 160 , version: getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i) 161 } 162 } 163 else if (/seamonkey\//i.test(ua)) { 164 result = { 165 name: 'SeaMonkey' 166 , seamonkey: t 167 , version: getFirstMatch(/seamonkey\/(\d+(\.\d+)?)/i) 168 } 169 } 170 else if (/firefox|iceweasel|fxios/i.test(ua)) { 171 result = { 172 name: 'Firefox' 173 , firefox: t 174 , version: getFirstMatch(/(?:firefox|iceweasel|fxios)[ \/](\d+(\.\d+)?)/i) 175 } 176 if (/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(ua)) { 177 result.firefoxos = t 178 } 179 } 180 else if (silk) { 181 result = { 182 name: 'Amazon Silk' 183 , silk: t 184 , version : getFirstMatch(/silk\/(\d+(\.\d+)?)/i) 185 } 186 } 187 else if (/phantom/i.test(ua)) { 188 result = { 189 name: 'PhantomJS' 190 , phantom: t 191 , version: getFirstMatch(/phantomjs\/(\d+(\.\d+)?)/i) 192 } 193 } 194 else if (/slimerjs/i.test(ua)) { 195 result = { 196 name: 'SlimerJS' 197 , slimer: t 198 , version: getFirstMatch(/slimerjs\/(\d+(\.\d+)?)/i) 199 } 200 } 201 else if (/blackberry|\bbb\d+/i.test(ua) || /rim\stablet/i.test(ua)) { 202 result = { 203 name: 'BlackBerry' 204 , blackberry: t 205 , version: versionIdentifier || getFirstMatch(/blackberry[\d]+\/(\d+(\.\d+)?)/i) 206 } 207 } 208 else if (webos) { 209 result = { 210 name: 'WebOS' 211 , webos: t 212 , version: versionIdentifier || getFirstMatch(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i) 213 }; 214 if( /touchpad\//i.test(ua) ){ 215 result.touchpad = t; 216 } 217 } 218 else if (/bada/i.test(ua)) { 219 result = { 220 name: 'Bada' 221 , bada: t 222 , version: getFirstMatch(/dolfin\/(\d+(\.\d+)?)/i) 223 }; 224 } 225 else if (tizen) { 226 result = { 227 name: 'Tizen' 228 , tizen: t 229 , version: getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i) || versionIdentifier 230 }; 231 } 232 else if (/qupzilla/i.test(ua)) { 233 result = { 234 name: 'QupZilla' 235 , qupzilla: t 236 , version: getFirstMatch(/(?:qupzilla)[\s\/](\d+(?:\.\d+)+)/i) || versionIdentifier 237 } 238 } 239 else if (/chromium/i.test(ua)) { 240 result = { 241 name: 'Chromium' 242 , chromium: t 243 , version: getFirstMatch(/(?:chromium)[\s\/](\d+(?:\.\d+)?)/i) || versionIdentifier 244 } 245 } 246 else if (/chrome|crios|crmo/i.test(ua)) { 247 result = { 248 name: 'Chrome' 249 , chrome: t 250 , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i) 251 } 252 } 253 else if (android) { 254 result = { 255 name: 'Android' 256 , version: versionIdentifier 257 } 258 } 259 else if (/safari|applewebkit/i.test(ua)) { 260 result = { 261 name: 'Safari' 262 , safari: t 263 } 264 if (versionIdentifier) { 265 result.version = versionIdentifier 266 } 267 } 268 else if (iosdevice) { 269 result = { 270 name : iosdevice == 'iphone' ? 'iPhone' : iosdevice == 'ipad' ? 'iPad' : 'iPod' 271 } 272 // WTF: version is not part of user agent in web apps 273 if (versionIdentifier) { 274 result.version = versionIdentifier 275 } 276 } 277 else if(/googlebot/i.test(ua)) { 278 result = { 279 name: 'Googlebot' 280 , googlebot: t 281 , version: getFirstMatch(/googlebot\/(\d+(\.\d+))/i) || versionIdentifier 282 } 283 } 284 else { 285 result = { 286 name: getFirstMatch(/^(.*)\/(.*) /), 287 version: getSecondMatch(/^(.*)\/(.*) /) 288 }; 289 } 290 291 // set webkit or gecko flag for browsers based on these engines 292 if (!result.msedge && /(apple)?webkit/i.test(ua)) { 293 if (/(apple)?webkit\/537\.36/i.test(ua)) { 294 result.name = result.name || "Blink" 295 result.blink = t 296 } else { 297 result.name = result.name || "Webkit" 298 result.webkit = t 299 } 300 if (!result.version && versionIdentifier) { 301 result.version = versionIdentifier 302 } 303 } else if (!result.opera && /gecko\//i.test(ua)) { 304 result.name = result.name || "Gecko" 305 result.gecko = t 306 result.version = result.version || getFirstMatch(/gecko\/(\d+(\.\d+)?)/i) 307 } 308 309 // set OS flags for platforms that have multiple browsers 310 if (!result.msedge && (android || result.silk)) { 311 result.android = t 312 } else if (iosdevice) { 313 result[iosdevice] = t 314 result.ios = t 315 } else if (mac) { 316 result.mac = t 317 } else if (xbox) { 318 result.xbox = t 319 } else if (windows) { 320 result.windows = t 321 } else if (linux) { 322 result.linux = t 323 } 324 325 // OS version extraction 326 var osVersion = ''; 327 if (result.windowsphone) { 328 osVersion = getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i); 329 } else if (iosdevice) { 330 osVersion = getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i); 331 osVersion = osVersion.replace(/[_\s]/g, '.'); 332 } else if (android) { 333 osVersion = getFirstMatch(/android[ \/-](\d+(\.\d+)*)/i); 334 } else if (result.webos) { 335 osVersion = getFirstMatch(/(?:web|hpw)os\/(\d+(\.\d+)*)/i); 336 } else if (result.blackberry) { 337 osVersion = getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i); 338 } else if (result.bada) { 339 osVersion = getFirstMatch(/bada\/(\d+(\.\d+)*)/i); 340 } else if (result.tizen) { 341 osVersion = getFirstMatch(/tizen[\/\s](\d+(\.\d+)*)/i); 342 } 343 if (osVersion) { 344 result.osversion = osVersion; 345 } 346 347 // device type extraction 348 var osMajorVersion = osVersion.split('.')[0]; 349 if ( 350 tablet 351 || nexusTablet 352 || iosdevice == 'ipad' 353 || (android && (osMajorVersion == 3 || (osMajorVersion >= 4 && !mobile))) 354 || result.silk 355 ) { 356 result.tablet = t 357 } else if ( 358 mobile 359 || iosdevice == 'iphone' 360 || iosdevice == 'ipod' 361 || android 362 || nexusMobile 363 || result.blackberry 364 || result.webos 365 || result.bada 366 ) { 367 result.mobile = t 368 } 369 370 // Graded Browser Support
371 // http://developer.yahoo.com/yui/articles/gbs 372 if (result.msedge || 373 (result.msie && result.version >= 10) || 374 (result.yandexbrowser && result.version >= 15) || 375 (result.vivaldi && result.version >= 1.0) || 376 (result.chrome && result.version >= 20) || 377 (result.firefox && result.version >= 20.0) || 378 (result.safari && result.version >= 6) || 379 (result.opera && result.version >= 10.0) || 380 (result.ios && result.osversion && result.osversion.split(".")[0] >= 6) || 381 (result.blackberry && result.version >= 10.1) 382 || (result.chromium && result.version >= 20) 383 ) { 384 result.a = t; 385 } 386 else if ((result.msie && result.version < 10) || 387 (result.chrome && result.version < 20) || 388 (result.firefox && result.version < 20.0) || 389 (result.safari && result.version < 6) || 390 (result.opera && result.version < 10.0) || 391 (result.ios && result.osversion && result.osversion.split(".")[0] < 6) 392 || (result.chromium && result.version < 20) 393 ) { 394 result.c = t 395 } else result.x = t 396 397 return result 398 } 399 400 var bowser = detect(typeof navigator !== 'undefined' ? navigator.userAgent : '') 401 402 bowser.test = function (browserList) { 403 for (var i = 0; i < browserList.length; ++i) { 404 var browserItem = browserList[i]; 405 if (typeof browserItem=== 'string') { 406 if (browserItem in bowser) { 407 return true; 408 } 409 } 410 } 411 return false; 412 } 413 414 /** 415 * Get version precisions count 416 * 417 * @example 418 * getVersionPrecision("1.10.3") // 3 419 * 420 * @param {string} version 421 * @return {number} 422 */ 423 function getVersionPrecision(version) { 424 return version.split(".").length; 425 } 426 427 /** 428 * Array::map polyfill 429 * 430 * @param {Array} arr 431 * @param {Function} iterator 432 * @return {Array} 433 */ 434 function map(arr, iterator) { 435 var result = [], i; 436 if (Array.prototype.map) { 437 return Array.prototype.map.call(arr, iterator); 438 } 439 for (i = 0; i < arr.length; i++) { 440 result.push(iterator(arr[i])); 441 } 442 return result; 443 } 444 445 /** 446 * Calculate browser version weight 447 * 448 * @example 449 * compareVersions(['1.10.2.1', '1.8.2.1.90']) // 1 450 * compareVersions(['1.010.2.1', '1.09.2.1.90']); // 1 451 * compareVersions(['1.10.2.1', '1.10.2.1']); // 0 452 * compareVersions(['1.10.2.1', '1.0800.2']); // -1 453 * 454 * @param {Array<String>} versions versions to compare 455 * @return {Number} comparison result 456 */ 457 function compareVersions(versions) { 458 // 1) get common precision for both versions, for example for "10.0" and "9" it should be 2 459 var precision = Math.max(getVersionPrecision(versions[0]), getVersionPrecision(versions[1])); 460 var chunks = map(versions, function (version) { 461 var delta = precision - getVersionPrecision(version); 462 463 // 2) "9" -> "9.0" (for precision = 2) 464 version = version + new Array(delta + 1).join(".0"); 465 466 // 3) "9.0" -> ["000000000"", "000000009"] 467 return map(version.split("."), function (chunk) { 468 return new Array(20 - chunk.length).join("0") + chunk; 469 }).reverse(); 470 }); 471 472 // iterate in reverse order by reversed chunks array 473 while (--precision >= 0) { 474 // 4) compare: "000000009" > "000000010" = false (but "9" > "10" = true) 475 if (chunks[0][precision] > chunks[1][precision]) { 476 return 1; 477 } 478 else if (chunks[0][precision] === chunks[1][precision]) { 479 if (precision === 0) { 480 // all version chunks are same 481 return 0; 482 } 483 } 484 else { 485 return -1; 486 } 487 } 488 } 489 490 /** 491 * Check if browser is unsupported 492 * 493 * @example 494 * bowser.isUnsupportedBrowser({ 495 * msie: "10", 496 * firefox: "23", 497 * chrome: "29", 498 * safari: "5.1", 499 * opera: "16", 500 * phantom: "534" 501 * }); 502 * 503 * @param {Object} minVersions map of minimal version to browser 504 * @param {Boolean} [strictMode = false] flag to return false if browser wasn't found in map 505 * @param {String} [ua] user agent string 506 * @return {Boolean} 507 */ 508 function isUnsupportedBrowser(minVersions, strictMode, ua) { 509 var _bowser = bowser; 510 511 // make strictMode param optional with ua param usage 512 if (typeof strictMode === 'string') { 513 ua = strictMode;
514 strictMode = void(0); 515 } 516 517 if (strictMode === void(0)) { 518 strictMode = false; 519 } 520 if (ua) { 521 _bowser = detect(ua); 522 } 523 524 var version = "" + _bowser.version; 525 for (var browser in minVersions) { 526 if (minVersions.hasOwnProperty(browser)) { 527 if (_bowser[browser]) { 528 // browser version and min supported version. 529 return compareVersions([version, minVersions[browser]]) < 0; 530 } 531 } 532 } 533 534 return strictMode; // not found 535 } 536 537 /** 538 * Check if browser is supported 539 * 540 * @param {Object} minVersions map of minimal version to browser 541 * @param {Boolean} [strictMode = false] flag to return false if browser wasn't found in map 542 * @param {String} [ua] user agent string 543 * @return {Boolean} 544 */ 545 function check(minVersions, strictMode, ua) { 546 return !isUnsupportedBrowser(minVersions, strictMode, ua); 547 } 548 549 bowser.isUnsupportedBrowser = isUnsupportedBrowser; 550 bowser.compareVersions = compareVersions; 551 bowser.check = check; 552 553 /* 554 * Set our detect method to the main bowser object so we can 555 * reuse it to test other user agents. 556 * This is needed to implement future tests. 557 */ 558 bowser._detect = detect; 559 560 return bowser 561}); 562 563(function($){ 564 UABBTrigger = { 565 566 /** 567 * Trigger a hook. 568 * 569 * @since 1.1.0.3 570 * @method triggerHook 571 * @param {String} hook The hook to trigger. 572 * @param {Array} args An array of args to pass to the hook. 573 */ 574 triggerHook: function( hook, args ) 575 { 576 $( 'body' ).trigger( 'uabb-trigger.' + hook, args ); 577 }, 578 579 /** 580 * Add a hook. 581 * 582 * @since 1.1.0.3 583 * @method addHook 584 * @param {String} hook The hook to add. 585 * @param {Function} callback A function to call when the hook is triggered. 586 */ 587 addHook: function( hook, callback ) 588 { 589 $( 'body' ).on( 'uabb-trigger.' + hook, callback ); 590 }, 591 592 /** 593 * Remove a hook. 594 * 595 * @since 1.1.0.3 596 * @method removeHook 597 * @param {String} hook The hook to remove. 598 * @param {Function} callback The callback function to remove. 599 */ 600 removeHook: function( hook, callback ) 601 { 602 $( 'body' ).off( 'uabb-trigger.' + hook, callback ); 603 }, 604 }; 605})(jQuery); 606 607jQuery(document).ready(function( $ ) { 608 609 if( typeof bowser !== 'undefined' && bowser !== null ) { 610 611 var uabb_browser = bowser.name, 612 uabb_browser_v = bowser.version, 613 uabb_browser_class = uabb_browser.replace(/\s+/g, '-').toLowerCase(), 614 uabb_browser_v_class = uabb_browser_class + parseInt( uabb_browser_v ); 615 616 $('html').addClass(uabb_browser_class).addClass(uabb_browser_v_class); 617 618 } 619 620 $('.uabb-row-separator').parents('html').css('overflow-x', 'hidden'); 621}); 622var wpAjaxUrl = 'https://www.divshare.com/wp-admin/admin-ajax.php';var flBuilderUrl = 'https://www.divshare.com/wp-content/plugins/bb-plugin/';var FLBuilderLayoutConfig = { 623 anchorLinkAnimations : { 624 duration : 1000, 625 easing : 'swing', 626 offset : 100 627 }, 628 paths : { 629 pluginUrl : 'https://www.divshare.com/wp-content/plugins/bb-plugin/', 630 wpAjaxUrl : 'https://www.divshare.com/wp-admin/admin-ajax.php' 631 }, 632 breakpoints : { 633 small : 768, 634 medium : 992 }, 635 waypoint: { 636 offset: 80 637 } 638}; 639(function($){ 640 641 if(typeof FLBuilderLayout != 'undefined') { 642 return; 643 } 644 645 /** 646 * Helper class with generic logic for a builder layout. 647 * 648 * @class FLBuilderLayout 649 * @since 1.0 650 */ 651 FLBuilderLayout = { 652 653 /** 654 * Initializes a builder layout. 655 * 656 * @since 1.0 657 * @method init 658 */ 659 init: function() 660 { 661 // Destroy existing layout events. 662 FLBuilderLayout._destroy(); 663 664 // Init CSS classes. 665 FLBuilderLayout._initClasses(); 666 667 // Init backgrounds.
668 FLBuilderLayout._initBackgrounds(); 669 670 // Only init if the builder isn't active. 671 if ( 0 === $('.fl-builder-edit').length ) { 672 673 // Init module animations. 674 FLBuilderLayout._initModuleAnimations(); 675 676 // Init anchor links. 677 FLBuilderLayout._initAnchorLinks(); 678 679 // Init the browser hash. 680 FLBuilderLayout._initHash(); 681 682 // Init forms. 683 FLBuilderLayout._initForms(); 684 } 685 }, 686 687 /** 688 * Public method for refreshing Wookmark or MosaicFlow galleries 689 * within an element. 690 * 691 * @since 1.7.4 692 * @method refreshGalleries 693 */ 694 refreshGalleries: function( element ) 695 { 696 var $element = 'undefined' == typeof element ? $( 'body' ) : $( element ), 697 mfContent = $element.find( '.fl-mosaicflow-content' ), 698 wmContent = $element.find( '.fl-gallery' ), 699 mfObject = null; 700 701 if ( mfContent ) { 702 703 mfObject = mfContent.data( 'mosaicflow' ); 704 705 if ( mfObject ) { 706 mfObject.columns = $( [] ); 707 mfObject.columnsHeights = []; 708 mfContent.data( 'mosaicflow', mfObject ); 709 mfContent.mosaicflow( 'refill' ); 710 } 711 } 712 if ( wmContent ) { 713 wmContent.trigger( 'refreshWookmark' ); 714 } 715 }, 716 717 /** 718 * Public method for refreshing Masonry within an element 719 * 720 * @since 1.8.1 721 * @method refreshGridLayout 722 */ 723 refreshGridLayout: function( element ) 724 { 725 var $element = 'undefined' == typeof element ? $( 'body' ) : $( element ), 726 msnryContent = $element.find('.masonry'); 727 728 if ( msnryContent.length ) { 729 msnryContent.masonry('layout'); 730 } 731 }, 732 733 /** 734 * Public method for reloading BxSlider within an element 735 * 736 * @since 1.8.1 737 * @method reloadSlider 738 */ 739 reloadSlider: function( element ) 740 { 741 var $element = 'undefined' == typeof element ? $( 'body' ) : $( element ), 742 bxContent = $element.find('.bx-viewport > div').eq(0), 743 bxObject = null; 744 745 if ( bxContent.length ) { 746 bxObject = bxContent.data( 'bxSlider'); 747 if ( bxObject ) { 748 bxObject.reloadSlider(); 749 } 750 } 751 }, 752 753 /** 754 * Public method for resizing WP audio player 755 * 756 * @since 1.8.2 757 * @method resizeAudio 758 */ 759 resizeAudio: function( element ) 760 { 761 var $element = 'undefined' == typeof element ? $( 'body' ) : $( element ), 762 audioPlayers = $element.find('.wp-audio-shortcode.mejs-audio'), 763 player = null, 764 mejsPlayer = null, 765 rail = null, 766 railWidth = 400; 767 768 if ( audioPlayers.length && typeof mejs !== 'undefined' ) { 769 audioPlayers.each(function(){ 770 player = $(this); 771 mejsPlayer = mejs.players[player.attr('id')]; 772 rail = player.find('.mejs-controls .mejs-time-rail'); 773 var innerMejs = player.find('.mejs-inner'), 774 total = player.find('.mejs-controls .mejs-time-total'); 775 776 if ( typeof mejsPlayer !== 'undefined' ) { 777 railWidth = Math.ceil(player.width() * 0.8); 778 779 if ( innerMejs.length ) { 780 781 rail.css('width', railWidth +'px!important'); 782 //total.width(rail.width() - 10); 783 784 mejsPlayer.options.autosizeProgress = true; 785 786 // webkit has trouble doing this without a delay 787 setTimeout(function () { 788 mejsPlayer.setControlsSize(); 789 }, 50); 790 791 player.find('.mejs-inner').css({ 792 visibility: 'visible', 793 height: 'inherit' 794 }); 795 } 796 } 797 }); 798 } 799 }, 800 801 /** 802 * Public method for preloading WP audio player when it's inside the hidden element 803 * 804 * @since 1.8.2 805 * @method preloadAudio 806 */ 807 preloadAudio: function(element) 808 { 809 var $element = 'undefined' == typeof element ? $( 'body' ) : $( element ), 810 contentWrap = $element.closest('.fl-accordion-item'), 811 audioPlayers = $element.find('.wp-audio-shortcode.mejs-audio'); 812 813 if ( ! contentWrap.hasClass('fl-accordion-item-active') && audioPlayers.find('.mejs-inner').length ) { 814 audioPlayers.find('.mejs-inner').css({ 815 visibility : 'hidden', 816 height: 0 817 }); 818 } 819 }, 820 821 /** 822 * Public method for resizing slideshow momdule within the tab 823 * 824 * @since 1.10.5 825 * @method resizeSlideshow 826 */ 827 resizeSlideshow: function(){ 828 if(typeof YUI !== 'undefined') { 829 YUI().use('node-event-simulate', function(Y) { 830 Y.one(window).simulate("resize"); 831 }); 832 } 833 }, 834 835 /** 836 * Public method for reloading an embedded Google Map within the tabs or hidden element. 837 * 838 * @since 2.2 839 * @method reloadGoogleMap 840 */ 841 reloadGoogleMap: function(element){ 842 var $element = 'undefined' == typeof element ? $( 'body' ) : $( element ),
843 googleMap = $element.find( 'iframe[src*="google.com/maps"]' ); 844 845 if ( googleMap.length ) { 846 googleMap.attr( 'src', function(i, val) { 847 return val; 848 }); 849 } 850 }, 851 852 /** 853 * Unbinds builder layout events. 854 * 855 * @since 1.0 856 * @access private 857 * @method _destroy 858 */ 859 _destroy: function() 860 { 861 var win = $(window); 862 863 win.off('scroll.fl-bg-parallax'); 864 win.off('resize.fl-bg-video'); 865 }, 866 867 /** 868 * Checks to see if the current device has touch enabled. 869 * 870 * @since 1.0 871 * @access private 872 * @method _isTouch 873 * @return {Boolean} 874 */ 875 _isTouch: function() 876 { 877 if(('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)) { 878 return true; 879 } 880 881 return false; 882 }, 883 884 /** 885 * Checks to see if the current device is mobile. 886 * 887 * @since 1.7 888 * @access private 889 * @method _isMobile 890 * @return {Boolean} 891 */ 892 _isMobile: function() 893 { 894 return /Mobile|Android|Silk\/|Kindle|BlackBerry|Opera Mini|Opera Mobi|webOS/i.test( navigator.userAgent ); 895 }, 896 897 /** 898 * Initializes builder body classes. 899 * 900 * @since 1.0 901 * @access private 902 * @method _initClasses 903 */ 904 _initClasses: function() 905 { 906 var body = $( 'body' ), 907 ua = navigator.userAgent; 908 909 // Add the builder body class. 910 if ( ! body.hasClass( 'archive' ) && $( '.fl-builder-content-primary' ).length > 0 ) { 911 body.addClass('fl-builder'); 912 } 913 914 // Add the builder touch body class. 915 if(FLBuilderLayout._isTouch()) { 916 body.addClass('fl-builder-touch'); 917 } 918 919 // Add the builder mobile body class. 920 if(FLBuilderLayout._isMobile()) { 921 body.addClass('fl-builder-mobile'); 922 } 923 924 if ( $(window).width() < FLBuilderLayoutConfig.breakpoints.small ) { 925 body.addClass( 'fl-builder-breakpoint-small' ); 926 } 927 928 if ( $(window).width() > FLBuilderLayoutConfig.breakpoints.small && $(window).width() < FLBuilderLayoutConfig.breakpoints.medium ) { 929 body.addClass( 'fl-builder-breakpoint-medium' ); 930 } 931 932 if ( $(window).width() > FLBuilderLayoutConfig.breakpoints.medium ) { 933 body.addClass( 'fl-builder-breakpoint-large' ); 934 } 935 936 // IE11 body class. 937 if ( ua.indexOf( 'Trident/7.0' ) > -1 && ua.indexOf( 'rv:11.0' ) > -1 ) { 938 body.addClass( 'fl-builder-ie-11' ); 939 } 940 }, 941 942 /** 943 * Initializes builder node backgrounds that require 944 * additional JavaScript logic such as parallax. 945 * 946 * @since 1.1.4 947 * @access private
948 * @method _initBackgrounds 949 */ 950 _initBackgrounds: function() 951 { 952 var win = $(window); 953 954 // Init parallax backgrounds. 955 if($('.fl-row-bg-parallax').length > 0 && !FLBuilderLayout._isMobile()) { 956 FLBuilderLayout._scrollParallaxBackgrounds(); 957 FLBuilderLayout._initParallaxBackgrounds(); 958 win.on('scroll.fl-bg-parallax', FLBuilderLayout._scrollParallaxBackgrounds); 959 } 960 961 // Init video backgrounds. 962 if($('.fl-bg-video').length > 0) { 963 FLBuilderLayout._initBgVideos(); 964 FLBuilderLayout._resizeBgVideos(); 965 win.on('resize.fl-bg-video', FLBuilderLayout._resizeBgVideos); 966 } 967 }, 968 969 /** 970 * Initializes all parallax backgrounds in a layout. 971 * 972 * @since 1.1.4 973 * @access private 974 * @method _initParallaxBackgrounds 975 */ 976 _initParallaxBackgrounds: function() 977 { 978 $('.fl-row-bg-parallax').each(FLBuilderLayout._initParallaxBackground); 979 }, 980 981 /** 982 * Initializes a single parallax background. 983 * 984 * @since 1.1.4 985 * @access private 986 * @method _initParallaxBackgrounds 987 */ 988 _initParallaxBackground: function() 989 { 990 var row = $(this), 991 content = row.find('> .fl-row-content-wrap'), 992 src = row.data('parallax-image'), 993 loaded = row.data('parallax-loaded'), 994 img = new Image(); 995 996 if(loaded) { 997 return; 998 } 999 else if(typeof src != 'undefined') { 1000 1001 $(img).on('load', function() { 1002 content.css('background-image', 'url(' + src + ')'); 1003 row.data('parallax-loaded', true); 1004 }); 1005 1006 img.src = src; 1007 } 1008 }, 1009 1010 /** 1011 * Fires when the window is scrolled to adjust 1012 * parallax backgrounds. 1013 * 1014 * @since 1.1.4 1015 * @access private 1016 * @method _scrollParallaxBackgrounds 1017 */ 1018 _scrollParallaxBackgrounds: function() 1019 { 1020 $('.fl-row-bg-parallax').each(FLBuilderLayout._scrollParallaxBackground); 1021 }, 1022 1023 /** 1024 * Fires when the window is scrolled to adjust 1025 * a single parallax background. 1026 * 1027 * @since 1.1.4 1028 * @access private 1029 * @method _scrollParallaxBackground 1030 */ 1031 _scrollParallaxBackground: function() 1032 { 1033 var win = $(window), 1034 row = $(this), 1035 content = row.find('> .fl-row-content-wrap'), 1036 speed = row.data('parallax-speed'), 1037 offset = content.offset(), 1038 yPos = -((win.scrollTop() - offset.top) / speed); 1039 1040 content.css('background-position', 'center ' + yPos + 'px'); 1041 }, 1042 1043 /** 1044 * Initializes all video backgrounds. 1045 * 1046 * @since 1.6.3.3 1047 * @access private 1048 * @method _initBgVideos 1049 */ 1050 _initBgVideos: function() 1051 { 1052 $('.fl-bg-video').each(FLBuilderLayout._initBgVideo); 1053 }, 1054 1055 /** 1056 * Initializes a video background. 1057 * 1058 * @since 1.6.3.3 1059 * @access private 1060 * @method _initBgVideo 1061 */ 1062 _initBgVideo: function() 1063 { 1064 var wrap = $( this ), 1065 width = wrap.data( 'width' ), 1066 height = wrap.data( 'height' ), 1067 mp4 = wrap.data( 'mp4' ), 1068 youtube = wrap.data( 'youtube'), 1069 vimeo = wrap.data( 'vimeo'), 1070 mp4Type = wrap.data( 'mp4-type' ), 1071 webm = wrap.data( 'webm' ), 1072 webmType = wrap.data( 'webm-type' ), 1073 fallback = wrap.data( 'fallback' ), 1074 loaded = wrap.data( 'loaded' ), 1075 videoMobile = wrap.data( 'video-mobile' ), 1076 fallbackTag = '', 1077 videoTag = null, 1078 mp4Tag = null, 1079 webmTag = null; 1080 1081 // Return if the video has been loaded for this row. 1082 if ( loaded ) { 1083 return; 1084 } 1085 1086 videoTag = $( '<video autoplay loop muted playsinline></video>' ); 1087 1088 /** 1089 * Add poster image (fallback image) 1090 */ 1091 if( 'undefined' != typeof fallback && '' != fallback ) { 1092 videoTag.attr( 'poster', 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7' ) 1093 videoTag.css( 'background', 'transparent url("' + fallback + '") no-repeat center center' ) 1094 videoTag.css( 'background-size', 'cover' ) 1095 videoTag.css( 'height', '100%' ) 1096 } 1097 1098 // MP4 Source Tag 1099 if ( 'undefined' != typeof mp4 && '' != mp4 ) { 1100 1101 mp4Tag = $( '<source />' ); 1102 mp4Tag.attr( 'src', mp4 ); 1103 mp4Tag.attr( 'type', mp4Type ); 1104 1105 videoTag.append( mp4Tag ); 1106 } 1107 // WebM Source Tag 1108 if ( 'undefined' != typeof webm && '' != webm ) { 1109 1110 webmTag = $( '<source />' ); 1111 webmTag.attr( 'src', webm ); 1112 webmTag.attr( 'type', webmType ); 1113 1114 videoTag.append( webmTag ); 1115 } 1116 1117 // This is either desktop, or mobile is enabled. 1118 if ( ! FLBuilderLayout._isMobile() || ( FLBuilderLayout._isMobile() && "yes" == videoMobile ) ) { 1119 if ( 'undefined' != typeof youtube ) { 1120 FLBuilderLayout._initYoutubeBgVideo.apply( this ); 1121 } 1122 else if ( 'undefined' != typeof vimeo ) { 1123 FLBuilderLayout._initVimeoBgVideo.apply( this ); 1124 } 1125 else { 1126 wrap.append( videoTag ); 1127 } 1128 } 1129 else { 1130 // if we are here, it means we are on mobile and NO is set so remove video src and use fallback 1131 videoTag.attr('src', '') 1132 wrap.append( videoTag ); 1133 } 1134 1135 // Mark this video as loaded. 1136 wrap.data('loaded', true); 1137 }, 1138 1139 /** 1140 * Initializes Youtube video background 1141 * 1142 * @since 1.9 1143 * @access private 1144 * @method _initYoutubeBgVideo 1145 */ 1146 _initYoutubeBgVideo: function() 1147 { 1148 var playerWrap = $(this), 1149 videoId = playerWrap.data('video-id'), 1150 videoPlayer = playerWrap.find('.fl-bg-video-player'), 1151 enableAudio = playerWrap.data('enable-audio'), 1152 audioButton = playerWrap.find('.fl-bg-video-audio'), 1153 startTime = 'undefined' !== typeof playerWrap.data('start') ? playerWrap.data('start')
1153: 0, 1154 endTime = 'undefined' !== typeof playerWrap.data('end') ? playerWrap.data('end') : 0, 1155 loop = 'undefined' !== typeof playerWrap.data('loop') ? playerWrap.data('loop') : 1, 1156 stateCount = 0, 1157 player,fallback_showing; 1158 1159 if ( videoId ) { 1160 fallback = playerWrap.data('fallback') || false 1161 if( fallback ) { 1162 playerWrap.find('iframe').remove() 1163 fallbackTag = $( '<div></div>' ); 1164 fallbackTag.addClass( 'fl-bg-video-fallback' ); 1165 fallbackTag.css( 'background-image', 'url(' + playerWrap.data('fallback') + ')' ); 1166 fallbackTag.css( 'background-size', 'cover' ); 1167 fallbackTag.css( 'transition', 'background-image 1s') 1168 playerWrap.append( fallbackTag ); 1169 fallback_showing = true; 1170 } 1171 FLBuilderLayout._onYoutubeApiReady( function( YT ) { 1172 setTimeout( function() { 1173 1174 player = new YT.Player( videoPlayer[0], { 1175 videoId: videoId, 1176 events: { 1177 onReady: function(event) { 1178 if ( "no" === enableAudio || FLBuilderLayout._isMobile() ) { 1179 event.target.mute(); 1180 } 1181 else if ( "yes" === enableAudio && event.target.isMuted ) { 1182 event.target.unMute(); 1183 } 1184 1185 // Store an instance to a parent 1186 playerWrap.data('YTPlayer', player); 1187 FLBuilderLayout._resizeYoutubeBgVideo.apply(playerWrap); 1188 1189 // Queue the video. 1190 event.target.playVideo(); 1191 1192 if ( audioButton.length > 0 && ! FLBuilderLayout._isMobile() ) { 1193 audioButton.on( 'click', {button: audioButton, player: player}, FLBuilderLayout._toggleBgVideoAudio ); 1194 } 1195 }, 1196 onStateChange: function( event ) { 1197 1198 if ( event.data === 1 ) { 1199 if ( fallback_showing ) { 1200 $( '.fl-bg-video-fallback' ).css( 'background-image', 'url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)' ) 1201 } 1202 } 1203 // Manual check if video is not playable in some browsers. 1204 // StateChange order: [-1, 3, -1] 1205 if ( stateCount < 4 ) { 1206 stateCount++; 1207 } 1208 1209 // Comply with the audio policy in some browsers like Chrome and Safari. 1210 if ( stateCount > 1 && (-1 === event.data || 2 === event.data) && "yes" === enableAudio ) { 1211 player.mute(); 1212 player.playVideo(); 1213 audioButton.show(); 1214 } 1215 1216 if ( event.data === YT.PlayerState.ENDED && 1 === loop ) { 1217 if ( startTime > 0 ) { 1218 player.seekTo( startTime ); 1219 } 1220 else { 1221 player.playVideo(); 1222 } 1223 } 1224 }, 1225 onError: function(event) { 1226 console.info('YT Error: ' + event.data) 1227 FLBuilderLayout._onErrorYoutubeVimeo(playerWrap) 1228 } 1229 }, 1230 playerVars: { 1231 playsinline: FLBuilderLayout._isMobile() ? 1 : 0, 1232 controls: 0, 1233 showinfo: 0, 1234 rel : 0, 1235 start: startTime, 1236 end: endTime, 1237 } 1238 } ); 1239 }, 1 ); 1240 } ); 1241 } 1242 }, 1243 1244 /** 1245 * On youtube or vimeo error show the fallback image if available. 1246 * @since 2.0.7 1247 */ 1248 _onErrorYoutubeVimeo: function(playerWrap) { 1249 1250 fallback = playerWrap.data('fallback') || false 1251 if( ! fallback ) { 1252 return false; 1253 } 1254 playerWrap.find('iframe').remove() 1255 fallbackTag = $( '<div></div>' ); 1256 fallbackTag.addClass( 'fl-bg-video-fallback' ); 1257 fallbackTag.css( 'background-image', 'url(' + playerWrap.data('fallback') + ')' ); 1258 playerWrap.append( fallbackTag ); 1259 }, 1260 1261 /** 1262 * Check if Youtube API has been downloaded 1263 * 1264 * @since 1.9 1265 * @access private 1266 * @method _onYoutubeApiReady 1267 * @param {Function} callback Method to call when YT API has been loaded 1268 */ 1269 _onYoutubeApiReady: function( callback ) { 1270 if ( window.YT && YT.loaded ) { 1271 callback( YT ); 1272 } else { 1273 // If not ready check again by timeout.. 1274 setTimeout( function() { 1275 FLBuilderLayout._onYoutubeApiReady( callback ); 1276 }, 350 ); 1277 } 1278 }, 1279 1280 /** 1281 * Initializes Vimeo video background 1282 * 1283 * @since 1.9 1284 * @access private 1285 * @method _initVimeoBgVideo 1286 */ 1287 _initVimeoBgVideo: function() 1288 { 1289 var playerWrap = $(this), 1290 videoId = playerWrap.data('video-id'), 1291 videoPlayer = playerWrap.find('.fl-bg-video-player'), 1292 enableAudio = playerWrap.data('enable-audio'), 1293 audioButton = playerWrap.find('.fl-bg-video-audio'), 1294 player, 1295 width = playerWrap.outerWidth(); 1296 1297 if ( typeof Vimeo !== 'undefined' && videoId ) { 1298 player = new Vimeo.Player(videoPlayer[0], { 1299 id : videoId, 1300 loop : true, 1301 title : false, 1302 portrait : false, 1303 background : true, 1304 autopause : false, 1305 muted : true 1306 }); 1307 1308 playerWrap.data('VMPlayer', player); 1309 if ( "no" === enableAudio ) { 1310 player.setVolume(0); 1311 } 1312 else if ("yes" === enableAudio ) { 1313 // Chrome and Safari have audio policy restrictions for autoplay videos. 1314 if ( $.browser.safari || $.browser.chrome ) { 1315 player.setVolume(0); 1316 audioButton.show(); 1317 } 1318 else { 1319 player.setVolume(1); 1320 } 1321 } 1322 1323 player.play().catch(function(error) { 1324 FLBuilderLayout._onErrorYoutubeVimeo(playerWrap) 1325 }); 1326 1327 if ( audioButton.length > 0 ) {
1328 audioButton.on( 'click', {button: audioButton, player: player}, FLBuilderLayout._toggleBgVideoAudio ); 1329 } 1330 } 1331 }, 1332 1333 /** 1334 * Mute / unmute audio on row's video background. 1335 * It works for both Youtube and Vimeo. 1336 * 1337 * @since 2.1.3 1338 * @access private 1339 * @method _toggleBgVideoAudio 1340 * @param {Object} e Method arguments 1341 */ 1342 _toggleBgVideoAudio: function( e ) { 1343 var player = e.data.player, 1344 control = e.data.button.find('.fl-audio-control'); 1345 1346 if ( control.hasClass( 'fa-volume-off' ) ) { 1347 // Unmute 1348 control 1349 .removeClass( 'fa-volume-off' ) 1350 .addClass( 'fa-volume-up' ); 1351 e.data.button.find( '.fa-times' ).hide(); 1352 1353 if ( 'function' === typeof player.unMute ) { 1354 player.unMute(); 1355 } 1356 else { 1357 player.setVolume( 1 ); 1358 } 1359 } 1360 else { 1361 // Mute 1362 control 1363 .removeClass( 'fa-volume-up' ) 1364 .addClass( 'fa-volume-off' ); 1365 e.data.button.find( '.fa-times' ).show(); 1366 1367 if ( 'function' === typeof player.unMute ) { 1368 player.mute(); 1369 } 1370 else { 1371 player.setVolume( 0 ); 1372 } 1373 } 1374 }, 1375 1376 /** 1377 * Fires when there is an error loading a video 1378 * background source and shows the fallback. 1379 * 1380 * @since 1.6.3.3 1381 * @access private 1382 * @method _videoBgSourceError 1383 * @param {Object} e An event object 1384 * @deprecated 2.0.3 1385 */ 1386 _videoBgSourceError: function( e ) 1387 { 1388 var source = $( e.target ), 1389 wrap = source.closest( '.fl-bg-video' ), 1390 vid = wrap.find( 'video' ), 1391 fallback = wrap.data( 'fallback' ), 1392 fallbackTag = ''; 1393 source.remove(); 1394 1395 if ( vid.find( 'source' ).length ) { 1396 // Don't show the fallback if we still have other sources to check. 1397 return; 1398 } else if ( '' !== fallback ) { 1399 fallbackTag = $( '<div></div>' ); 1400 fallbackTag.addClass( 'fl-bg-video-fallback' ); 1401 fallbackTag.css( 'background-image', 'url(' + fallback + ')' ); 1402 wrap.append( fallbackTag ); 1403 vid.remove(); 1404 } 1405 }, 1406 1407 /** 1408 * Fires when the window is resized to resize 1409 * all video backgrounds. 1410 * 1411 * @since 1.1.4 1412 * @access private 1413 * @method _resizeBgVideos 1414 */ 1415 _resizeBgVideos: function() 1416 { 1417 $('.fl-bg-video').each( function() { 1418 1419 FLBuilderLayout._resizeBgVideo.apply( this ); 1420 1421 if ( $( this ).parent().find( 'img' ).length > 0 ) { 1422 $( this ).parent().imagesLoaded( $.proxy( FLBuilderLayout._resizeBgVideo, this ) ); 1423 } 1424 } ); 1425 }, 1426 1427 /** 1428 * Fires when the window is resized to resize 1429 * a single video background. 1430 * 1431 * @since 1.1.4 1432 * @access private 1433 * @method _resizeBgVideo 1434 */ 1435 _resizeBgVideo: function() 1436 { 1437 if ( 0 === $( this ).find( 'video' ).length && 0 === $( this ).find( 'iframe' ).length ) { 1438 return; 1439 } 1440 1441 var wrap = $(this), 1442 wrapHeight = wrap.outerHeight(), 1443 wrapWidth = wrap.outerWidth(), 1444 vid = wrap.find('video'), 1445 vidHeight = wrap.data('height'), 1446 vidWidth = wrap.data('width'), 1447 newWidth = wrapWidth, 1448 newHeight = Math.round(vidHeight * wrapWidth/vidWidth), 1449 newLeft = 0, 1450 newTop = 0, 1451 iframe = wrap.find('iframe'); 1452 1453 if ( vid.length ) { 1454 if(vidHeight === '' || typeof vidHeight === 'undefined' || vidWidth === '' || typeof vidWidth === 'undefined') { 1455 vid.css({ 1456 'left' : '0px', 1457 'top' : '0px', 1458 'width' : newWidth + 'px' 1459 }); 1460 1461 // Try to set the actual video dimension on 'loadedmetadata' when using URL as video source 1462 vid.on('loadedmetadata', FLBuilderLayout._resizeOnLoadedMeta); 1463 1464 } 1465 else { 1466 1467 if(newHeight < wrapHeight) { 1468 newHeight = wrapHeight; 1469 newWidth = Math.round(vidWidth * wrapHeight/vidHeight); 1470 newLeft = -((newWidth - wrapWidth)/2); 1471 } 1472 else { 1473 newTop = -((newHeight - wrapHeight)/2); 1474 } 1475 1476 vid.css({ 1477 'left' : newLeft + 'px', 1478 'top' : newTop + 'px', 1479 'height' : newHeight + 'px', 1480 'width' : newWidth + 'px' 1481 }); 1482 } 1483 } 1484 else if ( iframe.length ) { 1485 1486 // Resize Youtube video player within iframe tag 1487 if ( typeof wrap.data('youtube') !== 'undefined' ) { 1488 FLBuilderLayout._resizeYoutubeBgVideo.apply(this); 1489 } 1490 } 1491 }, 1492 1493 /** 1494 * Fires when video meta has been loaded. 1495 * This will be Triggered when width/height attributes were not specified during video background resizing. 1496 * 1497 * @since 1.8.5 1498 * @access private 1499 * @method _resizeOnLoadedMeta 1500 */ 1501 _resizeOnLoadedMeta: function(){ 1502 var video = $(this), 1503 wrapHeight = video.parent().outerHeight(), 1504 wrapWidth = video.parent().outerWidth(), 1505 vidWidth = video[0].videoWidth, 1506 vidHeight = video[0].videoHeight, 1507 newHeight = Math.round(vidHeight * wrapWidth/vidWidth), 1508 newWidth = wrapWidth, 1509 newLeft = 0, 1510 newTop = 0; 1511 1512 if(newHeight < wrapHeight) { 1513 newHeight = wrapHeight; 1514 newWidth = Math.round(vidWidth * wrapHeight/vidHeight); 1515 newLeft = -((newWidth - wrapWidth)/2); 1516 } 1517 else { 1518 newTop = -((newHeight - wrapHeight)/2); 1519 } 1520 1521 video.parent().data('width', vidWidth); 1522 video.parent().data('height', vidHeight); 1523 1524 video.css({ 1525 'left' : newLeft + 'px', 1526 'top' : newTop + 'px', 1527 'width' : newWidth + 'px', 1528 'height' : newHeight + 'px' 1529 }); 1530 }, 1531 1532 /** 1533 * Fires when the window is resized to resize 1534 * a single Youtube video background. 1535 * 1536 * @since 1.9 1537 * @access private 1538 * @method _resizeYoutubeBgVideo 1539 */ 1540 _resizeYoutubeBgVideo: function() 1541 { 1542 var wrap = $(this), 1543 wrapWidth = wrap.outerWidth(), 1544 wrapHeight = wrap.outerHeight(), 1545 player = wrap.data('YTPlayer'), 1546 video = player ? player.getIframe() : null, 1547 aspectRatioSetting = '16:9', // Medium 1548 aspectRatioArray = aspectRatioSetting.split( ':' ),
1549 aspectRatio = aspectRatioArray[0] / aspectRatioArray[1], 1550 ratioWidth = wrapWidth / aspectRatio, 1551 ratioHeight = wrapHeight * aspectRatio, 1552 isWidthFixed = wrapWidth / wrapHeight > aspectRatio, 1553 width = isWidthFixed ? wrapWidth : ratioHeight, 1554 height = isWidthFixed ? ratioWidth : wrapHeight; 1555 1556 if ( video ) { 1557 $(video).width( width ).height( height ); 1558 } 1559 }, 1560 1561 /** 1562 * Initializes module animations. 1563 * 1564 * @since 1.1.9 1565 * @access private 1566 * @method _initModuleAnimations 1567 */ 1568 _initModuleAnimations: function() 1569 { 1570 if(typeof jQuery.fn.waypoint !== 'undefined') { 1571 $('.fl-animation').each( function() { 1572 var node = $( this ), 1573 nodeTop = node.offset().top, 1574 winHeight = $( window ).height(), 1575 bodyHeight = $( 'body' ).height(), 1576 waypoint = FLBuilderLayoutConfig.waypoint, 1577 offset = '80%'; 1578 1579 if ( typeof waypoint.offset !== undefined ) { 1580 offset = FLBuilderLayoutConfig.waypoint.offset + '%'; 1581 } 1582 1583 if ( bodyHeight - nodeTop < winHeight * 0.2 ) { 1584 offset = '100%'; 1585 } 1586 1587 node.waypoint({ 1588 offset: offset, 1589 handler: FLBuilderLayout._doModuleAnimation 1590 }); 1591 } ); 1592 } 1593 }, 1594 1595 /** 1596 * Runs a module animation. 1597 * 1598 * @since 1.1.9 1599 * @access private 1600 * @method _doModuleAnimation 1601 */ 1602 _doModuleAnimation: function() 1603 { 1604 var module = 'undefined' == typeof this.element ? $(this) : $(this.element), 1605 delay = parseFloat(module.data('animation-delay')), 1606 duration = parseFloat(module.data('animation-duration')); 1607 1608 if ( ! isNaN( duration ) ) { 1609 module.css( 'animation-duration', duration + 's' ); 1610 } 1611 1612 if(!isNaN(delay) && delay > 0) { 1613 setTimeout(function(){ 1614 module.addClass('fl-animated'); 1615 }, delay * 1000); 1616 } else { 1617 setTimeout(function(){ 1618 module.addClass('fl-animated'); 1619 }, 1); 1620 } 1621 }, 1622 1623 /** 1624 * Opens a tab or accordion item if the browser hash is set 1625 * to the ID of one on the page. 1626 * 1627 * @since 1.6.0 1628 * @access private 1629 * @method _initHash 1630 */ 1631 _initHash: function() 1632 { 1633 var hash = window.location.hash.replace( '#', '' ).split( '/' ).shift(), 1634 element = null, 1635 tabs = null, 1636 responsiveLabel = null, 1637 tabIndex = null, 1638 label = null; 1639 1640 if ( '' !== hash ) { 1641 1642 try { 1643 1644 element = $( '#' + hash ); 1645 1646 if ( element.length > 0 ) { 1647 1648 if ( element.hasClass( 'fl-accordion-item' ) ) { 1649 setTimeout( function() { 1650 element.find( '.fl-accordion-button' ).trigger( 'click' ); 1651 }, 100 ); 1652 } 1653 if ( element.hasClass( 'fl-tabs-panel' ) ) { 1654 1655 setTimeout( function() { 1656 1657 tabs = element.closest( '.fl-tabs' ); 1658 responsiveLabel = element.find( '.fl-tabs-panel-label' ); 1659 tabIndex = responsiveLabel.data( 'index' ); 1660 label = tabs.find( '.fl-tabs-labels .fl-tabs-label[data-index=' + tabIndex + ']' ); 1661 1662 if ( responsiveLabel.is( ':visible' ) ) { 1663 responsiveLabel.trigger( 'click' ); 1664 } 1665 else { 1666 label[0].click(); 1667 FLBuilderLayout._scrollToElement( element ); 1668 } 1669 1670 }, 100 ); 1671 } 1672 } 1673 } 1674 catch( e ) {} 1675 } 1676 }, 1677 1678 /** 1679 * Initializes all anchor links on the page for smooth scrolling. 1680 * 1681 * @since 1.4.9 1682 * @access private 1683 * @method _initAnchorLinks 1684 */ 1685 _initAnchorLinks: function() 1686 { 1687 $( 'a' ).each( FLBuilderLayout._initAnchorLink ); 1688 }, 1689 1690 /** 1691 * Initializes a single anchor link for smooth scrolling. 1692 * 1693 * @since 1.4.9 1694 * @access private 1695 * @method _initAnchorLink 1696 */ 1697 _initAnchorLink: function() 1698 { 1699 var link = $( this ), 1700 href = link.attr( 'href' ), 1701 loc = window.location, 1702 id = null, 1703 element = null; 1704 if ( 'undefined' != typeof href && href.indexOf( '#' ) > -1 && link.closest('svg').length < 1 ) { 1705 1706 if ( loc.pathname.replace( /^\//, '' ) == this.pathname.replace( /^\//, '' ) && loc.hostname == this.hostname ) { 1707 1708 try { 1709 1710 id = href.split( '#' ).pop(); 1711 // If there is no ID then we have nowhere to look 1712 // Fixes a quirk in jQuery and FireFox 1713 if( ! id ) { 1714 return; 1715 } 1716 element = $( '#' + id ); 1717 1718 if ( element.length > 0 ) { 1719 if ( link.hasClass( 'fl-scroll-link' ) || element.hasClass( 'fl-row' ) || element.hasClass( 'fl-col' ) || element.hasClass( 'fl-module' ) ) { 1720 $( link ).on( 'click', FLBuilderLayout._scrollToElementOnLinkClick ); 1721 } 1722 if ( element.hasClass( 'fl-accordion-item' ) ) { 1723 $( link ).on( 'click', FLBuilderLayout._scrollToAccordionOnLinkClick ); 1724 } 1725 if ( element.hasClass( 'fl-tabs-panel' ) ) { 1726 $( link ).on( 'click', FLBuilderLayout._scrollToTabOnLinkClick ); 1727 } 1728 } 1729 } 1730 catch( e ) {} 1731 } 1732 } 1733 }, 1734 1735 /** 1736 * Scrolls to an element when an anchor link is clicked. 1737 * 1738 * @since 1.4.9 1739 * @access private 1740 * @method _scrollToElementOnLinkClick 1741 * @param {Object} e An event object. 1742 * @param {Function} callback A function to call when the scroll is complete. 1743 */ 1744 _scrollToElementOnLinkClick: function( e, callback ) 1745 { 1746 var element = $( '#' + $( this ).attr( 'href' ).split( '#' ).pop() ); 1747 1748 FLBuilderLayout._scrollToElement( element, callback ); 1749 1750 e.preventDefault(); 1751 }, 1752 1753 /** 1754 * Scrolls to an element. 1755 * 1756 * @since 1.6.4.5 1757 * @access private 1758 * @method _scrollToElement 1759 * @param {Object} element The element to scroll to. 1760 * @param {Function} callback A function to call when the scroll is complete. 1761 */ 1762 _scrollToElement: function( element, callback ) 1763 { 1764 var config = FLBuilderLayoutConfig.anchorLinkAnimations, 1765 dest = 0, 1766 win = $( window ), 1767 doc = $( document ); 1768 1769 if ( element.length > 0 ) { 1770 1771 if ( element.offset().top > doc.height() - win.height() ) { 1772 dest = doc.height() - win.height(); 1773 } 1774 else { 1775 dest = element.offset().top - config.offset; 1776 } 1777 1778 $( 'html, body' ).animate( { scrollTop: dest }, config.duration, config.easing, function() { 1779 1780 if ( 'undefined' != typeof callback ) { 1781 callback(); 1782 } 1783 1784 if ( undefined != element.attr( 'id' ) ) { 1785 1786 if ( history.pushState ) { 1787 history.pushState( null, null, '#' + element.attr( 'id' ) ); 1788 } 1789 else { 1790 window.location.hash = element.attr( 'id' ); 1791 } 1792 } 1793 } ); 1794 } 1795 }, 1796 1797 /** 1798 * Scrolls to an accordion item when a link is clicked. 1799 * 1800 * @since 1.5.9 1801 * @access private 1802 * @method _scrollToAccordionOnLinkClick 1803 * @param {Object} e An event object. 1804 */ 1805 _scrollToAccordionOnLinkClick: function( e ) 1806 { 1807 var element = $( '#' + $( this ).attr( 'href' ).split( '#' ).pop() ); 1808 1809 if ( element.length > 0 ) { 1810 1811 var callback = function() { 1812 if ( element ) { 1813 element.find( '.fl-accordion-button' ).trigger( 'click' ); 1814 element = false;
1815 } 1816 }; 1817 1818 FLBuilderLayout._scrollToElementOnLinkClick.call( this, e, callback ); 1819 } 1820 }, 1821 1822 /** 1823 * Scrolls to a tab panel when a link is clicked. 1824 * 1825 * @since 1.5.9 1826 * @access private 1827 * @method _scrollToTabOnLinkClick 1828 * @param {Object} e An event object. 1829 */ 1830 _scrollToTabOnLinkClick: function( e ) 1831 { 1832 var element = $( '#' + $( this ).attr( 'href' ).split( '#' ).pop() ), 1833 tabs = null, 1834 label = null, 1835 responsiveLabel = null; 1836 1837 if ( element.length > 0 ) { 1838 1839 tabs = element.closest( '.fl-tabs' ); 1840 responsiveLabel = element.find( '.fl-tabs-panel-label' ); 1841 tabIndex = responsiveLabel.data( 'index' ); 1842 label = tabs.find( '.fl-tabs-labels .fl-tabs-label[data-index=' + tabIndex + ']' ); 1843 1844 if ( responsiveLabel.is( ':visible' ) ) { 1845 1846 var callback = function() { 1847 if ( element ) { 1848 responsiveLabel.trigger( 'click' ); 1849 element = false; 1850 } 1851 }; 1852 1853 FLBuilderLayout._scrollToElementOnLinkClick.call( this, e, callback ); 1854 } 1855 else { 1856 label[0].click(); 1857 FLBuilderLayout._scrollToElement( element ); 1858 } 1859 1860 e.preventDefault(); 1861 } 1862 }, 1863 1864 /** 1865 * Initializes all builder forms on a page. 1866 * 1867 * @since 1.5.4 1868 * @access private 1869 * @method _initForms 1870 */ 1871 _initForms: function() 1872 { 1873 if ( ! FLBuilderLayout._hasPlaceholderSupport ) { 1874 $( '.fl-form-field input' ).each( FLBuilderLayout._initFormFieldPlaceholderFallback ); 1875 } 1876 1877 $( '.fl-form-field input' ).on( 'focus', FLBuilderLayout._clearFormFieldError ); 1878 }, 1879 1880 /** 1881 * Checks to see if the current device has HTML5 1882 * placeholder support. 1883 * 1884 * @since 1.5.4 1885 * @access private 1886 * @method _hasPlaceholderSupport 1887 * @return {Boolean} 1888 */ 1889 _hasPlaceholderSupport: function() 1890 { 1891 var input = document.createElement( 'input' ); 1892 1893 return 'undefined' != input.placeholder; 1894 }, 1895 1896 /** 1897 * Initializes the fallback for when placeholders aren't supported. 1898 * 1899 * @since 1.5.4 1900 * @access private 1901 * @method _initFormFieldPlaceholderFallback 1902 */ 1903 _initFormFieldPlaceholderFallback: function() 1904 { 1905 var field = $( this ), 1906 val = field.val(), 1907 placeholder = field.attr( 'placeholder' ); 1908 1909 if ( 'undefined' != placeholder && '' === val ) { 1910 field.val( placeholder ); 1911 field.on( 'focus', FLBuilderLayout._hideFormFieldPlaceholderFallback ); 1912 field.on( 'blur', FLBuilderLayout._showFormFieldPlaceholderFallback ); 1913 } 1914 }, 1915 1916 /** 1917 * Hides a fallback placeholder on focus. 1918 * 1919 * @since 1.5.4 1920 * @access private 1921 * @method _hideFormFieldPlaceholderFallback 1922 */ 1923 _hideFormFieldPlaceholderFallback: function() 1924 { 1925 var field = $( this ), 1926 val = field.val(), 1927 placeholder = field.attr( 'placeholder' ); 1928 1929 if ( val == placeholder ) { 1930 field.val( '' ); 1931 } 1932 }, 1933 1934 /** 1935 * Shows a fallback placeholder on blur. 1936 * 1937 * @since 1.5.4 1938 * @access private 1939 * @method _showFormFieldPlaceholderFallback 1940 */ 1941 _showFormFieldPlaceholderFallback: function() 1942 { 1943 var field = $( this ), 1944 val = field.val(), 1945 placeholder = field.attr( 'placeholder' ); 1946 1947 if ( '' === val ) { 1948 field.val( placeholder ); 1949 } 1950 }, 1951 1952 /** 1953 * Clears a form field error message. 1954 * 1955 * @since 1.5.4 1956 * @access private 1957 * @method _clearFormFieldError 1958 */ 1959 _clearFormFieldError: function() 1960 { 1961 var field = $( this ); 1962 1963 field.removeClass( 'fl-form-error' ); 1964 field.siblings( '.fl-form-error-message' ).hide(); 1965 } 1966 }; 1967 1968 /* Initializes the builder layout. */ 1969 $(function(){ 1970 FLBuilderLayout.init(); 1971 }); 1972 1973})(jQuery); 1974 1975/* Start Global JS */ 1976 1977/* End Global JS */ 1978 1979 1980(function($) { 1981 1982 PPAdvancedTabs = function( settings ) 1983 { 1984 this.settings = settings; 1985 this.nodeClass = '.fl-node-' + settings.id; 1986 this._init(); 1987 }; 1988 1989 PPAdvancedTabs.prototype = { 1990 1991 settings : {}, 1992 nodeClass : '', 1993 1994 _init: function() 1995 { 1996 var win = $(window); 1997 1998 $(this.nodeClass + ' .pp-tabs-labels .pp-tabs-label').click($.proxy(this._labelClick, this)); 1999 $(this.nodeClass + ' .pp-tabs-panels .pp-tabs-label').click($.proxy(this._responsiveLabelClick, this)); 2000 2001 this._responsiveCollapsed(); 2002
2003 if($(this.nodeClass + ' .pp-tabs-vertical').length > 0) { 2004 this._resize(); 2005 win.off('resize' + this.nodeClass); 2006 win.on('resize' + this.nodeClass, $.proxy(this._resize, this)); 2007 } 2008 2009 this._hashChange(); 2010 2011 $(window).on('hashchange', $.proxy( this._hashChange, this )); 2012 //$(window).on('resize', $.proxy( this._responsiveCollapsed, this )); 2013 }, 2014 2015 _hashChange: function() 2016 { 2017 if( location.hash && $(location.hash).length > 0 ) { 2018 var element = $(location.hash + '.pp-tabs-label'); 2019 if ( element && element.length > 0 ) { 2020 var header = $('.fl-theme-builder-header-sticky'); 2021 var offset = header.length > 0 ? header.height() + 32 : 120; 2022 location.href = '#'; 2023 $('html, body').animate({ 2024 scrollTop: element.parents('.pp-tabs').offset().top - offset 2025 }, 50, function() { 2026 if ( ! element.hasClass('pp-tab-active') ) { 2027 element.trigger('click'); 2028 } 2029 }); 2030 } 2031 } 2032 }, 2033 2034 _labelClick: function(e) 2035 { 2036 var label = $(e.target).closest('.pp-tabs-label'), 2037 index = label.data('index'), 2038 wrap = label.closest('.pp-tabs'), 2039 allIcons = wrap.find('.pp-tabs-label .fa'), 2040 icon = wrap.find('.pp-tabs-label[data-index="' + index + '"] .fa'); 2041 2042 // Toggle the responsive icons. 2043 //allIcons.addClass('fa-plus'); 2044 //icon.removeClass('fa-plus'); 2045 2046 if ( wrap.hasClass('pp-tabs-vertical') ) { 2047 var header = $('.fl-theme-builder-header-sticky'); 2048 var offset = header.length > 0 ? header.height() + 32 : 120; 2049 $('html, body').animate({ 2050 scrollTop: wrap.offset().top - offset 2051 }, 500 ); 2052 } 2053 2054 // Toggle the tabs. 2055 wrap.find('.pp-tabs-labels:first > .pp-tab-active').removeClass('pp-tab-active'); 2056 wrap.find('.pp-tabs-panels:first > .pp-tabs-panel > .pp-tab-active').removeClass('pp-tab-active'); 2057 wrap.find('.pp-tabs-panels:first > .pp-tabs-panel > .pp-tabs-label').removeClass('pp-tab-active'); 2058 2059 wrap.find('.pp-tabs-labels:first > .pp-tabs-label[data-index="' + index + '"]').addClass('pp-tab-active'); 2060 wrap.find('.pp-tabs-panels:first > .pp-tabs-panel > .pp-tabs-panel-content[data-index="' + index + '"]').addClass('pp-tab-active'); 2061 wrap.find('.pp-tabs-panels:first > .pp-tabs-panel > .pp-tabs-label[data-index="' + index + '"]').addClass('pp-tab-active'); 2062 2063 // Gallery module support. 2064 FLBuilderLayout.refreshGalleries( wrap.find('.pp-tabs-panel-content[data-index="' + index + '"]') ); 2065 2066 // Content Grid module support. 2067 if ( 'undefined' !== typeof $.fn.isotope ) { 2068 wrap.find('.pp-tabs-panel-content[data-index="' + index + '"] .pp-content-post-grid').isotope('layout'); 2069 this._gridLayoutMatchHeight(); 2070 } 2071 2072 $(document).trigger('pp-tabs-switched', [ wrap.find( '.pp-tabs-panel-content[data-index="' + index + '"]' ) ]); 2073 }, 2074 2075 _responsiveLabelClick: function(e) 2076 { 2077 var label = $(e.target).closest('.pp-tabs-label'), 2078 wrap = label.closest('.pp-tabs'), 2079 index = label.data('index'), 2080 content = label.siblings('.pp-tabs-panel-content'), 2081 activeContent = wrap.find('.pp-tabs-panel-content.pp-tab-active'), 2082 activeIndex = activeContent.data('index'), 2083 allIcons = wrap.find('.pp-tabs-label .fa'), 2084 icon = label.find('.fa'); 2085 2086 // Should we proceed? 2087 if(index == activeIndex) { 2088 activeContent.slideUp('normal'); 2089 activeContent.removeClass('pp-tab-active'); 2090 $(this.nodeClass + ' .pp-tabs-panels .pp-tabs-label').removeClass('pp-tab-active'); 2091 wrap.removeClass('pp-tabs-animation'); 2092 return; 2093 } 2094 if(wrap.hasClass('pp-tabs-animation')) { 2095 return; 2096 } 2097 2098 // Toggle the icons. 2099 //allIcons.addClass('fa-plus'); 2100 //icon.removeClass('fa-plus'); 2101 2102 // Run the animations. 2103 wrap.addClass('pp-tabs-animation'); 2104 activeContent.slideUp('normal'); 2105 2106 2107 content.slideDown('normal', function(){ 2108 2109 wrap.find('.pp-tab-active').removeClass('pp-tab-active'); 2110 wrap.find('.pp-tabs-label[data-index="' + index + '"]').addClass('pp-tab-active'); 2111 content.addClass('pp-tab-active'); 2112 wrap.removeClass('pp-tabs-animation'); 2113 2114 // Gallery module support. 2115 FLBuilderLayout.refreshGalleries( content ); 2116 2117 // Content Grid module support. 2118 if ( 'undefined' !== typeof $.fn.isotope ) { 2119 content.find('.pp-content-post-grid').isotope('layout'); 2120 } 2121 2122 if(label.offset().top < $(window).scrollTop() + 100) { 2123 $('html, body').animate({ scrollTop: label.offset().top - 100 }, 500, 'swing'); 2124 } 2125 2126 $(document).trigger('pp-tabs-switched', [ content ]); 2127 }); 2128 }, 2129 2130 _resize: function() 2131 {
2132 $(this.nodeClass + ' .pp-tabs-vertical').each($.proxy(this._resizeVertical, this)); 2133 }, 2134 2135 _resizeVertical: function(e) 2136 { 2137 var wrap = $(this.nodeClass + ' .pp-tabs-vertical'), 2138 labels = wrap.find('.pp-tabs-labels'), 2139 panels = wrap.find('.pp-tabs-panels'); 2140 2141 panels.css('min-height', labels.height() + 'px'); 2142 }, 2143 2144 _gridLayoutMatchHeight: function() 2145 { 2146 var highestBox = 0; 2147 var contentHeight = 0; 2148 2149 $(this.nodeClass).find('.pp-equal-height .pp-content-post').css('height', '').each(function(){ 2150 2151 if($(this).height() > highestBox) { 2152 highestBox = $(this).height(); 2153 contentHeight = $(this).find('.pp-content-post-data').outerHeight(); 2154 } 2155 }); 2156 2157 $(this.nodeClass).find('.pp-equal-height .pp-content-post').height(highestBox); 2158 //$(this.postClass).find('.pp-content-post-data').css('min-height', contentHeight + 'px').addClass('pp-content-relative'); 2159 }, 2160 2161 _responsiveCollapsed: function() 2162 { 2163 if ( $(window).innerWidth() < 769 ) { 2164 if ( this.settings.responsiveClosed ) { 2165 $(this.nodeClass + ' .pp-tabs-panels .pp-tabs-label.pp-tab-active').trigger('click'); 2166 } 2167 $(this.nodeClass + ' .pp-tabs-panels').css('visibility', 'visible'); 2168 } 2169 } 2170 }; 2171 2172})(jQuery); 2173;(function($) { 2174 2175 $(function() { 2176 2177 new PPAdvancedTabs({ 2178 id: '5e9f870d3a019', 2179 responsiveClosed: false, 2180 }); 2181 2182 $('.fl-node-5e9f870d3a019 .pp-tabs-style-2 .pp-tabs-label.pp-tab-active').prev().addClass('pp-no-border'); 2183 $('.fl-node-5e9f870d3a019 .pp-tabs-style-2 .pp-tabs-label').on('click', function() { 2184 $('.fl-node-5e9f870d3a019 .pp-tabs-style-2 .pp-tabs-label').removeClass('pp-no-border'); 2185 $('.fl-node-5e9f870d3a019 .pp-tabs-style-2 .pp-tabs-label.pp-tab-active').prev().addClass('pp-no-border'); 2186 }); 2187 2188 if($(window).width() > 768) { 2189 $('.fl-node-5e9f870d3a019 .pp-tabs-vertical .pp-tabs-panel-content').css('min-height', $('.fl-node-5e9f870d3a019 .pp-tabs-vertical .pp-tabs-labels').outerHeight() + 'px'); 2190 } 2191 2192 if( $(window).width() <= 768 ) { 2193 $('.fl-node-5e9f870d3a019 .pp-tabs-label .pp-tab-close').on('click', function() { 2194 $(this).parents('.pp-tabs-label').removeClass('pp-tab-active'); 2195 }); 2196 } 2197 }); 2198 2199})(jQuery); 2200 2201/** 2202 * This file should contain frontend logic for 2203 * all module instances. 2204 *//** 2205 * This file should contain frontend JavaScript that 2206 * will be applied to individual module instances. 2207 * 2208 * $module An instance of your module class. 2209 * $id The module's ID. 2210 * $settings The module's settings. 2211 */ 2212jQuery(function($) { 2213 2214 $(function() { 2215 $( '.fl-node-5e9f8b713f8b0 .fl-photo-img' ) 2216 .on( 'mouseenter', function( e ) { 2217 $( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' ); 2218 } ) 2219 .on( 'mouseleave', function( e ){ 2220 $( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null ); 2221 } ); 2222 }); 2223 }); 2224jQuery(function($) { 2225 2226 $(function() { 2227 $( '.fl-node-5e9f8c50d57d7 .fl-photo-img' ) 2228 .on( 'mouseenter', function( e ) { 2229 $( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' ); 2230 } ) 2231 .on( 'mouseleave', function( e ){ 2232 $( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null ); 2233 } ); 2234 }); 2235 }); 2236jQuery(function($) { 2237 2238 $(function() { 2239 $( '.fl-node-5e9f923c56798 .fl-photo-img' ) 2240 .on( 'mouseenter', function( e ) { 2241 $( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' ); 2242 } ) 2243 .on( 'mouseleave', function( e ){ 2244 $( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null ); 2245 } ); 2246 }); 2247 }); 2248(function($) { 2249 2250 $(".fl-node-5e9f925080ced table.pp-table-content tbody tr:nth-child(odd)").addClass("odd"); 2251 $(".fl-node-5e9f925080ced table.pp-table-content tbody tr:nth-child(even)").addClass("even"); 2252 2253 $( document ).trigger( "enhance.tablesaw" ); 2254 2255 $(document).on('pp-tabs-switched', function(e, selector) { 2256 if ( selector.find('.pp-table-content').length > 0 ) { 2257 $( window ).trigger( "resize" ); 2258 } 2259 }); 2260 2261})(jQuery); 2262jQuery(function($) { 2263 2264 $(function() { 2265 $( '.fl-node-5e9f91bf4e618 .fl-photo-img' ) 2266 .on( 'mouseenter', function( e ) { 2267 $( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' ); 2268 } ) 2269 .on( 'mouseleave', function( e ){ 2270 $( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null ); 2271 } ); 2272 }); 2273 }); 2274jQuery(function($) { 2275 2276 $(function() { 2277 $( '.fl-node-5e9f938762f9c .fl-photo-img' ) 2278 .on( 'mouseenter', function( e ) { 2279 $( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' ); 2280 } ) 2281 .on( 'mouseleave', function( e ){ 2282 $( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null ); 2283 } ); 2284 }); 2285 }); 2286jQuery(function($) { 2287 2288 $(function() { 2289 $( '.fl-node-5e9f99734b6c7 .fl-photo-img' ) 2290 .on( 'mouseenter', function( e ) { 2291 $( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' ); 2292 } ) 2293 .on( 'mouseleave', function( e ){ 2294 $( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null ); 2295 } ); 2296 }); 2297 }); 2298(function($) { 2299 2300 $(".fl-node-5e9f9978865a5 table.pp-table-content tbody tr:nth-child(odd)").addClass("odd"); 2301 $(".fl-node-5e9f9978865a5 table.pp-table-content tbody tr:nth-child(even)").addClass("even"); 2302 2303 $( document ).trigger( "enhance.tablesaw" ); 2304 2305 $(document).on('pp-tabs-switched', function(e, selector) { 2306 if ( selector.find('.pp-table-content').length > 0 ) { 2307 $( window ).trigger( "resize" ); 2308 } 2309 }); 2310 2311})(jQuery); 2312jQuery(function($) { 2313 2314 $(function() { 2315 $( '.fl-node-5e9f9964943c9 .fl-photo-img' ) 2316 .on( 'mouseenter', function( e ) { 2317 $( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' ); 2318 } ) 2319 .on( 'mouseleave', function( e ){ 2320 $( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null ); 2321 } ); 2322 }); 2323 }); 2324jQuery(function($) { 2325 2326 $(function() { 2327 $( '.fl-node-5e9f992b2a4d0 .fl-photo-img' ) 2328 .on( 'mouseenter', function( e ) { 2329 $( this ).data( 'title', $( this ).attr( 'title' ) ).removeAttr( 'title' ); 2330 } ) 2331 .on( 'mouseleave', function( e ){ 2332 $( this ).attr( 'title', $( this ).data( 'title' ) ).data( 'title', null ); 2333 } ); 2334 }); 2335 }); 2336 2337; (function ($) { 2338 2339 PPCategoryGridSlider = function (settings) { 2340 this.id = settings.id; 2341 this.nodeClass = '.fl-node-' + settings.id; 2342 this.wrapperClass = this.nodeClass + ' .swiper-wrapper'; 2343 this.elements = ''; 2344 this.slidesPerView = settings.slidesPerView; 2345 this.slidesToScroll = settings.slidesToScroll; 2346 this.settings = settings; 2347 this.swipers = {}; 2348 2349 if (typeof Swiper === 'undefined') { 2350 $(window).load($.proxy(function () { 2351 if (typeof Swiper === 'undefined') { 2352 return; 2353 } else { 2354 this._init(); 2355 } 2356 }, this)); 2357 } else { 2358 this._init(); 2359 } 2360 }; 2361 2362 PPCategoryGridSlider.prototype = { 2363 id: '', 2364 nodeClass: '', 2365 wrapperClass: '', 2366 elements: '', 2367 slidesPerView: {}, 2368 slidesToScroll: {}, 2369 settings: {}, 2370 swipers: {}, 2371 2372 _init: function () { 2373 this.elements = { 2374 mainSwiper: this.nodeClass + ' .swiper-container' 2375 }; 2376 2377 this.elements.swiperSlide = $(this.elements.mainSwiper).find('.swiper-slide'); 2378 2379 2380 if (1 >= this._getSlidesCount()) { 2381 return; 2382 } 2383 2384 var swiperOptions = this._getSwiperOptions(); 2385 2386 this.swipers.main = new Swiper(this.elements.mainSwiper, swiperOptions.main); 2387 }, 2388 2389 _getEffect: function () { 2390 return this.settings.effect; 2391 }, 2392 2393 _getSlidesCount: function () { 2394 return this.elements.swiperSlide.length; 2395 }, 2396 2397 _getInitialSlide: function () { 2398 return this.settings.initialSlide; 2399 }, 2400 2401 _getSpaceBetween: function () { 2402 var space = this.settings.spaceBetween.desktop, 2403 space = parseInt(space); 2404 2405 if (isNaN(space)) { 2406 space = 20; 2407 } 2408 2409 return space; 2410 }, 2411 2412 _getSpaceBetweenTablet: function () { 2413 var space = this.settings.spaceBetween.tablet, 2414 space = parseInt(space); 2415 2416 if (isNaN(space)) { 2417 space = this._getSpaceBetween(); 2418 } 2419 2420 return space; 2421 }, 2422 2423 _getSpaceBetweenMobile: function () { 2424 var space = this.settings.spaceBetween.mobile, 2425 space = parseInt(space); 2426 2427 if (isNaN(space)) { 2428 space = this._getSpaceBetweenTablet(); 2429 } 2430 2431 return space; 2432 }, 2433 2434 _getSlidesPerView: function () { 2435 if (this._isSlideshow()) { 2436 return 1; 2437 } 2438 2439 var slidesPerView = this.slidesPerView.desktop; 2440 2441 return Math.min(this._getSlidesCount(), +slidesPerView); 2442 }, 2443 2444 _getSlidesPerViewTablet: function () { 2445 if (this._isSlideshow()) { 2446 return 1; 2447 } 2448 2449 var slidesPerView = this.slidesPerView.tablet; 2450 2451 if (slidesPerView === '' || slidesPerView === 0) { 2452 slidesPerView = this.slidesPerView.desktop 2453 } 2454 2455 if (!slidesPerView && 'coverflow' === this.settings.type) { 2456 return Math.min(this._getSlidesCount(), 3); 2457 } 2458 2459 return Math.min(this._getSlidesCount(), +slidesPerView); 2460 }, 2461 2462 _getSlidesPerViewMobile: function () { 2463 if (this._isSlideshow()) { 2464 return 1; 2465 } 2466 2467 var slidesPerView = this.slidesPerView.mobile; 2468 2469 if (slidesPerView === '' || slidesPerView === 0) { 2470 slidesPerView = this._getSlidesPerViewTablet(); 2471 } 2472 2473 if (!slidesPerView && 'coverflow' === this.settings.type) { 2474 return Math.min(this._getSlidesCount(), 3); 2475 } 2476 2477 return Math.min(this._getSlidesCount(), +slidesPerView); 2478 }, 2479 2480 _getSlidesToScroll: function (device) { 2481 if (!this._isSlideshow() && 'slide' === this._getEffect()) { 2482 var slides = this.slidesToScroll[device]; 2483 2484 return Math.min(this._getSlidesCount(), +slides || 1); 2485 } 2486 2487 return 1; 2488 }, 2489 2490 _getSlidesToScrollDesktop: function () { 2491 return this._getSlidesToScroll('desktop'); 2492 }, 2493 2494 _getSlidesToScrollTablet: function () { 2495 return this._getSlidesToScroll('tablet'); 2496 }, 2497 2498 _getSlidesToScrollMobile: function () { 2499 return this._getSlidesToScroll('mobile'); 2500 }, 2501 2502 _getSwiperOptions: function () { 2503 2504 var medium_breakpoint = this.settings.breakpoint.medium, 2505 responsive_breakpoint = this.settings.breakpoint.responsive; 2506 2507 var options = { 2508 navigation: { 2509 prevEl: '.pp-categories-container .swiper-button-prev', 2510 nextEl: '.pp-categories-container .swiper-button-next' 2511 }, 2512 pagination: { 2513 el: '.pp-categories-container .swiper-pagination', 2514 type: this.settings.pagination, 2515 clickable: true 2516 }, 2517 grabCursor: true, 2518 effect: this._getEffect(), 2519 initialSlide: this._getInitialSlide(), 2520 slidesPerView: this._getSlidesPerView(), 2521 slidesPerGroup: this._getSlidesToScrollDesktop(), 2522 spaceBetween: this._getSpaceBetween(), 2523 loop: true, 2524 loopedSlides: this._getSlidesCount(), 2525 speed: this.settings.speed, 2526 breakpoints: {}, 2527 initialSlide : 0 2528 }; 2529 2530 if (!this.settings.isBuilderActive && this.settings.autoplay_speed !== false) { 2531 options.autoplay = { 2532 delay: this.settings.autoplay_speed, 2533 disableOnInteraction: this.settings.pause_on_interaction 2534 }; 2535 } 2536 2537 if ('cube' !== this._getEffect()) { 2538 options.breakpoints[medium_breakpoint] = { 2539 slidesPerView: this._getSlidesPerViewTablet(), 2540 slidesPerGroup: this._getSlidesToScrollTablet(), 2541 spaceBetween: this._getSpaceBetweenTablet() 2542 }; 2543 options.breakpoints[responsive_breakpoint] = { 2544 slidesPerView: this._getSlidesPerViewMobile(), 2545 slidesPerGroup: this._getSlidesToScrollMobile(), 2546 spaceBetween: this._getSpaceBetweenMobile() 2547 }; 2548 } 2549 2550 if ( 'coverflow' === this.settings.type ) { 2551 options.effect = 'coverflow'; 2552 options.slidesPerView = 3; 2553 options.slidesPerGroup = 1; 2554 options.breakpoints[medium_breakpoint] = { 2555 slidesPerView: 1, 2556 slidesPerGroup: 1, 2557 }; 2558 options.breakpoints[responsive_breakpoint] = { 2559 slidesPerView: 1, 2560 slidesPerGroup: 1, 2561 }; 2562 } 2563 2564 if (this._isSlideshow()) { 2565 options.slidesPerView = 1; 2566 2567 delete options.pagination; 2568 delete options.breakpoints; 2569 } 2570 2571 return { 2572 main: options, 2573 }; 2574 }, 2575 2576 _isSlideshow: function () { 2577 return 'slideshow' === this.settings.type; 2578 }, 2579 2580 _onElementChange: function (property) { 2581 if (0 === property.indexOf('width')) { 2582 this.swipers.main.onResize(); 2583 } 2584 2585 if (0 === property.indexOf('spaceBetween')) { 2586 this._updateSpaceBetween(this.swipers.main, property); 2587 } 2588 }, 2589 2590 _updateSpaceBetween: function (swiper, property) { 2591 var newSpaceBw = this._getSpaceBetween(), 2592 deviceMatch = property.match('space_between_(.*)'); 2593 2594 if (deviceMatch) { 2595 var breakpoints = { 2596 tablet: this.settings.breakpoint.medium, 2597 mobile: this.settings.breakpoint.responsive 2598 }; 2599 2600 swiper.params.breakpoints[breakpoints[deviceMatch[1]]].spaceBetween = newSpaceBw; 2601 } else { 2602 swiper.originalParams.spaceBetween = newSpaceBw; 2603 } 2604 2605 swiper.params.spaceBetween = newSpaceBw; 2606 2607 swiper.onResize(); 2608 }, 2609 }; 2610 2611})(jQuery);var carousel_5eab8dd055481 = ''; 2612;(function($) { 2613 2614 2615 var settings = { 2616 id: '5eab8dd055481', 2617 type: 'carousel', 2618 initialSlide: 0, 2619 slidesPerView: { 2620 desktop: 3, 2621 tablet: 3, 2622 mobile: 3, 2623 }, 2624 slidesToScroll: { 2625 desktop: 1, 2626 tablet: 1, 2627 mobile: 1, 2628 }, 2629 slideshow_slidesPerView: { 2630 desktop: '', 2631 tablet: '', 2632 mobile: '', 2633 }, 2634 spaceBetween: { 2635 desktop: '10', 2636 tablet: '', 2637 mobile: '', 2638 }, 2639 isBuilderActive: false, 2640 pagination: 'bullets', 2641 autoplay_speed: 5000, 2642 pause_on_interaction: true, 2643 effect: 'slide', 2644 speed: 1000, 2645 breakpoint: { 2646 medium: 992, 2647 responsive: 768 }, 2648 }; 2649 2650 2651 2652})(jQuery); 2653var carousel_5eab8dde65536 = ''; 2654;(function($) { 2655 2656 2657 var settings = { 2658 id: '5eab8dde65536', 2659 type: 'carousel', 2660 initialSlide: 0, 2661 slidesPerView: { 2662 desktop: 3, 2663 tablet: 3, 2664 mobile: 3, 2665 }, 2666 slidesToScroll: { 2667 desktop: 1, 2668 tablet: 1, 2669 mobile: 1, 2670 }, 2671 slideshow_slidesPerView: { 2672 desktop: '', 2673 tablet: '', 2674 mobile: '', 2675 }, 2676 spaceBetween: { 2677 desktop: '10', 2678 tablet: '', 2679 mobile: '', 2680 }, 2681 isBuilderActive: false, 2682 pagination: 'bullets', 2683 autoplay_speed: 5000, 2684 pause_on_interaction: true, 2685 effect: 'slide', 2686 speed: 1000, 2687 breakpoint: { 2688 medium: 992, 2689 responsive: 768 }, 2690 }; 2691 2692 2693 2694})(jQuery); 2695/** 2696 * This file should contain frontend JavaScript that 2697 * will be applied to individual module instances. 2698 * 2699 * $module An instance of your module class. 2700 * $id The module's ID. 2701 * $settings The module's settings. 2702 */ 2703 2704/* Start Global Node Custom JS */ 2705 2706/* End Global Node Custom JS */ 2707 2708 2709/* Start Layout Custom JS */ 2710 2711/* End Layout Custom JS */ 2712 2713(function($) { 2714 2715 2716 // generating html structure 2717 var html = '<div class="bb-er-row">'; 2718 html += '<div class="bb-er-title-section">'; 2719 html += '<span class="bb-er-title">Show More</span>'; 2720 html += '</div>'; 2721 html += '</div>'; 2722 2723 // appending html structure on respective row 2724 $('.fl-row.fl-node-5eab902c646ae').prepend(html); 2725 2726 // after click on row 2727 $('.fl-node-5eab902c646ae .bb-er-row').click(function() { 2728 2729 // appear effect 2730 $('.fl-node-5eab902c646ae .fl-row-content-wrap').slideToggle(); 2731 2732 // toggle class 2733 $('.fl-node-5eab902c646ae .bb-er-row').toggleClass("bber-expanded"); 2734 2735 // toggle title 2736 ( $('.fl-node-5eab902c646ae .bb-er-title').text() == 'Show More' ) ? $('.fl-node-5eab902c646ae .bb-er-title').text('Show Less') : $('.fl-node-5eab902c646ae .bb-er-title').text('Show More'); 2737 2738 // toggle icon 2739 2740 // toggle background 2741 2742 // toggle image icon 2743 2744 }); 2745 2746})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.