{"version":3,"file":"utilities.min.js","sources":["../../../../css/bootstrap-accessibility/js/bootstrap-accessibility.js","../../../../js/globalization.js","../../../../js/admin/quiz/results.js"],"sourcesContent":["(function($) { \r\n \"use strict\"; \r\n\r\n // GENERAL UTILITY FUNCTIONS\r\n // ===============================\r\n \r\n var uniqueId = function(prefix) {\r\n return (prefix || 'ui-id') + '-' + Math.floor((Math.random()*1000)+1)\r\n }\r\n\r\n \r\n var removeMultiValAttributes = function (el, attr, val) {\r\n var describedby = (el.attr( attr ) || \"\").split( /\\s+/ )\r\n , index = $.inArray(val, describedby)\r\n if ( index !== -1 ) {\r\n describedby.splice( index, 1 )\r\n }\r\n describedby = $.trim( describedby.join( \" \" ) )\r\n if (describedby ) {\r\n el.attr( attr, describedby )\r\n } else {\r\n el.removeAttr( attr )\r\n }\r\n }\r\n\r\n// selectors Courtesy: https://github.com/jquery/jquery-ui/blob/master/ui/focusable.js and tabbable.js\r\n/*\r\nCopyright jQuery Foundation and other contributors, https://jquery.org/\r\n\r\nThis software consists of voluntary contributions made by many\r\nindividuals. For exact contribution history, see the revision history\r\navailable at https://github.com/jquery/jquery-ui\r\n\r\nThe following license applies to all parts of this software except as\r\ndocumented below:\r\n\r\n====\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining\r\na copy of this software and associated documentation files (the\r\n\"Software\"), to deal in the Software without restriction, including\r\nwithout limitation the rights to use, copy, modify, merge, publish,\r\ndistribute, sublicense, and/or sell copies of the Software, and to\r\npermit persons to whom the Software is furnished to do so, subject to\r\nthe following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be\r\nincluded in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n\r\n====\r\n\r\nCopyright and related rights for sample code are waived via CC0. Sample\r\ncode is defined as all source code contained within the demos directory.\r\n\r\nCC0: http://creativecommons.org/publicdomain/zero/1.0/\r\n\r\n====\r\n*/\r\n\r\n var focusable = function (element, isTabIndexNotNaN) {\r\n var map, mapName, img,\r\n nodeName = element.nodeName.toLowerCase();\r\n if ( \"area\" === nodeName ) {\r\n map = element.parentNode;\r\n mapName = map.name;\r\n if ( !element.href || !mapName || map.nodeName.toLowerCase() !== \"map\" ) {\r\n return false;\r\n }\r\n img = $( \"img[usemap='#\" + mapName + \"']\" )[ 0 ];\r\n return !!img && visible( img );\r\n }\r\n return ( /input|select|textarea|button|object/.test( nodeName ) ?\r\n !element.disabled :\r\n \"a\" === nodeName ?\r\n element.href || isTabIndexNotNaN :isTabIndexNotNaN) && visible( element ); // the element and all of its ancestors must be visible \r\n }\r\n var visible = function ( element ) {\r\n return $.expr.filters.visible( element ) &&\r\n !$( element ).parents().addBack().filter(function() {\r\n return $.css( this, \"visibility\" ) === \"hidden\";\r\n }).length;\r\n }\r\n\r\n $.extend( $.expr[ \":\" ], {\r\n data: $.expr.createPseudo ?\r\n $.expr.createPseudo(function( dataName ) {\r\n return function( elem ) {\r\n return !!$.data( elem, dataName );\r\n };\r\n }) :\r\n // support: jQuery <1.8\r\n function( elem, i, match ) {\r\n return !!$.data( elem, match[ 3 ] );\r\n },\r\n\r\n focusable: function( element ) {\r\n return focusable( element, !isNaN( $.attr( element, \"tabindex\" ) ) );\r\n },\r\n\r\n tabbable: function( element ) {\r\n var tabIndex = $.attr( element, \"tabindex\" ),\r\n isTabIndexNaN = isNaN( tabIndex );\r\n return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );\r\n }\r\n });\r\n\r\n // Modal Extension\r\n // ===============================\r\n\r\n $('.modal-dialog').attr( {'role' : 'document'})\r\n var modalhide = $.fn.modal.Constructor.prototype.hide\r\n $.fn.modal.Constructor.prototype.hide = function(){\r\n modalhide.apply(this, arguments)\r\n $(document).off('keydown.bs.modal')\r\n }\r\n\r\n var modalfocus = $.fn.modal.Constructor.prototype.enforceFocus\r\n $.fn.modal.Constructor.prototype.enforceFocus = function(){\r\n var $content = this.$element.find(\".modal-content\")\r\n var focEls = $content.find(\":tabbable\")\r\n , $lastEl = $(focEls[focEls.length-1])\r\n , $firstEl = $(focEls[0])\r\n $lastEl.on('keydown.bs.modal', $.proxy(function (ev) {\r\n if(ev.keyCode === 9 && !(ev.shiftKey | ev.ctrlKey | ev.metaKey | ev.altKey)) { // TAB pressed\r\n ev.preventDefault();\r\n $firstEl.focus();\r\n }\r\n }, this))\r\n $firstEl.on('keydown.bs.modal', $.proxy(function (ev) {\r\n if(ev.keyCode === 9 && ev.shiftKey) { // SHIFT-TAB pressed\r\n ev.preventDefault();\r\n $lastEl.focus();\r\n }\r\n }, this))\r\n modalfocus.apply(this, arguments)\r\n }\r\n\r\n // DROPDOWN Extension\r\n // ===============================\r\n\r\n var toggle = '[data-toggle=dropdown]'\r\n , $par\r\n , firstItem\r\n , focusDelay = 200\r\n , menus = $(toggle).parent().find('ul').attr('role','menu')\r\n , lis = menus.find('li').attr('role','presentation')\r\n // add aria attributes to dropdown toggle\r\n $(toggle).attr({ 'aria-haspopup':'true', 'aria-expanded': 'false'})\r\n\r\n $(toggle).parent()\r\n // Update aria-expanded when open\r\n .on('shown.bs.dropdown',function(e){\r\n $par = $(this)\r\n var $toggle = $par.find(toggle)\r\n $toggle.attr('aria-expanded','true')\r\n $toggle.on('keydown.bs.dropdown', $.proxy(function (ev) {\r\n setTimeout(function() {\r\n firstItem = $('.dropdown-menu [role=menuitem]:visible', $par)[0]\r\n try{ firstItem.focus()} catch(ex) {}\r\n }, focusDelay)\r\n }, this))\r\n\r\n })\r\n // Update aria-expanded when closed\r\n .on('hidden.bs.dropdown',function(e){\r\n $par = $(this)\r\n var $toggle = $par.find(toggle)\r\n $toggle.attr('aria-expanded','false')\r\n })\r\n\r\n // Close the dropdown if tabbed away from\r\n $(document)\r\n .on('focusout.dropdown.data-api', '.dropdown-menu', function(e){\r\n var $this = $(this)\r\n , that = this;\r\n // since we're trying to close when appropriate,\r\n // make sure the dropdown is open\r\n if (!$this.parent().hasClass('open')) {\r\n return;\r\n }\r\n setTimeout(function() {\r\n if(!$.contains(that, document.activeElement)){\r\n $this.parent().removeClass('open')\r\n }\r\n }, 150)\r\n })\r\n .on('keydown.bs.dropdown.data-api',\r\n toggle + ', [role=menu]', $.fn.dropdown.Constructor.prototype.keydown);\r\n\r\n // Tab Extension\r\n // ===============================\r\n \r\n var $tablist = $('.nav-tabs, .nav-pills')\r\n , $lis = $tablist.children('li')\r\n , $tabs = $tablist.find('[data-toggle=\"tab\"], [data-toggle=\"pill\"]')\r\n\r\n if($tabs){\r\n $tablist.attr('role', 'tablist')\r\n $lis.attr('role', 'presentation')\r\n $tabs.attr('role', 'tab')\r\n }\r\n\r\n $tabs.each(function( index ) {\r\n var tabpanel = $($(this).attr('href'))\r\n , tab = $(this)\r\n , tabid = tab.attr('id') || uniqueId('ui-tab')\r\n\r\n tab.attr('id', tabid)\r\n\r\n if(tab.parent().hasClass('active')){\r\n tab.attr( { 'tabIndex' : '0', 'aria-selected' : 'true', 'aria-controls': tab.attr('href').substr(1) } )\r\n tabpanel.attr({ 'role' : 'tabpanel', 'tabIndex' : '0', 'aria-hidden' : 'false', 'aria-labelledby':tabid })\r\n }else{\r\n tab.attr( { 'tabIndex' : '-1', 'aria-selected' : 'false', 'aria-controls': tab.attr('href').substr(1) } )\r\n tabpanel.attr( { 'role' : 'tabpanel', 'tabIndex' : '-1', 'aria-hidden' : 'true', 'aria-labelledby':tabid } )\r\n }\r\n })\r\n\r\n $.fn.tab.Constructor.prototype.keydown = function (e) {\r\n var $this = $(this)\r\n , $items\r\n , $ul = $this.closest('ul[role=tablist] ')\r\n , index\r\n , k = e.which || e.keyCode\r\n\r\n $this = $(this)\r\n if (!/(37|38|39|40)/.test(k)) return\r\n\r\n $items = $ul.find('[role=tab]:visible')\r\n index = $items.index($items.filter(':focus'))\r\n\r\n if (k == 38 || k == 37) index-- // up & left\r\n if (k == 39 || k == 40) index++ // down & right\r\n\r\n\r\n if(index < 0) index = $items.length -1\r\n if(index == $items.length) index = 0\r\n\r\n var nextTab = $items.eq(index)\r\n if(nextTab.attr('role') ==='tab'){\r\n\r\n nextTab.tab('show') //Comment this line for dynamically loaded tabPabels, to save Ajax requests on arrow key navigation\r\n .focus()\r\n }\r\n // nextTab.focus()\r\n\r\n e.preventDefault()\r\n e.stopPropagation()\r\n }\r\n\r\n $(document).on('keydown.tab.data-api','[data-toggle=\"tab\"], [data-toggle=\"pill\"]' , $.fn.tab.Constructor.prototype.keydown)\r\n\r\n var tabactivate = $.fn.tab.Constructor.prototype.activate;\r\n $.fn.tab.Constructor.prototype.activate = function (element, container, callback) {\r\n var $active = container.find('> .active')\r\n $active.find('[data-toggle=tab], [data-toggle=pill]').attr({ 'tabIndex' : '-1','aria-selected' : false })\r\n $active.filter('.tab-pane').attr({ 'aria-hidden' : true,'tabIndex' : '-1' })\r\n\r\n tabactivate.apply(this, arguments)\r\n\r\n element.addClass('active')\r\n element.find('[data-toggle=tab], [data-toggle=pill]').attr({ 'tabIndex' : '0','aria-selected' : true })\r\n element.filter('.tab-pane').attr({ 'aria-hidden' : false,'tabIndex' : '0' })\r\n }\r\n\r\n // Collapse Extension\r\n // ===============================\r\n\r\n var $colltabs = $('[data-toggle=\"collapse\"]')\r\n $colltabs.each(function( index ) {\r\n var colltab = $(this)\r\n , collpanel = (colltab.attr('data-target')) ? $(colltab.attr('data-target')) : $(colltab.attr('href'))\r\n , parent = colltab.attr('data-parent')\r\n , collparent = parent && $(parent)\r\n , collid = colltab.attr('id') || uniqueId('ui-collapse')\r\n\r\n colltab.attr('id', collid)\r\n\r\n if(collparent){\r\n colltab.attr({ 'role':'tab', 'aria-selected':'false', 'aria-expanded':'false' })\r\n $(collparent).find('div:not(.collapse,.panel-body), h4').attr('role','presentation')\r\n collparent.attr({ 'role' : 'tablist', 'aria-multiselectable' : 'true' })\r\n\r\n if(collpanel.hasClass('in')){\r\n colltab.attr({ 'aria-controls': collpanel.attr('id'), 'aria-selected':'true', 'aria-expanded':'true', 'tabindex':'0' })\r\n collpanel.attr({ 'role':'tabpanel', 'tabindex':'0', 'aria-labelledby':collid, 'aria-hidden':'false' })\r\n }else{\r\n colltab.attr({'aria-controls' : collpanel.attr('id'), 'tabindex':'-1' })\r\n collpanel.attr({ 'role':'tabpanel', 'tabindex':'-1', 'aria-labelledby':collid, 'aria-hidden':'true' })\r\n }\r\n }\r\n })\r\n\r\n var collToggle = $.fn.collapse.Constructor.prototype.toggle\r\n $.fn.collapse.Constructor.prototype.toggle = function(){\r\n var prevTab = this.$parent && this.$parent.find('[aria-expanded=\"true\"]') , href\r\n\r\n if(prevTab){\r\n var prevPanel = prevTab.attr('data-target') || (href = prevTab.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')\r\n , $prevPanel = $(prevPanel)\r\n , $curPanel = this.$element\r\n , par = this.$parent\r\n , curTab\r\n\r\n if (this.$parent) curTab = this.$parent.find('[data-toggle=collapse][href=\"#' + this.$element.attr('id') + '\"]')\r\n\r\n collToggle.apply(this, arguments)\r\n\r\n if ($.support.transition) {\r\n this.$element.one($.support.transition.end, function(){\r\n\r\n prevTab.attr({ 'aria-selected':'false','aria-expanded':'false', 'tabIndex':'-1' })\r\n $prevPanel.attr({ 'aria-hidden' : 'true','tabIndex' : '-1'})\r\n\r\n curTab.attr({ 'aria-selected':'true','aria-expanded':'true', 'tabIndex':'0' })\r\n\r\n if($curPanel.hasClass('in')){\r\n $curPanel.attr({ 'aria-hidden' : 'false','tabIndex' : '0' })\r\n }else{\r\n curTab.attr({ 'aria-selected':'false','aria-expanded':'false'})\r\n $curPanel.attr({ 'aria-hidden' : 'true','tabIndex' : '-1' })\r\n }\r\n })\r\n }\r\n }else{\r\n collToggle.apply(this, arguments)\r\n }\r\n }\r\n\r\n $.fn.collapse.Constructor.prototype.keydown = function (e) {\r\n var $this = $(this)\r\n , $items\r\n , $tablist = $this.closest('div[role=tablist] ')\r\n , index\r\n , k = e.which || e.keyCode\r\n\r\n $this = $(this)\r\n if (!/(32|37|38|39|40)/.test(k)) return\r\n if(k==32) $this.click()\r\n\r\n $items = $tablist.find('[role=tab]')\r\n index = $items.index($items.filter(':focus'))\r\n\r\n if (k == 38 || k == 37) index-- // up & left\r\n if (k == 39 || k == 40) index++ // down & right\r\n if(index < 0) index = $items.length -1\r\n if(index == $items.length) index = 0\r\n\r\n $items.eq(index).focus()\r\n\r\n e.preventDefault()\r\n e.stopPropagation()\r\n\r\n }\r\n\r\n $(document).on('keydown.collapse.data-api','[data-toggle=\"collapse\"]' , $.fn.collapse.Constructor.prototype.keydown);\r\n \r\n\r\n// Carousel Extension\r\n // ===============================\r\n\r\n $('.carousel').each(function (index) {\r\n\r\n // This function positions a highlight box around the tabs in the tablist to use in focus styling\r\n\r\n function setTablistHighlightBox() {\r\n\r\n var $tab\r\n , offset\r\n , height\r\n , width\r\n , highlightBox = {}\r\n\r\n highlightBox.top = 0\r\n highlightBox.left = 32000\r\n highlightBox.height = 0\r\n highlightBox.width = 0\r\n\r\n for (var i = 0; i < $tabs.length; i++) {\r\n $tab = $tabs[i]\r\n offset = $($tab).offset()\r\n height = $($tab).height()\r\n width = $($tab).width()\r\n\r\n// console.log(\" Top: \" + offset.top + \" Left: \" + offset.left + \" Height: \" + height + \" Width: \" + width)\r\n\r\n if (highlightBox.top < offset.top) {\r\n highlightBox.top = Math.round(offset.top)\r\n }\r\n\r\n if (highlightBox.height < height) {\r\n highlightBox.height = Math.round(height)\r\n }\r\n\r\n if (highlightBox.left > offset.left) {\r\n highlightBox.left = Math.round(offset.left)\r\n }\r\n\r\n var w = (offset.left - highlightBox.left) + Math.round(width)\r\n\r\n if (highlightBox.width < w) {\r\n highlightBox.width = w\r\n }\r\n\r\n } // end for\r\n\r\n// console.log(\"[HIGHLIGHT] Top: \" + highlightBox.top + \" Left: \" + highlightBox.left + \" Height: \" + highlightBox.height + \" Width: \" + highlightBox.width)\r\n\r\n $tablistHighlight.style.top = (highlightBox.top - 2) + 'px'\r\n $tablistHighlight.style.left = (highlightBox.left - 2) + 'px'\r\n $tablistHighlight.style.height = (highlightBox.height + 7) + 'px'\r\n $tablistHighlight.style.width = (highlightBox.width + 8) + 'px'\r\n\r\n } // end function\r\n\r\n var $this = $(this)\r\n , $prev = $this.find('[data-slide=\"prev\"]')\r\n , $next = $this.find('[data-slide=\"next\"]')\r\n , $tablist = $this.find('.carousel-indicators')\r\n , $tabs = $this.find('.carousel-indicators li')\r\n , $tabpanels = $this.find('.item')\r\n , $tabpanel\r\n , $tablistHighlight\r\n , $pauseCarousel\r\n , $complementaryLandmark\r\n , $tab\r\n , $is_paused = false\r\n , offset\r\n , height\r\n , width\r\n , i\r\n , id_title = 'id_title'\r\n , id_desc = 'id_desc'\r\n\r\n\r\n $tablist.attr('role', 'tablist')\r\n\r\n $tabs.focus(function() {\r\n $this.carousel('pause')\r\n $is_paused = true\r\n $pauseCarousel.innerHTML = \"Play Carousel\"\r\n $(this).parent().addClass('active');\r\n// $(this).addClass('focus')\r\n setTablistHighlightBox()\r\n $($tablistHighlight).addClass('focus')\r\n $(this).parents('.carousel').addClass('contrast')\r\n })\r\n\r\n $tabs.blur(function(event) {\r\n $(this).parent().removeClass('active');\r\n// $(this).removeClass('focus')\r\n $($tablistHighlight).removeClass('focus')\r\n $(this).parents('.carousel').removeClass('contrast')\r\n })\r\n\r\n\r\n for (i = 0; i < $tabpanels.length; i++) {\r\n $tabpanel = $tabpanels[i]\r\n $tabpanel.setAttribute('role', 'tabpanel')\r\n $tabpanel.setAttribute('id', 'tabpanel-' + index + '-' + i)\r\n $tabpanel.setAttribute('aria-labelledby', 'tab-' + index + '-' + i)\r\n }\r\n\r\n for (i = 0; i < $tabs.length; i++) {\r\n $tab = $tabs[i]\r\n\r\n $tab.setAttribute('role', 'tab')\r\n $tab.setAttribute('id', 'tab-' + index + '-' + i)\r\n $tab.setAttribute('aria-controls', 'tabpanel-' + index + '-' + i)\r\n\r\n var tpId = '#tabpanel-' + index + '-' + i\r\n var caption = $this.find(tpId).find('h1').text()\r\n\r\n if ((typeof caption !== 'string') || (caption.length === 0)) caption = $this.find(tpId).text()\r\n if ((typeof caption !== 'string') || (caption.length === 0)) caption = $this.find(tpId).find('h3').text()\r\n if ((typeof caption !== 'string') || (caption.length === 0)) caption = $this.find(tpId).find('h4').text()\r\n if ((typeof caption !== 'string') || (caption.length === 0)) caption = $this.find(tpId).find('h5').text()\r\n if ((typeof caption !== 'string') || (caption.length === 0)) caption = $this.find(tpId).find('h6').text()\r\n if ((typeof caption !== 'string') || (caption.length === 0)) caption = \"no title\";\r\n\r\n// console.log(\"CAPTION: \" + caption )\r\n\r\n var tabName = document.createElement('span')\r\n tabName.setAttribute('class', 'sr-only')\r\n tabName.innerHTML='Slide ' + (i+1)\r\n if (caption) tabName.innerHTML += \": \" + caption\r\n $tab.appendChild(tabName)\r\n\r\n }\r\n\r\n // create div for focus styling of tablist\r\n $tablistHighlight = document.createElement('div')\r\n $tablistHighlight.className = 'carousel-tablist-highlight'\r\n document.body.appendChild($tablistHighlight)\r\n\r\n setTablistHighlightBox()\r\n\r\n $( window ).resize(function() {\r\n setTablistHighlightBox()\r\n })\r\n\r\n // Add space bar behavior to prev and next buttons for SR compatibility\r\n $prev.attr('aria-label', 'Previous Slide')\r\n $prev.keydown(function(e) {\r\n var k = e.which || e.keyCode\r\n if (/(13|32)/.test(k)) {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n $prev.trigger('click');\r\n }\r\n });\r\n\r\n $prev.focus(function() {\r\n $(this).parents('.carousel').addClass('contrast')\r\n })\r\n\r\n $prev.blur(function() {\r\n $(this).parents('.carousel').removeClass('contrast')\r\n })\r\n\r\n $next.attr('aria-label', 'Next Slide')\r\n $next.keydown(function(e) {\r\n var k = e.which || e.keyCode\r\n if (/(13|32)/.test(k)) {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n $next.trigger('click');\r\n }\r\n });\r\n\r\n $next.focus(function() {\r\n $(this).parents('.carousel').addClass('contrast')\r\n })\r\n\r\n $next.blur(function() {\r\n $(this).parents('.carousel').removeClass('contrast')\r\n })\r\n\r\n $('.carousel-inner a').focus(function() {\r\n $(this).parents('.carousel').addClass('contrast')\r\n })\r\n\r\n $('.carousel-inner a').blur(function() {\r\n $(this).parents('.carousel').removeClass('contrast')\r\n })\r\n\r\n $tabs.each(function () {\r\n var item = $(this)\r\n if(item.hasClass('active')) {\r\n item.attr({ 'aria-selected': 'true', 'tabindex' : '0' })\r\n }else{\r\n item.attr({ 'aria-selected': 'false', 'tabindex' : '-1' })\r\n }\r\n })\r\n })\r\n\r\n var slideCarousel = $.fn.carousel.Constructor.prototype.slide\r\n $.fn.carousel.Constructor.prototype.slide = function (type, next) {\r\n var $element = this.$element\r\n , $active = $element.find('[role=tabpanel].active')\r\n , $next = next || $active[type]()\r\n , $tab\r\n , $tab_count = $element.find('[role=tabpanel]').size()\r\n , $prev_side = $element.find('[data-slide=\"prev\"]')\r\n , $next_side = $element.find('[data-slide=\"next\"]')\r\n , $index = 0\r\n , $prev_index = $tab_count -1\r\n , $next_index = 1\r\n , $id\r\n\r\n if ($next && $next.attr('id')) {\r\n $id = $next.attr('id')\r\n $index = $id.lastIndexOf(\"-\")\r\n if ($index >= 0) $index = parseInt($id.substring($index+1), 10)\r\n\r\n $prev_index = $index - 1\r\n if ($prev_index < 1) $prev_index = $tab_count - 1\r\n\r\n $next_index = $index + 1\r\n if ($next_index >= $tab_count) $next_index = 0\r\n }\r\n\r\n $prev_side.attr('aria-label', 'Show slide ' + ($prev_index+1) + ' of ' + $tab_count)\r\n $next_side.attr('aria-label', 'Show slide ' + ($next_index+1) + ' of ' + $tab_count)\r\n\r\n\r\n slideCarousel.apply(this, arguments)\r\n\r\n $active\r\n .one('bsTransitionEnd', function () {\r\n var $tab\r\n\r\n $tab = $element.find('li[aria-controls=\"' + $active.attr('id') + '\"]')\r\n if ($tab) $tab.attr({'aria-selected':false, 'tabIndex': '-1'})\r\n\r\n $tab = $element.find('li[aria-controls=\"' + $next.attr('id') + '\"]')\r\n if ($tab) $tab.attr({'aria-selected': true, 'tabIndex': '0'})\r\n\r\n })\r\n }\r\n\r\n var $this;\r\n $.fn.carousel.Constructor.prototype.keydown = function (e) {\r\n\r\n $this = $this || $(this)\r\n if(this instanceof Node) $this = $(this)\r\n\r\n function selectTab(index) {\r\n if (index >= $tabs.length) return\r\n if (index < 0) return\r\n\r\n $carousel.carousel(index)\r\n setTimeout(function () {\r\n $tabs[index].focus()\r\n // $this.prev().focus()\r\n }, 150)\r\n }\r\n\r\n var $carousel = $(e.target).closest('.carousel')\r\n , $tabs = $carousel.find('[role=tab]')\r\n , k = e.which || e.keyCode\r\n , index\r\n\r\n if (!/(37|38|39|40)/.test(k)) return\r\n\r\n index = $tabs.index($tabs.filter('.active'))\r\n if (k == 37 || k == 38) { // Up\r\n index--\r\n selectTab(index);\r\n }\r\n\r\n if (k == 39 || k == 40) { // Down\r\n index++\r\n selectTab(index);\r\n }\r\n\r\n e.preventDefault()\r\n e.stopPropagation()\r\n }\r\n $(document).on('keydown.carousel.data-api', 'li[role=tab]', $.fn.carousel.Constructor.prototype.keydown);\r\n\r\n\r\n })(jQuery);","function GetLanguage(useParent) {\r\n var userLanguage = \"en-US\";\r\n\r\n var cookie = getCookie(\"layout\");\r\n var cookies = cookie.split(\"&\");\r\n for (var i = 0; i < cookies.length; i++) {\r\n var dateIndex = cookies[i].indexOf(\"userLanguage=\");\r\n if (dateIndex > -1) {\r\n userLanguage = cookies[i].substring(13);\r\n break;\r\n }\r\n }\r\n\r\n if (useParent) {\r\n var indexOfDash = userLanguage.indexOf('-');\r\n if (indexOfDash > -1) {\r\n userLanguage = userLanguage.substring(0, indexOfDash);\r\n }\r\n }\r\n\r\n return userLanguage;\r\n}\r\n\r\nfunction GetUserDateFormat(originalCase) {\r\n var userDateFormat = \"MM/DD/YYYY\";\r\n\r\n var cookie = getCookie(\"layout\");\r\n var cookies = cookie.split(\"&\");\r\n for (var i = 0; i < cookies.length; i++) {\r\n var dateIndex = cookies[i].indexOf(\"userDateFormat=\");\r\n if (dateIndex > -1) {\r\n if (originalCase)\r\n userDateFormat = cookies[i].substring(15);\r\n else\r\n userDateFormat = cookies[i].substring(15).toUpperCase();\r\n break;\r\n }\r\n }\r\n\r\n return userDateFormat;\r\n}\r\n\r\nfunction GetUserDateTimeFormat () {\r\n var userDateFormat = \"MM/DD/YYYY\";\r\n var userTimeFormat = \"hh:mm A\";\r\n\r\n var cookie = getCookie(\"layout\");\r\n var cookies = cookie.split(\"&\");\r\n for (var i = 0; i < cookies.length; i++) {\r\n var dateIndex = cookies[i].indexOf(\"userDateFormat=\");\r\n var timeIndex = cookies[i].indexOf(\"userTimeFormat=\");\r\n\r\n if (dateIndex > -1) {\r\n userDateFormat = cookies[i].substring(15).toUpperCase();\r\n }\r\n\r\n if (timeIndex > -1) {\r\n userTimeFormat = cookies[i].substring(15);\r\n userTimeFormat = userTimeFormat.replace(\"tt\", \"A\");\r\n }\r\n }\r\n\r\n return userDateFormat + \" \" + userTimeFormat;\r\n}\r\n\r\nfunction GetUserTimeZone() {\r\n var userTimeZone = \"America/New_York\";\r\n\r\n var cookie = getCookie(\"layout\");\r\n var cookies = cookie.split(\"&\");\r\n for (var i = 0; i < cookies.length; i++) {\r\n var dateIndex = cookies[i].indexOf(\"userTimeZone=\");\r\n if (dateIndex > -1) {\r\n userTimeZone = cookies[i].substring(13);\r\n break;\r\n }\r\n }\r\n\r\n return userTimeZone;\r\n}\r\n\r\nfunction GetTimeFormat() {\r\n return Show24Hours() ? \"HH:mm\" : \"hh:mm A\";\r\n}\r\n\r\nfunction Show24Hours() {\r\n var show24Hours = true;\r\n var cookie = getCookie(\"layout\");\r\n var cookies = cookie.split(\"&\");\r\n\r\n for (var i = 0; i < cookies.length; i++) {\r\n var timeIndex = cookies[i].indexOf(\"userTimeFormat=\");\r\n \r\n if (timeIndex > -1) {\r\n var userTimeFormat = cookies[i].substring(15);\r\n if (userTimeFormat.indexOf(\"tt\") > -1)\r\n show24Hours = false;\r\n }\r\n }\r\n\r\n return show24Hours;\r\n}\r\n\r\nfunction getCookie(cname) {\r\n var name = cname + \"=\";\r\n var decodedCookie = decodeURIComponent(document.cookie);\r\n var ca = decodedCookie.split(';');\r\n for (var i = 0; i < ca.length; i++) {\r\n var c = ca[i];\r\n while (c.charAt(0) == ' ') {\r\n c = c.substring(1);\r\n }\r\n if (c.indexOf(name) == 0) {\r\n return c.substring(name.length, c.length);\r\n }\r\n }\r\n return \"\";\r\n}\r\n\r\nfunction ConvertFromUtcToLocalDateTimeFromNow(utcDateTime) {\r\n try {\r\n var justNow = \"Just Now\";\r\n\r\n var userTimeZone = GetUserTimeZone();\r\n var localDateTimeFromNow = moment.utc(utcDateTime).tz(userTimeZone).fromNow();\r\n\r\n if (localDateTimeFromNow.indexOf(justNow) > -1)\r\n localDateTimeFromNow = moment.utc(utcDateTime).tz(userTimeZone).fromNow(true);\r\n\r\n return localDateTimeFromNow;\r\n } catch (e) {\r\n console.log(e);\r\n\r\n return utcDateTime;\r\n }\r\n}\r\n\r\nfunction ConvertFromUtcToLocalDateWithUserFormat(utcDateTime) {\r\n try {\r\n var userTimeZone = GetUserTimeZone();\r\n var localDate = moment.utc(utcDateTime).tz(userTimeZone).toDate();\r\n var userdateFormat = GetUserDateFormat();\r\n\r\n return formatDateTime(localDate, userdateFormat);\r\n } catch (e) {\r\n console.log(e);\r\n\r\n return utcDateTime;\r\n }\r\n}\r\n\r\nfunction formatDateTime(dateTime, dateTimeFormat) {\r\n return moment(dateTime).format(dateTimeFormat);\r\n}","var EnsembleVideo = EnsembleVideo || {};\r\nEnsembleVideo.Quiz = EnsembleVideo.Quiz || {};\r\n\r\n(function ($) {\r\n 'use strict';\r\n EnsembleVideo.Quiz.Results = (function () {\r\n var globalization = {\r\n dateTimeFormat: '',\r\n language: '',\r\n timeZone: ''\r\n },\r\n questions = {\r\n breadcrumbDom: null,\r\n reportWrapperDom: null,\r\n reportLoaderDom: null,\r\n reportErrorDom: null,\r\n focus: function () {\r\n $('html, body').animate({\r\n scrollTop: $(questions.breadcrumbDom).offset().top-60\r\n }, 1000);\r\n },\r\n showLoader: function () {\r\n $(questions.reportWrapperDom).empty();\r\n $(questions.reportErrorDom).hide();\r\n $(questions.reportLoaderDom).show();\r\n },\r\n hideLoader: function () {\r\n $(questions.reportLoaderDom).hide();\r\n },\r\n showError: function () {\r\n $(questions.reportWrapperDom).hide();\r\n $(questions.reportLoaderDom).hide();\r\n $(questions.reportErrorDom).show();\r\n },\r\n overview: {\r\n tmplOverviewDom: null,\r\n title: 'Results by Questions',\r\n createBreadcrumb: function (focus) {\r\n $(questions.breadcrumbDom)\r\n .html('