]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/patron/items.js
Patch from Craig Ricciuto to bring i18n to the patron staff client interfaces
[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, 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',[barcode]), 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                                 for (var i = 0; i < barcodes.length; i++) {
448                                         var robj = obj.network.simple_request(
449                                                 'MARK_ITEM_CLAIM_RETURNED', 
450                                                 [ ses(), { barcode: barcodes[i], backdate: backdate } ]
451                                         );
452                                         if (typeof robj.ilsevent != 'undefined') { if (robj.ilsevent != 0) throw(robj); }
453                                 }
454                         }
455                         for (var i = 0; i < retrieve_ids.length; i++) obj.refresh(retrieve_ids[i].circ_id,true);
456                 } catch(E) {
457                         obj.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.items.items_claimed_returned.not_marked_claimed_returned'),E);
458                 }
459         },
460
461         'items_checkin' : function(which) {
462                 var obj = this;
463                 try {
464                         var retrieve_ids = ( which == 2 ? obj.retrieve_ids2 : obj.retrieve_ids );
465                         if (!retrieve_ids || retrieve_ids.length == 0) return;
466                         JSAN.use('util.functional');
467                         var msg = '';
468                         if (retrieve_ids.length > 1) {
469                                 msg += $("patronStrings").getFormattedString('staff.patron.items.items_checkin.confirm_item_check_in.plural',
470                                         [util.functional.map_list( retrieve_ids, function(o){return o.barcode;}).join(', ')]);
471                         } else {
472                                 msg += $("patronStrings").getFormattedString('staff.patron.items.items_checkin.confirm_item_check_in.singular'
473                                         [util.functional.map_list( retrieve_ids, function(o){return o.barcode;}).join(', ')]);
474                         }
475                         var r = window.confirm(msg);
476                         if (!r) { return; }
477                         JSAN.use('circ.util');
478                         for (var i = 0; i < retrieve_ids.length; i++) {
479                                 var copy_id = retrieve_ids[i].copy_id;
480                                 dump('Check in copy_id = ' + copy_id + ' barcode = ' + retrieve_ids[i].barcode + '\n');
481                                 var robj = circ.util.checkin_via_barcode(
482                                         ses(), { 'copy_id' : copy_id }
483                                 );
484                                 /* circ.util.checkin_via_barcode handles errors currently */
485                         }
486                         obj.retrieve();
487                 } catch(E) {
488                         obj.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.items.items_checkin.no_checkin'),E);
489                 }
490         },
491
492         'show_catalog' : function(which) {
493                 var obj = this;
494                 try {
495                         var retrieve_ids = ( which == 2 ? obj.retrieve_ids2 : obj.retrieve_ids );
496                         if (!retrieve_ids || retrieve_ids.length == 0) return;
497                         for (var i = 0; i < retrieve_ids.length; i++) {
498                                 var doc_id = retrieve_ids[i].doc_id;
499                                 if (!doc_id) {
500                                         alert($("patronStrings").getFormattedString('staff.patron.items.show_catalog.barcode_not_cataloged', [retrieve_ids[i].barcode]));
501                                         continue;
502                                 }
503                                 var opac_url = xulG.url_prefix( urls.opac_rdetail ) + '?r=' + doc_id;
504                                 var content_params = { 
505                                         'session' : ses(),
506                                         'authtime' : ses('authtime'),
507                                         'opac_url' : opac_url
508                                 };
509                                 xulG.new_tab(
510                                         xulG.url_prefix(urls.XUL_OPAC_WRAPPER), 
511                                         {'tab_name': $("patronStrings").getString('staff.patron.items.show_catalog.retrieving_title')}, 
512                                         content_params
513                                 );
514                         }
515                 } catch(E) {
516                         obj.error.standard_unexpected_error_alert('',E);
517                 }
518         },
519
520         'add_billing' : function(which) {
521                 var obj = this;
522                 try {
523                         var retrieve_ids = ( which == 2 ? obj.retrieve_ids2 : obj.retrieve_ids );
524                         if (!retrieve_ids || retrieve_ids.length == 0) return;
525                         JSAN.use('util.window'); var win = new util.window();
526                         for (var i = 0; i < retrieve_ids.length; i++) {
527                                 var circ_id = retrieve_ids[i].circ_id;
528                                 var my_xulG = win.open(
529                                         urls.XUL_PATRON_BILL_WIZARD,
530                                                 //+ '?patron_id=' + window.escape(obj.patron_id)
531                                                 //+ '&xact_id=' + window.escape( circ_id ),
532                                         'billwizard',
533                                         'chrome,resizable,modal',
534                                         { 'patron_id' : obj.patron_id, 'xact_id' : circ_id }
535                                 );
536                         }
537                 } catch(E) {
538                         obj.error.standard_unexpected_error_alert('',E);
539                 }
540         },
541
542         'init_lists' : function() {
543                 var obj = this;
544
545                 JSAN.use('circ.util');
546                 var columns = circ.util.columns( 
547                         { 
548                                 'barcode' : { 'hidden' : false },
549                                 'checkout_lib' : { 'hidden' : false },
550                                 'circ_lib' : { 'hidden' : false },
551                                 'title' : { 'hidden' : false, 'flex' : '3' },
552                                 'due_date' : { 'hidden' : false },
553                                 'renewal_remaining' : { 'hidden' : false },
554                                 'stop_fines' : { 'hidden' : false }
555                         } 
556                 );
557                 var columns2 = circ.util.columns( 
558                         { 
559                                 'barcode' : { 'hidden' : false },
560                                 'checkout_lib' : { 'hidden' : false },
561                                 'circ_lib' : { 'hidden' : false },
562                                 'title' : { 'hidden' : false, 'flex' : '3' },
563                                 'checkin_time' : { 'hidden' : false },
564                                 'stop_fines' : { 'hidden' : false }
565                         } 
566                 );
567
568                 function retrieve_row(params) {
569             try { 
570                         var row = params.row;
571
572                         if (!row.my.circ_id) {
573                                 if (typeof params.on_retrieve == 'function') { 
574                         params.on_retrieve(row); 
575                     }
576                                 return row;
577                         }
578     
579                         if (!row.my.circ) {
580                                 obj.network.simple_request(
581                                         'FM_CIRC_DETAILS.authoritative',
582                                         [ row.my.circ_id ],
583                                         function(req) {
584                                                 try { 
585                                                         var robj = req.getResultObject();
586                                                         if (typeof robj.ilsevent != 'undefined') throw(robj);
587                                                         if (typeof robj.ilsevent == 'null') throw('null result');
588                                                         row.my.circ = robj.circ;
589                                                         row.my.acp = robj.copy;
590                                                         row.my.mvr = robj.mvr;
591                                                         row.my.acn = robj.volume;
592                                 row.my.record = robj.record;
593         
594                                                         var copy_id = row.my.circ.target_copy();
595                                                         if (typeof copy_id == 'object') {
596                                                                 if (copy_id != null) {
597                                                                         copy_id = copy_id.id();
598                                                                 } else {
599                                                                         if (typeof robj.copy == 'object' && robj.copy != null) copy_id = robj.copy.id();
600                                                                 }
601                                                         } else {
602                                                                         if (typeof robj.copy == 'object' && robj.copy != null) copy_id = robj.copy.id();
603                                                         }
604                                                         
605                                                         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 ) }) );
606                 
607                                                         if (typeof params.on_retrieve == 'function') {
608                                                                 params.on_retrieve(row);
609                                                         }
610                                                 } catch(E) {
611                                                         obj.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.items.retrieve_row.callback_error'), E);
612                                                 }
613                                         }
614                                 );
615                         } else {
616                     var copy_id = row.my.circ ? row.my.circ.target_copy() : null;
617                                 if (typeof copy_id == 'object') {
618                                         if (copy_id != null) {
619                                                 copy_id = copy_id.id();
620                                         } else {
621                                                 if (typeof row.my.acp == 'object' && row.my.acp != null) copy_id = row.my.acp.id();
622                                         }
623                                 } else {
624                                                 if (typeof row.my.acp == 'object' && row.my.acp != null) copy_id = row.my.acp.id();
625                                 }
626  
627                                 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) }) );
628                                 if (typeof params.on_retrieve == 'function') {
629                                         params.on_retrieve(row);
630                                 }
631                         }
632     
633                         return row;
634             } catch(E) {
635                 obj.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.items.retrieve_row.error_in_retrieve_row'),E);
636                 return params.row;
637             }
638                 }
639
640                 JSAN.use('util.list'); obj.list = new util.list('items_list');
641                 obj.list.init(
642                         {
643                                 'columns' : columns,
644                                 'map_row_to_columns' : circ.util.std_map_row_to_columns(),
645                                 'retrieve_row' : retrieve_row,
646                                 'on_select' : function(ev) {
647                                         JSAN.use('util.functional');
648                                         var sel = obj.list.retrieve_selection();
649                                         obj.controller.view.sel_clip.setAttribute('disabled',sel.length < 1);
650                                         var list = util.functional.map_list(
651                                                 sel,
652                                                 function(o) { return JSON2js( o.getAttribute('retrieve_id') ); }
653                                         );
654                                         if (typeof obj.on_select == 'function') {
655                                                 obj.on_select(list);
656                                         }
657                                         if (typeof window.xulG == 'object' && typeof window.xulG.on_select == 'function') {
658                                                 obj.error.sdump('D_PATRON','patron.items: Calling external .on_select()\n');
659                                                 window.xulG.on_select(list);
660                                         } else {
661                                                 obj.error.sdump('D_PATRON','patron.items: No external .on_select()\n');
662                                         }
663                                 }
664                         }
665                 );
666                 
667                 obj.list2 = new util.list('items_list2');
668                 obj.list2.init(
669                         {
670                                 'columns' : columns2,
671                                 'map_row_to_columns' : circ.util.std_map_row_to_columns(),
672                                 'retrieve_row' : retrieve_row,
673                                 'on_select' : function(ev) {
674                                         JSAN.use('util.functional');
675                                         var sel = obj.list2.retrieve_selection();
676                                         obj.controller.view.sel_clip2.setAttribute('disabled',sel.length < 1);
677                                         var list = util.functional.map_list(
678                                                 sel,
679                                                 function(o) { return JSON2js( o.getAttribute('retrieve_id') ); }
680                                         );
681                                         if (typeof obj.on_select2 == 'function') {
682                                                 obj.on_select2(list);
683                                         }
684                                 }
685                         }
686                 );
687         },
688
689         'refresh' : function(circ_id,move_to_bottom_list) {
690                 var obj = this;
691                 try {
692                         var nparams = obj.list_circ_map[circ_id];
693             if (move_to_bottom_list) { 
694                 obj.list_circ_map[circ_id].my_node.setAttribute('hidden','true');
695                                 var nparams2 = obj.list2.append( { 'row' : { 'my' : { 'circ_id' : circ_id } },  'to_bottom' : true, 'which_list' : 1 } );
696                                 obj.list_circ_map[circ_id] = nparams2; 
697             } else {
698                         var which_list = nparams.which_list;
699                 switch(which_list) {
700                     case 1:
701                                         case '1':
702                         setTimeout(function(){try{obj.list2.refresh_row(nparams);}catch(E){
703                                                                                                         obj.error.standard_unexpected_error_alert($("patronStrings").getFormattedString('staff.patron.items.refresh.error_refreshing_row2', [circ_id, nparams]),E);}},1000);
704                         break;
705                     default:
706                         setTimeout(function(){try{obj.list.refresh_row(nparams);}catch(E){
707                                                                                                         obj.error.standard_unexpected_error_alert($("patronStrings").getFormattedString('staff.patron.items.refresh.error_refreshing_row2', [circ_id, nparams]),E);}},1000);
708                         break;
709                 }
710             }
711                 } catch(E) {
712                         obj.error.standard_unexpected_error_alert($("patronStrings").getFormattedString('staff.patron.items.refresh.error_refreshing_row', [circ_id, nparams]),E);
713                 }
714         },
715
716         'retrieve' : function(dont_show_me_the_list_change) {
717                 var obj = this;
718                 if (window.xulG && window.xulG.checkouts) {
719                         obj.checkouts = window.xulG.checkouts;
720                 } else {
721                         obj.checkouts = [];
722                         obj.checkouts2 = [];
723                         var robj = obj.network.simple_request(
724                                 'FM_CIRC_RETRIEVE_VIA_USER.authoritative',
725                                 [ ses(), obj.patron_id ]
726                         );
727                         if (typeof robj.ilsevent!='undefined') {
728                                 obj.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.items.retrieve.err_retrieving_circulations'),E);
729                         } else {
730                                 obj.checkouts = obj.checkouts.concat( robj.overdue );
731                                 obj.checkouts = obj.checkouts.concat( robj.out );
732                                 obj.checkouts2 = obj.checkouts2.concat( robj.lost );
733                                 obj.checkouts2 = obj.checkouts2.concat( robj.claims_returned );
734                                 obj.checkouts2 = obj.checkouts2.concat( robj.long_overdue );
735                         }
736                         var robj = obj.network.simple_request(
737                                 'FM_CIRC_IN_WITH_FINES_VIA_USER.authoritative',
738                                 [ ses(), obj.patron_id ]
739                         );
740                         if (typeof robj.ilsevent!='undefined') {
741                                 obj.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.items.retrieve.err_retrieving_circulations'),E);
742                         } else {
743                                 obj.checkouts2 = obj.checkouts2.concat( robj.lost );
744                                 obj.checkouts2 = obj.checkouts2.concat( robj.claims_returned );
745                                 obj.checkouts2 = obj.checkouts2.concat( robj.long_overdue );
746                         }
747                 }
748
749                 function gen_list_append(circ_id,which_list) {
750                         return function() {
751                                 try {
752                                         var nparams;
753                                         switch(which_list) {
754                                                 case 1:
755                                                         nparams = obj.list2.append( { 'row' : { 'my' : { 'circ_id' : circ_id } },  'to_bottom' : true, 'which_list' : which_list } );
756                                                 break;
757                                                 default:
758                                                         nparams = obj.list.append( { 'row' : { 'my' : { 'circ_id' : circ_id } }, 'to_bottom' : true, 'which_list' : which_list } );
759                                                 break;
760                                         }
761                                         if (nparams) {
762                                                 obj.list_circ_map[circ_id] = nparams; // unlike item status interface, each circ should be in this list only once
763                                         } else {
764                                                 throw('typeof nparams = ' + typeof nparams);
765                                         }
766                                 } catch(E) {
767                                         obj.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.items.gen_list_append.error'),E);
768                                 }
769                         };
770                 }
771
772                 obj.list.clear(); obj.list2.clear();
773
774                 JSAN.use('util.exec'); var exec = new util.exec();
775                 var rows = [];
776                 for (var i in obj.checkouts) {
777                         rows.push( gen_list_append(obj.checkouts[i],0) );
778                 }
779                 for (var i in obj.checkouts2) {
780                         rows.push( gen_list_append(obj.checkouts2[i],1) );
781                 }
782                 exec.chain( rows );
783                 if (!dont_show_me_the_list_change) {
784                         if (window.xulG && typeof window.xulG.on_list_change == 'function') {
785                                 try { window.xulG.on_list_change(obj.checkouts); } catch(E) { this.error.sdump('D_ERROR',E); }
786                         }
787                 }
788         },
789
790         'on_select' : function(list) {
791
792                 dump('patron.items.on_select list = ' + js2JSON(list) + '\n');
793
794                 var obj = this;
795
796                 obj.controller.view.cmd_items_claimed_returned.setAttribute('disabled','false');
797                 obj.controller.view.cmd_items_renew.setAttribute('disabled','false');
798                 obj.controller.view.cmd_items_checkin.setAttribute('disabled','false');
799                 obj.controller.view.cmd_items_edit.setAttribute('disabled','false');
800                 obj.controller.view.cmd_items_mark_lost.setAttribute('disabled','false');
801                 obj.controller.view.cmd_show_catalog.setAttribute('disabled','false');
802                 obj.controller.view.sel_copy_details.setAttribute('disabled','false');
803                 obj.controller.view.sel_bucket.setAttribute('disabled','false');
804                 obj.controller.view.sel_patron.setAttribute('disabled','false');
805                 obj.controller.view.sel_mark_items_damaged.setAttribute('disabled','false');
806                 obj.controller.view.sel_mark_items_missing.setAttribute('disabled','false');
807
808                 obj.retrieve_ids = list;
809         },
810
811         'on_select2' : function(list) {
812         
813                 dump('patron.items.on_select2 list = ' + js2JSON(list) + '\n');
814
815                 var obj = this;
816
817                 obj.controller.view.cmd_items_claimed_returned2.setAttribute('disabled','false');
818                 obj.controller.view.cmd_items_renew2.setAttribute('disabled','false');
819                 obj.controller.view.cmd_items_checkin2.setAttribute('disabled','false');
820                 obj.controller.view.cmd_items_edit2.setAttribute('disabled','false');
821                 obj.controller.view.cmd_items_mark_lost2.setAttribute('disabled','false');
822                 obj.controller.view.cmd_show_catalog2.setAttribute('disabled','false');
823                 obj.controller.view.sel_copy_details2.setAttribute('disabled','false');
824                 obj.controller.view.sel_bucket2.setAttribute('disabled','false');
825                 obj.controller.view.sel_patron2.setAttribute('disabled','false');
826                 obj.controller.view.sel_mark_items_damaged2.setAttribute('disabled','false');
827                 obj.controller.view.sel_mark_items_missing2.setAttribute('disabled','false');
828
829                 this.retrieve_ids2 = list;
830         }
831
832 }
833
834 dump('exiting patron.items.js\n');