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