PDFJS.reader.SearchController = function () {
var reader = this,
book = this.book,
query = "";
var $searchBox = $("#searchBox"),
$clearBtn = $("#searchBox").next(),
$clear_search = $("#clear_search"),
$searchResults = $("#searchResults"),
$searchView = $("#searchView"),
$body = $("#viewer iframe").contents().find('body'),
$sidebar = $("#sidebar");
var onShow = function() {
$searchView.addClass("open");
$searchBox.focus();
};
var onHide = function() {
unhighlight();
$searchView.removeClass("open");
};
var search = function(q) {
if (q === undefined) {
q = $searchBox.val();
}
if (q == '') {
clear();
return;
}
reader.SidebarController.changePanelTo("Search");
$searchResults.empty();
$searchResults.append("
Searching...
");
reader.SearchController.query = q;
runQuery(q, $searchResults[0]);
};
$searchBox.on("keydown", function(e) {
// Show the clear button if text input value is not empty
$clearBtn.css("visibility", (this.value.length) ? "visible" : "hidden");
// run search when Enter is pressed
if (e.keyCode === 13) {
search();
}
e.stopPropagation();
});
$clearBtn.on("click", function() {
$(this).css("visibility", "hidden");
$searchBox.val("");
});
$clear_search.on("click", function () {
unhighlight();
$searchResults.empty();
});
var clear = function () {
unhighlight();
$searchResults.empty();
if (reader.SidebarController.getActivePanel() == "Search") {
reader.SidebarController.changePanelTo("Toc");
}
};
var highlightQuery = function(e) {
$("#viewer iframe").contents().find('body').highlight(reader.SearchController.query, { element: 'span' });
};
var unhighlight = function(e) {
$body = $("#viewer iframe").contents().find('body');
$body.unhighlight();
book.off("renderer:chapterDisplayed", highlightQuery);
};
// perform search and build result list
var runQuery = function(query, element) {
return new Promise(function(resolve, reject) {
var results = [];
for (var i = 0; i < book.spine.length; i++) {
var spineItem = book.spine[i];
results.push(new Promise(function(resolve, reject) {
new Promise(function(resolve, reject) {
resolve(new PDFJS.Chapter(spineItem, book.store, book.credentials));
}).then(function(chapter) {
return new Promise(function(resolve, reject) {
chapter.load().then(function() {
resolve(chapter);
}).catch(reject);
});
}).then(function(chapter) {
return Promise.resolve(chapter.find(query));
}).then(function(result) {
resolve(result);
});
}));
}
Promise.all(results).then(function(results) {
return new Promise(function(resolve, reject) {
resolve(results);
var mergedResults = [].concat.apply([], results);
element.innerHTML = "";
for (var i = 0; i < mergedResults.length; i++) {
try {
var listitem = document.createElement("li");
var link = document.createElement("a");
listitem.classList.add("list_item");
listitem.id = "search-"+i;
link.href=mergedResults[i].cfi;
link.textContent = mergedResults[i].excerpt;
link.classList.add("toc_link");
link.addEventListener("click", function(e) {
e.preventDefault();
book.gotoCfi(this.getAttribute("href"));
$searchResults.find(".list_item")
.removeClass("currentChapter");
$(this).parent("li").addClass("currentChapter");
$(this).data('query', query);
book.on("renderer:chapterDisplayed", highlightQuery);
});
listitem.appendChild(link);
element.appendChild(listitem);
} catch (e) {
console.warn(e);
}
}
});
});
});
};
return {
"show" : onShow,
"hide" : onHide,
"search": search,
"query" : query,
"clear" : clear,
"unhighlight" : unhighlight
};
};