]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/patron/display.js
LP1615805 No inputs after submit in patron search (AngularJS)
[Evergreen.git] / Open-ILS / xul / staff_client / server / patron / display.js
1 dump('entering patron/display.js\n');
2 dojo.require("openils.User");
3 dojo.require("openils.XUL");
4
5 function $(id) { return document.getElementById(id); }
6
7 if (typeof patron == 'undefined') patron = {};
8 patron.display = function (params) {
9
10     JSAN.use('util.error'); this.error = new util.error();
11     JSAN.use('util.window'); this.window = new util.window();
12     JSAN.use('util.network'); this.network = new util.network();
13     JSAN.use('util.widgets'); 
14     this.w = window;
15 }
16
17 patron.display.prototype = {
18
19     'retrieve_ids' : [],
20     'stop_checkouts' : false,
21     'check_stop_checkouts' : function() { return this.stop_checkouts; },
22
23     'init' : function( params ) {
24
25         var obj = this;
26
27         obj.event_listeners = new EventListenerList();
28         obj.barcode = params['barcode'];
29         obj.id = params['id'];
30
31         JSAN.use('OpenILS.data'); this.OpenILS = {}; 
32         obj.OpenILS.data = new OpenILS.data(); obj.OpenILS.data.init({'via':'stash'});
33         
34         //var horizontal_interface = String( obj.OpenILS.data.hash.aous['ui.circ.patron_summary.horizontal'] ) == 'true';
35         //document.getElementById('ui.circ.patron_summary.horizontal').setAttribute('orient', horizontal_interface ? 'vertical' : 'horizontal');
36         //document.getElementById('pdms1').setAttribute('orient', horizontal_interface ? 'vertical' : 'horizontal');
37         
38         JSAN.use('util.deck'); 
39         obj.right_deck = new util.deck('patron_right_deck');
40         obj.left_deck = new util.deck('patron_left_deck');
41
42         JSAN.use('util.controller'); obj.controller = new util.controller();
43         obj.controller.init(
44             {
45                 control_map : {
46                     'cmd_broken' : [
47                         ['command'],
48                         function() { alert($("commonStrings").getString('common.unimplemented')); }
49                     ],
50                     'cmd_patron_retrieve' : [
51                         ['command'],
52                         function(ev) {
53                             if (typeof window.xulG == 'object' && typeof window.xulG.new_tab == 'function') {
54                                 for (var i = 0; i < obj.retrieve_ids.length; i++) {    
55                                     try {
56                                         window.xulG.new_patron_tab(
57                                             {}, { 'id' : obj.retrieve_ids[i] }
58                                         );
59                                     } catch(E) {
60                                         alert(E);
61                                     }
62                                 }
63                             }
64                         }
65                     ],
66                     'cmd_patron_merge' : [
67                         ['command'],
68                         function(ev) {
69                             JSAN.use('patron.util');
70                             if (patron.util.merge( obj.retrieve_ids )) {
71                                 obj.controller.view.cmd_patron_retrieve.setAttribute('disabled','true');
72                                 obj.controller.view.cmd_patron_merge.setAttribute('disabled','true');
73                                 var sobj = obj.search_result.g.search_result;
74                                 if ( sobj.query ) { sobj.search( sobj.query ); }
75                             }
76                         }
77                     ],
78                     'cmd_patron_toggle_summary' : [
79                         ['command'],
80                         function(ev) {
81                             document.getElementById('splitter_grippy').doCommand();
82                         }
83                     ],
84                     'cmd_patron_delete' : [
85                         ['command'],
86                         function(ev) {
87                             try {
88                                 if (get_bool( obj.patron.super_user() )) {
89                                     alert($("patronStrings").getString('staff.patron.display.cmd_patron_delete.deny_deletion_of_super_user'));
90                                     return;
91                                 }
92                                 if (obj.patron.id() == obj.OpenILS.data.list.au[0].id()) {
93                                     alert($("patronStrings").getString('staff.patron.display.cmd_patron_delete.deny_deletion_of_self'));
94                                     return;
95                                 }
96                                 var rv = obj.error.yns_alert_original(
97                                     $("patronStrings").getString('staff.patron.display.cmd_patron_delete.dialog.message'),
98                                     $("patronStrings").getString('staff.patron.display.cmd_patron_delete.dialog.title'),
99                                     $("patronStrings").getString('staff.patron.display.cmd_patron_delete.dialog.okay'),
100                                     $("patronStrings").getString('staff.patron.display.cmd_patron_delete.dialog.cancel'),
101                                     null,
102                                     $("patronStrings").getString('staff.patron.display.cmd_patron_delete.dialog.confirmation')
103                                 );
104                                 //alert('rv = ' + rv + ' (' + typeof rv + ')');
105                                 if (rv == 0) {
106                                     var params = [ ses(), obj.patron.id() ];
107                                     var staff_check = obj.network.simple_request('PERM_RETRIEVE_WORK_OU',[ ses(), 'STAFF_LOGIN', obj.patron.id() ]);
108                                     if (staff_check.length > 0) {
109                                         var dest_barcode = window.prompt(
110                                             $("patronStrings").getString('staff.patron.display.cmd_patron_delete.dest_user.prompt'),
111                                             $("patronStrings").getString('staff.patron.display.cmd_patron_delete.dest_user.default_value'),
112                                             $("patronStrings").getString('staff.patron.display.cmd_patron_delete.dest_user.title')
113                                         );
114                                         if (!dest_barcode) return;
115                                         JSAN.use('patron.util');
116                                         var dest_usr = patron.util.retrieve_fleshed_au_via_barcode( ses(), dest_barcode );
117                                         if (typeof dest_usr.ilsevent != 'undefined') {
118                                             alert( $("patronStrings").getString('staff.patron.display.cmd_patron_delete.dest_user.failure') );
119                                             return;
120                                         }
121                                         if (dest_usr.id() == obj.patron.id()) {
122                                             alert( $("patronStrings").getString('staff.patron.display.cmd_patron_delete.dest_user.self_reference_failure') );
123                                             return;
124                                         }
125                                         params.push( dest_usr.id() );
126                                     }
127                                     var robj = obj.network.simple_request(
128                                         'FM_AU_DELETE',
129                                         params,
130                                         null,
131                                         {
132                                             'title' : document.getElementById('patronStrings').getString('staff.patron.display.cmd_patron_delete.override_prompt'),
133                                             'overridable_events' : [
134                                                 2004 /* ACTOR_USER_DELETE_OPEN_XACTS */
135                                             ]
136                                         }
137                                     );
138                                     if (typeof robj.ilsevent != 'undefined') {
139                                         switch(Number(robj.ilsevent)) {
140                                             /* already informed via override prompt */
141                                             case 2004 /* ACTOR_USER_DELETE_OPEN_XACTS */ :
142                                                 return;
143                                             break;
144                                         }
145                                         obj.refresh_all();
146                                     }
147                                     else {
148                                         alert( document.getElementById('patronStrings').getString('staff.patron.display.cmd_patron_delete.success_message') );
149                                     }
150                                 }
151                             } catch(E) {
152                                 obj.error.standard_unexpected_error_alert('Error in server/patron/display.js -> cmd_patron_delete: ',E);
153                             }
154                         }
155                     ],
156                     'cmd_search_form' : [
157                         ['command'],
158                         function(ev) {
159                             obj.controller.view.cmd_search_form.setAttribute('disabled','true');
160                             obj.left_deck.node.selectedIndex = 0;
161                             obj.controller.view.patron_name.setAttribute('value', $("patronStrings").getString('staff.patron.display.cmd_search_form.no_patron'));
162                             obj.controller.view.patron_name.setAttribute('tooltiptext', '');
163                             obj.controller.view.patron_name.setAttribute('onclick', '');
164                             removeCSSClass(document.documentElement,'PATRON_HAS_BILLS');
165                             removeCSSClass(document.documentElement,'PATRON_HAS_OVERDUES');
166                             removeCSSClass(document.documentElement,'PATRON_HAS_NOTES');
167                             removeCSSClass(document.documentElement,'PATRON_HAS_LOST');
168                             removeCSSClass(document.documentElement,'PATRON_HAS_LOST_AND_COUNTED');
169                             removeCSSClass(document.documentElement,'PATRON_EXCEEDS_CHECKOUT_COUNT');
170                             removeCSSClass(document.documentElement,'PATRON_EXCEEDS_OVERDUE_COUNT');
171                             removeCSSClass(document.documentElement,'PATRON_EXCEEDS_LOST_COUNT');
172                             removeCSSClass(document.documentElement,'PATRON_EXCEEDS_FINES');
173                             removeCSSClass(document.documentElement,'NO_PENALTIES');
174                             removeCSSClass(document.documentElement,'ONE_PENALTY');
175                             removeCSSClass(document.documentElement,'MULTIPLE_PENALTIES');
176                             removeCSSClass(document.documentElement,'PATRON_HAS_ALERT');
177                             removeCSSClass(document.documentElement,'PATRON_BARRED');
178                             removeCSSClass(document.documentElement,'PATRON_INACTIVE');
179                             removeCSSClass(document.documentElement,'PATRON_EXPIRED');
180                             removeCSSClass(document.documentElement,'PATRON_HAS_INVALID_DOB');
181                             removeCSSClass(document.documentElement,'PATRON_JUVENILE');
182                             removeCSSClass(document.documentElement,'PATRON_HAS_INVALID_ADDRESS');
183                             removeCSSClass(document.documentElement,'PATRON_AGE_GE_65');
184                             removeCSSClass(document.documentElement,'PATRON_AGE_LT_65');
185                             removeCSSClass(document.documentElement,'PATRON_AGE_GE_24');
186                             removeCSSClass(document.documentElement,'PATRON_AGE_LT_24');
187                             removeCSSClass(document.documentElement,'PATRON_AGE_GE_21');
188                             removeCSSClass(document.documentElement,'PATRON_AGE_LT_21');
189                             removeCSSClass(document.documentElement,'PATRON_AGE_GE_18');
190                             removeCSSClass(document.documentElement,'PATRON_AGE_LT_18');
191                             removeCSSClass(document.documentElement,'PATRON_AGE_GE_13');
192                             removeCSSClass(document.documentElement,'PATRON_AGE_LT_13');
193                             removeCSSClass(document.documentElement,'PATRON_NET_ACCESS_1');
194                             removeCSSClass(document.documentElement,'PATRON_NET_ACCESS_2');
195                             removeCSSClass(document.documentElement,'PATRON_NET_ACCESS_3');
196                         }
197                     ],
198                     'cmd_patron_refresh' : [
199                         ['command'],
200                         function(ev) {
201                             try { document.getElementById("PatronNavBarScrollbox").ensureElementIsVisible( document.getElementById("PatronNavBar_refresh" ) ); } catch(E) {};
202                             obj.refresh_all();
203                         }
204                     ],
205                     'cmd_patron_checkout' : [
206                         ['command'],
207                         function(ev) {
208                             obj.reset_nav_styling('cmd_patron_checkout');
209                             obj.spawn_checkout_interface();
210                         }
211                     ],
212                     'cmd_patron_items' : [
213                         ['command'],
214                         function(ev) {
215                             try { document.getElementById("PatronNavBarScrollbox").ensureElementIsVisible( document.getElementById("PatronNavBar_items" ) ); } catch(E) {};
216                             obj.reset_nav_styling('cmd_patron_items');
217                             var frame = obj.right_deck.set_iframe(
218                                 urls.XUL_PATRON_ITEMS,
219                                 {},
220                                 {
221                                     'patron_id' : obj.patron.id(),
222                                     'on_list_change' : function(b) {
223                                         obj.summary_window.g.summary.controller.render('patron_checkouts');
224                                         obj.summary_window.g.summary.controller.render('patron_standing_penalties');
225                                         obj.summary_window.g.summary.controller.render('patron_bill');
226                                         if (obj.bill_window) {
227                                             obj.bill_window.refresh(true);
228                                         }
229                                     },
230                                     'url_prefix' : function(url,secure) { return xulG.url_prefix(url,secure); },
231                                     'get_new_session' : function(a) { return xulG.get_new_session(a); },
232                                     'new_tab' : function(a,b,c) { return xulG.new_tab(a,b,c); },
233                                     'new_patron_tab' : function(a,b) { return xulG.new_patron_tab(a,b); }
234                                 }
235                             );
236                             obj.items_window = get_contentWindow(frame);
237                         }
238                     ],
239                     'cmd_patron_edit' : [
240                         ['command'],
241                         function(ev) {
242                                 try { document.getElementById("PatronNavBarScrollbox").ensureElementIsVisible( document.getElementById("PatronNavBar_edit" ) ); } catch(E) {};
243                                 obj.reset_nav_styling('cmd_patron_edit');
244
245                                 function spawn_search(s) {
246                                     obj.error.sdump('D_TRACE', 'Editor would like to search for: ' + js2JSON(s)); 
247                                     obj.OpenILS.data.stash_retrieve();
248                                     xulG.new_patron_tab( {}, { 'doit' : 1, 'query' : js2JSON(s) } );
249                                 }
250
251                                 function spawn_editor(p) {
252                                     var url = urls.XUL_PATRON_EDIT;
253                                     var loc = xulG.url_prefix('XUL_REMOTE_BROWSER');
254                                     xulG.new_tab(
255                                         loc, 
256                                         {}, 
257                                         { 
258                                             'url' : url,
259                                             'show_print_button' : true , 
260                                             'tab_name' : $("patronStrings").getString('staff.patron.display.spawn_editor.editing_related_patron'),
261                                             'passthru_content_params' : {
262                                                 'spawn_search' : spawn_search,
263                                                 'spawn_editor' : spawn_editor,
264                                                 'url_prefix' : function(url,secure) { return xulG.url_prefix(url,secure); },
265                                                 'get_new_session' : function(a) { return xulG.get_new_session(a); },
266                                                 'new_tab' : function(a,b,c) { return xulG.new_tab(a,b,c); },
267                                                 'new_patron_tab' : function(a,b) { return xulG.new_patron_tab(a,b); },
268                                                 'params' : p,
269                                                 'on_save' : function(p_obj) {
270                                                     JSAN.use('patron.util');
271                                                     patron.util.work_log_patron_edit(p_obj);
272                                                 }
273                                             },
274                                             'lock_tab' : function() { return xulG.lock_tab(); },
275                                             'unlock_tab' : function() { return xulG.unlock_tab(); }
276                                         }
277                                     );
278                                 }
279
280                             obj.right_deck.set_iframe(
281                                 urls.XUL_REMOTE_BROWSER + '?patron_edit=1',
282                                 {}, {
283                                     'url' : urls.XUL_PATRON_EDIT,
284                                     'show_print_button' : true,
285                                     'passthru_content_params' : {
286                                         'params' : {
287                                             'ses' : ses(),
288                                             'usr' : obj.patron.id()
289                                         },
290                                         'on_save' : function(p) {
291                                             try {
292                                                 JSAN.use('patron.util'); 
293                                                 patron.util.work_log_patron_edit(p);
294                                                 if (obj.barcode) obj.barcode = p.card().barcode();
295                                                 //obj.summary_window.g.summary.retrieve();
296                                                 obj.refresh_all();
297                                             } catch(E) {
298                                                 alert(E);
299                                             }
300                                         },
301                                         'spawn_search' : spawn_search,
302                                         'spawn_editor' : spawn_editor,
303                                         'url_prefix' : function(url,secure) { return xulG.url_prefix(url,secure); },
304                                         'get_new_session' : function(a) { return xulG.get_new_session(a); },
305                                         'new_tab' : function(a,b,c) { return xulG.new_tab(a,b,c); },
306                                         'new_patron_tab' : function(a,b) { return xulG.new_patron_tab(a,b); }
307                                     },
308                                     'lock_tab' : function() { return xulG.lock_tab(); },
309                                     'unlock_tab' : function() { return xulG.unlock_tab(); }
310                                 }
311                             );
312                         }
313                     ],
314                     'cmd_patron_other' : [
315                         ['command'],
316                         function(ev) {
317                             try { document.getElementById("PatronNavBarScrollbox").ensureElementIsVisible( document.getElementById("PatronNavBar_other" ) ); } catch(E) {};
318                             obj.reset_nav_styling('cmd_patron_other');
319                             try { document.getElementById('PatronNavBar_other').firstChild.showPopup(); } catch(E) {};
320                         }
321                     ],
322                     'cmd_patron_info_notes' : [
323                         ['command'],
324                         function(ev) {
325                             obj.right_deck.set_iframe(
326                                 urls.XUL_PATRON_INFO_NOTES,
327                                 {},
328                                 {
329                                     'patron_id' : obj.patron.id(),
330                                     'url_prefix' : function(url,secure) { return xulG.url_prefix(url,secure); },
331                                     'get_new_session' : function(a) { return xulG.get_new_session(a); },
332                                     'new_tab' : function(a,b,c) { return xulG.new_tab(a,b,c); },
333                                     'new_patron_tab' : function(a,b) { return xulG.new_patron_tab(a,b); }
334                                 }
335                             );
336                         }
337                     ],
338                     'cmd_patron_info_triggered_events' : [
339                         ['command'],
340                         function(ev) {
341                             obj.right_deck.set_iframe(
342                                 xulG.url_prefix(urls.XUL_REMOTE_BROWSER) + '?triggered_events',
343                                 {},
344                                 {
345                                     'url': urls.EG_TRIGGER_EVENTS + "?patron_id=" + obj.patron.id(),
346                                     'show_print_button': false,
347                                     'show_nav_buttons': false
348                                 }
349                             );
350                         }
351                     ],
352                     'cmd_patron_message_center' : [
353                         ['command'],
354                         function(ev) {
355                             obj.right_deck.set_iframe(
356                                 xulG.url_prefix(urls.XUL_REMOTE_BROWSER) + '?message_center',
357                                 {},
358                                 {
359                                     'url': urls.EG_PATRON_MESSAGE_CENTER + "/" + obj.patron.id(),
360                                     'show_print_button': false,
361                                     'show_nav_buttons': false
362                                 }
363                             );
364                         }
365                     ],
366                     'cmd_patron_info_stats' : [
367                         ['command'],
368                         function(ev) {
369                             obj.right_deck.set_iframe(
370                                 urls.XUL_PATRON_INFO_STAT_CATS,
371                                 {},
372                                 {
373                                     'patron_id' : obj.patron.id(),
374                                     'url_prefix' : function(url,secure) { return xulG.url_prefix(url,secure); },
375                                     'get_new_session' : function(a) { return xulG.get_new_session(a); },
376                                     'new_tab' : function(a,b,c) { return xulG.new_tab(a,b,c); },
377                                     'new_patron_tab' : function(a,b) { return xulG.new_patron_tab(a,b); }
378                                 }
379                             );
380                         }
381                     ],
382                     'cmd_patron_info_surveys' : [
383                         ['command'],
384                         function(ev) {
385                             obj.right_deck.set_iframe(
386                                 urls.XUL_PATRON_INFO_SURVEYS,
387                                 {},
388                                 {
389                                     'patron_id' : obj.patron.id(),
390                                     'url_prefix' : function(url,secure) { return xulG.url_prefix(url,secure); },
391                                     'get_new_session' : function(a) { return xulG.get_new_session(a); },
392                                     'new_tab' : function(a,b,c) { return xulG.new_tab(a,b,c); },
393                                     'new_patron_tab' : function(a,b) { return xulG.new_patron_tab(a,b); }
394                                 }
395                             );
396                         }
397                     ],
398                     'cmd_patron_info_acq_requests' : [
399                         ['command'],
400                         function(ev) {
401                             obj.right_deck.set_iframe(
402                                 urls.EG_ACQ_USER_REQUESTS + '?usr=' + obj.patron.id(),
403                                 {},
404                                 {
405                                     'get_barcode' : function(a,b,c) { return xulG.get_barcode(a,b,c); },
406                                     'get_barcode_and_settings' : function(a,b,c) { return xulG.get_barcode_and_settings(a,b,c); }
407                                 }
408                             );
409                         }
410                     ],
411
412                     'cmd_patron_info_groups' : [
413                         ['command'],
414                         function(ev) {
415                             obj.spawn_group_interface();
416                         }
417                     ],
418                     'cmd_patron_alert' : [
419                         ['command'],
420                         function(ev) {
421                             if (obj.msg_url) {
422                                 obj.right_deck.set_iframe('data:text/html;charset=UTF-8,'+obj.msg_url,{},{});
423                             } else {
424                                 obj.right_deck.set_iframe('data:text/html;charset=UTF-8,<h1>' + $("patronStrings").getString('staff.patron.display.no_alerts_or_messages') + '</h1>',{},{});
425                             }
426                         }
427                     ],
428                     'cmd_patron_reservation' : [
429                         ['command'],
430                         function(ev) {
431                             openils.XUL.newTabEasy(
432                                 "BOOKING_RESERVATION",
433                                 $("offlineStrings").getString(
434                                     "menu.cmd_booking_reservation.tab"
435                                 ), {
436                                     "bresv_interface_opts": {
437                                         "patron_barcode":
438                                             obj.patron.card().barcode()
439                                     }
440                                 },
441                                 true
442                             );
443                         }
444                     ],
445                     'cmd_patron_reservation_pickup' : [
446                         ['command'],
447                         function(ev) {
448                             openils.XUL.newTabEasy(
449                                 "BOOKING_PICKUP",
450                                 $("offlineStrings").getString(
451                                     "menu.cmd_booking_reservation_pickup.tab"
452                                 ), {
453                                     "bresv_interface_opts": {
454                                         "patron_barcode":
455                                             obj.patron.card().barcode()
456                                     }
457                                 },
458                                 true
459                             );
460                         }
461                     ],
462                     'cmd_patron_reservation_return' : [
463                         ['command'],
464                         function(ev) {
465                             openils.XUL.newTabEasy(
466                                 "BOOKING_RETURN",
467                                 $("offlineStrings").getString(
468                                     "menu.cmd_booking_reservation_return.tab"
469                                 ), {
470                                     "bresv_interface_opts": {
471                                         "patron_barcode":
472                                             obj.patron.card().barcode()
473                                     }
474                                 },
475                                 true
476                             );
477                         }
478                     ],
479                     'cmd_patron_exit' : [
480                         ['command'],
481                         function(ev) {
482                             xulG.set_tab(urls.XUL_PATRON_BARCODE_ENTRY,{},{});
483                         }
484                     ],
485                     'cmd_patron_holds' : [
486                         ['command'],
487                         function(ev) {
488                             try {
489                                 try { document.getElementById("PatronNavBarScrollbox").ensureElementIsVisible( document.getElementById("PatronNavBar_holds" ) ); } catch(E) {};
490                                 obj.reset_nav_styling('cmd_patron_holds');
491                                 obj.right_deck.set_iframe(
492                                     urls.XUL_PATRON_HOLDS,    
493                                     {},
494                                     {
495                                         'display_window' : window,
496                                         'patron_id' : obj.patron.id(),
497                                         'patron_barcode' : obj.patron.card().barcode(),
498                                         'on_list_change' : function(h) {
499                                             try {
500                                                 obj.summary_window.g.summary.controller.render('patron_holds');
501                                             } catch(E) {
502                                                 alert(E);
503                                             }
504                                         },
505                                         'url_prefix' : function(url,secure) { return xulG.url_prefix(url,secure); },
506                                         'get_new_session' : function(a) { return xulG.get_new_session(a); },
507                                         'new_tab' : function(a,b,c) { return xulG.new_tab(a,b,c); },
508                                         'new_patron_tab' : function(a,b) { return xulG.new_patron_tab(a,b); },
509                                         'get_barcode' : function(a,b,c) { return xulG.get_barcode(a,b,c); },
510                                         'get_barcode_and_settings' : function(a,b,c) { return xulG.get_barcode_and_settings(a,b,c); }
511                                     }
512                                 );
513                             } catch(E) {
514                                 alert(E);
515                             }
516                         }
517                     ],
518                     'cmd_patron_bills' : [
519                         ['command'],
520                         function(ev) {
521                             try { document.getElementById("PatronNavBarScrollbox").ensureElementIsVisible( document.getElementById("PatronNavBar_bills" ) ); } catch(E) {};
522                             obj.reset_nav_styling('cmd_patron_bills');
523                             var f = obj.right_deck.set_iframe(
524                                 urls.XUL_PATRON_BILLS,
525                                 {},
526                                 {
527                                     'display_window' : window,
528                                     'patron_id' : obj.patron.id(),
529                                     'url_prefix' : function(url,secure) { return xulG.url_prefix(url,secure); },
530                                     'get_new_session' : function(a) { return xulG.get_new_session(a); },
531                                     'new_tab' : function(a,b,c) { return xulG.new_tab(a,b,c); },
532                                     'on_money_change' : function(b) {
533                                         obj.summary_window.g.summary.controller.render('patron_standing_penalties');
534                                         obj.summary_window.g.summary.controller.render('patron_bill');
535                                         obj.summary_window.refresh();
536                                     }
537                                 }
538                             );
539                             obj.bill_window = get_contentWindow(f);
540                         }
541                     ],
542                     'patron_name' : [
543                         ['render'],
544                         function(e) {
545                             return function() { 
546                                 JSAN.use('patron.util'); 
547                                 e.setAttribute('value',
548                                     patron.util.format_name( obj.patron )
549                                 );
550                                 patron.util.set_penalty_css(obj.patron);
551                                 var tooltiptext = $("patronStrings").getFormattedString(
552                                     'staff.patron.display.db_data',
553                                     [
554                                         obj.patron.id(),
555                                         obj.patron.create_date(),
556                                         obj.patron.last_update_time()
557                                             ? obj.patron.last_update_time()
558                                             : ''
559                                     ]
560                                 );
561                                 e.setAttribute('tooltiptext',tooltiptext);
562                                 e.setAttribute('onclick','try { copy_to_clipboard(event); } catch(E) { alert(E); }');
563                             };
564                         }
565                     ],
566                     'PatronNavBar' : [
567                         ['render'],
568                         function(e) {
569                             return function() {}
570                         }
571                     ],
572                     'cmd_verify_credentials' : [
573                         ['command'],
574                         function() {
575                             var vframe = obj.right_deck.reset_iframe(
576                                 urls.XUL_VERIFY_CREDENTIALS,
577                                 {},
578                                 {
579                                     'barcode' : obj.patron.card().barcode(),
580                                     'usrname' : obj.patron.usrname()
581                                 }
582                             );
583                         } 
584                     ],
585                     'cmd_perm_editor' : [
586                         ['command'],
587                         function() {
588                              var frame = obj.right_deck.reset_iframe( urls.XUL_USER_PERM_EDITOR + '?ses=' + window.encodeURIComponent(ses()) + '&usr=' + obj.patron.id(), {}, {});
589                         }
590                     ],
591                     'cmd_standing_penalties' : [
592                         ['command'],
593                         function() {
594                             function penalty_interface() {
595                                 try { document.getElementById("PatronNavBarScrollbox").ensureElementIsVisible( document.getElementById("PatronNavBar_messages" ) ); } catch(E) {};
596                                 obj.reset_nav_styling('cmd_standing_penalties');
597                                 return obj.right_deck.set_iframe(
598                                     urls.XUL_STANDING_PENALTIES,
599                                     {},
600                                     {
601                                         'patron' : obj.patron,
602                                         'refresh' : function() { 
603                                             obj.refresh_all(); 
604                                         }
605                                     }
606                                 );
607                             }
608                             penalty_interface();
609                         } 
610                     ]
611                 }
612             }
613         );
614
615         var make_listener = function(xx) {
616             return function() { 
617                 try { document.getElementById("PatronNavBarScrollbox").ensureElementIsVisible(xx); } catch(E) {}; 
618             }
619         };
620
621         
622         var need_focus_listeners = [
623             'PatronNavBar_checkout', 'PatronNavBar_refresh', 'PatronNavBar_items', 'PatronNavBar_holds',
624             'PatronNavBar_other', 'PatronNavBar_edit', 'PatronNavBar_bills', 'PatronNavBar_messages'
625         ];
626         for (var i = 0; i < need_focus_listeners.length; i++) {
627             var elementID = need_focus_listeners[i];
628             var x = document.getElementById(elementID);
629             obj.event_listeners.add(x, 'focus', make_listener(x), false);
630         }
631
632         if (obj.barcode || obj.id) {
633             if (typeof window.xulG == 'object' && typeof window.xulG.set_tab_name == 'function') {
634                 try { window.xulG.set_tab_name($("patronStrings").getString('staff.patron.display.init.retrieving_patron')); } catch(E) { alert(E); }
635             }
636
637             var displayClickies = document.getElementById("pdm2hb1a").getElementsByTagName("label");
638             for (var i = 0; i < displayClickies.length; i++) {
639                 if (displayClickies[i].getAttribute('command')) {
640                     displayClickies[i].setAttribute('onclick', 'this.doCommand();');
641                 }
642             }
643
644             obj.controller.view.PatronNavBar.selectedIndex = 1;
645             JSAN.use('util.widgets'); 
646             util.widgets.enable_accesskeys_in_node_and_children(
647                 obj.controller.view.PatronNavBar.lastChild
648             );
649             util.widgets.disable_accesskeys_in_node_and_children(
650                 obj.controller.view.PatronNavBar.firstChild
651             );
652             obj.controller.view.cmd_patron_refresh.setAttribute('disabled','true');
653             obj.controller.view.cmd_patron_checkout.setAttribute('disabled','true');
654             obj.controller.view.cmd_patron_items.setAttribute('disabled','true');
655             obj.controller.view.cmd_patron_holds.setAttribute('disabled','true');
656             obj.controller.view.cmd_patron_bills.setAttribute('disabled','true');
657             obj.controller.view.cmd_patron_edit.setAttribute('disabled','true');
658             obj.controller.view.patron_name.setAttribute('value', $("patronStrings").getString('staff.patron.display.init.retrieving'));
659             document.documentElement.setAttribute('class','');
660             var frame = obj.left_deck.set_iframe(
661                 urls.XUL_PATRON_SUMMARY,
662                 {},
663                 {
664                     'display_window' : window,
665                     'barcode' : obj.barcode,
666                     'id' : obj.id,
667                     'refresh' : function() { obj.refresh_all(); },
668                     'on_finished' : obj.gen_patron_summary_finish_func(params),
669                     'stop_sign_page' : obj.gen_patron_stop_sign_page_func(),
670                     'spawn_group_interface' : function() { obj.spawn_group_interface(); },
671                     'new_patron_tab' : function(a,b) { return xulG.new_patron_tab(a,b); },
672                     'new_tab' : function(a,b,c) { return xulG.new_tab(a,b,c); },
673                     'set_tab' : function(a,b,c) { return xulG.set_tab(a,b,c); },
674                     'on_error' : function(E) {
675                         try {
676                             var error;
677                             if (typeof E.ilsevent != 'undefined') {
678                                 error = E.textcode;
679                             } else {
680                                 error = js2JSON(E).substr(0,100);
681                             }
682                             xulG.set_tab(urls.XUL_PATRON_BARCODE_ENTRY + '?error=' + window.encodeURIComponent(error),{},{});
683                         } catch(F) {
684                             alert(F);
685                         }
686                     }
687                 }
688             );
689             obj.summary_window = get_contentWindow(frame);
690
691         } else {
692             obj.render_search_form(params);
693         }
694     },
695
696     'cleanup' : function( params ) {
697         var obj = this;
698         delete obj.search_result;
699         delete obj.search_window;
700         delete obj.patron;
701         delete obj.items_window;
702         delete obj.summary_window;
703         delete obj.checkout_window;
704         obj.controller.cleanup();
705         obj.event_listeners.removeAll();
706     },
707
708     'reset_nav_styling' : function(btn,dont_hide_summary) {
709         try {
710             if (!dont_hide_summary) { dont_hide_summary = false; }
711             if (this.skip_hide_summary) {
712                 this.skip_hide_summary = false;
713                 dont_hide_summary = true;
714             }
715             var buttons = document.getElementsByTagName('button');
716             for(var i = 0; i < buttons.length; i++) {
717                 var command = buttons[i].getAttribute('command');
718                 if(command == btn) buttons[i].setAttribute('style','background: blue; color: white;');
719                 else buttons[i].setAttribute('style','');
720             }
721             var auto_hide_patron_sidebar = String( this.OpenILS.data.hash.aous['circ.auto_hide_patron_summary'] ) == 'true';
722             var x = document.getElementById('splitter_grippy'); 
723             if (x && auto_hide_patron_sidebar && ! dont_hide_summary) {
724                 if (! this.summary_hidden_once_already ) {
725                     var first_deck = x.parentNode.previousSibling;
726                     if (! first_deck.collapsed) x.doCommand();
727                     this.summary_hidden_once_already = true;
728                 }
729             }
730         } catch(E) {
731             alert(E);
732         }
733     },
734
735     'render_search_form' : function(params) {
736         var obj = this;
737             if (typeof window.xulG == 'object' && typeof window.xulG.set_tab_name == 'function') {
738                 try { window.xulG.set_tab_name($("patronStrings").getString('staff.patron.display.render_search_form.patron_search')); } catch(E) { alert(E); }
739             }
740
741             obj.controller.view.PatronNavBar.selectedIndex = 0;
742             obj.controller.view.cmd_patron_retrieve.setAttribute('disabled','true');
743             obj.controller.view.cmd_patron_merge.setAttribute('disabled','true');
744             obj.controller.view.cmd_search_form.setAttribute('disabled','true');
745
746             var horizontal_interface = String( obj.OpenILS.data.hash.aous['ui.circ.patron_summary.horizontal'] ) == 'true';
747             var loc = horizontal_interface ? urls.XUL_PATRON_HORIZONTAL_SEARCH_FORM : urls.XUL_PATRON_SEARCH_FORM; 
748             var my_xulG = {
749                 'clear_left_deck' : function() {
750                     setTimeout( function() {
751                         obj.left_deck.clear_all_except(loc);
752                         obj.render_search_form(params);
753                     }, 0);
754                 },
755                 'on_submit' : function(query,search_limit,search_sort) {
756                     obj.controller.view.cmd_patron_retrieve.setAttribute('disabled','true');
757                     obj.controller.view.cmd_patron_merge.setAttribute('disabled','true');
758                     var list_frame = obj.right_deck.reset_iframe(
759                         urls.XUL_PATRON_SEARCH_RESULT, // + '?' + query,
760                         {},
761                         {
762                             'query' : query,
763                             'search_limit' : search_limit,
764                             'search_sort' : search_sort,
765                             'on_dblclick' : function(list) {
766                                 JSAN.use('util.widgets');
767                                 util.widgets.dispatch('command','cmd_patron_retrieve')
768                             },
769                             'on_select' : function(list) {
770                                 if (!list) return;
771                                 if (list.length < 1) return;
772                                 obj.controller.view.cmd_patron_retrieve.setAttribute('disabled','false');
773                                 if (list.length > 1) obj.controller.view.cmd_patron_merge.setAttribute('disabled','false');
774                                 obj.controller.view.cmd_search_form.setAttribute('disabled','false');
775                                 obj.retrieve_ids = list;
776                                 obj.controller.view.patron_name.setAttribute('value',$("patronStrings").getString('staff.patron.display.init.retrieving'));
777                                 document.documentElement.setAttribute('class','');
778                                 setTimeout(
779                                     function() {
780                                         var frame = obj.left_deck.set_iframe(
781                                             urls.XUL_PATRON_SUMMARY + '?id=' + window.encodeURIComponent(list[0]),
782                                             {},
783                                             {
784                                                 //'id' : list[0],
785                                                 'spawn_group_interface' : function() { obj.spawn_group_interface(); },
786                                                 'new_patron_tab' : function(a,b) { return xulG.new_patron_tab(a,b); },
787                                                 'new_tab' : function(a,b,c) { return xulG.new_tab(a,b,c); },
788                                                 'set_tab' : function(a,b,c) { return xulG.set_tab(a,b,c); },
789                                                 'on_finished' : function(patron) {
790                                                     obj.patron = patron;
791                                                     obj.controller.render();
792                                                 }
793                                             }
794                                         );
795                                         obj.summary_window = get_contentWindow(frame);
796                                         obj.patron = obj.summary_window.g.summary.patron;
797                                         obj.controller.render('patron_name');
798                                     }, 0
799                                 );
800                             }
801                         }
802                     );
803                     obj.search_result = get_contentWindow(list_frame);
804                 }
805             };
806
807             if (params['query']) {
808                 my_xulG.query = JSON2js(params['query']);
809                 if (params.doit) my_xulG.doit = 1;
810             }
811
812             var form_frame = obj.left_deck.set_iframe(
813                 loc,
814                 {},
815                 my_xulG
816             );
817             obj.search_window = get_contentWindow(form_frame);
818             obj._already_defaulted_once = true;
819     },
820
821     '_already_defaulted_once' : false,
822
823     'refresh_deck' : function(url) {
824         var obj = this;
825         for (var i = 0; i < obj.right_deck.node.childNodes.length; i++) {
826             try {
827                 var f = obj.right_deck.node.childNodes[i];
828                 var w = get_contentWindow(f);
829                 if (url) {
830                     if (w.location.href == url) w.refresh(true);
831                 } else {
832                     if (typeof w.refresh == 'function') {
833                         w.refresh(true);
834                     }
835                 }
836
837             } catch(E) {
838                 obj.error.sdump('D_ERROR','refresh_deck: ' + E + '\n');
839             }
840         }
841     },
842     
843     'refresh_all' : function() {
844         var obj = this;
845         obj.controller.view.patron_name.setAttribute('value', $("patronStrings").getString('staff.patron.display.init.retrieving'));
846         document.documentElement.setAttribute('class','');
847         obj.network.simple_request(
848             'RECALCULATE_STANDING_PENALTIES',
849             [ ses(), obj.patron.id() ]
850         );
851         try { obj.summary_window.refresh(); } catch(E) { obj.error.sdump('D_ERROR', E + '\n'); }
852         try { obj.refresh_deck(); } catch(E) { obj.error.sdump('D_ERROR', E + '\n'); }
853     },
854
855     'spawn_checkout_interface' : function() {
856         var obj = this;
857         try {
858             try { document.getElementById("PatronNavBarScrollbox").ensureElementIsVisible( document.getElementById("PatronNavBar_checkout" ) ); } catch(E) {};
859             obj.reset_nav_styling('cmd_patron_checkout',true);
860             var frame = obj.right_deck.set_iframe(
861                 urls.XUL_CHECKOUT,
862                 {},
863                 { 
864                     'set_tab' : function(a,b,c) { return xulG.set_tab(a,b,c); },
865                     'patron_id' : obj.patron.id(),
866                     'patron' : obj.patron,
867                     'check_stop_checkouts' : function() { return obj.check_stop_checkouts(); },
868                     'on_list_change_old' : function(checkout) {
869                         var x = obj.summary_window.g.summary.controller.view.patron_checkouts;
870                         var n = Number(x.getAttribute('value'));
871                         x.setAttribute('value',n+1);
872                     },
873                     'on_list_change' : function(checkout,is_renewal) {
874                         // Downside here: an extra network call, open-ils.actor.user.checked_out.count.authoritative
875                         obj.summary_window.g.summary.controller.render('patron_checkouts');
876                         obj.summary_window.g.summary.controller.render('patron_standing_penalties');
877
878                         /* this stops noncats from getting pushed into Items Out */
879                         if (!checkout.circ.id()) return;
880
881                         if (obj.items_window) {
882                             if (is_renewal) {
883                                 var original_circ_id = obj.items_window.g.items.list_circ_map_by_copy[ checkout.circ.target_copy() ];
884                                 obj.items_window.g.items.list_circ_map[ original_circ_id ].row.my.circ = checkout.circ;
885                                 obj.items_window.g.items.list_circ_map[ checkout.circ.id() ] =
886                                     obj.items_window.g.items.list_circ_map[ original_circ_id ];
887                                 obj.items_window.g.items.refresh( checkout.circ.id() );
888                             } else {
889                                 var nparams = obj.items_window.g.items.list.append(
890                                     {
891                                         'row' : {
892                                             'my' : {
893                                                 'circ_id' : checkout.circ.id()
894                                             }
895                                         },
896                                         'to_bottom' : true
897                                     }
898                                 )
899                                 obj.items_window.g.items.list_circ_map[ checkout.circ.id() ] = nparams;
900                                 obj.items_window.g.items.list_circ_map_by_copy[ checkout.circ.target_copy() ] = checkout.circ.id();
901                             }
902                         }
903                     },
904                     'get_barcode' : xulG.get_barcode,
905                     'get_barcode_and_settings' : xulG.get_barcode_and_settings,
906                     'url_prefix' : xulG.url_prefix,
907                     'set_statusbar' : xulG.set_statusbar
908                 }
909             );
910             obj.checkout_window = get_contentWindow(frame);
911         } catch(E) {
912             alert('Error in spawn_checkout_interface(): ' + E);
913         }
914     },
915
916     'gen_patron_summary_finish_func' : function(display_params) {
917         var obj = this;
918
919         return function(patron,params) {
920             try {
921                 obj.patron = patron; obj.controller.render();
922
923                 obj.controller.view.cmd_patron_refresh.setAttribute('disabled','false');
924                 obj.controller.view.cmd_patron_checkout.setAttribute('disabled','false');
925                 obj.controller.view.cmd_patron_items.setAttribute('disabled','false');
926                 obj.controller.view.cmd_patron_holds.setAttribute('disabled','false');
927                 obj.controller.view.cmd_patron_bills.setAttribute('disabled','false');
928                 obj.controller.view.cmd_patron_edit.setAttribute('disabled','false');
929
930                 if (typeof window.xulG == 'object' && typeof window.xulG.set_tab_name == 'function') {
931                     try { 
932                         window.xulG.set_tab_name(
933                             $("patronStrings").getString('staff.patron.display.tab_name')
934                                 + ' ' + patron.family_name() + ', ' + patron.first_given_name() + ' ' 
935                                 + (patron.second_given_name() ? patron.second_given_name() : '' ) 
936                         ); 
937                     } catch(E) { 
938                         obj.error.sdump('D_ERROR',E);
939                     }
940                 }
941
942                 if (!obj._already_defaulted_once) {
943                     obj._already_defaulted_once = true;
944                     if (display_params['show']) {
945                         setTimeout(
946                             function() {
947                                 switch(display_params['show']) {
948                                     case 'bills' : util.widgets.dispatch('command','cmd_patron_bills'); break;
949                                 }
950                             },
951                             0
952                         );
953                     } else {
954                         obj.spawn_checkout_interface();
955                     }
956                 }
957
958                 if (obj.stop_checkouts && obj.checkout_window) {
959                     setTimeout( function() {
960                         try {
961                             obj.checkout_window.g.checkout.check_disable();
962                         } catch(E) { }
963                     }, 1000);
964                 }
965                             
966             } catch(E) {
967                 alert('Error in patron_summary_finish_func(): ' + E);
968             }
969         };
970     },
971
972     'gen_patron_stop_sign_page_func' : function() {
973         var obj = this;
974         // FIXME - replace this generated "stop sign" page with a dedicated XUL file or template
975         return function(patron,params) {
976             try {
977                 obj._already_defaulted_once = true;
978                 var msg = ''; obj.stop_checkouts = false;
979                 if (patron.alert_message())
980                     msg += $("patronStrings").getFormattedString('staff.patron.display.init.network_request.alert_message', [(patron.alert_message()).replace(/</g,'&lt;').replace(/>/g,'&gt;')]) + '<br/><br/>';
981                 //alert('obj.barcode = ' + obj.barcode);
982                 if (obj.barcode) {
983                     if (patron.cards()) for (var i = 0; i < patron.cards().length; i++) {
984                         //alert('card #'+i+' == ' + js2JSON(patron.cards()[i]));
985                         if ( (patron.cards()[i].barcode()==obj.barcode) && ( ! get_bool(patron.cards()[i].active()) ) ) {
986                             msg += $("patronStrings").getString('staff.patron.display.init.network_request.inactive_card') + '<br/><br/>';
987                             obj.stop_checkouts = true;
988                         }
989                     }
990                 }
991                 if (get_bool(patron.barred())) {
992                     msg += $("patronStrings").getString('staff.patron.display.init.network_request.account_barred') + '<br/><br/>';
993                     obj.stop_checkouts = true;
994                 }
995                 if (!get_bool(patron.active())) {
996                     msg += $("patronStrings").getString('staff.patron.display.init.network_request.account_inactive') + '<br/><br/>';
997                     obj.stop_checkouts = true;
998                 }
999                 if (patron.expire_date()) {
1000                     var now = new Date();
1001                     now = now.getTime()/1000;
1002
1003                     var expire_parts = patron.expire_date().substr(0,10).split('-');
1004                     expire_parts[1] = expire_parts[1] - 1;
1005
1006                     var expire = new Date();
1007                     expire.setFullYear(expire_parts[0], expire_parts[1], expire_parts[2]);
1008                     expire = expire.getTime()/1000
1009
1010                     var preexpire = new Date();
1011                     var preexpire_value;
1012                     var preexpire_setting = obj.OpenILS.data.hash.aous['circ.patron_expires_soon_warning'];
1013                     if (preexpire_setting) {
1014                         if (typeof preexpire_setting == "string") { 
1015                             preexpire_value = parseInt(preexpire_setting);  
1016                         } else {
1017                             preexpire_value = preexpire_setting;
1018                         }
1019                         preexpire.setDate(preexpire.getDate() + preexpire_value);
1020                     }
1021                     preexpire = preexpire.getTime()/1000;
1022
1023                     if (expire < now) {
1024                         msg += $("patronStrings").getString('staff.patron.display.init.network_request.account_expired') + '<br/><br/>';
1025                         obj.stop_checkouts = true;
1026                     } else if (expire < preexpire && preexpire_setting) {
1027                         msg += $("patronStrings").getString('staff.patron.display.init.network_request.account_expire_soon') + '<br/><br/>';
1028                     }
1029                 }
1030                 var penalties = patron.standing_penalties();
1031                 if (!penalties) { penalties = []; }
1032                 var dl_flag_opened = false;
1033                 for (var i = 0; i < penalties.length; i++) {
1034                     if (get_bool(penalties[i].standing_penalty().staff_alert())) {
1035                         if (!dl_flag_opened) {
1036                             msg += '<dl>';
1037                             dl_flag_opened = true;
1038                         }
1039                         msg += '<dt>';
1040                         msg += (obj.OpenILS.data.hash.aou[ penalties[i].org_unit() ].shortname() + ' : ' + penalties[i].standing_penalty().label()).replace(/</g,'&lt;').replace(/>/g,'&gt;') + '<br/>';
1041                         msg += '</dt><dd>';
1042                         msg += ((penalties[i].note())?penalties[i].note():'').replace(/</g,'&lt;').replace(/>/g,'&gt;');
1043                         msg += '</dd>';
1044                     }
1045                 }
1046                 if (dl_flag_opened) { msg += '</dl>'; }
1047                 var holds = params.holds_summary;
1048                 if (holds.ready && holds.ready > 0) {
1049                     msg += $("patronStrings").getFormattedString('staff.patron.display.init.holds_ready', [holds.ready]);
1050                 }
1051                 if (msg) {
1052                     if (msg != obj.old_msg) {
1053                         //obj.error.yns_alert(msg,'Alert Message','OK',null,null,'Check here to confirm this message.');
1054                         document.documentElement.firstChild.focus();
1055                         var data_url = window.encodeURIComponent("<img src='" + xulG.url_prefix('/xul/server/skin/media/images/stop_sign.png') + "'/>" + '<h1>'
1056                             + $("patronStrings").getString('staff.patron.display.init.network_request.window_title') + '</h1><blockquote><p>' + msg + '</p>\r\n\r\n<pre>'
1057                             + $("patronStrings").getString('staff.patron.display.init.network_request.window_message') + '</pre></blockquote>');
1058                         obj.right_deck.set_iframe('data:text/html;charset=UTF-8,'+data_url,{},{});
1059                         obj.old_msg = msg;
1060                         obj.msg_url = data_url;
1061                     } else {
1062                         obj.error.sdump('D_TRACE',$("patronStrings").getFormattedString('staff.patron.display.init.network_request.dump_error_message', [msg]));
1063                     }
1064                 }
1065             } catch(E) {
1066                 alert('Error in patron_stop_sign_page_func(): ' + E);
1067             }
1068         };
1069     },
1070
1071     'spawn_group_interface' : function() {
1072         var obj = this;
1073         try {
1074             obj.right_deck.set_iframe(
1075                 urls.XUL_PATRON_INFO_GROUP,
1076                 {},
1077                 {
1078                     'patron_id' : obj.patron.id(),
1079                     'url_prefix' : function(url,secure) { return xulG.url_prefix(url,secure); },
1080                     'get_new_session' : function(a) { return xulG.get_new_session(a); },
1081                     'new_tab' : function(a,b,c) { return xulG.new_tab(a,b,c); },
1082                     'new_patron_tab' : function(a,b) { return xulG.new_patron_tab(a,b); }
1083                 }
1084             );
1085         } catch(E) {
1086             alert('Error in display.js, spawn_group_interface(): ' + E);
1087         }
1088     }
1089
1090 }
1091
1092 dump('exiting patron/display.js\n');