{"version":3,"file":"sm.portal.keyboardNav.min.js","names":["jQuery","undefined","sm","window","portal","extend","keyboardNav","fn","modalTabbing","this","each","jqSelector","find","eq","focus","on","e","inputs","which","shiftKey","target","preventDefault","last","length","first","modalNav","keyboardControl","that","utility","isNullOrEmpty","hasAttribute","attr","event","ui","keyCode","SPACE","ENTER","click","aria","homePage","loginHeader","topheavy","roleDialog","sectionFull","not","smallTopPadContainer","smInvertedGrayContainer","smLandingPageHeaderSiblingRow","siblings","noAccess","detailedListExpander","overrideRole","radioAsStdButton","inputAsloginButton","liAsTabTypeOne","liAsTabTypeTwo","pagerWrap","pagerFirstPage","pagerPreviousPage","pagerNextPage","pagerLastPage","myAwards","complementary","buttons","tabs","dialog","giveRole","elements","role","ariaLabel","headerLinks","index","text","subMenuLink","widget","appSectionItem","searchResultsItem","recordedStatus","uploadDocumentIcon","tabbable","notLoggedIn","isNullEmptyOrNothing","stopPropagation","prev","giveContentFocus","elem"],"sources":["assets/js/ui/sm.portal.keyboardNav.js"],"mappings":"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","ignoreList":[],"sourcesContent":["\r\n// This script is registered and enqueued in U4SM-adaptor\\public\\public.php\r\n\r\n(function (jQuery, undefined) {\r\n var sm = window.sm = window.sm || {};\r\n var windowProxy;\r\n var actionQueue = [];\r\n\r\n if (typeof sm.portal === \"undefined\") {\r\n jQuery.extend(sm, { portal: {} });\r\n }\r\n if (typeof sm.portal.keyboardNav === \"undefined\") {\r\n jQuery.extend(sm.portal, { keyboardNav: {} });\r\n }\r\n\r\n jQuery.fn.modalTabbing = function () {\r\n var tabbing = function (jqSelector) {\r\n\r\n var inputs = jQuery(jqSelector).find(\":tabbable\");\r\n\r\n // Focus to first element in the container.\r\n inputs.eq(0).focus();\r\n\r\n jQuery(jqSelector).on('keydown', function (e) {\r\n var inputs = jQuery(jqSelector).find(\":tabbable\");\r\n if (e.which === 9) {\r\n //redirect last tab to first input\r\n if (!e.shiftKey) {\r\n if (inputs[inputs.length - 1] === e.target) {\r\n e.preventDefault();\r\n inputs.first().focus();\r\n }\r\n }\r\n //redirect first shift+tab to last input\r\n else {\r\n if (inputs[0] === e.target) {\r\n e.preventDefault();\r\n inputs.last().focus();\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n return this.each(function () {\r\n tabbing(this);\r\n });\r\n };\r\n\r\n // Wired up in function lightBox(title, ...) in sm.porta.ui...js\r\n function modalNav() {\r\n jQuery('.smModal').modalTabbing();\r\n }\r\n\r\n function keyboardControl(that) {\r\n if (!sm.portal.utility.isNullOrEmpty(that) && that.length > 0) {\r\n // add tab indices here if needed\r\n if (!that[0].hasAttribute('tabindex')) {\r\n that.attr('tabindex', '0');\r\n }\r\n\r\n that.on('keydown', function (event) {\r\n if (event.which == jQuery.ui.keyCode.SPACE || event.which == jQuery.ui.keyCode.ENTER) {\r\n that.click();\r\n }\r\n });\r\n }\r\n }\r\n\r\n function aria() {\r\n\r\n //console.log('sm.keyboardnav.aria()');\r\n\r\n var homePage = jQuery('body.home .main-container .smallTopPad');\r\n\r\n // Main content area for all U4SM pages that pull in HTML via shortcodes.\r\n var innerPage = jQuery('.smContentArea');\r\n\r\n // Sections to target on shell pages.\r\n var loginHeader = jQuery('.loginHeader');\r\n var topheavy = jQuery('.topheavy'); // section for graphics link in login pages.\r\n var roleDialog = jQuery('.roleDialog');\r\n var sectionFull = jQuery('section.full').not('section.full.landing-hero').not('section.full.smLandingPageHeader');\r\n var smallTopPadContainer = jQuery('section.smallTopPad div.container'); // Target to get role of 'main' for the Continuing Education page and other pages with like structure.\r\n var smInvertedGrayContainer = jQuery('section.sm-inverted-grey div.container');// Target to get role of 'complementary' for the Continuing Education page and other pages with like structure.\r\n var smLandingPageHeaderSiblingRow = jQuery('section.full.smLandingPageHeader').siblings('div.row'); // Target to get role of complementary on Current Students page.\r\n\r\n // Only assign the variable this value if we are on the No Access page. This var is passed into the mainContent array below.\r\n // Most U4SM pages will contain a Section tag with the 'smContentArea' class which will also gets assigned a role of main. \r\n // We don't want two main roles on a page which may contain the .trsContent area and a HTML structure with 'section.full.smLandingPageHeader'.\r\n var noAccess = jQuery(\"title:contains('No Access')\") ? jQuery('section.full.smLandingPageHeader').siblings('section') : null;\r\n\r\n // Non-semantic, interactive elements.\r\n var detailedListExpander = jQuery('ul.detailedList > li');\r\n var overrideRole = jQuery('.overrideRole'); //For removing any role from any DOM \r\n var radioAsStdButton = jQuery('.field.inline input[type=\"radio\"]').siblings('label');\r\n var requiredCourseExpander = jQuery('ul.reqCourseList > li');\r\n var inputAsloginButton = jQuery(\"input[name='login'][type='submit']\"); // Login button on pages such as Advisor Login.\r\n var liAsTabTypeOne = jQuery('ul.tabBar > li'); // HTML structure for tab set on Faculty 360.\r\n var liAsTabTypeTwo = jQuery('div.tabSet > ul > li'); // HTML structure for tab set on Student 360 and My Schedule.\r\n \r\n var pagerWrap = jQuery('.pagerWrap');\r\n var pagerFirstPage = pagerWrap.find('span.icon.firstPage');\r\n var pagerPreviousPage = pagerWrap.find('span.icon.previousPage');\r\n var pagerNextPage = pagerWrap.find('span.icon.nextPage');\r\n var pagerLastPage = pagerWrap.find('span.icon.lastPage');\r\n var myAwards = jQuery('.myAwards ul.detailedList > li');\r\n\r\n // Group elements that are to be assigned like roles.\r\n var mainContent = [homePage, loginHeader, smallTopPadContainer, noAccess];\r\n var complementary = [sectionFull, smInvertedGrayContainer, smLandingPageHeaderSiblingRow, topheavy];\r\n var buttons = [detailedListExpander, radioAsStdButton, inputAsloginButton, pagerFirstPage, pagerPreviousPage, pagerNextPage, pagerLastPage];\r\n var tabs = [liAsTabTypeOne, liAsTabTypeTwo];\r\n var dialog = [roleDialog];\r\n var overrideRole= [overrideRole];\r\n\r\n function giveRole(elements, role) {\r\n jQuery(elements).each(function () {\r\n var that = jQuery(this);\r\n that.attr('role', role);\r\n });\r\n }\r\n\r\n giveRole(mainContent, 'main');\r\n giveRole(complementary, 'complementary');\r\n giveRole(buttons, 'button');\r\n giveRole(tabs, 'tab');\r\n giveRole(dialog, 'dialog');\r\n giveRole(overrideRole, '');\r\n giveRole(myAwards, 'application');\r\n //giveState(detailedListExpander, 'detailsShowing');\r\n //giveState(liAsTabTypeOne, 'activeTab');\r\n //giveState(liAsTabTypeTwo, 'activeTab');\r\n\r\n // For ARIA implementation for expander on Required Courses, see trs.portal.vm.academic.studentdegreeaudit.widget-1.0.0.js, \r\n \r\n\r\n // refactoring this into centralized location for all 'detailedList' toggling\r\n //function giveState(elem, activeClass) {\r\n // // Check if element happens to be expanded on load and set initial state.\r\n // elem.hasClass(activeClass) ? elem.attr('aria-expanded', 'true') : elem.attr('aria-expanded', 'false'); \r\n\r\n // elem.click(function () {\r\n // var that = jQuery(this);\r\n // that.hasClass(activeClass) ? that.attr('aria-expanded', 'true') : that.attr('aria-expanded', 'false');\r\n // });\r\n //}\r\n }\r\n\r\n function ariaLabel() {\r\n var headerLinks = jQuery(\"#menu-main-menu.menu a\")\r\n if (headerLinks!= null) {\r\n for (var index = 0; index < headerLinks.length; index++) {\r\n var ariaLabel = jQuery(headerLinks[index]).text();\r\n var subMenuLink = jQuery(headerLinks[index]); \r\n if (subMenuLink != null) \r\n subMenuLink.attr('aria-label', ariaLabel);\r\n } \r\n }\r\n }\r\n\r\n function widget() { \r\n var widget = jQuery('.flexWidget');\r\n var radioAsStdButton = widget.find('.field.inline input[type=\"radio\"]').siblings('label'); // These are \"buttons\" for \"My Grades View by: Session Start Date\".\r\n \r\n var appSectionItem = widget.find('li.appsecItem');\r\n var searchResultsItem = widget.find('.searchResultsItem');\r\n var recordedStatus = widget.find('.recordedStatus'); \r\n var uploadDocumentIcon = widget.find('label.uploadBox'); // On Applicant Checklist page\r\n var tabbable = [radioAsStdButton, appSectionItem, searchResultsItem, recordedStatus, uploadDocumentIcon];\r\n var keyable = [appSectionItem, uploadDocumentIcon];\r\n var notLoggedIn = widget.find('form#AccountForm div[data-bind=\"visible: ShowNewAccount()\"]'); \r\n \r\n jQuery(tabbable).each(function () {\r\n var that = jQuery(this);\r\n if (!sm.portal.utility.isNullEmptyOrNothing(that)) {\r\n that.attr('tabindex', '0');\r\n }\r\n });\r\n\r\n // Event handler for one-off items. \r\n // The click hander for these elements resides in the Knockout library versues our functions that wrap a\r\n // \"that.on('click, function....')\" event in which case we place 'sm.keyboardnav.keyboardControl(that)' within those functions.\r\n jQuery('.reenrollmentSectionList').on('keydown','li.reenrollmentStepItem ', function (event){\r\n if (event.which == jQuery.ui.keyCode.SPACE || event.which == jQuery.ui.keyCode.ENTER) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.click();\r\n }\r\n });\r\n\t\r\n\t radioAsStdButton.on('keydown', function (event) {\r\n\t var that = jQuery(this);\r\n if (event.which == jQuery.ui.keyCode.SPACE || event.which == jQuery.ui.keyCode.ENTER) {\r\n // click the radio button to which the event is actually tied\r\n that.prev('input[type=\"radio\"]').click();\r\n }\r\n });\r\n\r\n //For Apply Now page. When user is not logged, tab should go to input box in login section, not appSectionItem.\r\n notLoggedIn.length ? widget.find('form#AccountForm input').first().focus() : null;\r\n \r\n }\r\n\r\n /**\r\n * giveContentFocus()\r\n * Needed in scenarios where desired tab order is outside of normal flow such as: \r\n * - Closing, Cancelling, or OK out of smModal and making tab focus go to main content instead of main menu.\r\n * - Giving slide ups focus upon key event on sticky footer buttons (Registration).\r\n * \r\n * @param string $elem Tag and/or class, or ID\r\n */\r\n function giveContentFocus(elem) { \r\n var content = jQuery(elem);\r\n var firstTabbable = content.find(':tabbable').first().not(':hidden');\r\n firstTabbable.focus();\r\n }\r\n\r\n //// Helper Functions\r\n //function IsNullOrEmpty(value) {\r\n // if (value == null || value == undefined || value.toString() == '' || (Array.isArray(value) && value.length == 0))\r\n // return true;\r\n // return false;\r\n //}\r\n\r\n // extend our namespace\r\n jQuery.extend(true, sm.portal.keyboardNav, {\r\n modalNav : modalNav,\r\n keyboardControl : keyboardControl,\r\n aria : aria,\r\n ariaLabel : ariaLabel,\r\n widget : widget,\r\n giveContentFocus : giveContentFocus\r\n });\r\n\r\n})(jQuery);\r\n"]}