{"version":3,"file":"course.min.js","sources":["https:\/\/kundenportal.comm-unity.at\/course\/format\/tiles\/amd\/src\/course.js"],"sourcesContent":["\/\/ 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
\" + stringStore.noconnectionerror + \"<\/p>\", '');\n setTimeout(function () {\n expandSection(contentArea, sectionNum);\n }, 500);\n }\n };\n\n \/**\n * For a given section, get the content from the server, add it to the store and maybe UI and maybe show it\n * @param {number} courseContextId the id for the affected course context\n * @param {number} sectionId the section ID we are wanting to populate\n * @return {Promise} promise to resolve when the ajax call returns.\n *\/\n var getSectionContentFromServer = function (courseContextId, sectionId) {\n if (!courseContextId || !sectionId) {\n require([\"core\/log\"], function(log) {\n log.debug(`No course context ID '${courseContextId.toString()}' or section ID '${sectionId.toString()}'`);\n });\n }\n \/\/ This gets the fragment from format_tiles_output_fragment_get_cm_list().\n return Fragment.loadFragment(\n 'format_tiles', 'get_cm_list', courseContextId, {sectionid: sectionId}\n );\n };\n\n \/**\n * If the user had section zero collapsed in this course previously, collapse it now\n *\/\n var setSectionZeroFromUserPref = function () {\n var buttonHideSecZero = $(Selector.HIDE_SEC0_BTN);\n var sectionZero = $(Selector.SECTION_ZERO);\n if (browserStorage.storageEnabledLocal()) {\n \/\/ Collapse section zero if user had it collapsed before - relies on local storage so only if enabled.\n if (browserStorage.getSecZeroCollapseStatus() === true) {\n sectionZero.slideUp(0);\n buttonHideSecZero.addClass(ClassNames.CLOSED).removeClass(ClassNames.OPEN); \/\/ Button image.\n $(Selector.ABOVE_TILES).addClass('sec-zero-closed');\n } else {\n sectionZero.slideDown(300);\n buttonHideSecZero.addClass(ClassNames.OPEN).removeClass(ClassNames.CLOSED); \/\/ Button image.\n $(Selector.ABOVE_TILES).removeClass('sec-zero-closed');\n }\n } else {\n \/\/ Storage not available, so we don't know if sec zero was previously collapsed - expand it.\n buttonHideSecZero.addClass(ClassNames.OPEN).removeClass(ClassNames.CLOSED);\n sectionZero.slideDown(300);\n $(Selector.ABOVE_TILES).removeClass('sec-zero-closed');\n }\n };\n\n \/**\n * To be called when a tile is clicked. Get content from server or storage and display or store it.\n * @param {number} courseContextId course context id of this course.\n * @param {number} sectionId section Id for the clicked section.\n * @param {number} sectionNumber the section number of the tile.\n *\/\n var populateAndExpandSection = function(courseContextId, sectionId, sectionNumber) {\n $(Selector.TILE).removeClass(ClassNames.SELECTED);\n openTile = sectionNumber;\n \/\/ Then close all open secs.\n \/\/ Timed to finish in 200 so that it completes well before the opening next.\n $(Selector.MOVEABLE_SECTION).each(function (index, sec) {\n sec = $(sec);\n if (sec.is(\":visible\")) {\n stopVideoPlaying(sec.data(\"section\"), sec.data(\"sectionid\"));\n sec.slideUp(200).removeClass(ClassNames.STATE_VISIBLE); \/\/ Excludes section 0.\n }\n });\n \/\/ Log the fact we viewed the section.\n ajax.call([{\n methodname: \"format_tiles_log_tile_click\", args: {\n coursecontextid: courseContextId,\n sectionnumber: sectionNumber,\n sectionid: sectionId\n }\n }])[0].fail(Notification.exception);\n \/\/ Get the content - use locally stored content first if available.\n var relatedContentArea = $(Selector.SECTION_ID + sectionNumber);\n if (relatedContentArea.find(Selector.ACTIVITY).length > 0) {\n \/\/ There is already some content on the screen so display immediately.\n expandSection(relatedContentArea, sectionNumber);\n\n \/\/ Still contact the server in case content has changed (e.g. restrictions now satisfied).\n getSectionContentFromServer(courseContextId, sectionId).done(function (html, js) {\n setCourseContentHTML(relatedContentArea, html, js);\n }).fail(function (failResult) {\n failedLoadSectionNotify(sectionNumber, failResult, relatedContentArea);\n cancelTileSelections(sectionNumber);\n });\n } else {\n relatedContentArea.html(loadingIconHtml);\n \/\/ Get from server.\n getSectionContentFromServer(courseContextId, sectionId).done(function (html, js) {\n setCourseContentHTML(relatedContentArea, html, js);\n expandSection(relatedContentArea, sectionNumber);\n }).fail(function (failResult) {\n failedLoadSectionNotify(sectionNumber, failResult, relatedContentArea);\n cancelTileSelections(sectionNumber);\n });\n }\n browserStorage.setLastVisitedSection(sectionNumber);\n\n \/\/ If any moodle dialogues are open, close them (e.g. glossary auto links).\n $(Selector.MOODLE_DIALOGUE).remove();\n };\n\n const removeUrlParam = function (pattern) {\n if ((window.location.href).match(pattern)) {\n history.pushState(null, null, (window.location.href).replace(pattern, ''));\n }\n };\n\n\n \/**\n * Watch the course index and, if a section link is clicked, treat it as a tile click.\n *\/\n const initCourseIndexWatcher = () => {\n \/\/ We have to watch the parent element as the children are not populated on page load.\n const courseIndex = $('nav#courseindex');\n if (courseIndex.length > 0) {\n courseIndex.on('click', (e) => {\n const target = $(e.target);\n if (target.hasClass('courseindex-link') && target.data('action') === 'togglecourseindexsection') {\n const sec = target.closest('.courseindex-section');\n const sectionNumber = sec.data('number');\n if (sec && sectionNumber !== undefined) {\n e.preventDefault();\n if (sectionNumber === 0) {\n cancelTileSelections(0);\n } else {\n const subSectionParent = sec.parent().closest('.courseindex-section');\n if (subSectionParent && subSectionParent.length) {\n \/\/ A subsection has been clicked - need to expand parent, then the subsection.\n populateAndExpandSection(\n courseContextId, subSectionParent.data('id'), subSectionParent.data('number')\n );\n \/\/ Need to wait for parent section content before we can expand subsection.\n \/\/ Not ideal to use a timeout - temporary approach pending wider refactor.\n setTimeout(() => {\n const subSectionContent = $('#coursecontentcollapse' + sec.data('id'));\n const needsExpanding = subSectionContent && subSectionContent.length\n && !subSectionContent.hasClass('show');\n if (needsExpanding) {\n subSectionContent.collapse('show');\n expandedSubSectionIds[sec.data('id')] = true;\n }\n }, 1000);\n } else {\n populateAndExpandSection(courseContextId, sec.data('id'), sectionNumber);\n }\n }\n }\n }\n });\n }\n };\n\n return {\n init: function (\n courseIdInit,\n useJavascriptNav, \/\/ Set by site admin see settings.php.\n isMobileInit,\n sectionNum,\n useFilterButtons, \/\/ If > 0 then are using filters (value depends on filter type).\n assumeDataStoreConsent, \/\/ Set by site admin see settings.php.\n reopenLastSectionInit, \/\/ Set by site admin see settings.php.\n userId,\n fitTilesToWidth,\n enableCompletionInit,\n useSubTiles,\n courseContextIdInit\n ) {\n courseId = parseInt(courseIdInit);\n courseContextId = courseContextIdInit;\n isMobile = isMobileInit;\n \/\/ Some args are strings or ints but we prefer bool. Change to bool now as they are passed on elsewhere.\n reopenLastVisitedSection = reopenLastSectionInit === \"1\";\n assumeDataStoreConsent = assumeDataStoreConsent === \"1\";\n enableCompletion = enableCompletionInit === \"1\";\n \/\/ We want to initialise the browser storage JS module for storing user settings.\n browserStorage.init(\n courseId,\n false,\n sectionNum,\n assumeDataStoreConsent,\n userId\n );\n $(document).ready(function () {\n const isMultiSectionPage = $(Selector.TILES).length === 1;\n\n if (useSubTiles) {\n \/\/ We need to be able to style tooltips outside of ul.tiles element.\n $(Selector.BODY).addClass('format-tiles-subtiles');\n }\n var pageContent = $(\"#page-content\");\n if (pageContent.length === 0) {\n \/\/ Some themes e.g. RemUI do not have a #page-content div, so use #region-main.\n pageContent = $(\"#region-main\");\n }\n\n \/\/ If we are being told to launch a section number from the URL, use that.\n if (sectionNum !== 0) {\n openTile = sectionNum;\n } else {\n \/\/ Don't use the URL param - check local storage instead.\n if (reopenLastVisitedSection && browserStorage.storageEnabledLocal) {\n openTile = browserStorage.getLastVisitedSection();\n \/\/ If user is not on mobile, retrieve last visited section id from browser storage (if present).\n \/\/ And click it.\n }\n }\n\n \/\/ If there is an anchor e.g. #module-123 then open relevant section.\n const anchorMatches = (window.location.href).match(\/#module-(\\d+)$\/gi);\n if (anchorMatches && anchorMatches.length) {\n const anchorCmId = parseInt(anchorMatches[0].split('-')[1]);\n if (anchorCmId) {\n \/\/ Set openTile to null for now so that null is passed to tile fitter before AJAX below returns.\n openTile = null;\n ajax.call([{\n methodname: \"format_tiles_get_course_mod_info\", args: {cmid: anchorCmId}\n }])[0].done(function (data) {\n if (data && data.courseid === courseId) {\n openTile = data.sectionnumber;\n if (useJavascriptNav) {\n populateAndExpandSection(\n data.coursecontextid, data.sectionid, data.sectionnumber\n );\n }\n }\n });\n }\n }\n\n if (openTile !== 0) {\n tileFitter.init(courseId, openTile, fitTilesToWidth, false);\n } else {\n tileFitter.init(courseId, null, fitTilesToWidth, false);\n }\n\n \/\/ We are going to watch for changes to size of main tiles window.\n \/\/ This allows us to call the tile fitter to re-org tiles if needed.\n const pageContentElem = $('#page-content');\n \/\/ In case some themes don't have a page content div, use window as alternative.\n const widthObservedElement = pageContentElem.length ? pageContentElem : $(window);\n var observedElementWidth = widthObservedElement.outerWidth();\n const page = $('#page');\n\n if (useJavascriptNav) {\n \/\/ User is not editing but is usingJS nav to view.\n\n \/\/ On a tile click, decide what to do an do it.\n \/\/ (Collapse if already expanded, or expand it and fill with content).\n pageContent.on(Event.CLICK, Selector.TILE_CLICKABLE, function (e) {\n \/\/ Prevent the link being followed to reload the PHP page as we are using JS instead.\n if (!useJavascriptNav) {\n return;\n }\n const target = $(e.target);\n if (target.hasClass(ClassNames.ON_TILE_CONTROL)) {\n \/\/ The user has clicked a control on the tile so we don't expand it.\n return;\n }\n e.preventDefault();\n \/\/ If other tiles have loading icons, fade them out (on the tile not the content sec).\n $(Selector.TILE_LOADING_ICON).fadeOut(300, function () {\n $(Selector.TILE_LOADING_ICON).html();\n });\n var thisTile = $(e.currentTarget).closest(Selector.TILE);\n var dataSection = parseInt(thisTile.data(\"section\"));\n if (thisTile.hasClass(ClassNames.SELECTED)) {\n \/\/ This tile is already expanded so collapse it.\n cancelTileSelections(dataSection);\n browserStorage.setLastVisitedSection(0);\n overlay.fadeOut(300);\n overlay.css('min-height', 'inherit');\n } else {\n populateAndExpandSection(courseContextId, thisTile.data('true-sectionid'), dataSection);\n }\n });\n\n overlay.on(Event.CLICK, function(e) {\n cancelTileSelections(0);\n browserStorage.setLastVisitedSection(0);\n clickItemBehind(e);\n });\n\n \/\/ When window is re-sized, content sections under the tiles may be in wrong place.\n \/\/ So remove them and re-initialise them.\n \/\/ Collapse the selected section before doing this.\n \/\/ Otherwise the re-organisation won't work as the tiles' flow will be out when they are analysed.\n \/\/ We use the multi_section_tiles element to capture left and right drawer opening\/closing.\n const resizeObserver = new ResizeObserver(() => {\n \/\/ On iOS resize events are triggered often on scroll because the address bar hides itself.\n \/\/ Avoid this using observedElementWidth here.\n if (observedElementWidth === widthObservedElement.outerWidth()) {\n return;\n }\n\n \/\/ We wait for a short time before doing anything, as user may still be dragging window size change.\n \/\/ We don't want to react to say 20 resize events happening over a single drag.\n clearTimeout(resizeTimeout);\n resizeTimeout = setTimeout(function() {\n\n if (reorgSectionsDisabledUntil > Date.now()) {\n \/\/ We wait until inside our timeout for this as we may be responding to a fullscreen event.\n return;\n }\n\n \/\/ First assume that we are going to resize, but we have checks to make below.\n var resizeRequired = true;\n\n \/\/ If we have an iframe in the section in fullscreen, ignore this resize event.\n \/\/ It was probably caused when user pressed the full screen button.\n \/\/ This could be a Moodle media player div, or a YouTube embed or other.\n var openContentSection = $(\".moveablesection:visible\");\n if (openContentSection.length !== 0) {\n var iframes = openContentSection.find(\"iframe\");\n if (iframes.length !== 0) {\n iframes.each(function (index, player) {\n player = $(player);\n if (player.outerWidth() > openContentSection.outerWidth()) {\n \/\/ Video is present and playing full screen so don't react to resize event.\n resizeRequired = false;\n }\n });\n }\n }\n if (resizeRequired) {\n \/\/ Set global for comparison next time.\n observedElementWidth = widthObservedElement.outerWidth();\n reOrgSections(fitTilesToWidth);\n }\n }, 100);\n });\n\n resizeObserver.observe(document.getElementById('page-content'));\n\n \/\/ When user clicks to close a section using cross at top right in section.\n pageContent.on(Event.CLICK, Selector.CLOSE_SEC_BTN, function (e) {\n const currentSectionNumber = $(e.currentTarget).data(\"section\");\n cancelTileSelections(currentSectionNumber);\n \/\/ For screen readers, move focus back to tile just closed so they can advance from there.\n $('#sectionlink-' + currentSectionNumber).focus();\n });\n\n \/\/ Most filter button related JS is in filter_buttons.js module which is required below.\n\n if (isMultiSectionPage) {\n \/\/ Remove section and cmid URL params if present as we are using JS nav and showing all tiles.\n removeUrlParam(\/(&|\\\\?)cmid=\\d+\/gi);\n removeUrlParam(\/(&|\\\\?)section=\\d+\/gi);\n }\n\n \/\/ Move overlay into #page element.\n \/\/ Enables left and right drawers plus scroll bar remain on top when tile is open.\n if (page.length) {\n $(`#${OVERLAY_ID}`).appendTo(page).css('position', 'absolute');\n }\n\n initCourseIndexWatcher();\n\n } else if (fitTilesToWidth) {\n tileFitter.resizeTilesDivWidth(courseId);\n }\n\n \/\/ If this event is triggered, user has updated a completion check box.\n \/\/ We need to retrieve section content from server in case availability of items has changed.\n \/\/ Will also be triggered on focus change e.g. user has returned to this tab from a new window.\n $(document).on('format-tiles-completion-changed', function(e, data) {\n if (data.courseid && parseInt(courseId) !== parseInt(data.courseid)) {\n return;\n }\n const allSectionNums = $(Selector.TILE).not(Selector.SPACER).map((i, tile) => {\n return parseInt($(tile).data('section'));\n }).toArray();\n \/\/ Need to include sec zero as may have completion tracked items.\n allSectionNums.push(0);\n\n \/\/ Get the section ID from section number.\n const contentArea = $(Selector.SECTION_ID + data.section);\n const sectionId = contentArea.data('sectionid')\n ?? contentArea.data('section-id');\n \/\/ This gets the fragment from format_tiles_output_fragment_get_cm_list().\n Fragment.loadFragment(\n 'format_tiles', 'get_cm_list', courseContextId, {sectionid: sectionId}\n )\n .done((html, js) => {\n setCourseContentHTML(contentArea, html, js);\n })\n .catch(err => {\n require([\"core\/log\"], function(log) {\n log.debug(err);\n });\n });\n\n ajax.call([\n {\n methodname: \"format_tiles_get_section_information\",\n args: {\n courseid: courseId,\n sectionnums: allSectionNums\n }\n }\n ])[0]\n .done((response) => {\n require([\"format_tiles\/completion\"], function (completion) {\n completion.updateSectionsInfo(\n response.sections, response.overall.complete, response.overall.outof\n );\n });\n\n })\n .catch(err => {\n require([\"core\/log\"], function(log) {\n log.debug(err);\n });\n });\n });\n\n if (enableCompletion) {\n \/\/ We use pageContent for listener here, as completion button is replaced by core JS when it's clicked.\n \/\/ This is for non-subtiles only.\n \/\/ We wait half a second to enable the completion change to be registered first.\n pageContent.on(Event.CLICK, Selector.MANUAL_COMPLETION, function(e) {\n const currentTarget = $(e.currentTarget);\n const sectionNum = currentTarget.closest(Selector.SECTION_MAIN).data(\"section\");\n const cmid = currentTarget.data(\"cmid\");\n require([\"format_tiles\/completion\"], function (completion) {\n setTimeout(() => {\n completion.triggerCompletionChangedEvent(\n sectionNum ? parseInt(sectionNum) : 0,\n cmid ? parseInt(cmid) : 0\n );\n }, 500);\n });\n });\n }\n\n const sectionZero = $(Selector.SECTION_ZERO);\n\n \/\/ When the user presses the button to collapse or expand Section zero (section at the top of the course).\n \/\/ Button will absent if site admin has disabled sec zero collapse, in which case nothing to do here.\n const buttonHideSecZero = $(Selector.HIDE_SEC0_BTN);\n if (buttonHideSecZero.length) {\n setSectionZeroFromUserPref();\n $('#page').on(Event.CLICK, Selector.HIDE_SEC0_BTN, function (e) {\n if (sectionZero.css(CSS.DISPLAY) === \"none\") {\n \/\/ Sec zero is collapsed so expand it on user click.\n sectionZero.slideDown(250);\n $(Selector.ABOVE_TILES).removeClass('sec-zero-closed');\n $(e.currentTarget).addClass(ClassNames.OPEN).removeClass(ClassNames.CLOSED);\n browserStorage.setSecZeroCollapseStatus(\"collapsed\");\n } else {\n \/\/ Sec zero is expanded so collapse it on user click.\n sectionZero.slideUp(250);\n $(Selector.ABOVE_TILES).addClass('sec-zero-closed');\n $(e.currentTarget).addClass(ClassNames.CLOSED).removeClass(ClassNames.OPEN);\n browserStorage.setSecZeroCollapseStatus(\"expanded\");\n }\n });\n }\n\n if (useFilterButtons) {\n require([\"format_tiles\/filter_buttons\"], function (filterButtons) {\n filterButtons.init(courseId, browserStorage.storageEnabledLocal);\n });\n if (useJavascriptNav) {\n pageContent.on(Event.CLICK, Selector.FILTER_BUTTON, function () {\n cancelTileSelections(0);\n reOrgSections(false);\n });\n }\n\n }\n \/\/ If theme is displaying the .tiles_coursenav class items, show items with this class.\n \/\/ They will be hidden otherwise.\n \/\/ They are hidden when initially rendered from PHP as we only want them shown if browser supports JS.\n \/\/ See lib.php extend_course_navigation.\n $(\".tiles_coursenav\").removeClass(\"hidden\");\n\n \/\/ Render the loading icon and store its HTML globally so that we can use it where needed later.\n Templates.render(\"format_tiles\/loading\", {}).done(function (html) {\n loadingIconHtml = html;\n });\n\n \/\/ Get these strings now, in case we need them.\n \/\/ E.g. after we lose connection and cannot display content on a user tile click.\n var stringKeys = [\n {key: \"sectionerrortitle\", component: \"format_tiles\"},\n {key: \"refresh\"},\n {key: \"cancel\", component: \"moodle\"},\n {key: \"noconnectionerror\", component: \"format_tiles\"},\n {key: \"show\"},\n {key: \"hide\"},\n {key: \"other\", component: \"format_tiles\"},\n {key: \"continue\"}\n ];\n str.get_strings(stringKeys).done(function (s) {\n s.forEach(function(str, index) {\n if (str) {\n stringStore[stringKeys[index].key] = str;\n } else {\n stringStore[stringKeys[index].key] = 'Error.';\n require([\"core\/log\"], function(log) {\n log.debug(`Format tiles get_strings error ${index}`);\n log.debug(s);\n });\n }\n });\n })\n .fail(function(err) {\n require([\"core\/log\"], function(log) {\n log.debug(err);\n });\n });\n\n \/\/ When a section is open, fix close\/edit buttons to top of screen (else hidden on scroll).\n let fixButtonsDisabled = false;\n $(window).scroll(function() {\n if (!fixButtonsDisabled) {\n try {\n if ($(window).scrollTop() >= 300) {\n $('.moveablesection.state-visible').each((i, s) => {\n s = $(s);\n const section = document.getElementById('section-' + s.data('section'));\n const sectionRect = section.getBoundingClientRect();\n const right = document.body.clientWidth - sectionRect.right + 30;\n const sectionButtons = s.find('.sectionbuttons');\n const topMargin = page.offset().top;\n if (sectionRect.top + topMargin < 0 && sectionRect.bottom - topMargin > 0) {\n sectionButtons.addClass('position-fixed');\n sectionButtons.css({'top': topMargin + 10, 'right': right});\n } else {\n sectionButtons.removeClass('position-fixed');\n sectionButtons.css({'top': 'unset', 'right': 'unset'});\n }\n });\n }\n } catch (err) {\n require([\"core\/log\"], function(log) {\n log.debug(err);\n });\n fixButtonsDisabled = true;\n }\n }\n });\n\n \/\/ The URL may include a section ID in the form \"#sectionid-xx-title\" where xx is section ID.\n \/\/ This would be from a section \"permalink\".\n \/\/ We cannot get that value in PHP so try redirect from here instead.\n \/\/ This is not needed from Moodle 4.4+ as then the section.php URL is used for permalinks.\n const urlPattern = \/.*\\\/course\\\/view\\.php\\?id=([\\d]+)#sectionid-([\\d+]+)-title\/;\n const urlMatches = window.location.href.match(urlPattern);\n if (urlMatches && urlMatches.length === 3) {\n const sectionId = urlMatches[2];\n const redirectUrl = urlMatches[0].replace(\n `#sectionid-${sectionId}-title`, `§ionid=${sectionId}`\n );\n window.location.replace(redirectUrl);\n }\n });\n },\n populateAndExpandSection(courseContextId, sectionId, sectionNumber) {\n populateAndExpandSection(courseContextId, sectionId, sectionNumber);\n }\n };\n }\n);"],"names":["define","$","Templates","ajax","browserStorage","Notification","str","tileFitter","Fragment","isMobile","loadingIconHtml","courseId","courseContextId","stringStore","reopenLastVisitedSection","resizeTimeout","enableCompletion","reorgSectionsDisabledUntil","expandedSubSectionIds","openTile","Selector","ClassNames","Event","CSS","Keyboard","OVERLAY_ID","stopVideoPlaying","section","sectionId","contentSection","find","each","index","iframe","attr","data","length","html","getSectionContentFromServer","done","js","setCourseContentHTML","cancelTileSelections","sectionToFocus","sec","is","slideUp","removeClass","css","undefined","focus","fadeOut","overlay","remove","contentArea","newHtml","subSections","i","subSection","subSectionId","addClass","on","e","currentTarget","subSectionContent","isCollapsed","hasClass","not","keyCode","toClick","window","location","href","focusableElements","firstFocusableElement","eq","lastFocusableElement","shiftKey","relatedTarget","closest","setTimeout","tooltipItems","tooltip","err","require","log","debug","el","height","filter","script","runTemplateJS","applyMathJax","videoJS","setUp","forEach","ev","document","addEventListener","Date","now","appendTo","trigger","parseInt","sectionid","MathJax","mathJaxElems","node","Hub","Queue","expandSection","sectionNumber","tile","getElementById","footerHeight","outerHeight","hide","show","heights","Math","ceil","max","setOverlayHeight","fadeIn","classList","add","slideDown","scrollIntoView","behavior","block","iframes","courseid","expandAndScroll","reOrgSections","fitTilesToScreenWidth","dfd","Deferred","resolve","reOrgFunc","runReOrg","result","fail","reject","resizeTilesDivWidth","promise","failedLoadSectionNotify","sectionNum","failResult","errorcode","reload","confirm","sectionerrortitle","message","continue","noconnectionerror","toString","loadFragment","populateAndExpandSection","call","methodname","args","coursecontextid","sectionnumber","exception","relatedContentArea","setLastVisitedSection","removeUrlParam","pattern","match","history","pushState","replace","init","courseIdInit","useJavascriptNav","isMobileInit","useFilterButtons","assumeDataStoreConsent","reopenLastSectionInit","userId","fitTilesToWidth","enableCompletionInit","useSubTiles","courseContextIdInit","ready","isMultiSectionPage","pageContent","storageEnabledLocal","getLastVisitedSection","anchorMatches","anchorCmId","split","cmid","pageContentElem","widthObservedElement","observedElementWidth","outerWidth","page","target","preventDefault","thisTile","dataSection","clickedItem","BottomElement","elementFromPoint","clientX","clientY","click","clickedTile","clickItemBehind","ResizeObserver","clearTimeout","resizeRequired","openContentSection","player","observe","currentSectionNumber","courseIndex","subSectionParent","parent","collapse","initCourseIndexWatcher","allSectionNums","map","toArray","push","catch","sectionnums","response","completion","updateSectionsInfo","sections","overall","complete","outof","triggerCompletionChangedEvent","sectionZero","buttonHideSecZero","getSecZeroCollapseStatus","setSectionZeroFromUserPref","setSecZeroCollapseStatus","filterButtons","render","stringKeys","key","component","get_strings","s","fixButtonsDisabled","scroll","scrollTop","sectionRect","getBoundingClientRect","right","body","clientWidth","sectionButtons","topMargin","offset","top","bottom","urlMatches","redirectUrl"],"mappings":"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\/H,KAAMG,IAC\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"}