# run copy retrieval in parallel to bib retrieval
# XXX unapi
- my $copy_rec = OpenSRF::AppSession->create('open-ils.cstore')->request(
+ my $cstore = OpenSRF::AppSession->create('open-ils.cstore');
+ my $copy_rec = $cstore->request(
'open-ils.cstore.json_query.atomic',
- $self->mk_copy_query($rec_id, $org, $depth, $copy_limit, $copy_offset));
+ $self->mk_copy_query($rec_id, $org, $depth, $copy_limit, $copy_offset)
+ );
- my (undef, @rec_data) = $self->get_records_and_facets([$rec_id], undef, {flesh => '{holdings_xml,mra}'});
+ my (undef, @rec_data) = $self->get_records_and_facets([$rec_id], undef, {flesh => '{holdings_xml,mra,acp}'});
$ctx->{bre_id} = $rec_data[0]->{id};
$ctx->{marc_xml} = $rec_data[0]->{marc_xml};
--- /dev/null
- <h2>Copies</h2>
+ <script type="text/javascript" src="[% ctx.media_prefix %]/js/ui/default/acq/common/base64.js"> </script>
+ <script type="text/javascript" src='[% ctx.media_prefix %]/js/ui/default/acq/common/li_table.js'> </script>
+ <script type="text/javascript" src='[% ctx.media_prefix %]/js/ui/default/acq/financial/claim_voucher.js'> </script>
+ <div id='acq-lit-table-container'>
+ <div id='acq-lit-table-div' class='hidden'>
+
+ <!-- Lineitem (bib record) list -->
+ <table id='acq-lit-table' class='oils-generic-table'>
+ <thead>
+ <tr>
+ <th colspan='0'>
+ <table style='width:100%;'>
+ <tr>
+ <td>
+ <span>
+ <select id="acq-lit-li-actions-selector">
+ <option mask='*' value='_'>--Actions--</option>
+ <option mask='sr' value='save_picklist'>Save Items To Selection List</option>
+ <option mask='pl' value='selector_ready'>Mark Ready for Selector</option>
+ <option mask='pl' value='order_ready'>Mark Ready for Order</option>
+ <option mask='*' value='delete_selected'>Delete Selected Items</option>
+ <option mask='*' value='add_brief_record'>Add Brief Record</option>
+ <option mask='*' value='export_attr_list'>Export Single Attribute List</option>
+ <option mask='*' value='batch_apply_funds'>Apply Funds to Selected Items</option>
+ <option mask='po' value='' disabled='disabled'>----PO----</option>
+ <option mask='sr|pl' value='create_order'>Create Purchase Order</option>
+ <option mask='po' value='create_assets'>Load Bibs and Items</option>
+ <option mask='po' value='cancel_lineitems'>Cancel Selected Lineitems</option>
+ <option mask='po' value='change_claim_policy'>Change Claim Policy</option>
+ <option mask='po' value='receive_po'>Mark Purchase Order as Received</option>
+ <option mask='po' value='rollback_receive_po'>Un-Receive Purchase Order</option>
+ <option mask='po' value='print_po'>Print Purchase Order</option>
+ <option mask='po' value='po_history'>View PO History</option>
+ </select>
+ <span id="acq-lit-export-attr-holder" class="hidden">
+ <input dojoType="dijit.form.FilteringSelect" id="acq-lit-export-attr" jsId="acqLitExportAttrSelector" labelAttr="description" searchAttr="description" />
+ <span dojoType="dijit.form.Button" jsId="acqLitExportAttrButton">Export List</span>
+ </span>
+ <span id="acq-lit-cancel-reason" class="hidden">
+ <span id="acq-lit-cancel-reason-selector"></span>
+ <span dojoType="dijit.form.Button" jsId="acqLitCancelLineitemsButton">Cancel Line Items</span>
+ </span>
+ </span>
+ <span id='acq-lit-generic-progress' class='hidden'>
+ <span dojoType="dijit.ProgressBar" style="width:300px" jsId="litGenericProgress"></span>
+ </span>
+ </td>
+ <td>
+ <div style='width:100%;text-align:right;'>
+ <span style='padding-right:15px;'>
+ <a href='javascript:void(0);' id='acq-lit-prev' style='visibility:hidden'>« Previous</a>
+ <a href='javascript:void(0);' id='acq-lit-next' style='visibility:hidden'>Next »</a>
+ </span>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </th>
+ </tr>
+ </thead>
+ <tbody><tr><td colspan='0' style='height:20px;'/></tr></tbody>
+ <tbody style='font-weight:bold;border:1px solid #aaa;'>
+ <tr>
+ <td><span><a id='acq-lit-select-toggle' href='javascript:void(0);'>✓</a></span></td>
+ <td>Line Items</td>
+ <td>Items</td>
+ <td>Notes</td>
+ <td>Actions</td>
+ <td>Status</td>
+ <td>Estimated Price</td>
+ </tr>
+ </tbody>
+ <tbody id='acq-lit-tbody'>
+ <tr id='acq-lit-row' class='acq-lit-row'>
+ <td name='selector'><input type='checkbox' name='selectbox'/></td>
+ <td style='width:75%;'>
+ <table style='width:100%;'>
+ <tbody>
+ <tr>
+ <td rowspan='3' style='width:43px;'><img style='width:40px;height:65px;' name='jacket'></td>
+ <td style='width:70%;font-weight:bold;'>
+ <span name="bib_origin" class="hidden">
+ <img src="/opac/images/book-icon.png" />
+ </span><a attr='title' href='javascript:void(0);'></a>
+ </td>
+ <td rowspan='2' style='text-align:right'>
+ </td>
+ </tr>
+ <tr class='acq-lit-alt-row'>
+ <td colspan='0'>
+ <span attr='author'></span>
+ <span attr='isbn'></span>
+ <span attr='issn'></span>
+ <span attr='edition'></span>
+ <span attr='pubdate'></span>
+ <span attr='publisher'></span>
+ <span name='source_label'></span>
+ </td>
+ </tr>
+ <tr>
+ <td colspan='0'>
+ <span name="liid"># </span>
+ <span name="catalog" class='hidden'> | <a title='Show In Catalog' name="catalog_link" href="javascript:void(0);">➟ catalog</a></span>
+ <span name="link_to_catalog" class='hidden'> | <a title='Link To Catalog Record' name="link_to_catalog_link" href="javascript:void(0);">➾ link to catalog</a></span>
+ <span name="worksheet"> | <a title='Generate Worksheet' name="worksheet_link" href="javascript:void(0);">✍ worksheet</a></span>
+ <span name='pl' class='hidden'> | <a title='Select List' name='pl_link' href='javascript:void(0);'>❖ </a></span>
+ <span name='po' class='hidden'> | <a title='Purchase Order' name='po_link' href='javascript:void(0);'>⌘ </a></span>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ <td><a title='FOOOBAR' name='copieslink' href='javascript:void(0);'>Copies(<span name='count'>0</span>)</a></td>
+ <td>
+ <a name='noteslink' href='javascript:void(0);'>Notes(<span name='notes_count'>0</span>)</a><span name="notes_alert_flag"></span>
+ </td>
+ <td>
+ <select name='actions'>
+ <option name='action_none'>-- Actions --</option>
+ <option name='action_mark_recv' disabled='disabled'>Mark Received</option>
+ <option name='action_mark_unrecv' disabled='disabled'>Un-Receive</option>
+ <option name='action_update_barcodes' disabled='disabled'>Update Barcodes</option>
+ <option name='action_holdings_maint' disabled='disabled'>Holdings Maint.</option>
+ <option name='action_new_invoice' disabled='disabled'>New Invoice</option>
+ <option name='action_link_invoice' disabled='disabled'>Link to Invoice</option>
+ <option name='action_view_invoice' disabled='disabled'>View Invoice(s)</option>
+ <option name='action_view_claim_policy'>Apply Claim Policy</option>
+ <option name='action_manage_claims' disabled='disabled'>Claims</option>
+ <option name='action_view_history'>View History</option>
+ </select>
+ </td>
+ <td><span name='li_state'></span></td>
+ <td><input type='text' size='8' name='price'/></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+
+ <!-- Bib record / Lineitem info table -->
+ [% INCLUDE "default/acq/common/info.tt2" which = "Lit" %]
+
+ <!-- Lineitem notes table -->
+ [% INCLUDE "default/acq/common/notes.tt2" which = "Lit" %]
+
+ <!-- Copies table -->
+ <div id='acq-lit-li-details' class='hidden'>
- </td>
- <td class="acq-lit-li-menu-right">
- <span>
++
++ <div id='acq-lit-copies-li-summary'></div>
++
++ <h3>Add/Edit Items</h3>
++ <hr/>
+
+ <div class='acq-lit-li-menu-bar'>
+ <table style='width:100%'>
+ <tr>
+ <td class="acq-lit-li-menu-left">
+ <div dojoType='dijit.form.Button' id='acq-lit-copies-back-button' scrollOnFocus='false'>↖ Return</div>
+ <span style='margin-left:10px;padding-left:10px;border-left:2px solid #aaa;'>
+ Item Count:
+ <input dojoType='dijit.form.NumberTextBox' jsId='acqLitCopyCountInput'
+ constraints="{min:0,max:1000,places:0}" style='width:40px' value='0'></input>
+ <div dojoType='dijit.form.Button' jsId='acqLitAddCopyCount' scrollOnFocus='false'>Go</div>
+ </span>
- <tbody><tr><td class='acq-lit-table-spacer' colspan='0'/></tr></tbody>
-
- <tbody id='acq-lit-distrib-formula-tbody'>
- <tr id='acq-lit-distrib-form-row'>
- <td colspan='0'>
- <span>Distribution Formulas</span>
- <div name='selector'></div>
- <div name='set_button'></div>
- <div name="reset_button"></div>
- </td>
- </tr>
- </tbody>
-
- <tbody><tr><td class='acq-lit-table-spacer' colspan='0'/></tr></tbody>
- <tbody id="acq-lit-distrib-applied-tbody" class="hidden">
- <tr>
- <td colspan="5" id="acq-lit-distrib-applied-heading">
- Distribution formulas applied to this lineitem:
- </td>
- </tr>
- <tr id="acq-lit-distrib-applied-row" class="acq-lit-distrib-applied-row">
- <th></th>
- <td colspan="4"></td>
- </tr>
- </tbody>
++ <span style='margin-left:10px;padding-left:10px;border-left:2px solid #aaa;'>
+ <div dojoType='dijit.form.Button' jsId='acqLitSaveCopies' scrollOnFocus='false'>Save Changes</div>
+ </span>
+ <span id='acq-lit-update-copies-progress' class='hidden'>
+ <span dojoType="dijit.ProgressBar" style="width:300px" jsId="litUpdateCopiesProgress"></span>
+ </span>
+ </td>
+ </tr>
+ </table>
+ </div>
+
++ <hr/>
++ <table id='acq-lit-distrib-formula-table'>
++ <tbody id='acq-lit-distrib-formula-tbody'>
++ <tr id='acq-lit-distrib-form-row'>
++ <td colspan='0'>
++ <span>Distribution Formulas</span>
++ <div name='selector'></div>
++ <div name='set_button'></div>
++ <div name="reset_button"></div>
++ </td>
++ </tr>
++ </tbody>
++ <tbody id="acq-lit-distrib-applied-tbody" class="hidden">
++ <tr>
++ <td colspan="5" id="acq-lit-distrib-applied-heading">
++ Distribution formulas applied to this lineitem:
++ </td>
++ </tr>
++ <tr id="acq-lit-distrib-applied-row" class="acq-lit-distrib-applied-row">
++ <th></th>
++ <td colspan="4"></td>
++ </tr>
++ </tbody>
++ <table>
++
+ <table id='acq-lit-li-details-table'>
+ <tbody><tr><td class='acq-lit-table-spacer' colspan='0'/></tr></tbody>
+ <tbody style='font-weight:bold;'>
+ <tr>
+ <td style='margin-top:30px;'>Owning Branch</td>
+ <td>Shelving Location</td>
+ <td>Collection Code</td>
+ <td>Fund</td>
+ <td>Circ Modifier</td>
+ <td>Callnumber</td>
+ <td colspan='0'></td>
+ </tr>
+ </tbody>
+ <tbody style='background-color:#ddd;'>
+ <tr id='acq-lit-li-details-batch-row'>
+ <td><div name='owning_lib'></div></td>
+ <td><div name='location'></div></td>
+ <td><div name='collection_code'></div></td>
+ <td><div name='fund'></div></td>
+ <td><div name='circ_modifier'></div></td>
+ <td><div name='cn_label'></div></td>
+ <td colspan='3' style='text-align:left;'>
+ <div dojoType='dijit.form.Button' jsId='acqLitBatchUpdateCopies' scrollOnFocus='false'>Batch Update</div>
+ </td>
+ </tr>
+ </tbody>
+
+
+ <tbody><tr><td class='acq-lit-table-spacer' colspan='0'></td></tr></tbody>
+ <tbody style='font-weight:bold;'>
+ <tr>
+ <td style='margin-top:30px;'>Owning Branch</td>
+ <td>Shelving Location</td>
+ <td>Collection Code</td>
+ <td>Fund</td>
+ <td>Circ Modifier</td>
+ <td>Callnumber</td>
+ <td>Barcode</td>
+ <td>Notes</td>
+ <td colspan='0'></td>
+ </tr>
+ </tbody>
+ <tbody id='acq-lit-li-details-tbody' class='oils-generic-table'>
+ <tr id='acq-lit-li-details-row'>
+ <td><div name='owning_lib'></div></td>
+ <td><div name='location'></div></td>
+ <td><div name='collection_code'></div></td>
+ <td><div name='fund'></div></td>
+ <td><div name='circ_modifier'></div></td>
+ <td><div name='cn_label'></div></td>
+ <td><div name='barcode'></div></td>
+ <td><div name='note'></div></td>
+ <td><a href="javascript:void(0);" name="receive">Mark Received</a><a href="javascript:void(0);" name="unreceive">Un-Receive</a> <a href="javascript:void(0);" name="cancel">Cancel</a><span class="hidden" name="cancel_reason"></span> <a href="javascript:void(0);" name="claim">Claim</a></td>
+ <td><div name='delete' dojoType='dijit.form.Button' style='color:red;' scrollOnFocus='false'>X</div></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+
+
+ <!-- Copies table -->
+ <div id='acq-lit-real-copies-div' class='hidden'>
+ <h2>Copies</h2>
+
+ <div class='acq-lit-li-menu-bar'>
+ <table style='width:100%'>
+ <tr>
+ <td style='text-align:left;'>
+ <div dojoType='dijit.form.Button' id='acq-lit-real-copies-back-button' scrollOnFocus='false'>↖ Return</div>
+ </td>
+ <td style='text-align:right;'>
+ <span>
+ <div dojoType='dijit.form.Button' jsId='acqLitSaveRealCopies' scrollOnFocus='false'>Save Changes</div>
+ </span>
+ </td>
+ </tr>
+ </table>
+ </div>
+
+ <table id='acq-lit-real-copies-table'>
+ <tbody style='font-weight:bold;'>
+ <tr>
+ <td style='margin-top:30px;'>Owning Branch</td>
+ <td>Shelving Location</td>
+ <td>Circ Modifier</td>
+ <td>Callnumber</td>
+ <td>Barcode</td>
+ <td colspan='0'></td>
+ </tr>
+ </tbody>
+ <tbody id='acq-lit-real-copies-tbody' class='oils-generic-table'>
+ <tr id='acq-lit-real-copies-row'>
+ <td><div name='owning_lib'></div></td>
+ <td><div name='location'></div></td>
+ <td><div name='circ_modifier'></div></td>
+ <td><div name='label'></div></td>
+ <td><div name='barcode'></div></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+
+ <div class="hidden">
+ <div jsId="acqLitLinkInvoiceDialog" dojoType="dijit.Dialog">
+ [% INCLUDE "default/acq/common/inv_dialog.tt2" which = "li" %]
+ </div>
+ </div>
+
+ <div class='hidden' id='acq-lit-progress-numbers'>
+ <table class='oils-generic-table'>
+ <tbody>
+ <tr>
+ <td>Lineitems Processed</td>
+ <td><span id='acq-pl-lit-li-processed'>0</span></td>
+ </tr>
+ <tr>
+ <td>Items Processed</td>
+ <td><span id='acq-pl-lit-lid-processed'>0</span></td>
+ </tr>
+ <tr>
+ <td>Debits Encumbered</td>
+ <td><span id='acq-pl-lit-debits-processed'>0</span></td>
+ </tr>
+ <tr>
+ <td>Bib Records Imported</td>
+ <td><span id='acq-pl-lit-bibs-processed'>0</span></td>
+ </tr>
+ <tr>
+ <td>Bib Records Indexed</td>
+ <td><span id='acq-pl-lit-indexed-processed'>0</span></td>
+ </tr>
+ <tr>
+ <td>Copies Processed</td>
+ <td><span id='acq-pl-lit-copies-processed'>0</span></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+
+ <div class='hidden'>
+ <div dojoType='dijit.Dialog' jsId='acqLitPoCreateDialog'>
+ <table class='oils-generic-table'>
+ <tr>
+ <td>Ordering Agency</td>
+ <td><div name='ordering_agency' id='acq-lit-po-agency'></div></td>
+ </tr>
+ <tr>
+ <td>Provider</td>
+ <td><div name='provider' id='acq-lit-po-provider'></div></td>
+ </tr>
+ <tr>
+ <td>Prepayment Required</td>
+ <td><input id="acq-lit-po-prepay" name="prepayment_required" dojoType="dijit.form.CheckBox"/></td>
+ </tr>
+ <tr>
+ <td>All Lineitems</td>
+ <td><input checked='checked' name='create_from' value='all' dojoType='dijit.form.RadioButton'/></td>
+ </tr>
+ <tr>
+ <td>Selected Lineitems</td>
+ <td><input name='create_from' value='selected' dojoType='dijit.form.RadioButton'/></td>
+ </tr>
+ <tr>
+ <td>Import Bibs and Create Copies</td>
+ <td><input name='create_assets' dojoType='dijit.form.CheckBox'/></td>
+ </tr>
+ <tr>
+ <td colspan='2'>
+ <div dojoType='dijit.form.Button' type='submit' jsId='acqLitCreatePoSubmit'>Submit</div>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </div>
+
+ <div class="hidden">
+ <div dojoType="dijit.Dialog" jsId='acqLitSavePlDialog'>
+ <table class='dijitTooltipTable'>
+ <tr>
+ <td colspan='2'>
+ <input dojoType="dijit.form.RadioButton" name="which" type='radio' checked='checked' value='selected'/>
+ <label for="name">Save selected</label>
+ <input dojoType="dijit.form.RadioButton" name="which" type='radio' value='all'/>
+ <label for="name">Save all</label>
+ </td>
+ </tr>
+ <tr><td colspan='2'><hr/></td></tr>
+ <tr>
+ <td><label for="new_name">Save as Selection List: </label></td>
+ <td><input dojoType="dijit.form.TextBox" name="new_name"/></td>
+ </tr>
+ <tr>
+ <td><label for="existing_pl">Add to Selection List: </label></td>
+ <td>
+ <input jsId="acqLitAddExistingSelect" dojoType="openils.widget.PCrudAutocompleteBox" fmclass="acqpl" searchAttr="name" name="existing_pl" />
+ </td>
+ </tr>
+ <tr>
+ <td colspan='2' align='center'>
+ <button dojoType='dijit.form.Button' type="submit" jsId='acqLitSavePlButton'>Save</button>
+ </td>
+ </tr>
+ </table>
+ </div>
+
+ <div dojoType="dijit.Dialog" jsId="lidCancelDialog">
+ <label for="acq-lit-lid-cancel-reason">Reason:</label>
+ <span id="acq-lit-lid-cancel-reason"></span>
+ <span dojoType="dijit.form.Button"
+ jsId="acqLidCancelButton">Cancel Copy</span>
+ </div>
+ <div dojoType="dijit.Dialog" jsId="liClaimPolicyDialog">
+ <label for="acq-lit-li-claim-policy">Claim policy:</label>
+ <span id="acq-lit-li-claim-policy"></span>
+ <span dojoType="dijit.form.Button"
+ jsId="liClaimPolicySave">Save</span>
+ </div>
+ <div dojoType="dijit.Dialog" jsId="liClaimDialog">
+ [% INCLUDE "default/acq/common/claim_dialog.tt2" %]
+ </div>
+ <div dojoType="dijit.Dialog" jsId="finalClaimDialog">
+ [% INCLUDE "default/acq/common/final_claim_dialog.tt2" %]
+ </div>
+ <div dojoType="dijit.Dialog" jsId="batchFundUpdateDialog" title="Batch Update Funds">
+ <div>
+ This will update the fund for all copies attached to these lineitems.<br/>
+ This will also update any existing encumbered or spent debits.
+ </div>
+ <br/>
+ <table class='oils-generic-table'>
+ <tr>
+ <td>
+ <span>Select a new fund:</span>
+ </td>
+ <td>
+ <div id='acq-lit-batch-fund-selector'></div>
+ </td>
+ </tr>
+ <tr>
+ <td><button dojoType='dijit.form.Button' jsId='batchFundUpdateCancel'>Cancel</button></td>
+ <td><button dojoType='dijit.form.Button' jsId='batchFundUpdateSubmit'>Submit</button></td>
+ </tr>
+ </table>
+ </div>
+ </div>
+
+ <div dojoType="dijit.Dialog" jsId='acqLitChangeLiStateDialog'>
+ <table class='dijitTooltipTable'>
+ <tr>
+ <td>
+ <input dojoType="dijit.form.RadioButton" name="which" type='radio' checked='checked' value='selected'/>
+ <label for="name">Mark selected</label>
+ <input dojoType="dijit.form.RadioButton" name="which" type='radio' value='all'/>
+ <label for="name">Mark all</label>
+ </td>
+ </tr>
+ <tr>
+ <td colspan='2' align='center'>
+ <button dojoType='dijit.form.Button' type="submit" jsId='acqLitCancelLiStateButton'>Cancel</button>
+ <button dojoType='dijit.form.Button' type="submit" jsId='acqLitSaveLiStateButton'>Go</button>
+ </td>
+ </tr>
+ </table>
+ </div>
+
+
+ <div class='hidden'>
+ <div dojoType='openils.widget.ProgressDialog' jsId='progressDialog'></div>
+ </div>
+
+ </div>
+
--- /dev/null
- <select type="text" name="authAxis" value="" dojoType="dijit.form.FilteringSelect" trim="true" id="authAxis" propercase="false" style="width: 10em;">
- <option value="authority.author">Author</option>
- <option value="authority.subject">Subject</option>
- <option value="authority.title">Title</option>
- <option value="authority.topic">Topic</option>
- </select>
+ [% ctx.page_title = 'Authority record list' %]
+ [% WRAPPER default/base.tt2 %]
+
+ <script type="text/javascript" src='[% ctx.media_prefix %]/js/ui/default/cat/authority/list.js'> </script>
+
+ <div dojoType="dijit.form.Form" id="myForm" jsId="myForm" encType="multipart/form-data" action="" method="">
+ <span style="white-space: nowrap;">
+ <label for="authTerm">Search term: </label>
+ <input type="text" name="authTerm" value="" dojoType="dijit.form.TextBox" trim="true" id="authTerm" propercase="false"/>
+ </span>
+ <span style="white-space: nowrap;">
+ <label for="authAxis">Authority type: </label>
++ <input
++ id="authAxis"
++ name="authAxis"
++ jsId="authAxis"
++ dojoType="openils.widget.PCrudAutocompleteBox"
++ fmclass="aba"
++ searchAttr="name"
++ fetchProperties="{ sort: [{attribute:'name'}] }"
++ propercase="false"
++ hasDownArrow="true"
++ store_options="{ honor_retrieve_all:true }"
++ trim="true"
++ />
+ </span>
+ <!-- Not currently useful - see authOUListInit() above -->
+ <!-- <label for="authOU">Library: </label><select dojoType="openils.widget.OrgUnitFilteringSelect" id="authOU" name="authOU" searchAttr="shortname" labelAttr="shortname"></select> -->
+
+ <span style="white-space: nowrap;">
+ <span dojoType="dijit.form.Button" type="button" value="Previous">Previous
+ <script type="dojo/method" event="onClick" args="evt">
+ displayRecords({"page":"prev"});
+ </script>
+ </span>
+
+ <label for="authPage">Page: </label>
+ <input dojoType="dijit.form.NumberSpinner" value="0" constraints="{min:-100,max:100,places:0}" smallDelta="1" id="authPage" name="authPage" style="width:5em;" />
+
+ <span dojoType="dijit.form.Button" type="button" value="Next">Next
+ <script type="dojo/method" event="onClick" args="evt">
+ displayRecords({"page":"next"});
+ </script>
+ </span>
+ </span>
+
+ <span style="white-space: nowrap;">
+ <span dojoType="dijit.form.Button" type="button" value="Submit">Submit
+ <script type="dojo/method" event="onClick" args="evt">
+ displayRecords();
+ </script>
+ </span>
+ </span>
+ </div>
+
+ <hr />
+
+ <div id='mergebox-div' class='hidden' style='float:right; border: 4px solid; width: 25%;'>
+ <div style="border-bottom: 4px solid; text-align: center;">
+ <div dojoType="dijit.form.Form" encType="multipart/form-data" action="" method="">
+ <div dojoType="dijit.form.Button" type="button" value="Merge">Merge
+ <script type="dojo/method" event="onClick" args="evt">
+ mergeRecords();
+ </script>
+ </div>
+ <div dojoType="dijit.form.Button" type="button" value="Clear">Clear
+ <script type="dojo/method" event="onClick" args="evt">
+ clearMergeRecords();
+ </script>
+ </div>
+ </div>
+ </div>
+ <table>
+ <tbody id='mergebox-tbody'>
+ </tbody>
+ </table>
+ </div>
+
+
+ <div id='authlist-div'></div>
+
+ [% END %]
--- /dev/null
- function() { cradGrid.loadAll({order_by : {crad : 'name'}}) }
+ [% WRAPPER default/base.tt2 %]
+ [% ctx.page_title = 'MARC Record Attribute Definitions' %]
+ <h1>Record Attribute Definitions</h1> <br/>
+
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="client" class='oils-header-panel'>
+ <div>Record Attribute Definitions</div>
+ <div>
+ <button dojoType='dijit.form.Button' onClick='cradGrid.showCreateDialog()'>New Attr. Definition</button>
+ <button dojoType='dijit.form.Button' onClick='cradGrid.deleteSelected()'>Delete Selected</button>
+ </div>
+ </div>
+
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="client">
+ <table jsId="cradGrid"
+ autoHeight='true'
+ dojoType="openils.widget.AutoGrid"
+ fieldOrder="['name', 'label']",
+ query="{name: '*'}"
+ fmClass='crad'
+ showPaginator='true'
+ editOnEnter='true'/>
+ </div>
+
+ <script type ="text/javascript">
+ dojo.require('openils.widget.AutoGrid');
+ openils.Util.addOnLoad(
++ function() {
++ // avoid loading the entire config.xml_transform object
++ cradGrid.overrideWidgetArgs.format = {searchOptions : {"select":{"cxt":["name"]}}};
++ cradGrid.loadAll({order_by : {crad : 'name'}})
++ }
+ );
+ </script>
+
+ [% END %]
--- /dev/null
- ctx.page_title = l("Advanced Search") %]
+ [% PROCESS "default/opac/parts/header.tt2";
+ WRAPPER "default/opac/parts/base.tt2";
+ INCLUDE "default/opac/parts/topnav.tt2";
- <a href="#" alt="[% l('Advanced Search') %]" id="adv_search"></a>
-<!-- <a href="#" alt="[% l('Numeric Search') %]" id="num_search"></a>
- <a href="#" alt="[% l('Expert Search') %]" id="expert_search"></a> -->
++ ctx.page_title = l("Advanced Search");
++ pane = CGI.param("pane") || "advanced" %]
+ <div id="search-wrapper">
+ [% INCLUDE "default/opac/parts/printnav.tt2" %]
+ <div id="adv_search_parent">
+ <div id="adv_search_tabs">
++ <a href="?pane=advanced" alt="[% l('Advanced Search') %]" [% IF pane == 'advanced' %]class="on" [% END %]id="adv_search"></a>
++ <a href="?pane=numeric" alt="[% l('Numeric Search') %]" [% IF pane == 'numeric' %]class="on" [% END %]id="num_search"></a>
++ <a href="?pane=expert" alt="[% l('Expert Search') %]" [% IF pane == 'expert' %]class="on" [% END %]id="expert_search"></a>
+ </div>
+ </div>
+ </div>
+ <div id="content-wrapper">
+ <div id="main-content">
+ <div class="advanced_div">
++ [% IF pane == 'advanced' %]
+ [% INCLUDE "default/opac/parts/advanced/search.tt2" %]
++ [% ELSIF pane == 'numeric' %]
++ [% INCLUDE "default/opac/parts/advanced/numeric.tt2" %]
++ [% ELSIF pane == 'expert' %]
++ [% INCLUDE "default/opac/parts/advanced/expert.tt2" %]
++ [% END %]
+ </div>
+ <div class="common-full-pad"></div>
+ </div>
+ </div>
+ [% END %]
--- /dev/null
- <!-- XXX TODO select all js --><input id="pay_fines_box1" checked="checked"
- type="checkbox" title="[% l('Click to (un)select all fines') %]" />
+ [% PROCESS "default/opac/parts/header.tt2";
+ PROCESS "default/opac/parts/misc_util.tt2";
+ WRAPPER "default/opac/parts/myopac/main_base.tt2";
+ myopac_page = "main";
+ myopac_main_page = "main";
+ %]
+ <form action="[% ctx.opac_root %]/myopac/main_payment_form" method="GET">
+ [% IF ctx.fines.circulation.size > 0 %]
+ <div id='myopac_circ_trans_div'>
+ <table width='100%' class='data_grid'>
+ <thead>
+ <tr>
+ <td colspan='10' style='padding: 6px'>
+ <strong>[% l("Fines") %]</strong>
+ </td>
+ </tr>
+ <tr>
+ <td>[% l("Title") %]</td>
+ <td>[% l("Author") %]</td>
+ <td>[% l("Checkout Date") %]</td>
+ <td>[% l("Due Date") %]</td>
+ <td>[% l("Date Returned") %]</td>
+ <td>[% l("Balance Owed") %]</td>
+ <td nowrap="nowrap" style="white-space:nowrap;">
- title="[% l('Pay this fine') %]" name="xact" value="[% f.xact.id %]" />
++ <input id="pay_fines_box1" checked="checked"
++ type="checkbox" onchange="select_all_checkboxes('xact', this.checked)"
++ title="[% l('Click to (un)select all fines') %]" />
+ <label for="pay_fines_box1">[% l('Pay Fines') %]</label>
+ </td>
+ </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'>
+ <td>
+ [% recid = f.xact.circulation.target_copy.call_number.record.id || f.xact.reservation.target_resource_type.record.id;
+ IF recid; %]
+ <a href="[% ctx.opac_root %]/record/[% recid %]">[% attrs.title %]</a>
+ [% ELSE %]
+ [% attrs.title %]
+ [% END %]
+ </td>
+ <td>
+ <a href="[% ctx.opac_root %]/results?qtype=author&query=[% attrs.author | replace('[,\.:;]', '') | url %]">[% attrs.author %]</a>
+ </td>
+ <td name='myopac_circ_trans_start'>
+ [% 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;
+ IF ts;
+ date.format(ctx.parse_datetime(ts), 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="red">[% l('(fines accruing)') %]</span>
+ [% END %]
+ </td>
+ <td>
+ <strong class="red">
+ [% money(f.xact.balance_owed) %]
+ </strong>
+ </td>
+ <td>
+ <input type="checkbox" checked="checked"
- type="checkbox"
++ title="[% l('Pay this fine') %]" name="xact"
++ value="[% f.xact.id %]" />
+ </td>
+ </tr>
+ [% END %]
+ </tbody>
+ </table>
+ </div>
+ [% END %]
+
+ [% IF ctx.fines.grocery.size > 0 %]
+ <!-- Table for all non-circulation transactions -->
+ <div id='myopac_trans_div'>
+ <br/>
+ <hr class='opac-auto-013' color="#dcdbdb" />
+ <br/>
+ <table width='100%' class='data_grid data_grid_center'
+ id='myopac_trans_table'>
+ <thead>
+ <tr>
+ <td colspan='8' style='padding: 6px'>
+ <b>[% l("Other Fees") %]</b>
+ </td>
+ </tr>
+ <tr>
+ <td width='16%'>[% l("Transaction Start Time") %]</td>
+ <td width='16%'>[% l("Last Payment Time") %]</td>
+ <td width='16%'>[% l("Initial Amount Owed") %]</td>
+ <td width='16%'>[% l("Total Amount Paid") %]</td>
+ <td width='16%'>[% l("Balance Owed") %]</td>
+ <td width='16%'>[% l("Billing Type") %]</td>
+ <td width='4%' align="center" nowrap="nowrap"
+ style="white-space:nowrap;">
+ <input id="pay_fines_box2" checked="checked"
- name="xact" value="[% f.xact.id %]" />
++ type="checkbox" onchange="select_all_checkboxes('xact_misc', this.checked)"
+ title="[% l('Click to (un)select all fines') %]" />
+ <label for="pay_fines_box2">[% l("Pay Fines") %]</label>
+ </td>
+ </tr>
+ </thead>
+ <tbody id='myopac_trans_tbody'>
+ [% FOR f IN ctx.fines.grocery %]
+ <tr id='myopac_trans_row'>
+ <td>[% date.format(
+ ctx.parse_datetime(f.xact.xact_start),
+ DATE_FORMAT
+ ) %]</td>
+ <td>
+ [% IF f.xact.last_payment_ts;
+ date.format(
+ ctx.parse_datetime(
+ f.xact.last_payment_ts
+ ), DATE_FORMAT
+ );
+ END %]
+ </td>
+ <td>[% money(f.xact.total_owed) %]</td>
+ <td>[% money(f.xact.total_paid) %]</td>
+ <td class="red">
+ <strong>
+ [% money(f.xact.balance_owed) %]
+ </strong>
+ </td>
+ <td>[% f.xact.last_billing_type %]</td>
+ <td>
+ <input type="checkbox" title='[% l("Pay this fine") %]'
++ name="xact_misc" value="[% f.xact.id %]"
++ checked="checked" />
+ </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>
+ [% ELSE %]
+ <div class="text-right pad-top-ten">
+ <input type="image"
+ alt="[% l('Pay selected fines') %]"
+ title="[% l('Pay selected fines') %]"
+ onmouseover="this.src='[% ctx.media_prefix %]/images/pay-fines-btn-hover.png';"
+ onmouseout="this.src='[% ctx.media_prefix %]/images/pay-fines-btn.png';"
+ src="[% ctx.media_prefix %]/images/pay-fines-btn.png" />
+ </div>
+ [% END %]
+ </form>
+ [% END %]
--- /dev/null
- [% ctx.payment_response.desc %]
+ [% PROCESS "default/opac/parts/header.tt2";
+ PROCESS "default/opac/parts/misc_util.tt2";
+ WRAPPER "default/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 %]
+ </div>
+ <p>
+ <a href="[% ctx.opac_root %]/myopac/main"
+ onclick="history.go(-1); return false;">[% l('Go back') %]</a>
+ [% l('to try again or to cancel this payment attempt.') %]
+ </p>
+ [% ELSE %]
+ <p><big>[% l('Your payment has been approved.') %]</big></p>
+ [% IF ctx.printable_receipt.template_output;
+ print_args = [];
+ FOR p IN ctx.payment_response.payments;
+ print_args.push('payment=' _ p);
+ END %]
+ <p>[ <a href="[% ctx.opac_root %]/myopac/receipt_print?[% print_args.join('&') %]"
+ target="_egrecpt"
+ onclick="try { print_node('printable-receipt'); } catch (e) { window.print(); } return false;">[% l('Print receipt') %]</a> ]</p>
+ <tt id="printable-receipt">
+ [% ctx.printable_receipt.template_output.data %]
+ </tt>
+ [% 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')
+ ) %]
+ </div>
+ [% END %]
++ <p>[ <a href="[% ctx.opac_root %]/myopac/main">[%
++ l("Back to Account Summary") %]</a> ]</p>
+ [% END %]
+ </div>
+ [% END %]
--- /dev/null
- <form action="[% ctx.opac_root %]/myopac/main_pay" method="POST"
- onsubmit="return confirm('[% l("Are you sure you are ready to charge [_1] to your credit card?", money(ctx.fines.balance_owed)) %]');">
+ [% PROCESS "default/opac/parts/header.tt2";
+ PROCESS "default/opac/parts/misc_util.tt2";
+ WRAPPER "default/opac/parts/myopac/main_base.tt2";
+ myopac_page = "main";
+ myopac_main_page = "payment_form";
++
++ last_chance = CGI.param("last_chance");
++
+ %]
+ [% IF ctx.fines.balance_owed <= 0 %]
+ <div>
+ [% l("You either have no fines to pay or you have selected fines whose " _
+ "total is non-positive. We cannot process non-positive amounts.") %]
+ </div>
+ [% ELSE %]
+ <div id="pay_fines_now">
- [% l('Selected fines you are paying for:') %]
- <table cellpadding="0" cellspacing="5" border="0">
++ [% IF last_chance %]
++ <p><big>[% l("Are you sure you are ready to charge [_1] to your credit card?", money(ctx.fines.balance_owed)) %]</big></p>
++ <form action="[% ctx.opac_root %]/myopac/main_pay" method="POST">
++ [% FOR k IN CGI.Vars;
++ NEXT UNLESS k %]
++ <input type="hidden" name="[% k | html %]" value="[% CGI.param(k) | html %]" />
++ [% END %]
++ <input type="submit" value="[% l('Submit Payment') %]" />
++ <input type="reset" value="[% l('Cancel') %]"
++ onclick="history.go(-1);" />
++ [% ELSE %]
++ <form method="POST">
++ <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 %]
++
+ <table>
+ <tbody>
+ <tr>
+ <td colspan='2'><strong>[% l('Billing Information') %]</strong></td>
+ <td rowspan='13' valign='top'>
- NEXT IF CGI.param('xact').size &&
- !CGI.param('xact').grep(f.xact.id).size %]
++ <p>[% l('Selected fines you are paying for:') %]</p>
++ <table cellpadding="0" cellspacing="0" border="0" class="myopac_payments_table">
+ <thead>
+ <tr>
+ <th>[% l('Name') %]</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 %]</td>
+ <td class="text-right">[% money(f.xact.balance_owed) %]</td>
+ </tr>
+ [%
+ END;
+ FOR f IN ctx.fines.grocery;
- <td>
- <div style="position:absolute;">
- <div style="position:relative;left:80px;">
- <a href="#"><img
- src="[% ctx.media_prefix %]/images/question-mark.png" /></a>
- </div>
- </div>
- [% l('Security Code') %]
- </td>
++ NEXT IF CGI.param('xact_misc').size &&
++ !CGI.param('xact_misc').grep(f.xact.id).size %]
+ <tr>
+ <td>[% f.xact.last_billing_type %]</td>
+ <td class="text-right">[% money(f.xact.balance_owed) %]</td>
+ </tr>
+ [% END %]
+ </tbody>
+ </table>
+ <br />
+ <div>
+ [% l('Total amount to pay:') %]
+ <strong>[% money(ctx.fines.balance_owed) %]</strong>
+ </div>
+ <br />
+ [% | l('<strong>', '</strong>') %]Click [_1]Cancel[_2] to go back and (un)select other fines.[% END %]
+ </td>
+ </tr>
+ <tr>
+ <td>[% l('First Name') %]</td>
+ <td><input type="text" name="billing_first" value="[% ctx.user.first_given_name | html %]" /></td>
+ </tr>
+ <tr>
+ <td>[% l('Last Name') %]</td>
+ <td><input type="text" name="billing_last" value="[% ctx.user.family_name | html %]" /></td>
+ </tr>
+ <tr>
++ <td>[% l('Email Address') %]</td>
++ <td>
++ <input type="text" disabled="disabled" readonly="readonly" value="[% ctx.user.email | html %]" />
++ <a href="[% ctx.opac_root %]/myopac/update_email?return_to_referer=1">[% l("Update") %]</a>
++ </td>
++ </tr>
++ <tr>
+ <td>[% l('Street Address') %]</td>
+ <td><input type="text" name="billing_address" value="[% ctx.user.billing_address.street1 _ ctx.user.billing_address.street2 | html %]" /></td>
+ </tr>
+ <tr>
+ <td>[% l('City' )%]</td>
+ <td><input type="text" name="billing_city" value="[% ctx.user.billing_address.city | html %]" /></td>
+ </tr>
+ <tr>
+ <td>[% l('State or Province') %]</td>
+ <td><input type="text" name="billing_state" value="[% ctx.user.billing_address.state | html %]" /></td>
+ </tr>
+ <tr>
+ <td>[% l('ZIP or Postal Code') %]</td>
+ <td><input type="text" name="billing_zip" value="[% ctx.user.billing_address.post_code | html %]" /></td>
+ </tr>
+ <tr>
+ <td colspan='2'><strong>[% l('Credit Card Information') %]</strong></td>
+ </tr>
+ <!-- Technically not needed since card type is derived from the CC number
+ <tr>
+ <td>Type of Card</td>
+ <td>
+ <select name="type">
+ <option value='VISA'>VISA</option>
+ <option value='MasterCard'>MasterCard</option>
+ <option value='American Express'>American Express</option>
+ </select>
+ </td>
+ </tr>
+ -->
+ <tr>
+ <td>[% l('Credit Card #') %]</td>
+ <td><input type="text" name="number" maxlength="16" /></td>
+ </tr>
+ <tr>
- <input type="submit" value="[% l('Submit Payment') %]" />
++ <td>[% l('Security Code') %]</td>
+ <td>
+ <input type="text" size="4" maxlength="5" name="cvv2" />
+ </td>
+ </tr>
+ <tr>
+ <td>[% l('Exipration Month') %]</td>
+ <td>
+ <select name="expire_month">
+ <option value="01">[% l("January") %]</option>
+ <option value="02">[% l("February") %]</option>
+ <option value="03">[% l("March") %]</option>
+ <option value="04">[% l("April") %]</option>
+ <option value="05">[% l("May") %]</option>
+ <option value="06">[% l("June") %]</option>
+ <option value="07">[% l("July") %]</option>
+ <option value="08">[% l("August") %]</option>
+ <option value="09">[% l("September") %]</option>
+ <option value="10">[% l("October") %]</option>
+ <option value="11">[% l("November") %]</option>
+ <option value="12">[% l("December") %]</option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td>[% l('Expiration Year') %]</td>
+ <td>
+ <select name="expire_year">
+ [% 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' align="center">
++ <input type="submit" value="[% l('Next') %]" />
+ <input type="reset" value="[% l('Cancel') %]"
+ onclick="history.go(-1);" />
+ </td>
+ </tr>
+ [% INCLUDE "default/opac/parts/myopac/main_refund_policy.tt2" %]
+ </tbody>
+ </table>
++ [% END %]
+ </form>
+ </div>
+ [% END %]
+ [% END %]
--- /dev/null
- <table id='myopac_payments_table' width='100%' class='data_grid'>
+ [% PROCESS "default/opac/parts/header.tt2";
+ PROCESS "default/opac/parts/misc_util.tt2";
+ WRAPPER "default/opac/parts/myopac/main_base.tt2";
+ myopac_page = "main";
+ myopac_main_page = "payments";
+ limit = ctx.payment_history_limit;
+ offset = ctx.payment_history_offset;
+ %]
+
+ <div>
+ <div class="header_middle">
+ <span class="float-left">[% l('Payments History') %]</span>
+ <span class='float-left' style='padding-left: 10px;'>
+ <a href='main_payments?limit=[% limit %]&offset=[% offset - limit %]'
+ [% IF offset == 0 %] class='invisible' [% END %]><span class="nav_arrow_fix">◄</span>[% l('Previous') %]</a>
+ [%# TODO: get total to prevent paging off then end of the list.. %]
+ <a href='main_payments?limit=[% limit %]&offset=[% offset + limit %]'
+ [% IF ctx.payments.size < limit %] class='invisible' [% END %] >[% l('Next') %]<span class="nav_arrow_fix">►</span></a>
+ </span>
+ </div>
+ <div class="clear-both"></div>
+
++ [% IF ctx.payments.size %]
++ <table class='myopac_payments_table data_grid' 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>[% date.format(ctx.parse_datetime(payment.mp.payment_ts), DATE_FORMAT) %]</td>
+ <td>[% (payment.xact_type == 'grocery') ? payment.last_billing_type : payment.title %]</td>
+ <td>[% money(payment.mp.amount) %]</td>
+ <td>
+ <form action="[% ctx.opac_root %]/myopac/receipt_print" method="POST">
+ <input type="hidden" name="payment" value="[% payment.mp.id %]" />
+ <input type="submit" value="[% l('Print') %]" />
+ </form>
+ <form action="[% ctx.opac_root %]/myopac/receipt_email" method="POST">
+ <input type="hidden" name="payment" value="[% payment.mp.id %]" />
+ <input 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 %]
--- /dev/null
+ [% PROCESS "default/opac/parts/header.tt2";
+ PROCESS "default/opac/parts/misc_util.tt2";
+ WRAPPER "default/opac/parts/myopac/base.tt2";
+ myopac_page = "prefs" %]
+ [% IF ctx.email_receipt_result; # result should be undef on success %]
+ <div class="payment-error">
+ [% l('Error preparing receipt:') %]
+ <span title="[% ctx.email_receipt_result.textcode %]">
+ [% ctx.email_receipt_result.desc %]
+ </span>
+ </div>
+ [% ELSE %]
+ <div>[% l('Your receipt will be emailed to [_1]', ctx.user.email) %]</div>
+ [% END %]
++ <p>
++ [ <a href="[% ctx.opac_root %]/myopac/main_payments">[%
++ l("Back to Payments History") %]</a> ]
++ </p>
+ [% END %]
--- /dev/null
+ [%# sic! no wrapper %]
+ <html>
+ <head>
+ <title>[% l('Receipt') %]</title>
+ </head>
+ <body onload="if (document.getElementById('printable-receipt')) window.print();">
+ [% IF ctx.printable_receipt.template_output %]
+ <tt id="printable-receipt">
+ [% ctx.printable_receipt.template_output.data %]
+ </tt>
+ [% ELSE %]
+ <div class="payment-error">
+ [% l(
+ 'Error preparing 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')
+ ) %]
+ </div>
+ [% END %]
++ <hr />
++ <p>[ <a href="[% ctx.opac_root %]/myopac/main_payments">[%
++ l("Back to Payments History") %]</a> ]</p>
+ </body>
+ </html>
--- /dev/null
+ [% PROCESS "default/opac/parts/header.tt2";
+ PROCESS "default/opac/parts/misc_util.tt2";
+ WRAPPER "default/opac/parts/myopac/base.tt2";
+ myopac_page = "prefs" %]
+ <div id='myopac_summary_div' style="padding:0px;">
+
+ [% IF ctx.invalid_email %]
+ <div id='account-update-email-error'>
+ [% | l(ctx.invalid_email) %]
+ The email address "<b>[_1]</b>" is invalid. Please try a different email address.
+ [% END %]
+ </div>
+ [% END %]
+
+ <form method='POST' id='account-update-email'>
++ [% IF CGI.param("return_to_referer") %]
++ <input type="hidden" name="redirect_to" value="[% ctx.referer | html %]" />
++ [% END %]
+ <table>
+ <tr><td>[% l('Current Email') %]</td><td>[% ctx.user.email | html %]</td></tr>
+ <tr><td>[% l('New Email') %]</td><td><input type='text' name='email' value='[% ctx.invalid_email | html %]'/></td></tr>
+ <tr><td colspan='2' align='center'><input type='submit'/></td></tr>
+ </table>
+ </form>
+
+ [% END %]
--- /dev/null
-<tr[% IF loop.first %] id="adv_global_row"[% END %]>
+ [%
+ contains_options = [
+ {value => 'contains', label => l('Contains')},
+ {value => 'nocontains', label => l('Does not contain')},
+ {value => 'phrase', label => l('Contains phrase')},
+ {value => 'exact', label => l('Matches exactly')}
+ ];
+ contains = CGI.param('contains');
+ queries = CGI.param('query');
++ bools = CGI.param('bool') || ['and' x 3];
+ qtypes = CGI.param('qtype') || ['keyword' x 3];
+ FOR qtype IN qtypes;
+ c = contains.shift;
++ b = bools.shift;
+ q = queries.shift; %]
- [% FOR o IN contains_options;
- |l(o.value, o.label) -%]
- <option value="[_1]"[% c == o.value ? ' selected="selected"' : '' %]>[_2]</option>
- [% END; END %]
++
++<!-- tag the second row so the bool column won't be hidden -->
++<tr[% IF loop.index == 1 %] id="adv_global_row"[% END %]>
+ <td align='left' width='100%' nowrap='nowrap'>
++
++ <!-- bool selector. hide for first row. safe to ignore first bool value in form submission -->
++ <select name='bool' style='width: auto' [% IF loop.first %] class='invisible' [% END %]>
++ <option value='and' [% b == 'and' ? 'selected="selected"' : '' %]>[% l('And') %]</option>
++ <option value='or' [% b == 'or' ? 'selected="selected"' : '' %]>[% l('Or') %]</option>
++ </select>
++
++ <!-- keyword, subject, etc. selector -->
+ <span class="opac-auto-078">
+ [% INCLUDE "default/opac/parts/qtype_selector.tt2"
+ query_type=qtype %]
+ </span>
++
+ <select name='contains' style='margin-right: 7px;'>
- onclick='var row = this.parentNode.parentNode;var tbody = row.parentNode; if( tbody.getElementsByTagName("tr").length > 2 ) row.parentNode.removeChild(row);'><img src="[% ctx.media_prefix %]/images/adv_row_close_btn.png" /></a>
++ [% FOR o IN contains_options; -%]
++ <option value="[% o.value %]" [% c == o.value ? ' selected="selected"' : '' %]>[% o.label %]</option>
++ [% END %]
+ </select>
+ <input type='text' size='18' name='query' value="[% q | html %]" x-webkit-speech />
+ <a href="javascript:;" class="row-remover"
+ title="[% l('Remove row') %]" alt="[% l('Remove row') %]"
-[% i = i + 1;
- END %]
++ onclick='return killRowIfAtLeast(2, this);'><img src="[% ctx.media_prefix %]/images/adv_row_close_btn.png" /></a>
+ </td>
+ </tr>
++[% END %]
--- /dev/null
- <a href="javascript:;" id="myopac_new_global_row" onclick='addSearchRow();'>Add Search Row</a>
+ <form id="adv_search_form" action="[% ctx.opac_root %]/results" method="GET">
+ <table id='adv_global_search' class='data_grid data_grid_center' width='100%'>
+ <tr style='border-bottom: none;'>
+ <!-- Contains the user-addable(?) rows to define search class, containment and text -->
+ <td valign='top' class='opac-auto-012'>
+ <table width='100%' id='adv_global_input_table'>
+ <thead>
+ <tr>
+ <td>
+ <div style="width:100%;" class="header_middle">
+ [% l("Search Input") %]
+ </div>
+ </td>
+ </tr>
+ </thead>
+ <tbody id='adv_global_tbody'>
+ [% INCLUDE "default/opac/parts/advanced/global_row.tt2" %]
+ <!-- add a new row -->
+ <tr id='adv_global_addrow'>
+ <td align='left' style="padding-top:7px;">
- <div style="width:100%;" class="header_middle">Search Filters</div>
++ <a href="javascript:;" id="myopac_new_global_row" onclick='addSearchRow();'>[% l('Add Search Row') %]</a>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td align='top'>
++ <div style="width:100%;" class="header_middle">[% l('Search Filters') %]</div>
+ <table cellpadding='10' cellspacing='0' border='0'><tr>
+ <td valign='top'>
+ <strong>[% l("Item Type") %]</strong><br />
+ [% INCLUDE "default/opac/parts/coded_value_selector.tt2"
+ attr=["mattype", "item_type"] multiple="multiple" size="4"
+ id="adv_global_item_type_basic" %]
+ </td>
+ <td valign='top'>
+ <strong>[% l("Language") %]</strong><br />
+ [% INCLUDE "default/opac/parts/coded_value_selector.tt2"
+ attr="item_lang" multiple="multiple" size="4" %]
+ </td>
+ <td valign='top'>
+ <strong>[% l("Audience") %]</strong><br />
+ [% INCLUDE "default/opac/parts/coded_value_selector.tt2"
+ attr="audience" id="adv_global_audience_basic"
+ multiple="multiple" size="4" %]
+ </select>
+ <!--<a id='adv_global_audience_link_adv' class='classic_link adv_adv_link'
+ href='javascript:void(0);' onclick='
+ hideMe($("adv_global_audience_basic"));
+ unHideMe($("adv_global_audience"));
+ hideMe(this);
+ unHideMe($("adv_global_audience_link_basic"));
+ '>[% l("Advanced") %]</a>
+ <a id='adv_global_audience_link_basic' class='hide_me classic_link adv_adv_link'
+ href='javascript:void(0);' onclick='
+ unHideMe($("adv_global_audience_basic"));
+ hideMe($("adv_global_audience"));
+ unHideMe($("adv_global_audience_link_adv"));
+ hideMe(this);'>[% l("Basic") %]</a>-->
+ </td>
+ <td valign='top'>
+ <strong>[% l("Sort Results") %]</strong>
+ <table class='opac-auto-017'>
+ <tr>
+ <td align='center' width='100%'>
+ [% INCLUDE "default/opac/parts/filtersort.tt2"
+ value=CGI.param('sort') %]
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr></table>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <table cellpadding='10' cellspacing='0' border='0'>
+ <tbody>
+ <tr>
+ <td valign='top'>
+ <strong>[% l("Search Library") %]</strong><br />
+ [% PROCESS "default/opac/parts/org_selector.tt2";
+ PROCESS build_org_selector name='loc' value=loc %]
+ <div style="position:relative;top:7px;">
+ <input type='checkbox' name="modifier"
+ value="available"[% CGI.param('modifier').grep('available').size ? ' checked="checked"' : '' %]
+ id='opac.result.limit2avail' />
+ <label style="position:relative;top:-2px;"
+ for='opac.result.limit2avail'>
+ [% l("Limit to Available") %]</label>
+ </div>
+ </td>
+ <td valign='top'>
+ <strong>[% l("Publication Year") %]</strong><br />
+ <select id='adv_global_pub_date_type' name='pubdate' onchange='
+ if(this.selectedIndex == 3)
+ unHideMe($("adv_global_pub_date_2_span"));
+ else
+ hideMe($("adv_global_pub_date_2_span"));'>
+ [% FOR opt IN [
+ {"code" => "is", "label" => l("Is")},
+ {"code" => "before", "label" => l("Before")},
+ {"code" => "after", "label" => l("After")},
+ {"code" => "between", "label" => l("Between")}
+ ];
+ |l(opt.code, opt.label) %]
+ <option value="[_1]"[% CGI.param('pubdate') == opt.code ? ' selected="selected"' : '' %]>[_2]</option>
+ [% END; END %]
+ </select>
+ <div style='margin-top:5px;'>
+ <input id='adv_global_pub_date_1' name='date1' type='text' size='4' maxlength='4' value="[% CGI.param('date1') | html %]" />
+ <span id='adv_global_pub_date_2_span' class='[% CGI.param("pubdate") == "between" ? "" : "hide_me" %]'>
+ [% l("and") %] <input name='date2' id='adv_global_pub_date_2' type='text' size='4' maxlength='4' value="[% CGI.param('date2') | html %]" />
+ </span>
+ </div>
+ </td>
+ </tr>
+ <!-- copy location selector -->
+ <tr id='adv_copy_location_filter_row' class='hide_me'>
+ <td align='right'>[% l("Shelving Location") %]</td>
+ <td align='left' id='adv_copy_location_filter_td'>
+ <select size='3' id='adv_copy_location_filter_select' multiple='multiple'>
+ </select>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ <tr class='border_4_2'>
+ <td align="left" colspan='2'>
+ <input type="image" src="[% ctx.media_prefix %]/images/search_btn.gif"
+ alt="[% l('Search') %]" class='pointer' />
+
+ <a href="javascript:document.getElementById('adv_search_form').reset();"
+ id="adv_reset">[% l('Reset Form') %]</a>
+ </td>
+ </tr>
+ </table>
+ <input type="hidden" name="_adv" value="1" />
+ </form>
+ <div id='adv_quick_search_sidebar' class='sidebar_chunk hide_me'>
+ <div id='adv_quick_search'>
+ <div class='adv_quick_search color_4'><b>[% l("Quick Search") %]</b></div>
+ <div style='margin-top: 8px;'>
+ <table><tbody><tr>
+ <td>
+ <select id='adv_quick_type'>
+ <option value='isbn'>[% l("ISBN") %]</option>
+ <option value='issn'>[% l("ISSN") %]</option>
+ <option value='cn'>[% l("Call Number") %]</option>
+ <option value='lccn'>[% l("LCCN") %]</option>
+ <option value='tcn'>[% l("TCN") %]</option>
+ <option value='barcode'>[% l("Item Barcode") %]</option>
+ </select>
+ </td><td>
+ <input type='text' id='adv_quick_text' size='16' />
+ </td>
+ </tr></tbody></table>
+ </div>
+
+ <div style='margin-top: 8px;' class='adv_quick_search_submit'>
+ <!-- XXX TODO make a real form, and make a real submitter (quick
+ submit, FKA advGenericSearch() -->
+ <img src="[% ctx.media_prefix %]/images/search_btn.gif"
+ alt="[% l('Search') %]" id="adv_quick_submit" class='pointer' />
+ </div>
+ </div>
+ </div>
+
+
+ <div id='adv_marc_search_sidebar' class='sidebar_chunk hide_me'
+ style='width:400px; margin-top: 20px;'>
+ <div class='adv_quick_search color_4'><b>[% l("MARC Expert Search") %]</b></div>
+ <table style='margin: 3px; width: 100%;' id='adv_sdbar_table'
+ class='border_4_3'>
+ <tbody>
+ <tr>
+ <td align="right">[% l("Tag:") %]</td>
+ <td align="left"><input name='advanced.marc.tag' maxlength='3' size='3' /></td>
+ <td align="right">[% l("Subfield:") %]</td>
+ <td align="left"><input name='advanced.marc.subfield' maxlength='1' size='1' /></td>
+ </tr>
+ <tr>
+ <td align="right">[% l("Value:") %]</td>
+ <td colspan='3' align="left"><input name='advanced.marc.value' size='18' /></td>
+ </tr>
+ <tr name='crow' class='hide_me'>
+ <td colspan='4' align='center'>
+ <a href='javascript:void(0);' class='classic_link'>[% l("close") %]</a>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <div id='adv_marc_submit' class='adv_quick_search_submit'>
+ <a style='margin-right: 4px; position:relative;top:-10px;'
+ class='classic_link' href='javascript:advAddMARC();'>[% l("Add Row") %]</a>
+ <!-- XXX TODO make a real form, and make a real submitter (FKA
+ advMARCRun()) -->
+ <img alt="Search" src="[% ctx.media_prefix %]/images/search_btn.gif" class='pointer' />
+ </div>
+ </div>
--- /dev/null
- <script>try { chili_init(); } catch(E) {}</script>
+
+ <!-- Set up the chilifresh account information and load the JS -->
+
+ [% IF ENV.OILS_CHILIFRESH_URL AND ENV.OILS_CHILIFRESH_ACCOUNT
+ AND (ctx.page == 'rresult' OR ctx.page == 'record');
+ chili_url = ENV.OILS_CHILIFRESH_URL;
+ IF CGI.https AND ENV.OILS_CHILIFRESH_HTTPS_URL;
+ chili_url = ENV.OILS_CHILIFRESH_HTTPS_URL;
+ END;
+ %]
+ <input type="hidden" id="chilifresh_account" name="chilifresh_account" value="[% ENV.OILS_CHILIFRESH_ACCOUNT %]"/>
+ <!--
+ <input type="hidden" id="chilifresh_profile" name="chilifresh_profile" value="[% ENV.OILS_CHILIFRESH_PROFILE %]"/>
+ -->
+ <input type="hidden" id="chilifresh_version" name="chilifresh_version" value="onsite_v1" />
+ <input type="hidden" id="chilifresh_type" name="chilifresh_type" value="search" />
+ <script type="text/javascript" src="[% chili_url %]"></script>
++ <script>try { setTimeout(chili_init, 0); } catch(E) {}</script>
+ [% END %]
+
--- /dev/null
- USE EGI18N;
+ [%- USE money = format(l('$%.2f'));
+ USE date;
+ USE CGI = CGI_utf8;
-
-
-[%# XXX KCLS Note... Remove me soon...
-BEGIN;
-INSERT INTO config.record_attr_definition (name, label, tag, sf_list)
- VALUES ('mattype', 'Material Type', '998', 'd');
-INSERT INTO config.coded_value_map (ctype, code, value)
- VALUES
- ('mattype', 'a', 'Book'),
- ('mattype', 'i', 'Book on cassette'),
- ('mattype', 'n', 'Book on CD'),
- ('mattype', 'x', 'Download music'),
- ('mattype', 'y', 'Download video'),
- ('mattype', 'h', 'DVD'),
- ('mattype', 'w', 'eBook - Audio'),
- ('mattype', 'v', 'eBook - Text'),
- ('mattype', 'e', 'Equipment'),
- ('mattype', 'f', 'Films'),
- ('mattype', 'o', 'Kit'),
- ('mattype', 'q', 'Large print'),
- ('mattype', 'b', 'Magazine'),
- ('mattype', 'd', 'Microform'),
- ('mattype', 'k', 'Music cassette'), ('mattype', 'j', 'Music CD'),
- ('mattype', 'l', 'Music LP'), ('mattype', 'p', 'Newspaper'),
- ('mattype', 't', 'Online'), ('mattype', 'u', 'Player'),
- ('mattype', 'c', 'Printed music / scores'), ('mattype', '2', 'Read along with cassette'),
- ('mattype', '5', 'Read along with CD'), ('mattype', 'm', 'Software'),
- ('mattype', 'g', 'Video'), ('mattype', 'r', '3-D Object'),
- ('mattype', 'z', 'Map'), ('mattype', 's', 'Slide set');
-COMMIT;
-%]
-
+ USE POSIX;
+ SET DATE_FORMAT = l('%m/%d/%Y');
+
+ # Don't wrap in l() here; do that where this format string is actually used.
+ SET HUMAN_NAME_FORMAT = '[_1] [_2] [_3] [_4] [_5]';
+
+ # x and y are artifacts of using <input type="image" /> tags instead of
+ # true submit buttons, and their values are never used. page is used, but
+ # currently none of the use cases for rendering the query_string back
+ # into page output call for propagating the value of the page variable.
+
+ query_string = CGI.query_string |
+ replace(';x=\d+','') | replace(';y=\d+','') | replace(';page=\d*', '') |
+ replace(';', '&') | replace('&', '&');
+
+ propagator = '?' _ query_string;
+
+ is_advanced = CGI.param("_adv").size;
++ is_special = CGI.param("_special").size;
+ %]
--- /dev/null
+ <!-- JS imports, etc. -->
+
+ <script type="text/javascript" src="[% ctx.media_prefix %]/js/ui/default/opac/simple.js"></script>
+
+ [% IF ctx.is_staff %]
+ <script type="text/javascript" src="[% ctx.media_prefix %]/js/ui/default/opac/staff.js"></script>
+ [% END %]
+
++[% IF ENV.OILS_NOVELIST_URL AND ctx.page == 'record';
++ url = ENV.OILS_NOVELIST_URL;
++ IF CGI.https; url = url.replace('^http:', 'https:'); END; %]
++<script type='text/javascript' id='EIT' src='[% url %]'></script>
++[% END %]
++
+ <!-- Google Analytics -->
+ <script type="text/javascript">
+ /* uncomment when ready */ /*
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', 'UA-3018520-10']);
+ _gaq.push(['_trackPageview']);
+
+ (function() {
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+ })();
+ */
+ </script>
+ <!-- End Google Analytics -->
+
--- /dev/null
- <input type="checkbox" name="persist" /> [% l('Remember Me?') %]
+ <!-- TODO: MOVE INTO SEPARATE FORGOT-PASSWORD PAGE
+
+ <div class="hide_me">
+ <div class='login_text color_1' style='padding: 4px; text-align: center;'>
+ <span>[% l("Login") %]</span>
+ </div>
+ <br/>
+ </div>
+ <div class="hide_me" id="forget_pw">
+ <h1>Password Reset</h1>
+ Username or Barcode<br />
+ <input type="text" id="forget_pw_user" /><br /><br />
+ Email Address on account<br />
+ <input type="text" id="forget_pw_email" /><br />
+ <a href="#">Submit</a>
+ <a href="#">Cancel</a>
+ </div>
+ <table id='change_pw_table' class='data_grid hide_me' style='margin-left: 20px;' width='95%'>
+ <thead>
+ <tr><td colspan='2' align='center'><b>[% l("Password") %]</b></td></tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td colspan='2' style='padding:10px;'>
+ [% l("This appears to be the first time you have logged in. You will need to change your password.") %]
+ [% l("The password must be at least 7 characters in length,
+ contain at least one letter (a-z/A-Z),
+ and contain at least one number.") %]
+ </td>
+ </tr>
+ <tr>
+ <td>[% l("Enter your current password") %]</td>
+ <td><input type='password' id='change_pw_current'/></td>
+ </tr>
+ <tr>
+ <td>[% l("Enter the new password") %]</td>
+ <td><input type='password' id='change_pw_1'/></td>
+ </tr>
+ <tr>
+ <td>[% l("Re-type the new password for verification") %]</td>
+ <td><input type='password' id='change_pw_2'/></td>
+ </tr>
+ <tr><td><br/></td><td/></tr>
+ <tr class='color_1'>
+ <td colspan='2' align='center'>
+ <span class='login_text' style='margin-right: 20px;'>
+ <input type='submit' value='[% l("Update Password") %]' id='change_pw_button'/>
+ </span>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+
+
+ <span id='pw_no_match' class='hide_me'>[% l("Passwords do not match") %]</span>
+ <span id='pw_update_successful' class='hide_me'>[% l("Password successfully updated") %]</span>
+ <span id='pw_not_strong' class='hide_me'>
+ [% l("The password provided is not strong enough.") %]
+ [% l("The password must be at least 7 characters in length, contain at least one letter (a-z/A-Z), and contain at least one number.") %]
+ </span>
+
+ ^== TODO: MOVE INTO SEPARATE FORGOT-PASSWORD PAGE -->
+
+ [% IF ctx.login_failed_event %]
+ <div id='login-failed-message'>
+ [%
+ IF ctx.login_failed_event.textcode == 'PATRON_CARD_INACTIVE';
+ l("The barcode used to login is marked as inactive. Please contact your local library.");
+ ELSIF ctx.login_failed_event.textcode == 'PATRON_INACTIVE';
+ l("This account has been deactivated. Please contact your local library.");
+ ELSE;
+ l("Login failed. The username or password provided was not valid.
+ Ensure Caps-Lock is off and try again or contact your local library.");
+ END;
+ %]
+ </div>
+ [% END %]
+
+ <div>
+ <div style="height:20px;"></div>
+ <form method='POST'>
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td valign="top" width="676" class="login_boxes left_brain">
+ <table cellpadding="0" cellspacing="0" border="0"
+ width="100%">
+ <tr>
+ <td colspan="2" style="padding-bottom: 10px;">
+ <h1>[% l('Log in to Your Account') %]</h1>
+ [% l('Please enter the following information:') %]
+ <br /><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="42%" class="lbl1">
+ [% l('Library Card Number or Username') %]
+ <br />
+ <span class="lbl2">
+ [% l('Please include leading zeros and no spaces.') %]
+ <br/>
+ [% l('Example: 0026626051') %]
+ </span>
+ <br /><br />
+ </td>
+ <td width="58%" valign="top">
+ <div class="input_bg">
+ <input type="text" id="username_field" name="username"/>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <div style="height:15px;"></div>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="lbl1">
+ [% l('PIN Number or Password') %]<br />
+ [% INCLUDE "default/opac/parts/login/password_hint.tt2" %]
+ </td>
+ <td valign="top">
+ <div class="input_bg">
+ <input name="password" type="password" />
+ </div>
+ <div style="padding-top:7px;">
+ [%
+ # If no redirect is offered or it's leading us back to the
+ # login form, redirect the user to My Account
+ redirect = CGI.param('redirect_to') || ctx.referer;
+ IF !redirect OR redirect.match(ctx.path_info _ '$');
+ redirect = CGI.url('-full' => 1) _ '/opac/myopac/main';
+ END;
+ redirect = redirect | replace('^http:', 'https:');
+ %]
+ <input type='hidden' name='redirect_to' value='[% redirect %]'/>
++ <input type="checkbox" name="persist" id="login_persist" /><label for="login_persist"> [% l('Stay logged in?') %]</label>
+ </div>
+ <div style="padding-top:14px;">
+ <input type='image' alt="[% l('Log in') %]" src="[% ctx.media_prefix %]/images/login-btn2.png" />
+ <!-- TODO
+ <a href="reset_password"
+ style="position:relative;top:-13px;left:2px;font-size:10px;">Forgot your PIN?</a>
+ -->
+ </div>
+ </td>
+ </tr>
+ </table>
+ <br /><br />
+ </td>
+ <td><div style="width:10px;"></div></td>
+ [% INCLUDE "default/opac/parts/login/help.tt2" %]
+ </tr>
+ </table>
+ </form>
+ <div class="clear-both"></div>
+ </div>
--- /dev/null
- IF node;
+ [%
+ # Extract MARC fields from XML
+ # get_marc_attrs( { marc_xml => doc } )
+ BLOCK get_marc_attrs;
+ xml = args.marc_xml;
+ args.isbn = xml.findnodes('//*[@tag="020"]/*[@code="a"]').shift.textContent;
+ args.upc = xml.findnodes('//*[@tag="024"]/*[@code="a"]').textContent;
+ args.issn = xml.findnodes('//*[@tag="022"]/*[@code="a"]').textContent;
+ args.title = xml.findnodes('//*[@tag="245"]/*[@code="a"]').textContent;
+ args.author = xml.findnodes('//*[@tag="100"]/*[@code="a"]').textContent;
+ args.publisher = xml.findnodes('//*[@tag="260"]/*[@code="b"]').textContent;
+ args.pubdate = xml.findnodes('//*[@tag="260"]/*[@code="c"]').textContent;
++ args.summary = xml.findnodes('//*[@tag="520"]/*[@code="a"]').textContent;
+ args.edition = xml.findnodes('//*[@tag="250"]/*[@code="a"]').textContent ||
+ xml.findnodes('//*[@tag="534"]/*[@code="b"]').textContent ||
+ xml.findnodes('//*[@tag="775"]/*[@code="b"]').textContent;
+ phys = xml.findnodes(
+ '//*[@tag="300"]/*[@code="a" or @code="b" or @code="c" or @code="e"]'
+ );
+ phys_content = [];
+ FOR p IN phys; phys_content.push(p.textContent); END;
+ args.phys_desc = phys_content.join("");
+
+ # MARC Callnumber
+ args.marc_cn = xml.findnodes('//*[@tag="092" or @tag="099"]/*').textContent;
+
+ # clean up the ISBN
+ args.isbn_clean = args.isbn.replace('\ .*', '');
+
+ args.holdings = [];
+ args.uris = [];
+ args.issns = [];
+
+ # we use $9 of ISBN and ISSN as a flag for e-version
+ sfx_isbn = xml.findnodes('//*[@tag="020"]/*[@code="9"]');
+ IF sfx_isbn;
+ IF sfx_isbn.textContent == "SFX";
+ my_parent = sfx_isbn.parentNode();
+ sfx_isbn = my_parent.findnodes('./*[@code="a"]');
+ sfx_isbn.replace('-', '');
+ args.resolver_isbn = sfx_isbn.replace('\ .*', '');
+ END;
+ END;
+
+ sfx_issn = xml.findnodes('//*[@tag="022"]/*[@code="9"]');
+ IF sfx_issn;
+ IF sfx_issn.textContent == "SFX";
+ my_parent = sfx_issn.parentNode();
+ sfx_issn = my_parent.findnodes('./*[@code="a"]');
+ args.issns.push(
+ sfx_issn.textContent.replace('[^\d\-X]', '')
+ );
+ END;
+ END;
+
+ # we snag all issns if no SFX available
+ IF args.issns.size == 0;
+ FOR rawissn IN xml.findnodes('//*[@tag="022"]/*[@code="a"]');
+ args.issns.push(
+ rawissn.textContent.replace('[^\d\-X]', '')
+ );
+ END;
+ END;
+
+ FOR volume IN xml.findnodes('//*[local-name()="volumes"]/*[local-name()="volume"]');
+
+ # Check volume visibility - could push this into XPath
+ vol.label = volume.getAttribute('label');
+ vol.id = volume.getAttribute('id');
+ NEXT IF volume.getAttribute('opac_visible') == 'false';
+ NEXT IF volume.getAttribute('deleted') == 'true';
+
+ IF vol.label == '##URI##';
+ FOR uri IN volume.findnodes('./*[local-name()="uris"]/*[local-name()="uri"]');
+ res.href = uri.getAttribute('href');
+ res.link = uri.getAttribute('label');
+ res.note = uri.getAttribute('use_restriction');
+ args.uris.push(res);
+ END;
+ NEXT;
+ ELSE;
+ copies = volume.findnodes('./*[local-name()="copies"]/*[local-name()="copy"]');
+ FOR copy IN copies;
+ # Check copy visibility
+ cp.deleted = copy.getAttribute('deleted');
+ cp.visible = copy.getAttribute('opac_visible');
+ NEXT IF (cp.deleted == 'true' OR cp.visible == 'false');
+
+ # Iterate through all of the children to determine visibility
+ FOR node IN cp.childNodes;
+ NEXT IF cp.visible == 'false';
+ vis = node.getAttribute('opac_visible');
+ del = node.getAttribute('deleted');
+ IF vis == 'false' or del == 'true';
+ cp.visible = 'false';
+ END;
+ END;
+
+ NEXT IF cp.visible == 'false';
+
+ loc = copy.findnodes('./*[local-name()="location"]');
+ circlib = copy.findnodes('./*[local-name()="circlib"]');
+ status = copy.findnodes('./*[local-name()="status"]');
+
+ holding = {
+ label => vol.label,
+ location => loc.textContent,
+ library => circlib.textContent,
+ status => status.textContent
+ barcode => copy.getAttribute('barcode')
+ };
+ args.holdings.push(holding);
+ END;
+ END;
+ END;
+
+ # Extract the copy count summary
+ count_type = (ctx.is_staff) ? 'staff' : 'public';
+ xpath = '//*[local-name()="counts"]/*[local-name()="count"][@type="' _ count_type _ '"]';
+ FOR node IN xml.findnodes(xpath);
+ args.copy_counts = {};
+ FOR attr IN ['count', 'available', 'unshadow', 'transcendant'];
+ args.copy_counts.$attr = node.getAttribute(attr);
+ END;
+ END;
+
+ # "mattype" == "custom marc format specifier"
+ FOR icon_style IN ['mattype', 'item_type'];
+ node = xml.findnodes(
+ '//*[local-name()="attributes"]/*[local-name()="field"][@name="' _ icon_style _ '"]');
++ IF node AND node.textContent;
+ args.format_label = node.getAttribute('coded-value')
+ args.format_icon = ctx.media_prefix _ '/images/format_icons/' _ icon_style _ '/' _ node.textContent _ '.png';
+ LAST;
+ END;
+ END;
+ END;
+
+ BLOCK get_hold_status;
+ IF hold.hold.status == 4;
+ l("Available");
+ IF ahr.shelf_expire_time;
+ l('<br/>Expires [_1]',
+ date.format(ctx.parse_datetime(ahr.shelf_expire_time), DATE_FORMAT));
+ END;
+ ELSIF hold.hold.estimated_wait AND hold.hold.estimated_wait > 0;
+ # estimated wait is delivered as seconds.
+ SET hwait = POSIX.ceil(hold.hold.estimated_wait / 86400);
+ l("Estimated wait: [quant,_1,day,days]", hwait);
+ ELSIF hold.hold.status == 3;
+ l("In Transit");
+ ELSIF hold.hold.status < 3;
+ l("Waiting for copy");
+ END;
+ END;
+ %]
--- /dev/null
- BLOCK build_org_selector_options; %]
- <option value='[% walker.id %]' [% IF walker.id == value %] selected='selected' [% END %]>
+ [%
++ BLOCK build_org_selector_options;
++ disabled = '';
++ selected = '';
++ IF can_have_vols_only;
++ IF walker.ou_type.can_have_vols != 't';
++ disabled = 'disabled="disabled"';
++ ELSIF walker.id == value;
++ selected = 'selected="selected"';
++ END;
++ END;
++%]
++ <option value='[% walker.id %]' [% selected %] [% disabled %]>
+ [%
+ pad = walker.ou_type.depth * 2;
+ FOR idx IN [0..pad]; ' '; END;
+ walker.name;
+ %]
+ </option>
+ [% FOR child IN walker.children;
+ PROCESS build_org_selector_options walker=child value=value;
+ END;
+ END;
+
+ # XXX TODO probably put this BLOCK somewhere else so it can be used widely.
+ # Org Unit Selector Widget :
+ # PROCESS build_org_selector id='selector-id' name='selector-name'
+ BLOCK build_org_selector;
+ %]
+ <select [% IF id %] id='[% id %]' [% END %] name='[% name %]'>
+ [% PROCESS build_org_selector_options walker=(org_unit || ctx.aou_tree) value=value %]
+ </select>
+ [% END %]
--- /dev/null
- <div id='xulholds_box' class='hide_me canvas' style='margin-top: 6px;'>
- <!-- XXX TODO staff will need this to work ("advanced" hold placement)
- later -->
- <center>
- <table class='data_grid' style='margin-top: 20px;'>
- <tbody>
- <tr>
- <td>[% l("Enter recipient barcode") %]:</td>
- <td>
- <input type='text' id='xul_recipient_barcode' />
- </td>
- <td>
- <input type='submit' value='[% l("Submit") %]'
- id='xul_recipient_barcode_submit' />
- </td>
- <td>
- <input type='submit' value='[% l("Cancel") %]' />
- </td>
- <td>
- <input type='submit'
- value='[% l("Place hold for my account") %]'
- id='xul_recipient_me' />
- </td>
- </tr>
- </tbody>
- </table>
- </center>
- </div>
- <div id='check_holds_box' class='hide_me canvas'
- style='margin-top: 6px; width: 100%; text-align: center'>
- <br/><br/><br/>
- <b>[% l("Checking for possibility of hold fulfillment...") %]</b>
- </div>
+ [% PROCESS "default/opac/parts/misc_util.tt2";
+ attrs = {marc_xml => ctx.marc_xml};
+ PROCESS get_marc_attrs args=attrs;
++
++ PROCESS "default/opac/parts/hold_error_messages.tt2";
+ %]
+ <div>
- [% IF ctx.hold_failed_event %]
+ <div id='holds_box' class='canvas' style='margin-top: 6px;'>
+ [% IF ctx.hold_success %]
+ <div><big><strong>[% l("Hold was successfully placed"); %]</strong></big></div>
+ [% ELSIF ctx.hold_failed %]
+ <div><big><strong>[% l("Hold was not successfully placed"); %]</strong></big></div>
- <em>[% ctx.hold_failed_event.desc ||
++ [% IF ctx.hold_local_block %]
++ <div>[% l("There is already a copy available at your local library.") %]</div>
++ [% ELSIF ctx.hold_failed_event || ctx.hold_local_alert %]
+ <div>
+ <strong>[% l('Problem:') %]</strong>
+ <span title="[% ctx.hold_failed_event.textcode %]">
- ctx.hold_failed_event.textcode %]</em>
++ <em>[%
++ fail_part_key = ctx.hold_failed_event.payload.fail_part;
++ event_key = ctx.hold_failed_event.textcode;
++
++ # display:
++ l(FAIL_PART_MSG_MAP.$fail_part_key) ||
++ l(EVENT_MSG_MAP.$event_key) ||
++ l(ctx.hold_failed_event.desc) ||
+ ctx.hold_failed_event.payload.fail_part ||
- You would like to place a hold on <strong><q>[_1]</q></strong> to be picked up at [_2].
- If this is correct, press <strong>SUBMIT</strong>.
++ ctx.hold_failed_event.textcode ||
++ (ctx.hold_local_alert ?
++ l("There is already a copy available at your local library.") :
++ l("Unknown problem")) %]</em>
+ </span>
++
++ [% IF ctx.hold_copy_available %]<p>
++ [% l('Find a copy in the shelving location, "[_1]."',
++ ctx.hold_copy_available.location) %]
++ </p>[% END %]
++
++ [% IF ctx.could_override || ctx.hold_local_alert %]
++ <p>
++ <big>[% l("You have permission to place this hold anyway.") %]</big>
++ <br />
++ [% l("Click submit below to override the system's objection and place your hold.") %]
++ </p>
++ <form method="POST">
++ <input type="hidden" type="name" name="override" value="1" />
++ [% FOR k IN ctx.orig_params.keys %]
++ <input type="hidden" name="[% k %]" value="[% ctx.orig_params.$k | html %]" />
++ [% END %]
++ <input type="image" name="submit" value="submit" title="[% l('Submit') %]"
++ alt="[% l('Submit') %]" src="[% ctx.media_prefix %]/images/btnSubmit.png" />
++ </form>
++ [% END %]
+ </div>
+ [% END;
++ ELSIF ctx.hold_local_block;
++ l("There is already a copy available at your local library");
+ ELSE %]
+ <form method="POST">
+ <br/>
+ <input type="hidden" name="hold_target"
+ value="[% CGI.param('hold_target') | html %]" />
+ <input type="hidden" name="hold_type"
+ value="[% CGI.param('hold_type') | html %]" />
+ [%
+ new_redirect_to = ctx.referer;
+ IF new_redirect_to.match('redirect_to');
+ new_redirect_to = 'https://' _ ctx.hostname _ ctx.opac_root _ '/home';
+ ELSE;
+ new_redirect_to = new_redirect_to | replace('^http:', 'https:');
+ END;
+ %]
+ <input type="hidden" name="redirect_to"
+ value="[% new_redirect_to | html %]" />
+ <h1>Place Hold</h1>
++ [% IF ctx.is_staff %]
++ <p class="staff-hold">
++ <input type="radio" id="hold_usr_is_requestor_not"
++ onchange="staff_hold_usr_input_disabler(this);"
++ name="hold_usr_is_requestor" value="0"
++ [% IF ctx.patron_recipient; ' checked="checked"'; END %]
++ />
++ <label for="hold_usr_is_requestor_not">
++ [% l("Place hold for patron by barcode:") %]
++ </label>
++ <input type="text" name="hold_usr" id="hold_usr_input" value="[% ctx.patron_recipient.card.barcode %]" /><br />[%# XXX multi-barcode users? %]
++ <span>
++ <input type="radio" id="hold_usr_is_requestor"
++ onchange="staff_hold_usr_input_disabler(this);"
++ name="hold_usr_is_requestor" value="1" />
++ <label for="hold_usr_is_requestor">
++ [% l("Place this hold for me ([_1] [_2])",
++ ctx.user.first_given_name, ctx.user.family_name) %]
++ </label>
++ </span>
++ </p>
++ [% END %]
+ <p>
+ [% | l(attrs.title, ctx.get_aou(ctx.default_pickup_lib).name) %]
- [% l('If you would like to change the library pick up location, select from the location dropdown menu.') %]
- <br class="clear-both" />
++ You would like to place a hold on <strong><q>[_1]</q></strong>.<br />
++ If this is correct, confirm your pickup location and click <strong>SUBMIT</strong>.
+ [% END %]
+ </p>
+ <p>
- PROCESS build_org_selector name='pickup_lib' value=ctx.default_pickup_lib %]
++ [% l('Pickup location:') %]
+ [% PROCESS "default/opac/parts/org_selector.tt2";
- <div class='hide_me' id='holds_success'>[% l("Hold was successfully placed") %]</div>
- <div class='hide_me' id='holds_failure'>[% l("Hold was not successfully placed") %]</div>
++ PROCESS build_org_selector name='pickup_lib' value=ctx.default_pickup_lib id='pickup_lib' can_have_vols_only=1 %]
+ </p>
+ <p>
+ [% |l %]If you use the Traveling Library Center (TLC) and ABC Express
+ services, please select "Outreach" to have the item delivered
+ during your scheduled visit.[% END %]
+ </p>
+ <input type="image" name="submit" value="submit" title="[% l('Submit') %]"
+ alt="[% l('Submit') %]" src="[% ctx.media_prefix %]/images/btnSubmit.png" />
+
+ <a href="javascript:history.go(-1);" id="holds_cancel"><img
+ alt="[% l('Cancel') %]" src="[% ctx.media_prefix %]/images/btnCancel.png" /></a>
+ </form>
+ <br /><br />
+ <p>
+ [% |l %]* If you need your item today, and it is checked in at your
+ library, please place your hold and then call your library to set it
+ aside. Placing a hold without calling the library will increase your
+ wait time.[% END %]
+ <br /><a href="#">[% l('Library phone numbers.') %]</a>
+ </p>
+ <p>
+ [% |l %]* For best possible service, we recommend keeping
+ a printed copy of your most recent holds list.[% END %]
+ </p>
+ [% END %] <!-- ctx.hold_success -->
+ <table width='90%' border="1" class="hide_me">
+ <tbody>
+ <tr>
+ <td class='holds_cell color_1'
+ align='center' colspan='2'>[% l("Create / Edit a Hold") %]</td>
+ </tr>
+ <tr>
+ <td class='holds_cell'>[% l("Recipient") %]:</td>
+ <td class='holds_cell' id='holds_recipient'> </td>
+ </tr>
+ <tr>
+ <td class='holds_cell'>[% l("Title:") %]</td>
+ <!-- <td class='holds_cell' id='holds_title'> </td> -->
+ </tr>
+ <tr>
+ <td class='holds_cell'>[% l("Author") %]</td>
+ <td class='holds_cell' id='holds_author'> </td>
+ </tr>
+ <tr>
+ <td class='holds_cell'>[% l("Format") %]</td>
+ <td class='holds_cell' id='holds_format'> </td>
+ </tr>
+ <tr id='hold_physical_desc_row'>
+ <td class='holds_cell'>[% l("Physical Description:") %]</td>
+ <td class='holds_cell' id='holds_physical_desc'> </td>
+ </tr>
+
+ <tr class='hide_me' id='holds_cn_row'>
+ <td class='holds_cell'>[% l("Call Number:") %]</td>
+ <td class='holds_cell'><b id='holds_cn'/> </td>
+ </tr>
+
+ <tr class='hide_me' id='holds_copy_row'>
+ <td class='holds_cell'>[% l("Copy Barcode:") %]</td>
+ <td class='holds_cell'><b id='holds_copy'/> </td>
+ </tr>
+
+ <tr class='hide_me' id='holds_type_row'>
+ <td class='holds_cell'>[% l("Hold Type:") %]</td>
+ <td class='holds_cell hide_me' id='holds_is_cn'>
+ <b>[% l("Volume Hold") %]</b>
+ </td>
+ <td class='holds_cell hide_me' id='holds_is_copy'>
+ <b>[% l("Copy Hold") %]</b>
+ </td>
+ </tr>
+ <tr>
+ <td class='holds_cell'>[% l("Contact telephone number") %]:</td>
+ <td class='holds_cell'>
+ <input id='holds_phone' size='13' maxlength='12'/>
+ <span style='margin-left: 4px; font-size: 7pt;'>
+ [% l("(XXX-YYY-ZZZZ)") %]
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td class='holds_cell'>[% l("Enable phone notifications for this hold?") %]</td>
+ <td class='holds_cell'>
+ <input type='checkbox' id='holds_enable_phone'
+ checked='checked' />
+ </td>
+ </tr>
+ <tr>
+ <td class='holds_cell'>[% l("Contact email address") %]:</td>
+ <td class='holds_cell' id='holds_email'>
+ <span class='hide_me' id='holds.no_email'>
+ ([% l("Patron has no configured email address") %])<br/>
+ ([% l("See") %] <a class='classic_link' id='holds.no_email.my_account'>[% l("My Account") %]</a> [% l("for setting your email address") %])
+ </span>
+ <span class='hide_me' id='holds.no_email.xul'>
+ [% l("(Patron has no configured email address)") %]
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td class='holds_cell'>[% l("Enable email notifications for this hold?") %]</td>
+ <td class='holds_cell'>
+ <input type='checkbox' id='holds_enable_email'
+ checked='checked'/>
+ </td>
+ </tr>
+ <!--
+ <tr id='holds_depth_selector_row' class='hide_me'>
+ <td class='holds_cell'>Hold Range</td>
+ <td class='holds_cell'>
+ <select id='holds_depth_selector'></select>
+ </td>
+ </tr>
+ -->
+ <tr>
+ <td class='holds_cell'>[% l("Pickup location") %]</td>
+ <td class='holds_cell'>
+ <!-- <select id='holds_org_selector'> </select> -->
+ </td>
+ </tr>
+
+ <tr>
+ <td class='holds_cell'>[% l("Expiration date") %]</td>
+ <td class='holds_cell'>
+ <input size='10' maxlength='10'
+ id='holds_expire_time' />
+ </td>
+ </tr>
+
+ <tr>
+ <td class='holds_cell'>
+ [% l("Suspend this hold") %]
+ <a class='classic_link'
+ href='#'>[% l("(Help)") %]</a>
+ </td>
+ <td class='holds_cell'>
+ <input type='checkbox' id='holds_frozen_chkbox' />
+ </td>
+ </tr>
+ <tr id='hold_frozen_thaw_row' class='hide_me'>
+ <td class='holds_cell'>
+ <!-- XXX TODO there used to be script here dealing with
+ frozen holds -->
+ [% l("Automatically activate hold on:") %]
+ </td>
+ <td class='holds_cell'>
+ <input size='10' maxlength='10'
+ id='holds_frozen_thaw_input' />
+ </td>
+ </tr>
+
+ <tr id='holds_alt_formats_row_extras' class='hide_me'>
+ <td colspan='2' align='center'>
+ <div style='padding: 8px;'>
+ <a class='classic_link' href='#'
+ style='padding: 5px;'>[% l("Advanced Hold Options") %]</a>
+ </div>
+ </td>
+ </tr>
+
+ <tr id='holds_alt_formats_row' class='hide_me'>
+
+ <td class='holds_cell'>
+ <div style='margin-bottom: 5px;'>
+ <span>[% l("Acceptable Alternative Formats:") %] </span>
+ <span><a class='classic_link red' href='#'>[% l("(Help)") %]</a></span>
+ </div>
+ <div>[% l("(control-click to select multiple formats)") %]</div>
+ </td>
+
+ <td class='holds_cell'>
+ <select id='hold_alt_form_selector' multiple='multiple' style='width: 14em;'>
+ <option value='at' class='hide_me'>[% l("Books") %]</option>
+ <option value='at-d' class='hide_me'>[% l("Large Print Books") %]</option>
+ <option value='i' class='hide_me'>[% l("Audiobooks") %]</option>
+ <option value='g' class='hide_me'>[% l("Video Recordings") %]</option>
+ <option value='j' class='hide_me'>[% l("Music") %]</option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td class='holds_cell' align='center' colspan='2'>
+ <!-- <button id='holds_submit'>[% l("Place Hold") %]</button> -->
+ <button class='hide_me' id='holds_update'>[% l("Update Hold") %]</button>
+ <span style='padding: 20px;'> </span>
+ <!-- <button id='holds_cancel'>[% l("Cancel") %]</button> -->
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <span class='hide_me' id='holds_bad_phone'>
+ [% l("The phone number does not have the correct format. The expected format is XXX-YYY-ZZZZ") %]
+ </span>
+ <span class='hide_me' id='hold_not_allowed'>
+ [% |l %]No items were found that could fulfill the requested holds.
+ It's possible that choosing a different format will result in a successful hold.
+ It is also possible that you have exceeded the number of allowable holds.
+ For further information, please consult your local librarian.[% END %]
+ </span>
+ </div>
+ <div id="anonListTable" class="hide_me" style="margin-top: 6px;">
+ <select id="holdsCacheSel" class="hide_me"></select><br />
+ <a href="#">Place hold on selected</a><br />
+ <a href="#">Remove selected</a>
+
+ <table id="temp_list_holds" cellpadding='0' cellspacing='0' border='0'
+ style="margin-top:10px;">
+ <tr>
+ <td width="1%" style="padding-left:10px;">
+ <input type='checkbox' title='Select All'
+ id='anon_selector' />
+ </td>
+ <td width="1%">
+ </td>
+ <td width="98%" style="padding-left:40px;">
+ <strong>Title</strong>
+ </td>
+ </tr>
+ </table>
+ <table width='100%' style="margin-left:7px;margin-bottom:10px;">
+ <thead>
+ <tr><td width='20'></td><td width='30'></td><td></td></tr>
+ </thead>
+ <tbody id="anonListParent">
+ <tr id="anonListTemp">
+ <td><input type='checkbox' name='anon_selector' /></td>
+ <td name="curr_row"></td>
+ <td name="title"></td>
+ </tr>
+ </tbody>
+ </table>
+ <a href="#">Back to search results</a>
+ </div>
+
+ <span class='hide_me' id='format_words'>
+ <span name='at'>[% l("Books") %]</span>
+ <span name='at-d'>[% l("Large Print Books") %]</span>
+ <span name='i'>[% l("Audiobooks") %]</span>
+ <span name='g'>[% l("Video Recordings") %]</span>
+ <span name='j'>[% l("Music") %]</span>
+ <span name='m'>[% l("Electronic Resources") %]</span>
+ </span>
+
+ <span class='hide_me' id='holds_explain_adv'>
+ [% |l %]If you wish to broaden the scope of your hold to include other versions of this title,
+ select the formats that would be acceptable. The first available copy will be sent to you.[% END %]
+ </span>
+
+ <span class='hide_me' id='holds_pick_good_org'>[% l("Please select a physical location where your hold can be delivered.") %]</span>
+ <span class='hide_me' id='hold_dup_exists'>[% l("A hold already exists on the requested item.") %]</span>
+ <span class='hide_me' id='hold_dup_exists_override'>[% l("A hold already exists on the requested item. Would you like to create the hold anyway?") %]</span>
+
+ <span id='hold_failed_patron_barred' class='hide_me'>
+ [% |l %]PATRON BARRED. Please see any notes in the "Staff Notes" section of your
+ "My Account" page or contact your local library.[% END %]
+ </span>
+
+ <span id='invalid_hold' class='hide_me'>
+ [% |l %]This hold is no longer valid. It's likely that the target for the hold was
+ deleted from the system. Please cancel this hold and place a new one.[% END %]
+ </span>
+ <span id='holds_invalid_recipient' class='hide_me'>[% l("The patron barcode entered as the hold recipient is invalid.") %]</span>
+ </div>
--- /dev/null
- {value => "id|bibcn", label => l("Call Number")}
+ [% query_types = [
+ {value => "keyword", label => l("Keyword")},
+ {value => "title", label => l("Title")},
+ {value => "author", label => l("Author")},
+ {value => "subject", label => l("Subject")},
+ {value => "series", label => l("Series")},
++ {value => "id|bibcn", label => l("Bib Call Number")}
+ ] %]
+ <select name="qtype">
+ [% query_type = query_type || CGI.param('qtype');
+ FOR qt IN query_types -%]
+ <option value='[% qt.value %]'[%
+ query_type == qt.value ? ' selected="selected"' : ''
+ %]>[% qt.label %]</option>
+ [% END -%]
+ </select>
--- /dev/null
- [% IF 0 %]
+ <div class='rdetail_extras_div'>
+ <div style="margin-bottom:20px;"></div>
+
+ <!-- Chilifresh patron reviews -->
+ <strong>[% l('Patron Reviews:') %]</strong>
+ <div style="margin-bottom:20px;">
+ <div class="chili_review" id="isbn_[% attrs.isbn_clean %]"> </div>
+ <div id="chili_review_[% attrs.isbn_clean %]" style="display: none;" align="center" width="100%"></div>
+ </div>
+
+ <!-- Reviews from added content provider -->
+ [% IF 0 %]
+ <strong>[% l('Reviews:') %]</strong>
+ <div id='rdetail_review_container' style="margin-bottom:20px;"></div>
+ [% END %]
+
+ <!-- Novelist suggestions-->
- <div id='rdetail_novelist_div' class='rdetail_extras_div'>
- <div id="NoveListSelect" class="NoveListSelect">
- <div id="NoveListAnchor" class="NoveListSelect"></div>
- <div id="novsuggestions"></div>
- <div id="nextreads"></div>
- <div id="novrelatedauthors"></div>
- <div id="novrelateditems"></div>
++ [% IF ENV.OILS_NOVELIST_URL %]
+ <strong>[% l('Similar Books:') %]</strong>
++ <div class='rdetail_extras_div'>
++ <div id="NoveListSelect" class="NoveListSelect">
++ <div id="NoveListAnchor" class="NoveListSelect"></div>
++ <div id="novsuggestions"></div>
++ <div id="nextreads"></div>
++ <div id="novrelatedauthors"></div>
++ <div id="novrelateditems"></div>
++ </div>
+ </div>
+ [% END %]
+ </div>
+ </div>
+
--- /dev/null
- {name => 'summary', label => l('Summaries & More'), hide => 1}, # Content Cafe
+ <div id="rdetail_main_div">
+ <div id='rdetail_extras_div' style='width: 100%;'>
+
+ [% # Hidden extras are not yet implemented. Some may require JS
++
++ # Let's see if we should hide the content cafe / simple summary content
++ hide_summary = 1;
++ IF attrs.summary; hide_summary = 0; ELSE;
++ # Expose content cafe if it's reasonable to do so.
++ # This approach only works when using embedded content cafe.
++ IF ENV.OILS_CONTENT_CAFE_USER;
++ ident = attrs.isbn_clean || attrs.upc;
++ IF ident; hide_summary = 0; END;
++ END;
++ END;
++
+ extras = [
- {name => 'awards', label => l('Series'), hide => 1},
++ {name => 'summaryplus', label => l('Summaries & More'), hide => hide_summary},
+ {name => 'content', label => l('Contents'), hide => 1}, # ToC
+ {name => 'authors', label => l('Authors')},
+ {name => 'series', label => l('Series'), hide => 1},
- {name => 'cnbrowse', label => l('Shelf Browser'), hide => 1},
+ {name => 'subjects', label => l('Subject')},
+ {name => 'annotation', label => l('Annotation'), hide => 1},
+ {name => 'awards', label => l('Awards, Reviews, & Suggested Reads')},
+ {name => 'excerpt', label => l('Excerpt'), hide => 1},
+ {name => 'issues', label => l('Issues Held'), hide => !ctx.have_holdings_to_show},
+ {name => 'preview', label => l('Preview'), hide => 1},
- [% href = ctx.full_path _ '?expand=' _ name _ '#' _ name; %]
++ {name => 'cnbrowse', label => l('Shelf Browser')},
+ {name => 'copyinfo', label => l('Copy Summary'), hide => 1},
+ {name => 'marchtml', label => l('MARC Record')}
+ ];
+
+ FOREACH extra IN extras;
+ IF extra.hide; NEXT; END;
+ name = extra.name;
+ %]
+ <div class="rdetail_extras">
+ <div class="rdetail_extras_hr"></div>
+ <div class="rdetail_extras_link">
++ [% # extras_propagator should be used in place of propagator
++ # in opac extras interfaces... it just avoids duplicating
++ # the expands CGI param and parameters that are specific
++ # to extras.
++ # XXX move this off into a helper function
++
++ extras_propagator = propagator.replace('(&)?expand=.+($|&|;)', '$2');
++ extras_propagator = extras_propagator.replace('(&)?cnoffset=.+($|&|;)', '$2');
++
++
++ href = ctx.full_path _ extras_propagator _ '&expand=' _ name _ '#' _ name; %]
+ <a name='[% name %]' href='[% href %]'><img
+ alt='[% extra.label %]' src="[% ctx.media_prefix %]/images/rdetail_arrow.png" /></a>
+ <a href='[% href %]' class="rdetail_extras_lbl">[% extra.label %]</a>
+ </div>
+ </div>
+ <div class='rdetail_extras_div'>
+ [% exp_name = 'expand_' _ name;
+ IF ctx.$exp_name;
+ IF name == 'marchtml';
+ ctx.marchtml;
+ ELSE;
+ # Load the template for the selected extra
+ INCLUDE "default/opac/parts/record/${name}.tt2";
+ END;
+ END;
+ %]
+ </div>
+ [% END %]
+ </div>
+ <!--
+ <div id='rdetail_preview_full_text' class='hide_me'>[% l("Full text") %]</div>
+ <div id='rdetail_preview_title' class='hide_me'>[% l("See the full text of this book.") %]</div>
+ <div id='rdetail_preview_badge' class='hide_me'>[% l("Show a preview of this book from Google Book Search") %]</div>
+ -->
+ </div>
--- /dev/null
- <td>[% l("Holdable") %]</td>
+ [% PROCESS "default/opac/parts/misc_util.tt2";
+ USE ResolverResolver;
+ ctx.page_title = attrs.title | html_entity
+ %]
+ <!-- ****************** rdetail_summary.xml ***************************** -->
+ <abbr class="unapi-id" title='tag:[% ctx.hostname %],[% date.format(date.now, '%Y') %]:biblio-record_entry/[% ctx.bre_id %]'></abbr>
+
+ [% IF ctx.refworks.enable == 'true' %]
+ [% INCLUDE 'default/opac/parts/record/refworks.tt2' %]
+ [% END %]
+
+ <!-- This holds the record summary information -->
+
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" id="rdetail_details_table">
+ <tbody id="rdetail_details_tbody">
+ <tr>
+ <td width="90" valign="top" id="rdetail_image_cell">
+ [% ident = attrs.isbn_clean || attrs.upc; IF ident; %]
+ <a id='rdetail_img_link' href='[% ctx.media_prefix %]/opac/extras/ac/jacket/large/[% ident %]'><img
+ alt="[% l('Image of item') %]" id='rdetail_image'
+ src='[% ctx.media_prefix %]/opac/extras/ac/jacket/medium/[% ident %]' /></a>
+ [% END %]
+ <br />
+ </td>
+
+ <td valign="top">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr>
+ <td valign="top">
+ <span id='rdetail_title'>[% attrs.title %]</span><br />
+ [% IF attrs.author %]
+ <span class='opac-auto-030'>[% l("Author") %]:</span>
+ <em><a title='[% l("Perform an author search") %]'
+ id='rdetail_author'
+ href="[% ctx.opac_root %]/results?qtype=author&query=[%-
+ attrs.author | replace('[,\.:;]', '') | uri %]&loc=[% CGI.param('loc') | uri %]">[% attrs.author %]</a></em>
+ [% END %]
+ </td>
+ <td align="right" valign="top" nowrap="nowrap" style="white-space:nowrap;">
+ <div style="width:230px;text-align:left;margin-top:3px;">
+ <div style="float:right;">
+ <div class="rdetail_aux_utils opac-auto-010">
+ <a href="[% ctx.opac_root %]/place_hold[%-
+ propagator; propagator.length > 1 ? "&" : ""; %]hold_target=[% ctx.bre_id %]&hold_type=T" id="rdetail_place_hold" class="no-dec"><img
+ src="[% ctx.media_prefix %]/images/green_check.png" alt="[% l('place hold') %]" /><span
+ style="position:relative;top:-3px;left:3px;">[% l('Place Hold') %]</span></a>
+ </div>
+ <div class="rdetail_aux_utils opac-auto-121">
+ [%
+ operation = ctx.mylist.grep(ctx.bre_id).size ? "delete" : "add";
+ label = (operation == "add") ? l("Add to my list") : l("Remove from my list");
+ %]
+ <form action="[% ctx.opac_root %]/mylist/[% operation %]" method="POST">
+ <input type="hidden" name="record" value="[% ctx.bre_id %]" />
+ <div class="pos-abs">
+ <div class="opac-auto-149">
+ <input type="submit" title="[% label %]" value="[% label %]" class="subtle-button" />
+ </div>
+ </div>
+ <input type="image" alt="[% label %]"
+ src="[% ctx.media_prefix %]/images/clipboard.png" />
+ </form>
+ </div>
+ </div>
+ <div style="float:right;margin-right:17px;">
+ [% IF attrs.format_icon %]
+ <img alt="[% attrs.format_label %]" title="[% attrs.format_label %]" src="[% attrs.format_icon %]" />
+ [% END %]
+ </div>
+ </div>
+ </td>
+ </tr>
+ </table>
+ <div class='opac-auto-018'>
+ <table border="0" cellpadding="0" width="100%">
+ <tr>
+ <td nowrap='nowrap' valign="top">
+ [% IF attrs.isbn %]<strong id="rdetail_isbn_lbl">[% l("ISBN") %]</strong>[% END %]
+ </td>
+ <td valign="top" id='rdetail_isbn'>[% attrs.isbn %]</td>
+ <td nowrap='nowrap' valign="top">
+ [% IF attrs.phys_desc %]<strong id="rdetail_phys_lbl">[% l("Physical Description") %]</strong>[% END %]
+ </td>
+ <td valign="top" id='rdetail_physical_desc'>[% attrs.phys_desc %]</td>
+ </tr>
+ [% IF openurl.enabled == 'true';
+ FOR issn IN args.issns;
+ sfx = ResolverResolver.resolve_issn(issn, openurl.baseurl);
+ FOR res IN sfx;
+ %]
+ <tr name="results_issn_tr">
+ <td valign="top">
+ <strong><a href="[% res.target_url %]">
+ [% res.public_name %]</a></strong>
+ </td>
+ <td>[% res.target_coverage %]</td>
+ </tr>
+ [% END %]
+ [% END %]
+ [% END %]
+ <tr>
+ <td nowrap='nowrap' valign="top">
+ <strong id="rdetail_ed_lbl">[% IF attrs.edition; l("Edition"); END %]</strong>
+ </td>
+ <td valign="top" id='rdetail_edition'>[% attrs.edition %]</td>
+ </tr>
+ <tr>
+ <td nowrap='nowrap' valign="top">
+ <strong id="rdetail_pub_lbl">[% IF attrs.publisher; l("Publisher"); END %]</strong>
+ </td>
+ <td valign="top" id='rdetail_publisher'>[% attrs.publisher %]</td>
+ <td nowrap='nowrap' valign="top">
+ <strong id="rdetail_pubdate_lbl">[% IF attrs.pubdate; l("Publication Date"); END %]</strong>
+ </td>
+ <td valign="top" id='rdetail_pubdate'>[% attrs.pubdate %]</td>
+ </tr>
+ </table>
+
+ <!-- hold/copy summary -->
+ <div style="padding-top:15px;">
+ <div>
+ [% l("[quant,_1,Hold,Holds] with [quant,_2,total copy,total copies]",
+ ctx.record_hold_count, ctx.copy_summary.0.count) %]
+ </div>
+ <div>[% l('[quant,_1,Copy,Copies] available', ctx.copy_summary.0.available) %]</div>
+ </div>
+
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <br />
+
+ [% FOR uri IN args.uris %]
+ <div class="rdetail_uri">
+ <a href="[% uri.href %]">[% uri.link %]</a>[% ' - ' _ uri.note IF uri.note %]
+ </div>
+ [% END %]
+
+ <br />
+
+ <table cellpadding="0" cellspacing="0" border="0" width="100%" id="rdetails_status">
+ <thead>
+ <tr id="rdetails_status_head">
+ <td>[% l("Location") %]</td>
+ <td>[% l("Call Number") %]</td>
+ <td>[% l("Barcode") %]</td>
+ <td>[% l("Shelving Location") %]</td>
+ [% IF ctx.is_staff %]
+ <td>[% l("Age Hold Protection") %]</td>
+ <td>[% l("Create Date") %]</td>
- [% FOR copy_info IN ctx.copies %]
- [% NEXT IF copy_info.call_number_label == '##URI##' %]
++ <td>[% l("Holdable?") %]</td>
+ [% END %]
+ <td>[% l("Status") %]</td>
+ <td>[% l("Due Date") %]</td>
+ </tr>
+ </thead>
+ <tbody class="copy_details_table">
- <td>[% (copy_info.holdable == 't' AND
- copy_info.location_holdable == 't' AND
- copy_info.status_holdable == 't') ? l('Yes') : l('No') %]</td>
++ [% last_cn = 0;
++ FOR copy_info IN ctx.copies;
++ NEXT IF copy_info.call_number_label == '##URI##' %]
+ <tr>
+ <td>[%
+ # XXX KCLS-specific kludging
+ org_name = ctx.get_aou(copy_info.circ_lib).name;
+ dir = org_name | lower | replace('[^\w]', '') |
+ replace('.+320th', '320th'); %]
+ <a href="http://www.kcls.org/[% dir %]/"
+ class="classic_link">[% org_name %]</a>
+ </td>
+ <td>[% copy_info.call_number_label %]</td>
+ <td>[% copy_info.barcode %]</td>
+ <td>[% copy_info.copy_location %]</td>
+ [% IF ctx.is_staff %]
+ <td>
+ [% copy_info.age_protect ?
+ ctx.get_crahp(copy_info.age_protect).name : l('None') %]
+ </td>
+ <td>[% date.format(
+ ctx.parse_datetime(copy_info.create_date),
+ DATE_FORMAT
+ ) %]</td>
++ <td>[% # Show copy/volume hold links to staff (without
++ # checking whether they have permissions to do those).
++ overall_holdable = (copy_info.holdable == 't' AND
++ copy_info.location_holdable == 't' AND
++ copy_info.status_holdable == 't');
++ IF overall_holdable;
++ l("Place on"); %]
++ <a href="[% ctx.opac_root %]/place_hold[% propagator; propagator.length > 1 ? "&" : ""; %]hold_target=[% copy_info.id %]&hold_type=C">[% l("copy") %]</a>
++ [% IF copy_info.call_number != last_cn;
++ last_cn = copy_info.call_number;
++ l(" / "); %]
++ <a href="[% ctx.opac_root %]/place_hold[% propagator; propagator.length > 1 ? "&" : ""; %]hold_target=[% copy_info.call_number %]&hold_type=V">[% l("volume") %]</a>
++ [% END;
++ ELSE;
++ l("No");
++ END %]</td>
+ [% END %]
+ <td>[% copy_info.copy_status %]</td>
+ <td>[%
+ IF copy_info.due_date;
+ date.format(
+ ctx.parse_datetime(copy_info.due_date),
+ DATE_FORMAT
+ );
+ ELSE;
+ '-';
+ END %]</td>
+ </tr>
+ [% END %]
+ <tr>
+ [% IF ctx.copy_offset > 0;
+ new_offset = ctx.copy_offset - ctx.copy_limit;
+ IF new_offset < 0; new_offset = 0; END %]
+ <td>
+ <a href="[% ctx.opac_root %]/record/[% ctx.bre_id %]?copy_offset=[% new_offset %]&copy_limit=[% ctx.copy_limit %]">« [%
+ l('Previous [_1]', ctx.copy_offset - new_offset)
+ %]</a>
+ </td>
+ [% END %]
+ [% IF ctx.copies.size >= ctx.copy_limit %]
+ <td>
+ <a href="[% ctx.opac_root %]/record/[% ctx.bre_id %]?copy_offset=[% ctx.copy_offset + ctx.copy_limit %]&copy_limit=[% ctx.copy_limit %]">[%
+ l('Next [_1]', ctx.copy_limit)
+ %] »</a>
+ </td>
+ [% END %]
+ </tr>
+ </tbody>
+ </table>
+
+ <div id="rdetail_locs_expand" class="hide_me">
+ <a href="#"><img
+ src="[% ctx.media_prefix %]/images/plus_sign.png" /></a>
+ <a style="position:relative;top:-3px;" href="#">[% l('Show more locations') %]</a>
+ </div>
+
+ <div id="rdetail_locs_collapse" class="hide_me">
+ <a href="#"><img
+ src="[% ctx.media_prefix %]/images/plus_sign.png" /></a>
+ <a style="position:relative;top:-3px;" href="#">[% l('Collapse locations') %]</a>
+ </div>
+
+ <div id="rdetail_extras_expand" class="hide_me">
+ <a href="#"><img
+ src="[% ctx.media_prefix %]/images/plus_sign.png" /></a>
+ <a style="position:relative;top:-3px;" href="#">[% l('Expand all tabs') %]</a>
+ </div>
+
+ <div id="rdetail_extras_collapse" class="hide_me">
+ <a href="#"><img src="[% ctx.media_prefix %]/images/plus_sign.png" /></a>
+ <a style="position:relative;top:-3px;" href="#">[% l('Collapse all tabs') %]</a>
+ </div>
+
+ <div class="hide_me">
+ <table id='' border="0" width="100%">
+ <tbody id='rdetail_details_tbody'>
+ <tr>
+ <td id='' rowspan='2' valign="top" align="center" style="padding-right:10px;">
+ </td>
+ <td class='rdetail_desc' valign="top" colspan="3">
+ <table border="0" width="100%">
+ <tr>
+ <td valign="top">
+ <div style="padding-bottom:7px;">
+ <strong>[% l("Title") %]:</strong>
+ </div>
+ </td>
+ <td width="1" valign="top" align="right" style="white-space:nowrap;">
+ <a href="[% ctx.opac_root %]/place_hold[% propagator; propagator.length > 1 ? "&" : ""; %]hold_target=[% ctx.bre_id %]&hold_type=T"><img alt="[% l('Place Hold') %]"
+ src="[% ctx.media_prefix %]/images/place_hold.gif" /></a>
+ <a href="#" id="rd_reviews_and_more" target="_blank"><img
+ alt="[% l('Reviews and More') %]" src="[% ctx.media_prefix %]/images/reviews.gif" /></a>
+ <a href="#" id=""><img alt="[% l('Add to My List') %]"
+ src="[% ctx.media_prefix %]/images/add_mylist.gif" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td nowrap='nowrap' colspan="3" valign="bottom" style="padding-bottom:16px;">
+ </td>
+ </tr>
+ <tr>
+ <td><div style="height:20px;"></div></td>
+ </tr>
+ </tbody>
+ </table>
+ </div> <!-- details_body -->
+
+ <!-- ****************** end: rdetail_summary.xml ***************************** -->
--- /dev/null
- [% IF is_advanced; l('your search'); ELSE %]
+ <div id='result_low_hits'>
+ <div id="zero_search_hits">
+ <div>
+ <p>[% l('Sorry, no entries were found for') %]
- Change to <strong>Advanced Keyword Search.</strong>
++ [% IF is_advanced OR is_special; l('your search'); ELSE %]
+ <q>[% CGI.param('query') | html %]</q>
+ [% END %]
+ <br />
+ <span id="zero_hits_label1" class="hide_me">Did you mean
+ <strong><a id="spell_check_link" href="javascript:;"></a></strong>?</span>
+ </p>
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td valign="top" style="padding-right:10px;">
+ <span id="zero_hits_label2" class="hide_me">[% l('Other Possibilities:') %]</span>
+ </td>
+ <td id="zero_hits_suggestions"></td>
+ </tr>
+ </table>
+ </div>
+ <div style="float:right;width:353px;background:#ccc;padding:10px;margin-top:7px;">
+ [% INCLUDE "default/opac/parts/result/lowhits_purchase.tt2" %]
+ <p>
+ <strong>Keyword Search Tips</strong><br />
- to truncate from 1-5 characters. Use a double asterisk ** for open-ended truncation.<br />
++ Try changing to <strong>Advanced Search</strong>.
+ </p>
+ <p>
+ <strong>Adjacency</strong><br />
+ Multiple words are not searched together as a phrase. They will
+ be found in various parts of the record. To search for a phrase, enclose your
+ search terms in quotation marks.<br />
+ (example: <strong>"garcia marquez"</strong>)
+ </p>
+ <p>
+ <strong>Truncation</strong><br />
+ Words may be right-hand truncated using an asterisk. Use a single asterisk *
- <strong>Wildcards</strong><br />
- You may use a question mark to replace a single character anywhere within a word.<br />
- example: <strong>wom?</strong>)
++ to truncate any number of characters.<br />
+ (example: <strong>environment* agency</strong>)
+ </p>
+ <p>
++ <strong>Anchored Searching</strong><br />
++ You may use ^ and $ to indicate "phrase begins with" and
++ "phrase ends with," respectively, within a search phrase
++ enclosed in quotation marks.<br />
++ (examples: <strong>"^harry"</strong> for phrases that begin with
++ the term <em>harry</em>.
++ <strong>"stone$"</strong> for phrases that end in <em>stone</em>.)
+ </p>
+ </div>
+ </div>
+ <div class="hide_me">
+ <div style='text-align: center; padding-bottom: 8px;' class="hide_me">
+ <div id='result_low_hits_msg' class='hide_me'>[% l("Few hits were returned for your search.") %]</div>
+ <div id='result_zero_hits_msg' class='hide_me'>[% l("Zero hits were returned for your search.") %]</div>
+ </div>
+
+ <!-- spell checker -->
+ <div id='did_you_mean' class='lowhits_div hide_me'>
+ <span>[% l("Maybe you meant:") %] </span>
+ <!-- <a class='classic_link' id='spell_check_link'> </a> -->
+ </div>
+
+ <div id='low_hits_remove_format' class='lowhits_div hide_me'>
+ <span>[% l("You will find more hits when searching all item formats:") %] </span>
+ <a id='low_hits_remove_format_link' class='classic_link'>[% l("Search again with all formats?") %]</a>
+ </div>
+
+ <div id='low_hits_cross_ref' class='lowhits_div hide_me'>
+ <span>[% l("You may also like to try these related searches:") %]</span>
+ <div style='padding: 5px;'>
+ <a id='low_hits_xref_link' class='classic_link' style='padding-right: 5px;'> </a>
+ </div>
+ </div>
+
+ <div id='low_hits_expand_range' class='lowhits_div hide_me'>
+ <span>[% l("You may also wish to expand your search range to:") %] </span>
+ <a id='low_hits_expand_link' class='classic_link' style='padding-right: 5px;'> </a>
+ </div>
+
+ <div id='low_hits_search_type' class='lowhits_div hide_me'>
+ <span>[% l("You can try searching the same terms by:") %]</span>
+ <a id='low_hits_title_search' class='hide_me classic_link'
+ style='padding-right: 5px;'>[% l("title") %]</a>
+ <a id='low_hits_author_search' class='hide_me classic_link'
+ style='padding-right: 5px;'>[% l("author") %]</a>
+ <a id='low_hits_subject_search' class='hide_me classic_link'
+ style='padding-right: 5px;'>[% l("subject") %]</a>
+ <a id='low_hits_series_search' class='hide_me classic_link'
+ style='padding-right: 5px;'>[% l("series") %]</a>
+ <a id='low_hits_keyword_search' class='hide_me classic_link'
+ style='padding-right: 5px;'>[% l("keyword") %]</a>
+ </div>
+ </div>
+ </div>
--- /dev/null
-<p>
++[%# XXX Is this block generally desired? <p>
+ <strong>Still not finding what you are looking for?</strong><br />
+ Request that your library purchase the material you are looking for by making a
+ <a href="javascript:;">Purchase Request</a><br />
+ <strong>Note:</strong> You must be logged in to make a Purchase Request<br />
-</p>
++</p> %]
--- /dev/null
- [% IF is_advanced %]
+ [% PROCESS "default/opac/parts/org_selector.tt2" %]
+ <div id="search-box">
+ [% UNLESS took_care_of_form -%]
+ <form action="[% ctx.opac_root %]/results" method="GET">
+ [%- END %]
+ <table cellpadding="0" cellspacing="10" border="0">
+ <tr>
+ <td colspan="3">
+ <span class="search_catalog_lbl">[% l('Search the Catalog') %]</span>
+ <a href="[% ctx.opac_root %]/advanced"
+ id="home_adv_search_link"><span
+ class="adv_search_font">[% l('Advanced Search') %]</span></a>
+ </td>
+ </tr>
+ <tr>
- [% IF ctx.processed_search_query OR NOT is_advanced %]
++ [% IF is_advanced || is_special %]
+ <td colspan="2">
+ <input type="hidden" name="_adv" value="1" />
+ [% ELSE %]
+ <td>
+ [% INCLUDE "default/opac/parts/qtype_selector.tt2" %]
+ </td>
+ [% END %]
- [% UNLESS is_advanced %]
++ [% IF ctx.processed_search_query OR (NOT is_advanced AND NOT is_special) %]
+ <td>
+ <div id="search_box_wrapper">
+ <!-- Note: when common browsers support HTML5 placeholder text, we can remove the JS -->
+ <input type="text" id="search_box" name="query" value="[% is_advanced ? ctx.processed_search_query : CGI.param('query') || l("Search Keyword") | html %]"
+ [% IF is_advanced %]style="width: 450px"[% END %]
+ onfocus="if (this.value=='[% l("Search Keyword") %]'){this.value='';this.style.color='#000';}"
+ onblur="if (this.value==''){this.value='[% l("Search Keyword") %]';this.style.color='#999';}"
+ x-webkit-speech />
+ </div>
+ <input name='page' type='hidden' value="0" />
+ </td>
+ <td valign="top">
+ <div class="pos-abs">
+ <div class="opac-auto-143">
+ <input id='search-submit-go' type="image" alt="[% l('Search') %]" src="[% ctx.media_prefix %]/images/go-btn.png"
+ onmouseover="this.src='[% ctx.media_prefix %]/images/go-btn-hover.png';"
+ onmouseout="this.src='[% ctx.media_prefix %]/images/go-btn.png';"
+ onclick='setTimeout(function(){$("search-submit-spinner").className=""; $("search-submit-go").className="hidden"}, 2000)'/>
+ <img id='search-submit-spinner' src='/opac/images/progressbar_green.gif' style='height:16px;width:16px;' class='hidden'/>
+ </div>
+ </div>
+ </td>
+ [% END %]
+ </tr>
- [% IF is_advanced AND CGI.param('qtype') %]
++ [% UNLESS is_advanced OR is_special %]
+ <tr>
+ <td>
+ [% INCLUDE "default/opac/parts/coded_value_selector.tt2" attr=["mattype", "item_type"] none_ok=1 %]
+ </td>
+ <td>
+ <span id='depth_selector_span'>
+ [% PROCESS build_org_selector name='loc' value=CGI.param('loc') %]
+ </span>
+ <span id='lib_selector_span'>
+ <a id='lib_selector_link' class='classic_link'
+ href='#'>[% l("Choose a library to search") %]</a>
+ </span>
+ </td>
+ </tr>
+ [% END %]
+ </table>
+ [% UNLESS took_care_of_form %]</form>[% END %]
++ [% IF (is_advanced AND NOT is_special) AND CGI.param('qtype') %]
+ <div class="opac-auto-102">
+ [ <a href="[% ctx.opac_root %]/advanced?[% query_string %]">[%
+ l('Click to Refine Your Original Search')
+ %]</a> ]
+ </div>
+ [% END %]
+ <div id="breadcrumb">
+ <a href="[% ctx.opac_root %]/home">[% l('Catalog Home') %]</a> >
+ </div>
+ <div class="clear-both"></div>
+ </div>
--- /dev/null
- IF is_advanced;
+ [% PROCESS "default/opac/parts/header.tt2";
+ USE POSIX;
+
+ WRAPPER "default/opac/parts/base.tt2";
+ INCLUDE "default/opac/parts/topnav.tt2";
+
- page_count = POSIX.ceil(ctx.hit_count / ctx.page_size);
++ IF is_advanced || is_special;
+ ctx.page_title = l("Search Results");
+ ELSE;
+ ctx.page_title = l("Search Results: ") _ CGI.param('query') | html_entity;
+ END;
+
+ page = CGI.param('page') || 0;
- [% UNLESS is_advanced %]
++ page_count = ctx.page_size == 0 ? 1 : POSIX.ceil(ctx.hit_count / ctx.page_size);
+ %]
+ <form action="[% ctx.opac_root %]/results" method="GET">
+ <div id="search-wrapper">
+ [% INCLUDE "default/opac/parts/printnav.tt2" %]
+ [% INCLUDE "default/opac/parts/searchbar.tt2" took_care_of_form=1 %]
+ </div>
+ <div class="almost-content-wrapper">
+ <div id="results_header_bar">
+ <div id="results_header_inner">
+ <div class="results_header_btns">
+ <a href="[% ctx.opac_root %]/home"><img alt="[% l('Another Search') %]"
+ src="[% ctx.media_prefix %]/images/another_search.png"
+ onmouseover="this.src='[% ctx.media_prefix %]/images/another_search_hover.png';"
+ onmouseout="this.src='[% ctx.media_prefix %]/images/another_search.png';" /></a>
+ </div>
+ <div class="results_header_btns">
+ <a href="[% ctx.opac_root %]/advanced"><img alt="[% l('Advanced Search') %]"
+ src="[% ctx.media_prefix %]/images/adv_search.png"
+ onmouseover="this.src='[% ctx.media_prefix %]/images/adv_search_hover.png';"
+ onmouseout="this.src='[% ctx.media_prefix %]/images/adv_search.png';" /></a>
+ </div>
+ [% IF ctx.mylist.size %]
+ <div class="results_header_btns cached_list_div">
+ <a href="[% ctx.opac_root; ctx.user ? '/myopac/lists' : '/mylist' %]"><img
+ alt="View My List"
+ src="[% ctx.media_prefix %]/images/view_my_list.png"
+ onmouseover="this.src='[% ctx.media_prefix %]/images/view_my_list_hover.png';"
+ onmouseout="this.src='[% ctx.media_prefix %]/images/view_my_list.png';" /></a>
+ </div>
+ [% END %]
+ <div class="results_header_div"></div>
++ [% UNLESS is_advanced || is_special %]
+ <div class="results_header_lbl">Sort by</div>
+ [% INCLUDE "default/opac/parts/filtersort.tt2" value=CGI.param('sort') %]
+ <div class="results_header_div"></div>
+ <!-- XXX still needed?<div class="results_header_lbl">View</div>
+ <select class="results_header_sel">
+ <option>Simple</option>
+ <option>Detailed</option>
+ </select>
+ <div class="results_header_div"></div> -->
+ <input type="checkbox" id="limit_to_available"
+ name="modifier" value="available"
+ [% CGI.param('modifier').grep('available').size
+ ? ' checked="checked"' : '' %] />
+ <label for="limit_to_available" class="results_header_lbl">
+ [% l('Limit to available items') %]
+ </label>
+ [% END %]
+ <div class="clear-both"></div>
+ </div>
+ </div>
+ </div>
+ </form>
+ <div id="content-wrapper">
+ <div id="main-content">
+ <div id="tehResultsPage">
+ [% path = "default/opac/parts/result/" _
+ (ctx.records.size ? "table.tt2" : "lowhits.tt2");
+ INCLUDE $path %]
+ </div>
+ <div class="common-full-pad"></div>
+ </div>
+ </div>
+ [% END %]
--- /dev/null
- <td><label for="ident">&vandelay.id.field;: </label></td>
- <td>
- <select dojoType="dijit.form.FilteringSelect" name="ident" id="attr-editor-identifier">
- <option value='f' selected='selected'>&vandelay.false;</option>
- <option value='t'>&vandelay.true;</option>
- </select>
- </td>
- </tr>
- <tr>
+ <div style='float: left; margin-top: 8px;'>
+ <input dojoType="dijit.form.RadioButton" name="attrEditorGroup" value="bib"
+ id="aegB" onclick="setAttrEditorGroup('bib');" checked="checked"/>
+ <label for="aegB" style="margin-right: 1em;">&vandelay.bib.attrs;</label>
+ <input dojoType="dijit.form.RadioButton" name="attrEditorGroup" value="auth"
+ id="aegA" onclick="setAttrEditorGroup('auth');"/>
+ <label for="aegA" style="margin-right: 1em;">&vandelay.auth.attrs;</label>
+ </div>
+ <div dojoType="dijit.form.DropDownButton" id="vl-create-attr-editor-button">
+ <span name="create">&vandelay.create.attr.def;</span>
+ <div dojoType="dijit.TooltipDialog" execute="vlSaveAttrDefinition(arguments[0]);" id="attr-editor-dialog">
+ <script type='dojo/connect' event='onOpen'>onAttrEditorOpen();</script>
+ <script type='dojo/connect' event='onClose'>onAttrEditorClose();</script>
+ <table class='dijitTooltipTable'>
+ <tr>
+ <td><label for="code">&vandelay.code;:</label></td>
+ <td><input id='attr-editor-code' name="code" dojoType="dijit.form.TextBox"/></td>
+ </tr>
+ <tr>
+ <td><label for="description">&vandelay.descrip;:</label></td>
+ <td><input id='attr-editor-description' dojoType="dijit.form.TextBox" name="description"> </input></td>
+ </tr>
+ <tr>
+ <td><label for="amount">&vandelay.tags;:</label></td>
+ <td><input id="attr-editor-tags" dojoType="dijit.form.TextBox" name="tag"></input>
+ <div class="hidden" id="attr-editor-tags-tip">
+ <p>&vandelay.tooltip.tags;</p>
+ <p>&vandelay.for.example;:<code>120, 220, 300</code> or <code>120 220 330</code></p></div>
+ </td>
+ </tr>
+
+ <tr>
+ <td><label for="amount">&vandelay.subfields;:</label></td>
+ <td><input dojoType="dijit.form.TextBox" name="subfield" id="attr-editor-subfields"></input>
+ <div class="hidden" id="attr-editor-subfields-tip">
+ <p>&vandelay.tooltip.subfields;</p>
+ <p>&vandelay.for.example;: <code>a, b, j, x</code> or <code>a b j x</code></p></div>
+ </td>
+ </tr>
+ <tr>
- <th field='ident'>&vandelay.identifier;</th>
+ <td><label for="attr-editor-xpath">&vandelay.xpath.advanced;: </label></td>
+
+ <td><input dojoType="dijit.form.TextBox" id="attr-editor-xpath" name="xpath"></input></td>
+ </tr>
+ <tr>
+ <td><label for="attr-editor-remove">&vandelay.remove.advanced;: </label></td>
+
+ <td><input dojoType="dijit.form.TextBox" id="attr-editor-remove" name="remove"></input></td>
+ </tr>
+ <tr id="attr-editor-create-bar">
+ <td colspan='2' align='center'>
+ <button dojoType="dijit.form.Button" type="submit"
+ id="attr-editor-create-button">&vandelay.create;</button>
+ <button type="button" dojoType="dijit.form.Button"
+ onclick="dijit.byId('attr-editor-dialog').onCancel();">&vandelay.cancel;</button>
+ </td>
+ </tr>
+ <tr id="attr-editor-update-bar">
+ <td colspan='2' align='center'>
+ <button dojoType="dijit.form.Button" type="submit"
+ id="attr-editor-update-button">&vandelay.update;</button>
+ <button type="button" dojoType="dijit.form.Button"
+ onclick="dijit.byId('attr-editor-dialog').onCancel();">&vandelay.cancel;</button>
+ <button dojoType="dijit.form.Button"
+ type="button"
+ id="attr-editor-delete-button"
+ style="padding-left: 2em;"
+ onclick="if(confirm('&vandelay.sure.to.delete;')) { vlAttrDelete(); }">
+ &vandelay.delete.record;</button>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="client">
+ <table dojoType='dojox.grid.DataGrid' jsId='attrEditorGrid' query="{id: '*'}" autoHeight='true'>
+ <thead>
+ <tr>
+ <th field='id'>&vandelay.id;</th>
+ <th field='code' width='auto'>&vandelay.code;</th>
+ <th field='description' width='auto'>&vandelay.descrip;</th>
+ <th field='tag' get='attrGridGetTag'>&vandelay.tag;</th>
+ <th field='subfield' get='attrGridGetSubfield'>&vandelay.subfield;</th>
+ <th field='xpath' width='auto'>&vandelay.xpath;</th>
+ <th field='remove' width='auto'>&vandelay.remove;</th>
+ </tr>
+ </thead>
+ </table>
+ <div/>
+ </div>
+
+
--- /dev/null
- /*
- value: '<input type="checkbox" name="vl-overlay-target-RECID" '+
- 'onclick="vlHandleOverlayTargetSelected(ID, GRIDID);" gridid="GRIDID" match="ID"/>'
- */
+ <script type="text/javascript">
+ var vlMatchGridLayout;
+ function resetVlMatchGridLayout() {
+ vlMatchGridLayout = [{
+ defaultCell: {styles: 'text-align: center;'},
+ cells : [[
+ {
+ name: '&vandelay.overlay.target;',
+ get: vlGetOverlayTargetSelector,
+ formatter : vlFormatOverlayTargetSelector,
- {name:'&vandelay.source.match.point;', field:'src_matchpoint'},
- {name:'&vandelay.dest.match.point;', field:'dest_matchpoint'},
+ },
+ {name: '&vandelay.id;', field:'id'},
+ { name: '&vandelay.view.marc;',
+ get: vlGetViewMARC,
+ formatter : vlFormatViewMatchMARC
+ },
++ {name: 'Match Score', field:'match_score'},
++ {name: 'Queued Record Quality', field:'rec_quality'},
++ {name: 'Matched Record Quality', field:'match_quality'},
+ {name: '&vandelay.creator;', get: vlGetCreator},
+ {name: '&vandelay.create.date;', field:'create_date', get: vlGetDateTimeField},
+ {name: '&vandelay.last.edit.date;', field:'edit_date', get: vlGetDateTimeField},
+ {name: '&vandelay.source;', field:'source'},
+ {name: '&vandelay.tcn.source;', field:'tcn_source'},
+ {name: '&vandelay.tcn.value;', field:'tcn_value'}
+ ]]
+ }];
+ }
+ </script>
+ <h1>&vandelay.import.matches;</h1><br/>
+
+ <div dojoType="dijit.layout.ContentPane" layoutAlign='client'>
+ <button dojoType='dijit.form.Button'
+ onclick="displayGlobalDiv('vl-queue-div');">↖ &vandelay.back.to.import.queue;</button>
+ </div>
+
+ <div dojoType="dijit.layout.ContentPane" layoutAlign='client'>
+ <table dojoType='dojox.grid.DataGrid' jsId='vlMatchGrid' query='{id:"*"}' autoHeight='true'>
+ </table>
+ </div>
+
--- /dev/null
- fieldOrder="['name', 'owner', 'preserve_spec', 'replace_spec', 'add_spec', 'strip_spec']"
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="client">
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="top" class='oils-header-panel'>
+ <div>Overlay / Merge Profiles</div>
+ <div>
+ <button dojoType='dijit.form.Button' onClick='pGrid.showCreateDialog()'>New Merge Profile</button>
+ <button dojoType='dijit.form.Button' onClick='pGrid.deleteSelected()'>Delete Selected</button>
+ </div>
+ </div>
+ <div>
+ <span style='padding-right:10px;'>Context Org Unit</span>
+ <select dojoType="openils.widget.OrgUnitFilteringSelect" jsId='profileContextOrgSelector'
+ searchAttr='shortname' labelAttr='shortname'> </select>
+ </div>
+ <table jsId="pGrid"
+ dojoType="openils.widget.AutoGrid"
- defaultCellWidth='"auto"'
++ fieldOrder="['name', 'owner', 'preserve_spec', 'replace_spec', 'add_spec', 'strip_spec', 'lwm_ratio']"
+ query="{id: '*'}"
++ defaultCellWidth='"14%"'
+ fmClass='vmp'
+ showPaginator='true'
+ editOnEnter='true'>
++ <thead>
++ <tr>
++ <th field='owner' get='vlGetOrg'/>
++ </tr>
++ </thead>
+ </table>
+ </div>
--- /dev/null
-<div dojoType="dijit.layout.ContentPane" layoutAlign='client'>
- <table class='wide'>
- <tr>
- <td align='left'>
- <h1>&vandelay.record.queue; <span style='font-style:italic;' id='vl-queue-summary-name'/></h1><br/>
- </td>
- <td align='right'>
- &vandelay.queue.total; <span style='font-weight:bold;' id='vl-queue-summary-total-count'/>
- &vandelay.queue.imported; <span style='font-weight:bold;' id='vl-queue-summary-import-count'/>
- </td>
- </tr>
- </table>
-</div>
-
-<br/>
-
-<div jsId='queueItemsImportDialog' dojoType="dijit.Dialog" title="Import Items">
- <div dojoType="dijit.layout.ContentPane">
- <table class='form_table'>
- <tbody>
++<div dojoType="dijit.layout.ContentPane" layoutAlign='client' style='margin-top:10px;'>
++ <fieldset id='vl-queue-filter-fieldset'>
++ <legend>Queue <span style='font-style:italic;' id='vl-queue-summary-name'/></legend>
++ <table width='100%'><tr>
++ <td> <!-- big left td -->
++ <table>
+ <tr>
- <td>&vandelay.auto.import.noncolliding;</td>
- <td colspan='4'>
- <input jsId='vlUploadQueueAutoImport2' dojoType='dijit.form.CheckBox'/>
++ <td valign='top'>
++ <table class='queue-nav-table'>
++ <thead><tr><th colspan='2' class='queue-nav-table-label'>Queue Actions</th></tr></thead>
++ <tbody>
++ <tr><td><a href='javascript:;' onclick='vlHandleQueueItemsAction("import")'>&vandelay.import.selected;</a></td></tr>
++ <tr><td><a href='javascript:;' onclick='vlHandleQueueItemsAction("import_all")'>&vandelay.import.all;</a></td></tr>
++ <tr><td><a href='javascript:;' onclick='vlLoadErrorUIAll();'>View Import Items</a></td></tr>
++ <tr><td><a href='javascript:;' onclick='
++ if(confirm("&vandelay.sure.to.delete.queue;")) {
++ vlDeleteQueue(currentType, currentQueueId,
++ function() { displayGlobalDiv("vl-marc-upload-div"); });}'>&vandelay.delete.queue;</a></td></tr>
++ </tbody>
++ </table>
+ </td>
- </tr>
- <tr>
- <td>&vandelay.auto.import.auto_overlay_exact;</td>
- <td colspan='4'>
- <input jsId='vlUploadQueueAutoOverlayExact2' dojoType='dijit.form.CheckBox'/>
- </td>
- </tr>
- <tr>
- <td>&vandelay.auto.import.auto_overlay_1match;</td>
- <td colspan='4'>
- <input jsId='vlUploadQueueAutoOverlay1Match2' dojoType='dijit.form.CheckBox'/>
- </td>
- </tr>
- <tr>
- <td>&vandelay.auto.import.merge_profile;</td>
- <td colspan='4'>
- <div jsId='vlUploadMergeProfile2'
- dojoType='dijit.form.FilteringSelect' required='false' labelAttr='name' searchAttr='name'/>
- </td>
- </tr>
- <tr>
- <td>
- <button dojoType='dijit.form.Button' jsId='queueItemsImportCancelButton'>Cancel</button>
++
++ <td valign='top'>
++ <table id='vl-queue-summary-table' class='queue-nav-table'>
++ <thead><tr><th colspan='2' class='queue-nav-table-label'>Queue Summary</th></tr></thead>
++ <tbody>
++ <tr><td>&vandelay.queue.total;</td><td> <span style='font-weight:bold;' id='vl-queue-summary-total-count'/></td></tr>
++ <tr><td>&vandelay.queue.imported;</td><td> <span style='font-weight:bold;' id='vl-queue-summary-import-count'/></td></tr>
++ <tr><td>Record Import Failures</td><td> <span style='font-weight:bold;' id='vl-queue-summary-rec-error-count'/></td></tr>
++ <tr><td>Items in Queue</td><td> <span style='font-weight:bold;' id='vl-queue-summary-import-item-count'/></td></tr>
++ <tr><td>Items Imported</td><td> <span style='font-weight:bold;' id='vl-queue-summary-import-item-imported-count'/></td></tr>
++ <tr><td>Item Import Failures</td><td> <span style='font-weight:bold;' id='vl-queue-summary-item-error-count'/></td></tr>
++ </tbody>
++ </table>
+ </td>
- <td>
- <button dojoType='dijit.form.Button' jsId='queueItemsImportGoButton'>Import</button>
++
++ <td valign='top'> <!-- filters -->
++ <table id='vl-queue-filter-table' class='queue-nav-table'>
++ <thead><tr><th colspan='2' class='queue-nav-table-label'>Queue Filters</th></tr></thead>
++ <tbody>
++ <tr>
++ <td>&vandelay.limit.to.collision.matches;</td>
++ <td>
++ <input dojoType='dijit.form.CheckBox'
++ jsId='vlQueueGridShowMatches' onchange='retrieveQueuedRecords();'/>
++ </td>
++ </tr>
++ <tr>
++ <td>&vandelay.limit.to.non.imported;</td>
++ <td>
++ <input dojoType='dijit.form.CheckBox'
++ jsId='vlQueueGridShowNonImport' onchange='retrieveQueuedRecords();'/>
++ </td>
++ </tr>
++ <tr>
++ <td>&vandelay.limit.to.import_error;</td>
++ <td>
++ <input dojoType='dijit.form.CheckBox'
++ jsId='vlQueueGridShowImportErrors' onchange='retrieveQueuedRecords();'/>
++ </td>
++ </tr>
++ </tbody>
++ </table>
+ </td>
+ </tr>
- </tbody>
- </table>
- </div>
-</div>
-
-<!-- queue grid navigation row -->
-<div dojoType="dijit.layout.ContentPane" layoutAlign='client'>
-
- <table width='100%' style='margin-bottom:0px;'>
- <tr>
- <td align='left' valign='bottom'>
- <select id='vl-queue-actions-selector'>
- <option selected='selected' disabled='disabled' value='select-actions'>&vandelay.select_actions;</option>
- <option value='import'>&vandelay.import.selected;</option>
- <option value='import_all'>&vandelay.import.all;</option>
- <option value='delete_queue'>&vandelay.delete.queue;</option>
- </select>
- <script type="text/javascript">
- var sel = dojo.byId('vl-queue-actions-selector');
- sel.onchange = function(evt) {
- switch(openils.Util.selectorValue(evt.target)) {
- case 'import': vlHandleQueueItemsAction('import'); break;;
- case 'import_all': vlHandleQueueItemsAction('import_all'); break;;
- case 'delete_queue':
- if(confirm('&vandelay.sure.to.delete.queue;')) {
- vlDeleteQueue(currentType, currentQueueId,
- function() { displayGlobalDiv('vl-marc-upload-div'); });
- }
- }
- evt.target.selectedIndex = 0;
- }
- </script>
- </td>
- <td align='middle' valign='bottom'>
- <style type="text/css">.filter_span { padding-right: 5px; border-right: 2px solid #e8e1cf; } </style>
- <table><tr>
- <td>
- <span>&vandelay.limit.to.collision.matches;</span>
- <span class='filter_span'>
- <input dojoType='dijit.form.CheckBox' jsId='vlQueueGridShowMatches' onchange='retrieveQueuedRecords();'/>
- </span>
-
- <span>&vandelay.limit.to.non.imported;</span>
- <span class='filter_span'>
- <input dojoType='dijit.form.CheckBox' jsId='vlQueueGridShowNonImport'
- checked='checked' onchange='retrieveQueuedRecords();'/>
- </span>
++ </table>
++ </td>
+
- <span>&vandelay.results.per.page;</span>
- <span class='filter_span'>
++ <td align='right' valign='bottom'> <!-- big right td -->
++ <table id='vl-queue-paging-table' class='queue-nav-table'>
++ <tbody>
++ <tr><td valign='bottom' align='right'>
++ <select id='vl-queue-export-options' style='margin-right: 10px;'>
++ <!-- TODO I18N -->
++ <option value=''>Export Queue As...</option>
++ <option value='print'>Print</option>
++ <option value='csv'>CSV</option>
++ <option value='email'>Email</option>
++ </select>
++ <span style='padding-right:5px;'>&vandelay.results.per.page;</span>
++ <span class='queue-pager-span'>
+ <select jsId='vlQueueDisplayLimit' id='vl-queue-display-limit-selector'
+ value='10' onchange='retrieveQueuedRecords();'>
+ <option value='10'>10</option>
+ <option value='20'>20</option>
+ <option value='50'>50</option>
+ <option value='100'>100</option>
+ </select>
+ </span>
+
- <span style='padding-left:5px;'>&vandelay.page;</span>
- <input style='width:36px;' dojoType='dijit.form.TextBox' jsId='vlQueueDisplayPage' value='1'/>
- </td>
- </tr></table>
- </td>
- <td align='right' valign='bottom'>
- <span style='padding-right:4px;'>
- <a href='javascript:void(0);' onclick='vlQueueGridPrevPage();'>&vandelay.prev.page;</a>
- </span>
- <span style='padding-right:10px;'>
- <a href='javascript:void(0);' onclick='vlQueueGridNextPage();'>&vandelay.next.page;</a>
- </span>
- </td>
- </tr>
- </table>
-</div>
++ <span class='queue-pager-span'>
++ <span style='padding-left:5px;'>&vandelay.page;</span>
++ <input style='width:36px;' dojoType='dijit.form.TextBox' jsId='vlQueueDisplayPage' value='1'/>
++ </span>
+
++ <span style='padding-right:8px;'>
++ <a href='javascript:void(0);' onclick='vlQueueGridPrevPage();'>&vandelay.prev.page;</a>
++ </span>
++ <span style='padding-right:10px;'>
++ <a href='javascript:void(0);' onclick='vlQueueGridNextPage();'>&vandelay.next.page;</a>
++ </span>
++ </td></tr>
++ </tbody>
++ </table>
++ </td>
++ </tr></table>
++ </fieldset>
++</div>
+
+ <!-- Bib Queue Grid -->
+ <div class='' id='vl-bib-queue-grid-wrapper' dojoType='dijit.layout.ContentPane'>
+ <table dojoType='dojox.grid.DataGrid' jsId='vlBibQueueGrid' query="{id:'*'}" autoHeight='true'>
+ <thead>
+ <tr>
+ <th
+ field='+row_selector'
+ get='vlQueueGridDrawSelectBox'
+ formatter='vlQueueGridFormatSelectBox'
++ width='16'
+ styles='text-align: center;'
+ nonSelectable='true'>
+ <input id="vl-queue-grid-row-selector" type="checkbox" onclick="vlToggleQueueGridSelect();"></input>
+ </th>
+ <th
+ field='+view_marc'
+ get='vlGetViewMARC'
+ formatter='vlFormatViewMARC'
+ styles='text-align: center;'
+ nonSelectable='true'>&vandelay.view.marc;</th>
+ <th
+ field='+get_matches'
+ get='vlGetViewMatches'
+ formatter='vlFormatViewMatches'
+ styles='text-align: center;'
+ nonSelectable='true'>&vandelay.matches;</th>
+ <th
++ field='+get_errors'
++ get='vlGetViewErrors'
++ formatter='vlFormatViewErrors'
++ styles='text-align: center;'
++ nonSelectable='true'>Import Failures</th>
++ <th
+ field='import_time'
+ styles='text-align: center;'
+ get='vlGetDateTimeField'>&vandelay.import.time;</th>
+ </tr>
+ </thead>
+ </table>
+ <div/>
+ </div>
+
+ <!-- Auth Queue Grid -->
+ <div class='' id='vl-auth-queue-grid-wrapper' dojoType='dijit.layout.ContentPane'>
+ <table dojoType='dojox.grid.DataGrid' jsId='vlAuthQueueGrid' query="{id:'*'}" autoHeight='true'>
+ <thead>
+ <tr>
+ <th
+ field='+row_selector'
+ get='vlQueueGridDrawSelectBox'
+ formatter='vlQueueGridFormatSelectBox'
+ styles='text-align: center;'
+ nonSelectable='true'>
+ <input id="vl-queue-grid-row-selector" type="checkbox" onclick="vlToggleQueueGridSelect();"></input>
+ </th>
+ <th
+ field='+view_marc'
+ get='vlGetViewMARC'
+ formatter='vlFormatViewMARC'
+ styles='text-align: center;'
+ nonSelectable='true'>&vandelay.view.marc;</th>
+ <th
+ field='+get_matches'
+ get='vlGetViewMatches'
+ formatter='vlFormatViewMatches'
+ styles='text-align: center;'
+ nonSelectable='true'>&vandelay.matches;</th>
+ <th
++ field='+get_errors'
++ get='vlGetViewErrors'
++ formatter='vlFormatViewErrors'
++ styles='text-align: center;'
++ nonSelectable='true'>Import Failures</th>
++ <th
+ field='import_time'
+ styles='text-align: center;'
+ get='vlGetDateTimeField'>&vandelay.import.time;</th>
+ </tr>
+ </thead>
+ </table>
+ <div/>
+ </div>
+
++<div jsId='queueItemsImportDialog' dojoType="dijit.Dialog" title="Import Items">
++ <div dojoType="dijit.layout.ContentPane">
++ <table class='form_table'>
++ <tbody>
++ <tr>
++ <td>&vandelay.auto.import.merge_profile;</td>
++ <td colspan='4'>
++ <div jsId='vlUploadMergeProfile2'
++ dojoType='dijit.form.FilteringSelect' required='false' labelAttr='name' searchAttr='name'/>
++ </td>
++ </tr>
++ <tr>
++ <td>&vandelay.auto.import.noncolliding;</td>
++ <td colspan='4'>
++ <input jsId='vlUploadQueueImportNoMatch2' dojoType='dijit.form.CheckBox'/>
++ </td>
++ </tr>
++ <tr>
++ <td>&vandelay.auto.import.auto_overlay_exact;</td>
++ <td colspan='4'>
++ <input jsId='vlUploadQueueAutoOverlayExact2' dojoType='dijit.form.CheckBox'/>
++ </td>
++ </tr>
++ <tr>
++ <td>&vandelay.auto.import.auto_overlay_1match;</td>
++ <td colspan='4'>
++ <input jsId='vlUploadQueueAutoOverlay1Match2' dojoType='dijit.form.CheckBox'/>
++ </td>
++ </tr>
++ <tr>
++ <td>&vandelay.auto.import.auto_overlay_best;</td>
++ <td colspan='4'><input jsId='vlUploadQueueAutoOverlayBestMatch2' dojoType='dijit.form.CheckBox'/></td>
++ </tr>
++ <tr>
++ <td>&vandelay.auto.import.auto_overlay_best_ratio;</td>
++ <td colspan='4'>
++ <input style='width:3em' value='0.0' jsId='vlUploadQueueAutoOverlayBestMatchRatio2' dojoType='dijit.form.TextBox'/>
++ <span style='padding-left: 10px; font-size:90%'>(&vandelay.auto.import.auto_overlay_best_ratio.desc;)</span>
++ </td>
++ </tr>
++ <tr>
++ <td>
++ <button dojoType='dijit.form.Button' jsId='queueItemsImportCancelButton'>Cancel</button>
++ </td>
++ <td>
++ <button dojoType='dijit.form.Button' jsId='queueItemsImportGoButton'>Import</button>
++ </td>
++ </tr>
++ </tbody>
++ </table>
++ </div>
++</div>
++
++
+
--- /dev/null
+ <div dojoType="dijit.Toolbar" id='toolbar'>
+ <div dojoType="dijit.form.Button" iconClass="dijitEditorIcon dijitEditorIconCopy" id='vl-menu-marc-export'
+ onclick="displayGlobalDiv('vl-marc-export-div');" showLabel="true">&vandelay.export.records;</div>
+ <div dojoType="dijit.form.Button" iconClass="dijitEditorIcon dijitEditorIconCopy" id='vl-menu-marc-upload'
+ onclick="displayGlobalDiv('vl-marc-upload-div');" showLabel="true">&vandelay.import.records;</div>
+ <div dojoType="dijit.form.Button" iconClass="dijitEditorIcon dijitEditorIconCopy" id='vl-menu-queue-select'
+ onclick="vlShowQueueSelect();" showLabel="true">&vandelay.inspect.queue;</div>
+ <div dojoType="dijit.form.Button" iconClass="dijitEditorIcon dijitEditorIconCopy" id='vl-menu-attr-editor'
+ onclick="vlShowAttrEditor();" showLabel="true">&vandelay.edit.attributes;</div>
+ <div dojoType="dijit.form.Button" iconClass="dijitEditorIcon dijitEditorIconCopy" id='vl-menu-profile-editor'
+ onclick="vlShowProfileEditor();" showLabel="true">&vandelay.edit.profiles;</div>
++ <div dojoType="dijit.form.Button" iconClass="dijitEditorIcon dijitEditorIconCopy" id='vl-menu-match-set-editor'
++ onclick="vlShowMatchSetEditor();" showLabel="true">&vandelay.edit.match_set;</div>
+ <div dojoType="dijit.form.Button" iconClass="dijitEditorIcon dijitEditorIconCopy" id='vl-menu-import-item-attr-editor'
+ onclick="vlShowImportItemAttrEditor();" showLabel="true">&vandelay.edit.import_item_attrs;</div>
+ </div>
--- /dev/null
- <td>&vandelay.auto.import.noncolliding;</td>
- <td colspan='4'>
- <input jsId='vlUploadQueueAutoImport' dojoType='dijit.form.CheckBox'/>
+ <h1>&vandelay.marc.file.upload;</h1><br/>
+ <form id="vl-marc-upload-form" enctype="multipart/form-data">
+ <input type='hidden' name='ses' id='vl-ses-input'/>
+ <table class='form_table'>
+ <tr>
+ <td>&vandelay.record.type;</td>
+ <td colspan='4'>
+ <select id='vl-record-type' dojoType='dijit.form.FilteringSelect'
+ jsId='vlUploadRecordType' onchange='vlShowUploadForm();'>
+ <option value='bib' selected='selected'>&vandelay.bib.records;</option>
+ <option value='auth'>&vandelay.auth.records;</option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td>&vandelay.create.upload.queue;</td>
+ <td>
+ <input type='text' dojoType='dijit.form.TextBox' id='vl-queue-name' size='32'></input>
+ </td>
+ <td>&vandelay.add.existing.queue;</td>
+ <td>
+ <select jsId='vlUploadQueueSelector' dojoType='dijit.form.FilteringSelect' required='false'>
+ </select>
+ </td>
+ </tr>
+ <tr>
- <td>&vandelay.auto.import.auto_overlay_exact;</td>
- <td colspan='4'>
- <input jsId='vlUploadQueueAutoOverlayExact' dojoType='dijit.form.CheckBox'/>
++ <td>Record Match Set</td>
++ <td>
++ <input jsId='vlUploadQueueMatchSet'
++ dojoType='dijit.form.FilteringSelect' labelAttr='name' searchAttr='name'/>
+ </td>
+ </tr>
+ <tr>
- <td>&vandelay.auto.import.auto_overlay_1match;</td>
- <td colspan='4'>
- <input jsId='vlUploadQueueAutoOverlay1Match' dojoType='dijit.form.CheckBox'/>
++ <td>Holdings Import Profile</td>
++ <td>
++ <input jsId='vlUploadQueueHoldingsImportProfile'
++ dojoType='dijit.form.FilteringSelect' labelAttr='name' searchAttr='name'/>
+ </td>
+ </tr>
+ <tr>
- <td>Holdings Import Profile</td>
- <td>
- <input jsId='vlUploadQueueHoldingsImportProfile'
- dojoType='dijit.form.FilteringSelect' labelAttr='name' searchAttr='name'/>
++ <td>&vandelay.import.bib_sources;</td>
++ <td>
++ <select name='bib_source' jsId='vlUploadSourceSelector'
++ dojoType='dijit.form.FilteringSelect' labelAttr='source' searchAttr='source'/>
+ </td>
+ </tr>
++ <tr><td colspan='2' style='margin-top:10px;border-bottom:1px solid #888;border-top:2px solid #888'>
++ <b>&vandelay.import.actions;</b>
++ </td></tr>
+ <tr>
+ <td>&vandelay.auto.import.merge_profile;</td>
+ <td colspan='4'>
+ <div jsId='vlUploadMergeProfile' dojoType='dijit.form.FilteringSelect' required='false' labelAttr='name' searchAttr='name'/>
+ </td>
+ </tr>
+ <tr>
- <td>&vandelay.import.bib_sources;</td>
- <td>
- <select name='bib_source' jsId='vlUploadSourceSelector'
- dojoType='dijit.form.FilteringSelect' labelAttr='source' searchAttr='source'/>
++ <td>&vandelay.auto.import.noncolliding;</td>
++ <td colspan='4'>
++ <input jsId='vlUploadQueueImportNoMatch' dojoType='dijit.form.CheckBox'/>
+ </td>
+ </tr>
+ <tr>
- <td>
- <span id="vl-file-label">&vandelay.file.to.upload;</span>
++ <td>&vandelay.auto.import.auto_overlay_exact;</td>
++ <td colspan='4'>
++ <input jsId='vlUploadQueueAutoOverlayExact' dojoType='dijit.form.CheckBox'/>
+ </td>
+ </tr>
+ <tr>
- <td id='vl-input-td' colspan='4'>
- <input size='48' type="file" name="marc_upload"/>
++ <td>&vandelay.auto.import.auto_overlay_1match;</td>
++ <td colspan='4'>
++ <input jsId='vlUploadQueueAutoOverlay1Match' dojoType='dijit.form.CheckBox'/>
+ </td>
- <td align='center' colspan='4'>
- <button dojoType="dijit.form.Button" onclick="batchUpload()">&vandelay.upload;</button>
++ </tr>
++ <tr>
++ <td>&vandelay.auto.import.auto_overlay_best;</td>
++ <td colspan='4'><input jsId='vlUploadQueueAutoOverlayBestMatch' dojoType='dijit.form.CheckBox'/></td>
++ </tr>
++ <tr>
++ <td>&vandelay.auto.import.auto_overlay_best_ratio;</td>
++ <td colspan='4'>
++ <input style='width:3em' value='0.0' jsId='vlUploadQueueAutoOverlayBestMatchRatio' dojoType='dijit.form.TextBox'/>
++ <span style='padding-left: 10px; font-size:90%'>(&vandelay.auto.import.auto_overlay_best_ratio.desc;)</span>
+ </td>
+ </tr>
++ <tr><td colspan='2' style='border-bottom:2px solid #888;'></td></tr>
++ <tr><td colspan='2' style='padding-bottom: 10px;'></td></tr>
+ <tr>
++ <td colspan='5'>
++ <span id="vl-file-label">&vandelay.file.to.upload;</span>
++ <input size='48' style='border:1px solid #888;' type="file" name="marc_upload"/>
++ <span style='margin-left:10px;'><button dojoType="dijit.form.Button" onclick="batchUpload()">&vandelay.upload;</button></span>
+ </td>
+ </tr>
+ </table>
+ </form>
+
--- /dev/null
+ [% WRAPPER 'default/base.tt2' %]
+ [% ctx.page_title = 'MARC Import/Export' %]
+ [% ctx.dtd = '<!DOCTYPE html SYSTEM "'_ ctx.web_dir _'/opac/locale/' _ ctx.locale _ '/vandelay.dtd">' %]
+
+ <script type="text/javascript" src='[% ctx.media_prefix %]/js/ui/default/vandelay/vandelay.js'> </script>
+ <link rel='stylesheet' type='text/css' href='[% ctx.media_prefix %]/css/skin/[% ctx.skin %]/vandelay.css'/>
+ <link rel='stylesheet' type='text/css' href='[% ctx.media_prefix %]/css/theme/[% ctx.skin %]/vandelay.css'/>
+
+ <div dojoType="dijit.layout.ContentPane" layoutAlign='top' id="vl-nav-bar" style="visibility: hidden;">
+ [% INCLUDE 'default/vandelay/inc/toolbar.tt2' %]
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign='client'>
+ [% INCLUDE 'default/vandelay/inc/progress.tt2' %]
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign='client' id='vl-marc-export-div' class='hidden content'>
+ [% INCLUDE 'default/vandelay/inc/export.tt2' %]
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign='client' id='vl-marc-upload-div' class='hidden content'>
+ [% INCLUDE 'default/vandelay/inc/upload.tt2' %]
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign='client' id='vl-queue-div' class='hidden content'>
+ [% INCLUDE 'default/vandelay/inc/queue.tt2' %]
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign='client' id='vl-match-div' class='hidden content'>
+ [% INCLUDE 'default/vandelay/inc/matches.tt2' %]
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign='client' id='vl-marc-html-div' class='hidden content'>
+ [% INCLUDE 'default/vandelay/inc/marchtml.tt2' %]
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign='client' id='vl-queue-select-div' class='hidden content'>
+ [% INCLUDE 'default/vandelay/inc/queueselect.tt2' %]
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="client" id="vl-attr-editor-div"
+ class='hidden attr-editor-detail-content-pane content' title='&vandelay.edit.attrs;'>
+ [% INCLUDE 'default/vandelay/inc/attrs.tt2' %]
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign='client' id='vl-profile-editor-div' class='hidden content'>
+ [% INCLUDE 'default/vandelay/inc/profiles.tt2' %]
+ </div>
++<div dojoType="dijit.layout.ContentPane" layoutAlign='client' id='vl-match-set-editor-div' class='hidden content'>
++</div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign='client' id='vl-item-attr-editor-div' class='hidden content'>
+ [% INCLUDE 'default/vandelay/inc/item_attrs.tt2' %]
+ </div>
++<div dojoType="dijit.layout.ContentPane" layoutAlign='client' id='vl-import-error-div' class='hidden content'>
++ [% INCLUDE 'default/vandelay/inc/import_errors.tt2' %]
++</div>
+
+
+ [% END %]
--- /dev/null
- <a href="javascript:;">Purchase Request</a><br />
+ <p>
+ <strong>Still not finding what you are looking for?</strong><br />
+ Request that KCLS purchase the material you are looking for by making a
++ <a href="http://www.kcls.org/usingthelibrary/request/">Purchase Request</a><br />
+ <strong>Note:</strong> You must be logged in to make a Purchase Request<br />
+ </p>