Sindbad~EG File Manager

Current Path : /var/www/html/ch.sumar.com.py/cursos/theme/snap/amd/build/
Upload File :
Current File : /var/www/html/ch.sumar.com.py/cursos/theme/snap/amd/build/snap.min.js.map

{"version":3,"file":"snap.min.js","sources":["../src/snap.js"],"sourcesContent":["/**\n * This file is part of Moodle - http://moodle.org/\n *\n * Moodle is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Moodle is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Moodle.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @package\n * @copyright Copyright (c) 2015 Open LMS (https://www.openlms.net)\n * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n/* exported snapInit */\n/* eslint no-invalid-this: \"warn\"*/\n\n/**\n * Main snap initialising function.\n */\ndefine(['jquery', 'core/log', 'theme_snap/headroom', 'theme_snap/util', 'theme_snap/personal_menu',\n        'theme_snap/cover_image', 'theme_snap/progressbar', 'core/templates', 'core/str', 'theme_snap/accessibility',\n        'theme_snap/messages', 'theme_snap/scroll'],\n    function($, log, Headroom, util, personalMenu, coverImage, ProgressBar, templates, str, accessibility, messages, Scroll) {\n\n        'use strict';\n\n        /* eslint-disable camelcase */\n        M.theme_snap = M.theme_snap || {};\n        /* eslint-enable camelcase */\n\n        /**\n         * master switch for logging\n         * @type {boolean}\n         */\n        var loggingenabled = false;\n\n        if (!loggingenabled) {\n            log.disableAll(true);\n        } else {\n            log.enableAll(true);\n        }\n\n        /**\n         * Initialize pre SCSS and grading constants.\n         * New variables can be initialized if necessary.\n         * These variables are being passed from classes/output/shared.php,\n         * and being updated from php constants in snapInit.\n         */\n        var brandColorSuccess = '';\n        var brandColorWarning = '';\n        var GRADE_DISPLAY_TYPE_PERCENTAGE = '';\n        var GRADE_DISPLAY_TYPE_PERCENTAGE_REAL = '';\n        var GRADE_DISPLAY_TYPE_PERCENTAGE_LETTER = '';\n        var GRADE_DISPLAY_TYPE_REAL = '';\n        var GRADE_DISPLAY_TYPE_REAL_PERCENTAGE = '';\n        var GRADE_DISPLAY_TYPE_REAL_LETTER = '';\n\n        /**\n         * Get all url parameters from href\n         * @param {string} href\n         * @returns {Array}\n         */\n        var getURLParams = function(href) {\n            // Create temporary array from href.\n            var ta = href.split('?');\n            if (ta.length < 2) {\n                return false; // No url params\n            }\n            // Get url params full string from href.\n            var urlparams = ta[1];\n\n            // Strip out hash component\n            urlparams = urlparams.split('#')[0];\n\n            // Get urlparam items.\n            var items = urlparams.split('&');\n\n            // Create params array of values hashed by key.\n            var params = [];\n            for (var i = 0; i < items.length; i++) {\n                var item = items[i].split('=');\n                var key = item[0];\n                var val = item[1];\n                params[key] = val;\n            }\n            return (params);\n        };\n\n        /**\n         * Change save and cancel buttons from forms to the bottom on mobile mode.\n         */\n        $(window).on('resize', function() {\n            mobileFormChecker();\n            updateGraderHeadersTop();\n        });\n\n        var mobileFormChecker = function() {\n            var savebuttonsformrequired = $('div[role=main] .mform div.snap-form-required fieldset > div.form-group.fitem');\n            var savebuttonsformadvanced = $('div[role=main] .mform div.snap-form-advanced > div:nth-of-type(3)');\n            var width = $(window).width();\n            if (width < 992) {\n                $('.snap-form-advanced').append(savebuttonsformrequired);\n            } else if (width > 992) {\n                $('.snap-form-required fieldset#id_general').append(savebuttonsformadvanced);\n            }\n        };\n\n        const updateGraderHeadersTop = function() {\n            const graderHeader = $('.path-grade-report-grader .gradeparent tr.heading');\n            if (graderHeader.length) {\n                graderHeader.css('top', $('#mr-nav').height() + 'px');\n            }\n        };\n\n        const regionMain = $('.path-grade-report-grader #region-main div[role=\"main\"]');\n        if (regionMain.length > 0) {\n            const gradeParent = regionMain[0].querySelector('.gradeparent');\n            if (gradeParent) {\n                regionMain.addClass('snap-grade-reporter');\n            }\n        }\n\n        updateGraderHeadersTop();\n\n        /**\n         * Move PHP errors into header\n         *\n         * @author Guy Thomas\n         * @date 2014-05-19\n         */\n        var movePHPErrorsToHeader = function() {\n            // Remove <br> tags inserted before xdebug-error.\n            var xdebugs = $('.xdebug-error');\n            if (xdebugs.length) {\n                for (var x = 0; x < xdebugs.length; x++) {\n                    var el = xdebugs[x];\n                    var fontel = el.parentNode;\n                    var br = $(fontel).prev('br');\n                    $(br).remove();\n                }\n            }\n\n            // Get messages using the different classes we want to use to target debug messages.\n            var msgs = $('.xdebug-error, .php-debug, .debuggingmessage');\n\n            if (msgs.length) {\n                // OK we have some errors - lets shove them in the footer.\n                $(msgs).addClass('php-debug-footer');\n                var errorcont = $('<div id=\"footer-error-cont\"><h3>' +\n                    M.util.get_string('debugerrors', 'theme_snap') +\n                    '</h3><hr></div>');\n                $('#page-footer').append(errorcont);\n                $('#footer-error-cont').append(msgs);\n                // Add rulers\n                $('.php-debug-footer').after($('<hr>'));\n                // Lets also add the error class to the header so we know there are some errors.\n                $('#mr-nav').addClass('errors-found');\n                // Lets add an error link to the header.\n                var errorlink = $('<a class=\"footer-error-link btn btn-danger\" href=\"#footer-error-cont\">' +\n                    M.util.get_string('problemsfound', 'theme_snap') + ' <span class=\"badge\">' + (msgs.length) + '</span></a>');\n                $('#page-header').append(errorlink);\n            }\n        };\n\n        /**\n         * Are we on the course page?\n         * Note: This doesn't mean that we are in a course - Being in a course could mean that you are on a module page.\n         * This means that you are actually on the course page.\n         * @returns {boolean}\n         */\n        var onCoursePage = function() {\n            return $('body').attr('id').indexOf('page-course-view-') === 0;\n        };\n\n        /**\n         * Apply block hash to form actions etc if necessary.\n         */\n        /* eslint-disable no-invalid-this */\n        var applyBlockHash = function() {\n            // Add block hash to add block form.\n            if (onCoursePage()) {\n                $('.block_adminblock form').each(function() {\n                    /* eslint-disable no-invalid-this */\n                    $(this).attr('action', $(this).attr('action') + '#coursetools');\n                });\n            }\n\n            if (location.hash !== '') {\n                return;\n            }\n\n            var urlParams = getURLParams(location.href);\n\n            // If calendar navigation has been clicked then go back to calendar.\n            if (onCoursePage() && typeof (urlParams.time) !== 'undefined') {\n                location.hash = 'coursetools';\n                if ($('.block_calendar_month')) {\n                    util.scrollToElement($('.block_calendar_month'));\n                }\n            }\n\n            // Form selectors for applying blocks hash.\n            var formselectors = [\n                'body.path-blocks-collect #notice form'\n            ];\n\n            // There is no decent selector for block deletion so we have to add the selector if the current url has the\n            // appropriate parameters.\n            var paramchecks = ['bui_deleteid', 'bui_editid'];\n            for (var p in paramchecks) {\n                var param = paramchecks[p];\n                if (typeof (urlParams[param]) !== 'undefined') {\n                    formselectors.push('#notice form');\n                    break;\n                }\n            }\n\n            // If required, apply #coursetools hash to form action - this is so that on submitting form it returns to course\n            // page on blocks tab.\n            $(formselectors.join(', ')).each(function() {\n                // Only apply the blocks hash if a hash is not already present in url.\n                var formurl = $(this).attr('action');\n                if (formurl.indexOf('#') === -1\n                    && (formurl.indexOf('/course/view.php') > -1)\n                ) {\n                    $(this).attr('action', $(this).attr('action') + '#coursetools');\n                }\n            });\n        };\n\n        /**\n         * Set forum strings because there isn't a decent renderer for mod/forum\n         * It would be great if the official moodle forum module used a renderer for all output\n         *\n         * @author Guy Thomas\n         * @date 2014-05-20\n         */\n        var setForumStrings = function() {\n            $('.path-mod-forum tr.discussion td.topic.starter').attr('data-cellname',\n                M.util.get_string('forumtopic', 'theme_snap'));\n            $('.path-mod-forum tr.discussion td.picture:not(\\'.group\\')').attr('data-cellname',\n                M.util.get_string('forumauthor', 'theme_snap'));\n            $('.path-mod-forum tr.discussion td.picture.group').attr('data-cellname',\n                M.util.get_string('forumpicturegroup', 'theme_snap'));\n            $('.path-mod-forum tr.discussion td.replies').attr('data-cellname',\n                M.util.get_string('forumreplies', 'theme_snap'));\n            $('.path-mod-forum tr.discussion td.lastpost').attr('data-cellname',\n                M.util.get_string('forumlastpost', 'theme_snap'));\n        };\n\n        /**\n         * Process toc search string - trim, remove case sensitivity etc.\n         *\n         * @author Guy Thomas\n         * @param {string} searchString\n         * @returns {string}\n         */\n        var processSearchString = function(searchString) {\n            searchString = searchString.trim().toLowerCase();\n            return (searchString);\n        };\n\n        /**\n         * Search course modules\n         *\n         * @author Stuart Lamour\n         * @param {array} dataList\n         */\n        var tocSearchCourse = function(dataList) {\n            // Keep search input open\n            var i;\n            var ua = window.navigator.userAgent;\n            if (ua.indexOf('MSIE ') || ua.indexOf('Trident/')) {\n                // We have reclone datalist over again for IE, or the same search fails the second time round.\n                dataList = $(\"#toc-searchables\").find('li').clone(true);\n            }\n\n            // TODO - for 2.7 process search string called too many times?\n            var searchString = $(\"#toc-search-input\").val();\n            searchString = processSearchString(searchString);\n\n            if (searchString.length === 0) {\n                $('#toc-search-results').html('');\n                $(\"#toc-search-input\").removeClass('state-active');\n\n            } else {\n                $(\"#toc-search-input\").addClass('state-active');\n                var matches = [];\n                for (i = 0; i < dataList.length; i++) {\n                    var dataItem = dataList[i];\n                    if (processSearchString($(dataItem).text()).indexOf(searchString) > -1) {\n                        matches.push(dataItem);\n                    }\n                }\n                $('#toc-search-results').html(matches);\n            }\n        };\n\n        /**\n         * Apply body classes which could not be set by renderers - e.g. when a notice was outputted.\n         * We could do this in plain CSS if there was such a think as a parent selector.\n         */\n        var bodyClasses = function() {\n            var extraclasses = [];\n            if ($('#notice.snap-continue-cancel').length) {\n                extraclasses.push('hascontinuecancel');\n            }\n            $('body').addClass(extraclasses.join(' '));\n        };\n\n        /**\n         * Listen for hash changes / popstates.\n         * @param {CourseLibAmd} courseLib\n         */\n        var listenHashChange = function(courseLib) {\n            var lastHash = location.hash;\n            $(window).on('popstate hashchange', function(e) {\n                var newHash = location.hash;\n                log.info('hashchange');\n                if (newHash !== lastHash) {\n                    if (location.hash === '#primary-nav') {\n                        personalMenu.update();\n                    } else {\n                        $('#page, #moodle-footer, #js-snap-pm-trigger, #logo, .skiplinks').css('display', '');\n                        if (onCoursePage()) {\n                            log.info('show section', e.target);\n                            courseLib.showSection();\n                        }\n                    }\n                }\n                lastHash = newHash;\n            });\n        };\n\n        /**\n         * Course footer recent activity dom re-order.\n         */\n        var recentUpdatesFix = function() {\n            $('#snap-course-footer-recent-activity .info').each(function() {\n                $(this).appendTo($(this).prev());\n            });\n            $('#snap-course-footer-recent-activity .head .name').each(function() {\n                $(this).prependTo($(this).closest(\".head\"));\n            });\n        };\n\n        /**\n         * Apply progressbar.js for circular progress displays.\n         * @param {node} nodePointer\n         * @param {function} dataCallback\n         * @param {function} valueCallback\n         */\n        var createColoredDataCircle = function(nodePointer, dataCallback, valueCallback = null) {\n            var circle = new ProgressBar.Circle(nodePointer, {\n                color: 'inherit', // @gray.\n                easing: 'linear',\n                strokeWidth: 6,\n                trailWidth: 3,\n                duration: 1400,\n                text: {\n                    value: '0'\n                }\n            });\n            var value = ($(nodePointer).attr('value') / 100);\n            var endColor = brandColorSuccess; // Green @brand-success.\n            if (value === 0 || $(nodePointer).attr('value') === '-') {\n                circle.setText('-');\n            } else {\n                if ($(nodePointer).attr('value') < 50) {\n                    endColor = brandColorWarning; // Orange @brand-warning.\n                }\n                circle.setText(dataCallback(nodePointer));\n            }\n            var valueAnimate = 0;\n\n            if (valueCallback === null) {\n                valueAnimate = value;\n            } else {\n                valueAnimate = valueCallback(nodePointer);\n            }\n            circle.animate(valueAnimate, {\n                from: {\n                    color: '#999' // @gray-light.\n                },\n                to: {\n                    color: endColor\n                },\n                step: function(state, circle) {\n                    circle.path.setAttribute('stroke', state.color);\n                }\n            });\n        };\n\n        var progressbarcircle = function() {\n            $('.snap-student-dashboard-progress .js-progressbar-circle').each(function() {\n                createColoredDataCircle(this, function(nodePointer) {\n                    return $(nodePointer).attr('value') + '<small>%</small>';\n                });\n            });\n\n            $('.snap-student-dashboard-grade .js-progressbar-circle').each(function() {\n                createColoredDataCircle(this, function(nodePointer) {\n                    var nodeValue = $(nodePointer).attr('value');\n                    var gradeFormat = $(nodePointer).attr('gradeformat');\n\n                    /**\n                     * Definitions for gradebook.\n                     *\n                     * We need to display the % for all the grade formats which contains a % in the value.\n                     */\n                    if (gradeFormat == GRADE_DISPLAY_TYPE_PERCENTAGE\n                        || gradeFormat == GRADE_DISPLAY_TYPE_PERCENTAGE_REAL\n                        || gradeFormat == GRADE_DISPLAY_TYPE_PERCENTAGE_LETTER) {\n                        nodeValue = nodeValue + '<small>%</small>';\n                    }\n                    return nodeValue;\n                }, function(nodePointer) {\n                    var valueAnimate = $(nodePointer).attr('value');\n                    var gradeFormat = $(nodePointer).attr('gradeformat');\n\n                    if (gradeFormat == GRADE_DISPLAY_TYPE_REAL\n                        || gradeFormat == GRADE_DISPLAY_TYPE_REAL_PERCENTAGE\n                        || gradeFormat == GRADE_DISPLAY_TYPE_REAL_LETTER) {\n                        valueAnimate = 0;\n                    } else {\n                        valueAnimate = ($(nodePointer).attr('value') / 100);\n                    }\n                    return valueAnimate;\n                });\n            });\n        };\n\n        /**\n         * Add listeners.\n         *\n         * just a wrapper for various snippets that add listeners\n         */\n        var addListeners = function() {\n            var selectors = [\n                '.chapters a',\n                '.section_footer a',\n                ' #toc-search-results a'\n            ];\n\n            $(document).on('click', selectors.join(', '), function(e) {\n                var href = this.getAttribute('href');\n                if (window.history && window.history.pushState) {\n                    history.pushState(null, null, href);\n                    // Force hashchange fix for FF & IE9.\n                    $(window).trigger('hashchange');\n                    // Prevent scrolling to section.\n                    e.preventDefault();\n                } else {\n                    location.hash = href;\n                }\n            });\n\n            // Show fixed header on scroll down\n            // using headroom js - http://wicky.nillia.ms/headroom.js/\n            var myElement = document.querySelector(\"#mr-nav\");\n            // Functions added to trigger on pin and unpin actions for the nav bar\n            var onPin = () => {\n                $('.snap-drawer-no-headroom').addClass('snap-drawer-headroom');\n                $('.snap-drawer-headroom').removeClass('snap-drawer-no-headroom');\n            };\n            var onUnpin = () => {\n                $('.snap-drawer-headroom').addClass('snap-drawer-no-headroom');\n                $('.snap-drawer-no-headroom').removeClass('snap-drawer-headroom');\n            };\n            // Construct an instance of Headroom, passing the element.\n            var headroom = new Headroom(myElement, {\n                \"tolerance\": 5,\n                \"offset\": 100,\n                \"classes\": {\n                    // When element is initialised\n                    initial: \"headroom\",\n                    // When scrolling up\n                    pinned: \"headroom--pinned\",\n                    // When scrolling down\n                    unpinned: \"headroom--unpinned\",\n                    // When above offset\n                    top: \"headroom--top\",\n                    // When below offset\n                    notTop: \"headroom--not-top\"\n                },\n                \"onPin\": onPin,\n                \"onUnpin\": onUnpin\n            });\n            // When not signed in always show mr-nav?\n            if (!$('.notloggedin').length) {\n                headroom.init();\n            }\n\n            // Listener for toc search.\n            var dataList = $(\"#toc-searchables\").find('li').clone(true);\n            $('#course-toc').on('keyup', '#toc-search-input', function() {\n                tocSearchCourse(dataList);\n            });\n\n            // Handle keyboard navigation of search items.\n            $('#course-toc').on('keydown', '#toc-search-input', function(e) {\n                var keyCode = e.keyCode || e.which;\n                if (keyCode === 9) {\n                    // 9 tab\n                    // 13 enter\n                    // 40 down arrow\n                    // Register listener for exiting search result.\n                    $('#toc-search-results a').last().blur(function() {\n                        $(this).off('blur'); // Unregister listener\n                        $(\"#toc-search-input\").val('');\n                        $('#toc-search-results').html('');\n                        $(\"#toc-search-input\").removeClass('state-active');\n                    });\n\n                }\n            });\n\n            $('#course-toc').on(\"click\", '#toc-search-results a', function() {\n                $(\"#toc-search-input\").val('');\n                $('#toc-search-results').html('');\n                $(\"#toc-search-input\").removeClass('state-active');\n            });\n\n            /**\n             * When the document is clicked, if the closest object that was clicked was not the search input then close\n             * the search results.\n             * Note that this is triggered also when you click on a search result as the results should no longer be\n             * required at that point.\n             */\n            $(document).on('click', function(event) {\n                if (!$(event.target).closest('#toc-search-input').length) {\n                    $(\"#toc-search-input\").val('');\n                    $('#toc-search-results').html('');\n                    $(\"#toc-search-input\").removeClass('state-active');\n                }\n            });\n\n            // Onclick for toggle of state-visible of admin block and mobile menu.\n            $(document).on(\"click\", \"#admin-menu-trigger, #toc-mobile-menu-toggle\", function(e) {\n\n                // Close the Snap feeds side menu in case it is open.\n                var snapFeedsTrigger = document.getElementById('snap_feeds_side_menu_trigger');\n                if ($(snapFeedsTrigger).length != 0) {\n                    var hrefSnapFeeds = snapFeedsTrigger.getAttribute('href');\n                    if ($(snapFeedsTrigger).hasClass('active') && $(hrefSnapFeeds).hasClass('state-visible')) {\n                        var showFeedsString = M.util.get_string('show', 'moodle')\n                            + ' ' +  M.util.get_string('snapfeedsblocktitle', 'theme_snap');\n                        $(snapFeedsTrigger).attr('title', showFeedsString);\n                        $(snapFeedsTrigger).attr('aria-label', showFeedsString);\n                        $(snapFeedsTrigger).attr('aria-expanded', false);\n                        $(snapFeedsTrigger).removeClass('active');\n                        $(hrefSnapFeeds).removeClass('state-visible');\n                        $('#page').toggleClass('offcanvas');\n                    }\n                }\n                var href = this.getAttribute('href');\n                // Make this only happen for settings button.\n                if (this.getAttribute('id') === 'admin-menu-trigger') {\n                    $(this).toggleClass('active');\n                    $('#page').toggleClass('offcanvas');\n                }\n                $(href).attr('tabindex', '0');\n                $(href).toggleClass('state-visible').focus();\n                e.preventDefault();\n\n                if ($('.message-app.main').length === 0) {\n                    document.dispatchEvent(new Event(\"messages-drawer:toggle\"));\n                }\n            });\n\n            // Onclick for toggle of state-visible of snap feeds side menu.\n            $(document).on(\"click\", \"#snap_feeds_side_menu_trigger\", function(e) {\n                // Close the Admin settings block in case it is open.\n                var adminSettingsTrigger = document.getElementById('admin-menu-trigger');\n                if ($(adminSettingsTrigger).length != 0) {\n                    var hrefAdminSettings = adminSettingsTrigger.getAttribute('href');\n                    if ($(adminSettingsTrigger).hasClass('active') && $(hrefAdminSettings).hasClass('state-visible')) {\n                        $(adminSettingsTrigger).removeClass('active');\n                        $(hrefAdminSettings).removeClass('state-visible');\n                        $('#page').toggleClass('offcanvas');\n                    }\n                }\n\n                var href = this.getAttribute('href');\n                if (this.getAttribute('id') === 'snap_feeds_side_menu_trigger') {\n                    var showFeedsString = M.util.get_string('show', 'moodle')\n                        + ' ' +  M.util.get_string('snapfeedsblocktitle', 'theme_snap');\n                    var hideFeedsString = M.util.get_string('hide', 'moodle')\n                        + ' ' +  M.util.get_string('snapfeedsblocktitle', 'theme_snap');\n                    if (this.getAttribute('title') === showFeedsString) {\n                        $(this).attr('title', hideFeedsString);\n                        $(this).attr('aria-label', hideFeedsString);\n                        $(this).attr('aria-expanded', true);\n                    } else {\n                        $(this).attr('title', showFeedsString);\n                        $(this).attr('aria-label', showFeedsString);\n                        $(this).attr('aria-expanded', false);\n                    }\n                    $(this).toggleClass('active');\n                    $('#page').toggleClass('offcanvas');\n                }\n                $(href).toggleClass('state-visible').focus();\n                e.preventDefault();\n            });\n\n            // Mobile menu button.\n            $(document).on(\"click\", \"#course-toc.state-visible a\", function() {\n                $('#course-toc').removeClass('state-visible');\n            });\n\n            // Reset videos, when changing section (INT-18208).\n            $(document).on(\"click\", \".section_footer a, .chapter-title, .toc-footer a\", function() {\n                const videos = $('[title=\"watch\"], .video-js, iframe:not([id])');\n                for (let i = 0; i < videos.length; i++) {\n                    if (videos[i].classList.contains('video-js')) {\n                        if (videos[i].classList.contains('vjs-playing')) {\n                            let videoButton = videos[i].querySelector('.vjs-play-control.vjs-control.vjs-button');\n                            videoButton.click(); // Stop for videos using video-js Plugin.\n                        }\n                    } else if (videos[i].nodeName === 'IFRAME') {\n                        if (videos[i].src.includes(\"vimeo\")) {\n                            videos[i].src += \"\"; // Stop for Vimeo embedded videos.\n                        }\n                    } else {\n                        videos[i].querySelector('iframe').src += \"\"; // Stop for Youtube embedded videos.\n                    }\n                }\n            });\n\n            $(document).on('click', '.news-article .toggle', function(e) {\n                var $news = $(this).closest('.news-article');\n                var $newstoggle = $(this);\n                var $newsclose = $news.find('.news-article-message > div > a[role=\"button\"]');\n                util.scrollToElement($news);\n                $('.news-article').not($news).removeClass('state-expanded');\n                $('.news-article .toggle').not($newstoggle).attr('aria-expanded', 'false');\n                $('.news-article-message > div > a[role=\"button\"]').not($newsclose).attr('aria-expanded', 'false');\n                $('.news-article-message').css('display', 'none');\n\n                $news.toggleClass('state-expanded');\n                if (!$news.attr('state-expanded')) {\n                    $news.focus();\n                    $newstoggle.attr('aria-expanded', 'false');\n                    $newsclose.attr('aria-expanded', 'false');\n                }\n                $('.state-expanded').find('.news-article-message').slideDown(\"fast\", function() {\n                    // Animation complete.\n                    if ($news.is('.state-expanded')) {\n                        $news.find('.news-article-message').focus();\n                        $newstoggle.attr('aria-expanded', 'true');\n                        $newsclose.attr('aria-expanded', 'true');\n                    } else {\n                        $news.focus();\n                        $newstoggle.attr('aria-expanded', 'false');\n                        $newsclose.attr('aria-expanded', 'false');\n                    }\n                    $(document).trigger('snapContentRevealed');\n                });\n                e.preventDefault();\n            });\n\n            // Add listeners for pausing animated images.\n            $(document).on('click', '.anim-play-button', function() {\n                $(this).parent().prev().css('visibility', 'visible');\n            });\n            $(document).on('click', '.anim-pause-button', function() {\n                $(this).parent().prev().css('visibility', 'hidden');\n            });\n\n            // Initialise the scroll event listener.\n            (new Scroll()).init();\n\n            // Bootstrap js elements.\n\n            // Initialise core bootstrap tooltip js.\n            $(function() {\n                var supportsTouch = false;\n                if ('ontouchstart' in window) {\n                    // IOS & android\n                    supportsTouch = true;\n                } else if (window.navigator.msPointerEnabled) {\n                    // Win8\n                    supportsTouch = true;\n                }\n                if (!supportsTouch) {\n                    var tooltipNode = $('[data-toggle=\"tooltip\"]');\n                    if ($.isFunction(tooltipNode.tooltip)) {\n                        tooltipNode.tooltip();\n                    }\n                }\n            });\n        };\n\n        /**\n         * Function to fix the styles when fullscreen is used with Atto Editor.\n         */\n        function waitForFullScreenButton() {\n            var maxIterations = 15;\n            var i = 0;\n            var checker = setInterval(function() {\n                i = i + 1;\n                if (i > maxIterations) {\n                    clearInterval(checker);\n                } else {\n                    if ($('button.atto_fullscreen_button').length != 0 && $('div.editor_atto').length != 0) {\n                        $('button.atto_fullscreen_button').click(function() {\n                            $('div.editor_atto').css('background-color', '#eee');\n                            $('div.editor_atto').css('z-index', '1');\n                        });\n                        $('button.atto_html_button').click(function() {\n                            $('#id_introeditor').css('z-index', '1');\n                        });\n                        clearInterval(checker);\n                    }\n                }\n            }, 2000);\n        }\n\n        /**\n         * AMD return object.\n         */\n        return {\n            /**\n             * Snap initialise function.\n             * @param {object} courseConfig\n             * @param {bool} pageHasCourseContent\n             * @param {int} siteMaxBytes\n             * @param {bool} forcePassChange\n             * @param {bool} messageBadgeCountEnabled\n             * @param {int} userId\n             * @param {bool} sitePolicyAcceptReqd\n             * @param {bool} inAlternativeRole\n             * @param {string} brandColors\n             * @param {int} gradingConstants\n             */\n            snapInit: function(courseConfig, pageHasCourseContent, siteMaxBytes, forcePassChange,\n                               messageBadgeCountEnabled, userId, sitePolicyAcceptReqd, inAlternativeRole,\n                               brandColors, gradingConstants) {\n\n                // Set up.\n\n                // Branding colors. New colors can be set up if necessary.\n                brandColorSuccess = brandColors.success;\n                brandColorWarning = brandColors.warning;\n                // Grading constants for percentage.\n                GRADE_DISPLAY_TYPE_PERCENTAGE = gradingConstants.gradepercentage;\n                GRADE_DISPLAY_TYPE_PERCENTAGE_REAL = gradingConstants.gradepercentagereal;\n                GRADE_DISPLAY_TYPE_PERCENTAGE_LETTER = gradingConstants.gradepercentageletter;\n                GRADE_DISPLAY_TYPE_REAL = gradingConstants.gradereal;\n                GRADE_DISPLAY_TYPE_REAL_PERCENTAGE = gradingConstants.graderealpercentage;\n                GRADE_DISPLAY_TYPE_REAL_LETTER = gradingConstants.graderealletter;\n\n                M.cfg.context = courseConfig.contextid;\n                M.snapTheme = {forcePassChange: forcePassChange};\n\n                // General AMD modules.\n                personalMenu.init(sitePolicyAcceptReqd);\n\n                // Course related AMD modules (note, site page can technically have course content too).\n                if (pageHasCourseContent) {\n                    require(\n                        [\n                            'theme_snap/course-lazy'\n                        ], function(CourseLibAmd) {\n                            // Instantiate course lib.\n                            var courseLib = new CourseLibAmd(courseConfig);\n\n                            // Hash change listener goes here because it requires courseLib.\n                            listenHashChange(courseLib);\n                        }\n                    );\n                }\n\n                // When document has loaded.\n                /* eslint-disable complexity */\n                $(document).ready(function() {\n                    movePHPErrorsToHeader(); // Boring\n                    setForumStrings(); // Whatever\n                    addListeners(); // Essential\n                    applyBlockHash(); // Change location hash if necessary\n                    bodyClasses(); // Add body classes\n                    mobileFormChecker();\n                    util.processAnimatedImages();\n\n                    // Make sure that the blocks are always within page-content for assig view page.\n                    $('#page-mod-assign-view #page-content').append($('#moodle-blocks'));\n\n                    // Remove from Dom the completion tracking when it is disabled for an activity.\n                    $('.snap-header-card .snap-header-card-icons .disabled-snap-asset-completion-tracking').remove();\n\n                    // Prepend asset type when activity is a folder to appear in the card header instead of the content.\n                    var folders = $('li.snap-activity.modtype_folder');\n                    $.each(folders, function(index, folder) {\n                        var content = $(folder).find('div.contentwithoutlink div.snap-assettype');\n                        if (content.length > 0) {\n                            if ($(folder).find('div.activityinstance div.snap-header-card .asset-type').length == 0) {\n                                var folderAssetTypeHeader = $(folder).find('div.activityinstance div.snap-header-card');\n                                content.prependTo(folderAssetTypeHeader);\n                            }\n                        }\n                    });\n\n                    // Add a class to the body to show js is loaded.\n                    $('body').addClass('snap-js-loaded');\n                    // Apply progressbar.js for circluar progress display.\n                    progressbarcircle();\n                    // Course footer recent updates dom fixes.\n                    recentUpdatesFix();\n\n                    if (!$('.notloggedin').length) {\n                        if ($('body').hasClass('pagelayout-course') || $('body').hasClass('pagelayout-frontpage')) {\n                            coverImage.courseImage(courseConfig.shortname, siteMaxBytes);\n                        } else if ($('body').hasClass('pagelayout-coursecategory')) {\n                            if (courseConfig.categoryid) {\n                                coverImage.categoryImage(courseConfig.categoryid, siteMaxBytes);\n                            }\n                        }\n                    }\n                    // Allow deeplinking to bs tabs on snap settings page.\n                    if ($('#page-admin-setting-themesettingsnap').length) {\n                        var tabHash = location.hash;\n                        // Check link is to a tab hash.\n                        if (tabHash && $('.nav-link[href=\"' + tabHash + '\"]').length) {\n                            $('.nav-link[href=\"' + tabHash + '\"]').tab('show');\n                            $(window).scrollTop(0);\n                        }\n                    }\n\n                    // Add extra padding when the error validation message appears at the moment of enter a not valid\n                    // URL for feature spots.\n                    var firstlinkerror = $('#page-admin-setting-themesettingsnap #themesnapfeaturespots' +\n                        ' #admin-fs_one_title_link span.error');\n                    var secondlinkerror = $('#page-admin-setting-themesettingsnap #themesnapfeaturespots' +\n                        ' #admin-fs_two_title_link span.error');\n                    var thirdlinkerror = $('#page-admin-setting-themesettingsnap #themesnapfeaturespots' +\n                        ' #admin-fs_three_title_link span.error');\n                    var titlelinksettingone = $('#page-admin-setting-themesettingsnap #themesnapfeaturespots' +\n                        ' #admin-fs_one_title_link .form-label');\n                    var titlelinksettingtwo = $('#page-admin-setting-themesettingsnap #themesnapfeaturespots' +\n                        ' #admin-fs_two_title_link .form-label');\n                    var titlelinksettingthree = $('#page-admin-setting-themesettingsnap #themesnapfeaturespots' +\n                        ' #admin-fs_three_title_link .form-label');\n                    // Create an extra Div to wrap title links settings to avoid line break.\n                    $('#page-admin-setting-themesettingsnap #themesnapfeaturespots ' +\n                        '#admin-fs_three_title').nextUntil('#page-admin-setting-themesettingsnap #themesnapfeaturespots ' +\n                        '#admin-fs_one_title_link_cb').wrapAll(\"<div class=fs-title-links></div>\");\n                    var linktitlestyle = {'padding-bottom': '2.1em'};\n\n                    // We need to modify the padding of these elements depending on the case, because when validating\n                    // the link and throwing an error, this will create an extra height to the parent and can break\n                    // the visualization of the settings page for Feature spots.\n                    if ((firstlinkerror).length) {\n                        titlelinksettingtwo.css(linktitlestyle);\n                        titlelinksettingthree.css(linktitlestyle);\n                    }\n                    if ((secondlinkerror).length) {\n                        titlelinksettingone.css(linktitlestyle);\n                        titlelinksettingthree.css(linktitlestyle);\n                    }\n                    if ((thirdlinkerror).length) {\n                        titlelinksettingone.css(linktitlestyle);\n                        titlelinksettingtwo.css(linktitlestyle);\n                    }\n\n                    if ($('body').hasClass('snap-pm-open')) {\n                        personalMenu.update();\n                    }\n\n                    // SHAME - make section name creation mandatory\n                    if ($('#page-course-editsection.format-topics').length) {\n                        var usedefaultname = document.getElementById('id_name_customize'),\n                            sname = document.getElementById('id_name_value');\n                        usedefaultname.value = '1';\n                        usedefaultname.checked = true;\n                        sname.required = \"required\";\n                        // Make sure that section does have at least one character.\n                        $(sname).attr(\"pattern\", \".*\\\\S+.*\");\n                        $(usedefaultname).parent().css('display', 'none');\n\n                        // Enable the cancel button.\n                        $('#id_cancel').on('click', function() {\n                            $(sname).removeAttr('required');\n                            $(sname).removeAttr('pattern');\n                            return true;\n                        });\n                    // Make sure that in other formats, \"only spaces\" name is not available.\n                    } else {\n                        $('#id_name_value').attr(\"pattern\", \".*\\\\S+.*\");\n                        $('#id_cancel').on('click', function() {\n                            $(sname).removeAttr('pattern');\n                            return true;\n                        });\n                    }\n\n                    // Book mod print button, only show if print link already present.\n                    if ($('#page-mod-book-view a[href*=\"mod/book/tool/print/index.php\"]').length) {\n                        var urlParams = getURLParams(location.href);\n                        if (urlParams) {\n                            $('[data-block=\"_fake\"]').append('<p>' +\n                                '<hr><a target=\"_blank\" href=\"/mod/book/tool/print/index.php?id=' + urlParams.id + '\">' +\n                                M.util.get_string('printbook', 'booktool_print') +\n                                '</a></p>');\n                        }\n                    }\n\n                    var modSettingsIdRe = /^page-mod-.*-mod$/; // E.g. #page-mod-resource-mod or #page-mod-forum-mod\n                    var onModSettings = modSettingsIdRe.test($('body').attr('id')) && location.href.indexOf(\"modedit\") > -1;\n                    if (!onModSettings) {\n                        modSettingsIdRe = /^page-mod-.*-general$/;\n                        onModSettings = modSettingsIdRe.test($('body').attr('id')) && location.href.indexOf(\"modedit\") > -1;\n                    }\n                    var onCourseSettings = $('body').attr('id') === 'page-course-edit';\n                    var onSectionSettings = $('body').attr('id') === 'page-course-editsection';\n                    $('#page-mod-hvp-mod .h5p-editor-iframe').parent().css({\"display\": \"block\"});\n                    var pageBlacklist = ['page-mod-hvp-mod'];\n                    var pageNotInBlacklist = pageBlacklist.indexOf($('body').attr('id')) === -1;\n\n                    if ((onModSettings || onCourseSettings || onSectionSettings) && pageNotInBlacklist) {\n                        // Wrap advanced options in a div\n                        var vital = [\n                            ':first',\n                            '#page-course-edit #id_descriptionhdr',\n                            '#id_contentsection',\n                            '#id_general + #id_general', // Turnitin duplicate ID bug.\n                            '#id_content',\n                            '#page-mod-choice-mod #id_optionhdr',\n                            '#page-mod-workshop-mod #id_gradingsettings',\n                            '#page-mod-choicegroup-mod #id_miscellaneoussettingshdr',\n                            '#page-mod-choicegroup-mod #id_groups',\n                            '#page-mod-scorm-mod #id_packagehdr'\n                        ];\n                        vital = vital.join();\n\n                        $('form[id^=\"mform1\"] > fieldset').not(vital).wrapAll('<div class=\"snap-form-advanced col-md-4\" />');\n\n                        // Add expand all to advanced column.\n                        $(\".snap-form-advanced\").append($(\".collapsible-actions\"));\n                        // Add collapsed to all fieldsets in advanced, except on course edit page.\n                        if (!$('#page-course-edit').length) {\n                            $(\".snap-form-advanced fieldset\").addClass('collapsed');\n                        }\n\n                        // Sanitize required input into a single fieldset\n                        var mainForm = $('form[id^=\"mform1\"] fieldset:first');\n                        var appendTo = $('form[id^=\"mform1\"] fieldset:first .fcontainer');\n\n                        var required = $('form[id^=\"mform1\"] > fieldset').not('form[id^=\"mform1\"] > fieldset:first');\n                        for (var i = 0; i < required.length; i++) {\n                            var content = $(required[i]).find('.fcontainer');\n                            $(appendTo).append(content);\n                            $(required[i]).remove();\n                        }\n                        $(mainForm).wrap('<div class=\"snap-form-required col-md-8\" />');\n\n                        // Show the form buttons when adding multiple LTI activities.\n                        if ($('body#page-mod-lti-mod').length) {\n                            var multipleLTIActivities =\n                                document.querySelector('section#region-main form.mform > div[data-attribute=\"dynamic-import\"]');\n                            var LTIObserver = new MutationObserver(function() {\n                                $('fieldset#id_general > :nth-child(5)').detach()\n                                    .appendTo('section#region-main > div[role=\"main\"] > form.mform');\n                            });\n                            var LTIObserverConfig = {childList: true};\n                            LTIObserver.observe(multipleLTIActivities, LTIObserverConfig);\n                        }\n\n                        var description = $('form[id^=\"mform1\"] fieldset:first .fitem_feditor:not(.required)');\n\n                        if (onModSettings && description) {\n                            var noNeedDescSelectors = [\n                                'body#page-mod-assign-mod',\n                                'body#page-mod-choice-mod',\n                                'body#page-mod-turnitintool-mod',\n                                'body#page-mod-workshop-mod',\n                            ];\n                            var addMultiMessageSelectors = [\n                                'body#page-mod-url-mod',\n                                'body#page-mod-resource-mod',\n                                'body#page-mod-folder-mod',\n                                'body#page-mod-imscp-mod',\n                                'body#page-mod-lightboxgallery-mod',\n                                'body#page-mod-scorm-mod',\n                            ];\n                            if ($(noNeedDescSelectors.join()).length === 0) {\n                                $(appendTo).append(description);\n                                $(appendTo).append($('#fitem_id_showdescription'));\n                            }\n                            // Resource cards - add a message to this type of activities, these activities will not display\n                            // any multimedia.\n                            if ($(addMultiMessageSelectors.join()).length > 0) {\n                                str.get_strings([\n                                    {key: 'multimediacard', component: 'theme_snap'}\n                                ]).done(function(stringsjs) {\n                                    var activityCards = stringsjs[0];\n                                    var cardmultimedia = $(\"[id='id_showdescription']\").closest('.form-group');\n                                    $(cardmultimedia).append(activityCards);\n                                });\n                            }\n                        }\n\n                        // Resources - put description in common mod settings.\n                        description = $(\"#page-mod-resource-mod [data-fieldtype='editor']\").closest('.form-group');\n                        var showdescription = $(\"#page-mod-resource-mod [id='id_showdescription']\").closest('.form-group');\n                        $(\"#page-mod-resource-mod .snap-form-advanced #id_modstandardelshdr .fcontainer\").append(description);\n                        $(\"#page-mod-resource-mod .snap-form-advanced #id_modstandardelshdr .fcontainer\").append(showdescription);\n\n                        // Assignment - put due date in required.\n                        var duedate = $(\"#page-mod-assign-mod [for='id_duedate']\").closest('.form-group');\n                        $(\"#page-mod-assign-mod .snap-form-required .fcontainer\").append(duedate);\n\n                        // Move availablity at the top of advanced settings.\n                        var availablity = $('#id_visible').closest('.form-group').addClass('snap-form-visibility');\n                        var label = $(availablity).find('label');\n                        var select = $(availablity).find('select');\n                        $(label).insertBefore(select);\n\n                        // SHAME - rewrite visibility form lang string to be more user friendly.\n                        $(label).text(M.util.get_string('visibility', 'theme_snap') + ' ');\n\n                        if ($(\"#page-course-edit\").length) {\n                            // We are in course editing form.\n                            // Removing the \"Show all sections in one page\" from the course format form.\n                            var strDisabled = \"\";\n                            (function() {\n                                return str.get_strings([\n                                    {key: 'showallsectionsdisabled', component: 'theme_snap'},\n                                    {key: 'disabled', component: 'theme_snap'}\n                                ]);\n                            })()\n                                .then(function(strings) {\n                                    var strMessage = strings[0];\n                                    strDisabled = strings[1];\n                                    return templates.render('theme_snap/form_alert', {\n                                        type: 'warning',\n                                        classes: '',\n                                        message: strMessage\n                                    });\n                                })\n                                .then(function(html) {\n                                    var op0 = $('[name=\"coursedisplay\"] > option[value=\"0\"]');\n                                    var op1 = $('[name=\"coursedisplay\"] > option[value=\"1\"]');\n                                    var selectNode = $('[name=\"coursedisplay\"]');\n                                    // Disable option 0\n                                    op0.attr('disabled', 'disabled');\n                                    // Add \"(Disabled)\" to option text\n                                    op0.append(' (' + strDisabled + ')');\n                                    // Remove selection attribute\n                                    op0.removeAttr(\"selected\");\n                                    // Select option 1\n                                    op1.attr('selected', 'selected');\n                                    // Add warning\n                                    selectNode.parent().append(html);\n                                });\n                        }\n\n                        $('.snap-form-advanced').prepend(availablity);\n\n                        // Add save buttons.\n                        var savebuttons = $('form[id^=\"mform1\"] > .form-group:last');\n                        $(mainForm).append(savebuttons);\n\n                        // Expand collapsed fieldsets when editing a mod that has errors in it.\n                        var errorElements = $('.form-group.has-danger');\n                        if (onModSettings && errorElements.length) {\n                            errorElements.closest('.collapsible').removeClass('collapsed');\n                        }\n\n                        // Hide appearance menu from interface when editing a page-resource.\n                        if ($(\"#page-mod-page-mod\").length) {\n                            // Chaining promises to get localized strings and render warning message.\n                            (function() {\n                                return str.get_strings([\n                                    {key: 'showappearancedisabled', component: 'theme_snap'}\n                                ]);\n                            })()\n                                .then(function(localizedstring) {\n                                    return templates.render('theme_snap/form_alert', {\n                                        type: 'warning',\n                                        classes: '',\n                                        message: localizedstring\n                                    });\n                                })\n                                // eslint-disable-next-line promise/always-return\n                                .then(function(html) {\n                                    // Disable checkboxes.\n                                    // Colors for disabling the divs.\n                                    var layoverbkcolor = \"#f1f1f1\";\n                                    var layovercolor = \"#d5d5d5\";\n                                    var pageInputs = $('[id=\"id_printheading\"], [id=\"id_printintro\"],' +\n                                        ' [id=\"id_printlastmodified\"], [id=\"id_display\"],' +\n                                        ' [id=\"id_popupwidth\"], [id=\"id_popupheight\"]');\n\n                                    // This will help with disable the multiple options for the select, and let the one by default.\n                                    // Allowing to submit the form.\n                                    $('#id_display option:not(:selected)').attr('disabled', true);\n\n                                    // Note we can't use 'disabled' for settings or they don't get submitted.\n                                    pageInputs.attr('readonly', true);\n                                    $('#id_display').attr('disabled', true);\n                                    pageInputs.attr('tabindex', -1); // Prevent tabbing to change val.\n                                    pageInputs.click(function(e) {\n                                        e.preventDefault();\n                                        return false;\n                                    });\n                                    pageInputs.parent().parent().parent().css('background-color', layoverbkcolor);\n                                    pageInputs.parent().parent().parent().css('color', layovercolor);\n\n                                    // Add warning.\n                                    var selectNode = $('#id_appearancehdrcontainer');\n                                    selectNode.append(html);\n                                });\n                            $('#id_showdescription').parent().parent().parent().hide();\n                        }\n                    }\n                    // Remove disabled attribute for section name for topics format.\n                    if (onSectionSettings) {\n                        var sectionName = $(\"#page-course-editsection.format-topics .form-group #id_name_value\");\n                        if (sectionName.length) {\n                            let sectionNameIsDiabled = document.getElementById('id_name_value').hasAttribute(\"disabled\");\n                            if (sectionNameIsDiabled) {\n                                document.getElementById('id_name_value').removeAttribute(\"disabled\");\n                            }\n                        }\n                    }\n\n                    // Conversation counter for user badge.\n                    if (messageBadgeCountEnabled) {\n                        require(\n                            [\n                                'theme_snap/conversation_badge_count-lazy'\n                            ], function(conversationBadgeCount) {\n                                conversationBadgeCount.init(userId);\n                            }\n                        );\n                    }\n\n                    // Update Messages badge without reloading the site.\n                    $('.message-app .list-group').on('click', '.list-group-item.list-group-item-action', function(e) {\n                        require(\n                            [\n                                'theme_snap/conversation_badge_count-lazy'\n                            ], function(conversationBadgeCount) {\n                                let conversationId = e.currentTarget.attributes['data-conversation-id'].value;\n                                conversationBadgeCount.init(userId, conversationId);\n                            }\n                        );\n                    });\n\n                    // Listen to cover image label key press for accessible usage.\n                    var focustarget = $('#snap-coverimagecontrol label');\n                    if (focustarget && focustarget.length) {\n                        focustarget.keypress(function(e) {\n                            if (e.which === 13) {\n                                $('#snap-coverfiles').trigger('click');\n                            }\n                        });\n                    }\n\n                    // Review if settings block is missing.\n                    if (!$('.block_settings').length) {\n                        // Hide admin icon.\n                        $('#admin-menu-trigger').hide();\n                        if (inAlternativeRole) {\n                            // Handle possible alternative role.\n                            require(\n                                [\n                                    'theme_snap/alternative_role_handler-lazy'\n                                ], function(alternativeRoleHandler) {\n                                    alternativeRoleHandler.init(courseConfig.id);\n                                }\n                            );\n                        }\n                    }\n\n                    // Add tab logic order to navigation bar icons, part of this order is being taken from the layout nav.php file.\n                    var customMenu = $('ul.snap-navbar-content li:first-child a');\n                    var moodlePage = $(\"#moodle-page a:first\");\n                    var notificationsBtn = $('#nav-notification-popover-container > div.popover-region-toggle.nav-link');\n                    var searchButton = $('#mr-nav .simplesearchform a.btn.btn-open');\n                    var adminMenuTrigger = $('#admin-menu-trigger');\n\n                    var lastElement;\n                    if (customMenu.length) {\n                        lastElement = customMenu;\n                    } else {\n                        lastElement = moodlePage;\n                    }\n                    if (notificationsBtn.length && searchButton.length && adminMenuTrigger.length && lastElement.length) {\n                        // Update tab events because all elements have tabindex=\"0\" and they are rendered funny.\n                        require(\n                            [\n                                'theme_snap/rearrange_tab_handler-lazy'\n                            ], function(searchTabHandler) {\n                                searchTabHandler.init([notificationsBtn, searchButton, adminMenuTrigger, lastElement]);\n                            }\n                        );\n                    }\n\n                    // Add settings tab show behaviour to classes which want to do that.\n                    $('.snap-settings-tab-link').on('click', function() {\n                        var tab = $('a[href=\"' + $(this).attr('href') + '\"].nav-link');\n                        if (tab.length) {\n                            tab.tab('show');\n                        }\n                    });\n\n                    // Unpin headroom when url has #course-detail-title.\n                    if (window.location.hash === '#course-detail-title') {\n                        $('#mr-nav').removeClass('headroom--pinned').addClass('headroom--unpinned');\n                    }\n\n                    // Re position submit buttons for forms when using mobile mode at the bottom of the form.\n                    var savebuttonsformrequired = $('div[role=main] .mform div.snap-form-required fieldset > div.form-group.fitem');\n                    var width = $(window).width();\n                    if (width < 767) {\n                        $('.snap-form-advanced').append(savebuttonsformrequired);\n                    }\n\n                    // Fix a position for the new 'Send content change notification' setting.\n                    if ( $('.path-mod.theme-snap #id_coursecontentnotification').length ) {\n                        const notificationCheck = document.getElementById('id_coursecontentnotification')\n                            .closest(\".form-group.fitem\");\n                        const submitButtons = $('.snap-form-required [data-groupname=\"buttonar\"]');\n                        if (notificationCheck !== null && submitButtons.length) {\n                            notificationCheck.classList.add('snap_content_notification_check');\n                            submitButtons.before(notificationCheck);\n                        }\n                    }\n\n                    // Hide Blocks editing on button from the Intelliboard Dashboard page in Snap.\n                    if ( $('#page-home.theme-snap .intelliboard-page').length && $('.snap-page-heading-button').length) {\n                        const blocksEditingOnButton = document.getElementsByClassName('snap-page-heading-button')[0];\n                        blocksEditingOnButton.classList.add(\"hidden\");\n                    }\n\n                    // Hide edit button for main page in Grade report single view.\n                    const editingButton = $('#page-grade-report-singleview-index .grade_report_edit_button');\n                    if (editingButton.length && !$('.search-widget.dropdown').length) {\n                        editingButton.addClass(\"hidden\");\n                    }\n\n                    // Code for Tiles particular loading, needed before other scripts but after the document is ready.\n                    var targetTilesSect = document.querySelector('section#tiles-section');\n                    if (targetTilesSect) {\n                        var configTilesSect = {childList: true, subtree: true};\n                        var observerTilesSect = new MutationObserver(function() {\n                            util.processAnimatedImages();\n                        });\n                        observerTilesSect.observe(targetTilesSect, configTilesSect);\n                    }\n\n                    waitForFullScreenButton();\n                });\n                accessibility.snapAxInit();\n                messages.init();\n\n                // Smooth scroll for go to top button.\n                $(\"div#goto-top-link > a\").click(function() {\n                    window.scrollTo({top: 0, behavior: 'smooth'});\n                    $('body').find('a, [tabindex=0]').first().focus();\n                });\n\n                // Blocks selectors to remove 'editing' class because is not necessary to access their settings.\n                var noneditingblocks = {};\n                noneditingblocks.blockxp = '#page-blocks-xp-index';\n\n                // Remove 'editing' class actions.\n                for (var block in noneditingblocks) {\n                    var blockisediting = $(noneditingblocks[block]).hasClass('editing');\n                    if (blockisediting === true) {\n                        $(noneditingblocks[block]).removeClass('editing');\n                    }\n                }\n\n                // Check Toggle Completion to force redirect to URL.\n                const toggleCompletion = '.togglecompletion';\n                const delay = 1500;\n                $(toggleCompletion).on('submit', function() {\n                    var shouldReload = $(toggleCompletion).hasClass('forcereload');\n                    if (shouldReload === true) {\n                        setTimeout(function() {\n                            location.reload(true);\n                        }, delay);\n                    }\n                });\n\n                // Inherit transparent background color for divs containing non-default mod_url icons.\n                if (!document.body.classList.contains('snap-resource-card')) { // Only for Snap Resource display List.\n                    document.querySelectorAll('.activityiconcontainer.url').forEach(urlDiv => {\n                        if (urlDiv.querySelector('img[src*=\"/theme/image.php/snap/core/\"][src*=\"/f/\"]')) {\n                            urlDiv.style.backgroundColor = 'inherit';\n                        }\n                    });\n                }\n\n            }\n        };\n    }\n);\n"],"names":["define","$","log","Headroom","util","personalMenu","coverImage","ProgressBar","templates","str","accessibility","messages","Scroll","M","theme_snap","disableAll","brandColorSuccess","brandColorWarning","GRADE_DISPLAY_TYPE_PERCENTAGE","GRADE_DISPLAY_TYPE_PERCENTAGE_REAL","GRADE_DISPLAY_TYPE_PERCENTAGE_LETTER","GRADE_DISPLAY_TYPE_REAL","GRADE_DISPLAY_TYPE_REAL_PERCENTAGE","GRADE_DISPLAY_TYPE_REAL_LETTER","getURLParams","href","ta","split","length","urlparams","items","params","i","item","key","val","window","on","mobileFormChecker","updateGraderHeadersTop","savebuttonsformrequired","savebuttonsformadvanced","width","append","graderHeader","css","height","regionMain","querySelector","addClass","onCoursePage","attr","indexOf","processSearchString","searchString","trim","toLowerCase","createColoredDataCircle","nodePointer","dataCallback","valueCallback","circle","Circle","color","easing","strokeWidth","trailWidth","duration","text","value","endColor","setText","valueAnimate","animate","from","to","step","state","path","setAttribute","addListeners","document","join","e","this","getAttribute","history","pushState","trigger","preventDefault","location","hash","myElement","headroom","initial","pinned","unpinned","top","notTop","removeClass","init","dataList","find","clone","ua","navigator","userAgent","html","matches","dataItem","push","tocSearchCourse","keyCode","which","last","blur","off","event","target","closest","snapFeedsTrigger","getElementById","hrefSnapFeeds","hasClass","showFeedsString","get_string","toggleClass","focus","dispatchEvent","Event","adminSettingsTrigger","hrefAdminSettings","hideFeedsString","videos","classList","contains","click","nodeName","src","includes","$news","$newstoggle","$newsclose","scrollToElement","not","slideDown","is","parent","prev","supportsTouch","msPointerEnabled","tooltipNode","isFunction","tooltip","snapInit","courseConfig","pageHasCourseContent","siteMaxBytes","forcePassChange","messageBadgeCountEnabled","userId","sitePolicyAcceptReqd","inAlternativeRole","brandColors","gradingConstants","success","warning","gradepercentage","gradepercentagereal","gradepercentageletter","gradereal","graderealpercentage","graderealletter","cfg","context","contextid","snapTheme","require","CourseLibAmd","courseLib","lastHash","newHash","info","update","showSection","listenHashChange","ready","extraclasses","xdebugs","x","fontel","parentNode","br","remove","msgs","errorcont","after","errorlink","movePHPErrorsToHeader","each","urlParams","time","formselectors","paramchecks","p","formurl","applyBlockHash","processAnimatedImages","folders","index","folder","content","folderAssetTypeHeader","prependTo","nodeValue","gradeFormat","appendTo","courseImage","shortname","categoryid","categoryImage","tabHash","tab","scrollTop","firstlinkerror","secondlinkerror","thirdlinkerror","titlelinksettingone","titlelinksettingtwo","titlelinksettingthree","nextUntil","wrapAll","linktitlestyle","usedefaultname","sname","checked","required","removeAttr","id","modSettingsIdRe","onModSettings","test","onCourseSettings","onSectionSettings","pageNotInBlacklist","vital","mainForm","wrap","multipleLTIActivities","MutationObserver","detach","observe","childList","description","get_strings","component","done","stringsjs","activityCards","cardmultimedia","showdescription","duedate","availablity","label","select","insertBefore","strDisabled","then","strings","strMessage","render","type","classes","message","op0","op1","selectNode","prepend","savebuttons","errorElements","localizedstring","pageInputs","hide","hasAttribute","removeAttribute","conversationBadgeCount","conversationId","currentTarget","attributes","focustarget","keypress","alternativeRoleHandler","lastElement","customMenu","moodlePage","notificationsBtn","searchButton","adminMenuTrigger","searchTabHandler","notificationCheck","submitButtons","add","before","getElementsByClassName","editingButton","targetTilesSect","subtree","checker","setInterval","clearInterval","waitForFullScreenButton","snapAxInit","scrollTo","behavior","first","noneditingblocks","block","setTimeout","reload","body","querySelectorAll","forEach","urlDiv","style","backgroundColor"],"mappings":"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"}

Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists