/*global btoa, console, hexEncode, isPhoneNumberValid, Lightbox, rc4Encrypt, unescape */ // IE 9< console polyfill window.console = window.console || {log: function () {}}; var VuFind = (function() { var defaultSearchBackend = null; var path = null; var _initialized = false; var _submodules = []; var _translations = {}; var register = function(name, module) { if (_submodules.indexOf(name) === -1) { _submodules.push(name); this[name] = typeof module == 'function' ? module() : module; } // If the object has already initialized, we should auto-init on register: if (_initialized) { this[name].init(); } }; var init = function() { for (var i=0; i<_submodules.length; i++) { this[_submodules[i]].init(); } _initialized = true; }; 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, init: init, register: register, 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'); } $('.offcanvas-toggle .fa').attr('title', VuFind.translate(active ? 'sidebar_close' : 'sidebar_expand')); }); $('[data-toggle="offcanvas"]').click().click(); } else { $('[data-toggle="offcanvas"]').addClass('hidden'); } } 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'); }); } /** * 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() { // Start up all of our submodules VuFind.init(); // Setup search autocomplete setupAutocomplete(); // 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')); }); });