vendor: 5,921 bytes, lines 1-202
1// http://paulirish.com/2011/requestanimationframe-for-smart-animating/ 2// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating 3// requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel 4// MIT license 5 6(function () { 7 var lastTime = 0; 8 var vendors = ['ms', 'moz', 'webkit', 'o']; 9 for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { 10 window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame']; 11 window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || 12 window[vendors[x] + 'CancelRequestAnimationFrame']; 13 } 14 15 if (!window.requestAnimationFrame) 16 window.requestAnimationFrame = function (callback, element) { 17 var currTime = new Date().getTime(); 18 var timeToCall = Math.max(0, 16 - (currTime - lastTime)); 19 var id = window.setTimeout(function () { 20 callback(currTime + timeToCall); 21 }, 22 timeToCall); 23 lastTime = currTime + timeToCall; 24 return id; 25 }; 26 27 if (!window.cancelAnimationFrame) 28 window.cancelAnimationFrame = function (id) { 29 clearTimeout(id); 30 }; 31}()); 32 33(function (root) { 34 35 // Store setTimeout reference so promise-polyfill will be unaffected by 36 // other code modifying setTimeout (like sinon.useFakeTimers()) 37 var setTimeoutFunc = setTimeout; 38 39 function noop() {} 40 41 // Polyfill for Function.prototype.bind 42 function bind(fn, thisArg) { 43 return function () { 44 fn.apply(thisArg, arguments); 45 }; 46 } 47 48 function Promise(fn) { 49 if (typeof this !== 'object') throw new TypeError('Promises must be constructed via new'); 50 if (typeof fn !== 'function') throw new TypeError('not a function'); 51 this._state = 0; 52 this._handled = false; 53 this._value = undefined; 54 this._deferreds = []; 55 56 doResolve(fn, this); 57 } 58 59 function handle(self, deferred) { 60 while (self._state === 3) { 61 self = self._value; 62 } 63 if (self._state === 0) { 64 self._deferreds.push(deferred); 65 return; 66 } 67 self._handled = true; 68 Promise._immediateFn(function () { 69 var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected; 70 if (cb === null) { 71 (self._state === 1 ? resolve : reject)(deferred.promise, self._value); 72 return; 73 } 74 var ret; 75 try { 76 ret = cb(self._value); 77 } catch (e) { 78 reject(deferred.promise, e); 79 return; 80 } 81 resolve(deferred.promise, ret); 82 }); 83 } 84 85 function resolve(self, newValue) { 86 try { 87 // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure 88 if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.'); 89 if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) { 90 var then = newValue.then; 91 if (newValue instanceof Promise) { 92 self._state = 3; 93 self._value = newValue; 94 finale(self); 95 return; 96 } else if (typeof then === 'function') { 97 doResolve(bind(then, newValue), self); 98 return; 99 } 100 } 101 self._state = 1; 102 self._value = newValue; 103 finale(self); 104 } catch (e) { 105 reject(self, e); 106 } 107 } 108 109 function reject(self, newValue) { 110 self._state = 2; 111 self._value = newValue; 112 finale(self); 113 } 114 115 function finale(self) { 116 if (self._state === 2 && self._deferreds.length === 0) { 117 Promise._immediateFn(function () { 118 if (!self._handled) { 119 Promise._unhandledRejectionFn(self._value); 120 } 121 }); 122 } 123 124 for (var i = 0, len = self._deferreds.length; i < len; i++) { 125 handle(self, self._deferreds[i]); 126 } 127 self._deferreds = null; 128 } 129 130 function Handler(onFulfilled, onRejected, promise) { 131 this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; 132 this.onRejected = typeof onRejected === 'function' ? onRejected : null; 133 this.promise = promise; 134 } 135 136 /** 137 * Take a potentially misbehaving resolver function and make sure 138 * onFulfilled and onRejected are only called once. 139 * 140 * Makes no guarantees about asynchrony. 141 */ 142 function doResolve(fn, self) { 143 var done = false; 144 try { 145 fn(function (value) { 146 if (done) return; 147 done = true; 148 resolve(self, value); 149 }, function (reason) { 150 if (done) return; 151 done = true; 152 reject(self, reason); 153 }); 154 } catch (ex) { 155 if (done) return; 156 done = true; 157 reject(self, ex); 158 } 159 } 160 161 Promise.prototype['catch'] = function (onRejected) { 162 return this.then(null, onRejected); 163 }; 164 165 Promise.prototype.then = function (onFulfilled, onRejected) { 166 var prom = new(this.constructor)(noop); 167 168 handle(this, new Handler(onFulfilled, onRejected, prom)); 169 return prom; 170 }; 171 172 Promise.all = function (arr) { 173 var args = Array.prototype.slice.call(arr); 174 175 return new Promise(function (resolve, reject) { 176 if (args.length === 0) return resolve([]); 177 var remaining = args.length; 178 179 function res(i, val) { 180 try { 181 if (val && (typeof val === 'object' || typeof val === 'function')) { 182 var then = val.then; 183 if (typeof then === 'function') { 184 then.call(val, function (val) { 185 res(i, val); 186 }, reject); 187 return; 188 } 189 } 190 args[i] = val; 191 if (--remaining === 0) { 192 resolve(args); 193 } 194 } catch (ex) { 195 reject(ex); 196 } 197 } 198 199 for (var i = 0; i < args.length; i++) { 200 res(i, args[i]); 201 } 202 });
203 }; 204 205 Promise.resolve = function (value) { 206 if (value && typeof value === 'object' && value.constructor === Promise) { 207 return value; 208 } 209 210 return new Promise(function (resolve) { 211 resolve(value); 212 }); 213 }; 214 215 Promise.reject = function (value) { 216 return new Promise(function (resolve, reject) { 217 reject(value); 218 }); 219 }; 220 221 Promise.race = function (values) { 222 return new Promise(function (resolve, reject) { 223 for (var i = 0, len = values.length; i < len; i++) { 224 values[i].then(resolve, reject); 225 } 226 }); 227 }; 228 229 // Use polyfill for setImmediate for performance gains 230 Promise._immediateFn = (typeof setImmediate === 'function' && function (fn) { 231 setImmediate(fn); 232 }) || 233 function (fn) { 234 setTimeoutFunc(fn, 0); 235 }; 236 237 Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) { 238 if (typeof console !== 'undefined' && console) { 239 console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console 240 } 241 }; 242 243 /** 244 * Set the immediate function to execute callbacks 245 * @param fn {function} Function to execute 246 * @deprecated 247 */ 248 Promise._setImmediateFn = function _setImmediateFn(fn) { 249 Promise._immediateFn = fn; 250 }; 251 252 /** 253 * Change the function to execute on unhandled rejection 254 * @param {function} fn Function to execute on unhandled rejection 255 * @deprecated 256 */ 257 Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) { 258 Promise._unhandledRejectionFn = fn; 259 }; 260 261 if (typeof module !== 'undefined' && module.exports) { 262 module.exports = Promise; 263 } else if (!root.Promise) { 264 root.Promise = Promise; 265 } 266 267})(this); 268 269 270 271 272 273 274 275 276 277 278/*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/ 279; 280if ("document" in self && !("classList" in document.createElement("_"))) { 281 (function (j) { 282 "use strict"; 283 if (!("Element" in j)) { 284 return 285 } 286 var a = "classList", 287 f = "prototype", 288 m = j.Element[f], 289 b = Object, 290 k = String[f].trim || function () { 291 return this.replace(/^\s+|\s+$/g, "") 292 }, 293 c = Array[f].indexOf || function (q) { 294 var p = 0, 295 o = this.length; 296 for (; p < o; p++) { 297 if (p in this && this[p] === q) { 298 return p 299 } 300 } 301 return -1 302 }, 303 n = function (o, p) { 304 this.name = o; 305 this.code = DOMException[o]; 306 this.message = p 307 }, 308 g = function (p, o) { 309 if (o === "") { 310 throw new n("SYNTAX_ERR", "An invalid or illegal string was specified") 311 } 312 if (/\s/.test(o)) { 313 throw new n("INVALID_CHARACTER_ERR", "String contains an invalid character") 314 } 315 return c.call(p, o) 316 }, 317 d = function (s) { 318 var r = k.call(s.getAttribute("class") || ""), 319 q = r ? r.split(/\s+/) : [], 320 p = 0, 321 o = q.length; 322 for (; p < o; p++) { 323 this.push(q[p]) 324 } 325 this._updateClassName = function () { 326 s.setAttribute("class", this.toString()) 327 } 328 }, 329 e = d[f] = [], 330 i = function () { 331 return new d(this) 332 }; 333 n[f] = Error[f]; 334 e.item = function (o) { 335 return this[o] || null 336 }; 337 e.contains = function (o) { 338 o += ""; 339 return g(this, o) !== -1 340 }; 341 e.add = function () { 342 var s = arguments, 343 r = 0, 344 p = s.length, 345 q, o = false; 346 do { 347 q = s[r] + ""; 348 if (g(this, q) === -1) { 349 this.push(q); 350 o = true 351 } 352 } while (++r < p); 353 if (o) { 354 this._updateClassName() 355 } 356 }; 357 e.remove = function () { 358 var t = arguments, 359 s = 0, 360 p = t.length, 361 r, o = false; 362 do { 363 r = t[s] + ""; 364 var q = g(this, r); 365 if (q !== -1) { 366 this.splice(q, 1); 367 o = true 368 } 369 } while (++s < p); 370 if (o) { 371 this._updateClassName() 372 } 373 }; 374 e.toggle = function (p, q) { 375 p += ""; 376 var o = this.contains(p), 377 r = o ? q !== true && "remove" : q !== false && "add"; 378 if (r) { 379 this[r](p) 380 } 381 return !o 382 }; 383 e.toString = function () { 384 return this.join(" ") 385 }; 386 if (b.defineProperty) { 387 var l = { 388 get: i, 389 enumerable: true, 390 configurable: true 391 };
392 try { 393 b.defineProperty(m, a, l) 394 } catch (h) { 395 if (h.number === -2146823252) { 396 l.enumerable = false; 397 b.defineProperty(m, a, l) 398 } 399 } 400 } else { 401 if (b[f].__defineGetter__) { 402 m.__defineGetter__(a, i) 403 } 404 } 405 }(self)) 406}; 407 408 409 410 411 412/** 413 * Input Placeholder Polyfill 414 * MIT Licensed 415 * Created by Christopher Rolfe 416 */ 417if (!('placeholder' in document.createElement("input"))) { 418 419 // Get all the inputs 420 var inputs = document.getElementsByTagName('input'); 421 422 // Loop over them 423 for (var i = 0; i < inputs.length; i++) { 424 // If they don't have a preset value 425 if (!inputs[i].value) { 426 // The set the placeholder 427 inputs[i].value = inputs[i].getAttribute('placeholder'); 428 } 429 430 // Attach event listeners for click and blur 431 // Click so that we can clear the placeholder if we need to 432 // Blur to re-add it if needed 433 if (inputs[i].addEventListener) { 434 inputs[i].addEventListener('click', hidePlaceholderOnFocus, false); 435 inputs[i].addEventListener('blur', unfocusOnAnElement, false); 436 } else if (inputs[i].attachEvent) { 437 inputs[i].attachEvent('onclick', hidePlaceholderOnFocus); 438 inputs[i].attachEvent('onblur', unfocusOnAnElement); 439 } 440 } 441 442 /** 443 * When the input value is the same as the placeholder clear it 444 */ 445 function hidePlaceholderOnFocus(event) { 446 target = (event.currentTarget) ? event.currentTarget : event.srcElement; 447 448 if (target.value == target.getAttribute('placeholder')) { 449 target.value = ''; 450 } 451 } 452 453 /** 454 * When the input has an empty value put the placeholder back in 455 */ 456 function unfocusOnAnElement(event) { 457 target = (event.currentTarget) ? event.currentTarget : event.srcElement; 458 459 if (target.value == '') { 460 target.value = target.getAttribute('placeholder'); 461 } 462 } 463} 464 465(function polyfillRequestFullscreen() { 466 if (!Element.prototype.requestFullscreen) { 467 if (Element.prototype.webkitRequestFullscreen) { 468 Element.prototype.requestFullscreen = Element.prototype.webkitRequestFullScreen; 469 } else if (Element.prototype.mozRequestFullScreen) { 470 Element.prototype.requestFullscreen = Element.prototype.mozRequestFullScreen; 471 } 472 } 473})(); 474 475(function polyfillExitFullscreen() { 476 if (!Document.prototype.exitFullscreen) { 477 if (Document.prototype.webkitExitFullscreen) { 478 Document.prototype.exitFullscreen = Document.prototype.webkitExitFullscreen; 479 } else if (Document.prototype.mozExitFullScreen) { 480 Document.prototype.exitFullscreen = Document.prototype.mozExitFullScreen; 481 } 482 } 483})(); 484 485(function polyfillClosest() { 486 if (!Element.prototype.matches) 487 Element.prototype.matches = Element.prototype.msMatchesSelector || 488 Element.prototype.webkitMatchesSelector; 489 490 if (!Element.prototype.closest) { 491 Element.prototype.closest = function (s) { 492 var el = this; 493 if (!document.documentElement.contains(el)) return null; 494 do { 495 if (el.matches(s)) return el; 496 el = el.parentElement || el.parentNode; 497 } while (el !== null && el.nodeType === 1); 498 return null; 499 }; 500 } 501})(); 502var Templates; 503(function (Templates) { 504 var TemplateApplication = (function () { 505 function TemplateApplication() { 506 var _this = this; 507 this.timeout = 0; 508 this.delay = 250; 509 this.translations = {}; 510 this.onWindowResize = function () { 511 var stateChanged = false; 512 var newWindowState = _this.getWindowState(); 513 stateChanged = newWindowState != _this.lastWindowState; 514 if (stateChanged) { 515 _this.bindTextSwaps(newWindowState); 516 _this.bindAspectRatioElements(newWindowState); 517 _this.bindToggleButtons(newWindowState, true); 518 _this.lastWindowState = newWindowState; 519 } 520 _this.bindTables(newWindowState); 521 }; 522 this.statusBars = [];
523 this.currentanchorElement = null; 524 } 525 TemplateApplication.prototype.init = function () { 526 var _this = this; 527 this.rootElement = document.querySelector('.ac-content-page'); 528 if (this.rootElement == null) { 529 this.rootElement = document.querySelector('.ac-content-modal'); 530 } 531 if (!this.rootElement) { 532 return; 533 } 534 this.lastWindowState = this.getWindowState(); 535 if (window.StandardTemplateTranslations) { 536 var translations = window.StandardTemplateTranslations; 537 var map = {}; 538 for (var i = 0, length_1 = translations.length; i < length_1; i++) { 539 var translation = translations[i]; 540 map[translation.key] = translation.value; 541 } 542 this.translations = map; 543 } 544 this.bindTextSwaps(this.lastWindowState); 545 this.bindToggleButtons(this.lastWindowState, false); 546 this.bindContentListItemEvents(); 547 this.bindContentDetailListItemEvents(); 548 this.bindAspectRatioElements(this.lastWindowState); 549 this.bindStatusBars(); 550 this.bindCalendars(); 551 this.bindDisabledLinks(); 552 this.bindMaps(); 553 this.bindValidators(); 554 this.bindFormControlEvents(); 555 this.bindTables(this.lastWindowState); 556 this.bindImageGalleries(this.lastWindowState); 557 this.bindImageSliders(this.lastWindowState); 558 this.bindLightboxImages(); 559 this.bindLoadingTriggers(); 560 this.bindClickableItems(); 561 this.bindTooltips(); 562 window.addEventListener('keyup', function (event) { 563 var key = event.key; 564 if (key === 'Escape') { 565 if (_this.currentTooltip) { 566 _this.closeTooltip(_this.currentTooltip); 567 } 568 } 569 }); 570 window.addEventListener('resize', function () { 571 clearTimeout(_this.timeout); 572 _this.timeout = setTimeout(_this.onWindowResize, _this.delay); 573 }); 574 window.addEventListener('click', function (event) { 575 if (_this.currentTooltip && !_this.currentTooltip.contains(event.target)) { 576 _this.closeTooltip(_this.currentTooltip); 577 } 578 }); 579 }; 580 TemplateApplication.prototype.IsInLinkElement = function (element) { 581 var returnValue = false; 582 var cParent = element; 583 while (cParent != null) { 584 if (cParent.tagName == 'A') { 585 returnValue = true; 586 break; 587 } 588 cParent = cParent.parentElement; 589 } 590 return returnValue; 591 }; 592 TemplateApplication.prototype.getStatusBar = function (clientId) { 593 for (var i = 0, length_2 = this.statusBars.length; i < length_2; i++) { 594 var statusBarComponent = this.statusBars[i]; 595 if (statusBarComponent.clientId == clientId) { 596 return statusBarComponent; 597 } 598 } 599 return null; 600 }; 601 TemplateApplication.prototype.bindStatusBars = function () { 602 var statusBarElements = this.rootElement.querySelectorAll('.js-statusbar'); 603 for (var i = 0, length_3 = statusBarElements.length; i < length_3; i++) { 604 var statusBarOptions = new Templates.Components.StatusBarOptions(); 605 var statusBarElement = statusBarElements[i]; 606 statusBarOptions.element = statusBarElement; 607 statusBarOptions.completedclassName = statusBarElement.getAttribute("data-completed-class-name"); 608 var statusBarComponent = new Templates.Components.StatusBarComponent(statusBarOptions); 609 statusBarComponent.init(); 610 this.statusBars.push(statusBarComponent); 611 } 612 }; 613 TemplateApplication.prototype.bindImageGalleries = function (state) { 614 var imageGalleryElements = this.rootElement.querySelectorAll('.js-image-gallery'); 615 for (var i = 0, length_4 = imageGalleryElements.length; i < length_4; i++) { 616 var imageGalleryElement = imageGalleryElements[i]; 617 } 618 }; 619 TemplateApplication.prototype.bindLightboxImages = function () { 620 if (!('lightboxApp' in window)) { 621 var appOptions = new Templates.Components.LightboxApplicationOptions(); 622 var app = new Templates.Components.LightboxApplication(appOptions); 623 app.init(); 624 } 625 }; 626 TemplateApplication.prototype.bindImageSliders = function (state) { 627 var imageSliderElements = this.rootElement.querySelectorAll('.js-image-slider'); 628 for (var i = 0, length_5 = imageSliderElements.length; i < length_5; i++) { 629 var imageSliderElement = imageSliderElements[i]; 630 var itemsElement = imageSliderElement.querySelector('.ac-image-slider-items'); 631 var navElement = imageSliderElement.querySelector('.ac-image-slider-nav'); 632 var options = { 633 slidesToShow: 1, 634 slidesToScroll: 1, 635 infinite: false, 636 centerMode: true, 637 arrows: true, 638 fade: true, 639 }; 640 if (navElement) { 641 options.asNavFor = '#' + navElement.id; 642 } 643 $(itemsElement).slick(options); 644 if (navElement) { 645 $(navElement).slick({ 646 slidesToShow: 3, 647 slidesToScroll: 1, 648 asNavFor: '#' + itemsElement.id, 649 centerMode: true, 650 infinite: false, 651 focusOnSelect: true, 652 variableWidth: true, 653 dots: false,
654 arrows: false 655 }); 656 } 657 var anchors = navElement.querySelectorAll('a'); 658 for (var j = 0, length_6 = anchors.length; j < length_6; j++) { 659 var anchor = anchors[j]; 660 anchor.addEventListener('click', function (e) { 661 e.preventDefault(); 662 }); 663 } 664 } 665 }; 666 TemplateApplication.prototype.bindTables = function (state) { 667 var tableWrapperElements = this.rootElement.querySelectorAll('.ac-content-table-wrapper'); 668 var _loop_1 = function (i, length_7) { 669 var tableContentBlock = tableWrapperElements[i]; 670 var upperScrollbarElement = tableContentBlock.parentElement.querySelector('.ac-content-table-upper-scrollbar'); 671 var table = tableContentBlock.querySelector('table'); 672 if (table.classList.contains('ac-content-table--normal') || 673 (state === 'mobile' && table.classList.contains('ac-content-table--mobile-normal')) || 674 (state === 'tablet' && table.classList.contains('ac-content-table--tablet-normal')) || 675 (state === 'desktop' && table.classList.contains('ac-content-table--desktop-normal'))) { 676 if (tableContentBlock.scrollWidth > tableContentBlock.clientWidth) { 677 if (!upperScrollbarElement) { 678 upperScrollbarElement = document.createElement('div'); 679 upperScrollbarElement.className = 'ac-content-table-upper-scrollbar'; 680 tableContentBlock.parentElement.insertBefore(upperScrollbarElement, tableContentBlock); 681 var upperScrollbarElementContent = document.createElement('div'); 682 upperScrollbarElementContent.className = 'ac-content-table-upper-scrollbar-content'; 683 upperScrollbarElementContent.style.width = table.clientWidth + 'px'; 684 upperScrollbarElement.appendChild(upperScrollbarElementContent); 685 } 686 upperScrollbarElement.scrollLeft = tableContentBlock.scrollLeft; 687 upperScrollbarElement.addEventListener('scroll', function () { 688 tableContentBlock.scrollLeft = upperScrollbarElement.scrollLeft; 689 }); 690 tableContentBlock.addEventListener('scroll', function () { 691 upperScrollbarElement.scrollLeft = tableContentBlock.scrollLeft; 692 }); 693 } 694 else { 695 if (upperScrollbarElement) { 696 upperScrollbarElement.parentElement.removeChild(upper
696ScrollbarElement); 697 } 698 } 699 } 700 else { 701 if (upperScrollbarElement) { 702 upperScrollbarElement.parentElement.removeChild(upperScrollbarElement); 703 } 704 } 705 }; 706 for (var i = 0, length_7 = tableWrapperElements.length; i < length_7; i++) { 707 _loop_1(i, length_7); 708 } 709 }; 710 TemplateApplication.prototype.translate = function (key) { 711 return this.translations[key]; 712 }; 713 TemplateApplication.prototype.getWindowState = function () { 714 return window.getComputedStyle(this.rootElement, ':after').getPropertyValue('content').replace(/"/g, ''); 715 }; 716 TemplateApplication.prototype.bindToggleButtons = function (windowState, rebind) { 717 var buttons = this.rootElement.querySelectorAll('.js-toggle-button'); 718 var _loop_2 = function (i, length_8) { 719 var button = buttons[i]; 720 if (button.hasAttribute('data-toggle')) { 721 var defaultToggle = button.getAttribute('data-toggle') === 'true'; 722 button.removeAttribute('aria-expanded'); 723 var overridden = false; 724 if (windowState === 'mobile') { 725 if (button.hasAttribute('data-mobile-toggle')) { 726 var mobileToggle = button.getAttribute('data-mobile-toggle') === 'true'; 727 if (mobileToggle && !defaultToggle) { 728 button.setAttribute('aria-expanded', 'true'); 729 overridden = true; 730 } 731 } 732 } 733 else if (windowState === 'tablet') { 734 if (button.hasAttribute('data-tablet-toggle')) { 735 var tabletToggle = button.getAttribute('data-tablet-toggle') === 'true'; 736 if (tabletToggle && !defaultToggle) { 737 button.setAttribute('aria-expanded', 'true'); 738 overridden = true; 739 } 740 } 741 } 742 else { 743 if (button.hasAttribute('data-desktop-toggle')) { 744 var desktopToggle = button.getAttribute('data-desktop-toggle') === 'true'; 745 if (desktopToggle && !defaultToggle) { 746 button.setAttribute('aria-expanded', 'true'); 747 overridden = true; 748 } 749 } 750 } 751 if (!overridden && defaultToggle) { 752 button.setAttribute('aria-expanded', 'true'); 753 if (button.hasAttribute('aria-controls')) { 754 var togglePanelClientID = button.getAttribute('aria-controls'); 755 var togglePanel = document.getElementById(togglePanelClientID); 756 if (togglePanel) { 757 togglePanel.classList.add('js-toggle-panel--show'); 758 } 759 } 760 } 761 } 762 if (!rebind) { 763 if (button.hasAttribute('aria-controls')) { 764 var togglePanelClientID = button.getAttribute('aria-controls'); 765 var togglePanel = document.getElementById(togglePanelClientID); 766 if (togglePanel) { 767 togglePanel.classList.add('js-toggle-panel'); 768 } 769 } 770 button.addEventListener('click', function (event) { 771 event.preventDefault(); 772 var text = button.getAttribute('data-text'); 773 var toggleText = button.getAttribute('data-toggle-text'); 774 var isExpanded = button.getAttribute('aria-expanded') === 'true'; 775 var textElement = button.querySelector('.js-toggle-button-text'); 776 var togglePanel = null; 777 if (button.hasAttribute('aria-controls')) { 778 var togglePanelClientID = button.getAttribute('aria-controls'); 779 togglePanel = document.getElementById(togglePanelClientID); 780 } 781 if (isExpanded) { 782 button.setAttribute('aria-expanded', 'false'); 783 if (text) { 784 textElement.innerHTML = ''; 785 var a = document.createTextNode(text); 786 textElement.appendChild(a); 787 } 788 if (togglePanel) { 789 togglePanel.classList.remove('js-toggle-panel--show'); 790 } 791 } 792 else { 793 button.setAttribute('aria-expanded', 'true'); 794 if (toggleText) { 795 textElement.innerHTML = ''; 796 var a = document.createTextNode(toggleText); 797 textElement.appendChild(a); 798 } 799 if (togglePanel) { 800 togglePanel.classList.add('js-toggle-panel--show'); 801 } 802 } 803 }); 804 } 805 }; 806 for (var i = 0, length_8 = buttons.length; i < length_8; i++) { 807 _loop_2(i, length_8); 808 } 809 }; 810 TemplateApplication.prototype.bindContentListItemEvents = function () { 811 var itemElements = this.rootElement.querySelectorAll('.ac-content-list-item'); 812 var _loop_3 = function (i, length_9) { 813 var itemElement = itemElements[i]; 814 itemElement.addEventListener('mouseenter', function (event) { 815 itemElement.classList.add('ac-content-list-item--highlight'); 816 }); 817 itemElement.addEventListener('focusin', function (event) { 818 itemElement.classList.add('ac-content-list-item--focus'); 819 }); 820 itemElement.addEventListener('mouseleave', function (event) { 821 itemElement.classList.remove('ac-content-list-item--highlight'); 822 }); 823 itemElement.addEventListener('focusout', function (event) { 824 itemElement.classList.remove('ac-content-list-item--focus'); 825 }); 826 }; 827 for (var i = 0, length_9 = itemElements.length; i < length_9; i++) { 828 _loop_3(i, length_9); 829 } 830 }; 831 TemplateApplication.prototype.bindContentDetailListItemEvents = function () { 832 var _this = this; 833 var itemElements = this.rootElement.querySelectorAll('.ac-content-detail-list-item'); 834 var _loop_4 = function () { 835 var item = itemElements[i]; 836 var trigger = item.querySelector('.ac-content-detail-list-item-header-column-trigger'); 837 var body = item.querySelector('.ac-content-detail-list-item-body'); 838 var itemHeader = item.querySelector('.ac-content-detail-list-item-header'); 839 itemHeader.addEventListener('click', function (e) { 840 trigger.click(); 841 }); 842 trigger.addEventListener('click', function (e) { 843 e.stopPropagation(); 844 var isOpen = trigger.getAttribute('aria-expanded') === 'true'; 845 if (!isOpen) { 846 var openedTrigger = _this.rootElement.querySelector('.ac-content-detail-list-item-header-column-trigger[aria-expanded="true"]'); 847 var openItem = _this.rootElement.querySelector('.ac-content-detail-list-item--open'); 848 var openBody = _this.rootElement.querySelector('.ac-content-detail-list-item-body--open'); 849 if (openedTrigger != null) { 850 openedTrigger.setAttribute('aria-expanded', 'false'); 851 } 852 if (openItem != null) { 853 openItem.classList.toggle('ac-content-detail-list-item--open'); 854 } 855 if (openBody != null) { 856 openBody.classList.toggle('ac-content-detail-list-item-body--open'); 857 } 858 if (window.eventBus) { 859 window.eventBus.dispatch('show-container', body); 860 } 861 } 862 trigger.setAttribute('aria-expanded', (isOpen) ? 'false' : 'true'); 863 item.classList.toggle('ac-content-detail-list-item--open'); 864 body.classList.toggle('ac-content-detail-list-item-body--open'); 865 }); 866 }; 867 for (var i = 0; i < itemElements.length; i++) { 868 _loop_4(); 869 } 870 }; 871 TemplateApplication.prototype.bindFormControlEvents = function () { 872 var itemElements = this.rootElement.querySelectorAll('.ac-content-form-control'); 873 var _loop_5 = function (i, length_10) { 874 var itemElement = itemElements[i]; 875 itemElement.addEventListener('mouseenter', function (event) { 876 itemElement.classList.add('ac-content-form-control--hover'); 877 }); 878 itemElement.addEventListener('focusin', function (event) { 879 itemElement.classList.add('ac-content-form-control--focus'); 880 }); 881 itemElement.addEventListener('mouseleave', function (event) { 882 itemElement.classList.remove('ac-content-form-control--hover'); 883 }); 884 itemElement.addEventListener('focusout', function (event) { 885 itemElement.classList.remove('ac-content-form-control--focus'); 886 }); 887 }; 888 for (var i = 0, length_10 = itemElements.length; i < length_10; i++) { 889 _loop_5(i, length_10); 890 } 891 }; 892 TemplateApplication.prototype.bindTextSwaps = function (state) { 893 var elements = this.rootElement.querySelectorAll('.js-text-swap'); 894 for (var i = 0, length_11 = elements.length; i < length_11; i++) { 895 var element = elements[i]; 896 var fallbackText = element.getAttribute('data-text'); 897 var textElement = element.querySelector('.js-text-swap-text'); 898 if (textElement && fallbackText) { 899 var mobileText = element.getAttribute('data-mobile-text'); 900 var tabletText = element.getAttribute('data-tablet-text'); 901 var desktopText = element.getAttribute('data-desktop-text'); 902 var targetText = fallbackText; 903 if (state == 'mobile') { 904 if (mobileText) { 905 targetText = mobileText; 906 } 907 } 908 else if (state == 'tablet') { 909 if (tabletText) { 910 targetText = tabletText; 911 } 912 } 913 else if (state == 'desktop') { 914 if (desktopText) { 915 targetText = desktopText; 916 } 917 } 918 textElement.innerHTML = ''; 919 var a = document.createTextNode(targetText); 920 textElement.appendChild(a); 921 } 922 } 923 }; 924 TemplateApplication.prototype.bindAspectRatioElements = function (state) { 925 var elements = this.rootElement.querySelectorAll('.js-aspect-ratio'); 926 for (var i = 0, length_12 = elements.length; i < length_12; i++) { 927 var element = elements[i]; 928 var fallbackAspectRatio = element.getAttribute('data-aspect-ratio'); 929 if (fallbackAspectRatio) { 930 var mobileAspectRatio = element.getAttribute('data-mobile-aspect-ratio'); 931 var tabletAspectRatio = element.getAttribute('data-tablet-aspect-ratio'); 932 var desktopAspectRatio = element.getAttribute('data-desktop-aspect-ratio'); 933 var targetAspectRatio = fallbackAspectRatio; 934 if (state == 'mobile') { 935 if (mobileAspectRatio) { 936 targetAspectRatio = mobileAspectRatio; 937 } 938 } 939 else if (state == 'tablet') { 940 if (tabletAspectRatio) { 941 targetAspectRatio = tabletAspectRatio; 942 } 943 } 944 else if (state == 'desktop') { 945 if (desktopAspectRatio) { 946 targetAspectRatio = desktopAspectRatio; 947 } 948 } 949 element.style.paddingBottom = targetAspectRatio + '%'; 950 } 951 } 952 }; 953 TemplateApplication.prototype.bindCalendars = function () { 954 var elements = this.rootElement.querySelectorAll('.js-calendar'); 955 var _loop_6 = function (i, length_13) { 956 var element = elements[i]; 957 var calendar = new Templates.Components.CalendarComponent(); 958 var options = new Templates.Components.CalendarOptions(); 959 options.element = element; 960 if (element.hasAttribute('data-selected-date')) { 961 options.selectedDate = new Date(element.getAttribute('data-selected-date')); 962 element.removeAttribute('data-selected-date'); 963 } 964 if (element.hasAttribute('data-show-selected-date-panel')) { 965 options.showSelectedDatePanel = element.getAttribute('data-show-selected-date-panel') === 'true'; 966 element.removeAttribute('data-show-selected-date-panel'); 967 } 968 if (element.hasAttribute('data-on-selected-date-changed-callback-name')) { 969 options.onSelectedDateChangedCallbackName = element.getAttribute('data-on-selected-date-changed-callback-name'); 970 element.removeAttribute('data-on-selected-date-changed-callback-name'); 971 } 972 if (element.hasAttribute('data-on-before-initilize-callback-name')) { 973 options.onBeforeInitilizeCallbackName = element.getAttribute('data-on-before-initilize-callback-name'); 974 element.removeAttribute('data-on-before-initilize-callback-name'); 975 } 976 if (element.hasAttribute('data-on-building-date-buttonelement-callback-name')) { 977 options.onBuildingDateButtonElement = element.getAttribute('data-on-building-date-buttonelement-callback-name'); 978 element.removeAttribute('data-on-building-date-buttonelement-callback-name'); 979 } 980 if (element.hasAttribute('data-on-before-initilize-callback-name')) { 981 options.onSelectedDateChangedCallbackName = element.getAttribute('data-on-before-initilize-callback-name'); 982 element.removeAttribute('data-on-before-initilize-callback-name'); 983 } 984 if (element.hasAttribute('data-on-previous-month-callback-name')) { 985 options.onPreviousMonthCallback = element.get
985Attribute('data-on-previous-month-callback-name'); 986 element.removeAttribute('data-on-previous-month-callback-name'); 987 } 988 if (element.hasAttribute('data-on-next-month-callback-name')) { 989 options.onNextMonthCallback = element.getAttribute('data-on-next-month-callback-name'); 990 element.removeAttribute('data-on-next-month-callback-name'); 991 } 992 if (element.hasAttribute('data-minimum-date')) { 993 options.minimumDate = new Date(element.getAttribute('data-minimum-date')); 994 element.removeAttribute('data-minimum-date'); 995 } 996 if (element.hasAttribute('data-maximum-date')) { 997 options.maximumDate = new Date(element.getAttribute('data-maximum-date')); 998 element.removeAttribute('data-maximum-date'); 999 } 1000 promiseBeforeInit = window[options.onBeforeInitilizeCallbackName]; 1001 if (promiseBeforeInit == null) { 1002 calendar.init(options); 1003 } 1004 else { 1005 calendar.activateLoadingCalender(options.element); 1006 promiseBeforeInit.then(function () { 1007 calendar.deactivateLoadingCalender(options.element); 1008 calendar.init(options); 1009 }); 1010 } 1011 if (element.hasAttribute('data-get-instance-callback-name')) { 1012 var callback = window[element.getAttribute('data-get-instance-callback-name')]; 1013 callback(calendar); 1014 } 1015 }; 1016 var promiseBeforeInit; 1017 for (var i = 0, length_13 = elements.length; i < length_13; i++) { 1018 _loop_6(i, length_13); 1019 } 1020 }; 1021 TemplateApplication.prototype.bindDisabledLinks = function () { 1022 var elements = this.rootElement.querySelectorAll('a[aria-disabled="true"]'); 1023 for (var i = 0, length_14 = elements.length; i < length_14; i++) { 1024 var element = elements[i]; 1025 element.addEventListener('click', function (e) { 1026 event.preventDefault(); 1027 }); 1028 } 1029 }; 1030 TemplateApplication.prototype.bindMaps = function () { 1031 var elements = this.rootElement.querySelectorAll('.ac-map'); 1032 window.mapComponents = []; 1033 for (var i = 0, length_15 = elements.length; i < length_15; i++) { 1034 var element = elements[i]; 1035 var options = null; 1036 var provider = Templates.Components.MapProvider.Google; 1037 if (element.hasAttribute('data-provider')) { 1038 provider = parseInt(element.getAttribute('data-provider')); 1039 element.removeAttribute('data-provider'); 1040 } 1041 if (provider === Templates.Components.MapProvider.NorkartWebatlas) { 1042 options = new Templates.Components.NorkartWebatlasMapOptions(); 1043 } 1044 else { 1045 options = new Templates.Components.GoogleMapsMapOptions(); 1046 } 1047 options.element = element; 1048 if (element.hasAttribute('data-items-variable-name')) { 1049 var variableName = element.getAttribute('data-items-variable-name'); 1050 var jsonData = window[variableName]; 1051 options.items = JSON.parse(jsonData); 1052 element.removeAttribute('data-items-variable-name'); 1053 } 1054 if (element.hasAttribute('data-geojson-variable-name')) { 1055 var variableName = element.getAttribute('data-geojson-variable-name'); 1056 var jsonData = window[variableName]; 1057 options.geoJSON = JSON.parse(jsonData); 1058 element.removeAttribute('data-geojson-variable-name'); 1059 } 1060 if (element.hasAttribute('data-initial-latitude')) { 1061 options.initialLatitude = parseFloat(element.getAttribute('data-initial-latitude')); 1062 element.removeAttribute('data-initial-latitude'); 1063 } 1064 if (element.hasAttribute('data-initial-longitude')) { 1065 options.initialLongitude = parseFloat(element.getAttribute('data-initial-longitude')); 1066 element.removeAttribute('data-initial-longitude'); 1067 } 1068 if (element.hasAttribute('data-initial-zoom-level')) { 1069 options.initialZoomLevel = parseInt(element.getAttribute('data-initial-zoom-level'));
1070 element.removeAttribute('data-initial-zoom-level'); 1071 } 1072 if (element.hasAttribute('data-google-maps-api-key')) { 1073 options.googleMapsApiKey = element.getAttribute('data-google-maps-api-key'); 1074 element.removeAttribute('data-google-maps-api-key'); 1075 } 1076 var mapComponent = null; 1077 if (provider === Templates.Components.MapProvider.NorkartWebatlas) { 1078 mapComponent = new Templates.Components.NorkartWebatlasMapComponent(options); 1079 } 1080 else { 1081 mapComponent = new Templates.Components.GoogleMapsMapComponent(options); 1082 } 1083 window.mapComponents.push(mapComponent); 1084 mapComponent.init(); 1085 } 1086 }; 1087 TemplateApplication.prototype.bindValidators = function () { 1088 var _this = this; 1089 var validationButtons = this.rootElement.querySelectorAll('button[data-validation-group]'); 1090 var _loop_7 = function (i, length_16) { 1091 var validationButton = validationButtons[i]; 1092 validationButton.addEventListener('click', function (e) { 1093 var validationGroup = validationButton.getAttribute('data-validation-group'); 1094 var query = '[data-validation-group="' + validationGroup + '"]'; 1095 var validationControls = _this.rootElement.querySelectorAll(query); 1096 var isValid = true; 1097 for (var j = 0, length_17 = validationControls.length; j < length_17; j++) { 1098 var validationControl = validationControls[j]; 1099 if (validationControl.hasAttribute('data-validation-is-required')) { 1100 var isRequred = validationControl.getAttribute('data-validation-is-required') == 'true'; 1101 var isRequiredErrorMessage = validationControl.getAttribute('data-validation-is-required-error-message'); 1102 if (isRequred && !validationControl.value) { 1103 var formControl = validationControl.closest('.ac-content-form-control'); 1104 if (formControl != null) { 1105 formControl.classList.add('ac-content-form-control--invalid'); 1106 if (isRequiredErrorMessage) { 1107 var validationErrorMessageControl = formControl.parentElement.querySelector('.ac-content-form-control-error-message'); 1108 if (!validationErrorMessageControl) { 1109 validationErrorMessageControl = document.createElement("div"); 1110 formControl.parentElement.appendChild(validationErrorMessageControl); 1111 } 1112 validationErrorMessageControl.className = "ac-content-form-control-error-message"; 1113 validationErrorMessageControl.setAttribute('role', 'alert'); 1114 validationErrorMessageControl.setAttribute('aria-live', 'assertive'); 1115 validationErrorMessageControl.textContent = isRequiredErrorMessage; 1116 } 1117 } 1118 isValid = false; 1119 } 1120 } 1121 } 1122 if (!isValid) { 1123 e.preventDefault(); 1124 } 1125 }); 1126 }; 1127 for (var i = 0, length_16 = validationButtons.length; i < length_16; i++) { 1128 _loop_7(i, length_16); 1129 } 1130 }; 1131 TemplateApplication.prototype.bindLoadingTriggers = function () { 1132 var elements = this.rootElement.querySelectorAll('.js-loading-item'); 1133 var _loop_8 = function (i, length_18) { 1134 var element = elements[i]; 1135 var triggerElement = element.querySelector('.js-loading-trigger'); 1136 if (triggerElement) { 1137 var hasTargetBlank = triggerElement.getAttribute('target') === '_blank'; 1138 if (!hasTargetBlank) { 1139 triggerElement.addEventListener('click', function (e) { 1140 element.classList.add('js-loading'); 1141 }); 1142 } 1143 } 1144 }; 1145 for (var i = 0, length_18 = elements.length; i < length_18; i++) { 1146 _loop_8(i, length_18); 1147 } 1148 }; 1149 TemplateApplication.prototype.bindClickableItems = function () { 1150 var _this = this; 1151 var elements = this.rootElement.querySelectorAll('.js-clickable-item'); 1152 var _loop_9 = function (i, length_19) { 1153 var element = elements[i]; 1154 var triggerElement = element.querySelector('.js-click-trigger'); 1155 if (triggerElement) { 1156 element.addEventListener('click', function (event) { 1157 if (!_this.IsInLinkElement(event.target)) { 1158 triggerElement.click(); 1159 } 1160 }); 1161 } 1162 }; 1163 for (var i = 0, length_19 = elements.length; i < length_19; i++) { 1164 _loop_9(i, length_19); 1165 } 1166 }; 1167 TemplateApplication.prototype.bindTooltips = function () { 1168 var _this = this; 1169 var elements = this.rootElement.querySelectorAll('.js-tooltip'); 1170 var _loop_10 = function (i, length_20) { 1171 var element = elements[i]; 1172 var triggerElement = element.querySelector('.ac-tooltip-trigger'); 1173 if (triggerElement) { 1174 triggerElement.addEventListener('click', function (event) { 1175 var isOpen = triggerElement.getAttribute('aria-expanded') === 'true'; 1176 if (!isOpen) { 1177 if (_this.currentTooltip) { 1178 _this.closeTooltip(_this.currentTooltip); 1179 } 1180 _this.currentTooltip = element; 1181 } 1182 triggerElement.setAttribute('aria-expanded', (isOpen) ? 'false' : 'true'); 1183 }); 1184 } 1185 }; 1186 for (var i = 0, length_20 = elements.length; i < length_20; i++) { 1187 _loop_10(i, length_20); 1188 } 1189 }; 1190 TemplateApplication.prototype.closeTooltip = function (element) { 1191 if (element) { 1192 var triggerElement = element.querySelector('.ac-tooltip-trigger'); 1193 if (triggerElement) { 1194 triggerElement.setAttribute('aria-expanded', 'false'); 1195 } 1196 this.currentTooltip = null; 1197 } 1198 }; 1199 return TemplateApplication; 1200 }()); 1201 Templates.TemplateApplication = TemplateApplication; 1202})(Templates || (Templates = {})); 1203var StandardTemplateApplication; 1204(function () { 1205 document.addEventListener('DOMContentLoaded', function () { 1206 var app = new Templates.TemplateApplication(); 1207 StandardTemplateApplication = app; 1208 app.init(); 1209 });
1210})(); 1211var Templates; 1212(function (Templates) { 1213 var Components; 1214 (function (Components) { 1215 'use strict'; 1216 var days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']; 1217 var daysShort = ['MondayAbbreviated', 'TuesdayAbbreviated', 'WednesdayAbbreviated', 'ThursdayAbbreviated', 'FridayAbbreviated', 'SaturdayAbbreviated', 'SundayAbbreviated']; 1218 var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; 1219 var CalendarOptions = (function () { 1220 function CalendarOptions() { 1221 this.showSelectedDatePanel = false; 1222 this.onSelectedDateChangedCallbackName = null; 1223 this.onBeforeInitilizeCallbackName = null; 1224 this.onBuildingDateButtonElement = null; 1225 this.onPreviousMonthCallback = null; 1226 this.onNextMonthCallback = null; 1227 } 1228 return CalendarOptions; 1229 }()); 1230 Components.CalendarOptions = CalendarOptions; 1231 var CalendarComponent = (function () { 1232 function CalendarComponent() { 1233 var _this = this; 1234 this.element = null; 1235 this.weekRowCount = 6; 1236 this.currentMonthOffset = 0; 1237 this.onSelectedDateChangedCallbackCompleted = function () { 1238 _this.isLoadingData = false; 1239 _this.openSelectedDatePanel(); 1240 var elements = _this.calendarTableBody.querySelectorAll('button.js-loading'); 1241 for (var i = 0, length_21 = elements.length; i < length_21; i++) { 1242 var element = elements[i]; 1243 element.classList.remove('js-loading'); 1244 } 1245 }; 1246 this.onSelectedDateChangedCallbackError = function () { 1247 _this.isLoadingData = false; 1248 _this.openSelectedDatePanel(); 1249 var elements = _this.calendarTableBody.querySelectorAll('button.js-loading'); 1250 for (var i = 0, length_22 = elements.length; i < length_22; i++) { 1251 var element = elements[i]; 1252 element.classList.remove('js-loading'); 1253 } 1254 }; 1255 this.onInitilizeCallbackError = function () { 1256 alert("callback error"); 1257 }; 1258 this.activateLoadingCalender = function (element) { 1259 if (element != null) { 1260 element.insertAdjacentHTML("afterbegin", "<span class='server-loading__message'>" 1261 + StandardTemplateApplication.translate("Components.Booking.Templates.WebControls.BookingCalendarControl.LoadingMessage") + 1262 "</span>"); 1263 element.classList.add("server-loading"); 1264 } 1265 }; 1266 this.deactivateLoadingCalender = function (element) { 1267 if (element != null) { 1268 element.classList.remove("server-loading"); 1269 var messageElement = element.querySelector('.server-loading__message'); 1270 if (messageElement) { 1271 element.removeChild(messageElement); 1272 } 1273 } 1274 }; 1275 this.activateLoadingMonth = function (element, isPreviousMonth) { 1276 if (element != null) { 1277 _this.closeSelectedDatePanel(); 1278 var startDate = new Date(_this.options.selectedDate.getFullYear(), _this.options.selectedDate.getMonth() + _this.currentMonthOffset + (isPreviousMonth ? -1 : 1)); 1279 var currentMonth = startDate.getMonth(); 1280 var monthTranslated = StandardTemplateApplication.translate(months[currentMonth]).toLocaleLowerCase(); 1281 element.insertAdjacentHTML("afterbegin", "<span class='server-loading__message'>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t ".concat(StandardTemplateApplication.translate("C
1281omponents.Booking.Templates.WebControls.BookingCalendarControl.LoadingMonthMessage"), " ").concat(monthTranslated, ". \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t </span>")); 1282 element.classList.add("ac-calendar-loading-month-visible"); 1283 element.classList.add("server-loading"); 1284 element.classList.add("server-loading-secondary"); 1285 var table = document.getElementById('js-calendar-table'); 1286 table.setAttribute("style", "visibility: hidden"); 1287 } 1288 }; 1289 this.deactivateLoadingMonth = function (element) { 1290 if (element != null) { 1291 element.classList.remove("ac-calendar-loading-month-visible"); 1292 element.classList.remove("server-loading"); 1293 element.classList.remove("server-loading-secondary"); 1294 var messageElement = element.querySelector('.server-loading__message'); 1295 if (messageElement) { 1296 element.removeChild(messageElement); 1297 } 1298 var table = document.getElementById('js-calendar-table'); 1299 table.setAttribute("style", ""); 1300 } 1301 }; 1302 } 1303 CalendarComponent.prototype.init = function (options) { 1304 if (options.element) { 1305 this.element = options.element; 1306 } 1307 else if (this.options.elementClientID) { 1308 this.element = document.getElementById(options.elementClientID); 1309 } 1310 this.options = options; 1311 if (!this.options.selectedDate) { 1312 this.options.selectedDate = new Date(); 1313 this.selectedOnInitIsNull = true; 1314 } 1315 this.calendarHeader = this.buildCalendarHeader(); 1316 this.element.appendChild(this.calendarHeader); 1317 this.calendarTable = this.buildCalendarTable(); 1318 this.element.appendChild(this.calendarTable); 1319 var jsLoadingMonth = document.createElement('div'); 1320 jsLoadingMonth.setAttribute("id", "js-loading-month"); 1321 jsLoadingMonth.classList.add('ac-calendar-loading-month'); 1322 this.element.appendChild(jsLoadingMonth); 1323 this.element.classList.add("ac-calendar-loaded"); 1324 }; 1325 CalendarComponent.prototype.rebind = function () { 1326 this.selectedDate = null; 1327 this.closeSelectedDatePanel(); 1328 this.buildCalendarTableBodyRows(); 1329 }; 1330 CalendarComponent.prototype.buildCalendarHeader = function () { 1331 var _this = this; 1332 var calendarHeaderElement = document.createElement('div'); 1333 calendarHeaderElement.classList.add('ac-calendar-header'); 1334 var previousMonthButton = document.createElement('button'); 1335 previousMonthButton.type = 'button'; 1336 previousMonthButton.classList.add('ac-calendar-header-change-month-button'); 1337 previousMonthButton.classList.add('ac-icon'); 1338 previousMonthButton.classList.add('ac-icon--left'); 1339 previousMonthButton.classList.add('ac-icon--angle-left'); 1340 var previousMonthButtonSpan = document.createElement('span'); 1341 previousMonthButtonSpan.innerText = StandardTemplateApplication.translate('Templates.Standard.WebControls.TemplateControls.Calendar.PreviousMonth'); 1342 previousMonthButton.appendChild(previousMonthButtonSpan); 1343 previousMonthButton.addEventListener('click', function (e) { 1344 e.preventDefault(); 1345 if (_this.isLoadingData) { 1346 return; 1347 } 1348 var callback = window[_this.options.onPreviousMonthCallback]; 1349 _this.isLoadingData = true; 1350 if (_this.enablePreviousMonthButton()) { 1351 var startDate = new Date(_this.options.selectedDate.getFullYear(), _this.options.selectedDate.getMonth() + _this.currentMonthOffset - 1); 1352 if (typeof callback === "function") { 1353 _this.isLoadingData = true; 1354 callback(startDate.getFullYear(), startDate.getMonth(), function () { 1355 nextMonthButton.disabled = false; 1356 _this.isLoadingData = false; 1357 _this.changeMonth(-1); 1358 if (!_this.enablePreviousMonthButton()) { 1359 previousMonthButton.disabled = true; 1360 } 1361 }); 1362 } 1363 else { 1364 _this.changeMonth(-1); 1365 if (!_this.enablePreviousMonthButton()) { 1366 previousMonthButton.disabled = true; 1367 } 1368 nextMonthButton.disabled = false; 1369 } 1370 } 1371 _this.isLoadingData = false; 1372 }); 1373 if (!this.enablePreviousMonthButton()) { 1374 previousMonthButton.disabled = true; 1375 } 1376 calendarHeaderElement.appendChild(previousMonthButton); 1377 var calendarHeaderTitleElement = document.createElement('div'); 1378 calendarHeaderTitleElement.classList.add('ac-calendar-header-title'); 1379 calendarHeaderElement.appendChild(calendarHeaderTitleElement); 1380 this.calendarHeaderTitle = calendarHeaderTitleElement; 1381 var nextMonthButton = document.createElement('button');
1382 previousMonthButton.type = 'button'; 1383 nextMonthButton.classList.add('ac-calendar-header-change-month-button'); 1384 nextMonthButton.classList.add('ac-icon'); 1385 nextMonthButton.classList.add('ac-icon--right'); 1386 nextMonthButton.classList.add('ac-icon--angle-right'); 1387 var nextMonthButtonSpan = document.createElement('span'); 1388 nextMonthButtonSpan.innerText = StandardTemplateApplication.translate('Templates.Standard.WebControls.TemplateControls.Calendar.NextMonth'); 1389 nextMonthButton.appendChild(nextMonthButtonSpan); 1390 nextMonthButton.addEventListener('click', function (e) { 1391 e.preventDefault(); 1392 if (_this.isLoadingData) { 1393 return; 1394 } 1395 var callback = window[_this.options.onNextMonthCallback]; 1396 if (_this.enableNextMonthButton()) { 1397 var startDate = new Date(_this.options.selectedDate.getFullYear(), _this.options.selectedDate.getMonth() + _this.currentMonthOffset + 1); 1398 if (typeof callback === "function") { 1399 _this.isLoadingData = true; 1400 callback(startDate.getFullYear(), startDate.getMonth(), function () { 1401 previousMonthButton.disabled = false; 1402 _this.isLoadingData = false; 1403 _this.changeMonth(1); 1404 if (!_this.enableNextMonthButton()) { 1405 nextMonthButton.disabled = true; 1406 } 1407 }); 1408 } 1409 else { 1410 _this.changeMonth(1); 1411 if (!_this.enableNextMonthButton()) { 1412 nextMonthButton.disabled = true; 1413 } 1414 previousMonthButton.disabled = false; 1415 _this.isLoadingData = false; 1416 } 1417 } 1418 }); 1419 if (!this.enableNextMonthButton()) { 1420 nextMonthButton.disabled = true; 1421 } 1422 calendarHeaderElement.appendChild(nextMonthButton); 1423 return calendarHeaderElement; 1424 }; 1425 CalendarComponent.prototype.enablePreviousMonthButton = function () { 1426 var lastDayOfPreviousMonth = new Date(this.options.selectedDate.getFullYear(), this.options.selectedDate.getMonth() + (this.currentMonthOffset)); 1427 lastDayOfPreviousMonth.setHours(-24); 1428 return !this.options.minimumDate || this.options.minimumDate < lastDayOfPreviousMonth; 1429 }; 1430 CalendarComponent.prototype.enableNextMonthButton = function () { 1431 var firstDayOfNextMonth = new Date(this.options.selectedDate.getFullYear(), this.options.selectedDate.getMonth() + (this.currentMonthOffset + 1)); 1432 return !this.options.maximumDate || this.options.maximumDate > firstDayOfNextMonth; 1433 }; 1434 CalendarComponent.prototype.setCalendarHeaderTitle = function (text) { 1435 this.calendarHeaderTitle.textContent = text; 1436 }; 1437 CalendarComponent.prototype.buildCalendarTable = function () { 1438 var tableElement = document.createElement('table'); 1439 tableElement.setAttribute("id", 'js-calendar-table'); 1440 tableElement.classList.add('ac-calendar-table'); 1441 this.calendarTableHead = this.buildCalendarTableHead(); 1442 tableElement.appendChild(this.calendarTableHead); 1443 this.calendarTableBody = this.buildCalendarTableBody(); 1444 tableElement.appendChild(this.calendarTableBody); 1445 this.calendarSelectedDatePanel = this.buildSelectedDatePanel(); 1446 this.calendarTableBody.appendChild(this.calendarSelectedDatePanel); 1447 this.buildCalendarTableBodyRows(); 1448 return tableElement; 1449 }; 1450 CalendarComponent.prototype.buildCalendarTableHead = function () { 1451 var theadElement = document.createElement('thead'); 1452 theadElement.setAttribute("id", 'js-calendar-table-head'); 1453 theadElement.classList.add('ac-calendar-table-head'); 1454 var trElement = document.createElement('tr'); 1455 trElement.classList.add('ac-calendar-table-row'); 1456 theadElement.appendChild(trElement); 1457 for (var _i = 0, daysShort_1 = daysShort; _i < daysShort_1.length; _i++) { 1458 var day = daysShort_1[_i]; 1459 var thElement = document.createElement('th'); 1460 thElement.classList.add('ac-calendar-table-cell'); 1461 thElement.setAttribute('scope', 'col'); 1462 thElement.innerText = StandardTemplateApplication.translate(day); 1463 trElement.appendChild(thElement); 1464 } 1465 return theadElement; 1466 }; 1467 CalendarComponent.prototype.buildCalendarTableBody = function () { 1468 var tbodyElement = document.createElement('tbody'); 1469 tbodyElement.classList.add('ac-calendar-table-body'); 1470 return tbodyElement; 1471 }; 1472 CalendarComponent.prototype.buildCalendarTableBodyRows = function () { 1473 var _this = this; 1474 var startDate = new Date(this.options.selectedDate.getFullYear(), this.options.selectedDate.getMonth() + this.currentMonthOffset); 1475 this.currentMonth = startDate.getMonth(); 1476 var currentYear = startDate.getFullYear(); 1477 var startDateInt = startDate.getDate() - startDate.getDay() - 6; 1478 if (startDate.getDay() != 0) { 1479 startDateInt += 7; 1480 } 1481 startDate.setDate(startDateInt); 1482 var queuedDate = startDate; 1483 this.setCalendarHeaderTitle(StandardTemplateApplication.translate(months[this.currentMonth]) + ' ' + currentYear); 1484 this.clearCalendarTableBodyRows(); 1485 var _loop_11 = function (w) { 1486 var trElement = document.createElement('tr'); 1487 trElement.classList.add('ac-calendar-table-row'); 1488 this_1.calendarTableBody.appendChild(trElement); 1489 var _loop_12 = function (d) { 1490 var tdElement = document.createElement('td'); 1491 tdElement.classList.add('ac-calendar-table-cell'); 1492 trElement.appendChild(tdElement); 1493 var year = queuedDate.getFullYear();
1494 var month = queuedDate.getMonth(); 1495 var day = queuedDate.getDate(); 1496 var buttonElement = document.createElement('button'); 1497 buttonElement.type = 'button'; 1498 buttonElement.classList.add('calendar-day-button'); 1499 buttonElement.setAttribute('data-date', year + '-' + month + '-' + day); 1500 buttonElement.setAttribute('aria-label', StandardTemplateApplication.translate(days[d]) + ' ' + day + ' ' + StandardTemplateApplication.translate(months[month]) + ' ' + year); 1501 buttonElement.setAttribute('aria-expanded', 'false'); 1502 buttonElement.setAttribute('aria-controls', this_1.calendarSelectedDatePanel.id); 1503 buttonElement.tabIndex = -1; 1504 if (month == this_1.currentMonth && (this_1.options.minimumDate && queuedDate.getDate() == this_1.options.minimumDate.getDate())) { 1505 buttonElement.tabIndex = 0; 1506 } 1507 if (!this_1.selectedOnInitIsNull && this_1.areEqual(queuedDate, this_1.options.selectedDate)) { 1508 buttonElement.setAttribute('aria-selected', 'true'); 1509 buttonElement.tabIndex = 0; 1510 } 1511 if (queuedDate.getMonth() != this_1.currentMonth) { 1512 buttonElement.classList.add('ac-visually-hidden'); 1513 } 1514 if (queuedDate.getMonth() != this_1.currentMonth || 1515 (this_1.options.minimumDate && queuedDate < this_1.options.minimumDate) || 1516 (this_1.options.maximumDate && queuedDate > this_1.options.maximumDate)) { 1517 buttonElement.disabled = true; 1518 } 1519 if (this_1.options.onBuildingDateButtonElement != null) { 1520 var callback = window[this_1.options.onBuildingDateButtonElement]; 1521 callback(buttonElement, queuedDate); 1522 } 1523 buttonElement.addEventListener('click', function (e) { 1524 if (_this.isLoadingData) { 1525 return; 1526 } 1527 _this.isLoadingData = true; 1528 _this.changeDate(buttonElement); 1529 }); 1530 buttonElement.addEventListener('keydown', function (e) { 1531 if ([37, 38, 39, 40].indexOf(e.keyCode) > -1) { 1532 e.preventDefault(); 1533 } 1534 }); 1535 buttonElement.addEventListener('keyup', function (e) { 1536 if ([37, 38, 39, 40].indexOf(e.keyCode) > -1) { 1537 if (e.keyCode == 37) { 1538 var previousTdElement = _this.getPreviousCalendarBodyCell(tdElement); 1539 if (previousTdElement) { 1540 var previousDateButton = _this.getCalendarBodyDateButton(previousTdElement); 1541 if (previousDateButton && !previousDateButton.disabled) { 1542 buttonElement.tabIndex = -1; 1543 previousDateButton.tabIndex = 0; 1544 previousDateButton.focus(); 1545 } 1546 } 1547 } 1548 else if (e.keyCode == 38) { 1549 var previousRow = _this.getPreviousCalendarBodyRow(trElement); 1550 if (previousRow) { 1551 var previousTdElement = previousRow.children[d]; 1552 var previousDateButton = _this.getCalendarBodyDateButton(previousTdElement); 1553 if (previousDateButton && !previousDateButton.disabled) { 1554 buttonElement.tabIndex = -1; 1555 previousDateButton.tabIndex = 0; 1556 previousDateButton.focus(); 1557 } 1558 } 1559 } 1560 else if (e.keyCode == 39) { 1561 var nextTdElement = _this.getNextCalendarBodyCell(tdElement); 1562 if (nextTdElement) { 1563 var nextDateButton = _this.getCalendarBodyDateButton(nextTdElement); 1564 if (nextDateButton && !nextDateButton.disabled) { 1565 buttonElement.tabIndex = -1; 1566 nextDateButton.tabIndex = 0; 1567 nextDateButton.focus(); 1568 } 1569 } 1570 } 1571 else if (e.keyCode == 40) { 1572 var nextRow = _this.getNextCalendarBodyRow(trElement); 1573 if (nextRow) { 1574 var nextTdElement = nextRow.children[d]; 1575 var nextDateButton = _this.getCalendarBodyDateButton(nextTdElement); 1576 if (nextDateButton && !nextDateButton.disabled) { 1577 buttonElement.tabIndex = -1; 1578 nextDateButton.tabIndex = 0; 1579 nextDateButton.focus(); 1580 } 1581 } 1582 } 1583 } 1584 }); 1585 buttonElement.innerHTML = '<span>' + queuedDate.getDate().toString() + '</span>'; 1586 tdElement.appendChild(buttonElement); 1587 queuedDate.setDate(queuedDate.getDate() + 1); 1588 }; 1589 for (var d = 0; d < 7; d++) { 1590 _loop_12(d); 1591 } 1592 }; 1593 var this_1 = this; 1594 for (var w = 0; w < this.weekRowCount; w++) { 1595 _loop_11(w); 1596 } 1597 }; 1598 CalendarComponent.prototype.getCalendarBodyDateButton = function (currentCell) { 1599 return currentCell.firstChild; 1600 }; 1601 CalendarComponent.prototype.getNextCalendarBodyCell = function (currentCell) { 1602 var nextTdElement = currentCell.nextElementSibling; 1603 if (nextTdElement) { 1604 return nextTdElement; 1605 } 1606 else { 1607 var nextTrElement = this.getNextCalendarBodyRow(currentCell.parentElement); 1608 if (nextTrElement) { 1609 var firstTdElement = nextTrElement.firstElementChild; 1610 if (firstTdElement) { 1611 return firstTdElement; 1612 } 1613 } 1614 } 1615 return null; 1616 }; 1617 CalendarComponent.prototype.getPreviousCalendarBodyCell = function (currentCell) { 1618 var previousTdElement = currentCell.previousElementSibling; 1619 if (previousTdElement) { 1620 return previousTdElement; 1621 } 1622 else { 1623 var nextTrElement = this.getPreviousCalendarBodyRow(currentCell.parentElement); 1624 if (nextTrElement) { 1625 var lastTdElement = nextTrElement.lastElementChild; 1626 if (lastTdElement) { 1627 return lastTdElement; 1628 } 1629 } 1630 } 1631 return null; 1632 }; 1633 CalendarComponent.prototype.getNextCalendarBodyRow = function (currentRow) { 1634 var nextTrElement = currentRow.nextElementSibling; 1635 if (nextTrElement) { 1636 if (nextTrElement == this.calendarSelectedDatePanel) { 1637 return this.getNextCalendarBodyRow(this.calendarSelectedDatePanel); 1638 } 1639 return nextTrElement; 1640 } 1641 return null; 1642 }; 1643 CalendarComponent.prototype.getPreviousCalendarBodyRow = function (currentRow) { 1644 var previousRow = currentRow.previousElementSibling; 1645 if (previousRow) { 1646 if (previousRow == this.calendarSelectedDatePanel) { 1647 return this.getPreviousCalendarBodyRow(this.calendarSelectedDatePanel); 1648 } 1649 return previousRow; 1650 } 1651 return null; 1652 }; 1653 CalendarComponent.prototype.clearCalendarTableBodyRows = function () { 1654 var trElements = this.calendarTableBody.querySelectorAll('tr'); 1655 for (var i = 0, length_23 = trElements.length; i < length_23; i++) { 1656 var trElement = trElements[i]; 1657 if (trElement != this.calendarSelectedDatePanel) { 1658 trElement.parentElement.removeChild(trElement); 1659 } 1660 } 1661 }; 1662 CalendarComponent.prototype.buildSelectedDatePanel = function () { 1663 var trElement = document.createElement('tr');
1664 trElement.id = this.element.id + '-calendar-selected-date-panel'; 1665 trElement.classList.add('ac-calendar-selected-date-panel'); 1666 trElement.setAttribute('role', 'alert'); 1667 trElement.setAttribute('aria-live', 'assertive'); 1668 var tdElement = document.createElement('td'); 1669 tdElement.colSpan = 7; 1670 trElement.appendChild(tdElement); 1671 var divElement = document.createElement('div'); 1672 divElement.classList.add('ac-calendar-selected-date-panel-content'); 1673 tdElement.appendChild(divElement); 1674 this.calendarSelectedDatePanelContent = divElement; 1675 return trElement; 1676 }; 1677 CalendarComponent.prototype.openSelectedDatePanel = function () { 1678 if (this.options.showSelectedDatePanel) { 1679 this.calendarSelectedDatePanel.classList.add('ac-calendar-selected-date-panel--open'); 1680 } 1681 }; 1682 CalendarComponent.prototype.closeSelectedDatePanel = function () { 1683 this.calendarSelectedDatePanel.classList.remove('ac-calendar-selected-date-panel--open'); 1684 }; 1685 CalendarComponent.prototype.changeMonth = function (offset) { 1686 this.selectedDate = null; 1687 this.currentMonthOffset += offset; 1688 this.closeSelectedDatePanel(); 1689 this.buildCalendarTableBodyRows(); 1690 }; 1691 CalendarComponent.prototype.changeDate = function (button) { 1692 var dateString = button.getAttribute('data-date').split('-'); 1693 var year = parseInt(dateString[0]); 1694 var month = parseInt(dateString[1]); 1695 var day = parseInt(dateString[2]); 1696 var selected = this.calendarTableBody.querySelector('[aria-selected]'); 1697 if (selected && selected != button) { 1698 selected.removeAttribute('aria-selected'); 1699 selected.setAttribute('aria-expanded', 'false'); 1700 } 1701 var expanded = button.getAttribute('aria-expanded'); 1702 if (expanded == 'true') { 1703 this.selectedDate = null; 1704 selected.removeAttribute('aria-selected'); 1705 selected.setAttribute('aria-expanded', 'false'); 1706 this.closeSelectedDatePanel(); 1707 this.calendarSelectedDatePanelContent.innerHTML = ''; 1708 this.isLoadingData = false; 1709 } 1710 else { 1711 button.setAttribute('aria-selected', 'true'); 1712 button.setAttribute('aria-expanded', 'true'); 1713 this.closeSelectedDatePanel(); 1714 var inputDate = new Date(year, month, day); 1715 this.selectedDate = inputDate; 1716 this.setCalendarHeaderTitle(StandardTemplateApplication.translate(months[this.currentMonth]) + ' ' + year); 1717 this.selectedTableBodyRow = button.parentElement.parentElement; 1718 this.updateSelectedDatePanelContent(); 1719 if (this.options.onSelectedDateChangedCallbackName) { 1720 button.classList.add('js-loading'); 1721 this.openSelectedDatePanel(); 1722 var callback = window[this.options.onSelectedDateChangedCallbackName]; 1723 if (typeof callback === "function") { 1724 callback(this.calendarSelectedDatePanelContent, this.selectedDate, this.onSelectedDateChangedCallbackCompleted, this.onSelectedDateChangedCallbackError); 1725 } 1726 else { 1727 this.isLoadingData = false; 1728 } 1729 } 1730 else { 1731 this.openSelectedDatePanel(); 1732 this.isLoadingData = false; 1733 } 1734 } 1735 }; 1736 CalendarComponent.prototype.updateSelectedDatePanelContent = function () { 1737 this.calendarSelectedDatePanelContent.innerHTML = ''; 1738 this.calendarSelectedDatePanel.parentNode.insertBefore(this.calendarSelectedDatePanel, this.selectedTableBodyRow.nextSibling); 1739 }; 1740 CalendarComponent.prototype.areEqual = function (x, y) { 1741 if (typeof (x) != 'object' || typeof (y) != 'object' || x == null || y == null) { 1742 return false; 1743 } 1744 return (x.getDate() == y.getDate() && x.getMonth() == y.getMonth() && x.getFullYear() == y.getFullYear()); 1745 }; 1746 CalendarComponent.prototype.log = function (message) { 1747 if (typeof console !== 'undefined') { 1748 console.log(message); 1749 } 1750 }; 1751 return CalendarComponent; 1752 }()); 1753 Components.CalendarComponent = CalendarComponent; 1754 })(Components = Templates.Components || (Templates.Components = {})); 1755})(Templates || (Templates = {})); 1756var Templates; 1757(function (Templates) { 1758 var Components; 1759 (function (Components) { 1760 var LightboxWindow = (function () { 1761 function LightboxWindow() { 1762 this.translations = {};
1763 this._mode = 'DetailView'; 1764 this._images = []; 1765 this._currentIndex = 0; 1766 } 1767 Object.defineProperty(LightboxWindow.prototype, "element", { 1768 get: function () { 1769 return this._element; 1770 }, 1771 enumerable: false, 1772 configurable: true 1773 }); 1774 Object.defineProperty(LightboxWindow.prototype, "mode", { 1775 get: function () { 1776 return this._mode; 1777 }, 1778 enumerable: false, 1779 configurable: true 1780 }); 1781 Object.defineProperty(LightboxWindow.prototype, "images", { 1782 get: function () { 1783 return this._images; 1784 }, 1785 enumerable: false, 1786 configurable: true 1787 }); 1788 LightboxWindow.prototype.init = function () { 1789 var _this = this; 1790 this.bindFunctions(); 1791 if (window.StandardTemplateTranslations) { 1792 var translations = window.StandardTemplateTranslations; 1793 var map = {}; 1794 for (var i = 0, length_24 = translations.length; i < length_24; i++) { 1795 var translation = translations[i]; 1796 map[translation.key] = translation.value; 1797 } 1798 this.translations = map; 1799 } 1800 var overlayElement = document.createElement('div'); 1801 overlayElement.className = 'ac-lightbox-overlay'; 1802 var lightboxElement = document.createElement('div'); 1803 lightboxElement.className = 'ac-lightbox'; 1804 overlayElement.appendChild(lightboxElement); 1805 var headerElement = document.createElement('div'); 1806 headerElement.className = 'ac-lightbox-header'; 1807 lightboxElement.appendChild(headerElement); 1808 var fullScreenToggleElement = document.createElement('button'); 1809 fullScreenToggleElement.className = 'ac-lightbox-button ac-lightbox-button--fullscreen'; 1810 fullScreenToggleElement.type = 'button'; 1811 fullScreenToggleElement.addEventListener('click', function () { 1812 if (_this._isFullscreen) { 1813 fullScreenToggleElement.classList.remove('ac-lightbox-button--fullscreen-open'); 1814 } 1815 else { 1816 fullScreenToggleElement.classList.add('ac-lightbox-button--fullscreen-open'); 1817 } 1818 _this.toggleFullscreen(); 1819 }); 1820 headerElement.appendChild(fullScreenToggleElement); 1821 var fullScreenToggleTextElement = document.createElement('span'); 1822 fullScreenToggleTextElement.textContent = this.translate('Templates.Components.Lightbox.Fullscreen') || 'Fullscreen'; 1823 fullScreenToggleTextElement.className = 'ac-visually-hidden'; 1824 fullScreenToggleElement.appendChild(fullScreenToggleTextElement); 1825 var lightboxIndexTextElement = document.createElement('div'); 1826 lightboxIndexTextElement.className = 'ac-lightbox-index-indicator'; 1827 lightboxIndexTextElement.textContent = '0 / 0'; 1828 headerElement.appendChild(lightboxIndexTextElement); 1829 this._indexTextElement = lightboxIndexTextElement; 1830 var lightboxIndexTextLabelElement = document.createElement('span'); 1831 lightboxIndexTextLabelElement.className = 'ac-visually-hidden'; 1832 lightboxIndexTextLabelElement.textContent = "".concat(this.translate('Templates.Components.Lightbox.Image'), " "); 1833 this._indexTextElement.appendChild(lightboxIndexTextLabelElement); 1834 var lightboxModeButtonElement = document.createElement('button'); 1835 lightboxModeButtonElement.className = 'ac-lightbox-button ac-lightbox-button--mode'; 1836 lightboxModeButtonElement.type = 'button'; 1837 lightboxModeButtonElement.addEventListener('click', function (event) { 1838 _this.toggleView(); 1839 }); 1840 headerElement.appendChild(lightboxModeButtonElement); 1841 this._modeButtonElement = lightboxModeButtonElement; 1842 var lightboxModeButtonTextElement = document.createElement('span'); 1843 lightboxModeButtonTextElement.className = 'ac-lightbox-button-text'; 1844 lightboxModeButtonTextElement.textContent = (this.mode === 'DetailVie
1844w') ? this.translate('Templates.Components.Lightbox.ListView') : this.translate('Templates.Components.Lightbox.DetailView'); 1845 lightboxModeButtonElement.appendChild(lightboxModeButtonTextElement); 1846 this._modeButtonTextElement = lightboxModeButtonTextElement; 1847 var closeButtonElement = document.createElement('button'); 1848 closeButtonElement.className = 'ac-lightbox-button ac-lightbox-button--close'; 1849 closeButtonElement.type = 'button'; 1850 closeButtonElement.addEventListener('click', function (event) { 1851 _this.close(); 1852 }); 1853 headerElement.appendChild(closeButtonElement); 1854 this._closeButtonElement = closeButtonElement; 1855 var closeButtonTextElement = document.createElement('span'); 1856 closeButtonTextElement.className = 'ac-lightbox-button-text'; 1857 closeButtonTextElement.textContent = this.translate('Templates.Components.Lightbox.Close'); 1858 closeButtonElement.appendChild(closeButtonTextElement); 1859 var bodyElement = document.createElement('div'); 1860 bodyElement.className = 'ac-lightbox-body'; 1861 lightboxElement.appendChild(bodyElement); 1862 this._bodyElement = bodyElement; 1863 var footerElement = document.createElement('div'); 1864 footerElement.className = 'ac-lightbox-footer'; 1865 lightboxElement.appendChild(footerElement); 1866 var previousImageButtonElement = document.createElement('button'); 1867 previousImageButtonElement.className = 'ac-lightbox-button ac-lightbox-button--previous'; 1868 previousImageButtonElement.type = 'button'; 1869 previousImageButtonElement.addEventListener('click', function (event) { 1870 _this.showPreviousImage(); 1871 }); 1872 footerElement.appendChild(previousImageButtonElement); 1873 this._previousImageButtonElement = previousImageButtonElement; 1874 var previousImageButtonTextElement = document.createElement('span'); 1875 previousImageButtonTextElement.className = 'ac-lightbox-button-text'; 1876 previousImageButtonTextElement.textContent = this.translate('Templates.Components.Lightbox.PreviousImage'); 1877 previousImageButtonElement.appendChild(previousImageButtonTextElement); 1878 var nextImageButtonElement = document.createElement('button'); 1879 nextImageButtonElement.className = 'ac-lightbox-button ac-lightbox-button--next'; 1880 nextImageButtonElement.type = 'button'; 1881 nextImageButtonElement.addEventListener('click', function (event) { 1882 _this.showNextImage(); 1883 }); 1884 footerElement.appendChild(nextImageButtonElement); 1885 this._nextImageButtonElement = nextImageButtonElement; 1886 var nextImageButtonTextElement = document.createElement('span'); 1887 nextImageButtonTextElement.className = 'ac-lightbox-button-text'; 1888 nextImageButtonTextElement.textContent = this.translate('Templates.Components.Lightbox.NextImage'); 1889 nextImageButtonElement.appendChild(nextImageButtonTextElement); 1890 this._element = overlayElement; 1891 document.addEventListener('keydown', function (event) { 1892 var keyCode = event.which || event.keyCode; 1893 if (event.keyCode === 9) { 1894 if (_this.isOpen()) { 1895 var focusableElements = overlayElement.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'); 1896 var firstFocusableElement = focusableElements[0]; 1897 var lastFocusableElement = focusableElements[focusableElements.length - 1]; 1898 var targetElement = event.target; 1899 if (!targetElement.closest('.ac-lightbox-overlay')) { 1900 event.preventDefault(); 1901 } 1902 else { 1903 if (event.target === lastFocusableElement && !event.shiftKey) { 1904 event.preventDefault(); 1905 firstFocusableElement.focus(); 1906 } 1907 else if (event.target === firstFocusableElement && event.shiftKey) { 1908 event.preventDefault(); 1909 lastFocusableElement.focus(); 1910 } 1911 } 1912 } 1913 } 1914 }); 1915 document.addEventListener('keyup', function (event) { 1916 var keyCode = event.which || event.keyCode; 1917 if (keyCode === 27) { 1918 _this.close(); 1919 } 1920 }); 1921 document.addEventListener('fullscreenchange', function (event) { 1922 var notFullscreen = !document.fullscreen && !document.fullscreenEnabled && !document.webkitFullscreenElement && !document.mozFullscreenElement; 1923 if (notFullscreen) { 1924 _this.exitFullscreen(); 1925 } 1926 }); 1927 this.addSwipeGestures(); 1928 }; 1929 LightboxWindow.prototype.translate = function (key) { 1930 return this.translations[key]; 1931 }; 1932 LightboxWindow.prototype.clear = function () { 1933 this._images = []; 1934 this._currentIndex = 0; 1935 }; 1936 LightboxWindow.prototype.addImage = function (image) { 1937 this._images.push(image); 1938 }; 1939 LightboxWindow.prototype.open = function (startIndex, initiator) { 1940 this._currentIndex = startIndex; 1941 this._currentInitiator = initiator;
1942 this.showDetailView(); 1943 this.element.className = 'ac-lightbox-overlay ac-lightbox-overlay--open'; 1944 }; 1945 LightboxWindow.prototype.close = function () { 1946 if (this._currentInitiator) { 1947 this._currentInitiator.focus(); 1948 } 1949 this._currentInitiator = null; 1950 this.element.className = 'ac-lightbox-overlay'; 1951 this.exitFullscreen(); 1952 }; 1953 LightboxWindow.prototype.bindFunctions = function () { 1954 this.toggleFullscreen = this.toggleFullscreen.bind(this); 1955 }; 1956 LightboxWindow.prototype.toggleView = function () { 1957 if (this.mode === 'DetailView') { 1958 this.showListView(); 1959 } 1960 else { 1961 this.showDetailView(); 1962 } 1963 }; 1964 LightboxWindow.prototype.showDetailView = function () { 1965 var _this = this; 1966 this._mode = 'DetailView'; 1967 this._indexTextElement.textContent = "".concat(this._currentIndex + 1, " ").concat(this.translate('Templates.Components.Lightbox.Of'), " ").concat(this.images.length); 1968 this._modeButtonElement.classList.remove('detail-view'); 1969 this._modeButtonTextElement.textContent = this.translate('Templates.Components.Lightbox.ListView'); 1970 this._nextImageButtonElement.hidden = false; 1971 this._nextImageButtonElement.disabled = !this.hasNextImage(); 1972 this._previousImageButtonElement.hidden = false; 1973 this._previousImageButtonElement.disabled = !this.hasPreviousImage(); 1974 setTimeout(function () { 1975 if (!_this.hasNextImage()) { 1976 if (!_this.hasPreviousImage()) { 1977 _this._closeButtonElement.focus(); 1978 } 1979 else { 1980 _this._previousImageButtonElement.focus(); 1981 } 1982 } 1983 else if (!_this.hasPreviousImage()) { 1984 if (!_this.hasNextImage()) { 1985 _this._closeButtonElement.focus(); 1986 } 1987 else { 1988 _this._nextImageButtonElement.focus(); 1989 } 1990 } 1991 }, 100); 1992 this.clearBodyContent(); 1993 if (this.images.length > 0) { 1994 var currentImage = this.images[this._currentIndex]; 1995 var imageElement = document.createElement('img'); 1996 imageElement.className = 'ac-lightbox-image'; 1997 imageElement.src = currentImage.imageUrl; 1998 imageElement.alt = currentImage.alttext; 1999 this._bodyElement.appendChild(imageElement); 2000 if (currentImage.description) { 2001 var descriptionElement = document.createElement('div'); 2002 descriptionElement.className = 'ac-lightbox-image-description'; 2003 descriptionElement.innerHTML = currentImage.description; 2004 this._bodyElement.appendChild(descriptionElement); 2005 } 2006 } 2007 }; 2008 LightboxWindow.prototype.isOpen = function () { 2009 return this.element.classList.contains('ac-lightbox-overlay--open'); 2010 }; 2011 LightboxWindow.prototype.hasPreviousImage = function () { 2012 return this._currentIndex > 0; 2013 }; 2014 LightboxWindow.prototype.hasNextImage = function () { 2015 return this._currentIndex < this.images.length - 1; 2016 }; 2017 LightboxWindow.prototype.showPreviousImage = function () { 2018 if (this.hasPreviousImage()) { 2019 this._currentIndex--;
2020 this.showDetailView(); 2021 } 2022 }; 2023 LightboxWindow.prototype.showNextImage = function () { 2024 if (this.hasNextImage()) { 2025 this._currentIndex++; 2026 this.showDetailView(); 2027 } 2028 }; 2029 LightboxWindow.prototype.showListView = function () { 2030 var _this = this; 2031 this._mode = 'ListView'; 2032 this._modeButtonElement.classList.add('detail-view'); 2033 this._modeButtonTextElement.textContent = this.translate('Templates.Components.Lightbox.DetailView'); 2034 this._nextImageButtonElement.hidden = true; 2035 this._previousImageButtonElement.hidden = true; 2036 setTimeout(function () { _this._closeButtonElement.focus(); }, 100); 2037 this.clearBodyContent(); 2038 if (this.images.length > 0) { 2039 var ulElement = document.createElement('ul'); 2040 ulElement.className = 'ac-lightbox-thumbnail-list'; 2041 var _loop_13 = function (j, length_25) { 2042 var image = this_2.images[j]; 2043 var liElement = document.createElement('li'); 2044 liElement.className = 'ac-lightbox-thumbnail'; 2045 ulElement.appendChild(liElement); 2046 var anchorElement = document.createElement('a'); 2047 anchorElement.className = 'ac-lightbox-thumbnail-anchor'; 2048 anchorElement.href = '#'; 2049 anchorElement.addEventListener('click', function (event) { 2050 event.preventDefault(); 2051 _this._currentIndex = j; 2052 _this.toggleView(); 2053 setTimeout(function () { 2054 if (!_this.hasNextImage()) { 2055 if (!_this.hasPreviousImage()) { 2056 _this._closeButtonElement.focus(); 2057 } 2058 else { 2059 _this._previousImageButtonElement.focus(); 2060 } 2061 } 2062 else if (!_this.hasPreviousImage()) { 2063 if (!_this.hasNextImage()) { 2064 _this._closeButtonElement.focus(); 2065 } 2066 else { 2067 _this._nextImageButtonElement.focus(); 2068 } 2069 } 2070 else { 2071 _this._nextImageButtonElement.focus(); 2072 } 2073 }, 100); 2074 }); 2075 liElement.appendChild(anchorElement); 2076 var imageElement = document.createElement('img'); 2077 imageElement.className = 'ac-lightbox-thumbnail-image'; 2078 imageElement.src = image.thumbnailUrl; 2079 imageElement.alt = image.alttext; 2080 anchorElement.appendChild(imageElement); 2081 }; 2082 var this_2 = this; 2083 for (var j = 0, length_25 = this.images.length; j < length_25; j++) { 2084 _loop_13(j, length_25); 2085 } 2086 this._bodyElement.appendChild(ulElement); 2087 } 2088 }; 2089 LightboxWindow.prototype.clearBodyContent = function () { 2090 while (this._bodyElement.firstChild) { 2091 this._bodyElement.removeChild(this._bodyElement.firstChild); 2092 } 2093 }; 2094 LightboxWindow.prototype.requestFullscreen = function () { 2095 if (this._isFullscreen) { 2096 return; 2097 } 2098 if (this.supportsFullscreen()) { 2099 this._element.requestFullscreen(); 2100 } 2101 this._isFullscreen = true; 2102 this._element.classList.add('ac-lightbox-overlay--fullscreen'); 2103 }; 2104 LightboxWindow.prototype.exitFullscreen = function () { 2105 if (!this._isFullscreen) { 2106 return; 2107 } 2108 if (this.supportsFullscreen()) { 2109 document.exitFullscreen(); 2110 } 2111 this._isFullscreen = false; 2112 this._element.classList.remove('ac-lightbox-overlay--fullscreen'); 2113 }; 2114 LightboxWindow.prototype.toggleFullscreen = function () { 2115 if (this._isFullscreen) { 2116 this.exitFullscreen(); 2117 } 2118 else { 2119 this.requestFullscreen(); 2120 } 2121 }; 2122 LightboxWindow.prototype.supportsFullscreen = function () { 2123 return (!!document.body.requestFullscreen && !!document.exitFullscreen); 2124 }; 2125 LightboxWindow.prototype.addSwipeGestures = function () { 2126 this._element.addEventListener('mousedown', lock.bind(this)); 2127 this._element.addEventListener('touchstart', lock.bind(this)); 2128 this._element.addEventListener('mouseup', move.bind(this)); 2129 this._element.addEventListener('touchend', move.bind(this)); 2130 var x0 = null; 2131 function lock(event) { 2132 x0 = unify(event).clientX; 2133 } 2134 function move(event) {
2135 if (this._mode !== 'DetailView') { 2136 return; 2137 } 2138 if (x0 || x0 === 0) { 2139 var dx = unify(event).clientX - x0; 2140 var movingToTheLeft = dx < 0; 2141 var movingToTheRight = dx > 0; 2142 if (movingToTheLeft) { 2143 this.showNextImage(); 2144 } 2145 else if (movingToTheRight) { 2146 this.showPreviousImage(); 2147 } 2148 x0 = null; 2149 } 2150 } 2151 function unify(event) { 2152 return event.changedTouches ? event.changedTouches[0] : event; 2153 } 2154 }; 2155 return LightboxWindow; 2156 }()); 2157 Components.LightboxWindow = LightboxWindow; 2158 var LightboxImage = (function () { 2159 function LightboxImage() { 2160 } 2161 return LightboxImage; 2162 }()); 2163 Components.LightboxImage = LightboxImage; 2164 var LightboxApplicationOptions = (function () { 2165 function LightboxApplicationOptions() { 2166 this.anchorSelector = '.js-lightbox-image-anchor'; 2167 this.imageSelector = '.js-lightbox-image'; 2168 this.collectionSelector = '.js-lightbox-image-collection'; 2169 this.imageUrlDataAttributteName = 'data-lightbox-image-url'; 2170 this.thumbnailUrlDataAttributteName = 'data-lightbox-thumbnail-url'; 2171 this.descriptionDataAttributteName = 'data-lightbox-image-description'; 2172 this.alttextDataAttributteName = 'data-lightbox-image-alttext'; 2173 } 2174 return LightboxApplicationOptions; 2175 }()); 2176 Components.LightboxApplicationOptions = LightboxApplicationOptions; 2177 var LightboxApplication = (function () { 2178 function LightboxApplication(options) { 2179 var _this = this; 2180 this.clickHandler = function (e) { 2181 e.preventDefault(); 2182 var anchorElements = document.body.querySelectorAll(_this.options.anchorSelector); 2183 var anchorElement = event.currentTarget; 2184 _this.window.clear(); 2185 var _imageElements = []; 2186 var _imageElement = anchorElement.querySelector(_this.options.imageSelector); 2187 if (_imageElement) { 2188 var imageCollectionElement = anchorElement.closest(_this.options.collectionSelector); 2189 if (imageCollectionElement) { 2190 var imageElements = imageCollectionElement.querySelectorAll(_this.options.imageSelector); 2191 if (imageElements) { 2192 for (var j = 0, length_26 = imageElements.length; j < length_26; j++) { 2193 var imageElement = imageElements[j]; 2194 var imageUrl = imageElement.getAttribute(_this.options.imageUrlDataAttributteName); 2195 var thumbnailUrl = imageElement.getAttribute(_this.options.thumbnailUrlDataAttributteName); 2196 var description = imageElement.getAttribute(_this.options.descriptionDataAttributteName); 2197 var alttext = imageElement.getAttribute(_this.options.alttextDataAttributteName); 2198 if (imageUrl && thumbnailUrl) { 2199 var image = new LightboxImage(); 2200 image.imageUrl = imageUrl; 2201 image.thumbnailUrl = thumbnailUrl; 2202 image.description = description; 2203 image.alttext = alttext; 2204 _this.window.addImage(image); 2205 _imageElements.push(imageElement); 2206 } 2207 } 2208 } 2209 } 2210 else { 2211 for (var j = 0, length_27 = anchorElements.length; j < length_27; j++) { 2212 var ab = anchorElements[j]; 2213 if (!ab.closest(_this.options.collectionSelector)) { 2214 var imageElement = ab.querySelector(_this.options.imageSelector); 2215 if (imageElement) { 2216 var imageUrl = imageElement.getAttribute(_this.options.imageUrlDataAttributteName); 2217 var thumbnailUrl = imageElement.getAttribute(_this.options.thumbnailUrlDataAttributteName); 2218 var description = imageElement.getAttribute(_this.options.descriptionDataAttributteName); 2219 var alttext = imageElement.getAttribute(_this.options.alttextDataAttributteName); 2220 if (imageUrl && thumbnailUrl) { 2221 var image = new LightboxImage(); 2222 image.imageUrl = imageUrl; 2223 image.thumbnailUrl = thumbnailUrl; 2224 image.description = description; 2225 image.alttext = alttext; 2226 _this.window.addImage(image); 2227 _imageElements.push(imageElement); 2228 } 2229 } 2230 } 2231 } 2232 } 2233 var imageIndex = ([].slice.call(_imageElements)).indexOf(_imageElement); 2234 _this.window.open(imageIndex, anchorElement); 2235 } 2236 }; 2237 this._options = options; 2238 this._window = new Components.LightboxWindow(); 2239 } 2240 Object.defineProperty(LightboxApplication.prototype, "options", { 2241 get: function () { 2242 return this._options; 2243 }, 2244 enumerable: false, 2245 configurable: true 2246 }); 2247 Object.defineProperty(LightboxApplication.prototype, "window", { 2248 get: function () { 2249 return this._window; 2250 }, 2251 enumerable: false, 2252 configurable: true 2253 }); 2254 LightboxApplication.prototype.init = function () { 2255 var _this = this; 2256 this.window.init(); 2257 document.body.appendChild(this.window.element); 2258 this.bindAnchors();
2259 if (window.eventBus) { 2260 window.eventBus.addEventListener('init-lightbox', function (event) { 2261 _this.bindAnchors(); 2262 }); 2263 window.eventBus.addEventListener('show-container', function (event) { 2264 _this.bindAnchors(); 2265 }); 2266 } 2267 }; 2268 ; 2269 LightboxApplication.prototype.bindAnchors = function () { 2270 var anchorElements = document.body.querySelectorAll(this.options.anchorSelector); 2271 if (anchorElements) { 2272 for (var i = 0, length_28 = anchorElements.length; i < length_28; i++) { 2273 var anchorElement = anchorElements[i]; 2274 anchorElement.removeEventListener('click', this.clickHandler); 2275 anchorElement.addEventListener('click', this.clickHandler); 2276 } 2277 } 2278 }; 2279 return LightboxApplication; 2280 }()); 2281 Components.LightboxApplication = LightboxApplication; 2282 })(Components = Templates.Components || (Templates.Components = {})); 2283})(Templates || (Templates = {})); 2284var Templates; 2285(function (Templates) { 2286 var Components; 2287 (function (Components) { 2288 'use strict';
2289 var MapProvider; 2290 (function (MapProvider) { 2291 MapProvider[MapProvider["Google"] = 1] = "Google"; 2292 MapProvider[MapProvider["NorkartWebatlas"] = 2] = "NorkartWebatlas"; 2293 })(MapProvider = Components.MapProvider || (Components.MapProvider = {})); 2294 var GoogleMapsMapOptions = (function () { 2295 function GoogleMapsMapOptions() { 2296 this.items = []; 2297 this.initialLatitude = 60.3470988; 2298 this.initialLongitude = 5.1324035; 2299 this.initialZoomLevel = 16; 2300 } 2301 return GoogleMapsMapOptions; 2302 }()); 2303 Components.GoogleMapsMapOptions = GoogleMapsMapOptions; 2304 var NorkartWebatlasMapOptions = (function () { 2305 function NorkartWebatlasMapOptions() { 2306 this.items = []; 2307 this.initialLatitude = 60.3470988; 2308 this.initialLongitude = 5.1324035; 2309 this.initialZoomLevel = 16; 2310 } 2311 return NorkartWebatlasMapOptions; 2312 }()); 2313 Components.NorkartWebatlasMapOptions = NorkartWebatlasMapOptions; 2314 var GoogleMapsMapComponent = (function () { 2315 function GoogleMapsMapComponent(options) { 2316 this.items = []; 2317 this.element = options.element; 2318 this.options = options; 2319 this.items = options.items; 2320 } 2321 Object.defineProperty(GoogleMapsMapComponent.prototype, "$typeName", { 2322 get: function () { 2323 return 'Google'; 2324 }, 2325 enumerable: false, 2326 configurable: true 2327 }); 2328 GoogleMapsMapComponent.prototype.init = function () { 2329 if (!window.initMap) { 2330 var s = document.createElement('script'); 2331 s.type = 'text/javascript'; 2332 s.async = true; 2333 s.src = 'https://maps.googleapis.com/maps/api/js?key=' + this.options.googleMapsApiKey + '&language=no®ion=no&callback=initMap'; 2334 var x = document.getElementsByTagName('script')[0]; 2335 x.parentNode.insertBefore(s, x); 2336 window.initMap = function () { 2337 var elements = window['mapComponents']; 2338 if (elements) { 2339 for (var i = 0, length_29 = elements.length; i < length_29; i++) { 2340 var mapComponent = elements[i]; 2341 if (mapComponent.$typeName === 'Google') { 2342 var mapControl = mapComponent.element.querySelector('.ac-map-canvas'); 2343 mapComponent.map = new google.maps.Map(mapControl, { 2344 center: { lat: mapComponent.options.initialLatitude, lng: mapComponent.options.initialLongitude }, 2345 zoom: mapComponent.options.initialZoomLevel 2346 }); 2347 mapComponent.markers = []; 2348 if (mapComponent.items.length > 0 || mapComponent.options.geoJSON) { 2349 mapComponent.render(); 2350 } 2351 } 2352 } 2353 } 2354 }; 2355 } 2356 }; 2357 GoogleMapsMapComponent.prototype.render = function () { 2358 this.renderMap(); 2359 }; 2360 GoogleMapsMapComponent.prototype.renderMap = function () { 2361 var _this = this; 2362 if (this.map) { 2363 var markerBounds = new google.maps.LatLngBounds(); 2364 var itemTemplate = void 0; 2365 var itemTemplateElement = this.element.querySelector('.item-template'); 2366 if (itemTemplateElement) { 2367 var itemTemplateHtml = itemTemplateElement.innerHTML; 2368 itemTemplate = Handlebars.compile(itemTemplateHtml); 2369 } 2370 var _loop_14 = function (i, length_30) { 2371 var item = this_3.items[i]; 2372 myLatLng = { lat: item.Latitude, lng: item.Longitude }; 2373 var marker = new google.maps.Marker({ 2374 position: myLatLng, 2375 map: this_3.map 2376 }); 2377 if (item.IconUrl) { 2378 marker.setIcon(item.IconUrl); 2379 } 2380 if (itemTemplate) { 2381 var infowindow_1 = new google.maps.InfoWindow({ 2382 content: itemTemplate(item) 2383 }); 2384 marker.addListener('click', function () { 2385 infowindow_1.open(this.map, marker); 2386 }); 2387 } 2388 markerBounds.extend(myLatLng); 2389 this_3.markers.push(marker); 2390 }; 2391 var this_3 = this, myLatLng; 2392 for (var i = 0, length_30 = this.items.length; i < length_30; i++) { 2393 _loop_14(i, length_30); 2394 } 2395 if (this.options.geoJSON) { 2396 var bounds = new google.maps.LatLngBounds(); 2397 this.map.data.addListener('addfeature', function (e) { 2398 _this.processPoints(e.feature.getGeometry(), bounds.extend, bounds); 2399 _this.map.fitBounds(bounds); 2400 }); 2401 var geoJsonObject = { 2402 type: "FeatureCollection", 2403 features: [] 2404 }; 2405 for (var i = 0, length_31 = this.options.geoJSON.length; i < length_31; i++) { 2406 var layer = this.options.geoJSON[i]; 2407 geoJsonObject.features.push({ 2408 type: "Feature", 2409 properties: {}, 2410 geometry: layer 2411 }); 2412 } 2413 this.map.data.setStyle({ 2414 fillColor: 'green' 2415 }); 2416 this.map.data.addGeoJson(geoJsonObject); 2417 } 2418 if (this.markers.length == 1) { 2419 this.map.setZoom(this.options.initialZoomLevel); 2420 this.map.setCenter(this.markers[0].getPosition()); 2421 } 2422 else { 2423 if (this.markers.length > 0) { 2424 this.map.fitBounds(markerBounds); 2425 var zoomLevel = this.map.getZoom(); 2426 this.map.setZoom((zoomLevel > this.options.initialZoomLevel) ? this.options.initialZoomLevel : zoomLevel); 2427 } 2428 } 2429 } 2430 }; 2431 GoogleMapsMapComponent.prototype.processPoints = function (geometry, callback, thisArg) { 2432 var _this = this; 2433 if (geometry instanceof google.maps.LatLng) { 2434 callback.call(thisArg, geometry); 2435 } 2436 else if (geometry instanceof google.maps.Data.Point) { 2437 callback.call(thisArg, geometry.get()); 2438 } 2439 else {
2440 geometry.getArray().forEach(function (g) { 2441 _this.processPoints(g, callback, thisArg); 2442 }); 2443 } 2444 }; 2445 return GoogleMapsMapComponent; 2446 }()); 2447 Components.GoogleMapsMapComponent = GoogleMapsMapComponent; 2448 var NorkartWebatlasMapComponent = (function () { 2449 function NorkartWebatlasMapComponent(options) { 2450 this.items = []; 2451 this.element = options.element; 2452 this.options = options; 2453 this.items = options.items; 2454 } 2455 Object.defineProperty(NorkartWebatlasMapComponent.prototype, "$typeName", { 2456 get: function () { 2457 return 'Norkart'; 2458 }, 2459 enumerable: false, 2460 configurable: true 2461 }); 2462 NorkartWebatlasMapComponent.prototype.init = function () { 2463 if (!window.initNorkartMaps) { 2464 var styleSheets = [ 2465 'https://unpkg.com/[email protected]/dist/leaflet.css' 2466 ]; 2467 styleSheets.forEach(function (style) { 2468 var linkElement = document.createElement('link'); 2469 linkElement.type = 'text/css'; 2470 linkElement.rel = 'stylesheet'; 2471 linkElement.href = style; 2472 document.head.appendChild(linkElement); 2473 }); 2474 var scriptElement = document.createElement('script'); 2475 scriptElement.src = 'https://unpkg.com/[email protected]/dist/leaflet.js'; 2476 scriptElement.onload = function () { 2477 var innerScriptElement = document.createElement('script'); 2478 innerScriptElement.src = 'https://norkart.github.io/L.TileLayer.Webatlas/L.TileLayer.Webatlas.min.js'; 2479 innerScriptElement.onload = function () { 2480 window.setTimeout(function () { 2481 window.initNorkartMaps(); 2482 }, 1000); 2483 }; 2484 document.head.appendChild(innerScriptElement); 2485 }; 2486 document.head.appendChild(scriptElement); 2487 window.initNorkartMaps = function () { 2488 var elements = window['mapComponents']; 2489 if (elements) { 2490 var _loop_15 = function (i, length_32) { 2491 var mapComponent = elements[i]; 2492 if (mapComponent.$typeName === 'Norkart') { 2493 var mapControl = mapComponent.element.querySelector('.ac-map-canvas'); 2494 mapComponent.map = L.map(mapControl, { 2495 center: [mapComponent.options.initialLatitude, mapComponent.options.initialLongitude], 2496 zoom: mapComponent.options.initialZoomLevel, 2497 fullscreenControl: true, 2498 fullscreenControlOptions: { 2499 position: 'topleft' 2500 } 2501 }); 2502 if (window.eventBus) { 2503 window.eventBus.addEventListener('show-container', function (event) { 2504 var element = event.target.contains(mapComponent.element); 2505 if (element) { 2506 mapComponent.reRenderMap(); 2507 } 2508 }); 2509 } 2510 if (mapComponent.items.length > 0 || mapComponent.options.geoJSON) { 2511 mapComponent.render(); 2512 } 2513 } 2514 }; 2515 for (var i = 0, length_32 = elements.length; i < length_32; i++) { 2516 _loop_15(i, length_32); 2517 } 2518 } 2519 }; 2520 } 2521 }; 2522 NorkartWebatlasMapComponent.prototype.render = function () { 2523 this.renderMap(); 2524 }; 2525 NorkartWebatlasMapComponent.prototype.reRenderMap = function () { 2526 var _this = this; 2527 if (this.map) { 2528 window.setTimeout(function () { 2529 _this.map.invalidateSize(); 2530 }, 500); 2531 } 2532 }; 2533 NorkartWebatlasMapComponent.prototype.renderMap = function () { 2534 if (this.map) { 2535 var applicationOptions = window.applicationOptions; 2536 var url = "/Maler/Standard/Handlers/ResourceHandler.ashx?type=map-tiles&tileSet={tileset}&z={z}&x={x}&y={y}"; 2537 var baseLayers = { 2538 'Kart': L.tileLayer.webatlas({ 2539 mapType: 'vector', 2540 url: url, 2541 apikey: 'DUMMY' 2542 }) 2543 .addTo(this.map), 2544 'Foto': L.tileLayer.webatlas({ 2545 mapType: 'aerial', 2546 url: url, 2547 apikey: 'DUMMY' 2548 }), 2549 'Hybrid': L.tileLayer.webatlas({ 2550 mapType: 'hybrid', 2551 url: url, 2552 apikey: 'DUMMY' 2553 }) 2554 }; 2555 L.control.layers(baseLayers, {}).addTo(this.map); 2556 if (this.items.length > 0) { 2557 var x = this.items[0].Longitude; 2558 var y = this.items[0].Latitude;
2559 this.map.setView([y, x], 18); 2560 var startMarker = L.marker([y, x]).addTo(this.map); 2561 var adressePunktList = null; 2562 } 2563 if (this.options.geoJSON) { 2564 var geoJsonObject = { 2565 type: "FeatureCollection", 2566 features: [] 2567 }; 2568 for (var i = 0, length_33 = this.options.geoJSON.length; i < length_33; i++) { 2569 var layer = this.options.geoJSON[i]; 2570 geoJsonObject.features.push({ 2571 type: "Feature", 2572 properties: {}, 2573 geometry: layer 2574 }); 2575 } 2576 var geojsonLayer = L.geoJSON(geoJsonObject).addTo(this.map); 2577 this.map.fitBounds(geojsonLayer.getBounds()); 2578 } 2579 } 2580 }; 2581 return NorkartWebatlasMapComponent; 2582 }()); 2583 Components.NorkartWebatlasMapComponent = NorkartWebatlasMapComponent; 2584 })(Components = Templates.Components || (Templates.Components = {})); 2585})(Templates || (Templates = {})); 2586var Templates; 2587(function (Templates) { 2588 var Components; 2589 (function (Components) { 2590 var ModalWindow = (function () { 2591 function ModalWindow() { 2592 this.translations = {}; 2593 } 2594 Object.defineProperty(ModalWindow.prototype, "element", { 2595 get: function () { 2596 return this._element; 2597 }, 2598 enumerable: false, 2599 configurable: true 2600 }); 2601 ModalWindow.prototype.init = function () { 2602 var _this = this; 2603 this.bindFunctions(); 2604 if (window.StandardTemplateTranslations) { 2605 var translations = window.StandardTemplateTranslations; 2606 var map = {}; 2607 for (var i = 0, length_34 = translations.length; i < length_34; i++) { 2608 var translation = translations[i]; 2609 map[translation.key] = translation.value; 2610 } 2611 this.translations = map; 2612 } 2613 var overlayElement = document.createElement('div'); 2614 overlayElement.className = 'ac-modal-overlay'; 2615 var modalElement = document.createElement('div'); 2616 modalElement.className = 'ac-modal'; 2617 this._modalElement = modalElement; 2618 overlayElement.appendChild(modalElement); 2619 var headerElement = document.createElement('div'); 2620 headerElement.className = 'ac-modal-header'; 2621 modalElement.appendChild(headerElement); 2622 var closeButtonElement = document.createElement('button'); 2623 closeButtonElement.className = 'ac-modal-button ac-modal-button--close'; 2624 closeButtonElement.type = 'button'; 2625 closeButtonElement.addEventListener('click', function (event) { 2626 _this.close(); 2627 }); 2628 headerElement.appendChild(closeButtonElement); 2629 this._closeButtonElement = closeButtonElement; 2630 var closeButtonTextElement = document.createElement('span'); 2631 closeButtonTextElement.className = 'ac-modal-button-text'; 2632 closeButtonTextElement.textContent = this.translate('Templates.Components.Lightbox.Close'); 2633 closeButtonElement.appendChild(closeButtonTextElement); 2634 var bodyElement = document.createElement('div'); 2635 bodyElement.className = 'ac-modal-body'; 2636 modalElement.appendChild(bodyElement); 2637 this._bodyElement = bodyElement; 2638 var footerElement = document.createElement('div'); 2639 footerElement.className = 'ac-modal-footer'; 2640 modalElement.appendChild(footerElement); 2641 this._element = overlayElement; 2642 document.addEventListener('keydown', function (event) { 2643 var keyCode = event.which || event.keyCode; 2644 if (event.keyCode === 9) { 2645 if (_this.isOpen()) { 2646 var focusableElements = overlayElement.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not
2646([tabindex="-1"])'); 2647 var firstFocusableElement = focusableElements[0]; 2648 var lastFocusableElement = focusableElements[focusableElements.length - 1]; 2649 var targetElement = event.target; 2650 if (!targetElement.closest('.ac-modal-overlay')) { 2651 event.preventDefault(); 2652 } 2653 else { 2654 if (event.target === lastFocusableElement && !event.shiftKey) { 2655 event.preventDefault(); 2656 firstFocusableElement.focus(); 2657 } 2658 else if (event.target === firstFocusableElement && event.shiftKey) { 2659 event.preventDefault(); 2660 lastFocusableElement.focus(); 2661 } 2662 } 2663 } 2664 } 2665 }); 2666 document.addEventListener('keyup', function (event) { 2667 var keyCode = event.which || event.keyCode; 2668 if (keyCode === 27) { 2669 _this.close(); 2670 } 2671 }); 2672 document.addEventListener('fullscreenchange', function (event) { 2673 var notFullscreen = !document.fullscreen && !document.fullscreenEnabled && !document.webkitFullscreenElement && !document.mozFullscreenElement; 2674 if (notFullscreen) { 2675 _this.exitFullscreen(); 2676 } 2677 }); 2678 }; 2679 ModalWindow.prototype.translate = function (key) { 2680 return this.translations[key]; 2681 }; 2682 ModalWindow.prototype.clear = function () { 2683 }; 2684 ModalWindow.prototype.open = function (options, initiator) { 2685 this._currentInitiator = initiator; 2686 this.showDetailView(options); 2687 this.element.className = 'ac-modal-overlay ac-modal-overlay--open'; 2688 this._modalElement.classList.add((options.type === 'Confirm') ? 'ac-modal--confirm' : 'ac-modal-dialog'); 2689 var clientRect = this._modalElement.getBoundingClientRect(); 2690 var top = window.scrollY + (window.innerHeight / 2) - (clientRect.height / 2); 2691 this._modalElement.style.top = top + 'px'; 2692 this._closeButtonElement.focus(); 2693 }; 2694 ModalWindow.prototype.close = function () { 2695 if (this._currentInitiator) { 2696 this._currentInitiator.focus(); 2697 } 2698 this._currentInitiator = null; 2699 this.element.className = 'ac-modal-overlay'; 2700 this._modalElement.classList.remove('ac-modal--confirm'); 2701 this._modalElement.classList.remove('ac-modal-dialog'); 2702 this.exitFullscreen(); 2703 }; 2704 ModalWindow.prototype.bindFunctions = function () { 2705 this.toggleFullscreen = this.toggleFullscreen.bind(this); 2706 }; 2707 ModalWindow.prototype.showDetailView = function (options) { 2708 this.clearBodyContent(); 2709 var iframeElement = document.createElement('iframe'); 2710 iframeElement.className = 'ac-modal-iframe'; 2711 iframeElement.src = options.iframeUrl; 2712 iframeElement.title = options.title; 2713 this._bodyElement.appendChild(iframeElement); 2714 }; 2715 ModalWindow.prototype.isOpen = function () { 2716 return this.element.classList.contains('ac-modal-overlay--open'); 2717 }; 2718 ModalWindow.prototype.clearBodyContent = function () { 2719 while (this._bodyElement.firstChild) { 2720 this._bodyElement.removeChild(this._bodyElement.firstChild); 2721 } 2722 }; 2723 ModalWindow.prototype.requestFullscreen = function () { 2724 if (this._isFullscreen) { 2725 return; 2726 } 2727 if (this.supportsFullscreen()) { 2728 this._element.requestFullscreen(); 2729 } 2730 this._isFullscreen = true; 2731 this._element.classList.add('ac-modal-overlay--fullscreen'); 2732 }; 2733 ModalWindow.prototype.exitFullscreen = function () { 2734 if (!this._isFullscreen) { 2735 return; 2736 } 2737 if (this.supportsFullscreen()) { 2738 document.exitFullscreen(); 2739 } 2740 this._isFullscreen = false; 2741 this._element.classList.remove('ac-modal-overlay--fullscreen'); 2742 }; 2743 ModalWindow.prototype.toggleFullscreen = function () { 2744 if (this._isFullscreen) { 2745 this.exitFullscreen(); 2746 } 2747 else { 2748 this.requestFullscreen(); 2749 } 2750 }; 2751 ModalWindow.prototype.supportsFullscreen = function () { 2752 return (!!document.body.requestFullscreen && !!document.exitFullscreen); 2753 }; 2754 return ModalWindow; 2755 }()); 2756 Components.ModalWindow = ModalWindow; 2757 var ModalOptions = (function () { 2758 function ModalOptions() { 2759 this.type = 'Dialog'; 2760 } 2761 return ModalOptions; 2762 }()); 2763 Components.ModalOptions = ModalOptions; 2764 var ModalApplicationOptions = (function () { 2765 function ModalApplicationOptions() { 2766 } 2767 return ModalApplicationOptions; 2768 }()); 2769 Components.ModalApplicationOptions = ModalApplicationOptions; 2770 var ModalApplication = (function () { 2771 function ModalApplication(options) { 2772 this._options = options; 2773 this._window = new Components.ModalWindow(); 2774 } 2775 Object.defineProperty(ModalApplication.prototype, "options", { 2776 get: function () { 2777 return this._options; 2778 }, 2779 enumerable: false, 2780 configurable: true 2781 }); 2782 Object.defineProperty(ModalApplication.prototype, "window", { 2783 get: function () { 2784 return this._window; 2785 }, 2786 enumerable: false, 2787 configurable: true 2788 }); 2789 ModalApplication.prototype.init = function () { 2790 var _this = this; 2791 this.window.init(); 2792 document.body.appendChild(this.window.element); 2793 if (window.eventBus) { 2794 window.eventBus.addEventListener('close-modal', function (event) { 2795 _this.closeModal(); 2796 }); 2797 } 2798 }; 2799 ; 2800 ModalApplication.prototype.openModal = function (options, initiator) { 2801 this.window.clear(); 2802 this.window.open(options, initiator); 2803 }; 2804 ModalApplication.prototype.closeModal = function () { 2805 this.window.clear(); 2806 this.window.close(); 2807 }; 2808 return ModalApplication; 2809 }()); 2810 Components.ModalApplication = ModalApplication; 2811 })(Components = Templates.Components || (Templates.Components = {})); 2812})(Templates || (Templates = {})); 2813var Templates; 2814(function (Templates) { 2815 var Components; 2816 (function (Components) { 2817 var StatusBarOptions = (function () { 2818 function StatusBarOptions() { 2819 } 2820 return StatusBarOptions; 2821 }()); 2822 Components.StatusBarOptions = StatusBarOptions; 2823 var StatusBarComponent = (function () { 2824 function StatusBarComponent(options) { 2825 this.element = options.element;
2826 this.clientId = this.element.id; 2827 this.options = options; 2828 } 2829 StatusBarComponent.prototype.init = function () { 2830 }; 2831 StatusBarComponent.prototype.setItemsCompleted = function (index) { 2832 var items = this.element.children; 2833 var realIndex = index - 1; 2834 for (var i = 0, length_35 = items.length; i < length_35; i++) { 2835 if (i <= realIndex && items[i].className.indexOf(this.options.completedclassName) == -1) { 2836 items[i].className += ' ' + this.options.completedclassName; 2837 } 2838 else if (i > realIndex && items[i].className.indexOf(this.options.completedclassName) > -1) { 2839 var className = items[i].className.replace(this.options.completedclassName, ""); 2840 items[i].className = className; 2841 } 2842 } 2843 }; 2844 return StatusBarComponent; 2845 }()); 2846 Components.StatusBarComponent = StatusBarComponent; 2847 })(Components = Templates.Components || (Templates.Components = {})); 2848})(Templates || (Templates = {})); 2849(function () { 2850 'use strict'; 2851 var AutocompleteHttpService = (function () { 2852 function AutocompleteHttpService() { 2853 } 2854 AutocompleteHttpService.prototype.post = function (url, data, requestOptions) { 2855 return new Promise(function (resolve, reject) { 2856 var request = new XMLHttpRequest(); 2857 if (requestOptions && requestOptions.params) { 2858 var isFirst = url.indexOf('?') < 0; 2859 for (var i = 0; i < requestOptions.params.length; i++) { 2860 var requestOption = requestOptions.params[i]; 2861 url += ((isFirst) ? '?' : '&') + requestOption.name + '=' + requestOption.value; 2862 isFirst = false; 2863 } 2864 } 2865 request.open('POST', url); 2866 request.onload = function () { 2867 if (request.status >= 200 && request.status < 300) { 2868 resolve(JSON.parse(request.responseText)); 2869 } 2870 else { 2871 reject({ 2872 status: request.status, 2873 statusText: request.statusText 2874 }); 2875 } 2876 }; 2877 request.onerror = function () { 2878 reject({ 2879 status: request.status, 2880 statusText: request.statusText 2881 }); 2882 }; 2883 if (requestOptions && requestOptions.headers) { 2884 for (var i = 0, length_36 = requestOptions.headers.length; i < length_36; i++) { 2885 var requestOption = requestOptions.headers[i]; 2886 request.setRequestHeader(requestOption.name, requestOption.value); 2887 } 2888 } 2889 request.send(JSON.stringify(data)); 2890 }); 2891 }; 2892 return AutocompleteHttpService; 2893 }()); 2894 var AutocompleteService = (function () { 2895 function AutocompleteService() { 2896 var _this = this; 2897 this.http = new AutocompleteHttpService(); 2898 this.autoSuggestDataItems = function (searchTerm, objectTypes) { 2899 var params = []; 2900 var requestOptions = _this.createRequestOptions(params); 2901 return _this.http.post("/api/presentation/v2/search/autocomplete?objectTypes=".concat(objectTypes.join(',')), searchTerm, requestOptions); 2902 }; 2903 } 2904 AutocompleteService.prototype.createRequestOptions = function (params) { 2905 params.push({ name: 'ts', value: new Date().getTime().toString() }); 2906 var headers = []; 2907 headers.push({ name: 'Content-Type', value: 'application/json' }); 2908 return { params: params, headers: headers }; 2909 }; 2910 return AutocompleteService; 2911 }()); 2912 var AutocompleteApplication = (function () { 2913 function AutocompleteApplication(options) { 2914 var _this = this; 2915 this.delay = 250; 2916 this.translations = {}; 2917 this.onWindowResize = function () { 2918 _this.recalculatePanelPosition(); 2919 }; 2920 this.buildListBox = function (results) { 2921 while (_this.listBoxElement.firstChild) { 2922 _this.listBoxElement.removeChild(_this.listBoxElement.firstChild); 2923 } 2924 if (results.length > 0) { 2925 var _loop_16 = function (i, length_37) { 2926 var result = results[i];
2927 var liElement = document.createElement('li'); 2928 _this.listBoxElement.appendChild(liElement); 2929 liElement.className = 'ac-autocomplete-result-item'; 2930 var optionElement; 2931 if (_this.options.fullSearchUrl) { 2932 optionElement = document.createElement('a'); 2933 optionElement.href = result.navigateUrl; 2934 } 2935 else { 2936 optionElement = document.createElement('span'); 2937 optionElement.setAttribute('tabindex', '-1'); 2938 optionElement.addEventListener('click', function (event) { 2939 _this.inputElement.value = optionElement.innerText; 2940 _this.inputElement.setAttribute('aria-activedescendant', optionElement.id); 2941 _this.hidePanel(); 2942 }); 2943 } 2944 liElement.appendChild(optionElement); 2945 optionElement.id = "".concat(_this.options.clientID, "-option-").concat(i + 1); 2946 optionElement.className = 'ac-autocomplete-result-option'; 2947 var optionTextElement = document.createElement('span'); 2948 optionTextElement.className = 'ac-autocomplete-result-option-text'; 2949 optionElement.appendChild(optionTextElement); 2950 optionTextElement.innerHTML = result.title; 2951 optionElement.addEventListener('keydown', function (event) { 2952 var key = event.key; 2953 if (key === 'Tab' || key === 'Escape') { 2954 event.preventDefault(); 2955 _this.hidePanel(); 2956 _this.inputElement.focus(); 2957 return; 2958 } 2959 if (!_this.options.fullSearchUrl) { 2960 if (key === 'Enter') { 2961 event.preventDefault(); 2962 _this.hidePanel(); 2963 _this.inputElement.focus(); 2964 return; 2965 } 2966 } 2967 if (key === 'ArrowUp' || key === 'ArrowDown') { 2968 event.preventDefault(); 2969 if (_this.listBoxElement.children) { 2970 var length_38 = _this.listBoxElement.children.length; 2971 var selectedItem = null; 2972 var selectedItemIndex = 0; 2973 for (var i_1 = 0; i_1 < length_38; i_1++) { 2974 var li = _this.listBoxElement.children[i_1]; 2975 var _optionElement_1 = li.querySelector('.ac-autocomplete-result-option'); 2976 if (_optionElement_1.hasAttribute('aria-selected')) { 2977 selectedItem = li; 2978 selectedItemIndex = i_1; 2979 break; 2980 } 2981 } 2982 if (selectedItem) { 2983 var _optionElement_2 = liElement.querySelector('.ac-autocomplete-result-option'); 2984 _optionElement_2.removeAttribute('aria-selected'); 2985 if (key == 'ArrowUp') { 2986 selectedItemIndex--; 2987 if (selectedItemIndex < 0) { 2988 selectedItem = _this.listBoxElement.children[length_38 - 1]; 2989 } 2990 else { 2991 selectedItem = _this.listBoxElement.children[selectedItemIndex]; 2992 } 2993 } 2994 else { 2995 selectedItemIndex++; 2996 if (selectedItemIndex >= length_38) { 2997 selectedItem = _this.listBoxElement.children[0]; 2998 } 2999 else { 3000 selectedItem = _this.listBoxElement.children[selectedItemIndex]; 3001 } 3002 } 3003 } 3004 else { 3005 if (key == 'ArrowUp') { 3006 selectedItem = _this.listBoxElement.children[length_38 - 1]; 3007 } 3008 else { 3009 selectedItem = _this.listBoxElement.children[0]; 3010 } 3011 } 3012 var _optionElement = selectedItem.querySelector('.ac-autocomplete-result-option'); 3013 _optionElement.setAttribute('aria-selected', 'true'); 3014 _optionElement.focus(); 3015 _this.inputElement.value = _optionElement.innerText; 3016 _this.inputElement.setAttribute('aria-activedescendant', _optionElement.id); 3017 } 3018 return; 3019 } 3020 }); 3021 }; 3022 for (var i = 0, length_37 = results.length; i < length_37; i++) { 3023 _loop_16(i, length_37); 3024 } 3025 _this.inputElement.setAttribute('aria-expanded', 'true'); 3026 } 3027 else { 3028 var liElement = document.createElement('li'); 3029 _this.listBoxElement.appendChild(liElement); 3030 liElement.className = 'ac-autocomplete-result-item'; 3031 var optionElement = document.createElement('span'); 3032 liElement.appendChild(optionElement); 3033 optionElement.className = 'ac-autocomplete-result-option'; 3034 var optionTextElement = document.createElement('span'); 3035 optionTextElement.className = 'ac-autocomplete-result-option-text'; 3036 optionElement.appendChild(optionTextElement); 3037 optionTextElement.innerHTML = _this.translate('Templates.Components.AutoComplete.No.Suggestions.Are.Available'); 3038 optionElement.addEventListener('click', function (event) { 3039 _this.inputElement.value = ''; 3040 _this.hidePanel(); 3041 }); 3042 } 3043 _this.announceResults(); 3044 }; 3045 this.options = options; 3046 this.autocompleteService = new AutocompleteService(); 3047 } 3048 AutocompleteApplication.prototype.init = function () { 3049 var _this = this; 3050 if (window.StandardTemplateTranslations) { 3051 var translations = window.StandardTemplateTranslations; 3052 var map = {}; 3053 for (var i = 0, length_39 = translations.length; i < length_39; i++) { 3054 var translation = translations[i]; 3055 map[translation.key] = translation.value; 3056 } 3057 this.translations = map; 3058 } 3059 this.buildPanel(); 3060 this.bindInput(); 3061 window.addEventListener('click', function (event) { 3062 if (!_this.options.element.contains(event.target)) { 3063 _this.hidePanel(); 3064 } 3065 }); 3066 window.addEventListener('resize', function () { 3067 clearTimeout(_this.timeout); 3068 _this.timeout = setTimeout(_this.onWindowResize, _this.delay); 3069 }); 3070 }; 3071 AutocompleteApplication.prototype.translate = function (key) { 3072 return this.translations[key]; 3073 }; 3074 AutocompleteApplication.prototype.bindInput = function () { 3075 var _this = this; 3076 this.inputElement = this.options.element; 3077 this.inputElement.setAttribute('aria-describedby', this.instructionsElement.id); 3078 this.inputElement.setAttribute('role', 'combobox'); 3079 this.inputElement.setAttribute('aria-autocomplete', 'both'); 3080 this.inputElement.setAttribute('aria-haspopup', 'true'); 3081 this.inputElement.setAttribute('aria-owns', "".concat(this.options.clientID, "-listbox")); 3082 this.inputElement.setAttribute('aria-expanded', 'false'); 3083 this.inputElement.addEventListener('focusin', function () { 3084 _this.hidePanel(); 3085 }); 3086 this.inputElement.addEventListener('keyup', function (event) { 3087 var key = event.key; 3088 if (key === 'ArrowUp' || key === 'ArrowDown' || key === 'Tab' || key === 'Enter' || key === 'Escape') { 3089 return; 3090 } 3091 if (_this.inputElement.value && _this.inputElement.value.length >= 3) { 3092 if (_this.timeout) { 3093 clearTimeout(_this.timeout); 3094 } 3095 _this.timeout = setTimeout(function () { 3096 _this.showPanel(); 3097 }, 250); 3098 } 3099 else { 3100 _this.hidePanel(); 3101 } 3102 }); 3103 this.inputElement.addEventListener('keydown', function (event) { 3104 var key = event.key; 3105 if (key === 'Tab' || key === 'Escape') { 3106 _this.hidePanel(); 3107 return; 3108 } 3109 if (key === 'ArrowUp' || key === 'ArrowDown') { 3110 event.preventDefault(); 3111 if (_this.listBoxElement.children) { 3112 var length_40 = _this.listBoxElement.children.length; 3113 var selectedItem = null; 3114 var selectedItemIndex = 0; 3115 for (var i = 0; i < length_40; i++) { 3116 var li = _this.listBoxElement.children[i]; 3117 if (li.querySelector('.ac-autocomplete-result-option').hasAttribute('aria-selected')) { 3118 selectedItem = li; 3119 selectedItemIndex = i; 3120 break; 3121 } 3122 } 3123 if (selectedItem) { 3124 selectedItem.querySelector('.ac-autocomplete-result-option').removeAttribute('aria-selected'); 3125 if (key == 'ArrowUp') { 3126 selectedItemIndex--; 3127 if (selectedItemIndex < 0) { 3128 selectedItem = _this.listBoxElement.children[length_40 - 1]; 3129 } 3130 else { 3131 selectedItem = _this.listBoxElement.children[selectedItemIndex]; 3132 } 3133 } 3134 else { 3135 selectedItemIndex++; 3136 if (selectedItemIndex >= length_40) { 3137 selectedItem = _this.listBoxElement.children[0]; 3138 } 3139 else { 3140 selectedItem = _this.listBoxElement.children[selectedItemIndex]; 3141 } 3142 } 3143 } 3144 else { 3145 if (key == 'ArrowUp') { 3146 selectedItem = _this.listBoxElement.children[length_40 - 1]; 3147 } 3148 else { 3149 selectedItem = _this.listBoxElement.children[0]; 3150 } 3151 } 3152 if (selectedItem) { 3153 var optionElement = selectedItem.querySelector('.ac-autocomplete-result-option'); 3154 optionElement.setAttribute('aria-selected', 'true'); 3155 optionElement.focus(); 3156 _this.inputElement.setAttribute('aria-activedescendant', optionElement.id); 3157 } 3158 } 3159 return; 3160 } 3161 }); 3162 }; 3163 AutocompleteApplication.prototype.buildPanel = function () { 3164 this.panelElement = document.createElement('div'); 3165 this.panelElement.className = 'ac-autocomplete-panel'; 3166 document.body.appendChild(this.panelElement); 3167 this.instructionsElement = document.createElement('div'); 3168 this.instructionsElement.id = "".concat(this.options.clientID, "-instructions"); 3169 this.instructionsElement.className = 'ac-autocomplete-instructions'; 3170 this.instructionsElement.textContent = this.translate('Templates.Components.AutoComplete.Instru
3170ctions'); 3171 this.panelElement.appendChild(this.instructionsElement); 3172 this.listBoxElement = document.createElement('ul'); 3173 this.listBoxElement.id = "".concat(this.options.clientID, "-listbox"); 3174 this.listBoxElement.className = 'ac-autocomplete-result'; 3175 this.listBoxElement.setAttribute('role', 'listbox'); 3176 this.panelElement.appendChild(this.listBoxElement); 3177 this.statusElement = document.createElement('div'); 3178 this.statusElement.id = "".concat(this.options.clientID, "-status"); 3179 this.statusElement.className = 'ac-autocomplete-status'; 3180 this.statusElement.setAttribute('role', 'status'); 3181 this.panelElement.appendChild(this.statusElement); 3182 }; 3183 AutocompleteApplication.prototype.recalculatePanelPosition = function () { 3184 var clientRect = this.inputElement.getBoundingClientRect(); 3185 this.panelElement.style.top = "".concat(clientRect.bottom + window.scrollY, "px"); 3186 this.panelElement.style.left = "".concat(clientRect.left, "px"); 3187 this.panelElement.style.width = "".concat(clientRect.width, "px"); 3188 }; 3189 AutocompleteApplication.prototype.addOrUpdateQueryParameter = function (uri, key, value) { 3190 if (uri && uri.length > 0) { 3191 var i = uri.indexOf('#'); 3192 var hash = i === -1 ? '' : uri.substr(i); 3193 uri = i === -1 ? uri : uri.substr(0, i); 3194 var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i"); 3195 var separator = uri.indexOf('?') !== -1 ? "&" : "?"; 3196 if (uri.match(re)) { 3197 uri = uri.replace(re, '$1' + key + '=' + encodeURIComponent(value) + '$2'); 3198 } 3199 else { 3200 uri = uri + separator + key + '=' + encodeURIComponent(value); 3201 } 3202 return uri + hash; 3203 } 3204 else { 3205 return '?' + key + '=' + encodeURIComponent(value); 3206 } 3207 }; 3208 AutocompleteApplication.prototype.encodeHtml = function (value) { 3209 if (value) { 3210 var buf = []; 3211 for (var i = value.length - 1; i >= 0; i--) { 3212 buf.unshift(['&#', value[i].charCodeAt(), ';'].join('')); 3213 } 3214 return buf.join(''); 3215 } 3216 return value; 3217 }; 3218 AutocompleteApplication.prototype.showPanel = function () { 3219 if (this.inputElement.value === this.inputValue) { 3220 return; 3221 } 3222 this.inputValue = this.inputElement.value; 3223 this.recalculatePanelPosition(); 3224 this.panelElement.style.display = 'block';
3225 this.getSuggestions(); 3226 }; 3227 AutocompleteApplication.prototype.hidePanel = function () { 3228 this.inputElement.setAttribute('aria-expanded', 'false'); 3229 this.panelElement.style.display = 'none'; 3230 this.statusElement.innerHTML = ''; 3231 this.clearPanel(); 3232 this.clearSelected(); 3233 }; 3234 AutocompleteApplication.prototype.clearPanel = function () { 3235 while (this.listBoxElement.firstChild) { 3236 this.listBoxElement.removeChild(this.listBoxElement.firstChild); 3237 } 3238 }; 3239 AutocompleteApplication.prototype.clearSelected = function () { 3240 this.inputElement.removeAttribute('aria-activedescendant'); 3241 }; 3242 AutocompleteApplication.prototype.getSuggestions = function () { 3243 var _this = this; 3244 if (this.inputValue && this.inputValue.length > 0) { 3245 this.panelElement.classList.add('ac-autocomplete-panel--loading'); 3246 this.autocompleteService.autoSuggestDataItems(this.inputValue, this.options.objectTypes).then(function (result) { 3247 var items = []; 3248 for (var i = 0, length_41 = result.length; i < length_41; i++) { 3249 items.push({ 3250 title: result[i], 3251 navigateUrl: _this.addOrUpdateQueryParameter(_this.options.fullSearchUrl, _this.options.fullSearchQueryParameterName, result[i]) 3252 }); 3253 } 3254 _this.searchItems = items; 3255 _this.buildListBox(items); 3256 _this.panelElement.classList.remove('ac-autocomplete-panel--loading'); 3257 }, function () { 3258 _this.hidePanel(); 3259 }); 3260 } 3261 else { 3262 this.hidePanel(); 3263 } 3264 }; 3265 AutocompleteApplication.prototype.announceResults = function () { 3266 var itemCount = this.searchItems.length; 3267 var text = "".concat(itemCount, " ").concat(this.translate('Templates.Components.AutoComplete.Suggestions.Are.Available'), " ").concat(this.translate('Templates.Components.AutoComplete.Updated.Instructions')); 3268 if (itemCount === 0) { 3269 text = this.translate('Templates.Components.AutoComplete.No.Suggestions.Are.Available'); 3270 } 3271 this.statusElement.innerHTML = text; 3272 }; 3273 return AutocompleteApplication; 3274 }()); 3275 document.addEventListener('DOMContentLoaded', function () { 3276 var elements = document.querySelectorAll('.js-autocomplete'); 3277 if (elements) { 3278 for (var index = 0, length_42 = elements.length; index < length_42; index++) { 3279 var element = elements[index]; 3280 var fullSearchUrl = element.getAttribute('data-full-search-url'); 3281 var fullSearchQueryParameterName = element.getAttribute('data-full-search-query-parameter-name'); 3282 var objectTypes = element.getAttribute('data-object-types'); 3283 ; 3284 var searchEngine = new AutocompleteApplication({ 3285 clientID: "autocomplete-".concat(index + 1), 3286 element: element, 3287 fullSearchUrl: fullSearchUrl, 3288 fullSearchQueryParameterName: fullSearchQueryParameterName, 3289 objectTypes: (objectTypes) ? objectTypes.split(',') : [] 3290 }); 3291 searchEngine.init(); 3292 } 3293 } 3294 }); 3295})();
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.