--- /dev/null
- # 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.
+[%- USE money = format(l('$%.2f'));
+ USE date;
+ USE CGI = CGI_utf8;
+ 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]';
+
- query_string = CGI.query_string |
- replace(';x=\d+','') | replace(';y=\d+','') | replace(';page=\d*', '') |
- replace(';', '&') | replace('&', '&');
++ is_advanced = CGI.param("_adv").size;
++ is_special = CGI.param("_special").size;
+
- propagator = '?' _ query_string;
++ # -----------------------------------------------------------------------------
++ # mkurl( destination_page, params_to_set, params_to_clear )
++ #
++ # Current page, updated params:
++ # mkurl('', {foo => 'bar', boo => 'baz'});
++ #
++ # New page, one param is a list:
++ # mkurl('http://flarg.baz/squz', {foo => 'bar', boo => ['baz', 'faz']});
++ #
++ # New page, clear all existing params before applying new ones:
++ # mkurl('/fuz/buster', {foo => 'bar', boo => 'baz'}, 1);
++ #
++ # Current page, clear 'some_param' from the existing params:
++ # mkurl('', {foo => 'bar', boo => 'baz'}, ['some_param']);
++ MACRO mkurl(page, params, clear_params) BLOCK;
+
- is_advanced = CGI.param("_adv").size;
- is_special = CGI.param("_special").size;
++ # clone the query string to avoid clobberation
++ cgi = CGI.new(CGI.query_string);
+
++ # remove requested params
++ IF clear_params.0; # array
++ FOR p IN clear_params; cgi.delete(p); END;
++ ELSIF clear_params;
++ cgi.delete_all();
++ END;
++
++ # x and y are artifacts of using <input type="image" /> tags
++ # instead of true submit buttons, and their values are never used.
++ cgi.delete('x', 'y');
++
++ # apply user params
++ FOR k IN params.keys;
++ encoded = [];
++ list = params.$k.0 ? params.$k : [params.$k];
++ # CGI croaks on already-decoded strings. force-encode to be safe.
++ FOR p IN list; encoded.push(ctx.encode_utf8(p)); END;
++ foo = cgi.param("-name", k, "-values", encoded);
++ END;
++
++ # for url brevity, remove any params that have no value
++ FOR p IN cgi.param;
++ val = cgi.param(p);
++ IF val == ''; cgi.delete(p); END;
++ END;
++
++ IF page;
++ IF cgi.query_string;
++ page _ '?' _ cgi.query_string;
++ ELSE;
++ page;
++ END;
++ ELSE;
++ # staying on the current page
++ cgi.url("-path" => 1, "-query" => 1);
++ END;
++ END;
+%]
--- /dev/null
- args.isbn = xml.findnodes('//*[@tag="020"]/*[@code="a"]').shift.textContent;
+[%
+ # Extract MARC fields from XML
+ # get_marc_attrs( { marc_xml => doc } )
+ BLOCK get_marc_attrs;
+ xml = args.marc_xml;
- args.isbn_clean = args.isbn.replace('\ .*', '');
++ args.isbns = [];
++ FOR isbn IN xml.findnodes('//*[@tag="020"]/*[@code="a"]');
++ args.isbns.push(isbn.textContent);
++ END;
+ 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.0.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
- [%- IF ctx.page == "record";
- prev_next_root = "/record/" _ ctx.bre_id _ extras_propagator;
- ELSE;
- cn = CGI.param('cn') | uri;
- prev_next_root = "/cnbrowse?cn=" _ cn;
- END -%]
++[% cnoffset = CGI.param('cnoffset') || 0; %]
++
+<div id='cn_browse' class='cn_browser'>
+ <div id='cn_browse_div'>
+ <div class='color_4'>
+ <span>[% l("You are now browsing") %]</span>
+ <strong>[% ctx.browsing_ou.name %]</strong>
+ </div>
+ <table class='data_grid bookshelf' width='100%'>
+ <thead>
+ <tr>
+ <td>
- <a id='cn_browse_prev' class='classic_link' href="[% ctx.opac_root _ prev_next_root _ '&cnoffset=' _ ((CGI.param('cnoffset') || 0) - 1) _ '&expand=cnbrowse#cnbrowse' %]"<b>[%
- l("<< Previous Page")
- %]</b></a>
++ <a id='cn_browse_prev' class='classic_link'
++ href="[% mkurl('', {cnoffset => cnoffset - 1}) %]#cnbrowse"><b>[% l("<< Previous Page") %]</b></a>
+ </td>
+ <td colspan='1' align='center'>[% l("Shelf Browser") %]</td>
+ <td>
- <a id='cn_browse_next' class='classic_link' href="[% ctx.opac_root _ prev_next_root _ '&cnoffset=' _ ((CGI.param('cnoffset') || 0) + 1) _ '&expand=cnbrowse#cnbrowse' %]"<b>[%
- l("Next Page >>")
- %]</b></a>
++ <a id='cn_browse_next' class='classic_link'
++ href="[% mkurl('', {cnoffset => cnoffset + 1}) %]#cnbrowse"><b>[% l("Next Page >>") %]</b></a>
+ </td>
+ </tr>
+ </thead>
+ <tbody id='cn_tbody'>
+ [% tr_open = 0; FOR cn IN ctx.browsed_call_numbers %]
+ [%- IF loop.index % 3 == 0; tr_open = 1 %]
+ <tr class='cn_browse_row'>
+ [% END -%]
+ <td class='cn_browse_item' width='25%' valign='top'>
+ [% rec_attrs = {marc_xml => cn.record.marc};
+ PROCESS get_marc_attrs args=rec_attrs;
+ ident = rec_attrs.isbn_clean || rec_attrs.upc;
+ IF ident %]
- <a href="[% ctx.opac_root %]/record/[% cn.record.id _ extras_propagator %]"><img height='60' width='50'
++ <a href="[% mkurl(ctx.opac_root _ '/record/' _ cn.record.id, {}, 1) %]"><img height='60' width='50'
+ class='cn_browse_info' name='cn_browse_pic' border='0'
+ src="[% ctx.media_prefix %]/opac/extras/ac/jacket/small/[% ident %]" /></a>
+ [% END %]
+ <div class='cn_browse_info bold' name='cn_browse_cn'>[% cn.label %]</div>
+ <div class='cn_browse_info'>
- <a name='cn_browse_title' class='classic_link' href="[% ctx.opac_root %]/record/[% cn.record.id _ extras_propagator %]">[% rec_attrs.title %]</a>
++ <a name='cn_browse_title' class='classic_link'
++ href="[% mkurl(ctx.opac_root _ '/record/' _ cn.record.id, {}, 1) %]">[% rec_attrs.title %]</a>
+ </div>
+ [% IF rec_attrs.author %]<div class='cn_browse_info'>
+ <a name='cn_browse_author' class='classic_link'
- href="[% ctx.opac_root %]/results?qtype=author&query=[%- rec_attrs.author | replace('[,\.:;]', '') | uri %]&loc=[% CGI.param('loc') | uri %]">[% rec_attrs.author %]</a>
++ href="[%-
++ authorquery = rec_attrs.author | replace('[,\.:;]', '');
++ mkurl(ctx.opac_root _ '/results', {qtype => 'author', query => authorquery}, 1)
++ -%]">[% rec_attrs.author | html_entity %]</a>
+ </div>[% END %]
+ <div class='cn_browse_info' name='cn_browse_lib'>[% cn.owning_lib.name %]</div>
+ </td>
+ [% IF loop.index % 3 == 2; tr_open = 0 %]
+ </tr>
+ [% END %]
+ [% END; IF tr_open %]</tr>[% END %]
+ </tbody>
+ </table>
+ </div>
+</div>
--- /dev/null
- IF attrs.summary; hide_summary = 0; ELSE;
+<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;
- {name => 'series', label => l('Series'), hide => 1},
++ IF attrs.summary.0; 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 => 'summaryplus', label => l('Summaries & More'), hide => hide_summary},
+ {name => 'content', label => l('Contents'), hide => 1}, # ToC
+ {name => 'authors', label => l('Authors')},
- [% # 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; %]
++ {name => 'series', label => l('Series')},
+ {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},
+ {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">
- IF ctx.$exp_name;
++ [% href = mkurl('', {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 OR ctx.expand_all;
+ 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
+[%
+ subjects = [
+ {
++ label => l('Subject: '),
++ xpath => '//*[@tag="600" or @tag="610" or @tag="611" or @tag="630" or @tag="650" or @tag="651"]'
++ }, {
+ label => l('Genre: '),
+ xpath => '//*[@tag="655"]|//*[@tag="659"]'
+ }, {
+ label => l('Topic Heading: '),
+ xpath => '//*[@tag="690"]'
+ }, {
+ label => l('Geographic Setting: '),
+ xpath => '//*[@tag="691"]'
+ }, {
+ label => l('Biographical Subject: '),
+ xpath => '//*[@tag="692"]'
+ }, {
+ label => l('Character Attributes: '),
+ xpath => '//*[@tag="693"]'
+ }, {
+ label => l('Setting: '),
+ xpath => '//*[@tag="698"]'
+ }, {
+ label => l('Time Period: '),
+ xpath => '//*[@tag="699"]'
+ }
+ ];
+
+ BLOCK render_subject;
+ loc = CGI.param('loc') | uri;
+ xpath = xpath || '//*[starts-with(@tag,"6")]';
+ FOR node IN ctx.marc_xml.findnodes(xpath);
+ all_terms = [];
+ FOR subfield IN node.childNodes;
+ NEXT UNLESS subfield.nodeName == "subfield";
+ code = subfield.getAttribute('code');
+ NEXT UNLESS code.match('[a-z]');
+ IF code.match('[vxyz]'); " — "; END;
+ # at this point, we actually have a partial term to use.
+ single_term = subfield.textContent | html;
+ all_terms.push(subfield.textContent);
+ total_term = all_terms.join(" ").replace('\s+$', '') | uri;
+ '<a href="' _ ctx.opac_root _ '/results?qtype=subject&query=' _ total_term _ '&loc=' _ loc _ '">' _ single_term _ '</a>';
+ END;
+ IF all_terms.size; "<br/>"; END;
+ END;
+ END
+%]
+
+<div id='rdetail_subject_div'>
+ <table cellpadding="0" cellspacing="0" border="0">
+ [% any_subjects = 0;
+ FOREACH subj IN subjects;
+ content = PROCESS render_subject(xpath=subj.xpath);
+ IF content.match('\S');
+ any_subjects = 1; %]
+ <tr>
+ <td width="1" style="padding:5px 7px 0px 0px;" valign="top">
+ <strong>[% subj.label %]</strong>
+ </td>
+ <td style="padding-top:5px;"><div>[% content %] </div></td>
+ </tr>
+ [% END; %]
+ [% END; %]
+ [% IF any_subjects == 0 %]
+ <tr><td><i>[% l('No Subjects') %]</i></td></tr>
+ [% END; %]
+ </table>
+</div>
--- /dev/null
- <span id='rdetail_title'>[% attrs.title %]</span><br />
+[% 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">
- href="[% ctx.opac_root %]/results?qtype=author&query=[%-
- attrs.author | replace('[,\.:;]', '') | uri %]&loc=[% CGI.param('loc') | uri %]">[% attrs.author %]</a></em>
++ <span id='rdetail_title'>[% attrs.title_extended | html_entity %]</span><br />
+ [% IF attrs.author %]
+ <span class='opac-auto-030'>[% l("Author") %]:</span>
+ <em><a title='[% l("Perform an author search") %]'
+ id='rdetail_author'
- <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="" /><span
- style="position:relative;top:-3px;left:3px;">[% l('Place Hold') %]</span></a>
++ href="[%-
++ authorquery = attrs.author | replace('[,\.:;]', '');
++ mkurl(ctx.opac_root _ '/results', {qtype => 'author', query => authorquery})
++ -%]">[% attrs.author | html_entity %]</a></em>
+ [% END %]
+ </td>
+ <td align="right" valign="top" nowrap="nowrap" style="white-space:nowrap;">
+ <div style="width:280px;text-align:left;margin-top:3px;">
+ <div style="float:right;">
+ <div class="rdetail_aux_utils opac-auto-010">
- [% IF attrs.isbn %]<strong id="rdetail_isbn_lbl">[% l("ISBN") %]</strong>[% END %]
++ <a href="[% mkurl(ctx.opac_root _ '/place_hold', {hold_target => ctx.bre_id, hold_type => 'T'}) %]"
++ 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");
+ %]
+ <a href="[% ctx.opac_root %]/mylist/[% operation %]?record=[% ctx.bre_id %]" class="no-dec">
+ <img src="[% ctx.media_prefix %]/images/clipboard.png" alt="" />
+ [% label %]
+ </a>
+ </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">
- <td valign="top" id='rdetail_isbn'>[% attrs.isbn %]</td>
++ [% IF attrs.isbns.0 %]<strong id="rdetail_isbn_lbl">[% l("ISBN") %]</strong>[% END %]
++ </td>
++ <td valign="top" id='rdetail_isbn'>
++ [% FOR isbn IN attrs.isbns %][% IF !loop.first; %]<br/>[% END; isbn; END %]
+ </td>
- <a href="[% ctx.opac_root %]/place_hold[% propagator; propagator.length > 1 ? "&" : ""; %]hold_target=[% copy_info.id %]&hold_type=C">[% l("copy") %]</a>
+ <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>[% IF attrs.marc_cn; l("Call Number"); END %]</strong>
++ </td>
++ <td valign="top">[% attrs.marc_cn %]</td>
++ <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>
+ <td>[% l("Holdable?") %]</td>
+ [% END %]
+ <td>[% l("Status") %]</td>
+ <td>[% l("Due Date") %]</td>
+ </tr>
+ </thead>
+ <tbody class="copy_details_table">
+ [% 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.call_number %]&hold_type=V">[% l("volume") %]</a>
++ <a href="[% mkurl(ctx.opac_root _ '/place_hold', {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 %]/record/[% ctx.bre_id %]?copy_offset=[% new_offset %]&copy_limit=[% ctx.copy_limit %]">« [%
- l('Previous [_1]', ctx.copy_offset - new_offset)
- %]</a>
++ <a href="[% mkurl(ctx.opac_root _ '/place_hold', {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=[% ctx.copy_offset + ctx.copy_limit %]&copy_limit=[% ctx.copy_limit %]">[%
- l('Next [_1]', ctx.copy_limit)
- %] »</a>
++ <a href="[% mkurl('', {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>
- <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>
-
++ <a href="[% mkurl('', {copy_offset => ctx.copy_offset + ctx.copy_limit, copy_limit => ctx.copy_limit}) %]">[%
++ l('Next [_1]', ctx.copy_limit) %] »</a>
+ </td>
+ [% END %]
+ </tr>
++ <tr>
++ <td>
++ [% more_copies_limit = 50 %] [%# TODO: config %]
++ [% IF ctx.copy_limit != more_copies_limit AND ctx.copies.size >= ctx.copy_limit %]
++ <div style='margin-top:10px;'>
++ <img src="[% ctx.media_prefix %]/images/plus_sign.png" />
++ <a href="[% mkurl('', {copy_limit => more_copies_limit, copy_offset => 0}) %]">[% l('Show more copies') %]</a>
++ </div>
++ [% ELSIF ctx.copy_limit == more_copies_limit %]
++ <div style='margin-top:10px;'>
++ <img src="[% ctx.media_prefix %]/images/minus_sign.png" />
++ <a href="[% mkurl('', {copy_limit => 0, copy_offset => 0}) %]">[% l('Show fewer copies') %]</a>
++ </div>
++ [% END %]
++ </td>
++ </tr>
++ <tr>
++ <td>
++ [% IF CGI.param('expand') == 'all' %]
++ <img src="[% ctx.media_prefix %]/images/minus_sign.png" />
++ <a href="[% mkurl('', {}, ['expand']) %]">[% l('Collapse all tabs') %]</a>
++ [% ELSE %]
++ <img src="[% ctx.media_prefix %]/images/plus_sign.png" />
++ <a href="[% mkurl('', {expand => 'all'}) %]">[% l('Expand all tabs') %]</a>
++ [% END %]
++ </td>
++ </tr>
++
+ </tbody>
+</table>
+
-
- <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 ***************************** -->
+<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>
--- /dev/null
- <strong>[% l('Summary: ') %]</strong>[% attrs.summary %]
+<div class='rdetail_extras_div'>
+ [% IF attrs.summary %]
+ <div class='rdetail-extras-summary'>
++ <strong>[% l('Summary: ') %]</strong>
++ [% FOR sum IN attrs.summary %]
++ [% IF !loop.first; '<br/>'; END %]
++ <span>[% sum %] </span>
++ [% END %]
+ </div>
+ [% END %]
+
+ <!-- Embedded content cafe iframe -->
+ [% ident = attrs.isbn_clean || attrs.upc %]
+ <iframe width="100%" height="400" frameborder="0"
+ src="http[% CGI.https ? 's' : '' %]://contentcafe2.btol.com/ContentCafeClient/ContentCafe.aspx?UserID=[%-
+ ENV.OILS_CONTENT_CAFE_USER %]&Password=[% ENV.OILS_CONTENT_CAFE_PASS %]&ItemKey=[% ident %]&Options=Y" >
+ </iframe>
+</div>
+
--- /dev/null
- href = propagator _ '&page=' _ (page - 1);
+[% PROCESS "default/opac/parts/misc_util.tt2";
+
+ USE ResolverResolver;
+
+ ctx.result_start = 1 + ctx.page_size * page;
+ ctx.result_stop = ctx.page_size * (page + 1);
+ IF ctx.result_stop > ctx.hit_count; ctx.result_stop = ctx.hit_count; END;
+
+ result_count = ctx.result_start;
+%]
+
+<div style="height: 10px;"></div>
+[% BLOCK results_count_header %]
+<div class="results_header_nav1">
+ <table cellpadding="0" cellspacing="0" border="0" width="100%">
+ <tr>
+ <td class="h1" width="116">[% l('Search Results') %]</td>
+ <td valign="bottom" nowrap="nowrap" class="result_number">
+ [% |l(ctx.result_start, ctx.result_stop, ctx.hit_count) %]
+ Results <strong>[_1]</strong> - <strong>[_2]</strong> of <strong>[_3]</strong>
+ [% END %]
+ <span style='padding-left: 6px;'>
+ [% |l(page + 1, page_count) %](page <strong>[_1]</strong> of <strong>[_2]</strong>)[% END %]
+ </span>
+ </td>
+ <td align="right" valign="bottom">
+ <span class='start_end_links_span'>
+ [% class = 'search_page_nav_link';
+ href = '#';
+ IF page > 0;
- href = propagator _ '&page=' _ (page + 1);
++ href = mkurl('', {page => page - 1});
+ ELSE; class = class _ ' invisible'; END;
+ %]
+ <a class='[% class %]' href='[% href %]'
+ title='[% l("Previous page") %]'><span class="nav_arrow_fix">◄</span> [% l('Previous') %] </a>
+ <span class='hide_me'
+ style='padding-left: 11px; padding-right:11px;'>
+ <span></span>
+ </span>
+ [% class = 'search_page_nav_link';
+ href = '#';
+ IF (page + 1) < page_count;
- <a href="[% ctx.opac_root %]/record/[% rec.id _ propagator %]"><img alt="[% l('Image of item') %]"
++ href = mkurl('', {page => page + 1});
+ ELSE; class = class _ ' invisible'; END;
+ %]
+ <a class='[% class %]' href='[% href %]'
+ title='[% l("Next page") %]'> [% l('Next') %] <span class="nav_arrow_fix">►</span></a>
+ </span>
+ </td>
+ </tr>
+ </table>
+</div>
+[% END %]
+[% ctx.results_count_header = PROCESS results_count_header;
+ ctx.results_count_header %]
+<div id="result_table_div">
+ <table cellpadding="0" cellspacing="0" border="0" width="100%">
+ <tr>
+ <td valign="top" width="1" style="padding-right:20px;">
+ <div style="width:174px;" class="hide_me" id="tehSideBar">SIDEBAR TODO
+ </div>
+ </td>
+ <td class='opac-auto-015' width="1"></td>
+ <td valign="top">
+ <table id="res_table" cellpadding="0" cellspacing="0"
+ border="0" width="100%" style="margin-top:10px;">
+ <tbody id="result_table">
+ [% FOR rec IN ctx.records;
+ attrs = {marc_xml => rec.marc_xml};
+ PROCESS get_marc_attrs args=attrs %]
+ <tr>
+ <td class='result_table_row' align='left' width='100%'>
+ <table cellpadding="0" cellspacing="0" class='result_table_subtable'>
+ <tbody class='result_table_subtbody'>
+ <tr name='counts_row'>
+ <td width="58" valign="top"
+ style="font-weight:bold;padding-left:10px;"
+ name="results_row_count">[%
+ result_count; result_count = result_count + 1
+ %].</td>
+ <td class='result_table_pic_header' align='center'
+ width="78" nowrap="nowrap" valign="top">
+ [% ident = attrs.isbn_clean || attrs.upc; IF ident; %]
- href="[% ctx.opac_root %]/record/[% rec.id _ propagator %]"
- class='search_link'>[% attrs.title %]</a>
++ <a href="[% mkurl(ctx.opac_root _ '/record/' _ rec.id) %]"><img alt="[% l('Image of item') %]"
+ name='item_jacket' class='result_table_pic' width="55"
+ src='[% ctx.media_prefix %]/opac/extras/ac/jacket/small/[% ident %]' /></a><br />
+ [% END %]
+ </td>
+ <td class='result_table_title_cell'
+ name='result_table_title_cell'
+ valign="top">
+ <div class="bold">
+ <a title="[% attrs.title %]" name='item_title'
- href="[% ctx.opac_root %]/results?qtype=author&query=[%
- attrs.author | replace('[,\.:;]', '') | uri %]&loc=[% CGI.param('loc') | uri %]"
- class='search_link'>[% attrs.author %]</a></em>
++ href="[% mkurl(ctx.opac_root _ '/record/' _ rec.id) %]"
++ class='search_link'>[% attrs.title | html_entity%]</a>
+ </div>
+ <div style="font-size:11px;">
+ <div>
+ <em><a title="[% l("Perform an Author Search") %]"
+ name='item_author'
- [% IF attrs.isbn %]
++ href="[%-
++ authorquery = attrs.author | replace('[,\.:;]', '');
++ mkurl(ctx.opac_root _ '/results', {qtype => 'author', query => authorquery})
++ -%]">[% attrs.author | html_entity %]</a></em>
+
+ [% attrs.pubdate %]
+ </div>
+ <table cellpadding="0" cellspacing="0" border="0"
+ class="results_info_table">
+ [% IF attrs.publisher %]
+ <tr name="results_pub_tr">
+ <td valign="top">
+ <strong>[% l('Publisher:') %]</strong>
+ </td>
+ <td>[% attrs.publisher; %]</td>
+ </tr>
+ [% END %]
- <td>[% attrs.isbn %]</td>
++ [% IF attrs.isbn.0 %]
+ <tr name="results_isbn_tr">
+ <td valign="top">
+ <strong>[% l('ISBN:') %]</strong>
+ </td>
- href="[% ctx.opac_root %]/place_hold[% propagator; propagator.length > 1 ? "&" : ""; %]hold_target=[% rec.id %]&hold_type=T"
++ <td>[% attrs.isbns.0 %]</td>
+ </tr>
+ [% END %]
+ [% 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 %]
+
+ [% IF attrs.edition %]
+ <tr name="results_edition_tr">
+ <td valign="top">
+ <strong>[% l('Edition:') %]</strong>
+ </td>
+ <td>[% attrs.edition %]</td>
+ </tr>
+ [% END %]
+ [% IF attrs.phys_desc %]
+ <tr name="results_phys_desc_tr">
+ <td nowrap="nowrap" valign="top">
+ <strong>[% l('Phys. Desc.:') %]</strong>
+ </td>
+ <td>
+ [% args.phys_desc %]
+ </td>
+ </tr>
+ [% END %]
+ [% FOR uri IN args.uris %]
+ <tr name='bib_uri_list' class='result_table_title_cell'>
+ <td valign='top'>
+ <strong>[% l('Electronic resource') %]</strong>
+ </td>
+ <td><a href="[% uri.href %]">[% uri.link %]</a>[% ' - ' _ uri.note IF uri.note %]</td>
+ </tr>
+ [% END %]
+ [% IF args.holdings.size > 0 %]
+ <tr name='bib_cn_list' class='result_table_title_cell'>
+ <td colspan='2'>
+ <table class='result_holdings_table'>
+ <thead><tr>
+ <th>[% l('Library') %]</th>
+ <th>[% l('Shelving location') %]</th>
+ <th>[% l('Call number') %]</th>
+ <th>[% l('Status') %]</th>
+ </tr></thead>
+ <tbody>
+ [% FOR copy IN args.holdings %]
+ <tr>
+ <td>[% copy.library %]</td>
+ <td>[% copy.location %]</td>
+ <td>[% copy.label %]</td>
+ <td>[% copy.status %]</td>
+ </tr>
+ [% END %]
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ [% END %]
+ </table>
+ <div>
+ [% l('[_1] of [quant,_2,copy,copies] available',
+ attrs.copy_counts.available, attrs.copy_counts.count) # XXX s/count/nshadow/ ?
+ #rec.copy_counts.available, rec.copy_counts.visible)
+ %]
+ </div>
+ </div>
+ <div class="hide_me">
+ <span name='result_table_extra_span' class='hide_me'>
+ <span name='result_table_pub_box'
+ style='padding-left: 10px;'>
+ <span name='result_table_edition_span'
+ style='padding-left: 10px;'></span> |
+ <span name='result_table_pub_span'> </span> |
+ <span name='result_table_phys_span'> </span>
+ </span>
+ </span>
+ </div>
+ </td>
+
+ <td name='result_table_format_cell' class='result_table_format_cell' width="1">
+
+ [% IF attrs.format_icon %]
+ <img title="[% attrs.format_label %]" alt="[% attrs.format_label %]" src="[% attrs.format_icon %]" />
+ [% END %]
+
+ <!-- unAPI link -->
+ <abbr class="unapi-id" title='tag:[% ctx.hostname %],[% date.format(date.now, '%Y') %]:biblio-record_entry/[% rec.id %]'></abbr>
+
+ <!-- Empty span used for creating Google Book Search-->
+ <span name="googleBooksLink" class="hide_me">
+ <a style='padding-left: 8px;'
+ class='classic_link hide_me'
+ name="googleBooks-link">[% l("Browse in Google Books Search") %]</a>
+ </span>
+
+ </td>
+ <td nowrap='nowrap' width="1" align="right">
+ <div style="width:250px;text-align:left;">
+ <div style="float:right;">
+ <div class="results_aux_utils opac-auto-010"><a
- <a href="[% ctx.opac_root %]/mylist/[% operation %]?record=[% rec.id %]" class="no-dec">
++ href="[% mkurl(ctx.opac_root _ '/place_hold', {hold_target => rec.id, hold_type => 'T'}) %]"
+ name="place_hold_link" class="no-dec"><img
+ src="[% ctx.media_prefix %]/images/green_check.png"
+ alt=""/><span style="position:relative;top:-3px;left:3px;">[% l('Place Hold') %]</span></a>
+ </div>
+ <div class="results_aux_utils opac-auto-011">
+ [%
+ operation = ctx.mylist.grep(rec.id).size ? "delete" : "add";
+ label = (operation == "add") ? l("Add to my list") : l("Remove from my list");
+ %]
- <!-- <div style="padding-top:7px;" class="results_aux_utils">
- <a title="Reviews and More" target="_blank" class="no-dec"
- name="reviews_and_more" href="javascript:;"><img
- alt="[% l('Reviews and more') %]"
- src="[% ctx.media_prefix %]/images/starz.png" /> <span
- style="position:relative;top:-5px;">[% l('Reviews and More') %]</span></a>
- </div> -->
++ <a href="[% mkurl(ctx.opac_root _ '/mylist/' _ operation, {record => rec.id}, 1) %]" class="no-dec">
+ <img src="[% ctx.media_prefix %]/images/clipboard.png" alt="" />
+ [% label %]
+ </a>
+ </div>
- <!-- ChiliFresh XXX script TODO -->
+ </div>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td/>
+ <td align='center'>
+ <!-- Chilifresh link and reviews panel -->
+ <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>
+ </td>
+ </tr>
+ <tr><td colspan="5"><div style="height:0px;border-top:1px solid #b7b7b7;border-bottom:1px solid #d4d4d4;margin:15px 0px;"></div></td></tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ [% END %]
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ </table>
+</div>
+<div>
+ [% ctx.results_count_header %]
+</div>
--- /dev/null
+
+<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'>
+ <div id='vl-import-error-record' class='hidden'>
+ <h1>Import Errors</h1><br/>
+ <table>
+ <tbody>
+ <tr><td>ID</td><td id='vl-error-id'/></tr>
+ <tr><td>Import Error</td><td id='vl-error-import-error'/></tr>
+ <tr><td>Error Detail</td><td id='vl-error-error-detail'/></tr>
+ <tr><td>Title</td><td id='vl-error-title'/></tr>
+ <tr><td>Author</td><td id='vl-error-author'/></tr>
+ <tr><td>ISBN</td><td id='vl-error-isbn'/></tr>
+ <tr><td>ISSN</td><td id='vl-error-issn'/></tr>
+ <tr><td>UPC</td><td id='vl-error-upc'/></tr>
+ </tbody>
+ </table>
+ </div>
+</div>
+
+<div dojoType="dijit.layout.ContentPane" layoutAlign='client'>
+ <div class='hidden' id='vl-import-error-grid-some'>
+ <table jsId="vlImportErrorGrid"
+ dojoType="openils.widget.AutoGrid"
+ autoHeight='true'
+ fieldOrder="['barcode', 'call_number', 'owning_lib', 'import_error', 'error_detail']"
+ query="{id: '*'}"
+ hidePaginator='true'
+ showColumnPicker='true'
+ columnPickerPrefix='"vandelay.item.import_error"'
+ fmClass='vii'>
+ <thead>
+ <tr>
+ <th field='owning_lib' get='vlGetOrg'/>
+ <th field='circ_lib' get='vlGetOrg'/>
++ <th field='status' get='vlCopyStatus'/>
++ <th field='location' get='vlCopyLocation'/>
+ </tr>
+ </thead>
+ </table>
+ </div>
+</div>
+<div dojoType="dijit.layout.ContentPane" layoutAlign='client'>
+ <div class='hidden' id='vl-import-error-grid-all'>
+ <h1>Import Items</h1><br/>
+ <input dojoType='dijit.form.CheckBox' jsId='vlImportItemsShowErrors' onchange='vlLoadErrorUIAll();'/>
+ <span>Limit to Import Failures</span>
+ <table width='100%'><tr><td width='100%' align='right'>
+ <select id='vl-item-export-options' style='margin-right: 10px;'>
+ <!-- TODO I18N -->
+ <option value=''>Export Items As...</option>
+ <option value='print'>Print</option>
+ <option value='csv'>CSV</option>
+ <option value='email'>Email</option>
+ </select>
+ </td></tr></table>
+ <table jsId="vlAllImportErrorGrid"
+ dojoType="openils.widget.AutoGrid"
+ autoHeight='true'
+ fieldOrder="['barcode', 'call_number', 'owning_lib', 'import_error', 'error_detail']"
+ query="{id: '*'}"
+ showPaginator='true'
+ showColumnPicker='true'
+ columnPickerPrefix='"vandelay.item.import_error"'
+ fmClass='vii'>
+ <thead>
+ <tr>
+ <th field='owning_lib' get='vlGetOrg'/>
+ <th field='circ_lib' get='vlGetOrg'/>
++ <th field='status' get='vlCopyStatus'/>
++ <th field='location' get='vlCopyLocation'/>
+ </tr>
+ </thead>
+ </table>
+ </div>
+</div>
+