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