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