1 dump('entering cat/util.js\n');
3 function $(id) { return document.getElementById(id); }
5 if (typeof cat == 'undefined') var cat = {};
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'
12 cat.util.EXPORT_TAGS = { ':all' : cat.util.EXPORT_OK };
14 cat.util.replace_barcode = function(old_bc) {
16 JSAN.use('util.network');
17 var network = new util.network();
19 if (!old_bc) old_bc = window.prompt($("catStrings").getString('staff.cat.util.replace_barcode.old_bc_window_prompt.prompt'),
21 $("catStrings").getString('staff.cat.util.replace_barcode.old_bc_window_prompt.title'));
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);
30 alert($("catStrings").getFormattedString('staff.cat.util.replace_barcode.error_alert', [old_bc]) + '\n');
34 // Why did I want to do this twice? Because this copy is more fleshed?
36 copy = network.simple_request('FM_ACP_RETRIEVE',[ copy.id() ]);
37 if (typeof copy.ilsevent != 'undefined') throw(copy);
38 if (!copy) throw(copy);
41 alert($("catStrings").getFormattedString('staff.cat.util.replace_barcode.error_alert', [old_bc]) +
42 '\n' + (typeof E.ilsevent == 'undefined' ? '' : E.textcode + ' : ' + E.desc));
49 var new_bc = window.prompt($("catStrings").getString('staff.cat.util.replace_barcode.new_bc_window_prompt.prompt'),
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'));
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 + '".');
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);
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'));
78 obj.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.util.replace_barcode.item_rename_error'),r);
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);
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();
97 data.stash_retrieve();
98 if (!data.marked_volume) {
99 alert($("catStrings").getString('staff.cat.util.transfer_copies.unmarked_volume_alert'));
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)?';
111 xml += '<description>' + params.message.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>') + '</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 + '"/>';
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') }
126 if (fancy_prompt_data.fancy_status == 'incomplete') { alert($("catStrings").getString('staff.cat.util.transfer_copies.aborted_transfer')); return; }
128 JSAN.use('util.functional');
130 var copies = network.simple_request('FM_ACP_FLESHED_BATCH_RETRIEVE.authoritative', [ params.copy_ids ]);
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 );
138 var robj = network.simple_request(
139 'FM_ACP_FLESHED_BATCH_UPDATE',
140 [ ses(), copies, true ],
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 */,
151 if (typeof robj.ilsevent != 'undefined') {
154 alert($("catStrings").getString('staff.cat.util.transfer_copies.successful_transfer'));
158 error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.util.transfer_copies.transfer_error'),E);
162 cat.util.spawn_spine_editor = function(selection_list) {
163 JSAN.use('util.error'); var error = new util.error();
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');
170 xulG.url_prefix( urls.XUL_SPINE_LABEL ),
171 { 'tab_name' : $("catStrings").getString('staff.cat.util.spine_editor.tab_name') },
175 error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.util.spine_editor.spine_editor_error'),E);
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 = {};
184 for (var i = 0; i < selection_list.length; i++) {
185 doc_id = selection_list[i].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]));
195 continue; /* pre-cat */
197 if (typeof seen[doc_id] != 'undefined') {
201 var opac_url = xulG.url_prefix( urls.opac_rdetail ) + '?r=' + doc_id;
202 var content_params = {
204 'authtime' : ses('authtime'),
205 'opac_url' : opac_url,
208 xulG.url_prefix(urls.XUL_OPAC_WRAPPER),
209 {'tab_name':'Retrieving title...'},
214 error.standard_unexpected_error_alert($("catStrings").getFormattedString('staff.cat.util.show_in_opac.catalog_error_for_doc_id', [doc_id]),E);
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(
226 if (typeof o.copy_id != 'undefined' && o.copy_id != null) {
234 data.stash('cb_temp_copy_ids');
236 xulG.url_prefix(urls.XUL_COPY_BUCKETS_QUICK),
237 'sel_bucket_win' + win.window_name_increment(),
238 'chrome,resizable,center'
242 cat.util.add_titles_to_bucket = function(record_ids) {
243 JSAN.use('util.window'); var win = new util.window();
245 xulG.url_prefix(urls.XUL_RECORD_BUCKETS_QUICK),
246 'sel_bucket_win' + win.window_name_increment(),
247 'chrome,resizable,modal,center',
249 record_ids: record_ids
254 cat.util.spawn_copy_editor = function(params) {
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
263 JSAN.use('util.network'); obj.network = new util.network();
264 JSAN.use('util.error'); obj.error = new util.error();
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');
274 title = $("catStrings").getString('staff.cat.util.copy_editor.view');
276 JSAN.use('util.window'); var win = new util.window();
277 var my_xulG = win.open(
278 (urls.XUL_COPY_EDITOR),
280 'chrome,modal,resizable',
283 if (!my_xulG.copies && params.edit) {
285 return my_xulG.copies;
289 JSAN.use('util.error'); var error = new util.error();
290 error.standard_unexpected_error_alert('error in cat.util.spawn_copy_editor',E);
294 cat.util.mark_item_damaged = function(copy_ids) {
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;
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'));
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'));
325 for (var i = 0; i < copies.length; i++) {
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. */
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', [
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(
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')
354 JSAN.use('circ.util');
357 circ.util.checkin_via_barcode( ses(), { 'barcode' : copies[i].barcode(), 'noop' : 1 } );
360 circ.util.checkin_via_barcode( ses(), { 'barcode' : copies[i].barcode(), 'noop' : 1 }, due_date );
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' :
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', [
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'));
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,
395 'chrome,resizable,modal',
397 'patron' : patron_obj,
398 'patron_id' : patron_obj.id(),
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 )
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;
414 params.apply_fines = 'noapply';
416 robj = network.simple_request('MARK_ITEM_DAMAGED',[ ses(), copies[i].id(), params ]);
417 if (typeof robj.ilsevent != 'undefined') { throw(robj); }
419 default: throw(robj);
424 error.standard_unexpected_error_alert($("catStrings").getFormattedString('staff.cat.util.mark_item_damaged.marking_error', [copies[i].barcode()]),E);
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]));
433 if (error) error.standard_unexpected_error_alert('cat.util.mark_item_damaged',E); else alert('FIXME: ' + E);
437 cat.util.mark_item_missing = function(copy_ids) {
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;
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'));
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'));
468 for (var i = 0; i < copies.length; i++) {
470 var robj = network.simple_request('MARK_ITEM_MISSING',[ses(),copies[i].id()]);
471 if (typeof robj.ilsevent != 'undefined') throw(robj);
474 error.standard_unexpected_error_alert($("catStrings").getFormattedString('staff.cat.util.mark_item_missing.marking_error', [copies[i].barcode()]),E);
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]));
483 if (error) error.standard_unexpected_error_alert('cat.util.mark_item_missing',E); else alert('FIXME: ' + E);
487 cat.util.fast_item_add = function(doc_id,cn_label,cp_barcode) {
491 JSAN.use('util.error'); error = new util.error();
492 JSAN.use('util.network'); var network = new util.network();
494 var acn_id = network.simple_request(
495 'FM_ACN_FIND_OR_CREATE',
496 [ ses(), cn_label, doc_id, ses('ws_ou') ]
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);
504 var copy_obj = new acp();
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 */
513 copy_obj.deposit_amount(0);
514 copy_obj.fine_level(2);
515 copy_obj.loan_duration(2);
516 copy_obj.location(1);
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());
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 ] });
528 if (error) error.standard_unexpected_error_alert('cat.util.fast_item_add',E); else alert('FIXME: ' + E);
532 cat.util.make_bookable = function(copy_ids) {
533 var results = fieldmapper.standardRequest(
534 ["open-ils.booking", "open-ils.booking.resources.create_from_copies"],
537 if (results == null) {
538 alert(document.getElementById("catStrings").getString(
539 "staff.cat.copy_browser.make_bookable.create_failed_silent"
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]
551 cat.util.edit_new_brsrc = function(brsrc_list) {
552 /* Spawn new tab to allow editing new resources. */
554 xulG.resultant_brsrc = brsrc_list.map(function(o) { return o[0]; });
556 urls.XUL_BROWSER + "?url=" + window.escape(
557 xulG.url_prefix("/eg/conify/global/booking/resource")
559 "tab_name": offlineStrings.getString(
560 "menu.cmd_booking_resource.tab"
565 "show_print_button": false,
566 "show_nav_buttons": true,
567 "passthru_content_params": xulG
572 document.getElementById("catStrings").getFormattedString(
573 "staff.cat.copy_browser.make_bookable.newtab_failed"
579 cat.util.edit_new_bresv = function(booking_results) {
580 /* Spawn new tab to allow editing new reservations. */
582 if (xulG.auth == undefined) {
583 xulG.auth = {"session": {"key": ses()}};
585 xulG.bresv_interface_opts = {"booking_results": booking_results};
587 xulG.url_prefix("/eg/booking/reservation"),
589 "tab_name": offlineStrings.getString(
590 "menu.cmd_booking_reservation.tab"
597 document.getElementById("catStrings").getString(
598 "staff.cat.copy_browser.make_bookable.newtab_failed"
604 dump('exiting cat/util.js\n');