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 'transfer_title_holds', 'mark_item_missing', 'mark_item_damaged', 'replace_barcode', 'fast_item_add',
11 'make_bookable', 'edit_new_brsrc', 'edit_new_bresv', 'batch_edit_volumes', 'render_fine_level',
12 'render_loan_duration', 'mark_item_as_missing_pieces', 'render_callnumbers_for_bib_menu',
13 'render_cn_prefix_menuitems', 'render_cn_suffix_menuitems', 'render_cn_class_menu',
14 'render_cn_prefix_menu', 'render_cn_suffix_menu', 'transfer_specific_title_holds',
15 'request_items', 'mark_for_overlay', 'get_cbs_for_bre_id'
17 cat.util.EXPORT_TAGS = { ':all' : cat.util.EXPORT_OK };
19 cat.util.replace_barcode = function(old_bc) {
21 JSAN.use('util.network');
22 var network = new util.network();
24 if (!old_bc) old_bc = window.prompt($("catStrings").getString('staff.cat.util.replace_barcode.old_bc_window_prompt.prompt'),
26 $("catStrings").getString('staff.cat.util.replace_barcode.old_bc_window_prompt.title'));
31 copy = network.simple_request('FM_ACP_RETRIEVE_VIA_BARCODE',[ old_bc ]);
32 if (typeof copy.ilsevent != 'undefined') throw(copy);
33 if (!copy) throw(copy);
35 alert($("catStrings").getFormattedString('staff.cat.util.replace_barcode.error_alert', [old_bc]) + '\n');
39 // Why did I want to do this twice? Because this copy is more fleshed?
41 copy = network.simple_request('FM_ACP_RETRIEVE',[ copy.id() ]);
42 if (typeof copy.ilsevent != 'undefined') throw(copy);
43 if (!copy) throw(copy);
46 alert($("catStrings").getFormattedString('staff.cat.util.replace_barcode.error_alert', [old_bc]) +
47 '\n' + (typeof E.ilsevent == 'undefined' ? '' : E.textcode + ' : ' + E.desc));
54 var new_bc = window.prompt($("catStrings").getString('staff.cat.util.replace_barcode.new_bc_window_prompt.prompt'),
56 $("catStrings").getString('staff.cat.util.replace_barcode.new_bc_window_prompt.title'));
57 new_bc = String( new_bc ).replace(/\s/g,'');
58 /* Casting a possibly null input value to a String turns it into "null" */
59 if (!new_bc || new_bc == 'null') {
60 alert($("catStrings").getString('staff.cat.util.replace_barcode.new_bc.failed'));
64 var test = network.simple_request('FM_ACP_RETRIEVE_VIA_BARCODE',[ new_bc ]);
65 if (typeof test.ilsevent == 'undefined') {
66 alert('Rename aborted. Another copy has barcode "' + new_bc + '".');
69 if (test.ilsevent != 1502 /* ASSET_COPY_NOT_FOUND */) {
70 obj.error.standard_unexpected_error_alert($("catStrings").getFormattedString('staff.cat.util.replace_barcode.testing_error', [new_bc]), test);
75 copy.barcode(new_bc); copy.ischanged('1');
76 var r = network.simple_request('FM_ACP_FLESHED_BATCH_UPDATE', [ ses(), [ copy ] ]);
77 if (typeof r.ilsevent != 'undefined') {
78 if (r.ilsevent != 0) {
79 if (r.ilsevent == 5000 /* PERM_FAILURE */) {
80 alert($("catStrings").getString('staff.cat.util.replace_barcode.insufficient_permission_for_rename'));
83 obj.error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.util.replace_barcode.item_rename_error'),r);
91 JSAN.use('util.error'); var error = new util.error();
92 error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.util.replace_barcode.rename_error'),E);
97 cat.util.transfer_title_holds = function(old_targets) {
98 JSAN.use('OpenILS.data'); var data = new OpenILS.data();
99 JSAN.use('util.network'); var network = new util.network();
101 data.stash_retrieve();
102 var target = data.marked_record_for_hold_transfer;
104 var m = $("catStrings").getString('staff.cat.opac.title_for_hold_transfer.destination_needed.label');
108 var robj = network.simple_request('TRANSFER_TITLE_HOLDS',[ ses(), target, old_targets ]);
110 var m = $("catStrings").getString('staff.cat.opac.title_for_hold_transfer.success.label');
113 var m = $("catStrings").getString('staff.cat.opac.title_for_hold_transfer.failure.label');
117 alert('Error in cat.util.transfer_title.holds(): ' + E);
121 cat.util.transfer_specific_title_holds = function(hold_ids,unique_targets) {
122 JSAN.use('OpenILS.data'); var data = new OpenILS.data();
123 JSAN.use('util.network'); var network = new util.network();
125 data.stash_retrieve();
126 var target = data.marked_record_for_hold_transfer;
128 var m = $("catStrings").getString('staff.cat.opac.title_for_hold_transfer.destination_needed.label');
132 if (unique_targets.length > 1) {
133 var m = $("catStrings").getString('staff.cat.opac.title_for_hold_transfer.many_bibs.warning');
134 if (! window.confirm(m)) {
138 var robj = network.simple_request('TRANSFER_SPECIFIC_TITLE_HOLDS',[ ses(), target, hold_ids ]);
140 var m = $("catStrings").getString('staff.cat.opac.title_for_hold_transfer.success.label');
143 var m = $("catStrings").getString('staff.cat.opac.title_for_hold_transfer.failure.label');
147 alert('Error in cat.util.transfer_title.holds(): ' + E);
152 cat.util.transfer_copies = function(params) {
153 JSAN.use('util.error'); var error = new util.error();
154 JSAN.use('OpenILS.data'); var data = new OpenILS.data();
155 JSAN.use('util.network'); var network = new util.network();
157 data.stash_retrieve();
158 if (!data.marked_volume) {
159 alert($("catStrings").getString('staff.cat.util.transfer_copies.unmarked_volume_alert'));
162 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: auto">';
163 if (!params.message) {
164 params.message = $("catStrings").getFormattedString('staff.cat.util.transfer_copies.params_message', [data.hash.aou[ params.owning_lib ].shortname(), params.volume_label]);
165 //params.message = 'Transfer items from their original volumes to ';
166 //params.message += data.hash.aou[ params.owning_lib ].shortname() + "'s volume labelled ";
167 //params.message += '"' + params.volume_label + '" on the following record (and change their circ libs to match)?';
170 xml += '<description>' + params.message.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>') + '</description>';
171 xml += '<hbox><button label="' + $("catStrings").getString('staff.cat.util.transfer_copies.transfer.label')+ '" name="fancy_submit"/>';
172 xml += '<button label="' + $("catStrings").getString('staff.cat.util.transfer_copies.cancel.label');
173 xml += '" accesskey="'+ $("catStrings").getString('staff.cat.util.transfer_copies.cancel.accesskey') +'" name="fancy_cancel"/></hbox>';
174 xml += '<iframe style="overflow: scroll" flex="1" src="' + urls.XUL_BIB_BRIEF + '?docid=' + params.docid + '" oils_force_external="true"/>';
176 //data.temp_transfer = xml; data.stash('temp_transfer');
177 JSAN.use('util.window'); var win = new util.window();
178 var fancy_prompt_data = win.open(
179 urls.XUL_FANCY_PROMPT,
180 'fancy_prompt', 'chrome,resizable,modal,width=500,height=300',
181 { 'xml' : xml, 'title' : $("catStrings").getString('staff.cat.util.transfer_copies.window_title') }
183 if (fancy_prompt_data.fancy_status == 'incomplete') { alert($("catStrings").getString('staff.cat.util.transfer_copies.aborted_transfer')); return; }
185 JSAN.use('util.functional');
187 var copies = network.simple_request('FM_ACP_FLESHED_BATCH_RETRIEVE.authoritative', [ params.copy_ids ]);
189 for (var i = 0; i < copies.length; i++) {
190 copies[i].call_number( data.marked_volume );
191 copies[i].circ_lib( params.owning_lib );
192 copies[i].ischanged( 1 );
195 var robj = network.simple_request(
196 'FM_ACP_FLESHED_BATCH_UPDATE',
197 [ ses(), copies, true ],
200 'title' : $("catStrings").getString('staff.cat.util.transfer_copies.override_transfer_failure'),
201 'overridable_events' : [
202 1208 /* TITLE_LAST_COPY */,
203 1227 /* COPY_DELETE_WARNING */,
208 if (typeof robj.ilsevent != 'undefined') {
211 && (robj.ilsevent != 1227 /* COPY_DELETE_WARNING */)
212 && (robj.ilsevent != 1208 /* TITLE_LAST_COPY */)
213 && (robj.ilsevent != 5000 /* PERM_DENIED */)
218 alert($("catStrings").getString('staff.cat.util.transfer_copies.successful_transfer'));
222 error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.util.transfer_copies.transfer_error'),E);
226 cat.util.spawn_spine_editor = function(selection_list) {
227 JSAN.use('util.error'); var error = new util.error();
229 JSAN.use('util.functional');
231 xulG.url_prefix('XUL_SPINE_LABEL'),
232 { 'tab_name' : $("catStrings").getString('staff.cat.util.spine_editor.tab_name') },
234 'barcodes' : util.functional.map_list( selection_list, function(o){return o.barcode;})
238 error.standard_unexpected_error_alert($("catStrings").getString('staff.cat.util.spine_editor.spine_editor_error'),E);
242 cat.util.show_in_opac = function(selection_list, params) {
243 JSAN.use('util.error'); var error = new util.error();
244 JSAN.use('util.network'); var network = new util.network();
245 var doc_id; var seen = {};
246 if(!params) params = {};
248 for (var i = 0; i < selection_list.length; i++) {
249 doc_id = selection_list[i].doc_id;
251 var barcode = selection_list[i].barcode;
252 doc_id = network.simple_request('FM_BRE_ID_VIA_BARCODE',[barcode]);
253 if (typeof doc_id.ilsevent != 'undefined' || doc_id == -1) {
254 alert($("catStrings").getFormattedString('staff.cat.util.show_in_opac.unknown_barcode', [barcode]));
259 continue; /* pre-cat */
261 if (typeof seen[doc_id] != 'undefined') {
265 var opac_url = xulG.url_prefix('opac_rdetail') + doc_id;
266 var content_params = {};
267 for (var value in params) content_params[value] = params[value];
268 content_params['session'] = ses();
269 content_params['authtime'] = ses('authtime');
270 content_params['opac_url'] = opac_url;
272 xulG.url_prefix('XUL_OPAC_WRAPPER'),
273 {'tab_name':$('catStrings').getString('staff.cat.util.show_in_opac.retrieving_title')},
278 error.standard_unexpected_error_alert($("catStrings").getFormattedString('staff.cat.util.show_in_opac.catalog_error_for_doc_id', [doc_id]),E);
282 cat.util.add_copies_to_bucket = function(selection_list) {
283 JSAN.use('util.functional');
284 JSAN.use('util.window'); var win = new util.window();
285 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
286 data.cb_temp_copy_ids = js2JSON(
287 util.functional.map_list(
290 if (typeof o.copy_id != 'undefined' && o.copy_id != null) {
298 data.stash('cb_temp_copy_ids');
300 xulG.url_prefix('XUL_COPY_BUCKETS_QUICK'),
302 'chrome,resizable,center'
306 cat.util.add_titles_to_bucket = function(record_ids) {
307 JSAN.use('util.window'); var win = new util.window();
308 JSAN.use('util.functional');
309 var filtered_record_ids = util.functional.filter_list(
312 return o != -1; // don't allow the magic pre-cat bib
315 if (filtered_record_ids.length != record_ids.length) {
316 alert($("catStrings").getFormattedString(
317 'staff.cat.util.add_titles_to_bucket.number_of_precats_skipped',
318 [ record_ids.length - filtered_record_ids.length ]
321 if (filtered_record_ids.length > 0) {
323 xulG.url_prefix('XUL_RECORD_BUCKETS_QUICK'),
325 'chrome,resizable,modal,center',
327 record_ids: filtered_record_ids
333 cat.util.spawn_copy_editor = function(params) {
335 if (!params.copy_ids && !params.copies) return;
336 if (params.copy_ids && params.copy_ids.length == 0) return;
337 if (params.copies && params.copies.length == 0) return;
338 if (params.copy_ids) params.copy_ids = js2JSON(params.copy_ids); // legacy
339 if (!params.caller_handles_update) params.handle_update = 1; // legacy
342 JSAN.use('util.network'); obj.network = new util.network();
343 JSAN.use('util.error'); obj.error = new util.error();
346 if (params.copy_ids && params.copy_ids.length > 1 && params.edit == 1)
347 title = $("catStrings").getString('staff.cat.util.copy_editor.batch_edit');
348 else if(params.copies && params.copies.length > 1 && params.edit == 1)
349 title = $("catStrings").getString('staff.cat.util.copy_editor.batch_view');
350 else if(params.copy_ids && params.copy_ids.length == 1)
351 title = $("catStrings").getString('staff.cat.util.copy_editor.edit');
353 title = $("catStrings").getString('staff.cat.util.copy_editor.view');
355 JSAN.use('util.window'); var win = new util.window();
356 var my_xulG = win.open(
357 (urls.XUL_COPY_EDITOR),
359 'chrome,modal,resizable',
362 if (!my_xulG.copies && params.edit) {
364 return my_xulG.copies;
368 JSAN.use('util.error'); var error = new util.error();
369 error.standard_unexpected_error_alert('error in cat.util.spawn_copy_editor',E);
373 cat.util.mark_item_damaged = function(copy_ids) {
376 JSAN.use('util.error'); error = new util.error();
377 JSAN.use('util.functional'); JSAN.use('util.date');
378 JSAN.use('util.network'); var network = new util.network();
379 if (!copy_ids) { return; }
380 copy_ids = util.functional.filter_list( copy_ids, function(o) { return o != null; } );
381 if (copy_ids.length < 1) { return; }
382 var copies = network.simple_request('FM_ACP_FLESHED_BATCH_RETRIEVE.authoritative', [ copy_ids ]);
383 if (typeof copies.ilsevent != 'undefined') throw(copies);
384 var magic_status = false;
385 for (var i = 0; i < copies.length; i++) {
386 var status = copies[i].status(); if (typeof status == 'object') status = status.id();
387 if (typeof my_constants.magical_statuses[ status ] != 'undefined')
388 if (my_constants.magical_statuses[ status ].block_mark_item_damaged) magic_status = true;
392 error.yns_alert($("catStrings").getString('staff.cat.util.mark_item_damaged.af_message'),
393 $("catStrings").getString('staff.cat.util.mark_item_damaged.af_title'),
394 $("catStrings").getString('staff.cat.util.mark_item_damaged.af_ok_label'), null, null,
395 $("catStrings").getString('staff.cat.util.mark_item_damaged.af_confirm_action'));
399 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(", ")]),
400 $("catStrings").getString('staff.cat.util.mark_item_damaged.md_title'),
401 $("catStrings").getString('staff.cat.util.mark_item_damaged.md_ok_label'),
402 $("catStrings").getString('staff.cat.util.mark_item_damaged.md_cancel_label'), null,
403 $("catStrings").getString('staff.cat.util.mark_item_damaged.md_confirm_action'));
407 for (var i = 0; i < copies.length; i++) {
410 var my_circ = network.simple_request('FM_CIRC_RETRIEVE_VIA_COPY',[ses(),copies[i].id(),1]);
411 if (typeof my_circ.ilsevent == 'undefined') {
412 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.stash_retrieve();
413 my_circ = my_circ[0];
414 if (typeof my_circ != 'undefined') {
415 if (! my_circ.checkin_time() ) {
416 var due_date = my_circ.due_date() ? util.date.formatted_date( my_circ.due_date(), '%F' ) : null;
417 var auto_checkin = String( data.hash.aous['circ.auto_checkin_on_mark_damage'] ) == 'true';
418 /* 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. */
420 JSAN.use('patron.util');
422 if (!my_circ.usr()) {
423 // Since we are looking at copies that are still checked out,
424 // we should never get here. Best to be safe, though.
426 document.getElementById('catStrings')
428 'staff.cat.util.mark_item_damaged.item_no_linked_patron',
435 var patron_obj = patron.util.retrieve_fleshed_au_via_id( ses(), my_circ.usr() );
436 var patron_name = patron.util.format_name( patron_obj ) + ' : ' + patron_obj.card().barcode();
437 var msg = $("catStrings").getFormattedString('staff.cat.util.mark_item_damaged.item_circulating_to_patron', [
440 util.date.formatted_date( my_circ.due_date(), '%{localized}' )]);
441 JSAN.use('util.date'); var today = util.date.formatted_date(new Date(),'%F');
442 var r2 = auto_checkin ? 1 : error.yns_alert(
444 document.getElementById('catStrings').getString('staff.cat.util.mark_item_damaged.checkin.title'),
445 document.getElementById('catStrings').getString('staff.cat.util.mark_item_damaged.checkin.no_checkin'),
446 document.getElementById('catStrings').getString('staff.cat.util.mark_item_damaged.checkin.normal_checkin'),
447 due_date ? (today > due_date ? document.getElementById('catStrings').getString('staff.cat.util.mark_item_damaged.checkin.forgiving_checkin') : null) : null,
448 document.getElementById('catStrings').getString('staff.cat.util.mark_item_damaged.checkin.confirm_action')
450 JSAN.use('circ.util');
453 circ.util.checkin_via_barcode( ses(), { 'barcode' : copies[i].barcode(), 'noop' : 1 } );
456 circ.util.checkin_via_barcode( ses(), { 'barcode' : copies[i].barcode(), 'noop' : 1 }, due_date );
463 var robj = network.simple_request('MARK_ITEM_DAMAGED',[ses(),copies[i].id()]);
464 if (typeof robj.ilsevent != 'undefined') {
465 switch(robj.textcode) {
466 case 'DAMAGE_CHARGE' :
468 JSAN.use('util.money');
469 var circ_obj = robj.payload.circ;
470 var patron_obj = circ_obj.usr();
471 JSAN.use('patron.util');
472 var patron_name = patron.util.format_name( patron_obj ) + ' : ' + patron_obj.card().barcode();
473 var r1 = error.yns_alert(
474 $("catStrings").getFormattedString('staff.cat.util.mark_item_damaged.charge_patron_prompt.message', [
477 util.date.formatted_date( circ_obj.checkin_time(), '%{localized}' ),
478 util.money.sanitize(robj.payload.charge) ]),
479 $("catStrings").getString('staff.cat.util.mark_item_damaged.charge_patron_prompt.title'),
480 $("catStrings").getString('staff.cat.util.mark_item_damaged.charge_patron_prompt.ok_label'),
481 $("catStrings").getString('staff.cat.util.mark_item_damaged.charge_patron_prompt.change_amount_label'),
482 $("catStrings").getString('staff.cat.util.mark_item_damaged.charge_patron_prompt.cancel_label'),
483 $("catStrings").getString('staff.cat.util.mark_item_damaged.charge_patron_prompt.confirm_action'));
485 params.apply_fines = 'apply';
486 } else if (r1 == 1) {
487 JSAN.use('util.window'); var win = new util.window();
488 var my_xulG = win.open(
489 urls.XUL_PATRON_BILL_WIZARD,
491 'chrome,resizable,modal',
493 'patron' : patron_obj,
494 'patron_id' : patron_obj.id(),
496 'xact_id' : circ_obj.id(),
497 'do_not_process_bill' : true,
498 /* 'override_default_billing_type' : 7, FIXME: maybe reintroduce this with an org setting for the specific btype? */
499 'override_default_price' : util.money.sanitize( robj.payload.charge )
503 params.apply_fines = my_xulG.proceed ? 'apply' : 'noapply';
504 if (my_xulG.proceed) {
505 params.override_amount = my_xulG.amount;
506 params.override_btype = my_xulG.cbt_id;
507 params.override_note = my_xulG.note;
510 params.apply_fines = 'noapply';
512 robj = network.simple_request('MARK_ITEM_DAMAGED',[ ses(), copies[i].id(), params ]);
513 if (typeof robj.ilsevent != 'undefined') { throw(robj); }
515 default: throw(robj);
520 error.standard_unexpected_error_alert($("catStrings").getFormattedString('staff.cat.util.mark_item_damaged.marking_error', [copies[i].barcode()]),E);
523 alert(count == 1 ? $("catStrings").getString('staff.cat.util.mark_item_damaged.one_item_damaged') :
524 $("catStrings").getFormattedString('staff.cat.util.mark_item_damaged.multiple_item_damaged', [count]));
529 if (error) error.standard_unexpected_error_alert('cat.util.mark_item_damaged',E); else alert('FIXME: ' + E);
533 cat.util.mark_item_missing = function(copy_ids) {
536 JSAN.use('util.error'); error = new util.error();
537 JSAN.use('util.functional');
538 JSAN.use('util.network'); var network = new util.network();
539 if (!copy_ids) { return; }
540 copy_ids = util.functional.filter_list( copy_ids, function(o) { return o != null; } );
541 if (copy_ids.length < 1) { return; }
542 var copies = network.simple_request('FM_ACP_FLESHED_BATCH_RETRIEVE.authoritative', [ copy_ids ]);
543 if (typeof copies.ilsevent != 'undefined') throw(copies);
544 var magic_status = false;
545 for (var i = 0; i < copies.length; i++) {
546 var status = copies[i].status(); if (typeof status == 'object') status = status.id();
547 if (typeof my_constants.magical_statuses[ status ] != 'undefined')
548 if (my_constants.magical_statuses[ status ].block_mark_item_action) magic_status = true;
552 error.yns_alert($("catStrings").getString('staff.cat.util.mark_item_missing.af_message'),
553 $("catStrings").getString('staff.cat.util.mark_item_missing.af_title'),
554 $("catStrings").getString('staff.cat.util.mark_item_missing.af_ok_label'), null, null,
555 $("catStrings").getString('staff.cat.util.mark_item_missing.af_confirm_action'));
559 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(", ")]),
560 $("catStrings").getString('staff.cat.util.mark_item_missing.ms_title'),
561 $("catStrings").getString('staff.cat.util.mark_item_missing.ms_ok_label'),
562 $("catStrings").getString('staff.cat.util.mark_item_missing.ms_cancel_label'), null,
563 $("catStrings").getString('staff.cat.util.mark_item_missing.ms_confirm_action'));
567 for (var i = 0; i < copies.length; i++) {
569 var robj = network.simple_request('MARK_ITEM_MISSING',[ses(),copies[i].id()]);
570 if (typeof robj.ilsevent != 'undefined') throw(robj);
573 error.standard_unexpected_error_alert($("catStrings").getFormattedString('staff.cat.util.mark_item_missing.marking_error', [copies[i].barcode()]),E);
576 alert(count == 1 ? $("catStrings").getString('staff.cat.util.mark_item_missing.one_item_missing') :
577 $("catStrings").getFormattedString('staff.cat.util.mark_item_missing.multiple_item_missing', [count]));
582 if (error) error.standard_unexpected_error_alert('cat.util.mark_item_missing',E); else alert('FIXME: ' + E);
586 cat.util.fast_item_add = function(doc_id,cn_label,cp_barcode) {
588 JSAN.use('OpenILS.data'); var data = new OpenILS.data();
591 JSAN.use('util.error'); error = new util.error();
592 JSAN.use('util.network'); var network = new util.network();
594 var acn_blob = network.simple_request(
595 'FM_ACN_FIND_OR_CREATE',
596 [ ses(), cn_label, doc_id, ses('ws_ou') ]
599 if (typeof acn_blob.ilsevent != 'undefined') {
600 error.standard_unexpected_error_alert($("catStrings").getFormattedString('staff.cat.volume_copy_creator.stash_and_close.problem_with_volume', [cn]), acn_blob);
604 // Get the default copy status; default to available if unset, per 1.6
605 var fast_ccs = data.hash.aous['cat.default_copy_status_fast'] || 0;
607 var copy_obj = new acp();
610 copy_obj.barcode( cp_barcode );
611 copy_obj.call_number( acn_blob.acn_id );
612 copy_obj.circ_lib( ses('ws_ou') );
613 /* FIXME -- use constants */
616 copy_obj.deposit_amount(0);
617 copy_obj.fine_level(2); // Normal
618 copy_obj.loan_duration(2); // Normal
619 copy_obj.location(1); // Stacks
620 copy_obj.status(fast_ccs);
621 copy_obj.circulate(get_db_true());
622 copy_obj.holdable(get_db_true());
623 copy_obj.opac_visible(get_db_true());
624 copy_obj.ref(get_db_false());
625 copy_obj.mint_condition(get_db_true());
627 JSAN.use('util.window'); var win = new util.window();
628 JSAN.use('cat.util');
630 var unified_interface = String( data.hash.aous['ui.unified_volume_copy_editor'] ) == 'true';
631 if (unified_interface) {
632 var horizontal_interface = String( data.hash.aous['ui.cat.volume_copy_editor.horizontal'] ) == 'true';
633 var url = window.xulG.url_prefix( horizontal_interface ? 'XUL_VOLUME_COPY_CREATOR_HORIZONTAL' : 'XUL_VOLUME_COPY_CREATOR' );
634 var w = xulG.set_tab(
637 'tab_name' : document.getElementById('offlineStrings').getFormattedString(
644 'existing_copies' : [ copy_obj ],
645 'load_opac_when_done' : true,
646 'labels_in_new_tab' : true
651 return cat.util.spawn_copy_editor( { 'handle_update' : 1, 'edit' : 1, 'docid' : doc_id, 'copies' : [ copy_obj ] });
655 if (error) error.standard_unexpected_error_alert('cat.util.fast_item_add',E); else alert('FIXME: ' + E);
659 cat.util.make_bookable = function(copy_ids) {
660 if (!copy_ids) { return; }
661 copy_ids = util.functional.filter_list( copy_ids, function(o) { return o != null; } );
662 if (copy_ids.length < 1) { return; }
663 var results = fieldmapper.standardRequest(
664 ["open-ils.booking", "open-ils.booking.resources.create_from_copies"],
667 if (results == null) {
668 alert(document.getElementById("catStrings").getString(
669 "staff.cat.copy_browser.make_bookable.create_failed_silent"
672 else if (typeof results.ilsevent != "undefined") {
673 alert(document.getElementById("catStrings").getFormattedString(
674 "staff.cat.copy_browser.make_bookable.create_failed",
675 [results.ilsevent, results.textcode, results.desc, results.debug]
681 cat.util.edit_new_brsrc = function(brsrc_list) {
682 /* Spawn new tab to allow editing new resources. */
684 xulG.resultant_brsrc = brsrc_list.map(function(o) { return o[0]; });
686 urls.XUL_BROWSER + "?url=" + window.encodeURIComponent(
687 xulG.url_prefix("BOOKING_RESOURCE")
689 "tab_name": offlineStrings.getString(
690 "menu.cmd_booking_resource.tab"
695 "show_print_button": false,
696 "show_nav_buttons": true,
697 "passthru_content_params": xulG
702 document.getElementById("catStrings").getFormattedString(
703 "staff.cat.copy_browser.make_bookable.newtab_failed"
709 cat.util.edit_new_bresv = function(booking_results) {
710 /* Spawn new tab to allow editing new reservations. */
712 if (xulG.auth == undefined) {
713 xulG.auth = {"session": {"key": ses()}};
715 xulG.bresv_interface_opts = {"booking_results": booking_results};
717 xulG.url_prefix("/eg/booking/reservation"),
719 "tab_name": offlineStrings.getString(
720 "menu.cmd_booking_reservation.tab"
727 document.getElementById("catStrings").getString(
728 "staff.cat.copy_browser.make_bookable.newtab_failed"
734 cat.util.batch_edit_volumes = function(fleshed_volumes) {
736 if (!fleshed_volumes || fleshed_volumes.length < 1) { return false; }
738 JSAN.use('util.functional');
739 JSAN.use('util.network'); var net = new util.network();
740 JSAN.use('util.window'); var win = new util.window();
742 var can_edit = net.simple_request(
743 'PERM_MULTI_ORG_CHECK',
747 util.functional.map_list(
750 return v.owning_lib();
757 alert(document.getElementById('catStrings').getString('staff.cat.edit_volume.permission_error'));
761 if (fleshed_volumes.length == 1) {
762 title = document.getElementById('catStrings').getString('staff.cat.edit_volume.title');
764 title = document.getElementById('catStrings').getString('staff.cat.edit_volume.title.plural');
767 function clone_list(o) {
768 var list = JSON2js( js2JSON( o ) );
769 // now that it is safe to clear copies, let's do so, otherwise may get an error from volume edit method
770 for (var i = 0; i < list.length; i++) { list[i].copies( [] ); }
774 var my_xulG = win.open(
775 xulG.url_prefix('XUL_VOLUME_EDITOR'),
777 'chrome,modal,resizable',
778 { 'volumes' : clone_list( fleshed_volumes ) }
781 if (typeof my_xulG.update_these_volumes == 'undefined') { return false; }
783 var volumes = util.functional.filter_list(
786 return get_bool( v.ischanged() );
790 if (volumes.length < 1) { return false; }
792 volumes = util.functional.map_list( volumes, function(o){
793 if (typeof o.suffix() == 'object') { o.suffix( o.suffix().id() ); }
794 if (typeof o.prefix() == 'object') { o.prefix( o.prefix().id() ); }
795 if (typeof o.label_class() == 'object') { o.label_class( o.label_class().id() ); }
799 var r = net.simple_request(
800 'FM_ACN_TREE_UPDATE',
801 [ ses(), volumes, false, { 'auto_merge_vols' : my_xulG.auto_merge } ],
804 'title' : document.getElementById('catStrings').getString('staff.cat.edit_volumes.override.confirm'),
805 'overridable_events' : [
806 1705 /* VOLUME_LABEL_EXISTS */
809 '1705' : function(r) {
810 var payload_acn = util.functional.find_id_object_in_list( volumes, r.payload );
811 return document.getElementById('catStrings').getFormattedString('staff.cat.edit_volumes.label_exists.details',[payload_acn.label()]);
816 if (!r) { throw('Update method returned null or false.'); }
817 if (typeof r.ilsevent != 'undefined') {
818 if (r.ilsevent == 1705 /* VOLUME_LABEL_EXISTS */) {
819 /* not overridden, but otherwise handled, so ignore */
829 alert('Error in cat.util.batch_edit_volumes: ' + E);
834 cat.util.render_fine_level = function(value) {
836 switch(Number(value)){
837 case 1: text = document.getElementById("catStrings").getString("staff.cat.copy_editor.field.fine_level.low"); break;
838 case 2: text = document.getElementById("catStrings").getString("staff.cat.copy_editor.field.fine_level.normal"); break;
839 case 3: text = document.getElementById("catStrings").getString("staff.cat.copy_editor.field.fine_level.high"); break;
843 cat.util.render_loan_duration = function(value) {
845 switch(Number(value)){
846 case 1: text = document.getElementById("catStrings").getString("staff.cat.copy_editor.field.loan_duration.short"); break;
847 case 2: text = document.getElementById("catStrings").getString("staff.cat.copy_editor.field.loan_duration.normal"); break;
848 case 3: text = document.getElementById("catStrings").getString("staff.cat.copy_editor.field.loan_duration.extended"); break;
853 cat.util.mark_item_as_missing_pieces = function(copy_ids) {
856 JSAN.use('util.error'); error = new util.error();
857 JSAN.use('util.functional'); JSAN.use('util.date');
858 JSAN.use('util.network'); var network = new util.network();
859 JSAN.use('util.print'); var print = new util.print();
860 JSAN.use('util.window'); var win = new util.window();
861 if (!copy_ids) { return; }
862 copy_ids = util.functional.filter_list( copy_ids, function(o) { return o != null; } );
863 if (copy_ids.length < 1) { return; }
864 var copies = network.simple_request('FM_ACP_FLESHED_BATCH_RETRIEVE.authoritative', [ copy_ids ]);
865 if (typeof copies.ilsevent != 'undefined') throw(copies);
867 var r = error.yns_alert($("catStrings").getFormattedString('staff.cat.util.mark_item_missing_pieces.ms_message', [util.functional.map_list( copies, function(o) { return o.barcode(); } ).join(", ")]),
868 $("catStrings").getString('staff.cat.util.mark_item_missing_pieces.ms_title'),
869 $("catStrings").getString('staff.cat.util.mark_item_missing_pieces.ms_ok_label'),
870 $("catStrings").getString('staff.cat.util.mark_item_missing_pieces.ms_cancel_label'), null,
871 $("catStrings").getString('staff.cat.util.mark_item_missing_pieces.ms_confirm_action'));
875 JSAN.use('cat.util');
876 for (var i = 0; i < copies.length; i++) {
878 var robj = network.simple_request('MARK_ITEM_MISSING_PIECES',[ses(),copies[i].id()]);
879 if (typeof robj.ilsevent != 'undefined') {
880 if (robj.ilsevent == 0 /* SUCCESS */) {
883 if (robj.payload && robj.payload.slip) {
884 print.simple( robj.payload.slip.template_output().data() );
887 cat.util.spawn_copy_editor( { 'copy_ids' : [ copies[i].id() ], 'edit' : 1 } );
889 var my_xulG = win.open(
890 urls.XUL_NEW_STANDING_PENALTY,
891 'new_standing_penalty',
892 'chrome,resizable,modal',
896 var penalty = new ausp();
897 penalty.usr( robj.payload.circ.usr() );
899 penalty.standing_penalty( my_xulG.id );
900 penalty.org_unit( ses('ws_ou') );
901 penalty.note( my_xulG.note );
902 network.simple_request(
909 var txt_file = new util.file('letter.txt');
910 txt_file.write_content('truncate',robj.payload.letter.template_output().data());
911 var text_path = '"' + txt_file._file.path + '"';
914 var prefs = Components.classes['@mozilla.org/preferences-service;1'].getService(Components.interfaces['nsIPrefBranch']);
915 var key = 'oils.text_editor.external.cmd';
916 var has_key = prefs.prefHasUserValue(key);
917 var oils_external_letter_opener_cmd = has_key ? prefs.getCharPref(key) : 'C:\\Windows\\notepad.exe %letter.txt%';
919 var cmd = oils_external_letter_opener_cmd.replace('%letter.txt%',text_path);
921 var file = new util.file('letter.bat');
922 file.write_content('truncate+exec',cmd);
924 file = new util.file('letter.bat');
926 dump('letter exec: ' + cmd + '\n');
927 var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
928 process.init(file._file);
932 dump('process.run = ' + process.run(false, args, args.length) + '\n');
936 } else if (robj.ilsevent == 1500 /* ACTION_CIRCULATION_NOT_FOUND */) {
937 alert( $("catStrings").getFormattedString('staff.cat.util.mark_item_missing_pieces.circ_not_found',[ copies[i].barcode() ]) );
945 error.standard_unexpected_error_alert($("catStrings").getFormattedString('staff.cat.util.mark_item_missing_pieces.marking_error', [copies[i].barcode()]),E);
948 /*alert(count == 1 ? $("catStrings").getString('staff.cat.util.mark_item_missing_pieces.one_item_missing_pieces') :
949 $("catStrings").getFormattedString('staff.cat.util.mark_item_missing_pieces.multiple_item_missing_pieces', [count]));*/
954 alert('Error in cat.util.mark_item_as_missing_pieces: ' + E);
959 cat.util.render_callnumbers_for_bib_menu = function(node, doc_id, label_class) {
963 cn_blob = g.network.simple_request('BLOB_MARC_CALLNUMBERS_RETRIEVE',[doc_id, label_class]);
967 var hbox = typeof node == 'string' ? document.getElementById(node) : node;
968 JSAN.use('util.widgets');
969 JSAN.use('util.functional');
970 var ml = util.widgets.make_menulist(
974 util.functional.map_list(
983 ); hbox.appendChild(ml);
984 ml.setAttribute('editable','true');
985 ml.setAttribute('width', '200');
986 ml.setAttribute('id', hbox.id + '_menulist');
988 alert('Error in cat.util.render_callnumbers_for_bib_menu: ' + E);
992 cat.util.render_cn_prefix_menuitems = function(menupopup,ou_id) {
994 JSAN.use('OpenILS.data');
995 var data = new OpenILS.data(); data.stash_retrieve();
996 JSAN.use('util.network');
997 var network = new util.network();
999 if (typeof data.list['acnp_for_lib_'+ou_id] == 'undefined') {
1000 data.list['acnp_for_lib_'+ou_id] = network.simple_request(
1001 'FM_ACNP_RETRIEVE_VIA_PCRUD',
1002 [ ses(), {"owning_lib":{"=":ou_id}}, {"order_by":{"acnp":"label_sortkey"}} ]
1006 for (var i = 0; i < data.list['acnp_for_lib_'+ou_id].length; i++) {
1007 var my_acnp = data.list['acnp_for_lib_'+ou_id][i];
1008 var menuitem = document.createElement('menuitem');
1009 menupopup.appendChild(menuitem);
1010 menuitem.setAttribute(
1012 my_acnp.id() == -1 ? '' :
1013 $('catStrings').getFormattedString(
1014 'staff.cat.volume_copy_creator.call_number_prefix.menuitem_label',
1017 data.hash.aou[ ou_id ].shortname()
1021 menuitem.setAttribute('value',my_acnp.id());
1024 alert('Error in cat.util.render_cn_prefix_menuitems: ' + E);
1028 cat.util.render_cn_suffix_menuitems = function(menupopup,ou_id) {
1030 JSAN.use('OpenILS.data');
1031 var data = new OpenILS.data(); data.stash_retrieve();
1032 JSAN.use('util.network');
1033 var network = new util.network();
1035 if (typeof data.list['acns_for_lib_'+ou_id] == 'undefined') {
1036 data.list['acns_for_lib_'+ou_id] = network.simple_request(
1037 'FM_ACNS_RETRIEVE_VIA_PCRUD',
1038 [ ses(), {"owning_lib":{"=":ou_id}}, {"order_by":{"acns":"label_sortkey"}} ]
1042 for (var i = 0; i < data.list['acns_for_lib_'+ou_id].length; i++) {
1043 var my_acns = data.list['acns_for_lib_'+ou_id][i];
1044 var menuitem = document.createElement('menuitem');
1045 menupopup.appendChild(menuitem);
1046 menuitem.setAttribute(
1048 my_acns.id() == -1 ? '' :
1049 $('catStrings').getFormattedString(
1050 'staff.cat.volume_copy_creator.call_number_suffix.menuitem_label',
1053 data.hash.aou[ ou_id ].shortname()
1057 menuitem.setAttribute('value',my_acns.id());
1060 alert('Error in cat.util.render_cn_suffix_menuitems: ' + E);
1064 cat.util.render_cn_class_menu = function(extra_menuitems,menu_default) {
1066 JSAN.use('util.widgets');
1067 JSAN.use('OpenILS.data');
1068 var data = new OpenILS.data(); data.stash_retrieve();
1070 var menulist = util.widgets.make_menulist(
1071 (extra_menuitems || []).concat(
1072 util.functional.map_list(
1075 return [ o.name(), o.id() ];
1081 if (typeof menu_default != 'undefined') {
1082 menulist.setAttribute('value',menu_default);
1087 alert('Error in cat.util.render_cn_class_menu: ' + E);
1091 cat.util.render_cn_prefix_menu = function(ou_ids,extra_menuitems,menu_default) {
1093 JSAN.use('util.widgets');
1094 var menulist = util.widgets.make_menulist(extra_menuitems||[],menu_default);
1095 var menupopup = menulist.firstChild;
1097 if (ou_ids.length == 1) {
1098 JSAN.use('OpenILS.data');
1099 var data = new OpenILS.data(); data.stash_retrieve();
1100 var org = data.hash.aou[ ou_ids[0] ];
1101 org_list = []; // order from top of consortium to owning lib
1103 org_list.unshift(org.id());
1104 org = org.parent_ou();
1105 if (org && typeof org != 'object') {
1106 org = data.hash.aou[ org ];
1112 for (var i = 0; i < org_list.length; i++) {
1113 cat.util.render_cn_prefix_menuitems(menupopup,org_list[i]);
1115 if (typeof menu_default != 'undefined') {
1116 menulist.setAttribute('value',menu_default);
1120 alert('Error in cat.util.render_cn_prefix_menu('+ou_id+'): ' + E);
1124 cat.util.render_cn_suffix_menu = function(ou_ids,extra_menuitems,menu_default) {
1126 JSAN.use('util.widgets');
1127 var menulist = util.widgets.make_menulist(extra_menuitems||[],menu_default);
1128 var menupopup = menulist.firstChild;
1130 if (ou_ids.length == 1) {
1131 JSAN.use('OpenILS.data');
1132 var data = new OpenILS.data(); data.stash_retrieve();
1133 var org = data.hash.aou[ ou_ids[0] ];
1134 org_list = []; // order from top of consortium to owning lib
1136 org_list.unshift(org.id());
1137 org = org.parent_ou();
1138 if (org && typeof org != 'object') {
1139 org = data.hash.aou[ org ];
1145 for (var i = 0; i < org_list.length; i++) {
1146 cat.util.render_cn_suffix_menuitems(menupopup,org_list[i]);
1148 if (typeof menu_default != 'undefined') {
1149 menulist.setAttribute('value',menu_default);
1153 alert('Error in cat.util.render_cn_suffix_menu('+ou_id+'): ' + E);
1157 cat.util.request_items = function(copy_ids) {
1160 JSAN.use('util.error');
1161 error = new util.error();
1163 JSAN.use('util.functional');
1164 if (!copy_ids) { return; }
1165 copy_ids = util.functional.filter_list(
1167 function(o) { return o != null; }
1169 if (copy_ids.length < 1) { return; }
1172 urls.XUL_HOLD_PLACEMENT,
1175 'copy_ids' : copy_ids
1180 alert('Error in cat.util.request_items: ' + E);
1184 cat.util.mark_for_overlay = function(doc_id,doc_mvr) {
1188 JSAN.use('OpenILS.data'); var data = new OpenILS.data();
1189 data.stash_retrieve();
1190 JSAN.use('util.network'); var network = new util.network();
1192 function gen_statusbar_click_handler(data_key) {
1193 return function (ev) {
1195 if (! data[data_key]) {
1199 if (ev.button == 0 /* left click, spawn opac */) {
1200 var opac_url = xulG.url_prefix('opac_rdetail')
1202 var content_params = {
1204 'authtime' : ses('authtime'),
1205 'opac_url' : opac_url,
1208 xulG.url_prefix('XUL_OPAC_WRAPPER'),
1209 {'tab_name':'Retrieving title...'},
1214 if (ev.button == 2 /* right click, remove mark */) {
1215 if ( window.confirm( $('offlineStrings').getString(
1216 'cat.opac.clear_statusbar')
1218 data[data_key] = null;
1219 data.stash(data_key);
1220 ev.target.setAttribute('label','');
1221 if (ev.target.hasAttribute('tooltiptext')) {
1222 ev.target.removeAttribute('tooltiptext');
1229 data.marked_record = doc_id;
1230 data.stash('marked_record');
1232 var robj = network.simple_request(
1233 'MODS_SLIM_RECORD_RETRIEVE.authoritative',[doc_id]);
1234 if (typeof robj.ilsevent == 'undefined') {
1235 data.marked_record_mvr = robj;
1237 data.marked_record_mvr = null;
1238 alert('Error in cat.util.mark_for_overlay #2: ', js2JSON(robj));
1241 data.marked_record_mvr = doc_mvr;
1243 data.stash('marked_record_mvr');
1244 if (data.marked_record_mvr) {
1246 $('offlineStrings').getFormattedString(
1247 'cat.opac.record_marked_for_overlay.tcn.alert',
1248 [ data.marked_record_mvr.tcn() ]
1253 $("offlineStrings").getFormattedString(
1254 'staff.cat.z3950.marked_record_for_overlay_indicator.tcn.label',
1255 [data.marked_record_mvr.tcn()]
1257 $("offlineStrings").getFormattedString(
1258 'staff.cat.z3950.marked_record_for_overlay_indicator.record_id.label',
1259 [data.marked_record]
1261 gen_statusbar_click_handler('marked_record')
1265 $('offlineStrings').getFormattedString(
1266 'cat.opac.record_marked_for_overlay.record_id.alert',
1267 [ data.marked_record ]
1272 $("offlineStrings").getFormattedString(
1273 'staff.cat.z3950.marked_record_for_overlay_indicator.record_id.label',
1274 [data.marked_record]
1277 gen_statusbar_click_handler('marked_record')
1281 alert('Error in cat.util.mark_for_overlay(): ' + E);
1285 cat.util.get_cbs_for_bre_id = function(doc_id) {
1287 JSAN.use('util.network'); var network = new util.network();
1288 var bibObj = network.simple_request(
1289 'FM_BRE_RETRIEVE_VIA_ID',
1290 [ ses(), [ doc_id ] ]
1293 var cbsObj = network.simple_request(
1294 'FM_CBS_RETRIEVE_VIA_PCRUD',
1295 [ ses(), bibObj.source() ]
1299 alert('Error in cat.util.cbs_can_have_copies(): ' + E);
1303 dump('exiting cat/util.js\n');