{"version":3,"sources":["jsdelivr-header.js","/npm/url-fragment-extender@2.0.0-rc.3/browser.js"],"names":[],"mappings":"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","file":"/npm/url-fragment-extender@2.0.0-rc.3/browser.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/url-fragment-extender@2.0.0-rc.3/browser.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/** Copyright (c) Manuel Lõhmus (MIT License). */\r\n\r\n'use strict';\r\n\r\n// browser support: /foo.html#strID -> The string ID of the DOM element.\r\n// browser support: #:~:text=[prefix-,]textStart[,textEnd][,-suffix] -> The browser will highlight the text fragment in the document.\r\n// browser support: /foo.mp4#t=10,20: The video or audio will start playing from the 10th second.\r\n// / -> Load default template to content container.\r\n// /# -> Load default template to content container.\r\n// /#:urlPath -> Load urlPath template to content container.\r\n// /#!urlPath -> Load iframe urlPath page to content container.\r\n// event: 'key' -> { key, value, fragment } -> The key is the name of the event, value is the value of the key, and fragment is the full URL fragment.\r\n// event: '-' -> { key, value, fragment } -> The key is the name of the event, value is the value of the key, and fragment is the full URL fragment.\r\n// event: 'hrefActive' -> { href } -> The href is the name of the event, and href is the full URL fragment.\r\n(function () {\r\n\r\n    exportModule('url-fragment-extender', [], function factory() {\r\n\r\n        var globalScope = this,\r\n            isDebug = document && Array.from(document.scripts).find(function (s) { return s.src.includes('url-fragment-extender'); }).attributes.debug || false;\r\n\r\n        globalScope.UFE = Object.create(null, {\r\n\r\n            DB: { get: getDB, configurable: false, enumerable: false },\r\n\r\n            indexContentURL: { value: ':templates/landing.html', writable: true, configurable: false, enumerable: false },\r\n\r\n            mainContainerSelector: { value: '#main-container', writable: true, configurable: false, enumerable: false },\r\n\r\n            alertMessageSelector: { value: '#alert-message-container', writable: true, configurable: false, enumerable: false },\r\n\r\n            renderIndexContent: { value: renderIndexContent, writable: false, configurable: false, enumerable: false },\r\n\r\n            handleFragment: { value: handleFragment, writable: false, configurable: false, enumerable: false },\r\n\r\n            renderContent: { value: renderContent, writable: false, configurable: false, enumerable: false },\r\n\r\n            renderIframe: { value: renderIframe, writable: false, configurable: false, enumerable: false },\r\n\r\n            setMenuItemActive: { value: setMenuItemActive, writable: false, configurable: false, enumerable: false },\r\n\r\n            openModal: { value: openModal, writable: false, configurable: false, enumerable: false },\r\n\r\n            openModalHTML: { value: openModalHTML, writable: false, configurable: false, enumerable: false },\r\n\r\n            modalHide: { value: function () { }, writable: true, configurable: false, enumerable: false },\r\n\r\n            showAlert: { value: showAlert, writable: false, configurable: false, enumerable: false },\r\n\r\n            // EventEmitter\r\n            _events: { value: {}, writable: false, configurable: false, enumerable: false },\r\n\r\n            once: {\r\n                writable: false, configurable: false, enumerable: false,\r\n                /**\r\n                * @param {string} eventName\r\n                * @param {(...params:any)=>void} listener\r\n                * @returns {DataContext}\r\n                */\r\n                value: function once(eventName, listener) {\r\n\r\n                    return UFE.on(eventName, listener, false);\r\n                }\r\n            },\r\n\r\n            on: {\r\n                writable: false, configurable: false, enumerable: false,\r\n\r\n                /**\r\n                * @param {string} eventName\r\n                * @param {(...params:any)=>void} listener\r\n                * @param {boolean|()=>boolean|Node} isActive If false then adds a one-time listener function for the event named eventName. The next time eventName is triggered, this listener is removed and then invoked.\r\n                * @returns {DataContext}\r\n                */\r\n                value: function on(eventName, listener, isActive = true) {\r\n\r\n                    if (!UFE._events[eventName]) { UFE._events[eventName] = []; }\r\n\r\n                    UFE._events[eventName].push(listener);\r\n                    isActive && (listener.isActive = isActive);\r\n\r\n                    return UFE;\r\n                }\r\n            },\r\n\r\n            emit: {\r\n                writable: false, configurable: false, enumerable: false,\r\n\r\n                value: function emit(eventName, ...params) {\r\n\r\n                    var ret = false;\r\n                    var arr = UFE._events[eventName] || [];\r\n                    var index = 0;\r\n\r\n                    while (index < arr.length) {\r\n\r\n                        var listener = arr[index];\r\n\r\n                        if (arr[index] === listener &&\r\n                            (typeof listener.isActive === \"function\" && !listener.isActive()\r\n                                || listener.isActive?.isConnected === false\r\n                                || listener.isActive === undefined\r\n                                || !listener.isActive === true)) {\r\n\r\n                            arr.splice(index, 1);\r\n                        }\r\n\r\n                        if (typeof listener.isActive === \"function\" && listener.isActive()\r\n                            || listener.isActive?.isConnected === true\r\n                            || listener.isActive === undefined\r\n                            || listener.isActive === true) {\r\n\r\n                            ret = true;\r\n\r\n                            if (!listener.call(\"undefined\" != typeof window && listener.isActive instanceof window.Node && listener.isActive, ...params)) {\r\n\r\n                                arr.splice(index, 1);\r\n                            }\r\n                        }\r\n\r\n                        if (arr[index] === listener) { index++; }\r\n                    }\r\n\r\n                    if (UFE._events[eventName] && !UFE._events[eventName].length) {\r\n\r\n                        delete UFE._events[eventName];\r\n                    }\r\n\r\n                    return ret;\r\n                }\r\n            }\r\n        });\r\n\r\n        waitForReadyState(\"complete\", function () {\r\n\r\n            handleFragment();\r\n            addEventListener(\"hashchange\", handleHash);\r\n        });\r\n\r\n        return globalScope.UFE;\r\n\r\n        function getDB() { return globalScope.modules['data-context-binding'] || null }\r\n        function waitForReadyState(state, cb) {\r\n\r\n            if (document.readyState == state)\r\n                setTimeout(cb, 50);\r\n            else\r\n                setTimeout(waitForReadyState, 0, state, cb);\r\n        }\r\n        function handleHash({ newURL, oldURL }) {\r\n\r\n            return handleFragment(getFragment(newURL), getFragment(oldURL));\r\n\r\n            function getFragment(url) {\r\n\r\n                var i = url.indexOf('#');\r\n\r\n                if (i < 0) { return '#'; }\r\n\r\n                return url.substring(i);\r\n            }\r\n        }\r\n        function renderIndexContent(ignoreActiveLink = false) {\r\n\r\n            if (!ignoreActiveLink) { return handleFragment(); }\r\n\r\n            return handleFragment(UFE.indexContentURL);\r\n        }\r\n        function handleFragment(newFragment = location.hash, oldFragment = '#') {\r\n\r\n            var newFrgParts = decodeURI(newFragment).slice(1).split(/[&|;]/g),\r\n                oldFrgParts = decodeURI(oldFragment).slice(1).split(/[&|;]/g);\r\n\r\n            if (!newFrgParts[0] || newFrgParts[0] === UFE.indexContentURL) { newFrgParts[0] = ':'; }\r\n            if (newFrgParts[0] === ':') { renderContent(UFE.indexContentURL); }\r\n            else if (newFrgParts[0].startsWith(\"!\")) { renderIframe(newFrgParts[0].slice(1)); }\r\n            else if (/^:(?![:~!])/.test(newFrgParts[0])) { renderContent(newFrgParts[0].slice(1)); }\r\n            else {\r\n\r\n                var content_url = document.querySelector(UFE.mainContainerSelector)?.getAttribute('content_url');\r\n\r\n                if (!content_url) { renderContent(UFE.indexContentURL); }\r\n                else { renderContent(content_url); }\r\n            }\r\n\r\n            newFrgParts.forEach(function (key_val) {\r\n\r\n                var [key, val] = key_val.split('=');\r\n                setKeyValueToDataContext(key, val);\r\n                UFE.emit(key, { key, value: val || '', newFragment, oldFragment });\r\n                UFE.emit('-', { key, value: val || '', newFragment, oldFragment });\r\n            });\r\n\r\n            setMenuItemActive(newFrgParts[0], oldFrgParts[0]);\r\n\r\n            return newFragment;\r\n\r\n\r\n            function setKeyValueToDataContext(key, val) {\r\n\r\n                if (typeof key !== 'string' || key[0] !== '.' || typeof val !== 'string') { return; }\r\n\r\n                if (!window.datacontext) { return; }\r\n\r\n                var keyParts = key.split('.').slice(1),\r\n                    dataContext = window.datacontext;\r\n\r\n                while (keyParts.length > 1) {\r\n\r\n                    if (dataContext[keyParts[0]] === undefined) { dataContext[keyParts[0]] = {}; }\r\n\r\n                    dataContext = dataContext[keyParts.shift()];\r\n                }\r\n\r\n                dataContext[keyParts[0]] = val;\r\n            }\r\n        }\r\n        function renderContent(contentURL) {\r\n\r\n            if (!contentURL || contentURL === ':') { contentURL = UFE.indexContentURL; }\r\n\r\n            var containerElement = document.querySelector(UFE.mainContainerSelector),\r\n                content_url = containerElement?.getAttribute('content_url');\r\n\r\n            if (containerElement && content_url !== contentURL) {\r\n\r\n                var contentContainer = clearElement(containerElement);\r\n                contentContainer.setAttribute('content_url', contentURL);\r\n                contentContainer.setAttribute('template', contentURL);\r\n                getDB()?.bindAllElements(contentContainer);\r\n            }\r\n        }\r\n        function renderIframe(pageURL) {\r\n\r\n            var containerElement = document.querySelector(UFE.mainContainerSelector),\r\n                content_url = containerElement?.getAttribute('content_url');\r\n\r\n            if (containerElement && content_url !== pageURL) {\r\n\r\n                var contentContainer = clearElement(containerElement);\r\n                contentContainer.setAttribute('content_url', pageURL);\r\n                contentContainer.insertAdjacentHTML('beforeend', `<iframe src=\"${pageURL}\" scrolling=\"no\"></iframe>`);\r\n\r\n                var iframe = contentContainer.querySelector('iframe');\r\n                iframe.contentWindow.addEventListener('resize', calcIframeHeight);\r\n                iframe.onload = calcIframeHeight;\r\n\r\n\r\n                function calcIframeHeight() {\r\n\r\n                    iframe.style.height = iframe.contentWindow.document.documentElement.offsetHeight + 'px';\r\n                    contentContainer.style.height = iframe.style.height;\r\n                }\r\n            }\r\n        }\r\n        function clearElement(element) {\r\n\r\n            if (element) {\r\n\r\n                element.removeAttribute('content_url');\r\n                element.removeAttribute('template');\r\n                element.innerHTML = '';\r\n                element.style.height = '';\r\n                element.style.minHeight = '';\r\n                element.bindingContext?.isActive(false);\r\n            }\r\n\r\n            return element;\r\n        }\r\n        function setMenuItemActive(newHref = '', oldHref = '') {\r\n\r\n            if (newHref === ':') { newHref = ''; }\r\n            if (oldHref === ':') { oldHref = ''; }\r\n\r\n            deactiveLink();\r\n            setMenuItemActive.counter = 0;\r\n            clearTimeout(setMenuItemActive.timeout);\r\n            activeLink();\r\n            loginActiveLink();\r\n\r\n\r\n            function deactiveLink() {\r\n\r\n                var activeLinks = document.querySelectorAll('[href=\"#' + encodeURI(oldHref) + '\"]') || [];\r\n\r\n                activeLinks.forEach(function (old) { old.classList.remove('active'); });\r\n            }\r\n            function activeLink() {\r\n\r\n                //if (newHref.startsWith('#')) { newHref = newHref.substring(1); }\r\n\r\n                var deactiveLinks = document.querySelectorAll('[href=\"#' + encodeURI(newHref) + '\"]') || [];\r\n\r\n                // If the element is not found, wait for 200ms and try again.\r\n                if (!deactiveLinks.length) {\r\n\r\n                    setMenuItemActive.counter++;\r\n\r\n                    if (setMenuItemActive.counter > 10) {\r\n\r\n                        deactiveLinks = document.querySelectorAll('[href=\"#' + encodeURI(newHref) + '\"]') || [];\r\n\r\n                        return;\r\n                    }\r\n\r\n                    setMenuItemActive.timeout = setTimeout(activeLink, 200);\r\n\r\n                    return;\r\n                }\r\n\r\n                deactiveLinks.forEach(function (item) { item.classList.add('active'); });\r\n\r\n                UFE.emit('hrefActive', { href: newHref });\r\n            }\r\n            function loginActiveLink() {\r\n\r\n                if (loginActiveLink.isInit) { return; }\r\n\r\n                if (window.datacontext?.user) { \r\n\r\n                    loginActiveLink.isInit = true;\r\n                    window.datacontext.user.on('isLogged', function (event) {\r\n\r\n                        clearTimeout(loginActiveLink.timeout);\r\n                        loginActiveLink.timeout = setTimeout(function () {\r\n\r\n                            deactiveLink();\r\n                            activeLink();\r\n                        }, 1000);\r\n\r\n                        return true;\r\n                    });\r\n                }\r\n            }\r\n        }\r\n        function openModal(template) {\r\n\r\n            fetch(template).then(res => res.text().then(openModalHTML));\r\n        }\r\n        function openModalHTML(strHTML) {\r\n\r\n            if (!strHTML) { return; }\r\n            if (!bootstrap.Modal) { return; }\r\n\r\n            var div = document.createElement('div');\r\n            document.body.appendChild(div);\r\n            div.innerHTML = strHTML;\r\n            getDB()?.bindAllElements(div);\r\n            var modalElement = div.querySelector('.modal');\r\n            modalElement.addEventListener('hidden.bs.modal', function (event) {\r\n                setTimeout(function () { document.body.removeChild(div); });\r\n            });\r\n            var modal = new bootstrap.Modal(modalElement);\r\n            UFE.modalHide = function () { setTimeout(function (modal) { modal.hide(); }, 0, modal); };\r\n            modal.show();\r\n        }\r\n        /**\r\n         * Bootstrap Alerts\r\n         * Example - showalert(\"Invalid Login\",\"alert-danger\")\r\n         * Types of alerts -- \"alert-danger\",\"alert-success\",\"alert-info\",\"alert-warning\"\r\n         * @param {string} message\r\n         * @param {string} alerttype \"alert-danger\" | \"alert-success\" | \"alert-info\" | \"alert-warning\"\r\n         */\r\n        function showAlert(message, alerttype = \"alert-success\") {\r\n\r\n            if (!message || !UFE.alertMessageSelector) { return; }\r\n\r\n            var containerElement = document.querySelector(UFE.alertMessageSelector);\r\n\r\n            if (!containerElement) {\r\n\r\n                pDebug(\r\n                    'Alert container not found. ' +\r\n                    'Please add an element with the ID \\'alert-message-container\\' to your HTML. ' + \r\n                    'Example: <div id=\"alert-message-container\" class=\"position-fixed top-0 start-50 translate-middle-x w-75  mt-5 mx-3\" style=\"z-index: 1080\"></div>' +\r\n                    'Or use the \\'alertMessageSelector\\' property to set a custom selector.'\r\n                );\r\n\r\n                return;\r\n            }\r\n\r\n            containerElement.insertAdjacentHTML('beforeend', `\r\n<div class=\"alert ${alerttype} alert-dismissible fade show mb-1\" role=\"alert\">\r\n                        <i class=\"bi ${icon(alerttype)} position-absolute\"></i>\r\n                        <div class=\"w-auto ms-4 text-center\"><strong>${message}</strong></div>\r\n                        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>\r\n</div>\r\n                        `);\r\n            setTimeout(\r\n                function (element) {\r\n\r\n                    element.querySelector('.btn-close').click();\r\n                },\r\n                alerttype === \"alert-success\" ? 3000 : 6000,\r\n                containerElement.lastElementChild\r\n            );\r\n\r\n\r\n            function icon(alerttype) {\r\n\r\n                switch (alerttype) {\r\n                    case \"alert-danger\": return \"bi-exclamation-triangle-fill\";\r\n                    case \"alert-success\": return \"bi-check-circle-fill\";\r\n                    case \"alert-info\": return \"bi-info-square-fill\";\r\n                    case \"alert-warning\": return \"bi-exclamation-square-fill\";\r\n                    default: return \"bi-info-square-fill\";\r\n                }\r\n            }\r\n        }\r\n\r\n        // Debugging\r\n        function pDebug(...args) { if (isDebug) { console.log(`[ DEBUG ] `, ...args); } }\r\n        function pError(...args) { if (isDebug) { console.error(`[ ERROR ] `, ...args); } }\r\n    });\r\n\r\n    /**\r\n     * Exporting the library as a module.\r\n     * @param {string} exportIdentifier Export identifier\r\n     * @param {string[]} importIdentifierArray Import identifier array\r\n     * @param {any} factory Factory function\r\n     * @returns {void}\r\n     */\r\n    function exportModule(exportIdentifier, importIdentifierArray, factory) {\r\n\r\n        var thisScope = \"undefined\" != typeof globalThis\r\n            ? globalThis\r\n            : \"undefined\" != typeof window\r\n                ? window\r\n                : \"undefined\" != typeof global\r\n                    ? global : \"undefined\" != typeof self\r\n                        ? self\r\n                        : {};\r\n\r\n        if (!thisScope.modules) { thisScope.modules = {}; }\r\n\r\n        // Browser\r\n        waitModules();\r\n\r\n\r\n        function waitModules() {\r\n\r\n            if (importIdentifierArray.length) {\r\n\r\n                for (let i = 0; i < importIdentifierArray.length; i++) {\r\n\r\n                    if (!thisScope.modules[importIdentifierArray[i]]) { return setTimeout(waitModules, 10); }\r\n                }\r\n            }\r\n\r\n            thisScope.modules[exportIdentifier] = factory.call(thisScope, ...importIdentifierArray.map(function (id) { return thisScope.modules[id]; }));\r\n        }\r\n    }\r\n})();"]}