1$(document).ready(function() { 2 // Default settings 3 const defaultSettings = { 4 currentSite: { 5 id: $('html').attr('data-site-id'), 6 }, 7 duration: { 8 default: 800, 9 fast: 300 10 }, 11 easing: { 12 default: 'easeOutQuint', 13 css: 'cubic-bezier(0.165, 0.840, 0.440, 1.000)' 14 }, 15 elements: { 16 document: $(document), 17 window: $(window), 18 $header: $('.h-header'), 19 $htmlBody: $('html, body'), 20 $body: $('body'), 21 icon: '.h-icon', 22 }, 23 status: { 24 alt: 'is-alt', 25 above: 'is-above', 26 active: 'is-active', 27 hover: 'is-hover', 28 disabled: 'is-disabled', 29 ommited: 'is-ommited', 30 initial: 'is-initial', 31 stuck: 'is-stuck', 32 pinned: 'is-pinned', 33 unpinned: 'is-unpinned', 34 visible: 'is-visible', 35 template: 'is-template', 36 loaded: 'is-loaded', 37 inverted: 'is-inverted', 38 }, 39 queries: { 40 xs: 479, 41 sm: 567, 42 md: 767, 43 lg: 1025, 44 xl: 1279, 45 xxl: 1369, 46 } 47 }; 48 49 const meta = { 50 update: function(meta) { 51 var self = this; 52 $('meta[name="description"]').attr("content", meta.seo_description); 53 $('meta[property="og\\:title"]').attr("content", meta.seo_title); 54 $('meta[property="og\\:image"]').attr("content", meta.seo_image); 55 $('meta[property="og\\:description"]').attr("content", meta.seo_description); 56 $('meta[property="og\\:url"]').attr("content", window.location.href); 57 $('title').text(meta.seo_title); 58 59 } 60 }; 61 62 const polyfill = { 63 ofi: function(element) { 64 objectFitImages(element); 65 } 66 }; 67 68 const resizerAnimationStopper = { 69 init: function() { 70 let resizeTimer; 71 window.addEventListener("resize", () => { 72 document.body.classList.add("resize-animation-stopper"); 73 clearTimeout(resizeTimer); 74 resizeTimer = setTimeout(() => { 75 document.body.classList.remove("resize-animation-stopper"); 76 }, 400); 77 }); 78 } 79 } 80 81 const header = { 82 elements: { 83 header: '.h-header', 84 cover: '.h-header-cover', 85 nav: { 86 container: '.h-header-nav', 87 toggle: '.h-header-nav-toggle', 88 } 89 }, 90 init: function() { 91 const self = this, 92 $header = $(self.elements.header), 93 $headerNavtoggle = $(self.elements.nav.toggle); 94 95 $headerNavtoggle.on('click.navToggle', function(){ 96 $header.toggleClass(defaultSettings.status.active); 97 $headerNavtoggle.toggleClass(defaultSettings.status.active); 98 return false; 99 }); 100 101 self.themeCheck($header); 102 }, 103 104 restart: function() { 105 const self = this, 106 $headerNavtoggle = $(self.elements.nav.toggle); 107 108 $headerNavtoggle.off('click.navToggle'); 109 defaultSettings.elements.window.off('scroll.scrollTheme'); 110 defaultSettings.elements.window.off('resize.resizeTheme') 111 self.init(); 112 }, 113 114 themeDisable: function(){ 115 const self = this, 116 $header = $(self.elements.header), 117 $headerNavtoggle = $(self.elements.nav.toggle); 118 119 $headerNavtoggle.off('click.navToggle'); 120 defaultSettings.elements.window.off('scroll.scrollTheme'); 121 defaultSettings.elements.window.off('resize.resizeTheme') 122 $header.removeClass(defaultSettings.status.alt); 123 }, 124 125 themeCheck: function($header){ 126 const self = this; 127 128 if ($(self.elements.cover).length) { 129 defaultSettings.elements.window.on('scroll.scrollTheme', function(){ 130 self.offsetCheck(); 131 }); 132 133 defaultSettings.elements.window.on('resize.resizeTheme', function(){ 134 self.offsetCheck(); 135 }).resize(); 136 } else { 137 $header.removeClass(defaultSettings.status.alt); 138 } 139 }, 140 141 offsetCheck: function() { 142 const self = this, 143 $header = $(self.elements.header), 144 $cover = $(self.elements.cover), 145 scrollOffset = $header.offset().top, 146 coverLimit = $cover.outerHeight() - $header.outerHeight(); 147 148 if (scrollOffset > coverLimit) { 149 $header.removeClass(defaultSettings.status.alt); 150 } else { 151 $header.addClass(defaultSettings.status.alt); 152 } 153 }, 154 155 close: function() { 156 var self = this, 157 $header = $(self.elements.header), 158 $headerNavtoggle = $(self.elements.nav.toggle); 159 160 $header.removeClass(defaultSettings.status.active); 161 $headerNavtoggle.removeClass(defaultSettings.status.active); 162 } 163 }; 164 165 const tools = { 166 slugify: function(text) { 167 return text.toLowerCase().replace(/[^\w ]+/g,'').replace(/ +/g,'-'); 168 } 169 }; 170 171 const sticky = { 172 elements: { 173 sticky: '.h-sticky', 174 parent: '.h-sticky-parent', 175 }, 176 init: function() { 177 var self = this; 178 179 if ($(self.elements.sticky).length) {
180 var $sticky = $(self.elements.sticky); 181 182 $sticky.css({ 183 'max-width': $sticky.outerWidth()+'px', 184 }); 185 186 pageSticky = new Sticky(self.elements.sticky,{ 187 'wrap': true, 188 'marginTop': defaultSettings.elements.$header.outerHeight() + 50, 189 'stickyContainer': self.elements.parent, 190 'stickyClass': defaultSettings.status.stuck, 191 }); 192 } 193 }, 194 update: function() { 195 pageSticky.update(); 196 }, 197 destroy: function() { 198 pageSticky.destroy(); 199 } 200 }; 201 202 // Video player (Plyr) 203 const video = { 204 elements: { 205 video: 'h-video', 206 afterLoading: 'plyr' 207 }, 208 init: function() { 209 210 const self = this, 211 $video = document.getElementsByClassName(self.elements.video); 212 213 if ($video !== null) { 214 let players = []; 215 for (let x = 0; x < $video.length; x++) { 216 players.push(new Plyr($video[x], { 217 controls: ['play-large','play','progress','current-time','volume'], 218 fullscreen: { iosNative: true }, 219 })); 220 } 221 } 222 }, 223 224 setOrder: function() { 225 const self = this, 226 $afterLoading = document.getElementsByClassName(self.elements.afterLoading); 227 228 //add ordering id for each player in page 229 if ($afterLoading !== null) { 230 for (let x = 0; x < $afterLoading.length; x++) { 231 $afterLoading[x].setAttribute('data-plyr-order-id', x); 232 } 233 } 234 } 235 }; 236 237 const onScreenElement = { 238 element: '.h-onscreen-element', 239 check: function($parent) { 240 241 const self = this, 242 $element = $parent.find(self.element); 243 if (!$element.visible(false, false, 'horizontal' )) { 244 $element.addClass(defaultSettings.status.inverted); 245 } else { 246 $element.removeClass(defaultSettings.status.inverted); 247 } 248 249 }, 250 remove: function($parent) { 251 const self = this, 252 $element = $parent.find(self.element); 253 $element.removeClass(defaultSettings.status.inverted); 254 } 255 }; 256 257 const filtering = { 258 elements: { 259 change: '.h-filtering-change', 260 container: '.h-filtering-container', 261 item: '.h-filtering-item', 262 }, 263 init: function() { 264 const self = this 265 $gridContainer = $(self.elements.container+'[data-filtering-slug="grid"]'), 266 $indexContainer = $(self.elements.container+'[data-filtering-slug="index"]'), 267 $change = $(self.elements.change); 268 $activeChange = $(self.elements.change+'.'+defaultSettings.status.active), 269 $gridContainerItems = $gridContainer.find(self.elements.item), 270 $indexContainerItems = $indexContainer.find(self.elements.item), 271 activeFilter = $activeChange.attr('data-filter'); 272 273 if ($gridContainer.length) { 274 const $grid = $gridContainer.filterizr({ 275 filter: activeFilter, 276 gridItemsSelector: self.elements.item, 277 layout: 'sameSize', 278 easing: defaultSettings.easing.css, 279 gutterPixels: 24, // Items spacing in pixels 280 filterOutCss: { // Filtering out animation 281 opacity: 0, 282 transform: 'scale(1)', 283 }, 284 filterInCss: { // Filtering in animation 285 opacity: 1, 286 transform: 'scale(1)' 287 }, 288 }); 289 setTimeout(function(){ 290 $gridContainer.filterizr('filter', activeFilter); 291 },500); 292 293 } 294 295 if ($indexContainer.length) { 296 const $index = $indexContainer.filterizr({ 297 filter: activeFilter, 298 gridItemsSelector: self.elements.item, 299 layout: 'vertical', 300 filterOutCss: { // Filtering out animation 301 opacity: 0, 302 transform: 'scale(1)' 303 }, 304 filterInCss: { // Filtering in animation 305 opacity: 1, 306 transform: 'scale(1)' 307 }, 308 callbacks: { 309 // @TODO: Optimize + avoid repetition 310 onInit: function() { 311 let ct = 0; 312 313 $indexContainerItems.removeClass('list-item--odd'); 314 315 $indexContainerItems.each(function(){ 316 const $this = $(this); 317 318 if (!$this.hasClass('filteredOut')) { 319 if(ct%2 == 0) { 320 $this.addClass('list-item--odd'); 321 } 322 ct++; 323 } 324 }); 325 }, 326 onFilteringEnd: function() { 327 let ct = 0; 328 329 $indexContainerItems.removeClass('list-item--odd'); 330 331 $indexContainerItems.each(function(){ 332 const $this = $(this); 333 334 if (!$this.hasClass('filteredOut')) { 335 if(ct%2 == 0) { 336 $this.addClass('list-item--odd'); 337 } 338 ct++; 339 } 340 }); 341 }, 342 } 343 }); 344 } 345 346 $change.on('click', function(e){ 347 const $this = $(this), 348 url = $this.attr('href'), 349 title = $this.text(); 350 351 $change.removeClass(defaultSettings.status.active); 352 $this.addClass(defaultSettings.status.active); 353 354 history.pushState({}, null, url); 355 // $('title').text(title); 356 357 e.preventDefault(); 358 }); 359 360 $gridContainerItems 361 .mouseenter(function(){ 362 const $this = $(this); 363 onScreenElement.check($this); 364 $this.addClass(defaultSettings.status.above); 365 }) 366 .mouseleave(function() { 367 const $this = $(this); 368 onScreenElement.remove($this); 369 $this.removeClass(defaultSettings.status.above); 370 }) 371 .mousemove(function(e){ 372 const $this = $(this), 373 $text = $this.find(onScreenElement.element), 374 offset = $this.offset(), 375 x = e.pageX- offset.left; 376 y = e.pageY- offset.top; 377 378 onScreenElement.check($this); 379 $text.css({ 380 'top': y+'px', 381 'left': x+'px', 382 }); 383 }); 384 385 }, 386 387 }; 388 389 const lazy = { 390 elements: { 391 lazy: 'h-lazy', 392 }, 393 init: function() { 394 const self = this; 395 396 let lazyLoadInstance = new LazyLoad({ 397 elements_selector: '.'+self.elements.lazy, 398 threshold: 100, 399 class_loaded: defaultSettings.status.loaded, 400 callback_loaded: function(el) { 401 polyfill.ofi(el); 402 $(el).parent().addClass(defaultSettings.status.loaded); 403 } 404 }); 405 } 406 }; 407 408 const toggleView = { 409 elements: { 410 trigger: '.h-toggleview-trigger', 411 container: '.h-toggleview-container', 412 }, 413 init: function() { 414 const self = this, 415 $trigger = $(self.elements.trigger); 416 417 if ($(self.elements.container).length) { 418 419 if (typeof Cookies.get('toggleview') !== 'undefined') { 420 const slug = Cookies.get('toggleview'); 421 422 $(self.elements.container+'[data-toggleview-slug="'+slug+'"]').addClass(defaultSettings.status.active); 423 } else { 424 const $first = $(self.elements.container+'[data-toggleview-slug="grid"]'), 425 slug = $first.attr('data-toggleview-slug'); 426 427 $first.addClass(defaultSettings.status.active); 428 429 Cookies.set('toggleview', slug, { 430 expires: 1/24/60, 431 sameSite: 'strict', 432 }); 433 } 434 435 $trigger.on('click', function(e){ 436 437 $(self.elements.container).toggleClass(defaultSettings.status.active); 438 439 const slug = $(self.elements.container+'.'+defaultSettings.status.active).attr('data-toggleview-slug'); 440 441 Cookies.set('toggleview', slug, { 442 expires: 1/24/60, 443 sameSite: 'strict', 444 }); 445 446 e.preventDefault(); 447 }); 448 } 449 } 450 }; 451 452 const maps = { 453 elements: { 454 container: '.h-map', 455 }, 456 init: function() { 457 var self = this; 458 459 if (typeof global !== 'undefined' && typeof global.key !== 'undefined') { 460 window.googleMapsLoaded = function() { 461 self.generate(); 462 }
463 $.getScript('//maps.googleapis.com/maps/api/js?key='+global.key+'&callback=googleMapsLoaded'); 464 } 465 }, 466 generate: function() { 467 var self = this, 468 $container = $(self.elements.container); 469 470 if (typeof google === 'undefined') { 471 self.init(); 472 return false; 473 } 474 475 if ($container.length) { 476 $container.each(function(){ 477 var $this = $(this), 478 lat = $this.attr('data-map-lat'), 479 lng = $this.attr('data-map-lng'), 480 markerLabel = $this.attr('data-map-label') ? $this.attr('data-map-label') : ''; 481 //markerIcon = $this.attr('data-map-icon') ? global.images_url+$this.attr('data-map-icon') : ''; 482 483 const styles = [ 484 { 485 "featureType": "water", 486 "elementType": "geometry.fill", 487 "stylers": [ 488 { 489 "color": "#d3d3d3" 490 } 491 ] 492 }, 493 { 494 "featureType": "transit", 495 "stylers": [ 496 { 497 "color": "#808080" 498 }, 499 { 500 "visibility": "off" 501 } 502 ] 503 }, 504 { 505 "featureType": "road.highway", 506 "elementType": "geometry.stroke", 507 "stylers": [ 508 { 509 "visibility": "on" 510 }, 511 { 512 "color": "#b3b3b3" 513 } 514 ] 515 }, 516 { 517 "featureType": "road.highway", 518 "elementType": "geometry.fill", 519 "stylers": [ 520 { 521 "color": "#ffffff" 522 } 523 ] 524 }, 525 { 526 "featureType": "road.local", 527 "elementType": "geometry.fill", 528 "stylers": [ 529 { 530 "visibility": "on" 531 }, 532 { 533 "color": "#ffffff" 534 }, 535 { 536 "weight": 1.8 537 } 538 ] 539 }, 540 { 541 "featureType": "road.local", 542 "elementType": "geometry.stroke", 543 "stylers": [ 544 { 545 "color": "#d7d7d7" 546 } 547 ] 548 }, 549 { 550 "featureType": "poi", 551 "elementType": "geometry.fill", 552 "stylers": [ 553 { 554 "visibility": "on" 555 }, 556 { 557 "color": "#ebebeb" 558 } 559 ] 560 }, 561 { 562 "featureType": "administrative", 563 "elementType": "geometry", 564 "stylers": [ 565 { 566 "color": "#a7a7a7" 567 } 568 ] 569 }, 570 { 571 "featureType": "road.arterial", 572 "elementType": "geometry.fill", 573 "stylers": [ 574 { 575 "color": "#ffffff" 576 } 577 ] 578 }, 579 { 580 "featureType": "road.arterial", 581 "elementType": "geometry.fill", 582 "stylers": [ 583 { 584 "color": "#ffffff" 585 } 586 ] 587 }, 588 { 589 "featureType": "landscape", 590 "elementType": "geometry.fill", 591 "stylers": [ 592 { 593 "visibility": "on" 594 }, 595 { 596 "color": "#efefef" 597 } 598 ] 599 }, 600 { 601 "featureType": "road", 602 "elementType": "labels.text.fill", 603 "stylers": [ 604 { 605 "color": "#696969" 606 } 607 ] 608 }, 609 { 610 "featureType": "administrative", 611 "elementType": "labels.text.fill", 612 "stylers": [ 613 { 614 "visibility": "on" 615 }, 616 { 617 "color": "#737373" 618 } 619 ] 620 }, 621 { 622 "featureType": "poi", 623 "elementType": "labels.icon", 624 "stylers": [ 625 { 626 "visibility": "off" 627 } 628 ] 629 }, 630 { 631 "featureType": "poi", 632 "elementType": "labels", 633 "stylers": [ 634 { 635 "visibility": "off" 636 } 637 ] 638 }, 639 { 640 "featureType": "road.arterial", 641 "elementType": "geometry.stroke", 642 "stylers": [ 643 { 644 "color": "#d6d6d6" 645 } 646 ] 647 }, 648 { 649 "featureType": "road", 650 "elementType": "labels.icon", 651 "stylers": [ 652 { 653 "visibility": "off" 654 } 655 ] 656 }, 657 {}, 658 { 659 "featureType": "poi", 660 "elementType": "geometry.fill", 661 "stylers": [ 662 { 663 "color": "#dadada" 664 } 665 ] 666 } 667 ]; 668 669 var settings = { 670 center: new google.maps.LatLng(lat,lng), 671 zoom: 15, 672 disableDefaultUI: true, 673 styles: styles, 674 }; 675 676 var map = new google.maps.Map($this[0],settings); 677 678 function HTMLMarker(lat,lng){ 679 this.lat = lat; 680 this.lng = lng; 681 this.pos = new google.maps.LatLng(lat,lng); 682 } 683 684 HTMLMarker.prototype = new google.maps.OverlayView(); 685 HTMLMarker.prototype.onRemove= function(){} 686 687 //init your html element here 688 HTMLMarker.prototype.onAdd= function(){ 689 this.div = document.createElement('DIV'); 690 this.div.className = "htmlMarker"; 691 this.div.style.position='absolute'; 692 this.div.innerHTML = '<div class="map-marker"></div><div class="map-label">x marks the spot</div>'; 693 var panes = this.getPanes(); 694 panes.overlayImage.appendChild(this.div); 695 } 696 697 HTMLMarker.prototype.draw = function(){ 698 var overlayProjection = this.getProjection(); 699 var position = overlayProjection.fromLatLngToDivPixel(this.pos); 700 var panes = this.getPanes(); 701 this.div.style.left = position.x + 'px'; 702 this.div.style.top = position.y + 'px'; 703 } 704 705 //to use it 706 const htmlMarker = new HTMLMarker(lat, lng);
707 htmlMarker.setMap(map); 708 }); 709 } 710 } 711 }; 712 713 const scrollReveal = { 714 element: '.h-reveal', 715 init: function() { 716 var self = this; 717 718 var offset = defaultSettings.elements.window.height() / 4; 719 //var offset = 200; 720 721 ScrollReveal().reveal(self.element, { 722 distance: '-100px', 723 duration: defaultSettings.duration.default, 724 easing: defaultSettings.easing.css, 725 origin: 'top', 726 scale: 0.95, 727 viewOffset: { 728 top: offset, 729 bottom: offset, 730 }, 731 }); 732 } 733 }; 734 735 const loading = { 736 element: '.h-loading', 737 init: function(element){ 738 var self = this; 739 740 // Avoid multiple loadings 741 self.destroy(); 742 743 if (typeof element === 'undefined') { 744 var html = [ 745 '<div class="u-loading is-fixed h-loading">', 746 '<svg width="31" height="31" viewBox="0 0 31 31" fill="none" xmlns="http://www.w3.org/2000/svg">', 747 '<g clip-path="url(#clip0)">', 748 '<path d="M15.1778 0.177795C14.6926 0.177795 14.2989 0.571545 14.2989 1.0567V6.70514C14.2989 7.1903 14.6926 7.58405 15.1778 7.58405C15.6629 7.58405 16.0567 7.1903 16.0567 6.70514V1.0567C16.0567 0.571545 15.6635 0.177795 15.1778 0.177795Z" fill="white"/>', 749 '<path d="M15.1778 22.7716C14.6926 22.7716 14.2989 23.1654 14.2989 23.6505V29.2989C14.2989 29.7841 14.6926 30.1779 15.1778 30.1779C15.6629 30.1779 16.0567 29.7841 16.0567 29.2989V23.6505C16.0567 23.1654 15.6635 22.7716 15.1778 22.7716Z" fill="white"/>', 750 '<path d="M8.87842 2.50923C8.63584 2.08912 8.09795 1.94498 7.67783 2.18755C7.25771 2.43013 7.11357 2.96802 7.35615 3.38814L10.1804 8.28013C10.3433 8.56197 10.6386 8.71958 10.9421 8.71958C11.0909 8.71958 11.2421 8.6815 11.381 8.60181C11.8011 8.35923 11.9452 7.82134 11.7026 7.40123L8.87842 2.50923Z" fill="white"/>', 751 '<path d="M20.1752 22.0759C19.9327 21.6558 19.3948 21.5117 18.9747 21.7543C18.5545 21.9968 18.4104 22.5347 18.653 22.9549L21.4772 27.8463C21.6401 28.1281 21.9354 28.2857 22.2389 28.2857C22.3883 28.2857 22.5389 28.2476 22.6778 28.1679C23.0979 27.9254 23.242 27.3875 22.9995 26.9673L20.1752 22.0759Z" fill="white"/>', 752 '<path d="M2.50926 8.87846L7.40125 11.7027C7.53953 11.7824 7.6907 11.8204 7.84011 11.8204C8.14363 11.8204 8.43953 11.6628 8.60183 11.381C8.84441 10.9609 8.70027 10.423 8.28015 10.1804L3.38816 7.3562C2.96746 7.11362 2.43015 7.25776 2.18758 7.67787C1.945 8.09799 2.08855 8.63588 2.50926 8.87846Z" fill="white"/>', 753 '<path d="M27.8463 21.4772L22.9549 18.653C22.5342 18.4104 21.9969 18.5546 21.7543 18.9747C21.5117 19.3948 21.6558 19.9327 22.076 20.1753L26.9674 22.9995C27.1056 23.0792 27.2568 23.1173 27.4062 23.1173C27.7097 23.1173 28.0056 22.9597 28.1679 22.6778C28.4111 22.2577 28.267 21.7198 27.8463 21.4772Z" fill="white"/>', 754 '<path d="M7.58403 15.1778C7.58403 14.6926 7.19028 14.2989 6.70512 14.2989H1.05669C0.57153 14.2989 0.17778 14.6926 0.17778 15.1778C0.17778 15.663 0.57153 16.0567 1.05669 16.0567H6.70512C7.19028 16.0567 7.58403 15.6635 7.58403 15.1778Z" fill="white"/>', 755 '<path d="M29.2989 14.2989H23.6505C23.1653 14.2989 22.7716 14.6926 22.7716 15.1778C22.7716 15.663 23.1653 16.0567 23.6505 16.0567H29.2989C29.7841 16.0567 30.1778 15.663 30.1778 15.1778C30.1778 14.6926 29.7841 14.2989 29.2989 14.2989Z" fill="white"/>', 756 '<path d="M8.60123 18.9747C8.35865 18.5546 7.82135 18.4104 7.40065 18.653L2.50865 21.4772C2.08854 21.7198 1.9444 22.2577 2.18698 22.6778C2.34987 22.9597 2.64518 23.1173 2.94869 23.1173C3.09752 23.1173 3.24869 23.0792 3.38756 22.9995L8.27955 20.1753C8.70026 19.9327 8.8444 19.3954 8.60123 18.9747Z" fill="white"/>', 757 '<path d="M21.7543 11.3809C21.9172 11.6627 22.2125 11.8203 22.516 11.8203C22.6649 11.8203 22.816 11.7823 22.9549 11.7026L27.8463 8.87835C28.2664 8.63577 28.4106 8.09788 28.168 7.67776C27.9254 7.25706 27.3875 7.1135 26.9674 7.35608L22.076 10.1803C21.6553 10.4229 21.5117 10.9608 21.7543 11.3809Z" fill="white"/>', 758 '<path d="M11.3809 21.7543C10.9608 21.5117 10.4229 21.6558 10.1804 22.0759L7.35615 26.9673C7.11357 27.3875 7.25771 27.9254 7.67783 28.1679C7.81611 28.2476 7.96728 28.2857 8.1167 28.2857C8.42021 28.2857 8.71611 28.1281 8.87841 27.8463L11.7026 22.9543C11.9452 22.5341 11.8016 21.9968 11.3809 21.7543Z" fill="white"/>', 759 '<path d="M18.9747 8.60123C19.1129 8.68092 19.2641 8.71901 19.4135 8.71901C19.717 8.71901 20.0129 8.56139 20.1752 8.27955L22.9995 3.38815C23.242 2.96803 23.0979 2.43014 22.6778 2.18756C22.2577 1.94498 21.7198 2.08854 21.4772 2.50924L18.653 7.40065C18.4104 7.82135 18.5545 8.35865 18.9747 8.60123Z" fill="white"/>', 760 '</g>', 761 '<defs>', 762 '<clipPath id="clip0">', 763 '<rect width="30" height="30" fill="white" transform="translate(0.17778 0.177795)"/>', 764 '</clipPath>', 765 '</defs>', 766 '</svg>', 767 '</div>', 768 ].join(''); 769 770 defaultSettings.elements.$body.append(html); 771 } else { 772 var html = [ 773 '<div class="u-loading h-loading">', 774 '</div>', 775 ].join(''); 776 777 $(element).append(html); 778 } 779 }, 780 781 destroy: function(){ 782 var self = this; 783 784 $(self.element).remove(); 785 } 786 }; 787 788 const scrollTop = { 789 elements: { 790 trigger: '.h-scrolltop', 791 }, 792 init: function() { 793 var self = this; 794 795 $(self.elements.trigger).on('click', function() { 796 self.go(); 797 return false;
798 }); 799 }, 800 go: function() { 801 defaultSettings.elements.$htmlBody.animate({ 802 scrollTop: 0, 803 }, defaultSettings.duration.fast); 804 } 805 }; 806 807 const transition = { 808 tweaking: { 809 duration: defaultSettings.duration.fast 810 }, 811 hide: function($element) { 812 var self = this; 813 $element.animate({opacity:'0'}, self.tweaking.duration); 814 $element.css({pointerEvents:'none'}); 815 }, 816 817 show: function($element) { 818 var self = this; 819 820 setTimeout(function(){ 821 $element.animate({opacity:'1'}, self.tweaking.duration); 822 $element.css({pointerEvents:'auto'}); 823 }, self.tweaking.duration); 824 }, 825 }; 826 827 const share = { 828 elements: { 829 item: '.h-social-item', 830 share: '.h-social-share', 831 }, 832 init: function(meta){ 833 var self = this; 834 835 $(self.elements.item).each(function(){ 836 var $this = $(this), 837 type = $this.attr('data-social-share'); 838 839 if (typeof meta !== 'undefined' && typeof meta.seo_title !== 'undefined') { 840 var title = meta.seo_title; 841 } else { 842 var title = $('meta[property="og:title"]').attr('content'); 843 } 844 845 switch (type) { 846 case 'facebook': 847 $this.attr('href','//www.facebook.com/sharer/sharer.php?u='+window.location.href); 848 break; 849 850 case 'linkedin': 851 $this.attr('href','//www.linkedin.com/shareArticle?mini=true&url='+window.location.href); 852 break; 853 854 case 'twitter': 855 $this.attr('href','//twitter.com/share?url='+window.location.href+'&text='+encodeURIComponent(title)); 856 break; 857 858 case 'email': 859 $this.attr('href','mailto:?subject='+title+'&body='+window.location.href); 860 break; 861 862 case 'whatsapp': 863 $this.attr('href','//api.whatsapp.com/send?text='+window.location.href); 864 $this.attr('target','_blank'); 865 break; 866 } 867 }); 868 869 $(self.elements.share).on("click",function(){ 870 var href = $(this).attr('href'); 871 fbpopup = window.open(href, 'pop', 'width=500, height=500, scrollbars=no'); 872 return false; 873 }); 874 } 875 }; 876 877 const slider = { 878 elements: { 879 slider: '.h-slider', 880 item: '.h-slider-item', 881 }, 882 init: function() { 883 var self = this; 884 885 sliders = []; 886 intervals = []; 887 888 if ($(self.elements.slider).length) { 889 $(self.elements.slider).each(function(index){ 890 891 const elements = this.querySelectorAll(self.elements.item); 892 893 intervals[index] = 0; 894 895 sliders[index] = new KeenSlider(this, { 896 slides: elements.length, 897 loop: true, 898 duration: 2000, 899 created: function(s) { 900 elements.forEach((element, idx) => { 901 element.style.left = '-'+parseInt(100 * idx)+'%' 902 }); 903 904 self.autoplay(true, index); 905 }, 906 dragStart: function() { 907 self.autoplay(false, index); 908 }, 909 dragEnd: function() { 910 self.autoplay(true, index); 911 lazy.init(); 912 }, 913 move: function(s) { 914 const opacities = s.details().positions.map((slide) => slide.portion) 915 elements.forEach((element, idx) => { 916 element.style.opacity = opacities[idx] 917 }) 918 }, 919 }); 920 921 /* 922 this.addEventListener('mouseover', function() { 923 self.autoplay(false, index); 924 }); 925 this.addEventListener("mouseout", function() { 926 self.autoplay(true, index); 927 }); 928 */ 929 }); 930 } 931 932 }, 933 autoplay: function(run, index) { 934 clearInterval(intervals[index]) 935 intervals[index] = setInterval(() => { 936 if (run && sliders[index]) { 937 sliders[index].next() 938 } 939 }, 7000) 940 } 941 }; 942 943 const tracking = { 944 elements: { 945 modal: '.h-tracking-modal', 946 accept: '.h-tracking-accept', 947 }, 948 init: function() { 949 var self = this; 950 951 if (typeof Cookies.get('tracking') !== 'undefined' || Cookies.get('tracking') != 'accepted') { 952 $(self.elements.modal).addClass(defaultSettings.status.active); 953 } else { 954 analytics.init(); 955 } 956 957 $(self.elements.accept).on('click', function() { 958 analytics.init(); 959 Cookies.set('tracking', 'accepted', { 960 expires: 1/24/60, 961 sameSite: 'strict', 962 }); 963 $(self.elements.modal).removeClass(defaultSettings.status.active); 964 return false;
965 }); 966 } 967 }; 968 969 const analytics = { 970 init: function(){ 971 var self = this; 972 973 var ga = document.createElement('script') 974 ga.type = 'text/javascript' 975 ga.async = true 976 ga.src = 'https://googletagmanager.com/gtag/js?id='; 977 978 var s = document.getElementsByTagName('script')[0]; 979 s.parentNode.insertBefore(ga, s); 980 981 window.dataLayer = window.dataLayer || []; 982 983 self.gtag('js', new Date()); 984 self.gtag('config', ''); 985 }, 986 gtag: function() { 987 window.dataLayer.push(arguments); 988 }, 989 send: { 990 pageview: function(meta) { 991 var self = analytics; 992 993 self.gtag('config', '', { 994 'page_title' : meta.seo_title, 995 'page_path': window.location.href 996 }); 997 } 998 } 999 }; 1000 1001 const stickySidebar = { 1002 elements: { 1003 contentMargin: '.h-sticky-content-margin', 1004 sidebar: '.h-sticky-sidebar', 1005 container: '.h-sticky-container', 1006 }, 1007 init: function() { 1008 const self = this; 1009 1010 if ($(self.elements.sidebar).length) { 1011 self._init(); 1012 } 1013 }, 1014 _init: function() { 1015 const self = this; 1016 1017 const sidebar = new StickySidebar(self.elements.sidebar, { 1018 topSpacing: parseInt($(self.elements.contentMargin).offset().top), 1019 //topSpacing: parseInt(defaultSettings.elements.$header.outerHeight()) * 1.5, 1020 //bottomSpacing: 20, 1021 containerSelector: self.elements.container, 1022 }); 1023 1024 } 1025 }; 1026 1027 const dynamicBg = { 1028 elements: { 1029 src: '.h-dynamicbg-src', 1030 target: '.h-dynamicbg-target', 1031 }, 1032 init: function() { 1033 const self = this, 1034 $target = $(self.elements.target), 1035 originalSrc = $target.attr('src'); 1036 1037 $(self.elements.src) 1038 .mouseenter(function(){ 1039 const $this = $(this), 1040 src = $this.attr('data-dynamicbg-src'); 1041 1042 if (src !== null && typeof src !== 'undefined') { 1043 $target.attr('src', src).parent().addClass(defaultSettings.status.active); 1044 } 1045 }) 1046 .mouseleave(function() { 1047 $target.attr('src', originalSrc).parent().removeClass(defaultSettings.status.active); 1048 }); 1049 1050 /* 1051 $(self.elements.src).on('mouseout', function(){ 1052 console.log('out'); 1053 $target.attr('src', originalSrc); 1054 }); 1055 */ 1056 1057 } 1058 }; 1059 1060 const list = { 1061 elements: { 1062 year: '.h-list-year', 1063 }, 1064 init: function() { 1065 const self = this, 1066 $year = $(self.elements.year); 1067 1068 let width = 0; 1069 1070 $year.each(function(){ 1071 const $this = $(this); 1072 1073 if ($this.outerWidth() > width) { 1074 width = $this.outerWidth(); 1075 $year.css('min-width', width+'px'); 1076 } 1077 }); 1078 } 1079 }; 1080 1081 const pages = { 1082 elements: { 1083 main: '.h-pages-main', 1084 link: '.h-pages-link', 1085 }, 1086 init: function(){ 1087 var self = this; 1088 1089 // On page ajax link click 1090 $(self.elements.link).on('click.pagesClick', function(){ 1091 1092 var $this = $(this), 1093 info = { 1094 url: $this.attr('href'), 1095 site_id: defaultSettings.currentSite.id, 1096 uri: $this.attr('data-pages-uri') ? $this.attr('data-pages-uri') : null, 1097 data: {}, 1098 }; 1099 1100 self.change($this,info,true); 1101 return false; 1102 }); 1103 1104 // On browser back and front history 1105 defaultSettings.elements.window.on('popstate.browserNavigate', function(e) { 1106 1107 var $this = $(self.elements.link+'[href="'+location.href+'"]').length ? $(self.elements.link+'[href="'+location.href+'"]').first() : null; 1108 1109 if (e.originalEvent.state !== null) { 1110 var info = e.originalEvent.state; 1111 } else { 1112 var info = { 1113 url: location.href, 1114 site_id: defaultSettings.currentSite.id, 1115 uri: ($this !== null && !$this.attr('data-pages-uri')) ? $this.attr('data-pages-uri') : null, // @TODO 1116 data: {}, 1117 }; 1118 } 1119 1120 // Fallback for categories 1121 if (info == null || $.isEmptyObject(info)) { 1122 // console.log('problem here'); 1123 1124 let uri = location.pathname.split('/'); 1125 uri = uri[1]; 1126 1127 info = { 1128 site_id: defaultSettings.currentSite.id, 1129 uri: uri, 1130 url: location.href, 1131 data: {}, 1132 } 1133 1134 $this = $(self.elements.link+'[data-pages-uri="'+uri+'"]').length ? $(self.elements.link+'[data-pages-uri="'+uri+'"]').first() : null; 1135 } 1136 1137 // console.log(info); 1138 1139 self.change($this,info,false); 1140 }); 1141 }, 1142 1143 restart: function() { 1144 var self = this; 1145 $(self.elements.link).off('click.pagesClick'); 1146 defaultSettings.elements.window.off('popstate.browserNavigate'); 1147 self.init(); 1148 }, 1149 1150 change: function($this,info,isPushState) { 1151 var self = this; 1152 $.ajax({ 1153 url: '', 1154 type: 'get', 1155 //url: info.url, 1156 data: { 1157 action: 'ajaxify/pages/render', 1158 site_id: info.site_id, 1159 uri: info.uri, 1160 url: info.url, 1161 data: info.data, 1162 }, 1163 dataType: 'json', 1164 cache: false, 1165 beforeSend: function() { 1166 // Start page leave animation 1167 transition.hide($(self.elements.main)); 1168 1169 scrollTop.go(); 1170 $(self.elements.link).removeClass(defaultSettings.status.active); 1171 1172 if ($this !== null) { 1173 $this.addClass(defaultSettings.status.active); 1174 } 1175 1176 header.close(); 1177 header.themeDisable(); 1178 1179 // Init loading
1180 loading.init(); 1181 }, 1182 success: function(data) { 1183 if (data.status == 'OK') { 1184 1185 //Common stuff 1186 setTimeout(function(){ 1187 // Update page content 1188 $(self.elements.main).html(data.html); 1189 1190 // Update URL 1191 if (isPushState == true) { 1192 //history.pushState(info, data.meta.seo_title, info.url); 1193 history.pushState(info, null, info.url); 1194 } 1195 1196 // Update meta tags on header 1197 meta.update(data.meta); 1198 1199 // Destroy loading 1200 loading.destroy(); 1201 1202 // Init / Restart scripts 1203 lazy.init(); 1204 toggleView.init(); 1205 filtering.init(); 1206 video.init(); 1207 resizerAnimationStopper.init(); 1208 dynamicBg.init(); 1209 stickySidebar.init(); 1210 slider.init(); 1211 maps.generate(); 1212 list.init(); 1213 //tracking.init(); 1214 //scrollReveal.init(); 1215 //sticky.init(); 1216 //scrollTop.init();
1217 //share.init(); 1218 header.restart(); 1219 pages.restart(); 1220 1221 if (typeof Cookies.get('tracking') !== 'undefined' && Cookies.get('tracking') == 'accepted') { 1222 analytics.send.pageview(data.meta); 1223 } 1224 1225 // Add 'is-active' status to the $this and instances of the link with the same data-pages-uri 1226 // $(self.elements.link).removeClass(defaultSettings.status.active); 1227 1228 // $this.addClass(defaultSettings.status.active); 1229 $(self.elements.link+'[data-pages-uri="'+info.uri+'"]').addClass(defaultSettings.status.active); 1230 1231 }, transition.tweaking.duration); 1232 1233 // Remove transition 1234 transition.show($(self.elements.main)); 1235 1236 } 1237 1238 }, 1239 error: function(xhr, status, error) { 1240 console.log(status + ' - ' + error); 1241 1242 if ($this !== null) { 1243 $this.removeClass(defaultSettings.status.active); 1244 } 1245 } 1246 }); 1247 }, 1248 }; 1249 1250 pages.init(); 1251 lazy.init(); 1252 toggleView.init(); 1253 filtering.init(); 1254 header.init(); 1255 video.init(); 1256 resizerAnimationStopper.init(); 1257 dynamicBg.init(); 1258 stickySidebar.init(); 1259 slider.init(); 1260 maps.init(); 1261 list.init(); 1262 //tracking.init(); 1263 //scrollReveal.init(); 1264 //sticky.init(); 1265 //scrollTop.init();
1266 //share.init(); 1267});
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.