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 'foreign_shelf' : null,
19 'init' : function( params ) {
23 obj.patron_id = params['patron_id'];
24 obj.docid = params['docid'];
25 obj.shelf = params['shelf'];
26 obj.tree_id = params['tree_id'];
28 JSAN.use('circ.util');
29 var columns = circ.util.hold_columns(
31 'title' : { 'hidden' : false, 'flex' : '3' },
32 'request_time' : { 'hidden' : false },
33 'pickup_lib_shortname' : { 'hidden' : false },
34 'hold_type' : { 'hidden' : false },
35 'current_copy' : { 'hidden' : false },
36 'capture_time' : { 'hidden' : false },
37 'notify_time' : { 'hidden' : false },
38 'notify_count' : { 'hidden' : false },
42 JSAN.use('util.list'); obj.list = new util.list( obj.tree_id || 'holds_list');
46 'map_row_to_columns' : circ.util.std_map_row_to_columns(),
47 'retrieve_row' : function(params) {
50 obj.network.simple_request('FM_AHR_BLOB_RETRIEVE', [ ses(), row.my.hold_id ],
53 var blob = blob_req.getResultObject();
54 if (typeof blob.ilsevent != 'undefined') throw(blob);
55 row.my.ahr = blob.hold;
56 row.my.status = blob.status;
57 row.my.acp = blob.copy;
58 row.my.acn = blob.volume;
59 row.my.mvr = blob.mvr;
60 row.my.patron_family_name = blob.patron_last;
61 row.my.patron_first_given_name = blob.patron_first;
62 row.my.patron_barcode = blob.patron_barcode;
64 var copy_id = row.my.ahr.current_copy();
65 if (typeof copy_id == 'object') {
66 if (copy_id == null) {
67 if (typeof row.my.acp == 'object' && row.my.acp != null) copy_id = row.my.acp.id();
69 copy_id = copy_id.id();
72 copy_id = row.my.acp.id();
75 obj.holds_map[ row.my.ahr.id() ] = row.my.ahr;
76 params.row_node.setAttribute('retrieve_id',
79 'barcode':row.my.acp ? row.my.acp.barcode() : null,
81 'type':row.my.ahr.hold_type(),
82 'target':row.my.ahr.target(),
83 'usr':row.my.ahr.usr(),
86 if (typeof params.on_retrieve == 'function') { params.on_retrieve(row); }
89 obj.error.standard_unexpected_error_alert('Error retrieving details for hold #' + row.my.hold_id, E);
94 obj.network.simple_request('FM_AHR_RETRIEVE', [ ses(), row.my.hold_id ],
97 var ahr_robj = ahr_req.getResultObject();
98 if (typeof ahr_robj.ilsevent != 'undefined') throw(ahr_robj);
99 row.my.ahr = ahr_robj[0];
100 obj.holds_map[ row.my.ahr.id() ] = row.my.ahr;
101 params.row_node.setAttribute('retrieve_id',
103 'copy_id':row.my.ahr.current_copy(),
104 'id':row.my.ahr.id(),
105 'type':row.my.ahr.hold_type(),
106 'target':row.my.ahr.target(),
107 'usr':row.my.ahr.usr(),
111 obj.network.simple_request('FM_AHR_STATUS',[ ses(), row.my.ahr.id() ],
112 function(status_req) {
114 var status_robj = status_req.getResultObject();
115 row.my.status = status_robj;
116 switch(row.my.ahr.hold_type()) {
119 api.MODS_SLIM_METARECORD_RETRIEVE.app,
120 api.MODS_SLIM_METARECORD_RETRIEVE.method,
121 [ row.my.ahr.target() ],
123 row.my.mvr = mvr_req.getResultObject();
124 if ( row.my.ahr.current_copy() && ! row.my.acp) {
125 obj.network.simple_request( 'FM_ACP_RETRIEVE', [ row.my.ahr.current_copy() ],
127 row.my.acp = acp_req.getResultObject();
128 if (typeof params.on_retrieve == 'function') { params.on_retrieve(row); }
132 if (typeof params.on_retrieve == 'function') { params.on_retrieve(row); }
139 api.MODS_SLIM_RECORD_RETRIEVE.app,
140 api.MODS_SLIM_RECORD_RETRIEVE.method,
141 [ row.my.ahr.target() ],
143 row.my.mvr = mvr_req.getResultObject();
144 if ( row.my.ahr.current_copy() && ! row.my.acp) {
145 obj.network.simple_request( 'FM_ACP_RETRIEVE', [ row.my.ahr.current_copy() ],
147 row.my.acp = acp_req.getResultObject();
148 if (typeof params.on_retrieve == 'function') { params.on_retrieve(row); }
152 if (typeof params.on_retrieve == 'function') { params.on_retrieve(row); }
159 row.my.acn = obj.network.simple_request( 'FM_ACN_RETRIEVE', [ row.my.ahr.target() ],
161 row.my.acn = acn_req.getResultObject();
163 api.MODS_SLIM_RECORD_RETRIEVE.app,
164 api.MODS_SLIM_RECORD_RETRIEVE.method,
165 [ row.my.acn.record() ],
167 try { row.my.mvr = mvr_req.getResultObject(); } catch(E) {}
168 if ( row.my.ahr.current_copy() && ! row.my.acp) {
169 obj.network.simple_request( 'FM_ACP_RETRIEVE', [ row.my.ahr.current_copy() ],
171 row.my.acp = acp_req.getResultObject();
172 if (typeof params.on_retrieve == 'function') { params.on_retrieve(row); }
176 if (typeof params.on_retrieve == 'function') { params.on_retrieve(row); }
184 obj.network.simple_request( 'FM_ACP_RETRIEVE', [ row.my.ahr.target() ],
186 row.my.acp = acp_req.getResultObject();
187 obj.network.simple_request( 'FM_ACN_RETRIEVE', [ typeof row.my.acp.call_number() == 'object' ? row.my.acp.call_number().id() : row.my.acp.call_number() ],
189 row.my.acn = acn_req.getResultObject();
191 api.MODS_SLIM_RECORD_RETRIEVE.app,
192 api.MODS_SLIM_RECORD_RETRIEVE.method,
193 [ row.my.acn.record() ],
195 try { row.my.mvr = mvr_req.getResultObject(); } catch(E) {}
196 if (typeof params.on_retrieve == 'function') { params.on_retrieve(row); }
206 obj.error.standard_unexpected_error_alert('Error retrieving status for hold #' + row.my.hold_id, E);
211 obj.error.standard_unexpected_error_alert('Error retrieving hold #' + row.my.hold_id, E);
217 obj.error.sdump('D_ERROR','retrieve_row: ' + E );
221 'on_select' : function(ev) {
222 JSAN.use('util.functional');
223 var sel = obj.list.retrieve_selection();
224 obj.controller.view.sel_clip.setAttribute('disabled',sel.length < 1);
225 obj.retrieve_ids = util.functional.map_list(
227 function(o) { return JSON2js( o.getAttribute('retrieve_id') ); }
229 if (obj.retrieve_ids.length > 0) {
230 obj.controller.view.sel_mark_items_damaged.setAttribute('disabled','false');
231 obj.controller.view.sel_mark_items_missing.setAttribute('disabled','false');
232 obj.controller.view.sel_copy_details.setAttribute('disabled','false');
233 obj.controller.view.sel_patron.setAttribute('disabled','false');
234 obj.controller.view.cmd_retrieve_patron.setAttribute('disabled','false');
235 obj.controller.view.cmd_holds_edit_pickup_lib.setAttribute('disabled','false');
236 obj.controller.view.cmd_holds_edit_phone_notify.setAttribute('disabled','false');
237 obj.controller.view.cmd_holds_edit_email_notify.setAttribute('disabled','false');
238 obj.controller.view.cmd_holds_edit_selection_depth.setAttribute('disabled','false');
239 obj.controller.view.cmd_holds_edit_thaw_date.setAttribute('disabled','false');
240 obj.controller.view.cmd_holds_edit_freeze.setAttribute('disabled','false');
241 obj.controller.view.cmd_show_notifications.setAttribute('disabled','false');
242 obj.controller.view.cmd_holds_retarget.setAttribute('disabled','false');
243 obj.controller.view.cmd_holds_cancel.setAttribute('disabled','false');
244 obj.controller.view.cmd_show_catalog.setAttribute('disabled','false');
246 obj.controller.view.sel_mark_items_damaged.setAttribute('disabled','true');
247 obj.controller.view.sel_mark_items_missing.setAttribute('disabled','true');
248 obj.controller.view.sel_copy_details.setAttribute('disabled','true');
249 obj.controller.view.sel_patron.setAttribute('disabled','true');
250 obj.controller.view.cmd_retrieve_patron.setAttribute('disabled','true');
251 obj.controller.view.cmd_holds_edit_pickup_lib.setAttribute('disabled','true');
252 obj.controller.view.cmd_holds_edit_phone_notify.setAttribute('disabled','true');
253 obj.controller.view.cmd_holds_edit_email_notify.setAttribute('disabled','true');
254 obj.controller.view.cmd_holds_edit_selection_depth.setAttribute('disabled','true');
255 obj.controller.view.cmd_holds_edit_thaw_date.setAttribute('disabled','true');
256 obj.controller.view.cmd_holds_edit_freeze.setAttribute('disabled','true');
257 obj.controller.view.cmd_show_notifications.setAttribute('disabled','true');
258 obj.controller.view.cmd_holds_retarget.setAttribute('disabled','true');
259 obj.controller.view.cmd_holds_cancel.setAttribute('disabled','true');
260 obj.controller.view.cmd_show_catalog.setAttribute('disabled','true');
267 JSAN.use('util.controller'); obj.controller = new util.controller();
271 'save_columns' : [ [ 'command' ], function() { obj.list.save_columns(); } ],
274 function() { obj.list.clipboard(); }
278 function() { alert('Not Yet Implemented'); }
283 JSAN.use('circ.util');
284 circ.util.show_last_few_circs(obj.retrieve_ids);
287 'sel_mark_items_damaged' : [
290 JSAN.use('cat.util'); JSAN.use('util.functional');
291 cat.util.mark_item_damaged( util.functional.map_list( obj.retrieve_ids, function(o) { return o.copy_id; } ) );
294 'sel_mark_items_missing' : [
297 JSAN.use('cat.util'); JSAN.use('util.functional');
298 cat.util.mark_item_missing( util.functional.map_list( obj.retrieve_ids, function(o) { return o.copy_id; } ) );
301 'sel_copy_details' : [
304 JSAN.use('circ.util');
305 for (var i = 0; i < obj.retrieve_ids.length; i++) {
306 if (obj.retrieve_ids[i].copy_id) circ.util.show_copy_details( obj.retrieve_ids[i].copy_id );
310 'cmd_holds_print' : [
314 dump(js2JSON(obj.list.dump_with_keys()) + '\n');
315 function flesh_callback() {
317 JSAN.use('patron.util');
319 'patron' : patron.util.retrieve_au_via_id(ses(),obj.patron_id),
320 'lib' : obj.data.hash.aou[ obj.data.list.au[0].ws_ou() ],
321 'staff' : obj.data.list.au[0],
322 'header' : obj.data.print_list_templates.holds.header,
323 'line_item' : obj.data.print_list_templates.holds.line_item,
324 'footer' : obj.data.print_list_templates.holds.footer,
325 'type' : obj.data.print_list_templates.holds.type,
326 'list' : obj.list.dump_with_keys(),
328 JSAN.use('util.print'); var print = new util.print();
329 print.tree_list( params );
330 setTimeout(function(){obj.list.on_all_fleshed = null;},0);
332 obj.error.standard_unexpected_error_alert('print 2',E);
335 obj.list.on_all_fleshed = flesh_callback;
336 obj.list.full_retrieve();
338 obj.error.standard_unexpected_error_alert('print 1',E);
342 'cmd_holds_export' : [
346 function flesh_callback() {
348 dump(obj.list.dump_csv() + '\n');
349 copy_to_clipboard(obj.list.dump_csv());
350 setTimeout(function(){obj.list.on_all_fleshed = null;},0);
352 obj.error.standard_unexpected_error_alert('export 2',E);
355 obj.list.on_all_fleshed = flesh_callback;
356 obj.list.full_retrieve();
358 obj.error.standard_unexpected_error_alert('export 1',E);
363 'cmd_show_notifications' : [
367 JSAN.use('util.window'); var win = new util.window();
368 for (var i = 0; i < obj.retrieve_ids.length; i++) {
369 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
371 xulG.url_prefix(urls.XUL_HOLD_NOTICES), // + '?ahr_id=' + obj.retrieve_ids[i].id,
372 'hold_notices_' + obj.retrieve_ids[i].id,
374 { 'ahr_id' : obj.retrieve_ids[i].id }
378 obj.error.standard_unexpected_error_alert('Error rendering/retrieving hold notifications.',E);
382 'cmd_holds_edit_selection_depth' : [
386 JSAN.use('util.widgets'); JSAN.use('util.functional');
387 var ws_type = obj.data.hash.aout[ obj.data.hash.aou[ obj.data.list.au[0].ws_ou() ].ou_type() ];
388 var list = util.functional.map_list(
389 util.functional.filter_list(
392 if (o.depth() > ws_type.depth()) return false;
393 if (o.depth() < ws_type.depth()) return true;
394 return (o.id() == ws_type.id());
406 ml = util.widgets.make_menulist( list, obj.data.list.au[0].ws_ou() );
407 ml.setAttribute('id','selection');
408 ml.setAttribute('name','fancy_data');
409 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
410 xml += '<description>Please choose a Hold Range:</description>';
411 xml += util.widgets.serialize_node(ml);
413 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
414 bot_xml += '<spacer flex="1"/><button label="Done" accesskey="D" name="fancy_submit"/>';
415 bot_xml += '<button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
416 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
417 //obj.data.temp_mid = xml; obj.data.stash('temp_mid');
418 //obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
419 JSAN.use('util.window'); var win = new util.window();
420 var fancy_prompt_data = win.open(
421 urls.XUL_FANCY_PROMPT,
422 //+ '?xml_in_stash=temp_mid'
423 //+ '&bottom_xml_in_stash=temp_bot'
424 //+ '&title=' + window.escape('Choose a Pick Up Library'),
425 'fancy_prompt', 'chrome,resizable,modal',
426 { 'xml' : xml, 'bottom_xml' : bot_xml, 'title' : 'Choose a Pick Up Library' }
428 if (fancy_prompt_data.fancy_status == 'incomplete') { return; }
429 var selection = fancy_prompt_data.selection;
430 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() + '"?';
431 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
433 for (var i = 0; i < obj.retrieve_ids.length; i++) {
434 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
435 hold.selection_depth( obj.data.hash.aout[selection].depth() ); hold.ischanged('1');
436 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
437 if (typeof robj.ilsevent != 'undefined') throw(robj);
442 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
447 'cmd_holds_edit_pickup_lib' : [
451 JSAN.use('util.widgets'); JSAN.use('util.functional');
452 var list = util.functional.map_list(
455 var sname = o.shortname(); for (i = sname.length; i < 20; i++) sname += ' ';
457 o.name() ? sname + ' ' + o.name() : o.shortname(),
459 ( obj.data.hash.aout[ o.ou_type() ].can_have_users() == 0),
460 ( obj.data.hash.aout[ o.ou_type() ].depth() * 2),
464 ml = util.widgets.make_menulist( list, obj.data.list.au[0].ws_ou() );
465 ml.setAttribute('id','lib');
466 ml.setAttribute('name','fancy_data');
467 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
468 xml += '<description>Please choose a new Pickup Library:</description>';
469 xml += util.widgets.serialize_node(ml);
471 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
472 bot_xml += '<spacer flex="1"/><button label="Done" accesskey="D" name="fancy_submit"/>';
473 bot_xml += '<button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
474 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
475 //obj.data.temp_mid = xml; obj.data.stash('temp_mid');
476 //obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
477 JSAN.use('util.window'); var win = new util.window();
478 var fancy_prompt_data = win.open(
479 urls.XUL_FANCY_PROMPT,
480 //+ '?xml_in_stash=temp_mid'
481 //+ '&bottom_xml_in_stash=temp_bot'
482 //+ '&title=' + window.escape('Choose a Pick Up Library'),
483 'fancy_prompt', 'chrome,resizable,modal',
484 { 'xml' : xml, 'bottom_xml' : bot_xml, 'title' : 'Choose a Pick Up Library' }
486 if (fancy_prompt_data.fancy_status == 'incomplete') { return; }
487 var pickup_lib = fancy_prompt_data.lib;
488 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() + '?';
489 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
491 for (var i = 0; i < obj.retrieve_ids.length; i++) {
492 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
493 hold.pickup_lib( pickup_lib ); hold.ischanged('1');
494 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
495 if (typeof robj.ilsevent != 'undefined') throw(robj);
500 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
504 'cmd_holds_edit_phone_notify' : [
508 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
509 xml += '<description>Please enter a new phone number for hold notification (leave the field empty to disable phone notification):</description>';
510 xml += '<textbox id="phone" name="fancy_data"/>';
512 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
513 bot_xml += '<spacer flex="1"/><button label="Done" accesskey="D" name="fancy_submit"/>';
514 bot_xml += '<button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
515 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
516 //obj.data.temp_mid = xml; obj.data.stash('temp_mid');
517 //obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
518 JSAN.use('util.window'); var win = new util.window();
519 var fancy_prompt_data = win.open(
520 urls.XUL_FANCY_PROMPT,
521 //+ '?xml_in_stash=temp_mid'
522 //+ '&bottom_xml_in_stash=temp_bot'
523 //+ '&title=' + window.escape('Choose a Hold Notification Phone Number')
525 'fancy_prompt', 'chrome,resizable,modal',
526 { 'xml' : xml, 'bottom_xml' : bot_xml, 'title' : 'Choose a Hold Notification Phone Number', 'focus' : 'phone' }
528 if (fancy_prompt_data.fancy_status == 'incomplete') { return; }
529 var phone = fancy_prompt_data.phone;
530 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 + '"?';
531 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
533 for (var i = 0; i < obj.retrieve_ids.length; i++) {
534 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
535 hold.phone_notify( phone ); hold.ischanged('1');
536 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
537 if (typeof robj.ilsevent != 'undefined') throw(robj);
542 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
546 'cmd_holds_edit_email_notify' : [
550 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
551 xml += '<description>Send email notifications (when appropriate)? The email address used is found in the hold recipient account.</description>';
552 xml += '<hbox><button value="email" label="Email" accesskey="E" name="fancy_submit"/>';
553 xml += '<button value="noemail" label="No Email" accesskey="N" name="fancy_submit"/></hbox>';
555 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
556 bot_xml += '<spacer flex="1"/><button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
557 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
558 //obj.data.temp_mid = xml; obj.data.stash('temp_mid');
559 //obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
560 JSAN.use('util.window'); var win = new util.window();
561 var fancy_prompt_data = win.open(
562 urls.XUL_FANCY_PROMPT,
563 //+ '?xml_in_stash=temp_mid'
564 //+ '&bottom_xml_in_stash=temp_bot'
565 //+ '&title=' + window.escape('Set Email Notification for Holds'),
566 'fancy_prompt', 'chrome,resizable,modal',
567 { 'xml' : xml, 'bottom_xml' : bot_xml, 'title' : 'Set Email Notification for Holds' }
569 if (fancy_prompt_data.fancy_status == 'incomplete') { return; }
570 var email = fancy_prompt_data.fancy_submit == 'email' ? get_db_true() : get_db_false();
571 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(', ') + '?';
572 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
574 for (var i = 0; i < obj.retrieve_ids.length; i++) {
575 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
576 hold.email_notify( email ); hold.ischanged('1');
577 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
578 if (typeof robj.ilsevent != 'undefined') throw(robj);
583 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
587 'cmd_holds_edit_freeze' : [
591 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
592 xml += '<description>Freeze or un-freeze these holds?</description>';
593 xml += '<hbox><button value="freeze" label="Freeze" accesskey="F" name="fancy_submit"/>';
594 xml += '<button value="unfreeze" label="Un-Freeze" accesskey="U" name="fancy_submit"/></hbox>';
596 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
597 bot_xml += '<spacer flex="1"/><button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
598 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
599 //obj.data.temp_mid = xml; obj.data.stash('temp_mid');
600 //obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
601 JSAN.use('util.window'); var win = new util.window();
602 var fancy_prompt_data = win.open(
603 urls.XUL_FANCY_PROMPT,
604 //+ '?xml_in_stash=temp_mid'
605 //+ '&bottom_xml_in_stash=temp_bot'
606 //+ '&title=' + window.escape('Set Email Notification for Holds'),
607 'fancy_prompt', 'chrome,resizable,modal',
608 { 'xml' : xml, 'bottom_xml' : bot_xml, 'title' : 'Set Email Notification for Holds' }
610 if (fancy_prompt_data.fancy_status == 'incomplete') { return; }
611 var freeze = fancy_prompt_data.fancy_submit == 'freeze' ? get_db_true() : get_db_false();
612 var msg = 'Are you sure you would like to ' + ( get_bool( freeze ) ? 'freeze' : 'un-freeze' ) + ' hold' + ( obj.retrieve_ids.length > 1 ? 's ' : ' ') + util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ') + '?';
613 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
615 for (var i = 0; i < obj.retrieve_ids.length; i++) {
616 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
617 hold.frozen( freeze );
618 if ( ! get_bool( freeze ) ) {
619 hold.thaw_date( null );
622 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
623 if (typeof robj.ilsevent != 'undefined') throw(robj);
628 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
633 'cmd_holds_edit_thaw_date' : [
637 JSAN.use('util.date');
638 function check_date(value) {
640 if (! util.date.check('YYYY-MM-DD',value) ) { throw('Invalid Date'); }
641 if (util.date.check_past('YYYY-MM-DD',value) ) {
642 throw('Thaw date for frozen holds needs to be after today.');
651 var msg = 'Please enter a thaw date for hold' + ( obj.retrieve_ids.length > 1 ? 's ' : ' ') + util.functional.map_list( obj.retrieve_ids, function(o){return o.id;}).join(', ') + '\nOr set to blank to unset the thaw date for these holds. Frozen holds without a thaw date will remain frozen until manually unfrozen, otherwise they unfreeze on the thaw date.';
652 var value = 'YYYY-MM-DD';
653 var title = 'Modifying Holds';
654 var thaw_date; var invalid = true;
656 thaw_date = window.prompt(msg,value,title);
658 invalid = ! check_date(thaw_date);
663 if (thaw_date || thaw_date == '') {
664 for (var i = 0; i < obj.retrieve_ids.length; i++) {
665 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
666 hold.thaw_date( thaw_date == '' ? null : util.date.formatted_date(thaw_date + ' 00:00:00','%{iso8601}') ); hold.ischanged('1');
667 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
668 if (typeof robj.ilsevent != 'undefined') throw(robj);
673 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
678 'cmd_holds_retarget' : [
682 JSAN.use('util.functional');
683 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(', ') + '?';
684 var r = obj.error.yns_alert(msg,'Resetting Holds','Yes','No',null,'Check here to confirm this message');
686 for (var i = 0; i < obj.retrieve_ids.length; i++) {
687 var robj = obj.network.simple_request('FM_AHR_RESET',[ ses(), obj.retrieve_ids[i].id]);
688 if (typeof robj.ilsevent != 'undefined') throw(robj);
693 obj.error.standard_unexpected_error_alert('Holds not likely reset.',E);
699 'cmd_holds_cancel' : [
703 JSAN.use('util.functional');
704 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(', ') + '?';
705 var r = obj.error.yns_alert(msg,'Cancelling Holds','Yes','No',null,'Check here to confirm this message');
708 for (var i = 0; i < obj.retrieve_ids.length; i++) {
709 if (obj.holds_map[ obj.retrieve_ids[i].id ].transit()) {
710 transits.push( obj.retrieve_ids[i].barcode );
712 var robj = obj.network.simple_request('FM_AHR_CANCEL',[ ses(), obj.retrieve_ids[i].id]);
713 if (typeof robj.ilsevent != 'undefined') throw(robj);
715 if (transits.length > 0) {
716 var msg2 = 'For barcodes ' + transits.join(', ') + ' cancel the transits as well?';
717 var r2 = obj.error.yns_alert(msg2,'Cancelling Transits','Yes','No',null,'Check here to confirm this message');
720 for (var i = 0; i < transits.length; i++) {
721 var robj = obj.network.simple_request('FM_ATC_VOID',[ ses(), { 'barcode' : transits[i] } ]);
722 if (typeof robj.ilsevent != 'undefined') {
723 switch(robj.ilsevent) {
724 case 1225 /* TRANSIT_ABORT_NOT_ALLOWED */ :
727 case 5000 /* PERM_FAILURE */ :
736 obj.error.standard_unexpected_error_alert('Hold-transits not likely cancelled.',E);
743 obj.error.standard_unexpected_error_alert('Holds not likely cancelled.',E);
747 'cmd_retrieve_patron' : [
752 for (var i = 0; i < obj.retrieve_ids.length; i++) {
753 var patron_id = obj.retrieve_ids[i].usr;
754 if (seen[patron_id]) continue; seen[patron_id] = true;
756 xulG.url_prefix(urls.XUL_PATRON_DISPLAY), // + '?id=' + patron_id,
762 obj.error.standard_unexpected_error_alert('',E);
766 'cmd_show_catalog' : [
770 for (var i = 0; i < obj.retrieve_ids.length; i++) {
771 var htarget = obj.retrieve_ids[i].target;
772 var htype = obj.retrieve_ids[i].type;
776 opac_url = xulG.url_prefix( urls.opac_rresult ) + '?m=' + htarget;
779 opac_url = xulG.url_prefix( urls.opac_rdetail ) + '?r=' + htarget;
782 var my_acn = obj.network.simple_request( 'FM_ACN_RETRIEVE', [ htarget ]);
783 opac_url = xulG.url_prefix( urls.opac_rdetail) + '?r=' + my_acn.record();
786 var my_acp = obj.network.simple_request( 'FM_ACP_RETRIEVE', [ htarget ]);
788 if (typeof my_acp.call_number() == 'object') {
789 my_acn = my.acp.call_number();
791 my_acn = obj.network.simple_request( 'FM_ACN_RETRIEVE',
792 [ my_acp.call_number() ]);
794 opac_url = xulG.url_prefix( urls.opac_rdetail) + '?r=' + my_acn.record();
797 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]);
801 var content_params = {
803 'authtime' : ses('authtime'),
804 'opac_url' : opac_url,
807 xulG.url_prefix(urls.XUL_OPAC_WRAPPER),
808 {'tab_name': htype == 'M' ? 'Catalog' : 'Retrieving title...'},
813 obj.error.standard_unexpected_error_alert('',E);
820 obj.controller.render();
824 obj.controller.view.cmd_retrieve_patron.setAttribute('disabled','true');
825 obj.controller.view.cmd_holds_edit_pickup_lib.setAttribute('disabled','true');
826 obj.controller.view.cmd_holds_edit_phone_notify.setAttribute('disabled','true');
827 obj.controller.view.cmd_holds_edit_email_notify.setAttribute('disabled','true');
828 obj.controller.view.cmd_holds_edit_selection_depth.setAttribute('disabled','true');
829 obj.controller.view.cmd_show_notifications.setAttribute('disabled','true');
830 obj.controller.view.cmd_holds_retarget.setAttribute('disabled','true');
831 obj.controller.view.cmd_holds_cancel.setAttribute('disabled','true');
832 obj.controller.view.cmd_show_catalog.setAttribute('disabled','true');
835 'retrieve' : function(dont_show_me_the_list_change) {
837 if (window.xulG && window.xulG.holds) {
838 obj.holds = window.xulG.holds;
840 var method; var params = [ ses() ];
841 if (obj.patron_id) { /*************************************************** PATRON ******************************/
842 method = 'FM_AHR_ID_LIST_RETRIEVE_VIA_AU';
843 params.push( obj.patron_id );
844 obj.controller.view.cmd_retrieve_patron.setAttribute('hidden','true');
845 } else if (obj.docid) { /*************************************************** RECORD ******************************/
846 method = 'FM_AHR_RETRIEVE_ALL_VIA_BRE';
847 params.push( obj.docid );
848 obj.controller.view.cmd_retrieve_patron.setAttribute('hidden','false');
849 } else if (obj.pull) { /*************************************************** PULL ******************************/
850 method = 'FM_AHR_ID_LIST_PULL_LIST';
851 params.push( 50 ); params.push( 0 );
852 } else if (obj.shelf) {
853 method = 'FM_AHR_ID_LIST_ONSHELF_RETRIEVE'; /*************************************************** HOLD SHELF ******************************/
854 params.push( obj.foreign_shelf || obj.data.list.au[0].ws_ou() );
855 obj.controller.view.cmd_retrieve_patron.setAttribute('hidden','false');
856 obj.render_lib_menu();
858 //method = 'FM_AHR_RETRIEVE_VIA_PICKUP_AOU';
859 method = 'FM_AHR_ID_LIST_PULL_LIST'; /*************************************************** PULL ******************************/
860 params.push( 50 ); params.push( 0 );
861 obj.controller.view.cmd_retrieve_patron.setAttribute('hidden','false');
863 var robj = obj.network.simple_request( method, params );
864 if (typeof robj.ilsevent != 'undefined') throw(robj);
865 if (method == 'FM_AHR_RETRIEVE_ALL_VIA_BRE') {
867 obj.holds = obj.holds.concat( robj.copy_holds );
868 obj.holds = obj.holds.concat( robj.volume_holds );
869 obj.holds = obj.holds.concat( robj.title_holds );
870 obj.holds = obj.holds.sort();
874 //alert('method = ' + method + ' params = ' + js2JSON(params));
877 function list_append(hold_id) {
889 function gen_list_append(hold) {
891 if (typeof obj.controller.view.lib_menu == 'undefined') {
892 list_append(typeof hold == 'object' ? hold.id() : hold);
895 var pickup_lib = hold.pickup_lib();
896 if (typeof pickup_lib == 'object') pickup_lib = pickup_lib.id();
897 if (pickup_lib == obj.controller.view.lib_menu.value) {
899 list_append(typeof hold == 'object' ? hold.id() : hold);
909 //alert('obj.holds = ' + js2JSON(obj.holds));
910 JSAN.use('util.exec'); var exec = new util.exec(2);
912 for (var i in obj.holds) {
913 rows.push( gen_list_append(obj.holds[i]) );
917 if (!dont_show_me_the_list_change) {
918 if (window.xulG && typeof window.xulG.on_list_change == 'function') {
919 try { window.xulG.on_list_change(obj.holds); } catch(E) { this.error.sdump('D_ERROR',E); }
924 'render_lib_menu' : function() {
927 JSAN.use('util.widgets'); JSAN.use('util.functional'); JSAN.use('util.fm_utils');
928 var x = document.getElementById('menu_placeholder');
929 if (x.firstChild) return;
930 util.widgets.remove_children( x );
932 var ml = util.widgets.make_menulist(
933 util.functional.map_list(
934 obj.data.list.my_aou.concat(
935 util.functional.filter_list(
936 util.fm_utils.find_ou(
938 obj.data.hash.aou[ obj.data.list.au[0].ws_ou() ].parent_ou()
941 return o.id() != obj.data.list.au[0].ws_ou();
945 function(o) { return [
948 ( ! get_bool( obj.data.hash.aout[ o.ou_type() ].can_have_users() ) ),
949 ( obj.data.hash.aout[ o.ou_type() ].depth() ),
953 var A = obj.data.hash.aou[ a[1] ];
954 var B = obj.data.hash.aou[ b[1] ];
955 var X = obj.data.hash.aout[ A.ou_type() ];
956 var Y = obj.data.hash.aout[ B.ou_type() ];
957 if (X.depth() < Y.depth()) return -1;
958 if (X.depth() > Y.depth()) return 1;
959 if (A.shortname() < B.shortname()) return -1;
960 if (A.shortname() > B.shortname()) return 1;
964 obj.data.list.au[0].ws_ou()
971 obj.list.on_all_fleshed = function() {
973 obj.foreign_shelf = ev.target.value;
975 setTimeout( function() { obj.list.on_all_fleshed = null; }, 0);
977 obj.list.full_retrieve();
980 obj.foreign_shelf = ev.target.value;
985 obj.controller.view.lib_menu = ml;
987 this.error.standard_unexpected_error_alert('rendering lib menu',E);
992 dump('exiting patron.holds.js\n');