]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/cat/volume_copy_creator.js
Batch barcode editing and copy (item attribute) editor tweaks. A few things here...
[working/Evergreen.git] / Open-ILS / xul / staff_client / server / cat / volume_copy_creator.js
1 const g_max_copies_that_can_be_added_at_a_time_per_volume = 999;
2 var g = {};
3
4 function my_init() {
5     try {
6
7         /***********************************************************************************************************/
8         /* Initial setup */
9
10         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
11         if (typeof JSAN == 'undefined') { throw( $("commonStrings").getString('common.jsan.missing') ); }
12         JSAN.errorLevel = "die"; // none, warn, or die
13         JSAN.addRepository('/xul/server/');
14         JSAN.use('util.error'); g.error = new util.error();
15         g.error.sdump('D_TRACE','my_init() for cat/volume_copy_creator.xul');
16
17         JSAN.use('OpenILS.data'); g.data = new OpenILS.data(); g.data.init({'via':'stash'});
18         JSAN.use('util.widgets'); JSAN.use('util.functional');
19
20         JSAN.use('util.network'); g.network = new util.network();
21
22         g.refresh = xul_param('onrefresh');
23
24         /***********************************************************************************************************/
25         /* Am I adding just copies or copies and volumes?  Or am I rebarcoding existing copies? */
26
27         // g.copy_shortcut = { ou_id : { callnumber_label : callnumber_id }, ... }
28         g.copy_shortcut = xul_param('copy_shortcut');
29         // g.existing_copies = [ copy1, copy2, ... ]
30         g.existing_copies = xul_param('existing_copies') || [];
31
32         if (g.existing_copies.length > 0) {
33             document.getElementById('EditThenCreate').setAttribute('label',$('catStrings').getString('staff.cat.volume_copy_creator.edit_then_rebarcode.btn.label'));
34             document.getElementById('EditThenCreate').setAttribute('accesskey',$('catStrings').getString('staff.cat.volume_copy_creator.edit_then_rebarcode.btn.accesskey'));
35             document.getElementById('CreateWithDefaults').setAttribute('label',$('catStrings').getString('staff.cat.volume_copy_creator.rebarcode.btn.label'));
36             document.getElementById('CreateWithDefaults').setAttribute('accesskey',$('catStrings').getString('staff.cat.volume_copy_creator.rebarcode.btn.accesskey'));
37         } else {
38             document.getElementById('EditThenCreate').setAttribute('label',$('catStrings').getString('staff.cat.volume_copy_creator.edit_then_create.btn.label'));
39             document.getElementById('EditThenCreate').setAttribute('accesskey',$('catStrings').getString('staff.cat.volume_copy_creator.edit_then_create.btn.accesskey'));
40             document.getElementById('CreateWithDefaults').setAttribute('label',$('catStrings').getString('staff.cat.volume_copy_creator.create_with_defaults.btn.label'));
41             document.getElementById('CreateWithDefaults').setAttribute('accesskey',$('catStrings').getString('staff.cat.volume_copy_creator.create_with_defaults.btn.accesskey'));
42         }
43
44         //g.error.sdump('D_ERROR','location.href = ' + location.href + '\n\ncopy_short cut = ' + g.copy_shortcut + '\n\nou_ids = ' + xul_param('ou_ids'));
45
46         var ou_ids = xul_param('ou_ids',{'concat' : true}) || [];
47
48         /***********************************************************************************************************/
49         /* If we're passed existing_copies, rig up a copy_shortcut object to leverage existing code for rendering the volume labels, etc. 
50          * Also make a lookup object for existing copies keyed on org id and callnumber label, and another keyed on copy id. */
51
52         // g.org_label_existing_copy_map = { ou_id : { callnumber_label : [ copy1, copy2, ... ] }, ... }
53         g.org_label_existing_copy_map = {};
54         // g.id_copy_map = { acp_id : acp, ... }
55         g.id_copy_map = {};
56         for (var i = 0; i < g.existing_copies.length; i++) {
57             if (! g.copy_shortcut) { g.copy_shortcut = {}; }
58             var copy = g.existing_copies[i];
59             g.id_copy_map[ copy.id() ] = copy;
60             var call_number = copy.call_number();
61             g.doc_id = call_number.record();
62             if (!g.copy_shortcut[ call_number.owning_lib() ]) {
63                 ou_ids.push( call_number.owning_lib() );
64                 g.copy_shortcut[ call_number.owning_lib() ] = {};
65                 g.org_label_existing_copy_map[ call_number.owning_lib() ] = {};
66             }
67             g.copy_shortcut[ call_number.owning_lib() ][ call_number.label() ] = call_number.id();
68             if (! g.org_label_existing_copy_map[ call_number.owning_lib() ][ call_number.label() ]) {
69                 g.org_label_existing_copy_map[ call_number.owning_lib() ][ call_number.label() ] = [];
70             }
71             g.org_label_existing_copy_map[ call_number.owning_lib() ][ call_number.label() ].push( copy );
72         }
73
74         /***********************************************************************************************************/
75         /* What record am I dealing with?  */
76
77         g.doc_id = g.doc_id || xul_param('doc_id');
78         if (! g.doc_id) {
79             alert('Error in volume_copy_creator.js, g.doc_id not valid');
80             window.close(); return;
81         }
82         var sb = document.getElementById('summary_box'); while(sb.firstChild) sb.removeChild(sb.lastChild);
83         var summary = document.createElement('iframe'); sb.appendChild(summary);
84         summary.setAttribute('src',urls.XUL_BIB_BRIEF);
85         summary.setAttribute('flex','1');
86         get_contentWindow(summary).xulG = { 'docid' : g.doc_id };
87
88         /***********************************************************************************************************/
89         /* For the call number drop down */
90
91         if (!g.copy_shortcut) {
92             var cn_blob;
93             try {
94                 cn_blob = g.network.simple_request('BLOB_MARC_CALLNUMBERS_RETRIEVE',[g.doc_id]);
95             } catch(E) {
96                 cn_blob = [];
97             }
98             var hbox = document.getElementById('marc_cn');
99             var ml = util.widgets.make_menulist(
100                 util.functional.map_list(
101                     cn_blob,
102                     function(o) {
103                         for (var i in o) {
104                             return [ o[i], i ];
105                         }
106                     }
107                 ).sort(
108                     function(a,b) {
109                         a = a[1]; b = b[1];
110                         if (a == '082') return -1; 
111                         if (b == '082') return 1; 
112                         if (a == '092')  return -1; 
113                         if (b == '092')  return 1; 
114                         if (a < b) return -1; 
115                         if (a > b) return 1; 
116                         return 0;
117                     }
118                 )
119             ); hbox.appendChild(ml);
120             ml.setAttribute('editable','true');
121             ml.setAttribute('width', '200');
122             var btn = document.createElement('button');
123             btn.setAttribute('label',$('catStrings').getString('staff.cat.volume_copy_creator.my_init.btn.label'));
124             btn.setAttribute('accesskey',$('catStrings').getString('staff.cat.volume_copy_creator.my_init.btn.accesskey'));
125             btn.setAttribute('image','/xul/server/skin/media/images/down_arrow.gif');
126             hbox.appendChild(btn);
127             btn.addEventListener(
128                 'command',
129                 function() {
130                     var nl = document.getElementsByTagName('textbox');
131                     for (var i = 0; i < nl.length; i++) {
132                         if (nl[i].getAttribute('rel_vert_pos')==2 
133                             && !nl[i].disabled) nl[i].value = ml.value;
134                     }
135                     if (g.last_focus) setTimeout( function() { g.last_focus.focus(); }, 0 );
136                 }, 
137                 false
138             );
139         }
140
141         /***********************************************************************************************************/
142         /* render the orgs and volumes/input */
143
144         var rows = document.getElementById('rows');
145
146         var node_id = 0;
147         for (var i = 0; i < ou_ids.length; i++) {
148             try {
149                 var org = g.data.hash.aou[ ou_ids[i] ];
150                 if ( get_bool( g.data.hash.aout[ org.ou_type() ].can_have_vols() ) ) {
151                     var row = document.createElement('row'); rows.appendChild(row); row.setAttribute('ou_id',ou_ids[i]);
152                     g.render_library_label(row,ou_ids[i]);
153                     g.render_volume_count_entry( row, ou_ids[i] );
154                 }
155             } catch(E) {
156                 g.error.sdump('D_ERROR',E);
157             }
158         }
159
160         g.load_prefs();
161
162     } catch(E) {
163         var err_msg = $("commonStrings").getFormattedString('common.exception', ['cat/volume_copy_creator.js', E]);
164         try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); dump(js2JSON(E)); }
165         alert(err_msg);
166     }
167 }
168
169 g.render_library_label = function(row,ou_id) {
170     var label = document.createElement('label'); row.appendChild(label);
171     label.setAttribute('ou_id',ou_id);
172     label.setAttribute('value',g.data.hash.aou[ ou_id ].shortname());
173 }
174
175 g.render_volume_count_entry = function(row,ou_id) {
176     var hb = document.createElement('vbox'); row.appendChild(hb);
177     var tb = document.createElement('textbox'); hb.appendChild(tb);
178     tb.setAttribute('ou_id',ou_id); tb.setAttribute('size','3'); tb.setAttribute('cols','3');
179     tb.setAttribute('rel_vert_pos','1'); 
180     if ( (!g.copy_shortcut) && (!g.last_focus) ) { tb.focus(); g.last_focus = tb; }
181     var node;
182     function render_copy_count_entry(ev) {
183         if (ev.target.disabled) return;
184         if (! isNaN( Number( ev.target.value) ) ) {
185             if ( Number( ev.target.value ) > g_max_copies_that_can_be_added_at_a_time_per_volume ) {
186                 g.error.yns_alert($("catStrings").getFormattedString('staff.cat.volume_copy_creator.render_volume_count_entry.message', [g_max_copies_that_can_be_added_at_a_time_per_volume]),
187                     $("catStrings").getString('staff.cat.volume_copy_creator.render_volume_count_entry.title'),
188                     $("catStrings").getString('staff.cat.volume_copy_creator.render_volume_count_entry.ok_label'),null,null,'');
189                 return;
190             }
191             if (node) { row.removeChild(node); node = null; }
192             //ev.target.disabled = true;
193             node = g.render_callnumber_copy_count_entry(row,ou_id,ev.target.value);
194         }
195     }
196     util.widgets.apply_vertical_tab_on_enter_handler( 
197         tb, 
198         function() { render_copy_count_entry({'target':tb}); setTimeout(function(){util.widgets.vertical_tab(tb);},0); }
199     );
200     tb.addEventListener( 'change', render_copy_count_entry, false);
201     tb.addEventListener( 'focus', function(ev) { g.last_focus = ev.target; }, false );
202     setTimeout(
203         function() {
204             try {
205                 if (g.copy_shortcut) {
206                     JSAN.use('util.functional');
207                     tb.value = util.functional.map_object_to_list(
208                         g.copy_shortcut[ou_id],
209                         function(o,i) {
210                             return g.copy_shortcut[ou_id][i];
211                         }
212                     ).length;
213                     render_copy_count_entry({'target':tb});
214                     tb.disabled = true;
215                 }
216             } catch(E) {
217                 alert(E);
218             }
219         }, 0
220     );
221 }
222
223 g.render_callnumber_copy_count_entry = function(row,ou_id,count) {
224     var grid = util.widgets.make_grid( [ {}, {} ] ); row.appendChild(grid);
225     grid.setAttribute('flex','1');
226     grid.setAttribute('ou_id',ou_id);
227     var rows = grid.lastChild;
228     var r = document.createElement('row'); rows.appendChild( r );
229     var x = document.createElement('label'); r.appendChild(x);
230     x.setAttribute('value', $("catStrings").getString('staff.cat.volume_copy_creator.render_callnumber_copy_count_entry.call_nums')); x.setAttribute('style','font-weight: bold');
231     x = document.createElement('label'); r.appendChild(x);
232     x.setAttribute('value',$("catStrings").getString('staff.cat.volume_copy_creator.render_callnumber_copy_count_entry.num_of_copies')); x.setAttribute('style','font-weight: bold');
233     x.setAttribute('size','3'); x.setAttribute('cols','3');
234
235     function handle_change(call_number_column_textbox,number_of_copies_column_textbox,barcode_column_box) {
236         if (call_number_column_textbox.value == '') return;
237         if (isNaN( Number( number_of_copies_column_textbox.value ) )) return;
238         if ( Number( number_of_copies_column_textbox.value ) > g_max_copies_that_can_be_added_at_a_time_per_volume ) {
239             g.error.yns_alert($("catStrings").getFormattedString('staff.cat.volume_copy_creator.render_volume_count_entry.message', [g_max_copies_that_can_be_added_at_a_time_per_volume]),
240                 $("catStrings").getString('staff.cat.volume_copy_creator.render_volume_count_entry.title'),
241                 $("catStrings").getString('staff.cat.volume_copy_creator.render_volume_count_entry.ok_label'),null,null,'');
242             return;
243         }
244
245         //if (call_number_column_textbox.disabled || number_of_copies_column_textbox.disabled) return;
246
247         //call_number_column_textbox.disabled = true;
248         //number_of_copies_column_textbox.disabled = true;
249
250         util.widgets.remove_children(barcode_column_box);
251
252         g.render_barcode_entry(barcode_column_box,call_number_column_textbox.value,Number(number_of_copies_column_textbox.value),ou_id);
253         document.getElementById("EditThenCreate").disabled = false;
254         document.getElementById("CreateWithDefaults").disabled = false;
255     }
256
257     function handle_change_call_number_column_textbox(ev) {
258         var _call_number_column_textbox = ev.target;    
259         var _call_number_column_box = _call_number_column_textbox.parentNode;
260         var _number_of_copies_column_box = _call_number_column_box.nextSibling;
261         var _number_of_copies_column_textbox = _number_of_copies_column_box.firstChild;
262         var _barcode_column_box = _number_of_copies_column_box.nextSibling;
263         handle_change(_call_number_column_textbox,_number_of_copies_column_textbox,_barcode_column_box);
264     }
265
266     function handle_change_number_of_copies_column_textbox(ev) {
267         var _number_of_copies_column_textbox = ev.target;    
268         var _number_of_copies_column_box = _number_of_copies_column_textbox.parentNode;
269         var _call_number_column_box = _number_of_copies_column_box.previousSibling;
270         var _call_number_column_textbox = _call_number_column_box.firstChild;
271         var _barcode_column_box = _number_of_copies_column_box.nextSibling;
272         handle_change(_call_number_column_textbox,_number_of_copies_column_textbox,_barcode_column_box);
273     }
274
275     for (var i = 0; i < count; i++) {
276         var r = document.createElement('row'); rows.appendChild(r);
277         var call_number_column_box = document.createElement('vbox'); r.appendChild(call_number_column_box);
278         var number_of_copies_column_box = document.createElement('vbox'); r.appendChild(number_of_copies_column_box);
279         var barcode_column_box = document.createElement('vbox'); r.appendChild(barcode_column_box);
280         var call_number_column_textbox = document.createElement('textbox'); call_number_column_box.appendChild(call_number_column_textbox);
281         call_number_column_textbox.setAttribute('rel_vert_pos','2');
282         call_number_column_textbox.setAttribute('ou_id',ou_id);
283         util.widgets.apply_vertical_tab_on_enter_handler( 
284             call_number_column_textbox, 
285             function() { handle_change_call_number_column_textbox({'target':call_number_column_textbox}); setTimeout(function(){util.widgets.vertical_tab(call_number_column_textbox);},0); }
286         );
287         var number_of_copies_column_textbox = document.createElement('textbox'); number_of_copies_column_box.appendChild(number_of_copies_column_textbox);
288         number_of_copies_column_textbox.setAttribute('size','3'); number_of_copies_column_textbox.setAttribute('cols','3');
289         number_of_copies_column_textbox.setAttribute('rel_vert_pos','3');
290         number_of_copies_column_textbox.setAttribute('ou_id',ou_id);
291         util.widgets.apply_vertical_tab_on_enter_handler( 
292             number_of_copies_column_textbox, 
293             function() { handle_change_number_of_copies_column_textbox({'target':number_of_copies_column_textbox}); setTimeout(function(){util.widgets.vertical_tab(number_of_copies_column_textbox);},0); }
294         );
295
296         call_number_column_textbox.addEventListener( 'change', handle_change_call_number_column_textbox, false);
297         call_number_column_textbox.addEventListener( 'focus', function(ev) { g.last_focus = ev.target; }, false );
298         number_of_copies_column_textbox.addEventListener( 'change', handle_change_number_of_copies_column_textbox, false);
299         number_of_copies_column_textbox.addEventListener( 'focus', function(ev) { g.last_focus = ev.target; }, false );
300         if ( !g.last_focus ) { number_of_copies_column_textbox.focus(); g.last_focus = number_of_copies_column_textbox; }
301
302         setTimeout(
303             function(idx,call_number_column_textbox,number_of_copies_column_textbox){
304                 return function() {
305                     try {
306                         JSAN.use('util.functional');
307                         if (g.copy_shortcut) {
308                             var label = util.functional.map_object_to_list(
309                                 g.copy_shortcut[ou_id],
310                                 function(o,i) {
311                                     return i;
312                                 }
313                             )[idx];
314                             if (g.org_label_existing_copy_map[ou_id]) {
315                                 var num_of_copies = g.org_label_existing_copy_map[ou_id][label].length;
316                                 if (num_of_copies>0) {
317                                     number_of_copies_column_textbox.value = num_of_copies;
318                                     number_of_copies_column_textbox.disabled = true;
319                                 }
320                             }
321                             call_number_column_textbox.value = label; 
322                             handle_change_call_number_column_textbox({'target':call_number_column_textbox});
323                             call_number_column_textbox.disabled = true;
324                         }
325                     } catch(E) {
326                         alert(E);
327                     }
328                 }
329             }(i,call_number_column_textbox,number_of_copies_column_textbox),0
330         );
331     }
332
333     return grid;
334 }
335
336 g.render_barcode_entry = function(node,callnumber,count,ou_id) {
337     try {
338         function ready_to_create(ev) {
339             document.getElementById("EditThenCreate").disabled = false;
340             document.getElementById("CreateWithDefaults").disabled = false;
341         }
342
343         JSAN.use('util.barcode'); 
344
345         for (var i = 0; i < count; i++) {
346             var tb = document.createElement('textbox'); node.appendChild(tb);
347             tb.setAttribute('ou_id',ou_id);
348             tb.setAttribute('callnumber',callnumber);
349             tb.setAttribute('rel_vert_pos','4');
350             if (g.org_label_existing_copy_map[ ou_id ]) {
351                 tb.value = g.org_label_existing_copy_map[ ou_id ][ callnumber ][i].barcode();
352                 tb.setAttribute('acp_id', g.org_label_existing_copy_map[ ou_id ][ callnumber ][i].id());
353                 tb.select();
354                 if (! g.first_focus) { g.first_focus = tb; }
355             }
356             util.widgets.apply_vertical_tab_on_enter_handler( 
357                 tb, 
358                 function() { ready_to_create({'target':tb}); setTimeout(function(){util.widgets.vertical_tab(tb);},0); }
359             );
360             tb.addEventListener('change', function(ev) {
361                 var barcode = String( ev.target.value ).replace(/\s/g,'');
362                 if (barcode != ev.target.value) ev.target.value = barcode;
363                 if ($('check_barcodes').checked && ! util.barcode.check(barcode) ) {
364                     g.error.yns_alert($("catStrings").getFormattedString('staff.cat.volume_copy_creator.render_barcode_entry.alert_message', [barcode]),
365                         $("catStrings").getString('staff.cat.volume_copy_creator.render_barcode_entry.alert_title'),
366                         $("catStrings").getString('staff.cat.volume_copy_creator.render_barcode_entry.alert_ok_button'),null,null,
367                         $("catStrings").getString('staff.cat.volume_copy_creator.render_barcode_entry.alert_confirm'));
368                     setTimeout( function() { ev.target.select(); ev.target.focus(); }, 0);
369                 }
370             }, false);
371             tb.addEventListener( 'focus', function(ev) { g.last_focus = ev.target; }, false );
372         }
373         
374         setTimeout( function() { if (g.first_focus) { g.first_focus.focus(); } }, 0 ); 
375
376     } catch(E) {
377         g.error.sdump('D_ERROR','g.render_barcode_entry: ' + E);
378     }
379 }
380
381 g.new_node_id = -1;
382
383 g.stash_and_close = function(param) {
384
385     try {
386
387         var nl = document.getElementsByTagName('textbox');
388
389         var volumes_hash = {};
390
391         var barcodes = [];
392         
393         for (var i = 0; i < nl.length; i++) {
394             if ( nl[i].getAttribute('rel_vert_pos') == 4 ) barcodes.push( nl[i] );
395             if ( nl[i].getAttribute('rel_vert_pos') == 2 )  {
396                 var ou_id = nl[i].getAttribute('ou_id');
397                 var callnumber = nl[i].value;
398                 if (typeof volumes_hash[ou_id] == 'undefined') { volumes_hash[ou_id] = {} }
399                 if (typeof volumes_hash[ou_id][callnumber] == 'undefined') { volumes_hash[ou_id][callnumber] = [] }
400             }
401         };
402     
403         for (var i = 0; i < barcodes.length; i++) {
404             var acp_id = barcodes[i].getAttribute('acp_id') || g.new_node_id--;
405             var ou_id = barcodes[i].getAttribute('ou_id');
406             var callnumber = barcodes[i].getAttribute('callnumber');
407             var barcode = barcodes[i].value;
408
409             if (typeof volumes_hash[ou_id] == 'undefined') { volumes_hash[ou_id] = {} }
410             if (typeof volumes_hash[ou_id][callnumber] == 'undefined') { volumes_hash[ou_id][callnumber] = [] }
411
412             if (barcode != '') volumes_hash[ou_id][callnumber].push( { 'barcode' : barcode, 'acp_id' : acp_id } );
413         }
414
415         var volumes = [];
416         var copies = [];
417         var volume_labels = {};
418
419         function new_copy(acp_id,ou_id,acn_id,barcode) {
420             var copy = new acp();
421             copy.id( acp_id );
422             copy.isnew('1');
423             copy.barcode( barcode );
424             copy.call_number( acn_id );
425             copy.circ_lib(ou_id);
426             /* FIXME -- use constants */
427             copy.deposit(0);
428             copy.price(0);
429             copy.deposit_amount(0);
430             copy.fine_level(2);
431             copy.loan_duration(2);
432             copy.location(1);
433             copy.status(5);
434             copy.circulate(get_db_true());
435             copy.holdable(get_db_true());
436             copy.opac_visible(get_db_true());
437             copy.ref(get_db_false());
438             return copy;
439         }
440
441         for (var ou_id in volumes_hash) {
442             for (var cn_label in volumes_hash[ou_id]) {
443
444                 var acn_id = g.network.simple_request(
445                     'FM_ACN_FIND_OR_CREATE',
446                     [ ses(), cn_label, g.doc_id, ou_id ]
447                 );
448
449                 if (typeof acn_id.ilsevent != 'undefined') {
450                     g.error.standard_unexpected_error_alert($("catStrings").getFormattedString('staff.cat.volume_copy_creator.stash_and_close.problem_with_volume', [cn]), acn_id);
451                     continue;
452                 }
453
454                 volume_labels[ acn_id ] = { 'label' : cn_label, 'owning_lib' : ou_id };
455
456                 for (var i = 0; i < volumes_hash[ou_id][cn_label].length; i++) {
457                     var barcode = volumes_hash[ou_id][cn_label][i].barcode;
458                     var acp_id = volumes_hash[ou_id][cn_label][i].acp_id;
459                     var copy;
460                     if (acp_id < 0) {
461                         copy = new_copy(acp_id,ou_id,acn_id,barcode);
462                     } else {
463                         copy = g.id_copy_map[ acp_id ];
464                         copy.barcode( barcode );
465                         copy.call_number( copy.call_number().id() );
466                         copy.ischanged('1');
467                     }
468                     copies.push( copy );
469                 }
470             }
471         }
472
473         JSAN.use('util.window'); var win = new util.window();
474         if (copies.length > 0) {
475             JSAN.use('cat.util');
476             if (param == 'edit') {
477                 copies = cat.util.spawn_copy_editor( { 'edit' : true, 'docid' : g.doc_id, 'copies' : copies, 'caller_handles_update' : true });
478             }
479             if (typeof xul_param('update_copy') == 'function') {
480                 xul_param('update_copy')(copies);
481             } else {
482                  var r = g.network.simple_request(
483                     'FM_ACP_FLESHED_BATCH_UPDATE',
484                     [ ses(),copies, true ]
485                 );
486                 if (typeof r.ilsevent != 'undefined') {
487                     g.error.standard_unexpected_error_alert('copy update',r);
488                 }
489             }
490             try {
491                 //case 1706 /* ITEM_BARCODE_EXISTS */ :
492                 if (copies && copies.length > 0 && $('print_labels').checked) {
493                     JSAN.use('util.functional');
494                     JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.stash_retrieve();
495                     data.temp_barcodes_for_labels = util.functional.map_list( copies, function(o){return o.barcode();}) ; 
496                     data.stash('temp_barcodes_for_labels');
497                     var w = win.open(
498                         urls.XUL_SPINE_LABEL,
499                         'spine_labels',
500                         'chrome,resizable,width=750,height=550'
501                     );
502                 }
503             } catch(E) {
504                 g.error.standard_unexpected_error_alert($(catStrings).getString('staff.cat.volume_copy_creator.stash_and_close.tree_err2'),E);
505             }
506         }
507
508         if (typeof window.refresh == 'function') { window.refresh(); }
509         if (typeof g.refresh == 'function') { g.refresh(); }
510
511         window.close();
512
513     } catch(E) {
514         g.error.standard_unexpected_error_alert($(catStrings).getString('staff.cat.volume_copy_creator.stash_and_close.tree_err3'),E);
515     }
516 }
517
518 g.load_prefs = function() {
519     try {
520         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
521         JSAN.use('util.file'); var file = new util.file('volume_copy_creator.prefs');
522         if (file._file.exists()) {
523             var prefs = file.get_object(); file.close();
524             if (prefs.check_barcodes) {
525                 if ( prefs.check_barcodes == 'false' ) {
526                     $('check_barcodes').checked = false;
527                 } else {
528                     $('check_barcodes').checked = prefs.check_barcodes;
529                 }
530             } else {
531                 $('check_barcodes').checked = false;
532             }
533             if (prefs.print_labels) {
534                 if ( prefs.print_labels == 'false' ) {
535                     $('print_labels').checked = false;
536                 } else {
537                     $('print_labels').checked = prefs.print_labels;
538                 }
539             } else {
540                 $('print_labels').checked = false;
541             }
542
543         }
544     } catch(E) {
545         g.error.standard_unexpected_error_alert($(catStrings).getString('staff.cat.volume_copy_creator.load_prefs.err_retrieving_prefs'),E);
546         
547     }
548 }
549
550 g.save_prefs = function () {
551     try {
552         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
553         JSAN.use('util.file'); var file = new util.file('volume_copy_creator.prefs');
554         file.set_object(
555             {
556                 'check_barcodes' : $('check_barcodes').checked,
557                 'print_labels' : $('print_labels').checked,
558             }
559         );
560         file.close();
561     } catch(E) {
562         g.error.standard_unexpected_error_alert($(catStrings).getString('staff.cat.volume_copy_creator.save_prefs.err_storing_prefs'),E);
563     }
564 }
565
566