Bug 11577: Code and intranet template changes
[koha.git] / koha-tmpl / intranet-tmpl / prog / en / js / checkouts.js
1 $(document).ready(function() {
2     $.ajaxSetup ({ cache: false });
3
4     // Handle the select all/none links for checkouts table columns
5     $("#CheckAllRenewals").on("click",function(){
6         $("#UncheckAllCheckins").click();
7         $(".renew:visible").attr("checked", "checked" );
8         return false;
9     });
10     $("#UncheckAllRenewals").on("click",function(){
11         $(".renew:visible").removeAttr("checked");
12         return false;
13     });
14
15     $("#CheckAllCheckins").on("click",function(){
16         $("#UncheckAllRenewals").click();
17         $(".checkin:visible").attr("checked", "checked" );
18         return false;
19     });
20     $("#UncheckAllCheckins").on("click",function(){
21         $(".checkin:visible").removeAttr("checked");
22         return false;
23     });
24
25     // Don't allow both return and renew checkboxes to be checked
26     $(document).on("change", '.renew', function(){
27         if ( $(this).is(":checked") ) {
28             $( "#checkin_" + $(this).val() ).removeAttr("checked");
29         }
30     });
31     $(document).on("change", '.checkin', function(){
32         if ( $(this).is(":checked") ) {
33             $( "#renew_" + $(this).val() ).removeAttr("checked");
34         }
35     });
36
37     // Clicking the table cell checks the checkbox inside it
38     $(document).on("click", 'td', function(e){
39         if(e.target.tagName.toLowerCase() == 'td'){
40           $(this).find("input:checkbox:visible").each( function() {
41             $(this).click();
42           });
43         }
44     });
45
46     // Handle renewals and returns
47     $("#RenewCheckinChecked").on("click",function(){
48         $(".checkin:checked:visible").each(function() {
49             itemnumber = $(this).val();
50
51             $(this).replaceWith("<img id='checkin_" + itemnumber + "' src='" + interface + "/" + theme + "/img/loading-small.gif' />");
52
53             params = {
54                 itemnumber:     itemnumber,
55                 borrowernumber: borrowernumber,
56                 branchcode:     branchcode,
57                 exempt_fine:    $("#exemptfine").is(':checked')
58             };
59
60             $.post( "/cgi-bin/koha/svc/checkin", params, function( data ) {
61                 id = "#checkin_" + data.itemnumber;
62
63                 content = "";
64                 if ( data.returned ) {
65                     content = CIRCULATION_RETURNED;
66                 } else {
67                     content = CIRCULATION_NOT_RETURNED;
68                 }
69
70                 $(id).replaceWith( content );
71             }, "json")
72         });
73
74         $(".renew:checked:visible").each(function() {
75             var override_limit = $("#override_limit").is(':checked') ? 1 : 0;
76
77             var itemnumber = $(this).val();
78
79             $(this).parent().parent().replaceWith("<img id='renew_" + itemnumber + "' src='" + interface + "/" + theme + "/img/loading-small.gif' />");
80
81             var params = {
82                 itemnumber:     itemnumber,
83                 borrowernumber: borrowernumber,
84                 branchcode:     branchcode,
85                 override_limit: override_limit,
86                 date_due:       $("#newduedate").val()
87             };
88
89             $.post( "/cgi-bin/koha/svc/renew", params, function( data ) {
90                 var id = "#renew_" + data.itemnumber;
91
92                 var content = "";
93                 if ( data.renew_okay ) {
94                     content = CIRCULATION_RENEWED_DUE + " " + data.date_due;
95                 } else {
96                     content = CIRCULATION_RENEW_FAILED + " ";
97                     if ( data.error == "no_checkout" ) {
98                         content += NOT_CHECKED_OUT;
99                     } else if ( data.error == "too_many" ) {
100                         content += TOO_MANY_RENEWALS;
101                     } else if ( data.error == "on_reserve" ) {
102                         content += ON_RESERVE;
103                     } else if ( data.error ) {
104                         content += data.error;
105                     } else {
106                         content += REASON_UNKNOWN;
107                     }
108                 }
109
110                 $(id).replaceWith( content );
111             }, "json")
112         });
113
114         // Prevent form submit
115         return false;
116     });
117
118     $("#RenewAll").on("click",function(){
119         $("#CheckAllRenewals").click();
120         $("#UncheckAllCheckins").click();
121         $("#RenewCheckinChecked").click();
122
123         // Prevent form submit
124         return false;
125     });
126
127     var ymd = $.datepicker.formatDate('yy-mm-dd', new Date());
128
129     var issuesTable;
130     var drawn = 0;
131     issuesTable = $("#issues-table").dataTable({
132         "oLanguage": {
133             "sEmptyTable" : MSG_DT_LOADING_RECORDS,
134         },
135         "bAutoWidth": false,
136         "sDom": "<'row-fluid'<'span6'><'span6'>r>t<'row-fluid'>t",
137         "aoColumns": [
138             {
139                 "mDataProp": function( oObj ) {
140                     if ( oObj.issued_today ) {
141                         return "0";
142                     } else {
143                         return "100";
144                     }
145                 }
146             },
147             {
148                 "mDataProp": function( oObj ) {
149                     if ( oObj.issued_today ) {
150                         return "<strong>" + TODAYS_CHECKOUTS + "</strong>";
151                     } else {
152                         return "<strong>" + PREVIOUS_CHECKOUTS + "</strong>";
153                     }
154                 }
155             },
156             {
157                 "mDataProp": "date_due",
158                 "bVisible": false,
159             },
160             {
161                 "iDataSort": 1, // Sort on hidden unformatted date due column
162                 "mDataProp": function( oObj ) {
163                     if ( oObj.date_due_overdue ) {
164                         return "<span class='overdue'>" + oObj.date_due_formatted + "</span>";
165                     } else {
166                         return oObj.date_due_formatted;
167                     }
168                 }
169             },
170             {
171                 "mDataProp": function ( oObj ) {
172                     title = "<span class='strong'><a href='/cgi-bin/koha/catalogue/detail.pl?biblionumber="
173                           + oObj.biblionumber
174                           + "'>"
175                           + oObj.title;
176
177                     $.each(oObj.subtitle, function( index, value ) {
178                               title += " " + value.subfield;
179                     });
180
181                     title += "</a></span>";
182
183                     if ( oObj.author ) {
184                         title += " " + BY.replace( "_AUTHOR_",  " " + oObj.author );
185                     }
186
187                     if ( oObj.itemnotes ) {
188                         var span_class = "";
189                         if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
190                             span_class = "circ-hlt";
191                         }
192                         title += " - <span class='" + span_class + "'>" + oObj.itemnotes + "</span>"
193                     }
194
195                     title += " "
196                           + "<a href='/cgi-bin/koha/catalogue/moredetail.pl?biblionumber="
197                           + oObj.biblionumber
198                           + "&itemnumber="
199                           + oObj.itemnumber
200                           + "#"
201                           + oObj.itemnumber
202                           + "'>"
203                           + oObj.barcode
204                           + "</a>";
205
206                     return title;
207                 }
208             },
209             { "mDataProp": "itemtype" },
210             { "mDataProp": "issuedate_formatted" },
211             { "mDataProp": "branchname" },
212             { "mDataProp": "itemcallnumber" },
213             {
214                 "mDataProp": function ( oObj ) {
215                     if ( ! oObj.charge ) oObj.charge = 0;
216                     return parseFloat(oObj.charge).toFixed(2);
217                 }
218             },
219             {
220                 "mDataProp": function ( oObj ) {
221                     if ( ! oObj.price ) oObj.price = 0;
222                     return parseFloat(oObj.price).toFixed(2);
223                 }
224             },
225             {
226                 "bSortable": false,
227                 "mDataProp": function ( oObj ) {
228                     var content = "";
229                     var span_style = "";
230                     var span_class = "";
231
232                     content += "<span>";
233                     content += "<span style='padding: 0 1em;'>" + oObj.renewals_count + "</span>";
234
235                     if ( oObj.can_renew ) {
236                         // Do nothing
237                     } else if ( oObj.can_renew_error == "on_reserve" ) {
238                         content += "<span class='renewals-disabled'>"
239                                 + "<a href='/cgi-bin/koha/reserve/request.pl?biblionumber=" + oObj.biblionumber + "'>" + ON_HOLD + "</a>"
240                                 + "</span>";
241
242                         span_style = "display: none";
243                         span_class = "renewals-allowed";
244                     } else if ( oObj.can_renew_error == "too_many" ) {
245                         content += "<span class='renewals-disabled'>"
246                                 + NOT_RENEWABLE
247                                 + "</span>";
248
249                         span_style = "display: none";
250                         span_class = "renewals-allowed";
251                     } else if ( oObj.can_renew_error == "too_soon" ) {
252                         content += "<span class='renewals-disabled'>"
253                                 + NOT_RENEWABLE_TOO_SOON.format( oObj.can_renew_date )
254                                 + "</span>";
255
256                         span_style = "display: none";
257                         span_class = "renewals-allowed";
258                     } else if ( oObj.can_renew_error == "auto_too_soon" ) {
259                         content += "<span class='renewals-disabled'>"
260                                 + NOT_RENEWABLE_AUTO_TOO_SOON
261                                 + "</span>";
262
263                         span_style = "display: none";
264                         span_class = "renewals-allowed";
265                     } else if ( oObj.can_renew_error == "auto_renew" ) {
266                         content += "<span class='renewals-disabled'>"
267                                 + NOT_RENEWABLE_AUTO_RENEW
268                                 + "</span>";
269
270                         span_style = "display: none";
271                         span_class = "renewals-allowed";
272                     } else {
273                         content += "<span class='renewals-disabled'>"
274                                 + oObj.can_renew_error
275                                 + "</span>";
276
277                         span_style = "display: none";
278                         span_class = "renewals-allowed";
279                     }
280
281                     content += "<span class='" + span_class + "' style='" + span_style + "'>"
282                             +  "<input type='checkbox' class='renew' id='renew_" + oObj.itemnumber + "' name='renew' value='" + oObj.itemnumber +"'/>"
283                             +  "</span>";
284
285                     if ( oObj.renewals_remaining ) {
286                         content += "<span class='renewals'>("
287                                 + RENEWALS_REMAINING.format( oObj.renewals_remaining, oObj.renewals_allowed )
288                                 + ")</span>";
289                     }
290
291                     content += "</span>";
292
293
294                     return content;
295                 }
296             },
297             {
298                 "bSortable": false,
299                 "mDataProp": function ( oObj ) {
300                     if ( oObj.can_renew_error == "on_reserve" ) {
301                         return "<a href='/cgi-bin/koha/reserve/request.pl?biblionumber=" + oObj.biblionumber + "'>" + ON_HOLD + "</a>";
302                     } else {
303                         return "<input type='checkbox' class='checkin' id='checkin_" + oObj.itemnumber + "' name='checkin' value='" + oObj.itemnumber +"'></input>";
304                     }
305                 }
306             },
307             {
308                 "bVisible": exports_enabled ? true : false,
309                 "bSortable": false,
310                 "mDataProp": function ( oObj ) {
311                     return "<input type='checkbox' class='export' id='export_" + oObj.biblionumber + "' name='biblionumbers' value='" + oObj.biblionumber + "' />";
312                 }
313             }
314         ],
315         "fnFooterCallback": function ( nRow, aaData, iStart, iEnd, aiDisplay ) {
316             var total_charge = 0;
317             var total_price = 0;
318             for ( var i=0; i < aaData.length; i++ ) {
319                 total_charge += aaData[i]['charge'] * 1;
320                 total_price  += aaData[i]['price'] * 1;
321             }
322             var nCells = nRow.getElementsByTagName('td');
323             nCells[1].innerHTML = total_charge.toFixed(2);
324             nCells[2].innerHTML = total_price.toFixed(2);
325         },
326         "bPaginate": false,
327         "bProcessing": true,
328         "bServerSide": false,
329         "sAjaxSource": '/cgi-bin/koha/svc/checkouts',
330         "fnServerData": function ( sSource, aoData, fnCallback ) {
331             aoData.push( { "name": "borrowernumber", "value": borrowernumber } );
332
333             $.getJSON( sSource, aoData, function (json) {
334                 fnCallback(json)
335             } );
336         },
337         "fnInitComplete": function(oSettings) {
338             // Disable rowGrouping plugin after first use
339             // so any sorting on the table doesn't use it
340             var oSettings = issuesTable.fnSettings();
341
342             for (f = 0; f < oSettings.aoDrawCallback.length; f++) {
343                 if (oSettings.aoDrawCallback[f].sName == 'fnRowGrouping') {
344                     oSettings.aoDrawCallback.splice(f, 1);
345                     break;
346                 }
347             }
348
349             oSettings.aaSortingFixed = null;
350         },
351     }).rowGrouping(
352         {
353             iGroupingColumnIndex: 1,
354             iGroupingOrderByColumnIndex: 0,
355             sGroupingColumnSortDirection: "asc"
356         }
357     );
358
359     if ( $("#issues-table").length ) {
360         $("#issues-table_processing").position({
361             of: $( "#issues-table" ),
362             collision: "none"
363         });
364     }
365
366     // Don't load relatives' issues table unless it is clicked on
367     var relativesIssuesTable;
368     $("#relatives-issues-tab").click( function() {
369         if ( ! relativesIssuesTable ) {
370             relativesIssuesTable = $("#relatives-issues-table").dataTable({
371                 "bAutoWidth": false,
372                 "sDom": "<'row-fluid'<'span6'><'span6'>r>t<'row-fluid'>t",
373                 "aaSorting": [],
374                 "aoColumns": [
375                     {
376                         "mDataProp": "date_due",
377                         "bVisible": false,
378                     },
379                     {
380                         "iDataSort": 1, // Sort on hidden unformatted date due column
381                         "mDataProp": function( oObj ) {
382                             var today = new Date();
383                             var due = new Date( oObj.date_due );
384                             if ( today > due ) {
385                                 return "<span class='overdue'>" + oObj.date_due_formatted + "</span>";
386                             } else {
387                                 return oObj.date_due_formatted;
388                             }
389                         }
390                     },
391                     {
392                         "mDataProp": function ( oObj ) {
393                             title = "<span class='strong'><a href='/cgi-bin/koha/catalogue/detail.pl?biblionumber="
394                                   + oObj.biblionumber
395                                   + "'>"
396                                   + oObj.title;
397
398                             $.each(oObj.subtitle, function( index, value ) {
399                                       title += " " + value.subfield;
400                             });
401
402                             title += "</a></span>";
403
404                             if ( oObj.author ) {
405                                 title += " " + BY + " " + oObj.author;
406                             }
407
408                             if ( oObj.itemnotes ) {
409                                 var span_class = "";
410                                 if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
411                                     span_class = "circ-hlt";
412                                 }
413                                 title += " - <span class='" + span_class + "'>" + oObj.itemnotes + "</span>"
414                             }
415
416                             title += " "
417                                   + "<a href='/cgi-bin/koha/catalogue/moredetail.pl?biblionumber="
418                                   + oObj.biblionumber
419                                   + "&itemnumber="
420                                   + oObj.itemnumber
421                                   + "#"
422                                   + oObj.itemnumber
423                                   + "'>"
424                                   + oObj.barcode
425                                   + "</a>";
426
427                             return title;
428                         }
429                     },
430                     { "mDataProp": "itemtype" },
431                     { "mDataProp": "issuedate_formatted" },
432                     { "mDataProp": "branchname" },
433                     { "mDataProp": "itemcallnumber" },
434                     {
435                         "mDataProp": function ( oObj ) {
436                             if ( ! oObj.charge ) oObj.charge = 0;
437                             return parseFloat(oObj.charge).toFixed(2);
438                         }
439                     },
440                     {
441                         "mDataProp": function ( oObj ) {
442                             if ( ! oObj.price ) oObj.price = 0;
443                             return parseFloat(oObj.price).toFixed(2);
444                         }
445                     },
446                     {
447                         "mDataProp": function( oObj ) {
448                             return "<a href='/cgi-bin/koha/members/moremember.pl?borrowernumber=" + oObj.borrowernumber + "'>"
449                                  + oObj.borrower.firstname + " " + oObj.borrower.surname + " (" + oObj.borrower.cardnumber + ")</a>"
450                         }
451                     },
452                 ],
453                 "bPaginate": false,
454                 "bProcessing": true,
455                 "bServerSide": false,
456                 "sAjaxSource": '/cgi-bin/koha/svc/checkouts',
457                 "fnServerData": function ( sSource, aoData, fnCallback ) {
458                     $.each(relatives_borrowernumbers, function( index, value ) {
459                         aoData.push( { "name": "borrowernumber", "value": value } );
460                     });
461
462                     $.getJSON( sSource, aoData, function (json) {
463                         fnCallback(json)
464                     } );
465                 },
466             });
467         }
468     });
469
470     if ( $("#relatives-issues-table").length ) {
471         $("#relatives-issues-table_processing").position({
472             of: $( "#relatives-issues-table" ),
473             collision: "none"
474         });
475     }
476
477     if ( AllowRenewalLimitOverride ) {
478         $( '#override_limit' ).click( function () {
479             if ( this.checked ) {
480                 $( '.renewals-allowed' ).show(); $( '.renewals-disabled' ).hide();
481             } else {
482                 $( '.renewals-allowed' ).hide(); $( '.renewals-disabled' ).show();
483             }
484         } ).attr( 'checked', false );
485     }
486  });