Merge esi/template-toolkit-opac and repaired some conflicts
authorBill Erickson <berick@esilibrary.com>
Thu, 11 Aug 2011 21:48:00 +0000 (17:48 -0400)
committerBill Erickson <berick@esilibrary.com>
Thu, 11 Aug 2011 21:48:00 +0000 (17:48 -0400)
Signed-off-by: Bill Erickson <berick@esilibrary.com>
1  2 
Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Record.pm
Open-ILS/src/templates/default/opac/parts/header.tt2
Open-ILS/src/templates/default/opac/parts/misc_util.tt2
Open-ILS/src/templates/default/opac/parts/record/cnbrowse.tt2
Open-ILS/src/templates/default/opac/parts/record/extras.tt2
Open-ILS/src/templates/default/opac/parts/record/subjects.tt2
Open-ILS/src/templates/default/opac/parts/record/summary.tt2
Open-ILS/src/templates/default/opac/parts/record/summaryplus.tt2
Open-ILS/src/templates/default/opac/parts/result/table.tt2
Open-ILS/src/templates/default/vandelay/inc/import_errors.tt2

index f43d115,0000000..66e47ac
mode 100644,000000..100644
--- /dev/null
@@@ -1,23 -1,0 +1,69 @@@
-     # 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('&', '&amp;');
++    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;
 +%]
index 8bbc57c,0000000..457361e
mode 100644,000000..100644
--- /dev/null
@@@ -1,156 -1,0 +1,159 @@@
-         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;
 +%]
index d44c38d,0000000..83621b1
mode 100644,000000..100644
--- /dev/null
@@@ -1,60 -1,0 +1,58 @@@
- [%- 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 _ '&amp;cnoffset=' _ ((CGI.param('cnoffset') || 0) - 1) _ '&amp;expand=cnbrowse#cnbrowse' %]"<b>[%
-                             l("&lt;&lt; Previous Page")
-                         %]</b></a>
++                        <a id='cn_browse_prev' class='classic_link' 
++                            href="[% mkurl('', {cnoffset => cnoffset - 1}) %]#cnbrowse"><b>[% l("&lt;&lt; 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 _ '&amp;cnoffset=' _ ((CGI.param('cnoffset') || 0) + 1) _ '&amp;expand=cnbrowse#cnbrowse' %]"<b>[%
-                             l("Next Page &gt;&gt;")
-                         %]</b></a>
++                        <a id='cn_browse_next' class='classic_link' 
++                            href="[% mkurl('', {cnoffset => cnoffset + 1}) %]#cnbrowse"><b>[% l("Next Page &gt;&gt;") %]</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&amp;query=[%- rec_attrs.author | replace('[,\.:;]', '') | uri %]&amp;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>
index c53ce31,0000000..a800317
mode 100644,000000..100644
--- /dev/null
@@@ -1,75 -1,0 +1,65 @@@
-         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 &amp; 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('(&amp;)?expand=.+($|&|;)', '$2');
-                     extras_propagator = extras_propagator.replace('(&amp;)?cnoffset=.+($|&|;)', '$2');
-                     href = ctx.full_path _ extras_propagator _ '&amp;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>
index 7819187,0000000..3d02231
mode 100644,000000..100644
--- /dev/null
@@@ -1,67 -1,0 +1,70 @@@
 +[% 
 +    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]'); " &mdash; "; 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&amp;query=' _ total_term _ '&amp;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>
index d97f0fd,0000000..53c22d2
mode 100644,000000..100644
--- /dev/null
@@@ -1,288 -1,0 +1,270 @@@
-                             <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&amp;query=[%-
-                                         attrs.author | replace('[,\.:;]', '') | uri %]&amp;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 ? "&amp;" : ""; %]hold_target=[% ctx.bre_id %]&amp;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 ? "&amp;" : ""; %]hold_target=[% copy_info.id %]&amp;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 ? "&amp;" : ""; %]hold_target=[% copy_info.call_number %]&amp;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 %]&amp;copy_limit=[% ctx.copy_limit %]">&laquo; [%
-                     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 %]&amp;copy_limit=[% ctx.copy_limit %]">[%
-                     l('Next [_1]', ctx.copy_limit)
-                 %] &raquo;</a>
++                <a href="[% mkurl('', {copy_offset => new_offset, copy_limit => ctx.copy_limit}) %]">&laquo; [%
++                    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) %] &raquo;</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 ? "&amp;" : ""; %]hold_target=[% ctx.bre_id %]&amp;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>
index 6fb3d53,0000000..4b7552f
mode 100644,000000..100644
--- /dev/null
@@@ -1,15 -1,0 +1,19 @@@
-         <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>
 +
index 4c8898f,0000000..0d20b9a
mode 100644,000000..100644
--- /dev/null
@@@ -1,282 -1,0 +1,275 @@@
-                             href = propagator _ '&amp;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 _ '&amp;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">&#9668;</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">&#9658;</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&amp;query=[% 
-                                                                     attrs.author | replace('[,\.:;]', '') | uri %]&amp;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>
 +                                                        &nbsp;&nbsp;
 +                                                        [% 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 ? "&amp;" : ""; %]hold_target=[% rec.id %]&amp;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>
index 5554f00,0000000..588260e
mode 100644,000000..100644
--- /dev/null
@@@ -1,77 -1,0 +1,81 @@@
 +
 +<div dojoType="dijit.layout.ContentPane" layoutAlign='client'>
 +    <button dojoType='dijit.form.Button' 
 +        onclick="displayGlobalDiv('vl-queue-div');">&#x2196; &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>
 +