Bug 11529: Clean up subtitle usage
[koha.git] / koha-tmpl / intranet-tmpl / prog / js / checkouts.js
1 $(document).ready(function() {
2     $.ajaxSetup ({ cache: false });
3
4     var barcodefield = $("#barcode");
5
6     var onHoldDueDateSet = false;
7
8     var onHoldChecked = function() {
9         var isChecked = false;
10         $('input[data-on-reserve]').each(function() {
11             if ($(this).is(':checked')) {
12                 isChecked=true;
13             }
14         });
15         return isChecked;
16     };
17
18     var showHideOnHoldRenewal = function() {
19         // Display the date input
20         if (onHoldChecked()) {
21             $('#newonholdduedate').show()
22         } else {
23             $('#newonholdduedate').hide();
24         }
25     };
26
27     // Handle the select all/none links for checkouts table columns
28     $("#CheckAllRenewals").on("click",function(){
29         $("#UncheckAllCheckins").click();
30         $(".renew:visible").prop("checked", true);
31         showHideOnHoldRenewal();
32         return false;
33     });
34     $("#UncheckAllRenewals").on("click",function(){
35         $(".renew:visible").prop("checked", false);
36         showHideOnHoldRenewal();
37         return false;
38     });
39
40     $("#CheckAllCheckins").on("click",function(){
41         $("#UncheckAllRenewals").click();
42         $(".checkin:visible").prop("checked", true);
43         return false;
44     });
45     $("#UncheckAllCheckins").on("click",function(){
46         $(".checkin:visible").prop("checked", false);
47         return false;
48     });
49
50     $("#newduedate").on("change", function() {
51         if (!onHoldDueDateSet) {
52             $('#newonholdduedate input').val($('#newduedate').val());
53         }
54     });
55
56     $("#newonholdduedate").on("change", function() {
57         onHoldDueDateSet = true;
58     });
59
60     // Don't allow both return and renew checkboxes to be checked
61     $(document).on("change", '.renew', function(){
62         if ( $(this).is(":checked") ) {
63             $( "#checkin_" + $(this).val() ).prop("checked", false);
64         }
65     });
66     $(document).on("change", '.checkin', function(){
67         if ( $(this).is(":checked") ) {
68             $( "#renew_" + $(this).val() ).prop("checked", false);
69         }
70     });
71
72     // Display on hold due dates input when an on hold item is
73     // selected
74     $(document).on('change', '.renew', function(){
75         showHideOnHoldRenewal();
76     });
77
78     $("#output_format > option:first-child").attr("selected", "selected");
79     $("select[name='csv_profile_id']").hide();
80     $(document).on("change", '#issues-table-output-format', function(){
81         if ( $(this).val() == 'csv' ) {
82             $("select[name='csv_profile_id']").show();
83         } else {
84             $("select[name='csv_profile_id']").hide();
85         }
86     });
87
88     // Clicking the table cell checks the checkbox inside it
89     $(document).on("click", 'td', function(e){
90         if(e.target.tagName.toLowerCase() == 'td'){
91           $(this).find("input:checkbox:visible").each( function() {
92             $(this).click();
93           });
94         }
95     });
96
97     // Handle renewals and returns
98     $("#RenewCheckinChecked").on("click",function(){
99         $(".checkin:checked:visible").each(function() {
100             itemnumber = $(this).val();
101
102             $(this).replaceWith("<img id='checkin_" + itemnumber + "' src='" + interface + "/" + theme + "/img/spinner-small.gif' />");
103
104             params = {
105                 itemnumber:     itemnumber,
106                 borrowernumber: borrowernumber,
107                 branchcode:     branchcode,
108                 exempt_fine:    $("#exemptfine").is(':checked')
109             };
110
111             $.post( "/cgi-bin/koha/svc/checkin", params, function( data ) {
112                 id = "#checkin_" + data.itemnumber;
113
114                 content = "";
115                 if ( data.returned ) {
116                     content = CIRCULATION_RETURNED;
117                     $(id).parent().parent().addClass('ok');
118                     $('#date_due_' + data.itemnumber).html(CIRCULATION_RETURNED);
119                     if ( data.patronnote != null ) {
120                         $('.patron_note_' + data.itemnumber).html("Patron note: " + data.patronnote);
121                     }
122                 } else {
123                     content = CIRCULATION_NOT_RETURNED;
124                     $(id).parent().parent().addClass('warn');
125                 }
126
127                 $(id).replaceWith( content );
128             }, "json")
129         });
130
131         $(".renew:checked:visible").each(function() {
132             var override_limit = $("#override_limit").is(':checked') ? 1 : 0;
133
134             var isOnReserve = $(this).data().hasOwnProperty('onReserve');
135
136             var itemnumber = $(this).val();
137
138             $(this).parent().parent().replaceWith("<img id='renew_" + itemnumber + "' src='" + interface + "/" + theme + "/img/spinner-small.gif' />");
139
140             var params = {
141                 itemnumber:      itemnumber,
142                 borrowernumber:  borrowernumber,
143                 branchcode:      branchcode,
144                 override_limit:  override_limit,
145             };
146
147             // Determine which due date we need to use
148             var dueDate = isOnReserve ?
149                 $("#newonholdduedate input").val() :
150                 $("#newduedate").val();
151
152             if (dueDate && dueDate.length > 0) {
153                 params.date_due = dueDate
154             }
155
156             $.post( "/cgi-bin/koha/svc/renew", params, function( data ) {
157                 var id = "#renew_" + data.itemnumber;
158
159                 var content = "";
160                 if ( data.renew_okay ) {
161                     content = CIRCULATION_RENEWED_DUE + " " + data.date_due;
162                     $('#date_due_' + data.itemnumber).replaceWith( data.date_due );
163                 } else {
164                     content = CIRCULATION_RENEW_FAILED + " ";
165                     if ( data.error == "no_checkout" ) {
166                         content += NOT_CHECKED_OUT;
167                     } else if ( data.error == "too_many" ) {
168                         content += TOO_MANY_RENEWALS;
169                     } else if ( data.error == "on_reserve" ) {
170                         content += ON_RESERVE;
171                     } else if ( data.error == "restriction" ) {
172                         content += NOT_RENEWABLE_RESTRICTION;
173                     } else if ( data.error == "overdue" ) {
174                         content += NOT_RENEWABLE_OVERDUE;
175                     } else if ( data.error ) {
176                         content += data.error;
177                     } else {
178                         content += REASON_UNKNOWN;
179                     }
180                 }
181
182                 $(id).replaceWith( content );
183             }, "json")
184         });
185
186         // Refocus on barcode field if it exists
187         if ( $("#barcode").length ) {
188             $("#barcode").focus();
189         }
190
191         // Prevent form submit
192         return false;
193     });
194
195     $("#RenewAll").on("click",function(){
196         $("#CheckAllRenewals").click();
197         $("#UncheckAllCheckins").click();
198         showHideOnHoldRenewal();
199         $("#RenewCheckinChecked").click();
200
201         // Prevent form submit
202         return false;
203     });
204
205     var ymd = $.datepicker.formatDate('yy-mm-dd', new Date());
206
207     $('#issues-table').hide();
208     $('#issues-table-actions').hide();
209     $('#issues-table-load-immediately').change(function(){
210         if ( this.checked && typeof issuesTable === 'undefined') {
211             $('#issues-table-load-now-button').click();
212         }
213         barcodefield.focus();
214     });
215     $('#issues-table-load-now-button').click(function(){
216         LoadIssuesTable();
217         barcodefield.focus();
218         return false;
219     });
220
221     if ( $.cookie("issues-table-load-immediately-" + script) == "true" ) {
222         LoadIssuesTable();
223         $('#issues-table-load-immediately').prop('checked', true);
224     }
225     $('#issues-table-load-immediately').on( "change", function(){
226         $.cookie("issues-table-load-immediately-" + script, $(this).is(':checked'), { expires: 365 });
227     });
228
229     function LoadIssuesTable() {
230         $('#issues-table-loading-message').hide();
231         $('#issues-table').show();
232         $('#issues-table-actions').show();
233
234         issuesTable = KohaTable("issues-table", {
235             "oLanguage": {
236                 "sEmptyTable" : MSG_DT_LOADING_RECORDS,
237                 "sProcessing": MSG_DT_LOADING_RECORDS,
238             },
239             "bAutoWidth": false,
240             "dom": 'B<"clearfix">rt',
241             "aoColumns": [
242                 {
243                     "mDataProp": function( oObj ) {
244                         return oObj.sort_order;
245                     }
246                 },
247                 {
248                     "mDataProp": function( oObj ) {
249                         if ( oObj.issued_today ) {
250                             return "<strong>" + TODAYS_CHECKOUTS + "</strong>";
251                         } else {
252                             return "<strong>" + PREVIOUS_CHECKOUTS + "</strong>";
253                         }
254                     }
255                 },
256                 {
257                     "mDataProp": "date_due",
258                     "bVisible": false,
259                 },
260                 {
261                     "iDataSort": 2, // Sort on hidden unformatted date due column
262                     "mDataProp": function( oObj ) {
263                         var due = oObj.date_due_formatted;
264
265                         if ( oObj.date_due_overdue ) {
266                             due = "<span class='overdue'>" + due + "</span>";
267                         }
268
269                         due = "<span id='date_due_" + oObj.itemnumber + "' class='date_due'>" + due + "</span>";
270
271                         if ( oObj.lost ) {
272                             due += "<span class='lost'>" + oObj.lost.escapeHtml() + "</span>";
273                         }
274
275                         if ( oObj.damaged ) {
276                             due += "<span class='dmg'>" + oObj.damaged.escapeHtml() + "</span>";
277                         }
278
279                         var patron_note = " <span class='patron_note_" + oObj.itemnumber + "'></span>";
280                         due +="<br>" + patron_note;
281
282                         return due;
283                     }
284                 },
285                 {
286                     "mDataProp": function ( oObj ) {
287                         title = "<span id='title_" + oObj.itemnumber + "' class='strong'><a href='/cgi-bin/koha/catalogue/detail.pl?biblionumber="
288                               + oObj.biblionumber
289                               + "'>"
290                               + oObj.title.escapeHtml();
291
292                         $.each(oObj.subtitle, function( index, value ) {
293                                   title += " " + value.escapeHtml();
294                         });
295
296                         title += " " + oObj.part_number + " " + oObj.part_name;
297
298                         if ( oObj.enumchron ) {
299                             title += " (" + oObj.enumchron.escapeHtml() + ")";
300                         }
301
302                         title += "</a></span>";
303
304                         if ( oObj.author ) {
305                             title += " " + BY.replace( "_AUTHOR_",  " " + oObj.author.escapeHtml() );
306                         }
307
308                         if ( oObj.itemnotes ) {
309                             var span_class = "text-muted";
310                             if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
311                                 span_class = "circ-hlt";
312                             }
313                             title += " - <span class='" + span_class + " item-note-public'>" + oObj.itemnotes.escapeHtml() + "</span>";
314                         }
315
316                         if ( oObj.itemnotes_nonpublic ) {
317                             var span_class = "text-danger";
318                             if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
319                                 span_class = "circ-hlt";
320                             }
321                             title += " - <span class='" + span_class + " item-note-nonpublic'>" + oObj.itemnotes_nonpublic.escapeHtml() + "</span>";
322                         }
323
324                         var onsite_checkout = '';
325                         if ( oObj.onsite_checkout == 1 ) {
326                             onsite_checkout += " <span class='onsite_checkout'>(" + INHOUSE_USE + ")</span>";
327                         }
328
329                         title += " "
330                               + "<a href='/cgi-bin/koha/catalogue/moredetail.pl?biblionumber="
331                               + oObj.biblionumber
332                               + "&itemnumber="
333                               + oObj.itemnumber
334                               + "#"
335                               + oObj.itemnumber
336                               + "'>"
337                               + oObj.barcode.escapeHtml()
338                               + "</a>"
339                               + onsite_checkout
340
341                         return title;
342                     },
343                     "sType": "anti-the"
344                 },
345                 {
346                     "mDataProp": function ( oObj ) {
347                         return oObj.itemtype_description.escapeHtml();
348                     }
349                 },
350                 {
351                     "mDataProp": function ( oObj ) {
352                         return ( oObj.collection ? oObj.collection.escapeHtml() : '' );
353                     }
354                 },
355                 {
356                     "mDataProp": function ( oObj ) {
357                         return ( oObj.location ? oObj.location.escapeHtml() : '' );
358                     }
359                 },
360                 {
361                     "mDataProp": function ( oObj ) {
362                         return oObj.homebranch.escapeHtml();
363                     }
364                 },
365                 {
366                     "mDataProp": "issuedate",
367                     "bVisible": false,
368                 },
369                 {
370                     "iDataSort": 9, // Sort on hidden unformatted issuedate column
371                     "mDataProp": "issuedate_formatted",
372                 },
373                 {
374                     "mDataProp": function ( oObj ) {
375                         return oObj.branchname.escapeHtml();
376                     }
377                 },
378                 {
379                     "mDataProp": function ( oObj ) {
380                         return ( oObj.itemcallnumber ? oObj.itemcallnumber.escapeHtml() : '' );
381                     }
382                 },
383                 {
384                     "mDataProp": function ( oObj ) {
385                         if ( ! oObj.charge ) oObj.charge = 0;
386                         return '<span style="text-align: right; display: block;">' + parseFloat(oObj.charge).toFixed(2) + '<span>';
387                     }
388                 },
389                 {
390                     "mDataProp": function ( oObj ) {
391                         if ( ! oObj.fine ) oObj.fine = 0;
392                         return '<span style="text-align: right; display: block;">' + parseFloat(oObj.fine).toFixed(2)  + '<span>';
393                     }
394                 },
395                 {
396                     "mDataProp": function ( oObj ) {
397                         if ( ! oObj.price ) oObj.price = 0;
398                         return '<span style="text-align: right; display: block;">' + parseFloat(oObj.price).toFixed(2) + '<span>';
399                     }
400                 },
401                 {
402                     "bSortable": false,
403                     "bVisible": AllowCirculate ? true : false,
404                     "mDataProp": function ( oObj ) {
405                         var content = "";
406                         var msg = "";
407                         var span_style = "";
408                         var span_class = "";
409
410                         if ( oObj.can_renew ) {
411                             // Do nothing
412                         } else if ( oObj.can_renew_error == "on_reserve" ) {
413                             msg += "<span>"
414                                     + "<a href='/cgi-bin/koha/reserve/request.pl?biblionumber=" + oObj.biblionumber + "'>" + ON_HOLD + "</a>"
415                                     + "</span>";
416
417                             span_style = "display: none";
418                             span_class = "renewals-allowed-on_reserve";
419                         } else if ( oObj.can_renew_error == "too_many" ) {
420                             msg += "<span class='renewals-disabled'>"
421                                     + NOT_RENEWABLE
422                                     + "</span>";
423
424                             span_style = "display: none";
425                             span_class = "renewals-allowed";
426                         } else if ( oObj.can_renew_error == "restriction" ) {
427                             msg += "<span class='renewals-disabled'>"
428                                     + NOT_RENEWABLE_RESTRICTION
429                                     + "</span>";
430
431                             span_style = "display: none";
432                             span_class = "renewals-allowed";
433                         } else if ( oObj.can_renew_error == "overdue" ) {
434                             msg += "<span class='renewals-disabled'>"
435                                     + NOT_RENEWABLE_OVERDUE
436                                     + "</span>";
437
438                             span_style = "display: none";
439                             span_class = "renewals-allowed";
440                         } else if ( oObj.can_renew_error == "too_soon" ) {
441                             msg += "<span class='renewals-disabled'>"
442                                     + NOT_RENEWABLE_TOO_SOON.format( oObj.can_renew_date )
443                                     + "</span>";
444
445                             span_style = "display: none";
446                             span_class = "renewals-allowed";
447                         } else if ( oObj.can_renew_error == "auto_too_soon" ) {
448                             msg += "<span class='renewals-disabled'>"
449                                     + NOT_RENEWABLE_AUTO_TOO_SOON
450                                     + "</span>";
451
452                             span_style = "display: none";
453                             span_class = "renewals-allowed";
454                         } else if ( oObj.can_renew_error == "auto_too_late" ) {
455                             msg += "<span class='renewals-disabled'>"
456                                     + NOT_RENEWABLE_AUTO_TOO_LATE
457                                     + "</span>";
458
459                             span_style = "display: none";
460                             span_class = "renewals-allowed";
461                         } else if ( oObj.can_renew_error == "auto_too_much_oweing" ) {
462                             msg += "<span class='renewals-disabled'>"
463                                     + NOT_RENEWABLE_AUTO_TOO_MUCH_OWEING
464                                     + "</span>";
465
466                             span_style = "display: none";
467                             span_class = "renewals-allowed";
468                         } else if ( oObj.can_renew_error == "auto_account_expired" ) {
469                             msg += "<span class='renewals-disabled'>"
470                                     + NOT_RENEWABLE_AUTO_ACCOUNT_EXPIRED
471                                     + "</span>";
472
473                             span_style = "display: none";
474                             span_class = "renewals-allowed";
475                         } else if ( oObj.can_renew_error == "auto_renew" ) {
476                             msg += "<span class='renewals-disabled'>"
477                                     + NOT_RENEWABLE_AUTO_RENEW
478                                     + "</span>";
479
480                             span_style = "display: none";
481                             span_class = "renewals-allowed";
482                         } else if ( oObj.can_renew_error == "onsite_checkout" ) {
483                             // Don't display something if it's an onsite checkout
484                         } else if ( oObj.can_renew_error == "item_denied_renewal" ) {
485                             content += "<span class='renewals-disabled'>"
486                                     + NOT_RENEWABLE_DENIED
487                                     + "</span>";
488
489                             span_style = "display: none";
490                             span_class = "renewals-allowed";
491                         } else {
492                             msg += "<span class='renewals-disabled'>"
493                                     + oObj.can_renew_error
494                                     + "</span>";
495
496                             span_style = "display: none";
497                             span_class = "renewals-allowed";
498                         }
499
500                         var can_force_renew = ( oObj.onsite_checkout == 0 ) &&
501                             ( oObj.can_renew_error != "on_reserve" || (oObj.can_renew_error == "on_reserve" && AllowRenewalOnHoldOverride))
502                             ? true : false;
503                         var can_renew = ( oObj.renewals_remaining > 0  && !oObj.can_renew_error );
504                         content += "<span>";
505                         if ( can_renew || can_force_renew ) {
506                             content += "<span style='padding: 0 1em;'>" + oObj.renewals_count + "</span>";
507                             content += "<span class='" + span_class + "' style='" + span_style + "'>"
508                                     +  "<input type='checkbox' ";
509                             if ( oObj.date_due_overdue && can_renew ) {
510                                 content += "checked='checked' ";
511                             }
512                             if (oObj.can_renew_error == "on_reserve") {
513                                 content += "data-on-reserve ";
514                             }
515                             content += "class='renew' id='renew_" + oObj.itemnumber + "' name='renew' value='" + oObj.itemnumber +"'/>"
516                                     +  "</span>";
517                         }
518                         content += msg;
519                         if ( can_renew || can_force_renew ) {
520                             content += "<span class='renewals'>("
521                                     + RENEWALS_REMAINING.format( oObj.renewals_remaining, oObj.renewals_allowed )
522                                     + ")</span>";
523                         }
524
525                         content += "</span>";
526
527                         return content;
528                     }
529                 },
530                 {
531                     "bSortable": false,
532                     "bVisible": AllowCirculate ? true : false,
533                     "mDataProp": function ( oObj ) {
534                         if ( oObj.can_renew_error == "on_reserve" ) {
535                             return "<a href='/cgi-bin/koha/reserve/request.pl?biblionumber=" + oObj.biblionumber + "'>" + ON_HOLD + "</a>";
536                         } else {
537                             return "<input type='checkbox' class='checkin' id='checkin_" + oObj.itemnumber + "' name='checkin' value='" + oObj.itemnumber +"'></input>";
538                         }
539                     }
540                 },
541                 {
542                     "bVisible": exports_enabled == 1 ? true : false,
543                     "bSortable": false,
544                     "mDataProp": function ( oObj ) {
545                         var s = "<input type='checkbox' name='itemnumbers' value='" + oObj.itemnumber + "' style='visibility:hidden;' />";
546
547                         s += "<input type='checkbox' class='export' id='export_" + oObj.biblionumber + "' name='biblionumbers' value='" + oObj.biblionumber + "' />";
548                         return s;
549                     }
550                 }
551             ],
552             "fnFooterCallback": function ( nRow, aaData, iStart, iEnd, aiDisplay ) {
553                 var total_charge = 0;
554                 var total_fine  = 0;
555                 var total_price = 0;
556                 for ( var i=0; i < aaData.length; i++ ) {
557                     total_charge += aaData[i]['charge'] * 1;
558                     total_fine += aaData[i]['fine'] * 1;
559                     total_price  += aaData[i]['price'] * 1;
560                 }
561                 $("#totaldue").html(total_charge.toFixed(2));
562                 $("#totalfine").html(total_fine.toFixed(2));
563                 $("#totalprice").html(total_price.toFixed(2));
564             },
565             "bPaginate": false,
566             "bProcessing": true,
567             "bServerSide": false,
568             "sAjaxSource": '/cgi-bin/koha/svc/checkouts',
569             "fnServerData": function ( sSource, aoData, fnCallback ) {
570                 aoData.push( { "name": "borrowernumber", "value": borrowernumber } );
571
572                 $.getJSON( sSource, aoData, function (json) {
573                     fnCallback(json)
574                 } );
575             },
576             "fnInitComplete": function(oSettings, json) {
577                 // Disable rowGrouping plugin after first use
578                 // so any sorting on the table doesn't use it
579                 var oSettings = issuesTable.fnSettings();
580
581                 for (f = 0; f < oSettings.aoDrawCallback.length; f++) {
582                     if (oSettings.aoDrawCallback[f].sName == 'fnRowGrouping') {
583                         oSettings.aoDrawCallback.splice(f, 1);
584                         break;
585                     }
586                 }
587
588                 oSettings.aaSortingFixed = null;
589
590                 // Build a summary of checkouts grouped by itemtype
591                 var checkoutsByItype = json.aaData.reduce(function (obj, row) {
592                     obj[row.itemtype_description] = (obj[row.itemtype_description] || 0) + 1;
593                     return obj;
594                 }, {});
595                 var ul = $('<ul>');
596                 Object.keys(checkoutsByItype).sort().forEach(function (itype) {
597                     var li = $('<li>')
598                         .append($('<strong>').html(itype || MSG_NO_ITEMTYPE))
599                         .append(': ' + checkoutsByItype[itype]);
600                     ul.append(li);
601                 })
602                 $('<details>')
603                     .addClass('checkouts-by-itemtype')
604                     .append($('<summary>').html(MSG_CHECKOUTS_BY_ITEMTYPE))
605                     .append(ul)
606                     .insertBefore(oSettings.nTableWrapper)
607             },
608         }, columns_settings_issues_table).rowGrouping(
609             {
610                 iGroupingColumnIndex: 1,
611                 iGroupingOrderByColumnIndex: 0,
612                 sGroupingColumnSortDirection: "asc"
613             }
614         );
615
616         if ( $("#issues-table").length ) {
617             $("#issues-table_processing").position({
618                 of: $( "#issues-table" ),
619                 collision: "none"
620             });
621         }
622     }
623
624     // Don't load relatives' issues table unless it is clicked on
625     var relativesIssuesTable;
626     $("#relatives-issues-tab").click( function() {
627         if ( ! relativesIssuesTable ) {
628             relativesIssuesTable = $("#relatives-issues-table").dataTable({
629                 "bAutoWidth": false,
630                 "sDom": "rt",
631                 "aaSorting": [],
632                 "aoColumns": [
633                     {
634                         "mDataProp": "date_due",
635                         "bVisible": false,
636                     },
637                     {
638                         "iDataSort": 0, // Sort on hidden unformatted date due column
639                         "mDataProp": function( oObj ) {
640                             var today = new Date();
641                             var due = new Date( oObj.date_due );
642                             if ( today > due ) {
643                                 return "<span class='overdue'>" + oObj.date_due_formatted + "</span>";
644                             } else {
645                                 return oObj.date_due_formatted;
646                             }
647                         }
648                     },
649                     {
650                         "mDataProp": function ( oObj ) {
651                             title = "<span class='strong'><a href='/cgi-bin/koha/catalogue/detail.pl?biblionumber="
652                                   + oObj.biblionumber
653                                   + "'>"
654                                   + oObj.title.escapeHtml();
655
656                             $.each(oObj.subtitle, function( index, value ) {
657                                       title += " " + value.escapeHtml();
658                             });
659
660                             title += " " + oObj.part_number + " " + oObj.part_name;
661
662                             if ( oObj.enumchron ) {
663                                 title += " (" + oObj.enumchron.escapeHtml() + ")";
664                             }
665
666                             title += "</a></span>";
667
668                             if ( oObj.author ) {
669                                 title += " " + BY.replace( "_AUTHOR_", " " + oObj.author.escapeHtml() );
670                             }
671
672                             if ( oObj.itemnotes ) {
673                                 var span_class = "";
674                                 if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
675                                     span_class = "circ-hlt";
676                                 }
677                                 title += " - <span class='" + span_class + "'>" + oObj.itemnotes.escapeHtml() + "</span>"
678                             }
679
680                             if ( oObj.itemnotes_nonpublic ) {
681                                 var span_class = "";
682                                 if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
683                                     span_class = "circ-hlt";
684                                 }
685                                 title += " - <span class='" + span_class + "'>" + oObj.itemnotes_nonpublic.escapeHtml() + "</span>"
686                             }
687
688                             var onsite_checkout = '';
689                             if ( oObj.onsite_checkout == 1 ) {
690                                 onsite_checkout += " <span class='onsite_checkout'>(" + INHOUSE_USE + ")</span>";
691                             }
692
693                             title += " "
694                                   + "<a href='/cgi-bin/koha/catalogue/moredetail.pl?biblionumber="
695                                   + oObj.biblionumber
696                                   + "&itemnumber="
697                                   + oObj.itemnumber
698                                   + "#"
699                                   + oObj.itemnumber
700                                   + "'>"
701                                   + oObj.barcode.escapeHtml()
702                                   + "</a>"
703                                   + onsite_checkout;
704
705                             return title;
706                         },
707                         "sType": "anti-the"
708                     },
709                     {
710                         "mDataProp": function ( oObj ) {
711                             return oObj.itemtype_description.escapeHtml();
712                         }
713                     },
714                     {
715                         "mDataProp": function ( oObj ) {
716                             return ( oObj.collection ? oObj.collection.escapeHtml() : '' );
717                         }
718                     },
719                     {
720                         "mDataProp": function ( oObj ) {
721                             return ( oObj.location ? oObj.location.escapeHtml() : '' );
722                         }
723                     },
724                     {
725                         "mDataProp": "issuedate",
726                         "bVisible": false,
727                     },
728                     {
729                         "iDataSort": 7, // Sort on hidden unformatted issuedate column
730                         "mDataProp": "issuedate_formatted",
731                     },
732                     {
733                         "mDataProp": function ( oObj ) {
734                             return oObj.branchname.escapeHtml();
735                         }
736                     },
737                     {
738                         "mDataProp": function ( oObj ) {
739                             return ( oObj.itemcallnumber ? oObj.itemcallnumber.escapeHtml() : '' );
740                         }
741                     },
742                     {
743                         "mDataProp": function ( oObj ) {
744                             if ( ! oObj.charge ) oObj.charge = 0;
745                             return parseFloat(oObj.charge).toFixed(2);
746                         }
747                     },
748                     {
749                         "mDataProp": function ( oObj ) {
750                             if ( ! oObj.fine ) oObj.fine = 0;
751                             return parseFloat(oObj.fine).toFixed(2);
752                         }
753                     },
754                     {
755                         "mDataProp": function ( oObj ) {
756                             if ( ! oObj.price ) oObj.price = 0;
757                             return parseFloat(oObj.price).toFixed(2);
758                         }
759                     },
760                     {
761                         "mDataProp": function( oObj ) {
762                             return "<a href='/cgi-bin/koha/members/moremember.pl?borrowernumber=" + oObj.borrowernumber + "'>"
763                                 + oObj.borrower.firstname.escapeHtml()
764                                 + " " +
765                                 oObj.borrower.surname.escapeHtml()
766                                 + " (" + oObj.borrower.cardnumber.escapeHtml() + ")</a>"
767                         }
768                     },
769                 ],
770                 "bPaginate": false,
771                 "bProcessing": true,
772                 "bServerSide": false,
773                 "sAjaxSource": '/cgi-bin/koha/svc/checkouts',
774                 "fnServerData": function ( sSource, aoData, fnCallback ) {
775                     $.each(relatives_borrowernumbers, function( index, value ) {
776                         aoData.push( { "name": "borrowernumber", "value": value } );
777                     });
778
779                     $.getJSON( sSource, aoData, function (json) {
780                         fnCallback(json)
781                     } );
782                 },
783             });
784         }
785     });
786
787     if ( $("#relatives-issues-table").length ) {
788         $("#relatives-issues-table_processing").position({
789             of: $( "#relatives-issues-table" ),
790             collision: "none"
791         });
792     }
793
794     if ( AllowRenewalLimitOverride || AllowRenewalOnHoldOverride ) {
795         $( '#override_limit' ).click( function () {
796             if ( this.checked ) {
797                 if ( AllowRenewalLimitOverride ) {
798                     $( '.renewals-allowed' ).show();
799                     $( '.renewals-disabled' ).hide();
800                 }
801                 if ( AllowRenewalOnHoldOverride ) {
802                     $( '.renewals-allowed-on_reserve' ).show();
803                 }
804             } else {
805                 $( '.renewals-allowed' ).hide();
806                 $( '.renewals-allowed-on_reserve' ).hide();
807                 $( '.renewals-disabled' ).show();
808             }
809         } ).prop('checked', false);
810     }
811  });