{"version":3,"sources":["https:\/\/immet-dist.spbstu.ru\/theme\/mooc\/amd\/src\/aria.js"],"names":["define","$","Pending","init","focusEnd","keydown","e","expanded","trigger","which","keyCode","target","attr","preventDefault","click","shiftFocus","element","delayedFocus","pendingPromise","this","focus","resolve","bind","setTimeout","on","result","menu","find","menuItems","foundMenuItem","length","keypress","item","String","fromCharCode","closest","i","toLowerCase","text","trim","indexOf","next","window","alerts"],"mappings":"AAsBA,aAEAA,OAAO,CAAC,SAAU,gBAAiB,SAAUC,EAAGC,GAC9C,MAAO,CACLC,KAAM,WAEJ,IAAIC,GAAW,EAWfH,EAAE,4BAA4BI,QAAQ,SAAUC,GAC9C,IACIC,EADAC,EAAUF,EAAEG,OAASH,EAAEI,QAGZ,IAAXF,IAbJJ,GAAW,GAmBI,IAAXI,IACFD,EAAWN,EAAEK,EAAEK,QAAQC,KAAK,iBAC5BN,EAAEO,iBAEc,SAAZN,GACFN,EAAEK,EAAEK,QAAQG,SAKD,IAAXN,GAA4B,IAAXA,IAEnBF,EAAEO,iBAEFZ,EAAEK,EAAEK,QAAQG,WAIhB,IAAIC,EAAa,SAAoBC,GACnC,IAAIC,EAAe,SAAUC,GAC3BjB,EAAEkB,MAAMC,QACRF,EAAeG,WACfC,KAAKN,GAEPO,WAAWN,EAAc,GAAI,IAAIf,EAAQ,6BAG3CD,EAAE,aAAauB,GAAG,oBAAqB,SAAUlB,GAE\/C,IA7CImB,EA6CAC,EAAOzB,EAAEK,EAAEK,QAAQgB,KAAK,iBACxBC,GAAY,EACZC,GAAgB,EAEhBH,IACFE,EAAY3B,EAAEyB,GAAMC,KAAK,sBAGvBC,GAAaA,EAAUE,OAAS,IArDhCL,EAASrB,EACbA,GAAW,EAsDPyB,EArDGJ,EAqDaG,EAAUA,EAAUE,OAAS,GAG7BF,EAAU,IAI1BC,GACFd,EAAWc,KAKf5B,EAAE,6CAA6C8B,SAAS,SAAUzB,GAChE,IAGIsB,EACAI,EAJAxB,EAAUyB,OAAOC,aAAa5B,EAAEG,OAASH,EAAEI,SAC3CgB,EAAOzB,EAAEK,EAAEK,QAAQwB,QAAQ,iBAC3BC,EAAI,EAKR,GAAKV,IAILE,EAAY3B,EAAEyB,GAAMC,KAAK,sBAQzB,IAFAnB,EAAUA,EAAQ6B,cAEbD,EAAI,EAAGA,EAAIR,EAAUE,OAAQM,IAIhC,GAAiC,IAHjCJ,EAAO\/B,EAAE2B,EAAUQ,KACHE,OAAOC,OAAOF,cAEjBG,QAAQhC,GAAe,CAClCO,EAAWiB,GACX,SAKN\/B,EAAE,6CAA6CI,QAAQ,SAAUC,GAC\/D,IAIIsB,EAJApB,EAAUF,EAAEG,OAASH,EAAEI,QACvB+B,GAAO,EACPf,EAAOzB,EAAEK,EAAEK,QAAQwB,QAAQ,iBAC3BC,EAAI,EAGR,GAAKV,IAILE,EAAY3B,EAAEyB,GAAMC,KAAK,sBAEzB,CAKA,GAAe,IAAXnB,EAAe,CACjB,IAAK4B,EAAI,EAAGA,EAAIR,EAAUE,OAAS,EAAGM,IACpC,GAAIR,EAAUQ,IAAM9B,EAAEK,OAAQ,CAC5B8B,EAAOb,EAAUQ,EAAI,GACrB,MAICK,IAEHA,EAAOb,EAAU,SAEd,GAAe,IAAXpB,EAAe,CAExB,IAAK4B,EAAI,EAAGA,EAAIR,EAAUE,OAAQM,IAChC,GAAIR,EAAUQ,IAAM9B,EAAEK,OAAQ,CAC5B8B,EAAOb,EAAUQ,EAAI,GACrB,MAICK,IAEHA,EAAOb,EAAUA,EAAUE,OAAS,SAElB,IAAXtB,EAETiC,EAAOb,EAAU,GACG,IAAXpB,IAETiC,EAAOb,EAAUA,EAAUE,OAAS,IAIlCW,IACFnC,EAAEO,iBACFE,EAAW0B,OAKfxC,EAAE,aAAauB,GAAG,qBAAsB,SAAUlB,GAEhD,IAAIE,EAAUP,EAAEK,EAAEK,QAAQgB,KAAK,4BAE3BnB,GACFO,EAAWP,KAIfP,EAAE,WACAyC,OAAOnB,WAAW,SAAUL,GAC1B,IAAIyB,EAAS1C,EAAE,8CAEX0C,EAAOb,OAAS,IAClB7B,EAAE0C,EAAO,IAAI\/B,KAAK,WAAY,KAC9BX,EAAE0C,EAAO,IAAIvB,SAGfF,EAAeG,WACd,IAAK,IAAInB,EAAQ","sourcesContent":["\/\/ This file is part of Moodle - http:\/\/moodle.org\/\n\/\/\n\/\/ Moodle is free software: you can redistribute it and\/or modify\n\/\/ it under the terms of the GNU General Public License as published by\n\/\/ the Free Software Foundation, either version 3 of the License, or\n\/\/ (at your option) any later version.\n\/\/\n\/\/ Moodle is distributed in the hope that it will be useful,\n\/\/ but WITHOUT ANY WARRANTY; without even the implied warranty of\n\/\/ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\/\/ GNU General Public License for more details.\n\/\/\n\/\/ You should have received a copy of the GNU General Public License\n\/\/ along with Moodle. If not, see .\n\n\/**\n * Enhancements to Bootstrap components for accessibility.\n *\n * @module theme_remui\/aria\n * @copyright 2018 Damyon Wiese \n * @license http:\/\/www.gnu.org\/copyleft\/gpl.html GNU GPL v3 or later\n *\/\n\"use strict\";\ndefine(['jquery', 'core\/pending'], function($, Pending) {\n return {\n init: function() {\n \/\/ Drop downs from bootstrap don't support keyboard accessibility by default.\n var focusEnd = false,\n setFocusEnd = function() {\n focusEnd = true;\n },\n getFocusEnd = function() {\n var result = focusEnd;\n focusEnd = false;\n return result;\n };\n\n \/\/ Special handling for \"up\" keyboard control.\n $('[data-toggle=\"dropdown\"]').keydown(function(e) {\n var trigger = e.which || e.keyCode,\n expanded;\n\n \/\/ Up key opens the menu at the end.\n if (trigger == 38) {\n \/\/ Focus the end of the menu, not the beginning.\n setFocusEnd();\n }\n\n \/\/ Escape key only closes the menu, it doesn't open it.\n if (trigger == 27) {\n expanded = $(e.target).attr('aria-expanded');\n e.preventDefault();\n if (expanded == \"false\") {\n $(e.target).click();\n }\n }\n\n \/\/ Space key or Enter key opens the menu.\n if (trigger == 32 || trigger == 13) {\n \/\/ Cancel random scroll.\n e.preventDefault();\n \/\/ Open the menu instead.\n $(e.target).click();\n }\n });\n\n \/\/ Special handling for navigation keys when menu is open.\n var shiftFocus = function(element) {\n var delayedFocus = function(pendingPromise) {\n $(this).focus();\n pendingPromise.resolve();\n }.bind(element);\n setTimeout(delayedFocus, 50, new Pending('core\/aria:delayed-focus'));\n };\n\n $('.dropdown').on('shown.bs.dropdown', function(e) {\n \/\/ We need to focus on the first menuitem.\n var menu = $(e.target).find('[role=\"menu\"]'),\n menuItems = false,\n foundMenuItem = false;\n\n if (menu) {\n menuItems = $(menu).find('[role=\"menuitem\"]');\n }\n if (menuItems && menuItems.length > 0) {\n if (getFocusEnd()) {\n foundMenuItem = menuItems[menuItems.length - 1];\n } else {\n \/\/ The first menu entry, pretty reasonable.\n foundMenuItem = menuItems[0];\n }\n }\n if (foundMenuItem) {\n shiftFocus(foundMenuItem);\n }\n });\n \/\/ Search for menu items by finding the first item that has\n \/\/ text starting with the typed character (case insensitive).\n $('.dropdown [role=\"menu\"] [role=\"menuitem\"]').keypress(function(e) {\n var trigger = String.fromCharCode(e.which || e.keyCode),\n menu = $(e.target).closest('[role=\"menu\"]'),\n i = 0,\n menuItems = false,\n item,\n itemText;\n\n if (!menu) {\n return;\n }\n menuItems = $(menu).find('[role=\"menuitem\"]');\n if (!menuItems) {\n return;\n }\n\n trigger = trigger.toLowerCase();\n for (i = 0; i < menuItems.length; i++) {\n item = $(menuItems[i]);\n itemText = item.text().trim().toLowerCase();\n if (itemText.indexOf(trigger) == 0) {\n shiftFocus(item);\n break;\n }\n }\n });\n\n \/\/ Keyboard navigation for arrow keys, home and end keys.\n $('.dropdown [role=\"menu\"] [role=\"menuitem\"]').keydown(function(e) {\n var trigger = e.which || e.keyCode,\n next = false,\n menu = $(e.target).closest('[role=\"menu\"]'),\n i = 0,\n menuItems = false;\n if (!menu) {\n return;\n }\n menuItems = $(menu).find('[role=\"menuitem\"]');\n if (!menuItems) {\n return;\n }\n \/\/ Down key.\n if (trigger == 40) {\n for (i = 0; i < menuItems.length - 1; i++) {\n if (menuItems[i] == e.target) {\n next = menuItems[i + 1];\n break;\n }\n }\n if (!next) {\n \/\/ Wrap to first item.\n next = menuItems[0];\n }\n\n } else if (trigger == 38) {\n \/\/ Up key.\n for (i = 1; i < menuItems.length; i++) {\n if (menuItems[i] == e.target) {\n next = menuItems[i - 1];\n break;\n }\n }\n if (!next) {\n \/\/ Wrap to last item.\n next = menuItems[menuItems.length - 1];\n }\n\n } else if (trigger == 36) {\n \/\/ Home key.\n next = menuItems[0];\n\n } else if (trigger == 35) {\n \/\/ End key.\n next = menuItems[menuItems.length - 1];\n }\n \/\/ Variable next is set if we do want to act on the keypress.\n if (next) {\n e.preventDefault();\n shiftFocus(next);\n }\n return;\n });\n $('.dropdown').on('hidden.bs.dropdown', function(e) {\n \/\/ We need to focus on the menu trigger.\n var trigger = $(e.target).find('[data-toggle=\"dropdown\"]');\n if (trigger) {\n shiftFocus(trigger);\n }\n });\n\n \/\/ After page load, focus on any element with special autofocus attribute.\n $(function() {\n window.setTimeout(function(pendingPromise) {\n var alerts = $('[role=\"alert\"][data-aria-autofocus=\"true\"]');\n if (alerts.length > 0) {\n $(alerts[0]).attr('tabindex', '0');\n $(alerts[0]).focus();\n }\n pendingPromise.resolve();\n }, 300, new Pending('core\/aria:delayed-focus'));\n });\n }\n };\n});\n"],"file":"aria.min.js"}