/**
 * SyntaxHighlighter
 * http://alexgorbatchev.com/SyntaxHighlighter
 *
 * SyntaxHighlighter is donationware. If you are using it, please donate.
 * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
 *
 * @version
 * 3.0.83 (July 02 2010)
 *
 * @copyright
 * Copyright (C) 2004-2010 Alex Gorbatchev.
 *
 * @license
 * Dual licensed under the MIT and GPL licenses.
 */
(function () {

    const sh = SyntaxHighlighter;

    /**
     * Provides functionality to dynamically load only the brushes that a needed to render the current page.
     *
     * There are two syntaxes that autoload understands. For example:
     *
     * SyntaxHighlighter.autoloader(
     *     [ 'applescript',          'Scripts/shBrushAppleScript.js' ],
     *     [ 'actionscript3', 'as3', 'Scripts/shBrushAS3.js' ]
     * );
     *
     * or a more easily comprehendable one:
     *
     * SyntaxHighlighter.autoloader(
     *     'applescript       Scripts/shBrushAppleScript.js',
     *     'actionscript3 as3 Scripts/shBrushAS3.js'
     * );
     */
    sh.autoloader = function () {
        let url;
        const list = arguments,
            elements = sh.findElements(),
            brushes = {},
            scripts = {},
            all = SyntaxHighlighter.all;
        let allCalled = false,
            allParams = null,
            i
        ;

        SyntaxHighlighter.all = function (params) {
            allParams = params;
            allCalled = true;
        };

        function addBrush(aliases, url) {
            for (let i = 0; i < aliases.length; i++)
                brushes[aliases[i]] = url;
        };

        function getAliases(item) {
            return item.pop
                ? item
                : item.split(/\s+/)
                ;
        }

        // create table of aliases and script urls
        for (i = 0; i < list.length; i++) {
            var aliases = getAliases(list[i]);
            url = aliases.pop();
            addBrush(aliases, url);
        }

        // dynamically add <script /> tags to the document body
        for (i = 0; i < elements.length; i++) {
            url = brushes[elements[i].params.brush];

            if (!url)
                continue;

            scripts[url] = false;
            loadScript(url);
        }

        function loadScript(url) {
            const script = document.createElement('script');
            let done = false
            ;

            script.src = url;
            script.type = 'text/javascript';
            script.language = 'javascript';
            script.onload = script.onreadystatechange = function () {
                if (!done && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete')) {
                    done = true;
                    scripts[url] = true;
                    checkAll();

                    // Handle memory leak in IE
                    script.onload = script.onreadystatechange = null;
                    script.parentNode.removeChild(script);
                }
            };

            // sync way of adding script tags to the page
            document.body.appendChild(script);
        };

        function checkAll() {
            for (let url in scripts)
                if (scripts[url] == false)
                    return;

            if (allCalled)
                SyntaxHighlighter.highlight(allParams);
        };
    };

})();
