{"version":3,"file":"frontend/bundle.min.js","mappings":"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","sources":["webpack://uncanny-pro-toolkit-release/./node_modules/css-element-queries/src/ElementQueries.js","webpack://uncanny-pro-toolkit-release/./node_modules/css-element-queries/src/ResizeSensor.js","webpack://uncanny-pro-toolkit-release/external var \"jQuery\"","webpack://uncanny-pro-toolkit-release/webpack/bootstrap","webpack://uncanny-pro-toolkit-release/webpack/runtime/compat get default export","webpack://uncanny-pro-toolkit-release/webpack/runtime/define property getters","webpack://uncanny-pro-toolkit-release/webpack/runtime/hasOwnProperty shorthand","webpack://uncanny-pro-toolkit-release/./src/assets/src/common/js/utilities.js","webpack://uncanny-pro-toolkit-release/./src/assets/src/frontend/js/course-dashboard.js","webpack://uncanny-pro-toolkit-release/./src/assets/src/frontend/js/course-timer.js","webpack://uncanny-pro-toolkit-release/./src/assets/src/frontend/js/lazy-course-navigation.js","webpack://uncanny-pro-toolkit-release/./src/assets/src/frontend/js/download-certificates.js","webpack://uncanny-pro-toolkit-release/./src/assets/src/frontend/index.js"],"sourcesContent":["'use strict';\n\n/**\n * Copyright Marc J. Schmidt. See the LICENSE file at the top-level\n * directory of this distribution and at\n * https://github.com/marcj/css-element-queries/blob/master/LICENSE.\n */\n(function (root, factory) {\n    if (typeof define === \"function\" && define.amd) {\n        define(['./ResizeSensor.js'], factory);\n    } else if (typeof exports === \"object\") {\n        module.exports = factory(require('./ResizeSensor.js'));\n    } else {\n        root.ElementQueries = factory(root.ResizeSensor);\n        root.ElementQueries.listen();\n    }\n}(typeof window !== 'undefined' ? window : this, function (ResizeSensor) {\n\n    /**\n     *\n     * @type {Function}\n     * @constructor\n     */\n    var ElementQueries = function () {\n        //<style> element with our dynamically created styles\n        var cssStyleElement;\n\n        //all rules found for element queries\n        var allQueries = {};\n\n        //association map to identify which selector belongs to a element from the animationstart event.\n        var idToSelectorMapping = [];\n\n        /**\n         *\n         * @param element\n         * @returns {Number}\n         */\n        function getEmSize(element) {\n            if (!element) {\n                element = document.documentElement;\n            }\n            var fontSize = window.getComputedStyle(element, null).fontSize;\n            return parseFloat(fontSize) || 16;\n        }\n\n        /**\n         * Get element size\n         * @param {HTMLElement} element\n         * @returns {Object} {width, height}\n         */\n        function getElementSize(element) {\n            if (!element.getBoundingClientRect) {\n                return {\n                    width: element.offsetWidth,\n                    height: element.offsetHeight\n                }\n            }\n\n            var rect = element.getBoundingClientRect();\n            return {\n                width: Math.round(rect.width),\n                height: Math.round(rect.height)\n            }\n        }\n\n        /**\n         *\n         * @copyright https://github.com/Mr0grog/element-query/blob/master/LICENSE\n         *\n         * @param {HTMLElement} element\n         * @param {*} value\n         * @returns {*}\n         */\n        function convertToPx(element, value) {\n            var numbers = value.split(/\\d/);\n            var units = numbers[numbers.length - 1];\n            value = parseFloat(value);\n            switch (units) {\n                case \"px\":\n                    return value;\n                case \"em\":\n                    return value * getEmSize(element);\n                case \"rem\":\n                    return value * getEmSize();\n                // Viewport units!\n                // According to http://quirksmode.org/mobile/tableViewport.html\n                // documentElement.clientWidth/Height gets us the most reliable info\n                case \"vw\":\n                    return value * document.documentElement.clientWidth / 100;\n                case \"vh\":\n                    return value * document.documentElement.clientHeight / 100;\n                case \"vmin\":\n                case \"vmax\":\n                    var vw = document.documentElement.clientWidth / 100;\n                    var vh = document.documentElement.clientHeight / 100;\n                    var chooser = Math[units === \"vmin\" ? \"min\" : \"max\"];\n                    return value * chooser(vw, vh);\n                default:\n                    return value;\n                // for now, not supporting physical units (since they are just a set number of px)\n                // or ex/ch (getting accurate measurements is hard)\n            }\n        }\n\n        /**\n         *\n         * @param {HTMLElement} element\n         * @param {String} id\n         * @constructor\n         */\n        function SetupInformation(element, id) {\n            this.element = element;\n            var key, option, elementSize, value, actualValue, attrValues, attrValue, attrName;\n\n            var attributes = ['min-width', 'min-height', 'max-width', 'max-height'];\n\n            /**\n             * Extracts the computed width/height and sets to min/max- attribute.\n             */\n            this.call = function () {\n                // extract current dimensions\n                elementSize = getElementSize(this.element);\n\n                attrValues = {};\n\n                for (key in allQueries[id]) {\n                    if (!allQueries[id].hasOwnProperty(key)) {\n                        continue;\n                    }\n                    option = allQueries[id][key];\n\n                    value = convertToPx(this.element, option.value);\n\n                    actualValue = option.property === 'width' ? elementSize.width : elementSize.height;\n                    attrName = option.mode + '-' + option.property;\n                    attrValue = '';\n\n                    if (option.mode === 'min' && actualValue >= value) {\n                        attrValue += option.value;\n                    }\n\n                    if (option.mode === 'max' && actualValue <= value) {\n                        attrValue += option.value;\n                    }\n\n                    if (!attrValues[attrName]) attrValues[attrName] = '';\n                    if (attrValue && -1 === (' ' + attrValues[attrName] + ' ').indexOf(' ' + attrValue + ' ')) {\n                        attrValues[attrName] += ' ' + attrValue;\n                    }\n                }\n\n                for (var k in attributes) {\n                    if (!attributes.hasOwnProperty(k)) continue;\n\n                    if (attrValues[attributes[k]]) {\n                        this.element.setAttribute(attributes[k], attrValues[attributes[k]].substr(1));\n                    } else {\n                        this.element.removeAttribute(attributes[k]);\n                    }\n                }\n            };\n        }\n\n        /**\n         * @param {HTMLElement} element\n         * @param {Object}      id\n         */\n        function setupElement(element, id) {\n            if (!element.elementQueriesSetupInformation) {\n                element.elementQueriesSetupInformation = new SetupInformation(element, id);\n            }\n\n            if (!element.elementQueriesSensor) {\n                element.elementQueriesSensor = new ResizeSensor(element, function () {\n                    element.elementQueriesSetupInformation.call();\n                });\n            }\n        }\n\n        /**\n         * Stores rules to the selector that should be applied once resized.\n         *\n         * @param {String} selector\n         * @param {String} mode min|max\n         * @param {String} property width|height\n         * @param {String} value\n         */\n        function queueQuery(selector, mode, property, value) {\n            if (typeof(allQueries[selector]) === 'undefined') {\n                allQueries[selector] = [];\n                // add animation to trigger animationstart event, so we know exactly when a element appears in the DOM\n\n                var id = idToSelectorMapping.length;\n                cssStyleElement.innerHTML += '\\n' + selector + ' {animation: 0.1s element-queries;}';\n                cssStyleElement.innerHTML += '\\n' + selector + ' > .resize-sensor {min-width: '+id+'px;}';\n                idToSelectorMapping.push(selector);\n            }\n\n            allQueries[selector].push({\n                mode: mode,\n                property: property,\n                value: value\n            });\n        }\n\n        function getQuery(container) {\n            var query;\n            if (document.querySelectorAll) query = (container) ? container.querySelectorAll.bind(container) : document.querySelectorAll.bind(document);\n            if (!query && 'undefined' !== typeof $$) query = $$;\n            if (!query && 'undefined' !== typeof jQuery) query = jQuery;\n\n            if (!query) {\n                throw 'No document.querySelectorAll, jQuery or Mootools\\'s $$ found.';\n            }\n\n            return query;\n        }\n\n        /**\n         * If animationStart didn't catch a new element in the DOM, we can manually search for it\n         */\n        function findElementQueriesElements(container) {\n            var query = getQuery(container);\n\n            for (var selector in allQueries) if (allQueries.hasOwnProperty(selector)) {\n                // find all elements based on the extract query selector from the element query rule\n                var elements = query(selector, container);\n\n                for (var i = 0, j = elements.length; i < j; i++) {\n                    setupElement(elements[i], selector);\n                }\n            }\n        }\n\n        /**\n         *\n         * @param {HTMLElement} element\n         */\n        function attachResponsiveImage(element) {\n            var children = [];\n            var rules = [];\n            var sources = [];\n            var defaultImageId = 0;\n            var lastActiveImage = -1;\n            var loadedImages = [];\n\n            for (var i in element.children) {\n                if (!element.children.hasOwnProperty(i)) continue;\n\n                if (element.children[i].tagName && element.children[i].tagName.toLowerCase() === 'img') {\n                    children.push(element.children[i]);\n\n                    var minWidth = element.children[i].getAttribute('min-width') || element.children[i].getAttribute('data-min-width');\n                    //var minHeight = element.children[i].getAttribute('min-height') || element.children[i].getAttribute('data-min-height');\n                    var src = element.children[i].getAttribute('data-src') || element.children[i].getAttribute('url');\n\n                    sources.push(src);\n\n                    var rule = {\n                        minWidth: minWidth\n                    };\n\n                    rules.push(rule);\n\n                    if (!minWidth) {\n                        defaultImageId = children.length - 1;\n                        element.children[i].style.display = 'block';\n                    } else {\n                        element.children[i].style.display = 'none';\n                    }\n                }\n            }\n\n            lastActiveImage = defaultImageId;\n\n            function check() {\n                var imageToDisplay = false, i;\n\n                for (i in children) {\n                    if (!children.hasOwnProperty(i)) continue;\n\n                    if (rules[i].minWidth) {\n                        if (element.offsetWidth > rules[i].minWidth) {\n                            imageToDisplay = i;\n                        }\n                    }\n                }\n\n                if (!imageToDisplay) {\n                    //no rule matched, show default\n                    imageToDisplay = defaultImageId;\n                }\n\n                if (lastActiveImage !== imageToDisplay) {\n                    //image change\n\n                    if (!loadedImages[imageToDisplay]) {\n                        //image has not been loaded yet, we need to load the image first in memory to prevent flash of\n                        //no content\n\n                        var image = new Image();\n                        image.onload = function () {\n                            children[imageToDisplay].src = sources[imageToDisplay];\n\n                            children[lastActiveImage].style.display = 'none';\n                            children[imageToDisplay].style.display = 'block';\n\n                            loadedImages[imageToDisplay] = true;\n\n                            lastActiveImage = imageToDisplay;\n                        };\n\n                        image.src = sources[imageToDisplay];\n                    } else {\n                        children[lastActiveImage].style.display = 'none';\n                        children[imageToDisplay].style.display = 'block';\n                        lastActiveImage = imageToDisplay;\n                    }\n                } else {\n                    //make sure for initial check call the .src is set correctly\n                    children[imageToDisplay].src = sources[imageToDisplay];\n                }\n            }\n\n            element.resizeSensorInstance = new ResizeSensor(element, check);\n            check();\n        }\n\n        function findResponsiveImages() {\n            var query = getQuery();\n\n            var elements = query('[data-responsive-image],[responsive-image]');\n            for (var i = 0, j = elements.length; i < j; i++) {\n                attachResponsiveImage(elements[i]);\n            }\n        }\n\n        var regex = /,?[\\s\\t]*([^,\\n]*?)((?:\\[[\\s\\t]*?(?:min|max)-(?:width|height)[\\s\\t]*?[~$\\^]?=[\\s\\t]*?\"[^\"]*?\"[\\s\\t]*?])+)([^,\\n\\s\\{]*)/mgi;\n        var attrRegex = /\\[[\\s\\t]*?(min|max)-(width|height)[\\s\\t]*?[~$\\^]?=[\\s\\t]*?\"([^\"]*?)\"[\\s\\t]*?]/mgi;\n\n        /**\n         * @param {String} css\n         */\n        function extractQuery(css) {\n            var match, smatch, attrs, attrMatch;\n\n            css = css.replace(/'/g, '\"');\n            while (null !== (match = regex.exec(css))) {\n                smatch = match[1] + match[3];\n                attrs = match[2];\n\n                while (null !== (attrMatch = attrRegex.exec(attrs))) {\n                    queueQuery(smatch, attrMatch[1], attrMatch[2], attrMatch[3]);\n                }\n            }\n        }\n\n        /**\n         * @param {CssRule[]|String} rules\n         */\n        function readRules(rules) {\n            var selector = '';\n\n            if (!rules) {\n                return;\n            }\n\n            if ('string' === typeof rules) {\n                rules = rules.toLowerCase();\n                if (-1 !== rules.indexOf('min-width') || -1 !== rules.indexOf('max-width')) {\n                    extractQuery(rules);\n                }\n            } else {\n                for (var i = 0, j = rules.length; i < j; i++) {\n                    if (1 === rules[i].type) {\n                        selector = rules[i].selectorText || rules[i].cssText;\n                        if (-1 !== selector.indexOf('min-height') || -1 !== selector.indexOf('max-height')) {\n                            extractQuery(selector);\n                        } else if (-1 !== selector.indexOf('min-width') || -1 !== selector.indexOf('max-width')) {\n                            extractQuery(selector);\n                        }\n                    } else if (4 === rules[i].type) {\n                        readRules(rules[i].cssRules || rules[i].rules);\n                    } else if (3 === rules[i].type) {\n                        if(rules[i].styleSheet.hasOwnProperty(\"cssRules\")) {\n                            readRules(rules[i].styleSheet.cssRules);\n                        }\n                    }\n                }\n            }\n        }\n\n        var defaultCssInjected = false;\n\n        /**\n         * Searches all css rules and setups the event listener to all elements with element query rules..\n         */\n        this.init = function () {\n            var animationStart = 'animationstart';\n            if (typeof document.documentElement.style['webkitAnimationName'] !== 'undefined') {\n                animationStart = 'webkitAnimationStart';\n            } else if (typeof document.documentElement.style['MozAnimationName'] !== 'undefined') {\n                animationStart = 'mozanimationstart';\n            } else if (typeof document.documentElement.style['OAnimationName'] !== 'undefined') {\n                animationStart = 'oanimationstart';\n            }\n\n            document.body.addEventListener(animationStart, function (e) {\n                var element = e.target;\n                var styles = element && window.getComputedStyle(element, null);\n                var animationName = styles && styles.getPropertyValue('animation-name');\n                var requiresSetup = animationName && (-1 !== animationName.indexOf('element-queries'));\n\n                if (requiresSetup) {\n                    element.elementQueriesSensor = new ResizeSensor(element, function () {\n                        if (element.elementQueriesSetupInformation) {\n                            element.elementQueriesSetupInformation.call();\n                        }\n                    });\n\n                    var sensorStyles = window.getComputedStyle(element.resizeSensor, null);\n                    var id = sensorStyles.getPropertyValue('min-width');\n                    id = parseInt(id.replace('px', ''));\n                    setupElement(e.target, idToSelectorMapping[id]);\n                }\n            });\n\n            if (!defaultCssInjected) {\n                cssStyleElement = document.createElement('style');\n                cssStyleElement.type = 'text/css';\n                cssStyleElement.innerHTML = '[responsive-image] > img, [data-responsive-image] {overflow: hidden; padding: 0; } [responsive-image] > img, [data-responsive-image] > img {width: 100%;}';\n\n                //safari wants at least one rule in keyframes to start working\n                cssStyleElement.innerHTML += '\\n@keyframes element-queries { 0% { visibility: inherit; } }';\n                document.getElementsByTagName('head')[0].appendChild(cssStyleElement);\n                defaultCssInjected = true;\n            }\n\n            for (var i = 0, j = document.styleSheets.length; i < j; i++) {\n                try {\n                    if (document.styleSheets[i].href && 0 === document.styleSheets[i].href.indexOf('file://')) {\n                        console.warn(\"CssElementQueries: unable to parse local css files, \" + document.styleSheets[i].href);\n                    }\n\n                    readRules(document.styleSheets[i].cssRules || document.styleSheets[i].rules || document.styleSheets[i].cssText);\n                } catch (e) {\n                }\n            }\n\n            findResponsiveImages();\n        };\n\n        /**\n         * Go through all collected rules (readRules()) and attach the resize-listener.\n         * Not necessary to call it manually, since we detect automatically when new elements\n         * are available in the DOM. However, sometimes handy for dirty DOM modifications.\n         *\n         * @param {HTMLElement} container only elements of the container are considered (document.body if not set)\n         */\n        this.findElementQueriesElements = function (container) {\n            findElementQueriesElements(container);\n        };\n\n        this.update = function () {\n            this.init();\n        };\n    };\n\n    ElementQueries.update = function () {\n        ElementQueries.instance.update();\n    };\n\n    /**\n     * Removes all sensor and elementquery information from the element.\n     *\n     * @param {HTMLElement} element\n     */\n    ElementQueries.detach = function (element) {\n        if (element.elementQueriesSetupInformation) {\n            //element queries\n            element.elementQueriesSensor.detach();\n            delete element.elementQueriesSetupInformation;\n            delete element.elementQueriesSensor;\n\n        } else if (element.resizeSensorInstance) {\n            //responsive image\n\n            element.resizeSensorInstance.detach();\n            delete element.resizeSensorInstance;\n        }\n    };\n\n    ElementQueries.init = function () {\n        if (!ElementQueries.instance) {\n            ElementQueries.instance = new ElementQueries();\n        }\n\n        ElementQueries.instance.init();\n    };\n\n    var domLoaded = function (callback) {\n        /* Mozilla, Chrome, Opera */\n        if (document.addEventListener) {\n            document.addEventListener('DOMContentLoaded', callback, false);\n        }\n        /* Safari, iCab, Konqueror */\n        else if (/KHTML|WebKit|iCab/i.test(navigator.userAgent)) {\n            var DOMLoadTimer = setInterval(function () {\n                if (/loaded|complete/i.test(document.readyState)) {\n                    callback();\n                    clearInterval(DOMLoadTimer);\n                }\n            }, 10);\n        }\n        /* Other web browsers */\n        else window.onload = callback;\n    };\n\n    ElementQueries.findElementQueriesElements = function (container) {\n        ElementQueries.instance.findElementQueriesElements(container);\n    };\n\n    ElementQueries.listen = function () {\n        domLoaded(ElementQueries.init);\n    };\n\n    return ElementQueries;\n\n}));\n","'use strict';\n\n/**\n * Copyright Marc J. Schmidt. See the LICENSE file at the top-level\n * directory of this distribution and at\n * https://github.com/marcj/css-element-queries/blob/master/LICENSE.\n */\n(function (root, factory) {\n    if (typeof define === \"function\" && define.amd) {\n        define(factory);\n    } else if (typeof exports === \"object\") {\n        module.exports = factory();\n    } else {\n        root.ResizeSensor = factory();\n    }\n}(typeof window !== 'undefined' ? window : this, function () {\n\n    // Make sure it does not throw in a SSR (Server Side Rendering) situation\n    if (typeof window === \"undefined\") {\n        return null;\n    }\n    // https://github.com/Semantic-Org/Semantic-UI/issues/3855\n    // https://github.com/marcj/css-element-queries/issues/257\n    var globalWindow = typeof window != 'undefined' && window.Math == Math\n        ? window\n        : typeof self != 'undefined' && self.Math == Math\n            ? self\n            : Function('return this')();\n    // Only used for the dirty checking, so the event callback count is limited to max 1 call per fps per sensor.\n    // In combination with the event based resize sensor this saves cpu time, because the sensor is too fast and\n    // would generate too many unnecessary events.\n    var requestAnimationFrame = globalWindow.requestAnimationFrame ||\n        globalWindow.mozRequestAnimationFrame ||\n        globalWindow.webkitRequestAnimationFrame ||\n        function (fn) {\n            return globalWindow.setTimeout(fn, 20);\n        };\n\n    var cancelAnimationFrame = globalWindow.cancelAnimationFrame ||\n        globalWindow.mozCancelAnimationFrame ||\n        globalWindow.webkitCancelAnimationFrame ||\n        function (timer) {\n            globalWindow.clearTimeout(timer);\n        };\n\n    /**\n     * Iterate over each of the provided element(s).\n     *\n     * @param {HTMLElement|HTMLElement[]} elements\n     * @param {Function}                  callback\n     */\n    function forEachElement(elements, callback){\n        var elementsType = Object.prototype.toString.call(elements);\n        var isCollectionTyped = ('[object Array]' === elementsType\n            || ('[object NodeList]' === elementsType)\n            || ('[object HTMLCollection]' === elementsType)\n            || ('[object Object]' === elementsType)\n            || ('undefined' !== typeof jQuery && elements instanceof jQuery) //jquery\n            || ('undefined' !== typeof Elements && elements instanceof Elements) //mootools\n        );\n        var i = 0, j = elements.length;\n        if (isCollectionTyped) {\n            for (; i < j; i++) {\n                callback(elements[i]);\n            }\n        } else {\n            callback(elements);\n        }\n    }\n\n    /**\n    * Get element size\n    * @param {HTMLElement} element\n    * @returns {Object} {width, height}\n    */\n    function getElementSize(element) {\n        if (!element.getBoundingClientRect) {\n            return {\n                width: element.offsetWidth,\n                height: element.offsetHeight\n            }\n        }\n\n        var rect = element.getBoundingClientRect();\n        return {\n            width: Math.round(rect.width),\n            height: Math.round(rect.height)\n        }\n    }\n\n    /**\n     * Apply CSS styles to element.\n     *\n     * @param {HTMLElement} element\n     * @param {Object} style\n     */\n    function setStyle(element, style) {\n        Object.keys(style).forEach(function(key) {\n            element.style[key] = style[key];\n        });\n    }\n\n    /**\n     * Class for dimension change detection.\n     *\n     * @param {Element|Element[]|Elements|jQuery} element\n     * @param {Function} callback\n     *\n     * @constructor\n     */\n    var ResizeSensor = function(element, callback) {\n        //Is used when checking in reset() only for invisible elements\n        var lastAnimationFrameForInvisibleCheck = 0;\n\n        /**\n         *\n         * @constructor\n         */\n        function EventQueue() {\n            var q = [];\n            this.add = function(ev) {\n                q.push(ev);\n            };\n\n            var i, j;\n            this.call = function(sizeInfo) {\n                for (i = 0, j = q.length; i < j; i++) {\n                    q[i].call(this, sizeInfo);\n                }\n            };\n\n            this.remove = function(ev) {\n                var newQueue = [];\n                for(i = 0, j = q.length; i < j; i++) {\n                    if(q[i] !== ev) newQueue.push(q[i]);\n                }\n                q = newQueue;\n            };\n\n            this.length = function() {\n                return q.length;\n            }\n        }\n\n        /**\n         *\n         * @param {HTMLElement} element\n         * @param {Function}    resized\n         */\n        function attachResizeEvent(element, resized) {\n            if (!element) return;\n            if (element.resizedAttached) {\n                element.resizedAttached.add(resized);\n                return;\n            }\n\n            element.resizedAttached = new EventQueue();\n            element.resizedAttached.add(resized);\n\n            element.resizeSensor = document.createElement('div');\n            element.resizeSensor.dir = 'ltr';\n            element.resizeSensor.className = 'resize-sensor';\n\n            var style = {\n                pointerEvents: 'none',\n                position: 'absolute',\n                left: '0px',\n                top: '0px',\n                right: '0px',\n                bottom: '0px',\n                overflow: 'hidden',\n                zIndex: '-1',\n                visibility: 'hidden',\n                maxWidth: '100%'\n            };\n            var styleChild = {\n                position: 'absolute',\n                left: '0px',\n                top: '0px',\n                transition: '0s',\n            };\n\n            setStyle(element.resizeSensor, style);\n\n            var expand = document.createElement('div');\n            expand.className = 'resize-sensor-expand';\n            setStyle(expand, style);\n\n            var expandChild = document.createElement('div');\n            setStyle(expandChild, styleChild);\n            expand.appendChild(expandChild);\n\n            var shrink = document.createElement('div');\n            shrink.className = 'resize-sensor-shrink';\n            setStyle(shrink, style);\n\n            var shrinkChild = document.createElement('div');\n            setStyle(shrinkChild, styleChild);\n            setStyle(shrinkChild, { width: '200%', height: '200%' });\n            shrink.appendChild(shrinkChild);\n\n            element.resizeSensor.appendChild(expand);\n            element.resizeSensor.appendChild(shrink);\n            element.appendChild(element.resizeSensor);\n\n            var computedStyle = window.getComputedStyle(element);\n            var position = computedStyle ? computedStyle.getPropertyValue('position') : null;\n            if ('absolute' !== position && 'relative' !== position && 'fixed' !== position && 'sticky' !== position) {\n                element.style.position = 'relative';\n            }\n\n            var dirty = false;\n\n            //last request animation frame id used in onscroll event\n            var rafId = 0;\n            var size = getElementSize(element);\n            var lastWidth = 0;\n            var lastHeight = 0;\n            var initialHiddenCheck = true;\n            lastAnimationFrameForInvisibleCheck = 0;\n\n            var resetExpandShrink = function () {\n                var width = element.offsetWidth;\n                var height = element.offsetHeight;\n\n                expandChild.style.width = (width + 10) + 'px';\n                expandChild.style.height = (height + 10) + 'px';\n\n                expand.scrollLeft = width + 10;\n                expand.scrollTop = height + 10;\n\n                shrink.scrollLeft = width + 10;\n                shrink.scrollTop = height + 10;\n            };\n\n            var reset = function() {\n                // Check if element is hidden\n                if (initialHiddenCheck) {\n                    var invisible = element.offsetWidth === 0 && element.offsetHeight === 0;\n                    if (invisible) {\n                        // Check in next frame\n                        if (!lastAnimationFrameForInvisibleCheck){\n                            lastAnimationFrameForInvisibleCheck = requestAnimationFrame(function(){\n                                lastAnimationFrameForInvisibleCheck = 0;\n                                reset();\n                            });\n                        }\n\n                        return;\n                    } else {\n                        // Stop checking\n                        initialHiddenCheck = false;\n                    }\n                }\n\n                resetExpandShrink();\n            };\n            element.resizeSensor.resetSensor = reset;\n\n            var onResized = function() {\n                rafId = 0;\n\n                if (!dirty) return;\n\n                lastWidth = size.width;\n                lastHeight = size.height;\n\n                if (element.resizedAttached) {\n                    element.resizedAttached.call(size);\n                }\n            };\n\n            var onScroll = function() {\n                size = getElementSize(element);\n                dirty = size.width !== lastWidth || size.height !== lastHeight;\n\n                if (dirty && !rafId) {\n                    rafId = requestAnimationFrame(onResized);\n                }\n\n                reset();\n            };\n\n            var addEvent = function(el, name, cb) {\n                if (el.attachEvent) {\n                    el.attachEvent('on' + name, cb);\n                } else {\n                    el.addEventListener(name, cb);\n                }\n            };\n\n            addEvent(expand, 'scroll', onScroll);\n            addEvent(shrink, 'scroll', onScroll);\n\n            // Fix for custom Elements and invisible elements\n            lastAnimationFrameForInvisibleCheck = requestAnimationFrame(function(){\n                lastAnimationFrameForInvisibleCheck = 0;\n                reset();\n            });\n        }\n\n        forEachElement(element, function(elem){\n            attachResizeEvent(elem, callback);\n        });\n\n        this.detach = function(ev) {\n            // clean up the unfinished animation frame to prevent a potential endless requestAnimationFrame of reset\n            if (!lastAnimationFrameForInvisibleCheck) {\n                cancelAnimationFrame(lastAnimationFrameForInvisibleCheck);\n                lastAnimationFrameForInvisibleCheck = 0;\n            }\n            ResizeSensor.detach(element, ev);\n        };\n\n        this.reset = function() {\n            element.resizeSensor.resetSensor();\n        };\n    };\n\n    ResizeSensor.reset = function(element) {\n        forEachElement(element, function(elem){\n            elem.resizeSensor.resetSensor();\n        });\n    };\n\n    ResizeSensor.detach = function(element, ev) {\n        forEachElement(element, function(elem){\n            if (!elem) return;\n            if(elem.resizedAttached && typeof ev === \"function\"){\n                elem.resizedAttached.remove(ev);\n                if(elem.resizedAttached.length()) return;\n            }\n            if (elem.resizeSensor) {\n                if (elem.contains(elem.resizeSensor)) {\n                    elem.removeChild(elem.resizeSensor);\n                }\n                delete elem.resizeSensor;\n                delete elem.resizedAttached;\n            }\n        });\n    };\n\n    if (typeof MutationObserver !== \"undefined\") {\n        var observer = new MutationObserver(function (mutations) {\n            for (var i in mutations) {\n                if (mutations.hasOwnProperty(i)) {\n                    var items = mutations[i].addedNodes;\n                    for (var j = 0; j < items.length; j++) {\n                        if (items[j].resizeSensor) {\n                            ResizeSensor.reset(items[j]);\n                        }\n                    }\n                }\n            }\n        });\n\n        document.addEventListener(\"DOMContentLoaded\", function (event) {\n            observer.observe(document.body, {\n                childList: true,\n                subtree: true,\n            });\n        });\n    }\n\n    return ResizeSensor;\n\n}));\n","module.exports = jQuery;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","import $ from 'jquery';\n\n/**\n * Performs a REST Call\n *\n * @param {string}    endPoint - Endpoint of the REST call\n * @param {object}    data - Data to be sent in the call\n * @param {callback}  [onSuccess] - Function to be invoked if the call is successful\n * @param {callback}  [onFail] - Function to be invoked if the call fails\n *\n * @return null\n */\n\nexport function restCall( endPoint = null, data = null, onSuccess = null, onFail = null ){\n    // Define the valid endpoints\n    let validEndpoints = [ 'course_navigation', 'update_drip_date', 'update_drip_date_topic', 'get_group_courses', 'try-automator-visibility', 'get-certificates-dropdowns', 'get-groups-dropdown' ];\n\n    // Check if the endPoint parameter is a valid endpoint\n    if ( validEndpoints.includes( endPoint ) ){\n        // Do AJAX\n        $.ajax({\n            method: 'POST',\n            url:    UncannyToolkitPro.restURL + endPoint + '/',\n            data:   $.param( data ) + '&' + $.param({ doing_rest: 1 }),\n\n            // Attach Nonce the the header of the request\n            beforeSend: function( xhr ){\n                xhr.setRequestHeader( 'X-WP-Nonce', UncannyToolkitPro.nonce );\n            },\n\n            success: function( response ){\n                // Check if onSuccess\n                if ( isDefined( onSuccess ) ){\n                    // Invoke callback\n                    onSuccess( response );\n                }\n            },\n\n            statusCode: {\n                403: function(){\n                    location.reload();\n                }\n            },\n\n            fail: function ( response ){\n                if ( isDefined( onFail ) ){\n                    onFail( response );\n                }\n            },\n        });\n    }\n    else {\n        console.error( `The ${ endPoint } endPoint does not exists` );\n    }\n}\n\n/**\n * Determine if a variable is set and is not NULL\n *\n * @param  {mixed}      variable - The variable being evaluated\n * @return {boolean}    TRUE if the variable is defined\n */\n\nexport const isDefined = ( variable ) => {\n\t// Returns true if the variable is undefined\n    return typeof variable !== 'undefined' && variable !== null;\n}\n\n/**\n * Determine whether a variable is empty\n *\n * @param   {mixed}     variable - The variable being evaluated\n * @return  {boolean}   TRUE if the variable is empty\n */\n\nexport const isEmpty = ( variable ) => {\n    let response = true;\n\n    // Check if the variable is defined, otherwise is empty\n    if ( isDefined( variable ) ){\n        // Check if it's array\n        if ( variable.isArray ){\n            response = variable.length == 0;\n        }\n        else if ( isObject( variable ) ){\n            response = Object.keys( variable ).length;\n        }\n        else {\n            response = variable == '';\n        }\n    }\n\n    return response;\n}\n\n/**\n * Determine whether a variable is an object\n *\n * @param   {mixed}     variable - The variable being evaluated\n * @return  {boolean}   TRUE if the variable is an object\n */\n\nexport const isObject = ( variable ) => {\n    return typeof variable === 'object' && variable !== null;\n}\n","const ElementQueries = require( 'css-element-queries/src/ElementQueries' );\n\nimport {\n\tisDefined,\n\tisEmpty\n} from '../../common/js/utilities.js';\n\nclass CourseDashboard {\n\tconstructor(){\n\t\t// Check if the required container is defined\n\t\tif ( this.hasDashboard() ){\n\t\t\t// Init ResizeSensor\n\t\t\tElementQueries.init();\n\n\t\t\t// Get elements\n\t\t\tthis.getElements();\n\n\t\t\t// Define global settings\n\t\t\tthis.defineSettings();\n\t\t\t\n\t\t\t// Create courses using the DOM elements\n\t\t\tthis.createCourses();\n\n\t\t\t// Add function to expand and collapse all containers\n\t\t\tthis.slideAll();\n\n\t\t\t// Listen filters\n\t\t\tthis.filters();\n\t\t}\n\t}\n\n\tgetElements(){\n\t\tthis.$elements = {\n\t\t\tfilters: {\n\t\t\t\tform:    $( '#ultp-dashboard-filters-form' ),\n\t\t\t\tselects: $( '#ultp-dashboard-filters-form select' )\n\t\t\t}\n\t\t}\n\t}\n\n\tdefineSettings(){\n\t\t// Create settings\n\t\tthis.settings = {\n\t\t\tslideToggleDuration: 300\n\t\t}\n\t}\n\n\tcreateCourses(){\n\t\t// Get all courses\n\t\tconst $courses = $( '.ultp-dashboard-course' );\n\n\t\t// Create Courses\n\t\t$.each( $courses, ( index, $element ) => {\n\t\t\t// Create instance of Course\n\t\t\tnew Course( $( $element ), this.settings );\n\t\t});\n\t}\n\n\thasDashboard(){\n\t\treturn $( '.ultp-dashboard-courses' ).length > 0;\n\t}\n\n\tslideAll(){\n\t\t// Listen to the clicks on the buttons\n\t\t$( '.ultp-dashboard .ultp-dashboard-btn--expand-all' ).on( 'click', () => {\n\t\t\texpandAll();\n\t\t});\n\n\t\t$( '.ultp-dashboard .ultp-dashboard-btn--collapse-all' ).on( 'click', () => {\n\t\t\tcollapseAll();\n\t\t});\n\n\t\tconst expandAll = () => {\n\t\t\t// Get all the collapsed containers\n\t\t\tconst collapsedContainers = {\n\t\t\t\tcourses: {\n\t\t\t\t\tcontainer: '.ultp-dashboard-course--collapsed',\n\t\t\t\t\ttoggle:    '.ultp-dashboard-course__toggle-btn'\n\t\t\t\t},\n\t\t\t\tlessons: {\n\t\t\t\t\tcontainer: '.ultp-dashboard-lesson--collapsed',\n\t\t\t\t\ttoggle:    '.ultp-dashboard-lesson__toggle-btn'\n\t\t\t\t},\n\t\t\t\ttopics: {\n\t\t\t\t\tcontainer: '.ultp-dashboard-topic--collapsed',\n\t\t\t\t\ttoggle:    '.ultp-dashboard-topic__toggle-btn'\n\t\t\t\t},\n\t\t\t\tquizzes: {\n\t\t\t\t\tcontainer: '.ultp-dashboard-quizzes--collapsed',\n\t\t\t\t\ttoggle:    '.ultp-dashboard-quizzes__header-toggle-btn'\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$.each( collapsedContainers, ( index, elementType ) => {\n\t\t\t\t// Get containers\n\t\t\t\tconst $containers = $( elementType.container );\n\n\t\t\t\t// Iterate each container\n\t\t\t\t$.each( $containers, ( index, container ) => {\n\t\t\t\t\t// Get container element\n\t\t\t\t\tconst $container = $( container );\n\n\t\t\t\t\t// Get toggle button\n\t\t\t\t\tconst $toggleButton = $container.find( elementType.toggle );\n\n\t\t\t\t\t// Trigger click\n\t\t\t\t\t$toggleButton.trigger( 'click' );\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tconst collapseAll = () => {\n\t\t\t// Get all the expanded containers\n\t\t\tconst expandedContainers = {\n\t\t\t\tcourses: {\n\t\t\t\t\tcontainer: '.ultp-dashboard-course--expanded',\n\t\t\t\t\ttoggle:    '.ultp-dashboard-course__toggle-btn'\n\t\t\t\t},\n\t\t\t\tlessons: {\n\t\t\t\t\tcontainer: '.ultp-dashboard-lesson--expanded',\n\t\t\t\t\ttoggle:    '.ultp-dashboard-lesson__toggle-btn'\n\t\t\t\t},\n\t\t\t\tquizzes: {\n\t\t\t\t\tcontainer: '.ultp-dashboard-quizzes--expanded',\n\t\t\t\t\ttoggle:    '.ultp-dashboard-quizzes__header-toggle-btn'\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$.each( expandedContainers, ( index, elementType ) => {\n\t\t\t\t// Get containers\n\t\t\t\tconst $containers = $( elementType.container );\n\n\t\t\t\t// Iterate each container\n\t\t\t\t$.each( $containers, ( index, container ) => {\n\t\t\t\t\t// Get container element\n\t\t\t\t\tconst $container = $( container );\n\n\t\t\t\t\t// Get toggle button\n\t\t\t\t\tconst $toggleButton = $container.find( elementType.toggle );\n\n\t\t\t\t\t// Trigger click\n\t\t\t\t\t$toggleButton.trigger( 'click' );\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\n\tfilters(){\n\t\t// Listen to changes\n\t\tthis.$elements.filters.selects.on( 'change', () => {\n\t\t\t// Submit form\n\t\t\tthis.$elements.filters.form.trigger( 'submit' );\n\t\t});\n\t}\n}\n\nclass Course {\n\tconstructor( $container, settings ){\n\t\t// Save settings in the object's instance\n\t\tthis.dashboardSettings = settings;\n\n\t\t// Define the important CSS classes\n\t\tthis.defineCssClasses();\n\n\t\t// Get important elements from the container\n\t\tthis.getElements( $container );\n\n\t\t// Get course data\n\t\tthis.getCourseData();\n\n\t\t// Add toggle functionality\n\t\tthis.toggleCourseContent();\n\n\t\t// Create lessons using the DOM elements\n\t\tthis.createLessons();\n\n\t\t// Create quizzes using the DOM elements\n\t\tthis.createQuizzes();\n\t}\n\n\tgetCourseData(){\n\t\tthis.courseData = {\n\t\t\tcourseId:       this.$elements.container.data( 'course-id' ),\n\t\t\tstatus:         this.$elements.container.data( 'status' ),\n\t\t\thasLessons:     !! parseInt( this.$elements.container.data( 'has-lessons' ) ),\n\t\t\thasQuizzes:     !! parseInt( this.$elements.container.data( 'has-quizzes' ) ),\n\t\t\thasCertificate: !! parseInt( this.$elements.container.data( 'has-certificate' ) ),\n\t\t}\n\t}\n\n\tdefineCssClasses(){\n\t\tthis.cssClasses = {\n\t\t\ttoggle: {\n\t\t\t\tcollapsed:  'ultp-dashboard-course--collapsed',\n\t\t\t\tcollapsing: 'ultp-dashboard-course--collapsing',\n\t\t\t\texpanding:  'ultp-dashboard-course--expanding',\n\t\t\t\texpanded:   'ultp-dashboard-course--expanded',\n\t\t\t}\n\t\t}\n\n\t\tthis.cssClasses.allToggle = Object.keys( this.cssClasses.toggle ).map( item => this.cssClasses.toggle[ item ] ).join( ' ' );\n\t}\n\n\tgetElements( $container ){\n\t\tthis.$elements = {\n\t\t\tcontainer: $container,\n\t\t\ttoggleBtn: $container.find( '.ultp-dashboard-course__toggle-btn' ),\n\t\t\tcontent:   $container.find( '.ultp-dashboard-course__content' )\n\t\t}\n\t}\n\n\ttoggleCourseContent(){\n\t\t// Check if the course has lessons or quizzes\n\t\tif ( this.courseData.hasLessons || this.courseData.hasQuizzes ){\n\t\t\t// Listen to clicks on the toggle button\n\t\t\tthis.$elements.toggleBtn.on( 'click', () => {\n\t\t\t\t// Check if we have to close it or open it\n\t\t\t\tif ( this.isCollapsed() ){\n\t\t\t\t\t// As it's collapsed, we have to expand it\n\n\t\t\t\t\t// Set status\n\t\t\t\t\tthis.setToggleClass( 'expanding' );\n\n\t\t\t\t\t// Do the slideDown\n\t\t\t\t\tthis.$elements.content.hide().slideDown( this.dashboardSettings.slideToggleDuration, () => {\n\t\t\t\t\t\t// Set status\n\t\t\t\t\t\tthis.setToggleClass( 'expanded' );\n\t\t\t\t\t});\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// As it's expanded, we have to collapse it\n\n\t\t\t\t\t// Set status\n\t\t\t\t\tthis.setToggleClass( 'collapsing' );\n\n\t\t\t\t\t// Do the slideDown\n\t\t\t\t\tthis.$elements.content.show().slideUp( this.dashboardSettings.slideToggleDuration, () => {\n\t\t\t\t\t\t// Set status\n\t\t\t\t\t\tthis.setToggleClass( 'collapsed' );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tcreateLessons(){\n\t\t// Get all lessons\n\t\tconst $lessons = this.$elements.container.find( '.ultp-dashboard-lesson' );\n\n\t\t// Create Courses\n\t\t$.each( $lessons, ( index, $element ) => {\n\t\t\t// Create instance of Course\n\t\t\tnew Lesson( $( $element ), this.dashboardSettings, this.courseData );\n\t\t});\n\t}\n\n\tcreateQuizzes(){\n\t\t// Get all quizzes containers\n\t\tconst $quizzesContainers = this.$elements.container.find( '.ultp-dashboard-course__quizzes .ultp-dashboard-quizzes' );\n\n\t\t// Create Quizzes\n\t\t$.each( $quizzesContainers, ( index, $element ) => {\n\t\t\t// Create instance of Course\n\t\t\tnew Quizzes( $( $element ), this.dashboardSettings, this.courseData );\n\t\t});\n\t}\n\n\tsetToggleClass( status ){\n\t\t// First remove all the classes\n\t\tthis.$elements.container.removeClass( this.cssClasses.allToggle );\n\n\t\t// Then add the correct class\n\t\tthis.$elements.container.addClass( this.cssClasses.toggle[ status ] );\n\t}\n\n\tisCollapsed(){\n\t\t// Check if the container has the collapsed class\n\t\treturn this.$elements.container.hasClass( this.cssClasses.toggle.collapsed );\n\t}\n}\n\nclass Lesson {\n\tconstructor( $container, settings, courseData ){\n\t\t// Save settings in the object's instance\n\t\tthis.dashboardSettings = settings;\n\t\t// Save courseData\n\t\tthis.courseData = courseData;\n\n\t\t// Define the important CSS classes\n\t\tthis.defineCssClasses();\n\n\t\t// Get important elements from the container\n\t\tthis.getElements( $container );\n\n\t\t// Get lesson data\n\t\tthis.getLessonData();\n\n\t\t// Add toggle functionality\n\t\tthis.toggleLessonContent();\n\n\t\t// Create topics using the DOM elements\n\t\tthis.createTopics();\n\n\t\t// Create quizzes using the DOM elements\n\t\tthis.createQuizzes();\n\t}\n\n\tgetLessonData(){\n\t\tthis.lessonData = {\n\t\t\tcourse:         this.courseData,\n\t\t\tlessonId:       this.$elements.container.data( 'lesson-id' ),\n\t\t\tavailableOn:    ! isEmpty( this.$elements.container.data( 'available-on' ) ) ? parseInt( this.$elements.container.data( 'available-on' ) ) : null,\n\t\t\tisCompleted:    !! parseInt( this.$elements.container.data( 'is-completed' ) ),\n\t\t\tisAvailable:    !! parseInt( this.$elements.container.data( 'is-available' ) ),\n\t\t\thasTopics:      !! parseInt( this.$elements.container.data( 'has-topics' ) ),\n\t\t\thasQuizzes:     !! parseInt( this.$elements.container.data( 'has-quizzes' ) ),\n\t\t}\n\t}\n\n\tdefineCssClasses(){\n\t\tthis.cssClasses = {\n\t\t\ttoggle: {\n\t\t\t\tcollapsed:  'ultp-dashboard-lesson--collapsed',\n\t\t\t\tcollapsing: 'ultp-dashboard-lesson--collapsing',\n\t\t\t\texpanding:  'ultp-dashboard-lesson--expanding',\n\t\t\t\texpanded:   'ultp-dashboard-lesson--expanded',\n\t\t\t}\n\t\t}\n\n\t\tthis.cssClasses.allToggle = Object.keys( this.cssClasses.toggle ).map( item => this.cssClasses.toggle[ item ] ).join( ' ' );\n\t}\n\n\tgetElements( $container ){\n\t\tthis.$elements = {\n\t\t\tcontainer: $container,\n\t\t\ttoggleBtn: $container.find( '.ultp-dashboard-lesson__toggle-btn' ),\n\t\t\tcontent:   $container.find( '.ultp-dashboard-lesson__content' )\n\t\t}\n\t}\n\n\ttoggleLessonContent(){\n\t\t// Check if the lesson has topics or quizzes\n\t\tif ( this.lessonData.hasTopics || this.lessonData.hasQuizzes ){\n\t\t\t// Listen to clicks on the toggle button\n\t\t\tthis.$elements.toggleBtn.on( 'click', () => {\n\t\t\t\t// Check if we have to close it or open it\n\t\t\t\tif ( this.isCollapsed() ){\n\t\t\t\t\t// As it's collapsed, we have to expand it\n\n\t\t\t\t\t// Set status\n\t\t\t\t\tthis.setToggleClass( 'expanding' );\n\n\t\t\t\t\t// Do the slideDown\n\t\t\t\t\tthis.$elements.content.hide().slideDown( this.dashboardSettings.slideToggleDuration, () => {\n\t\t\t\t\t\t// Set status\n\t\t\t\t\t\tthis.setToggleClass( 'expanded' );\n\t\t\t\t\t});\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// As it's expanded, we have to collapse it\n\n\t\t\t\t\t// Set status\n\t\t\t\t\tthis.setToggleClass( 'collapsing' );\n\n\t\t\t\t\t// Do the slideDown\n\t\t\t\t\tthis.$elements.content.show().slideUp( this.dashboardSettings.slideToggleDuration, () => {\n\t\t\t\t\t\t// Set status\n\t\t\t\t\t\tthis.setToggleClass( 'collapsed' );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tcreateTopics(){\n\t\t// Get all topics\n\t\tconst $topics = this.$elements.container.find( '.ultp-dashboard-topic' );\n\n\t\t// Create Courses\n\t\t$.each( $topics, ( index, $element ) => {\n\t\t\t// Create instance of Course\n\t\t\tnew Topic( $( $element ), this.dashboardSettings, this.courseData, this.lessonData );\n\t\t});\n\t}\n\n\tcreateQuizzes(){\n\t\t// Get all quizzes containers\n\t\tconst $quizzesContainers = this.$elements.container.find( '.ultp-dashboard-lesson__quizzes .ultp-dashboard-quizzes' );\n\n\t\t// Create Quizzes\n\t\t$.each( $quizzesContainers, ( index, $element ) => {\n\t\t\t// Create instance of Course\n\t\t\tnew Quizzes( $( $element ), this.dashboardSettings, this.courseData, this.lessonData );\n\t\t});\n\t}\n\n\tsetToggleClass( status ){\n\t\t// First remove all the classes\n\t\tthis.$elements.container.removeClass( this.cssClasses.allToggle );\n\n\t\t// Then add the correct class\n\t\tthis.$elements.container.addClass( this.cssClasses.toggle[ status ] );\n\t}\n\n\tisCollapsed(){\n\t\t// Check if the container has the collapsed class\n\t\treturn this.$elements.container.hasClass( this.cssClasses.toggle.collapsed );\n\t}\n}\n\nclass Topic {\n\tconstructor( $container, settings, courseData, lessonData ){\n\t\t// Save settings in the object's instance\n\t\tthis.dashboardSettings = settings;\n\t\t// Save course data\n\t\tthis.courseData = courseData;\n\t\t// Save lesson data\n\t\tthis.lessonData = lessonData;\n\n\t\t// Get elements\n\t\tthis.getElements( $container );\n\n\t\t// Define the important CSS classes\n\t\tthis.defineCssClasses();\n\n\t\t// Get lesson data\n\t\tthis.getTopicData();\n\n\t\t// Add toggle functionality\n\t\tthis.toggleTopicContent();\n\t}\n\n\tgetElements( $container ){\n\t\tthis.$elements = {\n\t\t\tcontainer: $container,\n\t\t\ttoggleBtn: $container.find( '.ultp-dashboard-topic__toggle-btn' ),\n\t\t\tcontent:   $container.find( '.ultp-dashboard-topic__content' )\n\t\t}\n\t}\n\n\tgetTopicData(){\n\t\tthis.topicData = {\n\t\t\tcourse:         this.courseData,\n\t\t\tlesson:         this.lessonData,\n\t\t\ttopicId:        this.$elements.container.data( 'topic-id' ),\n\t\t\tisCompleted:    !! parseInt( this.$elements.container.data( 'is-completed' ) ),\n\t\t\thasQuizzes:     !! parseInt( this.$elements.container.data( 'has-quizzes' ) )\n\t\t}\n\n\t\tdelete this.topicData.lesson.course;\n\t}\n\n\tdefineCssClasses(){\n\t\tthis.cssClasses = {\n\t\t\ttoggle: {\n\t\t\t\tcollapsed:  'ultp-dashboard-topic--collapsed',\n\t\t\t\tcollapsing: 'ultp-dashboard-topic--collapsing',\n\t\t\t\texpanding:  'ultp-dashboard-topic--expanding',\n\t\t\t\texpanded:   'ultp-dashboard-topic--expanded',\n\t\t\t}\n\t\t}\n\n\t\tthis.cssClasses.allToggle = Object.keys( this.cssClasses.toggle ).map( item => this.cssClasses.toggle[ item ] ).join( ' ' );\n\t}\n\n\tsetToggleClass( status ){\n\t\t// First remove all the classes\n\t\tthis.$elements.container.removeClass( this.cssClasses.allToggle );\n\n\t\t// Then add the correct class\n\t\tthis.$elements.container.addClass( this.cssClasses.toggle[ status ] );\n\t}\n\n\ttoggleTopicContent(){\n\t\tconsole.log( this.topicData.hasQuizzes );\n\n\t\t// Check if the topic has topics or quizzes\n\t\tif ( this.topicData.hasQuizzes ){\n\n\t\t\tconsole.log( this.$elements.toggleBtn );\n\n\t\t\t// Listen to clicks on the toggle button\n\t\t\tthis.$elements.toggleBtn.on( 'click', () => {\n\t\t\t\t// Check if we have to close it or open it\n\t\t\t\tif ( this.isCollapsed() ){\n\t\t\t\t\t// As it's collapsed, we have to expand it\n\n\t\t\t\t\t// Set status\n\t\t\t\t\tthis.setToggleClass( 'expanding' );\n\n\t\t\t\t\t// Do the slideDown\n\t\t\t\t\tthis.$elements.content.hide().slideDown( this.dashboardSettings.slideToggleDuration, () => {\n\t\t\t\t\t\t// Set status\n\t\t\t\t\t\tthis.setToggleClass( 'expanded' );\n\t\t\t\t\t});\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// As it's expanded, we have to collapse it\n\n\t\t\t\t\t// Set status\n\t\t\t\t\tthis.setToggleClass( 'collapsing' );\n\n\t\t\t\t\t// Do the slideDown\n\t\t\t\t\tthis.$elements.content.show().slideUp( this.dashboardSettings.slideToggleDuration, () => {\n\t\t\t\t\t\t// Set status\n\t\t\t\t\t\tthis.setToggleClass( 'collapsed' );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tisCollapsed(){\n\t\t// Check if the container has the collapsed class\n\t\treturn this.$elements.container.hasClass( this.cssClasses.toggle.collapsed );\n\t}\n}\n\nclass Quizzes {\n\tconstructor( $container, settings, courseData, lessonData = false ){\n\t\t// Save settings in the object's instance\n\t\tthis.dashboardSettings = settings;\n\t\t// Save course data\n\t\tthis.courseData        = courseData;\n\t\t// Save lesson data\n\t\tthis.lessonData        = lessonData;\n\n\t\t// Define the important CSS classes\n\t\tthis.defineCssClasses();\n\n\t\t// Get important elements from the container\n\t\tthis.getElements( $container );\n\n\t\t// Add toggle functionality\n\t\tthis.toggleQuizzesContent();\n\n\t\t// Create Quiz instances\n\t\tthis.createIndividualQuizzes();\n\t}\n\n\tdefineCssClasses(){\n\t\tthis.cssClasses = {\n\t\t\tindividual:     'ultp-dashboard-quiz',\n\t\t\ttoggle: {\n\t\t\t\tcollapsed:  'ultp-dashboard-quizzes--collapsed',\n\t\t\t\tcollapsing: 'ultp-dashboard-quizzes--collapsing',\n\t\t\t\texpanding:  'ultp-dashboard-quizzes--expanding',\n\t\t\t\texpanded:   'ultp-dashboard-quizzes--expanded',\n\t\t\t}\n\t\t}\n\n\t\tthis.cssClasses.allToggle = Object.keys( this.cssClasses.toggle ).map( item => this.cssClasses.toggle[ item ] ).join( ' ' );\n\t}\n\n\tgetElements( $container ){\n\t\tthis.$elements = {\n\t\t\tcontainer: $container,\n\t\t\ttoggleBtn: $container.find( '.ultp-dashboard-quizzes__header-toggle-btn' ),\n\t\t\tcontent:   $container.find( '.ultp-dashboard-quizzes__list' )\n\t\t}\n\t}\n\n\ttoggleQuizzesContent(){\n\t\t// Listen to clicks on the toggle button\n\t\tthis.$elements.toggleBtn.on( 'click', () => {\n\t\t\t// Check if we have to close it or open it\n\t\t\tif ( this.isCollapsed() ){\n\t\t\t\t// As it's collapsed, we have to expand it\n\n\t\t\t\t// Set status\n\t\t\t\tthis.setToggleClass( 'expanding' );\n\n\t\t\t\t// Do the slideDown\n\t\t\t\tthis.$elements.content.hide().slideDown( this.dashboardSettings.slideToggleDuration, () => {\n\t\t\t\t\t// Set status\n\t\t\t\t\tthis.setToggleClass( 'expanded' );\n\t\t\t\t});\n\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// As it's expanded, we have to collapse it\n\n\t\t\t\t// Set status\n\t\t\t\tthis.setToggleClass( 'collapsing' );\n\n\t\t\t\t// Do the slideDown\n\t\t\t\tthis.$elements.content.show().slideUp( this.dashboardSettings.slideToggleDuration, () => {\n\t\t\t\t\t// Set status\n\t\t\t\t\tthis.setToggleClass( 'collapsed' );\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tsetToggleClass( status ){\n\t\t// First remove all the classes\n\t\tthis.$elements.container.removeClass( this.cssClasses.allToggle );\n\n\t\t// Then add the correct class\n\t\tthis.$elements.container.addClass( this.cssClasses.toggle[ status ] );\n\t}\n\n\tisCollapsed(){\n\t\t// Check if the container has the collapsed class\n\t\treturn this.$elements.container.hasClass( this.cssClasses.toggle.collapsed );\n\t}\n\n\tcreateIndividualQuizzes(){\n\t\t// Find quizzes\n\t\tconst $quizzes = this.$elements.container.find( `.${ this.cssClasses.individual }` );\n\n\t\t// Iterate each quiz\n\t\t$.each( $quizzes, ( index, $element ) => {\n\t\t\t// Create instance of Course\n\t\t\tnew Quiz( $( $element ), this.dashboardSettings, this.courseData, this.lessonData );\n\t\t});\n\t}\n}\n\nclass Quiz {\n\tconstructor( $container, settings, courseData, lessonData = false ){\n\t\t// Save settings in the object's instance\n\t\tthis.dashboardSettings = settings;\n\t\t// Save course data\n\t\tthis.courseData        = courseData;\n\t\t// Save lesson data. This will be false\n\t\t// if the quiz is not inside a lesson\n\t\tthis.lessonData        = lessonData;\n\n\t\t// Define the important CSS classes\n\t\tthis.defineCssClasses();\n\n\t\t// Get important elements from the container\n\t\tthis.getElements( $container );\n\n\t\t// Get quiz data\n\t\tthis.getQuizData();\n\n\t\t// Add toggle functionality\n\t\tthis.openStatistics();\n\t}\n\n\tgetQuizData(){\n\t\tthis.quizData = {\n\t\t\tcourse:      this.courseData,\n\t\t\tquizId:      this.$elements.container.data( 'quiz-id' ),\n\t\t\tisCompleted: !! parseInt( this.$elements.container.data( 'is-completed' ) ),\n\t\t\tpassed:      !! parseInt( this.$elements.container.data( 'passed' ) ),\n\t\t}\n\n\t\tif ( isDefined( this.$elements.container.data( 'lesson-id' ) ) ){\n\t\t\tthis.quizData.lesson = this.lessonData;\n\t\t\tdelete this.quizData.lesson.course;\n\t\t}\n\t}\n\n\tdefineCssClasses(){\n\t\tthis.cssClasses = {\n\t\t\tstatistics: {\n\t\t\t\tbtn:     'ultp-dashboard-btn--statistics',\n\t\t\t\tcontent: '',\n\t\t\t}\n\t\t}\n\t}\n\n\tgetElements( $container ){\n\t\tthis.$elements = {\n\t\t\tcontainer: $container,\n\t\t\tstatistics: {\n\t\t\t\tbtn:   $container.find( `.${ this.cssClasses.statistics.btn }` ),\n\t\t\t\t// content: $container.find( `.${ this.cssClasses.statistics.content }` )\n\t\t\t}\n\t\t}\n\t}\n\n\topenStatistics(){\n\t\t// Listen clicks on the statistics button\n\t\tthis.$elements.statistics.btn.on( 'click', ( event ) => {\n\t\t\t// Prevent default\n\t\t\tevent.preventDefault();\n\n\t\t\t// Open statistics\n\t\t\tconsole.log( this.quizData );\n\t\t});\n\t}\n}\n\nexport default CourseDashboard;","import {\n\tisDefined\n} from '../../common/js/utilities.js';\n\nclass CourseTimer {\n\tconstructor(){\n\t\t// Check if the user has the courseTimer activated\n\t\t// and if this is an LD post\n\t\tif ( this.isCourseTimerEnabled() && this.isLearnDashPost() ){\n\t\t\t// Set settings\n\t\t\tthis.setSettings();\n\n\t\t\t// Get elements\n\t\t\tthis.getElements();\n\n\t\t\t// Display the live timers\n\t\t\tthis.timerInterval = null;\n\t\t\tthis.initLiveTimers();\n\t\t\tthis.handleIdleEvents();\n\n\t\t\ttry {\n\t\t\t\t// Listen activity inside iframes\n\t\t\t\tthis.listenActivityInsideIframePageLoad();\n\t\t\t}\n\t\t\tcatch ( e ){ console.log( e ); }\n\n\t\t\ttry {\n\t\t\t\t// Detect if a new iframe is added to the page\n\t\t\t\tthis.listenNewIframes();\n\t\t\t}\n\t\t\tcatch ( e ){ console.log( e ); }\n\t\t}\t\n\t}\n\n\tgetElements(){\n\t\tthis.$elements = {\n\t\t\tiframes: document.querySelectorAll( '.learndash iframe' ),\n\t\t\tliveTimers: document.querySelectorAll( '.uotp-time-live' )\n\t\t}\n\t}\n\n\tsetSettings(){\n\t\tthis.settings = {\n\t\t\tevents: [\n\t\t\t\t'mousedown',\n\t\t\t\t'mousemove',\n\t\t\t\t'keypress',\n\t\t\t\t'scroll',\n\t\t\t\t'touchstart',\n\t\t\t\t'wheel'\n\t\t\t],\n\t\t\teventSettings: {\n\t\t\t\tbubbles:    true,\n\t\t\t\tcancelable: false,\n\t\t\t\tdetail:     null\n\t\t\t}\n\t\t}\n\t}\n\n\tlistenActivityInsideIframePageLoad(){\n\t\t// Iterate all iframes\n\t\tthis.$elements.iframes.forEach(( iframe ) => {\n\t\t\t// Listen activity inside each iframe\n\t\t\tthis.listenActivityInIframe( iframe );\n\t\t});\n\t}\n\n\tlistenActivityInIframe( iframe ){\n\t\ttry {\n\t\t\t// Check if the iframe loaded\n\t\t\t$( iframe ).on( 'load', () => {\n\t\t\t\t// Iterate the all the events\n\t\t\t\tthis.settings.events.forEach(( eventName ) => {\n\t\t\t\t\t// Add event listeners by iframe\n\t\t\t\t\ttry {\n\t\t\t\t\t\tiframe.contentWindow.addEventListener(\n\t\t\t\t\t\t\teventName,\n\t\t\t\t\t\t\tevent => this.triggerEvent( iframe, eventName )\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tcatch ( e ){}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\tcatch ( e ){ console.log( e ); }\n\t\t\t\n\t}\n\n\tlistenNewIframes(){\n\t\t// Create the Mutation Observer\n\t\tvar observer = new MutationObserver(( mutations ) => {\n\t\t\t// Iterate the mutations\n\t\t\tmutations.forEach(( mutation ) => {\n\t\t\t\t// Check if nodes are added\n\t\t\t\tif ( mutation.addedNodes.length > 0 ){\n\t\t\t\t\tmutation.addedNodes.forEach((node) => {\n\t\t\t\t\t\t// Check if the added node is an iframe\n\t\t\t\t\t\tif ( node.nodeName === 'IFRAME' ){\n\t\t\t\t\t\t\t// Listen activity inside the iframe\n\t\t\t\t\t\t\tthis.listenActivityInIframe( node );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n    \t});\n\n\t\t// Observer the mark as complete buttons\n\t\tobserver.observe( document.body, {\n\t\t\tchildList: true,\n\t\t\tsubtree:   true,\n\t\t\tattributeFilter: [ 'disabled' ]\n\t\t});\n\t}\n\n\ttriggerEvent( iframe, eventName ){\n\t\t// Create the event\n\t\tvar event = document.createEvent( 'CustomEvent' );\n\t\tevent.initCustomEvent(\n\t\t\teventName,\n\t\t\tthis.settings.eventSettings.bubbles,\n\t\t\tthis.settings.eventSettings.cancelable,\n\t\t\tthis.settings.eventSettings.detail\n\t\t);\n\n\t\t// Dispatch the event\n\t\tiframe.dispatchEvent( event );\n\t}\n\n\tinitLiveTimers(){\n\t\t// Iterate all the live timers\n\t\tthis.$elements.liveTimers.forEach(( timer ) => {\n\t\t\tconst $timer = $( timer );\n\t\t\t// Time is the text inside the element in seconds 00:00:00\n\t\t\tlet time = this.timeToSeconds($timer.text());\n\t\t\t// Start the timer\n\t\t\tthis.timerInterval = setInterval(() => {\n\t\t\t\ttime++;\n\t\t\t\t$timer.text(this.secondsToTime(time));\n\t\t\t}, 1000);\n\t\t});\n\t}\n\n\thandleIdleEvents() {\n\t\t$(document).on(\"idle.idleTimer\", () => {\n\t\t\t// Pause the timer\n\t\t\tclearInterval(this.timerInterval);\n\t\t});\n\t\t\n\t\t$(document).on(\"active.idleTimer\", () => {\n\t\t\t// Restart the timer\n\t\t\tthis.initLiveTimers();\n\t\t});\n\t}\n\n\t// Convert time in HH:MM:SS format to seconds\n\ttimeToSeconds(time) {\n\t\tconst [hours, minutes, seconds] = time.split(':').map(Number);\n\t\treturn hours * 3600 + minutes * 60 + seconds;\n\t}\n\n\t// Convert seconds to time in HH:MM:SS format\n\tsecondsToTime(seconds) {\n\t\tconst hours = Math.floor(seconds / 3600);\n\t\tconst minutes = Math.floor((seconds % 3600) / 60);\n\t\tconst remainingSeconds = seconds % 60;\n\t\treturn [hours, minutes, remainingSeconds].map(v => v < 10 ? '0' + v : v).join(':');\n\t}\n\n\tisCourseTimerEnabled(){\n\t\treturn isDefined( window.uoTimer );\n\t}\n\n\tisLearnDashPost(){\n\t\treturn isDefined( document.querySelector( '.learndash' ) );\n\t}\n}\n\nexport default CourseTimer;","import {\n\trestCall,\n\tisDefined\n} from '../../common/js/utilities.js';\n\nclass LazyCourseNavigation {\n\tconstructor(){\n\t\t// Get elements\n\t\tthis.getElements();\n\n\t\t// Check if we have to execute the code\n\t\tif ( this.isLazyCourseNavigation() ){\n\t\t\t// Get course navigation\n\t\t\tthis.getCourseNavigation(( courseNavigation ) => {\n\t\t\t\t// Set course navigation\n\t\t\t\tthis.setCourseNavigation( courseNavigation );\n\t\t\t});\n\t\t}\n\t}\n\n\tgetElements(){\n\t\t// Create elements property\n\t\tthis.$elements = {\n\t\t\tcontainer: $( '.ultp-lazy-course-navigation' )\n\t\t}\n\t}\n\n\tgetCourseNavigation( callback ){\n\t\t// Do AJAX request\n\t\trestCall( 'course_navigation', {\n\t\t\tcourse_id: UncannyToolkitProLazyCourseNavigation.course_id,\n            lesson_id: UncannyToolkitProLazyCourseNavigation.lesson_id,\n            topic_id: UncannyToolkitProLazyCourseNavigation.topic_id,\n            nonce: UncannyToolkitProLazyCourseNavigation.nonce\n\t\t}, ( response ) => {\n\t\t\t// On success\n\t\t\tcallback( response );\n\t\t}, () => {\n\t\t\t// On fail\n\t\t\tconsole.error( `We couldn't load the course navigation content.` );\n\t\t});\n\t}\n\n\tsetCourseNavigation( courseNavigation ){\n\t\t// Remove loading class\n\t\tthis.$elements.container.removeClass( 'ultp-lazy-course-navigation--loading' );\n\n\t\t// Set the content in each container\n\t\t$.each( this.$elements.container, ( index, container ) => {\n\t\t\t// Get jQuery DOM element\n\t\t\tconst $container = $( container );\n\n\t\t\t// Set the content\n\t\t\t$container.html( courseNavigation.html );\n\t\t});\n\t}\n\n\tisLazyCourseNavigation(){\n\t\treturn this.$elements.container.length > 0 && isDefined( UncannyToolkitProLazyCourseNavigation );\n\t}\n}\n\nexport default LazyCourseNavigation;","import {\n\tisDefined, restCall\n} from '../../common/js/utilities.js';\n\nclass DownloadCertificates {\n\tconstructor(){\n\t\t// Invoke the methods only if the page contains the Download Certificates shortcode\n\t\tif ( this.hasShortcode ) {\n\t\t\ttry {\n\t\t\t\tthis.getElements();\n\t\t\t\tthis.getCertificatesType();\n\t\t\t\tthis.getGroupsDropdown();\n\t\t\t\tthis.getCoursesDropdown();\n\t\t\t\tthis.getQuizDropdown();\n\t\t\t\tthis.setGenCronJob();\n\t\t\t}\n\t\t\tcatch ( e ){ console.log( e ); }\n\t\t}\n\t}\n\n\tgetElements(){\n\t\tthis.$elements = {\n\t\t\tfilters: {\n\t\t\t\ttypeWrapper: document.getElementById( 'ultp-download-certificates-filter-type' ),\n\t\t\t\tuo_cert_type: $('#uo_cert_type'),\n\t\t\t\tval_uo_cert_type: $('#val_uo_cert_type'),\n\n\t\t\t\tgroupWrapper: document.getElementById( 'ultp-download-certificates-filter-group' ),\n\t\t\t\tuo_groups: $('#uo_groups'),\n\t\t\t\tuo_group_block: document.querySelector('.uo-groups-dropdowns-certificates'),\n\t\t\t\tval_uo_groups: $('#val_uo_group'),\n\n\t\t\t\tcourseWrapper: document.getElementById( 'ultp-download-certificates-filter-course' ),\n\t\t\t\tuo_courses: $('#uo_courses'),\n\t\t\t\tuo_courses_block: document.querySelector('.uo-courses-dropdowns-certificates'),\n\t\t\t\tval_uo_courses: $('#val_uo_course'),\n\n\t\t\t\tuo_quizzes: $('#uo_quizzes'),\n\t\t\t\tuo_quizzes_block: document.querySelector('.uo-quizzes-dropdowns-certificates'),\n\t\t\t\tval_uo_quizzes: $('#val_uo_quiz'),\n\n\t\t\t\tuo_submit_btn_html: document.querySelector('.uo-generate-certificates-btn'),\n\t\t\t\tuo_submit_btn: $('#uo_generate_certificates_submit'),\n\t\t\t\tuo_current_user: $('#uo_current_user'),\n\t\t\t\tuo_download_url: $('#uo_download_url'),\n\t\t\t\tuo_clear_previous_runs: $('#uo_clear_previous_runs')\n\t\t\t}\n\t\t};\n\t\tthis.$elements.filters.uo_cert_type.select2();\n\t}\n\n\tsetGenCronJob(){\n\t\tthis.$elements.filters.uo_submit_btn.on( 'click', ( e ) => {\n\t\t\tconst cert_type = this.$elements.filters.uo_cert_type.val();\n\n\t\t\tdocument.getElementById('uo_generate_certificates_submit').disabled = true;\n\t\t\tthis.$elements.filters.uo_submit_btn_html.classList.add('uo_clicked_btn');\n\n\t\t\tvar group_id = this.$elements.filters.uo_groups.val();\n\t\t\tvar course_id = this.$elements.filters.uo_courses.val();\n\t\t\tvar quiz_id = this.$elements.filters.uo_quizzes.val();\n\t\t\tvar download_url = this.$elements.filters.uo_download_url.val();\n\t\t\tvar clear_previous_runs = ( null !== this.$elements.filters.uo_clear_previous_runs && this.$elements.filters.uo_clear_previous_runs.is(':checked') ) ? 'yes' : 'no';\n\n\t\t\tconst data = new FormData();\n\t\t\tdata.append( 'action', 'set_cron_job' );\n\t\t\tdata.append( 'certificate_type', cert_type );\n\t\t\tdata.append( 'group_id', group_id );\n\t\t\tdata.append( 'user_id', this.$elements.filters.uo_current_user.val() );\n\t\t\tdata.append( 'course', course_id );\n\t\t\tdata.append( 'quiz', quiz_id );\n\t\t\tdata.append( 'download_url', download_url );\n\t\t\tdata.append( 'clear_previous_runs', clear_previous_runs );\n\n\t\t\tdata.append( 'val_cert_type', cert_type );\n\t\t\tdata.append( 'val_group_id', group_id );\n\t\t\tdata.append( 'val_course', course_id );\n\t\t\tdata.append( 'val_quiz', quiz_id );\n\n\t\t\tfetch(uoCertificates.rest_url+'set-cron-job', {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tbody: data\n\t\t\t})\n\t\t\t\t.then((response) => response.json())\n\t\t\t\t.then((data) => {\n\t\t\t\t\tconsole.log(data);\n\t\t\t\t\tif( data.success === true ) {\n\t\t\t\t\t\tdocument.getElementById('uo_certificatesdropdown').innerHTML = '<div class=\"uo-certificates-success\">'+uoCertificates.uo_success_msg+'</div>';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdocument.getElementById('uo_certificatesdropdown').innerHTML = '<div class=\"uo-certificates-error\">'+uoCertificates.uo_failure_msg+'</div>';\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error(error);\n\t\t\t\t});\n\t\t});\n\t}\n\n\tgetCertificatesType() {\n\t\t// Listen to changes on certificate type\n\t\tthis.$elements.filters.uo_cert_type.on( 'change', ( e ) => {\n\t\t\tthis.clearAllErrors();\n\n\t\t\t// Hide children dropdowns\n\t\t\tthis.uoHideBlock( this.$elements.filters.uo_group_block );\n\t\t\tthis.uoHideBlock( this.$elements.filters.uo_courses_block );\n\t\t\tthis.uoHideBlock( this.$elements.filters.uo_quizzes_block );\n\t\t\tthis.uoHideBlock( this.$elements.filters.uo_submit_btn_html );\n\n\t\t\tconst cert_type = this.$elements.filters.uo_cert_type.val();\n\t\t\tconst data = new FormData();\n\t\t\tdata.append( 'action', 'get_uo_groups' );\n\t\t\tif( 'group' === cert_type ){\n\t\t\t\tdata.append( 'certificates', 'yes' );\n\t\t\t} else {\n\t\t\t\tdata.append( 'certificates', 'no' );\n\t\t\t}\n\t\t\tdata.append( 'uo_current_user', uoCertificates.uo_current_user_id );\n\t\t\tdata.append( 'uo_cert_type', cert_type );\n\t\t\tthis.$elements.filters.val_uo_cert_type.val( cert_type );\n\n\t\t\t// Add loading animation\n\t\t\tthis.$elements.filters.typeWrapper.classList.add( 'ultp-download-certificates-filter--loading' );\n\n\t\t\tfetch(uoCertificates.rest_url+'get-groups-dropdown', {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tbody: data\n\t\t\t})\n\t\t\t\t.then((response) => response.json())\n\t\t\t\t.then((data) => {\n\n\t\t\t\t\t// Remove loading animation\n\t\t\t\t\tthis.$elements.filters.typeWrapper.classList.remove( 'ultp-download-certificates-filter--loading' );\n\n\t\t\t\t\tif ( ! data.success || ! Array.isArray( data.data ) || data.data.length === 0 ) {\n\n\t\t\t\t\t\tthis.uoShowErrorBlock(\n\t\t\t\t\t\t\tthis.$elements.filters.typeWrapper, \n\t\t\t\t\t\t\ttypeof data.msg !== 'undefined' ? data.msg : uoCertificates.i18n.empty\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Show the child dropdown\n\t\t\t\t\tthis.uoDropDownVisibility( cert_type );\n\n\t\t\t\t\tconst groups = [];\n\t\t\t\t\tgroups.push('<option value=\"\">' + uoCertificates.groups_label + '</option>');\n\t\t\t\t\tdata.data.forEach( group => groups.push( '<option value=\"'+group.value+'\">'+group.text+'</option>' ) );\n\t\t\t\t\tthis.$elements.filters.uo_groups.html( groups );\n\t\t\t\t\tif( cert_type === 'group' ){\n\t\t\t\t\t\t// this.$elements.filters.uo_groups.find('option').get(0).remove();\n\t\t\t\t\t\t// document.getElementById(\"uo_groups\").options[0].remove();\n\t\t\t\t\t\t// this.uoShowBlock(this.$elements.filters.uo_submit_btn_html);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.$elements.filters.uo_groups.select2();\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\t// Remove loading animation\n\t\t\t\t\tthis.$elements.filters.typeWrapper.classList.remove( 'ultp-download-certificates-filter--loading' );\n\n\t\t\t\t\tconsole.error(error);\n\t\t\t\t});\n\n\t\t});\n\t}\n\n\tgetGroupsDropdown() {\n\t\t// Listen to changes on certificate type\n\t\tthis.$elements.filters.uo_groups.on( 'change', ( e ) => {\n\t\t\tthis.clearAllErrors();\n\n\t\t\tthis.uoHideBlock( this.$elements.filters.uo_courses_block );\n\t\t\tthis.uoHideBlock( this.$elements.filters.uo_quizzes_block );\n\t\t\tthis.uoHideBlock( this.$elements.filters.uo_submit_btn_html );\n\n\t\t\tconst cert_type = this.$elements.filters.uo_cert_type.val();\n\t\t\tconst data = new FormData();\n\t\t\tvar group_id = e.target.value;\n\t\t\tthis.$elements.filters.val_uo_groups.val( group_id );\n\n\t\t\tif( '' === group_id ) {\n\t\t\t\tthis.uoHideBlock(this.$elements.filters.uo_submit_btn_html);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif( 'group' === cert_type ) {\n\t\t\t\tthis.uoShowBlock(this.$elements.filters.uo_submit_btn_html);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif( 'course' === cert_type ){\n\t\t\t\tdata.append( 'certificates', 'yes' );\n\t\t\t} else {\n\t\t\t\tdata.append( 'certificates', 'no' );\n\t\t\t}\n\n\t\t\tdata.append( 'action', 'get_uo_courses' );\n\t\t\tdata.append( 'group_id', group_id );\n\t\t\tdata.append( 'uo_current_user', uoCertificates.uo_current_user_id );\n\n\t\t\t// Add loading animation\n\t\t\tthis.$elements.filters.groupWrapper.classList.add( 'ultp-download-certificates-filter--loading' );\n\n\t\t\tfetch(uoCertificates.rest_url+'get-courses-dropdown', {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tbody: data\n\t\t\t})\n\t\t\t\t.then((response) => response.json())\n\t\t\t\t.then((data) => {\n\t\t\t\t\t// Remove loading animation\n\t\t\t\t\tthis.$elements.filters.groupWrapper.classList.remove( 'ultp-download-certificates-filter--loading' );\n\n\t\t\t\t\tif ( ! data.success || ! Array.isArray( data.data ) || data.data.length === 0 ) {\n\n\t\t\t\t\t\tthis.uoShowErrorBlock(\n\t\t\t\t\t\t\tthis.$elements.filters.uo_group_block, \n\t\t\t\t\t\t\ttypeof data.msg !== 'undefined' ? data.msg : uoCertificates.i18n.empty\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t( 'course' === cert_type ? this.uoHideBlock( this.$elements.filters.uo_courses_block ) :  this.uoShowBlock( this.$elements.filters.uo_courses_block ) );\n\n\t\t\t\t\tconst courses = [];\n\t\t\t\t\tcourses.push( '<option value=\"\">'+uoCertificates.course_label+'</option>' );\n\t\t\t\t\tdata.data.forEach( course => courses.push( '<option value=\"'+course.ID+'\">'+course.course_title+'</option>' ) );\n\t\t\t\t\tthis.$elements.filters.uo_courses.html( courses );\n\t\t\t\t\tthis.uoShowBlock( this.$elements.filters.uo_courses_block );\n\t\t\t\t\tthis.$elements.filters.uo_courses.select2();\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\t// Remove loading animation\n\t\t\t\t\tthis.$elements.filters.groupWrapper.classList.remove( 'ultp-download-certificates-filter--loading' );\n\n\t\t\t\t\tconsole.error(error);\n\t\t\t\t});\n\n\t\t\tthis.uoDropDownVisibility( cert_type );\n\n\t\t});\n\t}\n\n\tgetCoursesDropdown() {\n\t\t// Listen to changes on certificate type\n\t\tthis.$elements.filters.uo_courses.on( 'change', ( e ) => {\n\t\t\tthis.clearAllErrors();\n\t\t\t\n\t\t\tthis.uoHideBlock( this.$elements.filters.uo_quizzes_block );\n\t\t\tthis.uoHideBlock( this.$elements.filters.uo_submit_btn_html );\n\n\t\t\tconst cert_type = this.$elements.filters.uo_cert_type.val();\n\t\t\tconst data = new FormData();\n\t\t\tvar course_id = parseInt(e.target.value);\n\t\t\tvar group_id = this.$elements.filters.val_uo_groups.val();\n\t\t\tthis.$elements.filters.val_uo_courses.val( course_id );\n\n\t\t\tif( 'course' === cert_type ) {\n\t\t\t\tthis.uoShowBlock(this.$elements.filters.uo_submit_btn_html);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdata.append( 'action', 'get_uo_quizzes' );\n\t\t\tdata.append( 'course_id', course_id );\n\t\t\tdata.append( 'uo_current_user', uoCertificates.uo_current_user_id );\n\n\t\t\tif( 'quiz' === cert_type ) {\n\t\t\t\tdata.append('certificates', 'yes');\n\t\t\t}\n\n\t\t\t// Add loading animation\n\t\t\tthis.$elements.filters.courseWrapper.classList.add( 'ultp-download-certificates-filter--loading' );\n\n\t\t\tfetch(uoCertificates.rest_url+'get-quiz-dropdown', {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tbody: data\n\t\t\t})\n\t\t\t\t.then((response) => response.json())\n\t\t\t\t.then((data) => {\n\t\t\t\t\t// Remove loading animation\n\t\t\t\t\tthis.$elements.filters.courseWrapper.classList.remove( 'ultp-download-certificates-filter--loading' );\n\n\t\t\t\t\tif ( ! data.success || ! Array.isArray( data.data ) || data.data.length === 0 ) {\n\n\t\t\t\t\t\tthis.uoShowErrorBlock(\n\t\t\t\t\t\t\tthis.$elements.filters.courseWrapper, \n\t\t\t\t\t\t\ttypeof data.msg !== 'undefined' ? data.msg : uoCertificates.i18n.empty\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t( 'quiz' === cert_type ? this.uoShowBlock( this.$elements.filters.uo_quizzes_block ) :  this.uoHideBlock( this.$elements.filters.uo_quizzes_block ) );\n\t\t\t\t\t\n\t\t\t\t\tconst quizzes = [];\n\t\t\t\t\tquizzes.push( '<option value=\"\">'+uoCertificates.quiz_label+'</option>' );\n\t\t\t\t\tif( 'quiz' === cert_type ){\n\t\t\t\t\t\tquizzes.push( '<option value=\"any\">'+uoCertificates.any_quiz_label+'</option>' );\n\t\t\t\t\t}\n\t\t\t\t\tdata.data.forEach( quiz => quizzes.push( '<option value=\"'+quiz.ID+'\">'+quiz.quiz_title+'</option>' ) );\n\t\t\t\t\tthis.$elements.filters.uo_quizzes.html( quizzes );\n\t\t\t\t\tthis.$elements.filters.uo_quizzes.select2();\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\t// Remove loading animation\n\t\t\t\t\tthis.$elements.filters.courseWrapper.classList.remove( 'ultp-download-certificates-filter--loading' );\n\t\t\t\t\t\n\t\t\t\t\tconsole.error(error);\n\t\t\t\t});\n\n\t\t});\n\t}\n\n\tgetQuizDropdown(){\n\t\t// Listen to changes on certificate type\n\t\tthis.$elements.filters.uo_quizzes.on( 'change', ( e ) => {\n\t\t\tthis.clearAllErrors();\n\n\t\t\tvar quiz_id = parseInt(e.target.value);\n\t\t\tthis.$elements.filters.val_uo_quizzes.val( quiz_id );\n\n\t\t\tif( '' !== e.target.value ){\n\t\t\t\tthis.uoShowBlock(this.$elements.filters.uo_submit_btn_html);\n\t\t\t} else {\n\t\t\t\tthis.uoHideBlock(this.$elements.filters.uo_submit_btn_html);\n\t\t\t}\n\n\t\t});\n\t}\n\n\tuoDropDownVisibility( cert_type = '' ) {\n\t\tif( '-' == cert_type ) {\n\t\t\tthis.uoHideBlock( this.$elements.filters.uo_group_block );\n\t\t\tthis.uoHideBlock( this.$elements.filters.uo_courses_block );\n\t\t\tthis.uoHideBlock( this.$elements.filters.uo_quizzes_block );\n\t\t}\n\t\tthis.uoShowBlock( this.$elements.filters.uo_group_block );\n\t\tthis.uoHideBlock( this.$elements.filters.uo_courses_block );\n\t\tthis.uoHideBlock( this.$elements.filters.uo_quizzes_block );\n\t\tthis.uoHideBlock(this.$elements.filters.uo_submit_btn_html);\n\t}\n\n\tuoShowBlock( element ){\n\t\telement.classList.remove( 'ultp-download-certificates-filter--hidden' );\n\t}\n\n\tuoShowErrorBlock( $parent, message = '' ){\n\t\tif ( ! $parent ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( ! $parent.querySelector( '.ultp-download-certificates-dropdowns-error' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$parent.querySelector( '.ultp-download-certificates-dropdowns-error' ).innerText = message;\n\t}\n\n\tclearAllErrors() {\n\t\tdocument.querySelectorAll( '.ultp-download-certificates-dropdowns-error' ).forEach( $wrapper => $wrapper.innerText = '' );\n\t}\n\n\tuoHideBlock( element ){\n\t\telement.classList.add( 'ultp-download-certificates-filter--hidden' );\n\t}\n\n\t/**\n\t * Populates the groups dropdown\n\t */\n\tpopulateGroupsDropdown() {\n\n\t\t// Do REST call to get the groups\n\t\trestCall(\n\t\t\t'get-groups-dropdown',\n\n\t\t\t// Data\n\t\t\t{\n\t\t\t\taction: 'get_uo_groups',\n\t\t\t\tcertificates: this.$dropdownType.value == 'group' ? 'yes' : 'no',\n\t\t\t\tuo_current_user: uoCertificates.uo_current_user_id,\n\t\t\t\ttype: this.$elements.filters.uo_cert_type.val(),\n\t\t\t},\n\n\t\t\t// On success\n\t\t\t( response ) => {\n\t\t\t\t// Check if it was successful\n\t\t\t\tthis.populateDropdown( this.$dropdownGroup, response.data );\n\t\t\t},\n\n\t\t\t// On fail\n\t\t\t( e ) => {\n\t\t\t\tconsole.error( e );\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * Populates a dropdown\n\t *\n\t * @param {Node} $dropdown The select node\n\t * @param {Array} options The options\n\t * @param {Boolean} triggerChange Whether we should trigger the change event\n\t */\n\tpopulateDropdown( $dropdown, options = [], triggerChange = true ) {\n\t\t// Remove all the options\n\t\t$dropdown.innerHTML = '';\n\n\t\t// Create the options\n\t\toptions.forEach( option => $dropdown.insertAdjacentHTML( 'beforeEnd', `\n\t\t\t<option value=\"${ option.value }\">\n\t\t\t\t${ option.text }\n\t\t\t</option>\n\t\t` ) );\n\n\t\t// Trigger change event\n\t\tif ( triggerChange ) {\n\t\t\t$dropdown.dispatchEvent( new Event( 'change' ) );\n\t\t}\n\t}\n\n\t/**\n\t * Returns the \"Type\" dropdown\n\t *\n\t * @returns {Node} The type dropdown\n\t */\n\tget $dropdownType() {\n\t\treturn document.getElementById( 'ultp-download-certificates-type' );\n\t}\n\n\t/**\n\t * Returns the \"Group\" dropdown\n\t *\n\t * @returns {Node} The groups dropdown\n\t */\n\tget $dropdownGroup() {\n\t\treturn document.getElementById( 'ultp-download-certificates-group' );\n\t}\n\n\t/**\n\t * Returns the \"Course\" dropdown\n\t *\n\t * @returns {Node} The courses dropdown\n\t */\n\tget $dropdownCourse() {\n\t\treturn document.getElementById( 'ultp-download-certificates-course' );\n\t}\n\n\t/**\n\t * Returns the \"Quiz\" dropdown\n\t *\n\t * @returns {Node} The quizzes dropdown\n\t */\n\tget $dropdownQuiz() {\n\t\treturn document.getElementById( 'ultp-download-certificates-quiz' );\n\t}\n\n\t/**\n\t * Check if the page contains the Download Certificates shortcode\n\t */\n\tget hasShortcode() {\n\t\treturn isDefined( document.querySelector( '.ultp-download-certificates' ) );\n\t}\n}\n\nexport default DownloadCertificates;\n","import './scss/main.scss';\n\nimport CourseDashboard      from './js/course-dashboard.js';\nimport CourseTimer          from './js/course-timer.js';\nimport LazyCourseNavigation from './js/lazy-course-navigation.js';\nimport DownloadCertificates from './js/download-certificates.js';\n\n// Do on DOM ready\ndocument.addEventListener( 'DOMContentLoaded', () => {\n\tnew CourseDashboard();\n\tnew CourseTimer();\n\tnew LazyCourseNavigation();\n\tnew DownloadCertificates();\n});\n"],"names":["window","ResizeSensor","ElementQueries","cssStyleElement","allQueries","idToSelectorMapping","getEmSize","element","document","documentElement","fontSize","getComputedStyle","parseFloat","convertToPx","value","numbers","split","units","length","clientWidth","clientHeight","vw","vh","chooser","Math","SetupInformation","id","key","option","elementSize","actualValue","attrValues","attrValue","attrName","this","attributes","call","getBoundingClientRect","width","offsetWidth","height","offsetHeight","rect","round","getElementSize","hasOwnProperty","property","mode","indexOf","k","setAttribute","substr","removeAttribute","setupElement","elementQueriesSetupInformation","elementQueriesSensor","queueQuery","selector","innerHTML","push","getQuery","container","query","querySelectorAll","bind","$$","jQuery","attachResponsiveImage","children","rules","sources","defaultImageId","lastActiveImage","loadedImages","i","tagName","toLowerCase","minWidth","getAttribute","src","rule","style","display","check","imageToDisplay","image","Image","onload","resizeSensorInstance","regex","attrRegex","extractQuery","css","match","smatch","attrs","attrMatch","replace","exec","readRules","j","type","selectorText","cssText","cssRules","styleSheet","defaultCssInjected","init","animationStart","body","addEventListener","e","target","styles","animationName","getPropertyValue","resizeSensor","parseInt","createElement","getElementsByTagName","appendChild","styleSheets","href","console","warn","elements","findResponsiveImages","findElementQueriesElements","update","instance","detach","listen","callback","test","navigator","userAgent","DOMLoadTimer","setInterval","readyState","clearInterval","domLoaded","globalWindow","self","Function","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","fn","setTimeout","cancelAnimationFrame","mozCancelAnimationFrame","webkitCancelAnimationFrame","timer","clearTimeout","forEachElement","elementsType","Object","prototype","toString","isCollectionTyped","Elements","setStyle","keys","forEach","lastAnimationFrameForInvisibleCheck","EventQueue","q","add","ev","sizeInfo","remove","newQueue","attachResizeEvent","resized","resizedAttached","dir","className","pointerEvents","position","left","top","right","bottom","overflow","zIndex","visibility","maxWidth","styleChild","transition","expand","expandChild","shrink","shrinkChild","computedStyle","dirty","rafId","size","lastWidth","lastHeight","initialHiddenCheck","reset","scrollLeft","scrollTop","resetSensor","onResized","onScroll","addEvent","el","name","cb","attachEvent","elem","contains","removeChild","MutationObserver","observer","mutations","items","addedNodes","event","observe","childList","subtree","module","exports","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","obj","prop","restCall","endPoint","arguments","data","onSuccess","onFail","includes","$","method","url","UncannyToolkitPro","restURL","doing_rest","beforeSend","xhr","setRequestHeader","nonce","success","response","isDefined","statusCode","location","reload","fail","error","concat","variable","isObject","_typeof","require","CourseDashboard","_createClass","_classCallCheck","hasDashboard","getElements","defineSettings","createCourses","slideAll","filters","$elements","form","selects","settings","slideToggleDuration","_this","$courses","each","index","$element","Course","on","expandAll","collapseAll","courses","toggle","lessons","topics","quizzes","elementType","$containers","find","trigger","_this2","$container","dashboardSettings","defineCssClasses","getCourseData","toggleCourseContent","createLessons","createQuizzes","courseData","courseId","status","hasLessons","hasQuizzes","hasCertificate","_this3","cssClasses","collapsed","collapsing","expanding","expanded","allToggle","map","item","join","toggleBtn","content","_this4","isCollapsed","setToggleClass","hide","slideDown","show","slideUp","_this5","$lessons","Lesson","_this6","$quizzesContainers","Quizzes","removeClass","addClass","hasClass","getLessonData","toggleLessonContent","createTopics","lessonData","course","lessonId","availableOn","isArray","isCompleted","isAvailable","hasTopics","_this7","_this8","_this9","$topics","Topic","_this10","getTopicData","toggleTopicContent","topicData","lesson","topicId","_this11","_this12","log","toggleQuizzesContent","createIndividualQuizzes","_this13","individual","_this14","_this15","$quizzes","Quiz","getQuizData","openStatistics","quizData","quizId","passed","statistics","btn","_this16","preventDefault","CourseTimer","isCourseTimerEnabled","isLearnDashPost","setSettings","timerInterval","initLiveTimers","handleIdleEvents","listenActivityInsideIframePageLoad","listenNewIframes","iframes","liveTimers","events","eventSettings","bubbles","cancelable","detail","iframe","listenActivityInIframe","eventName","contentWindow","triggerEvent","mutation","node","nodeName","attributeFilter","createEvent","initCustomEvent","dispatchEvent","$timer","time","timeToSeconds","text","secondsToTime","_time$split$map2","Number","seconds","floor","v","uoTimer","querySelector","LazyCourseNavigation","isLazyCourseNavigation","getCourseNavigation","courseNavigation","setCourseNavigation","course_id","UncannyToolkitProLazyCourseNavigation","lesson_id","topic_id","html","DownloadCertificates","hasShortcode","getCertificatesType","getGroupsDropdown","getCoursesDropdown","getQuizDropdown","setGenCronJob","typeWrapper","getElementById","uo_cert_type","val_uo_cert_type","groupWrapper","uo_groups","uo_group_block","val_uo_groups","courseWrapper","uo_courses","uo_courses_block","val_uo_courses","uo_quizzes","uo_quizzes_block","val_uo_quizzes","uo_submit_btn_html","uo_submit_btn","uo_current_user","uo_download_url","uo_clear_previous_runs","select2","cert_type","val","disabled","classList","group_id","quiz_id","download_url","clear_previous_runs","is","FormData","append","fetch","uoCertificates","rest_url","then","json","uo_success_msg","uo_failure_msg","clearAllErrors","uoHideBlock","uo_current_user_id","Array","uoDropDownVisibility","groups","groups_label","group","uoShowErrorBlock","msg","i18n","empty","uoShowBlock","course_label","ID","course_title","quiz_label","any_quiz_label","quiz","quiz_title","$parent","message","innerText","$wrapper","action","certificates","$dropdownType","populateDropdown","$dropdownGroup","$dropdown","options","triggerChange","insertAdjacentHTML","Event"],"sourceRoot":""}