]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/circ/copy_status.js
explicit number casting for JSON results
[Evergreen.git] / Open-ILS / xul / staff_client / server / circ / copy_status.js
1 dump('entering circ.copy_status.js\n');
2 // vim:noet:sw=4:ts=4:
3
4 if (typeof circ == 'undefined') { circ = {}; }
5 circ.copy_status = function (params) {
6
7         JSAN.use('util.error'); this.error = new util.error();
8         JSAN.use('util.network'); this.network = new util.network();
9         JSAN.use('util.barcode');
10         JSAN.use('util.date');
11         JSAN.use('OpenILS.data'); this.data = new OpenILS.data(); this.data.init({'via':'stash'});
12         JSAN.use('util.sound'); this.sound = new util.sound();
13 };
14
15 circ.copy_status.prototype = {
16         'selection_list' : [],
17         'list_copyid_map' : {},
18
19         'init' : function( params ) {
20
21                 var obj = this;
22
23                 JSAN.use('circ.util');
24                 var columns = circ.util.columns( 
25                         { 
26                                 'barcode' : { 'hidden' : false },
27                                 'title' : { 'hidden' : false },
28                                 'location' : { 'hidden' : false },
29                                 'call_number' : { 'hidden' : false },
30                                 'status' : { 'hidden' : false },
31                                 'alert_message' : { 'hidden' : false },
32                                 'due_date' : { 'hidden' : false }
33                         },
34                         {
35                                 'except_these' : [
36                                         'checkin_time', 'checkin_time_full', 'route_to', 'message', 'uses', 'xact_finish'
37                                 ]
38                         }
39                 );
40
41                 JSAN.use('util.list'); obj.list = new util.list('copy_status_list');
42                 obj.list.init(
43                         {
44                                 'columns' : columns,
45                                 'map_row_to_columns' : circ.util.std_map_row_to_columns(),
46                                 'on_select' : function(ev) {
47                                         try {
48                                                 JSAN.use('util.functional');
49                                                 var sel = obj.list.retrieve_selection();
50                                                 obj.selection_list = util.functional.map_list(
51                                                         sel,
52                                                         function(o) { return JSON2js(o.getAttribute('retrieve_id')); }
53                                                 );
54                                                 obj.error.sdump('D_TRACE','circ/copy_status: selection list = ' + js2JSON(obj.selection_list) );
55                                                 if (obj.selection_list.length == 0) {
56                                                         obj.controller.view.sel_checkin.setAttribute('disabled','true');
57                                                         obj.controller.view.cmd_replace_barcode.setAttribute('disabled','true');
58                                                         obj.controller.view.sel_edit.setAttribute('disabled','true');
59                                                         obj.controller.view.sel_opac.setAttribute('disabled','true');
60                                                         obj.controller.view.sel_bucket.setAttribute('disabled','true');
61                                                         obj.controller.view.sel_copy_details.setAttribute('disabled','true');
62                                                         obj.controller.view.sel_mark_items_damaged.setAttribute('disabled','true');
63                                                         obj.controller.view.sel_mark_items_missing.setAttribute('disabled','true');
64                                                         obj.controller.view.sel_patron.setAttribute('disabled','true');
65                                                         obj.controller.view.sel_spine.setAttribute('disabled','true');
66                                                         obj.controller.view.sel_transit_abort.setAttribute('disabled','true');
67                                                         obj.controller.view.sel_clip.setAttribute('disabled','true');
68                                                         obj.controller.view.sel_renew.setAttribute('disabled','true');
69                                                         obj.controller.view.cmd_add_items.setAttribute('disabled','true');
70                                                         obj.controller.view.cmd_delete_items.setAttribute('disabled','true');
71                                                         obj.controller.view.cmd_transfer_items.setAttribute('disabled','true');
72                                                         obj.controller.view.cmd_add_volumes.setAttribute('disabled','true');
73                                                         obj.controller.view.cmd_edit_volumes.setAttribute('disabled','true');
74                                                         obj.controller.view.cmd_delete_volumes.setAttribute('disabled','true');
75                                                         obj.controller.view.cmd_mark_volume.setAttribute('disabled','true');
76                                                         obj.controller.view.cmd_mark_library.setAttribute('disabled','true');
77                                                         obj.controller.view.cmd_transfer_volume.setAttribute('disabled','true');
78                                                 } else {
79                                                         obj.controller.view.sel_checkin.setAttribute('disabled','false');
80                                                         obj.controller.view.cmd_replace_barcode.setAttribute('disabled','false');
81                                                         obj.controller.view.sel_edit.setAttribute('disabled','false');
82                                                         obj.controller.view.sel_opac.setAttribute('disabled','false');
83                                                         obj.controller.view.sel_patron.setAttribute('disabled','false');
84                                                         obj.controller.view.sel_bucket.setAttribute('disabled','false');
85                                                         obj.controller.view.sel_copy_details.setAttribute('disabled','false');
86                                                         obj.controller.view.sel_mark_items_damaged.setAttribute('disabled','false');
87                                                         obj.controller.view.sel_mark_items_missing.setAttribute('disabled','false');
88                                                         obj.controller.view.sel_spine.setAttribute('disabled','false');
89                                                         obj.controller.view.sel_transit_abort.setAttribute('disabled','false');
90                                                         obj.controller.view.sel_clip.setAttribute('disabled','false');
91                                                         obj.controller.view.sel_renew.setAttribute('disabled','false');
92                                                         obj.controller.view.cmd_add_items.setAttribute('disabled','false');
93                                                         obj.controller.view.cmd_delete_items.setAttribute('disabled','false');
94                                                         obj.controller.view.cmd_transfer_items.setAttribute('disabled','false');
95                                                         obj.controller.view.cmd_add_volumes.setAttribute('disabled','false');
96                                                         obj.controller.view.cmd_edit_volumes.setAttribute('disabled','false');
97                                                         obj.controller.view.cmd_delete_volumes.setAttribute('disabled','false');
98                                                         obj.controller.view.cmd_mark_volume.setAttribute('disabled','false');
99                                                         obj.controller.view.cmd_mark_library.setAttribute('disabled','false');
100                                                         obj.controller.view.cmd_transfer_volume.setAttribute('disabled','false');
101                                                 }
102                                         } catch(E) {
103                                                 alert('FIXME: ' + E);
104                                         }
105                                 }
106                         }
107                 );
108                 
109                 JSAN.use('util.controller'); obj.controller = new util.controller();
110                 obj.controller.init(
111                         {
112                                 'control_map' : {
113                                         'save_columns' : [ [ 'command' ], function() { obj.list.save_columns(); } ],
114                                         'sel_clip' : [
115                                                 ['command'],
116                                                 function() { obj.list.clipboard(); }
117                                         ],
118                                         'sel_checkin' : [
119                                                 ['command'],
120                                                 function() {
121                                                         try {
122                                                                 var funcs = [];
123                                                                 JSAN.use('circ.util');
124                                                                 for (var i = 0; i < obj.selection_list.length; i++) {
125                                                                         var barcode = obj.selection_list[i].barcode;
126                                                                         var checkin = circ.util.checkin_via_barcode( ses(), { 'barcode' : barcode } );
127                                                                         funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(barcode) );
128                                                                 }
129                                                                 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
130                                                                 alert(document.getElementById('circStrings').getString('staff.circ.copy_status.action.complete'));
131                                                         } catch(E) {
132                                                                 obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.copy_status.sel_checkin.error'),E);
133                                                         }
134                                                 }
135                                         ],
136                                         'cmd_replace_barcode' : [
137                                                 ['command'],
138                                                 function() {
139                                                         try {
140                                                                 var funcs = [];
141                                                                 JSAN.use('cat.util');
142                                                                 for (var i = 0; i < obj.selection_list.length; i++) {
143                                                                         try { 
144                                                                                 var barcode = obj.selection_list[i].barcode;
145                                                                                 var new_bc = cat.util.replace_barcode( barcode );
146                                                                                 funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(new_bc) );
147                                                                         } catch(E) {
148                                                                                 obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.cmd_replace_barcode.error', [barcode]), E);
149                                                                         }
150                                                                 }
151                                                                 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
152                                                                 alert(document.getElementById('circStrings').getString('staff.circ.copy_status.action.complete'));
153                                                         } catch(E) {
154                                                                 obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.copy_status.cmd_replace_barcodes.error'), E);
155                                                         }
156                                                 }
157                                         ],
158                                         'sel_edit' : [
159                                                 ['command'],
160                                                 function() {
161                                                         try {
162                                                                 var funcs = [];
163                                                                 obj.spawn_copy_editor();
164                                                                 for (var i = 0; i < obj.selection_list.length; i++) {
165                                                                                 var barcode = obj.selection_list[i].barcode;
166                                                                                 funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(barcode) );
167                                                                 }
168                                                                 for (var i = 0; i < funcs.length; i++) { funcs[i](); }
169                                                         } catch(E) {
170                                                                 obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.copy_status.sel_edit.error'), E);
171                                                         }
172                                                 }
173                                         ],
174                                         'sel_spine' : [
175                                                 ['command'],
176                                                 function() {
177                                                         JSAN.use('cat.util');
178                                                         cat.util.spawn_spine_editor(obj.selection_list);
179                                                 }
180                                         ],
181                                         'sel_opac' : [
182                                                 ['command'],
183                                                 function() {
184                                                         JSAN.use('cat.util');
185                                                         cat.util.show_in_opac(obj.selection_list);
186                                                 }
187                                         ],
188                                         'sel_transit_abort' : [
189                                                 ['command'],
190                                                 function() {
191                                                         var funcs = [];
192                                                         JSAN.use('circ.util');
193                                                         circ.util.abort_transits(obj.selection_list);
194                                                         for (var i = 0; i < obj.selection_list.length; i++) {
195                                                                 var barcode = obj.selection_list[i].barcode;
196                                                                 funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(barcode) );
197                                                         }
198                                                         for (var i = 0; i < funcs.length; i++) { funcs[i](); }
199                                                         alert(document.getElementById('circStrings').getString('staff.circ.copy_status.action.complete'));
200                                                 }
201                                         ],
202                                         'sel_patron' : [
203                                                 ['command'],
204                                                 function() {
205                                                         JSAN.use('circ.util');
206                                                         circ.util.show_last_few_circs(obj.selection_list);
207                                                 }
208                                         ],
209                                         'sel_copy_details' : [
210                                                 ['command'],
211                                                 function() {
212                                                         JSAN.use('circ.util');
213                                                         for (var i = 0; i < obj.selection_list.length; i++) {
214                                                                 circ.util.show_copy_details( obj.selection_list[i].copy_id );
215                                                         }
216                                                 }
217                                         ],
218                                         'sel_renew' : [
219                                                 ['command'],
220                                                 function() {
221                                                         var funcs = [];
222                                                         JSAN.use('circ.util');
223                                                         for (var i = 0; i < obj.selection_list.length; i++) {
224                                                                 var test = obj.selection_list[i].renewable;
225                                                                 var barcode = obj.selection_list[i].barcode;
226                                                                 if (test == 't') {
227                                                                         circ.util.renew_via_barcode( barcode );
228                                                                         funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(barcode) );
229                                                                 } else {
230                                                                         alert(document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.sel_renew.not_circulating', [barcode]));
231                                                                 }
232                                                         }
233                                                         for (var i = 0; i < funcs.length; i++) { funcs[i](); }
234                                                         alert(document.getElementById('circStrings').getString('staff.circ.copy_status.action.complete'));
235                                                 }
236                                         ],
237
238                                         'sel_mark_items_damaged' : [
239                                                 ['command'],
240                                                 function() {
241                                                         var funcs = [];
242                                                         JSAN.use('cat.util'); JSAN.use('util.functional');
243                                                         cat.util.mark_item_damaged( util.functional.map_list( obj.selection_list, function(o) { return o.copy_id; } ) );
244                                                         for (var i = 0; i < obj.selection_list.length; i++) {
245                                                                 var barcode = obj.selection_list[i].barcode;
246                                                                 funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(barcode) );
247                                                         }
248                                                         for (var i = 0; i < funcs.length; i++) { funcs[i](); }
249                                                 }
250                                         ],
251                                         'sel_mark_items_missing' : [
252                                                 ['command'],
253                                                 function() {
254                                                         var funcs = [];
255                                                         JSAN.use('cat.util'); JSAN.use('util.functional');
256                                                         cat.util.mark_item_missing( util.functional.map_list( obj.selection_list, function(o) { return o.copy_id; } ) );
257                                                         for (var i = 0; i < obj.selection_list.length; i++) {
258                                                                 var barcode = obj.selection_list[i].barcode;
259                                                                 funcs.push( function(a) { return function() { obj.copy_status( a, true ); }; }(barcode) );
260                                                         }
261                                                         for (var i = 0; i < funcs.length; i++) { funcs[i](); }
262                                                 }
263                                         ],
264                                         'sel_bucket' : [
265                                                 ['command'],
266                                                 function() {
267                                                         JSAN.use('cat.util');
268                                                         cat.util.add_copies_to_bucket(obj.selection_list);
269                                                 }
270                                         ],
271                                         'copy_status_barcode_entry_textbox' : [
272                                                 ['keypress'],
273                                                 function(ev) {
274                                                         if (ev.keyCode && ev.keyCode == 13) {
275                                                                 obj.copy_status();
276                                                         }
277                                                 }
278                                         ],
279                                         'cmd_broken' : [
280                                                 ['command'],
281                                                 function() { alert(document.getElementById('circStrings').getString('staff.circ.unimplemented')); }
282                                         ],
283                                         'cmd_copy_status_submit_barcode' : [
284                                                 ['command'],
285                                                 function() {
286                                                         obj.copy_status();
287                                                 }
288                                         ],
289                                         'cmd_copy_status_upload_file' : [
290                                                 ['command'],
291                                                 function() {
292                                                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
293                                                         JSAN.use('util.file');
294                                                         var f = new util.file('');
295                             var content = f.import_file( { 'title' : document.getElementById('circStrings').getString('staff.circ.copy_status.upload_file.title'), 'not_json' : true } );
296                             if (!content) { return; }
297                                                         var barcodes = content.split(/\s+/);
298                                         if (barcodes.length > 0) {
299                                             JSAN.use('util.exec'); var exec = new util.exec();
300                                             var funcs = [];
301                                             for (var i = 0; i < barcodes.length; i++) {
302                                                 funcs.push(
303                                                     function(b){
304                                                         return function() {
305                                                             obj.copy_status(b);
306                                                         };
307                                                     }(barcodes[i])
308                                                 );
309                                             }
310                                                                 funcs.push( function() { alert(document.getElementById('circStrings').getString('staff.circ.copy_status.upload_file.complete')); } );
311                                             exec.chain( funcs );
312                                         } else {
313                                                                 alert(document.getElementById('circStrings').getString('staff.circ.copy_status.upload_file.no_barcodes'));
314                                                         }
315
316                                                 }
317                                         ],
318                                         'cmd_copy_status_print' : [
319                                                 ['command'],
320                                                 function() {
321                                                         try {
322                                 var p = { 
323                                     'template' : 'item_status'
324                                 };
325                                                                 obj.list.print(p);
326                                                         } catch(E) {
327                                                                 obj.error.standard_unexpected_error_alert('print',E); 
328                                                         }
329                                                 }
330                                         ],
331                                         'cmd_copy_status_export' : [
332                                                 ['command'],
333                                                 function() {
334                                                         try {
335                                                                 obj.list.dump_csv_to_clipboard();
336                                                         } catch(E) {
337                                                                 obj.error.standard_unexpected_error_alert('export',E); 
338                                                         }
339                                                 }
340                                         ],
341                                         'cmd_copy_status_print_export' : [
342                                                 ['command'],
343                                                 function() {
344                                                         try {
345                                                                 obj.list.on_all_fleshed =
346                                                                         function() {
347                                                                                 try {
348                                                                                         dump( obj.list.dump_csv() + '\n' );
349                                                                                         //copy_to_clipboard(obj.list.dump_csv());
350                                                                                         JSAN.use('util.print'); var print = new util.print();
351                                                                                         print.simple(obj.list.dump_csv(),{'content_type':'text/plain'});
352                                                                                         setTimeout(function(){ obj.list.on_all_fleshed = null; },0);
353                                                                                 } catch(E) {
354                                                                                         obj.error.standard_unexpected_error_alert('export',E); 
355                                                                                 }
356                                                                         };
357                                                                 obj.list.full_retrieve();
358                                                         } catch(E) {
359                                                                 obj.error.standard_unexpected_error_alert('export',E); 
360                                                         }
361                                                 }
362                                         ],
363
364                                         'cmd_add_items' : [
365                                                 ['command'],
366                                                 function() {
367                                                         try {
368
369                                                                 JSAN.use('util.functional');
370                                                                 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
371                                                                 if (list.length == 0) { return; }
372
373                                                                 var copy_shortcut = {}; var map_acn = {};
374
375                                                                 for (var i = 0; i < list.length; i++) {
376                                                                         var volume_id = list[i];
377                                                                         if (volume_id == -1) { 
378                                                                                 continue; /* ignore magic pre-cat volume */
379                                                                         }
380                                                                         if (! map_acn[volume_id]) {
381                                                                                 map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE',[ volume_id ]);
382                                                                         }
383                                                                         var record_id = map_acn[ volume_id ].record();
384                                                                         var ou_id = map_acn[ volume_id ].owning_lib();
385                                                                         var label = map_acn[ volume_id ].label();
386                                                                         if (!copy_shortcut[record_id]) {
387                                                                                 copy_shortcut[record_id] = {};
388                                                                         }
389                                                                         if (!copy_shortcut[record_id][ou_id]) {
390                                                                                 copy_shortcut[record_id][ou_id] = {};
391                                                                         }
392                                                                         copy_shortcut[record_id][ou_id][ label ] = volume_id;
393
394                                                                 }
395
396                                                                 for (var r in copy_shortcut) {
397
398                                                                         /* quick fix */  /* what was this fixing? */
399                                                                         list = []; for (var i in copy_shortcut[r]) { list.push( i ); }
400
401                                                                         var edit = 0;
402                                                                         try {
403                                                                                 edit = obj.network.request(
404                                                                                         api.PERM_MULTI_ORG_CHECK.app,
405                                                                                         api.PERM_MULTI_ORG_CHECK.method,
406                                                                                         [ 
407                                                                                                 ses(), 
408                                                                                                 obj.data.list.au[0].id(), 
409                                                                                                 list,
410                                                                                                 [ 'CREATE_COPY' ]
411                                                                                         ]
412                                                                                 ).length == 0 ? 1 : 0;
413                                                                         } catch(E) {
414                                                                                 obj.error.sdump('D_ERROR','batch permission check: ' + E);
415                                                                         }
416         
417                                                                         if (edit==0) { 
418                                                                                 return; // no read-only view for this interface
419                                                                         }
420         
421                                                                         var title = document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.add_items.title', [r]);
422         
423                                                                         JSAN.use('util.window'); var win = new util.window();
424                                                                         var w = win.open(
425                                                                                 window.xulG.url_prefix(urls.XUL_VOLUME_COPY_CREATOR),
426                                                                                         //+'?doc_id=' + window.escape(r)
427                                                                                         //+'&ou_ids=' + window.escape( js2JSON(list) )
428                                                                                         //+'&copy_shortcut=' + window.escape( js2JSON(copy_shortcut[r]) ),
429                                                                                 title,
430                                                                                 'chrome,resizable',
431                                                                                 { 'doc_id' : r, 'ou_ids' : list, 'copy_shortcut' : copy_shortcut[r] }
432                                                                         );
433                                                                 }
434
435                                                         } catch(E) {
436                                                                 obj.error.standard_unexpected_error_alert('copy status -> add copies',E);
437                                                         }
438                                                 }
439
440                                         ],
441                                         'cmd_delete_items' : [
442                                                 ['command'],
443                                                 function() {
444                                                         try {
445
446                                 JSAN.use('util.functional');
447
448                                                                 var list = util.functional.map_list( obj.selection_list, function(o) { return o.copy_id; } );
449
450                                 var copies = util.functional.map_list(
451                                     list,
452                                     function (acp_id) {
453                                         return obj.network.simple_request('FM_ACP_RETRIEVE',[acp_id]);
454                                     }
455                                 );
456
457                                 for (var i = 0; i < copies.length; i++) {
458                                     copies[i].ischanged(1);
459                                     copies[i].isdeleted(1);
460                                 }
461
462                                                                 if (! window.confirm(document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.del_items.confirm', [util.functional.map_list( copies, function(o) { return o.barcode(); }).join(", ")]))) {
463                                                                         return;
464                                                                 }
465
466                                 var robj = obj.network.simple_request('FM_ACP_FLESHED_BATCH_UPDATE',[ ses(), copies, true]);
467                                                                 var robj = obj.network.simple_request(
468                                                                         'FM_ACP_FLESHED_BATCH_UPDATE', 
469                                                                         [ ses(), copies, true ], 
470                                                                         null,
471                                                                         {
472                                                                                 'title' : document.getElementById('circStrings').getString('staff.circ.copy_status.del_items.title'),
473                                                                                 'overridable_events' : [
474                                                                                         1208 /* TITLE_LAST_COPY */,
475                                                                                         1227 /* COPY_DELETE_WARNING */
476                                                                                 ]
477                                                                         }
478                                                                 );
479         
480                                 if (typeof robj.ilsevent != 'undefined') {
481                                                                         switch(Number(robj.ilsevent)) {
482                                                                                 case 1208 /* TITLE_LAST_COPY */:
483                                                                                 case 1227 /* COPY_DELETE_WARNING */:
484                                                                                 break;
485                                                                                 default:
486                                                                                         obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.copy_status.del_items.success.error'), robj);
487                                                                                 break;
488                                                                         }
489                                                                 } else { alert(document.getElementById('circStrings').getString('staff.circ.copy_status.del_items.success')); }
490
491                                                         } catch(E) {
492                                                                 obj.error.standard_unexpected_error_alert('copy status -> delete items',E);
493                                                         }
494                                                 }
495                                         ],
496                                         'cmd_transfer_items' : [
497                                                 ['command'],
498                                                 function() {
499                                                                 try {
500                                                                         obj.data.stash_retrieve();
501                                                                         if (!obj.data.marked_volume) {
502                                                                                 alert(document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_items.mark_destination'));
503                                                                                 return;
504                                                                         }
505                                                                         
506                                                                         JSAN.use('util.functional');
507
508                                                                         var list = util.functional.map_list( obj.selection_list, function(o) { return o.copy_id; } );
509
510                                                                         var volume = obj.network.simple_request('FM_ACN_RETRIEVE',[ obj.data.marked_volume ]);
511
512                                                                         JSAN.use('cat.util'); cat.util.transfer_copies( { 
513                                                                                 'copy_ids' : list, 
514                                                                                 'docid' : volume.record(),
515                                                                                 'volume_label' : volume.label(),
516                                                                                 'owning_lib' : volume.owning_lib()
517                                                                         } );
518
519                                                                 } catch(E) {
520                                                                         obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_items.problem'), E);
521                                                                 }
522                                                         }
523
524                                         ],
525                                         'cmd_add_volumes' : [
526                                                 ['command'],
527                                                 function() {
528                                                         try {
529                                                                 JSAN.use('util.functional');
530                                                                 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
531                                                                 if (list.length == 0) { return; }
532
533                                                                 var aou_hash = {}; var map_acn = {};
534
535                                                                 for (var i = 0; i < list.length; i++) {
536                                                                         var volume_id = list[i];
537                                                                         if (volume_id == -1) {
538                                                                                 continue; /* ignore magic pre-cat volume */
539                                                                         }
540                                                                         if (! map_acn[volume_id]) {
541                                                                                 map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE',[ volume_id ]);
542                                                                         }
543                                                                         var record_id = map_acn[ volume_id ].record();
544                                                                         var ou_id = map_acn[ volume_id ].owning_lib();
545                                                                         var label = map_acn[ volume_id ].label();
546                                                                         if (!aou_hash[record_id]) aou_hash[record_id] = {};
547                                                                         aou_hash[record_id][ou_id] = 1;
548
549                                                                 }
550
551                                                                 for (var r in aou_hash) {
552
553                                                                         list = []; for (var org in aou_hash[r]) list.push(org);
554
555                                                                         var edit = 0;
556                                                                         try {
557                                                                                 edit = obj.network.request(
558                                                                                         api.PERM_MULTI_ORG_CHECK.app,
559                                                                                         api.PERM_MULTI_ORG_CHECK.method,
560                                                                                         [ 
561                                                                                                 ses(), 
562                                                                                                 obj.data.list.au[0].id(), 
563                                                                                                 list,
564                                                                                                 [ 'CREATE_VOLUME', 'CREATE_COPY' ]
565                                                                                         ]
566                                                                                 ).length == 0 ? 1 : 0;
567                                                                         } catch(E) {
568                                                                                 obj.error.sdump('D_ERROR','batch permission check: ' + E);
569                                                                         }
570
571                                                                         if (edit==0) {
572                                                                                 alert(document.getElementById('circStrings').getString('staff.circ.copy_status.add_volumes.perm_failure'));
573                                                                                 return; // no read-only view for this interface
574                                                                         }
575
576                                                                         var title = document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.add_volumes.title', [r]);
577
578                                                                         JSAN.use('util.window'); var win = new util.window();
579                                                                         var w = win.open(
580                                                                                 window.xulG.url_prefix(urls.XUL_VOLUME_COPY_CREATOR),
581                                                                                         //+'?doc_id=' + window.escape(r)
582                                                                                         //+'&ou_ids=' + window.escape( js2JSON(list) ),
583                                                                                 title,
584                                                                                 'chrome,resizable',
585                                                                                 { 'doc_id' : r, 'ou_ids' : list }
586                                                                         );
587
588                                                                 }
589
590                                                         } catch(E) {
591                                                                 obj.error.standard_unexpected_error_alert('copy status -> add volumes',E);
592                                                         }
593                                                 }
594
595                                         ],
596                                         'cmd_edit_volumes' : [
597                                                 ['command'],
598                                                 function() {
599                                                         try {
600                                                                 JSAN.use('util.functional');
601                                                                 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
602                                                                 if (list.length == 0) { return; }
603
604                                                                 var volume_hash = {}; var map_acn = {};
605
606                                                                 for (var i = 0; i < list.length; i++) {
607                                                                         var volume_id = list[i];
608                                                                         if (volume_id == -1) {
609                                                                                 continue; /* ignore magic pre-cat volume */
610                                                                         }
611                                                                         if (! map_acn[volume_id]) {
612                                                                                 map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE',[ volume_id ]);
613                                                                                 map_acn[ volume_id ].copies( [] );
614                                                                         }
615                                                                         var record_id = map_acn[ volume_id ].record();
616                                                                         if (!volume_hash[record_id]) {
617                                                                                 volume_hash[record_id] = {};
618                                                                         }
619                                                                         volume_hash[record_id][volume_id] = 1;
620                                                                 }
621
622                                                                 for (var rec in volume_hash) {
623
624                                                                         list = [];
625                                                                         for (var v in volume_hash[rec]) {
626                                                                                 list.push( map_acn[v] );
627                                                                         }
628
629                                                                         var edit = 0;
630                                                                         try {
631                                                                                 edit = obj.network.request(
632                                                                                         api.PERM_MULTI_ORG_CHECK.app,
633                                                                                         api.PERM_MULTI_ORG_CHECK.method,
634                                                                                         [ 
635                                                                                                 ses(), 
636                                                                                                 obj.data.list.au[0].id(), 
637                                                                                                 util.functional.map_list(
638                                                                                                         list,
639                                                                                                         function (o) {
640                                                                                                                 return o.owning_lib();
641                                                                                                         }
642                                                                                                 ),
643                                                                                                 [ 'UPDATE_VOLUME' ]
644                                                                                         ]
645                                                                                 ).length == 0 ? 1 : 0;
646                                                                         } catch(E) {
647                                                                                 obj.error.sdump('D_ERROR','batch permission check: ' + E);
648                                                                         }
649
650                                                                         if (edit==0) {
651                                                                                 alert(document.getElementById('circStrings').getString('staff.circ.copy_status.edit_volumes.perm_failure'));
652                                                                                 return; // no read-only view for this interface
653                                                                         }
654
655                                                                         var title;
656                                                                         if (list.length == 1) {
657                                                                                 title = document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.edit_volume.title', [rec]);
658                                                                         } else {
659                                                                                 title = document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.edit_volumes.title', [rec]);
660                                                                         }
661
662                                                                         JSAN.use('util.window'); var win = new util.window();
663                                                                         //obj.data.volumes_temp = js2JSON( list );
664                                                                         //obj.data.stash('volumes_temp');
665                                                                         var my_xulG = win.open(
666                                                                                 window.xulG.url_prefix(urls.XUL_VOLUME_EDITOR),
667                                                                                 title,
668                                                                                 'chrome,modal,resizable',
669                                                                                 { 'volumes' : list }
670                                                                         );
671
672                                                                         /* FIXME -- need to unique the temp space, and not rely on modalness of window */
673                                                                         //obj.data.stash_retrieve();
674                                                                         //var volumes = JSON2js( obj.data.volumes_temp );
675                                                                         var volumes = my_xulG.volumes;
676                                                                         if (!volumes) { return; }
677                                                                 
678                                                                         volumes = util.functional.filter_list(
679                                                                                 volumes,
680                                                                                 function (o) {
681                                                                                         return o.ischanged() == '1';
682                                                                                 }
683                                                                         );
684
685                                                                         volumes = util.functional.map_list(
686                                                                                 volumes,
687                                                                                 function (o) {
688                                                                                         o.record( rec ); // staff client 2 did not do this.  Does it matter?
689                                                                                         return o;
690                                                                                 }
691                                                                         );
692
693                                                                         if (volumes.length == 0) { return; }
694
695                                                                         try {
696                                                                                 var r = obj.network.request(
697                                                                                         api.FM_ACN_TREE_UPDATE.app,
698                                                                                         api.FM_ACN_TREE_UPDATE.method,
699                                                                                         [ ses(), volumes, false ]
700                                                                                 );
701                                         if (typeof r.ilsevent != 'undefined') {
702                                             switch(Number(r.ilsevent)) {
703                                                 case 1705 /* VOLUME_LABEL_EXISTS */ :
704                                                     alert(document.getElementById('circStrings').getString('staff.circ.copy_status.edit_volumes.duplicate'));
705                                                     break;
706                                                 default: throw(r);
707                                             }
708                                         } else {
709                                                                                 alert(document.getElementById('circStrings').getString('staff.circ.copy_status.edit_volumes.success'));
710                                         }
711                                                                         } catch(E) {
712                                                                                 obj.error.standard_unexpected_error_alert('volume update error: ',E);
713                                                                         }
714
715                                                                 }
716                                                         } catch(E) {
717                                                                 obj.error.standard_unexpected_error_alert('Copy Status -> Volume Edit',E);
718                                                         }
719                                                 }
720
721                                         ],
722                                         'cmd_delete_volumes' : [
723                                                 ['command'],
724                                                 function() {
725                                                         try {
726                                                                 JSAN.use('util.functional');
727                                                                 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
728                                                                 if (list.length == 0) { return; }
729
730                                                                 var map_acn = {};
731
732                                                                 for (var i = 0; i < list.length; i++) {
733                                                                         var volume_id = list[i];
734                                                                         if (volume_id == -1) {
735                                                                                 continue; /* ignore magic pre-cat volume */
736                                                                         }
737                                                                         if (! map_acn[volume_id]) {
738                                                                                 map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE',[ volume_id ]);
739                                                                         }
740                                                                 }
741
742                                                                 list = [];
743                                                                 for (var v in map_acn) {
744                                                                         list.push( map_acn[v] );
745                                                                 }
746
747                                                                 var confirm_prompt;
748                                                                 if (list.length == 1) {
749                                                                         confirm_prompt = document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.singular');
750                                                                 } else {
751                                                                         confirm_prompt = document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.plural');
752                                                                 }       
753
754                                                                 var r = obj.error.yns_alert(
755                                                                         confirm_prompt,
756                                                                         document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.title'),
757                                                                         document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.delete'),
758                                                                         document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.cancel'),
759                                                                         null,
760                                                                         document.getElementById('circStrings').getString('staff.circ.confirm')
761                                                                 );
762
763                                                                 if (r == 0) {
764                                                                         for (var i = 0; i < list.length; i++) {
765                                                                                 list[i].isdeleted('1');
766                                                                         }
767                                                                         var robj = obj.network.simple_request(
768                                                                                 'FM_ACN_TREE_UPDATE', 
769                                                                                 [ ses(), list, true ],
770                                                                                 null,
771                                                                                 {
772                                                                                         'title' : document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.override'),
773                                                                                         'overridable_events' : [
774                                                                                         ]
775                                                                                 }
776                                                                         );
777                                                                         if (robj == null) throw(robj);
778                                                                         if (typeof robj.ilsevent != 'undefined') {
779                                                                                 if (robj.ilsevent == 1206 /* VOLUME_NOT_EMPTY */) {
780                                                                                         alert(document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.delete_copies'));
781                                                                                         return;
782                                                                                 }
783                                                                                 if (robj.ilsevent != 0) { throw(robj); }
784                                                                         }
785                                                                         alert(document.getElementById('circStrings').getString('staff.circ.copy_status.delete_volumes.success'));
786                                                                 }
787                                                         } catch(E) {
788                                                                 obj.error.standard_unexpected_error_alert('copy status -> delete volumes',E);
789                                                         }
790
791                                                 }
792
793                                         ],
794                                         'cmd_mark_volume' : [
795                                                 ['command'],
796                                                 function() {
797                                                         try {
798                                                                 JSAN.use('util.functional');
799                                                                 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
800
801                                                                 if (list.length == 1) {
802                                                                         obj.data.marked_volume = list[0];
803                                                                         obj.data.stash('marked_volume');
804                                                                         alert(document.getElementById('circStrings').getString('staff.circ.copy_status.mark_volume.status'));
805                                                                 } else {
806                                                                         obj.error.yns_alert(
807                                                                                 document.getElementById('circStrings').getString('staff.circ.copy_status.mark_volume.prompt'),
808                                                                                 document.getElementById('circStrings').getString('staff.circ.copy_status.mark_volume.title'),
809                                                                                 document.getElementById('circStrings').getString('staff.circ.copy_status.ok'),
810                                                                                 null,
811                                                                                 null,
812                                                                                 document.getElementById('circStrings').getString('staff.circ.confirm')
813                                                                         );
814                                                                 }
815                                                         } catch(E) {
816                                                                 obj.error.standard_unexpected_error_alert('copy status -> mark volume',E);
817                                                         }
818                                                 }
819                                         ],
820                                         'cmd_mark_library' : [
821                                                 ['command'],
822                                                 function() {
823                                                         try {
824                                                                 JSAN.use('util.functional');
825                                                                 var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
826
827                                                                 if (list.length == 1) {
828                                                                         var v = obj.network.simple_request('FM_ACN_RETRIEVE',[list[0]]);
829                                                                         var owning_lib = v.owning_lib();
830                                                                         if (typeof owning_lib == 'object') {
831                                                                                 owning_lib = owning_lib.id();
832                                                                         }
833
834                                                                         obj.data.marked_library = { 'lib' : owning_lib, 'docid' : v.record() };
835                                                                         obj.data.stash('marked_library');
836                                                                         alert(document.getElementById('circStrings').getString('staff.circ.copy_status.mark_library'));
837                                                                 } else {
838                                                                         obj.error.yns_alert(
839                                                                                 document.getElementById('circStrings').getString('staff.circ.copy_status.mark_library.limit_one'),
840                                                                                 document.getElementById('circStrings').getString('staff.circ.copy_status.mark_library.limit_one.title'),
841                                                                                 document.getElementById('circStrings').getString('staff.circ.copy_status.ok'),
842                                                                                 null,
843                                                                                 null,
844                                                                                 document.getElementById('circStrings').getString('staff.circ.confirm')
845                                                                         );
846                                                                 }
847                                                         } catch(E) {
848                                                                 obj.error.standard_unexpected_error_alert('copy status -> mark library',E);
849                                                         }
850                                                 }
851                                         ],
852                                         'cmd_transfer_volume' : [
853                                                 ['command'],
854                                                 function() {
855                                                         try {
856                                                                         obj.data.stash_retrieve();
857                                                                         if (!obj.data.marked_library) {
858                                                                                 alert(document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.none'));
859                                                                                 return;
860                                                                         }
861                                                                         
862                                                                         JSAN.use('util.functional');
863
864                                                                         var list = util.functional.map_list( obj.selection_list, function(o) { return o.acn_id; } );
865                                                                         if (list.length == 0) { return; }
866
867                                                                         var map_acn = {};
868
869                                                                         for (var i = 0; i < list.length; i++) {
870                                                                                 var volume_id = list[i];
871                                                                                 if (volume_id == -1) {
872                                                                                         continue; /* ignore magic pre-cat volume */
873                                                                                 }
874                                                                                 if (! map_acn[volume_id]) {
875                                                                                         map_acn[ volume_id ] = obj.network.simple_request('FM_ACN_RETRIEVE',[ volume_id ]);
876                                                                                 }
877                                                                         }
878
879                                                                         list = [];
880                                                                         for (v in map_acn) {
881                                                                                 list.push(map_acn[v]);
882                                                                         }
883
884                                                                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
885                                                                         var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: auto">';
886                                                                         xml += '<description>';
887
888                                                                         var vols = util.functional.map_list(list,
889                                                                                 function (o) {
890                                                                                         return o.label();
891                                                                                 }
892                                                                         ).join(", ");
893
894                                                                         var volume_list = document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.transfer_volume.confirm', 
895                                                                                 [vols, obj.data.hash.aou[ obj.data.marked_library.lib ].shortname()]);
896
897                                                                         xml += volume_list;
898                                                                         xml += '</description>';
899                                                                         xml += '<hbox><button label="';
900                                                                         xml += document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.transfer.label');
901                                                                         xml += '" name="fancy_submit"/>';
902                                                                         xml += '<button label="';
903                                                                         xml += document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.cancel.label');
904                                                                         xml += '" accesskey="';
905                                                                         xml += document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.cancel.accesskey');
906                                                                         xml += '" name="fancy_cancel"/></hbox>';
907                                                                         xml += '<iframe style="overflow: scroll" flex="1" src="' + urls.XUL_BIB_BRIEF + '?docid=' + obj.data.marked_library.docid + '"/>';
908                                                                         xml += '</vbox>';
909                                                                         JSAN.use('OpenILS.data');
910                                                                         //var data = new OpenILS.data(); data.init({'via':'stash'});
911                                                                         //data.temp_transfer = xml; data.stash('temp_transfer');
912                                                                         JSAN.use('util.window'); var win = new util.window();
913                                                                         var fancy_prompt_data = win.open(
914                                                                                 urls.XUL_FANCY_PROMPT,
915                                                                                 //+ '?xml_in_stash=temp_transfer'
916                                                                                 //+ '&title=' + window.escape('Volume Transfer'),
917                                                                                 'fancy_prompt', 'chrome,resizable,modal,width=500,height=300',
918                                                                                 { 'xml' : xml, 'title' : document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.title') }
919                                                                         );
920                                                                 
921                                                                         if (fancy_prompt_data.fancy_status == 'incomplete') { 
922                                                                                 alert(document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.aborted'));
923                                                                                 return;
924                                                                         }
925
926                                                                         var robj = obj.network.simple_request(
927                                                                                 'FM_ACN_TRANSFER', 
928                                                                                 [ ses(), { 'docid' : obj.data.marked_library.docid, 'lib' : obj.data.marked_library.lib, 'volumes' : util.functional.map_list( list, function(o) { return o.id(); }) } ],
929                                                                                 null,
930                                                                                 {
931                                                                                         'title' : document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.override_failure'),
932                                                                                         'overridable_events' : [
933                                                                                                 1208 /* TITLE_LAST_COPY */,
934                                                                                                 1219 /* COPY_REMOTE_CIRC_LIB */
935                                                                                         ]
936                                                                                 }
937                                                                         );
938
939                                                                         if (typeof robj.ilsevent != 'undefined') {
940                                                                                 if (robj.ilsevent == 1221 /* ORG_CANNOT_HAVE_VOLS */) {
941                                                                                         alert(document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.cannot_have_vols'));
942                                                                                 } else {
943                                                                                         throw(robj);
944                                                                                 }
945                                                                         } else {
946                                                                                 alert(document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.success'));
947                                                                         }
948
949                                                         } catch(E) {
950                                                                 obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.copy_status.transfer_volume.error'),E);
951                                                         }
952                                                 }
953
954                                         ]
955                                 }
956                         }
957                 );
958                 this.controller.render();
959                 this.controller.view.copy_status_barcode_entry_textbox.focus();
960
961         },
962
963         'test_barcode' : function(bc) {
964                 var obj = this;
965                 var good = util.barcode.check(bc);
966                 var x = document.getElementById('strict_barcode');
967                 if (x && x.checked != true) { return true; }
968                 if (good) {
969                         return true;
970                 } else {
971                         if ( 1 == obj.error.yns_alert(
972                                                 document.getElementById('circStrings').getFormattedString('staff.circ.check_digit.bad', [bc]),
973                                                 document.getElementById('circStrings').getString('staff.circ.barcode.bad'),
974                                                 document.getElementById('circStrings').getString('staff.circ.cancel'),
975                                                 document.getElementById('circStrings').getString('staff.circ.barcode.accept'),
976                                                 null,
977                                                 document.getElementById('circStrings').getString('staff.circ.confirm'),
978                                                 '/xul/server/skin/media/images/bad_barcode.png'
979                         ) ) {
980                                 return true;
981                         } else {
982                                 return false;
983                         }
984                 }
985         },
986
987         'copy_status' : function(barcode,refresh) {
988                 var obj = this;
989                 try {
990                         try { document.getElementById('last_scanned').setAttribute('value',''); } catch(E) {}
991                         if (!barcode) {
992                                 barcode = obj.controller.view.copy_status_barcode_entry_textbox.value;
993                         }
994                         if (!barcode) { return; }
995                         if (barcode) {
996                                 if ( obj.test_barcode(barcode) ) { /* good */ } else { /* bad */ return; }
997                         }
998                         JSAN.use('circ.util');
999                         function handle_req(req) {
1000                                 try {
1001                                         var details = req.getResultObject();
1002                                         if (details == null) {
1003                                                 throw(document.getElementById('circStrings').getString('staff.circ.copy_status.status.null_result'));
1004                                         } else if (details.ilsevent) {
1005                                                 switch(Number(details.ilsevent)) {
1006                                                         case -1: 
1007                                                                 obj.error.standard_network_error_alert(); 
1008                                                                 obj.controller.view.copy_status_barcode_entry_textbox.select();
1009                                                                 obj.controller.view.copy_status_barcode_entry_textbox.focus();
1010                                                                 return;
1011                                                         break;
1012                                                         case 1502 /* ASSET_COPY_NOT_FOUND */ :
1013                                                                 try { document.getElementById('last_scanned').setAttribute('value', document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.status.copy_not_found', [barcode])); } catch(E) {}
1014                                                                 obj.error.yns_alert(
1015                                                                         document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.status.copy_not_found', [barcode]),
1016                                                                         document.getElementById('circStrings').getString('staff.circ.copy_status.status.not_cataloged'),
1017                                                                         document.getElementById('circStrings').getString('staff.circ.copy_status.ok'),
1018                                                                         null,
1019                                                                         null,
1020                                                                         document.getElementById('circStrings').getString('staff.circ.confirm.msg')
1021                                                                 );
1022                                                                 obj.controller.view.copy_status_barcode_entry_textbox.select();
1023                                                                 obj.controller.view.copy_status_barcode_entry_textbox.focus();
1024                                                                 return;
1025                                                         break;
1026                                                         default: 
1027                                                                 throw(details); 
1028                                                         break;
1029                                                 }
1030                                         }
1031                                         var msg = details.copy.barcode() + ' -- ';
1032                                         if (details.copy.call_number() == -1) {
1033                                                 msg += document.getElementById('circStrings').getString('staff.circ.copy_status.status.pre_cat') + '  ';
1034                                         }
1035                                         if (details.hold) {
1036                                                 msg += document.getElementById('circStrings').getString('staff.circ.copy_status.status.hold') + '  ';
1037                                         }
1038                                         if (details.transit) {
1039                                                 msg += document.getElementById('circStrings').getString('staff.circ.copy_status.status.transit') + '  ';
1040                                         }
1041                                         if (details.circ && ! details.circ.checkin_time()) {
1042                                                 msg += document.getElementById('circStrings').getString('staff.circ.copy_status.status.circ') + '  ';
1043                                         }
1044                                         try { document.getElementById('last_scanned').setAttribute('value',msg); } catch(E) {}
1045                                         if (document.getElementById('trim_list')) {
1046                                                 var x = document.getElementById('trim_list');
1047                                                 if (x.checked) { obj.list.trim_list = 20; } else { obj.list.trim_list = null; }
1048                                         }
1049                                         var params = {
1050                                                 'retrieve_id' : js2JSON( 
1051                                                         { 
1052                                                                 'renewable' : details.circ ? 't' : 'f', 
1053                                                                 'copy_id' : details.copy.id(), 
1054                                                                 'acn_id' : details.volume ? details.volume.id() : -1, 
1055                                                                 'barcode' : barcode, 
1056                                                                 'doc_id' : details.mvr ? details.mvr.doc_id() : null  
1057                                                         } 
1058                                                 ),
1059                                                 'row' : {
1060                                                         'my' : {
1061                                                                 'mvr' : details.mvr,
1062                                                                 'acp' : details.copy,
1063                                                                 'acn' : details.volume,
1064                                                                 'atc' : details.transit,
1065                                                                 'circ' : details.circ,
1066                                                                 'ahr' : details.hold,
1067                                                         }
1068                                                 },
1069                                                 'to_top' : true,
1070                                         };
1071                                         if (!refresh) {
1072                                                 var nparams = obj.list.append(params);
1073                                                 if (!document.getElementById('trim_list').checked) {
1074                                                         if (typeof obj.list_copyid_map[details.copy.id()] == 'undefined') obj.list_copyid_map[details.copy.id()] =[];
1075                                                         obj.list_copyid_map[details.copy.id()].push(nparams);
1076                                                 }
1077                                         } else {
1078                                                 if (!document.getElementById('trim_list').checked) {
1079                             if (typeof obj.list_copyid_map[details.copy.id()] != 'undefined') {
1080                                 for (var i = 0; i < obj.list_copyid_map[details.copy.id()].length; i++) {
1081                                     if (typeof obj.list_copyid_map[details.copy.id()][i] == 'undefined') {
1082                                         obj.list.append(params);
1083                                     } else {
1084                                         params.my_node = obj.list_copyid_map[details.copy.id()][i].my_node;
1085                                         obj.list.refresh_row(params);
1086                                     }
1087                                 }
1088                             } else {
1089                                                             obj.list.append(params);
1090                             }
1091                                                 } else {
1092                                                         obj.list.append(params);
1093                                                 }
1094                                         }
1095                                 } catch(E) {
1096                                         obj.error.standard_unexpected_error_alert('barcode = ' + barcode,E);
1097                                 }
1098                         }
1099                         var result = obj.network.simple_request('FM_ACP_DETAILS_VIA_BARCODE', [ ses(), barcode ]);
1100                         handle_req({'getResultObject':function(){return result;}}); // used to be async
1101                         obj.controller.view.copy_status_barcode_entry_textbox.value = '';
1102                         obj.controller.view.copy_status_barcode_entry_textbox.focus();
1103                         
1104                 } catch(E) {
1105                         obj.error.standard_unexpected_error_alert('barcode = ' + barcode,E);
1106                         obj.controller.view.copy_status_barcode_entry_textbox.select();
1107                         obj.controller.view.copy_status_barcode_entry_textbox.focus();
1108                 }
1109
1110         },
1111         
1112         'spawn_copy_editor' : function() {
1113
1114                 var obj = this;
1115
1116                 JSAN.use('util.functional');
1117
1118                 var list = obj.selection_list;
1119
1120                 list = util.functional.map_list(
1121                         list,
1122                         function (o) {
1123                                 return o.copy_id;
1124                         }
1125                 );
1126
1127                 JSAN.use('cat.util'); cat.util.spawn_copy_editor( { 'copy_ids' : list, 'edit' : 1 } );
1128
1129         },
1130
1131 }
1132
1133 dump('exiting circ.copy_status.js\n');