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