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