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