LP#1778972: (follow-up) use OILSWebTemplatePath to enable/disable the bootstrap OPAC
authorJane Sandberg <sandbej@linnbenton.edu>
Tue, 30 Jun 2020 00:41:45 +0000 (17:41 -0700)
committerJane Sandberg <sandbej@linnbenton.edu>
Sat, 12 Sep 2020 15:51:52 +0000 (08:51 -0700)
This commit also renames the directory that contains the bootstrap-based OPAC. With
the OILSWebTemplatePath, several redundant files also can be safely removed.

Adds a release notes entry describing how to enable this OPAC in eg_vhosts.conf.

Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
Signed-off-by: Ruth Frasur <rfrasur@library.in.gov>
Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
244 files changed:
Open-ILS/examples/apache_24/eg_vhost.conf.in
Open-ILS/src/templates-bootstrap/opac/advanced.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/browse.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/cnbrowse.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/css/style.css.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/home.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/mylist.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/mylist/clear.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/mylist/email.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/mylist/print.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/myopac/circ_history.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/myopac/circs.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/myopac/ebook_checkout.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/myopac/ebook_circs.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/myopac/ebook_holds.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/myopac/ebook_holds_ready.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/myopac/hold_history.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/myopac/holds.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/myopac/holds/edit.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/myopac/lists.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/myopac/main.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/myopac/main_pay.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/myopac/main_payment_form.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/myopac/main_payments.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/myopac/messages/list.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/myopac/messages/single_message.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/myopac/prefs.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/myopac/prefs_my_lists.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/myopac/prefs_notify.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/myopac/prefs_settings.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/myopac/update_email.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/myopac/update_password.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/myopac/update_username.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/advanced/expert.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/advanced/global_row.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/advanced/numeric.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/advanced/search.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/anon_list.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/base.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/bookbag_actions.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/cart_nav.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/coded_value_selector.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/config-fresh.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/config.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/css/colors.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/css/fonts.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/footer.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/header.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/hold_status.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/homesearch.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/library_name_link.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/locale_picker.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/location_name_link.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/login/form.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/login/help.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/login/login_modal.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/login/password_hint.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/login/username_hint.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/metarecord_hold_filters.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/misc_util.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/myopac/base.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/myopac/main_base.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/myopac/prefs_base.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/org_selector.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/place_hold.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/place_hold_result.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/pref_locale_picker.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/qtype_selector.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/record/addedcontent.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/record/awards.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/record/body.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/record/cnbrowse.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/record/copy_counts.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/record/copy_table.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/record/extras.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/record/navigation.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/record/series.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/record/summary.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/result/adv_filter.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/result/facets-hz.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/result/facets.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/result/lowhits.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/result/paginate.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/result/table.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/searchbar.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/sms_carrier_selector.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/staff_saved_searches.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/topnav.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/topnav_links.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/topnav_logo.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/topnav_subnav.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/password_reset.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/record.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/record/print.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/register.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/results.tt2 [new file with mode: 0644]
Open-ILS/src/templates/opac-new/advanced.tt2 [deleted file]
Open-ILS/src/templates/opac-new/browse.tt2 [deleted file]
Open-ILS/src/templates/opac-new/cnbrowse.tt2 [deleted file]
Open-ILS/src/templates/opac-new/css/style.css.tt2 [deleted file]
Open-ILS/src/templates/opac-new/home.tt2 [deleted file]
Open-ILS/src/templates/opac-new/i18n_strings.tt2 [deleted file]
Open-ILS/src/templates/opac-new/library.tt2 [deleted file]
Open-ILS/src/templates/opac-new/login.tt2 [deleted file]
Open-ILS/src/templates/opac-new/mylist.tt2 [deleted file]
Open-ILS/src/templates/opac-new/mylist/clear.tt2 [deleted file]
Open-ILS/src/templates/opac-new/mylist/email.tt2 [deleted file]
Open-ILS/src/templates/opac-new/mylist/print.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/circ_history.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/circ_history/export.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/circs.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/ebook_checkout.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/ebook_circs.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/ebook_holds.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/ebook_holds_ready.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/ebook_place_hold.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/hold_history.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/holds.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/holds/edit.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/list/print.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/list/update.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/lists.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/main.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/main_pay.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/main_pay_init.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/main_payment_form.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/main_payments.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/messages.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/messages/list.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/messages/single_message.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/prefs.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/prefs_my_lists.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/prefs_notify.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/prefs_settings.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/receipt_email.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/receipt_print.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/reservations.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/update_email.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/update_password.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/update_password_msg.tt2 [deleted file]
Open-ILS/src/templates/opac-new/myopac/update_username.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/acjs.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/advanced/expert.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/advanced/global_row.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/advanced/numeric.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/advanced/search.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/anon_list.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/base.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/bookbag_actions.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/cart.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/cart_nav.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/chilifresh.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/coded_value_selector.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/config-fresh.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/config.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/css/colors.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/css/fonts.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/ebook_api/avail.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/ebook_api/base_js.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/ebook_api/login_js.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/filter_group_selector.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/filtersort.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/footer.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/goog_analytics.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/header.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/hold_error_messages.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/hold_status.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/homesearch.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/js.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/library/core_info.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/library/hours.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/library_name_link.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/library_name_link_from_ou.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/locale_picker.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/location_name_link.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/login/form.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/login/help.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/login/login_modal.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/login/password_hint.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/login/username_hint.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/metarecord_hold_filters.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/misc_util.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/multi_hold_select.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/myopac/base.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/myopac/column_sort_support.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/myopac/main_base.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/myopac/main_refund_policy.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/myopac/prefs_base.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/myopac/prefs_hints.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/org_selector.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/place_hold.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/place_hold_result.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/pref_lib_display.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/pref_locale_picker.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/preserve_params.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/qtype_selector.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/record/addedcontent.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/record/authors.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/record/awards.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/record/body.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/record/cnbrowse.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/record/contents.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/record/copy_counts.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/record/copy_table.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/record/extras.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/record/issues-db.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/record/issues-mfhd.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/record/issues.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/record/navigation.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/record/refworks.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/record/series.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/record/subjects.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/record/summary.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/record/summaryplus.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/relators.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/result/adv_filter.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/result/copy_counts.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/result/facets-hz.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/result/facets.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/result/lowhits.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/result/lowhits_purchase.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/result/paginate.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/result/table.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/searchbar.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/sms_carrier_selector.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/sms_number_textbox.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/staff_saved_searches.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/stripe.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/tips.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/topnav.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/topnav_links.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/topnav_logo.tt2 [deleted file]
Open-ILS/src/templates/opac-new/parts/topnav_subnav.tt2 [deleted file]
Open-ILS/src/templates/opac-new/password_reset.tt2 [deleted file]
Open-ILS/src/templates/opac-new/password_reset_msg.tt2 [deleted file]
Open-ILS/src/templates/opac-new/place_hold.tt2 [deleted file]
Open-ILS/src/templates/opac-new/record.tt2 [deleted file]
Open-ILS/src/templates/opac-new/record/email.tt2 [deleted file]
Open-ILS/src/templates/opac-new/record/print.tt2 [deleted file]
Open-ILS/src/templates/opac-new/register.tt2 [deleted file]
Open-ILS/src/templates/opac-new/results.tt2 [deleted file]
Open-ILS/src/templates/opac-new/sms_cn.tt2 [deleted file]
Open-ILS/src/templates/opac-new/temp_warn.tt2 [deleted file]
docs/RELEASE_NOTES_NEXT/OPAC/bootstrap-opac.adoc [new file with mode: 0644]

index 01a0529..427b830 100644 (file)
@@ -671,6 +671,7 @@ RewriteRule ^/openurl$ ${openurl:%1} [NE,PT]
     
     # Templates will be loaded from the following paths in reverse order.
     PerlAddVar OILSWebTemplatePath "@localstatedir@/templates"
+    #PerlAddVar OILSWebTemplatePath "@localstatedir@/templates-bootstrap" #Uncomment this line to use the new bootstrap OPAC
     #PerlAddVar OILSWebTemplatePath "@localstatedir@/templates_localskin"
 
     #-------------------------------------------------
