]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/patron/holds.js
column persistence in other interfaces
[working/Evergreen.git] / Open-ILS / xul / staff_client / server / patron / holds.js
1 dump('entering patron.holds.js\n');
2
3 if (typeof patron == 'undefined') patron = {};
4 patron.holds = function (params) {
5
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'});
9 }
10
11 patron.holds.prototype = {
12
13         'retrieve_ids' : [],
14
15         'holds_map' : {},
16
17         'init' : function( params ) {
18
19                 var obj = this;
20
21                 obj.patron_id = params['patron_id'];
22                 obj.docid = params['docid'];
23                 obj.shelf = params['shelf'];
24
25                 JSAN.use('circ.util');
26                 var columns = circ.util.hold_columns( 
27                         { 
28                                 'title' : { 'hidden' : false, 'flex' : '3' },
29                                 'request_time' : { 'hidden' : false },
30                                 'pickup_lib_shortname' : { 'hidden' : false },
31                                 'hold_type' : { 'hidden' : true },
32                                 'current_copy' : { 'hidden' : true },
33                                 'capture_time' : { 'hidden' : true },
34                         } 
35                 );
36
37                 JSAN.use('util.list'); obj.list = new util.list('holds_list');
38                 obj.list.init(
39                         {
40                                 'columns' : columns,
41                                 'map_row_to_column' : circ.util.std_map_row_to_column(),
42                                 'retrieve_row' : function(params) {
43                                         var row = params.row;
44                                         try {
45                                                 var status_robj = obj.network.simple_request('FM_AHR_STATUS',[ ses(), row.my.ahr.id() ]);
46                                                 row.my.status = status_robj;
47                                                 if (row.my.ahr.current_copy()) {
48                                                         row.my.acp = obj.network.simple_request( 'FM_ACP_RETRIEVE', [ row.my.ahr.current_copy() ]);
49                                                 }
50                                                 switch(row.my.ahr.hold_type()) {
51                                                         case 'M' :
52                                                                 row.my.mvr = obj.network.request(
53                                                                         api.MODS_SLIM_METARECORD_RETRIEVE.app,
54                                                                         api.MODS_SLIM_METARECORD_RETRIEVE.method,
55                                                                         [ row.my.ahr.target() ]
56                                                                 );
57                                                         break;
58                                                         case 'T' :
59                                                                 row.my.mvr = obj.network.request(
60                                                                         api.MODS_SLIM_RECORD_RETRIEVE.app,
61                                                                         api.MODS_SLIM_RECORD_RETRIEVE.method,
62                                                                         [ row.my.ahr.target() ]
63                                                                 );
64                                                         break;
65                                                         case 'V' :
66                                                                 row.my.acn = obj.network.simple_request( 'FM_ACN_RETRIEVE', [ row.my.ahr.target() ]);
67                                                                 row.my.mvr = obj.network.request(
68                                                                         api.MODS_SLIM_RECORD_RETRIEVE.app,
69                                                                         api.MODS_SLIM_RECORD_RETRIEVE.method,
70                                                                         [ row.my.acn.record() ]
71                                                                 );
72                                                         break;
73                                                         case 'C' :
74                                                                 if (typeof row.my.acp == 'undefined') {
75                                                                         row.my.acp = obj.network.simple_request( 'FM_ACP_RETRIEVE', [ row.my.ahr.target() ]);
76                                                                 }
77                                                                 if (typeof row.my.acp.call_number() == 'object') {
78                                                                         row.my.acn = my.acp.call_number();
79                                                                 } else {
80                                                                         row.my.acn = obj.network.simple_request( 'FM_ACN_RETRIEVE', [ row.my.acp.call_number() ]);
81                                                                 }
82                                                                 row.my.mvr = obj.network.request(
83                                                                         api.MODS_SLIM_RECORD_RETRIEVE.app,
84                                                                         api.MODS_SLIM_RECORD_RETRIEVE.method,
85                                                                         [ row.my.acn.record() ]
86                                                                 );
87                                                         break;
88                                                 }
89                                         } catch(E) {
90                                                 obj.error.sdump('D_ERROR','retrieve_row: ' + E );
91                                         }
92                                         if (typeof params.on_retrieve == 'function') {
93                                                 params.on_retrieve(row);
94                                         }
95                                         return row;
96                                 },
97                                 'on_select' : function(ev) {
98                                         JSAN.use('util.functional');
99                                         var sel = obj.list.retrieve_selection();
100                                         obj.controller.view.sel_clip.setAttribute('disabled',sel.length < 1);
101                                         obj.retrieve_ids = util.functional.map_list(
102                                                 sel,
103                                                 function(o) { return JSON2js( o.getAttribute('retrieve_id') ); }
104                                         );
105                                         if (obj.retrieve_ids.length > 0) {
106                                                 obj.controller.view.sel_copy_details.setAttribute('disabled','false');
107                                                 obj.controller.view.sel_patron.setAttribute('disabled','false');
108                                                 obj.controller.view.cmd_retrieve_patron.setAttribute('disabled','false');
109                                                 obj.controller.view.cmd_holds_edit_pickup_lib.setAttribute('disabled','false');
110                                                 obj.controller.view.cmd_holds_edit_phone_notify.setAttribute('disabled','false');
111                                                 obj.controller.view.cmd_holds_edit_email_notify.setAttribute('disabled','false');
112                                                 obj.controller.view.cmd_holds_edit_selection_depth.setAttribute('disabled','false');
113                                                 obj.controller.view.cmd_show_notifications.setAttribute('disabled','false');
114                                                 obj.controller.view.cmd_holds_retarget.setAttribute('disabled','false');
115                                                 obj.controller.view.cmd_holds_cancel.setAttribute('disabled','false');
116                                                 obj.controller.view.cmd_show_catalog.setAttribute('disabled','false');
117                                         } else {
118                                                 obj.controller.view.sel_copy_details.setAttribute('disabled','true');
119                                                 obj.controller.view.sel_patron.setAttribute('disabled','true');
120                                                 obj.controller.view.cmd_retrieve_patron.setAttribute('disabled','true');
121                                                 obj.controller.view.cmd_holds_edit_pickup_lib.setAttribute('disabled','true');
122                                                 obj.controller.view.cmd_holds_edit_phone_notify.setAttribute('disabled','true');
123                                                 obj.controller.view.cmd_holds_edit_email_notify.setAttribute('disabled','true');
124                                                 obj.controller.view.cmd_holds_edit_selection_depth.setAttribute('disabled','true');
125                                                 obj.controller.view.cmd_show_notifications.setAttribute('disabled','true');
126                                                 obj.controller.view.cmd_holds_retarget.setAttribute('disabled','true');
127                                                 obj.controller.view.cmd_holds_cancel.setAttribute('disabled','true');
128                                                 obj.controller.view.cmd_show_catalog.setAttribute('disabled','true');
129                                         }
130                                 },
131
132                         }
133                 );
134                 
135                 JSAN.use('util.controller'); obj.controller = new util.controller();
136                 obj.controller.init(
137                         {
138                                 'control_map' : {
139                                         'save_columns' : [ [ 'command' ], function() { obj.list.save_columns(); } ],
140                                         'sel_clip' : [
141                                                 ['command'],
142                                                 function() { obj.list.clipboard(); }
143                                         ],
144                                         'cmd_broken' : [
145                                                 ['command'],
146                                                 function() { alert('Not Yet Implemented'); }
147                                         ],
148                                         'sel_patron' : [
149                                                 ['command'],
150                                                 function() {
151                                                         JSAN.use('circ.util');
152                                                         circ.util.show_last_few_circs(obj.retrieve_ids);
153                                                 }
154                                         ],
155                                         'sel_copy_details' : [
156                                                 ['command'],
157                                                 function() {
158                                                         JSAN.use('circ.util');
159                                                         for (var i = 0; i < obj.retrieve_ids.length; i++) {
160                                                                 if (obj.retrieve_ids[i].copy_id) circ.util.show_copy_details( obj.retrieve_ids[i].copy_id );
161                                                         }
162                                                 }
163                                         ],
164                                         'cmd_holds_print' : [
165                                                 ['command'],
166                                                 function() {
167                                                         try {
168                                                                 dump(js2JSON(obj.list.dump()) + '\n');
169                                                                 function flesh_callback() {
170                                                                         try {
171                                                                                 JSAN.use('patron.util');
172                                                                                 var params = { 
173                                                                                         'patron' : patron.util.retrieve_au_via_id(ses(),obj.patron_id), 
174                                                                                         'lib' : obj.data.hash.aou[ obj.data.list.au[0].ws_ou() ],
175                                                                                         'staff' : obj.data.list.au[0],
176                                                                                         'header' : obj.data.print_list_templates.holds.header,
177                                                                                         'line_item' : obj.data.print_list_templates.holds.line_item,
178                                                                                         'footer' : obj.data.print_list_templates.holds.footer,
179                                                                                         'type' : obj.data.print_list_templates.holds.type,
180                                                                                         'list' : obj.list.dump(),
181                                                                                 };
182                                                                                 JSAN.use('util.print'); var print = new util.print();
183                                                                                 print.tree_list( params );
184                                                                                 setTimeout(function(){obj.list.on_all_fleshed = null;},0);
185                                                                         } catch(E) {
186                                                                                 obj.error.standard_unexpected_error_alert('print 2',E);
187                                                                         }
188                                                                 }
189                                                                 obj.list.on_all_fleshed = flesh_callback;
190                                                                 obj.list.full_retrieve();
191                                                         } catch(E) {
192                                                                 obj.error.standard_unexpected_error_alert('print 1',E);
193                                                         }
194                                                 }
195                                         ],
196                                         'cmd_show_notifications' : [
197                                                 ['command'],
198                                                 function() {
199                                                         try {
200                                                                 JSAN.use('util.window'); var win = new util.window();
201                                                                 for (var i = 0; i < obj.retrieve_ids.length; i++) {
202                                                                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
203                                                                         win.open(
204                                                                                 xulG.url_prefix(urls.XUL_HOLD_NOTICES) 
205                                                                                 + '?ahr_id=' + obj.retrieve_ids[i].id,
206                                                                                 'hold_notices_' + obj.retrieve_ids[i].id,
207                                                                                 'chrome,resizable'
208                                                                         );
209                                                                 }
210                                                         } catch(E) {
211                                                                 obj.error.standard_unexpected_error_alert('Error rendering/retrieving hold notifications.',E);
212                                                         }
213                                                 }
214                                         ],
215                                         'cmd_holds_edit_selection_depth' : [
216                                                 ['command'],
217                                                 function() {
218                                                         try {
219                                                                 JSAN.use('util.widgets'); JSAN.use('util.functional'); 
220                                                                 var ws_type = obj.data.hash.aout[ obj.data.hash.aou[ obj.data.list.au[0].ws_ou() ].ou_type() ];
221                                                                 var list = util.functional.map_list(
222                                                                         util.functional.filter_list(    
223                                                                                 obj.data.list.aout,
224                                                                                 function(o) {
225                                                                                         if (o.depth() > ws_type.depth()) return false;
226                                                                                         if (o.depth() < ws_type.depth()) return true;
227                                                                                         return (o.id() == ws_type.id());
228                                                                                 }
229                                                                         ),
230                                                                         function(o) { 
231                                                                                 return [
232                                                                                         o.opac_label(),
233                                                                                         o.id(),
234                                                                                         false,
235                                                                                         ( o.depth() * 2),
236                                                                                 ]; 
237                                                                         }
238                                                                 );
239                                                                 ml = util.widgets.make_menulist( list, obj.data.list.au[0].ws_ou() );
240                                                                 ml.setAttribute('id','selection');
241                                                                 ml.setAttribute('name','fancy_data');
242                                                                 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
243                                                                 xml += '<description>Please choose a Hold Range:</description>';
244                                                                 xml += util.widgets.serialize_node(ml);
245                                                                 xml += '</vbox>';
246                                                                 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
247                                                                 bot_xml += '<spacer flex="1"/><button label="Done" accesskey="D" name="fancy_submit"/>';
248                                                                 bot_xml += '<button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
249                                                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
250                                                                 obj.data.temp_mid = xml; obj.data.stash('temp_mid');
251                                                                 obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
252                                                                 window.open(
253                                                                         urls.XUL_FANCY_PROMPT
254                                                                         + '?xml_in_stash=temp_mid'
255                                                                         + '&bottom_xml_in_stash=temp_bot'
256                                                                         + '&title=' + window.escape('Choose a Pick Up Library'),
257                                                                         'fancy_prompt', 'chrome,resizable,modal'
258                                                                 );
259                                                                 obj.data.init({'via':'stash'});
260                                                                 if (obj.data.fancy_prompt_data == '') { return; }
261                                                                 var selection = obj.data.fancy_prompt_data.selection;
262                                                                 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() + '"?';
263                                                                 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
264                                                                 if (r == 0) {
265                                                                         for (var i = 0; i < obj.retrieve_ids.length; i++) {
266                                                                                 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
267                                                                                 hold.selection_depth( obj.data.hash.aout[selection].depth() ); hold.ischanged('1');
268                                                                                 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
269                                                                                 if (typeof robj.ilsevent != 'undefined') throw(robj);
270                                                                         }
271                                                                         obj.retrieve();
272                                                                 }
273                                                         } catch(E) {
274                                                                 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
275                                                         }
276                                                 }
277                                         ],
278
279                                         'cmd_holds_edit_pickup_lib' : [
280                                                 ['command'],
281                                                 function() {
282                                                         try {
283                                                                 JSAN.use('util.widgets'); JSAN.use('util.functional'); 
284                                                                 var list = util.functional.map_list(
285                                                                         obj.data.list.aou,
286                                                                         function(o) { 
287                                                                                 var sname = o.shortname(); for (i = sname.length; i < 20; i++) sname += ' ';
288                                                                                 return [
289                                                                                         o.name() ? sname + ' ' + o.name() : o.shortname(),
290                                                                                         o.id(),
291                                                                                         ( obj.data.hash.aout[ o.ou_type() ].can_have_users() == 0),
292                                                                                         ( obj.data.hash.aout[ o.ou_type() ].depth() * 2),
293                                                                                 ]; 
294                                                                         }
295                                                                 );
296                                                                 ml = util.widgets.make_menulist( list, obj.data.list.au[0].ws_ou() );
297                                                                 ml.setAttribute('id','lib');
298                                                                 ml.setAttribute('name','fancy_data');
299                                                                 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
300                                                                 xml += '<description>Please choose a new Pickup Library:</description>';
301                                                                 xml += util.widgets.serialize_node(ml);
302                                                                 xml += '</vbox>';
303                                                                 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
304                                                                 bot_xml += '<spacer flex="1"/><button label="Done" accesskey="D" name="fancy_submit"/>';
305                                                                 bot_xml += '<button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
306                                                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
307                                                                 obj.data.temp_mid = xml; obj.data.stash('temp_mid');
308                                                                 obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
309                                                                 window.open(
310                                                                         urls.XUL_FANCY_PROMPT
311                                                                         + '?xml_in_stash=temp_mid'
312                                                                         + '&bottom_xml_in_stash=temp_bot'
313                                                                         + '&title=' + window.escape('Choose a Pick Up Library'),
314                                                                         'fancy_prompt', 'chrome,resizable,modal'
315                                                                 );
316                                                                 obj.data.init({'via':'stash'});
317                                                                 if (obj.data.fancy_prompt_data == '') { return; }
318                                                                 var pickup_lib = obj.data.fancy_prompt_data.lib;
319                                                                 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() + '?';
320                                                                 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
321                                                                 if (r == 0) {
322                                                                         for (var i = 0; i < obj.retrieve_ids.length; i++) {
323                                                                                 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
324                                                                                 hold.pickup_lib(  pickup_lib ); hold.ischanged('1');
325                                                                                 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
326                                                                                 if (typeof robj.ilsevent != 'undefined') throw(robj);
327                                                                         }
328                                                                         obj.retrieve();
329                                                                 }
330                                                         } catch(E) {
331                                                                 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
332                                                         }
333                                                 }
334                                         ],
335                                         'cmd_holds_edit_phone_notify' : [
336                                                 ['command'],
337                                                 function() {
338                                                         try {
339                                                                 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
340                                                                 xml += '<description>Please enter a new phone number for hold notification (leave the field empty to disable phone notification):</description>';
341                                                                 xml += '<textbox id="phone" name="fancy_data"/>';
342                                                                 xml += '</vbox>';
343                                                                 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
344                                                                 bot_xml += '<spacer flex="1"/><button label="Done" accesskey="D" name="fancy_submit"/>';
345                                                                 bot_xml += '<button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
346                                                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
347                                                                 obj.data.temp_mid = xml; obj.data.stash('temp_mid');
348                                                                 obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
349                                                                 window.open(
350                                                                         urls.XUL_FANCY_PROMPT
351                                                                         + '?xml_in_stash=temp_mid'
352                                                                         + '&bottom_xml_in_stash=temp_bot'
353                                                                         + '&title=' + window.escape('Choose a Hold Notification Phone Number')
354                                                                         + '&focus=phone',
355                                                                         'fancy_prompt', 'chrome,resizable,modal'
356                                                                 );
357                                                                 obj.data.init({'via':'stash'});
358                                                                 if (obj.data.fancy_prompt_data == '') { return; }
359                                                                 var phone = obj.data.fancy_prompt_data.phone;
360                                                                 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 + '"?';
361                                                                 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
362                                                                 if (r == 0) {
363                                                                         for (var i = 0; i < obj.retrieve_ids.length; i++) {
364                                                                                 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
365                                                                                 hold.phone_notify(  phone ); hold.ischanged('1');
366                                                                                 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
367                                                                                 if (typeof robj.ilsevent != 'undefined') throw(robj);
368                                                                         }
369                                                                         obj.retrieve();
370                                                                 }
371                                                         } catch(E) {
372                                                                 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
373                                                         }
374                                                 }
375                                         ],
376                                         'cmd_holds_edit_email_notify' : [
377                                                 ['command'],
378                                                 function() {
379                                                         try {
380                                                                 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
381                                                                 xml += '<description>Send email notifications (when appropriate)?  The email address used is found in the hold recepient account.</description>';
382                                                                 xml += '<hbox><button value="email" label="Email" accesskey="E" name="fancy_submit"/>';
383                                                                 xml += '<button value="noemail" label="No Email" accesskey="N" name="fancy_submit"/></hbox>';
384                                                                 xml += '</vbox>';
385                                                                 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
386                                                                 bot_xml += '<spacer flex="1"/><button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
387                                                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
388                                                                 obj.data.temp_mid = xml; obj.data.stash('temp_mid');
389                                                                 obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
390                                                                 window.open(
391                                                                         urls.XUL_FANCY_PROMPT
392                                                                         + '?xml_in_stash=temp_mid'
393                                                                         + '&bottom_xml_in_stash=temp_bot'
394                                                                         + '&title=' + window.escape('Set Email Notification for Holds'),
395                                                                         'fancy_prompt', 'chrome,resizable,modal'
396                                                                 );
397                                                                 obj.data.init({'via':'stash'});
398                                                                 if (obj.data.fancy_prompt_data == '') { return; }
399                                                                 var email = obj.data.fancy_prompt_data.fancy_submit == 'email' ? get_db_true() : get_db_false();
400                                                                 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(', ') + '?';
401                                                                 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
402                                                                 if (r == 0) {
403                                                                         for (var i = 0; i < obj.retrieve_ids.length; i++) {
404                                                                                 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
405                                                                                 hold.email_notify(  email ); hold.ischanged('1');
406                                                                                 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
407                                                                                 if (typeof robj.ilsevent != 'undefined') throw(robj);
408                                                                         }
409                                                                         obj.retrieve();
410                                                                 }
411                                                         } catch(E) {
412                                                                 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
413                                                         }
414                                                 }
415                                         ],
416
417
418                                         'cmd_holds_retarget' : [
419                                                 ['command'],
420                                                 function() {
421                                                         try {
422                                                                 JSAN.use('util.functional');
423                                                                 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(', ') + '?';
424                                                                 var r = obj.error.yns_alert(msg,'Resetting Holds','Yes','No',null,'Check here to confirm this message');
425                                                                 if (r == 0) {
426                                                                         for (var i = 0; i < obj.retrieve_ids.length; i++) {
427                                                                                 var robj = obj.network.simple_request('FM_AHR_RESET',[ ses(), obj.retrieve_ids[i].id]);
428                                                                                 if (typeof robj.ilsevent != 'undefined') throw(robj);
429                                                                         }
430                                                                         obj.retrieve();
431                                                                 }
432                                                         } catch(E) {
433                                                                 obj.error.standard_unexpected_error_alert('Holds not likely reset.',E);
434                                                         }
435
436                                                 }
437                                         ],
438
439                                         'cmd_holds_cancel' : [
440                                                 ['command'],
441                                                 function() {
442                                                         try {
443                                                                 JSAN.use('util.functional');
444                                                                 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(', ') + '?';
445                                                                 var r = obj.error.yns_alert(msg,'Cancelling Holds','Yes','No',null,'Check here to confirm this message');
446                                                                 if (r == 0) {
447                                                                         for (var i = 0; i < obj.retrieve_ids.length; i++) {
448                                                                                 var robj = obj.network.simple_request('FM_AHR_CANCEL',[ ses(), obj.retrieve_ids[i].id]);
449                                                                                 if (typeof robj.ilsevent != 'undefined') throw(robj);
450                                                                         }
451                                                                         obj.retrieve();
452                                                                 }
453                                                         } catch(E) {
454                                                                 obj.error.standard_unexpected_error_alert('Holds not likely cancelled.',E);
455                                                         }
456                                                 }
457                                         ],
458                                         'cmd_retrieve_patron' : [
459                                                 ['command'],
460                                                 function() {
461                                                         try {
462                                                                 var seen = {};
463                                                                 for (var i = 0; i < obj.retrieve_ids.length; i++) {
464                                                                         var patron_id = obj.retrieve_ids[i].usr;
465                                                                         if (seen[patron_id]) continue; seen[patron_id] = true;
466                                                                         xulG.new_tab(
467                                                                                 xulG.url_prefix(urls.XUL_PATRON_DISPLAY) + '?id=' + patron_id, 
468                                                                                 {}, 
469                                                                                 {}
470                                                                         );
471                                                                 }
472                                                         } catch(E) {
473                                                                 obj.error.standard_unexpected_error_alert('',E);
474                                                         }
475                                                 }
476                                         ],
477                                         'cmd_show_catalog' : [
478                                                 ['command'],
479                                                 function() {
480                                                         try {
481                                                                 for (var i = 0; i < obj.retrieve_ids.length; i++) {
482                                                                         var doc_id = obj.retrieve_ids[i].target;
483                                                                         var htype = obj.retrieve_ids[i].type;
484                                                                         if (!doc_id) {
485                                                                                 alert(obj.retrieve_ids[i].barcode + ' is not cataloged');
486                                                                                 continue;
487                                                                         }
488                                                                         var opac_url = ( htype == 'M' ?  (xulG.url_prefix( urls.opac_rresult ) + '?m=') : (xulG.url_prefix( urls.opac_rdetail) + '?r=')  ) + doc_id;
489                                                                         var content_params = { 
490                                                                                 'session' : ses(),
491                                                                                 'authtime' : ses('authtime'),
492                                                                                 'opac_url' : opac_url,
493                                                                         };
494                                                                         xulG.new_tab(
495                                                                                 xulG.url_prefix(urls.XUL_OPAC_WRAPPER), 
496                                                                                 {'tab_name': htype == 'M' ? 'Catalog' : 'Retrieving title...'}, 
497                                                                                 content_params
498                                                                         );
499                                                                 }
500                                                         } catch(E) {
501                                                                 obj.error.standard_unexpected_error_alert('',E);
502                                                         }
503                                                 }
504                                         ],
505                                 }
506                         }
507                 );
508                 obj.controller.render();
509
510                 obj.retrieve();
511
512                 obj.controller.view.cmd_retrieve_patron.setAttribute('disabled','true');
513                 obj.controller.view.cmd_holds_edit_pickup_lib.setAttribute('disabled','true');
514                 obj.controller.view.cmd_holds_edit_phone_notify.setAttribute('disabled','true');
515                 obj.controller.view.cmd_holds_edit_email_notify.setAttribute('disabled','true');
516                 obj.controller.view.cmd_holds_edit_selection_depth.setAttribute('disabled','true');
517                 obj.controller.view.cmd_show_notifications.setAttribute('disabled','true');
518                 obj.controller.view.cmd_holds_retarget.setAttribute('disabled','true');
519                 obj.controller.view.cmd_holds_cancel.setAttribute('disabled','true');
520                 obj.controller.view.cmd_show_catalog.setAttribute('disabled','true');
521         },
522
523         'retrieve' : function(dont_show_me_the_list_change) {
524                 var obj = this;
525                 if (window.xulG && window.xulG.holds) {
526                         obj.holds = window.xulG.holds;
527                 } else {
528                         var method; var id;
529                         if (obj.patron_id) {
530                                 method = 'FM_AHR_RETRIEVE_VIA_AU'; 
531                                 id = obj.patron_id; 
532                                 obj.controller.view.cmd_retrieve_patron.setAttribute('hidden','true');
533                         } else if (obj.docid) {
534                                 method = 'FM_AHR_RETRIEVE_VIA_BRE'; 
535                                 id = obj.docid; 
536                                 obj.controller.view.cmd_retrieve_patron.setAttribute('hidden','false');
537                         } else {
538                                 if (obj.shelf) {
539                                         method = 'FM_AHR_ONSHELF_RETRIEVE'; 
540                                 } else {
541                                         method = 'FM_AHR_RETRIEVE_VIA_PICKUP_AOU'; 
542                                 }
543                                 id = obj.data.list.au[0].ws_ou(); 
544                                 obj.controller.view.cmd_retrieve_patron.setAttribute('hidden','false');
545                         }
546                         obj.holds = obj.network.simple_request( method, [ ses(), id ]);
547                 }
548
549                 function gen_list_append(hold) {
550                         return function() {
551                                 obj.holds_map[ hold.id() ] = hold;
552                                 obj.list.append(
553                                         {
554                                                 'retrieve_id' : js2JSON({'copy_id':hold.current_copy(),'id':hold.id(),'type':hold.hold_type(),'target':hold.target(),'usr':hold.usr(),}),
555                                                 'row' : {
556                                                         'my' : {
557                                                                 'ahr' : hold,
558                                                         }
559                                                 }
560                                         }
561                                 );
562                         };
563                 }
564
565                 obj.list.clear();
566
567                 JSAN.use('util.exec'); var exec = new util.exec(2);
568                 var rows = [];
569                 for (var i in obj.holds) {
570                         rows.push( gen_list_append(obj.holds[i]) );
571                 }
572                 exec.chain( rows );
573         
574                 if (!dont_show_me_the_list_change) {
575                         if (window.xulG && typeof window.xulG.on_list_change == 'function') {
576                                 try { window.xulG.on_list_change(obj.holds); } catch(E) { this.error.sdump('D_ERROR',E); }
577                         }
578                 }
579         },
580 }
581
582 dump('exiting patron.holds.js\n');