/* eslint-disable */

/*
This file is self contained and does various runtime checks to detect if teh current browser
is supported. In case it isn't it will replace the whole(!) page with an error message.

Example usage:
    <script src="browser-check.js" defer></script>
    <noscript>Diese Applikation benรถtigt Javascript / This application requires Javascript</noscript>
*/

(function () {
    // https://caniuse.com/#feat=es6
    function supportsES6() {
        if (typeof Symbol == 'undefined') return false;

        try {
            eval('class Foo {}');
            eval('var bar = (x) => x+1');
        } catch (e) {
            console.log(e);
            return false;
        }

        return true;
    }

    // https://caniuse.com/#feat=es6-module-dynamic-import
    function supportsDynamicImport() {
        try {
            new Function('import("")');
            return true;
        } catch (err) {
            return false;
        }
    }

    // https://caniuse.com/#feat=shadowdomv1
    function supportsShadowDOM() {
        return (
            typeof Element != 'undefined' &&
            'attachShadow' in Element.prototype &&
            'getRootNode' in Element.prototype
        );
    }

    // https://caniuse.com/#feat=custom-elementsv1
    function supportsCustomElements() {
        return !!window.customElements;
    }

    // https://caniuse.com/#feat=async-functions
    function supportsAsyncAwait() {
        try {
            eval('async () => {}');
        } catch (e) {
            return false;
        }
        return true;
    }

    // https://caniuse.com/#feat=mdn-javascript_statements_import_meta
    function supportsImportMeta() {
        // TODO: sadly no idea how to test this..
        return true;
    }

    // Eval can be disabled through https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
    function supportsEval() {
        try {
            eval('');
        } catch (e) {
            return false;
        }
        return true;
    }

    // https://caniuse.com/abortcontroller
    function supportsAbortController() {
        // AbortController in older Safari is broken, so check for the signal property
        // as well.
        return !!window.AbortController && Request.prototype.hasOwnProperty('signal');
    }

    // check for safari 13.1+ and safari on iOS 13.4+
    // https://caniuse.com/resizeobserver
    function supportsResizeObserver() {
        try {
            eval('new ResizeObserver(items => {})');
        } catch (e) {
            return false;
        }

        return true;
    }

    // check for globalThis support, required by lit
    // https://caniuse.com/mdn-javascript_builtins_globalthis
    function supportsGlobalThis() {
        try {
            eval('globalThis !== undefined')
        } catch(e) {
            return false;
        }

        return true;
    }

    function isBrowserSupported() {
        if (!supportsEval()) {
            console.log('Eval support disabled, skipping browser feature detection.');
            return true;
        }

        if (!supportsES6()) {
            console.log('ES6 not supported');
            return false;
        }

        if (!supportsDynamicImport()) {
            console.log('Dynamic imports not supported');
            return false;
        }

        if (!supportsShadowDOM()) {
            console.log('Shadow DOM not supported');
            return false;
        }

        if (!supportsCustomElements()) {
            console.log('Custom Elements not supported');
            return false;
        }

        if (!supportsAsyncAwait()) {
            console.log('Async Await not supported');
            return false;
        }

        if (!supportsImportMeta()) {
            console.log('import.meta not supported');
            return false;
        }

        if (!supportsAbortController()) {
            console.log('AbortController not supported');
            return false;
        }

        if (!supportsResizeObserver()) {
            console.log('ResizeObserver not supported');
            return false;
        }

        if (!supportsGlobalThis()) {
            console.log('globalThis not supported');
            return false;
        }

        return true;
    }

    var MultiString = function (f) {
        return f.toString().split('\n').slice(1, -1).join('\n');
    };

    var ms = MultiString(function () {
        /**
<style>
    #unsupported .overlay {
        font-family: sans-serif;
        font-size: 0.9em;
        line-height: 1.5em;
        position: fixed;
        width: 100%;
        height: 100%;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        background-color: #fafafa;
        color: #333;
        z-index: 1001;
    }
    #unsupported .content{
        position: absolute;
        top: 50%;
        left: 0;
        text-align: center;
        width: 80%;
        left: 10%;
        -ms-transform: translateY(-50%);
        transform: translateY(-50%);
    }
    #unsupported .separator {
        letter-spacing: 0.3em;
        margin: 2em 0;
    }
</style>
<div id="unsupported">
    <div class="overlay">
        <div class="content">
            <h2>Ihr Browser wird leider nicht mehr unterstรผtzt</h2>
            <p>
                Diese Applikation benรถtigt Funktionen, die von Ihrem aktuellen Browser noch nicht bereitgestellt werden.
                Bitte probieren Sie es mit einem anderen Browser oder aktualisieren Sie Ihren aktuellen.
            </p>
            <h3 class="separator">๐Ÿ™๐Ÿ™๐Ÿ™๐Ÿ™๐Ÿ™๐Ÿ™๐Ÿ™๐Ÿ™๐Ÿ™๐Ÿ™๐Ÿ™๐Ÿ™</h3>
            <h2>Your browser is sadly no longer supported</h2>
            <p>
                This application requires features that are not yet provided by your current browser.
                Please try to use a different browser or update your current one.
            </p>
        </div>
    </div> 
</div>
**/
    });

    function main() {
        if (!isBrowserSupported()) {
            document.body.innerHTML = ms;
        }
    }

    main();
})();