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