]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/patron/items.js
rework the parameters for circ.util.renew_via_barcode so that we can more easily...
[Evergreen.git] / Open-ILS / xul / staff_client / server / patron / items.js
1 dump('entering patron.items.js\n');
2
3 function $(id) { return document.getElementById(id); }
4
5 if (typeof patron == 'undefined') patron = {};
6 patron.items = function (params) {
7
8         JSAN.use('util.error'); this.error = new util.error();
9         JSAN.use('util.network'); this.network = new util.network();
10         JSAN.use('OpenILS.data'); this.data = new OpenILS.data(); this.data.init({'via':'stash'});
11 }
12
13 patron.items.prototype = {
14
15         'list_circ_map' : {},
16
17         'init' : function( params ) {
18
19                 var obj = this;
20
21                 obj.patron_id = params['patron_id'];
22
23                 obj.init_lists();
24
25                 JSAN.use('util.controller'); obj.controller = new util.controller();
26                 obj.controller.init(
27                         {
28                                 'control_map' : {
29                                         'save_columns' : [ [ 'command' ], function() { obj.list.save_columns(); } ],
30                                         'save_columns2' : [ [ 'command' ], function() { obj.list2.save_columns(); } ],
31                                         'cmd_broken' : [ ['command'], function() { alert('Not Yet Implemented'); } ],
32                                         'sel_clip' : [ ['command'], function() { obj.list.clipboard(); } ],
33                                         'sel_clip2' : [ ['command'], function() { obj.list2.clipboard(); } ],
34                                         'sel_patron' : [ ['command'], function() { JSAN.use('circ.util'); circ.util.show_last_few_circs(obj.retrieve_ids); } ],
35                                         'sel_bucket' : [
36                                                 ['command'],
37                                                 function() {
38                                                         JSAN.use('cat.util');
39                                                         cat.util.add_copies_to_bucket(util.functional.map_list( obj.retrieve_ids, function(o) { return o.copy_id; } ) );
40                                                 }
41                                         ],
42                                         'sel_bucket2' : [
43                                                 ['command'],
44                                                 function() {
45                                                         JSAN.use('cat.util');
46                                                         cat.util.add_copies_to_bucket(util.functional.map_list( obj.retrieve_ids2, function(o) { return o.copy_id; } ) );
47                                                 }
48                                         ],
49                                         'sel_mark_items_damaged' : [
50                                                 ['command'],
51                                                 function() {
52                                                         JSAN.use('cat.util'); JSAN.use('util.functional');
53                                                         cat.util.mark_item_damaged( util.functional.map_list( obj.retrieve_ids, function(o) { return o.copy_id; } ) );
54                                                 }
55                                         ],
56                                         'sel_mark_items_missing' : [
57                                                 ['command'],
58                                                 function() {
59                                                         JSAN.use('cat.util'); JSAN.use('util.functional');
60                                                         cat.util.mark_item_missing( util.functional.map_list( obj.retrieve_ids, function(o) { return o.copy_id; } ) );
61                                                 }
62                                         ],
63                                         'sel_mark_items_damaged2' : [
64                                                 ['command'],
65                                                 function() {
66                                                         JSAN.use('cat.util'); JSAN.use('util.functional');
67                                                         cat.util.mark_item_damaged( util.functional.map_list( obj.retrieve_ids2, function(o) { return o.copy_id; } ) );
68                                                 }
69                                         ],
70                                         'sel_mark_items_missing2' : [
71                                                 ['command'],
72                                                 function() {
73                                                         JSAN.use('cat.util'); JSAN.use('util.functional');
74                                                         cat.util.mark_item_missing( util.functional.map_list( obj.retrieve_ids2, function(o) { return o.copy_id; } ) );
75                                                 }
76                                         ],
77                                         'sel_copy_details' : [ ['command'],
78                                                 function() {
79                                                         JSAN.use('circ.util');
80                                                         for (var i = 0; i < obj.retrieve_ids.length; i++) { circ.util.show_copy_details( obj.retrieve_ids[i].copy_id ); }
81                                                 }
82                                         ],
83                                         'sel_patron2' : [ ['command'], function() { JSAN.use('circ.util'); circ.util.show_last_few_circs(obj.retrieve_ids2); } ],
84                                         'sel_copy_details2' : [ ['command'],
85                                                 function() {
86                                                         JSAN.use('circ.util');
87                                                         for (var i = 0; i < obj.retrieve_ids2.length; i++) { circ.util.show_copy_details( obj.retrieve_ids2[i].copy_id ); }
88                                                 }
89                                         ],
90                                         'cmd_items_print' : [ ['command'], function() { obj.items_print(1); } ],
91                                         'cmd_items_print2' : [ ['command'], function() { obj.items_print(2); } ],
92                                         'cmd_items_export' : [ ['command'], function() { obj.items_export(1); } ],
93                                         'cmd_items_export2' : [ ['command'], function() { obj.items_export(2); } ],
94                                         'cmd_items_renew' : [ ['command'], function() { obj.items_renew(1); /* obj.retrieve();*/ } ],
95                                         'cmd_items_renew_all' : [ ['command'], function() { obj.items_renew_all(); } ],
96                                         'cmd_items_renew2' : [ ['command'], function() { obj.items_renew(2); /* obj.retrieve();*/ } ],
97                                         'cmd_items_edit' : [ ['command'], function() { obj.items_edit(1);  /*obj.retrieve();*/ } ],
98                                         'cmd_items_edit2' : [ ['command'], function() { obj.items_edit(2);  /*obj.retrieve();*/ } ],
99                                         'cmd_items_mark_lost' : [ ['command'], function() { obj.items_mark_lost(1);  /*obj.retrieve();*/ } ],
100                                         'cmd_items_mark_lost2' : [ ['command'], function() { obj.items_mark_lost(2);  /*obj.retrieve();*/ } ],
101                                         'cmd_items_claimed_returned' : [ ['command'], function() { obj.items_claimed_returned(1);  /*obj.retrieve();*/ } ],
102                                         'cmd_items_claimed_returned2' : [ ['command'], function() { obj.items_claimed_returned(2);  /*obj.retrieve();*/ } ],
103                                         'cmd_items_checkin' : [ ['command'], function() { obj.items_checkin(1);  /*obj.retrieve();*/ } ],
104                                         'cmd_items_checkin2' : [ ['command'], function() { obj.items_checkin(2);  /*obj.retrieve();*/ } ],
105                                         'cmd_show_catalog' : [ ['command'], function() { obj.show_catalog(1); } ],
106                                         'cmd_show_catalog2' : [ ['command'], function() { obj.show_catalog(2); } ],
107                                         'cmd_add_billing' : [ ['command'], function() { obj.add_billing(1);  /*obj.retrieve();*/ } ],
108                                         'cmd_add_billing2' : [ ['command'], function() { obj.add_billing(2);  /*obj.retrieve();*/ } ],
109                                         'cmd_show_noncats' : [ ['command'], function() { obj.show_noncats(); } ]
110                                 }
111                         }
112                 );
113
114                 obj.retrieve();
115
116                 obj.controller.view.sel_mark_items_damaged.setAttribute('disabled','true');
117                 obj.controller.view.sel_mark_items_missing.setAttribute('disabled','true');
118                 obj.controller.view.sel_mark_items_damaged2.setAttribute('disabled','true');
119                 obj.controller.view.sel_mark_items_missing2.setAttribute('disabled','true');
120                 obj.controller.view.sel_clip.setAttribute('disabled','true');
121                 obj.controller.view.sel_clip2.setAttribute('disabled','true');
122                 obj.controller.view.sel_bucket.setAttribute('disabled','true');
123                 obj.controller.view.sel_bucket2.setAttribute('disabled','true');
124                 obj.controller.view.sel_copy_details.setAttribute('disabled','true');
125                 obj.controller.view.sel_patron.setAttribute('disabled','true');
126                 obj.controller.view.sel_copy_details2.setAttribute('disabled','true');
127                 obj.controller.view.sel_patron2.setAttribute('disabled','true');
128                 obj.controller.view.cmd_items_claimed_returned.setAttribute('disabled','true');
129                 obj.controller.view.cmd_items_renew.setAttribute('disabled','true');
130                 obj.controller.view.cmd_items_checkin.setAttribute('disabled','true');
131                 obj.controller.view.cmd_items_edit.setAttribute('disabled','true');
132                 obj.controller.view.cmd_items_mark_lost.setAttribute('disabled','true');
133                 obj.controller.view.cmd_show_catalog.setAttribute('disabled','true');
134                 obj.controller.view.cmd_items_claimed_returned2.setAttribute('disabled','true');
135                 obj.controller.view.cmd_items_renew2.setAttribute('disabled','true');
136                 obj.controller.view.cmd_items_checkin2.setAttribute('disabled','true');
137                 obj.controller.view.cmd_items_edit2.setAttribute('disabled','true');
138                 obj.controller.view.cmd_items_mark_lost2.setAttribute('disabled','true');
139                 obj.controller.view.cmd_show_catalog2.setAttribute('disabled','true');
140         },
141
142         'show_noncats' : function() {
143                 var obj = this; var checkout = {};
144                 try {
145                         var robj = obj.network.simple_request('FM_ANCC_RETRIEVE_VIA_USER.authoritative',[ ses(), obj.patron_id ]);
146                         if (typeof robj.ilsevent != 'undefined') throw(robj);
147
148                         for (var ii = 0; ii < robj.length; ii++) {
149                                 try {
150                                         var nc_circ = obj.network.simple_request('FM_ANCC_RETRIEVE_VIA_ID',[ ses(), robj[ii] ]);
151                                         if (typeof nc_circ.ilsevent != 'undefined') throw(nc_circ);
152                                         var fake_circ = new aoc();
153                                         fake_circ.circ_lib( nc_circ.circ_lib() );
154                                         fake_circ.circ_staff( nc_circ.staff() );
155                                         fake_circ.usr( nc_circ.patron() );
156                                         fake_circ.xact_start( nc_circ.circ_time() );
157                                         fake_circ.renewal_remaining(0);
158                                         fake_circ.stop_fines('Non-Cataloged');
159                                                 
160                                         JSAN.use('util.date');
161                                         var c = nc_circ.circ_time();
162                                         var d = c == "now" ? new Date() : util.date.db_date2Date( c );
163                                         var t = obj.data.hash.cnct[ nc_circ.item_type() ];
164                                         if (!t) {
165                                                 var robj2 = obj.network.simple_request('FM_CNCT_RETRIEVE',[ nc_circ.circ_lib() ]);
166                                                 if (typeof robj2.ilsevent != 'undefined') throw(robj);
167                                                 obj.data.stash_retrieve();
168                                                 for (var j = 0; j < robj2.length; j++) {
169                                                         if (! obj.data.hash.cnct[ robj2[j].id() ] ) {
170                                                                 obj.data.hash.cnct[ robj2[j].id() ] = robj2[j];
171                                                                 obj.data.list.cnct.push( robj2[j] );
172                                                         }
173                                                 }
174                                                 obj.data.stash('hash','list');
175                                                 t = obj.data.hash.cnct[ nc_circ.item_type() ];
176                                         }
177                                         var cd = t.circ_duration() || $("patronStrings").getString('staff.patron.items.show_noncats.14_days');
178                                         var i = util.date.interval_to_seconds( cd ) * 1000;
179                                         d.setTime( Date.parse(d) + i );
180                                         fake_circ.due_date( util.date.formatted_date(d,'%F') );
181         
182                                         var fake_record = new mvr();
183                                         fake_record.title( obj.data.hash.cnct[ nc_circ.item_type() ].name());
184         
185                                         var fake_copy = new acp();
186                                         fake_copy.barcode( '' );
187                                         fake_copy.circ_lib( nc_circ.circ_lib() );
188
189                                         obj.list.append( { 'row' : { 'my' : { 'circ' : fake_circ, 'mvr' : fake_record, 'acp' : fake_copy } }, 'to_bottom' : true, 'no_auto_select' : true } );
190
191                                 } catch(F) {
192                                         obj.error.standard_unexpected_error_alert($("patronStrings").getFormattedString('staff.patron.items.show_noncats.err_showing_noncat', [robj[ii].id()]),F);
193                                 }
194                         }
195
196                 } catch(E) {
197                         obj.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.items.show_noncats.err_showing_circulations'),E);
198                 }
199         },
200
201         'items_print' : function(which) {
202                 var obj = this;
203                 try {
204                         var list = (which==2 ? obj.list2 : obj.list);
205             JSAN.use('patron.util');
206             var params = { 
207                 'patron' : patron.util.retrieve_fleshed_au_via_id(ses(),obj.patron_id), 
208                 'template' : 'items_out'
209             };
210             list.print( params );
211                 } catch(E) {
212                         obj.error.standard_unexpected_error_alert('printing 1',E);
213                 }
214         },
215
216         'items_export' : function(which) {
217                 var obj = this;
218                 try {
219                         var list = (which==2 ? obj.list2 : obj.list);
220                         list.dump_csv_to_clipboard();
221                 } catch(E) {
222                         obj.error.standard_unexpected_error_alert('export 1',E);
223                 }
224         },
225
226         'items_renew_all' : function() {
227                 try {
228                         var obj = this; var list = obj.list;
229                         if (list.on_all_fleshed != null) {
230                                 var r = window.confirm($("patronStrings").getString('staff.patron.items.items_renew_all.list_is_busy'));
231                                 if (!r) return;
232                         }
233                         var r = window.confirm($("patronStrings").getString('staff.patron.items.items_renew_all.renew_items_in_list'));
234                         if (!r) return;
235                         function flesh_callback() {
236                                 try {
237                                         obj.list.select_all();
238                                         obj.items_renew(1,true);        
239                                         setTimeout(function(){list.on_all_fleshed = null; /* obj.retrieve();*/ },0);
240                                 } catch(E) {
241                                         obj.error.standard_unexpected_error_alert($("patronStrings").getFormattedString('staff.patron.items.items_renew_all.items_not_renewed', ['2']),E);
242                                 }
243                         }
244                         list.on_all_fleshed = flesh_callback;
245                         list.full_retrieve();
246                 } catch(E) {
247                         this.error.standard_unexpected_error_alert($("patronStrings").getFormattedString('staff.patron.items.items_renew_all.items_not_renewed', ['1']),E);
248                 }
249         },
250
251         'items_renew' : function(which,skip_prompt) {
252                 var obj = this;
253                 try{
254                         JSAN.use('circ.util');
255                         var retrieve_ids = ( which == 2 ? obj.retrieve_ids2 : obj.retrieve_ids );
256                         if (!retrieve_ids || retrieve_ids.length == 0) return;
257                         JSAN.use('util.functional');
258                         if (!skip_prompt) {
259                                 var msg = '';
260                                 if(retrieve_ids.length > 1) {
261                                         msg += $("patronStrings").getFormattedString('staff.patron.items.items_renew.renew_item_plural',[util.functional.map_list( retrieve_ids, function(o){return o.barcode;}).join(', ')]);
262                                 } else {
263                                         msg += $("patronStrings").getFormattedString('staff.patron.items.items_renew.renew_item_singular', [util.functional.map_list( retrieve_ids, function(o){return o.barcode;}).join(', ')]);
264                                 }
265                                 var r = window.confirm(msg);
266                                 if (!r) { return; }
267                         }
268
269                         var count = 0;
270
271                         function gen_renew(bc,circ_id) {
272                                 var x = document.getElementById('renew_msgs');
273                                 if (x) {
274                                         var l = document.createElement('label');
275                                         l.setAttribute('value', $("patronStrings").getFormattedString('staff.patron.items.items_renew.renewing',[bc]));
276                                         x.appendChild(l);
277                                 }
278                                 var renew = circ.util.renew_via_barcode( { 'barcode' : bc, 'patron' : obj.patron_id },
279                                         function(r) {
280                         try {
281                             if ( (typeof r[0].ilsevent != 'undefined' && r[0].ilsevent == 0) ) {
282                                 l.setAttribute('value', $("patronStrings").getFormattedString('staff.patron.items.items_renew.renewed',[bc]));
283                                 obj.list_circ_map[ circ_id ].row.my.circ = r[0].payload.circ;
284                                 obj.list_circ_map[ circ_id ].row.my.acp = r[0].payload.copy;
285                                 obj.list_circ_map[ circ_id ].row.my.mvr = r[0].payload.record;
286                                 // A renewed circ is a new circ, and has a new circ_id.
287                                 obj.list_circ_map[ r[0].payload.circ.id() ] = obj.list_circ_map[ circ_id ];
288                             } else {
289                                 var msg = $("patronStrings").getFormattedString('staff.patron.items.items_renew.not_renewed',[bc, r[0].textcode + r[0].desc]);
290                                 l.setAttribute('value', msg);
291                                 alert(msg);
292                             }
293                             count--;
294                             if (count == 0) {
295                                 //if (window.confirm('Action completed. Refresh list?')) obj.retrieve();
296                                 JSAN.use('util.widgets'); util.widgets.remove_children(x);
297                             }
298                             obj.refresh(circ_id);
299                         } catch(E) {
300                                                obj.error.standard_unexpected_error_alert($("patronStrings").getFormattedString('staff.patron.items.items_renew.err_in_renew_via_barcode',[bc]), E);
301                         }
302                                         } 
303                                 );
304                         }
305
306                         for (var i = 0; i < retrieve_ids.length; i++) {
307                                 try {
308                                         count++;
309                                         var barcode = retrieve_ids[i].barcode;
310                                         var circ_id = retrieve_ids[i].circ_id;
311                                         gen_renew(barcode,circ_id);
312                                 } catch(E) {
313                                         obj.error.standard_unexpected_error_alert($("patronStrings").getFormattedString('staff.patron.items.items_renew.no_renew_for_barcode',[barcode]), E);
314                                 }
315                         }
316                 } catch(E) {
317                         obj.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.items.items_renew.no_renew'),E);
318                 }
319         },
320
321         'items_edit' : function(which) {
322                         var obj = this;
323                         try {
324                                 var retrieve_ids = ( which == 2 ? obj.retrieve_ids2 : obj.retrieve_ids );
325                                 if (!retrieve_ids || retrieve_ids.length == 0) return;
326                                 function check_date(value) {
327                                         JSAN.use('util.date');
328                                         try {
329                                                 if (! util.date.check('YYYY-MM-DD',value) ) { 
330                                                         throw($("patronStrings").getString('staff.patron.items.items_edit.invalid_date')); 
331                                                 }
332                                                 if (util.date.check_past('YYYY-MM-DD',value) ) { 
333                                                         throw($("patronStrings").getString('staff.patron.items.items_edit.need_later_date')); 
334                                                 }
335                                                 /*
336                                                 if ( util.date.formatted_date(new Date(),'%F') == value) { 
337                                                         throw('Due date needs to be after today.'); 
338                                                 }
339                                                 */
340                                                 return true;
341                                         } catch(E) {
342                                                 alert(E);
343                                                 return false;
344                                         }
345                                 }
346
347                                 JSAN.use('util.functional');
348                                 var title = '';
349                                 if (retrieve_ids.length > 1) {
350                                         title += $("patronStrings").getString('staff.patron.items.items_edit.edit_due_date.plural');
351                                 } else {
352                                         title += $("patronStrings").getString('staff.patron.items.items_edit.edit_due_date.singular');
353                                 }
354                                 var value = 'YYYY-MM-DD';
355                                 var text = $("patronStrings").getFormattedString('staff.patron.items.items_edit.new_due_date', [util.functional.map_list(retrieve_ids,function(o){return o.barcode;}).join(', ')]);
356                                 var due_date; var invalid = true;
357                                 while(invalid) {
358                                         due_date = window.prompt(text,value,title);
359                                         if (due_date) {
360                                                 invalid = ! check_date(due_date);
361                                         } else {
362                                                 invalid = false;
363                                         }
364                                 }
365                                 if (due_date) {
366                                         var circs = util.functional.map_list(retrieve_ids,function(o){return o.circ_id;});
367                                         for (var i = 0; i < circs.length; i++) {
368                                                 var robj = obj.network.simple_request('FM_CIRC_EDIT_DUE_DATE',[ses(),circs[i],due_date]);
369                                                 if (typeof robj.ilsevent != 'undefined') { if (robj.ilsevent != 0) throw(robj); }
370                                         }
371                                 }
372                                 for (var i = 0; i < obj.retrieve_ids.length; i++) {
373                                         obj.refresh(retrieve_ids[i].circ_id);
374                                 }
375                         } catch(E) {
376                                 obj.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.items.items_edit.dates_not_modified'),E);
377                         }
378         },
379
380         'items_mark_lost' : function(which) {
381                 var obj = this;
382                 try {
383                         var retrieve_ids = ( which == 2 ? obj.retrieve_ids2 : obj.retrieve_ids );
384                         if (!retrieve_ids || retrieve_ids.length == 0) return;
385                         for (var i = 0; i < retrieve_ids.length; i++) {
386                                 var barcode = retrieve_ids[i].barcode;
387                                 dump($("patronStrings").getFormattedString('staff.patron.items.items_edit.mark_barcode_lost', [barcode]));
388                                 var robj = obj.network.simple_request( 'MARK_ITEM_LOST', [ ses(), { barcode: barcode } ]);
389                                 if (typeof robj.ilsevent != 'undefined') { 
390                     switch(Number(robj.ilsevent)) {
391                         case 7018 /* COPY_MARKED_LOST */ :
392                             alert( $("patronStrings").getFormattedString('staff.patron.items.items_edit.item_barcode', [barcode, robj.desc]) );
393                         break;
394                         default: throw(robj);
395                     }
396                 } else {
397                                 obj.refresh(retrieve_ids[i].circ_id,true);
398                 }
399                         }
400                 } catch(E) {
401                         obj.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.items.items_edit.items_not_marked_lost'),E);
402                 }
403         },
404
405         'items_claimed_returned' : function(which) {
406                 var obj = this;
407                 try {
408                         JSAN.use('util.date');
409                         var retrieve_ids = ( which == 2 ? obj.retrieve_ids2 : obj.retrieve_ids );
410                         if (!retrieve_ids || retrieve_ids.length == 0) return;
411                         function check_date(value) {
412                                 try {
413                                         if (! util.date.check('YYYY-MM-DD',value) ) { 
414                                                 throw($("patronStrings").getString('staff.patron.items.items_edit.invalid_date')); 
415                                         }
416                                         if ( util.date.formatted_date(new Date(),'%F') == value) { 
417                                                 return true;
418                                         }
419                                         if (! util.date.check_past('YYYY-MM-DD',value) ) { 
420                                                 throw($("patronStrings").getString('staff.patron.items.items_claimed_returned.date_cannot_be_in_future')); 
421                                         }
422                                         return true;
423                                 } catch(E) {
424                                         alert(E);
425                                         return false;
426                                 }
427                         }
428
429                         JSAN.use('util.functional');
430                         var title = $("patronStrings").getString('staff.patron.items.items_claimed_returned.claimed_returned');
431                         var value = 'YYYY-MM-DD';
432                         var text = $("patronStrings").getFormattedString('staff.patron.items.items_claimed_returned.enter_returned_date',
433                                 [util.functional.map_list(retrieve_ids,function(o){return o.barcode;}).join(', ')]);
434                         var backdate; var invalid = true;
435                         while(invalid) {
436                                 backdate = window.prompt(text,value,title);
437                                 if (backdate) {
438                                         invalid = ! check_date(backdate);
439                                 } else {
440                                         invalid = false;
441                                 }
442                         }
443                         //alert('backdate = ' + backdate);
444                         if (backdate) {
445                                 backdate = util.date.formatted_date(backdate + ' 00:00:00','%{iso8601}');
446                                 var barcodes = util.functional.map_list(retrieve_ids,function(o){return o.barcode;});
447                 var do_not_move_these = {};
448                                 for (var i = 0; i < barcodes.length; i++) {
449                                         var robj = obj.network.simple_request(
450                                                 'MARK_ITEM_CLAIM_RETURNED', 
451                                                 [ ses(), { barcode: barcodes[i], backdate: backdate } ],
452                         null,
453                         {
454                             'title' : $("patronStrings").getString('staff.patron.items.set_claim_returned_failure'),
455                             'overridable_events' : [
456                                 'PATRON_EXCEEDS_CLAIMS_RETURN_COUNT'                                
457                             ]
458                         }
459                                         );
460                                         if (typeof robj.ilsevent != 'undefined') { 
461                         if (robj.ilsevent != 0 && robj.textcode != 'PATRON_EXCEEDS_CLAIMS_RETURN_COUNT' ) {
462                             do_not_move_these[ barcodes[i] ] = true;
463                             obj.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.items.items_claimed_returned.not_marked_claimed_returned'),E);
464                         }
465                         if (robj.textcode == 'PATRON_EXCEEDS_CLAIMS_RETURN_COUNT') {
466                             do_not_move_these[ barcodes[i] ] = true;
467                         }
468                     }
469                                 }
470                         }
471                         for (var i = 0; i < retrieve_ids.length; i++) {
472                 obj.refresh(retrieve_ids[i].circ_id, !do_not_move_these[ retrieve_ids[i].barcode ]);
473             }
474                 } catch(E) {
475                         obj.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.items.items_claimed_returned.not_marked_claimed_returned'),E);
476                 }
477         },
478
479         'items_checkin' : function(which) {
480                 var obj = this;
481                 try {
482                         var retrieve_ids = ( which == 2 ? obj.retrieve_ids2 : obj.retrieve_ids );
483                         if (!retrieve_ids || retrieve_ids.length == 0) return;
484                         JSAN.use('util.functional');
485                         var msg = '';
486                         if (retrieve_ids.length > 1) {
487                                 msg += $("patronStrings").getFormattedString('staff.patron.items.items_checkin.confirm_item_check_in.plural',
488                                         [util.functional.map_list( retrieve_ids, function(o){return o.barcode;}).join(', ')]);
489                         } else {
490                                 msg += $("patronStrings").getFormattedString('staff.patron.items.items_checkin.confirm_item_check_in.singular',
491                                         [util.functional.map_list( retrieve_ids, function(o){return o.barcode;}).join(', ')]);
492                         }
493                         var r = window.confirm(msg);
494                         if (!r) { return; }
495                         JSAN.use('circ.util');
496                         for (var i = 0; i < retrieve_ids.length; i++) {
497                                 var copy_id = retrieve_ids[i].copy_id;
498                                 dump('Check in copy_id = ' + copy_id + ' barcode = ' + retrieve_ids[i].barcode + '\n');
499                                 var robj = circ.util.checkin_via_barcode(
500                                         ses(), { 'copy_id' : copy_id }
501                                 );
502                                 /* circ.util.checkin_via_barcode handles errors currently */
503                         }
504                         obj.retrieve();
505                 } catch(E) {
506                         obj.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.items.items_checkin.no_checkin'),E);
507                 }
508         },
509
510         'show_catalog' : function(which) {
511                 var obj = this;
512                 try {
513                         var retrieve_ids = ( which == 2 ? obj.retrieve_ids2 : obj.retrieve_ids );
514                         if (!retrieve_ids || retrieve_ids.length == 0) return;
515                         for (var i = 0; i < retrieve_ids.length; i++) {
516                                 var doc_id = retrieve_ids[i].doc_id;
517                                 if (!doc_id) {
518                                         alert($("patronStrings").getFormattedString('staff.patron.items.show_catalog.barcode_not_cataloged', [retrieve_ids[i].barcode]));
519                                         continue;
520                                 }
521                                 var opac_url = xulG.url_prefix( urls.opac_rdetail ) + '?r=' + doc_id;
522                                 var content_params = { 
523                                         'session' : ses(),
524                                         'authtime' : ses('authtime'),
525                                         'opac_url' : opac_url
526                                 };
527                                 xulG.new_tab(
528                                         xulG.url_prefix(urls.XUL_OPAC_WRAPPER), 
529                                         {'tab_name': $("patronStrings").getString('staff.patron.items.show_catalog.retrieving_title')}, 
530                                         content_params
531                                 );
532                         }
533                 } catch(E) {
534                         obj.error.standard_unexpected_error_alert('',E);
535                 }
536         },
537
538         'add_billing' : function(which) {
539                 var obj = this;
540                 try {
541                         var retrieve_ids = ( which == 2 ? obj.retrieve_ids2 : obj.retrieve_ids );
542                         if (!retrieve_ids || retrieve_ids.length == 0) return;
543                         JSAN.use('util.window'); var win = new util.window();
544                         for (var i = 0; i < retrieve_ids.length; i++) {
545                                 var circ_id = retrieve_ids[i].circ_id;
546                                 var my_xulG = win.open(
547                                         urls.XUL_PATRON_BILL_WIZARD,
548                                                 //+ '?patron_id=' + window.escape(obj.patron_id)
549                                                 //+ '&xact_id=' + window.escape( circ_id ),
550                                         'billwizard',
551                                         'chrome,resizable,modal',
552                                         { 'patron_id' : obj.patron_id, 'xact_id' : circ_id }
553                                 );
554                         }
555                 } catch(E) {
556                         obj.error.standard_unexpected_error_alert('',E);
557                 }
558         },
559
560         'init_lists' : function() {
561                 var obj = this;
562
563                 JSAN.use('circ.util');
564                 var columns = circ.util.columns( 
565                         { 
566                                 'barcode' : { 'hidden' : false },
567                                 'checkout_lib' : { 'hidden' : false },
568                                 'circ_lib' : { 'hidden' : false },
569                                 'title' : { 'hidden' : false, 'flex' : '3' },
570                                 'due_date' : { 'hidden' : false },
571                                 'renewal_remaining' : { 'hidden' : false },
572                                 'stop_fines' : { 'hidden' : false }
573                         } 
574                 );
575                 var columns2 = circ.util.columns( 
576                         { 
577                                 'barcode' : { 'hidden' : false },
578                                 'checkout_lib' : { 'hidden' : false },
579                                 'circ_lib' : { 'hidden' : false },
580                                 'title' : { 'hidden' : false, 'flex' : '3' },
581                                 'checkin_time' : { 'hidden' : false },
582                                 'stop_fines' : { 'hidden' : false }
583                         } 
584                 );
585
586                 function retrieve_row(params) {
587             try { 
588                         var row = params.row;
589
590                         if (!row.my.circ_id) {
591                                 if (typeof params.on_retrieve == 'function') { 
592                         params.on_retrieve(row); 
593                     }
594                                 return row;
595                         }
596     
597                         if (!row.my.circ) {
598                                 obj.network.simple_request(
599                                         'FM_CIRC_DETAILS.authoritative',
600                                         [ row.my.circ_id ],
601                                         function(req) {
602                                                 try { 
603                                                         var robj = req.getResultObject();
604                                                         if (typeof robj.ilsevent != 'undefined') throw(robj);
605                                                         if (typeof robj.ilsevent == 'null') throw('null result');
606                                                         row.my.circ = robj.circ;
607                                                         row.my.acp = robj.copy;
608                                                         row.my.mvr = robj.mvr;
609                                                         row.my.acn = robj.volume;
610                                 row.my.record = robj.record;
611         
612                                                         var copy_id = row.my.circ.target_copy();
613                                                         if (typeof copy_id == 'object') {
614                                                                 if (copy_id != null) {
615                                                                         copy_id = copy_id.id();
616                                                                 } else {
617                                                                         if (typeof robj.copy == 'object' && robj.copy != null) copy_id = robj.copy.id();
618                                                                 }
619                                                         } else {
620                                                                         if (typeof robj.copy == 'object' && robj.copy != null) copy_id = robj.copy.id();
621                                                         }
622                                                         
623                                                         params.row_node.setAttribute( 'retrieve_id', js2JSON({'copy_id':copy_id,'circ_id':row.my.circ.id(),'barcode':row.my.acp.barcode(),'doc_id': ( row.my.record ? row.my.record.id() : null ) }) );
624                 
625                                                         if (typeof params.on_retrieve == 'function') {
626                                                                 params.on_retrieve(row);
627                                                         }
628                                                 } catch(E) {
629                                                         obj.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.items.retrieve_row.callback_error'), E);
630                                                 }
631                                         }
632                                 );
633                         } else {
634                     var copy_id = row.my.circ ? row.my.circ.target_copy() : null;
635                                 if (typeof copy_id == 'object') {
636                                         if (copy_id != null) {
637                                                 copy_id = copy_id.id();
638                                         } else {
639                                                 if (typeof row.my.acp == 'object' && row.my.acp != null) copy_id = row.my.acp.id();
640                                         }
641                                 } else {
642                                                 if (typeof row.my.acp == 'object' && row.my.acp != null) copy_id = row.my.acp.id();
643                                 }
644  
645                                 params.row_node.setAttribute( 'retrieve_id', js2JSON({'copy_id':row.my.acp.id(),'circ_id':row.my.circ.id(),'barcode':row.my.acp.barcode(),'doc_id': (row.my.record ? row.my.record.id() : null) }) );
646                                 if (typeof params.on_retrieve == 'function') {
647                                         params.on_retrieve(row);
648                                 }
649                         }
650     
651                         return row;
652             } catch(E) {
653                 obj.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.items.retrieve_row.error_in_retrieve_row'),E);
654                 return params.row;
655             }
656                 }
657
658                 JSAN.use('util.list'); obj.list = new util.list('items_list');
659                 obj.list.init(
660                         {
661                                 'columns' : columns,
662                                 'map_row_to_columns' : circ.util.std_map_row_to_columns(),
663                                 'retrieve_row' : retrieve_row,
664                                 'on_select' : function(ev) {
665                                         JSAN.use('util.functional');
666                                         var sel = obj.list.retrieve_selection();
667                                         obj.controller.view.sel_clip.setAttribute('disabled',sel.length < 1);
668                                         var list = util.functional.map_list(
669                                                 sel,
670                                                 function(o) { return JSON2js( o.getAttribute('retrieve_id') ); }
671                                         );
672                                         if (typeof obj.on_select == 'function') {
673                                                 obj.on_select(list);
674                                         }
675                                         if (typeof window.xulG == 'object' && typeof window.xulG.on_select == 'function') {
676                                                 obj.error.sdump('D_PATRON','patron.items: Calling external .on_select()\n');
677                                                 window.xulG.on_select(list);
678                                         } else {
679                                                 obj.error.sdump('D_PATRON','patron.items: No external .on_select()\n');
680                                         }
681                                 }
682                         }
683                 );
684                 
685                 obj.list2 = new util.list('items_list2');
686                 obj.list2.init(
687                         {
688                                 'columns' : columns2,
689                                 'map_row_to_columns' : circ.util.std_map_row_to_columns(),
690                                 'retrieve_row' : retrieve_row,
691                                 'on_select' : function(ev) {
692                                         JSAN.use('util.functional');
693                                         var sel = obj.list2.retrieve_selection();
694                                         obj.controller.view.sel_clip2.setAttribute('disabled',sel.length < 1);
695                                         var list = util.functional.map_list(
696                                                 sel,
697                                                 function(o) { return JSON2js( o.getAttribute('retrieve_id') ); }
698                                         );
699                                         if (typeof obj.on_select2 == 'function') {
700                                                 obj.on_select2(list);
701                                         }
702                                 }
703                         }
704                 );
705         },
706
707         'refresh' : function(circ_id,move_to_bottom_list) {
708                 var obj = this;
709                 try {
710                         var nparams = obj.list_circ_map[circ_id];
711             if (move_to_bottom_list) { 
712                 obj.list_circ_map[circ_id].my_node.setAttribute('hidden','true');
713                                 var nparams2 = obj.list2.append( { 'row' : { 'my' : { 'circ_id' : circ_id } },  'to_bottom' : true, 'which_list' : 1 } );
714                                 obj.list_circ_map[circ_id] = nparams2; 
715             } else {
716                         var which_list = nparams.which_list;
717                 switch(which_list) {
718                     case 1:
719                                         case '1':
720                         setTimeout(function(){try{obj.list2.refresh_row(nparams);}catch(E){
721                                                                                                         obj.error.standard_unexpected_error_alert($("patronStrings").getFormattedString('staff.patron.items.refresh.error_refreshing_row2', [circ_id, nparams]),E);}},1000);
722                         break;
723                     default:
724                         setTimeout(function(){try{obj.list.refresh_row(nparams);}catch(E){
725                                                                                                         obj.error.standard_unexpected_error_alert($("patronStrings").getFormattedString('staff.patron.items.refresh.error_refreshing_row2', [circ_id, nparams]),E);}},1000);
726                         break;
727                 }
728             }
729                 } catch(E) {
730                         obj.error.standard_unexpected_error_alert($("patronStrings").getFormattedString('staff.patron.items.refresh.error_refreshing_row', [circ_id, nparams]),E);
731                 }
732         },
733
734         'retrieve' : function(dont_show_me_the_list_change) {
735                 var obj = this;
736                 if (window.xulG && window.xulG.checkouts) {
737                         obj.checkouts = window.xulG.checkouts;
738                 } else {
739                         obj.checkouts = [];
740                         obj.checkouts2 = [];
741                         var robj = obj.network.simple_request(
742                                 'FM_CIRC_RETRIEVE_VIA_USER.authoritative',
743                                 [ ses(), obj.patron_id ]
744                         );
745                         if (typeof robj.ilsevent!='undefined') {
746                                 obj.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.items.retrieve.err_retrieving_circulations'),E);
747                         } else {
748                                 obj.checkouts = obj.checkouts.concat( robj.overdue );
749                                 obj.checkouts = obj.checkouts.concat( robj.out );
750                                 obj.checkouts2 = obj.checkouts2.concat( robj.lost );
751                                 obj.checkouts2 = obj.checkouts2.concat( robj.claims_returned );
752                                 obj.checkouts2 = obj.checkouts2.concat( robj.long_overdue );
753                         }
754                         var robj = obj.network.simple_request(
755                                 'FM_CIRC_IN_WITH_FINES_VIA_USER.authoritative',
756                                 [ ses(), obj.patron_id ]
757                         );
758                         if (typeof robj.ilsevent!='undefined') {
759                                 obj.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.items.retrieve.err_retrieving_circulations'),E);
760                         } else {
761                                 obj.checkouts2 = obj.checkouts2.concat( robj.lost );
762                                 obj.checkouts2 = obj.checkouts2.concat( robj.claims_returned );
763                                 obj.checkouts2 = obj.checkouts2.concat( robj.long_overdue );
764                         }
765                 }
766
767                 function gen_list_append(circ_id,which_list) {
768                         return function() {
769                                 try {
770                                         var nparams;
771                                         switch(which_list) {
772                                                 case 1:
773                                                         nparams = obj.list2.append( { 'row' : { 'my' : { 'circ_id' : circ_id } },  'to_bottom' : true, 'which_list' : which_list } );
774                                                 break;
775                                                 default:
776                                                         nparams = obj.list.append( { 'row' : { 'my' : { 'circ_id' : circ_id } }, 'to_bottom' : true, 'which_list' : which_list } );
777                                                 break;
778                                         }
779                                         if (nparams) {
780                                                 obj.list_circ_map[circ_id] = nparams; // unlike item status interface, each circ should be in this list only once
781                                         } else {
782                                                 throw('typeof nparams = ' + typeof nparams);
783                                         }
784                                 } catch(E) {
785                                         obj.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.items.gen_list_append.error'),E);
786                                 }
787                         };
788                 }
789
790                 obj.list.clear(); obj.list2.clear();
791
792                 JSAN.use('util.exec'); var exec = new util.exec();
793                 var rows = [];
794                 for (var i in obj.checkouts) {
795                         rows.push( gen_list_append(obj.checkouts[i],0) );
796                 }
797                 for (var i in obj.checkouts2) {
798                         rows.push( gen_list_append(obj.checkouts2[i],1) );
799                 }
800                 exec.chain( rows );
801                 if (!dont_show_me_the_list_change) {
802                         if (window.xulG && typeof window.xulG.on_list_change == 'function') {
803                                 try { window.xulG.on_list_change(obj.checkouts); } catch(E) { this.error.sdump('D_ERROR',E); }
804                         }
805                 }
806         },
807
808         'on_select' : function(list) {
809
810                 dump('patron.items.on_select list = ' + js2JSON(list) + '\n');
811
812                 var obj = this;
813
814                 obj.controller.view.cmd_items_claimed_returned.setAttribute('disabled','false');
815                 obj.controller.view.cmd_items_renew.setAttribute('disabled','false');
816                 obj.controller.view.cmd_items_checkin.setAttribute('disabled','false');
817                 obj.controller.view.cmd_items_edit.setAttribute('disabled','false');
818                 obj.controller.view.cmd_items_mark_lost.setAttribute('disabled','false');
819                 obj.controller.view.cmd_show_catalog.setAttribute('disabled','false');
820                 obj.controller.view.sel_copy_details.setAttribute('disabled','false');
821                 obj.controller.view.sel_bucket.setAttribute('disabled','false');
822                 obj.controller.view.sel_patron.setAttribute('disabled','false');
823                 obj.controller.view.sel_mark_items_damaged.setAttribute('disabled','false');
824                 obj.controller.view.sel_mark_items_missing.setAttribute('disabled','false');
825
826                 obj.retrieve_ids = list;
827         },
828
829         'on_select2' : function(list) {
830         
831                 dump('patron.items.on_select2 list = ' + js2JSON(list) + '\n');
832
833                 var obj = this;
834
835                 obj.controller.view.cmd_items_claimed_returned2.setAttribute('disabled','false');
836                 obj.controller.view.cmd_items_renew2.setAttribute('disabled','false');
837                 obj.controller.view.cmd_items_checkin2.setAttribute('disabled','false');
838                 obj.controller.view.cmd_items_edit2.setAttribute('disabled','false');
839                 obj.controller.view.cmd_items_mark_lost2.setAttribute('disabled','false');
840                 obj.controller.view.cmd_show_catalog2.setAttribute('disabled','false');
841                 obj.controller.view.sel_copy_details2.setAttribute('disabled','false');
842                 obj.controller.view.sel_bucket2.setAttribute('disabled','false');
843                 obj.controller.view.sel_patron2.setAttribute('disabled','false');
844                 obj.controller.view.sel_mark_items_damaged2.setAttribute('disabled','false');
845                 obj.controller.view.sel_mark_items_missing2.setAttribute('disabled','false');
846
847                 this.retrieve_ids2 = list;
848         }
849
850 }
851
852 dump('exiting patron.items.js\n');