/*global VuFind, unwrapJQuery */
VuFind.register('doi', function Doi() {
function embedDoiLinks(el) {
var element = $(el);
var doi = [];
var elements = element.hasClass('doiLink') ? element : element.find('.doiLink');
elements.each(function extractDoiData(i, doiLinkEl) {
var currentDoi = $(doiLinkEl).data('doi');
if (doi.indexOf(currentDoi) === -1) {
doi[doi.length] = currentDoi;
}
});
if (doi.length === 0) {
return;
}
var url = VuFind.path + '/AJAX/JSON?' + $.param({
method: 'doiLookup',
doi: doi,
});
$.ajax({
dataType: 'json',
url: url
})
.done(function embedDoiLinksDone(response) {
elements.each(function populateDoiLinks(x, doiEl) {
var currentDoi = $(doiEl).data('doi');
if ("undefined" !== typeof response.data[currentDoi]) {
$(doiEl).empty();
for (var i = 0; i < response.data[currentDoi].length; i++) {
var newLink = $('');
newLink.addClass('icon-link');
newLink.attr('href', response.data[currentDoi][i].link);
$('')
.addClass('icon-link__label')
.text(response.data[currentDoi][i].label)
.appendTo(newLink);
if (response.data[currentDoi][i].newWindow) {
newLink.attr('target', '_blank');
}
newLink.attr('rel', 'noreferrer');
if (typeof response.data[currentDoi][i].icon !== 'undefined') {
var icon = $('');
icon.attr('src', response.data[currentDoi][i].icon);
icon.addClass('doi-icon icon-link__icon');
newLink.prepend(icon);
} else if (typeof response.data[currentDoi][i].localIcon !== 'undefined') {
var localIcon = $(response.data[currentDoi][i].localIcon);
localIcon.addClass('icon-link__icon');
newLink.prepend(localIcon);
}
$(doiEl).append(newLink);
$(doiEl).append("
");
}
}
});
});
}
function updateContainer(params) {
embedDoiLinks(params.container);
}
// Assign actions to the OpenURL links. This can be called with a container e.g. when
// combined results fetched with AJAX are loaded.
function init(_container) {
var container = unwrapJQuery(_container || document.body);
// assign action to the openUrlWindow link class
if (VuFind.isPrinting()) {
embedDoiLinks(container);
} else {
VuFind.observerManager.createIntersectionObserver(
'doiLinks',
embedDoiLinks,
Array.from(container.querySelectorAll('.doiLink'))
);
}
VuFind.listen('results-init', updateContainer);
}
return {
init: init,
embedDoiLinks: embedDoiLinks
};
});