diff --git a/kjvstudy_org/templates/base.html b/kjvstudy_org/templates/base.html
index 8141aab..b1e7998 100644
--- a/kjvstudy_org/templates/base.html
+++ b/kjvstudy_org/templates/base.html
@@ -1613,6 +1613,26 @@
});
})();
+ // Global viewport helpers for keyboard navigation
+ window.KJVNav = {
+ isInViewport: function(el) {
+ if (!el) return false;
+ var rect = el.getBoundingClientRect();
+ return rect.top < window.innerHeight && rect.bottom > 0;
+ },
+ findFirstVisibleIndex: function(elements) {
+ for (var i = 0; i < elements.length; i++) {
+ if (this.isInViewport(elements[i])) return i;
+ }
+ return 0;
+ },
+ isSelectionOffScreen: function(elements, selectedIndex) {
+ if (selectedIndex < 0) return true;
+ if (selectedIndex >= elements.length) return true;
+ return !this.isInViewport(elements[selectedIndex]);
+ }
+ };
+
// Keyboard shortcuts
document.addEventListener('keydown', function(e) {
// Don't trigger if user is typing in an input field
diff --git a/kjvstudy_org/templates/biblical_angels.html b/kjvstudy_org/templates/biblical_angels.html
index b0ba770..2cc4319 100644
--- a/kjvstudy_org/templates/biblical_angels.html
+++ b/kjvstudy_org/templates/biblical_angels.html
@@ -323,11 +323,20 @@ document.addEventListener('DOMContentLoaded', function() {
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) {
+ selectEntry(KJVNav.findFirstVisibleIndex(entries));
+ } else {
+ selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectEntry(0);
- else selectEntry(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) {
+ selectEntry(KJVNav.findFirstVisibleIndex(entries));
+ } else if (selectedIndex <= 0) {
+ selectEntry(0);
+ } else {
+ selectEntry(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/biblical_covenants.html b/kjvstudy_org/templates/biblical_covenants.html
index 7478b77..405b4c8 100644
--- a/kjvstudy_org/templates/biblical_covenants.html
+++ b/kjvstudy_org/templates/biblical_covenants.html
@@ -321,11 +321,20 @@ document.addEventListener('DOMContentLoaded', function() {
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) {
+ selectEntry(KJVNav.findFirstVisibleIndex(entries));
+ } else {
+ selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectEntry(0);
- else selectEntry(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) {
+ selectEntry(KJVNav.findFirstVisibleIndex(entries));
+ } else if (selectedIndex <= 0) {
+ selectEntry(0);
+ } else {
+ selectEntry(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/biblical_festivals.html b/kjvstudy_org/templates/biblical_festivals.html
index 25ddf5d..18cdf92 100644
--- a/kjvstudy_org/templates/biblical_festivals.html
+++ b/kjvstudy_org/templates/biblical_festivals.html
@@ -321,11 +321,20 @@ document.addEventListener('DOMContentLoaded', function() {
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) {
+ selectEntry(KJVNav.findFirstVisibleIndex(entries));
+ } else {
+ selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectEntry(0);
- else selectEntry(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) {
+ selectEntry(KJVNav.findFirstVisibleIndex(entries));
+ } else if (selectedIndex <= 0) {
+ selectEntry(0);
+ } else {
+ selectEntry(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/biblical_maps.html b/kjvstudy_org/templates/biblical_maps.html
index b82ced7..6eefab9 100644
--- a/kjvstudy_org/templates/biblical_maps.html
+++ b/kjvstudy_org/templates/biblical_maps.html
@@ -372,11 +372,20 @@
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) {
+ selectEntry(KJVNav.findFirstVisibleIndex(entries));
+ } else {
+ selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectEntry(0);
- else selectEntry(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) {
+ selectEntry(KJVNav.findFirstVisibleIndex(entries));
+ } else if (selectedIndex <= 0) {
+ selectEntry(0);
+ } else {
+ selectEntry(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/biblical_prophets.html b/kjvstudy_org/templates/biblical_prophets.html
index 26d1691..1b52150 100644
--- a/kjvstudy_org/templates/biblical_prophets.html
+++ b/kjvstudy_org/templates/biblical_prophets.html
@@ -319,11 +319,20 @@ document.addEventListener('DOMContentLoaded', function() {
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) {
+ selectEntry(KJVNav.findFirstVisibleIndex(entries));
+ } else {
+ selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectEntry(0);
- else selectEntry(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) {
+ selectEntry(KJVNav.findFirstVisibleIndex(entries));
+ } else if (selectedIndex <= 0) {
+ selectEntry(0);
+ } else {
+ selectEntry(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/book.html b/kjvstudy_org/templates/book.html
index b893861..187ca86 100644
--- a/kjvstudy_org/templates/book.html
+++ b/kjvstudy_org/templates/book.html
@@ -403,13 +403,21 @@ document.addEventListener('DOMContentLoaded', function() {
// Up arrow or k: Previous chapter
if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- selectChapter(selectedChapterIndex - 1);
+ if (KJVNav.isSelectionOffScreen(chapterLinks, selectedChapterIndex)) {
+ selectChapter(KJVNav.findFirstVisibleIndex(chapterLinks));
+ } else {
+ selectChapter(selectedChapterIndex - 1);
+ }
}
// Down arrow or j: Next chapter
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectChapter(selectedChapterIndex + 1);
+ if (KJVNav.isSelectionOffScreen(chapterLinks, selectedChapterIndex)) {
+ selectChapter(KJVNav.findFirstVisibleIndex(chapterLinks));
+ } else {
+ selectChapter(selectedChapterIndex + 1);
+ }
}
// Enter: Go to selected chapter
diff --git a/kjvstudy_org/templates/chapter.html b/kjvstudy_org/templates/chapter.html
index 0a1bb95..a947d73 100644
--- a/kjvstudy_org/templates/chapter.html
+++ b/kjvstudy_org/templates/chapter.html
@@ -464,13 +464,21 @@ document.addEventListener('DOMContentLoaded', function() {
// Up arrow or k: Previous verse
if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- selectVerse(selectedVerseIndex - 1);
+ if (KJVNav.isSelectionOffScreen(verses, selectedVerseIndex)) {
+ selectVerse(KJVNav.findFirstVisibleIndex(verses));
+ } else {
+ selectVerse(selectedVerseIndex - 1);
+ }
}
// Down arrow or j: Next verse
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectVerse(selectedVerseIndex + 1);
+ if (KJVNav.isSelectionOffScreen(verses, selectedVerseIndex)) {
+ selectVerse(KJVNav.findFirstVisibleIndex(verses));
+ } else {
+ selectVerse(selectedVerseIndex + 1);
+ }
}
// Enter: Go to selected verse page
diff --git a/kjvstudy_org/templates/commentary.html b/kjvstudy_org/templates/commentary.html
index 878652e..bbe4a33 100644
--- a/kjvstudy_org/templates/commentary.html
+++ b/kjvstudy_org/templates/commentary.html
@@ -532,11 +532,20 @@ document.addEventListener('DOMContentLoaded', function() {
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectCard(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(verseCards, selectedIndex)) {
+ selectCard(KJVNav.findFirstVisibleIndex(verseCards));
+ } else {
+ selectCard(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectCard(0);
- else selectCard(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(verseCards, selectedIndex)) {
+ selectCard(KJVNav.findFirstVisibleIndex(verseCards));
+ } else if (selectedIndex <= 0) {
+ selectCard(0);
+ } else {
+ selectCard(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/family_tree_ancestors.html b/kjvstudy_org/templates/family_tree_ancestors.html
index e4d611e..c955db3 100644
--- a/kjvstudy_org/templates/family_tree_ancestors.html
+++ b/kjvstudy_org/templates/family_tree_ancestors.html
@@ -171,11 +171,20 @@
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectNode(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(nodes, selectedIndex)) {
+ selectNode(KJVNav.findFirstVisibleIndex(nodes));
+ } else {
+ selectNode(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectNode(0);
- else selectNode(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(nodes, selectedIndex)) {
+ selectNode(KJVNav.findFirstVisibleIndex(nodes));
+ } else if (selectedIndex <= 0) {
+ selectNode(0);
+ } else {
+ selectNode(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/family_tree_descendants.html b/kjvstudy_org/templates/family_tree_descendants.html
index d7001cb..98e2059 100644
--- a/kjvstudy_org/templates/family_tree_descendants.html
+++ b/kjvstudy_org/templates/family_tree_descendants.html
@@ -173,11 +173,20 @@
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectNode(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(nodes, selectedIndex)) {
+ selectNode(KJVNav.findFirstVisibleIndex(nodes));
+ } else {
+ selectNode(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectNode(0);
- else selectNode(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(nodes, selectedIndex)) {
+ selectNode(KJVNav.findFirstVisibleIndex(nodes));
+ } else if (selectedIndex <= 0) {
+ selectNode(0);
+ } else {
+ selectNode(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/family_tree_generation.html b/kjvstudy_org/templates/family_tree_generation.html
index 97f6b9c..36f3183 100644
--- a/kjvstudy_org/templates/family_tree_generation.html
+++ b/kjvstudy_org/templates/family_tree_generation.html
@@ -444,11 +444,20 @@
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectCard(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(cards, selectedIndex)) {
+ selectCard(KJVNav.findFirstVisibleIndex(cards));
+ } else {
+ selectCard(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectCard(0);
- else selectCard(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(cards, selectedIndex)) {
+ selectCard(KJVNav.findFirstVisibleIndex(cards));
+ } else if (selectedIndex <= 0) {
+ selectCard(0);
+ } else {
+ selectCard(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
// Go to previous generation or back
diff --git a/kjvstudy_org/templates/family_tree_person.html b/kjvstudy_org/templates/family_tree_person.html
index e07b0cf..94eb4e0 100644
--- a/kjvstudy_org/templates/family_tree_person.html
+++ b/kjvstudy_org/templates/family_tree_person.html
@@ -704,11 +704,20 @@
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectSection(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(sections, selectedIndex)) {
+ selectSection(KJVNav.findFirstVisibleIndex(sections));
+ } else {
+ selectSection(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectSection(0);
- else selectSection(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(sections, selectedIndex)) {
+ selectSection(KJVNav.findFirstVisibleIndex(sections));
+ } else if (selectedIndex <= 0) {
+ selectSection(0);
+ } else {
+ selectSection(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/family_tree_search.html b/kjvstudy_org/templates/family_tree_search.html
index 80a1c3e..f30a112 100644
--- a/kjvstudy_org/templates/family_tree_search.html
+++ b/kjvstudy_org/templates/family_tree_search.html
@@ -75,11 +75,20 @@
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectResult(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(results, selectedIndex)) {
+ selectResult(KJVNav.findFirstVisibleIndex(results));
+ } else {
+ selectResult(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectResult(0);
- else selectResult(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(results, selectedIndex)) {
+ selectResult(KJVNav.findFirstVisibleIndex(results));
+ } else if (selectedIndex <= 0) {
+ selectResult(0);
+ } else {
+ selectResult(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/fruits_of_spirit.html b/kjvstudy_org/templates/fruits_of_spirit.html
index 1e6c494..18bc777 100644
--- a/kjvstudy_org/templates/fruits_of_spirit.html
+++ b/kjvstudy_org/templates/fruits_of_spirit.html
@@ -325,11 +325,20 @@ document.addEventListener('DOMContentLoaded', function() {
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) {
+ selectEntry(KJVNav.findFirstVisibleIndex(entries));
+ } else {
+ selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectEntry(0);
- else selectEntry(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) {
+ selectEntry(KJVNav.findFirstVisibleIndex(entries));
+ } else if (selectedIndex <= 0) {
+ selectEntry(0);
+ } else {
+ selectEntry(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/names_of_god.html b/kjvstudy_org/templates/names_of_god.html
index 5ba05c2..740ef0a 100644
--- a/kjvstudy_org/templates/names_of_god.html
+++ b/kjvstudy_org/templates/names_of_god.html
@@ -319,11 +319,20 @@ document.addEventListener('DOMContentLoaded', function() {
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) {
+ selectEntry(KJVNav.findFirstVisibleIndex(entries));
+ } else {
+ selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectEntry(0);
- else selectEntry(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) {
+ selectEntry(KJVNav.findFirstVisibleIndex(entries));
+ } else if (selectedIndex <= 0) {
+ selectEntry(0);
+ } else {
+ selectEntry(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/parable_detail.html b/kjvstudy_org/templates/parable_detail.html
index cd9af65..c7e2ece 100644
--- a/kjvstudy_org/templates/parable_detail.html
+++ b/kjvstudy_org/templates/parable_detail.html
@@ -140,11 +140,20 @@
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectElement(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) {
+ selectElement(KJVNav.findFirstVisibleIndex(elements));
+ } else {
+ selectElement(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectElement(0);
- else selectElement(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) {
+ selectElement(KJVNav.findFirstVisibleIndex(elements));
+ } else if (selectedIndex <= 0) {
+ selectElement(0);
+ } else {
+ selectElement(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/parables.html b/kjvstudy_org/templates/parables.html
index 9aa255f..ad7cd98 100644
--- a/kjvstudy_org/templates/parables.html
+++ b/kjvstudy_org/templates/parables.html
@@ -333,11 +333,20 @@ document.addEventListener('DOMContentLoaded', function() {
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) {
+ selectEntry(KJVNav.findFirstVisibleIndex(entries));
+ } else {
+ selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectEntry(0);
- else selectEntry(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) {
+ selectEntry(KJVNav.findFirstVisibleIndex(entries));
+ } else if (selectedIndex <= 0) {
+ selectEntry(0);
+ } else {
+ selectEntry(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/reading_plan_detail.html b/kjvstudy_org/templates/reading_plan_detail.html
index e98b669..aa73b42 100644
--- a/kjvstudy_org/templates/reading_plan_detail.html
+++ b/kjvstudy_org/templates/reading_plan_detail.html
@@ -244,11 +244,20 @@
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectElement(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) {
+ selectElement(KJVNav.findFirstVisibleIndex(elements));
+ } else {
+ selectElement(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectElement(0);
- else selectElement(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) {
+ selectElement(KJVNav.findFirstVisibleIndex(elements));
+ } else if (selectedIndex <= 0) {
+ selectElement(0);
+ } else {
+ selectElement(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/resource_detail.html b/kjvstudy_org/templates/resource_detail.html
index 4c1cafa..062c2ca 100644
--- a/kjvstudy_org/templates/resource_detail.html
+++ b/kjvstudy_org/templates/resource_detail.html
@@ -194,11 +194,20 @@
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectElement(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) {
+ selectElement(KJVNav.findFirstVisibleIndex(elements));
+ } else {
+ selectElement(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectElement(0);
- else selectElement(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) {
+ selectElement(KJVNav.findFirstVisibleIndex(elements));
+ } else if (selectedIndex <= 0) {
+ selectElement(0);
+ } else {
+ selectElement(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/story_detail.html b/kjvstudy_org/templates/story_detail.html
index 798ef6e..44f602f 100644
--- a/kjvstudy_org/templates/story_detail.html
+++ b/kjvstudy_org/templates/story_detail.html
@@ -376,12 +376,21 @@ hr.story-divider::before {
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- // Start at first paragraph, not metadata
- selectElement(selectedIndex < 0 ? firstParagraphIndex : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) {
+ selectElement(KJVNav.findFirstVisibleIndex(elements));
+ } else {
+ // Start at first paragraph, not metadata
+ selectElement(selectedIndex < 0 ? firstParagraphIndex : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectElement(0);
- else selectElement(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) {
+ selectElement(KJVNav.findFirstVisibleIndex(elements));
+ } else if (selectedIndex <= 0) {
+ selectElement(0);
+ } else {
+ selectElement(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/story_kids.html b/kjvstudy_org/templates/story_kids.html
index 02bb1e8..126d9b0 100644
--- a/kjvstudy_org/templates/story_kids.html
+++ b/kjvstudy_org/templates/story_kids.html
@@ -397,12 +397,21 @@ hr.story-divider::before {
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- // Start at first paragraph, not metadata
- selectElement(selectedIndex < 0 ? firstParagraphIndex : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) {
+ selectElement(KJVNav.findFirstVisibleIndex(elements));
+ } else {
+ // Start at first paragraph, not metadata
+ selectElement(selectedIndex < 0 ? firstParagraphIndex : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectElement(0);
- else selectElement(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) {
+ selectElement(KJVNav.findFirstVisibleIndex(elements));
+ } else if (selectedIndex <= 0) {
+ selectElement(0);
+ } else {
+ selectElement(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/strongs_index.html b/kjvstudy_org/templates/strongs_index.html
index c7a41e7..1fec72a 100644
--- a/kjvstudy_org/templates/strongs_index.html
+++ b/kjvstudy_org/templates/strongs_index.html
@@ -354,11 +354,20 @@
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectItem(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(allItems, selectedIndex)) {
+ selectItem(KJVNav.findFirstVisibleIndex(allItems));
+ } else {
+ selectItem(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectItem(0);
- else selectItem(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(allItems, selectedIndex)) {
+ selectItem(KJVNav.findFirstVisibleIndex(allItems));
+ } else if (selectedIndex <= 0) {
+ selectItem(0);
+ } else {
+ selectItem(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/strongs_language_index.html b/kjvstudy_org/templates/strongs_language_index.html
index 170f126..59530c1 100644
--- a/kjvstudy_org/templates/strongs_language_index.html
+++ b/kjvstudy_org/templates/strongs_language_index.html
@@ -322,11 +322,20 @@
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) {
+ selectEntry(KJVNav.findFirstVisibleIndex(entries));
+ } else {
+ selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectEntry(0);
- else selectEntry(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) {
+ selectEntry(KJVNav.findFirstVisibleIndex(entries));
+ } else if (selectedIndex <= 0) {
+ selectEntry(0);
+ } else {
+ selectEntry(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/study_guide_detail.html b/kjvstudy_org/templates/study_guide_detail.html
index 0cd3b36..03452f1 100644
--- a/kjvstudy_org/templates/study_guide_detail.html
+++ b/kjvstudy_org/templates/study_guide_detail.html
@@ -245,11 +245,20 @@ document.addEventListener('DOMContentLoaded', function() {
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectSection(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(sections, selectedIndex)) {
+ selectSection(KJVNav.findFirstVisibleIndex(sections));
+ } else {
+ selectSection(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectSection(0);
- else selectSection(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(sections, selectedIndex)) {
+ selectSection(KJVNav.findFirstVisibleIndex(sections));
+ } else if (selectedIndex <= 0) {
+ selectSection(0);
+ } else {
+ selectSection(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/study_guides.html b/kjvstudy_org/templates/study_guides.html
index 5d15d40..56d75a5 100644
--- a/kjvstudy_org/templates/study_guides.html
+++ b/kjvstudy_org/templates/study_guides.html
@@ -64,11 +64,20 @@
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectLink(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(links, selectedIndex)) {
+ selectLink(KJVNav.findFirstVisibleIndex(links));
+ } else {
+ selectLink(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectLink(0);
- else selectLink(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(links, selectedIndex)) {
+ selectLink(KJVNav.findFirstVisibleIndex(links));
+ } else if (selectedIndex <= 0) {
+ selectLink(0);
+ } else {
+ selectLink(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/tetragrammaton.html b/kjvstudy_org/templates/tetragrammaton.html
index e586d6f..68f9508 100644
--- a/kjvstudy_org/templates/tetragrammaton.html
+++ b/kjvstudy_org/templates/tetragrammaton.html
@@ -196,11 +196,20 @@ document.addEventListener('DOMContentLoaded', function() {
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectSection(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(sections, selectedIndex)) {
+ selectSection(KJVNav.findFirstVisibleIndex(sections));
+ } else {
+ selectSection(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectSection(0);
- else selectSection(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(sections, selectedIndex)) {
+ selectSection(KJVNav.findFirstVisibleIndex(sections));
+ } else if (selectedIndex <= 0) {
+ selectSection(0);
+ } else {
+ selectSection(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/topic_detail.html b/kjvstudy_org/templates/topic_detail.html
index 5675aa4..432c69f 100644
--- a/kjvstudy_org/templates/topic_detail.html
+++ b/kjvstudy_org/templates/topic_detail.html
@@ -222,11 +222,20 @@
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectElement(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) {
+ selectElement(KJVNav.findFirstVisibleIndex(elements));
+ } else {
+ selectElement(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectElement(0);
- else selectElement(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) {
+ selectElement(KJVNav.findFirstVisibleIndex(elements));
+ } else if (selectedIndex <= 0) {
+ selectElement(0);
+ } else {
+ selectElement(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/twelve_apostles.html b/kjvstudy_org/templates/twelve_apostles.html
index 679b105..f733476 100644
--- a/kjvstudy_org/templates/twelve_apostles.html
+++ b/kjvstudy_org/templates/twelve_apostles.html
@@ -321,11 +321,20 @@ document.addEventListener('DOMContentLoaded', function() {
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) {
+ selectEntry(KJVNav.findFirstVisibleIndex(entries));
+ } else {
+ selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectEntry(0);
- else selectEntry(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) {
+ selectEntry(KJVNav.findFirstVisibleIndex(entries));
+ } else if (selectedIndex <= 0) {
+ selectEntry(0);
+ } else {
+ selectEntry(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/verse.html b/kjvstudy_org/templates/verse.html
index 171aae7..7c185ae 100644
--- a/kjvstudy_org/templates/verse.html
+++ b/kjvstudy_org/templates/verse.html
@@ -982,11 +982,20 @@
// Normal navigation mode
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectElement(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) {
+ selectElement(KJVNav.findFirstVisibleIndex(elements));
+ } else {
+ selectElement(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectElement(0);
- else selectElement(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(elements, selectedIndex)) {
+ selectElement(KJVNav.findFirstVisibleIndex(elements));
+ } else if (selectedIndex <= 0) {
+ selectElement(0);
+ } else {
+ selectElement(selectedIndex - 1);
+ }
} else if (e.key === 'Enter') {
e.preventDefault();
// If on interlinear, enter word mode
diff --git a/kjvstudy_org/templates/verse_of_the_day.html b/kjvstudy_org/templates/verse_of_the_day.html
index 0f0b631..6a28b57 100644
--- a/kjvstudy_org/templates/verse_of_the_day.html
+++ b/kjvstudy_org/templates/verse_of_the_day.html
@@ -70,11 +70,20 @@
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectRow(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(rows, selectedIndex)) {
+ selectRow(KJVNav.findFirstVisibleIndex(rows));
+ } else {
+ selectRow(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectRow(0);
- else selectRow(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(rows, selectedIndex)) {
+ selectRow(KJVNav.findFirstVisibleIndex(rows));
+ } else if (selectedIndex <= 0) {
+ selectRow(0);
+ } else {
+ selectRow(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();
diff --git a/kjvstudy_org/templates/women_of_the_bible.html b/kjvstudy_org/templates/women_of_the_bible.html
index 4ce2c22..773824e 100644
--- a/kjvstudy_org/templates/women_of_the_bible.html
+++ b/kjvstudy_org/templates/women_of_the_bible.html
@@ -321,11 +321,20 @@ document.addEventListener('DOMContentLoaded', function() {
if (e.key === 'ArrowDown' || e.key === 'j') {
e.preventDefault();
- selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) {
+ selectEntry(KJVNav.findFirstVisibleIndex(entries));
+ } else {
+ selectEntry(selectedIndex < 0 ? 0 : selectedIndex + 1);
+ }
} else if (e.key === 'ArrowUp' || e.key === 'k') {
e.preventDefault();
- if (selectedIndex <= 0) selectEntry(0);
- else selectEntry(selectedIndex - 1);
+ if (KJVNav.isSelectionOffScreen(entries, selectedIndex)) {
+ selectEntry(KJVNav.findFirstVisibleIndex(entries));
+ } else if (selectedIndex <= 0) {
+ selectEntry(0);
+ } else {
+ selectEntry(selectedIndex - 1);
+ }
} else if (e.key === 'ArrowLeft' || e.key === 'h') {
e.preventDefault();
history.back();