| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- (function() {
- var keyHandler = {
- 38: moveUp, // Up
- 40: moveDown, // Down
- 37: closeDropdown, // Left
- 39: openDropdown, // Right
- 72: closeDropdown, // h
- 74: moveDown, // j
- 75: moveUp, // k
- 76: openDropdown, // l
- 191: showKeyboardHelp, // /
- 63: showKeyboardHelp, // ?
- 48: 'js-direct', // 0
- 83: 'js-system', // s
- 69: 'js-external', // e
- 65: 'js-addrule', // a
- 187: 'js-addrule', // +, =
- 84: 'js-temprule', // t
- 79: 'js-option', // o
- 82: 'js-reqinfo', // r
- };
- for (i = 1; i <= 9; i++) {
- keyHandler[48 + i] = 'js-profile-' + i;
- }
- var walker;
- return init();
- function init() {
- walker = document.createTreeWalker(
- document.querySelector('.om-nav'),
- NodeFilter.SHOW_ELEMENT,
- {acceptNode: tabbableElementsOnly}
- );
- window.addEventListener('keydown', function(e) {
- var handler = keyHandler[e.keyCode];
- if (!handler) console.log(e.keyCode);
- if (handler == null) return;
- if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') return;
- if (typeof handler === 'string') {
- clickById(handler);
- } else {
- handler();
- }
- });
- $script.ready('om-profile-items', function() {
- var activeNavLink = document.querySelector('.om-nav-item.om-active > a');
- if (activeNavLink) activeNavLink.focus();
- });
- }
- function tabbableElementsOnly(node) {
- if (node.classList.contains('om-hidden')) {
- return NodeFilter.FILTER_REJECT;
- } else if (node.classList.contains('om-dropdown') &&
- !node.parentElement.classList.contains('om-open')) {
- return NodeFilter.FILTER_REJECT;
- } else if (node.tabIndex >= 0) {
- return NodeFilter.FILTER_ACCEPT;
- } else {
- return NodeFilter.FILTER_SKIP;
- }
- }
- function moveUp() {
- walker.currentNode = document.activeElement;
- var result = null;
- if (walker.currentNode) {
- result = walker.previousNode();
- }
- if (!result) {
- walker.currentNode = walker.root.lastElementChild;
- walker.previousNode();
- walker.nextNode();
- }
- walker.currentNode.focus();
- }
- function moveDown() {
- walker.currentNode = document.activeElement;
- var result = null;
- if (walker.currentNode) {
- result = walker.nextNode();
- }
- if (!result) {
- walker.currentNode = walker.root;
- walker.nextNode();
- }
- walker.currentNode.focus();
- }
- function openDropdown() {
- var container = document.querySelector('.om-open');
- if (container) {
- // Existing dropdown. Just move to it.
- container.querySelector('a').focus();
- return;
- }
- var selectedItem = document.activeElement;
- if (!selectedItem || !selectedItem.parentElement) return;
- if (selectedItem.parentElement.classList.contains('om-has-dropdown')) {
- var toggle = selectedItem.querySelector('.om-edit-toggle');
- if (toggle) {
- toggle.click();
- } else {
- selectedItem.click();
- }
- }
- }
- function closeDropdown() {
- var container = document.querySelector('.om-open');
- if (container) {
- container.classList.remove('om-open');
- container.querySelector('a').focus();
- }
- }
- function showKeyboardHelp() {
- $script('js/keyboard_help.js');
- }
- function clickById(id) {
- var element = document.getElementById(id);
- if (element) element.click();
- }
- })();
|