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/section_asset_management.min.js.map

{"version":3,"file":"section_asset_management.min.js","sources":["../src/section_asset_management.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\ndefine(['jquery', 'core/log', 'core/ajax', 'core/str', 'core/templates', 'core/notification',\n    'theme_snap/util', 'theme_snap/ajax_notification', 'theme_snap/footer_alert',\n    'core_filters/events', 'core/fragment'],\n    function($, log, ajax, str, templates, notification, util, ajaxNotify, footerAlert, Event, fragment) {\n\n        var self = this;\n\n        /**\n         * Items being moved - actual dom elements.\n         * @type {array}\n         */\n        var movingObjects = [];\n\n        /**\n         * Item being moved - actual dom element.\n         * @type {object}\n         */\n        var movingObject;\n\n        /**\n         * @type {boolean}\n         */\n        var ajaxing = false;\n\n        var ajaxTracker;\n\n        /**\n         * Sections that are being retrieved by the API.\n         * @type {Array}\n         */\n        var sectionsProcess = [];\n\n        /**\n         * Module html caching.\n         * @type {object|null}\n         */\n        var moduleCache = null;\n\n        /**\n         * Progress caching.\n         * @type {Array|null}\n         */\n        var progressCache = null;\n\n        /**\n         * Sets observers for the TOC elements.\n         */\n        var setTocObservers = function () {\n            if (self.courseConfig.format == 'weeks' || self.courseConfig.format == 'topics') {\n                $('#course-toc .chapter-title').click(function(e) {\n                    var link = $(e.target);\n                    var section = link.attr('href');\n                    if (typeof section != 'undefined' && section.length > 0) {\n                        getSection(section.split('#section-')[1], 0);\n                    }\n                });\n\n                $('#toc-searchables li a').click(function(e) {\n                    var link = $(e.target);\n                    var urlParams = link.attr('href').split(\"&\"),\n                        section = urlParams[0],\n                        mod = urlParams[1] || null;\n                    section = section.split('#section-')[1];\n                    getSection(section, mod);\n                });\n            }\n        };\n\n        /**\n         * Sets observers for the navigation arrows.\n         */\n        var setNavigationFooterObservers = function () {\n            if (self.courseConfig.format == 'weeks' || self.courseConfig.format == 'topics') {\n                $('.section_footer .next_section, .section_footer .icon-arrow-right, ' +\n                    '.section_footer .previous_section, .section_footer .icon-arrow-left').click(function(e) {\n                    var link = $(e.target);\n                    var section = link.attr('section-number');\n                    if(typeof section !== 'undefined' && section.length > 0) {\n                        getSection(section, 0);\n                    }\n                });\n\n                $('.section_footer .text').click(function (e) {\n                    var node = $(e.target);\n                    var section = node.find('.nav_guide').attr('section-number');\n                    if(typeof section !== 'undefined' && section.length > 0) {\n                        getSection(section, 0);\n                    }\n                });\n            }\n        };\n\n        /**\n         * Scroll to a mod via search.\n         * @param {string} modid\n         */\n        var scrollToModule = function(modid) {\n            // Sometimes we have a hash, sometimes we don't.\n            // Strip hash then add just in case.\n            $('#toc-search-results').html('');\n            var targmod = $(\"#\" + modid.replace('#', ''));\n            // http://stackoverflow.com/questions/6677035/jquery-scroll-to-element\n            util.scrollToElement(targmod);\n\n            var searchpin = $(\"#searchpin\");\n            if (!searchpin.length) {\n                searchpin = $('<i id=\"searchpin\"></i>');\n            }\n\n            $(targmod).find('.instancename').prepend(searchpin);\n            $(targmod).attr('tabindex', '-1').focus();\n            $('#course-toc').removeClass('state-visible');\n        };\n\n        /**\n         * Update moving message.\n         */\n        var updateMovingMessage = function() {\n            var title;\n            if (movingObjects.length === 1) {\n                var assetname = $(movingObjects[0]).find('.snap-asset-link .instancename').html();\n                assetname = assetname || M.util.get_string('pluginname', 'label', assetname);\n                title = M.util.get_string('moving', 'theme_snap', assetname);\n            } else {\n                title = M.util.get_string('movingcount', 'theme_snap', movingObjects.length);\n            }\n            footerAlert.setTitle(title);\n        };\n\n        /**\n         * Updates the drop zone with a descriptive text.\n         * @param {string} sectionName\n         */\n        var updateSectionDropMsg = function (sectionName) {\n            if (typeof movingObjects !== 'undefined' && movingObjects.length > 0) {\n                $('.section-drop').each(function() {\n                    var sectionDropMsg = M.util.get_string('movingdropsectionhelp', 'theme_snap',\n                        {moving: sectionName, before: $(this).data('title')}\n                    );\n                    $(this).html(sectionDropMsg);\n                });\n                footerAlert.setSrNotice(M.util.get_string('movingstartedhelp', 'theme_snap', sectionName));\n\n            }\n        };\n\n        /**\n         * Gets a specific section for the current course and if an activity module is passed sets focus on it.\n         * @param {string} section\n         * @param {string} mod\n         */\n        var getSection = function (section, mod) {\n            var node = $('#section-' + section);\n            if (node.length == 0 && sectionsProcess.indexOf(section) == -1) {\n                sectionsProcess.push(section);\n                var params = {courseid: self.courseConfig.id, section: section};\n                $('.sk-fading-circle').show();\n                // We need to prevent the DOM to show the default section.\n                $('.course-content .' + self.courseConfig.format + ' li[id^=\"section-\"]').hide();\n                fragment.loadFragment('theme_snap', 'section', self.courseConfig.contextid, params).done(function(html, js) {\n                    var node = $(html);\n                    renderSection(section, node, mod, js);\n\n                    var folders = node.find('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            }\n        };\n\n        /**\n         * This functions inserts a section node to the DOM.\n         * @param {string} section\n         * @param {node} html\n         * @param {string} mod\n         * @param {string} js\n         */\n        var renderSection = function(section, html, mod, js) {\n            var anchor = $('.course-content');\n            var existingSections = [];\n            anchor.find('li[id^=section-]').each(function() {\n                existingSections.push(parseInt($(this).attr('id').split('section-')[1]));\n            });\n            var tempnode = $('<div></div>');\n            templates.replaceNodeContents(tempnode, html, '');\n\n            // Remove from Dom the completion tracking when it is disabled for an activity.\n            tempnode.find('.snap-header-card .snap-header-card-icons .disabled-snap-asset-completion-tracking').remove();\n            if (existingSections.length > 0) {\n                var closest = existingSections.reduce(function(prev, curr) {\n                    return (Math.abs(curr - section) < Math.abs(prev - section) ? curr : prev);\n                });\n\n                if (closest > section) {\n                    anchor.find('#section-' + closest).before(tempnode.find('li[id^=\"section-\"]'));\n\n                } else {\n                    anchor.find('#section-' + closest).after(tempnode.find('li[id^=\"section-\"]'));\n\n                }\n            } else {\n                $('.sk-fading-circle').after(tempnode);\n            }\n            templates.runTemplateJS(js);\n\n            // Hide loading animation.\n            $('.sk-fading-circle').hide();\n            // Notify filters about the new section.\n            Event.notifyFilterContentUpdated($('.course-content .' + self.courseConfig.format));\n            var sections = anchor.find('li[id^=\"section-\"]');\n            // When not present the section, the first one will be shown as default, remove all classes to prevent that.\n            sections.removeClass('state-visible');\n            var id = '#section-' + section;\n            $(id).addClass('state-visible');\n            if (self.courseConfig.toctype == 'top' && self.courseConfig.format == 'topics' && section > 0) {\n                var title = $(id).find('.sectionname').html();\n                var elements = $('.chapter-title');\n                var tmpid = 0;\n                // Find the right toc element.\n                $.each(elements, function(key, element) {\n                    if ($(element).attr('href').split('#section-')[1] == section) {\n                        tmpid = key;\n                    }\n                });\n                $(id).find('.sectionname').html(title);\n                $(id).find('.sectionnumber').html(tmpid + '.');\n            }\n            // Leave all course sections as they were.\n            sections.show();\n            $(id).find('.section_footer .next_section, .section_footer .icon-arrow-right, ' +\n                '.section_footer .previous_section, .section_footer .icon-arrow-left').click(function(e) {\n                var link = $(e.target);\n                var section = link.attr('section-number');\n                if(typeof section !== 'undefined' && section.length > 0) {\n                    getSection(section, 0);\n                }\n            });\n\n            $(id).find('.section_footer .text').click(function (e) {\n                var node = $(e.target);\n                var section = node.find('.nav_guide').attr('section-number');\n                if(typeof section !== 'undefined' && section.length > 0) {\n                    getSection(section, 0);\n                }\n            });\n\n            // Set observer for mod chooser.\n            $(id + ' .section-modchooser-link').click(function() {\n                // Grab the section number from the button.\n                var sectionNum = $(this).attr('data-sectionid');\n                $('.snap-modchooser-addlink').each(function() {\n                    // Update section in mod link to current section.\n                    var newLink = this.href.replace(/(section=)[0-9]+/ig, '$1' + sectionNum);\n                    $(this).attr('href', newLink);\n                });\n            });\n\n            // If a module id has been passed as parameter, set focus.\n            if (mod != 0 && typeof mod !== 'undefined') {\n                scrollToModule(mod);\n            }\n            var sectionName = $('#region-main .section-moving').find('.sectionname').text();\n            if (typeof sectionName !== 'undefined' && sectionName.length > 0) {\n                updateSectionDropMsg(sectionName);\n            }\n\n            var movingId = $('#region-main .section-moving').attr('id');\n            if (typeof movingId !== 'undefined' && movingId.length > 0) {\n                $('#section-' + (parseInt(movingId.split('section-')[1]) + 1) +\n                    ' .snap-drop.section-drop').removeClass('partial-render');\n            }\n\n            $('#course-toc #chapters li').removeClass('snap-visible-section');\n            // Set link as current.\n            $('#course-toc .chapter-title[href=\"#section-'+ section +'\"]').parent('li').addClass('snap-visible-section');\n            $(id).find('ul.section').append(\n                '<li class=\"snap-drop asset-drop\">' +\n                '<div class=\"asset-wrapper\">' +\n                '<a href=\"#\">' +\n                M.util.get_string('movehere', 'theme_snap') +\n                '</a>' +\n                '</div>' +\n                '</li>');\n        };\n\n\n\n    return {\n        init: function(courseLib) {\n\n            self.courseConfig = courseLib.courseConfig;\n\n            /**\n             * AJAX tracker class - for tracking chained AJAX requests (prevents behat intermittent faults).\n             * Also, sets and unsets ajax classes on trigger element / child of trigger if specified.\n             */\n            var AjaxTracker = function() {\n\n                var triggersByKey = {};\n\n                /**\n                 * Starts tracking.\n                 * @param {string} jsPendingKey\n                 * @param {domElement} trigger\n                 * @param {string} subSelector\n                 * @returns {boolean}\n                 */\n                this.start = function(jsPendingKey, trigger, subSelector) {\n                    if (this.ajaxing(jsPendingKey)) {\n                        log.debug('Skipping ajax request for ' + jsPendingKey + ', AJAX already in progress');\n                        return false;\n                    }\n                    M.util.js_pending(jsPendingKey);\n                    triggersByKey[jsPendingKey] = {trigger: trigger, subSelector: subSelector};\n                    if (trigger) {\n                        if (subSelector) {\n                            $(trigger).find(subSelector).addClass('ajaxing');\n                        } else {\n                            $(trigger).addClass('ajaxing');\n                        }\n                    }\n                    return true;\n                };\n\n                /**\n                 * Is there an AJAX request in progress.\n                 * @param {string} jsPendingKey\n                 * @returns {boolean}\n                 */\n                this.ajaxing = function(jsPendingKey) {\n                    return M.util.pending_js.indexOf(jsPendingKey) > -1;\n                };\n\n                /**\n                 * Completes tracking.\n                 * @param {string} jsPendingKey\n                 */\n                this.complete = function(jsPendingKey) {\n                    var trigger, subSelector;\n                    if (triggersByKey[jsPendingKey]) {\n                        trigger = triggersByKey[jsPendingKey].trigger;\n                        subSelector = triggersByKey[jsPendingKey].subSelector;\n                    }\n                    if (trigger) {\n                        if (subSelector) {\n                            $(trigger).find(subSelector).removeClass('ajaxing');\n                        } else {\n                            $(trigger).removeClass('ajaxing');\n                        }\n                    }\n                    delete triggersByKey[jsPendingKey];\n                    M.util.js_complete(jsPendingKey);\n                };\n            };\n\n            ajaxTracker = new AjaxTracker();\n\n            /**\n             * Get the section number from a section element.\n             * @param {jQuery|object} el\n             * @returns {number}\n             */\n            var sectionNumber = function(el) {\n                if (self.courseConfig.partialrender) {\n                    return (parseInt($(el).attr('id').split('section-')[1]));\n                } else {\n                    return (parseInt($(el).attr('id').replace('section-', '')));\n                }\n            };\n\n            /**\n             * Get the section number for an element within a section.\n             * @param {object} el\n             * @returns {number}\n             */\n            var parentSectionNumber = function(el) {\n                return sectionNumber($(el).parents('li.section.main')[0]);\n            };\n\n            /**\n             * Moving has stopped, clean up.\n             */\n            var stopMoving = function() {\n                $('body').removeClass('snap-move-inprogress');\n                $('body').removeClass('snap-move-section');\n                $('body').removeClass('snap-move-asset');\n                footerAlert.hideAndReset();\n                $('.section-moving').removeClass('section-moving');\n                $('.asset-moving').removeClass('asset-moving');\n                $('.snap-asset a').removeAttr('tabindex');\n                $('.snap-asset button').removeAttr('disabled');\n                $('.js-snap-asset-move').removeAttr('checked');\n                movingObjects = [];\n                if (self.courseConfig.partialrender) {\n                    $('.snap-drop.section-drop').addClass('partial-render');\n                }\n            };\n\n            /**\n             * Move fail - sad face :(.\n             */\n            var moveFailed = function() {\n                var actname = $(movingObject).find('.instancename').html();\n\n                footerAlert.removeAjaxLoading();\n                footerAlert.setTitle(M.util.get_string('movefailed', 'theme_snap', actname));\n                // Stop moving in 2 seconds so that the user has time to see the failed moving notice.\n                window.setTimeout(function() {\n                    // Don't pass in target, we want to abort the move!\n                    stopMoving(false);\n                }, 2000);\n            };\n\n            /**\n             * Remove moving object from moving objects array.\n             * @param {object} obj\n             */\n            var removeMovingObject = function(obj) {\n                var index = movingObjects.indexOf(obj);\n                if (index > -1) {\n                    movingObjects.splice(index, 1);\n                }\n                updateMovingMessage();\n            };\n\n            /**\n             * General move request\n             *\n             * @param {object}   params\n             * @param {function} onSuccess\n             * @param {bool}     finalItem\n             */\n            var ajaxReqMoveGeneral = function(params, onSuccess, finalItem) {\n                if (ajaxing) {\n                    // Request already made.\n                    log.debug('Skipping ajax request, one already in progress');\n                    return;\n                }\n\n                // Add spinner.\n                footerAlert.addAjaxLoading();\n\n                // Set common params.\n                params.sesskey = M.cfg.sesskey;\n                params.courseId = courseLib.courseConfig.id;\n                params.field = 'move';\n\n                log.debug('Making course/rest.php request', params);\n                var req = $.ajax({\n                    type: \"POST\",\n                    async: true,\n                    data: params,\n                    url: M.cfg.wwwroot + courseLib.courseConfig.ajaxurl\n                });\n                req.done(function(data) {\n                    ajaxNotify.ifErrorShowBestMsg(data).done(function(errorShown) {\n                        if (errorShown) {\n                            log.debug('Ajax request fail');\n                            moveFailed();\n                            return;\n                        } else {\n                            // No errors, call success callback and stop moving if necessary.\n                            log.debug('Ajax request successful');\n                            if (onSuccess) {\n                                onSuccess();\n                            }\n                            if (finalItem) {\n                                if (params.class === 'resource') {\n                                    // Only stop moving for resources, sections handle this later once the TOC is reloaded.\n                                    stopMoving();\n                                    $(movingObject).find('label.snap-asset-move > input.js-snap-asset-move').focus();\n                                }\n                            }\n                        }\n                    });\n                });\n                req.fail(function() {\n                    moveFailed();\n                });\n\n                if (finalItem) {\n                    req.always(function() {\n                        ajaxing = false;\n                        footerAlert.removeAjaxLoading();\n                    });\n                }\n            };\n\n            /**\n             * Get section title.\n             * @param {integer} section\n             * @returns {*|jQuery}\n             */\n            var getSectionTitle = function(section) {\n                // Get title from TOC.\n                if (self.courseConfig.partialrender) {\n                    return  $('#course-toc #chapters > h3 li a[href=\"#section-' + section + '\"]').text();\n                } else {\n                    return $('#chapters h3:nth-of-type(' + (section + 1) + ') .chapter-title').html();\n                }\n            };\n\n            /**\n             * Update next / previous links.\n             * @param {string} selector\n             * @return {promise}\n             */\n            var updateSectionNavigation = function(selector) {\n                var dfd = $.Deferred();\n                var sections, totalSectionCount;\n                if (!selector) {\n                    if (self.courseConfig.partialrender) {\n                        selector = '#course-toc #chapters > h3 li a';\n                    } else {\n                        selector = '#region-main .course-content > ul li.section';\n                    }\n                    sections = $(selector);\n                    totalSectionCount = sections.length;\n                } else {\n                    sections = $(selector);\n                    if (self.courseConfig.partialrender) {\n                        var allSections = $('#course-toc #chapters > h3 li a');\n                    } else {\n                        var allSections = $('#region-main .course-content > ul li.section');\n                    }\n                    totalSectionCount = allSections.length;\n                }\n\n                var completed = 0;\n                $.each(sections, function(idx, el) {\n                    if (self.courseConfig.partialrender) {\n                        var href = $(el).attr('href');\n                        var sectionNum;\n                        if (typeof href !== typeof undefined && href !== false) {\n                            sectionNum = parseInt($(el).attr('href').split('#section-')[1]);\n                        } else {\n                            sectionNum = parseInt($(el).attr('id').split('section-')[1]);\n                        }\n                    } else {\n                        var sectionNum = sectionNumber(el);\n                    }\n                    var previousSection = sectionNum - 1;\n                    var nextSection = sectionNum + 1;\n                    var previous = false;\n                    var next = false;\n                    var hidden, extraclasses;\n                    if (previousSection > -1) {\n                        if (self.courseConfig.partialrender) {\n                            hidden = $('#section-' + previousSection).hasClass('draft');\n                        } else {\n                            hidden = $('#section-' + previousSection).hasClass('hidden');\n                        }\n                        extraclasses = hidden ? ' dimmed_text' : '';\n                        previous = {\n                            section: previousSection,\n                            title: getSectionTitle(previousSection),\n                            classes: extraclasses\n                        };\n                    }\n                    if (nextSection < totalSectionCount) {\n                        if (self.courseConfig.partialrender) {\n                            hidden = $('#section-' + nextSection).hasClass('draft');\n                        } else {\n                            hidden = $('#section-' + nextSection).hasClass('hidden');\n                        }\n                        extraclasses = hidden ? ' dimmed_text' : '';\n                        next = {\n                            section: nextSection,\n                            title: getSectionTitle(nextSection),\n                            classes: extraclasses\n                        };\n                    }\n                    var navigation = {\n                        previous: previous,\n                        next: next\n                    };\n                    templates.render('theme_snap/course_section_navigation', navigation)\n                        .done(function(result) {\n                            var target = $('#section-' + sectionNum + ' .section_footer');\n                            if (target.length > 0) {\n                                target.replaceWith(result);\n                            }\n                            completed++;\n                            if (completed === sections.length) {\n                                dfd.resolve();\n                            }\n                        });\n\n                });\n                return dfd.promise();\n            };\n\n            /**\n             * Calculates how the sections are ordered after moving.\n             * @param {array} sections\n             * @param {int} oldIndex\n             * @param {int} newIndex\n             * @returns {array}\n             */\n            var calculateSections = function (sections, oldIndex, newIndex) {\n                if (newIndex >= sections.length) {\n                    var k = newIndex - sections.length + 1;\n                    while (k--) {\n                        sections.push(undefined);\n                    }\n                }\n                sections.splice(newIndex, 0, sections.splice(oldIndex, 1)[0]);\n                return sections;\n            };\n\n            /**\n             * Update sections.\n             * @param {int} current\n             * @param {int} target\n             * @param {array} predeleteSections\n             * @param {string} deletedSection\n             */\n            var updateSections = function(current, target, predeleteSections, deletedSection) {\n                if (courseLib.courseConfig.partialrender) {\n                    var loadedSections = [];\n                    var sections = [];\n                    if (current != 0 && target != 0) {\n                        $.each($('#course-toc #chapters > li a'), function (idx, obj) {\n                            sections.push($(obj).attr('href').split('#section-')[1]);\n                        });\n                        var newOrder = calculateSections(sections, current, target);\n                    } else {\n                        sections = predeleteSections;\n                        predeleteSections.splice(deletedSection, 1);\n                        var newOrder = predeleteSections;\n                    }\n                    $.each($('#region-main .course-content > ul li.section'), function(idx, obj) {\n                        var value = $(obj).attr('id').split('section-')[1];\n                        var key = newOrder.indexOf(value);\n                        var chapterTitle = getSectionTitle(key);\n                        var fullTitle = chapterTitle;\n                        $(obj).attr('id', 'section-' + key);\n                        if (self.courseConfig.toctype == 'top' && self.courseConfig.format == 'topics' && key > 0) {\n                            fullTitle = `<span class='sectionnumber'> ${key}.</span>${chapterTitle}`;\n                        }\n                        $('#section-' + key + ' .content .sectionname').html(fullTitle);\n                        loadedSections.push(key);\n                        // Update the attribute.\n                        $(obj).find('.section-modchooser-link').attr('data-sectionid', key);\n                    });\n                    sectionsProcess = loadedSections;\n                } else {\n                    // Renumber section ids, rename section titles.\n                    $.each($('#region-main .course-content > ul li.section'), function(idx, obj) {\n                        $(obj).attr('id', 'section-' + idx);\n                        // Get title from TOC (note that its idx + 1 because first entry is\n                        // introduction.\n                        var chapterTitle = getSectionTitle(idx);\n                        // Update section title with corresponding TOC title - this is necessary\n                        // for weekly topic courses where the section title needs to stay the\n                        // same as the TOC.\n                        var fullTitle = chapterTitle;\n                        if (self.courseConfig.toctype == 'top' && self.courseConfig.format == 'topics' && idx > 0) {\n                            fullTitle = `<span class='sectionnumber'></span>${chapterTitle}`;\n                        }\n                        $('#section-' + idx + ' .content .sectionname').html(fullTitle);\n                        // Update section data attribute to reflect new section idx.\n                        $(this).find('.section-modchooser-link').attr('data-sectionid', idx);\n                    });\n                }\n\n                updateSectionNavigation().done(function() {\n                    if (courseLib.courseConfig.partialrender) {\n                        setCourseSectionObervers();\n                    }\n                });\n            };\n\n            /**\n             * Delete section dialog and confirm function.\n             * @param {object} e\n             * @param {object} el\n             */\n            var sectionDelete = function(e, el) {\n                e.preventDefault();\n                var sectionNum = parentSectionNumber(el);\n                var section = $('#section-' + sectionNum);\n                var sectionName = section.find('.sectionname').text();\n\n                /**\n                 * Delete section.\n                 */\n                var doDelete = function() {\n\n                    if (!ajaxTracker.start('section_delete', el)) {\n                        // Already in progress.\n                        return;\n                    }\n\n                    var delProgress = M.util.get_string('deletingsection', 'theme_snap', sectionName);\n\n                    footerAlert.addAjaxLoading('');\n                    footerAlert.show();\n                    footerAlert.setTitle(delProgress);\n\n                    var params = {\n                        courseshortname: courseLib.courseConfig.shortname,\n                        action: 'delete',\n                        sectionnumber: sectionNum,\n                        value: 1,\n                        loadmodules: true,\n                    };\n\n                    log.debug('Making course/rest.php section delete request', params);\n\n                    // Make ajax call.\n                    var ajaxPromises = ajax.call([\n                        {\n                            methodname: 'theme_snap_course_sections',\n                            args: params\n                        }\n                    ], true, true);\n                    var sections = [];\n                    $.each($('#course-toc #chapters > li a'), function (idx, obj) {\n                        sections.push($(obj).attr('href').split('#section-')[1]);\n                    });\n                    // Handle ajax promises.\n                    ajaxPromises[0]\n                        .done(function(response) {\n                            // Update TOC.\n                            templates.render('theme_snap/course_toc', response.toc)\n                                .done(function(result) {\n                                    $('#course-toc').html($(result).html());\n                                    $(document).trigger('snapTOCReplaced');\n                                    // Remove section from DOM.\n                                    section.remove();\n                                    updateSections(0, 0, sections, sectionNum);\n                                    // Current section no longer exists so change location to previous section.\n                                    if (self.courseConfig.partialrender) {\n                                        var chapters = $('.chapter-title');\n                                        var ids = [];\n                                        $.each(chapters, function (key, element) {\n                                            ids.push($(element).attr('href').split('#section-')[1]);\n                                        });\n                                        var closest = ids.reduce(function(prev, curr) {\n                                            return (Math.abs(curr - sectionNum) < Math.abs(prev - sectionNum) ? curr : prev);\n                                        });\n                                        location.hash = 'section-' + closest;\n                                        if ($('li#section-' + closest).length == 1) {\n                                            courseLib.showSection();\n                                        } else {\n                                            getSection(closest, 0);\n                                        }\n                                    } else {\n                                        if (sectionNum >= $('.course-content > ul li.section').length) {\n                                            location.hash = 'section-' + (sectionNum - 1);\n                                        }\n                                        courseLib.showSection();\n                                    }\n                                    // We can't complete the action in the 'always' section because we want it to\n                                    // definitely be called after the section is removed from the DOM.\n                                    ajaxTracker.complete('section_delete');\n                                })\n                                .always(function() {\n                                    // Allow another request now this has finished.\n                                    footerAlert.hideAndReset();\n                                })\n                                .fail(function() {\n                                    ajaxTracker.complete('section_delete');\n                                });\n                        })\n                        .fail(function(response) {\n                            ajaxNotify.ifErrorShowBestMsg(response);\n                            footerAlert.hideAndReset();\n                            // Allow another request now this has finished.\n                            ajaxTracker.complete('section_delete');\n                        });\n                };\n\n                var delTitle = M.util.get_string('confirm', 'moodle');\n                var delConf = M.util.get_string('confirmdeletesection', 'moodle', sectionName);\n                var ok = M.util.get_string('deletesectionconfirm', 'theme_snap');\n                var cancel = M.util.get_string('cancel', 'moodle');\n                notification.confirm(delTitle, delConf, ok, cancel, doDelete);\n            };\n\n            /**\n             * Generic action handler for all asset actions.\n             * @param {event} e\n             * @param {domNode} triggerEl\n             */\n            var assetAction = function(e, triggerEl) {\n                e.preventDefault();\n\n                var assetEl = $($(triggerEl).parents('.snap-asset')[0]),\n                    cmid = Number(assetEl[0].id.replace('module-', '')),\n                    instanceName = assetEl.find('.instancename').text().trim(),\n                    action = $(triggerEl).data('action'),\n                    errActionKey = '',\n                    errMessageKey = '',\n                    errAction = '',\n                    errMessage = '',\n                    jsPendingKey = 'asset_' + action;\n\n                if (ajaxTracker.ajaxing(jsPendingKey)) {\n                    // Already in progress.\n                    // We check this because we don't want to show the confirmation dialog when in progress.\n                    return;\n                }\n\n                var actionAJAX = function() {\n                    if (!ajaxTracker.start(jsPendingKey, assetEl, '.snap-edit-asset-more')) {\n                        // Request already made.\n                        return;\n                    }\n\n                    var params = {\n                        'action': action,\n                        'sectionreturn': 0,\n                        'id': cmid\n                    };\n\n                    ajax.call([\n                        {\n                            methodname: 'core_course_edit_module',\n                            args: params\n                        }\n                    ], true, true)[0]\n                        .done(function(response) {\n                            ajaxNotify.ifErrorShowBestMsg(response, errAction, errMessage).done(function(errorShown) {\n                                ajaxTracker.complete(jsPendingKey);\n                                if (errorShown) {\n                                    log.debug('Ajax request fail');\n                                    return;\n                                } else {\n                                    log.debug('Ajax request successful');\n\n                                    // Reset module cache.\n                                    moduleCache = null;\n                                    progressCache = null;\n                                    if (action === 'delete') {\n                                        // Remove asset from DOM.\n                                        assetEl.remove();\n                                        // Remove asset searchable.\n                                        $('#toc-searchables li[data-id=\"' + cmid + '\"]').remove();\n                                    } else if (action === 'show') {\n                                        assetEl.removeClass('draft');\n                                        assetEl.removeClass('stealth');\n                                    } else if (action === 'hide') {\n                                        assetEl.removeClass('stealth');\n                                        assetEl.addClass('draft');\n                                    } else if (action === 'duplicate') {\n                                        assetEl.replaceWith(response);\n                                    } else if (action === 'stealth') {\n                                        assetEl.addClass('stealth');\n                                        assetEl.removeClass('draft');\n                                    }\n                                }\n                            });\n                        })\n                        .fail(function(response) {\n                            ajaxNotify.ifErrorShowBestMsg(response, errAction, errMessage).done(function() {\n                                ajaxTracker.complete(jsPendingKey);\n                            });\n                        })\n                        .always(function() {\n                            footerAlert.hideAndReset();\n                        });\n                };\n\n                /**\n                 * Get error strings incase of AJAX failure.\n                 * @returns {*|Promise}\n                 */\n                var getErrorStrings = function() {\n                    if (action === 'duplicate') {\n                        errActionKey = 'action:duplicateasset';\n                        errMessageKey = 'error:failedtoduplicateasset';\n                    } else if (action === 'show' || action === 'hide') {\n                        errActionKey = 'action:changeassetvisibility';\n                        errMessageKey = 'error:failedtochangeassetvisibility';\n                    } else if (action === 'delete') {\n                        errActionKey = 'action:deleteasset';\n                        errMessageKey = 'error:failedtodeleteasset';\n                    }\n                    return str.get_strings([\n                        {key: errActionKey, component: 'theme_snap'},\n                        {key: errMessageKey, component: 'theme_snap'}\n                    ]);\n                };\n\n                getErrorStrings().then(function(strings) {\n                    errAction = strings[0];\n                    errMessage = strings[0];\n                    if (action === 'delete') {\n                        // Create confirmation strings.\n                        var delConf = '',\n                            plugindata = {\n                                type: M.util.get_string('pluginname', assetEl.attr('class').match(/modtype_([^\\s]*)/)[1])\n                            };\n                        if (instanceName !== '') {\n                            plugindata.name = instanceName;\n                            delConf = M.util.get_string('deletechecktypename', 'moodle', plugindata);\n                        } else {\n                            delConf = M.util.get_string('deletechecktype', 'moodle', plugindata);\n                        }\n\n                        var delTitle = M.util.get_string('confirm', 'moodle');\n                        var ok = M.util.get_string('deleteassetconfirm', 'theme_snap', plugindata.type);\n                        var cancel = M.util.get_string('cancel', 'moodle');\n                        notification.confirm(delTitle, delConf, ok, cancel, actionAJAX);\n                    } else {\n                        actionAJAX();\n                    }\n                });\n            };\n\n            /**\n             * Ajax request to move asset to target.\n             * @param {object} target\n             */\n            var ajaxReqMoveAsset = function(target) {\n                var params = {};\n\n                log.debug('Move objects', movingObjects);\n\n                // Prepare request parameters\n                params.class = 'resource';\n\n                updateMovingMessage();\n\n                movingObject = movingObjects.shift();\n\n                params.id = Number(movingObject.id.replace('module-', ''));\n\n                if (target && !$(target).hasClass('snap-drop')) {\n                    params.beforeId = Number($(target)[0].id.replace('module-', ''));\n                } else {\n                    params.beforeId = 0;\n                }\n\n                if (document.body.id === \"page-site-index\") {\n                    params.sectionId = 1;\n                } else {\n                    if (target) {\n                        params.sectionId = parentSectionNumber(target);\n                    } else {\n                        params.sectionId = parentSectionNumber(movingObject);\n                    }\n                }\n\n                if (movingObjects.length > 0) {\n                    ajaxReqMoveGeneral(params, function() {\n                        $(target).before($(movingObject));\n                        // recurse\n                        ajaxReqMoveAsset(target);\n                    }, false);\n                } else {\n                    ajaxReqMoveGeneral(params, function() {\n                        $(target).before($(movingObject));\n                    }, true);\n                }\n\n            };\n\n            /**\n             * Ajax request to move section to target.\n             * @param {str|object} dropzone\n             */\n            var ajaxReqMoveSection = function(dropzone) {\n                var domTargetSection = parentSectionNumber(dropzone);\n                var currentSection = sectionNumber(movingObjects[0]);\n                var targetSection = currentSection < domTargetSection ?\n                        domTargetSection - 1 :\n                        domTargetSection;\n\n                var params = {\n                    \"class\": 'section',\n                    id: currentSection,\n                    value: targetSection\n                };\n\n                ajaxReqMoveGeneral(params, function() {\n\n                    // Update TOC chapters.\n                    ajax.call([\n                        {\n                            methodname: 'theme_snap_course_toc_chapters',\n                            args: {\n                                courseshortname: courseLib.courseConfig.shortname\n                            },\n                            done: function(response) {\n                                // Update TOC.\n                                templates.render('theme_snap/course_toc_chapters', response.chapters)\n                                    .done(function(result) {\n                                        // Update chapters.\n                                        $('#chapters').replaceWith(result);\n\n                                        // Move current section before target section.\n                                        $('#section-' + domTargetSection).before($('#section-' + currentSection));\n\n                                        // Update section ids, next previous links, etc.\n                                        updateSections(currentSection, targetSection, [], null);\n\n                                        // Navigate to section in its new location.\n                                        location.hash = 'section-' + targetSection;\n                                        courseLib.showSection();\n\n                                        // Finally, we have finished moving the section!\n                                        stopMoving();\n                                    });\n                            },\n                            fail: function(response) {\n                                ajaxNotify.ifErrorShowBestMsg(response);\n                                stopMoving();\n                            }\n                        }\n                    ], true, true);\n\n                }, true);\n            };\n\n            /**\n             * Listen for edit action clicks, hide, show, duplicate, etc..\n             */\n            var assetEditListeners = function() {\n                var actionSelectors = '.snap-asset-actions .js_snap_hide, ';\n                actionSelectors += '.snap-asset-actions .js_snap_show, ';\n                actionSelectors += '.snap-asset-actions .js_snap_delete, ';\n                actionSelectors += '.snap-asset-actions .js_snap_duplicate,';\n                actionSelectors += '.snap-asset-actions .js_snap_stealth';\n\n                $(document).on('click', actionSelectors, function(e) {\n                    assetAction(e, this);\n                });\n            };\n\n            /**\n             * Generic section action handler.\n             *\n             * @param {string} action visibility, highlight\n             * @param {null|function} onComplete for when completed.\n             */\n            var sectionActionListener = function(action, onComplete) {\n\n                $('#region-main').on('click', '.snap-section-editing.actions .snap-' + action, function(e) {\n\n                    e.stopPropagation();\n                    e.preventDefault();\n\n                    var trigger = this;\n\n                    /**\n                     * Invalid section action exception.\n                     *\n                     * @param {string} action\n                     */\n                    var InvalidActionException = function(action) {\n                        this.message = 'Invalid section action: ' + action;\n                        this.name = 'invalidActionException';\n                    };\n\n                    // Check action is valid.\n                    var validactions = ['visibility', 'highlight'];\n                    if (validactions.indexOf(action) === -1) {\n                        throw new InvalidActionException(action);\n                    }\n\n                    if (!ajaxTracker.start('section_' + action, trigger)) {\n                        // Request already in progress.\n                        return;\n                    }\n\n                    // For toggling visibility.\n                    var toggle, loadModules = true;\n                    if (action === 'visibility') {\n                        toggle = $(this).hasClass('snap-hide') ? 0 : 1;\n                        if (moduleCache && moduleCache.length > 0 && progressCache && progressCache.length > 0) {\n                            loadModules = false;\n                        }\n                    } else {\n                        // For toggling highlight/mark as current.\n                        toggle = $(this).attr('aria-pressed') === 'true' ? 0 : 1;\n                    }\n                    var sectionNumber = parentSectionNumber(this);\n                    var sectionActionsSelector = '#section-' + sectionNumber + ' .snap-section-editing';\n                    var actionSelector = sectionActionsSelector + ' .snap-' + action;\n\n                    // Make ajax call.\n                    var ajaxPromises = ajax.call([\n                        {\n                            methodname: 'theme_snap_course_sections',\n                            args : {\n                                courseshortname: courseLib.courseConfig.shortname,\n                                action: action,\n                                sectionnumber: sectionNumber,\n                                value: toggle,\n                                loadmodules: loadModules,\n                            }\n                        }\n                    ], true, true);\n\n                    // Handle ajax promises.\n                    ajaxPromises[0]\n                    .fail(function(response) {\n                        var errMessage, errAction;\n                        if (action === 'visibility') {\n                            errMessage = M.util.get_string('error:failedtochangesectionvisibility', 'theme_snap');\n                            errAction = M.util.get_string('action:changesectionvisibility', 'theme_snap');\n                        } else {\n                            errMessage = M.util.get_string('error:failedtohighlightsection', 'theme_snap');\n                            errAction = M.util.get_string('action:highlightsectionvisibility', 'theme_snap');\n                        }\n                        ajaxNotify.ifErrorShowBestMsg(response, errAction, errMessage).done(function() {\n                            // Allow another request now this has finished.\n                            ajaxTracker.complete('section_' + action);\n                        });\n                    }).always(function() {\n                        $(trigger).removeClass('ajaxing');\n                    }).done(function(response) {\n                        // Update section action and then reload TOC.\n                        return templates.render('theme_snap/course_action_section', response.actionmodel)\n                        .then(function(result) {\n                            $(actionSelector).replaceWith(result);\n                            $(actionSelector).focus();\n                            // Update TOC.\n                            if (!loadModules) {\n                                if (moduleCache && moduleCache.length > 0 && response.toc.modules.length === 0) {\n                                    // Modules not loaded on request. Replacing them on the toc.\n                                    response.toc.modules = moduleCache;\n                                }\n\n                                if (progressCache && progressCache.length > 0) {\n                                    var progressCacheCopy = progressCache.slice(0);\n                                    $.each(response.toc.chapters.chapters, function(index) {\n                                        response.toc.chapters.chapters[index].progress = progressCacheCopy.shift();\n                                    });\n                                }\n                            }\n\n                            if (loadModules) {\n                                // Caching modules for future use.\n                                moduleCache = response.toc.modules;\n\n                                // Caching progress for future use.\n                                progressCache = [];\n                                $.each(response.toc.chapters.chapters, function(index, value) {\n                                    progressCache.push(value.progress);\n                                });\n                            }\n\n                            return templates.render('theme_snap/course_toc', response.toc);\n                        }).then(function(result) {\n                            $('#course-toc').html($(result).html());\n                            $(document).trigger('snapTOCReplaced');\n                            if (onComplete && typeof (onComplete) === 'function') {\n                                var completion = onComplete(sectionNumber, toggle);\n                                if (self.courseConfig.partialrender) {\n                                    if (typeof onComplete === 'function') {\n                                        ajaxTracker.complete('section_' + action);\n                                    }\n                                } else {\n                                    if (completion && typeof (completion.always) === 'function') {\n                                        // Callback returns a promise, js no longer running.\n                                        completion.always(\n                                            function() {\n                                                // Allow another request now this has finished.\n                                                ajaxTracker.complete('section_' + action);\n                                            }\n                                        );\n                                    } else {\n                                        // Callback does not return a promise, js no longer running.\n                                        // Allow another request now this has finished.\n                                        ajaxTracker.complete('section_' + action);\n                                    }\n                                }\n                            } else {\n                                // Allow another request now this has finished.\n                                ajaxTracker.complete('section_' + action);\n                            }\n                        });\n                    });\n                });\n            };\n\n            /**\n             * Highlight section on click.\n             */\n            var highlightSectionListener = function() {\n                sectionActionListener('highlight', function(sectionNumber) {\n                    $('#section-' + sectionNumber).toggleClass('current');\n\n                    // Reset sections which are not highlighted.\n                    var $notCurrent = $('li.section.main')\n                    .not('#section-' + sectionNumber)\n                    .not('#section-0').removeClass(\"current\");\n\n                    $notCurrent.each(function() {\n                        var highlighter = $(this).find('.snap-highlight');\n                        var sectionNumber = parentSectionNumber(highlighter);\n                        var newLink = $(highlighter).attr('href').replace(/(marker=)[0-9]+/ig, '$1' + sectionNumber);\n                        $(highlighter).attr('href', newLink).attr('aria-pressed', 'false');\n                    });\n                });\n            };\n\n            /**\n             * Delete section on click.\n             */\n            var deleteSectionListener = function() {\n                $(document).on('click', '.snap-section-editing.actions .snap-delete', function(e) {\n                    sectionDelete(e, this);\n                });\n            };\n\n            /**\n             * Toggle section visibility on click.\n             */\n            var toggleSectionListener = function() {\n                /**\n                 * Toggle hidden class and update section navigation.\n                 * @param {number} sectionNumber\n                 * @param {boolean} toggle\n                 * @returns {Promise}\n                 */\n                var manageHiddenClass = function(sectionNumber, toggle) {\n                    if (toggle === 0) {\n                        $('#section-' + sectionNumber).addClass('hidden');\n                    } else {\n                        $('#section-' + sectionNumber).removeClass('hidden');\n                        $('#section-' + sectionNumber + ' .stealth-section-hidden').removeClass('stealth');\n                        $('#section-' + sectionNumber + ' .stealth-section-hidden').removeClass('stealth-section-hidden');\n                    }\n\n                    // Update the section navigation either side of the current section.\n                    var selectors = [\n                        '#section-' + (sectionNumber - 1),\n                        '#section-' + (sectionNumber + 1)\n                    ];\n                    var selector = selectors.join(',');\n                    return updateSectionNavigation(selector);\n                };\n                sectionActionListener('visibility', manageHiddenClass);\n            };\n\n            /**\n             * Show footer alert for moving.\n             *\n             * @param {domNode} focusEl The element to be focused after this callback.\n             */\n            var footerAlertShowMove = function(focusEl = null) {\n                footerAlert.show(function(e) {\n                    e.preventDefault();\n                    stopMoving();\n                    if (focusEl !== null) {\n                        focusEl.focus();\n                    }\n                });\n            };\n\n            /**\n             * When section move link is clicked, get the data we need and start the move.\n             */\n            var moveSectionListener = function() {\n                // Listen clicks on move links.\n                $(\"#region-main\").on('click', '.snap-section-editing.actions .snap-move', function(e) {\n                    e.stopPropagation();\n                    e.preventDefault();\n\n                    $('body').addClass('snap-move-inprogress');\n                    footerAlertShowMove();\n\n                    // Moving a section.\n                    var sectionNumber = parentSectionNumber(this);\n                    log.debug('Section is', sectionNumber);\n                    var section = $('#section-' + sectionNumber);\n                    var sectionName = section.find('.sectionname').text();\n\n                    log.debug('Moving this section', sectionName);\n                    movingObjects = [section];\n                    // This should never happen, but just in case...\n                    $('.section-moving').removeClass('section-moving');\n                    section.addClass('section-moving');\n                    $('a[href=\"#section-' + sectionNumber + '\"]').parent('li').addClass('section-moving');\n                    $('body').addClass('snap-move-section');\n                    if (self.courseConfig.partialrender) {\n                        $('#section-' + (sectionNumber + 1) + ' .snap-drop.section-drop').removeClass('partial-render');\n                    }\n                    var title = M.util.get_string('moving', 'theme_snap', sectionName);\n                    footerAlert.setTitle(title);\n                    updateSectionDropMsg(sectionName);\n                });\n            };\n\n            /**\n             * Add drop zones at the end of sections.\n             */\n            var addAfterDrops = function() {\n                if (document.body.id === \"page-site-index\") {\n                    $('#region-main .sitetopic ul.section').append(\n                        '<li class=\"snap-drop asset-drop\">' +\n                        '<div class=\"asset-wrapper\">' +\n                        '<a href=\"#\">' +\n                        M.util.get_string('movehere', 'theme_snap') +\n                        '</a>' +\n                        '</div>' +\n                        '</li>');\n                } else {\n                    $('li.section .content ul.section').append(\n                        '<li class=\"snap-drop asset-drop\">' +\n                        '<div class=\"asset-wrapper\">' +\n                        '<a href=\"#\">' +\n                        M.util.get_string('movehere', 'theme_snap') +\n                        '</a>' +\n                        '</div>' +\n                        '</li>');\n                }\n            };\n\n            /**\n             * Add listener for move checkbox.\n             */\n            var assetMoveListener = function() {\n                $(\"#region-main\").on('change', '.js-snap-asset-move', function(e) {\n                    e.stopPropagation();\n\n                    var asset = $(this).parents('.snap-asset')[0];\n\n                    // Make sure after drop is at the end of section.\n                    var section = $(asset).parents('ul.section')[0];\n                    var afterdrop = $(section).find('li.snap-drop.asset-drop');\n                    $(section).append(afterdrop);\n\n                    if (movingObjects.length === 0) {\n                        // Moving asset - activity or resource.\n                        // Initiate move.\n                        var assetname = $(asset).find('.snap-asset-link .instancename').html();\n\n                        log.debug('Moving this asset', assetname);\n\n                        var classes = $(asset).attr('class'),\n                            regex = /(?=snap-mime)([a-z0-9\\-]*)/;\n                        var assetclasses = regex.exec(classes);\n                        classes = '';\n                        if (assetclasses) {\n                            classes = assetclasses.join(' ');\n                        }\n                        log.debug('Moving this class', classes);\n                        $(asset).addClass('asset-moving');\n                        $('.snap-asset button').attr('disabled','disabled');\n                        $(asset).find('button').removeAttr('disabled');\n                        $('.snap-asset .snap-asset-content a').attr('tabindex','-1');\n                        $(asset).find('a').removeAttr('tabindex');\n\n                        $(asset).find('.js-snap-asset-move').prop('checked', 'checked');\n\n                        $('body').addClass('snap-move-inprogress');\n                        $('body').addClass('snap-move-asset');\n\n                    }\n\n                    if ($(this).prop('checked')) {\n                        // Add asset to moving array.\n                        movingObjects.push(asset);\n                        $(asset).find('a').removeAttr('tabindex');\n                        $(asset).find('button').removeAttr('disabled');\n                        $(asset).addClass('asset-moving');\n                    } else {\n                        // Remove from moving array.\n                        removeMovingObject(asset);\n                        // Remove moving class\n                        $(asset).find('.snap-asset-content a').attr('tabindex','-1');\n                        $(asset).find('button').attr('disabled','disabled');\n                        $(asset).removeClass('asset-moving');\n                        if (movingObjects.length === 0) {\n                            // Nothing is ticked for moving, cancel the move.\n                            stopMoving();\n                        }\n                    }\n                    footerAlertShowMove($(this));\n                    updateMovingMessage();\n                });\n            };\n\n            /**\n             * When an asset or drop zone is clicked, execute move.\n             */\n            var movePlaceListener = function() {\n                $(document).on('click', '.snap-move-note, .snap-drop', function(e) {\n                    log.debug('Snap drop clicked', e);\n                    if (movingObjects) {\n                        e.stopPropagation();\n                        e.preventDefault();\n                        if ($('body').hasClass('snap-move-section')) {\n                            ajaxReqMoveSection(this);\n                        } else {\n                            var target;\n                            if ($(this).hasClass('snap-drop')) {\n                                target = this;\n                            } else {\n                                target = $(this).closest('.snap-asset');\n                            }\n                            ajaxReqMoveAsset(target);\n                        }\n                    }\n                });\n            };\n\n            /**\n             * Set observers for TOC and navigation buttons in the footer.\n             */\n            var setCourseSectionObervers = function () {\n                setTocObservers();\n                setNavigationFooterObservers();\n            };\n\n            /**\n             * Add listeners.\n             */\n            var addListeners = function() {\n                moveSectionListener();\n                toggleSectionListener();\n                highlightSectionListener();\n                deleteSectionListener();\n                assetMoveListener();\n                movePlaceListener();\n                assetEditListeners();\n                addAfterDrops();\n                if (courseLib.courseConfig.partialrender) {\n                    setCourseSectionObervers();\n                }\n                $('body').addClass('snap-course-listening');\n            };\n\n            /**\n             * Override core functions.\n             */\n            var overrideCore = function() {\n                // Check M.course exists (doesn't exist in social format).\n                if (M.course && M.course.resource_toolbox) {\n                    /* eslint-disable camelcase */\n                    M.course.resource_toolbox.handle_resource_dim = function(button, activity, action) {\n                        return (action === 'hide') ? 0 : 1;\n                    };\n                    /* eslint-enable camelcase */\n                }\n            };\n\n            /**\n             * Make an Ajax request for caching the TOC so it's not so expensive to hide and show sections.\n             */\n            var cacheTOC = function() {\n                if ($('.snap-section-editing.actions').length === 0) {\n                    // Only cache the TOC if there are sections.\n                    return;\n                }\n\n                var action = 'toc';\n\n                var trigger = $('#region-main');\n\n                if (!ajaxTracker.start('section_' + action, trigger)) {\n                    // Request already in progress.\n                    return;\n                }\n\n                // Make ajax call.\n                var ajaxPromises = ajax.call([\n                    {\n                        methodname: 'theme_snap_course_sections',\n                        args : {\n                            courseshortname: courseLib.courseConfig.shortname,\n                            action: action,\n                            sectionnumber: 0,\n                            value: 0,\n                            loadmodules: 0,\n                        }\n                    }\n                ], true, true);\n\n                // Handle ajax promises.\n                ajaxPromises[0]\n                .fail(function(response) {\n                    var errMessage, errAction;\n                    errMessage = M.util.get_string('error:failedtotoc', 'theme_snap');\n                    errAction = M.util.get_string('action:sectiontoc', 'theme_snap');\n                    ajaxNotify.ifErrorShowBestMsg(response, errAction, errMessage).done(function() {\n                        // Allow another request now this has finished.\n                        ajaxTracker.complete('section_' + action);\n                    });\n                }).always(function() {\n                    $(trigger).removeClass('ajaxing');\n                }).done(function(response) {\n                    // Caching modules for future use.\n                    moduleCache = response.toc.modules;\n\n                    // Caching progress for future use.\n                    progressCache = [];\n                    $.each(response.toc.chapters.chapters, function(index, value) {\n                        progressCache.push(value.progress);\n                    });\n\n                    ajaxTracker.complete('section_' + action);\n                });\n            };\n\n            /**\n             * Initialise script.\n             */\n            var initialise = function() {\n                // Add listeners.\n                addListeners();\n\n                // Cache TOC.\n                cacheTOC();\n\n                // Override core functions\n                util.whenTrue(function() {\n                    return M.course && M.course.init_section_toolbox;\n                }, function() {\noverrideCore();\n}, true);\n\n            };\n            initialise();\n        },\n\n        /**\n         * Exposed function that renders a specific course section and sets focus on an activity module.\n         * @param {string} section\n         * @param {string} mod\n         */\n        renderAndFocusSection: function(section, mod) {\n            getSection(section, mod);\n        },\n\n        setTocObserver: function() {\n            setTocObservers();\n        }\n    };\n\n});\n"],"names":["define","$","log","ajax","str","templates","notification","util","ajaxNotify","footerAlert","Event","fragment","movingObject","ajaxTracker","self","this","movingObjects","ajaxing","sectionsProcess","moduleCache","progressCache","setTocObservers","courseConfig","format","click","e","section","target","attr","length","getSection","split","urlParams","mod","updateMovingMessage","title","assetname","find","html","M","get_string","setTitle","updateSectionDropMsg","sectionName","each","sectionDropMsg","moving","before","data","setSrNotice","indexOf","push","params","courseid","id","show","hide","loadFragment","contextid","done","js","node","renderSection","folders","index","folder","content","folderAssetTypeHeader","prependTo","anchor","existingSections","parseInt","tempnode","replaceNodeContents","remove","closest","reduce","prev","curr","Math","abs","after","runTemplateJS","notifyFilterContentUpdated","sections","removeClass","addClass","toctype","elements","tmpid","key","element","sectionNum","newLink","href","replace","modid","targmod","scrollToElement","searchpin","prepend","focus","scrollToModule","text","movingId","parent","append","init","courseLib","triggersByKey","start","jsPendingKey","trigger","subSelector","debug","js_pending","pending_js","complete","js_complete","sectionNumber","el","partialrender","parentSectionNumber","parents","stopMoving","hideAndReset","removeAttr","moveFailed","actname","removeAjaxLoading","window","setTimeout","ajaxReqMoveGeneral","onSuccess","finalItem","addAjaxLoading","sesskey","cfg","courseId","field","req","type","async","url","wwwroot","ajaxurl","ifErrorShowBestMsg","errorShown","class","fail","always","getSectionTitle","updateSectionNavigation","selector","totalSectionCount","dfd","Deferred","allSections","completed","idx","extraclasses","previousSection","nextSection","previous","next","hasClass","classes","navigation","render","result","replaceWith","resolve","promise","updateSections","current","predeleteSections","deletedSection","loadedSections","obj","newOrder","oldIndex","newIndex","k","undefined","splice","calculateSections","value","chapterTitle","fullTitle","setCourseSectionObervers","ajaxReqMoveAsset","shift","Number","beforeId","document","body","sectionId","assetEditListeners","on","actionSelectors","triggerEl","preventDefault","assetEl","cmid","instanceName","trim","action","errActionKey","errMessageKey","errAction","errMessage","actionAJAX","call","methodname","args","response","get_strings","component","then","strings","delConf","plugindata","match","name","delTitle","ok","cancel","confirm","assetAction","sectionActionListener","onComplete","stopPropagation","message","toggle","loadModules","actionSelector","courseshortname","shortname","sectionnumber","loadmodules","actionmodel","toc","modules","progressCacheCopy","slice","chapters","progress","completion","deleteSectionListener","delProgress","ajaxPromises","ids","location","hash","showSection","sectionDelete","footerAlertShowMove","focusEl","assetMoveListener","asset","afterdrop","assetclasses","exec","join","prop","movePlaceListener","domTargetSection","currentSection","targetSection","addListeners","toggleClass","not","highlighter","cacheTOC","whenTrue","course","init_section_toolbox","resource_toolbox","handle_resource_dim","button","activity","renderAndFocusSection","setTocObserver"],"mappings":"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"}

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