diff --git a/Open-ILS/src/templates-bootstrap/opac/advanced.tt2 b/Open-ILS/src/templates-bootstrap/opac/advanced.tt2
new file mode 100644 (file)
index 0000000..1d6b412
--- /dev/null
@@ -0,0 +1,57 @@
+[%- PROCESS "opac/parts/header.tt2";
+    WRAPPER "opac/parts/base.tt2";
+    INCLUDE "opac/parts/topnav.tt2";
+    ctx.page_title = l("Advanced Search");
+    pane = CGI.param("pane") || "advanced";
+    loc = ctx.search_ou;
+    
+    ctx.metalinks.push('<meta name="robots" content="noindex,follow">');
+-%]
+    <span class="sr-only">[% l('Advanced Search') %]</span>
+       <div class="container">    
+        <div id="search-wrapper">    
+            [% IF pane == 'advanced' %]
+            <h1 class="h1 text-center pt-3">Advanced Search</h1>
+            <h2 class="text-center pt-3">Refine your search by filling out one or more fields to search by below.</h2>
+            [% ELSIF pane == 'numeric' %]
+            <h1 class="h1 text-center pt-3">Numeric Search</h1>
+            <h2 class="text-center pt-3">Search by a field and numeric identifier.</h2>
+            [% ELSIF pane == 'expert' %]
+            <h1 class="h1 text-center pt-3">Expert Search</h1>
+            <h2 class="text-center pt-3">Search the MARC record.</h2>
+            [% END %]
+            <div class="mt-3">
+                <ul class="nav nav-tabs">
+                <li class="nav-item">
+                    <a href="[% mkurl('', {pane => 'advanced'}) %]" 
+                        class="nav-link [% IF pane == 'advanced' %]active[% END %]"
+                        id="adv_search">[% l('Advanced Search') %]</a>
+                </li>
+                <li class="nav-item">
+                    <a href="[% mkurl('', {pane => 'numeric'}) %]"
+                       class="nav-link [% IF pane == 'numeric' %]active[% END %]"
+                        id="num_search">[% l('Numeric Search') %]</a>
+                </li>
+                <li class="nav-item">
+                    <a href="[% mkurl('', {pane => 'expert'}) %]"
+                       class="nav-link [% IF pane == 'expert' %]active[% END %]"
+                        id="expert_search">[% l('Expert Search') %]</a>
+                </li>
+            </div>
+        </div>
+        <div id="content-wrapper">
+            <div id="main-content">
+                <div class="advanced_div">
+                [% IF pane == 'advanced' %]
+                [% INCLUDE "opac/parts/advanced/search.tt2" %]
+                [% ELSIF pane == 'numeric' %]
+                [% INCLUDE "opac/parts/advanced/numeric.tt2" %]
+                [% ELSIF pane == 'expert' %]
+                [% INCLUDE "opac/parts/advanced/expert.tt2" %]
+                [% END %]
+                </div>
+                <div class="common-full-pad"></div>    
+            </div>
+        </div>
+    </div>
+[% END %]
diff --git a/Open-ILS/src/templates-bootstrap/opac/browse.tt2 b/Open-ILS/src/templates-bootstrap/opac/browse.tt2
new file mode 100644 (file)
index 0000000..bf34c23
--- /dev/null
@@ -0,0 +1,228 @@
+[%- # This is the bib and authority combined record browser.
+    ctx.page = "browse";
+
+    PROCESS "opac/parts/header.tt2";
+    PROCESS "opac/parts/misc_util.tt2";
+    PROCESS "opac/parts/org_selector.tt2";
+    WRAPPER "opac/parts/base.tt2";
+    INCLUDE "opac/parts/topnav.tt2";
+
+    ctx.page_title = l("Browse the Catalog");
+    
+    blimit = CGI.param('blimit') || ctx.opac_hits_per_page || 10;
+
+    depart_list = ['blimit', 'bterm', 'bpivot'];
+    ctx.metalinks.push('<meta name="robots" content="noindex,follow">');
+    MACRO heading_use_label BLOCK;
+        SWITCH use;
+            CASE 'variant';
+               l('See');
+            CASE 'broader';
+               l('Broader term');
+            CASE 'narrower';
+               l('Narrower term');
+            CASE 'other';
+               l('Related term');
+            CASE;
+               l('See');
+        END;
+    END;
+%]
+
+    <h2 class="sr-only">[% l('Catalog Browse') %]</h2>
+    
+    <div id="content-wrapper" class="my-5">
+        <div id="main-content" class="container mx-auto w-75">
+            <div id="browse-the-catalog">
+                <div id="browse-controls" class='row text-center'>
+                    <form method="get" onsubmit="$('browse-submit-spinner').className = ''; return true" class="mx-auto">
+                        <input type="hidden" name="blimit"
+                            value="[% blimit %]" />
+
+                        [% control_qtype = INCLUDE "opac/parts/qtype_selector.tt2"
+                            id="browse-search-class" browse_only=1 plural=1 %]
+                                                       
+                        [% control_bterm = BLOCK %]<input type="text" name="bterm" id="browse-term"
+                            aria-label="[% l('Browse term') %]"
+                            value="[% CGI.param('bterm') | html %]" class="form-control" />[% END %]
+                        [% control_locg = INCLUDE build_org_selector id='browse-context'
+                            show_loc_groups=1
+                            arialabel=l('Select holding library') %]
+                        [% l('Browse for [_1] starting with [_2] in [_3]', control_qtype, control_bterm, control_locg) %]
+
+                       <input id='search-submit-go' type="submit" value="[% l('Browse') %]" alt="[% l('Browse') %]" class="btn btn-confirm my-2"/>
+                        <img id="browse-submit-spinner" 
+                        src="[% ctx.media_prefix %]/opac/images/progressbar_green.gif[% ctx.cache_key %]"
+                        class="hidden" style="width: 16px; height: 16px;" 
+                        alt="[% l('Search in progress icon') %]" />
+                    </form>
+                </div>
+                       <div class="row text-center my-5 border-top border-bottom">
+                [% BLOCK browse_pager %]
+                <div class="browse-pager col-12">
+                <div class="mx-auto">
+                    [% IF ctx.back_pivot %]
+                    <a class="btn btn-outline-primary btn-sm" href="[% mkurl('', {bpivot => ctx.back_pivot}) %]" onclick="$('browse-pager-spinner-[% id %]').className = '';">&larr; [%l ('Back') %]</a>
+                    [% END %]
+                    [% IF ctx.pager_shortcuts;
+                        current_qtype = CGI.param('qtype') || 'title' %]
+                    <span class="browse-shortcuts">
+                        [% FOR shortcut IN ctx.pager_shortcuts %]
+                            <a href="[% mkurl('', {qtype => current_qtype, bterm => shortcut.0}, ['bpivot','query']) %]">[% shortcut.1 %]</a>
+                        [% END %]
+                    </span>
+                    [% END %]
+                    <img id="browse-pager-spinner-[% id %]" 
+                        src="[% ctx.media_prefix %]/opac/images/progressbar_green.gif[% ctx.cache_key %]"
+                        class="hidden" style="width: 16px; height: 16px;" 
+                        alt="[% l('Search in progress icon') %]" />
+                    [% IF ctx.forward_pivot %]
+                    <a class="btn btn-outline-primary btn-sm" href="[% mkurl('', {bpivot => ctx.forward_pivot}) %]" onclick="$('browse-pager-spinner-[% id %]').className = '';">[%l ('Next') %] &rarr;</a>
+                    [% END %]
+
+                   
+                        </div>
+                </div>
+                [% END %]
+
+                [% PROCESS browse_pager id=0 %]
+
+                <div id="browse-results" class="col-12">
+                [% IF ctx.browse_error %]
+                    <span class="browse-error">
+                        [% l("An error occurred browsing records. " _
+                        "Please try again in a moment or report the issue " _
+                        "to library staff.") %]
+                    </span>
+                [% ELSE %]
+                    [% IF ctx.browse_leading_article_warning %]
+                    <div class="browse-leading-article-warning">
+                            [% l("Your browse term seems to begin with an article (a, an, the). You might get better results by omitting the article.") %]
+                            [% IF ctx.browse_leading_article_alternative %]
+                            <p>
+                            [% alternative_link = BLOCK %]
+                            <a href="[% mkurl('', {bterm => ctx.browse_leading_article_alternative}, ['bpivot']) %]">[% ctx.browse_leading_article_alternative | html %]</a>
+                            [%-  END; # alternative_link BLOCK
+                                l("Did you mean [_1]?", alternative_link);
+                            END # IF %]
+                            </p>
+                    </div>
+                    [% END %]
+                    <ul class="browse-result-list">
+                    [% FOR result IN ctx.browse_results %]
+                        <li class="browse-result">
+                            <span class="browse-result-value[% result.row_number == 0 && !CGI.param('bpivot') ? ' browse-result-best-match' : '' %]">
+                                [% IF result.sources > 0 %] <!-- bib-linked browse value -->
+                                    <a href="[% mkurl(
+                                        ctx.opac_root _ '/results', {
+                                            'fi:has_browse_entry' => (result.browse_entry _ ',' _ result.fields)
+                                        }) %]">[% result.value | html %]</a>
+                                    <span class="browse-result-sources">([%
+                                        IF result.accurate == 'f';
+                                            l("At least"); " ";
+                                        END;
+                                    result.sources %])</span>
+                                [% ELSE %] <!-- only authority links -->
+                                    [% result.value | html %]
+                                [% END %]
+                            </span>
+
+                            [% FOR a IN result.authorities;
+                                    PROCESS authority_notes authority=a IF !sees.grep(a.id);
+                               END %]
+                            [% auth_headings_ul_added = 0; %]
+                                [% seenit = {}; # for headings we've rendered
+                                   FOR a IN result.sees;
+                                    # We can go no further sans control_set.
+                                    NEXT UNLESS a.control_set;
+
+                                    # get_authority_fields is fast and cache-y.
+                                    acs = ctx.get_authority_fields(a.control_set);
+                                    FOR field_group IN a.headings;
+                                        field_id = field_group.keys.0;
+                                        field = acs.$field_id;
+                                        headings = field_group.values.0;
+                                        FOR h IN headings;
+                                            # We could display headings without
+                                            # links here when h.target is
+                                            # undef, if we wanted to, but note
+                                            # that h.target_count is only
+                                            # defined when h.target is.
+
+                                            IF h.target AND h.target_count AND result.list_authorities.grep('^' _ h.target _ '$').size == 0 AND h.main_entry;
+                                                id = h.target; NEXT IF seenit.$id; seenit.$id = 1; 
+                                                IF !auth_headings_ul_added;
+                                                    # only add a <ul> if we have at least one <li> (WCAG 2.0)
+                                                    auth_headings_ul_added = 1; %]
+                                                <ul class="browse-result-authority-headings"> 
+                                                [% END %]
+
+                                                <li><span class="browse-result-authority-field-name">[% heading_use_label(use=h.type) %]</span>
+                                                <a href="[% mkurl(ctx.opac_root _ '/browse', {bterm => h.heading}, ['bpivot']) %]">[% h.heading | html %]</a>
+                                                <span class="browse-result-authority-bib-links">([% h.target_count %])</span>
+                                                </li>
+                                            [% END %]
+                                        [% END %]
+                                    [% END %]
+                                [% END %]
+                                [% FOR a IN result.authorities;
+                                    # We can go no further sans control_set.
+                                    NEXT UNLESS a.control_set;
+
+                                    # get_authority_fields is fast and cache-y.
+                                    acs = ctx.get_authority_fields(a.control_set);
+                                    FOR field_group IN a.headings;
+                                        field_id = field_group.keys.0;
+                                        field = acs.$field_id;
+                                        headings = field_group.values.0;
+                                        FOR h IN headings;
+                                            # We could display headings without
+                                            # links here when h.target is
+                                            # undef, if we wanted to, but note
+                                            # that h.target_count is only
+                                            # defined when h.target is.
+
+                                            IF h.target AND h.target_count AND result.list_sees.grep('^' _ h.target _ '$').size == 0 AND !h.main_entry AND ctx.get_cgf('opac.show_related_headings_in_browse').enabled == 't';
+                                                id = h.target; NEXT IF seenit.$id; seenit.$id = 1; 
+                                                IF !auth_headings_ul_added;
+                                                    # only add a <ul> if we have at least one <li> (WCAG 2.0)
+                                                    auth_headings_ul_added = 1; %]
+                                                <ul class="browse-result-authority-headings"> 
+                                                [% END %]
+                                                <li><span class="browse-result-authority-field-name">[% heading_use_label(use=h.type) %]</span>
+                                                <a href="[% mkurl(ctx.opac_root _ '/results', {query => 'identifier|authority_id[' _ h.target _ ']'}) %]">[% h.heading | html %]</a>
+                                                <span class="browse-result-authority-bib-links">([% h.target_count %])</span>
+                                                </li>
+                                            [% END %]
+                                        [% END %]
+                                    [% END %]
+                                [% END %]
+                            [% IF auth_headings_ul_added %]</ul>[% END %]
+                        </li>
+                    [% END %]
+                    </ul>
+                [% END %]
+                </div>
+
+                [% PROCESS browse_pager id=1 %]
+            </div>
+</div>
+            <div class="common-full-pad"></div>        
+        </div>
+    </div>
+
+    [% BLOCK authority_notes;
+        # Displays public general notes (sometimes called "scope notes" ?)
+        FOR note IN authority.notes %]
+            <div class="browse-public-general-note">
+                <span class="browse-public-general-note-label">
+                    [% l("Note:") %]
+                </span>
+                <span class="browse-public-general-note-body">
+                [% FOR piece IN note; piece | html; END %]
+                </span>
+            </div>
+        [% END;
+    END;    # end of BLOCK authority_notes %]
+
+[% END %]
diff --git a/Open-ILS/src/templates-bootstrap/opac/cnbrowse.tt2 b/Open-ILS/src/templates-bootstrap/opac/cnbrowse.tt2
new file mode 100644 (file)
index 0000000..86454e9
--- /dev/null
@@ -0,0 +1,20 @@
+[%- # This is the stand-alone call-number browser.  This mainly wraps around
+    # the same guts as the "shelf browser" part of a record results page.
+
+    PROCESS "opac/parts/header.tt2";
+    PROCESS "opac/parts/misc_util.tt2";
+    ctx.metalinks.push('<meta name="robots" content="noindex,follow">');
+    WRAPPER "opac/parts/base.tt2";
+    INCLUDE "opac/parts/topnav.tt2";
+    ctx.page_title = l("Call Number Browse"); %]
+    <span class="sr-only">[% l('Call Number Browse') %]</span>
+    [% INCLUDE "opac/parts/searchbar.tt2" %]
+    <div id="content-wrapper">
+        <div id="main-content">
+            <div class="cnbrowse_div">
+                [% INCLUDE "opac/parts/record/cnbrowse.tt2" %]
+            </div>
+            <div class="common-full-pad"></div>        
+        </div>
+    </div>
+[% END %]
diff --git a/Open-ILS/src/templates-bootstrap/opac/css/style.css.tt2 b/Open-ILS/src/templates-bootstrap/opac/css/style.css.tt2
new file mode 100644 (file)
index 0000000..3f7291f
--- /dev/null
@@ -0,0 +1,3792 @@
+[%-
+    PROCESS "opac/parts/css/colors.tt2";
+    PROCESS "opac/parts/css/fonts.tt2";
+    rtl = ctx.get_i18n_l(ctx.eg_locale).rtl;
+%]
+
+/*
+Mini Table Styling
+*/
+@media 
+only screen and (max-width: 650px)  {
+    .miniTable{
+        width: 100% !important;
+    }
+
+       /* Force table to not be like tables anymore */
+    .miniTable table, .miniTable thead, .miniTable tbody, .miniTable th, .miniTable td, .miniTable tr
+    { 
+               display: block; 
+    }
+    
+    .miniTable th{
+       display:none;
+    }
+       
+       /* Hide table headers (but not display: none;, for accessibility) */
+    .miniTable thead tr{ 
+               position: absolute;
+               top: -9999px;
+               left: -9999px;
+       }
+       
+    .miniTable tr
+     { 
+       border: 1px solid #ccc; 
+       margin: 10px 0px; 
+     }
+
+
+    .miniTable td
+    { 
+               border: none;
+               border-bottom: 1px solid #eee; 
+               position: relative;
+        padding-left: 50%; 
+        min-height:45px;
+        text-align: right;
+    }
+       
+    .miniTable td:before
+    { 
+               left: 6px;
+               width: 45%; 
+               padding-right: 10px; 
+               white-space: nowrap;
+        position: absolute;
+    }
+    .copyTable tr:nth-of-type(1):before { content: "Copy #1"; display: block; text-align:center; }
+       .copyTable tr:nth-of-type(2):before { content: "Copy #2"; display: block; text-align:center;}
+       .copyTable tr:nth-of-type(3):before { content: "Copy #3"; display: block; text-align:center;}
+       .copyTable tr:nth-of-type(4):before { content: "Copy #4"; display: block; text-align:center;}
+       .copyTable tr:nth-of-type(5):before { content: "Copy #5"; display: block; text-align:center;}
+       .copyTable tr:nth-of-type(6):before { content: "Copy #6"; display: block; text-align:center;}
+       .copyTable tr:nth-of-type(7):before { content: "Copy #7"; display: block; text-align:center;}
+       .copyTable tr:nth-of-type(8):before { content: "Copy #8"; display: block; text-align:center;}
+       .copyTable tr:nth-of-type(9):before { content: "Copy #9"; display: block; text-align:center;}
+       .copyTable tr:nth-of-type(10):before { content: "Copy #10"; display: block; text-align:center;}
+
+       .copyTable td:nth-of-type(1):before { content: "Library"; display: flex; }
+    .copyTable td:nth-of-type(2):before { content: "Call Number"; display: flex; }
+       .copyTable td:nth-of-type(3):before { content: "Barcode"; display: flex;}
+    .copyTable td:nth-of-type(4):before { content: "Shelving Location"; display: flex;}
+    .copyTable td:nth-of-type(5):before { content: "Status"; display: flex;}
+    .copyTable td:nth-of-type(6):before { content: "Due Date"; display: flex;}
+   
+    .holdingsTable tr:nth-of-type(1):before { content: "Copy #1"; display: block; text-align:center; }
+       .holdingsTable tr:nth-of-type(2):before { content: "Copy #2"; display: block; text-align:center;}
+       .holdingsTable tr:nth-of-type(3):before { content: "Copy #3"; display: block; text-align:center;}
+       .holdingsTable tr:nth-of-type(4):before { content: "Copy #4"; display: block; text-align:center;}
+       .holdingsTable tr:nth-of-type(5):before { content: "Copy #5"; display: block; text-align:center;}
+       .holdingsTable tr:nth-of-type(6):before { content: "Copy #6"; display: block; text-align:center;}
+       .holdingsTable tr:nth-of-type(7):before { content: "Copy #7"; display: block; text-align:center;}
+       .holdingsTable tr:nth-of-type(8):before { content: "Copy #8"; display: block; text-align:center;}
+       .holdingsTable tr:nth-of-type(9):before { content: "Copy #9"; display: block; text-align:center;}
+       .holdingsTable tr:nth-of-type(10):before { content: "Copy #10"; display: block; text-align:center;}
+
+
+    .holdingsTable td:nth-of-type(1):before { content: "Library"; display: flex; }
+    .holdingsTable td:nth-of-type(2):before { content: "Shelving location"; display: flex; }
+       .holdingsTable td:nth-of-type(3):before { content: "Call number"; display: flex;}
+    .holdingsTable td:nth-of-type(4):before { content: "Status"; display: flex;}
+
+       .chargesTable td:nth-of-type(1):before { content: "Select"; display: flex; }
+    .chargesTable td:nth-of-type(2):before { content: "Owed"; display: flex; }
+       .chargesTable td:nth-of-type(3):before { content: "Billing Type"; display: flex;}
+    .chargesTable td:nth-of-type(4):before { content: "Note"; display: flex;}
+    .chargesTable td:nth-of-type(5):before { content: "Date"; display: flex;}
+    
+    .chargesMainTable td:nth-of-type(1):before { content: "Select"; display: flex; }
+    .chargesMainTable td:nth-of-type(2):before { content: "Owed"; display: flex; }
+       .chargesMainTable td:nth-of-type(3):before { content: "Billing Type"; display: flex;}
+    .chargesMainTable td:nth-of-type(4):before { content: "Title"; display: flex;}
+    .chargesMainTable td:nth-of-type(5):before { content: "Checkout"; display: flex;}
+    .chargesMainTable td:nth-of-type(6):before { content: "Due"; display: flex;}
+    .chargesMainTable td:nth-of-type(7):before { content: "Returned/Renewed"; display: flex;}
+    
+    .activeHoldstable td:nth-of-type(1):before { content: "Select"; display: flex; }
+    .activeHoldstable td:nth-of-type(2):before { content: "Title"; display: flex; }
+       .activeHoldstable td:nth-of-type(3):before { content: "Author"; display: flex;}
+    .activeHoldstable td:nth-of-type(4):before { content: "Format"; display: flex;}
+    .activeHoldstable td:nth-of-type(5):before { content: "Pickup Location"; display: flex;}
+    .activeHoldstable td:nth-of-type(6):before { content: "Cancel If Not Filled By"; display: flex;}
+    .activeHoldstable td:nth-of-type(7):before { content: "Status"; display: flex;}
+    .activeHoldstable td:nth-of-type(8):before { content: "Notes"; display: flex;}
+    
+    .holdHistoryTable td:nth-of-type(1):before { content: "Title"; display: flex; }
+    .holdHistoryTable td:nth-of-type(2):before { content: "Author"; display: flex; }
+    .holdHistoryTable td:nth-of-type(3):before { content: "Format"; display: flex; }
+    .holdHistoryTable td:nth-of-type(4):before { content: "Pickup Location"; display: flex; }
+    .holdHistoryTable td:nth-of-type(5):before { content: "Status"; display: flex; }
+    
+    .paymentTable td:nth-of-type(1):before { content: "Payment Date"; display: flex; }
+    .paymentTable td:nth-of-type(2):before { content: "Payment For"; display: flex; }
+    .paymentTable td:nth-of-type(3):before { content: "Amount"; display: flex; }
+    .paymentTable td:nth-of-type(4):before { content: "Receipt"; display: flex; }
+    
+    .messagesTable td:nth-of-type(1):before { content: "Select"; display: flex; }
+    .messagesTable td:nth-of-type(2):before { content: "Date"; display: flex; }
+    .messagesTable td:nth-of-type(3):before { content: "Library"; display: flex; }
+    .messagesTable td:nth-of-type(4):before { content: "Subject"; display: flex; }
+    .messagesTable td:nth-of-type(5):before { content: ""; display: flex; }
+    
+    .circTable td:nth-of-type(1):before { content: "Select"; display: flex; }
+    .circTable td:nth-of-type(2):before { content: "Title"; display: flex; }
+    .circTable td:nth-of-type(3):before { content: "Author"; display: flex; }
+    .circTable td:nth-of-type(4):before { content: "Renewals Left"; display: flex; }
+    .circTable td:nth-of-type(5):before { content: "Due Date"; display: flex; }
+    .circTable td:nth-of-type(6):before { content: "Barcode"; display: flex; }
+    .circTable td:nth-of-type(7):before { content: "Call Number"; display: flex; }
+    
+    .circHistTable td:nth-of-type(1):before { content: "Select"; display: flex; }
+    .circHistTable td:nth-of-type(2):before { content: "Title"; display: flex; }
+    .circHistTable td:nth-of-type(3):before { content: "Author"; display: flex; }
+    .circHistTable td:nth-of-type(4):before { content: "Checkout Date"; display: flex; }
+    .circHistTable td:nth-of-type(5):before { content: "Due Date"; display: flex; }
+    .circHistTable td:nth-of-type(6):before { content: "Date Returned"; display: flex; }
+    .circHistTable td:nth-of-type(7):before { content: "Barcode"; display: flex; }
+    .circHistTable td:nth-of-type(8):before { content: "Call Number"; display: flex; }
+    
+    .bookbagTable td:nth-of-type(1):before { content: ""; display: flex; }
+    .bookbagTable td:nth-of-type(2):before { content: "Title"; display: flex; }
+    .bookbagTable td:nth-of-type(3):before { content: "Author(s)"; display: flex; }
+    .bookbagTable td:nth-of-type(4):before { content: "Local Call number"; display: flex; }
+    .bookbagTable td:nth-of-type(5):before { content: "Publication Date"; display: flex; }
+    .bookbagTable td:nth-of-type(6):before { content: "Format"; display: flex; }
+    .bookbagTable td:nth-of-type(7):before { content: "Notes"; display: flex; }
+    
+    .eholdsTable td:nth-of-type(1):before { content: "Title"; display: flex; }
+    .eholdsTable td:nth-of-type(2):before { content: "Author"; display: flex; }
+    .eholdsTable td:nth-of-type(3):before { content: "Expire Date"; display: flex; }
+    .eholdsTable td:nth-of-type(4):before { content: "Status"; display: flex; }
+    .eholdsTable td:nth-of-type(5):before { content: "Actions"; display: flex; }
+    
+    .eholdsreadyTable td:nth-of-type(1):before { content: "Title"; display: flex; }
+    .eholdsreadyTable td:nth-of-type(2):before { content: "Author"; display: flex; }
+    .eholdsreadyTable td:nth-of-type(3):before { content: "Expire Date"; display: flex; }
+    .eholdsreadyTable td:nth-of-type(4):before { content: "Actions"; display: flex; }
+    
+    .echeckoutTable td:nth-of-type(1):before { content: "Title"; display: flex; }
+    .echeckoutTable td:nth-of-type(2):before { content: "Author"; display: flex; }
+    .echeckoutTable td:nth-of-type(3):before { content: "Due Date"; display: flex; }
+    .echeckoutTable td:nth-of-type(4):before { content: "Actions"; display: flex; }
+    
+    .ecircsTable td:nth-of-type(1):before { content: "Title"; display: flex; }
+    .ecircsTable td:nth-of-type(2):before { content: "Author"; display: flex; }
+    .ecircsTable td:nth-of-type(3):before { content: "Due Date"; display: flex; }
+    .ecircsTable td:nth-of-type(4):before { content: "Actions"; display: flex; }
+
+    .bucketTable td:nth-of-type(2):before { content: "Title"; display: flex; text-align:left; }
+    .bucketTable td:nth-of-type(3):before { content: "Author"; display: flex; text-align:left; }
+    .bucketTable td:nth-of-type(4):before { content: "Call Number"; display: flex; text-align:left; }
+    
+    /*Media Style Additions*/
+    .fullRow{
+        padding: 5px !important;
+       text-align: center !important;
+       width: 100%;
+    }
+    
+    .paginateText{
+       display:none;
+       }
+}/*Micro Tables End*/
+
+/*
+Novelist Styling
+*/
+
+.NovGroupHeader{
+    font-size: 16pt !important;
+    text-align: center;
+    font-weight: 600 !important;
+}
+
+.NovSectionHeader{
+       font-size: 16pt !important;
+    font-weight: 600 !important;
+}
+
+.NovSelectImageHeadingToggle{
+           font-size: 20px;
+        
+}
+
+/*Novelist Styling End*/
+
+/* Buttons */
+
+.btn-confirm {
+    color: [% css_colors.button_confirm_text %];
+    background-color: [% css_colors.button_confirm %];
+    border-color: [% css_colors.button_confirm_border %];
+}
+
+.btn-confirm:hover {
+    color: [% css_colors.button_confirm_text %];
+    background-color: [% css_colors.button_confirm_hover %];
+    border-color: [% css_colors.button_confirm_border_hover %];
+}
+
+.btn-deny {
+    color: [% css_colors.button_deny_text %];
+    background-color: [% css_colors.button_deny %];
+    border-color: [% css_colors.button_deny_border_hover %];
+}
+
+.btn-deny:hover {
+    color: [% css_colors.button_deny_text %];
+    background-color: [% css_colors.button_deny_hover %];
+    border-color: [% css_colors.button_deny_border_hover %];
+}
+
+.btn-remove {
+    color: [% css_colors.button_remove_text %];
+    background-color: [% css_colors.button_remove %];
+    border-color: [% css_colors.button_remove_border %];
+}
+
+.btn-remove:hover {
+    color: [% css_colors.button_remove_text %];
+    background-color: [% css_colors.button_remove_hover %];
+    border-color: [% css_colors.button_remove_border_hover %];
+}
+
+.btn-opac{
+    color: [% css_colors.opac_button_text %] !important;
+    background-color: [% css_colors.opac_button %];
+    border-color: [% css_colors.opac_button_border %];
+}
+
+.btn-opac:hover{
+    color: [% css_colors.opac_button_text %];
+       background-color: [% css_colors.opac_button_hover %] !important;
+    border-color: [% css_colors.opac_button_border_hover %];
+}
+
+.btn-action{
+    color: [% css_colors.action_button_text %] !important;
+    background-color: [% css_colors.action_button %];
+    border-color: [% css_colors.action_button_border %];
+}
+
+.btn-action:hover{
+    color: [% css_colors.action_button_text %];
+       background-color: [% css_colors.action_button_hover %] !important;
+    border-color: [% css_colors.action_button_border_hover %];
+}
+.btn-action > a{
+    color: [% css_colors.action_button_text_anchors %];
+}
+
+
+.dash-link{
+       color: #fff;
+}
+
+.dash-clear{
+       color: [% css_colors.zero_count %] !important;
+}
+
+.dash-unclear{
+       color: [% css_colors.non_zero_count %] !important;
+}
+
+.remove_filter{
+    padding: .25rem .25rem !important;
+    font-size: .875rem;
+    line-height: 0.5;
+    border-radius: 1rem !important;
+}
+
+#cnbrowse{
+       width: 95%;
+    text-align: center;
+    padding: 15px;
+}
+.cn_browse_item .card{
+       padding: 15px;
+}
+#facets .card-header,#facets .card-header a {
+       background-color: [% css_colors.facets_back %];
+    color: [% css_colors.text_invert %]
+}
+
+.facet_template:hover{
+               background-color:#e8e8e8;
+}
+
+.red{
+       color:red;
+}
+
+.login:focus{
+       outline:none;
+}
+.browse-result-list{
+       list-style:none;
+}
+.not_active_pill{
+       border: 2px solid #007bff;
+    padding: 6px;
+    margin: 0 10px;
+}
+
+.mini-control{
+       max-width: 100px !important;
+}
+
+.card-body:empty{
+       display:none;
+}
+.min{
+ min-height:500px;
+}
+.container{
+       
+}
+html{
+       height:100%;
+    min-height: 100vh;
+}
+body {
+height:100%;
+min-height: 100vh;
+    margin:0;
+    font-family: [% css_fonts.font_main %] !important;
+    font-size: [% css_fonts.size_base %];
+  /*  background-color: [% css_colors.primary %]; */
+    [% IF rtl == 't' -%]
+    direction: rtl;
+    [%- END %]
+}
+
+button, input {
+    font-family: [% css_fonts.font_main %] !important;
+    font-size: [% css_fonts.size_base %];
+}
+
+img {
+    border: none;
+}
+
+#topnav_logo {
+    margin: 2em 0;
+}
+
+#homesearch_main_logo {
+    padding-top: 60px;
+    margin: auto;
+    width: 50%;
+}
+
+a {
+    color: [% css_colors.link %];
+}
+
+#search-wrapper input[type=text] {
+    margin:0;
+    padding:0;
+}
+
+#search-wrapper select, .results_header_lbl select {
+    border:1px solid [% css_colors.border_standard %];
+    margin:0;
+    padding:0;
+    width: 12em;
+}
+
+.searchbar {
+    font-weight: bold;
+    padding-top: 10px;
+    [% IF rtl == 't' -%]
+    margin-right: 1em;
+    [%- ELSE %]
+    margin-left: 1em;
+    [%- END %]
+}
+
+.refine_search {
+    padding-bottom: 7px;
+    margin-left: 1em;
+}
+
+/*
+#search-wrapper select {
+    border:0px solid [% css_colors.border_dark %];
+    filter:alpha(opacity=0);
+    -khtml-opacity:0;
+    opacity:0;
+    padding:0;
+    margin:0;
+    height:18px;
+}
+*/
+h1 {
+    margin:0;
+    margin-bottom: 5px;
+    font-size: [% css_fonts.size_biggest %];
+    font-weight:normal;
+}
+
+h2 {
+    font-size: [% css_fonts.size_bigger %];
+    font-weight:bold;
+}
+
+h2.graphic880 {
+    font-size: [% css_fonts.size_bigger %];
+    font-weight:normal;
+}
+
+.hide_me, .hidden {
+    display: none;
+    visibility: hidden;
+}
+
+div.select-box-wrapper {
+    position:absolute;
+    padding-top:2px;
+    overflow:hidden;
+    [% IF rtl == 't' -%]
+    padding-right: 3px;
+    text-align:right;
+    [%- ELSE %]
+    padding-left:3px;
+    text-align:left;
+    [%- END %]
+}
+
+#dash_wrapper {
+    [% IF rtl == 't' -%]
+    margin-right: 0.5em;
+    [%- ELSE %]
+    margin-left: 0.5em;
+    [%- END %]
+}
+
+#dash_wrapper div {
+    background-color: [% css_colors.primary %];
+    border-radius: 5px;
+    padding: 0em 1em;
+}
+
+.dash_divider {
+    margin: 0 20px;
+    color: #fff;
+    display:inline-block;
+}
+
+#dashboard, #dashboard_e {
+    margin-top: 1em;
+    height: 2em;
+}
+
+#dashboard span.dash-align a, #dashboard_e span.dash-align a {
+    font-weight: bold;
+    text-decoration: none;
+}
+
+#dash_user {
+    font-weight: bold;
+}
+
+#logout_link {
+    [% IF rtl == 't' -%]
+    right: 1px;
+    [%- ELSE %]
+    left: 1px;
+    [%- END %]
+}
+
+
+/*  
+#dash_fines { color: [% css_colors.text_badnews %]; }
+the color contrast between "text_badnews" and "primary"
+is too low for WCAG compliance.  Use "text_attention" 
+for now until a better color is picked - if needed.
+*/
+
+#dash_wrapper #dash_user_message_button_container {
+    display: inline;
+    padding: 0;
+}
+#dash_wrapper #unread_message_count_floater {
+    position: absolute;
+    background-color: [% css_colors.text_alert %];
+    padding-left: 0.2em;
+    padding-right: 0.2em;
+    display: inline-block;
+    font-size: 95%;
+    border-radius: 0;
+    z-index: 2;
+    margin-top: 0.2em;
+    [% IF rtl == 't' -%]
+    margin-right: -1.5em;
+    [%- ELSE %]
+    margin-left: -1.5em;
+    [%- END %]
+}
+
+#header-wrap {
+       /* border-bottom: 5px solid [% css_colors.nav_separation %]; */
+    background-color: [% css_colors.header_primary_fade %];
+    background-image: -moz-linear-gradient([% css_colors.header_primary %], [% css_colors.header_primary_fade %]);
+    background-image: -o-linear-gradient([% css_colors.header_primary %], [% css_colors.header_primary_fade %]);
+    background-image: -webkit-linear-gradient([% css_colors.header_primary %], [% css_colors.header_primary_fade %]);
+    background-image: linear-gradient([% css_colors.header_primary %], [% css_colors.header_primary_fade %]);
+}
+#header {
+    color: [% css_colors.background %];
+    margin-left: 1em;
+    margin-right: 1em;
+    font-size: [% css_fonts.size_small %];
+}
+
+#header a {
+    color: [% css_colors.background %];
+}
+
+#header a:hover {
+    color: [% css_colors.text_invert %];
+    text-decoration: none;
+}
+
+#header-links {
+    color: [% css_colors.text_invert %];
+    font-size: [% css_fonts.size_small %];
+    font-weight: bold;
+    position: relative;
+    top:4px;
+    
+}
+
+#header-links a {
+    color: [% css_colors.text_invert %];
+    display: block;
+    text-decoration: none;
+    [% IF rtl == 't' -%]
+    float: right;
+    margin-left: 22px;
+    [%- ELSE %]
+    float:left;
+    margin-right:22px;
+    [%- END %]
+}
+
+#header-links a:hover {
+    color: [% css_colors.text_invert %];
+    text-shadow: 0 0 0.2em [% css_colors.primary %], 0 0 0.2em [% css_colors.primary %];
+    text-decoration: none;
+}
+
+#header #header-links2 {
+    position:relative;
+    top:-8px;
+    color: [% css_colors.text_invert %];
+    padding-bottom: 15px;
+}
+
+#header #header-links2 a {
+    color: [% css_colors.text_invert %];
+}
+
+#header #header-links2 a:hover {
+    text-decoration: underline;
+}
+
+#your-acct-login {
+    padding-top:2em;
+}
+
+#gold-links {
+    [% IF rtl == 't' -%]
+    margin-right: 1em;
+    padding-right: 0px;
+    [%- ELSE %]
+    margin-left: 1em;
+    padding-left:0px;
+    [%- END %]
+}
+
+#gold-links-home {
+    margin:auto;
+    [% IF rtl == 't' -%]
+    padding-right: 0px;
+    [%- ELSE %]
+    padding-left:0px;
+    [%- END %]
+}
+
+#gold-links-holder {
+    height: 24px;
+    background-color: [% css_colors.background_invert %];
+}
+
+#util-bar {
+    [% IF rtl == 't' -%]
+    margin-right: 1em;
+    padding-right: 0px;
+    [%- ELSE %]
+    margin-left: 1em;
+    padding-left:0px;
+    [%- END %]
+    height:0px;
+}
+
+#search-wrapper {
+    /*border-bottom: 1px solid [% css_colors.border_standard %];*/
+    padding-bottom: 5px;
+    background-color: [% css_colors.background %];
+}
+
+#search-wrapper #breadcrumb {
+    margin-top:0px;
+    font-size: [% css_fonts.size_smaller %];
+    [% IF rtl == 't' -%]
+    float: right;
+    [%- ELSE %]
+    float:left;
+    [%- END %]
+}
+
+#search-wrapper #search-within {
+    margin-top:10px;
+    position:relative;
+    [% IF rtl == 't' -%]
+    float: left;
+    right: -173px;
+    [%- ELSE %]
+    float:right;
+    left:-173px;
+    [%- END %]
+}
+
+#search-wrapper #breadcrumb a {
+    color: [% css_colors.text %];
+}
+
+#search-wrapper #search_frm label {
+    font-size: [% css_fonts.size_smaller %];
+}
+
+#search-wrapper #search-box {
+    [% IF rtl == 't' -%]
+    margin-right: 1em;
+    padding-right: 0px;
+    [%- ELSE %]
+    margin-left: 1em;
+    padding-left: 0px;
+    [%- END %]
+    padding-top: 10px;
+    padding-bottom: 10px;
+}
+
+#adv_search_tabs, #acct_tabs, #acct_fines_tabs, #acct_checked_tabs, #acct_holds_tabs, #acct_prefs_tabs, #results_header_inner{
+    [% IF rtl == 't' -%]
+    margin-right:2px;
+    [%- ELSE %]
+    margin-left: 2px;
+    [%- END %]
+    overflow: auto;
+}
+
+#adv_search_tabs a, #acct_tabs a, #acct_fines_tabs a, #acct_checked_tabs a, #acct_holds_tabs a, #acct_prefs_tabs a {
+    [% IF rtl == 't' -%]
+    float: right;
+    margin: 10px 0px 0px 7px;
+    border-radius: 10px 10px 0px 0px;
+    [%- ELSE %]
+    float: left;
+    margin: 10px 7px 0px 0px;
+    border-radius: 10px 10px 0px 0px;
+    [%- END %]
+    text-align: center;
+    vertical-align: middle;
+    display: block;
+    padding: 10px 0px 10px 0px;
+    font-weight: bold;
+    color: [% css_colors.text_invert %];
+    background-color: [% css_colors.control %];
+    font-weight: bold;
+    text-decoration: none;
+}
+
+#adv_search_tabs a, #acct_tabs a, #acct_fines_tabs a {
+    padding: 1em 1em 0.5em;
+}
+
+#adv_search_tabs a:hover, #acct_tabs a:hover, #acct_fines_tabs a:hover, #acct_checked_tabs a:hover, #acct_holds_tabs a:hover, #acct_prefs_tabs a:hover {
+    background-color: [% css_colors.primary %];
+    color: [% css_colors.text_invert %];
+    text-decoration: none;
+}
+
+#adv_search_filters {
+    position: relative;
+}
+#adv_search_rows {
+    border-bottom: none;
+}
+.adv_filter_block {
+    [% IF rtl == 't' -%]
+    float: right;
+    [%- ELSE %]
+    float: left;
+    [%- END %]
+    padding: 15px;
+    clear: both;
+}
+.adv_filter_block_item {
+    [% IF rtl == 't' -%]
+    float: right;
+    [%- ELSE %]
+    float: left;
+    [%- END %]
+    padding: 5px;
+}
+
+#adv_special_block {
+    [% IF rtl == 't' -%]
+    float: right;
+    [%- ELSE %]
+    float: left;
+    [%- END %]
+    padding: 5px;
+    margin-top: 5px;
+}
+
+#adv_search_submit {
+    [% IF rtl == 't' -%]
+    margin-right: 10px;
+    [%- ELSE %]
+    margin-left: 10px;
+    [%- END %]
+    position: relative;
+}
+
+.checkbox_col {
+    width: 1%;
+    [% IF rtl == 't' -%]
+    padding-right: 10px !important;
+    [%- ELSE %]
+    padding-left: 10px !important;
+    [%- END %]
+}
+
+#adv_search.on, #num_search.on, #expert_search.on {
+    color: [% css_colors.accent_darker %];
+    background-color: [% css_colors.background %];
+    text-decoration: none;
+}
+
+#adv_search_tabs a.acct-tab-on, #acct_tabs a.acct-tab-on, #acct_fines_tabs a.acct-tab-on {
+    color: [% css_colors.accent_darker %];
+    background-color: [% css_colors.background %];
+    text-decoration: none;
+}
+
+.acct-tab-off {
+    background-color: [% css_colors.control %];
+}
+
+#acct_checked_tabs a, #acct_holds_tabs a, #acct_prefs_tabs a {
+    margin-top: 0px;
+    font-size: [% css_fonts.size_smaller %];
+    color: [% css_colors.accent_darker %];
+    padding: 10px 10px 10px 10px;
+}
+
+#acct_checked_tabs div.selected a, #acct_holds_tabs div.selected a, #acct_prefs_tabs div.selected a {
+    background-color: [% css_colors.accent_lightest %];
+    color: [% css_colors.accent_darker %];
+}
+
+#acct_checked_tabs, #acct_holds_tabs, #acct_prefs_tabs {
+    padding-bottom: 12px;
+    color: [% css_colors.accent_medium %];
+}
+
+#acct_select, #acct_prefs_select {
+     display: none;
+}
+
+#mobile_acct_search_links {
+      background-color: [% css_colors.primary_fade %];
+}
+
+.rdetail_header {
+    [% IF rtl == 't' -%]
+    padding: 5px 0px 6px 7px;
+    margin-right: 1em;
+    [%- ELSE %]
+    padding: 5px 7px 6px 0px;
+    margin-left: 1em;
+    [%- END %]
+    border-bottom: 1px dotted [% css_colors.accent_light %];
+}
+
+.rdetail_results a {
+    color:[% css_colors.primary_fade %];
+    font-weight:bold;
+    font-size: [% css_fonts.size_bigger %];
+}
+
+.rdetail_result_count {
+    color: [% css_colors.text %];
+    font-weight: normal;
+    display: inline-block;
+    [% IF rtl == 't' -%]
+    padding-right: 1em;
+    [%- ELSE %]
+    padding-left: 1em;
+    [%- END %]
+}
+
+.rdetail_result_nav {
+    font-weight:normal;
+    display: inline-block;
+    [% IF rtl == 't' -%]
+    padding-right: 1em;
+    [%- ELSE %]
+    padding-left: 1em;
+    [%- END %]
+}
+
+#rdetail_details_table {
+    margin-top: 15px;
+}
+
+#rdetail_image { border: none; }
+#rdetail_image_cell {
+    padding-top: 3px;
+    [% IF rtl == 't' -%]
+    padding-left: 10px;
+    [%- ELSE %]
+    padding-right: 10px;
+    [%- END %]
+}
+
+h2.rdetail_uris {
+    margin-top: 1em;
+}
+div.rdetail_uris {
+    padding: 0.5em 1em 0.5em 1em;
+    background-color: [% css_colors.accent_lighter2 %];
+}
+div.rdetail_uris ul li {
+    position: relative;
+    [% IF rtl == 't' -%]
+    right: 1em;
+    [%- ELSE %]
+    left: 1em;
+    [%- END %]
+}
+
+div.rdetail_show_copies {
+    margin-top: 1em;
+}
+
+div#rdetail_actions_div {
+    background-color: [% css_colors.background %];
+    [% IF rtl == 't' -%]
+    float: left;
+    [%- ELSE %]
+    float: right;
+    [%- END %]
+}
+
+span#rdetail_copy_counts {
+    display: inline-block;
+    vertical-align: top;
+    [% IF rtl == 't' -%]
+    border-left: thin;
+    margin-left: 1em;
+    padding-left: 1em;
+    [%- ELSE %]
+    border-right: thin;
+    margin-right: 1em;
+    padding-right: 1em;
+    [%- END %]
+}
+
+span#rdetail_hold_counts {
+    display: inline-block;
+    vertical-align: top;
+}
+span#rdetail_hold_counts p {
+    [% IF rtl == 't' -%]
+    padding-right: 2em;
+    [%- ELSE %]
+    padding-left: 2em;
+    [%- END %]
+}
+
+#rdetail_image_div {
+    [% IF rtl == 't' -%]
+    float: right;
+    margin-left: 1em;
+    [%- ELSE %]
+    float: left;
+    margin-right: 1em;
+    [%- END %]
+}
+
+.rdetail_aux_utils {
+    padding-bottom: 6px;
+    [% IF rtl == 't' -%]
+    border-right: 1px dotted [% css_colors.accent_light %];
+    padding-right:17px;
+    padding-left:70px;
+    [%- ELSE %]
+    border-left:1px dotted [% css_colors.accent_light %];
+    padding-left: 17px;
+    padding-right: 70px;
+    [%- END %]
+}
+
+div.place_hold {
+    border-bottom: 1px dotted [% css_colors.accent_light %];
+    padding-top: 10px;
+}
+
+div.toggle_list { padding-top: 6px; }
+
+div.share_record {
+    padding-top: 6px;
+    border-top: 1px dotted [% css_colors.accent_light %];
+}
+
+div.format_icon {
+    [% IF rtl == 't' -%]
+    float: left;
+    margin-left: 17px;
+    [%- ELSE %]
+    float: right;
+    margin-right: 17px;
+    [%- END %]
+}
+
+#metarecord_population {
+    overflow: hidden;
+    width: 40%;
+    padding-bottom: 10px;
+}
+
+.metarecord_population_span_link {
+    line-height: 20px;
+}
+
+.metarecord_population_format {
+    border-right: thin;
+    display: inline-block;
+    margin-right: 1em;
+    padding-right: 1em;
+    vertical-align: top;
+}
+
+.metarecord_population_item_lang {
+    display: inline-block;
+    vertical-align: top;
+}
+
+.metarecord_population_all {
+    padding-top:10px;
+}
+
+.results_aux_utils {
+    display: table-cell;
+}
+
+.result_util {
+    border-bottom: 1px dotted [% css_colors.accent_light %];
+    padding-top: 6px;
+    [% IF rtl == 't' -%]
+    padding-right: 1em;
+    [%- ELSE %]
+    padding-left: 1em;
+    [%- END %]
+}
+
+.results_reviews {
+    top: -5px;
+}
+
+#rdetail_copies {
+    padding-top: 1.5em;
+}
+
+#rdetails_status td {
+    [% IF rtl == 't' -%]
+    padding: 7px 13px 3px 0px;
+    [%- ELSE %]
+    padding: 7px 0px 3px 13px;
+    [%- END %]
+}
+
+#rdetails_status td[headers=copy_header_library], 
+#rdetails_status td[headers=copy_header_shelfloc] {
+    white-space: normal;
+}
+
+#rdetails_status thead th {
+    [% IF rtl == 't' -%]
+    padding: 13px 13px 13px 0px;
+    text-align: right;
+    [%- ELSE %]
+    padding: 13px 0px 13px 13px;
+    text-align: left;
+    [%- END %]
+    background-color: [% css_colors.accent_lighter2 %];
+    font-size: [% css_fonts.size_smaller %];
+    font-weight: bold;
+}
+
+#rdetails_status tbody td {
+    [% IF rtl == 't' -%]
+    padding-right: 13px;
+    text-align: right;
+    [%- ELSE %]
+    padding-left: 13px;
+    text-align: left;
+    [%- END %]
+}
+#rdetails_status tbody td.copy_note {
+    color: [% css_colors.primary %];
+    text-wrap:normal;
+    white-space:pre-wrap !important;
+    word-wrap:normal;
+}
+
+#rdetails_status tbody td.copy_tag {
+    border-color: [% css_colors.primary %];
+    border-style: dashed;
+    border-width: 2px;
+}
+#rdetails_status tbody .copy_tag_value {
+    font-weight: bolder;
+}
+
+.rdetail_extras {
+    background-color: [% css_colors.primary_fade %];
+    border: 1px solid [% css_colors.primary %];
+    padding-top:1px;
+    clear:both;
+}
+
+#rdetail_extras_div {
+    margin: 1em 0;
+}
+
+.rdetail_extras_hr {
+    [% IF rtl == 't' -%]
+    margin-right: 1px;
+    margin-left: 1px;
+    [%- ELSE %]
+    margin-left: 1px;
+    margin-right: 1px;
+    [%- END %]
+    height: 1px;
+    background-color: [% css_colors.accent_light %];
+}
+
+.rdetail_extras_link {
+    padding: 6px 12px;
+    font-size: [% css_fonts.size_smaller %];
+    font-weight: bold;
+}
+
+.rdetail_extras_lbl {
+    color: [% css_colors.text_invert %];
+    text-decoration: none;
+}
+
+#rdetail_extras_expand, #rdetail_extras_collapse, #rdetail_locs_collapse {
+    [% IF rtl == 't' -%]
+    margin-right: 13px;
+    [%- ELSE %]
+    margin-left: 13px;
+    [%- END %]
+}
+
+#rdetail_locs_expand, #rdetail_locs_collapse {
+    [% IF rtl == 't' -%]
+    margin-right: 13px;
+    [%- ELSE %]
+    margin-left:13px;
+    [%- END %]
+    padding-bottom:3px;
+    margin-top:15px;
+}
+
+#rdetail_anotes_div .biography {
+    margin:0;
+}
+
+#gbp_extra, #gbp_arrow_down_link {
+    display: none;
+}
+
+.almost-content-wrapper {
+    background-color: [% css_colors.background %];
+}
+
+#content-wrapper {
+    background-color: [% css_colors.background %];
+    min-height: 600px;
+        height: auto;
+    display: grid;
+}
+
+.content-wrapper-record-page { top: -15px; position: relative; }
+
+#main-content-home {
+    [% IF rtl == 't' -%]
+    padding-right: 17px;
+    margin-right: 1em;
+    [%- ELSE %]
+    padding-left: 17px;
+    margin-left: 1em;
+    [%- END %]
+}
+#main-content {
+    [% IF rtl == 't' -%]
+    padding-right: 0px;
+    [%- ELSE %]
+    padding-left: 0px;
+    [%- END %]
+    margin: 0 1em;
+    clear: both;   
+}
+
+#main-content-after-bar {
+    [% IF rtl == 't' -%]
+    margin-right: 1em;
+    padding-right: 4px;
+    [%- ELSE %]
+    margin-left: 1em;
+    padding-left: 4px;
+    [%- END %]
+}
+
+#results-side-bar {
+    [% IF rtl == 't' -%]
+    float: right; 
+    margin-left: 5px;
+    [%- ELSE %]
+    float: left;
+    margin-right: 5px; 
+    [%- END %]
+    width: 174px;
+    background-color: [% css_colors.background %];
+}
+
+#main-content .login_boxes {
+    border: 1px solid [% css_colors.accent_lighter %];
+    background-color: [% css_colors.accent_lightest %];
+    background-image: -moz-linear-gradient(bottom, [% css_colors.accent_ultralight %] 15%, [% css_colors.accent_lightest %] 55%, [% css_colors.accent_ultralight %] 85%);
+    background-image: -ms-linear-gradient(bottom, [% css_colors.accent_ultralight %] 15%, [% css_colors.accent_lightest %] 55%, [% css_colors.accent_ultralight %] 85%);
+    background-image: -o-linear-gradient(bottom, [% css_colors.accent_ultralight %] 15%, [% css_colors.accent_lightest %] 55%, [% css_colors.accent_ultralight %] 85%);
+    background-image: -webkit-linear-gradient(bottom, [% css_colors.accent_ultralight %] 15%, [% css_colors.accent_lightest %] 55%, [% css_colors.accent_ultralight %] 85%);
+    background-image: linear-gradient(to bottom, [% css_colors.accent_ultralight %] 15%, [% css_colors.accent_lightest %] 55%, [% css_colors.accent_ultralight %] 85%);
+    color: [% css_colors.accent_darker %];
+}
+
+#main-content .login_boxes h1 {
+    font-weight: normal;
+    font-size: [% css_fonts.size_biggest %];
+    margin:0;
+}
+
+#main-content .left_brain {
+    [% IF rtl == 't' -%]
+    padding-right: 28px;
+    [% ELSE -%]
+    padding-left:28px;
+    [% END -%]
+    padding-top:25px;
+}
+
+#main-content .left_brain input[type=text], #main-content .left_brain input[type=password] {
+    width:167px;
+    margin:0;
+    padding:0;
+    background-color: [% css_colors.background %];
+    font-size: [% css_fonts.size_bigger %];
+    color: [% css_colors.text %];
+}
+
+#main-content .left_brain .input_bg {
+    [% IF rtl == 't' -%]
+    padding: 10px 13px 0px 10px;
+    [% ELSE -%]
+    padding:10px 10px 0px 13px;
+    [% END -%]
+    width:167px;
+    height:29px;
+}
+
+.login-help-box {
+    [% IF rtl == 't' -%]
+    float: right;
+    margin-right: 2em;
+    [% ELSE -%]
+    float: left;
+    margin-left: 2em;
+    [% END -%]
+    width: 200px;
+    text-align: center;
+}
+
+.login-help-button {
+    font-size: [% css_fonts.size_biggest %];
+    padding: 1.5em;
+}
+
+#login-failed-message {
+    font-size: [% css_fonts.size_bigger %];
+    font-weight: bold;
+    color: [% css_colors.text_alert %];
+    padding-top: 1em;
+}
+
+#holds_temp_parent td {
+    border-bottom:1px solid [% css_colors.border_standard %];
+}
+
+#holds_temp_parent input, #holds_temp_parent select {
+    margin:0;
+}
+
+#holds_temp_parent tr td div {
+    margin-top: 10px;
+    margin-bottom: 10px;
+}
+
+#holds_temp_parent tr td div.format_icon {
+    margin-top: 6px;
+    margin-bottom: 6px;
+    float: none;
+}
+
+#results_header_bar {
+    background-color: [% css_colors.accent_medium %];
+    border-top:1px solid [% css_colors.accent_mediumdark %];
+    border-bottom:1px solid [% css_colors.accent_mediumdark %];
+}
+
+.results_header_lbl {
+    [% IF rtl == 't' -%]
+    float: right;
+    [% ELSE -%]
+    float: left;
+    [% END -%]
+    font-weight: bold;
+    color: [% css_colors.text %];
+    /* this border is not visible, but it keeps these labels the same size
+    as the buttons */
+    border: 1px solid [% css_colors.accent_medium %];
+    background-color: [% css_colors.accent_medium %];
+    margin: 0.5em 0.3em;
+    padding: 0.3em;
+}
+/* we need a negative margin on the select to allow the containing <label>
+to determine the actual size of the element.  By doing this, we can increase
+the odds that the buttons and the select will be the same size, and therefore
+collapse correctly when the window width decreases */
+.results_header_lbl select {
+    margin: -0.5em 0;
+}
+
+#limit_to_available {
+    vertical-align: middle;
+}
+
+.results_header_sel {
+    [% IF rtl == 't' -%]
+    float: right;
+    [% ELSE -%]
+    float:left;
+    [% END -%]
+    margin:0;
+}
+
+
+
+.results_header_nav1 .h1 {
+    font-size: [% css_fonts.size_bigger %];
+    font-weight:bold;
+    color:[% css_colors.primary_fade %];
+}
+
+.table_no_border_space {
+  border-spacing: 0px;
+}
+.table_no_cell_pad td {
+  padding: 0px;
+}
+.table_no_border {
+  border-collapse: collapse;
+}
+
+#result_table_table {
+  margin-top:10px;
+}
+
+#result_table_div {
+    margin-top: 1em;
+}
+
+tr.result_table_row > td.results_row_count,
+tr.result_table_row > td.result_table_pic_header,
+tr.result_table_row > td.result_table_title_cell {
+    vertical-align: top;
+}
+
+.result_metadata {
+    [% IF rtl == 't' -%]
+    float: right;
+    padding-left: 2em;
+    [% ELSE -%]
+    float: left;
+    padding-right: 2em;
+    [% END -%]
+    width: 30em;
+}
+
+tr.result_table_row:nth-child(n+2) > td {
+    border-top: 1px solid [% css_colors.accent_lighter2 %];
+}
+
+tr.result_table_row > td.result_table_pic_header {
+    [% IF rtl == 't' -%]
+    padding-right: 1em;
+    [% ELSE -%]
+    padding-left: 1em;
+    [% END -%]
+    white-space: nowrap;
+    width: 78px;
+}
+
+/* styles for selecting records in the results set */
+.result_table_row_selected {
+    background-color: [% css_colors.item_selected %];
+}
+#selected_records_summary, #clear_basket {
+    margin-left: 5em;
+}
+
+/* styles for the basket */
+#record_basket {
+    [% IF rtl == 't' -%]
+    float: left;
+    margin-left: 5em;
+    [% ELSE; %]
+    float: right;
+    margin-right: 5em;
+    [% END; %]
+}
+#record_basket_icon {
+    [% IF rtl == 't' -%]
+    float: left;
+    margin-left: 2em;
+    [% ELSE; %]
+    float: right;
+    margin-right: 2em;
+    [% END; %]
+    position: relative;
+}
+#record_basket_count_floater {
+    background-color: [% css_colors.accent_lighter %];
+    position: absolute;
+    top: -3px;
+    right: -3px; /* relative to icon, so don't want to adjust for RTL */
+    z-index: 2;
+    border-radius: 50%;
+}
+#record_basket_count_floater a {
+    text-decoration: none;
+}
+#basket_actions {
+    [% IF rtl == 't' -%]
+    float: left;
+    [% ELSE; %]
+    float: right;
+    [% END; %]
+}
+#basket_actions select {
+    border-color: rgb(169, 169, 169);
+}
+
+.result_number {
+    [% IF rtl == 't' -%]
+    padding-right: 1em;
+    [% ELSE -%]
+    padding-left: 1em;
+    [% END -%]
+    white-space: nowrap;
+}
+
+.result_count_number {
+   font-weight: bold;
+}
+
+.result_table_subtable {
+    width: 100%;
+    padding-top: 1em;
+}
+
+div.result_table_utils_cont {
+    [% IF rtl == 't' -%]
+    text-align: right;
+    float: right;
+    [% ELSE -%]
+    text-align:left;
+    float: left;
+    [% END -%]
+}
+
+#myopac_summary_div p {
+    margin:0;
+    margin-bottom: 10px;
+}
+
+#acct_sum_checked_table td {
+    padding-bottom:5px;
+}
+
+.zero_search_hits_main {
+    [% IF rtl == 't' -%]
+    float: right;
+    [% ELSE -%]
+    float:left;
+    [% END -%]
+    width:300px;
+    margin-top: 2ex;
+}
+.zero_search_hits_saved {
+    [% IF rtl == 't' -%]
+    float: right;
+    margin-left: 2em;
+    [% ELSE -%]
+    float:left;
+    margin-right: 2em;
+    [% END -%]
+    width:200px;
+    margin-top: 2ex;
+}
+
+#zero_search_hits p {
+    margin-top:0;
+}
+
+#zero_hits_term {
+    font-weight: bold;
+}
+
+#zero_search_hits #spell_check_link {
+}
+
+#zero_search_hits #zero_hits_suggestions {
+}
+
+#lowhits_help {
+    [% IF rtl == 't' -%]
+    float: left;
+    [% ELSE -%]
+    float: right;
+    [% END-%]
+    width: 353px;
+    background-color: [% css_colors.accent_light %];
+    padding: 10px;
+    margin-top: 7px;
+}
+
+.results_info_table td {
+    [% IF rtl == 't' -%]
+    padding-left: 10px;
+    [% ELSE -%]
+    padding-right: 10px;
+    [% END-%]
+}
+
+#myopac_holds_main_table {
+    border-collapse: collapse;
+}
+
+#myopac_holds_main_table td {
+    border: 1px solid [% css_colors.border_dark %];
+    
+}
+
+.myopac-hold-available {
+    color: [% css_colors.text_greatnews %];
+    font-weight: bold;
+}
+
+.myopac-hold-suspended {
+    color: [% css_colors.text_badnews %];
+    font-weight: bold;
+}
+
+#myopac_prefs_div .data_grid {
+    border-collapse:collapse;
+}
+
+#myopac_prefs_div .data_grid td {
+    [% IF rtl == 't' -%]
+    padding: 6px 17px 7px 0px;
+    [% ELSE -%]
+    padding:6px 0px 7px 17px;
+    [% END -%]
+    background-color:[% css_colors.accent_ultralight %];
+    border-bottom:3px solid [% css_colors.background %];
+}
+
+.header_middle {
+    [% IF rtl == 't' -%]
+    padding: 0px 0px 0px 7px;
+    [% ELSE -%]
+    padding: 0px 7px 0px 0px;
+    [% END -%]
+    height:22px;
+    font-size: [% css_fonts.size_bigger %];
+    font-weight:bold;
+    color:[% css_colors.primary_header %];
+    /*border-bottom: 1px dotted [% css_colors.accent_light %];*/
+    clear: both;
+}
+
+.header_middle a {
+    font-weight: normal;
+}
+
+#acct_sum_block {
+    [% IF rtl == 't' -%]
+    float: right;
+    clear: right;
+    [% ELSE -%]
+    float: left;
+    clear: left;
+    [% END -%]
+}
+
+.acct_sum_table {
+    border-collapse: collapse;
+    background-color: [% css_colors.accent_ultralight %];
+}
+
+.acct_sum_table tr {
+    border-bottom: 2px solid white;
+}
+
+.acct_sum_table td {
+    padding: 1em;
+}
+
+.acct_sum_table a {
+    text-transform: none;
+    position:relative;
+    top:-1px;
+}
+
+.acct_sum_table .view_link {
+    font-weight: normal;
+}
+
+#myopac_sum_fines {
+    [% IF rtl == 't' -%]
+    float: left;
+    padding: 15px 23px 0px 0px;
+    [% ELSE -%]
+    float:right;
+    padding: 15px 0px 0px 23px;
+    [% END -%]
+    width: 177px;
+}
+
+.cc_logo_img
+{
+   width: 79%;
+    [% IF rtl == 't' -%]
+      padding-right: .5em;
+    [% ELSE -%]
+       padding-left: .5em;
+    [% END -%]
+}
+
+#myopac_sum_fines_placehold {
+    [% IF rtl == 't' -%]
+    float: left;
+    [% ELSE -%]
+    float: right;
+    [% END -%]
+    width: 177px;
+    height: 166px;
+}
+
+.acct_holds_temp td {
+    [% IF rtl == 't' -%]
+    text-align: right;
+    [% ELSE -%]
+    text-align: left;
+    [% END -%]
+}
+
+#acct_checked_tabs .align, #acct_holds_tabs .align, #acct_prefs_tabs .align {
+    [% IF rtl == 't' -%]
+    float: right;
+    [% ELSE -%]
+    float:left;
+    [% END -%]
+}
+
+
+
+.acct_fines_header
+{
+   width: 100%;
+   padding-bottom:1em;
+   [% IF rtl == 't' -%]
+   float: right;
+   [% ELSE -%]
+   float:left;
+   [% END -%]
+}
+
+/* tables for entering payment information */
+#acct_fines_main_header
+{
+   width: 100%;
+}
+
+/* tables for entering payment information */
+#billing_info_table
+{
+    width: auto;
+    [% IF rtl == 't' -%]
+    float: right;
+    [% ELSE -%]
+    float:left;
+    [% END -%]
+    display:inline;
+    padding-left: 1em;
+    padding-right: 1em;
+}
+
+/* tables for entering payment information */
+#credit_card_info_table
+{
+    width: auto;
+    display: block;
+}
+
+/* tables for entering payment information */
+#billing_info_table td,
+#credit_card_info_table td
+{
+   [% IF rtl == 't' -%]
+    padding-right: .5em;
+    [% ELSE -%]
+    padding-left: .5em;
+    [% END -%]
+   
+}
+
+/* div for the payment buttons with the total */
+#payment_actions
+{
+   width: auto;
+   display: block;
+   padding: 1em 0 0 1em;
+   text-align:center;
+}
+
+/* text to state what is seen on cc statement */
+.cc_disclaimer
+{
+   font-style:italic;
+   font-size: 90%;
+   color:[% css_colors.primary_fade %];
+}
+
+.hold_notes {
+    text-transform: none;
+    font-weight: normal;
+}
+
+
+
+#acct_list_header select, #acct_list_header_anon select {
+    font-weight:normal;
+    text-transform:none;
+}
+
+.search_catalog_lbl {
+    font-size: [% css_fonts.size_bigger %];
+}
+.adv_search_catalog_lbl {
+    font-size: [% css_fonts.size_bigger %];
+}
+
+.browse_the_catalog_lbl {
+    font-size: [% css_fonts.size_bigger %];
+}
+
+.lbl1 {
+    font-size: [% css_fonts.size_bigger %];
+    font-weight:bold;
+}
+
+.lbl2 {
+    font-size: [% css_fonts.size_smaller %];
+    font-weight:normal;
+    position:relative;
+    top:3px;
+    max-width:300px;
+}
+
+#fines_payments_wrapper {
+    padding-left: 5px; 
+    padding-right: 5px;
+}
+
+.myopac_payments_table th {
+    [% IF rtl == 't' -%]
+    text-align: right; }
+    [% ELSE -%]
+    text-align: left;
+    [% END -%]
+}
+
+.myopac_payments_table thead th { border-bottom: 1px dashed [% css_colors.accent_darker %]; }
+.myopac_payments_table thead th:first-child { width: 8em; }
+.myopac_payments_table tbody tr:nth-child(odd) { background-color: [% css_colors.accent_lighter %]; }
+.myopac_payments_table form { display: inline; }
+.myopac_payments_table input[type="submit"] { padding: 1px; }
+
+.cc_header
+{
+   padding-top:1em;
+   background-color: [% css_colors.accent_lighter %];
+}
+
+.payment-error {
+    font-weight: bold; color: [% css_colors.text_alert %];
+    padding: 10px; border: 1px solid [% css_colors.accent_medium_dark %];
+}
+
+.payment-processing {
+    font-weight: bold;
+    color: [% css_colors.text_greatnews %];
+    font-size: [% css_fonts.size_bigger %];
+    padding: 10px; border: 1px solid [% css_colors.accent_medium_dark %];
+    text-align: center;
+}
+#adv_search_input { width: 100%; }
+#adv_search_parent {
+    margin-bottom:0px;
+}
+#search-submit-spinner {
+    height: 16px;
+    width: 16px;
+}
+div.adv_search_available {
+    margin-top: 1em;
+}
+
+#myopac_loading {
+    width:100%;
+    text-align:center;
+    padding-top:20px;
+    font-size: [% css_fonts.size_bigger %];
+    font-weight:bold;
+}
+
+.chili_link {
+    width:100px !important;
+    text-align: center !important;
+}
+
+.chili_review div.chili_link div {
+    margin: auto;
+}
+
+/* styling for advanced search filters that display with searchbar */
+
+#adv_filter_results_block h4 { display: inline; }
+
+#adv_filter_results_block {
+    margin-top: 6px;
+    text-align: center;
+}
+
+.adv_filter_results_block_label {
+    font-weight:bold;
+    [% IF rtl == 't' -%]
+    padding: 4px 12px 4px 0px;
+    [% ELSE -%]
+    padding: 4px 0px 4px 12px;
+    [% END -%]
+}
+
+.adv_filter_results_group {
+    font-size: 12px;
+    display: inline-block;
+    background-color:  [% css_colors.accent_lighter2 %];
+    border-style: solid;
+    border-color: [% css_colors.accent_medium %];
+    border-width: 1px;
+    border-radius: 4px;
+    padding: 2px 4px 2px 4px;
+}
+
+.adv_filter_results_group_wrapper {
+    display: inline-block;
+    [% IF rtl == 't' -%]
+    margin-right: 1em;
+    [% ELSE -%]
+    margin-left: 1em;
+    [% END -%]
+    margin-bottom: 8px;
+}
+
+.adv_filter_results_group_header {
+    display: inline-block;
+}
+
+.adv_filter_results_group_values {
+    display: inline;
+}
+
+.adv_search_result_filter {
+    display: inline-block;
+    font-size: 16px;
+}
+
+.remove_filter {
+    font-size: 16px;
+    [% IF rtl == 't' -%]
+    margin-right: 3px;
+    [% ELSE -%]
+    margin-left: 3px;
+    [% END -%]
+}
+
+a.remove_filter {
+    text-decoration: none;
+    color: [% css_colors.accent_dark %];
+}
+
+#filter_hits {
+     display: inline-block;
+}
+
+#refine_search_link {
+    display: inline-block;
+}
+
+[%- IF we_want_to_turn_on_facet_styling.defined; %]
+/* some facet styling */
+.facetClassContainer { margin: 2px; border: 1px solid [% css_colors.accent_light %]; }
+.facetClassLabelContainer { border: 1px solid [% css_colors.accent_light %]; }
+.facetClassLabel { font-weight: bold; text-align: center; }
+.facetFieldContainer {  }
+.facetFieldLabel { padding-left: 2px; margin-top: 5px; margin-bottom: 5px; font-weight: bold; text-align: left; }
+.extraFacetFieldsWrapper { }
+.toggleExtraFacetFieldsButton { float: right; margin: 0px; padding: 0px; }
+.facetFieldLineCount {
+    display: inline-block;
+    border-right: 1px solid [% css_colors.accent_light %];
+    color: [% css_colors.accent_mediumdark %];
+    width: 3em;
+    margin-right: 3px
+}
+.facetField { border-top: 1px solid [% css_colors.accent_light %]; }
+.facetFields { padding-left: 5px; }
+.facetFieldLineValue { overflow: hidden; text-overflow: ellipsis; }
+[%- END -%]
+
+div#facet_sidebar {
+    [% IF rtl == 't' -%]
+    float: right;
+    margin-left: 1em;
+    [% ELSE -%]
+    float: left;
+    margin-right: 1em;
+    [% END-%]
+}
+
+.facet_box_temp {
+    padding-bottom:3px;
+}
+
+.facet_box_temp .header {
+    height: 2.3em;
+    background-color:[% css_colors.primary %];
+    border-top-left-radius: 5px;
+    border-top-right-radius: 5px;
+    font-weight:bold;
+    color:[% css_colors.text_invert %];
+    padding-top:4px;
+}
+
+.facet_box_temp.filter_box_temp .header {
+    background-color: [% css_colors.background_invert %] !important;
+}
+
+.filter_box_label {
+    color: [% css_colors.background_invert %];
+    font-weight:bold;
+    padding-top:4px;
+    padding-bottom:4px;
+    padding-left:12px;
+}
+
+.facet_box_temp .header .title {
+    [% IF rtl == 't' -%]
+    float: right;
+    padding-right: 12px;
+    [% ELSE -%]
+    float:left;
+    padding-left:12px;
+    [% END -%]
+    padding-top:6px;
+}
+
+/* in this context, where h4 is primarily for structure, 
+   avoid the normal large font and margin for h4's */
+.facet_box_temp h4 {
+    font-size : 100%; 
+    margin: 0px;
+}
+
+.facet_box_temp .header a.button {
+    [% IF rtl == 't' -%]
+    float: left;
+    padding-left: 6px;
+    [% ELSE -%]
+    float:right;
+    padding-right:6px;
+    [% END -%]
+    padding-top:6px;
+    color:[% css_colors.text_invert %];
+}
+
+.facet_box_wrapper .box_wrapper .box {
+    border-top:1px solid [% css_colors.border_standard %];
+    border-left:1px solid [% css_colors.border_standard %];
+    border-right:1px solid [% css_colors.border_standard %];
+    padding: 0 0.5em;
+    overflow: hidden;
+}
+
+.filter_box_wrapper {
+    margin-bottom: 3px;
+    padding: 2px;
+    border: 1px solid [% css_colors.background_invert %];
+    border-radius: 3px;
+    font-weight:bold;
+    padding-top:4px;
+}
+
+.facet_template {
+    box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    display: table;
+    margin: 0.5em 0;
+    width: 100%;
+}
+
+.facet_template div {
+    display: table-cell;
+    padding: 2px;
+}
+
+.facet_template.filter_template div {
+    padding: 0px !important;
+}
+
+.facet_template .count {
+    text-align: right;
+    color: [% css_colors.accent_mediumdark %];
+}
+
+.facet_template_selected {
+    background-color: [% css_colors.accent_lighter2 %];
+    border: 1px solid [% css_colors.accent_medium %];
+}
+
+#footer-wrap {
+       /* border-top: 5px solid [% css_colors.nav_separation %]; */
+    background-color: [% css_colors.footer_primary %];
+    background-image: -moz-linear-gradient([% css_colors.footer_primary_fade %], [% css_colors.footer_primary %]);
+    background-image: -o-linear-gradient([% css_colors.footer_primary_fade %], [% css_colors.footer_primary %]);
+    background-image: -webkit-linear-gradient([% css_colors.footer_primary_fade %], [% css_colors.footer_primary %]);
+    background-image: linear-gradient([% css_colors.footer_primary_fade %], [% css_colors.footer_primary %]);
+    bottom: 0px;
+    width: 100%;
+}
+
+#footer {
+    [% IF rtl == 't' -%]
+    margin-right: 1em;
+    [% ELSE -%]
+    margin-left: 1em;
+    [% END -%]
+    padding-top:5px;
+    padding-bottom: 10px;
+    font-size: [% css_fonts.size_small %];
+}
+
+
+#copyright_text, #footer_logo {
+    color: [% css_colors.footer_link %];
+    font-size: [% css_fonts.size_bigger %];
+}
+
+.color_4 {
+    font-weight: bold;
+}
+
+.advanced_div { padding-top: 15px; }
+#adv_global_search { width: 100%; }
+#adv_global_addrow td { padding-top: 7px; }
+[% IF rtl == 't' -%]
+#adv_global_addrow.td-search-left{text-align:right;}
+[% END -%]
+#adv_global_input_table { width: 100%; }
+#adv_global_input_table select { width: 7em; }
+.adv_adv_link {
+    font-size: [% css_fonts.size_smaller %];
+    color: [% css_colors.text_alert %];
+}
+#acct_prefs_header {
+    [% IF rtl == 't' -%]
+    float: right;
+    [% ELSE -%]
+    float: left;
+    [% END -%]
+}
+.search_page_nav_link {
+    cursor: pointer;
+    [% IF rtl == 't' -%]
+    padding-right: 1em;
+    [% ELSE -%]
+    padding-left: 1em;
+    [% END -%]
+}
+#opac.result.sort { width: 160px; }
+.renew-summary, .message-update-summary { font-size: [% css_fonts.size_bigger %]; font-style: italic; margin: 0.5ex 0; }
+.failure-text {
+    [% IF rtl == 't' -%]
+    margin-right: 4em;
+    [% ELSE -%]
+    margin-left: 4em;
+    [% END -%]
+    font-style: italic;
+    color: [% css_colors.text_alert %];
+}
+.refine-controls { font-size: [% css_fonts.size_bigger %]; padding: 0.5ex 0; }
+#adv_search_refine input[type=text] { border: 1px inset [% css_colors.accent_light %] !important; }
+#adv_search_refine select { border: 1px inset [% css_colors.accent_light %] !important; }
+#adv_search_refine {
+    [% IF rtl == 't' -%]
+    padding-right: 5em;
+    [% ELSE -%]
+    padding-left: 5em;
+    [% END -%]
+    background-color: [% css_colors.accent_lighter2 %];
+    margin: 2ex 0;
+}
+.row-remover { position: relative; top: 1px; vertical-align: middle; }
+.subtle-button {
+    background-color: [% css_colors.background %];
+    color: [% css_colors.primary %]; text-decoration: none;
+    padding: 0; border: 0; margin: 0;
+    vertical-align: middle;
+}
+.subtle-button:hover { text-decoration: underline; cursor: pointer; }
+.no-dec:hover { text-decoration: none; }
+.pending-addr td { background-color: [% css_colors.background_alert %] !important; border: 0 !important; }
+
+#account-update-email table { text-align: center; padding: 20px; margin-top: 18px; border-collapse: collapse; }
+#account-update-email table td {
+    [% IF rtl == 't' -%]
+    text-align: right;
+    [% ELSE -%]
+    text-align: left;
+    [% END -%]
+    padding: 5px 15px 5px 15px;
+    border-bottom: 1px solid [% css_colors.accent_lighter %];
+}
+#account-update-email-error { font-size: [% css_fonts.size_biggest %]; padding: 10px; border:1px solid [% css_colors.border_standard %];}
+a.dash-link:hover { text-decoration: underline !important; }
+#list_create_table td { vertical-align: middle; padding: 0 8px; }
+#list_create_table {
+    background-color: [% css_colors.accent_light %];
+    padding-bottom: 4px;
+    margin-bottom: 10px;
+    border-bottom: 1px dotted [% css_colors.accent_medium %];
+    width: 100%;
+}
+.list_create_table_label {
+    width: 30%;
+}
+#list_description, #list_create_name {
+        width: 500px;
+}
+.list-create-table-buttons input[type=image] { margin-top: 2px; }
+.result_table_format_cell { padding: 0px 10px; text-align: center; }
+.results_row_count { font-weight: bold; }
+
+.fmt-note {
+    [% IF rtl == 't' -%]
+    padding-right: 1em !important;
+    [% ELSE -%]
+    padding-left: 1em !important;
+    [% END -%]
+    vertical-align: middle;
+}
+.hold-editor-controls { text-align: center; padding-top: 1em !important; }
+.hold-editor-controls a { padding-left: 2em; }
+
+.text-right {
+    [% IF rtl == 't' -%]
+    text-align: left;
+    [% ELSE -%]
+    text-align: right;
+    [% END -%]
+}
+.text-right-top {
+    [% IF rtl == 't' -%]
+    text-align: right;
+    [% ELSE -%]
+    vertical-align: top;
+    [% END -%]
+}
+.rdetail-author-div {
+    padding-bottom: 10px;
+    display: inline-block;
+}
+
+.invisible { visibility: hidden; }
+.rdetail-extras-summary { margin: 10px; }
+.staff-hold { background-color: [% css_colors.accent_lightest %]; }
+.expert-search tbody tr th {
+    [% IF rtl == 't' -%]
+    text-align: left;
+    padding-right: 2em;
+    [% ELSE -%]
+    text-align: right;
+    padding-left: 2em;
+    [% END -%]
+}
+.expert-search-row { padding-top: 10px; }
+#adv_expert_row label { font-weight: bold; }
+
+.bookshelf tr.browse_border td {
+    border-bottom: 1px dashed [% css_colors.accent_dark %];
+    font-size: 1px;
+    height: 1px;
+    padding-bottom: 1ex;
+}
+.cn_browse_item { padding: 2ex; }
+.results-paginator-list {
+    [% IF rtl == 't' -%]
+    padding-right: 1em;
+    [% ELSE -%]
+    padding-left: 1em;
+    [% END -%]
+}
+.results-paginator-selected { color: [% css_colors.text_alert %]; }
+.inactive-hold { background-color: [% css_colors.inactive_hold %]; }
+.unread-patron-message { font-weight: bold; }
+
+#hold-items-list td { padding: 5px; margin-bottom: 20px; }
+.hold-items-list-title { 
+  font-size: [% css_fonts.size_bigger %];
+  margin-bottom: 20px;
+}
+.hold-items-list-problem { color: [% css_colors.text_alert %]; }
+
+.hold_success_links > span { margin: 0 2em; }
+
+.radio-parts-selection { 
+   width: 75%;
+   margin-bottom: 20px;
+}
+
+.parts-radio-option { 
+  display: inline-block;
+  width:15em;
+}
+
+.mr_holds_no_formats { 
+  [% IF rtl == 't' -%]
+  margin-right: 25px;
+  [% ELSE -%]
+  margin-left: 25px;
+  [% END -%]
+  padding: 5px;
+  font-size: 110%;
+  font-weight: bold;
+  color: [% css_colors.text_invert %]; 
+  background-color: [% css_colors.primary %];
+}
+.holds_item_row_separator td {
+  border-top: 2px dashed [% css_colors.accent_medium %];
+}
+
+.big-strong {font-weight: bold; font-size: [% css_fonts.size_bigger %]; }
+
+.results_header_btns, .results_header_sel {
+    [% IF rtl == 't' -%]
+    float: right;
+    [% ELSE -%]
+    float:left;
+    [% END -%]
+}
+
+/*
+ * .various_containers a = shortcut to putting .opac-button on every 'a' with
+ *     the tradeoff of increased stylesheet complexity (TODO: rethink?)
+ */
+
+.opac-multiline-button > a,
+.opac-button, .results_header_btns a, #simple-detail-view-links a, .dash_account_buttons a {
+    color: [% css_colors.button_text %];
+    font-weight: bold; 
+    text-decoration: none;
+    cursor: pointer !important;
+    border-radius: 5px;
+    border: 1px solid [% css_colors.primary %];
+    background-color:  [% css_colors.primary_fade %];
+    margin: 0.5em;
+    padding: 0.3em;
+    display: inline-block;
+}
+
+.opac-multiline-button > a:hover,
+.opac-button:hover, .results_header_btns a:hover, #simple-detail-view-links a:hover, #dash_wrapper a.opac-button:hover {
+    background-color: [% css_colors.primary %];
+}
+
+.opac-button:disabled {
+    color: [% css_colors.accent_medium %];
+    cursor: pointer !important;
+    border: 1px solid [% css_colors.accent_light %];
+    background-color: [% css_colors.accent_lighter %];
+}
+
+/* Firefox adds its own special space to inputs; this gets us closer */
+button.opac-button::-moz-focus-inner, input.opac-button::-moz-focus-inner {
+    padding: 0;
+    border: 0;
+}
+
+.opac-button-header, #dash_wrapper .opac-button {
+    background-color: [% css_colors.control %];
+    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
+    font-size: [% css_fonts.size_base %];
+}
+a.opac-button-header:hover, #dash_wrapper a.opac-button:hover {
+    border-color: [% css_colors.control %];
+}
+
+.opac-multiline-button > a {
+    display: inline-block;
+}
+
+#myopac_checked_div {
+    padding: 0px;
+}
+
+.rdetail-mfhd-head {
+    margin-top: 5px;
+    padding-top: 5px;
+    background-color: [% css_colors.table_heading %];
+}
+
+.rdetail-mfhd-type {
+    [% IF rtl == 't' -%]
+    padding-right: 1em;
+    [% ELSE -%]
+    padding-left: 1em;
+    [% END -%]
+}
+
+.rdetail-mfhd-bottom {
+    border-bottom: thin solid [% css_colors.border_dark %];
+    width: 100%;
+}
+
+#rdetail_record_details {
+    clear: both;
+    margin-top: 1em;
+}
+
+.rdetail_content {
+    [% IF rtl == 't' -%]
+    margin-right: 1.5em;
+    padding-right: 1.5em;
+    [% ELSE -%]
+    margin-left: 1.5em;
+    padding-left: 1.5em;
+    [% END -%]
+}
+
+.rdetail_content_type, .rdetail_subject_type {
+    vertical-align: top;
+    font-weight: bold;
+}
+
+.bookbag-item-row td { vertical-align: top; }
+
+.error { color: [% css_colors.text_alert %]; font-weight: bold; }
+.success {
+    color: [% css_colors.text_greatnews %];
+    font-weight: bold;
+}
+
+.rdetail_related_subjects {
+    margin-top: 1.5em;
+}
+
+.rdetail_related_series {
+    margin-top: 1.5em;
+}
+
+#rdetail_openurl {
+    margin-top: 1em;
+}
+
+.rdetail_openurl_entry {
+    [% IF rtl == 't' -%]
+    margin-right: 1em;
+    padding-right: 1em;
+    [% ELSE -%]
+    margin-left: 1em;
+    padding-left: 1em;
+    [% END -%]
+}
+.bookbag-controls-holder { width: 100%; }
+.bookbag-controls-holder:nth-child(odd) { background-color: [% css_colors.accent_lighter2 %]; }
+.bookbag-controls-holder:nth-child(even) { background-color: [% css_colors.accent_lightest %]; }
+.bookbag-controls-holder .most {
+    [% IF rtl == 't' -%]
+    padding-right: 0;
+    margin-left: 5em;
+    [% ELSE -%]
+    padding-left: 0;
+    margin-right: 5em;
+    [% END -%]
+}
+.bookbag-controls-title-block {
+    [% IF rtl == 't' -%]
+    float:right;
+    [% ELSE -%]
+    float:left;
+    [% END -%]
+    width:40%;
+}
+.bookbag-controls-button-block {
+    [% IF rtl == 't' -%]
+    float:right;
+    [% ELSE -%]
+    float:left;
+    [% END -%]
+    width:50%;
+}
+h2.bookbag-name { margin-bottom: 0em; padding-bottom: 0em; }
+.bookbag-share .fixed { min-width: 4em; }
+.bookbag-specific {
+    [% IF rtl == 't' -%]
+    margin-right: 1em;
+    [% ELSE -%]
+    margin-left: 1em;
+    [% END -%]
+}
+.bookbag-specific div.sort {
+    [% IF rtl == 't' -%]
+    float: right;
+    text-align: right;
+    margin-right: 15px;
+    [% ELSE -%]
+    float: left;
+    text-align: left;
+    margin-left: 15px;
+    [% END -%]
+    width: 40%;
+}
+.bookbag-specific div.meta {
+    background-color: [% css_colors.accent_light %];
+    [% IF rtl == 't' -%]
+    float: left;
+    text-align: left;
+    [% ELSE -%]
+    float: right;
+    text-align: right;
+    [% END -%]
+    width: 54%;
+    border: 1px solid [% css_colors.accent_light %];
+    padding: 5px;
+    margin-top: 5px;
+}
+#bbag-name-desc-form tr th { vertical-align: middle; }
+#bbag-name-desc-form .saver { vertical-align: middle; text-align: center; }
+.bookbag-description {
+    padding-top: 0em;
+    font-style: italic;
+    max-width: 40em;
+}
+.bbag-edit-desc-label {
+    [% IF rtl == 't' -%]
+    float:right;
+    [% ELSE -%]
+    float:left;
+    [% END -%]
+    width:8em;
+}
+.bbag-edit-desc-save {
+    clear:both;
+    margin-bottom:10px;
+}
+#bbag-edit-description {
+    width: 20em;
+    [% IF rtl == 't' -%]
+    float:right;
+    [% ELSE -%]
+    float:left;
+    [% END -%]
+}
+#bbag-edit-name {
+    width: 20em;
+    [% IF rtl == 't' -%]
+    float: right;
+    [% ELSE -%]
+    float: left;
+    [% END -%]
+}
+.bbag-action {
+    [% IF rtl == 't' -%]
+    margin-right: 15px;
+    [% ELSE -%]
+    margin-left: 15px;
+    [% END -%]
+}
+.bbag-navigate-list {
+    [% IF rtl == 't' -%]
+    padding-right: 32px;
+    float:right;
+    [% ELSE -%]
+    padding-left: 32px;
+    float:left;
+    [% END -%]
+}
+.bbag-navigate-list-pages {
+    [% IF rtl == 't' -%]
+    padding-right: 10px;
+    float:right;
+    [% ELSE -%]
+    padding-left: 10px;
+    float:left;
+    [% END -%]
+}
+textarea { font-family: sans-serif; }
+table.bookbag-specific {
+    border-right: 1px solid [% css_colors.accent_dark %];
+    border-bottom: 1px solid [% css_colors.accent_medium %];
+    margin-bottom: 2ex;
+    width: 100%;
+}
+.bookbag-share {
+    [% IF rtl == 't' -%]
+    float: right;
+    padding: 0px 10px 0px 0px;
+    [% ELSE -%]
+    float: left;
+    padding: 0px 0px 0px 10px;
+    [% END -%]
+}
+.bookbag-share .fixed { min-width: 6em; }
+.bookbag-controls {
+    [% IF rtl == 't' -%]
+    float: right;
+    padding: 0px 10px 0px 0px;
+    [% ELSE -%]
+    float: left;
+    padding: 0px 0px 0px 10px;
+    [% END -%]
+}
+.bookbag-specific td.list_checkbox {
+    [% IF rtl == 't' -%]
+    padding-right: 10px !important;
+    [% ELSE -%]
+    padding-left: 10px !important;
+    [% END -%]
+}
+.bookbag-specific td.list_entry {
+    min-width: 10em;
+    [% IF rtl == 't' -%]
+    padding-right: 5px !important;
+    [% ELSE -%]
+    padding-left: 5px !important;
+    [% END -%]
+}
+.bookbag-specific td.list_actions {
+    white-space: nowrap !important;
+}
+.bookbag-paginator-selected { color: [% css_colors.text_alert %]; }
+
+.list_is_empty {
+    padding: 8px 0px 6px 0px;
+    width: 100%;
+    border: 0;
+    font-size: [% css_fonts.size_bigger %];
+    text-align: center;
+    font-style: italic;
+}
+.save-notes { padding-bottom: 1.5ex; }
+
+.nonbreaking-wrapper {
+    display: inline-block;
+}
+
+/* Moved from semiauto.css */
+.adv_global_input_container {
+    border-bottom: none;
+    clear: both;
+}
+.opac-auto-013 {
+    border-bottom: none;
+    *height: 0px;
+}
+.adv_global_filter_sort {
+    border: none;
+    width: 100%;
+}
+.clear-both { clear: both; }
+.common-no-pad {
+    clear: both;
+    height: 0px;
+    margin: 0px;
+    padding: 0px;
+}
+.common-full-pad {
+    clear: both;
+    height: 15px;
+}
+.opac-alert { color: [% css_colors.text_alert %]; }
+.float-left {
+    [% IF rtl == 't' -%]
+    float: right;
+    [% ELSE -%]
+    float: left;
+    [% END -%]
+}
+.float-right {
+    [% IF rtl == 't' -%]
+    float: left;
+    [% ELSE -%]
+    float: right;
+    [% END -%]
+}
+
+.saved-searches-header { width: 100%; font-weight: bold; font-size: [% css_fonts.size_bigger %]; }
+.saved-searches-header .button {
+    [% IF rtl == 't' -%]
+    float: left;
+    [% ELSE -%]
+    float: right;
+    width: 28px;
+    [% END -%]
+}
+.saved-searches-header .text {
+    [% IF rtl == 't' -%]
+    float: right;
+    padding-left: 1em;
+    [% ELSE -%]
+    float: left;
+    padding-right: 1em;
+    [% END -%]
+    margin: 0.5ex 0;
+}
+.saved-searches-header {font-weight: bold; font-size: [% css_fonts.size_bigger %]; }
+.saved-searches { border-bottom: 1px solid [% css_colors.accent_medium %]; padding-right: 1em; }
+#staff-saved-search { /* wraps .saved-searches-header and .saved-searches on the record page */
+    [% IF rtl == 't' -%]
+    border-left: 1px solid [% css_colors.accent_darker %];
+    [% ELSE -%]
+    border-right: 1px solid [% css_colors.accent_darker %];
+    [% END -%]
+}
+.result_item_circulated {
+    padding-top: 4px;
+}
+
+.result_item_circulated span {
+    position: relative;
+    top:-3px;
+    [% IF rtl == 't' -%]
+    right: 3px;
+    [% ELSE -%]
+    left:3px;
+    [% END -%]
+}
+
+#search-only-bookbag-container { margin: 2ex 0; font-weight: bold; }
+#result-bookbag-heading { text-align: center; margin: 2ex; }
+
+.result-bookbag-name { font-size: [% css_fonts.size_bigger %]; font-weight: bold; }
+.result-bookbag-description { font-size: [% css_fonts.size_bigger %]; font-style: italic; }
+.result-bookbag-item-note { font-style: italic; }
+.lowhits-bookbag-name { font-weight: bold; }
+.oils_AS { font-weight: bold; color: [% css_colors.text_match %]; }
+.oils_AS_match_term {
+    [% IF rtl == 't' -%]
+    text-align: right;
+    [% ELSE -%]
+    text-align: left;
+    [% END -%]
+    color: [% css_colors.text %];
+}
+.oils_AS_match_field {
+    font-size: [% css_fonts.size_smallest %]; padding: 0.65em 0;
+    [% IF rtl == 't' -%]
+    text-align: left;
+    [% ELSE -%]
+    text-align: right;
+    [% END -%]
+    color: [% css_colors.accent_medium %];
+}
+table.result_holdings_table {
+    margin-top: 1em;
+    margin-bottom: 1em;
+}
+table.result_holdings_table thead tr {
+    background-color: [% css_colors.table_heading %];
+}
+table.result_holdings_table thead tr th {
+    font-weight: bold;
+}
+span.preflib {
+    margin: 0 2em 0 2em;
+}
+a.preflib_change {
+  vertical-align: super;
+  font-size: [% css_fonts.size_smaller %];
+  line-height: normal;
+  text-decoration: none;
+}
+.rdetail-holding-group {
+    [% IF rtl == 't' -%]
+    margin-right: 1.5em;
+    [% ELSE -%]
+    margin-left: 1.5em;
+    [% END -%]
+}
+.rdetail-holding-group span {
+    [% IF rtl == 't' -%]
+    margin-right: 1.5em;
+    [% ELSE -%]
+    margin-left: 1.5em;
+    [% END -%]
+}
+.rdetail-holding-group .paging {
+    [% IF rtl == 't' -%]
+    margin-right: 1.5em;
+    [% ELSE -%]
+    margin-left: 1.5em;
+    [% END -%]
+}
+#rdetail_deleted_exp {
+    font-weight: bold;
+    padding: 1em;
+    margin: 1em;
+    border: thick solid [% css_colors.border_alert %];
+}
+
+#ac_tab_wrapper { width : 100%; }
+.ac_tab {
+    [% IF rtl == 't' -%]
+    float: right;
+    padding-left: 10px;
+    [% ELSE -%]
+    float: left;
+    padding-right: 10px;
+    [% END -%]
+    font-size: [% css_fonts.size_big %];
+    padding: 5px;
+    border: 1px solid [% css_colors.primary_offset %];
+}
+.ac_tab_selected { background-color: [% css_colors.primary_offset %]; }
+.ac_tab_selected a { color: [% css_colors.text_invert %]; }
+#ac_content { clear: both; width: 100%; margin-top: 10px; }
+
+/* Popmenu styles used for making css menus. */
+.popmenu {
+    margin: 0;
+    padding: 0;
+}
+.popmenu li {
+    list-style: none;
+}
+.popmenu li a {
+    display: block;
+    padding: 3px 5px;
+}
+.popmenu li ul {
+    display: none; 
+    width: 10em; /* Width to help Opera out */
+    background-color: [% css_colors.primary %];
+}
+.popmenu li:hover ul {
+    display: block;
+    position: absolute;
+    margin: 0;
+    padding: 0;
+    border-color: [% css_colors.border_dark %];
+    border-width: 1px;
+    border-style: solid;
+}
+.popmenu li:hover li {
+    float: none;
+}
+.popmenu li:hover li a {
+    background-color: [% css_colors.primary %]; 
+    color: [% css_colors.accent_ultralight %];
+}
+.popmenu li li a:hover {
+    background-color: [% css_colors.accent_ultralight %]; 
+    color: [% css_colors.primary %];
+}
+/* Styles for the basket entry. */
+.popmenu li:hover li[class~="temporary"] a {
+    background-color: [% css_colors.primary %]; 
+    color: [% css_colors.accent_ultralight %];
+}
+.popmenu li li[class~="temporary"] a:hover {
+    background-color: [% css_colors.accent_ultralight %]; 
+    color: [% css_colors.primary %];
+}
+/* Styles for the default list entry. */
+.popmenu li:hover li[class~="default"] a {
+    background-color: [% css_colors.primary %]; 
+    color: [% css_colors.accent_ultralight %];
+}
+.popmenu li li[class~="default"] a:hover {
+    background-color: [% css_colors.accent_ultralight %]; 
+    color: [% css_colors.primary %];
+}
+/* Styles for the new list entry. */
+.popmenu li:hover li[class~="new"] a {
+    background-color: [% css_colors.primary %]; 
+    color: [% css_colors.accent_ultralight %];
+}
+.popmenu li li[class~="new"] a:hover {
+    background-color: [% css_colors.accent_ultralight %]; 
+    color: [% css_colors.primary %];
+}
+/* Style to add a divider on the menu. */
+.popmenu li li[class~="divider"] {
+    border-bottom-width: 1px;
+    border-bottom-color: [% css_colors.border_dark %];
+    border-bottom-style: solid;
+}
+    
+
+
+
+#patron_usr_barcode_not_found {
+    font-weight: bold; color: [% css_colors.text_alert %];
+}
+
+.record_title {
+    font-weight: bold;
+}
+
+.record_author {
+    font-style: italic;
+}
+
+.password_message {
+    padding-top: 1em;
+    padding-bottom: 0.5em;
+       font-style: italic;
+}
+
+#maintenance_message {
+    padding: 5px;
+    width: 100%;
+    background-color: [% css_colors.text_alert %];
+    color: [% css_colors.text_invert %];
+    text-align: center;
+}
+
+#search-box > span {
+    margin: 0 1em;
+}
+.browse-error {
+    font-weight: bold;
+    font-color: #c00;
+}
+.browse-result-sources, .browse-result-authority-bib-links {
+    [% IF rtl == 't' -%]
+    margin-right: 1em;
+    [% ELSE -%]
+    margin-left: 1em;
+    [% END -%]
+}
+.browse-result-best-match {
+    font-weight: bold;
+}
+.browse-pager {
+    margin: 2ex 0;
+}
+.browse-result-list {
+    padding-bottom: 0.5ex;
+}
+.browse-shortcuts {
+    font-size: [% css_fonts.size_bigger %];
+}
+.browse-result-authority-field-name {
+    font-style: italic;
+    [% IF rtl == 't' -%]
+    margin-left: 1em;
+    [% ELSE -%]
+    margin-right: 1em;
+    [% END -%]
+}
+.browse-leading-article-warning {
+    font-style: italic;
+    font-size: [% css_fonts.size_big %];
+}
+.browse-public-general-note {
+    font-size: [% css_fonts.size_big %];
+}
+.browse-public-general-note-label { }
+.browse-public-general-note-institution {
+    font-style: normal;
+    font-weight: bold;
+}
+.browse-public-general-note-body {
+    font-style: italic;
+}
+
+.bib_peer_type {
+    font-weight: bold;
+}
+
+#main-content-register {
+    [% IF rtl == 't' -%]
+    margin-right: 40px;
+    [% ELSE -%]
+    margin-left: 40px;
+    [% END -%]
+    font-size: [% css_fonts.size_bigger %];
+}
+
+#main-content-register table { 
+    padding: 20px; 
+    margin-top: 18px; 
+    border-collapse: collapse;
+}
+
+#main-content-register td {
+    [% IF rtl == 't' -%]
+    text-align: right;
+    [% ELSE -%]
+    text-align: left;
+    [% END -%]
+}
+
+#main-content-register td:not(:first-child) {
+    [% IF rtl == 't' -%]
+    padding-right: 20px;
+    [% ELSE -%]
+    padding-left: 20px;
+    [% END -%]
+}
+
+.patron-reg-invalid {
+    font-weight: bold;
+    color: red;
+    [% IF rtl == 't' -%]
+    padding-left: 10px;
+    [% ELSE -%]
+    padding-right: 10px;
+    [% END -%]
+}
+
+.result_footer_nav1 {
+    clear: both;
+}
+
+.small_view_only, #filter_hits, #refine_hits, #return_to_hits {
+    display: none;
+}
+
+.rdetail_authors_div {
+    margin-bottom: 1em;
+}
+
+#search_query_label, #search_qtype_label, #search_itype_label, #search_locg_label {
+    white-space: nowrap;
+    display: inline-block;
+}
+
+.result_table_title_cell {
+    padding-top: 4px;
+    padding-bottom: 4px;
+}
+
+.record_title {
+    font-size: [% css_fonts.size_bigger %];
+}
+
+/* styling for sms text call number */
+.sms_text pre {
+    font-family: Arial, Helvetica, sans-serif;
+    font-size: [% css_fonts.size_medium %];
+    background-color: [% css_colors.accent_lightest %];
+    padding: .5%;
+    /* Allow text to wrap */
+    white-space: pre-wrap;       /* css-3 */
+    white-space: -moz-pre-wrap;  /* Mozilla, since 1999 */
+    white-space: -pre-wrap;      /* Opera 4-6 */
+    white-space: -o-pre-wrap;    /* Opera 7 */
+    word-wrap: break-word;       /* Internet Explorer 5.5+ */
+}
+
+.mobile_view {
+   display:none;
+}
+
+/* patron message center */
+#myopac_message_tbody {
+    vertical-align: top;
+}
+.myopac_message_message {
+    white-space: pre-wrap;
+}
+
+@media only screen and (min-width: 992px) {
+       .nav-fr{
+       float: right;
+    }
+    .nav-fl{
+       float: left;
+    }
+    #nav-divide{
+       display:none !important;
+    }
+}
+@media only screen and (max-width: 800px) {
+    .facet_sidebar_hidden, .result_block_hidden {
+        display: none;
+    }
+    .facet_sidebar_visible, .result_block_visible {
+        display: inline ! important;
+    }
+    #acct_select, #acct_prefs_select {
+        display: inline-block;
+    }
+    #acct_tabs, #acct_prefs_tabs {
+         display:none;
+     }
+    .radio-parts-selection { width: 90%; }
+    #list_description, #list_create_name {
+        width: 300px;
+    }
+}
+
+@media only screen and (max-width: 600px) {
+    input, select {
+        font-size: [% css_fonts.size_big %];
+    }
+    span .nav_arrow_fix {
+        display: none;
+    }
+    #header {
+        padding: 0px;
+        margin: 0px;
+    }
+    #homesearch_main_logo img {
+        width:75%;
+    }
+    #format_selector {
+        display:none;
+    }
+    #your-acct-login {
+        padding: 0px;
+        padding-top: 5px;
+    }
+    #your-acct-login a {
+        margin: 0px;
+        padding: 5px;
+    }
+    #topnav_logo {
+        margin: 0;
+    }
+    #topnav_logo img {
+        width: 200px;
+    }
+    #gold-links-holder {
+        display: none;
+    }
+    #simple-detail-view-links {
+        display: none;
+    }
+    #acct_tabs a, #acct_fines_tabs a {
+       [% IF rtl == 't' -%]
+       border-radius: 6px 0px 0px 6px;
+       margin: 0px 0px 0px 5px;
+       [% ELSE -%]
+       border-radius: 6px 6px 0px 0px;
+       margin: 0px 5px 0px 0px;
+       [% END -%]
+       padding: 2px 4px 3px 4px;
+       font-size: [% css_fonts.size_base %];
+    }
+    .bookbag-controls-title-block {
+        [% IF rtl == 't' -%]
+        clear:right;
+        [% ELSE -%]
+        clear:left;
+        [% END -%]
+        width:90%;
+    }
+    .bookbag-controls-button-block {
+        [% IF rtl == 't' -%]
+        clear:right;
+        [% ELSE -%]
+        clear:left;
+        [% END -%]
+        width;90%;
+    }
+    .bookbag-specific {
+        [% IF rtl == 't' -%]
+        margin-right: 0px;
+        [% ELSE -%]
+        margin-left: 0px;
+        [% END -%]
+    }
+    .bookbag-specific div.sort {
+        [% IF rtl == 't' -%]
+        float: right;
+        text-align: right;
+        [% ELSE -%]
+        float: left;
+        text-align: left;
+        [% END -%]
+        width: 95%;
+        margin: 5px 0px 5px 0px;
+        border: 1px solid [% css_colors.accent_light %];
+        padding:5px;
+    }
+    .bookbag-specific div.meta {
+        [% IF rtl == 't' -%]
+        float: right;
+        margin-right:0px;
+        text-align: right;
+        [% ELSE -%]
+        float: left;
+        margin-left:0px;
+        text-align: left;
+        [% END -%]
+        width: 95%;
+        margin-bottom:5px;
+        padding:5px;
+    }
+    #bbag-edit-name {
+        [% IF rtl == 't' -%]
+        float: right;
+        [% ELSE -%]
+        float: left;
+        [% END -%]
+        width: 220px;
+    }
+    #bbag-edit-description {
+        width: 220px;
+        margin-top:5px;
+    }
+    .bbag-content {
+        padding:5px;
+        border:1px solid [% css_colors.accent_light %];
+    }
+    .bbag-action {
+        [% IF rtl == 't' -%]
+        margin-right:0px;
+        [% ELSE -%]
+        margin-left:0px;
+        [% END -%]
+        margin-bottom:5px;
+    }
+    .bbag-action-field {
+        width:230px;
+    }
+    .bookbag-specific div.sort select {
+        width:180px;
+    }
+    .bookbag-specific tr {
+        display: block;
+        border-bottom: 1px solid [% css_colors.border_standard %];
+    }
+    .bookbag-specific td.list_checkbox {
+        [% IF rtl == 't' -%]
+        padding-right: 0px !important;
+        [% ELSE -%]
+        padding-left: 0px !important;
+        [% END -%]
+    }
+    .bookbag-specific td.list_entry {
+        display: inline-block;
+        min-width: 5em;
+        [% IF rtl == 't' -%]
+        padding-right: 40% !important;
+        [% ELSE -%]
+        padding-left: 40% !important;
+        [% END -%]
+    }
+    .bookbag-specific td.list_entry:before {
+        content: attr(data-label);
+        position: absolute;
+        [% IF rtl == 't' -%]
+        right: 10px;
+        [% ELSE -%]
+        left: 10px;
+        [% END -%]
+    }
+    .bbag-navigate-list {
+        display: none;
+    }
+    .bbag-navigate-list-pages {
+        [% IF rtl == 't' -%]
+        text-align:left;
+        float:left;
+        [% ELSE -%]
+        text-align:right;
+        float:right;
+        [% END -%]
+    }
+    #dash_wrapper div {
+        background-color: transparent;
+        padding: 0px;
+    }
+    #dash_wrapper {
+        position: static;
+        top: auto;
+    }
+    #dash_wrapper .opac-button {
+        top: 0px;
+    }
+    .small_view_only, #filter_hits {
+        display: inline !important;
+    }
+    #dash_identity a {
+        [% IF rtl == 't' -%]
+        float:right;
+        [% ELSE -%]
+        float:left;
+        [% END -%]
+    }
+    #dashboard, #dashboard_e {
+        display: none;
+    }
+    #holds_box form blockquote {
+        [% IF rtl == 't' -%]
+        margin-right: 10px;
+        margin-left: 2px;
+        [% ELSE -%]
+        margin-left: 10px;
+        margin-right: 2px;
+        [% END -%]
+    }
+    #holds_box form blockquote select {
+        width: 100%;
+    }
+    #myopac_sum_fines_placehold {
+        display:none;
+    }
+    #myopac_sum_fines {
+        display: none;
+    }
+    #list_description, #list_create_name {
+        width: 170px;
+    }
+    .results_header_lbl {
+        display: none;
+    }
+    .results_header_nav1 span.h1 {
+        display: none;
+    }
+    .preflib {
+        display: none;
+    }
+    .start_end_links_span {
+        display: block;
+    }
+    .invisible {
+        display: none;
+    }
+    .result_table_pic_header {
+        [% IF rtl == 't' -%]
+        padding-right: 0px !important;
+        padding-left: 5px;
+        [% ELSE -%]
+        padding-left: 0px !important;
+        padding-right: 5px;
+        [% END -%]
+        width: 0px !important;
+        margin: 0px;
+    }
+    .result_table_pic {
+        width: 55px;
+        padding: 0px;
+        margin: 0px;
+    }
+    tr[name=results_isbn_tr], tr[name=results_phys_desc_tr], tr[name=results_pub_tr] strong, .result_count {
+         display: none;
+    }
+    tr.result_table_title_cell[name=bib_cn_list] .result_holdings_table th:nth-child(4),
+    tr.result_table_title_cell[name=bib_cn_list] .result_holdings_table td:nth-child(4) {
+        display:none;
+    }
+    #results_header_bar {
+        background-color: inherit;
+    }
+    .results_header_btns a {
+        margin: 0.3em;
+    }
+    .adv_filter_results_hide {
+        display: none;
+    }
+    .adv_filter_results_show {
+        display: block;
+    }
+    .adv_filter_results_block_label {
+        display: block;
+    }
+    .adv_filter_results_group_wrapper {
+        display: block;
+    }
+    #main-content {
+        margin: 0 1px;        
+    }
+    #rdetails_status thead {
+        display: none;
+    }
+    #rdetails_status tr {
+       display: block;
+       margin-top: 3px;
+    }
+    #rdetails_status td {
+       display: block;
+       padding: 1px;
+    }
+    .copy_details_row {
+       background-color: [% css_colors.accent_lightest %];
+    }
+    .copy_details_offers_row {
+       background-color: [% css_colors.accent_lightest %];
+    }
+    select#pickup_lib.search-wrapper-locg {
+        width: 100%;
+    }
+    #search-wrapper #search-box {
+        width: 85%;
+        padding-top: 5px;
+    }
+    #main-content-home {
+        padding: 0px;
+        margin: 0px;
+    }
+    /* Make use of full width in mobile mode */
+    .facet_box_wrapper .box_wrapper .box,
+    .facet_template .facet,
+    .facet_box_temp {
+        width: inherit;
+    }
+    .facet_template .count {
+        [% IF rtl == 't' -%]
+        padding-right: 1em;
+        [% ELSE -%]
+        padding-left: 1em;
+        [% END -%]
+    }
+    #facet_sidebar {
+        margin-top: 0.5em;
+    }
+    #adv_search_parent {
+        font-size: [% css_fonts.size_smaller %];
+    }
+    #adv_search_filters {                                                                                                                             
+        position: relative;                                                                                                                           
+        width: 300px;
+    }
+    #format_actions {
+        [% IF rtl == 't' -%]
+        float: right;
+        [% ELSE -%]
+        float: left;
+        [% END -%]
+    }
+    .rdetail_aux_utils {
+        padding: 0px;
+        border: none;
+    }
+    .result_metadata {
+        width: inherit;
+    }
+    div#rdetail_actions_div {
+        float: none;
+    }
+    h2.rdetail_uris {
+        clear: both;
+    }
+    #metarecord_population {
+        overflow: hidden;
+        width: 100%;
+    }
+    .metarecord_population_span_link {
+    }
+    .metarecord_population_item_lang {
+        float: none;
+    }
+    .search_catalog_lbl {
+        [% IF rtl == 't' -%]
+       margin-right: 0;
+        [% ELSE -%]
+       margin-left: 0;
+        [% END -%]
+       white-space: nowrap;
+    }
+    .adv_search_catalog_lbl { 
+        margin-top: 0;
+       white-space: nowrap;
+    }
+    .browse_the_catalog_lbl {
+        white-space: nowrap;
+    }
+    .mobile_hide {
+       display: none;
+    } 
+    #dash_user {
+        display: block;
+        padding: 0.5em;    
+        font-size: 18px;
+        text-align: center;
+    }
+    .dash_divider {
+       display: none;
+    }
+    .dash_account_buttons {
+        display: block;
+    } 
+    .searchbar { line-height: 1.5em; }
+    #browse-controls { line-height: 1.5em; }
+    #search_query_label, #search_qtype_label, #search_itype_label, #search_locg_label {
+        display: block;
+    }
+    .bookshelf td {
+       display: block;
+       width: 100%;
+    }
+    .bookshelf table thead tr {
+       display: block;
+    }
+    #lowhits_help { width: inherit; }
+    #adv_search_tabs a{                                                                                                                           
+        font-size: [% css_fonts.size_small %];
+        margin: 2px 2px 0px 2px;
+        padding: 2px 2px 5px 2px; 
+        [% IF rtl == 't' -%]
+        border-radius: 7px 0px 0px 7px;
+        [% ELSE -%]
+        border-radius: 7px 7px 0px 0px;
+        [% END -%]
+    }
+    #adv_global_tbody td {
+        border-bottom: thin solid [% css_colors.accent_light %];
+    }
+    #adv_global_addrow td {
+        border-bottom: none;
+    }
+        /* Force table to not be like tables anymore */
+        table#acct_checked_main_header thead tr th, table#acct_holds_main_header thead tr th, table#acct_checked_hist_header thead tr th, table#acct_holds_hist_header thead tr th, table#ebook_circs_main_table thead tr th, table#ebook_holds_main_table thead tr th {
+                display: none;
+        }
+        table#acct_checked_main_header tbody tr td, table#acct_holds_main_header tbody tr td, table#acct_checked_hist_header tbody tr td, table#acct_holds_hist_header tbody tr td, table#ebook_circs_main_table tbody tr td, table#ebook_holds_main_table tbody tr td {
+                display: block;
+        }
+
+        /* Hide table headers (but not display: none;, for accessibility) */
+       /* thead tr {
+                position: absolute;
+                top: -9999px;
+                [% IF rtl == 't' -%]
+                right: -9999px;
+                [% ELSE -%]
+                left: -9999px;
+                [% END -%]
+        }*/
+
+        table#acct_checked_main_header, table#acct_holds_main_header, table#acct_checked_hist_header, table#acct_holds_hist_header, table#ebook_circs_main_table, table#ebook_holds_main_table {
+                width: 90%;
+        }
+
+        table#acct_checked_main_header tr, table#acct_holds_main_header tr, table#acct_checked_hist_header tr { border: 1px solid #ddd; }
+
+        /* Holds history gets large white border to mimic header cell on other
+           account screens that provide visual cue for next title. We should do
+           the same for ebook tables too since we have no actions on those
+           tables. If actions get added, we should move those tables out of
+           here. */
+
+        table#ebook_circs_main_table tr, table#ebook_holds_main_table tr { border-top: 25px solid #fff; }
+               table#acct_holds_hist_header tr{ border-top: 2px solid #bbb; }
+
+        table#acct_checked_main_header td, table#acct_holds_main_header td, table#acct_checked_hist_header td, table#acct_holds_hist_header td, table#ebook_circs_main_table td, table#ebook_holds_main_table td {
+                /* Behave  like a "row" */
+                border: none;
+                border-bottom: 1px solid #eee;
+                position: relative;
+                [% IF rtl == 't' -%]
+                padding-right: 40%;
+                [% ELSE -%]
+                padding-left: 40%;
+                [% END -%]
+        }
+
+         table#acct_checked_main_header td:before, table#acct_holds_main_header td:before, table#acct_checked_hist_header td:before, table#acct_holds_hist_header td:before, table#ebook_circs_main_table td:before, table#ebook_holds_main_table td:before {
+                /* Now like a table header */
+                position: absolute;
+                /* Top/left values mimic padding */
+                top: 2px;
+                width: 40%;
+                [% IF rtl == 't' -%]
+                right: 2px;
+                padding-left: 10px;
+                [% ELSE -%]
+                left: 2px;
+                padding-right: 10px;
+                [% END -%]
+                white-space: nowrap;
+        }
+
+        table#acct_checked_main_header td:nth-of-type(1) { border-top: 5px solid #aaa; padding-top: 15px; background-color: #fff;}
+        table#acct_checked_main_header td:nth-of-type(2):before { content: "[% l('Title') %]";}
+        table#acct_checked_main_header td:nth-of-type(3):before { content: "[% l('Author') %]"; }
+        table#acct_checked_main_header td:nth-of-type(4):before { content: "[% l('Renewals Left') %]"; }
+        table#acct_checked_main_header td:nth-of-type(5):before { content: "[% l('Due Date') %]"; }
+        table#acct_checked_main_header td:nth-of-type(6):before { content: "[% l('Barcode') %]"; }
+        table#acct_checked_main_header td:nth-of-type(7):before { content: "[% l('Call number') %]"; }
+
+     table#acct_checked_hist_header td:nth-of-type(1) { border-top: 5px solid #aaa; padding-top: 15px; background-color: #fff;}
+        table#acct_checked_hist_header td:nth-of-type(2):before { content: "[% l('Title') %]";}
+        table#acct_checked_hist_header td:nth-of-type(3):before { content: "[% l('Author') %]"; }
+        table#acct_checked_hist_header td:nth-of-type(4):before { content: "[% l('Checkout Date') %]"; }
+        table#acct_checked_hist_header td:nth-of-type(5):before { content: "[% l('Due Date') %]"; }
+        table#acct_checked_hist_header td:nth-of-type(6):before { content: "[% l('Date Returned') %]"; }
+        table#acct_checked_hist_header td:nth-of-type(7):before { content: "[% l('Barcode') %]"; }
+        table#acct_checked_hist_header td:nth-of-type(8):before { content: "[% l('Call number') %]"; }
+
+        table#acct_holds_main_header td:nth-of-type(1) { border-top: 5px solid #aaa; padding-top: 15px; background-color: #fff;}
+        table#acct_holds_main_header td:nth-of-type(2):before { content: "[% l('Title') %]";}
+        table#acct_holds_main_header td:nth-of-type(3):before { content: "[% l('Author') %]"; }
+        table#acct_holds_main_header td:nth-of-type(4):before { content: "[% l('Format') %]"; }
+        table#acct_holds_main_header td:nth-of-type(5):before { content: "[% l('Pickup Location') %]"; }
+        table#acct_holds_main_header td:nth-of-type(6):before { content: "[% l('Cancel on') %]"; }
+        table#acct_holds_main_header td:nth-of-type(7):before { content: "[% l('Status') %]"; }
+        table#acct_holds_main_header td.hold_notes:before { content: "[% l('Notes') %]"; }
+
+        table#acct_holds_hist_header td:nth-of-type(1):before { content: "[% l('Title') %]";}
+        table#acct_holds_hist_header td:nth-of-type(2):before { content: "[% l('Author') %]"; }
+        table#acct_holds_hist_header td:nth-of-type(3):before { content: "[% l('Format') %]"; }
+        table#acct_holds_hist_header td:nth-of-type(4):before { content: "[% l('Pickup Location') %]"; }
+        table#acct_holds_hist_header td:nth-of-type(8):before { content: "[% l('Status') %]"; }
+
+        table#ebook_circs_main_table td:nth-of-type(1):before { content: "[% l('Title') %]"; }
+        table#ebook_circs_main_table td:nth-of-type(2):before { content: "[% l('Author') %]"; }
+        table#ebook_circs_main_table td:nth-of-type(3):before { content: "[% l('Due Date') %]"; }
+        table#ebook_circs_main_table td:nth-of-type(4):before { content: "[% l('Actions') %]"; }
+
+        table#ebook_holds_main_table td:nth-of-type(1):before { content: "[% l('Title') %]"; }
+        table#ebook_holds_main_table td:nth-of-type(2):before { content: "[% l('Author') %]"; }
+        table#ebook_holds_main_table td:nth-of-type(3):before { content: "[% l('Due Date') %]"; }
+        table#ebook_holds_main_table td:nth-of-type(4):before { content: "[% l('Actions') %]"; }
+
+
+
+       /*Want to see these in mobile ONLY */
+       .mobile_view{
+          display:block;
+       }
+
+       .mobile_search_lbl_clr{
+          color:[% css_colors.mobile_header_text %];
+       }
+}
+
+
+/* 
+For text which is visible only to screen readers.
+Borrowed from http://getbootstrap.com/css/#helper-classes-screen-readers 
+See also http://webaim.org/techniques/css/invisiblecontent/
+*/
+.sr-only {                                                                     
+    position: absolute;                                                          
+    width: 1px;                                                                  
+    height: 1px;                                                                 
+    padding: 0;                                                                  
+    margin: -1px;                                                                
+    overflow: hidden;                                                            
+    clip: rect(0, 0, 0, 0);                                                      
+    border: 0;                                                                   
+}
+
+/* Make added rows in Expert Search have bold labels like the initial row */
+label[for*=expert_]
+{
+    font-weight: bold;
+}  
+
+.sort_deemphasize {
+    font-weight: lighter;
+    font-size: 70%;
+}
+
+#results-page-depth-hint {
+    text-align: center;
+    font-style: italic;
+}
+
+#clear-history-confirm {
+  font-weight: bold;
+  color: [% css_colors.text_badnews %]; 
+  padding: 10px;
+}
+
+/*Inline rules from other templates files*/
+
+.td-left{
+    [% IF rtl == 't' -%]
+    text-align:right;
+    [% ELSE -%]
+    text-align:left;
+    [% END -%]
+    width:100%;
+}
+.td-search-left{
+    [% IF rtl == 't' -%]
+    text-align:right;
+    [% ELSE -%]
+    text-align:left;
+    [% END -%]
+}
+#myopac_summary_div{padding:0px;}
+.div-left{
+    [% IF rtl == 't' -%]
+    float: right;
+    [% ELSE -%]
+    float: left;
+    [% END -%]
+}
+.td-right{
+    [% IF rtl == 't' -%]
+    text-align:left;
+    [% ELSE -%]
+    text-align:right;
+    [% END -%]
+}
+.login-form-left{
+    [% IF rtl == 't' -%]
+    float: right;
+    margin-left: 40px;
+    [% ELSE -%]
+    float: left;
+    margin-right: 40px;
+    [% END -%]
+    padding-bottom: 10px;
+}
+.hold-div{
+    [% IF rtl == 't' -%]
+    padding-right: 10px;
+    [% ELSE -%]
+    padding-left: 10px;
+    [% END -%]
+    padding-bottom: 15px;
+}
+.hold-span{font-weight: bold;}
+.padding-left-6{
+    [% IF rtl == 't' -%]
+    padding-right: 6px;
+    [% ELSE -%]
+    padding-left: 6px;
+    [% END -%]
+}
+.padding-left-10{
+    [% IF rtl == 't' -%]
+    padding-right:10px;
+    [% ELSE -%]
+    padding-left:10px;
+    [% END -%]
+}
+.padding-left-5{
+    [% IF rtl == 't' -%]
+    padding-right: 5px;
+    [% ELSE -%]
+    padding-left: 5px;
+    [% END -%]
+}
+
+/* Rules from metarecord_hold_filters.tt2 */
+
+.metarecord_filters{
+      padding: 5px;
+      margin-top: 5px;
+      border-bottom: 1px solid #333;
+      border-top: 1px solid #333; }
+.metarecord_filter_container{
+    [% IF rtl == 't' -%]
+    float : right;
+    margin-left: 10px;
+    [% ELSE -%]
+    float : left;
+    margin-right: 10px;
+    [% END -%]
+}
+.metarecord_filter_container select{padding: 2px;width: 13em; /* consistent w/ adv search selectors */}
+.metarecord_filter_header{padding-bottom: 5px;}
+
+/* Toggled items. */
+/* A block that is initially hidden and shown by clicking an anchor. */
+[id^="toggled-block-"]{
+    display: none;
+}
+[id^="toggled-block-"]:target{
+    display: block;
+}
+/* Inline text that is initially hidden and shown by clicking an anchor. Useful on a span. */
+[id^="toggled-inline-"]{
+    display: none;
+}
+[id^="toggled-inline-"]:target{
+    display: inline;
+}
+
+.oils_SH {
+    font-weight: bolder;
+    background-color: #99ff99;
+}
+
+.oils_SH.identifier {
+    font-weight: bolder;
+    background-color: #42b0f4;
+}
+.hold_note_title { font-weight: bold; }
+
+/*
+#acct_checked_main_header td, #acct_holds_main_header td, #acct_fines_main_header td, #acct_fines_confirm_header td, #acct_fees_main_header td,#acct_checked_hist_header td, #acct_holds_hist_header td, #acct_list_header td, #acct_list_header_anon td, #temp_list_holds td, #acct_messages_main_header td, #ebook_circs_main_table td, #ebook_holds_main_table td {
+    background-color: [% css_colors.background %]; 
+    padding: 10px;
+        border: 1px solid #d3d3d3; 
+} 
+
+#acct_checked_main_header th, #acct_holds_main_header th, #acct_fines_main_header th, #acct_fines_confirm_header th, #acct_fees_main_header th, #acct_checked_hist_header th, #acct_holds_hist_header th, #acct_list_header th, #acct_list_header_anon th, #temp_list_holds th, #acct_messages_main_header th, #ebook_holds_main_table th {
+    [% IF rtl == 't' -%]
+    text-align: right;
+    [% ELSE -%]
+    text-align: left;
+    [% END -%]
+    padding: 0px 10px 0px 10px;
+}
+#acct_checked_main_header, #acct_holds_main_header, #acct_fines_main_header, #acct_checked_hist_header, #acct_holds_hist_header, #acct_list_header, #acct_list_header_anon, #temp_list_holds, #acct_messages_main_header, #ebook_circs_main_table, #ebook_holds_main_table {
+    border-collapse: collapse;
+}
+
+#hold_editor h1 { font-size: [% css_fonts.size_bigger %]; font-weight: bold; }
+#hold_editor h2 { font-size: [% css_fonts.size_big %]; font-weight: normal; text-indent: 2em; font-style: italic; }
+#hold_editor h1, #hold_editor h2 { margin: 2px 0; }
+#hold_editor_table { background-color: [% css_colors.accent_lighter %]; padding: 0.5em; }
+#hold_editor_table th {
+    [% IF rtl == 't' -%]
+    text-align: left;
+    padding-left: 1em;
+    [% ELSE -%]
+    text-align: right;
+    padding-right: 1em;
+    [% END -%]
+}
+#hold_editor_table td { padding: 0.25em 0; }
+*/
+
+
+/*
+  Carousels
+*/
+
+.carousel {
+    width: 40%;
+    margin: 0 auto;
+}
+.carousel-title {
+    font-size: 150%;
+    font-weight: bold;
+    text-align: center;
+}
+.carousel-entry {
+    max-width: 150px;
+}
+.carousel-entry-image {
+    width: 100%;
+    height: auto;
+}
+.carousel .glide__arrow {
+    color: [% css_colors.button_text %];
+    font-weight: bold !important;
+    text-decoration: none !important;
+    cursor: pointer;
+    border-radius: 5px;
+    border: 1px solid [% css_colors.primary %];
+    background-color:  [% css_colors.primary_fade %];
+    margin: 0.5em;
+    padding: 0.3em;
+    display: inline-block;
+}
+.carousel .glide__arrow--right {
+    right: -5em;
+}
+.carousel .glide__arrow--left {
+    left: -5em;
+}
+
+.search-filter{
+    display: inline;
+}
+
+
+
+.search-option{
+    display: inline-block;
+    margin: 0px 10px;
+}
+
+.title{
+    font-size: large;
+}
+
+#homeLogo{
+    opacity: 0.5; 
+    filter: alpha(opacity=50); 
+    background-color: #fff; /* Used if the image is unavailable */
+    height: 500px; /* You must set a specified height */
+    background-position: center; /* Center the image */
+    background-repeat: no-repeat; /* Do not repeat the image */
+    background-size: contain; /* Resize the background image to cover the entire container */
+    background-image: url("https://evergreen-ils.org/wp-content/uploads/2018/09/Evergreen-Final-Logo.png");
+
+}
diff --git a/Open-ILS/src/templates-bootstrap/opac/home.tt2 b/Open-ILS/src/templates-bootstrap/opac/home.tt2
new file mode 100644 (file)
index 0000000..b362fe6
--- /dev/null
@@ -0,0 +1,13 @@
+[%- PROCESS "opac/parts/header.tt2";
+    WRAPPER "opac/parts/base.tt2";
+    INCLUDE "opac/parts/topnav.tt2";
+    ctx.metalinks.push('<link rel="canonical" href="' _ mkurl('', {}, 1) _ '" />');
+    ctx.page_title = l("Home") %]
+    <h2 class="sr-only">[% l('Catalog Home') %]</h2>
+    [% INCLUDE "opac/parts/searchbar.tt2" is_home_page=1 %]
+    <div>
+        <div>
+            [% INCLUDE "opac/parts/homesearch.tt2" %]
+        </div>
+    </div>
+[%- END %]
diff --git a/Open-ILS/src/templates-bootstrap/opac/mylist.tt2 b/Open-ILS/src/templates-bootstrap/opac/mylist.tt2
new file mode 100644 (file)
index 0000000..fe94c6d
--- /dev/null
@@ -0,0 +1,22 @@
+[%- PROCESS "opac/parts/header.tt2";
+    PROCESS "opac/parts/misc_util.tt2";
+    WRAPPER "opac/parts/base.tt2";
+    INCLUDE "opac/parts/topnav.tt2";
+    ctx.metalinks.push('<meta name="robots" content="noindex,follow">');
+    ctx.page_title = l("Record Detail") %]
+    <h2 class="sr-only">[% l('Basket') %]</h2>
+    <div class="mobile_hide">
+    [% INCLUDE "opac/parts/searchbar.tt2" %]
+    </div>
+    <div id="content-wrapper">
+        <div id="main-content">
+            [%  IF ctx.mylist.size;
+                    INCLUDE "opac/parts/anon_list.tt2";
+                ELSE %]
+                <div class="warning_box"><h2>[% l("The basket is empty."); %]</h2></div>
+                <button type="button" class="btn btn-confirm" onclick="window.location='[% ctx.referer | html %]'">[% l('Return') %]</button>
+                [% END %]
+            <div class="common-full-pad"></div>        
+        </div>
+    </div>
+[%- END %]
diff --git a/Open-ILS/src/templates-bootstrap/opac/mylist/clear.tt2 b/Open-ILS/src/templates-bootstrap/opac/mylist/clear.tt2
new file mode 100644 (file)
index 0000000..8e2596a
--- /dev/null
@@ -0,0 +1,21 @@
+[%- PROCESS "opac/parts/header.tt2";
+    PROCESS "opac/parts/misc_util.tt2";
+    WRAPPER "opac/parts/base.tt2";
+    INCLUDE "opac/parts/topnav.tt2";
+    ctx.page_title = l("Confirm Clearing of Basket") %]
+    <h2 class="sr-only">[% l('Confirm Clearing of Basket') %]</h2>
+    [% INCLUDE "opac/parts/searchbar.tt2" %]
+    <div id="content-wrapper">
+        <div id="main-content">
+             <p class="big-strong">[% l('Please confirm that you want to remove all [_1] titles from the basket.', ctx.mylist.size) %]
+             <form method="post" action="[% mkurl(ctx.opac_root _ '/cache/clear', {}, 1) %]">
+             <input type="hidden" name="redirect_to" value="[% ctx.referer %]" />
+             <input id="print_cart_submit" type="submit" name="submit"
+               value="[% l('Confirm') %]" title="[% l('Confirm') %]"
+               alt="[% l('Confirm') %]" class="btn btn-confirm" />
+             <input type="reset" name="cancel" onclick="window.location='[% ctx.referer | html %]'" value="[% l('Cancel') %]" id="clear_basket_cancel" class="btn btn-deny" />
+             </form>
+            <div class="common-full-pad"></div>        
+        </div>
+    </div>
+[%- END %]
diff --git a/Open-ILS/src/templates-bootstrap/opac/mylist/email.tt2 b/Open-ILS/src/templates-bootstrap/opac/mylist/email.tt2
new file mode 100644 (file)
index 0000000..9eeaa27
--- /dev/null
@@ -0,0 +1,29 @@
+[%- PROCESS "opac/parts/header.tt2";
+    PROCESS "opac/parts/misc_util.tt2";
+    WRAPPER "opac/parts/base.tt2";
+    INCLUDE "opac/parts/topnav.tt2";
+    ctx.page_title = l("Confirm Basket Email") %]
+    <h2 class="sr-only">[% l('Confirm Basket Email') %]</h2>
+    [% INCLUDE "opac/parts/searchbar.tt2" %]
+    <div id="content-wrapper">
+        <div id="main-content">
+          [% IF ctx.mylist.size %]
+             <p class="big-strong">[% l('Please confirm that you want to email the [_1] titles in the basket.', ctx.mylist.size) %]
+             <form method="post" action="[% mkurl(ctx.opac_root _ '/mylist/doemail', {}, 1) %]">
+             <input type="hidden" name="redirect_to" value="[% ctx.referer %]" />
+             <input type="checkbox" name="clear_basket" value="on" />
+             <label for="clear_basket">[% l('Clear basket after emailing it.') %]</label>
+             <br />
+             <input id="print_cart_submit" type="submit" name="submit"
+               value="[% l('Confirm') %]" title="[% l('Confirm') %]"
+               alt="[% l('Confirm') %]" class="btn btn-confirm" />
+             <input type="reset" name="cancel" onclick="window.location='[% ctx.referer | html %]'" value="[% l('Cancel') %]" id="clear_basket_cancel" class="btn btn-deny" />
+             </form>
+          [% ELSE %]
+            <div class="warning_box">[% l("The basket is empty."); %]</div>
+            <button type="button" class="btn btn-confirm" onclick="window.location='[% ctx.referer | html %]'">[% l('Return') %]</button>
+          [% END %]
+            <div class="common-full-pad"></div>        
+        </div>
+    </div>
+[%- END %]
diff --git a/Open-ILS/src/templates-bootstrap/opac/mylist/print.tt2 b/Open-ILS/src/templates-bootstrap/opac/mylist/print.tt2
new file mode 100644 (file)
index 0000000..08722c1
--- /dev/null
@@ -0,0 +1,29 @@
+[%- PROCESS "opac/parts/header.tt2";
+    PROCESS "opac/parts/misc_util.tt2";
+    WRAPPER "opac/parts/base.tt2";
+    INCLUDE "opac/parts/topnav.tt2";
+    ctx.page_title = l("Confirm Basket Printing") %]
+    <h2 class="sr-only">[% l('Confirm Basket Printing') %]</h2>
+    [% INCLUDE "opac/parts/searchbar.tt2" %]
+    <div id="content-wrapper">
+        <div id="main-content">
+          [% IF ctx.mylist.size %]
+             <p class="big-strong">[% l('Please confirm that you want to print the [_1] titles in the basket.', ctx.mylist.size) %]
+             <form method="post" action="[% mkurl(ctx.opac_root _ '/mylist/doprint', {}, 1) %]">
+             <input type="hidden" name="redirect_to" value="[% ctx.referer %]" />
+             <input type="checkbox" name="clear_cart" value="on" />
+             <label for="clear_basket">[% l('Clear basket after printing it.') %]</label>
+             <br />
+             <input id="print_cart_submit" type="submit" name="submit"
+               value="[% l('Confirm') %]" title="[% l('Confirm') %]"
+               alt="[% l('Confirm') %]" class="btn btn-confirm" />
+             <input type="reset" name="cancel" onclick="window.location='[% ctx.referer | html %]'" value="[% l('Cancel') %]" id="clear_basket_cancel" class="btn btn-deny" />
+             </form>
+          [% ELSE %]
+            <div class="warning_box"><h2>[% l("The basket is empty."); %]</h2></div>
+            <button type="button" class="btn btn-confirm" onclick="window.location='[% ctx.referer | html %]'">[% l('Return') %]</button>
+          [% END %]
+            <div class="common-full-pad"></div>        
+        </div>
+    </div>
+[%- END %]
diff --git a/Open-ILS/src/templates-bootstrap/opac/myopac/circ_history.tt2 b/Open-ILS/src/templates-bootstrap/opac/myopac/circ_history.tt2
new file mode 100644 (file)
index 0000000..dc1d90f
--- /dev/null
@@ -0,0 +1,214 @@
+[%  PROCESS "opac/parts/header.tt2";
+    PROCESS "opac/parts/misc_util.tt2";
+    PROCESS "opac/parts/myopac/column_sort_support.tt2";
+    WRAPPER "opac/parts/myopac/base.tt2";
+    myopac_page = "circs"
+    limit = ctx.circ_history_limit;
+    offset = ctx.circ_history_offset;
+%]
+
+<h3 class="sr-only">[% l('History of Checked Out Items') %]</h3>
+<div style="padding:0px;">
+   <div>
+     <ul class="nav nav-pills nav-fill">
+        <li class="nav-item m-2">
+            <a class="nav-link not_active_pill" href='[% mkurl('circs',{},1) %]'>[% l("Current Items Checked Out") %]</a>
+        </li>
+        [%- IF ebook_api.enabled == 'true' %]
+        <li class="nav-item m-2">
+            <a class="nav-link not_active_pill" href="[% mkurl('ebook_circs',{},1) %]">[% l("E-Items Currently Checked Out") %]</a>
+        </li>
+        [%- END %]
+        <li class="nav-item m-2">
+            <a class="nav-link active" href="#">[% l("Check Out History") %]</a>
+        </li>
+    </ul>
+       </div>
+
+    [%
+    # In the sorting case, the size is the size of ALL the circ items.  In the non-sorting case,
+    # the size is simply the size of the chunk passed in.  See the TODO below for the still-lingering
+    # bug.
+    sort_field = CGI.param('sort');
+    IF (sort_field);
+        no_next = ctx.circs.size - offset <= limit;
+    ELSE;
+        no_next = ctx.circs.size < limit;
+    END;
+    %]
+<div class="my-4">
+    <div class="header_middle">
+        <span class="float-left">[% l('Previously Checked Out Items') %]</span>
+        <span class='float-left' style='padding-left: 10px;'>
+            <a href='[% mkurl('circ_history', {limit => limit, offset => (offset - limit)}) %]'
+                [% IF offset == 0 %] class='invisible' [% END %]><span class="nav_arrow_fix">&#9668;</span>[% l('Previous') %]</a>
+            [%# TODO: get total to prevent paging off then end of the list.. %]
+            <a href='[% mkurl('circ_history', {limit => limit, offset => (offset + limit)}) %]'
+            [% IF no_next %] class='invisible' [% END %] >[% l('Next') %]<span class="nav_arrow_fix">&#9658;</span></a>
+        </span>
+    </div>
+    <div class="clear-both"></div>
+
+    [% IF ctx.circs.size < 1 %]
+    <div class="warning_box">[% l('There are no items in your circulation history.') %]</div>
+    [% ELSE %]
+
+        <form method="post" id="circ-form"
+            onsubmit="return confirm('[% l("Are you sure you wish to delete the selected item(s)?") %]');">
+        <table cellpadding='0' cellspacing='0' class="item_list_padding">
+            <tr>
+                <td style="width:90%;">
+                    <select name="action" class="form-control">
+                        <option value="delete">[% l('Delete Selected Titles') %]</option>
+                    </select>
+                </td>
+               
+                <td style="padding-left:9px;">
+                    <input type="submit"
+                        value="[% l('Go') %]"
+                        alt="[% l('Go') %]" title="[% l('Go') %]"
+                        class="btn btn-sm btn-confirm" />
+                </td>
+                <!--
+                <td style="padding-left:5px;">
+                    <a href="#"><img alt="[% l('Deleting Help') %]"
+                        src="[% ctx.media_prefix %]/images/question-mark.png[% ctx.cache_key %]" /></a>
+                </td>
+                -->
+            </tr>
+        </table>
+    <div id='checked_main'>
+        <table title="[% l('History of Items Checked Out') %]" id="acct_checked_hist_header" class="table table-hover miniTable circHistTable my-3">
+            <thead>
+                <tr>
+                    <th class="checkbox_column">
+                        <input type="checkbox" onclick="var inputs=document.getElementsByTagName('input'); for (i = 0; i < inputs.length; i++) { if (inputs[i].name == 'circ_id' && !inputs[i].disabled) inputs[i].checked = this.checked;}"/>
+                    </th>
+                    <th>[% sort_head("sort_title", l("Title")) %]</th>
+                    <th>[% sort_head("author", l("Author")) %]</th>
+                    <th>[% sort_head("callnum", l("Call Number")) %]</th>
+                    <th>[% sort_head("checkout", l("Checkout Date")) %]</th>
+                    <th>[% sort_head("due", l("Due Date")) %]</th>
+                    <th>[% sort_head("returned", l("Date Returned")) %]</th>
+                    <th>[% sort_head("barcode", l("Barcode")) %]</th>
+                </tr>
+            </thead>
+            <tbody>
+                [%# Copy the ctx.circs into a local array, then add a SORT field
+                    that contains the value to sort on.  Since we need the item attrs,
+                    invoke it and save the result in ATTRS.
+        %]
+        [%
+                circ_items = ctx.circs;  # Array assignment
+
+                FOR circ IN circ_items;
+                    circ.ATTRS = {marc_xml => circ.marc_xml};
+                    PROCESS get_marc_attrs args=circ.ATTRS;
+
+                    SWITCH sort_field;
+
+                    CASE "sort_title";
+                        circ.SORTING = circ.ATTRS.sort_title;
+
+                    CASE "author";
+                        circ.SORTING = circ.ATTRS.author;
+
+                    CASE "checkout";
+                        circ.SORTING = circ.circ.xact_start;
+
+                    CASE "due";
+                        circ.SORTING = circ.circ.due_date;
+
+                    CASE "returned";
+                        circ.SORTING = circ.circ.checkin_time;
+
+                    CASE "barcode";
+                        circ.SORTING = circ.circ.target_copy.barcode;
+
+                    CASE "callnum";
+                        circ.SORTING = circ.circ.target_copy.call_number.label;
+
+                    CASE;
+                        sort_field = "";
+                    END; # SWITCH
+                END; #FOR circ
+
+                IF (sort_field != "sort_title");
+                deemphasize_class = "";
+                ELSE;
+                deemphasize_class = " class=\"sort_deemphasize\"";
+                END;
+
+                # Apply sorting to circ_items
+                IF (sort_field);
+                circ_items = circ_items.sort("SORTING");
+                IF (CGI.param("sort_type") == "desc");
+                    circ_items = circ_items.reverse;
+                END;
+
+                # Shorten the circ_items list per offset/limit/cout
+                hi = offset + limit - 1;
+                hi = hi > circ_items.max ? circ_items.max : hi;
+
+                circ_items = circ_items.slice(offset, hi);
+                END;
+
+                # circ_items list is now sorted.  Traverse and dump the information.
+
+                FOR circ IN circ_items; %]
+                    <tr>
+            <td class="checkbox_column">
+                <input type="checkbox" name="circ_id" value="[% circ.circ.id %]" />
+            </td>
+                        <td>
+                            <a href="[% mkurl(ctx.opac_root _ '/record/' _
+                                circ.circ.target_copy.call_number.record.id, {}, 1) %]"
+                                name="[% l('Catalog record') %]"><span[%- deemphasize_class -%]>
+                                [%- circ.ATTRS.title.substr(0,circ.ATTRS.nonfiling_characters) | html %]</span>
+                                [%- circ.ATTRS.title.substr(circ.ATTRS.nonfiling_characters) | html %]</a>
+                        </td>
+                        <td>
+                            <a href="[% mkurl(ctx.opac_root _ '/results',
+                                {qtype => 'author', query => circ.ATTRS.author.replace('[,\.:;]', '')},
+                                1
+                            ) %]">[% circ.ATTRS.author | html %]</a>
+                        </td>
+                        <td>[% circ.circ.target_copy.call_number.label | html %]</td>
+                        <td>
+                            [% date.format(ctx.parse_datetime(circ.circ.xact_start),DATE_FORMAT); %]
+                        </td>
+                        <td>
+                            [% IF circ.circ.source_circ;
+                                date.format(ctx.parse_datetime(circ.circ.due_date, circ.circ.source_circ.circ_lib),DATE_FORMAT);
+                               ELSE;
+                                date.format(ctx.parse_datetime(circ.circ.due_date, ctx.user.home_ou),DATE_FORMAT);
+                               END;
+                            %]
+                        </td>
+                        <td>
+                            [% IF circ.circ.checkin_time;
+                                    date.format(ctx.parse_datetime(circ.circ.checkin_time),DATE_FORMAT);
+                                ELSE; %]
+                                <span style='color:blue;'>*</span><!-- meh -->
+                            [% END; %]
+                        </td>
+                        <td>[% circ.circ.target_copy.barcode | html %]</td>
+                        
+                    </tr>
+                [% END %]
+            </tbody>
+        </table>
+    </div>
+    </form>
+    <form action="[% mkurl(ctx.opac_root _ '/myopac/circ_history/export') %]" method="post">
+                <div>
+                    [%- INCLUDE "opac/parts/preserve_params.tt2" %]
+                    [% IF ctx.circs.size > 0 %]
+                    <input type="hidden" name="filename" value="[% l('circ_history.csv') %]"/>
+                    <button type="submit" class="btn btn-sm btn-primary">[% l('Download CSV') %]</button>
+                    [% END %]
+                </div>
+            </form>
+    [% END %]
+</div></div>
+[% END %]
diff --git a/Open-ILS/src/templates-bootstrap/opac/myopac/circs.tt2 b/Open-ILS/src/templates-bootstrap/opac/myopac/circs.tt2
new file mode 100644 (file)
index 0000000..760674b
--- /dev/null
@@ -0,0 +1,238 @@
+[%  PROCESS "opac/parts/header.tt2";
+    PROCESS "opac/parts/misc_util.tt2";
+    PROCESS "opac/parts/myopac/column_sort_support.tt2";
+    WRAPPER "opac/parts/myopac/base.tt2";
+    myopac_page = "circs";
+%]
+<h3 class="sr-only">[% l('Current Items Checked Out') %]</h3>
+<div id='myopac_checked_div'>
+       <div>
+     <ul class="nav nav-pills nav-fill">
+        <li class="nav-item m-2">
+            <a class="nav-link active" href='#'>[% l("Current Items Checked Out") %]</a>
+        </li>
+        [%- IF ebook_api.enabled == 'true' %]
+        <li class="nav-item m-2">
+            <a class="nav-link not_active_pill" href="[% mkurl('ebook_circs',{},1) %]">[% l("E-Items Currently Checked Out") %]</a>
+        </li>
+        [%- END %]
+        <li class="nav-item active m-2">
+            <a class="nav-link not_active_pill" href="[% mkurl('circ_history',{},1) %]">[% l("Check Out History") %]</a>
+        </li>
+    </ul>
+       </div>
+    <div class="my-4">
+    <div class="header_middle">
+        <span class="float-left">[% l('Current Items Checked Out') %]</span>
+    </div>
+    <div class="clear-both"></div>
+    [% IF ctx.circs.size < 1 %]
+    <div class="warning_box">[% l('You have no items checked out.') %]</div>
+    [% ELSE %]
+    [% IF ctx.success_renewals %]
+    <div class="renew-summary">
+        [% l("Successfully renewed [_1] item(s)", ctx.success_renewals) %]
+    </div>
+    [% END %]
+    [% IF ctx.failed_renewals %]
+    <div class="renew-summary alert">
+        [% l("Failed to renew [_1] item(s)", ctx.failed_renewals) %]
+    </div>
+    [% END %]
+    <div id='checked_main'>
+        <form method="post" id="circ-form"
+            onsubmit="return confirm('[% l("Are you sure you wish to renew the selected item(s)?") %]');">
+         <div class="row">
+                <span class="col-md-11 my-2">
+                <select class="form-control" name="action" title="[% l('Select Action') %]">
+                    <option value="renew">[% l('Renew Selected Titles') %]</option>
+                </select>
+            </span>
+            <span class="col-md-1 my-2">
+                <input type="submit"
+                    value="[% l('Go') %]"
+                    title="[% l('Go') %]"
+                    class="btn btn-confirm" />
+            </span>
+           <!-- <span style="padding-left:5px;">
+                <a href="#"><img 
+                    alt="[% l('Renewing Help') %]"
+                    title="[% l('Actions for checked out items') %]"
+                    src="[% ctx.media_prefix %]/images/question-mark.png[% ctx.cache_key %]" /></a>
+            </span> -->
+        </div>
+
+        <table  id="acct_checked_main_header"  title="[% l('Items Checked Out') %]"
+            class="table table-hover miniTable circTable">
+            <thead>
+            <tr>
+                <th class="checkbox_column">
+                    <input type="checkbox" id="check_all_checked"
+                        title="[% l('Select All Items') %]"
+                        onclick="var inputs=document.getElementsByTagName('input'); for (i = 0; i < inputs.length; i++) { if (inputs[i].name == 'circ' &amp;&amp; !inputs[i].disabled) inputs[i].checked = this.checked;}"
+                    />
+                </th>
+                <th>[% sort_head("sort_title", l("Title")) %]</th>
+                <th>[% sort_head("author", l("Author")) %]</th>
+                <th>[% sort_head("renews", l("Renewals Left")) %]</th>
+                <th>[% sort_head("due", l("Due Date")) %]</th>
+                <th>[% sort_head("barcode", l("Barcode")) %]</th>
+                <th>[% sort_head("callnum", l("Call Number")) %]</th>
+                 [% IF ctx.get_org_setting(ctx.user.home_ou, 'opac.show_owning_lib_column'); %]
+                   <th>[% sort_head("lib", l("Owning Library")) %]</th>
+                   [% column_count = 8;
+                ELSE ;
+                   column_count = 7;
+                END; %]
+            </tr>
+            </thead>
+            <tbody>
+                [%# Copy the ctx.circs into a local array, then add a SORT field
+                    that contains the value to sort on.  Since we need the item attrs,
+                    invoke it and save the result in ATTRS.
+               %]
+               [% 
+                circ_items = ctx.circs;  # Array assignment
+
+                sort_field = CGI.param('sort');  # unless changed below...
+
+                FOR circ IN circ_items;
+                    circ.ATTRS = {marc_xml => circ.marc_xml};
+                    PROCESS get_marc_attrs args=circ.ATTRS;
+               
+                    SWITCH sort_field;
+
+                       CASE "sort_title";
+                          circ.SORTING = circ.ATTRS.sort_title;
+
+                       CASE "author";
+                          circ.SORTING = circ.ATTRS.author;
+
+                       CASE "renews";
+                          circ.SORTING = circ.circ.renewal_remaining;
+                       
+                       CASE "due";
+                          circ.SORTING = circ.circ.due_date;
+                       
+                       CASE "barcode";
+                          circ.SORTING = circ.circ.target_copy.barcode;
+
+                       CASE "callnum";
+                          circ.SORTING = circ.circ.target_copy.call_number.label;
+                        CASE "lib";
+                          circ.SORTING = circ.circ.target_copy.call_number.owning_lib.name;
+                       
+                       CASE;
+                          sort_field = "";
+                    END; # SWITCH
+                END; #FOR circ
+
+                IF (sort_field != "sort_title");
+                   deemphasize_class = "";
+                ELSE;
+                   deemphasize_class = " class=\"sort_deemphasize\"";
+                END;
+
+                # Apply sorting to circ_items
+               IF (sort_field);
+                   circ_items = circ_items.sort("SORTING");
+                    IF (CGI.param("sort_type") == "desc");
+                        circ_items = circ_items.reverse;
+                    END;
+                END;
+
+               # circ_items list is now sorted.  Traverse and dump the information.
+
+                FOR circ IN circ_items; %]
+                    <tr>
+                        <td class="checkbox_column" valign="top">
+                            <input type="checkbox" name="circ"
+                                title="[% l('Item Selected') %]"
+                                [% IF circ.circ.renewal_remaining < 1 %] disabled="disabled" [% END %]
+                                value="[% circ.circ.id %]" />
+                        </td>
+                        <td name="title">
+                            <span class="sr-only">Title</span>
+                            [% IF circ.circ.target_copy.call_number.id == -1 %]
+                                [% circ.circ.target_copy.dummy_title | html %]
+                            [% ELSIF circ.ATTRS.title %]
+                                <a href="[% mkurl(ctx.opac_root _ '/record/' _ 
+                                    circ.circ.target_copy.call_number.record.id, {}, 1) %]"
+                                    name="[% l('Catalog record') %]"><span[%- deemphasize_class -%]>
+                                    [%- circ.ATTRS.title.substr(0,circ.ATTRS.nonfiling_characters) | html %]</span>
+                                    [%- circ.ATTRS.title.substr(circ.ATTRS.nonfiling_characters) | html %]</a>
+                            [% END %]
+                        </td>
+                        <td name="author">
+                            [% IF circ.circ.target_copy.call_number.id == -1 %]
+                                <span class="sr-only">Author</span>
+                                [% circ.circ.target_copy.dummy_author | html %]
+                            [% ELSIF circ.ATTRS.author %]
+                                <span class="sr-only">Author</span>
+                                <a href="[% mkurl(ctx.opac_root _ '/results',
+                                    {qtype => 'author', query => circ.ATTRS.author.replace('[,\.:;]', '')},
+                                    1
+                                ) %]">[% circ.ATTRS.author | html %]</a>
+                            [% ELSE %]
+
+                            [% END %]
+                        </td>
+                        <td name="renewals">
+                            <span class="sr-only">Renewals Remaining</span>
+                            [% circ.circ.renewal_remaining %]
+                        </td>
+                        [%
+                            due_date = ctx.parse_datetime(circ.circ.due_date, circ.circ.circ_lib);
+                            due_class = (date.now > date.format(due_date, '%s')) ? 'error' : '';
+                        %]
+                        <td name="due_date" class='[% due_class %]'>
+                            <span class="sr-only">Due Date</span>
+                            [% date.format(due_date, DATE_FORMAT) %]
+                        </td>
+                        <td name="barcode">
+                            <span class="sr-only">Barcode</span>
+                            <span class="speak:spell-out;">[% circ.circ.target_copy.barcode | html %]</span>
+                        </td>
+                        <td name="call_number">
+                            <span class="sr-only">Call Number</span>
+                            [% circ.circ.target_copy.call_number.label | html %]
+                        </td>
+                         [% IF ctx.get_org_setting(ctx.user.home_ou, 'opac.show_owning_lib_column'); %]
+                          <td name="lib">
+                                [%- fleshed_ou = circ.circ.target_copy.call_number.owning_lib;
+                                                INCLUDE "opac/parts/library_name_link_from_ou.tt2";
+                                %]
+                          </td>
+                        [% END; %]
+                    </tr>
+                    [%  IF circ.renewal_response AND
+                            circ.renewal_response.textcode != 'SUCCESS' %]
+                    <tr>
+                        <td colspan="[% column_count %]">[%# XXX colspan="0" does not work in IE %]
+                            <span class="failure-text" title="[% circ.renewal_response.textcode | html %] / [% circ.renewal_response.fail_part | html %]">
+                                [%
+                                    renew_fail_msg = '';
+                                    IF circ.renewal_response.textcode == 'TOTAL_HOLD_COPY_RATIO_EXCEEDED' OR
+                                        circ.renewal_response.textcode == 'AVAIL_HOLD_COPY_RATIO_EXCEEDED';
+                                        # the stock hold ratio message may not be patron friendly
+                                        renew_fail_msg = l('Item is needed for a hold');
+                                    ELSE;
+                                        renew_fail_msg = circ.renewal_response.desc || 
+                                            circ.renewal_response.fail_part || 
+                                            circ.renewal_response.textcode;
+                                    END;
+                                    renew_fail_msg | html;
+                                %]
+                            </span>
+                        </td>
+                    </tr>
+                    [% END; %]
+
+                [% END; %]
+                </tbody>
+            </table>
+        </form>
+    </div>
+    [% END %]
+</div></div>
+[% END %]
diff --git a/Open-ILS/src/templates-bootstrap/opac/myopac/ebook_checkout.tt2 b/Open-ILS/src/templates-bootstrap/opac/myopac/ebook_checkout.tt2
new file mode 100644 (file)
index 0000000..ca5bfe2
--- /dev/null
@@ -0,0 +1,34 @@
+[%  PROCESS "opac/parts/header.tt2";
+    PROCESS "opac/parts/misc_util.tt2";
+    PROCESS "opac/parts/myopac/column_sort_support.tt2";
+    WRAPPER "opac/parts/myopac/base.tt2";
+    myopac_page = "ebook_checkout";
+%]
+<h3 class="sr-only">[% l('Check Out E-Item') %]</h3>
+<div id='myopac_checked_div'>
+
+    <div class="header_middle">
+        <span class="float-left">[% l('Check Out E-Item') %]</span>
+    </div>
+    <div class="clear-both"></div>
+    <div id="ebook_checkout_failed" class="warning_box hidden">[% l('E-item could not be checked out.') %]</div>
+    <div id="ebook_checkout_succeeded" class="success hidden">[% l('E-item successfully checked out.') %]</div>
+    <div id="ebook_spinner"><img src="[% ctx.media_prefix %]/opac/images/progressbar_green.gif[% ctx.cache_key %]" alt="[% l("Loading...") %]"/></div>
+    <div id='ebook_circs_main' class="hidden">
+        <table id="ebook_circs_main_table"
+            title="[% l('Check Out E-Item') %]"
+            class="table table-hover miniTable w-100 echeckoutTable">
+            <thead>
+            <tr>
+                <th>[% l("Title") %]</th>
+                <th>[% l("Author") %]</th>
+                <th>[% l("Due Date") %]</th>
+                <th>[% l("Actions") %]</th>
+            </tr>
+            </thead>
+            <tbody id="ebook_circs_main_table_body"></tbody>
+        </table>
+    </div>
+</div>
+[% END %]
+
diff --git a/Open-ILS/src/templates-bootstrap/opac/myopac/ebook_circs.tt2 b/Open-ILS/src/templates-bootstrap/opac/myopac/ebook_circs.tt2
new file mode 100644 (file)
index 0000000..eb40563
--- /dev/null
@@ -0,0 +1,48 @@
+[%  PROCESS "opac/parts/header.tt2";
+    PROCESS "opac/parts/misc_util.tt2";
+    PROCESS "opac/parts/myopac/column_sort_support.tt2";
+    WRAPPER "opac/parts/myopac/base.tt2";
+    myopac_page = "ebook_circs";
+%]
+<h3 class="sr-only">[% l('E-Items Currently Checked Out') %]</h3>
+<div id='myopac_checked_div'>
+
+   <div class="mb-3">
+     <ul class="nav nav-pills nav-fill">
+        <li class="nav-item m-2">
+            <a class="nav-link not_active_pill" href='[% mkurl('circs',{},1) %]'>[% l("Current Items Checked Out") %]</a>
+        </li>
+        [%- IF ebook_api.enabled == 'true' %]
+        <li class="nav-item m-2">
+            <a class="nav-link active" href="[% mkurl('ebook_circs',{},1) %]">[% l("E-Items Currently Checked Out") %]</a>
+        </li>
+        [%- END %]
+        <li class="nav-item active m-2">
+            <a class="nav-link not_active_pill" href="[% mkurl('circ_history',{},1) %]">[% l("Check Out History") %]</a>
+        </li>
+    </ul>
+       </div>
+
+    <div class="header_middle">
+        <span class="float-left">[% l('E-Items Currently Checked Out') %]</span>
+    </div>
+    <div class="clear-both"></div>
+    <div id="no_ebook_circs" class="warning_box hidden">[% l('You have no e-items checked out.') %]</div>
+    <div id="ebook_spinner"><img src="[% ctx.media_prefix %]/opac/images/progressbar_green.gif[% ctx.cache_key %]" alt="[% l("Loading...") %]"/></div>
+    <div id='ebook_circs_main' class="hidden">
+        <table id="ebook_circs_main_table"
+            title="[% l('E-Items Currently Checked Out') %]"
+            class="table table-hover miniTable w-100 ecircsTable">
+            <thead>
+            <tr>
+                <th>[% l("Title") %]</th>
+                <th>[% l("Author") %]</th>
+                <th>[% l("Due Date") %]</th>
+                <th>[% l("Actions") %]</th>
+            </tr>
+            </thead>
+            <tbody id="ebook_circs_main_table_body"></tbody>
+        </table>
+    </div>
+</div>
+[% END %]
diff --git a/Open-ILS/src/templates-bootstrap/opac/myopac/ebook_holds.tt2 b/Open-ILS/src/templates-bootstrap/opac/myopac/ebook_holds.tt2
new file mode 100644 (file)
index 0000000..737475c
--- /dev/null
@@ -0,0 +1,57 @@
+[%  PROCESS "opac/parts/header.tt2";
+    PROCESS "opac/parts/misc_util.tt2";
+    PROCESS "opac/parts/hold_status.tt2";
+    PROCESS "opac/parts/myopac/column_sort_support.tt2";
+    WRAPPER "opac/parts/myopac/base.tt2";
+     myopac_page = "ebook_holds";
+    limit = (ctx.holds_limit.defined) ? ctx.holds_limit : 0;
+    offset = (ctx.holds_offset.defined) ? ctx.holds_offset : 0;
+    count = (ctx.holds_ids.size.defined) ? ctx.holds_ids.size : 0;
+%]
+<h3 class="sr-only">[% l('My E-Item Holds') %]</h3>
+<div id='myopac_holds_div'>
+
+       <div class="mb-3">
+       <ul class="nav nav-pills nav-fill">
+        <li class="nav-item m-2">
+            <a href='[% mkurl('holds', {}, ['limit','offset','available','sort','sort_type']) %]' class="nav-link not_active_pill">[% l("Items on Hold") %]</a>
+        </li>
+        [% IF ebook_api.enabled == 'true' %]
+        <li class="nav-item m-2">
+            <a href='#' class="nav-link active">[% l("E-Items on Hold") %]</a>
+        </li>
+        <li class="nav-item m-2">
+            <a href='[% mkurl('ebook_holds_ready', {}, ['limit','offset','available','sort','sort_type']) %]' class="nav-link not_active_pill">[% l("E-Items Ready for Checkout") %]</a>
+        </li>
+        [% END %]
+        <li class="nav-item m-2">
+            <a href='[% mkurl('hold_history', {}, ['limit','offset','available','sort','sort_type']) %]' class="nav-link not_active_pill">[% l("Holds History") %]</a>
+        </li>
+        </ul>
+    </div>
+    <div class="header_middle">
+        <span class="float-left">[% l('E-Items on Hold') %]</span>
+    </div>
+    <div class="clear-both"></div>
+    <div id="no_ebook_holds" class="warning_box hidden">[% l('You have no e-item holds.') %]</div>
+    <div id="ebook_cancel_hold_failed" class="warning_box hidden">[% l('Hold could not be canceled.') %]</div>
+    <div id="ebook_cancel_hold_succeeded" class="success hidden">[% l('Your hold has been canceled.') %]</div>
+    <div id="ebook_spinner"><img src="[% ctx.media_prefix %]/opac/images/progressbar_green.gif[% ctx.cache_key %]" alt="[% l("Loading...") %]"/></div>
+    <div id='ebook_holds_main' class="hidden">
+        <table id="ebook_holds_main_table"
+            title="[% l('E-Items on Hold') %]"
+            class="table table-hover miniTable w-100 eholdsTable">
+            <thead>
+            <tr>
+                <th>[% l("Title") %]</th>
+                <th>[% l("Author") %]</th>
+                <th>[% l("Expire Date") %]</th>
+                <th>[% l("Status") %]</th>
+                <th>[% l("Actions") %]</th>
+            </tr>
+            </thead>
+            <tbody id="ebook_holds_main_table_body"></tbody>
+        </table>
+    </div>
+</div>
+[% END %]
diff --git a/Open-ILS/src/templates-bootstrap/opac/myopac/ebook_holds_ready.tt2 b/Open-ILS/src/templates-bootstrap/opac/myopac/ebook_holds_ready.tt2
new file mode 100644 (file)
index 0000000..83fd8b9
--- /dev/null
@@ -0,0 +1,54 @@
+[%  PROCESS "opac/parts/header.tt2";
+    PROCESS "opac/parts/misc_util.tt2";
+    PROCESS "opac/parts/hold_status.tt2";
+    PROCESS "opac/parts/myopac/column_sort_support.tt2";
+    WRAPPER "opac/parts/myopac/base.tt2";
+    myopac_page = "ebook_holds_ready";
+    limit = (ctx.holds_limit.defined) ? ctx.holds_limit : 0;
+    offset = (ctx.holds_offset.defined) ? ctx.holds_offset : 0;
+    count = (ctx.holds_ids.size.defined) ? ctx.holds_ids.size : 0;
+%]
+<h3 class="sr-only">[% l('E-Items Ready for Checkout') %]</h3>
+<div id='myopac_holds_div'>
+       <div class="mb-3">
+       <ul class="nav nav-pills nav-fill">
+        <li class="nav-item m-2">
+            <a href='[% mkurl('holds', {}, ['limit','offset','available','sort','sort_type']) %]' class="nav-link not_active_pill">[% l("Items on Hold") %]</a>
+        </li>
+        [% IF ebook_api.enabled == 'true' %]
+        <li class="nav-item m-2">
+            <a href='[% mkurl('ebook_holds', {}, ['limit','offset','available','sort','sort_type']) %]' class="nav-link not_active_pill">[% l("E-Items on Hold") %]</a>
+        </li>
+        <li class="nav-item m-2">
+            <a href='#' class="nav-link active">[% l("E-Items Ready for Checkout") %]</a>
+        </li>
+        [% END %]
+        <li class="nav-item m-2">
+            <a href='[% mkurl('hold_history', {}, ['limit','offset','available','sort','sort_type']) %]' class="nav-link not_active_pill">[% l("Holds History") %]</a>
+        </li>
+        </ul>
+    </div>
+    
+    <div class="header_middle">
+        <span class="float-left">[% l('E-Items Ready for Checkout') %]</span>
+    </div>
+    <div class="clear-both"></div>
+    <div id="no_ebook_holds" class="warning_box hidden">[% l('You have no e-item holds ready to be checked out.') %]</div>
+    <div id="ebook_spinner"><img src="[% ctx.media_prefix %]/opac/images/progressbar_green.gif[% ctx.cache_key %]" alt="[% l("Loading...") %]"/></div>
+    <div id='ebook_holds_main' class="hidden">
+        <table id="ebook_holds_main_table"
+            title="[% l('E-Items Ready for Checkout') %]"
+            class="table table-hover miniTable w-100 eholdsreadyTable">
+            <thead>
+            <tr>
+                <th>[% l("Title") %]</th>
+                <th>[% l("Author") %]</th>
+                <th>[% l("Expire Date") %]</th>
+                <th>[% l("Actions") %]</th>
+            </tr>
+            </thead>
+            <tbody id="ebook_holds_main_table_body"></tbody>
+        </table>
+    </div>
+</div>
+[% END %]
diff --git a/Open-ILS/src/templates-bootstrap/opac/myopac/hold_history.tt2 b/Open-ILS/src/templates-bootstrap/opac/myopac/hold_history.tt2
new file mode 100644 (file)
index 0000000..1ee3589
--- /dev/null
@@ -0,0 +1,125 @@
+[%  PROCESS "opac/parts/header.tt2";
+    PROCESS "opac/parts/misc_util.tt2";
+    PROCESS "opac/parts/hold_status.tt2";
+    WRAPPER "opac/parts/myopac/base.tt2";
+    myopac_page = "holds";
+    limit = ctx.hold_history_limit;
+    offset = ctx.hold_history_offset;
+    count = ctx.hold_history_ids.size;
+%]
+
+<h3 class="sr-only">[% l('Holds History') %]</h3>
+<div id='myopac_holds_div'>
+
+
+       <div>
+       <ul class="nav nav-pills nav-justified">
+        <li class="nav-item m-2">
+            <a href='[% mkurl('holds',{},['limit','offset']) %]' class="nav-link not_active_pill">[% l("Items on Hold") %]</a>
+        </li>
+        [% IF ebook_api.enabled == 'true' %]
+        <li class="nav-item m-2">
+            <a href='[% mkurl('ebook_holds', {}, ['limit','offset','available','sort','sort_type']) %]' class="nav-link not_active_pill">[% l("E-Items on Hold") %]</a>
+        </li>
+        <li class="nav-item m-2">
+            <a href='[% mkurl('ebook_holds_ready', {}, ['limit','offset','available','sort','sort_type']) %]' class="nav-link not_active_pill">[% l("E-Items Ready for Checkout") %]</a>
+        </li>
+        [% END %]
+        <li class="nav-item m-2">
+            <a href='#' class="nav-link active">[% l("Holds History") %]</a>
+        </li>
+        </ul>
+    </div>
+    
+  
+<div class="my-4">
+    <div class="header_middle">
+        <span style="float:left;">[% l("Previously Held Items") %]</span>
+        <span class='float-left' style='padding-left: 10px;'>
+            <a href='[% mkurl('hold_history', {limit => limit,offset => (offset - limit)}) %]'
+                [% IF offset == 0 %] class='invisible' [% END %]><span class="nav_arrow_fix">&#9668;</span>[% l('Previous') %]</a>
+            [% IF offset > 0 || count > limit;
+                curpage = 0;
+                WHILE curpage * limit < count;
+                    IF curpage * limit == offset;
+            %]
+            [% curpage + 1 %]
+                    [%- ELSE %]
+            <a href='[% mkurl('hold_history', {limit => limit, offset => (curpage * limit)}) %]'>[% curpage + 1 %]</a>
+                    [%- END;
+                    curpage = curpage + 1;
+                END;
+            END %]
+            <a href='[% mkurl('hold_history', {limit => limit, offset => (offset + limit)}) %]'
+               [% IF count <= limit + offset %] class='invisible' [% END %] >[% l('Next') %]<span class="nav_arrow_fix">&#9658;</span></a>
+        </span>
+        <span style="float:right;">
+            <a class="hide_me" href="#">[% l('Export List') %]</a>
+        </span>
+    </div>
+    <div class="clear-both"></div>
+
+    <div id='holds_main'>
+        [% IF ctx.holds.size && ctx.holds.size < 1 %]
+        <div class="warning_box">
+            <big><strong>[% l('No holds found.') %]</strong></big>
+        </div>
+        [% ELSE %]
+        <table id='acct_holds_hist_header' class='table table-hover miniTable holdHistoryTable' title="[% l('History of items on hold') %]">
+            <thead>
+                <tr>
+                    <th><span>[% l('Title') %]</span></th>
+                    <th><span>[% l('Author') %]</span></th>
+                    <th> <span>[% l('Format') %]</span></th>
+                    <th><span>[% l('Pickup Location') %]</span> </th>
+                    <th><span>[% l('Status') %]</span></th>
+                </tr>
+            </thead>
+            <tbody>
+                [% FOR hold IN ctx.holds;
+                    attrs = {marc_xml => hold.marc_xml};
+                    PROCESS get_marc_attrs args=attrs;
+                    ahr = hold.hold.hold %]
+
+                <tr name="acct_holds_temp">
+                   
+                    <td>
+                    <span class="sr-only">Title</span>
+                        <div>
+                            <a href="[% mkurl(ctx.opac_root _ '/record/' _ hold.hold.bre_id) %]">[% attrs.title | html %]</a>
+                        </div>
+                    </td>
+                    <td>
+                    <span class="sr-only">Author</span>
+                        <div>
+                            <a href="[% mkurl(ctx.opac_root _ '/results',
+                                {qtype => author, query => attrs.author.replace('[,\.:;]', '')}
+                            ) %]">[% attrs.author | html %]</a>
+                        </div>
+                    </td>
+                    <td>
+                        <div class='format_icon'>
+                            [% IF attrs.format_icon %]
+                            <img title="[% attrs.format_label | html %]" alt="[% attrs.format_label | html %]" src="[% attrs.format_icon %][% ctx.cache_key %]" />
+                            [% END %]
+                        </div>
+                         <span class="sr-only">Format [% attrs.format_label | html %]</span>
+                    </td>
+                    <td>
+                    <span class="sr-only">Pickup Location</span>
+                        [% ctx.get_aou(ahr.pickup_lib).name | html %]
+                    </td>
+                    <td>
+                    <span class="sr-only">Hold Status</span>
+                        <div name="acct_holds_status">
+                            [% PROCESS get_hold_status hold=hold; %]
+                        </div>
+                    </td>
+                </tr>
+                [% END %]
+            </tbody>
+        </table>
+        [% END %]
+    </div></div>
+</div>
+[% END %]
diff --git a/Open-ILS/src/templates-bootstrap/opac/myopac/holds.tt2 b/Open-ILS/src/templates-bootstrap/opac/myopac/holds.tt2
new file mode 100644 (file)
index 0000000..960d67c
--- /dev/null
@@ -0,0 +1,275 @@
+[%  PROCESS "opac/parts/header.tt2";
+    PROCESS "opac/parts/misc_util.tt2";
+    PROCESS "opac/parts/hold_status.tt2";
+    PROCESS "opac/parts/myopac/column_sort_support.tt2";
+    WRAPPER "opac/parts/myopac/base.tt2";
+    myopac_page = "holds";
+    limit = (ctx.holds_limit.defined) ? ctx.holds_limit : 0;
+    offset = (ctx.holds_offset.defined) ? ctx.holds_offset : 0;
+    count = (ctx.holds_ids.size.defined) ? ctx.holds_ids.size : 0; 
+%]
+<h3 class="sr-only">[% l('My Holds') %]</h3>
+<div id='myopac_holds_div'>
+    <div class="mb-3">
+       <ul class="nav nav-pills nav-fill">
+        <li class="nav-item m-2">
+            <a href='#' class="nav-link active">[% l("Items on Hold") %]</a>
+        </li>
+        [% IF ebook_api.enabled == 'true' %]
+        <li class="nav-item m-2">
+            <a href='[% mkurl('ebook_holds', {}, ['limit','offset','available','sort','sort_type']) %]' class="nav-link not_active_pill">[% l("E-Items on Hold") %]</a>
+        </li>
+        <li class="nav-item m-2">
+            <a href='[% mkurl('ebook_holds_ready', {}, ['limit','offset','available','sort','sort_type']) %]' class="nav-link not_active_pill">[% l("E-Items Ready for Checkout") %]</a>
+        </li>
+        [% END %]
+        <li class="nav-item m-2">
+            <a href='[% mkurl('hold_history', {}, ['limit','offset','available','sort','sort_type']) %]' class="nav-link not_active_pill">[% l("Holds History") %]</a>
+        </li>
+        </ul>
+    </div>
+       <div class="my-4">
+    <div class="header_middle">
+        <span id="acct_holds_header" style="float:left;">
+            [%  IF CGI.param("available");
+                    l("Items Ready for Pickup");
+                ELSE;
+                    l("Current Items on Hold");
+                END
+            %]
+        </span>
+    </div>
+    <div class="clear-both"></div>
+    <div id='holds_main'>
+    <form method="post">
+           <div class="row">
+                <span class="col-md-11 my-2">
+                       <select class="form-control" name="action" id="acct_holds_actions" 
+                      title="[% l('Select your action for the selected holds') %]">
+                        <option id='myopac_holds_actions_none' value=''>
+                        -- [% l("Actions for selected holds") %] --
+                        </option>
+                        <option value='suspend'>[% l("Suspend") %]</option>
+                        <option value='activate'>[% l("Activate") %]</option>
+                        <!-- XXX maybe later <option value='thaw_date'>[% l("Set Active Date") %]</option> -->
+                        <option value='cancel'>[% l("Cancel") %]</option>
+                    </select>
+                </span>
+                <span class="col-md-1 my-2">
+                    <input type="submit" value="[% l('Go') %]"
+                        title="[% l('Go') %]" class="btn btn-confirm" />
+                </span>
+          </div>
+
+          <div class="row">
+            <div class="col-3 text-left">
+                <a href='[% mkurl('holds', {limit => limit,offset => (offset - limit)}) %]'
+                [% IF offset <= 0 %] class='invisible' [% END %]><span class="np_nav_link classic_link btn btn-outline-primary">&#9668;[% l('Previous') %]</span></a>
+                    [% IF offset > 0 || count > limit; curpage = 0; WHILE curpage * limit < count; IF curpage * limit == offset; %]
+                        [% curpage + 1 %]
+                    [%- ELSE %]
+                <a href='[% mkurl('holds', {limit => limit, offset => (curpage * limit)}) %]' class="np_nav_link classic_link btn btn-outline-primary">[% curpage + 1 %]</a>
+                    [%- END; curpage = curpage + 1; END; END %]
+            </div>
+            <div class="col-6 text-center">
+                <span style="padding-left:5px;" class='error'>
+                    [%  IF ctx.hold_suspend_post_capture; l('One or more holds could not be suspended because the item is at (or en route to) the pickup library.'); END; %]
+                </span>
+            
+               <span>
+                    [% IF CGI.param("available") -%]
+                    <a href="[% mkurl('holds', {}, ['limit','offset','available']) %]">[% l('Show all holds') %]</a> |
+                    <strong>[% l("Show only available holds") %]</strong>
+                    [% ELSE -%]
+                    <strong>[% l("Show all holds") %]</strong> |
+                    <a href="[% mkurl('holds',{available => 1},['limit','offset']) %]">[% l("Show only available holds") %]</a>
+                    [% END -%]
+               </span>
+                <a href="#">
+                    <img alt="[% l('Holds Help') %]" title="[% l('Actions for selected holds') %]" src="[% ctx.media_prefix %]/images/question-mark.png[% ctx.cache_key %]" />
+                </a>
+            </div>
+
+            <div class="col-3 text-right">  
+                <a href='[% mkurl('holds', {limit => limit, offset => (offset + limit)}) %]'
+               [% IF count <= limit + offset %] class='invisible' [% END %] ><span class="np_nav_link classic_link btn btn-outline-primary">[% l('Next') %]&#9658;</span></a>
+            </div>
+          </div>
+                    
+        [% IF ctx.holds.size && ctx.holds.size < 1 %]
+        <div class="warning_box">[% l('No holds found.') %]</div>
+        [% ELSE %]
+        <table title="[% l('Items on Hold') %]"
+        class="table table-hover miniTable activeHoldstable w-100 my-3">
+            <thead>
+            <tr>
+                <th class="checkbox_column"> 
+                    <input type="checkbox" title="[% l('Select All Holds') %]"
+                      onclick="var inputs=document.getElementsByTagName('input'); for (i = 0; i < inputs.length; i++) { if (inputs[i].name == 'hold_id' &amp;&amp; !inputs[i].disabled) inputs[i].checked = this.checked;}"/>
+                </th>
+                <th>[% sort_head("sort_title", l('Title')) %]</th>
+                <th>[% sort_head("author", l('Author')) %]</th>
+                <th>[% sort_head("format", l('Format')) %]</th>
+                <th>[% l('Pickup Location') %]</th>
+                <th>[% l('Cancel if not filled by') %]</th>
+                <th>[% l('Status') %]</th>
+                <th>[% l('Notes') %]</th>
+            </tr>
+            </thead>
+            <tbody id="holds_temp_parent">
+
+                [%# Copy the ctx.holds into a local array, then add a SORT field
+                    that contains the value to sort on.  Since we need the item attrs,
+                    invoke it and save the result in ATTRS.
+               %]
+               [% 
+                hold_items = ctx.holds;
+
+                sort_field = CGI.param('sort');
+
+                FOR hold IN hold_items;
+                    hold.ATTRS = {marc_xml => hold.marc_xml};
+                    PROCESS get_marc_attrs args=hold.ATTRS;
+
+                    SWITCH sort_field;
+
+                       CASE "sort_title";
+                          hold.SORTING = hold.ATTRS.sort_title;
+
+                       CASE "author";
+                          hold.SORTING = hold.ATTRS.author;
+
+                       CASE "format";
+                          hold.SORTING = hold.ATTRS.format_label;
+                       
+                       CASE;
+                          sort_field = "";
+                    END; # SWITCH
+                END; #FOR hold
+
+                IF (sort_field != "sort_title");
+                   deemphasize_class = "";
+                ELSE;
+                   deemphasize_class = " class=\"sort_deemphasize\"";
+                END;
+
+                # Apply sorting to hold_items
+               IF (sort_field != "");
+                   hold_items = hold_items.sort("SORTING");
+                    IF (CGI.param("sort_type") == "desc");
+                        hold_items = hold_items.reverse;
+                    END;
+
+                    # Shorten the hold_items list per offset/limit/count 
+                    hi = offset + limit - 1;
+                    hi = hi > hold_items.max ? hold_items.max : hi;
+
+                    hold_items = hold_items.slice(offset, hi);
+                END;
+
+               # hold_items list is now sorted.  Traverse and dump the information.
+                cnt = 0;
+                FOR hold IN hold_items;
+                    ahr = hold.hold.hold;
+                    cnt = cnt + 1;
+                     %]
+                <tr name="acct_holds_temp"
+                    class="[% ahr.frozen == 't' ? ' inactive-hold' : '' %]">
+                    <td class="checkbox_column">
+
+                    <span class="sr-only">Hold Number [%  cnt; %]</span>
+                        <input type="checkbox" name="hold_id" value="[% ahr.id %]" 
+                            [% html_text_attr('title', l('Select hold [_1]', attrs.title)) %]/>
+                    </td>
+                    <td>
+                    <span class="sr-only">Title</span>
+                        <div>
+                            [% title = hold.ATTRS.title;
+                            IF ahr.hold_type == 'P';
+                               title = l('[_1] ([_2])', title, hold.hold.part.label);
+                            END; %]
+
+                            <a href="[% mkurl(ctx.opac_root _ '/record/' _ 
+                                hold.hold.bre_id, {}, 1) %]"
+                                name="[% l('Catalog record') %]"><span[%- deemphasize_class -%]>
+                                [%- title.substr(0,hold.ATTRS.nonfiling_characters) | html %]</span>
+                                [%- title.substr(hold.ATTRS.nonfiling_characters)   | html %]</a>
+                        </div>
+                    </td>
+                    <td>
+                    <span class="sr-only">Author</span>
+                        <div>
+                            <a href="[% mkurl(ctx.opac_root _ '/results',
+                                {qtype => 'author', query => hold.ATTRS.author.replace('[,\.:;]', '')},
+                                1
+                            ) %]">[% hold.ATTRS.author | html %]</a>
+                        </div>
+                    </td>
+                    <td>
+                    <span class="sr-only">Format</span>
+                        <div class="format_icon">
+                          [% 
+                            formats = hold.ATTRS.all_formats;
+                            IF ahr.hold_type == 'M';
+                              # only show selected formats for metarecords
+                              formats = [];
+                              FOR ccvm IN hold.metarecord_selected_filters.icons;
+                                NEXT IF ccvm.opac_visible == 'f';
+                                format = {};
+                                format.label = ccvm.search_label || ccvm.value;
+                                format.icon = PROCESS get_ccvm_icon ccvm=ccvm;
+                                formats.push(format);
+                              END;
+                            END;
+                            FOR format IN formats 
+                          %]
+                          <span class="sr-only">[% format.label | html %]</span>
+                            <img title="[% format.label | html %]" 
+                              alt="[% format.label | html %]" src="[% format.icon %][% ctx.cache_key %]" />
+                            [% END %]
+                        </div>
+                    </td>
+                    <td>
+                    <span class="sr-only">Pickup Location</span>
+                        [% ctx.get_aou(ahr.pickup_lib).name | html %]
+                    </td>
+                    <td>
+                    <span class="sr-only">Cancel if not filled by</span>
+                        [% IF ahr.expire_time;
+                            date.format(ctx.parse_datetime(ahr.expire_time), DATE_FORMAT);
+                        END %]
+                    </td>
+                    <td>
+                    <span class="sr-only">Status</span>
+                        <div name="acct_holds_status">
+                            [% PROCESS get_hold_status hold=hold; %]
+                        </div>
+                    </td>
+                    <td class="hold_notes">
+                    <span class="sr-only">Notes</span>
+                    [%- FOREACH pubnote IN ahr.notes;
+                        IF pubnote.pub == 't';
+                    %]
+                        <div class="hold_note">
+                            <span class="hold_note_title">[% pubnote.title | html %]</span>
+                            <br />
+                            <span class="hold_note_body">[% pubnote.body | html %]</span>
+                        </div>
+                    [%- END; END; %]
+                    </td>
+                    <td class="fullRow">
+                        <a class="btn btn-confirm btn-sm" href="[% mkurl(ctx.opac_root _ '/myopac/holds/edit', {hid => ahr.id}) %]"
+                            [% html_text_attr('title', l('Edit hold for item [_1]', attrs.title)) %]>
+                            [% l('Edit') %]
+                        </a>
+                    </td>
+                </tr>
+                [% END %]
+            </tbody>
+        </table>
+        </div>
+        [% END %]
+        </form>
+    </div></div>
+</div>
+[% END %]
diff --git a/Open-ILS/src/templates-bootstrap/opac/myopac/holds/edit.tt2 b/Open-ILS/src/templates-bootstrap/opac/myopac/holds/edit.tt2
new file mode 100644 (file)
index 0000000..eeff1fb
--- /dev/null
@@ -0,0 +1,123 @@
+[%  PROCESS "opac/parts/header.tt2";
+    PROCESS "opac/parts/misc_util.tt2";
+    PROCESS "opac/parts/hold_status.tt2";
+    PROCESS "opac/parts/org_selector.tt2";
+    PROCESS "opac/parts/metarecord_hold_filters.tt2";
+    WRAPPER "opac/parts/myopac/base.tt2";
+    myopac_page = "holds"; # in this case, just for tab coloring.
+
+    hold = ctx.holds.0;
+    ahr = hold.hold.hold;
+    attrs = {marc_xml => hold.marc_xml};
+    PROCESS get_marc_attrs args=attrs;
+    hold.human_status = PROCESS get_hold_status hold=hold;
+
+    # Do this up front to avoid verbosity later
+    expire_time = ahr.expire_time ? date.format(ctx.parse_datetime(ahr.expire_time), DATE_FORMAT) : '';
+    thaw_date = ahr.thaw_date ? date.format(ctx.parse_datetime(ahr.thaw_date), DATE_FORMAT) : '';
+%]
+<h3 class="sr-only">[% l('Edit Hold') %]</h3>
+<div class="pad-bottom-five">
+    <div class="header_middle">
+        <span id="acct_holds_header float-left">[% l('Editing Hold') %]</span>
+        &nbsp; &nbsp; &nbsp; &nbsp;
+        <a href="[% ctx.opac_root %]/myopac/holds" class="float-right">[% l('List all holds') %]</a>
+    </div>
+    <div id="hold_editor" class="mt-4">
+        [%  IF hold;
+                title = attrs.title;
+                IF ahr.hold_type == 'P';
+                    title = l('[_1] ([_2])', title, hold.hold.part.label);
+                END 
+        %]<div class="my-4">
+            <h1>[% title | html %]</h1>
+            <h2>[% attrs.author | html %]</h2>
+            [% IF attrs.format_icon %]<p>
+             <strong>[% l('Format:') %]</strong>
+                <img src="[% attrs.format_icon %]" alt="[% attrs.format_label | html %]" title="[% attrs.format_label | html %]" />
+            </p>[% END %]</div>
+                <p>
+                <strong>[% l('Status') %]</strong>: [% hold.human_status %]
+                </p>
+            <form method="post">
+                <table id="hold_editor_table" >
+                    <tr>
+                        <th>
+                            <input type="hidden" name="action" value="edit" />
+                            <input type="hidden" name="hold_id"
+                                value="[% ahr.id %]" />
+                            [% l('Pickup library') %]
+                        </th>
+                        <td>
+                            [% INCLUDE build_org_selector
+                                name='pickup_lib' value=ahr.pickup_lib 
+                                can_have_vols_only=1 hold_pickup_lib=1 %]
+                        </td>
+                    </tr>
+                    [% IF hold.hold.status < 3 OR hold.hold.status == 7 %]
+                    [%# The following actions cannot be performed on holds that 
+                        have already been captured... %]
+                    <tr>
+                        <th>
+                            [% l('Cancel unless filled by') %]
+                        </th>
+                        <td>
+                            <input class="form-control" type="text" name="expire_time"
+                                value="[% expire_time | html %]" />
+                               <p><em>[% l('Enter date in MM/DD/YYYY format') %]</em></p>
+                            <!-- XXX TODO pick out a minimal, simple, reliable
+                            calendar widget that's not part of some giant,
+                            bloated framework and doesn't do anything at onload.
+                            -->
+                           
+                        </td>
+                    </tr>
+                    <tr>
+                        <th>
+                            [% l('Active?') %]
+                        </th>
+                        <td>
+                            <select class="form-control" name="frozen">
+                                <option value="f"[% ahr.frozen == 't' ? '' :' selected="selected"' %]>
+                                    [% l('Yes, this hold is active now') %]
+                                </option>
+                                <option value="t"[% ahr.frozen == 't' ? ' selected="selected"' : '' %]>
+                                    [% l('No, this hold is suspended') %]
+                                </option>
+                            </select>
+                        </td>
+                    </tr>
+                    <tr>
+                        <th>
+                            [% l('If suspended, activate on') %]
+                        </th>
+                        <td>
+                            <input class="form-control" type="text" name="thaw_date"
+                                value="[% thaw_date | html %]" />
+                                <p><em>[% l('Enter date in MM/DD/YYYY format') %]</em></p>
+                        </td>
+                    </tr>
+                    [% END %]
+                      
+                    <tr><td colspan='4'>
+                    [% IF hold.metarecord_filters.formats.size OR
+                        (hold.metarecord_filters.langs.size.defined && hold.metarecord_filters.langs.size > 1);
+                            PROCESS metarecord_hold_filters_selector 
+                                hold_data=hold; END %]
+                    </td></tr>
+                    <tr>
+                        <td colspan="2" class="hold-editor-controls">
+                            
+                            <input type="submit" value="[% l('Submit') %]" class="btn btn-confirm" />
+                            <a href="[% ctx.opac_root %]/myopac/holds"><button 
+                                class="btn btn-deny">[% l('Go Back') %]</button></a>
+                        </td>
+                    </tr>
+                </table>
+            </form>
+        [% ELSE;
+            l('Hold not found');
+        END %]
+    </div>
+</div>
+[% END %]
diff --git a/Open-ILS/src/templates-bootstrap/opac/myopac/lists.tt2 b/Open-ILS/src/templates-bootstrap/opac/myopac/lists.tt2
new file mode 100644 (file)
index 0000000..e9e2738
--- /dev/null
@@ -0,0 +1,518 @@
+[%  PROCESS "opac/parts/header.tt2";
+    PROCESS "opac/parts/misc_util.tt2";
+    WRAPPER "opac/parts/myopac/base.tt2";
+    myopac_page = "lists"  
+    limit = ctx.bookbags_limit;
+    offset = ctx.bookbags_offset;
+    item_page = ctx.bookbags_item_page;
+    bb_publish_text = l(
+"Sharing a list means that the contents " _
+"of the list will be visible to others. " _
+"To see the public view of a shared list, " _
+"click on the HTML View link in the Saved Lists section.");
+%]
+<h3 class="sr-only">[% l('My Lists') %]</h3>
+<div id='myopac_bookbag_div' style="padding:5px;">
+
+    <!-- new list creation -->
+    <form action="[% mkurl(ctx.opac_root _ '/myopac/list/update') %]" method="post" id="create_form">
+        <h1>[% l('Create New List') %]</h1><a name="createnewlist"></a>
+        <table class="table" >
+            <tr>
+                <td class="list_create_table_label">
+                    <label for="list_create_name">[% l('Enter the name of the new list:') %]</label>
+                </td>
+                <td class="px-3 my-2">
+                    [%- INCLUDE "opac/parts/preserve_params.tt2"; %]
+                    <input id="list_create_name" type="text" name="name" class="form-control"/>
+                    <input type="hidden" name="action" value="create" class="form-control" />
+                    [% IF ctx.add_rec %]
+                    <input type="hidden" name="add_rec" value="[% ctx.add_rec %]" class="form-control" />
+                    [% END %]
+                    [% IF ctx.where_from %]
+                    <input type="hidden" name="where_from" value="[% ctx.where_from %]" class="form-control" />
+                    [% END %]
+                </td>
+            </tr>
+            <tr>
+                <td class="list_create_table_label">
+                    <label for="list_description">[% l("List description (optional):") %]</label>
+                </td>
+                <td class="px-3">
+                    <textarea name="description" id="list_description" class="form-control"></textarea>
+                </td>
+            </tr>
+            <tr>
+                <td class="list_create_table_label">
+                    <label for="list_create_shared">[% l('Share this list?') %]</label>
+                </td>
+                <td class="px-3">
+                    <select class="form-control mini-control" name="shared" id="list_create_shared">
+                        <option value="0">[% l('No') %]
+                        <option value="1">[% l('Yes') %]
+                    </select>
+                   
+                    <a href="javascript:void(0);" 
+                        onclick="alert('[% bb_publish_text %]')" >
+                        <img data-toggle="tooltip" data-placement="top" alt="[% l('Sharing Help') %]"
+                            [% html_text_attr('title', bb_publish_text) %]
+                            src="[% ctx.media_prefix %]/images/question-mark.png[% ctx.cache_key %]" />
+                    </a> 
+                </td>
+            </tr>
+            [% IF ctx.mylist.size %]
+            <tr>
+                <td class="list_create_table_label">
+                    <label for="list_move_cart">[% l('Move contents of basket to this list?') %]</label>
+                </td>
+                <td>
+                    <select name="move_cart" id="list_move_cart">
+                        <option value="0">[% l('No') %]
+                        <option value="1" [% IF CGI.param('move_cart_by_default') %]selected="selected"[% END%]>[% l('Yes') %]
+                    </select>
+                </td>
+            </tr>
+            [% END %]
+            <tr>
+                <td>&nbsp;</td>
+                <td class="list-create-table-buttons">
+                    <input type="reset"
+                        value="[% l('Cancel') %]"
+                        alt="[% l('Cancel') %]"
+                        class="btn btn-deny" />
+                    &nbsp;&nbsp;&nbsp;
+                    <input type="submit"
+                        value="[% l('Submit') %]"
+                        alt="[% l('Submit') %]"
+                        class="btn btn-confirm"/>
+                </td>
+            </tr>
+        </table>
+    </form>
+
+      [% IF CGI.param('from_basket'); %]
+    <h1>[% l("... from basket") %]</h1>
+    [% INCLUDE "opac/parts/anon_list.tt2" %]
+    [% ELSE %]
+    <h1>[% l("My Existing Basket and Lists") %]</h1>
+    [% INCLUDE "opac/parts/anon_list.tt2" %]
+    
+    [% IF ctx.bookbags.size %]
+    <div class="header_middle">
+        <span class="float-left">[% l('Saved Lists') %]</span>
+        [% IF limit < ctx.bookbag_count; %]
+        <span class='float-left' style='padding-left: 10px;'>
+            [%- IF offset > 0 -%]
+                <a href='[% mkurl(ctx.opac_root _ '/myopac/lists', {
+                    offset => (offset - limit)
+                }) %]'><span class="nav_arrow_fix">&#9668;</span>[% l('Previous') %]</a>
+            [%- END; -%]
+            [%- IF (offset - (limit * 3)) >= 0 -%]
+                <a href='[% mkurl(ctx.opac_root _ '/myopac/lists', {
+                    offset => (offset - (limit * 3))
+                }) %]'>[% ((offset - (limit * 3)) / limit) + 1 %]</a>
+            [%- END; -%]
+            [%- IF (offset - (limit * 2)) >= 0 -%]
+                <a href='[% mkurl(ctx.opac_root _ '/myopac/lists', {
+                    offset => (offset - (limit * 2))
+                }) %]'>[% ((offset - (limit * 2)) / limit) + 1 %]</a>
+            [%- END; -%]
+            [%- IF (offset - limit) >= 0 -%]
+                <a href='[% mkurl(ctx.opac_root _ '/myopac/lists', {
+                    offset => (offset - limit)
+                }) %]'>[% ((offset - limit) / limit) + 1 %]</a>
+            [%- END; -%]
+            <span class="bookbag-paginator-selected" >[% (offset / limit) + 1 %]</span>
+            [%- IF (offset + limit) < ctx.bookbag_count -%]
+                <a href='[% mkurl(ctx.opac_root _ '/myopac/lists', {
+                    offset => (offset + limit)
+                }) %]'>[% ((offset + limit) / limit) + 1 %]</a>
+            [%- END; -%]
+            [%- IF (offset + (limit * 2)) < ctx.bookbag_count -%]
+                <a href='[% mkurl(ctx.opac_root _ '/myopac/lists', {
+                    offset => (offset + (limit * 2))
+                }) %]'>[% ((offset + (limit * 2)) / limit) + 1 %]</a>
+            [%- END; -%]
+            [%- IF (offset + (limit * 3)) < ctx.bookbag_count -%]
+                <a href='[% mkurl(ctx.opac_root _ '/myopac/lists', {
+                    offset => (offset + (limit * 3))
+                }) %]'>[% ((offset + (limit * 3)) / limit) + 1 %]</a>
+            [%- END; -%]
+            [%- IF (ctx.bookbag_count - offset) > limit; -%] 
+                <a href='[% mkurl(ctx.opac_root _ '/myopac/lists', {
+                    offset => (offset + limit)
+                }) %]'>[% l('Next') %]<span class="nav_arrow_fix">&#9658;</span></a>
+            </span>
+            [%- END; -%]
+        [% END %]
+    </div>
+    <div class="clear-both"></div>
+
+    <div id='acct_lists_prime'>
+        [% FOR bbag IN ctx.bookbags %]
+        <div>
+         <table class="table"><tr>
+            <td width="30%">
+            <div class="bookbag-controls-title-block">
+                [% baseurl = ctx.opac_root _ '/myopac/lists';
+                IF bbag.id != CGI.param("bbid");
+                    url = mkurl(baseurl,{bbid => bbag.id, item_page => 1},['edit_notes','sort']);
+                    ltitle = l("Show items in list");
+                ELSE;
+                    url = mkurl(baseurl, {}, ['bbid', 'edit_notes', 'sort']);
+                    ltitle = l("Hide items in list");
+                END %]
+                <h2 class="bookbag-name"><a title="[% ltitle %]" href="[% url %]">[% bbag.name | html %]</a></h2>
+                [% IF bbag.description %]<div class="bookbag-description">[% bbag.description | html %]</div>[% END %]
+            </div>
+            </td>
+           
+            <td>
+            [% IF ctx.add_rec %]
+            <form action="[% mkurl(ctx.opac_root _ '/myopac/list/update', {}, 1) %]" method="post">
+                <div class="bookbag-controls">
+                    <input type="hidden" name="action" value="add_rec" />
+                    <input type="hidden" name="list" value="[% bbag.id %]" />
+                    <input type="hidden" name="add_rec" value="[% ctx.add_rec %]" />
+                    [% IF ctx.where_from %]
+                    <input type="hidden" name="where_from" value="[% ctx.where_from %]" />
+                    [% END %]
+                    <input class="fixed btn btn-secondary btn-sm m-1" type="submit" value="[% l('Add to this list') %]" />
+                </div>
+            </form>
+            [% END %]
+            <form action="[% mkurl(ctx.opac_root _ '/myopac/list/update') %]" method="post">
+                <div class="bookbag-share">
+                    <input type="hidden" name="list" value="[% bbag.id %]" />
+                    [%- INCLUDE "opac/parts/preserve_params.tt2"; %]
+                    [% IF bbag.pub != 't' %]
+                    <input type="hidden" name="action" value="show" />
+                    <input class="class=fixed btn btn-secondary btn-sm m-1" type="submit"  value="[% l('Share') %]" />
+                    [% ELSE %]
+                    <input type="hidden" name="action" value="hide" />
+                    <input class="fixed btn btn-secondary btn-sm m-1" type="submit" value="[% l('Hide') %]" />
+                    [% END %]
+                </div>
+            </form>
+            <form action="[% mkurl(ctx.opac_root _ '/myopac/list/update') %]" method="post" onsubmit="return confirm('[% l('Do you really want to delete this list?') %]')">
+                <div class="bookbag-controls">
+                    <input type="hidden" name="list" value="[% bbag.id %]" />
+                    <input type="hidden" name="action" value="delete" />
+                    [%- INCLUDE "opac/parts/preserve_params.tt2"; %]
+                    <input type="submit" value="[% l('Delete List') %]" class="btn btn-secondary btn-sm m-1"/>
+                </div>
+            </form>
+            <form action="[% mkurl(ctx.opac_root _ '/myopac/list/print') %]" method="post">
+                <div class="bookbag-controls">
+                    <input type="hidden" name="list" value="[% bbag.id %]" />
+                    <input type="hidden" name="sort" value="[% CGI.param('sort') | html %]" />
+                    [%- INCLUDE "opac/parts/preserve_params.tt2"; %]
+                    <input type="submit" value="[% l('Download CSV') %]" class="btn btn-secondary btn-sm m-1"/>
+                </div>
+            </form>
+            [% setting = 'opac.default_list'; %]
+            <form action="[% mkurl(ctx.opac_root _ '/myopac/list/update') %]" method="post">
+                <div class="bookbag-controls">
+                    <input type="hidden" name="list" value="[% bbag.id %]" />
+                    [%- INCLUDE "opac/parts/preserve_params.tt2"; %]
+                    [% IF ctx.user_setting_map.$setting == bbag.id %]
+                    <input type="hidden" name="action" value="remove_default" />
+                    <input type="submit" class="btn btn-secondary btn-sm m-1" value="[% l('Remove Default List') %]" />
+                    [% ELSE %]
+                    <input type="hidden" name="action" value="make_default" />
+                    <input type="submit" class="btn btn-secondary btn-sm m-1" value="[% l('Make Default List') %]" />
+                    [% END %]
+                </div>
+            </form>
+            [% IF ctx.is_staff %]
+            <div class="bookbag-controls">
+                <input 
+                    type="submit" 
+                    onclick='
+                       var path = 
+                          "oils://remote/xul/server/cat/bucketz39_dialog.xul";
+                        window.openDialog(
+                            xulG.url_prefix(path),
+                            "bucketz39_dialog",
+                            "width=800,height=500",
+                            "[% ctx.user.id %]",
+                            "[% ctx.authtoken %]",
+                            "[% ctx.user.ws_ou %]",
+                            "[% bbag.id %]",
+                            xulG
+                        )'
+                    value="[% l('Locate Z39.50 Matches') %]" 
+                />
+            </div>
+            [% END %]
+            <div class="bookbag-controls">
+                [% IF bbag.pub == 't'; %]
+                <a class="btn btn-sm btn-secondary m-1" href='[%-
+                    mkurl(
+                        ctx.opac_root _ '/results',
+                        {page => '0', bookbag => bbag.id, depth => 0, locg => ctx.search_ou},
+                        1
+                    )
+                -%]'>[% l('View in Catalogue') %]</a>
+                [% END %]
+                [% IF bbag.pub == 't'; %]
+                <a target='_blank' href='/opac/extras/feed/bookbag/rss2-full/[% bbag.id %]'><img
+                    alt="[% l('RSS Feed') %]" border="0"
+                    src="[% ctx.media_prefix %]/images/small-rss.png[% ctx.cache_key %]"/></a>
+                [% END %]
+            </div>
+            </td>
+            </tr>
+            </table>
+            <div class="clear-both pad-bottom-five"></div>
+        </div>
+        [% IF CGI.param("bbid") == bbag.id %]
+        <div>
+            [% IF bbag.items.size %]
+                <div class="d-none">
+                    <form method="get" class="form-row">
+                        <label for="opac.result.sort" class="form-row">[% l("Sort list items by: ") %]
+                        [%- INCLUDE "opac/parts/preserve_params.tt2" params=['loc', 'query', 'qtype']; %]
+                        [% INCLUDE "opac/parts/filtersort.tt2"
+                            value=CGI.param('sort') mode='bookbag' class='form-control my-2' %]
+                        <input type="hidden" name="bbid"
+                            value="[% CGI.param('bbid') | html %]"/>
+                        <input type="submit" class="btn btn-confirm btn-sm my-2" value="[% l('Sort') %]" />
+                        </label>
+                    </form>
+                </div>
+            [% END %]
+            <div>
+                <form method="post">
+                    <input type="hidden" name="bbid" value="[% bbag.id %]" />
+                    <input type="hidden" name="action" value="editmeta" />
+                    <input type="hidden" name="limit" value="[% limit %]" />
+                    <input type="hidden" name="offset" value="[% offset %]" />
+                    [%- INCLUDE "opac/parts/preserve_params.tt2"; %]
+                       <table title="Edit List Description" class="mx-auto">
+                               <th colspan="2" class="text-center"><strong>Edit List Description</strong></th>
+                               <tr>
+                            <td> 
+                                <label for="bbag-edit-name">[% l('Name:') %]</label>
+                            </td>
+                            <td class="px-3">
+                               <input name="name" type="text" value="[% bbag.name | html %]" id="bbag-edit-name" class="form-control m-2" /></td>
+                            </tr>
+                            <tr>
+                            <td>
+                               <label for="bbag-edit-description">[% l('Description:') %]</label>
+                            </td>
+                            <td class="px-3">
+                                <textarea name="description" id="bbag-edit-description" class="form-control m-2">[% bbag.description | html %]</textarea>
+                            </td>
+                            </tr>
+                            <tr>
+                               <td colspan="2" >
+                                 [% l("Save changes?") %]
+                                <input type="submit" class="btn btn-confirm btn-sm mx-3" value="[% l('Save') %]" />
+                                </td>
+                            </tr>
+                        </table>
+                </form>
+            </div>
+        </div>
+        <br class="clear-both" />
+        <div>
+        <h5 class="text-center my-2">List Items</h5>
+        <form action="[% mkurl(ctx.opac_root _ '/myopac/list/update') %]" method="post" >
+        <input type="hidden" name="list" value="[% bbag.id %]" />
+        <input type="hidden" name="sort" value="[% CGI.param('sort') | uri %]" />
+        <div>
+        [% IF bbag.items.size %]
+            <div class="my-2">
+                <select name="action"  class="form-control float-left w-75">
+                    <option disabled="disabled" selected="selected">[% l('-- Actions for these items --') %]</option>
+                    <option value="place_hold">[% l('Place hold') %]</option>
+                     <option value="print">[% l('Print title details') %]</option>
+                    <option value="email">[% l('Email title details') %]</option>
+                    <option value="del_item">[% l('Remove from list') %]</option>
+                </select>
+                [%- INCLUDE "opac/parts/preserve_params.tt2"; %]
+                <input class="btn btn-confirm btn-sm m-1" type="submit" value="[% l('Go') %]" />
+                 [% IF CGI.param('list_none_selected') %]
+                    <span class="error">[% l('No items were selected') %]</span>
+                [% END %]
+            </div>
+        [% END %]
+        
+        <div>
+        <table class="table table-hover miniTable w-100 bookbagTable">
+            <thead>
+                <tr>
+                    <th class="list_checkbox">
+                    <input type="checkbox" 
+                      onclick="var inputs=document.getElementsByTagName('input'); 
+                        for (i = 0; i < inputs.length; i++) { 
+                            if (inputs[i].name == 'selected_item' &amp;&amp; !inputs[i].disabled &amp;&amp; inputs[i].getAttribute('bbag') == [% bbag.id %]) 
+                                inputs[i].checked = this.checked;}"/>
+
+                    </th>
+                    <th class="list_entry">
+                        <a href="[% mkurl(ctx.opac_root _ '/myopac/lists', {sort=> (CGI.param('sort') == 'titlesort' ? 'titlesort.descending' : 'titlesort')}) %]">[% l('Title') %]</a>
+                    </th>
+                    <th class="list_entry">
+                        <a href="[% mkurl(ctx.opac_root _ '/myopac/lists', {sort=>(CGI.param('sort') == 'authorsort' ? 'authorsort.descending' : 'authorsort')}) %]">[% l('Author(s)') %]</a>
+                    </th>
+                    <th class='list_entry'>
+                        [% l('Local Call Number') %]
+                    </th>
+                    <th class="list_entry">
+                        <a href="[% mkurl(ctx.opac_root _ '/myopac/lists', {sort=>(CGI.param('sort') == 'pubdate' ? 'pubdate.descending' : 'pubdate')}) %]">[% l('Publication Date') %]</a>
+                    </th>
+                    <th class="list_entry">
+                         [% l('Format') %]
+                    </th>
+                    <th class="list_entry">
+                        [% l('Notes') %]
+                        [% IF CGI.param("edit_notes") != bbag.id %]
+                        | <a href="[% mkurl(ctx.opac_root _ '/myopac/lists', {edit_notes=> bbag.id}) %]">[% l('Edit') %]</a>
+                        [% END %]
+                    </th>
+                </tr>
+            </thead>
+            <tbody>
+                [% UNLESS bbag.items.size %]
+                <tr><td colspan="6" class="list_is_empty">
+                    [% l("This list contains no items.") %]
+                </td></tr>
+                [% END %]
+                [% FOR item IN bbag.items;
+                    rec_id = item.target_biblio_record_entry.id;
+                    attrs = {marc_xml => ctx.bookbags_marc_xml.$rec_id};
+                    PROCESS get_marc_attrs args=attrs %]
+                <tr class="bookbag-item-row">
+                    <td class="list_checkbox">
+                        <input type="checkbox" name="selected_item" value="[% item.id %]" bbag='[% bbag.id %]'/>
+                    </td>
+                    <td class="list_entry" data-label="[% l('Title') %]">
+                        <a href="[% mkurl(ctx.opac_root _ '/record/' _ rec_id, {}, ['edit_notes', 'bbid']) %]">[% attrs.title | html %]</a>
+                    </td>
+                    <td class="list_entry" data-label="[% l('Author(s)') %]">
+                        <a href="[%-
+                            authorquery = attrs.author | replace('[,\.:;]', '');
+                            mkurl(ctx.opac_root _ '/results', {qtype => 'author', query => authorquery}, ['page', 'bbid', 'edit_notes'])
+                            -%]">[% attrs.author | html %]</a>
+                    </td>
+                    <td class="list_entry" data-label="[% l('Local Call Number') %]">
+                        [% 
+                            copy = attrs.holdings.0;
+                            IF copy;
+                                # only show a relevant call number
+                                copy_org = ctx.get_aou_by_shortname(copy.owner);
+                                FOR ctx_org IN [ctx.pref_ou, ctx.search_ou, ctx.home_ou, ctx.physical_loc];
+                                    NEXT UNLESS ctx_org;
+                                    ctx_org = ctx.get_aou(ctx_org);
+                                    IF ctx.org_within_scope(ctx_org, copy_org, ctx_org.ou_type.depth);
+                                        l('[_1] ([_2])', copy.label, copy_org.name) | html;
+                                        LAST;
+                                    END;
+                                END;
+                            END;
+                        %]
+                    </td>
+                    <td class="list_entry" data-label="[% l('Publication Date') %]">
+                          [% attrs.pubdate | html %]
+                    </td>
+                    <td class="list_entry" data-label="[% l('Format') %]">
+                          [% attrs.format_label | html %]
+                    </td>
+                    [% IF CGI.param("edit_notes") == bbag.id %]
+                    <td class="list_entry" data-label="[% l('Notes') %]">
+                        [% FOR note IN item.notes %]
+                        <input type="text" name="note-[% note.id %]" value="[% note.note | html %]" />
+                        [% END %]
+                        <input type="text" name="item-[% item.id %]" />
+                    </td>
+                    [% ELSE %]
+                    <td class="list_entry" data-label="[% l('Notes') %]">
+                        [% FOR note IN item.notes %]
+                        <div>[% note.note | html %]</div>
+                        [% END %]
+                    </td>
+                    [% END %]
+                </tr>
+                [% END %]
+                [% IF CGI.param("edit_notes") == bbag.id %]
+                <tr class="mobile_hide">
+                    <td colspan="6"><!-- All space left of notes column --></td>
+                    <td class="save-notes">
+                        [%- INCLUDE "opac/parts/preserve_params.tt2"; %]
+                        <input type="hidden" name="bbid" value="[% CGI.param('bbid') | html %]" />
+                        <input type="submit" class="btn btn-confirm" name="save_notes" value="[% l('Save Notes') %]" />
+                    </td>
+                </tr>
+                [% END %]
+            </tbody>
+        </table>
+        </div>
+        
+        
+        
+        </div>
+        [% IF ctx.bb_page_count > 1; %]
+            <div class="header_middle" style="padding-top:7px;">
+                <div class="bbag-navigate-list">[% l('Navigate Selected List ') %]</div>
+                <div class="bbag-navigate-list-pages">
+                    [%- IF item_page > 1 -%]
+                        <a href='[% mkurl(ctx.opac_root _ '/myopac/lists', {
+                            item_page => item_page - 1
+                        }) %]'><span class="nav_arrow_fix">&#9668;</span>[% l('Previous') %]</a>
+                    [%- END; -%]
+
+                    [%- IF (item_page - 3) >= 1 -%]
+                        <a href='[% mkurl(ctx.opac_root _ '/myopac/lists', {
+                            item_page => item_page - 3
+                        }) %]'>[% item_page - 3 %]</a>
+                    [%- END; -%]
+                    [%- IF (item_page - 2) >= 1 -%]
+                        <a href='[% mkurl(ctx.opac_root _ '/myopac/lists', {
+                            item_page => item_page - 2
+                        }) %]'>[% item_page - 2 %]</a>
+                    [%- END; -%]
+                    [%- IF (item_page - 1) >= 1 -%]
+                        <a href='[% mkurl(ctx.opac_root _ '/myopac/lists', {
+                            item_page => item_page - 1
+                        }) %]'>[% item_page - 1%]</a>
+                    [%- END; -%]
+                    <span class="bookbag-paginator-selected" >[% item_page %]</span>
+                    [%- IF (item_page + 1) <= ctx.bb_page_count -%]
+                        <a href='[% mkurl(ctx.opac_root _ '/myopac/lists', {
+                            item_page => item_page + 1
+                        }) %]'>[% item_page + 1 %]</a>
+                    [%- END; -%]
+                    [%- IF (item_page + 2) <= ctx.bb_page_count -%]
+                        <a href='[% mkurl(ctx.opac_root _ '/myopac/lists', {
+                            item_page => item_page + 2
+                        }) %]'>[% item_page + 2 %]</a>
+                    [%- END; -%]
+                    [%- IF (item_page + 3) <= ctx.bb_page_count -%]
+                        <a href='[% mkurl(ctx.opac_root _ '/myopac/lists', {
+                            item_page => item_page + 3
+                        }) %]'>[% item_page + 3 %]</a>
+                    [%- END; -%]
+
+                    [%- IF (item_page + 1) <= ctx.bb_page_count; -%]
+                        <a href='[% mkurl(ctx.opac_root _ '/myopac/lists', {
+                            item_page => item_page + 1
+                        }) %]'>[% l('Next') %]<span class="nav_arrow_fix">&#9658;</span></a>
+                    [%- END; -%]
+                 </div>
+            </div>
+            <div class="clear-both"></div>
+        [% END %]
+        <br/>
+
+        </form>
+        </div>
+        [% END %]
+        [% END %]
+    </div>
+    [% END %][% END %]
+</div></div>
+[% END %]
+
diff --git a/Open-ILS/src/templates-bootstrap/opac/myopac/main.tt2 b/Open-ILS/src/templates-bootstrap/opac/myopac/main.tt2
new file mode 100644 (file)
index 0000000..99ed0ea
--- /dev/null
@@ -0,0 +1,232 @@
+[%  PROCESS "opac/parts/header.tt2";
+    PROCESS "opac/parts/misc_util.tt2";
+    WRAPPER "opac/parts/myopac/main_base.tt2";
+    myopac_page = "main";
+    myopac_main_page = "main";
+    myopac_cc_allowed = 0;
+    IF (ctx.fines.grocery.size OR ctx.fines.circulation.size) AND ctx.get_org_setting(ctx.user.home_ou, 'credit.payments.allow') == 1;
+        myopac_cc_allowed = 1;
+    END
+%]
+<h3 class="sr-only">[% l('My Account Summary') %]</h3>
+[%  IF myopac_cc_allowed;
+    # http://www.w3.org/TR/WCAG20-TECHS/H32.html
+    # avoid forms w/ no submit action %]
+<form action="[% ctx.opac_root %]/myopac/main_payment_form#payment" method="get" id="selected_fines" class="my-3">
+[% END %]
+
+    [% IF ctx.fines.circulation.size > 0 %]
+    <div id='myopac_circ_trans_div'>
+      <!--moved tables heading to outside of the table itself - took internal styling -->
+        <div class="header_middle">
+           <span class="acct_fines_header">
+           <!-- Different heading when not able to pay -->
+             [% IF myopac_cc_allowed %]
+                [% l("Pay Selected Circulation Charges") %]
+            [% ELSE %] 
+                [% l("Circulation Charges") %]
+             [% END %]
+           </span>
+           
+        </div>
+    
+        <table id="acct_fines_main_header" class="table table-hover miniTable chargesMainTable" title="[% l('Items Checked Out') %]">
+            <thead>
+               
+                <tr>
+
+                   [% IF myopac_cc_allowed %]
+                    <th nowrap="nowrap" style="white-space:nowrap;">
+                        <input id="pay_fines_box1" checked="checked"
+                            type="checkbox" onclick="select_all_checkboxes('xact', this.checked)"
+                            title="[% l('Click to (un)select all charges') %]" />
+                    </th>
+                    [% END %]
+                    <th>[% l("Owed") %]</th>
+                    <th class="mobile_hide">[% l("Billing Type") %]</th>
+                    <th>[% l("Title") %]</th>
+                    <th class='mobile_hide'>[% l("Checkout") %]</th> 
+                    <th>[% l(" Due ") %]</th> 
+                    <th>
+                       <span class="mobile_hide">[% l(" Returned/Renewed") %]</span>
+                       <span class="mobile_view">[% l(" Returned&#42;") %]</span>
+                    </th>
+                    
+                </tr>
+            </thead>
+            <tbody id='myopac_circ_trans_tbody'>
+                [% FOR f IN ctx.fines.circulation;
+                    attrs = {marc_xml => f.marc_xml};
+                    IF f.marc_xml;
+                        PROCESS get_marc_attrs args=attrs;
+                    ELSIF f.xact.reservation;
+                        attrs.title = f.xact.reservation.target_resource_type.name;
+                    END %]
+                <tr id='myopac_circ_trans_row'>
+                    [% IF myopac_cc_allowed %]
+                    <td>
+                        <input type="checkbox" checked="checked" 
+                            title="[% l('Pay this fine') %]" name="xact"
+                            value="[% f.xact.id %]" class="fineCheck"/>
+                    </td>
+                    [% END %]
+                    
+                    <td>
+                        <strong class="fineAmount" value="[% f.xact.balance_owed %]">
+                            [% money(f.xact.balance_owed) %]
+                        </strong>
+                    </td>
+                    
+                    <td class="mobile_hide">
+                       [% f.xact.last_billing_type %]
+                    </td>
+                                  
+                    <td>
+                        [% recid = f.xact.circulation.target_copy.call_number.record.id || f.xact.reservation.target_resource_type.record.id;
+                        IF recid; %]
+                        <a href="[% mkurl(ctx.opac_root _ '/record/' _ recid,
+                            {loc => ctx.search_ou}) %]">[% attrs.title | html %]</a>
+                        [% ELSE %]
+                        [% attrs.title | html %]
+                        [% END %]
+                    </td>
+                    
+                   <td name='myopac_circ_trans_start' class='mobile_hide'>
+                        [% ts = f.xact.circulation.xact_start || f.xact.reservation.start_time || 0;
+                        IF ts;
+                            date.format(ctx.parse_datetime(ts), DATE_FORMAT);
+                        END %]
+                    </td>
+                    
+                    <td name='myopac_circ_trans_due' >
+                        [% ts = f.xact.circulation.due_date || f.xact.reservation.end_time || 0;
+                           due_org = f.xact.circulation.circ_lib || f.xact.reservation.pickup_lib;
+                        IF ts;
+                            date.format(ctx.parse_datetime(ts, due_org), DATE_FORMAT);
+                        END %]
+                    </td>
+                    
+                    <td name='myopac_circ_trans_finished' >
+                        [%  ts = f.xact.circulation.checkin_time || f.xact.reservation.return_time || 0;
+                            IF ts;
+                                date.format(ctx.parse_datetime(ts), DATE_FORMAT);
+                            ELSE %]
+                            <!-- XXX TODO fines aren't really accruing
+                                if circ has hit maxfines. more clarity
+                                here? --> 
+                            <span class="alert">[% l('(fines accruing)') %]</span>
+                        [%  END %]
+                    </td>
+                   
+                </tr>
+                [% END %]
+            </tbody>
+        </table>
+        <!-- Disclaimer for mobile -->
+        <span class="mobile_view cc_disclaimer"> <strong>&#42;</strong>Items may have been renewed. </span>
+    </div>
+    [% END %]
+
+    [% IF ctx.fines.grocery.size > 0 %]
+    <!-- Table for all non-circulation transactions -->
+    <div id='myopac_trans_div'>
+        <h2 class="acct_fines_header text-center">
+                [% l("Charges On Your Account") %]
+        </h2>
+        
+        
+         <table id="acct_fees_main_header" class="table table-hover miniTable chargesTable my-3" title="[% l('Other Fines and Fees') %]">
+            <thead>
+                <tr>
+                
+                     [% IF myopac_cc_allowed %]
+                    <th  nowrap="nowrap" style="white-space:nowrap;">
+                        <input id="pay_fines_box2" checked="checked"
+                            type="checkbox" onclick="select_all_checkboxes('xact_misc', this.checked)"
+                            title="[% l('Click to (un)select all fines') %]" />
+                    </th>
+                    [% END %]
+                    <th >[% l("Owed") %]</th>
+                    <th >[% l("Billing Type") %]</th>
+                    <th >[% l("Note") %]</th>
+                    <th >[% l("Date") %]</th>
+                    
+
+                </tr>
+            </thead>
+            <tbody id='myopac_trans_tbody'>
+                [% c = 0; %]
+                [% FOR f IN ctx.fines.grocery %]
+                <tr id='myopac_trans_row'>
+                [% c = c + 1; %]
+                    [% IF myopac_cc_allowed %]
+                    <td>
+                        <span class="sr-only">Billing Number [% c %]</span>
+                        <input class="fineCheck" type="checkbox" title='[% l("Pay this fine") %]' name="xact_misc" value="[% f.xact.id %]" checked="checked" />
+                    </td>
+                    [% END %]
+                    
+                    <td class="red">
+                        <span class="sr-only">Amount Owed</span>
+                        <strong class="fineAmount" value="[% f.xact.balance_owed %]">
+                            [% money(f.xact.balance_owed) %]
+                        </strong>
+                    </td>
+                    
+                    <td>
+                        <span class="sr-only">Billing For</span>
+                        [% f.xact.last_billing_type %]
+                    </td>
+                    
+                    <td>
+                        [% IF f.xact.last_billing_note; %]
+                            <span class="sr-only">Note</span>
+                            [% f.xact.last_billing_note %]
+                        [% END %]
+                    </td>
+                    
+                    <td>
+                        <span class="sr-only">Date of Billing</span>
+                        [% date.format(ctx.parse_datetime(f.xact.xact_start),DATE_FORMAT) %]
+                    </td>
+
+                </tr>
+                [% END %]
+            </tbody>
+        </table>
+   
+    </div>
+    [% END %]
+    [% UNLESS ctx.fines.grocery.size OR ctx.fines.circulation.size %]
+    <div>[% l('You have no current fines.') %]</div>
+    [% ELSIF myopac_cc_allowed %]
+   
+    <div class="my-3">
+        <input type="submit"
+            value="[% l('Pay selected charges') %] - [% money(ctx.user_stats.fines.balance_owed) %]"
+            title="[% l('Pay selected charges') %]"
+            class="btn btn-confirm my-1"
+            id="selectPay"/>
+    <form action="[% ctx.opac_root %]/myopac/main_payment_form" method="get"><input
+            type="submit" title="[% l('Pay All Charges') %] "
+            value="[% l('Pay All Charges') %] - [% money(ctx.user_stats.fines.balance_owed) %]" class="btn btn-confirm my-1" /></form>
+    </div>
+    [% END %]
+[% IF myopac_cc_allowed %]
+</form>
+[% END %]
+[% END %]
+
+<!--Table functions ~ Running total of selected items for use in a Paypal module or where running total is needed-->
+<script>
+jQuery("input[type=checkbox]").click(function () {
+       var amount = 0;
+    jQuery("td input:checked").each(function () {
+               var item = jQuery( this ).parent().parent().children("td").children(".fineAmount").attr("value");
+        item = parseFloat(item);
+        amount += item;
+    });
+    jQuery("#total").val(amount);
+    jQuery("#selectPay").val('Pay selected charges - $' + amount.toFixed(2));
+});
+</script>
\ No newline at end of file
diff --git a/Open-ILS/src/templates-bootstrap/opac/myopac/main_pay.tt2 b/Open-ILS/src/templates-bootstrap/opac/myopac/main_pay.tt2
new file mode 100644 (file)
index 0000000..5f59e53
--- /dev/null
@@ -0,0 +1,63 @@
+[%  PROCESS "opac/parts/header.tt2";
+    PROCESS "opac/parts/misc_util.tt2";
+    WRAPPER "opac/parts/myopac/base.tt2";
+    myopac_page = "main";
+    myopac_main_page = "pay" %]
+<div id="myopac_summary_div">
+
+    [% IF ctx.payment_response.textcode %]
+        <div class="payment-error">
+            <span title="[% ctx.payment_response.textcode %]">
+                [% ctx.payment_response.desc || ctx.payment_response.textcode %]
+            </span><br />
+            [% ctx.payment_response.note %]
+            [% ctx.payment_response.payload.error_message | html %]
+            [% ctx.payment_response.payload.message | html %]
+        </div>
+        <p>
+            [%
+                url_args = {xact => [], xact_misc => []};
+                FOR k IN ['xact', 'xact_misc'];
+                    FOR val IN CGI.param(k);
+                        url_args.$k.push(val);
+                    END;
+                END;
+                retry_url =  mkurl(ctx.opac_root _ '/myopac/main_payment_form', url_args, 1);
+            %]
+            <br/>
+            
+             <a href="[% mkurl(ctx.opac_root _ '/myopac/main', {}, 1) %]" class="btn btn-confirm">[% l('Account Home') %]</a> 
+             <a href="[% retry_url %]" class="btn btn-confirm">[% l('Try Payment Again') %]</a>
+        </p>
+    [% ELSE %]
+        <p><big>[% l('Your payment has been approved.') %]</big>
+        [% IF ctx.printable_receipt.template_output;
+            print_args = [];
+            FOR p IN ctx.payment_response.payments;
+                print_args.push('payment=' _ p);
+            END %]
+               <a href="[% ctx.opac_root %]/myopac/receipt_print?[% print_args.join('&amp;') %]"
+            target="_egrecpt"
+            class="btn-confirm btn btn-sm"
+            onclick="try { print_node('printable-receipt'); } catch (e) { window.print(); } return false;">[% l('Print receipt') %]</a></p>
+            <hr>
+        <tt id="printable-receipt">
+            [% ctx.printable_receipt.template_output.data %]
+            <br />
+        </tt>
+               <hr>
+        [% ELSE %]
+        <div class="payment-error">
+            [% l(
+                'Error creating receipt: [_1]',
+                    (ctx.printable_receipt.textcode ? ctx.printable_receipt.textcode _ ' / ' _ ctx.printable_receipt.desc : 0) ||
+                    ctx.printable_receipt.error_output.data ||
+                    l('No receipt data returned from server')
+                ) | html %]
+        </div>
+        [% END %]
+        <p><a href="[% ctx.opac_root %]/myopac/main" class="btn btn-confirm">[%
+            l("Back to Account Summary") %]</a></p>
+    [% END %]
+</div>
+[% END %]
diff --git a/Open-ILS/src/templates-bootstrap/opac/myopac/main_payment_form.tt2 b/Open-ILS/src/templates-bootstrap/opac/myopac/main_payment_form.tt2
new file mode 100644 (file)
index 0000000..de357f5
--- /dev/null
@@ -0,0 +1,251 @@
+[%  PROCESS "opac/parts/header.tt2";
+    PROCESS "opac/parts/misc_util.tt2";
+    WRAPPER "opac/parts/myopac/main_base.tt2";
+    myopac_page = "main";
+    myopac_main_page = "payment_form";
+
+    last_chance = CGI.param("last_chance");
+
+    IF myopac_main_page == "payment_form" AND
+        ctx.get_org_setting(ctx.user.home_ou.id, 'credit.processor.stripe.enabled') AND ctx.get_org_setting(ctx.user.home_ou.id, 'credit.processor.default') == 'Stripe';
+        ctx.use_stripe = 1;
+    END %]
+
+<a name="payment"> </a>    
+<h3 class="sr-only">[% l('Pay Charges') %]</h3>
+[% IF ctx.fines.balance_owed <= 0 %]
+<div>
+    [% l("The minimum amount you can pay is \$0.01.") %]
+</div>
+[% ELSE %]
+[% IF ctx.use_stripe %]
+<noscript>
+    [% l("Your browser does not have Javascript enabled, and we cannot " _
+        "process credit card payments without it.  Please change your " _
+        "browser settings and try again.") %]
+</noscript>
+[% END %]
+<div id="pay_fines_now"[% IF ctx.use_stripe %] class="hide_me"[% END %]>
+     [% IF last_chance %]
+    
+    <p><big>[% l("Are you sure you are ready to charge ") %]
+         <strong> [% l("[_1] ", money(ctx.fines.balance_owed))%]</strong>
+        [% l("to your credit card?") %]</big></p> 
+    <form action="[% ctx.opac_root %]/myopac/main_pay_init" method="post">
+        [% FOR k IN CGI.Vars;
+            NEXT UNLESS k;
+            FOR val IN CGI.param(k) %]
+        <input type="hidden" name="[% k | html %]" value="[% val | html %]" /> 
+        [% END; END %]
+
+        <input type="submit" value="[% l('Submit') %]" class="btn btn-confirm"/>
+        <a href="[% mkurl(ctx.opac_root _ '/myopac/main#selected_fines', {}, 1) %]" class="btn btn-deny">[% l('Cancel') %]</a>
+       
+     <table title="[% l('List of Transactions') %]" id="acct_fines_confirm_header"
+        class="table_no_border_space table_no_cell_pad my-2">
+   <thead>
+      <tr>
+        <th>[% l('Charge/Fee') %]</th>
+        <th>[% l('Amount') %]</th>
+     </tr>
+   </thead>
+   <tbody>
+      [%
+       FOR f IN ctx.fines.circulation;
+         NEXT IF CGI.param('xact').size &&
+            !CGI.param('xact').grep(f.xact.id).size;
+         attrs = {marc_xml => f.marc_xml};
+         IF f.marc_xml;
+             PROCESS get_marc_attrs args=attrs;
+         ELSIF f.xact.reservation;
+              attrs.title = f.xact.reservation.target_resource_type.name;
+         END %]
+         <tr>
+            <td>[% attrs.title | html %]</td>
+            <td class="text-right">[% money(f.xact.balance_owed) %]</td>
+         </tr>
+          [%
+          END;
+          FOR f IN ctx.fines.grocery;
+              NEXT IF CGI.param('xact_misc').size &&
+                  !CGI.param('xact_misc').grep(f.xact.id).size %]
+              <tr>
+                 <td>[% f.xact.last_billing_type | html %]</td>
+                 <td class="text-right">[% money(f.xact.balance_owed) %]</td>
+            </tr>
+        [% END %]
+     </tbody>
+   </table> 
+     
+    <p style="padding-top: 2em;">
+    <big>[% l("Are you sure you are ready to charge ") %]
+         <strong> [% l("[_1] ", money(ctx.fines.balance_owed))%]</strong>
+        [% l("to your credit card?") %]</big></p>        
+        <input type="submit" value="[% l('Submit') %]" class="btn btn-confirm"/>
+        <a href="[% mkurl(ctx.opac_root _ '/myopac/main#selected_fines', {}, 1) %]" class="btn btn-deny">[% l('Cancel') %]</a>
+    [% ELSE %]
+    
+    <form method="post" id="payment_form" action='#payment'
+    [% IF ctx.use_stripe %]
+    onsubmit="return stripe_onsubmit();"
+    [% END %]
+    >
+        <input type="hidden" name="last_chance" value="1" />
+        [% FOR xact IN CGI.param('xact') %]
+        <input type="hidden" name="xact" value="[% xact | html %]" />
+        [% END %]
+        [% FOR xact IN CGI.param('xact_misc') %]
+        <input type="hidden" name="xact_misc" value="[% xact | html %]" />
+        [% END %]
+        [% IF ctx.use_stripe %]
+        <input type="hidden" name="stripe_token" id="stripe_token" />
+        [% END %]
+
+         <table id="billing_info_table" class="table table-hover">
+         <thead>
+          <th colspan='2'><strong>[% l('Billing Information') %]</strong></th>
+         </thead>
+          <tbody>
+               
+               <tr> 
+                <td><label for="payment-first-name">[% l('First Name') %]</label></td>
+                    <td><input type="text"  name="billing_first" id="payment-first-name" 
+                        value="[% ctx.user.first_given_name | html %]" class="form-control"/></td>
+                </tr>
+                <tr>
+                    <td><label for="payment-last-name">[% l('Last Name') %]</label></td>
+                    <td><input type="text" name="billing_last" id="payment-last-name" 
+                        value="[% ctx.user.family_name | html %]" class="form-control"/></td>
+                </tr>
+
+                <tr>
+                    <td><label for="payment-email-addr">[% l('Email Address') %]</label></td>
+                    <td>
+                        
+                        <input id="payment-email-addr" type="text" 
+                             value="[% ctx.user.email | html %]" disabled="disabled" 
+                            readonly="readonly" class="form-control"/>   
+                        <a title="[% l('Update Email Address') %]"
+                            href="[% ctx.opac_root %]/myopac/update_email?return_to_referer=1">[% l("Update") %]</a>
+                    </td
+                </tr>
+                <tr>
+                    <td><label for="payment-billing-address">[% l('Street Address') %]</label></td>
+                    <td><input type="text" name="billing_address" id="payment-billing-address" 
+                        value="[% ctx.user.billing_address.street1 _ ctx.user.billing_address.street2 | html %]" class="form-control"/></td>
+                </tr>
+                <tr>
+                    <td><label for="payment-billing-city">[% l('City' )%]</label></td>
+                    <td><input type="text" name="billing_city" id="payment-billing-city" 
+                        value="[% ctx.user.billing_address.city | html %]" class="form-control"/></td>
+                </tr>
+                <tr>
+                    <td><label for="payment-billing-state">[% l('State or Province') %]</label></td>
+                    <td><input type="text" name="billing_state" id="payment-billing-state"
+                        value="[% ctx.user.billing_address.state | html %]" class="form-control" /></td>
+                </tr>
+                <tr>
+                    <td><label for="paymenet-billing-zip">[% l('Postal Code') %]</label></td>
+                    [% USE zip=String(ctx.user.billing_address.post_code) %]
+                    <td><input type="tel" pattern="[/^[a-zA-Z0-9 _-]{7}$/]*" maxlength="7" size="7" name="billing_zip" id="paymenet-billing-zip"
+                        value="[% zip.truncate(5)  %]" class="form-control"/></td>
+                </tr>
+               </tbody>
+               </table>
+               
+               <table id="credit_card_info_table" class="table">
+               <thead>
+                       <th colspan='2'><strong>[% l('Credit Card Information') %]</strong></th>
+               </thead>
+               <tbody>
+               
+                <tr>
+                    <td><label for="payment-credit-card">[% l('Credit Card #') %]</label></td>
+                    
+                     <!-- Make type tel, which prompts for numbers in mobile -->
+                    <td><input class="form-control" type="tel" pattern="[0-9]*" maxlength="16" id="payment-credit-card" required 
+                    [% IF ctx.use_stripe %]
+                    data-stripe="number"
+                    [% ELSE %]
+                    name="number"
+                    [% END %]
+                    /></td>
+                </tr>
+                <tr>
+                    <td><label for="payment-security-code">[% l('Security Code') %]</label></td>
+                    <td>
+                         <!-- Make type tel, which prompts for numbers in mobile -->
+                        <input class="form-control" type="tel" pattern="[0-9]*" size="4" maxlength="5" id="payment-security-code"
+                        [% IF ctx.use_stripe %]
+                        data-stripe="cvc"
+                        [% ELSE %]
+                        name="cvv2"
+                        [% END %]
+                        /></td>
+                </tr>
+                <tr>
+                    <td><label for="payment-expire-month">[% l('Expiration Month') %]</label></td>
+                    <td>
+                        <select class="form-control" id="payment-expire-month" required
+                        [% IF ctx.use_stripe %]
+                        data-stripe="exp_month"
+                        [% ELSE %]
+                        name="expire_month"
+                        [% END %]
+                        >
+                            <option value="-1"></option>
+                            <option value="01">[% l("January (1)") %]</option>
+                            <option value="02">[% l("February (2)") %]</option>
+                            <option value="03">[% l("March (3)") %]</option>
+                            <option value="04">[% l("April (4)") %]</option>
+                            <option value="05">[% l("May (5)") %]</option>
+                            <option value="06">[% l("June (6)") %]</option>
+                            <option value="07">[% l("July (7)") %]</option>
+                            <option value="08">[% l("August (8)") %]</option>
+                            <option value="09">[% l("September (9)") %]</option>
+                            <option value="10">[% l("October (10)") %]</option>
+                            <option value="11">[% l("November (11)") %]</option>
+                            <option value="12">[% l("December (12)") %]</option>
+                        </select>
+                    </td>
+                </tr>
+                <tr>
+                    <td><label for="payment-expire-year">[% l('Expiration Year') %]</label></td>
+                    <td>
+                        <select class="form-control" id="payment-expire-year"
+                        [%- IF ctx.use_stripe %]
+                        data-stripe="exp_year"
+                        [% ELSE %]
+                        name="expire_year"
+                        [% END -%]
+                        >
+                        [% year = date.format(date.now, '%Y');
+                        y = year;
+                        WHILE y < year + 10; # show ten years starting now %]
+                            <option value="[% y %]">[% y %]</option>
+                        [% y = y + 1; END %]
+                        </select>
+                    </td>
+                </tr>
+                <tr>
+                   <td colspan='2'>
+                       <div id="payment_actions">
+                          [% l('Total amount:') %]
+                           <strong>[% money(ctx.fines.balance_owed) %]</strong><br />
+          
+                         <input type="submit" id="payment_submit" value="[% l('Next') %]" class="btn btn-confirm" />
+                         <a href="[% mkurl(ctx.opac_root _ '/myopac/main', {}, 1) %]" class="btn btn-deny">[% l('Cancel') %]</a> 
+                         <br/>
+                         </div>
+                   </td>
+                </tr>
+                
+          </tbody>
+        </table>
+         [% INCLUDE "opac/parts/myopac/main_refund_policy.tt2" %]
+        
+    [% END %]
+    </form>
+</div>
+[% END %]
+[% END %]
diff --git a/Open-ILS/src/templates-bootstrap/opac/myopac/main_payments.tt2 b/Open-ILS/src/templates-bootstrap/opac/myopac/main_payments.tt2
new file mode 100644 (file)
index 0000000..f865e3b
--- /dev/null
@@ -0,0 +1,70 @@
+[%  PROCESS "opac/parts/header.tt2";
+    PROCESS "opac/parts/misc_util.tt2";
+    WRAPPER "opac/parts/myopac/main_base.tt2";
+    myopac_page = "main";
+    myopac_main_page = "payments";
+    limit = ctx.payment_history_limit;
+    offset = ctx.payment_history_offset;
+%]
+
+<h3 class="sr-only">[% l('Transaction Payments') %]</h3>
+<div class="my-3">
+    <div class="row my-2">
+        <div class="col-3 text-left"> 
+            <a href='main_payments?limit=[% limit %]&amp;offset=[% offset - limit %]'
+                [% IF offset == 0 %] class='invisible' [% END %]><span class="np_nav_link classic_link btn btn-outline-primary">&#9668;[% l('Previous') %]</span>
+            </a>
+        </div>
+        <div class="col-6">
+            <h2 class="w-50 mx-auto">[% l('Payment History') %]</h2>
+        </div>
+        <div class="col-3 text-right"> 
+            <a href='main_payments?limit=[% limit %]&amp;offset=[% offset + limit %]'
+                [% IF ctx.payments.size < limit %] class='invisible' [% END %]><span class="np_nav_link classic_link btn btn-outline-primary">[% l('Next') %] &#9658;</span>
+            </a>
+        </div>
+    </div>
+    <div class="clear-both"></div>
+
+    [% IF ctx.payments.size %]
+    <table title="[% l('Payments') %]" 
+        class='table table-hover miniTable paymentTable' width='100%'>
+        <thead><tr>
+            <th>[% l('Payment Date') %]</th>
+            <th>[% l('Payment For') %]</th>
+            <th>[% l('Amount') %]</th>
+            <th>[% l('Receipt') %]</th> 
+        </tr></thead>
+        <tbody>
+            [% FOR payment IN ctx.payments %]
+            <tr>
+                <td><span class="sr-only">Payment Date: </span>[% date.format(ctx.parse_datetime(payment.mp.payment_ts), DATE_FORMAT) %]</td>
+                <td>
+                <span class="sr-only">Payment For: </span>
+                [% 
+                    btype = payment.last_billing_type | html;
+                    ptitle = payment.title | html;
+                    (payment.xact_type == 'grocery') ? btype : ptitle
+                %]
+                </td>
+                <td><span class="sr-only">Amount: </span>[% money(payment.mp.amount) %]</td>
+                <td>
+                <span class="sr-only">Receipt Options: </span>
+                    <form action="[% ctx.opac_root %]/myopac/receipt_print" method="post" class="d-inline m-1">
+                        <input class="btn btn-sm btn-confirm my-1" type="hidden" name="payment" value="[% payment.mp.id %]" />
+                        <input class="btn btn-sm btn-confirm my-1" type="submit" value="[% l('Print') %]" />
+                    </form>
+                    <form action="[% ctx.opac_root %]/myopac/receipt_email" method="post" class="d-inline m-1">
+                        <input class="btn btn-sm btn-confirm my-1" type="hidden" name="payment" value="[% payment.mp.id %]" />
+                        <input class="btn btn-sm btn-confirm my-1" type="submit" value="[% l('Email') %]" />
+                    </form>
+                </td>
+            </tr>
+            [% END %]
+        </tbody>
+    </table>
+    [% ELSE %]
+    <div>[% l('You have no historical payments to display.') %]</div>
+    [% END %]
+</div>
+[% END %]
diff --git a/Open-ILS/src/templates-bootstrap/opac/myopac/messages/list.tt2 b/Open-ILS/src/templates-bootstrap/opac/myopac/messages/list.tt2
new file mode 100644 (file)
index 0000000..9b0dbd8
--- /dev/null
@@ -0,0 +1,128 @@
+<div id="myopac_messages_div">
+    <div class="header_middle">
+        <span id="acct_messages_header" style="float:left;">[% l("Messages") %]</div>
+        <span class='float-left' style='padding-left: 10px;'>
+            <a href='[% mkurl('messages', { limit => limit, offset => (offset - limit)} ) %]'
+                [% IF offset <= 0 %] class='invisible' [% END %]><span class="nav_arrow_fix">&#9668;</span>[% l('Previous') %]</a>
+            [% IF offset > 0 || count > limit;
+                curpage = 0;
+                WHILE curpage * limit < count;
+                    IF curpage * limit == offset;
+            %]
+            [% curpage + 1 %]
+                    [%- ELSE %]
+            <a href='[% mkurl('messages', {limit => limit, offset => (curpage * limit)}) %]'>[% curpage + 1 %]</a>
+                    [%- END;
+                    curpage = curpage + 1;
+                END;
+            END %]
+            <a href='[% mkurl('messages', {limit => limit, offset => (offset + limit)}) %]'
+               [% IF count <= limit + offset %] class='invisible' [% END %] >[% l('Next') %]<span class="nav_arrow_fix">&#9658;</span></a>
+        </span>
+    </div>
+    <div class="clear-both"></div>
+    [% IF ctx.message_update_action.defined %]
+        [% IF ctx.message_update_changed > 0 %]
+        <div class="message-update-summary">
+            [% IF ctx.message_update_action == 'mark_read';
+                l('Marked [_1] message(s) as read.', ctx.message_update_changed);
+               ELSIF ctx.message_update_action == 'mark_unread';
+                l('Marked [_1]  message(s) as unread.', ctx.message_update_changed);
+               ELSIF ctx.message_update_action == 'mark_deleted';
+                l('Deleted [_1] message(s).', ctx.message_update_changed);
+               END
+            %]
+        </div>
+        [% END %]
+        [% IF ctx.message_update_failed > 0 %]
+        <div class="message-update-summary alert">
+            [% IF ctx.message_update_action == 'mark_read';
+                l('Failed to mark [_1] message(s) as read.', ctx.message_update_failed);
+               ELSIF ctx.message_update_action == 'mark_unread';
+                l('Failed to mark [_1]  message(s) as unread.', ctx.message_update_failed);
+               ELSIF ctx.message_update_action == 'mark_unread';
+                l('Failed to delete [_1] message(s).', ctx.message_update_failed);
+               END
+            %]
+        </div>
+        [% END %]
+    [% END %]
+    <div class="clear-both"></div>
+    <div id="messages_main">
+        <form method="post" id="messages-form"
+         onsubmit="if (document.getElementById('acct_messages_actions').value == 'mark_deleted') { return confirm('[% l("Are you sure you wish to permanently delete the selected message(s)?") %]') } else { return true; }">
+            <div class="row">
+                <span class="col-md-11 my-2">
+                    <select class="form-control" name="action" id="acct_messages_actions"
+                        title="[% l('Select your action for the selected messages') %]">
+                        <option id="acct_messages_actions_none" value="">
+                            -- [% l('Actions for selected messages') %] --
+                        </option>
+                        <option value="mark_read">[% l('Mark As Read') %]</option>
+                        <option value="mark_unread">[% l('Mark As Unread') %]</option>
+                        <option value="mark_deleted">[% l('Delete') %]</option>
+                    </select>
+                </span>
+                <span class="col-md-1 my-2">
+                    <input type="submit"
+                        value="[% l('Go') %]"
+                        title="[% l('Go') %]"
+                        class="btn btn-confirm " />
+                </span>
+               <!-- <span style="padding-left:5px;">
+                    <a href="#"><img
+                        alt="[% l('Messages Help') %]"
+                        title="[% l('Actions for messages') %]"
+                        src="[% ctx.media_prefix %]/images/question-mark.png[% ctx.cache_key %]" /></a>
+                </span> -->
+            </div>
+            [% IF count < 1 %]
+            <div class="warning_box">[% l('No messages found.') %]</div>
+            [% ELSE %]
+            <table id="acct_messages_main_header" title="[% l('Messages') %]"
+                class="table table-hover miniTable messagesTable">
+                <thead>
+                <tr>
+                    <th align="center" class="text-center">
+                        <input type="checkbox" title="[% l('Select All Messages') %]"
+                        onclick="var inputs=document.getElementsByTagName('input'); for (i = 0; i < inputs.length; i++) { if (inputs[i].name == 'message_id' &amp;&amp; !inputs[i].disabled) inputs[i].checked = this.checked;}"/>
+                    </th>
+                    <th>[% l('Date') %]</th>
+                    <th>[% l('Library') %]</th>
+                    <th>[% l('Subject') %]</th>
+                    <th></th>
+                </tr>
+                </thead>
+                <tbody>
+                [% FOR message IN ctx.patron_messages; %]
+                    <tr name="acct_message_row"
+                        [% IF !message.is_read %]class="unread-patron-message"[% END %]>
+                        <td align="center">
+                            <span class="sr-only">Message Number [% count; %]</span>
+                        <input type="checkbox" name="message_id" value="[% message.id %]"
+                            [% html_text_attr('title', l('Select message [_1]', message.title)) %]/>
+                        </td>
+                        <td>
+                            <span class="sr-only">Date of Message</span>
+                            [% date.format(ctx.parse_datetime(message.create_date), DATE_FORMAT); %]
+                        </td>
+                        <td>
+                            <span class="sr-only">Library</span>
+                            [% message.library | html %]
+                        </td>
+                        <td>
+                            <span class="sr-only">Title of Message</span>
+                            <a href="[% mkurl('messages', { single => 1, message_id => message.id } ) %]">[% message.title | html %]</a>
+                        </td>
+                        <td>
+                        <span class="sr-only">Message Options</span>
+                            <a href="[% mkurl('messages', { single => 1, message_id => message.id } ) %]" title="Read [% message.title | html %]">Read</a>
+                        </td>
+                    </tr>
+                [% END %]