(function() { 'use strict'; angular.module('shared') .service('MenuKeyboardService', function MenuKeyboardService() { var service = this; var disabled = false; var keyboardKeys = { enter: 13, space: 32, down: 40, up: 38, escape: 27, tab: 9, home: 36, end: 35 }; service.keyDown = function(event, clickFunction, hamburgerMenuClassName, popover) { if (!disabled) { var chooseFolderElement = $j('.fileCabinetNav-chooseFolder'); var lessonPlannerElement = $j('form[name="lesson_plan_form'); disabled = (chooseFolderElement != null && chooseFolderElement.length > 0) || (lessonPlannerElement != null && lessonPlannerElement.length > 0); } if (disabled) { return; } switch (event.keyCode) { case keyboardKeys.home: home(event); break; case keyboardKeys.end: end(event); break; case keyboardKeys.tab: tab(event, popover); break; case keyboardKeys.up: arrowUpDown(event,-1,popover); break; case keyboardKeys.down: arrowUpDown(event,1,popover); break; case keyboardKeys.space: case keyboardKeys.enter: spaceOrEnter(event,clickFunction); break; case keyboardKeys.escape: escape(hamburgerMenuClassName,popover); break; } }; function home(event) { var menuItems = $j('.js-hamburger-menu-item'); if (menuItems.length > 0) { event.preventDefault(); $j(menuItems[0]).focus(); } } function end(event) { var menuItems = $j('.js-hamburger-menu-item'); if (menuItems.length > 0) { event.preventDefault(); $j(menuItems[menuItems.length - 1]).focus(); } } function tab(event, popover) { arrowUpDown(event,(event.shiftKey ? -1 : 1), popover); } function arrowUpDown(event, increment, popover) { var menuItems = $j('.js-hamburger-menu-item'); var htmlElement = event.currentTarget; var pos = 0; for (pos = 0;pos < menuItems.length;pos++) { if (htmlElement == menuItems[pos]) { break; } } pos += increment; if (pos < 0) { if (event.keyCode == keyboardKeys.tab) { if (popover && popover.popover) { popover.popover.close(); } return; } pos = menuItems.length - 1; } else if (pos > (menuItems.length - 1)) { if (event.keyCode == keyboardKeys.tab) { if (popover && popover.popover) { popover.popover.close(); } return; } pos = 0; } var element = $j(menuItems[pos]); if (element != null && element.length > 0) { element.focus(); if (element.is(':focus')) { event.preventDefault(); } } } function spaceOrEnter(event,clickFunction) { if (clickFunction != null) { event.preventDefault(); clickFunction(); } } function escape(hamburgerMenuClassName,popover) { if (popover && popover.popover) { popover.popover.close(); } var element = $j('.' + hamburgerMenuClassName); if (element != null && element.length > 0) { element.focus(); element.attr('aria-expanded','false'); } } }); })();