1 $(document).ready(function() {
2 $.ajaxSetup ({ cache: false });
4 var barcodefield = $("#barcode");
6 // Handle the select all/none links for checkouts table columns
7 $("#CheckAllRenewals").on("click",function(){
8 $("#UncheckAllCheckins").click();
9 $(".renew:visible").prop("checked", true);
12 $("#UncheckAllRenewals").on("click",function(){
13 $(".renew:visible").prop("checked", false);
17 $("#CheckAllCheckins").on("click",function(){
18 $("#UncheckAllRenewals").click();
19 $(".checkin:visible").prop("checked", true);
22 $("#UncheckAllCheckins").on("click",function(){
23 $(".checkin:visible").prop("checked", false);
27 // Don't allow both return and renew checkboxes to be checked
28 $(document).on("change", '.renew', function(){
29 if ( $(this).is(":checked") ) {
30 $( "#checkin_" + $(this).val() ).prop("checked", false);
33 $(document).on("change", '.checkin', function(){
34 if ( $(this).is(":checked") ) {
35 $( "#renew_" + $(this).val() ).prop("checked", false);
39 // Clicking the table cell checks the checkbox inside it
40 $(document).on("click", 'td', function(e){
41 if(e.target.tagName.toLowerCase() == 'td'){
42 $(this).find("input:checkbox:visible").each( function() {
48 // Handle renewals and returns
49 $("#RenewCheckinChecked").on("click",function(){
50 $(".checkin:checked:visible").each(function() {
51 itemnumber = $(this).val();
53 $(this).replaceWith("<img id='checkin_" + itemnumber + "' src='" + interface + "/" + theme + "/img/spinner-small.gif' />");
56 itemnumber: itemnumber,
57 borrowernumber: borrowernumber,
58 branchcode: branchcode,
59 exempt_fine: $("#exemptfine").is(':checked')
62 $.post( "/cgi-bin/koha/svc/checkin", params, function( data ) {
63 id = "#checkin_" + data.itemnumber;
66 if ( data.returned ) {
67 content = CIRCULATION_RETURNED;
68 $(id).parent().parent().addClass('ok');
69 $('#date_due_' + data.itemnumber).html(CIRCULATION_RETURNED);
71 content = CIRCULATION_NOT_RETURNED;
72 $(id).parent().parent().addClass('warn');
75 $(id).replaceWith( content );
79 $(".renew:checked:visible").each(function() {
80 var override_limit = $("#override_limit").is(':checked') ? 1 : 0;
82 var itemnumber = $(this).val();
84 $(this).parent().parent().replaceWith("<img id='renew_" + itemnumber + "' src='" + interface + "/" + theme + "/img/spinner-small.gif' />");
87 itemnumber: itemnumber,
88 borrowernumber: borrowernumber,
89 branchcode: branchcode,
90 override_limit: override_limit,
91 date_due: $("#newduedate").val()
94 $.post( "/cgi-bin/koha/svc/renew", params, function( data ) {
95 var id = "#renew_" + data.itemnumber;
98 if ( data.renew_okay ) {
99 content = CIRCULATION_RENEWED_DUE + " " + data.date_due;
100 $('#date_due_' + data.itemnumber).replaceWith( data.date_due );
102 content = CIRCULATION_RENEW_FAILED + " ";
103 if ( data.error == "no_checkout" ) {
104 content += NOT_CHECKED_OUT;
105 } else if ( data.error == "too_many" ) {
106 content += TOO_MANY_RENEWALS;
107 } else if ( data.error == "on_reserve" ) {
108 content += ON_RESERVE;
109 } else if ( data.error == "restriction" ) {
110 content += NOT_RENEWABLE_RESTRICTION;
111 } else if ( data.error == "overdue" ) {
112 content += NOT_RENEWABLE_OVERDUE;
113 } else if ( data.error ) {
114 content += data.error;
116 content += REASON_UNKNOWN;
120 $(id).replaceWith( content );
124 // Refocus on barcode field if it exists
125 if ( $("#barcode").length ) {
126 $("#barcode").focus();
129 // Prevent form submit
133 $("#RenewAll").on("click",function(){
134 $("#CheckAllRenewals").click();
135 $("#UncheckAllCheckins").click();
136 $("#RenewCheckinChecked").click();
138 // Prevent form submit
142 var ymd = $.datepicker.formatDate('yy-mm-dd', new Date());
144 $('#issues-table').hide();
145 $('#issues-table-actions').hide();
146 $('#issues-table-load-immediately').change(function(){
147 if ( this.checked && typeof issuesTable === 'undefined') {
148 $('#issues-table-load-now-button').click();
150 barcodefield.focus();
152 $('#issues-table-load-now-button').click(function(){
154 barcodefield.focus();
158 if ( $.cookie("issues-table-load-immediately-" + script) == "true" ) {
160 $('#issues-table-load-immediately').prop('checked', true);
162 $('#issues-table-load-immediately').on( "change", function(){
163 $.cookie("issues-table-load-immediately-" + script, $(this).is(':checked'), { expires: 365 });
166 function LoadIssuesTable() {
167 $('#issues-table-loading-message').hide();
168 $('#issues-table').show();
169 $('#issues-table-actions').show();
171 issuesTable = KohaTable("#issues-table", {
173 "sEmptyTable" : MSG_DT_LOADING_RECORDS,
174 "sProcessing": MSG_DT_LOADING_RECORDS,
177 "dom": 'B<"clearfix">rt',
180 "mDataProp": function( oObj ) {
181 return oObj.sort_order;
185 "mDataProp": function( oObj ) {
186 if ( oObj.issued_today ) {
187 return "<strong>" + TODAYS_CHECKOUTS + "</strong>";
189 return "<strong>" + PREVIOUS_CHECKOUTS + "</strong>";
194 "mDataProp": "date_due",
198 "iDataSort": 2, // Sort on hidden unformatted date due column
199 "mDataProp": function( oObj ) {
200 var due = oObj.date_due_formatted;
202 if ( oObj.date_due_overdue ) {
203 due = "<span class='overdue'>" + due + "</span>";
206 due = "<span id='date_due_" + oObj.itemnumber + "' class='date_due'>" + due + "</span>";
209 due += "<span class='lost'>" + oObj.lost + "</span>";
212 if ( oObj.damaged ) {
213 due += "<span class='dmg'>" + oObj.damaged + "</span>";
221 "mDataProp": function ( oObj ) {
222 title = "<span class='strong'><a href='/cgi-bin/koha/catalogue/detail.pl?biblionumber="
227 $.each(oObj.subtitle, function( index, value ) {
228 title += " " + value.subfield;
231 if ( oObj.enumchron ) {
232 title += " (" + oObj.enumchron + ")";
235 title += "</a></span>";
238 title += " " + BY.replace( "_AUTHOR_", " " + oObj.author );
241 if ( oObj.itemnotes ) {
243 if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
244 span_class = "circ-hlt";
246 title += " - <span class='" + span_class + "'>" + oObj.itemnotes + "</span>"
249 if ( oObj.itemnotes_nonpublic ) {
251 if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
252 span_class = "circ-hlt";
254 title += " - <span class='" + span_class + "'>" + oObj.itemnotes_nonpublic + "</span>"
257 var onsite_checkout = '';
258 if ( oObj.onsite_checkout == 1 ) {
259 onsite_checkout += " <span class='onsite_checkout'>(" + INHOUSE_USE + ")</span>";
263 + "<a href='/cgi-bin/koha/catalogue/moredetail.pl?biblionumber="
278 { "mDataProp": "itemtype_description" },
279 { "mDataProp": "location" },
280 { "mDataProp": "homebranch" },
281 { "mDataProp": "issuedate_formatted" },
282 { "mDataProp": "branchname" },
283 { "mDataProp": "itemcallnumber" },
285 "mDataProp": function ( oObj ) {
286 if ( ! oObj.charge ) oObj.charge = 0;
287 return '<span style="text-align: right; display: block;">' + parseFloat(oObj.charge).toFixed(2) + '<span>';
291 "mDataProp": function ( oObj ) {
292 if ( ! oObj.fine ) oObj.fine = 0;
293 return '<span style="text-align: right; display: block;">' + parseFloat(oObj.fine).toFixed(2) + '<span>';
297 "mDataProp": function ( oObj ) {
298 if ( ! oObj.price ) oObj.price = 0;
299 return '<span style="text-align: right; display: block;">' + parseFloat(oObj.price).toFixed(2) + '<span>';
304 "bVisible": AllowCirculate ? true : false,
305 "mDataProp": function ( oObj ) {
311 content += "<span style='padding: 0 1em;'>" + oObj.renewals_count + "</span>";
313 if ( oObj.can_renew ) {
315 } else if ( oObj.can_renew_error == "on_reserve" ) {
316 content += "<span class='renewals-disabled-no-override'>"
317 + "<a href='/cgi-bin/koha/reserve/request.pl?biblionumber=" + oObj.biblionumber + "'>" + ON_HOLD + "</a>"
320 span_style = "display: none";
321 span_class = "renewals-allowed";
322 } else if ( oObj.can_renew_error == "too_many" ) {
323 content += "<span class='renewals-disabled'>"
327 span_style = "display: none";
328 span_class = "renewals-allowed";
329 } else if ( oObj.can_renew_error == "restriction" ) {
330 content += "<span class='renewals-disabled'>"
331 + NOT_RENEWABLE_RESTRICTION
334 span_style = "display: none";
335 span_class = "renewals-allowed";
336 } else if ( oObj.can_renew_error == "overdue" ) {
337 content += "<span class='renewals-disabled'>"
338 + NOT_RENEWABLE_OVERDUE
341 span_style = "display: none";
342 span_class = "renewals-allowed";
343 } else if ( oObj.can_renew_error == "too_soon" ) {
344 content += "<span class='renewals-disabled'>"
345 + NOT_RENEWABLE_TOO_SOON.format( oObj.can_renew_date )
348 span_style = "display: none";
349 span_class = "renewals-allowed";
350 } else if ( oObj.can_renew_error == "auto_too_soon" ) {
351 content += "<span class='renewals-disabled'>"
352 + NOT_RENEWABLE_AUTO_TOO_SOON
355 span_style = "display: none";
356 span_class = "renewals-allowed";
357 } else if ( oObj.can_renew_error == "auto_too_late" ) {
358 content += "<span class='renewals-disabled'>"
359 + NOT_RENEWABLE_AUTO_TOO_LATE
362 span_style = "display: none";
363 span_class = "renewals-allowed";
364 } else if ( oObj.can_renew_error == "auto_renew" ) {
365 content += "<span class='renewals-disabled'>"
366 + NOT_RENEWABLE_AUTO_RENEW
369 span_style = "display: none";
370 span_class = "renewals-allowed";
371 } else if ( oObj.can_renew_error == "onsite_checkout" ) {
372 // Don't display something if it's an onsite checkout
374 content += "<span class='renewals-disabled'>"
375 + oObj.can_renew_error
378 span_style = "display: none";
379 span_class = "renewals-allowed";
382 var can_force_renew = ( oObj.onsite_checkout == 0 ) && ( oObj.can_renew_error != "on_reserve" );
383 var can_renew = ( oObj.renewals_remaining > 0 && !oObj.can_renew_error );
384 if ( can_renew || can_force_renew ) {
385 content += "<span class='" + span_class + "' style='" + span_style + "'>"
386 + "<input type='checkbox' ";
387 if ( oObj.date_due_overdue && can_renew ) {
388 content += "checked='checked' ";
390 content += "class='renew' id='renew_" + oObj.itemnumber + "' name='renew' value='" + oObj.itemnumber +"'/>"
393 content += "<span class='renewals'>("
394 + RENEWALS_REMAINING.format( oObj.renewals_remaining, oObj.renewals_allowed )
398 content += "</span>";
405 "bVisible": AllowCirculate ? true : false,
406 "mDataProp": function ( oObj ) {
407 if ( oObj.can_renew_error == "on_reserve" ) {
408 return "<a href='/cgi-bin/koha/reserve/request.pl?biblionumber=" + oObj.biblionumber + "'>" + ON_HOLD + "</a>";
410 return "<input type='checkbox' class='checkin' id='checkin_" + oObj.itemnumber + "' name='checkin' value='" + oObj.itemnumber +"'></input>";
415 "bVisible": exports_enabled ? true : false,
417 "mDataProp": function ( oObj ) {
418 var s = "<input type='checkbox' name='itemnumbers' value='" + oObj.itemnumber + "' style='visibility:hidden;' />";
420 s += "<input type='checkbox' class='export' id='export_" + oObj.biblionumber + "' name='biblionumbers' value='" + oObj.biblionumber + "' />";
425 "fnFooterCallback": function ( nRow, aaData, iStart, iEnd, aiDisplay ) {
426 var total_charge = 0;
429 for ( var i=0; i < aaData.length; i++ ) {
430 total_charge += aaData[i]['charge'] * 1;
431 total_fine += aaData[i]['fine'] * 1;
432 total_price += aaData[i]['price'] * 1;
434 $("#totaldue").html(total_charge.toFixed(2));
435 $("#totalfine").html(total_fine.toFixed(2));
436 $("#totalprice").html(total_price.toFixed(2));
440 "bServerSide": false,
441 "sAjaxSource": '/cgi-bin/koha/svc/checkouts',
442 "fnServerData": function ( sSource, aoData, fnCallback ) {
443 aoData.push( { "name": "borrowernumber", "value": borrowernumber } );
445 $.getJSON( sSource, aoData, function (json) {
449 "fnInitComplete": function(oSettings) {
450 // Disable rowGrouping plugin after first use
451 // so any sorting on the table doesn't use it
452 var oSettings = issuesTable.fnSettings();
454 for (f = 0; f < oSettings.aoDrawCallback.length; f++) {
455 if (oSettings.aoDrawCallback[f].sName == 'fnRowGrouping') {
456 oSettings.aoDrawCallback.splice(f, 1);
461 oSettings.aaSortingFixed = null;
463 }, columns_settings).rowGrouping(
465 iGroupingColumnIndex: 1,
466 iGroupingOrderByColumnIndex: 0,
467 sGroupingColumnSortDirection: "asc"
471 if ( $("#issues-table").length ) {
472 $("#issues-table_processing").position({
473 of: $( "#issues-table" ),
479 // Don't load relatives' issues table unless it is clicked on
480 var relativesIssuesTable;
481 $("#relatives-issues-tab").click( function() {
482 if ( ! relativesIssuesTable ) {
483 relativesIssuesTable = $("#relatives-issues-table").dataTable({
489 "mDataProp": "date_due",
493 "iDataSort": 1, // Sort on hidden unformatted date due column
494 "mDataProp": function( oObj ) {
495 var today = new Date();
496 var due = new Date( oObj.date_due );
498 return "<span class='overdue'>" + oObj.date_due_formatted + "</span>";
500 return oObj.date_due_formatted;
505 "mDataProp": function ( oObj ) {
506 title = "<span class='strong'><a href='/cgi-bin/koha/catalogue/detail.pl?biblionumber="
511 $.each(oObj.subtitle, function( index, value ) {
512 title += " " + value.subfield;
515 if ( oObj.enumchron ) {
516 title += " (" + oObj.enumchron + ")";
519 title += "</a></span>";
522 title += " " + BY.replace( "_AUTHOR_", " " + oObj.author );
525 if ( oObj.itemnotes ) {
527 if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
528 span_class = "circ-hlt";
530 title += " - <span class='" + span_class + "'>" + oObj.itemnotes + "</span>"
533 if ( oObj.itemnotes_nonpublic ) {
535 if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
536 span_class = "circ-hlt";
538 title += " - <span class='" + span_class + "'>" + oObj.itemnotes_nonpublic + "</span>"
541 var onsite_checkout = '';
542 if ( oObj.onsite_checkout == 1 ) {
543 onsite_checkout += " <span class='onsite_checkout'>(" + INHOUSE_USE + ")</span>";
547 + "<a href='/cgi-bin/koha/catalogue/moredetail.pl?biblionumber="
562 { "mDataProp": "itemtype" },
563 { "mDataProp": "location" },
564 { "mDataProp": "issuedate_formatted" },
565 { "mDataProp": "branchname" },
566 { "mDataProp": "itemcallnumber" },
568 "mDataProp": function ( oObj ) {
569 if ( ! oObj.charge ) oObj.charge = 0;
570 return parseFloat(oObj.charge).toFixed(2);
574 "mDataProp": function ( oObj ) {
575 if ( ! oObj.fine ) oObj.fine = 0;
576 return parseFloat(oObj.fine).toFixed(2);
580 "mDataProp": function ( oObj ) {
581 if ( ! oObj.price ) oObj.price = 0;
582 return parseFloat(oObj.price).toFixed(2);
586 "mDataProp": function( oObj ) {
587 return "<a href='/cgi-bin/koha/members/moremember.pl?borrowernumber=" + oObj.borrowernumber + "'>"
588 + oObj.borrower.firstname + " " + oObj.borrower.surname + " (" + oObj.borrower.cardnumber + ")</a>"
594 "bServerSide": false,
595 "sAjaxSource": '/cgi-bin/koha/svc/checkouts',
596 "fnServerData": function ( sSource, aoData, fnCallback ) {
597 $.each(relatives_borrowernumbers, function( index, value ) {
598 aoData.push( { "name": "borrowernumber", "value": value } );
601 $.getJSON( sSource, aoData, function (json) {
609 if ( $("#relatives-issues-table").length ) {
610 $("#relatives-issues-table_processing").position({
611 of: $( "#relatives-issues-table" ),
616 if ( AllowRenewalLimitOverride ) {
617 $( '#override_limit' ).click( function () {
618 if ( this.checked ) {
619 $( '.renewals-allowed' ).show(); $( '.renewals-disabled' ).hide();
621 $( '.renewals-allowed' ).hide(); $( '.renewals-disabled' ).show();
623 } ).prop('checked', false);