]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/cat/util.js
Bucket related enhancements:
[working/Evergreen.git] / Open-ILS / xul / staff_client / server / cat / util.js
1 dump('entering cat/util.js\n');
2
3 function $(id) { return document.getElementById(id); }
4
5 if (typeof cat == 'undefined') var cat = {};
6 cat.util = {};
7
8 cat.util.EXPORT_OK    = [ 
9     'spawn_copy_editor', 'add_copies_to_bucket', 'show_in_opac', 'spawn_spine_editor', 'transfer_copies', 
10     'mark_item_missing', 'mark_item_damaged', 'replace_barcode', 'fast_item_add'
11 ];
12 cat.util.EXPORT_TAGS    = { ':all' : cat.util.EXPORT_OK };
13
14 cat.util.replace_barcode = function(old_bc) {
15     try {
16         JSAN.use('util.network');
17         var network = new util.network();
18
19         if (!old_bc) old_bc = window.prompt($("catStrings").getString('staff.cat.util.replace_barcode.old_bc_window_prompt.prompt'),
20             '',
21             $("catStrings").getString('staff.cat.util.replace_barcode.old_bc_window_prompt.title'));
22         if (!old_bc) return;
23
24         var copy;
25         try {
26             copy = network.simple_request('FM_ACP_RETRIEVE_VIA_BARCODE',[ old_bc ]);
27             if (typeof copy.ilsevent != 'undefined') throw(copy); 
28             if (!copy) throw(copy);
29         } catch(E) {
30             alert($("catStrings").getFormattedString('staff.cat.util.replace_barcode.error_alert', [old_bc]) + '\n');
31             return old_bc;
32         }
33     
34         // Why did I want to do this twice?  Because this copy is more fleshed?
35         try {
36             copy = network.simple_request('FM_ACP_RETRIEVE',[ copy.id() ]);
37             if (typeof copy.ilsevent != 'undefined') throw(copy);
38             if (!copy) throw(copy);
39         } catch(E) {
40             try {
41                 alert($("catStrings").getFormattedString('staff.cat.util.replace_barcode.error_alert', [old_bc]) +
42                      '\n' + (typeof E.ilsevent == 'undefined' ? '' : E.textcode + ' : ' + E.desc));
43             } catch(F) {
44                 alert(E + '\n' + F);
45             }
46             return old_bc;
47         }
48     
49         var new_bc = window.prompt($("catStrings").getString('staff.cat.util.replace_barcode.new_bc_window_prompt.prompt'),
50             '',
51             $("catStrings").getString('staff.cat.util.replace_barcode.new_bc_window_prompt.title'));
52         new_bc = String( new_bc ).replace(/\s/g,'');
53         /* Casting a possibly null input value to a String turns it into "null" */
54         if (!new_bc || new_bc == 'null') {
55             alert($("catStrings").getString('staff.cat.util.replace_barcode.new_bc.failed'));
56             return old_bc;
57         }
58     
59         var test = network.simple_request('FM_ACP_RETRIEVE_VIA_BARCODE',[ new_bc ]);
60         if (typeof test.ilsevent == 'undefined') {
61             alert('Rename aborted.  Another copy has barcode "' + new_bc + '".');
62             return old_bc;
63         } else {
64             if (test.ilsevent != 1502 /* ASSET_COPY_NOT_FOUND */) {
65                 obj.error.standard_unexpected_error_alert($("catStrings").getFormattedString('staff.cat.util.replace_barcode.testing_error', [new_bc]), test);
66                 return old_bc;
67             }    
68         }
69
70         copy.barcode(new_bc); copy.ischanged('1');
71         var r = network.simple_request('FM_ACP_FLESHED_BATCH_UPDATE', [ ses(), [ copy ] ]);
72         if (typeof r.ilsevent != 'undefined') { 
73             if (r.ilsevent != 0) {
74                 if (r.ilsevent == 5000 /* PERM_FAILURE */) {
75                     alert($("catStrings").getString('staff.cat.util.replace_barcode.insufficient_permission_for_rename'));
76                     return old_bc;
77                 } else {
78                     obj.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.util.replace_barcode.item_rename_error'),r);
79                     return old_bc;
80                 }
81             }
82         }
83
84         return new_bc;
85     } catch(E) {
86         JSAN.use('util.error'); var error = new util.error();
87         error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.util.replace_barcode.rename_error'),E);
88         return old_bc;
89     }
90 }
91
92 cat.util.transfer_copies = function(params) {
93     JSAN.use('util.error'); var error = new util.error();
94     JSAN.use('OpenILS.data'); var data = new OpenILS.data();
95     JSAN.use('util.network'); var network = new util.network();
96     try {
97         data.stash_retrieve();
98         if (!data.marked_volume) {
99             alert($("catStrings").getString('staff.cat.util.transfer_copies.unmarked_volume_alert'));
100             return;
101         }
102         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
103         var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: auto">';
104         if (!params.message) {
105             params.message = $("catStrings").getFormattedString('staff.cat.util.transfer_copies.params_message', [data.hash.aou[ params.owning_lib ].shortname(), params.volume_label]);
106             //params.message = 'Transfer items from their original volumes to ';
107             //params.message += data.hash.aou[ params.owning_lib ].shortname() + "'s volume labelled ";
108             //params.message += '"' + params.volume_label + '" on the following record (and change their circ libs to match)?';
109         }
110
111         xml += '<description>' + params.message.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;') + '</description>';
112         xml += '<hbox><button label="' + $("catStrings").getString('staff.cat.util.transfer_copies.transfer.label')+ '" name="fancy_submit"/>';
113         xml += '<button label="' + $("catStrings").getString('staff.cat.util.transfer_copies.cancel.label');
114         xml += '" accesskey="'+ $("catStrings").getString('staff.cat.util.transfer_copies.cancel.accesskey') +'" name="fancy_cancel"/></hbox>';
115         xml += '<iframe style="overflow: scroll" flex="1" src="' + urls.XUL_BIB_BRIEF + '?docid=' + params.docid + '"/>';
116         xml += '</vbox>';
117         //data.temp_transfer = xml; data.stash('temp_transfer');
118         JSAN.use('util.window'); var win = new util.window();
119         var fancy_prompt_data = win.open(
120             urls.XUL_FANCY_PROMPT,
121             //+ '?xml_in_stash=temp_transfer'
122             //+ '&title=' + window.escape('Item Transfer'),
123             'fancy_prompt', 'chrome,resizable,modal,width=500,height=300',
124             { 'xml' : xml, 'title' : $("catStrings").getString('staff.cat.util.transfer_copies.window_title') }
125         );
126         if (fancy_prompt_data.fancy_status == 'incomplete') { alert($("catStrings").getString('staff.cat.util.transfer_copies.aborted_transfer')); return; }
127
128         JSAN.use('util.functional');
129
130         var copies = network.simple_request('FM_ACP_FLESHED_BATCH_RETRIEVE.authoritative', [ params.copy_ids ]);
131
132         for (var i = 0; i < copies.length; i++) {
133             copies[i].call_number( data.marked_volume );
134             copies[i].circ_lib( params.owning_lib );
135             copies[i].ischanged( 1 );
136         }
137
138         var robj = network.simple_request(
139             'FM_ACP_FLESHED_BATCH_UPDATE', 
140             [ ses(), copies, true ], 
141             null,
142             {
143                 'title' : $("catStrings").getString('staff.cat.util.transfer_copies.override_transfer_failure'),
144                 'overridable_events' : [
145                     1208 /* TITLE_LAST_COPY */,
146                     1227 /* COPY_DELETE_WARNING */,
147                 ]
148             }
149         );
150         
151         if (typeof robj.ilsevent != 'undefined') {
152             throw(robj);
153         } else {
154             alert($("catStrings").getString('staff.cat.util.transfer_copies.successful_transfer'));
155         }
156
157     } catch(E) {
158         error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.util.transfer_copies.transfer_error'),E);
159     }
160 }
161
162 cat.util.spawn_spine_editor = function(selection_list) {
163     JSAN.use('util.error'); var error = new util.error();
164     try {
165         JSAN.use('util.functional');
166         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.stash_retrieve();
167         data.temp_barcodes_for_labels = util.functional.map_list( selection_list, function(o){return o.barcode;}) ; 
168         data.stash('temp_barcodes_for_labels');
169         xulG.new_tab(
170             xulG.url_prefix( urls.XUL_SPINE_LABEL ),
171             { 'tab_name' : $("catStrings").getString('staff.cat.util.spine_editor.tab_name') },
172             {}
173         );
174     } catch(E) {
175         error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.util.spine_editor.spine_editor_error'),E);
176     }
177 }
178
179 cat.util.show_in_opac = function(selection_list) {
180     JSAN.use('util.error'); var error = new util.error();
181     JSAN.use('util.network'); var network = new util.network();
182     var doc_id; var seen = {};
183     try {
184         for (var i = 0; i < selection_list.length; i++) {
185             doc_id = selection_list[i].doc_id;
186             if (!doc_id) {
187                 var barcode = selection_list[i].barcode;
188                 doc_id = network.simple_request('FM_BRE_ID_VIA_BARCODE',[barcode]);
189                 if (typeof doc_id.ils_event != 'undefined' || doc_id == -1) {
190                     alert($("catStrings").getFormattedString('staff.cat.util.show_in_opac.unknown_barcode', [barcode]));
191                     continue;
192                 }
193             }
194             if (doc_id == -1 ) {
195                 continue; /* pre-cat */
196             }
197             if (typeof seen[doc_id] != 'undefined') {
198                 continue;
199             }
200             seen[doc_id] = true;
201             var opac_url = xulG.url_prefix( urls.opac_rdetail ) + '?r=' + doc_id;
202             var content_params = { 
203                 'session' : ses(),
204                 'authtime' : ses('authtime'),
205                 'opac_url' : opac_url,
206             };
207             xulG.new_tab(
208                 xulG.url_prefix(urls.XUL_OPAC_WRAPPER), 
209                 {'tab_name':'Retrieving title...'}, 
210                 content_params
211             );
212         }
213     } catch(E) {
214         error.standard_unexpected_error_alert($("catStrings").getFormattedString('staff.cat.util.show_in_opac.catalog_error_for_doc_id', [doc_id]),E);
215     }
216 }
217
218 cat.util.add_copies_to_bucket = function(selection_list) {
219     JSAN.use('util.functional');
220     JSAN.use('util.window'); var win = new util.window();
221     JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
222     data.cb_temp_copy_ids = js2JSON(
223         util.functional.map_list(
224             selection_list,
225             function (o) {
226                 if (typeof o.copy_id != 'undefined' && o.copy_id != null) {
227                     return o.copy_id;
228                 } else {
229                     return o;
230                 }
231             }
232         )
233     );
234     data.stash('cb_temp_copy_ids');
235     win.open( 
236         xulG.url_prefix(urls.XUL_COPY_BUCKETS_QUICK),
237         'sel_bucket_win' + win.window_name_increment(),
238         'chrome,resizable,center'
239     );
240 }
241
242 cat.util.add_titles_to_bucket = function(record_ids) {
243     JSAN.use('util.window'); var win = new util.window();
244     win.open(
245         xulG.url_prefix(urls.XUL_RECORD_BUCKETS_QUICK),
246         'sel_bucket_win' + win.window_name_increment(),
247         'chrome,resizable,modal,center',
248         {
249             record_ids: record_ids 
250         }
251     );
252 }
253
254 cat.util.spawn_copy_editor = function(params) {
255     try {
256         if (!params.copy_ids && !params.copies) return;
257         if (params.copy_ids && params.copy_ids.length == 0) return;
258         if (params.copies && params.copies.length == 0) return;
259         if (params.copy_ids) params.copy_ids = js2JSON(params.copy_ids); // legacy
260         if (!params.caller_handles_update) params.handle_update = 1; // legacy
261
262         var obj = {};
263         JSAN.use('util.network'); obj.network = new util.network();
264         JSAN.use('util.error'); obj.error = new util.error();
265     
266         var title = '';
267         if (params.copy_ids && params.copy_ids.length > 1 && params.edit == 1)
268             title = $("catStrings").getString('staff.cat.util.copy_editor.batch_edit');
269         else if(params.copies && params.copies.length > 1 && params.edit == 1)
270             title = $("catStrings").getString('staff.cat.util.copy_editor.batch_view');
271         else if(params.copy_ids && params.copy_ids.length == 1)
272             title = $("catStrings").getString('staff.cat.util.copy_editor.edit');
273         else
274             title = $("catStrings").getString('staff.cat.util.copy_editor.view');
275
276         JSAN.use('util.window'); var win = new util.window();
277         var my_xulG = win.open(
278             (urls.XUL_COPY_EDITOR),
279             title,
280             'chrome,modal,resizable',
281             params
282         );
283         if (!my_xulG.copies && params.edit) {
284         } else {
285             return my_xulG.copies;
286         }
287         return [];
288     } catch(E) {
289         JSAN.use('util.error'); var error = new util.error();
290         error.standard_unexpected_error_alert('error in cat.util.spawn_copy_editor',E);
291     }
292 }
293
294 cat.util.mark_item_damaged = function(copy_ids) {
295     var error;
296     try {
297         JSAN.use('util.error'); error = new util.error();
298         JSAN.use('util.functional');
299         JSAN.use('util.network'); var network = new util.network();
300         var copies = network.simple_request('FM_ACP_FLESHED_BATCH_RETRIEVE.authoritative', [ copy_ids ]);
301         if (typeof copies.ilsevent != 'undefined') throw(copies);
302         var magic_status = false;
303         for (var i = 0; i < copies.length; i++) {
304             var status = copies[i].status(); if (typeof status == 'object') status = status.id();
305             if (typeof my_constants.magical_statuses[ status ] != 'undefined') 
306                 if (my_constants.magical_statuses[ status ].block_mark_item_damaged) magic_status = true;
307         }
308         if (magic_status) {
309         
310             error.yns_alert($("catStrings").getString('staff.cat.util.mark_item_damaged.af_message'),
311                 $("catStrings").getString('staff.cat.util.mark_item_damaged.af_title'),
312                 $("catStrings").getString('staff.cat.util.mark_item_damaged.af_ok_label'), null, null,
313                 $("catStrings").getString('staff.cat.util.mark_item_damaged.af_confirm_action'));
314
315         } else {
316
317             var r = error.yns_alert($("catStrings").getFormattedString('staff.cat.util.mark_item_damaged.md_message', [util.functional.map_list( copies, function(o) { return o.barcode(); } ).join(", ")]),
318                 $("catStrings").getString('staff.cat.util.mark_item_damaged.md_title'),
319                 $("catStrings").getString('staff.cat.util.mark_item_damaged.md_ok_label'),
320                 $("catStrings").getString('staff.cat.util.mark_item_damaged.md_cancel_label'), null,
321                 $("catStrings").getString('staff.cat.util.mark_item_damaged.md_confirm_action'));
322
323             if (r == 0) {
324                 var count = 0;
325                 for (var i = 0; i < copies.length; i++) {
326                     try {
327
328                         var my_circ = network.simple_request('FM_CIRC_RETRIEVE_VIA_COPY',[ses(),copies[i].id(),1]);
329                         if (typeof my_circ.ilsevent == 'undefined') { 
330                             JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.stash_retrieve();
331                             my_circ = my_circ[0];
332                             if (typeof my_circ != 'undefined') {
333                                 if (! my_circ.checkin_time() ) {
334                                     var due_date = my_circ.due_date() ? my_circ.due_date().substr(0,10) : null;
335                                     var auto_checkin = String( data.hash.aous['circ.auto_checkin_on_mark_damage'] ) == 'true';
336                                     /* short-circuit this behavior.  We don't want to mark an item damaged and still have it circulating.  At least for now.  Wait until someone asks for it. */
337                                     auto_checkin = true; 
338                                     JSAN.use('patron.util');
339                                     var patron_obj = patron.util.retrieve_fleshed_au_via_id( ses(), my_circ.usr() );
340                                     var patron_name = patron.util.format_name( patron_obj ) + ' : ' + patron_obj.card().barcode();
341                                     var msg = $("catStrings").getFormattedString('staff.cat.util.mark_item_damaged.item_circulating_to_patron', [ 
342                                         copies[i].barcode(),
343                                         patron_name,
344                                         my_circ.due_date().substr(0,10)]); // FIXME: need to replace date handling
345                                     JSAN.use('util.date'); var today = util.date.formatted_date(new Date(),'%F');
346                                     var r2 = auto_checkin ? 1 : error.yns_alert(
347                                         msg,
348                                         document.getElementById('catStrings').getString('staff.cat.util.mark_item_damaged.checkin.title'),
349                                         document.getElementById('catStrings').getString('staff.cat.util.mark_item_damaged.checkin.no_checkin'),
350                                         document.getElementById('catStrings').getString('staff.cat.util.mark_item_damaged.checkin.normal_checkin'),
351                                         due_date ? (today > due_date ? document.getElementById('catStrings').getString('staff.cat.util.mark_item_damaged.checkin.forgiving_checkin') : null) : null,
352                                         document.getElementById('catStrings').getString('staff.cat.util.mark_item_damaged.checkin.confirm_action')
353                                     );
354                                     JSAN.use('circ.util');
355                                     switch(r2) {
356                                         case 1:
357                                             circ.util.checkin_via_barcode( ses(), { 'barcode' : copies[i].barcode(), 'noop' : 1 } );
358                                         break;
359                                         case 2:
360                                             circ.util.checkin_via_barcode( ses(), { 'barcode' : copies[i].barcode(), 'noop' : 1 }, due_date );
361                                         break;
362                                     }
363                                 }
364                             }
365                         }
366
367                         var robj = network.simple_request('MARK_ITEM_DAMAGED',[ses(),copies[i].id()]);
368                         if (typeof robj.ilsevent != 'undefined') {
369                             switch(robj.textcode) {
370                                 case 'DAMAGE_CHARGE' :
371                                     var params = {};
372                                     JSAN.use('util.money');
373                                     var circ_obj = robj.payload.circ;
374                                     var patron_obj = circ_obj.usr();
375                                     JSAN.use('patron.util'); 
376                                     var patron_name = patron.util.format_name( patron_obj ) + ' : ' + patron_obj.card().barcode(); 
377                                     var r1 = error.yns_alert( 
378                                         $("catStrings").getFormattedString('staff.cat.util.mark_item_damaged.charge_patron_prompt.message', [  
379                                             copies[i].barcode(),  
380                                             patron_name,  
381                                             circ_obj.checkin_time().substr(0,10), // FIXME: need to replace with something better 
382                                             util.money.sanitize(robj.payload.charge) ]), 
383                                         $("catStrings").getString('staff.cat.util.mark_item_damaged.charge_patron_prompt.title'), 
384                                         $("catStrings").getString('staff.cat.util.mark_item_damaged.charge_patron_prompt.ok_label'), 
385                                         $("catStrings").getString('staff.cat.util.mark_item_damaged.charge_patron_prompt.change_amount_label'), 
386                                         $("catStrings").getString('staff.cat.util.mark_item_damaged.charge_patron_prompt.cancel_label'), 
387                                         $("catStrings").getString('staff.cat.util.mark_item_damaged.charge_patron_prompt.confirm_action')); 
388                                     if (r1 == 0) {
389                                         params.apply_fines = 'apply';
390                                     } else if (r1 == 1) { 
391                                         JSAN.use('util.window'); var win = new util.window();
392                                         var my_xulG = win.open(
393                                             urls.XUL_PATRON_BILL_WIZARD,
394                                             'billwizard',
395                                             'chrome,resizable,modal',
396                                             { 
397                                                 'patron' : patron_obj, 
398                                                 'patron_id' : patron_obj.id(), 
399                                                 'circ' : circ_obj, 
400                                                 'xact_id' : circ_obj.id(), 
401                                                 'do_not_process_bill' : true,
402                                                 /* 'override_default_billing_type' : 7, FIXME: maybe reintroduce this with an org setting for the specific btype? */
403                                                 'override_default_price' : util.money.sanitize( robj.payload.charge ) 
404                                             }
405                                         );
406
407                                         params.apply_fines = my_xulG.proceed ? 'apply' : 'noapply';
408                                         if (my_xulG.proceed) {
409                                             params.override_amount = my_xulG.amount;
410                                             params.override_btype = my_xulG.cbt_id;
411                                             params.override_note = my_xulG.note;
412                                         }
413                                     } else {
414                                         params.apply_fines = 'noapply';
415                                     }
416                                     robj = network.simple_request('MARK_ITEM_DAMAGED',[ ses(), copies[i].id(), params ]);
417                                     if (typeof robj.ilsevent != 'undefined') { throw(robj); }
418                                     break;
419                                 default: throw(robj);
420                             }
421                         }
422                         count++;
423                     } catch(E) {
424                         error.standard_unexpected_error_alert($("catStrings").getFormattedString('staff.cat.util.mark_item_damaged.marking_error', [copies[i].barcode()]),E);
425                     }
426                 }
427                 alert(count == 1 ? $("catStrings").getString('staff.cat.util.mark_item_damaged.one_item_damaged') :
428                     $("catStrings").getFormattedString('staff.cat.util.mark_item_damaged.multiple_item_damaged', [count]));
429             }
430         }
431
432     } catch(E) {
433         if (error) error.standard_unexpected_error_alert('cat.util.mark_item_damaged',E); else alert('FIXME: ' + E);
434     }
435 }
436
437 cat.util.mark_item_missing = function(copy_ids) {
438     var error;
439     try {
440         JSAN.use('util.error'); error = new util.error();
441         JSAN.use('util.functional');
442         JSAN.use('util.network'); var network = new util.network();
443         var copies = network.simple_request('FM_ACP_FLESHED_BATCH_RETRIEVE.authoritative', [ copy_ids ]);
444         if (typeof copies.ilsevent != 'undefined') throw(copies);
445         var magic_status = false;
446         for (var i = 0; i < copies.length; i++) {
447             var status = copies[i].status(); if (typeof status == 'object') status = status.id();
448             if (typeof my_constants.magical_statuses[ status ] != 'undefined') 
449                 if (my_constants.magical_statuses[ status ].block_mark_item_action) magic_status = true;
450         }
451         if (magic_status) {
452         
453             error.yns_alert($("catStrings").getString('staff.cat.util.mark_item_missing.af_message'),
454                 $("catStrings").getString('staff.cat.util.mark_item_missing.af_title'),
455                 $("catStrings").getString('staff.cat.util.mark_item_missing.af_ok_label'), null, null,
456                 $("catStrings").getString('staff.cat.util.mark_item_missing.af_confirm_action'));
457
458         } else {
459
460             var r = error.yns_alert($("catStrings").getFormattedString('staff.cat.util.mark_item_missing.ms_message', [util.functional.map_list( copies, function(o) { return o.barcode(); } ).join(", ")]),
461                 $("catStrings").getString('staff.cat.util.mark_item_missing.ms_title'),
462                 $("catStrings").getString('staff.cat.util.mark_item_missing.ms_ok_label'),
463                 $("catStrings").getString('staff.cat.util.mark_item_missing.ms_cancel_label'), null,
464                 $("catStrings").getString('staff.cat.util.mark_item_missing.ms_confirm_action'));
465
466             if (r == 0) {
467                 var count = 0;
468                 for (var i = 0; i < copies.length; i++) {
469                     try {
470                         var robj = network.simple_request('MARK_ITEM_MISSING',[ses(),copies[i].id()]);
471                         if (typeof robj.ilsevent != 'undefined') throw(robj);
472                         count++;
473                     } catch(E) {
474                         error.standard_unexpected_error_alert($("catStrings").getFormattedString('staff.cat.util.mark_item_missing.marking_error', [copies[i].barcode()]),E);
475                     }
476                 }
477                 alert(count == 1 ? $("catStrings").getString('staff.cat.util.mark_item_missing.one_item_missing') :
478                     $("catStrings").getFormattedString('staff.cat.util.mark_item_missing.multiple_item_missing', [count]));
479             }
480         }
481
482     } catch(E) {
483         if (error) error.standard_unexpected_error_alert('cat.util.mark_item_missing',E); else alert('FIXME: ' + E);
484     }
485 }
486
487 cat.util.fast_item_add = function(doc_id,cn_label,cp_barcode) {
488     var error;
489     try {
490
491         JSAN.use('util.error'); error = new util.error();
492         JSAN.use('util.network'); var network = new util.network();
493
494         var acn_id = network.simple_request(
495             'FM_ACN_FIND_OR_CREATE',
496             [ ses(), cn_label, doc_id, ses('ws_ou') ]
497         );
498
499         if (typeof acn_id.ilsevent != 'undefined') {
500             error.standard_unexpected_error_alert($("catStrings").getFormattedString('staff.cat.volume_copy_creator.stash_and_close.problem_with_volume', [cn]), acn_id);
501             return;
502         }
503
504         var copy_obj = new acp();
505         copy_obj.id( -1 );
506         copy_obj.isnew('1');
507         copy_obj.barcode( cp_barcode );
508         copy_obj.call_number( acn_id );
509         copy_obj.circ_lib( ses('ws_ou') );
510         /* FIXME -- use constants */
511         copy_obj.deposit(0);
512         copy_obj.price(0);
513         copy_obj.deposit_amount(0);
514         copy_obj.fine_level(2);
515         copy_obj.loan_duration(2);
516         copy_obj.location(1);
517         copy_obj.status(0);
518         copy_obj.circulate(get_db_true());
519         copy_obj.holdable(get_db_true());
520         copy_obj.opac_visible(get_db_true());
521         copy_obj.ref(get_db_false());
522
523         JSAN.use('util.window'); var win = new util.window();
524         JSAN.use('cat.util');
525         return cat.util.spawn_copy_editor( { 'handle_update' : 1, 'edit' : 1, 'docid' : doc_id, 'copies' : [ copy_obj ] });
526
527     } catch(E) {
528         if (error) error.standard_unexpected_error_alert('cat.util.fast_item_add',E); else alert('FIXME: ' + E);
529     }
530 }
531
532 cat.util.make_bookable = function(copy_ids) {
533     var results = fieldmapper.standardRequest(
534         ["open-ils.booking", "open-ils.booking.resources.create_from_copies"],
535         [ses(), copy_ids]
536     );
537     if (results == null) {
538         alert(document.getElementById("catStrings").getString(
539             "staff.cat.copy_browser.make_bookable.create_failed_silent"
540         ));
541     }
542     else if (typeof results.ilsevent != "undefined") {
543         alert(document.getElementById("catStrings").getFormattedString(
544             "staff.cat.copy_browser.make_bookable.create_failed",
545             [results.ilsevent, results.textcode, results.desc, results.debug]
546         ));
547     }
548     return results;
549 }
550
551 cat.util.edit_new_brsrc = function(brsrc_list) {
552     /* Spawn new tab to allow editing new resources. */
553     try {
554         xulG.resultant_brsrc = brsrc_list.map(function(o) { return o[0]; });
555         xulG.new_tab(
556             urls.XUL_BROWSER + "?url=" + window.escape(
557                 xulG.url_prefix("/eg/conify/global/booking/resource")
558             ), {
559                 "tab_name": offlineStrings.getString(
560                     "menu.cmd_booking_resource.tab"
561                  ),
562                 "browser" : true
563             }, {
564                 "no_xulG": false,
565                 "show_print_button": false,
566                 "show_nav_buttons": true,
567                 "passthru_content_params": xulG
568             }
569         );
570     } catch(E) {
571         alert(
572             document.getElementById("catStrings").getFormattedString(
573                 "staff.cat.copy_browser.make_bookable.newtab_failed"
574             ), E
575         );
576     }
577 }
578
579 cat.util.edit_new_bresv = function(booking_results) {
580     /* Spawn new tab to allow editing new reservations. */
581     try {
582         if (xulG.auth == undefined) {
583             xulG.auth = {"session": {"key": ses()}};
584         }
585         xulG.bresv_interface_opts = {"booking_results": booking_results};
586         xulG.new_tab(
587             xulG.url_prefix("/eg/booking/reservation"),
588             {
589                 "tab_name": offlineStrings.getString(
590                     "menu.cmd_booking_reservation.tab"
591                  ),
592                 "browser" : false
593             }, xulG
594         );
595     } catch(E) {
596         alert(
597             document.getElementById("catStrings").getString(
598                 "staff.cat.copy_browser.make_bookable.newtab_failed"
599             ) + E
600         );
601     }
602 }
603
604 dump('exiting cat/util.js\n');