160 lines
5.7 KiB
JavaScript
160 lines
5.7 KiB
JavaScript
/*global Hunt, VuFind */
|
|
/*exported checkItemStatuses, itemStatusFail */
|
|
|
|
function linkCallnumbers(callnumber, callnumber_handler) {
|
|
if (callnumber_handler) {
|
|
var cns = callnumber.split(',\t');
|
|
for (var i = 0; i < cns.length; i++) {
|
|
cns[i] = '<a href="' + VuFind.path + '/Alphabrowse/Home?source=' + encodeURI(callnumber_handler) + '&from=' + encodeURI(cns[i]) + '">' + cns[i] + '</a>';
|
|
}
|
|
return cns.join(',\t');
|
|
}
|
|
return callnumber;
|
|
}
|
|
function displayItemStatus(result, $item) {
|
|
|
|
// var output = '';
|
|
// for (var property in result) {
|
|
// output += property + ': ' + result[property]+'; ';
|
|
// }
|
|
// alert(output);
|
|
|
|
$item.removeClass('.ajax-pending');
|
|
$item.find('.status').empty().append(result.availability_message);
|
|
$item.find('.ajax-availability').removeClass('ajax-availability hidden');
|
|
if (typeof(result.full_status) != 'undefined'
|
|
&& result.full_status.length > 0
|
|
&& $item.find('.callnumAndLocation').length > 0
|
|
) {
|
|
// Full status mode is on -- display the HTML and hide extraneous junk:
|
|
$item.find('.callnumAndLocation').empty().append(result.full_status);
|
|
$item.find('.callnumber,.hideIfDetailed,.location,.status').addClass('hidden');
|
|
} else if (typeof(result.missing_data) != 'undefined'
|
|
&& result.missing_data
|
|
) {
|
|
// No data is available -- hide the entire status area:
|
|
$item.find('.callnumAndLocation,.status').addClass('hidden');
|
|
} else if (result.locationList) {
|
|
// We have multiple locations -- build appropriate HTML and hide unwanted labels:
|
|
$item.find('.callnumber,.hideIfDetailed,.location').addClass('hidden');
|
|
var locationListHTML = "";
|
|
for (var x = 0; x < result.locationList.length; x++) {
|
|
locationListHTML += '<div class="groupLocation">';
|
|
if (result.locationList[x].availability) {
|
|
locationListHTML += '<span class="text-success"><i class="fa fa-ok" aria-hidden="true"></i> '
|
|
+ result.locationList[x].location + '</span> ';
|
|
} else if (typeof(result.locationList[x].status_unknown) !== 'undefined'
|
|
&& result.locationList[x].status_unknown
|
|
) {
|
|
if (result.locationList[x].location) {
|
|
locationListHTML += '<span class="text-warning"><i class="fa fa-status-unknown" aria-hidden="true"></i> '
|
|
+ result.locationList[x].location + '</span> ';
|
|
}
|
|
} else {
|
|
locationListHTML += '<span class="text-danger"><i class="fa fa-remove" aria-hidden="true"></i> '
|
|
+ result.locationList[x].location + '</span> ';
|
|
}
|
|
locationListHTML += '</div>';
|
|
locationListHTML += '<div class="groupCallnumber">';
|
|
locationListHTML += (result.locationList[x].callnumbers)
|
|
? linkCallnumbers(result.locationList[x].callnumbers, result.locationList[x].callnumber_handler) : '';
|
|
locationListHTML += '</div>';
|
|
}
|
|
$item.find('.locationDetails').removeClass('hidden');
|
|
$item.find('.locationDetails').html(locationListHTML);
|
|
} else {
|
|
// Default case -- load call number and location into appropriate containers:
|
|
$item.find('.callnumber').empty().append(linkCallnumbers(result.callnumber, result.callnumber_handler) + '<br/>');
|
|
$item.find('.location').empty().append(
|
|
result.reserve === 'true'
|
|
? result.reserve_message
|
|
: result.location
|
|
);
|
|
}
|
|
}
|
|
function itemStatusFail(response, textStatus) {
|
|
$('.ajax-pending').empty();
|
|
if (textStatus === 'abort' || typeof response.responseJSON === 'undefined') {
|
|
return;
|
|
}
|
|
// display the error message on each of the ajax status place holder
|
|
$('.ajax-pending').addClass('text-danger').append(response.responseJSON.data);
|
|
}
|
|
|
|
var itemStatusIds = [];
|
|
var itemStatusEls = {};
|
|
var itemStatusTimer = null;
|
|
var itemStatusDelay = 200;
|
|
var itemStatusRunning = false;
|
|
|
|
function runItemAjaxForQueue() {
|
|
// Only run one item status AJAX request at a time:
|
|
if (itemStatusRunning) {
|
|
itemStatusTimer = setTimeout(runItemAjaxForQueue, itemStatusDelay);
|
|
return;
|
|
}
|
|
itemStatusRunning = true;
|
|
$.ajax({
|
|
dataType: 'json',
|
|
method: 'POST',
|
|
url: VuFind.path + '/AJAX/JSON?method=getItemStatuses',
|
|
data: { 'id': itemStatusIds }
|
|
})
|
|
.done(function checkItemStatusDone(response) {
|
|
for (var j = 0; j < response.data.length; j++) {
|
|
displayItemStatus(response.data[j], itemStatusEls[response.data[j].id]);
|
|
itemStatusIds.splice(itemStatusIds.indexOf(response.data[j].id), 1);
|
|
}
|
|
itemStatusRunning = false;
|
|
})
|
|
.fail(function checkItemStatusFail(response, textStatus) {
|
|
itemStatusFail(response, textStatus);
|
|
itemStatusRunning = false;
|
|
});
|
|
}
|
|
|
|
function itemQueueAjax(id, el) {
|
|
clearTimeout(itemStatusTimer);
|
|
itemStatusIds.push(id);
|
|
itemStatusEls[id] = el;
|
|
itemStatusTimer = setTimeout(runItemAjaxForQueue, itemStatusDelay);
|
|
el.addClass('ajax-pending').removeClass('hidden')
|
|
.find('.status').removeClass('hidden');
|
|
}
|
|
|
|
function checkItemStatus(el) {
|
|
var $item = $(el);
|
|
if ($item.find('.hiddenId').length === 0) {
|
|
return false;
|
|
}
|
|
var id = $item.find('.hiddenId').val();
|
|
itemQueueAjax(id + '', $item);
|
|
}
|
|
|
|
function checkItemStatuses(_container) {
|
|
var container = _container instanceof Element
|
|
? _container
|
|
: document.body;
|
|
|
|
var ajaxItems = $(container).find('.ajaxItem');
|
|
for (var i = 0; i < ajaxItems.length; i++) {
|
|
var id = $(ajaxItems[i]).find('.hiddenId').val();
|
|
itemQueueAjax(id, $(ajaxItems[i]));
|
|
}
|
|
// Stop looking for a scroll loader
|
|
if (itemStatusObserver) {
|
|
itemStatusObserver.disconnect();
|
|
}
|
|
}
|
|
var itemStatusObserver = null;
|
|
$(document).ready(function checkItemStatusReady() {
|
|
if (typeof Hunt === 'undefined') {
|
|
checkItemStatuses();
|
|
} else {
|
|
itemStatusObserver = new Hunt(
|
|
$('.ajaxItem').toArray(),
|
|
{ enter: checkItemStatus }
|
|
);
|
|
}
|
|
});
|