uerySelectorAllArray = function(selector) { return Array.prototype.slice.call( document.querySelectorAll(selector)); } document.addEventListener("DOMContentLoaded", function() { querySelectorAllArray(".PathNav > a").forEach( function(currentValue, currentIndex) { var hrefValue = currentValue.getAttribute("href"); currentValue.onclick = function() { scrollTo(document.querySelector(hrefValue)); return false; }; }); }); var findNum = function() { var s = document.querySelector(".msg.selected"); if (!s || s.id == "EndPath") { return 0; } var out = parseInt(digitMatcher.exec(s.id)[0]); return out; }; var classListAdd = function(el, theClass) { if(!el.className.baseVal) el.className += " " + theClass; else el.className.baseVal += " " + theClass; }; var classListRemove = function(el, theClass) { var className = (!el.className.baseVal) ? el.className : el.className.baseVal; className = className.replace(" " + theClass, ""); if(!el.className.baseVal) el.className = className; else el.className.baseVal = className; }; var scrollTo = function(el) { querySelectorAllArray(".selected").forEach(function(s) { classListRemove(s, "selected"); }); classListAdd(el, "selected"); window.scrollBy(0, el.getBoundingClientRect().top - (window.innerHeight / 2)); highlightArrowsForSelectedEvent(); }; var move = function(num, up, numItems) { if (num == 1 && up || num == numItems - 1 && !up) { return 0; } else if (num == 0 && up) { return numItems - 1; } else if (num == 0 && !up) { return 1 % numItems; } return up ? num - 1 : num + 1; } var numToId = function(num) { if (num == 0) { return document.getElementById("EndPath") } return document.getElementById("Path" + num); }; var navigateTo = function(up) { var numItems = document.querySelectorAll( ".line > .msgEvent, .line > .msgControl").length; var currentSelected = findNum(); var newSelected = move(currentSelected, up, numItems); var newEl = numToId(newSelected, numItems); // Scroll element into center. scrollTo(newEl); }; window.addEventListener("keydown", function (event) { if (event.defaultPrevented) { return; } // key 'j' if (event.keyCode == 74) { navigateTo(/*up=*/false); // key 'k' } else if (event.keyCode == 75) { navigateTo(/*up=*/true); } else { return; } event.preventDefault(); }, true);