1
0
Fork 0
mirror of https://github.com/koalyptus/TableFilter.git synced 2024-05-17 22:06:41 +02:00
TableFilter/doc/script/search.js
2015-08-02 18:27:59 +10:00

118 lines
3.5 KiB
JavaScript

(function(){
var searchIndex = window.esdocSearchIndex;
var searchBox = document.querySelector('.search-box');
var input = document.querySelector('.search-input');
var result = document.querySelector('.search-result');
var selectedIndex = -1;
var prevText;
// active search box and focus when mouse enter on search box.
searchBox.addEventListener('mouseenter', function(){
searchBox.classList.add('active');
input.focus();
});
// search with text when key is upped.
input.addEventListener('keyup', function(ev){
var text = ev.target.value.toLowerCase();
if (!text) {
result.style.display = 'none';
result.innerHTML = '';
return;
}
if (text === prevText) return;
prevText = text;
var html = {class: [], method: [], member: [], function: [], variable: [], typedef: [], external: [], file: [], test: [], testFile: []};
var len = searchIndex.length;
var kind;
for (var i = 0; i < len; i++) {
var pair = searchIndex[i];
if (pair[0].indexOf(text) !== -1) {
kind = pair[3];
html[kind].push('<li><a href="' + pair[1] + '">' + pair[2] + '</a></li>');
}
}
var innerHTML = '';
for (kind in html) {
var list = html[kind];
if (!list.length) continue;
innerHTML += '<li class="search-separator">' + kind + '</li>\n' + list.join('\n');
}
result.innerHTML = innerHTML;
if (innerHTML) result.style.display = 'block';
selectedIndex = -1;
});
// down, up and enter key are pressed, select search result.
input.addEventListener('keydown', function(ev){
if (ev.keyCode === 40) {
// arrow down
var current = result.children[selectedIndex];
var selected = result.children[selectedIndex + 1];
if (selected && selected.classList.contains('search-separator')) {
var selected = result.children[selectedIndex + 2];
selectedIndex++;
}
if (selected) {
if (current) current.classList.remove('selected');
selectedIndex++;
selected.classList.add('selected');
}
} else if (ev.keyCode === 38) {
// arrow up
var current = result.children[selectedIndex];
var selected = result.children[selectedIndex - 1];
if (selected && selected.classList.contains('search-separator')) {
var selected = result.children[selectedIndex - 2];
selectedIndex--;
}
if (selected) {
if (current) current.classList.remove('selected');
selectedIndex--;
selected.classList.add('selected');
}
} else if (ev.keyCode === 13) {
// enter
var current = result.children[selectedIndex];
if (current) {
var link = current.querySelector('a');
if (link) location.href = link.href;
}
} else {
return;
}
ev.preventDefault();
});
// select search result when search result is mouse over.
result.addEventListener('mousemove', function(ev){
var current = result.children[selectedIndex];
if (current) current.classList.remove('selected');
var li = ev.target;
while (li) {
if (li.nodeName === 'LI') break;
li = li.parentElement;
}
if (li) {
selectedIndex = Array.prototype.indexOf.call(result.children, li);
li.classList.add('selected');
}
});
// clear search result when body is clicked.
document.body.addEventListener('click', function(ev){
selectedIndex = -1;
result.style.display = 'none';
result.innerHTML = '';
});
})();