|  | /** | 
|  | * @licstart The following is the entire license notice for the | 
|  | * Javascript code in this page | 
|  | * | 
|  | * Copyright 2020 Mozilla Foundation | 
|  | * | 
|  | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | * you may not use this file except in compliance with the License. | 
|  | * You may obtain a copy of the License at | 
|  | * | 
|  | *     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, software | 
|  | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | * See the License for the specific language governing permissions and | 
|  | * limitations under the License. | 
|  | * | 
|  | * @licend The above is the entire license notice for the | 
|  | * Javascript code in this page | 
|  | */ | 
|  | "use strict"; | 
|  |  | 
|  | Object.defineProperty(exports, "__esModule", { | 
|  | value: true | 
|  | }); | 
|  | exports.OverlayManager = void 0; | 
|  |  | 
|  | class OverlayManager { | 
|  | constructor() { | 
|  | this._overlays = {}; | 
|  | this._active = null; | 
|  | this._keyDownBound = this._keyDown.bind(this); | 
|  | } | 
|  |  | 
|  | get active() { | 
|  | return this._active; | 
|  | } | 
|  |  | 
|  | async register(name, element, callerCloseMethod = null, canForceClose = false) { | 
|  | let container; | 
|  |  | 
|  | if (!name || !element || !(container = element.parentNode)) { | 
|  | throw new Error("Not enough parameters."); | 
|  | } else if (this._overlays[name]) { | 
|  | throw new Error("The overlay is already registered."); | 
|  | } | 
|  |  | 
|  | this._overlays[name] = { | 
|  | element, | 
|  | container, | 
|  | callerCloseMethod, | 
|  | canForceClose | 
|  | }; | 
|  | } | 
|  |  | 
|  | async unregister(name) { | 
|  | if (!this._overlays[name]) { | 
|  | throw new Error("The overlay does not exist."); | 
|  | } else if (this._active === name) { | 
|  | throw new Error("The overlay cannot be removed while it is active."); | 
|  | } | 
|  |  | 
|  | delete this._overlays[name]; | 
|  | } | 
|  |  | 
|  | async open(name) { | 
|  | if (!this._overlays[name]) { | 
|  | throw new Error("The overlay does not exist."); | 
|  | } else if (this._active) { | 
|  | if (this._overlays[name].canForceClose) { | 
|  | this._closeThroughCaller(); | 
|  | } else if (this._active === name) { | 
|  | throw new Error("The overlay is already active."); | 
|  | } else { | 
|  | throw new Error("Another overlay is currently active."); | 
|  | } | 
|  | } | 
|  |  | 
|  | this._active = name; | 
|  |  | 
|  | this._overlays[this._active].element.classList.remove("hidden"); | 
|  |  | 
|  | this._overlays[this._active].container.classList.remove("hidden"); | 
|  |  | 
|  | window.addEventListener("keydown", this._keyDownBound); | 
|  | } | 
|  |  | 
|  | async close(name) { | 
|  | if (!this._overlays[name]) { | 
|  | throw new Error("The overlay does not exist."); | 
|  | } else if (!this._active) { | 
|  | throw new Error("The overlay is currently not active."); | 
|  | } else if (this._active !== name) { | 
|  | throw new Error("Another overlay is currently active."); | 
|  | } | 
|  |  | 
|  | this._overlays[this._active].container.classList.add("hidden"); | 
|  |  | 
|  | this._overlays[this._active].element.classList.add("hidden"); | 
|  |  | 
|  | this._active = null; | 
|  | window.removeEventListener("keydown", this._keyDownBound); | 
|  | } | 
|  |  | 
|  | _keyDown(evt) { | 
|  | if (this._active && evt.keyCode === 27) { | 
|  | this._closeThroughCaller(); | 
|  |  | 
|  | evt.preventDefault(); | 
|  | } | 
|  | } | 
|  |  | 
|  | _closeThroughCaller() { | 
|  | if (this._overlays[this._active].callerCloseMethod) { | 
|  | this._overlays[this._active].callerCloseMethod(); | 
|  | } | 
|  |  | 
|  | if (this._active) { | 
|  | this.close(this._active); | 
|  | } | 
|  | } | 
|  |  | 
|  | } | 
|  |  | 
|  | exports.OverlayManager = OverlayManager; |