(function () { "use strict"; angular.module('shared') .directive('tabsKeydown', ['$state', function ($state) { return { restrict: 'A', link: function (scope, element, attrs) { var keyboardKeys = { tab: 9, space: 32, left: 37, right: 39 }; element.on('keydown', function (event) { switch (event.keyCode) { case keyboardKeys.left: case keyboardKeys.right: handleArrowsKeydown(event); break; case keyboardKeys.space: handleSpaceKeyDown(event); break; default: return; } }); var handleSpaceKeyDown = function (event) { if (attrs.role === 'tab') { event.preventDefault(); $state.go(attrs.uiSref); } }; var handleArrowsKeydown = function (event) { if (attrs.role === 'tab') { var parentElement = element.parent(); var focusableElements = getTabElements(); var firstFocusableElement = focusableElements[0]; var lastFocusableElement = focusableElements[focusableElements.length - 1]; event.preventDefault(); if (event.keyCode === keyboardKeys.left) { focusCorrectTab(element[0], firstFocusableElement, lastFocusableElement, parentElement.prev()); } else { focusCorrectTab(element[0], lastFocusableElement, firstFocusableElement, parentElement.next()); } } }; var getTabElements = function () { return angular.element('.navTabs').find('button'); }; var isSameElement = function(element1, element2) { return element1 === element2 || element1.isEqualNode(element2); }; var focusCorrectTab = function (currentElement, compareElement, oppositeEndTab, nextInSequenceTab) { if (isSameElement(currentElement, compareElement)) { oppositeEndTab.focus(); } else { nextInSequenceTab[0].firstElementChild.focus(); } }; } }; }]); })();