1 dump('entering patron.holds.js\n');
3 if (typeof patron == 'undefined') patron = {};
4 patron.holds = function (params) {
6 JSAN.use('util.error'); this.error = new util.error();
7 JSAN.use('util.network'); this.network = new util.network();
8 JSAN.use('OpenILS.data'); this.data = new OpenILS.data(); this.data.init({'via':'stash'});
11 patron.holds.prototype = {
13 'hold_interface_type' : null,
15 'pull_from_shelf_interface' : {
16 '_default' : { 'limit' : 50, 'offset' : 0 },
17 'current' : { 'limit' : 50, 'offset' : 0 }
26 'flatten_copy' : function(hold) {
27 try { if ( hold.current_copy() && typeof hold.current_copy() == 'object') hold.current_copy( hold.current_copy().id() ); } catch(E) { alert('FIXME: Error flattening hold before hold update: ' + E); }
31 'init' : function( params ) {
35 obj.patron_id = params['patron_id'];
36 obj.docid = params['docid'];
37 obj.shelf = params['shelf'];
38 obj.tree_id = params['tree_id'];
40 JSAN.use('circ.util');
41 var columns = circ.util.hold_columns(
43 'title' : { 'hidden' : false, 'flex' : '3' },
44 'request_time' : { 'hidden' : false },
45 'pickup_lib_shortname' : { 'hidden' : false },
46 'hold_type' : { 'hidden' : false },
47 'current_copy' : { 'hidden' : false },
48 'capture_time' : { 'hidden' : false },
49 'notify_time' : { 'hidden' : false },
50 'notify_count' : { 'hidden' : false },
54 JSAN.use('util.list'); obj.list = new util.list( obj.tree_id || 'holds_list');
58 'map_row_to_columns' : circ.util.std_map_row_to_columns(),
59 'retrieve_row' : function(params) {
62 obj.network.simple_request('FM_AHR_BLOB_RETRIEVE.authoritative', [ ses(), row.my.hold_id ],
65 var blob = blob_req.getResultObject();
66 if (typeof blob.ilsevent != 'undefined') throw(blob);
67 row.my.ahr = blob.hold;
68 row.my.status = blob.status;
69 row.my.ahr.status( blob.status );
70 row.my.acp = blob.copy;
71 row.my.acn = blob.volume;
72 row.my.mvr = blob.mvr;
73 row.my.patron_family_name = blob.patron_last;
74 row.my.patron_first_given_name = blob.patron_first;
75 row.my.patron_barcode = blob.patron_barcode;
77 var copy_id = row.my.ahr.current_copy();
78 if (typeof copy_id == 'object') {
79 if (copy_id == null) {
80 if (typeof row.my.acp == 'object' && row.my.acp != null) copy_id = row.my.acp.id();
82 copy_id = copy_id.id();
85 copy_id = row.my.acp.id();
88 obj.holds_map[ row.my.ahr.id() ] = row.my.ahr;
89 params.row_node.setAttribute('retrieve_id',
92 'barcode':row.my.acp ? row.my.acp.barcode() : null,
94 'type':row.my.ahr.hold_type(),
95 'target':row.my.ahr.target(),
96 'usr':row.my.ahr.usr(),
99 if (typeof params.on_retrieve == 'function') { params.on_retrieve(row); }
102 obj.error.standard_unexpected_error_alert('Error retrieving details for hold #' + row.my.hold_id, E);
107 obj.error.sdump('D_ERROR','retrieve_row: ' + E );
111 'on_select' : function(ev) {
112 JSAN.use('util.functional');
113 var sel = obj.list.retrieve_selection();
114 obj.controller.view.sel_clip.setAttribute('disabled',sel.length < 1);
115 obj.retrieve_ids = util.functional.map_list(
117 function(o) { return JSON2js( o.getAttribute('retrieve_id') ); }
119 if (obj.retrieve_ids.length > 0) {
120 obj.controller.view.sel_mark_items_damaged.setAttribute('disabled','false');
121 obj.controller.view.sel_mark_items_missing.setAttribute('disabled','false');
122 obj.controller.view.sel_copy_details.setAttribute('disabled','false');
123 obj.controller.view.sel_patron.setAttribute('disabled','false');
124 obj.controller.view.cmd_retrieve_patron.setAttribute('disabled','false');
125 obj.controller.view.cmd_holds_edit_pickup_lib.setAttribute('disabled','false');
126 obj.controller.view.cmd_holds_edit_phone_notify.setAttribute('disabled','false');
127 obj.controller.view.cmd_holds_edit_email_notify.setAttribute('disabled','false');
128 obj.controller.view.cmd_holds_edit_selection_depth.setAttribute('disabled','false');
129 obj.controller.view.cmd_holds_edit_thaw_date.setAttribute('disabled','false');
130 obj.controller.view.cmd_holds_activate.setAttribute('disabled','false');
131 obj.controller.view.cmd_holds_suspend.setAttribute('disabled','false');
132 obj.controller.view.cmd_show_notifications.setAttribute('disabled','false');
133 obj.controller.view.cmd_holds_retarget.setAttribute('disabled','false');
134 obj.controller.view.cmd_holds_cancel.setAttribute('disabled','false');
135 obj.controller.view.cmd_show_catalog.setAttribute('disabled','false');
137 obj.controller.view.sel_mark_items_damaged.setAttribute('disabled','true');
138 obj.controller.view.sel_mark_items_missing.setAttribute('disabled','true');
139 obj.controller.view.sel_copy_details.setAttribute('disabled','true');
140 obj.controller.view.sel_patron.setAttribute('disabled','true');
141 obj.controller.view.cmd_retrieve_patron.setAttribute('disabled','true');
142 obj.controller.view.cmd_holds_edit_pickup_lib.setAttribute('disabled','true');
143 obj.controller.view.cmd_holds_edit_phone_notify.setAttribute('disabled','true');
144 obj.controller.view.cmd_holds_edit_email_notify.setAttribute('disabled','true');
145 obj.controller.view.cmd_holds_edit_selection_depth.setAttribute('disabled','true');
146 obj.controller.view.cmd_holds_edit_thaw_date.setAttribute('disabled','true');
147 obj.controller.view.cmd_holds_activate.setAttribute('disabled','true');
148 obj.controller.view.cmd_holds_suspend.setAttribute('disabled','true');
149 obj.controller.view.cmd_show_notifications.setAttribute('disabled','true');
150 obj.controller.view.cmd_holds_retarget.setAttribute('disabled','true');
151 obj.controller.view.cmd_holds_cancel.setAttribute('disabled','true');
152 obj.controller.view.cmd_show_catalog.setAttribute('disabled','true');
159 JSAN.use('util.controller'); obj.controller = new util.controller();
163 'save_columns' : [ [ 'command' ], function() { obj.list.save_columns(); } ],
166 function() { obj.list.clipboard(); }
170 function() { alert('Not Yet Implemented'); }
175 JSAN.use('circ.util');
176 circ.util.show_last_few_circs(obj.retrieve_ids);
179 'sel_mark_items_damaged' : [
182 JSAN.use('cat.util'); JSAN.use('util.functional');
183 cat.util.mark_item_damaged( util.functional.map_list( obj.retrieve_ids, function(o) { return o.copy_id; } ) );
186 'sel_mark_items_missing' : [
189 JSAN.use('cat.util'); JSAN.use('util.functional');
190 cat.util.mark_item_missing( util.functional.map_list( obj.retrieve_ids, function(o) { return o.copy_id; } ) );
193 'sel_copy_details' : [
196 JSAN.use('circ.util');
197 for (var i = 0; i < obj.retrieve_ids.length; i++) {
198 if (obj.retrieve_ids[i].copy_id) circ.util.show_copy_details( obj.retrieve_ids[i].copy_id );
202 'cmd_holds_print' : [
206 JSAN.use('patron.util');
208 'patron' : patron.util.retrieve_au_via_id(ses(),obj.patron_id),
211 obj.list.print(params);
213 obj.error.standard_unexpected_error_alert('print 1',E);
217 'cmd_holds_export' : [
221 obj.list.dump_csv_to_clipboard();
223 obj.error.standard_unexpected_error_alert('export 1',E);
228 'cmd_show_notifications' : [
232 JSAN.use('util.window'); var win = new util.window();
233 for (var i = 0; i < obj.retrieve_ids.length; i++) {
234 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
236 xulG.url_prefix(urls.XUL_HOLD_NOTICES), // + '?ahr_id=' + obj.retrieve_ids[i].id,
237 'hold_notices_' + obj.retrieve_ids[i].id,
239 { 'ahr_id' : obj.retrieve_ids[i].id }
243 obj.error.standard_unexpected_error_alert('Error rendering/retrieving hold notifications.',E);
247 'cmd_holds_edit_selection_depth' : [
251 JSAN.use('util.widgets'); JSAN.use('util.functional');
252 var ws_type = obj.data.hash.aout[ obj.data.hash.aou[ obj.data.list.au[0].ws_ou() ].ou_type() ];
253 var list = util.functional.map_list(
254 util.functional.filter_list(
257 if (o.depth() > ws_type.depth()) return false;
258 if (o.depth() < ws_type.depth()) return true;
259 return (o.id() == ws_type.id());
271 ml = util.widgets.make_menulist( list, obj.data.list.au[0].ws_ou() );
272 ml.setAttribute('id','selection');
273 ml.setAttribute('name','fancy_data');
274 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
275 xml += '<description>Please choose a Hold Range:</description>';
276 xml += util.widgets.serialize_node(ml);
278 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
279 bot_xml += '<spacer flex="1"/><button label="Done" accesskey="D" name="fancy_submit"/>';
280 bot_xml += '<button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
281 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
282 //obj.data.temp_mid = xml; obj.data.stash('temp_mid');
283 //obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
284 JSAN.use('util.window'); var win = new util.window();
285 var fancy_prompt_data = win.open(
286 urls.XUL_FANCY_PROMPT,
287 //+ '?xml_in_stash=temp_mid'
288 //+ '&bottom_xml_in_stash=temp_bot'
289 //+ '&title=' + window.escape('Choose a Pick Up Library'),
290 'fancy_prompt', 'chrome,resizable,modal',
291 { 'xml' : xml, 'bottom_xml' : bot_xml, 'title' : 'Choose a Pick Up Library' }
293 if (fancy_prompt_data.fancy_status == 'incomplete') { return; }
294 var selection = fancy_prompt_data.selection;
295 var msg = 'Are you sure you would like to change the Hold Range for hold' + ( obj.retrieve_ids.length > 1 ? 's ' : ' ') + util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ') + ' to "' + obj.data.hash.aout[selection].opac_label() + '"?';
296 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
298 for (var i = 0; i < obj.retrieve_ids.length; i++) {
299 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
300 hold.selection_depth( obj.data.hash.aout[selection].depth() ); hold.ischanged('1');
301 hold = obj.flatten_copy(hold);
302 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
303 if (typeof robj.ilsevent != 'undefined') throw(robj);
305 obj.clear_and_retrieve(true);
308 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
313 'cmd_holds_edit_pickup_lib' : [
317 JSAN.use('util.widgets'); JSAN.use('util.functional');
318 var list = util.functional.map_list(
321 var sname = o.shortname(); for (i = sname.length; i < 20; i++) sname += ' ';
323 o.name() ? sname + ' ' + o.name() : o.shortname(),
325 ( obj.data.hash.aout[ o.ou_type() ].can_have_users() == 0),
326 ( obj.data.hash.aout[ o.ou_type() ].depth() * 2),
330 ml = util.widgets.make_menulist( list, obj.data.list.au[0].ws_ou() );
331 ml.setAttribute('id','lib');
332 ml.setAttribute('name','fancy_data');
333 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
334 xml += '<description>Please choose a new Pickup Library:</description>';
335 xml += util.widgets.serialize_node(ml);
337 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
338 bot_xml += '<spacer flex="1"/><button label="Done" accesskey="D" name="fancy_submit"/>';
339 bot_xml += '<button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
340 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
341 //obj.data.temp_mid = xml; obj.data.stash('temp_mid');
342 //obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
343 JSAN.use('util.window'); var win = new util.window();
344 var fancy_prompt_data = win.open(
345 urls.XUL_FANCY_PROMPT,
346 //+ '?xml_in_stash=temp_mid'
347 //+ '&bottom_xml_in_stash=temp_bot'
348 //+ '&title=' + window.escape('Choose a Pick Up Library'),
349 'fancy_prompt', 'chrome,resizable,modal',
350 { 'xml' : xml, 'bottom_xml' : bot_xml, 'title' : 'Choose a Pick Up Library' }
352 if (fancy_prompt_data.fancy_status == 'incomplete') { return; }
353 var pickup_lib = fancy_prompt_data.lib;
354 var msg = 'Are you sure you would like to change the Pick Up Lib for hold' + ( obj.retrieve_ids.length > 1 ? 's ' : ' ') + util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ') + ' to ' + obj.data.hash.aou[pickup_lib].shortname() + '?';
355 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
357 for (var i = 0; i < obj.retrieve_ids.length; i++) {
358 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
359 hold.pickup_lib( pickup_lib ); hold.ischanged('1');
360 hold = obj.flatten_copy(hold);
361 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
362 if (typeof robj.ilsevent != 'undefined') throw(robj);
364 obj.clear_and_retrieve(true);
367 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
371 'cmd_holds_edit_phone_notify' : [
375 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
376 xml += '<description>Please enter a new phone number for hold notification (leave the field empty to disable phone notification):</description>';
377 xml += '<textbox id="phone" name="fancy_data"/>';
379 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
380 bot_xml += '<spacer flex="1"/><button label="Done" accesskey="D" name="fancy_submit"/>';
381 bot_xml += '<button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
382 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
383 //obj.data.temp_mid = xml; obj.data.stash('temp_mid');
384 //obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
385 JSAN.use('util.window'); var win = new util.window();
386 var fancy_prompt_data = win.open(
387 urls.XUL_FANCY_PROMPT,
388 //+ '?xml_in_stash=temp_mid'
389 //+ '&bottom_xml_in_stash=temp_bot'
390 //+ '&title=' + window.escape('Choose a Hold Notification Phone Number')
392 'fancy_prompt', 'chrome,resizable,modal',
393 { 'xml' : xml, 'bottom_xml' : bot_xml, 'title' : 'Choose a Hold Notification Phone Number', 'focus' : 'phone' }
395 if (fancy_prompt_data.fancy_status == 'incomplete') { return; }
396 var phone = fancy_prompt_data.phone;
397 var msg = 'Are you sure you would like to change the Notification Phone Number for hold' + ( obj.retrieve_ids.length > 1 ? 's ' : ' ') + util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ') + ' to "' + phone + '"?';
398 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
400 for (var i = 0; i < obj.retrieve_ids.length; i++) {
401 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
402 hold.phone_notify( phone ); hold.ischanged('1');
403 hold = obj.flatten_copy(hold);
404 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
405 if (typeof robj.ilsevent != 'undefined') throw(robj);
407 obj.clear_and_retrieve(true);
410 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
414 'cmd_holds_edit_email_notify' : [
418 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
419 xml += '<description>Send email notifications (when appropriate)? The email address used is found in the hold recipient account.</description>';
420 xml += '<hbox><button value="email" label="Email" accesskey="E" name="fancy_submit"/>';
421 xml += '<button value="noemail" label="No Email" accesskey="N" name="fancy_submit"/></hbox>';
423 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
424 bot_xml += '<spacer flex="1"/><button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
425 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
426 //obj.data.temp_mid = xml; obj.data.stash('temp_mid');
427 //obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
428 JSAN.use('util.window'); var win = new util.window();
429 var fancy_prompt_data = win.open(
430 urls.XUL_FANCY_PROMPT,
431 //+ '?xml_in_stash=temp_mid'
432 //+ '&bottom_xml_in_stash=temp_bot'
433 //+ '&title=' + window.escape('Set Email Notification for Holds'),
434 'fancy_prompt', 'chrome,resizable,modal',
435 { 'xml' : xml, 'bottom_xml' : bot_xml, 'title' : 'Set Email Notification for Holds' }
437 if (fancy_prompt_data.fancy_status == 'incomplete') { return; }
438 var email = fancy_prompt_data.fancy_submit == 'email' ? get_db_true() : get_db_false();
439 var msg = 'Are you sure you would like ' + ( get_bool( email ) ? 'enable' : 'disable' ) + ' email notification for hold' + ( obj.retrieve_ids.length > 1 ? 's ' : ' ') + util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ') + '?';
440 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
442 for (var i = 0; i < obj.retrieve_ids.length; i++) {
443 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
444 hold.email_notify( email ); hold.ischanged('1');
445 hold = obj.flatten_copy(hold);
446 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
447 if (typeof robj.ilsevent != 'undefined') throw(robj);
449 obj.clear_and_retrieve(true);
452 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
456 'cmd_holds_suspend' : [
460 var hold_list = util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ');
461 var r = obj.error.yns_alert(
462 obj.retrieve_ids.length > 1 ?
463 document.getElementById('circStrings').getFormattedString('staff.circ.holds.suspend.prompt.plural',[hold_list]) :
464 document.getElementById('circStrings').getFormattedString('staff.circ.holds.suspend.prompt',[hold_list]),
465 document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds'),
466 document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds.yes'),
467 document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds.no'),
469 document.getElementById('commonStrings').getString('common.confirm')
472 var already_suspended = [];
473 for (var i = 0; i < obj.retrieve_ids.length; i++) {
474 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
475 if ( get_bool( hold.frozen() ) ) {
476 already_suspended.push( hold.id() );
480 hold.thaw_date(null);
482 hold = obj.flatten_copy(hold);
483 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
484 if (typeof robj.ilsevent != 'undefined') throw(robj);
486 if (already_suspended.length == 1) {
487 alert( document.getElementById('circStrings').getFormattedString('staff.circ.holds.already_suspended',[already_suspended[0]]) );
488 } else if (already_suspended.length > 1) {
489 alert( document.getElementById('circStrings').getFormattedString('staff.circ.holds.already_suspended.plural',[already_suspended.join(', ')]) );
491 obj.clear_and_retrieve(true);
494 obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.holds.unexpected_error.not_likely_suspended'),E);
498 'cmd_holds_activate' : [
502 var hold_list = util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ');
503 var r = obj.error.yns_alert(
504 obj.retrieve_ids.length > 1 ?
505 document.getElementById('circStrings').getFormattedString('staff.circ.holds.activate.prompt.plural',[hold_list]) :
506 document.getElementById('circStrings').getFormattedString('staff.circ.holds.activate.prompt',[hold_list]),
507 document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds'),
508 document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds.yes'),
509 document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds.no'),
511 document.getElementById('commonStrings').getString('common.confirm')
514 var already_activated = [];
515 for (var i = 0; i < obj.retrieve_ids.length; i++) {
516 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
517 if ( ! get_bool( hold.frozen() ) ) {
518 already_activated.push( hold.id() );
522 hold.thaw_date(null);
524 hold = obj.flatten_copy(hold);
525 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
526 if (typeof robj.ilsevent != 'undefined') throw(robj);
528 if (already_activated.length == 1) {
529 alert( document.getElementById('circStrings').getFormattedString('staff.circ.holds.already_activated',[already_activated[0]]) );
530 } else if (already_activated.length > 1) {
531 alert( document.getElementById('circStrings').getFormattedString('staff.circ.holds.already_activated.plural',[already_activated.join(', ')]) );
533 obj.clear_and_retrieve(true);
536 obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.holds.unexpected_error.not_likely_activated'),E);
540 'cmd_holds_edit_thaw_date' : [
544 JSAN.use('util.date');
545 function check_date(value) {
547 if (! util.date.check('YYYY-MM-DD',value) ) { throw(document.getElementById('circStrings').getString('staff.circ.holds.activation_date.invalid_date')); }
548 if (util.date.check_past('YYYY-MM-DD',value) || util.date.formatted_date(new Date(),'%F') == value ) {
549 throw(document.getElementById('circStrings').getString('staff.circ.holds.activation_date.too_early.error'));
558 var hold_ids = util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ');
559 var msg_singular = document.getElementById('circStrings').getFormattedString('staff.circ.holds.activation_date.prompt',[hold_ids]);
560 var msg_plural = document.getElementById('circStrings').getFormattedString('staff.circ.holds.activation_date.prompt',[hold_ids]);
561 var msg = obj.retrieve_ids.length > 1 ? msg_plural : msg_singular;
562 var value = 'YYYY-MM-DD';
563 var title = document.getElementById('circStrings').getString('staff.circ.holds.modifying_holds');
564 var thaw_date; var invalid = true;
566 thaw_date = window.prompt(msg,value,title);
568 invalid = ! check_date(thaw_date);
573 if (thaw_date || thaw_date == '') {
574 for (var i = 0; i < obj.retrieve_ids.length; i++) {
575 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
577 hold.thaw_date( thaw_date == '' ? null : util.date.formatted_date(thaw_date + ' 00:00:00','%{iso8601}') ); hold.ischanged('1');
578 hold = obj.flatten_copy(hold);
579 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
580 if (typeof robj.ilsevent != 'undefined') throw(robj);
582 obj.clear_and_retrieve(true);
585 obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.holds.unexpected_error.not_likely_modified'),E);
590 'cmd_holds_retarget' : [
594 JSAN.use('util.functional');
595 var msg = 'Are you sure you would like to reset hold' + ( obj.retrieve_ids.length > 1 ? 's ' : ' ') + util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ') + '?';
596 var r = obj.error.yns_alert(msg,'Resetting Holds','Yes','No',null,'Check here to confirm this message');
598 for (var i = 0; i < obj.retrieve_ids.length; i++) {
599 var robj = obj.network.simple_request('FM_AHR_RESET',[ ses(), obj.retrieve_ids[i].id]);
600 if (typeof robj.ilsevent != 'undefined') throw(robj);
602 obj.clear_and_retrieve();
605 obj.error.standard_unexpected_error_alert('Holds not likely reset.',E);
611 'cmd_holds_cancel' : [
615 JSAN.use('util.functional');
616 var msg = 'Are you sure you would like to cancel hold' + ( obj.retrieve_ids.length > 1 ? 's ' : ' ') + util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ') + '?';
617 var r = obj.error.yns_alert(msg,'Cancelling Holds','Yes','No',null,'Check here to confirm this message');
620 for (var i = 0; i < obj.retrieve_ids.length; i++) {
621 if (obj.holds_map[ obj.retrieve_ids[i].id ].transit()) {
622 transits.push( obj.retrieve_ids[i].barcode );
624 var robj = obj.network.simple_request('FM_AHR_CANCEL',[ ses(), obj.retrieve_ids[i].id]);
625 if (typeof robj.ilsevent != 'undefined') throw(robj);
627 if (transits.length > 0) {
628 var msg2 = 'For barcodes ' + transits.join(', ') + ' cancel the transits as well?';
629 var r2 = obj.error.yns_alert(msg2,'Cancelling Transits','Yes','No',null,'Check here to confirm this message');
632 for (var i = 0; i < transits.length; i++) {
633 var robj = obj.network.simple_request('FM_ATC_VOID',[ ses(), { 'barcode' : transits[i] } ]);
634 if (typeof robj.ilsevent != 'undefined') {
635 switch(Number(robj.ilsevent)) {
636 case 1225 /* TRANSIT_ABORT_NOT_ALLOWED */ :
639 case 5000 /* PERM_FAILURE */ :
648 obj.error.standard_unexpected_error_alert('Hold-transits not likely cancelled.',E);
652 obj.clear_and_retrieve();
655 obj.error.standard_unexpected_error_alert('Holds not likely cancelled.',E);
659 'cmd_retrieve_patron' : [
664 for (var i = 0; i < obj.retrieve_ids.length; i++) {
665 var patron_id = obj.retrieve_ids[i].usr;
666 if (seen[patron_id]) continue; seen[patron_id] = true;
668 xulG.url_prefix(urls.XUL_PATRON_DISPLAY), // + '?id=' + patron_id,
674 obj.error.standard_unexpected_error_alert('',E);
678 'cmd_show_catalog' : [
682 for (var i = 0; i < obj.retrieve_ids.length; i++) {
683 var htarget = obj.retrieve_ids[i].target;
684 var htype = obj.retrieve_ids[i].type;
688 opac_url = xulG.url_prefix( urls.opac_rresult ) + '?m=' + htarget;
691 opac_url = xulG.url_prefix( urls.opac_rdetail ) + '?r=' + htarget;
694 var my_acn = obj.network.simple_request( 'FM_ACN_RETRIEVE.authoritative', [ htarget ]);
695 opac_url = xulG.url_prefix( urls.opac_rdetail) + '?r=' + my_acn.record();
698 var my_acp = obj.network.simple_request( 'FM_ACP_RETRIEVE', [ htarget ]);
700 if (typeof my_acp.call_number() == 'object') {
701 my_acn = my.acp.call_number();
703 my_acn = obj.network.simple_request( 'FM_ACN_RETRIEVE.authoritative',
704 [ my_acp.call_number() ]);
706 opac_url = xulG.url_prefix( urls.opac_rdetail) + '?r=' + my_acn.record();
709 obj.error.standard_unexpected_error_alert("I don't understand the hold type of " + htype + ", so I can't jump to the appropriate record in the catalog.", obj.retrieve_ids[i]);
713 var content_params = {
715 'authtime' : ses('authtime'),
716 'opac_url' : opac_url,
719 xulG.url_prefix(urls.XUL_OPAC_WRAPPER),
720 {'tab_name': htype == 'M' ? 'Catalog' : 'Retrieving title...'},
725 obj.error.standard_unexpected_error_alert('',E);
732 obj.pull_from_shelf_interface.current.offset += obj.pull_from_shelf_interface.current.limit;
736 'lib_filter_checkbox' : [
739 var x_lib_type_menu = document.getElementById('lib_type_menu');
740 if (x_lib_type_menu) x_lib_type_menu.disabled = ! ev.target.checked;
741 if (obj.controller.view.lib_menu) obj.controller.view.lib_menu.disabled = ! ev.target.checked;
742 obj.clear_and_retrieve();
743 ev.target.setAttribute('checked',ev.target.checked);
750 obj.determine_hold_interface_type();
751 var x_fetch_more = document.getElementById('fetch_more');
752 var x_lib_type_menu = document.getElementById('lib_type_menu');
753 var x_lib_menu_placeholder = document.getElementById('lib_menu_placeholder');
754 var x_lib_filter_checkbox = document.getElementById('lib_filter_checkbox');
755 switch(obj.hold_interface_type) {
757 obj.render_lib_menus({'pickup_lib':true});
758 if (x_lib_type_menu) x_lib_type_menu.hidden = false;
759 if (x_lib_menu_placeholder) x_lib_menu_placeholder.hidden = false;
762 if (x_fetch_more) x_fetch_more.hidden = false;
763 if (x_lib_type_menu) x_lib_type_menu.hidden = true;
764 if (x_lib_menu_placeholder) x_lib_menu_placeholder.hidden = true;
767 obj.render_lib_menus({'pickup_lib':true,'request_lib':true});
768 if (x_lib_filter_checkbox) x_lib_filter_checkbox.hidden = false;
769 if (x_lib_type_menu) x_lib_type_menu.hidden = false;
770 if (x_lib_menu_placeholder) x_lib_menu_placeholder.hidden = false;
773 if (x_fetch_more) x_fetch_more.hidden = true;
774 if (x_lib_type_menu) x_lib_type_menu.hidden = true;
775 if (x_lib_menu_placeholder) x_lib_menu_placeholder.hidden = true;
778 setTimeout( // We do this because render_lib_menus above creates and appends a DOM node, but until this thread exits, it doesn't really happen
780 if (x_lib_filter_checkbox) if (!x_lib_filter_checkbox.checked) {
781 if (x_lib_type_menu) x_lib_type_menu.disabled = true;
782 if (obj.controller.view.lib_menu) obj.controller.view.lib_menu.disabled = true;
784 obj.controller.render();
787 obj.controller.view.cmd_retrieve_patron.setAttribute('disabled','true');
788 obj.controller.view.cmd_holds_edit_pickup_lib.setAttribute('disabled','true');
789 obj.controller.view.cmd_holds_edit_phone_notify.setAttribute('disabled','true');
790 obj.controller.view.cmd_holds_edit_email_notify.setAttribute('disabled','true');
791 obj.controller.view.cmd_holds_edit_thaw_date.setAttribute('disabled','true');
792 obj.controller.view.cmd_holds_activate.setAttribute('disabled','true');
793 obj.controller.view.cmd_holds_suspend.setAttribute('disabled','true');
794 obj.controller.view.cmd_holds_edit_selection_depth.setAttribute('disabled','true');
795 obj.controller.view.cmd_show_notifications.setAttribute('disabled','true');
796 obj.controller.view.cmd_holds_retarget.setAttribute('disabled','true');
797 obj.controller.view.cmd_holds_cancel.setAttribute('disabled','true');
798 obj.controller.view.cmd_show_catalog.setAttribute('disabled','true');
803 'determine_hold_interface_type' : function() {
805 if (obj.patron_id) { /*************************************************** PATRON ******************************/
806 obj.hold_interface_type = 'patron';
807 } else if (obj.docid) { /*************************************************** RECORD ******************************/
808 obj.hold_interface_type = 'record';
809 } else if (obj.pull) { /*************************************************** PULL ******************************/
810 obj.hold_interface_type = 'pull';
811 } else if (obj.shelf) { /*************************************************** HOLD SHELF ******************************/
812 obj.hold_interface_type = 'shelf';
813 } else { /*************************************************** PULL ******************************/
814 obj.hold_interface_type = 'pull';
818 'clear_and_retrieve' : function(dont_show_me_the_list_change) {
820 this.pull_from_shelf_interface.current.offset = this.pull_from_shelf_interface._default.offset;
821 this.retrieve(dont_show_me_the_list_change);
824 'retrieve' : function(dont_show_me_the_list_change) {
825 var obj = this; var holds = [];
826 if (window.xulG && window.xulG.holds) {
827 holds = window.xulG.holds;
829 var method; var params = [ ses() ];
830 switch(obj.hold_interface_type) {
832 method = 'FM_AHR_ID_LIST_RETRIEVE_VIA_AU.authoritative';
833 params.push( obj.patron_id );
834 obj.controller.view.cmd_retrieve_patron.setAttribute('hidden','true');
837 method = 'FM_AHR_RETRIEVE_ALL_VIA_BRE';
838 params.push( obj.docid );
839 var x_lib_filter = document.getElementById('lib_filter_checkbox');
840 var x_lib_type_menu = document.getElementById('lib_type_menu');
842 if (x_lib_filter.checked) {
843 if (x_lib_type_menu && obj.controller.view.lib_menu) {
845 x[ x_lib_type_menu.value ] = obj.controller.view.lib_menu.value;
850 obj.controller.view.cmd_retrieve_patron.setAttribute('hidden','false');
853 method = 'FM_AHR_ID_LIST_ONSHELF_RETRIEVE';
854 params.push( obj.filter_lib || obj.data.list.au[0].ws_ou() );
855 obj.controller.view.cmd_retrieve_patron.setAttribute('hidden','false');
859 method = 'FM_AHR_ID_LIST_PULL_LIST';
860 params.push( obj.pull_from_shelf_interface.current.limit ); params.push( obj.pull_from_shelf_interface.current.offset );
861 //obj.controller.view.cmd_retrieve_patron.setAttribute('hidden','false');
864 var robj = obj.network.simple_request( method, params );
865 if (typeof robj.ilsevent != 'undefined') throw(robj);
866 if (method == 'FM_AHR_RETRIEVE_ALL_VIA_BRE') {
868 holds = holds.concat( robj.copy_holds );
869 holds = holds.concat( robj.volume_holds );
870 holds = holds.concat( robj.title_holds );
871 holds = holds.sort();
875 //alert('method = ' + method + ' params = ' + js2JSON(params));
878 var x_fetch_more = document.getElementById('fetch_more');
879 if (holds.length == 0) {
880 if (x_fetch_more) x_fetch_more.disabled = true;
882 if (x_fetch_more) x_fetch_more.disabled = false;
883 obj.render(holds,dont_show_me_the_list_change);
888 'render' : function(holds,dont_show_me_the_list_change) {
891 function list_append(hold_id) {
903 function gen_list_append(hold) {
905 if (typeof obj.controller.view.lib_menu == 'undefined') {
906 list_append(typeof hold == 'object' ? hold.id() : hold);
908 list_append(typeof hold == 'object' ? hold.id() : hold);
915 JSAN.use('util.exec'); var exec = new util.exec(2);
917 for (var i in holds) {
918 rows.push( gen_list_append(holds[i]) );
922 if (!dont_show_me_the_list_change) {
923 if (window.xulG && typeof window.xulG.on_list_change == 'function') {
924 try { window.xulG.on_list_change(holds); } catch(E) { this.error.sdump('D_ERROR',E); }
929 'render_lib_menus' : function(types) {
932 JSAN.use('util.widgets'); JSAN.use('util.functional'); JSAN.use('util.fm_utils');
934 var x = document.getElementById('lib_type_menu');
936 var nodes = x.firstChild.childNodes;
937 for (var i = 0; i < nodes.length; i++) nodes[i].hidden = true;
938 for (var i in types) document.getElementById(i).hidden = false;
940 x.setAttribute('oncommand','g.holds.clear_and_retrieve()');
942 x = document.getElementById('lib_menu_placeholder');
943 util.widgets.remove_children( x );
945 JSAN.use('util.file');
946 var file = new util.file('offline_ou_list');
947 if (file._file.exists()) {
948 var list_data = file.get_object(); file.close();
949 var ml = util.widgets.make_menulist( list_data[0], obj.data.list.au[0].ws_ou() );
950 ml.setAttribute('id','lib_menu');
955 obj.filter_lib = ev.target.value;
956 obj.clear_and_retrieve();
960 obj.controller.view.lib_menu = ml;
962 throw('Missing library list.\n');
966 this.error.standard_unexpected_error_alert('rendering lib menu',E);
971 dump('exiting patron.holds.js\n');