kitodo-presentation/Resources/Public/Javascript/PageView/SearchInDocument.js

362 lines
11 KiB
JavaScript

/**
* (c) Kitodo. Key to digital objects e.V. <contact@kitodo.org>
*
* This file is part of the Kitodo and TYPO3 projects.
*
* @license GNU General Public License version 3 or later.
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*/
/**
* This function increases the start parameter of the search form and submits
* the form.
*
* @returns void
*/
function nextResultPage() {
var currentStart = $("#tx-dlf-search-in-document-form input[id='tx-dlf-search-in-document-start']").val();
var newStart = parseInt(currentStart) + 20;
$("#tx-dlf-search-in-document-form input[id='tx-dlf-search-in-document-start']").val(newStart);
$('#tx-dlf-search-in-document-form').submit();
};
/**
* This function decreases the start parameter of the search form and submits
* the form.
*
* @returns void
*/
function previousResultPage() {
var currentStart = $("#tx-dlf-search-in-document-form input[id='tx-dlf-search-in-document-start']").val();
var newStart = (parseInt(currentStart) > 20) ? (parseInt(currentStart) - 20) : 0;
$("#tx-dlf-search-in-document-form input[id='tx-dlf-search-in-document-start']").val(newStart);
$('#tx-dlf-search-in-document-form').submit();
};
/**
* This function resets the start parameter on new queries.
*
* @returns void
*/
function resetStart() {
$("#tx-dlf-search-in-document-form input[id='tx-dlf-search-in-document-start']").val(0);
}
/**
* Add highlight effect for found search phrase.
* @param {array} highlightIds
*
* @returns void
*/
function addHighlightEffect(highlightIds) {
if (highlightIds.length > 0) {
highlightIds.forEach(function (highlightId) {
var targetElement = $('#' + highlightId);
if (targetElement.length > 0 && !targetElement.hasClass('highlight')) {
targetElement.addClass('highlight');
}
});
}
}
/**
* Get base URL for snippet links.
*
* @param {string} id
*
* @returns {string}
*/
function getBaseUrl(id) {
// Take the workview baseUrl from the form action.
// The URL may be in the following form
// - http://example.com/index.php?id=14
// - http://example.com/workview (using slug on page with uid=14)
var baseUrl = $("form#tx-dlf-search-in-document-form").attr('action');
// check if action URL contains id, if not, get URL from window
if(baseUrl === undefined || baseUrl.split('?')[0].indexOf(id) === -1) {
baseUrl = $(location).attr('href');
}
return baseUrl;
}
/**
* Get highlight coordinates as string separated by ';'.
*
* @param {string} highlight
*
* @returns {string}
*/
function getHighlights(highlight) {
var highlights = "";
for(var i = 0; i < highlight.length; i++) {
if (highlights === "") {
highlights += highlight[i];
} else {
if(highlights.indexOf(highlight[i]) === -1) {
highlights += ';' + highlight[i];
}
}
}
return highlights;
}
/**
* Get current URL query parameters.
* It returns array of params in form 'param=value' if there are any params supplied in the given url. If there are none it returns empty array
*
* @param {string} baseUrl
*
* @returns {array} array with params or empty
*/
function getCurrentQueryParams(baseUrl) {
if(baseUrl.indexOf('?') > 0) {
return baseUrl.slice(baseUrl.indexOf('?') + 1).split('&');
}
return [];
}
/**
* Get all URL query parameters for snippet links.
* All means that it includes together params which were already supplied in the page url and params which are returned as search results.
*
* @param {string} baseUrl
* @param {array} queryParams
*
* @returns {array} array with params in form 'param' => 'value'
*/
function getAllQueryParams(baseUrl, queryParams) {
var params = getCurrentQueryParams(baseUrl);
var queryParam;
for(var i = 0; i < params.length; i++) {
queryParam = params[i].split('=');
if(queryParams.indexOf(decodeURIComponent(queryParam[0])) === -1) {
queryParams.push(decodeURIComponent(queryParam[0]));
queryParams[decodeURIComponent(queryParam[0])] = queryParam[1];
}
}
return queryParams;
}
/**
* Get needed URL query parameters.
* It returns array of params as objects 'param' => 'value'. It contains exactly 3 params which are taken out of search result.
*
* @param {array} element
*
* @returns {array} array with params in form 'param' => 'value'
*/
function getNeededQueryParams(element) {
var id = $("input[id='tx-dlf-search-in-document-id']").attr('name');
var highlightWord = $("input[id='tx-dlf-search-in-document-highlight-word']").attr('name');
var page = $("input[id='tx-dlf-search-in-document-page']").attr('name');
var queryParams = [];
if(id && getBaseUrl(element['uid']).split('?')[0].indexOf(element['uid']) === -1) {
queryParams.push(id);
queryParams[id] = element['uid'];
}
if(highlightWord) {
queryParams.push(highlightWord);
queryParams[highlightWord] = encodeURIComponent($("input[id='tx-dlf-search-in-document-query']").val());
}
if(page) {
queryParams.push(page);
queryParams[page] = element['page'];
}
return queryParams;
}
/**
* Get snippet link.
*
* @param {array} element
*
* @returns {string}
*/
function getLink(element) {
var baseUrl = getBaseUrl(element['uid']);
var queryParams = getNeededQueryParams(element);
if (baseUrl.indexOf('?') > 0) {
queryParams = getAllQueryParams(baseUrl, queryParams);
baseUrl = baseUrl.split('?')[0];
}
var link = baseUrl + '?';
// add query params to result link
for(var i = 0; i < queryParams.length; i++) {
link += queryParams[i] + '=' + queryParams[queryParams[i]] + '&';
}
link = link.slice(0, -1);
return link;
}
/**
* Get navigation buttons.
*
* @param {int} start
* @param {numFound} start
*
* @returns {string}
*/
function getNavigationButtons(start, numFound) {
var buttons = "";
if (start > 0) {
buttons += '<input type="button" id="tx-dlf-search-in-document-button-previous" class="button-previous" onclick="previousResultPage();" value="' + $('#tx-dlf-search-in-document-label-previous').text() + '" />';
}
if (numFound > (start + 20)) {
buttons += '<input type="button" id="tx-dlf-search-in-document-button-next" class="button-next" onclick="nextResultPage();" value="' + $('#tx-dlf-search-in-document-label-next').text() + '" />';
}
return buttons;
}
/**
* Get current page.
*
* @returns {int}
*/
function getCurrentPage() {
var page = 1;
var queryParams = getCurrentQueryParams(getBaseUrl(" "));
for(var i = 0; i < queryParams.length; i++) {
var queryParam = queryParams[i].split('=');
if(decodeURIComponent(queryParam[0]) === $("input[id='tx-dlf-search-in-document-page']").attr('name')) {
page = parseInt(queryParam[1], 10);
}
}
return page;
}
/**
* Add highlight to image.
*
* @param {array} data
*
* @returns void
*/
function addImageHighlight(data) {
var page = getCurrentPage();
data['documents'].forEach(function (element, i) {
if(element['page'] === page) {
if (element['highlight'].length > 0) {
if (typeof tx_dlf_viewer !== 'undefined' && tx_dlf_viewer.map != null) { // eslint-disable-line camelcase
tx_dlf_viewer.displayHighlightWord(encodeURIComponent(getHighlights(element['highlight'])));
} else {
setTimeout(addImageHighlight, 500, data);
}
}
addHighlightEffect(element['highlight']);
}
});
}
/**
* Trigger search for document loaded from hit list.
*
* @returns void
*/
function triggerSearchAfterHitLoad() {
var queryParams = getCurrentQueryParams(getBaseUrl(" "));
var searchedQueryParam = $("input[id='tx-dlf-search-in-document-highlight-word']").attr('name');
for(var i = 0; i < queryParams.length; i++) {
var queryParam = queryParams[i].split('=');
if(searchedQueryParam && decodeURIComponent(queryParam[0]).indexOf(searchedQueryParam) !== -1) {
$("input[id='tx-dlf-search-in-document-query']").val(decodeURIComponent(queryParam[1]));
$("#tx-dlf-search-in-document-form").submit();
break;
}
}
}
$(document).ready(function() {
$("#tx-dlf-search-in-document-form").submit(function(event) {
// Stop form from submitting normally
event.preventDefault();
$('#tx-dlf-search-in-document-loading').show();
$('#tx-dlf-search-in-document-clearing').hide();
$('#tx-dlf-search-in-document-button-next').hide();
$('#tx-dlf-search-in-document-button-previous').hide();
// Send the data using post
$.post(
"/",
{
eID: "tx_dlf_search_in_document",
q: $( "input[id='tx-dlf-search-in-document-query']" ).val(),
uid: $( "input[id='tx-dlf-search-in-document-id']" ).val(),
start: $( "input[id='tx-dlf-search-in-document-start']" ).val(),
encrypted: $( "input[id='tx-dlf-search-in-document-encrypted']" ).val(),
},
function(data) {
var resultItems = [];
var resultList = '<div class="results-active-indicator"></div><ul>';
var start = $( "input[id='tx-dlf-search-in-document-start']" ).val();
if (data['numFound'] > 0) {
data['documents'].forEach(function (element, i) {
if (start < 0) {
start = i;
}
if (element['snippet'].length > 0) {
resultItems[element['page']] = '<span class="structure">'
+ $('#tx-dlf-search-in-document-label-page').text() + ' ' + element['page']
+ '</span><br />'
+ '<span class="textsnippet">'
+ '<a href=\"' + getLink(element) + '\">' + element['snippet'] + '</a>'
+ '</span>';
}
});
// Sort result by page.
resultItems.sort(function (a, b) {
return a - b;
});
resultItems.forEach(function (item, index) {
resultList += '<li>' + item + '</li>';
});
addImageHighlight(data);
} else {
resultList += '<li class="noresult">' + $('#tx-dlf-search-in-document-label-noresult').text() + '</li>';
}
resultList += '</ul>';
resultList += getNavigationButtons(start, data['numFound']);
$('#tx-dlf-search-in-document-results').html(resultList);
},
"json"
)
.done(function (data) {
$('#tx-dfgviewer-sru-results-loading').hide();
$('#tx-dfgviewer-sru-results-clearing').show();
});
});
// clearing button
$('#tx-dlf-search-in-document-clearing').click(function() {
$('#tx-dlf-search-in-document-results ul').remove();
$('.results-active-indicator').remove();
$('#tx-dlf-search-in-document-query').val('');
});
triggerSearchAfterHitLoad();
});