An error occurred while loading the file. Please try again.
-
Chris Hallberg authored
- Rewrote Javascript to make better use of server-side logic - Eliminated many server-side special cases specific to lightbox handling - Adjusted test suite to accommodate improvements
b054dea2
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
common.js 8.90 KiB
/*global btoa, console, hexEncode, isPhoneNumberValid, Lightbox, rc4Encrypt, unescape, VuFind */
// IE 9< console polyfill
window.console = window.console || {log: function () {}};
var VuFind = (function() {
var defaultSearchBackend = null;
var path = null;
var _translations = {};
var addTranslations = function(s) {
for (var i in s) {
_translations[i] = s[i];
}
};
var translate = function(op) {
return _translations[op] || op;
};
//Reveal
return {
defaultSearchBackend: defaultSearchBackend,
path: path,
addTranslations: addTranslations,
translate: translate
};
})();
/* --- GLOBAL FUNCTIONS --- */
function htmlEncode(value) {
if (value) {
return jQuery('<div />').text(value).html();
} else {
return '';
}
}
function extractClassParams(str) {
str = $(str).attr('class');
if (typeof str === "undefined") {
return [];
}
var params = {};
var classes = str.split(/\s+/);
for(var i = 0; i < classes.length; i++) {
if (classes[i].indexOf(':') > 0) {
var pair = classes[i].split(':');
params[pair[0]] = pair[1];
}
}
return params;
}
// Turn GET string into array
function deparam(url) {
if(!url.match(/\?|&/)) {
return [];
}
var request = {};
var pairs = url.substring(url.indexOf('?') + 1).split('&');
for (var i = 0; i < pairs.length; i++) {
var pair = pairs[i].split('=');
var name = decodeURIComponent(pair[0].replace(/\+/g, ' '));
if(name.length == 0) {
continue;
}
if(name.substring(name.length-2) == '[]') {
name = name.substring(0,name.length-2);
if(!request[name]) {
request[name] = [];
}
request[name].push(decodeURIComponent(pair[1].replace(/\+/g, ' ')));
} else {
request[name] = decodeURIComponent(pair[1].replace(/\+/g, ' '));
}
}
return request;
}
// Sidebar
function moreFacets(id) {
$('.'+id).removeClass('hidden');
$('#more-'+id).addClass('hidden');
}
function lessFacets(id) {
$('.'+id).addClass('hidden');
$('#more-'+id).removeClass('hidden');
}
// Phone number validation
function phoneNumberFormHandler(numID, regionCode) {
var phoneInput = document.getElementById(numID);
var number = phoneInput.value;
var valid = isPhoneNumberValid(number, regionCode);
if(valid != true) {
if(typeof valid === 'string') {
valid = VuFind.translate(valid);
} else {
valid = VuFind.translate('libphonenumber_invalid');
}
$(phoneInput).siblings('.help-block.with-errors').html(valid);
$(phoneInput).closest('.form-group').addClass('sms-error');
return false;
} else {
$(phoneInput).closest('.form-group').removeClass('sms-error');
$(phoneInput).siblings('.help-block.with-errors').html('');
}
}
function bulkFormHandler(event, data) {
if ($('.checkbox-select-item:checked,checkbox-select-all:checked').length == 0) {
VuFind.lightbox.alert(VuFind.translate('bulk_noitems_advice'), 'danger');
return false;
}
var keys = [];
for (var i in data) {
if ('print' == data[i].name) {
return true;
}
}
}
// Ready functions
function setupOffcanvas() {
if($('.sidebar').length > 0) {
$('[data-toggle="offcanvas"]').click(function () {
$('body.offcanvas').toggleClass('active');
var active = $('body.offcanvas').hasClass('active');
var right = $('body.offcanvas').hasClass('offcanvas-right');
if((active && !right) || (!active && right)) {
$('.offcanvas-toggle .fa').removeClass('fa-chevron-right').addClass('fa-chevron-left');
} else {
$('.offcanvas-toggle .fa').removeClass('fa-chevron-left').addClass('fa-chevron-right');
}
});
$('[data-toggle="offcanvas"]').click().click();
} else {
$('[data-toggle="offcanvas"]').addClass('hidden');
}
}
function setupBacklinks() {
// Highlight previous links, grey out following
$('.backlink')
.mouseover(function() {
// Underline back
var t = $(this);
do {
t.css({'text-decoration':'underline'});
t = t.prev();
} while(t.length > 0);
// Mute ahead
t = $(this).next();
do {
t.css({'color':'#999'});
t = t.next();
} while(t.length > 0);
})
.mouseout(function() {
// Underline back
var t = $(this);
do {
t.css({'text-decoration':'none'});
t = t.prev();
} while(t.length > 0);
// Mute ahead
t = $(this).next();
do {
t.css({'color':''});
t = t.next();
} while(t.length > 0);
});
}
function setupAutocomplete() {
// Search autocomplete
$('.autocomplete').each(function(i, op) {
$(op).autocomplete({
maxResults: 10,
loadingString: VuFind.translate('loading')+'...',
handler: function(query, cb) {
var searcher = extractClassParams(op);
var hiddenFilters = [];
$(op).closest('.searchForm').find('input[name="hiddenFilters[]"]').each(function() {
hiddenFilters.push($(this).val());
});
$.fn.autocomplete.ajax({
url: VuFind.path + '/AJAX/JSON',
data: {
q:query,
method:'getACSuggestions',
searcher:searcher['searcher'],
type:searcher['type'] ? searcher['type'] : $(op).closest('.searchForm').find('.searchForm_type').val(),
hiddenFilters:hiddenFilters
},
dataType:'json',
success: function(json) {
if (json.data.length > 0) {
var datums = [];
for (var i=0;i<json.data.length;i++) {
datums.push(json.data[i]);
}
cb(datums);
} else {
cb([]);
}
}
});
}
});
});
// Update autocomplete on type change
$('.searchForm_type').change(function() {
var $lookfor = $(this).closest('.searchForm').find('.searchForm_lookfor[name]');
$lookfor.autocomplete('clear cache');
$lookfor.focus();
});
}
/**
* Handle arrow keys to jump to next record
* @returns {undefined}
*/
function keyboardShortcuts() {
var $searchform = $('#searchForm_lookfor');
if ($('.pager').length > 0) {
$(window).keydown(function(e) {
if (!$searchform.is(':focus')) {
var $target = null;
switch (e.keyCode) {
case 37: // left arrow key
$target = $('.pager').find('a.previous');
if ($target.length > 0) {
$target[0].click();
return;
}
break;
case 38: // up arrow key
if (e.ctrlKey) {
$target = $('.pager').find('a.backtosearch');
if ($target.length > 0) {
$target[0].click();
return;
}
}
break;
case 39: //right arrow key
$target = $('.pager').find('a.next');
if ($target.length > 0) {
$target[0].click();
return;
}
break;
case 40: // down arrow key
break;
}
}
});
}
}
$(document).ready(function() {
// Setup search autocomplete
setupAutocomplete();
// Setup highlighting of backlinks
setupBacklinks();
// Off canvas
setupOffcanvas();
// Keyboard shortcuts in detail view
keyboardShortcuts();
// support "jump menu" dropdown boxes
$('select.jumpMenu').change(function(){ $(this).parent('form').submit(); });
// Checkbox select all
$('.checkbox-select-all').change(function() {
$(this).closest('form').find('.checkbox-select-item').prop('checked', this.checked);
});
$('.checkbox-select-item').change(function() {
$(this).closest('form').find('.checkbox-select-all').prop('checked', false);
});
// handle QR code links
$('a.qrcodeLink').click(function() {
if ($(this).hasClass("active")) {
$(this).html(VuFind.translate('qrcode_show')).removeClass("active");
} else {
$(this).html(VuFind.translate('qrcode_hide')).addClass("active");
}
var holder = $(this).next('.qrcode');
if (holder.find('img').length == 0) {
// We need to insert the QRCode image
var template = holder.find('.qrCodeImgTag').html();
holder.html(template);
}
holder.toggleClass('hidden');
return false;
});
// Print
var url = window.location.href;
if(url.indexOf('?' + 'print' + '=') != -1 || url.indexOf('&' + 'print' + '=') != -1) {
$("link[media='print']").attr("media", "all");
$(document).ajaxStop(function() {
window.print();
});
// Make an ajax call to ensure that ajaxStop is triggered
$.getJSON(VuFind.path + '/AJAX/JSON', {method: 'keepAlive'});
}
// Advanced facets
$('.facetOR').click(function() {
$(this).closest('.collapse').html('<div class="list-group-item">'+VuFind.translate('loading')+'...</div>');
window.location.assign($(this).attr('href'));
});
});