diff --git a/themes/foundation5/js/autocomplete.js b/themes/foundation5/js/autocomplete.js index 6a916c5572aacc6918591c35dfe543f54d4da7ff..908897430008ea389a8741805417a47762b850df 100644 --- a/themes/foundation5/js/autocomplete.js +++ b/themes/foundation5/js/autocomplete.js @@ -1,6 +1,6 @@ /*global jQuery, window, document, console, setTimeout, clearTimeout */ /** - * crhallberg/autocomplete.js 0.14 + * crhallberg/autocomplete.js 0.15 * ~ @crhallberg */ (function ( $ ) { @@ -20,21 +20,21 @@ var xhr = false; function align(input) { - var position = input.offset(); - element.css({ - top: position.top + input.outerHeight(), - left: position.left, - minWidth: input.width(), - maxWidth: Math.max(input.width(), input.closest('form').width()) - }); - } + var position = input.offset(); + element.css({ + top: position.top + input.outerHeight(), + left: position.left, + minWidth: input.width(), + maxWidth: Math.max(input.width(), input.closest('form').width()) + }); + } - function show() { + function show() { element.removeClass(options.hidingClass); - } - function hide() { + } + function hide() { element.addClass(options.hidingClass); - } + } function populate(data, input, eventType) { input.val(data.value); @@ -42,10 +42,10 @@ if (options.callback) { options.callback(data, input, eventType); } - hide(); - } + hide(); + } - function createList(data, input) { + function createList(data, input) { // Limit results data = data.slice(0, Math.min(options.maxResults, data.length)); input.data('length', data.length); @@ -53,199 +53,193 @@ // escape term for regex - https://github.com/sindresorhus/escape-string-regexp/blob/master/index.js var escapedTerm = input.val().replace(/[|\\{}()\[\]\^$+*?.]/g, '\\$&'); var regex = new RegExp('('+escapedTerm+')', 'ig'); - var shell = $('<div/>'); + var shell = $('<div/>'); for (var i=0; i<data.length; i++) { - if (typeof data[i] === 'string') { + if (typeof data[i] === 'string') { data[i] = {value: data[i]}; - } + } var content = data[i].label || data[i].value; - if (options.highlight) { - content = content.replace(regex, '<b>$1</b>'); - } - var item = typeof data[i].href === 'undefined' - ? $('<div/>') - : $('<a/>').attr('href', data[i].href); + if (options.highlight) { + content = content.replace(regex, '<b>$1</b>'); + } + var item = typeof data[i].href === 'undefined' + ? $('<div/>') + : $('<a/>').attr('href', data[i].href); // Data item.data(data[i]) - .addClass('item') - .html(content); - if (typeof data[i].description !== 'undefined') { + .addClass('item') + .html(content); + if (typeof data[i].description !== 'undefined') { item.append($('<small/>').html( options.highlight ? data[i].description.replace(regex, '<b>$1</b>') : data[i].description )); - } - shell.append(item); } + shell.append(item); + } element.html(shell); element.find('.item').mousedown(function() { populate($(this).data(), input, {mouse: true}); - setTimeout(function() { - input.focus(); - hide(); - }, 10); - }); + setTimeout(function() { + input.focus(); + hide(); + }, 10); + }); align(input); - } + } function search(input) { - if (xhr) { xhr.abort(); } - if (input.val().length >= options.minLength) { - element.html('<i class="item loading">'+options.loadingString+'</i>'); - show(); + if (xhr) { xhr.abort(); } + if (input.val().length >= options.minLength) { + element.html('<i class="item loading">'+options.loadingString+'</i>'); + show(); align(input); - var term = input.val(); - var cid = input.data('cache-id'); + var term = input.val(); + var cid = input.data('cache-id'); if (options.cache && typeof cache[cid][term] !== "undefined") { if (cache[cid][term].length === 0) { - hide(); - } else { + hide(); + } else { createList(cache[cid][term], input); - } + } } else { - options.handler(input.val(), function(data) { + options.handler(input, function(data) { cache[cid][term] = data; - if (data.length === 0) { - hide(); - } else { + if (data.length === 0) { + hide(); + } else { createList(data, input); - } - }); - } - input.data('selected', -1); - } else { - hide(); + } + }); } + input.data('selected', -1); + } else { + hide(); } + } - function setup(input, element) { - if (typeof element === 'undefined') { - element = $('<div/>') - .addClass('autocomplete-results hide') - .html('<i class="item loading">'+options.loadingString+'</i>'); + function setup(input, element) { + if (typeof element === 'undefined') { + element = $('<div/>') + .addClass('autocomplete-results hide') + .html('<i class="item loading">'+options.loadingString+'</i>'); align(input); - $(document.body).append(element); - } + $(document.body).append(element); + } - input.data('selected', -1); - input.data('length', 0); + input.data('selected', -1); + input.data('length', 0); - if (options.cache) { - var cid = Math.floor(Math.random()*1000); - input.data('cache-id', cid); + if (options.cache) { + var cid = Math.floor(Math.random()*1000); + input.data('cache-id', cid); cache[cid] = {}; - } + } - input.blur(function(e) { - if (e.target.acitem) { - setTimeout(hide, 10); - } else { - hide(); - } - }); - input.click(function() { - search(input, element); - }); - input.focus(function() { - search(input, element); - }); - input.keyup(function(event) { - // Ignore navigation keys - // - Ignore control functions - if (event.ctrlKey || event.which === 17) { - return; - } - // - Function keys (F1 - F15) - if (112 <= event.which && event.which <= 126) { - return; - } - switch (event.which) { - case 9: // tab - case 13: // enter - case 16: // shift - case 20: // caps lock - case 27: // esc - case 33: // page up - case 34: // page down - case 35: // end - case 36: // home - case 37: // arrows - case 38: - case 39: - case 40: - case 45: // insert - case 144: // num lock - case 145: // scroll lock - case 19: // pause/break - return; - default: - search(input, element); - } - }); - input.keydown(function(event) { - // - Ignore control functions - if (event.ctrlKey || event.which === 17) { + input.blur(function(e) { + if (e.target.acitem) { + setTimeout(hide, 10); + } else { + hide(); + } + }); + input.click(function() { + search(input, element); + }); + input.focus(function() { + search(input, element); + }); + input.keyup(function(event) { + // Ignore navigation keys + // - Ignore control functions + if (event.ctrlKey || event.which === 17) { + return; + } + // - Function keys (F1 - F15) + if (112 <= event.which && event.which <= 126) { + return; + } + switch (event.which) { + case 9: // tab + case 13: // enter + case 16: // shift + case 20: // caps lock + case 27: // esc + case 33: // page up + case 34: // page down + case 35: // end + case 36: // home + case 37: // arrows + case 38: + case 39: + case 40: + case 45: // insert + case 144: // num lock + case 145: // scroll lock + case 19: // pause/break return; - } - var position = $(this).data('selected'); - switch (event.which) { - // arrow keys through items + default: + search(input, element); + } + }); + input.keydown(function(event) { + // - Ignore control functions + if (event.ctrlKey || event.which === 17) { + return; + } + var position = $(this).data('selected'); + switch (event.which) { + // arrow keys through items case 38: // up key - event.preventDefault(); - element.find('.item.selected').removeClass('selected'); + event.preventDefault(); + element.find('.item.selected').removeClass('selected'); if (position-- > 0) { - element.find('.item:eq('+position+')').addClass('selected'); + element.find('.item:eq('+position+')').addClass('selected'); } - $(this).data('selected', position); - break; + $(this).data('selected', position); + break; case 40: // down key - event.preventDefault(); + event.preventDefault(); if (element.hasClass(options.hidingClass)) { - search(input, element); - } else if (position < input.data('length')-1) { - position++; - element.find('.item.selected').removeClass('selected'); - element.find('.item:eq('+position+')').addClass('selected'); - $(this).data('selected', position); - } - break; - // enter to nav or populate - case 9: - case 13: - var selected = element.find('.item.selected'); - if (selected.length > 0) { - event.preventDefault(); - if (event.which === 13 && selected.attr('href')) { + search(input, element); + } else if (position < input.data('length')-1) { + position++; + element.find('.item.selected').removeClass('selected'); + element.find('.item:eq('+position+')').addClass('selected'); + $(this).data('selected', position); + } + break; + // enter to nav or populate + case 9: + case 13: + var selected = element.find('.item.selected'); + if (selected.length > 0) { + event.preventDefault(); + if (event.which === 13 && selected.attr('href')) { window.location.assign(selected.attr('href')); - } else { + } else { populate(selected.data(), $(this), {key: true}); - element.find('.item.selected').removeClass('selected'); - $(this).data('selected', -1); - } + element.find('.item.selected').removeClass('selected'); + $(this).data('selected', -1); } - break; - // hide on escape - case 27: - hide(); - $(this).data('selected', -1); - break; - } - }); + } + break; + // hide on escape + case 27: + hide(); + $(this).data('selected', -1); + break; + } + }); - window.addEventListener("resize", hide, false); + window.addEventListener("resize", hide, false); - return element; - } + return element; + } $.fn.autocomplete = function(settings) { - if ('undefined' == typeof settings.handler) { - console.error('handler function not provided for autocomplete'); - return this; - } - - options = $.extend( {}, options, settings ); return this.each(function() { @@ -257,12 +251,16 @@ align(input); } else if (settings === "hide") { hide(); - } else if (settings === "clear cache" && options.cache) { + } else if (options.cache && settings === "clear cache") { var cid = parseInt(input.data('cache-id'), 10); cache[cid] = {}; } return input; + } else if ('undefined' == typeof settings.handler) { + console.error('handler function not provided for autocomplete'); + return this; } else { + options = $.extend( {}, options, settings ); element = $('.autocomplete-results'); if (element.length == 0) { element = setup(input); @@ -277,13 +275,13 @@ }; var timer = false; - $.fn.autocomplete.ajax = function(ops) { - if (timer) { clearTimeout(timer); } - if (xhr) { xhr.abort(); } - timer = setTimeout( - function() { xhr = $.ajax(ops); }, + $.fn.autocomplete.ajax = function(ops) { + if (timer) { clearTimeout(timer); } + if (xhr) { xhr.abort(); } + timer = setTimeout( + function() { xhr = $.ajax(ops); }, options.ajaxDelay - ); - }; + ); + }; }( jQuery )); \ No newline at end of file diff --git a/themes/foundation5/js/common.js b/themes/foundation5/js/common.js index 7e95fe289b3e482b225f2adbcae9c98c8fefa0d9..5baf3cd056214f263852193fa5fe312c3d4ec563 100644 --- a/themes/foundation5/js/common.js +++ b/themes/foundation5/js/common.js @@ -12,7 +12,7 @@ var VuFind = (function() { var register = function(name, module) { if (_submodules.indexOf(name) === -1) { - _submodules.push(name); + _submodules.push(name); this[name] = typeof module == 'function' ? module() : module; } // If the object has already initialized, we should auto-init on register: @@ -49,7 +49,7 @@ var VuFind = (function() { })(); /* --- GLOBAL FUNCTIONS --- */ -function htmlEncode(value){ +function htmlEncode(value) { if (value) { return jQuery('<div />').text(value).html(); } else { @@ -165,10 +165,11 @@ function setupAutocomplete() { $(op).autocomplete({ maxResults: 10, loadingString: VuFind.translate('loading')+' ...', - handler: function(query, cb) { - var searcher = extractClassParams(op); + handler: function(input, cb) { + var query = input.val(); + var searcher = extractClassParams(input); var hiddenFilters = []; - $(op).closest('.searchForm').find('input[name="hiddenFilters[]"]').each(function() { + $(input).closest('.searchForm').find('input[name="hiddenFilters[]"]').each(function() { hiddenFilters.push($(this).val()); }); $.fn.autocomplete.ajax({ @@ -177,7 +178,7 @@ function setupAutocomplete() { q:query, method:'getACSuggestions', searcher:searcher['searcher'], - type:searcher['type'] ? searcher['type'] : $(op).closest('.searchForm').find('.searchForm_type').val(), + type:searcher['type'] ? searcher['type'] : $(input).closest('.searchForm').find('.searchForm_type').val(), hiddenFilters:hiddenFilters }, dataType:'json', diff --git a/themes/foundation5/js/lightbox.js b/themes/foundation5/js/lightbox.js index c56a66e75b88f1b962d832411e5458efea1b9b58..5121ca1267c7e7be5064c4c261309863b7f090d1 100644 --- a/themes/foundation5/js/lightbox.js +++ b/themes/foundation5/js/lightbox.js @@ -163,7 +163,7 @@ VuFind.register('lightbox', function() { obj.method // is a form && ((obj.url.match(/MyResearch/) && !obj.url.match(/Bulk/)) // that matches login/create account || obj.url.match(/catalogLogin/)) // or catalog login for holds - && $('<div/>').html(html).find('.flash-message.warning').length == 0 // skip failed logins + && $('<div/>').html(html).find('.flash-message.warning').length == 0 // skip failed logins ) { var eventResult = _emit('VuFind.lightbox.login', { originalUrl: _originalUrl, @@ -210,7 +210,7 @@ VuFind.register('lightbox', function() { * data-lightbox-title = Lightbox title (overrides any title the page provides) */ var _constrainLink = function(event) { - if (typeof $(this).data('lightboxIgnore') != 'undefined') { + if (typeof $(this).data('lightboxIgnore') != 'undefined' || this.attributes.href.value.charAt(0) === '#') { return true; } if (this.href.length > 1) { diff --git a/themes/foundation5/js/preview.js b/themes/foundation5/js/preview.js index 6e62032833914ffb74549dc23a0a4c58cc7ebc2f..7a262f4bab69e55feeb8626fb655969c66fa3561 100644 --- a/themes/foundation5/js/preview.js +++ b/themes/foundation5/js/preview.js @@ -25,7 +25,7 @@ function getHTPreviews(skeys) { for(var i = 0; i < bibkeys.length; i++) { batch.push(bibkeys[i]); if ((i > 0 && i % 20 == 0) || i == bibkeys.length-1) { - var script = 'http://catalog.hathitrust.org/api/volumes/brief/json/' + var script = 'https://catalog.hathitrust.org/api/volumes/brief/json/' + batch.join('|') + '&callback=processHTBookInfo'; $.getScript(script); batch = []; diff --git a/themes/foundation5/templates/RecordDriver/SolrDefault/list-entry.phtml b/themes/foundation5/templates/RecordDriver/SolrDefault/list-entry.phtml index 4d31e3c1506bf06e74647377030f2a8532e265be..442cb485dd7d32aff247f5adba990f619b94a358 100644 --- a/themes/foundation5/templates/RecordDriver/SolrDefault/list-entry.phtml +++ b/themes/foundation5/templates/RecordDriver/SolrDefault/list-entry.phtml @@ -19,7 +19,7 @@ <div class="small-1 columns left"> <? endif ?> <label class="left"><?=$this->record($this->driver)->getCheckbox() ?></label> - <input type="hidden" value="<?=$id ?>" class="hiddenId"/> + <input type="hidden" value="<?=$this->escapeHtmlAttr($id) ?>" class="hiddenId"/> <? if ($cover): ?> <?=$cover ?> </div> diff --git a/themes/foundation5/templates/RecordTab/holdingsils.phtml b/themes/foundation5/templates/RecordTab/holdingsils.phtml index 54426f610fc36c571d3749413826ffe5c59274c6..bc692ae3825d50fa78a644301a09f9430b8cc39b 100644 --- a/themes/foundation5/templates/RecordTab/holdingsils.phtml +++ b/themes/foundation5/templates/RecordTab/holdingsils.phtml @@ -94,8 +94,8 @@ $checkILLRequest = isset($row['checkILLRequest']) && $row['checkILLRequest']; // AJAX block record? $block = !$check && isset($row['addLink']) && $row['addLink'] === 'block'; - $blockStorageRetrievalRequest = !$checkStorageRetrievalRequest && isset($row['addStorageRetrievalRequestLink']) && $row['addStorageRetrievalRequestLink']; - $blockILLRequest = !$checkILLRequest && isset($row['addILLRequestLink']) && $row['addILLRequestLink']; + $blockStorageRetrievalRequest = !$checkStorageRetrievalRequest && isset($row['addStorageRetrievalRequestLink']) && $row['addStorageRetrievalRequestLink'] === 'block'; + $blockILLRequest = !$checkILLRequest && isset($row['addILLRequestLink']) && $row['addILLRequestLink'] === 'block'; ?> <? if (isset($row['barcode']) && $row['barcode'] != ""): ?> <tr vocab="http://schema.org/" typeof="Offer"> diff --git a/themes/foundation5/templates/feedback/email.phtml b/themes/foundation5/templates/feedback/email.phtml index ae51209994d0b750fb9c0b3ecfe5b07386221d47..53109c28fd21ca0a00416681d6999865e5ba96b0 100644 --- a/themes/foundation5/templates/feedback/email.phtml +++ b/themes/foundation5/templates/feedback/email.phtml @@ -1,2 +1,7 @@ - -<?=$this->render('feedback/form.phtml');?> \ No newline at end of file +<? + // Set page title + $this->headTitle($this->translate('Feedback')); + // Get rid of the feedback tab since this uses the same variables + $this->layout()->feedbacktab = false; +?> +<?=$this->render('feedback/form.phtml');?> diff --git a/themes/foundation5/templates/feedback/form.phtml b/themes/foundation5/templates/feedback/form.phtml index 06abe1775229ba5691d2783389a4cb169563f7c4..f47b2aa96d5efcbbf3e9437ff10ee02c2e2cec4e 100644 --- a/themes/foundation5/templates/feedback/form.phtml +++ b/themes/foundation5/templates/feedback/form.phtml @@ -1,27 +1,26 @@ <!-- feedback - FORM.phtml --> <h2><?=$this->transEsc("Send us your feedback!")?></h2> +<?=$this->flashmessages() ?> <form name="feedback" method="post" action="<?=$this->url('feedback-email')?>"> - <input type="hidden" id="formSuccess" value="<?=$this->transEsc("Form Submitted!")?>"/> - <input type="hidden" id="feedbackSuccess" value="<?=$this->transEsc("Thank you for your feedback.")?>"/> - <input type="hidden" id="feedbackFailure" value="<?=$this->transEsc("An error has occurred")?>"/> <div class="row"> <label class="small-3 columns" for="name"><?=$this->transEsc("feedback_name")?></label> <div class="small-9 columns"> - <input type="text" id="name" name="name" class="auto-width"/> + <input type="text" id="name" name="name" value="<?=$this->escapeHtmlAttr(isset($name) ? $name : '')?>" class="auto-width"/> </div> </div> <div class="row"> <label class="small-3 columns" for="email"><?=$this->transEsc("Email")?></label> <div class="small-9 columns"> - <input type="email" id="email" name="email" class="auto-width"/> + <input type="email" id="email" name="email" value="<?=$this->escapeHtmlAttr(isset($email) ? $email : '')?>" class="auto-width"/> </div> </div> <div class="row"> <label class="small-12 medium-3 columns" for="comments"><?=$this->transEsc("Comments")?></label> <div class="small-12 medium-9 columns"> - <textarea id="comments" name="comments" class="auto-width"></textarea> + <textarea id="comments" name="comments" class="auto-width" required><?=$this->escapeHtml(isset($comments) ? $comments : '')?></textarea> </div> </div> + <?=$this->recaptcha()->html($this->useRecaptcha) ?> <div class="row"> <div class="small-4 small-offset-8 medium-9 medium-offset-3 columns"> <input type="submit" class="button small" value="<?=$this->transEsc("Send")?>" /> diff --git a/themes/foundation5/templates/feedback/home.phtml b/themes/foundation5/templates/feedback/home.phtml deleted file mode 100644 index f6d1f792540e7f6c4534d0b9d17c5230c36d09d8..0000000000000000000000000000000000000000 --- a/themes/foundation5/templates/feedback/home.phtml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- feedback - home.phtml --> -<? - // Set page title - $this->headTitle($this->translate('Feedback')); - // Get rid of the feedback tab since this uses the same variables - $this->layout()->feedbacktab = false; -?> -<?=$this->render('feedback/form.phtml');?> -<!-- feedback - home.phtml END --> \ No newline at end of file diff --git a/themes/foundation5/templates/header.phtml b/themes/foundation5/templates/header.phtml index 4d045a0bf50032c63228e025ba81c7995d74a630..5726656adc7b995108519f096f2f0491c4de2290 100644 --- a/themes/foundation5/templates/header.phtml +++ b/themes/foundation5/templates/header.phtml @@ -8,7 +8,7 @@ <? /*Remove the class "menu-icon" to get rid of menu icon. Take out "Menu" to just have icon alone */ ?> <li class="toggle-topbar menu-icon"><a href="#"><span></span></a></li> </ul> - <section class="top-bar-section"> + <section class="top-bar-section" id="searchslots"> <? if ($this->layout()->searchbox !== false): ?> <ul class="left list-unstyled show-for-medium-up"> <li> diff --git a/themes/foundation5/templates/layout/layout.phtml b/themes/foundation5/templates/layout/layout.phtml index f07c01ffcd2e74775b4590bf691ad6665fe8597b..179c2e3ccc684607794fefef886dedd71d8f21c2 100644 --- a/themes/foundation5/templates/layout/layout.phtml +++ b/themes/foundation5/templates/layout/layout.phtml @@ -161,7 +161,7 @@ JS; <div class="row"> <div id="content" role="main" class="main panel template-dir-<?=$this->templateDir?> template-name-<?=$this->templateName?>"> - <div class="container"> + <div id="content" class="container"> <?=$this->layout()->content ?> </div> </div> diff --git a/themes/foundation5/templates/myresearch/newpassword.phtml b/themes/foundation5/templates/myresearch/newpassword.phtml index cb399094c0f87565a7d671377af7574ae8574fff..8793b7f9d692f9b41fb63b4070c2e03942699281 100644 --- a/themes/foundation5/templates/myresearch/newpassword.phtml +++ b/themes/foundation5/templates/myresearch/newpassword.phtml @@ -21,6 +21,7 @@ <div class="error"><?=$this->transEsc('recovery_user_not_found') ?></div> <? else: ?> <form id="newpassword" action="<?=$this->url('myresearch-newpassword') ?>" method="post" data-abide role="form"> + <input type="hidden" value="<?=$this->escapeHtmlAttr($this->auth()->getManager()->getCsrfHash(true))?>" name="csrf"/> <input type="hidden" value="<?=$this->escapeHtmlAttr($this->hash) ?>" name="hash"/> <input type="hidden" value="<?=$this->escapeHtmlAttr($this->username) ?>" name="username"/> <input type="hidden" value="<?=$this->escapeHtmlAttr($this->auth_method) ?>" name="auth_method"/> diff --git a/themes/foundation5/templates/record/save.phtml b/themes/foundation5/templates/record/save.phtml index ee7089e4ad05ce1b736de9d72ff4ad4fbcd6b770..97ddc2e4f1609b4338fcdd9d2838660cee0765ec 100644 --- a/themes/foundation5/templates/record/save.phtml +++ b/themes/foundation5/templates/record/save.phtml @@ -16,7 +16,7 @@ <? if (!empty($this->containingLists)): ?> <p><?=$this->transEsc('This item is already part of the following list/lists') ?>: <? foreach ($this->containingLists as $i=>$list): ?> - <a href="<?=$this->url('userList', array('id' => $list['id'])) ?>"><?=$this->escapeHtml($list['title'])?></a><? if($i<count($this->containingLists)-1): ?>, <? endif; ?> + <a href="<?=$this->url('userList', array('id' => $list['id'])) ?>" data-lightbox-ignore><?=$this->escapeHtml($list['title'])?></a><? if($i<count($this->containingLists)-1): ?>, <? endif; ?> <? endforeach; ?> </p><hr/> <? endif; ?> diff --git a/themes/foundation5/templates/record/storageretrievalrequest.phtml b/themes/foundation5/templates/record/storageretrievalrequest.phtml index 47b428976f9fa6081c2fa9db3c333105a9295c66..43c06215600bbed285f6ff587771e67e6ca240d6 100644 --- a/themes/foundation5/templates/record/storageretrievalrequest.phtml +++ b/themes/foundation5/templates/record/storageretrievalrequest.phtml @@ -60,7 +60,7 @@ <? endif; ?> <? if (in_array("pickUpLocation", $this->extraFields)): ?> - <? if (count($this->pickup) > 1): ?> + <? if ($this->pickup): ?> <div class="row"> <? if (isset($this->gatheredDetails['pickUpLocation']) && $this->gatheredDetails['pickUpLocation'] !== "") { @@ -74,14 +74,14 @@ <label class="medium-3 columns"><?=$this->transEsc("pick_up_location")?>:</label> <div class="medium-9 columns"> <select name="gatheredDetails[pickUpLocation]" class="auto-width"> - <? if ($selected === false): ?> + <? if ($selected === false && count($this->pickup) > 1): ?> <option value="" selected="selected"> <?=$this->transEsc('select_pickup_location')?> </option> <? endif; ?> <? foreach ($this->pickup as $lib): ?> <option value="<?=$this->escapeHtmlAttr($lib['locationID'])?>"<?=($selected == $lib['locationID']) ? ' selected="selected"' : ''?>> - <?=$this->escapeHtml($lib['locationDisplay'])?> + <?=$this->transEsc('location_' . $lib['locationDisplay'], null, $lib['locationDisplay'])?> </option> <? endforeach; ?> </select>