Bug 12255 - Amazon cover images have useless image alt text in bootstrap
[koha_fer] / koha-tmpl / opac-tmpl / prog / en / modules / opac-user.tt
index 26b5efc..9f1478e 100644 (file)
@@ -1,32 +1,37 @@
+[% USE Koha %]
 [% USE KohaDates %]
-
 [% INCLUDE 'doc-head-open.inc' %]
 [% IF ( LibraryNameTitle ) %][% LibraryNameTitle %][% ELSE %]Koha online[% END %] catalog › Your library home
 [% INCLUDE 'doc-head-close.inc' %]
-<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.metadata.min.js"></script>
-<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.tablesorter.min.js"></script>
+[% INCLUDE 'calendar.inc' %]
+[% INCLUDE 'datatables.inc' %]
 <script type="text/JavaScript">
 //<![CDATA[
-var MSG_CONFIRM_DELETE_HOLD = _("Are you sure you want to cancel this hold?");
-$.tablesorter.addParser({
-    id: 'articles', 
-    is: function(s) {return false;  }, 
-    format: function(s) { return s.toLowerCase().replace(/^(the|an|a) /,''); }, 
-    type: 'text' 
-});
-            $(function() {
-            $('#opac-user-views').tabs();
-            $.tablesorter.defaults.widgets = ['zebra'];
-            [% IF ( dateformat == 'metric' ) %]$.tablesorter.defaults.dateFormat = ['uk'];[% END %]
-                       $("#holdst").tablesorter({
-                               sortList: [[0,0]]
-                       }); 
-                       $("#checkoutst").tablesorter({
-                [% IF ( JacketImages ) %]sortList: [[2,0]][% ELSE %]sortList: [[1,0]][% END %]
-            }); 
-                       $("#overduest").tablesorter();
-[% IF ( GoogleJackets ) %]KOHA.Google.GetCoverFromIsbn();[% END %]
-        [% IF ( OpacRenewalAllowed && canrenew && !userdebarred ) %]$("#renewselected").submit(function(){
+var MSG_CONFIRM_DELETE_HOLD   = _("Are you sure you want to cancel this hold?");
+var MSG_CONFIRM_SUSPEND_HOLDS = _("Are you sure you want to suspend all holds?");
+var MSG_CONFIRM_RESUME_HOLDS  = _("Are you sure you want to resume all suspended holds?");
+
+    $(document).ready(function(){
+
+        $('#opac-user-views').tabs();
+
+        var dTables = $("#checkoutst,#holdst,#overduest");
+        dTables.each(function(){
+            var thIndex = $(this).find("th.psort").index();
+            $(this).dataTable($.extend(true, {}, dataTablesDefaults, {
+                "aaSorting" : [[ thIndex, 'asc' ]],
+                "aoColumnDefs": [
+                    { "aTargets": [ "nosort" ],"bSortable": false,"bSearchable": false },
+                    { "sType": "anti-the", "aTargets" : [ "anti-the" ] },
+                    { "sType": "title-string", "aTargets" : [ "title-string" ] }
+                ]
+            }));
+        });
+
+    [% IF ( GoogleJackets ) %]KOHA.Google.GetCoverFromIsbn();[% END %]
+
+    [% IF ( OpacRenewalAllowed && canrenew && !userdebarred ) %]
+        $("#renewselected").submit(function(){
             valid = false;
             $("input[type=checkbox]").each(function(){
                 if($(this).is(':checked')){
@@ -38,15 +43,20 @@ $.tablesorter.addParser({
             }
             return valid;
         });
-        $("#renewselected_link").live('click',function(){
+        $("body").on("click","#renewselected_link",function(){
             $("#renewselected").submit();
         });
-        $("#renewall_link").live('click',function(){
+        $("body").on("click","#renewall_link",function(){
             $("#renewall").submit();
         });
-        $("#checkoutst caption").append("<div id=\"renewcontrols\"><a id=\"renewselected_link\" href=\"#\">"+_("Renew selected")+"</a> <a id=\"renewall_link\" href=\"#\">"+_("Renew all")+"</a></div>");[% END %]
-        $( "#suspend_until" ).datepicker({ minDate: 1 }); // Require that "until date" be in the future
-            });
+        [% IF ( canrenew && !userdebarred && OpacRenewalAllowed && !( borrower.is_expired && borrower.BlockExpiredPatronOpacActions ) ) %]
+            $("#checkoutst caption").append("<div id=\"renewcontrols\"><a id=\"renewselected_link\" href=\"#\">"+_("Renew selected")+"</a> <a id=\"renewall_link\" href=\"#\">"+_("Renew all")+"</a></div>");
+        [% END %]
+    [% END %]
+
+    $( ".suspend-until" ).datepicker({ minDate: 1 }); // Require that "until date" be in the future
+
+    });
 //]]>
 </script>
 </head>
@@ -88,6 +98,30 @@ $.tablesorter.addParser({
         </div>
         [% END %]
 
+        [% IF ( BORROWER_INF.warnexpired ) %]
+        <div class="dialog alert" id="warnexpired">
+            <strong>Please note: </strong><span>Your account has expired as of [% BORROWER_INF.warnexpired | $KohaDates %]. Please contact the library if you wish to renew your account.</span>
+        </div>
+        [% END %]
+
+        [% IF ( RENEW_ERROR ) %]
+        <div class="dialog alert">
+                <strong>Please note:</strong>
+                <span>
+                    Your loan renewal failed because of the following reason(s):
+                    [% FOREACH error IN RENEW_ERROR.split('\|') %]
+                        [% IF error == 'card_expired' %]
+                            Your account has expired. Please contact the library for more information.
+                        [% ELSIF error == 'too_many' %]
+                            You have renewed this item the maximum number of times allowed.
+                        [% ELSIF error == 'on_reserve' %]
+                            This item is on hold for another patron.
+                        [% END %]
+                    [% END %]
+                </span>
+        </div>
+        [% END %]
+
         [% IF ( patron_flagged ) %]
                <div class="dialog alert">
         <ul>
@@ -95,18 +129,19 @@ $.tablesorter.addParser({
                 <span id="userdebarred"><li><strong>Please note:</strong> Your account has been frozen[% IF ( BORROWER_INF.userdebarreddate ) %] until <span id="userdebarred_date">[% BORROWER_INF.userdebarreddate | $KohaDates %]</span>[% END %][% IF ( BORROWER_INF.debarredcomment ) %] with the comment <span id="userdebarred_comment">"[% BORROWER_INF.debarredcomment %]"</span>[% END %]. Usually the reason for freezing an account is old overdues or damage fees. If <a href="/cgi-bin/koha/opac-user.pl">your account page</a> shows your account to be clear, please contact the library.</li></span>
             [% END %]
             [% IF ( BORROWER_INF.gonenoaddress ) %]
-                <span id="gonenoaddress"><li><strong>Please note:</strong> According to our records, we don't have up-to-date [% UNLESS ( BORROWER_INF.OPACPatronDetails ) %]<a href="/cgi-bin/koha/opac-userupdate.pl">contact information</a>[% ELSE %]contact information[% END %] on file.  Please contact the library[% IF ( BORROWER_INF.OPACPatronDetails ) %] or use the <a href="/cgi-bin/koha/opac-userupdate.pl">online update form</a> to submit current information (<em>Please note:</em> there may be a delay in restoring your account if you submit online)[% END %].</li></span>
+                <span id="gonenoaddress"><li><strong>Please note:</strong> According to our records, we don't have up-to-date [% UNLESS ( BORROWER_INF.OPACPatronDetails ) %]<a href="/cgi-bin/koha/opac-memberentry.pl">contact information</a>[% ELSE %]contact information[% END %] on file.  Please contact the library[% IF ( BORROWER_INF.OPACPatronDetails ) %] or use the <a href="/cgi-bin/koha/opac-memberentry.pl">online update form</a> to submit current information (<em>Please note:</em> there may be a delay in restoring your account if you submit online)[% END %].</li></span>
             [% END %]
             [% IF ( BORROWER_INF.lost ) %]
                 <span id="lost"><li><strong>Please note: </strong> Your library card has been marked as lost or stolen. If this is an error, please contact the library.</li></span>
             [% END %]
             [% IF ( renewal_blocked_fines ) && ( OpacRenewalAllowed ) %]
-                <span id="renewal_blocked_fines"><li><strong>Please note: </strong> Since you have <a href="/cgi-bin/koha/opac-account.pl">more than <span id="renewal_blocked_fines_amount">[% renewal_blocked_fines %]</span></a> in fines, you cannot renew your books online. Please pay your fines if you wish to renew your books.</li></span>
-            [% ELSIF ( renewal_blocked_fines ) %]
-                <span id="renewal_blocked_fines"><li><strong>Please note: </strong> You currently owe <a href="/cgi-bin/koha/opac-account.pl"><span id="renewal_blocked_fines_amount">[% renewal_blocked_fines %] in fines.</span></a></li></span>
+                <span id="renewal_blocked_fines"><li><strong>Please note: </strong> Since you have <a href="/cgi-bin/koha/opac-account.pl">[% IF renewal_blocked_fines != "0.00" %] more than <span id="renewal_blocked_fines_amount">[% renewal_blocked_fines %]</span> in [% END %] fines</a>, you cannot renew your books online. Please pay your fines if you wish to renew your books.</li></span>
             [% END %]
         </ul></div>
         [% END %]
+
+        [% SET OPACMySummaryNote = Koha.Preference('OPACMySummaryNote') %]
+        [% IF OPACMySummaryNote %][% OPACMySummaryNote %][% END %]
         
 <div id="opac-user-views" class="toptabs">
         <ul>
@@ -128,20 +163,20 @@ $.tablesorter.addParser({
         <table id="checkoutst">
         <caption>[% issues_count %] Item(s) checked out</caption>
        <thead><tr>
-        [% IF ( JacketImages ) %]<th class="{sorter: false}">&nbsp;</th>[% END %]
-        <th class="{sorter:'articles'}">Title</th>
-        <th>Due</th>
+        [% IF ( JacketImages ) %]<th class="nosort">&nbsp;</th>[% END %]
+        <th class="anti-the">Title</th>
+        <th class="title-string psort">Due</th>
         [% UNLESS ( item_level_itypes ) %]<th>Item type</th> [% END %]
         [% IF ( show_barcode ) %]<th>Barcode</th>[% END %]
         <th>Call No.</th>
-        [% IF ( OpacRenewalAllowed ) %]
-        <th class="{sorter: false}">Renew</th>
+        [% IF ( OpacRenewalAllowed && !( borrower.is_expired && borrower.BlockExpiredPatronOpacActions ) ) %]
+        <th class="nosort">Renew</th>
         [% END %]
 [% IF ( OPACFinesTab ) %]
         <th>Fines</th>
 [% END %]
         [% IF ( OPACMySummaryHTML ) %]
-        <th class="{sorter: false}">Links</th>
+        <th class="nosort">Links</th>
         [% END %]
         </tr></thead>
         <tbody>
@@ -158,7 +193,7 @@ $.tablesorter.addParser({
 
 [% IF ( JacketImages ) %]<td class="jacketcell">
 
-[% IF ( OPACAmazonCoverImages ) %][% IF ( ISSUE.normalized_isbn ) %]<a href="http://www.amazon.com/gp/reader/[% ISSUE.normalized_isbn %]/ref=sib_dp_pt/002-7879865-0184864#reader-link" title="View at Amazon.com"><img border="0" src="http://images.amazon.com/images/P/[% ISSUE.normalized_isbn %].01.THUMBZZZ.jpg" alt="Cover Image" /></a>[% ELSE %]<a href="#"><span class="no-image">No cover image available</span></a>[% END %][% END %]
+[% IF ( OPACAmazonCoverImages ) %][% IF ( ISSUE.normalized_isbn ) %]<a href="http://www.amazon.com/gp/reader/[% ISSUE.normalized_isbn %]/ref=sib_dp_pt/002-7879865-0184864#reader-link" title="View on Amazon.com"><img border="0" src="https://images-na.ssl-images-amazon.com/images/P/[% ISSUE.normalized_isbn %].01.THUMBZZZ.jpg" alt="View on Amazon.com" /></a>[% ELSE %]<a href="#"><span class="no-image">No cover image available</span></a>[% END %][% END %]
 
 [% IF ( GoogleJackets ) %][% IF ( ISSUE.normalized_isbn ) %]<div style="display:block;" title="Click to view in Google Books" class="[% ISSUE.normalized_isbn %]" id="gbs-thumbnail[% loop.count %]"></div>[% ELSE %]<a href="http://books.google.com/books?q=[% ISSUE.title |url %]"><span class="no-image">No cover image available</span></a>[% END %][% END %]
 
@@ -171,44 +206,55 @@ $.tablesorter.addParser({
 
 </td>[% END %]
 
-                <td><a href="/cgi-bin/koha/opac-detail.pl?biblionumber=[% ISSUE.biblionumber %]">[% ISSUE.title |html %]</a><span class="item-details">
+                <td class="title"><a href="/cgi-bin/koha/opac-detail.pl?biblionumber=[% ISSUE.biblionumber %]">[% ISSUE.title |html %][% FOREACH subtitl IN ISSUE.subtitle %] [% subtitl.subfield %][% END %]</a><span class="item-details">
                         [% ISSUE.author %]
                     </span></td>
                 [% IF ( ISSUE.overdue ) %]
-                    <td class="overdue">[% ISSUE.date_due | $KohaDates %]</td>
+                    <td class="date_due overdue"><span title="[% ISSUE.date_due %]">[% ISSUE.date_due | $KohaDates as_due_date => 1 %]</span></td>
                 [% ELSE %]
-                    <td>[% ISSUE.date_due | $KohaDates %]</td>
+                    <td class="date_due"><span title="[% ISSUE.date_due %]">[% ISSUE.date_due | $KohaDates as_due_date => 1 %]</span></td>
                 [% END %]
-                [% UNLESS ( item_level_itypes ) %]<td>[% IF ( ISSUE.imageurl ) %]<img src="[% ISSUE.imageurl %]" title="[% ISSUE.description %]" alt="[% ISSUE.description %]" />[% END %] [% ISSUE.description %]</td>[% END %]
-                [% IF ( show_barcode ) %]<td>[% ISSUE.barcode %]</td>[% END %]
-                <td>[% ISSUE.itemcallnumber %]</td>
-                [% IF ( OpacRenewalAllowed ) %]
-                    <td>[% IF ( ISSUE.status ) %][% IF ( canrenew ) %]<input type="checkbox" name="item" value="[% ISSUE.itemnumber %]"/> <a href="/cgi-bin/koha/opac-renew.pl?from=opac_user&amp;item=[% ISSUE.itemnumber %]&amp;borrowernumber=[% ISSUE.borrowernumber %]">Renew</a>[% END %] <span class="renewals">([% ISSUE.renewsleft %] of [% ISSUE.renewsallowed %] renewals remaining)</span>
-                        [% ELSE %]
-                        Not renewable[% IF ( ISSUE.too_many ) %] <span class="renewals">([% ISSUE.renewsleft %] of [% ISSUE.renewsallowed %] renewals remaining)</span>[% ELSE %][% IF ( ISSUE.on_reserve ) %] <span class="renewals">(On hold)</span>[% END %][% END %] 
-                        [% END %]</td>
+                [% UNLESS ( item_level_itypes ) %]<td class="itype">[% IF ( ISSUE.imageurl ) %]<img src="[% ISSUE.imageurl %]" title="[% ISSUE.description %]" alt="[% ISSUE.description %]" />[% END %] [% ISSUE.description %]</td>[% END %]
+                [% IF ( show_barcode ) %]<td class="barcode">[% ISSUE.barcode %]</td>[% END %]
+                <td class="call_no">[% ISSUE.itemcallnumber %]</td>
+                [% IF ( OpacRenewalAllowed && !( borrower.is_expired && borrower.BlockExpiredPatronOpacActions ) ) %]
+                    <td class="renew">
+                    [% IF ( ISSUE.status ) %]
+                        [% IF ( canrenew ) %]
+                            <input type="checkbox" name="item" value="[% ISSUE.itemnumber %]"/> <a href="/cgi-bin/koha/opac-renew.pl?from=opac_user&amp;item=[% ISSUE.itemnumber %]&amp;borrowernumber=[% ISSUE.borrowernumber %]">Renew</a>
+                        [% END %]
+                        <span class="renewals">([% ISSUE.renewsleft %] of [% ISSUE.renewsallowed %] renewals remaining)</span>
+                    [% ELSIF ( ISSUE.too_many ) %]
+                        Not renewable
+                    [% ELSIF ( ISSUE.too_soon ) %]
+                        No renewal before [% ISSUE.soonestrenewdate %]
+                        <span class="renewals">([% ISSUE.renewsleft %] of [% ISSUE.renewsallowed %] renewals remaining)</span>
+                    [% ELSIF ( ISSUE.on_reserve ) %]
+                        <span class="renewals">(On hold)</span>
+                    [% END %]
+                    </td>
                 [% END %]
 [% IF ( OPACFinesTab ) %]
-                <td>[% IF ( ISSUE.charges ) %]Yes[% ELSE %]No[% END %]</td>
+                <td class="fines">[% IF ( ISSUE.charges ) %]Yes[% ELSE %]No[% END %]</td>
 [% END %]
             [% IF ( OPACMySummaryHTML ) %]
-                <td>[% ISSUE.MySummaryHTML %]</td>
+                <td class="links">[% ISSUE.MySummaryHTML %]</td>
             [% END %]
             </tr>
         [% END %]</tbody>
         </table>
-       [% IF ( canrenew && !userdebarred && OpacRenewalAllowed ) %]
+        [% IF ( canrenew && !userdebarred && OpacRenewalAllowed && !( borrower.is_expired && borrower.BlockExpiredPatronOpacActions ) ) %]
         <input type="submit" value="Renew Selected" />
         [% END %]
         </form>
-        [% IF ( canrenew && !userdebarred && OpacRenewalAllowed ) %]
+        [% IF ( canrenew && !userdebarred && OpacRenewalAllowed && !( borrower.is_expired && borrower.BlockExpiredPatronOpacActions ) ) %]
         <form id="renewall" action="/cgi-bin/koha/opac-renew.pl" method="post">
             <input type="hidden" name="from" value="opac_user" />
             <input type="hidden" name="borrowernumber" value="[% borrowernumber %]" />
             [% FOREACH ISSUE IN ISSUES %]
             <input type="hidden" name="item" value="[% ISSUE.itemnumber %]" />
             [% END %]
-            <input type="submit" value="Renew All" />
+            <input type="submit" value="Renew all" />
         </form>
         [% END %]
     [% ELSE %]
@@ -256,7 +302,7 @@ $.tablesorter.addParser({
         <table id="waitingt">
             <caption>Holds waiting</caption>
            <thead> <tr>
-                <th colspan="2" class="{sorter:'articles'}">Title</th>
+                <th>Title</th>
                 <th>Hold date</th>
                 <th>Pick up library</th>
             </tr></thead>
@@ -284,14 +330,14 @@ $.tablesorter.addParser({
 <caption>Overdues <span class="count">([% overdues_count %] total)</span></caption>
 <!-- OVERDUES TABLE ROWS -->
 <thead><tr>
-[% IF ( JacketImages ) %]<th class="{sorter: false}">&nbsp;</th>[% END %]
-<th class="{sorter:'articles'}">Title</th>
+[% IF ( JacketImages ) %]<th class="nosort">&nbsp;</th>[% END %]
+<th>Title</th>
 [% UNLESS ( item_level_itypes ) %]<th>Item type</th> [% END %]
 [% IF ( show_barcode ) %]<th>Barcode</th>[% END %]
 <th>Call no.</th>
-<th>Due</th>
+<th class="psort">Due</th>
 [% IF ( OpacRenewalAllowed ) %]
-                    <th class="{sorter: false}">Renew</th>
+                    <th class="nosort">Renew</th>
 [% END %]
 [% IF ( OPACFinesTab ) %]
 <th>Fines</th>
@@ -302,7 +348,7 @@ $.tablesorter.addParser({
 <tr>
 [% IF ( JacketImages ) %]<td class="jacketcell">
 
-[% IF ( OPACAmazonCoverImages ) %][% IF ( OVERDUE.normalized_isbn ) %]<a href="http://www.amazon.com/gp/reader/[% OVERDUE.normalized_isbn %]/ref=sib_dp_pt/002-7879865-0184864#reader-link" title="View at Amazon.com"><img src="http://images.amazon.com/images/P/[% OVERDUE.normalized_isbn %].01.THUMBZZZ.jpg" alt="" class="thumbnail" /></a>[% ELSE %]<a href="#"><span class="no-image">No cover image available</span></a>[% END %][% END %]
+[% IF ( OPACAmazonCoverImages ) %][% IF ( OVERDUE.normalized_isbn ) %]<a href="http://www.amazon.com/gp/reader/[% OVERDUE.normalized_isbn %]/ref=sib_dp_pt/002-7879865-0184864#reader-link" title="View on Amazon.com"><img src="https://images-na.ssl-images-amazon.com/images/P/[% ISSUE.normalized_isbn %].01.THUMBZZZ.jpg" alt="View on Amazon.com" class="thumbnail" /></a>[% ELSE %]<a href="#"><span class="no-image">No cover image available</span></a>[% END %][% END %]
 
 [% IF ( GoogleJackets ) %][% IF ( OVERDUE.normalized_isbn ) %]<div style="display:block;" title="Click to view in Google Books" class="[% OVERDUE.normalized_isbn %]" id="gbs-thumbnail[% loop.count %]"></div>[% ELSE %]<a href="http://books.google.com/books?q=[% OVERDUE.title |url %]"><span class="no-image">No cover image available</span></a>[% END %][% END %]
 
@@ -317,12 +363,12 @@ $.tablesorter.addParser({
 [% END %]
 </td>[% END %]
 
-<td><a href="/cgi-bin/koha/opac-detail.pl?bib=[% OVERDUE.biblionumber %]">[% OVERDUE.title |html %]</a> <span class="item-details">[% OVERDUE.author %]</span></td>
+<td><a href="/cgi-bin/koha/opac-detail.pl?bib=[% OVERDUE.biblionumber %]">[% OVERDUE.title |html %][% FOREACH subtitl IN OVERDUE.subtitle %] [% subtitl.subfield %][% END %]</a> <span class="item-details">[% OVERDUE.author %]</span></td>
 
 [% UNLESS ( item_level_itypes ) %]<td>[% IF ( OVERDUE.imageurl ) %]<img src="[% OVERDUE.imageurl %]" title="[% OVERDUE.description %]" alt="[% OVERDUE.description %]" />[% END %] [% OVERDUE.description %]</td>[% END %]
 [% IF ( show_barcode ) %]<td>[% OVERDUE.barcode %]</td>[% END %]
 <td>[% OVERDUE.itemcallnumber %]</td>
-<td>[% OVERDUE.date_due | $KohaDates %]</td>
+<td><span title="[% OVERDUE.date_due %]">[% OVERDUE.date_due | $KohaDates as_due_date => 1 %]</span></td>
                 [% IF ( OpacRenewalAllowed ) %]
 <td>
 [% IF ( OVERDUE.debarred ) %]Account frozen
@@ -345,19 +391,28 @@ $.tablesorter.addParser({
         <div id="opac-user-holds">
         <table id="holdst">
         <caption>Holds <span class="count">([% reserves_count %] total)</span></caption>
-            <!-- RESERVES TABLE ROWS -->
-            <thead><tr>
-                <th class="{sorter:'articles'}">Title</th>
-                <th>Placed on</th>
-        <th>Expires on</th>
+
+        <!-- RESERVES TABLE ROWS -->
+        <thead>
+            <tr>
+                <th>Title</th>
+                <th class="psort">Placed on</th>
+                [% IF OpacHoldNotes %]
+                    <th>Notes</th>
+                [% END %]
+                <th>Expires on</th>
                 <th>Pick up location</th>
-               [% IF ( showpriority ) %]
-                       <th>Priority</th>
-               [% END %]
+                [% IF ( showpriority ) %]
+                    <th>Priority</th>
+                [% END %]
                 <th>Status</th>
-               <th class="{sorter: false}">Modify</th>
-            </tr></thead>
-                       <tbody>
+                <th class="nosort">Modify</th>
+                [% IF SuspendHoldsOpac %]
+                    <th class="nosort" >Suspend individual holds</th>
+                [% END %]
+            </tr>
+        </thead>
+        <tbody>
             [% FOREACH RESERVE IN RESERVES %]
            [% IF ( RESERVE.wait ) %]
                         [% IF ( RESERVE.atdestination ) %]
@@ -372,16 +427,23 @@ $.tablesorter.addParser({
                     [% ELSE %]
                             <tr>
                     [% END %]
-                <td><a href="/cgi-bin/koha/opac-detail.pl?biblionumber=[% RESERVE.biblionumber %]">[% RESERVE.reserves_title %]</a>
+                <td class="title"><a href="/cgi-bin/koha/opac-detail.pl?biblionumber=[% RESERVE.biblionumber %]">[% RESERVE.reserves_title %][% FOREACH subtitl IN RESERVE.subtitle %] [% subtitl.subfield %][% END %]</a>
                     [% RESERVE.author %]
                 </td>
-                <td>[% RESERVE.reservedate | $KohaDates %]</td>
-        <td>[% IF ( RESERVE.expirationdate ) %][% RESERVE.expirationdate | $KohaDates %][% ELSE %]Never expires[% END %]</td>
-                <td>[% RESERVE.branch %]</td>
+                <td class="reservedate"><span title="[% RESERVE.reservedate %]">[% RESERVE.reservedate | $KohaDates %]</span></td>
+                [% IF OpacHoldNotes %]<td class="reservenotes">[% RESERVE.reservenotes %]</td>[% END %]
+                <td class="expirationdate">
+                    [% IF ( RESERVE.expirationdate ) %]
+                        <span title="[% RESERVE.expirationdate %]">[% RESERVE.expirationdate | $KohaDates %]</span>
+                    [% ELSE %]
+                        Never expires
+                    [% END %]
+                </td>
+                <td class="branch">[% RESERVE.branch %]</td>
                                [% IF ( showpriority ) %]
-                               <td>[% RESERVE.priority %] </td>
+                             <td class="priority">[% RESERVE.priority %] </td>
                                [% END %]
-                <td>
+                <td class="status">
                     [% IF ( RESERVE.wait ) %]
                         [% IF ( RESERVE.atdestination ) %]
                             [% IF ( RESERVE.found ) %]
@@ -404,16 +466,37 @@ $.tablesorter.addParser({
                             [% END %]
                     [% END %]
                 </td>
-               <td>
+              <td class="modify">
                [% IF ( RESERVE.cancelable ) %]
                        <form action="/cgi-bin/koha/opac-modrequest.pl" method="post">
                        <input type="hidden" name="biblionumber" value="[% RESERVE.biblionumber %]" />
-               <input type="hidden" name="reservenumber" value="[% RESERVE.reservenumber %]" />
-                       <input type="submit" name="submit" class="icon delete cancel" value="Cancel" onclick="return confirmDelete('Are you sure you want to cancel this hold?');" /></form>
+          <input type="hidden" name="reserve_id" value="[% RESERVE.reserve_id %]" />
+                       <input type="submit" name="submit" class="icon delete cancel" value="Cancel" onclick="return confirmDelete(MSG_CONFIRM_DELETE_HOLD);" /></form>
                [% ELSE %]
                [% END %]
                </td>
 
+        [% IF SuspendHoldsOpac %]
+            <td>
+                [% IF ( RESERVE.cancelable ) %]
+                    <form action="/cgi-bin/koha/opac-modrequest-suspend.pl" method="post">
+                        <input type="hidden" name="reserve_id" value="[% RESERVE.reserve_id %]" />
+
+                        [% IF RESERVE.suspend %]
+                            <input type="submit" name="submit" value="Resume suspended hold" />
+                        [% ELSE %]
+                            <input type="submit" name="submit" class="icon delete cancel" value="Suspend hold" />
+
+                            [% IF AutoResumeSuspendedHolds %]
+                                <label for="suspend_until_[% RESERVE.reserve_id %]"> until </label>
+                                <input name="suspend_until" id="suspend_until_[% RESERVE.reserve_id %]" class="suspend-until" readonly="readonly" size="10" />
+                                <a href="#" style="font-size:85%;text-decoration:none;" onclick="document.getElementById('suspend_until_[% RESERVE.reserve_id %]').value='';return false;">Clear date</a>
+                            [% END %]
+                        [% END %]
+                    </form>
+                [% END %]
+            </td>
+        [% END %]
 
             </tr>
             [% END %]
@@ -423,19 +506,19 @@ $.tablesorter.addParser({
         [% IF SuspendHoldsOpac %]
        <div>
             <form action="/cgi-bin/koha/opac-modrequest-suspend.pl" method="post">
-              <input type="submit" name="submit" class="icon delete cancel" value="Suspend all holds" onclick="return confirmDelete('Are you sure you want to suspend all holds?');" />
+              <input type="submit" name="submit" class="icon delete cancel" value="Suspend all holds" onclick="return confirmDelete(MSG_CONFIRM_SUSPEND_HOLDS);" />
               <input type="hidden" name="suspend" value="1" />
 
              [% IF AutoResumeSuspendedHolds %]
              <label for="suspend_until"> until </label>
-              <input name="suspend_until" id="suspend_until" readonly="readonly" size="10" />
+              <input name="suspend_until" id="suspend_until" class="suspend-until" readonly="readonly" size="10" />
               <a href="#" style="font-size:85%;text-decoration:none;" onclick="document.getElementById('suspend_until').value='';return false;">Clear date</a></p>
               [% END %]
             </form>
        </div>
        <div>
             <form action="/cgi-bin/koha/opac-modrequest-suspend.pl" method="post">
-              <input type="submit" name="submit" class="icon delete cancel" value="Resume all suspended holds" onclick="return confirmDelete('Are you sure you want to resume all suspended holds?');" />
+              <input type="submit" name="submit" class="icon delete cancel" value="Resume all suspended holds" onclick="return confirmDelete(MSG_CONFIRM_RESUME_HOLDS);" />
               <input type="hidden" name="suspend" value="0" />
             </form>
        </div>