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