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