]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/patron/holds.js
Basic library type and library drop-down for hold lists.. will flesh this out later...
[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     'hold_interface_type' : null,
14
15         'foreign_shelf' : null,
16
17         'retrieve_ids' : [],
18
19         'holds_map' : {},
20
21         'init' : function( params ) {
22
23                 var obj = this;
24
25                 obj.patron_id = params['patron_id'];
26                 obj.docid = params['docid'];
27                 obj.shelf = params['shelf'];
28                 obj.tree_id = params['tree_id'];
29
30                 JSAN.use('circ.util');
31                 var columns = circ.util.hold_columns( 
32                         { 
33                                 'title' : { 'hidden' : false, 'flex' : '3' },
34                                 'request_time' : { 'hidden' : false },
35                                 'pickup_lib_shortname' : { 'hidden' : false },
36                                 'hold_type' : { 'hidden' : false },
37                                 'current_copy' : { 'hidden' : false },
38                                 'capture_time' : { 'hidden' : false },
39                                 'notify_time' : { 'hidden' : false },
40                                 'notify_count' : { 'hidden' : false },
41                         } 
42                 );
43
44                 JSAN.use('util.list'); obj.list = new util.list( obj.tree_id || 'holds_list');
45                 obj.list.init(
46                         {
47                                 'columns' : columns,
48                                 'map_row_to_columns' : circ.util.std_map_row_to_columns(),
49                                 'retrieve_row' : function(params) {
50                                         var row = params.row;
51                                         try {
52                                                 obj.network.simple_request('FM_AHR_BLOB_RETRIEVE', [ ses(), row.my.hold_id ],
53                                                         function(blob_req) {
54                                                                 try {
55                                                                         var blob = blob_req.getResultObject();
56                                                                         if (typeof blob.ilsevent != 'undefined') throw(blob);
57                                                                         row.my.ahr = blob.hold;
58                                                                         row.my.status = blob.status;
59                                                                         row.my.acp = blob.copy;
60                                                                         row.my.acn = blob.volume;
61                                                                         row.my.mvr = blob.mvr;
62                                                                         row.my.patron_family_name = blob.patron_last;
63                                                                         row.my.patron_first_given_name = blob.patron_first;
64                                                                         row.my.patron_barcode = blob.patron_barcode;
65
66                                                                         var copy_id = row.my.ahr.current_copy();
67                                                                         if (typeof copy_id == 'object') {
68                                                                                 if (copy_id == null) {
69                                                                                         if (typeof row.my.acp == 'object' && row.my.acp != null) copy_id = row.my.acp.id();
70                                                                                 } else {
71                                                                                         copy_id = copy_id.id();
72                                                                                 }
73                                                                         } else {
74                                                                                 copy_id = row.my.acp.id();
75                                                                         }
76
77                                                                         obj.holds_map[ row.my.ahr.id() ] = row.my.ahr;
78                                                                         params.row_node.setAttribute('retrieve_id', 
79                                                                                 js2JSON({
80                                                                                         'copy_id':copy_id,
81                                             'barcode':row.my.acp ? row.my.acp.barcode() : null,
82                                                                                         'id':row.my.ahr.id(),
83                                                                                         'type':row.my.ahr.hold_type(),
84                                                                                         'target':row.my.ahr.target(),
85                                                                                         'usr':row.my.ahr.usr(),
86                                                                                 })
87                                                                         );
88                                                                         if (typeof params.on_retrieve == 'function') { params.on_retrieve(row); }
89
90                                                                 } catch(E) {
91                                                                         obj.error.standard_unexpected_error_alert('Error retrieving details for hold #' + row.my.hold_id, E);
92                                                                 }
93                                                         }
94                                                 );
95                                                 /*
96                                                 obj.network.simple_request('FM_AHR_RETRIEVE', [ ses(), row.my.hold_id ],
97                                                         function(ahr_req) {
98                                                                 try {
99                                                                         var ahr_robj = ahr_req.getResultObject();
100                                                                         if (typeof ahr_robj.ilsevent != 'undefined') throw(ahr_robj);
101                                                                         row.my.ahr = ahr_robj[0];
102                                                                         obj.holds_map[ row.my.ahr.id() ] = row.my.ahr;
103                                                                         params.row_node.setAttribute('retrieve_id', 
104                                                                                 js2JSON({
105                                                                                         'copy_id':row.my.ahr.current_copy(),
106                                                                                         'id':row.my.ahr.id(),
107                                                                                         'type':row.my.ahr.hold_type(),
108                                                                                         'target':row.my.ahr.target(),
109                                                                                         'usr':row.my.ahr.usr(),
110                                                                                 })
111                                                                         );
112
113                                                                         obj.network.simple_request('FM_AHR_STATUS',[ ses(), row.my.ahr.id() ],
114                                                                                 function(status_req) {
115                                                                                         try {
116                                                                                                 var status_robj = status_req.getResultObject();
117                                                                                                 row.my.status = status_robj;
118                                                                                                 switch(row.my.ahr.hold_type()) {
119                                                                                                         case 'M' :
120                                                                                                                 obj.network.request(
121                                                                                                                         api.MODS_SLIM_METARECORD_RETRIEVE.app,
122                                                                                                                         api.MODS_SLIM_METARECORD_RETRIEVE.method,
123                                                                                                                         [ row.my.ahr.target() ],
124                                                                                                                         function(mvr_req) {
125                                                                                                                                 row.my.mvr = mvr_req.getResultObject();
126                                                                                                                                 if ( row.my.ahr.current_copy() && ! row.my.acp) {
127                                                                                                                                         obj.network.simple_request( 'FM_ACP_RETRIEVE', [ row.my.ahr.current_copy() ],
128                                                                                                                                                 function(acp_req) {
129                                                                                                                                                         row.my.acp = acp_req.getResultObject();
130                                                                                                                                                         if (typeof params.on_retrieve == 'function') { params.on_retrieve(row); }
131                                                                                                                                                 }
132                                                                                                                                         );
133                                                                                                                                 } else {
134                                                                                                                                         if (typeof params.on_retrieve == 'function') { params.on_retrieve(row); }
135                                                                                                                                 }
136                                                                                                                         }
137                                                                                                                 );
138                                                                                                         break;
139                                                                                                         case 'T' :
140                                                                                                                 obj.network.request(
141                                                                                                                         api.MODS_SLIM_RECORD_RETRIEVE.app,
142                                                                                                                         api.MODS_SLIM_RECORD_RETRIEVE.method,
143                                                                                                                         [ row.my.ahr.target() ],
144                                                                                                                         function(mvr_req) {
145                                                                                                                                 row.my.mvr = mvr_req.getResultObject();
146                                                                                                                                 if ( row.my.ahr.current_copy() && ! row.my.acp) {
147                                                                                                                                         obj.network.simple_request( 'FM_ACP_RETRIEVE', [ row.my.ahr.current_copy() ],
148                                                                                                                                                 function(acp_req) {
149                                                                                                                                                         row.my.acp = acp_req.getResultObject();
150                                                                                                                                                         if (typeof params.on_retrieve == 'function') { params.on_retrieve(row); }
151                                                                                                                                                 }
152                                                                                                                                         );
153                                                                                                                                 } else {
154                                                                                                                                         if (typeof params.on_retrieve == 'function') { params.on_retrieve(row); }
155                                                                                                                                 }
156         
157                                                                                                                         }
158                                                                                                                 );
159                                                                                                         break;
160                                                                                                         case 'V' :
161                                                                                                                 row.my.acn = obj.network.simple_request( 'FM_ACN_RETRIEVE', [ row.my.ahr.target() ],
162                                                                                                                         function(acn_req) {
163                                                                                                                                 row.my.acn = acn_req.getResultObject();
164                                                                                                                                 obj.network.request(
165                                                                                                                                         api.MODS_SLIM_RECORD_RETRIEVE.app,
166                                                                                                                                         api.MODS_SLIM_RECORD_RETRIEVE.method,
167                                                                                                                                         [ row.my.acn.record() ],
168                                                                                                                                         function(mvr_req) {
169                                                                                                                                                 try { row.my.mvr = mvr_req.getResultObject(); } catch(E) {}
170                                                                                                                                                 if ( row.my.ahr.current_copy() && ! row.my.acp) {
171                                                                                                                                                         obj.network.simple_request( 'FM_ACP_RETRIEVE', [ row.my.ahr.current_copy() ],
172                                                                                                                                                                 function(acp_req) {
173                                                                                                                                                                         row.my.acp = acp_req.getResultObject();
174                                                                                                                                                                         if (typeof params.on_retrieve == 'function') { params.on_retrieve(row); }
175                                                                                                                                                                 }
176                                                                                                                                                         );
177                                                                                                                                                 } else {
178                                                                                                                                                         if (typeof params.on_retrieve == 'function') { params.on_retrieve(row); }
179                                                                                                                                                 }
180                                                                                                                                         }
181                                                                                                                                 );
182                                                                                                                         }
183                                                                                                                 );
184                                                                                                         break;
185                                                                                                         case 'C' :
186                                                                                                                 obj.network.simple_request( 'FM_ACP_RETRIEVE', [ row.my.ahr.target() ],
187                                                                                                                         function(acp_req) {
188                                                                                                                                 row.my.acp = acp_req.getResultObject();
189                                                                                                                                 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() ],
190                                                                                                                                         function(acn_req) {
191                                                                                                                                                 row.my.acn = acn_req.getResultObject();
192                                                                                                                                                 obj.network.request(
193                                                                                                                                                         api.MODS_SLIM_RECORD_RETRIEVE.app,
194                                                                                                                                                         api.MODS_SLIM_RECORD_RETRIEVE.method,
195                                                                                                                                                         [ row.my.acn.record() ],
196                                                                                                                                                         function(mvr_req) {
197                                                                                                                                                                 try { row.my.mvr = mvr_req.getResultObject(); } catch(E) {}
198                                                                                                                                                                 if (typeof params.on_retrieve == 'function') { params.on_retrieve(row); }
199                                                                                                                                                         }
200                                                                                                                                                 );
201                                                                                                                                         }
202                                                                                                                                 );
203                                                                                                                         }
204                                                                                                                 );
205                                                                                                         break;
206                                                                                                 }
207                                                                                         } catch(E) {
208                                                                                                 obj.error.standard_unexpected_error_alert('Error retrieving status for hold #' + row.my.hold_id, E);
209                                                                                         }
210                                                                                 }
211                                                                         );
212                                                                 } catch(E) {
213                                                                         obj.error.standard_unexpected_error_alert('Error retrieving hold #' + row.my.hold_id, E);
214                                                                 }
215                                                         }
216                                                 );
217                                                 */
218                                         } catch(E) {
219                                                 obj.error.sdump('D_ERROR','retrieve_row: ' + E );
220                                         }
221                                         return row;
222                                 },
223                                 'on_select' : function(ev) {
224                                         JSAN.use('util.functional');
225                                         var sel = obj.list.retrieve_selection();
226                                         obj.controller.view.sel_clip.setAttribute('disabled',sel.length < 1);
227                                         obj.retrieve_ids = util.functional.map_list(
228                                                 sel,
229                                                 function(o) { return JSON2js( o.getAttribute('retrieve_id') ); }
230                                         );
231                                         if (obj.retrieve_ids.length > 0) {
232                                                 obj.controller.view.sel_mark_items_damaged.setAttribute('disabled','false');
233                                                 obj.controller.view.sel_mark_items_missing.setAttribute('disabled','false');
234                                                 obj.controller.view.sel_copy_details.setAttribute('disabled','false');
235                                                 obj.controller.view.sel_patron.setAttribute('disabled','false');
236                                                 obj.controller.view.cmd_retrieve_patron.setAttribute('disabled','false');
237                                                 obj.controller.view.cmd_holds_edit_pickup_lib.setAttribute('disabled','false');
238                                                 obj.controller.view.cmd_holds_edit_phone_notify.setAttribute('disabled','false');
239                                                 obj.controller.view.cmd_holds_edit_email_notify.setAttribute('disabled','false');
240                                                 obj.controller.view.cmd_holds_edit_selection_depth.setAttribute('disabled','false');
241                                                 obj.controller.view.cmd_holds_edit_thaw_date.setAttribute('disabled','false');
242                                                 obj.controller.view.cmd_holds_edit_freeze.setAttribute('disabled','false');
243                                                 obj.controller.view.cmd_show_notifications.setAttribute('disabled','false');
244                                                 obj.controller.view.cmd_holds_retarget.setAttribute('disabled','false');
245                                                 obj.controller.view.cmd_holds_cancel.setAttribute('disabled','false');
246                                                 obj.controller.view.cmd_show_catalog.setAttribute('disabled','false');
247                                         } else {
248                                                 obj.controller.view.sel_mark_items_damaged.setAttribute('disabled','true');
249                                                 obj.controller.view.sel_mark_items_missing.setAttribute('disabled','true');
250                                                 obj.controller.view.sel_copy_details.setAttribute('disabled','true');
251                                                 obj.controller.view.sel_patron.setAttribute('disabled','true');
252                                                 obj.controller.view.cmd_retrieve_patron.setAttribute('disabled','true');
253                                                 obj.controller.view.cmd_holds_edit_pickup_lib.setAttribute('disabled','true');
254                                                 obj.controller.view.cmd_holds_edit_phone_notify.setAttribute('disabled','true');
255                                                 obj.controller.view.cmd_holds_edit_email_notify.setAttribute('disabled','true');
256                                                 obj.controller.view.cmd_holds_edit_selection_depth.setAttribute('disabled','true');
257                                                 obj.controller.view.cmd_holds_edit_thaw_date.setAttribute('disabled','true');
258                                                 obj.controller.view.cmd_holds_edit_freeze.setAttribute('disabled','true');
259                                                 obj.controller.view.cmd_show_notifications.setAttribute('disabled','true');
260                                                 obj.controller.view.cmd_holds_retarget.setAttribute('disabled','true');
261                                                 obj.controller.view.cmd_holds_cancel.setAttribute('disabled','true');
262                                                 obj.controller.view.cmd_show_catalog.setAttribute('disabled','true');
263                                         }
264                                 },
265
266                         }
267                 );
268                 
269                 JSAN.use('util.controller'); obj.controller = new util.controller();
270                 obj.controller.init(
271                         {
272                                 'control_map' : {
273                                         'save_columns' : [ [ 'command' ], function() { obj.list.save_columns(); } ],
274                                         'sel_clip' : [
275                                                 ['command'],
276                                                 function() { obj.list.clipboard(); }
277                                         ],
278                                         'cmd_broken' : [
279                                                 ['command'],
280                                                 function() { alert('Not Yet Implemented'); }
281                                         ],
282                                         'sel_patron' : [
283                                                 ['command'],
284                                                 function() {
285                                                         JSAN.use('circ.util');
286                                                         circ.util.show_last_few_circs(obj.retrieve_ids);
287                                                 }
288                                         ],
289                                         'sel_mark_items_damaged' : [
290                                                 ['command'],
291                                                 function() {
292                                                         JSAN.use('cat.util'); JSAN.use('util.functional');
293                                                         cat.util.mark_item_damaged( util.functional.map_list( obj.retrieve_ids, function(o) { return o.copy_id; } ) );
294                                                 }
295                                         ],
296                                         'sel_mark_items_missing' : [
297                                                 ['command'],
298                                                 function() {
299                                                         JSAN.use('cat.util'); JSAN.use('util.functional');
300                                                         cat.util.mark_item_missing( util.functional.map_list( obj.retrieve_ids, function(o) { return o.copy_id; } ) );
301                                                 }
302                                         ],
303                                         'sel_copy_details' : [
304                                                 ['command'],
305                                                 function() {
306                                                         JSAN.use('circ.util');
307                                                         for (var i = 0; i < obj.retrieve_ids.length; i++) {
308                                                                 if (obj.retrieve_ids[i].copy_id) circ.util.show_copy_details( obj.retrieve_ids[i].copy_id );
309                                                         }
310                                                 }
311                                         ],
312                                         'cmd_holds_print' : [
313                                                 ['command'],
314                                                 function() {
315                                                         try {
316                                                                 dump(js2JSON(obj.list.dump_with_keys()) + '\n');
317                                                                 function flesh_callback() {
318                                                                         try {
319                                                                                 JSAN.use('patron.util');
320                                                                                 var params = { 
321                                                                                         'patron' : patron.util.retrieve_au_via_id(ses(),obj.patron_id), 
322                                                                                         'lib' : obj.data.hash.aou[ obj.data.list.au[0].ws_ou() ],
323                                                                                         'staff' : obj.data.list.au[0],
324                                                                                         'header' : obj.data.print_list_templates.holds.header,
325                                                                                         'line_item' : obj.data.print_list_templates.holds.line_item,
326                                                                                         'footer' : obj.data.print_list_templates.holds.footer,
327                                                                                         'type' : obj.data.print_list_templates.holds.type,
328                                                                                         'list' : obj.list.dump_with_keys(),
329                                                                                 };
330                                                                                 JSAN.use('util.print'); var print = new util.print();
331                                                                                 print.tree_list( params );
332                                                                                 setTimeout(function(){obj.list.on_all_fleshed = null;},0);
333                                                                         } catch(E) {
334                                                                                 obj.error.standard_unexpected_error_alert('print 2',E);
335                                                                         }
336                                                                 }
337                                                                 obj.list.on_all_fleshed = flesh_callback;
338                                                                 obj.list.full_retrieve();
339                                                         } catch(E) {
340                                                                 obj.error.standard_unexpected_error_alert('print 1',E);
341                                                         }
342                                                 }
343                                         ],
344                                         'cmd_holds_export' : [
345                                                 ['command'],
346                                                 function() {
347                                                         try {
348                                                                 function flesh_callback() {
349                                                                         try {
350                                                                                 dump(obj.list.dump_csv() + '\n');
351                                                                                 copy_to_clipboard(obj.list.dump_csv());
352                                                                                 setTimeout(function(){obj.list.on_all_fleshed = null;},0);
353                                                                         } catch(E) {
354                                                                                 obj.error.standard_unexpected_error_alert('export 2',E);
355                                                                         }
356                                                                 }
357                                                                 obj.list.on_all_fleshed = flesh_callback;
358                                                                 obj.list.full_retrieve();
359                                                         } catch(E) {
360                                                                 obj.error.standard_unexpected_error_alert('export 1',E);
361                                                         }
362                                                 }
363                                         ],
364
365                                         'cmd_show_notifications' : [
366                                                 ['command'],
367                                                 function() {
368                                                         try {
369                                                                 JSAN.use('util.window'); var win = new util.window();
370                                                                 for (var i = 0; i < obj.retrieve_ids.length; i++) {
371                                                                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
372                                                                         win.open(
373                                                                                 xulG.url_prefix(urls.XUL_HOLD_NOTICES), // + '?ahr_id=' + obj.retrieve_ids[i].id,
374                                                                                 'hold_notices_' + obj.retrieve_ids[i].id,
375                                                                                 'chrome,resizable',
376                                                                                 { 'ahr_id' : obj.retrieve_ids[i].id }
377                                                                         );
378                                                                 }
379                                                         } catch(E) {
380                                                                 obj.error.standard_unexpected_error_alert('Error rendering/retrieving hold notifications.',E);
381                                                         }
382                                                 }
383                                         ],
384                                         'cmd_holds_edit_selection_depth' : [
385                                                 ['command'],
386                                                 function() {
387                                                         try {
388                                                                 JSAN.use('util.widgets'); JSAN.use('util.functional'); 
389                                                                 var ws_type = obj.data.hash.aout[ obj.data.hash.aou[ obj.data.list.au[0].ws_ou() ].ou_type() ];
390                                                                 var list = util.functional.map_list(
391                                                                         util.functional.filter_list(    
392                                                                                 obj.data.list.aout,
393                                                                                 function(o) {
394                                                                                         if (o.depth() > ws_type.depth()) return false;
395                                                                                         if (o.depth() < ws_type.depth()) return true;
396                                                                                         return (o.id() == ws_type.id());
397                                                                                 }
398                                                                         ),
399                                                                         function(o) { 
400                                                                                 return [
401                                                                                         o.opac_label(),
402                                                                                         o.id(),
403                                                                                         false,
404                                                                                         ( o.depth() * 2),
405                                                                                 ]; 
406                                                                         }
407                                                                 );
408                                                                 ml = util.widgets.make_menulist( list, obj.data.list.au[0].ws_ou() );
409                                                                 ml.setAttribute('id','selection');
410                                                                 ml.setAttribute('name','fancy_data');
411                                                                 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
412                                                                 xml += '<description>Please choose a Hold Range:</description>';
413                                                                 xml += util.widgets.serialize_node(ml);
414                                                                 xml += '</vbox>';
415                                                                 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
416                                                                 bot_xml += '<spacer flex="1"/><button label="Done" accesskey="D" name="fancy_submit"/>';
417                                                                 bot_xml += '<button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
418                                                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
419                                                                 //obj.data.temp_mid = xml; obj.data.stash('temp_mid');
420                                                                 //obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
421                                                                 JSAN.use('util.window'); var win = new util.window();
422                                                                 var fancy_prompt_data = win.open(
423                                                                         urls.XUL_FANCY_PROMPT,
424                                                                         //+ '?xml_in_stash=temp_mid'
425                                                                         //+ '&bottom_xml_in_stash=temp_bot'
426                                                                         //+ '&title=' + window.escape('Choose a Pick Up Library'),
427                                                                         'fancy_prompt', 'chrome,resizable,modal',
428                                                                         { 'xml' : xml, 'bottom_xml' : bot_xml, 'title' : 'Choose a Pick Up Library' }
429                                                                 );
430                                                                 if (fancy_prompt_data.fancy_status == 'incomplete') { return; }
431                                                                 var selection = fancy_prompt_data.selection;
432                                                                 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() + '"?';
433                                                                 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
434                                                                 if (r == 0) {
435                                                                         for (var i = 0; i < obj.retrieve_ids.length; i++) {
436                                                                                 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
437                                                                                 hold.selection_depth( obj.data.hash.aout[selection].depth() ); hold.ischanged('1');
438                                                                                 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
439                                                                                 if (typeof robj.ilsevent != 'undefined') throw(robj);
440                                                                         }
441                                                                         obj.retrieve(true);
442                                                                 }
443                                                         } catch(E) {
444                                                                 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
445                                                         }
446                                                 }
447                                         ],
448
449                                         'cmd_holds_edit_pickup_lib' : [
450                                                 ['command'],
451                                                 function() {
452                                                         try {
453                                                                 JSAN.use('util.widgets'); JSAN.use('util.functional'); 
454                                                                 var list = util.functional.map_list(
455                                                                         obj.data.list.aou,
456                                                                         function(o) { 
457                                                                                 var sname = o.shortname(); for (i = sname.length; i < 20; i++) sname += ' ';
458                                                                                 return [
459                                                                                         o.name() ? sname + ' ' + o.name() : o.shortname(),
460                                                                                         o.id(),
461                                                                                         ( obj.data.hash.aout[ o.ou_type() ].can_have_users() == 0),
462                                                                                         ( obj.data.hash.aout[ o.ou_type() ].depth() * 2),
463                                                                                 ]; 
464                                                                         }
465                                                                 );
466                                                                 ml = util.widgets.make_menulist( list, obj.data.list.au[0].ws_ou() );
467                                                                 ml.setAttribute('id','lib');
468                                                                 ml.setAttribute('name','fancy_data');
469                                                                 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
470                                                                 xml += '<description>Please choose a new Pickup Library:</description>';
471                                                                 xml += util.widgets.serialize_node(ml);
472                                                                 xml += '</vbox>';
473                                                                 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
474                                                                 bot_xml += '<spacer flex="1"/><button label="Done" accesskey="D" name="fancy_submit"/>';
475                                                                 bot_xml += '<button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
476                                                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
477                                                                 //obj.data.temp_mid = xml; obj.data.stash('temp_mid');
478                                                                 //obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
479                                                                 JSAN.use('util.window'); var win = new util.window();
480                                                                 var fancy_prompt_data = win.open(
481                                                                         urls.XUL_FANCY_PROMPT,
482                                                                         //+ '?xml_in_stash=temp_mid'
483                                                                         //+ '&bottom_xml_in_stash=temp_bot'
484                                                                         //+ '&title=' + window.escape('Choose a Pick Up Library'),
485                                                                         'fancy_prompt', 'chrome,resizable,modal',
486                                                                         { 'xml' : xml, 'bottom_xml' : bot_xml, 'title' : 'Choose a Pick Up Library' }
487                                                                 );
488                                                                 if (fancy_prompt_data.fancy_status == 'incomplete') { return; }
489                                                                 var pickup_lib = fancy_prompt_data.lib;
490                                                                 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() + '?';
491                                                                 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
492                                                                 if (r == 0) {
493                                                                         for (var i = 0; i < obj.retrieve_ids.length; i++) {
494                                                                                 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
495                                                                                 hold.pickup_lib(  pickup_lib ); hold.ischanged('1');
496                                                                                 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
497                                                                                 if (typeof robj.ilsevent != 'undefined') throw(robj);
498                                                                         }
499                                                                         obj.retrieve(true);
500                                                                 }
501                                                         } catch(E) {
502                                                                 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
503                                                         }
504                                                 }
505                                         ],
506                                         'cmd_holds_edit_phone_notify' : [
507                                                 ['command'],
508                                                 function() {
509                                                         try {
510                                                                 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
511                                                                 xml += '<description>Please enter a new phone number for hold notification (leave the field empty to disable phone notification):</description>';
512                                                                 xml += '<textbox id="phone" name="fancy_data"/>';
513                                                                 xml += '</vbox>';
514                                                                 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
515                                                                 bot_xml += '<spacer flex="1"/><button label="Done" accesskey="D" name="fancy_submit"/>';
516                                                                 bot_xml += '<button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
517                                                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
518                                                                 //obj.data.temp_mid = xml; obj.data.stash('temp_mid');
519                                                                 //obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
520                                                                 JSAN.use('util.window'); var win = new util.window();
521                                                                 var fancy_prompt_data = win.open(
522                                                                         urls.XUL_FANCY_PROMPT,
523                                                                         //+ '?xml_in_stash=temp_mid'
524                                                                         //+ '&bottom_xml_in_stash=temp_bot'
525                                                                         //+ '&title=' + window.escape('Choose a Hold Notification Phone Number')
526                                                                         //+ '&focus=phone',
527                                                                         'fancy_prompt', 'chrome,resizable,modal',
528                                                                         { 'xml' : xml, 'bottom_xml' : bot_xml, 'title' : 'Choose a Hold Notification Phone Number', 'focus' : 'phone' }
529                                                                 );
530                                                                 if (fancy_prompt_data.fancy_status == 'incomplete') { return; }
531                                                                 var phone = fancy_prompt_data.phone;
532                                                                 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 + '"?';
533                                                                 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
534                                                                 if (r == 0) {
535                                                                         for (var i = 0; i < obj.retrieve_ids.length; i++) {
536                                                                                 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
537                                                                                 hold.phone_notify(  phone ); hold.ischanged('1');
538                                                                                 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
539                                                                                 if (typeof robj.ilsevent != 'undefined') throw(robj);
540                                                                         }
541                                                                         obj.retrieve(true);
542                                                                 }
543                                                         } catch(E) {
544                                                                 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
545                                                         }
546                                                 }
547                                         ],
548                                         'cmd_holds_edit_email_notify' : [
549                                                 ['command'],
550                                                 function() {
551                                                         try {
552                                                                 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
553                                                                 xml += '<description>Send email notifications (when appropriate)?  The email address used is found in the hold recipient account.</description>';
554                                                                 xml += '<hbox><button value="email" label="Email" accesskey="E" name="fancy_submit"/>';
555                                                                 xml += '<button value="noemail" label="No Email" accesskey="N" name="fancy_submit"/></hbox>';
556                                                                 xml += '</vbox>';
557                                                                 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
558                                                                 bot_xml += '<spacer flex="1"/><button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
559                                                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
560                                                                 //obj.data.temp_mid = xml; obj.data.stash('temp_mid');
561                                                                 //obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
562                                                                 JSAN.use('util.window'); var win = new util.window();
563                                                                 var fancy_prompt_data = win.open(
564                                                                         urls.XUL_FANCY_PROMPT,
565                                                                         //+ '?xml_in_stash=temp_mid'
566                                                                         //+ '&bottom_xml_in_stash=temp_bot'
567                                                                         //+ '&title=' + window.escape('Set Email Notification for Holds'),
568                                                                         'fancy_prompt', 'chrome,resizable,modal',
569                                                                         { 'xml' : xml, 'bottom_xml' : bot_xml, 'title' : 'Set Email Notification for Holds' }
570                                                                 );
571                                                                 if (fancy_prompt_data.fancy_status == 'incomplete') { return; }
572                                                                 var email = fancy_prompt_data.fancy_submit == 'email' ? get_db_true() : get_db_false();
573                                                                 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(', ') + '?';
574                                                                 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
575                                                                 if (r == 0) {
576                                                                         for (var i = 0; i < obj.retrieve_ids.length; i++) {
577                                                                                 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
578                                                                                 hold.email_notify(  email ); hold.ischanged('1');
579                                                                                 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
580                                                                                 if (typeof robj.ilsevent != 'undefined') throw(robj);
581                                                                         }
582                                                                         obj.retrieve(true);
583                                                                 }
584                                                         } catch(E) {
585                                                                 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
586                                                         }
587                                                 }
588                                         ],
589                     'cmd_holds_edit_freeze' : [
590                                                 ['command'],
591                                                 function() {
592                                                         try {
593                                                                 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
594                                                                 xml += '<description>Freeze or un-freeze these holds?</description>';
595                                                                 xml += '<hbox><button value="freeze" label="Freeze" accesskey="F" name="fancy_submit"/>';
596                                                                 xml += '<button value="unfreeze" label="Un-Freeze" accesskey="U" name="fancy_submit"/></hbox>';
597                                                                 xml += '</vbox>';
598                                                                 var bot_xml = '<hbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" style="overflow: vertical">';
599                                                                 bot_xml += '<spacer flex="1"/><button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox>';
600                                                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
601                                                                 //obj.data.temp_mid = xml; obj.data.stash('temp_mid');
602                                                                 //obj.data.temp_bot = bot_xml; obj.data.stash('temp_bot');
603                                                                 JSAN.use('util.window'); var win = new util.window();
604                                                                 var fancy_prompt_data = win.open(
605                                                                         urls.XUL_FANCY_PROMPT,
606                                                                         //+ '?xml_in_stash=temp_mid'
607                                                                         //+ '&bottom_xml_in_stash=temp_bot'
608                                                                         //+ '&title=' + window.escape('Set Email Notification for Holds'),
609                                                                         'fancy_prompt', 'chrome,resizable,modal',
610                                                                         { 'xml' : xml, 'bottom_xml' : bot_xml, 'title' : 'Set Email Notification for Holds' }
611                                                                 );
612                                                                 if (fancy_prompt_data.fancy_status == 'incomplete') { return; }
613                                                                 var freeze = fancy_prompt_data.fancy_submit == 'freeze' ? get_db_true() : get_db_false();
614                                                                 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(', ') + '?';
615                                                                 var r = obj.error.yns_alert(msg,'Modifying Holds','Yes','No',null,'Check here to confirm this message');
616                                                                 if (r == 0) {
617                                                                         for (var i = 0; i < obj.retrieve_ids.length; i++) {
618                                                                                 var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
619                                                                                 hold.frozen(  freeze ); 
620                                                                                 if ( ! get_bool( freeze ) ) {
621                                                                                         hold.thaw_date( null );
622                                                                                 }
623                                                                                 hold.ischanged('1');
624                                                                                 var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
625                                                                                 if (typeof robj.ilsevent != 'undefined') throw(robj);
626                                                                         }
627                                                                         obj.retrieve(true);
628                                                                 }
629                                                         } catch(E) {
630                                                                 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
631                                                         }
632                                                 }
633                                         ],
634
635                     'cmd_holds_edit_thaw_date' : [
636                                                 ['command'],
637                                                 function() {
638                                                         try {
639                                 JSAN.use('util.date');
640                                 function check_date(value) {
641                                     try {
642                                         if (! util.date.check('YYYY-MM-DD',value) ) { throw('Invalid Date'); }
643                                         if (util.date.check_past('YYYY-MM-DD',value) ) { 
644                                             throw('Thaw date for frozen holds needs to be after today.'); 
645                                         }
646                                         return true;
647                                     } catch(E) {
648                                         alert(E);
649                                         return false;
650                                     }
651                                 }
652
653                                                                 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.';
654                                 var value = 'YYYY-MM-DD';
655                                 var title = 'Modifying Holds';
656                                                                 var thaw_date; var invalid = true;
657                                 while(invalid) {
658                                     thaw_date = window.prompt(msg,value,title);
659                                     if (thaw_date) {
660                                         invalid = ! check_date(thaw_date);
661                                     } else { 
662                                         invalid = false;
663                                     }
664                                 }
665                                 if (thaw_date || thaw_date == '') {
666                                     for (var i = 0; i < obj.retrieve_ids.length; i++) {
667                                         var hold = obj.holds_map[ obj.retrieve_ids[i].id ];
668                                         hold.thaw_date(  thaw_date == '' ? null : util.date.formatted_date(thaw_date + ' 00:00:00','%{iso8601}') ); hold.ischanged('1');
669                                         var robj = obj.network.simple_request('FM_AHR_UPDATE',[ ses(), hold ]);
670                                         if (typeof robj.ilsevent != 'undefined') throw(robj);
671                                     }
672                                     obj.retrieve(true);
673                                 }
674                                                         } catch(E) {
675                                                                 obj.error.standard_unexpected_error_alert('Holds not likely modified.',E);
676                                                         }
677                                                 }
678                                         ],
679
680                                         'cmd_holds_retarget' : [
681                                                 ['command'],
682                                                 function() {
683                                                         try {
684                                                                 JSAN.use('util.functional');
685                                                                 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(', ') + '?';
686                                                                 var r = obj.error.yns_alert(msg,'Resetting Holds','Yes','No',null,'Check here to confirm this message');
687                                                                 if (r == 0) {
688                                                                         for (var i = 0; i < obj.retrieve_ids.length; i++) {
689                                                                                 var robj = obj.network.simple_request('FM_AHR_RESET',[ ses(), obj.retrieve_ids[i].id]);
690                                                                                 if (typeof robj.ilsevent != 'undefined') throw(robj);
691                                                                         }
692                                                                         obj.retrieve();
693                                                                 }
694                                                         } catch(E) {
695                                                                 obj.error.standard_unexpected_error_alert('Holds not likely reset.',E);
696                                                         }
697
698                                                 }
699                                         ],
700
701                                         'cmd_holds_cancel' : [
702                                                 ['command'],
703                                                 function() {
704                                                         try {
705                                                                 JSAN.use('util.functional');
706                                                                 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(', ') + '?';
707                                                                 var r = obj.error.yns_alert(msg,'Cancelling Holds','Yes','No',null,'Check here to confirm this message');
708                                                                 if (r == 0) {
709                                     var transits = [];
710                                                                         for (var i = 0; i < obj.retrieve_ids.length; i++) {
711                                         if (obj.holds_map[ obj.retrieve_ids[i].id ].transit()) {
712                                             transits.push( obj.retrieve_ids[i].barcode );
713                                         }
714                                                                                 var robj = obj.network.simple_request('FM_AHR_CANCEL',[ ses(), obj.retrieve_ids[i].id]);
715                                                                                 if (typeof robj.ilsevent != 'undefined') throw(robj);
716                                                                         }
717                                     if (transits.length > 0) {
718                                         var msg2 = 'For barcodes ' + transits.join(', ') + ' cancel the transits as well?';
719                                         var r2 = obj.error.yns_alert(msg2,'Cancelling Transits','Yes','No',null,'Check here to confirm this message');
720                                         if (r2 == 0) {
721                                             try {
722                                                 for (var i = 0; i < transits.length; i++) {
723                                                     var robj = obj.network.simple_request('FM_ATC_VOID',[ ses(), { 'barcode' : transits[i] } ]);
724                                                     if (typeof robj.ilsevent != 'undefined') {
725                                                         switch(robj.ilsevent) {
726                                                             case 1225 /* TRANSIT_ABORT_NOT_ALLOWED */ :
727                                                                 alert(robj.desc);
728                                                             break;
729                                                             case 5000 /* PERM_FAILURE */ :
730                                                             break;
731                                                             default:
732                                                                 throw(robj);
733                                                             break;
734                                                         }
735                                                                                             }
736                                                 }
737                                             } catch(E) {
738                                                                             obj.error.standard_unexpected_error_alert('Hold-transits not likely cancelled.',E);
739                                             }
740                                         }
741                                     }
742                                                                         obj.retrieve();
743                                                                 }
744                                                         } catch(E) {
745                                                                 obj.error.standard_unexpected_error_alert('Holds not likely cancelled.',E);
746                                                         }
747                                                 }
748                                         ],
749                                         'cmd_retrieve_patron' : [
750                                                 ['command'],
751                                                 function() {
752                                                         try {
753                                                                 var seen = {};
754                                                                 for (var i = 0; i < obj.retrieve_ids.length; i++) {
755                                                                         var patron_id = obj.retrieve_ids[i].usr;
756                                                                         if (seen[patron_id]) continue; seen[patron_id] = true;
757                                                                         xulG.new_tab(
758                                                                                 xulG.url_prefix(urls.XUL_PATRON_DISPLAY), // + '?id=' + patron_id, 
759                                                                                 {}, 
760                                                                                 { 'id' : patron_id }
761                                                                         );
762                                                                 }
763                                                         } catch(E) {
764                                                                 obj.error.standard_unexpected_error_alert('',E);
765                                                         }
766                                                 }
767                                         ],
768                                         'cmd_show_catalog' : [
769                                                 ['command'],
770                                                 function() {
771                                                         try {
772                                                                 for (var i = 0; i < obj.retrieve_ids.length; i++) {
773                                                                         var htarget = obj.retrieve_ids[i].target;
774                                                                         var htype = obj.retrieve_ids[i].type;
775                                                                         var opac_url;
776                                                                         switch(htype) {
777                                                                                 case 'M' :
778                                                                                         opac_url = xulG.url_prefix( urls.opac_rresult ) + '?m=' + htarget;
779                                                                                 break;
780                                                                                 case 'T' : 
781                                                                                         opac_url = xulG.url_prefix( urls.opac_rdetail ) + '?r=' + htarget;
782                                                                                 break;
783                                                                                 case 'V' :
784                                                                                         var my_acn = obj.network.simple_request( 'FM_ACN_RETRIEVE', [ htarget ]);
785                                                                                         opac_url = xulG.url_prefix( urls.opac_rdetail) + '?r=' + my_acn.record();
786                                                                                 break;
787                                                                                 case 'C' :
788                                                                                         var my_acp = obj.network.simple_request( 'FM_ACP_RETRIEVE', [ htarget ]);
789                                                                                         var my_acn;
790                                                                                         if (typeof my_acp.call_number() == 'object') {
791                                                                                                 my_acn = my.acp.call_number();
792                                                                                         } else {
793                                                                                                 my_acn = obj.network.simple_request( 'FM_ACN_RETRIEVE', 
794                                                                                                         [ my_acp.call_number() ]);
795                                                                                         }
796                                                                                         opac_url = xulG.url_prefix( urls.opac_rdetail) + '?r=' + my_acn.record();
797                                                                                 break;
798                                                                                 default:
799                                                                                         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]);
800                                                                                         continue;
801                                                                                 break;
802                                                                         }
803                                                                         var content_params = { 
804                                                                                 'session' : ses(),
805                                                                                 'authtime' : ses('authtime'),
806                                                                                 'opac_url' : opac_url,
807                                                                         };
808                                                                         xulG.new_tab(
809                                                                                 xulG.url_prefix(urls.XUL_OPAC_WRAPPER), 
810                                                                                 {'tab_name': htype == 'M' ? 'Catalog' : 'Retrieving title...'}, 
811                                                                                 content_params
812                                                                         );
813                                                                 }
814                                                         } catch(E) {
815                                                                 obj.error.standard_unexpected_error_alert('',E);
816                                                         }
817                                                 }
818                                         ],
819                                 }
820                         }
821                 );
822         
823         obj.determine_hold_interface_type();
824                 obj.controller.render();
825                 obj.retrieve();
826
827                 obj.controller.view.cmd_retrieve_patron.setAttribute('disabled','true');
828                 obj.controller.view.cmd_holds_edit_pickup_lib.setAttribute('disabled','true');
829                 obj.controller.view.cmd_holds_edit_phone_notify.setAttribute('disabled','true');
830                 obj.controller.view.cmd_holds_edit_email_notify.setAttribute('disabled','true');
831                 obj.controller.view.cmd_holds_edit_selection_depth.setAttribute('disabled','true');
832                 obj.controller.view.cmd_show_notifications.setAttribute('disabled','true');
833                 obj.controller.view.cmd_holds_retarget.setAttribute('disabled','true');
834                 obj.controller.view.cmd_holds_cancel.setAttribute('disabled','true');
835                 obj.controller.view.cmd_show_catalog.setAttribute('disabled','true');
836         },
837
838     'determine_hold_interface_type' : function() {
839                 var obj = this;
840         if (obj.patron_id) { /*************************************************** PATRON ******************************/
841             obj.hold_interface_type = 'patron';
842                 } else if (obj.docid) { /*************************************************** RECORD ******************************/
843             obj.hold_interface_type = 'record';
844                 } else if (obj.pull) { /*************************************************** PULL ******************************/
845             obj.hold_interface_type = 'pull';
846                 } else if (obj.shelf) { /*************************************************** HOLD SHELF ******************************/
847             obj.hold_interface_type = 'shelf';
848                 } else { /*************************************************** PULL ******************************/
849             obj.hold_interface_type = 'pull';
850                 }
851     },
852
853         'retrieve' : function(dont_show_me_the_list_change) {
854                 var obj = this;
855                 if (window.xulG && window.xulG.holds) {
856                         obj.holds = window.xulG.holds;
857                 } else {
858                         var method; var params = [ ses() ];
859             switch(obj.hold_interface_type) {
860                 case 'patron' :
861                                     method = 'FM_AHR_ID_LIST_RETRIEVE_VIA_AU'; 
862                                 params.push( obj.patron_id ); 
863                                 obj.controller.view.cmd_retrieve_patron.setAttribute('hidden','true');
864                 break;
865                 case 'record' :
866                                     method = 'FM_AHR_RETRIEVE_ALL_VIA_BRE'; 
867                                 params.push( obj.docid ); 
868                                 obj.controller.view.cmd_retrieve_patron.setAttribute('hidden','false');
869                 break;
870                 case 'shelf' : 
871                                     method = 'FM_AHR_ID_LIST_ONSHELF_RETRIEVE';
872                     params.push( obj.foreign_shelf || obj.data.list.au[0].ws_ou() ); 
873                                 obj.controller.view.cmd_retrieve_patron.setAttribute('hidden','false');
874                                 obj.render_lib_menus({'pickup_lib':true});
875                 break;
876                 case 'pull' : 
877                 default:
878                                     method = 'FM_AHR_ID_LIST_PULL_LIST'; 
879                                 params.push( 50 ); params.push( 0 );
880                                     //obj.controller.view.cmd_retrieve_patron.setAttribute('hidden','false');
881                 break;
882                         }
883                         var robj = obj.network.simple_request( method, params );
884                         if (typeof robj.ilsevent != 'undefined') throw(robj);
885                         if (method == 'FM_AHR_RETRIEVE_ALL_VIA_BRE') {
886                                 obj.holds = [];
887                                 obj.holds = obj.holds.concat( robj.copy_holds );
888                                 obj.holds = obj.holds.concat( robj.volume_holds );
889                                 obj.holds = obj.holds.concat( robj.title_holds );
890                                 obj.holds = obj.holds.sort();
891                         } else {
892                                 obj.holds = robj;
893                         }
894                         //alert('method = ' + method + ' params = ' + js2JSON(params));
895                 }
896
897                 function list_append(hold_id) {
898                         obj.list.append(
899                                 {
900                                         'row' : {
901                                                 'my' : {
902                                                         'hold_id' : hold_id,
903                                                 }
904                                         }
905                                 }
906                         );
907                 }
908
909                 function gen_list_append(hold) {
910                         return function() {
911                                 if (typeof obj.controller.view.lib_menu == 'undefined') {
912                                         list_append(typeof hold == 'object' ? hold.id() : hold);
913                                 } else {
914                                         /*
915                                         var pickup_lib = hold.pickup_lib();
916                                         if (typeof pickup_lib == 'object') pickup_lib = pickup_lib.id();
917                                         if (pickup_lib == obj.controller.view.lib_menu.value) {
918                                         */
919                                                 list_append(typeof hold == 'object' ? hold.id() : hold);
920                                         /*
921                                         }
922                                         */
923                                 }
924                         };
925                 }
926
927                 obj.list.clear();
928
929                 //alert('obj.holds = ' + js2JSON(obj.holds));
930                 JSAN.use('util.exec'); var exec = new util.exec(2);
931                 var rows = [];
932                 for (var i in obj.holds) {
933                         rows.push( gen_list_append(obj.holds[i]) );
934                 }
935                 exec.chain( rows );
936         
937                 if (!dont_show_me_the_list_change) {
938                         if (window.xulG && typeof window.xulG.on_list_change == 'function') {
939                                 try { window.xulG.on_list_change(obj.holds); } catch(E) { this.error.sdump('D_ERROR',E); }
940                         }
941                 }
942         },
943
944         'render_lib_menus' : function(types) {
945                 try {
946                         var obj = this;
947                         JSAN.use('util.widgets'); JSAN.use('util.functional'); JSAN.use('util.fm_utils');
948
949             var x = document.getElementById('lib_type_menu');
950             if (types) {
951                 x.hidden = false;
952                 var nodes = x.firstChild.childNodes;
953                 for (var i = 0; i < nodes.length; i++) nodes[i].hidden = true;
954                 for (var i in types) document.getElementById(i).hidden = false;
955             } else {
956                 x.hidden = true;
957             }
958
959                         x = document.getElementById('lib_menu_placeholder');
960             x.hidden = types ? false : true;
961                         if (x.firstChild) return;
962                         util.widgets.remove_children( x );
963
964                         var ml = util.widgets.make_menulist( 
965                                 util.functional.map_list( 
966                                         obj.data.list.my_aou.concat(
967                                                 util.functional.filter_list(
968                                                         util.fm_utils.find_ou(
969                                                                 obj.data.tree.aou,
970                                                                 obj.data.hash.aou[ obj.data.list.au[0].ws_ou() ].parent_ou()
971                                                         ).children(),
972                                                         function(o) {
973                                                                 return o.id() != obj.data.list.au[0].ws_ou();
974                                                         }
975                                                 )
976                                         ),
977                                         function(o) { return [ 
978                                                 o.shortname(), 
979                                                 o.id(), 
980                                                 ( ! get_bool( obj.data.hash.aout[ o.ou_type() ].can_have_users() ) ),
981                                                 ( obj.data.hash.aout[ o.ou_type() ].depth() ),
982                                         ]; }
983                                 ).sort(
984                                         function( a, b ) {
985                                                 var A = obj.data.hash.aou[ a[1] ];
986                                                 var B = obj.data.hash.aou[ b[1] ];
987                                                 var X = obj.data.hash.aout[ A.ou_type() ];
988                                                 var Y = obj.data.hash.aout[ B.ou_type() ];
989                                                 if (X.depth() < Y.depth()) return -1;
990                                                 if (X.depth() > Y.depth()) return 1;
991                                                 if (A.shortname() < B.shortname()) return -1;
992                                                 if (A.shortname() > B.shortname()) return 1;
993                                                 return 0;
994                                         }
995                                 ),
996                                 obj.data.list.au[0].ws_ou()
997                         );
998                         x.appendChild( ml );
999                         ml.addEventListener(
1000                                 'command',
1001                                 function(ev) {
1002                                         /*
1003                                         obj.list.on_all_fleshed = function() {
1004                                                 obj.list.clear();
1005                                                 obj.foreign_shelf = ev.target.value;
1006                                                 obj.retrieve();
1007                                                 setTimeout( function() { obj.list.on_all_fleshed = null; }, 0);
1008                                         };
1009                                         obj.list.full_retrieve();
1010                                         */
1011                                         obj.list.clear();
1012                                         obj.foreign_shelf = ev.target.value;
1013                                         obj.retrieve();
1014                                 },
1015                                 false
1016                         );
1017                         obj.controller.view.lib_menu = ml;
1018                 } catch(E) {
1019                         this.error.standard_unexpected_error_alert('rendering lib menu',E);
1020                 }
1021         },
1022 }
1023
1024 dump('exiting patron.holds.js\n');