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