-
Notifications
You must be signed in to change notification settings - Fork 3
/
list-find-items.js
121 lines (94 loc) · 3.2 KB
/
list-find-items.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// list-find-items.js
// (C) Leo C. Stein ([email protected])
// 2013
//
// Part of the arXiv-keys extension
//
// This work is licensed as Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)
// For full details see http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_US
//////////////////////////////////////////////////////////////////////
// Items on /list/ and /find pages
//////////////////////////////////////////////////////////////////////
// Keep the namespace clean. Nothing to export.
(function(){
var items;
var selectedItem = 0;
// See https://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport/7557433#7557433
function isElementInViewport (el) {
var rect = el.getBoundingClientRect();
return (
rect.top >= 0 && rect.left >= 0 &&
rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */
rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */
);
};
function setSelected(i, doScroll) {
if ((i<0) || (i>= items.length))
return;
// Clear anything else that's selected
var prevSelected = document.getElementsByClassName("selected");
for (var k=0; k<prevSelected.length; k++) {
var thisItem = prevSelected[k];
thisItem.className = thisItem.className.replace
( /(?:^|\s)selected(?!\S)/g , '' );
};
// Set the new one
items[i].className += " selected";
selectedItem = i;
if (doScroll && !isElementInViewport(items[i])) {
// The name of the anchor is item<i+1>.
items[i].scrollIntoView({behavior: "smooth"});
};
// Store this into sessionStorage
arXivKeys.setSessionSelected(i);
};
function getSelectedLinks() {
var linkContainer = items[selectedItem].parentNode.previousElementSibling;
if (linkContainer)
return linkContainer.getElementsByTagName("a");
else return [];
};
function getSelLinkTitle(title) {
var links = getSelectedLinks();
for (var i = 0; i < links.length; i++)
if (links[i].title == title)
return links[i];
return null;
};
function openTitleLink(title,inNewWin) {
var link = getSelLinkTitle(title);
if (link)
arXivKeys.openURL(link.href, inNewWin);
};
function openAbstract(inNewWin) {
openTitleLink("Abstract",inNewWin);
};
function openPDF(inNewWin) {
openTitleLink("Download PDF",inNewWin);
};
function goDown() {
if(selectedItem < items.length-1)
setSelected(selectedItem + 1, true);
};
function goUp() {
if(selectedItem > 0)
setSelected(selectedItem - 1, true);
};
////////////////////////////////////////////////////////////
// Get the items
items = document.getElementsByClassName("meta");
// Install key handlers
arXivKeys.keyMap["NEXTABS"].act = goDown;
arXivKeys.keyMap["PREVABS"].act = goUp;
arXivKeys.keyMap["OPENABS"].act = openAbstract;
arXivKeys.keyMap["OPENPDF"].act = openPDF;
// Add click handlers
var makeSelect = function(I) {
return function() { setSelected(I, false); };
};
for (var i=0; i < items.length; i++) {
items[i].onclick = makeSelect(i);
};
// See if sessionStorage already has something stored for the selected item
setSelected(arXivKeys.getSessionSelected(),false);
}());