]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/patron/summary.js
remove XUL @persist from list column definitions
[working/Evergreen.git] / Open-ILS / xul / staff_client / server / patron / summary.js
1 dump('entering patron.summary.js\n');
2
3 function $(id) { return document.getElementById(id); }
4 var patronStrings = $('patronStrings');
5 var offlineStrings = $('offlineStrings');
6
7 if (typeof patron == 'undefined') patron = {};
8 patron.summary = 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'); JSAN.use('util.date');
14     this.w = window;
15 }
16
17 patron.summary.prototype = {
18
19     'init' : function( params ) {
20
21         var obj = this;
22         obj.event_listeners = new EventListenerList();
23
24         obj.barcode = params['barcode'];
25         obj.id = params['id'];
26         if (params['show_name']) {
27             document.getElementById('patron_name').hidden = false;
28             document.getElementById('patron_name').setAttribute('hidden','false');
29         }
30
31         JSAN.use('OpenILS.data'); this.OpenILS = {}; 
32         obj.OpenILS.data = new OpenILS.data(); obj.OpenILS.data.init({'via':'stash'});
33         var obscure_dob = String( obj.OpenILS.data.hash.aous['circ.obscure_dob'] ) == 'true';
34
35         JSAN.use('util.functional'); JSAN.use('patron.util'); JSAN.use('util.list'); 
36
37         if (document.getElementById('group_list')) {
38             obj.group_list = new util.list('group_list');
39             obj.group_list.init( {
40                 'columns' : [
41                     { 'id' : 'gl_family_name', 'flex' : 1, 
42                         'label' : patronStrings.getString('staff.patron.summary.group_list.column.family_name.label'),
43                         'render' : function(my) { return my.family_name; } },
44                     { 'id' : 'gl_first_given_name', 'flex' : 1, 
45                         'label' : patronStrings.getString('staff.patron.summary.group_list.column.first_given_name.label'),
46                         'render' : function(my) { return my.first_given_name; } },
47                     { 'id' : 'gl_second_given_name', 'flex' : 1, 'hidden' : true, 
48                         'label' : patronStrings.getString('staff.patron.summary.group_list.column.second_given_name.label'),
49                         'render' : function(my) { return my.second_given_name; } },
50                     { 'id' : 'gl_home_lib', 'flex' : 1, 'hidden' : true, 
51                         'label' : patronStrings.getString('staff.patron.summary.group_list.column.home_ou.label'),
52                         'render' : function(my) { return obj.OpenILS.data.hash.aou[ my.home_ou ].shortname(); } },
53                     { 'id' : 'gl_balance_owed', 'flex' : 1, 'sort_type' : 'money',
54                         'label' : patronStrings.getString('staff.patron.summary.group_list.column.balance_owed.label'),
55                         'render' : function(my) { return my.balance_owed; } }
56                 ],
57                 'retrieve_row' : function(params) {
58                     var id = params.retrieve_id;
59                     var blob = patron.util.retrieve_name_via_id( ses(), id );
60                     var row = params.row; if (typeof row.my == 'undefined') { row.my = {}; }
61                     row.my.family_name = blob[0];
62                     row.my.first_given_name = blob[1];
63                     row.my.second_given_name = blob[2];
64                     row.my.home_ou = blob[3];
65                     if (obj.group_owed[ id ]) {
66                         row.my.balance_owed = obj.group_owed[ id ];
67                     }
68                     if (typeof params.on_retrieve == 'function') {
69                         params.on_retrieve(row);
70                     }
71                     return row;
72                 }
73             } );
74             $('group_list_actions').appendChild( obj.group_list.render_list_actions() );
75             obj.group_list.set_list_actions();
76         }
77
78         if (document.getElementById('stat_cat_list')) {
79             obj.stat_cat_list = new util.list('stat_cat_list');
80             obj.stat_cat_list.init( {
81                 'columns' : [].concat(
82                     obj.stat_cat_list.fm_columns( 'actsc', {
83                         'actsc_id' : { 'hidden' : true },
84                         'actsc_opac_visible' : { 'hidden' : true },
85                         'actsc_usr_summary' : { 'hidden' : true },
86                         'actsc_sip_format' : { 'hidden' : true },
87                         'astsc_sip_field' : { 'hidden' : true }
88                     } )
89                 ).concat(
90                     obj.stat_cat_list.fm_columns( 'actscecm', {
91                         'actscecm_id' : { 'hidden' : true }
92                     } )
93                 )
94             } );
95             $('stat_cat_list_actions').appendChild( obj.stat_cat_list.render_list_actions() );
96             obj.stat_cat_list.set_list_actions();
97         }
98
99         JSAN.use('util.controller'); obj.controller = new util.controller();
100         obj.controller.init(
101             {
102                 control_map : {
103                     'cmd_broken' : [
104                         ['command'],
105                         function() { alert($("commonStrings").getString('common.unimplemented')); }
106                     ],
107                     'radio_address' : [
108                         ['render'],
109                         function(e) {
110                             return function() {
111                                 if (e.value == 'physical') { e.selectedIndex = 1; $('address_deck').selectedIndex = 1; }
112                             };
113                         }
114                     ],
115                     'group_tab' : [
116                         ['command'],
117                         function() {
118                             try {
119                                 if (! obj.group_frame_loaded) {
120                                     obj.group_frame();
121                                     obj.group_frame_loaded = true;
122                                 }
123                             } catch(E) {
124                                 alert('Error in summary.js, group_tab: ' + E);
125                             }
126                         }
127                     ],
128                     'stat_cat_tab' : [
129                         ['command'],
130                         function() {
131                             try {
132                                 var rows = $('patron_info_rows');
133                                 obj.stat_cat_list.clear();
134                                 var entries = obj.patron.stat_cat_entries();
135                                 for (var i = 0; i < entries.length; i++) {
136                                     var stat_cat = obj.OpenILS.data.hash.my_actsc[ entries[i].stat_cat() ];
137                                     if (!stat_cat) {
138                                         stat_cat = obj.OpenILS.data.lookup('actsc',entries[i].stat_cat());
139                                     }
140                                     if (!stat_cat) { continue; }
141                                     // Every stat cat gets rendered in the Stat Cats tab
142                                     obj.stat_cat_list.append( {
143                                         'row' : {
144                                             'my' : {
145                                                 'actsc' : stat_cat,
146                                                 'actscecm' : entries[i],
147                                             }
148                                         }
149                                     } );
150                                     // But only a proud few share the Patron Info pane
151                                     if (rows && get_bool( stat_cat.usr_summary() )) {
152                                         var row_id = 'stat_cat_id_' + stat_cat.id();
153                                         var row; var label1; var label2;
154                                         if ($(row_id)) {
155                                             row = $(row_id);
156                                             label1 = row.firstChild;
157                                             label2 = row.lastChild;
158                                         } else {
159                                             row = document.createElement('row');
160                                             row.setAttribute('id',row_id);
161                                             label1 = document.createElement('label');
162                                             label2 = document.createElement('label');
163                                             row.appendChild(label1);
164                                             row.appendChild(label2);
165                                             rows.appendChild(row);
166                                         }
167                                         label1.setAttribute('value',stat_cat.name());
168                                         label1.setAttribute('tooltiptext','stat cat id ' + stat_cat.id());
169                                         label2.setAttribute('value',entries[i].stat_cat_entry());
170                                     }
171                                 }
172                             } catch(E) {
173                                 alert('Error in summary.js, stat_cat_tab: ' + E);
174                             }
175                         }
176                     ],
177                     'spawn_group_interface' : [
178                         ['command'],
179                         function() {
180                             try {
181                                 window.xulG.spawn_group_interface();
182                             } catch(E) {
183                                 alert('Error in summary.js, spawn_group_interface: ' + E);
184                             }
185                         }
186                     ],
187                     'group_tab_retrieve_patron' : [
188                         ['command'],
189                         function() {
190                             var selected_ids = util.functional.map_list(
191                                 obj.group_list.retrieve_selection(),
192                                 function(o) {
193                                     return o.getAttribute('retrieve_id');
194                                 }
195                             );
196                             for (var i = 0; i < selected_ids.length; i++) {
197                                 try {
198                                     window.xulG.new_patron_tab(
199                                         { 'tab_name' : patronStrings.getString('staff.patron.info_group.retrieve_patron.tab_name') },
200                                         {
201                                             'id' : selected_ids[i],
202                                             'url_prefix' : xulG.url_prefix,
203                                             'new_tab' : xulG.new_tab,
204                                             'set_tab' : xulG.set_tab
205                                         }
206                                     );
207                                 } catch(E) {
208                                     alert('Error in summary.js, group_tab_retrieve_patron: ' + E);
209                                 }
210                             }
211                         }
212                     ],
213                     'patron_alert' : [
214                         ['render'],
215                         function(e) {
216                             return function() {
217                                 util.widgets.set_text( e, obj.patron.alert_message() || '' );
218                                 if (obj.patron.alert_message()) {
219                                     e.parentNode.hidden = false;
220                                 } else {
221                                     e.parentNode.hidden = true;
222                                 }
223                             };
224                         }
225                     ],
226                     'patron_usrname' : [
227                         ['render'],
228                         function(e) {
229                             return function() {
230                                 util.widgets.set_text(e,obj.patron.usrname());
231                             };
232                         }
233                     ],
234                     'patron_profile' : [
235                         ['render'],
236                         function(e) {
237                             return function() { 
238                                 util.widgets.set_text(e,
239                                     obj.OpenILS.data.hash.pgt[
240                                         obj.patron.profile()
241                                     ].name()
242                                 );
243                             };
244                         }
245                     ],
246                     'patron_net_access' : [
247                         ['render'],
248                         function(e) {
249                             return function() { 
250                                 util.widgets.set_text(e,
251                                     patronStrings.getString('staff.patron.summary.patron_net_access') + 
252                                     ' ' + obj.OpenILS.data.hash.cnal[
253                                         obj.patron.net_access_level()
254                                     ].name()
255                                 );
256                             };
257                         }
258                     ],
259                     'patron_credit' : [
260                         ['render'],
261                         function(e) {
262                             return function() { 
263                                 JSAN.use('util.money');
264                                 util.widgets.set_text(e,
265                                     '$' + 
266                                     util.money.sanitize(
267                                         obj.patron.credit_forward_balance()
268                                     )
269                                 );
270                             };
271                         }
272                     ],
273                     'patron_bill' : [
274                         ['render'],
275                         function(e) {
276                             return function() { 
277                                 util.widgets.set_text(e,'...');
278                                 var under_btn; 
279                                 if (xulG) {
280                                     if (xulG.display_window) {
281                                         under_btn = xulG.display_window.document.getElementById('under_bills');
282                                         if (under_btn) util.widgets.set_text(under_btn,'...');
283                                     }
284                                 }
285                                 obj.network.simple_request(
286                                     'BLOB_BALANCE_OWED_VIA_USERGROUP',
287                                     [ ses(), obj.patron.usrgroup() ],
288                                     function(req) {
289                                         try {
290                                             JSAN.use('util.money');
291                                             var robj = req.getResultObject();
292                                             if (typeof robj.ilsevent != 'undefined') { throw(robj); }
293
294                                             var sum = 0; /* in cents */
295                                             obj.group_owed = {};
296
297                                             function render_main_patron_bill_summary(bs) {
298                                                 try {
299                                                     util.widgets.set_text(
300                                                         e, 
301                                                         patronStrings.getFormattedString('staff.patron.summary.patron_bill.money', [util.money.sanitize( bs.balance_owed )])
302                                                     );
303                                                     if (under_btn) {
304                                                         util.widgets.set_text(
305                                                             under_btn, 
306                                                             patronStrings.getFormattedString('staff.patron.summary.patron_bill.money', [util.money.sanitize( bs.balance_owed )])
307                                                         );
308                                                     }
309                                                     var show_billing_tab_on_bills = String( obj.OpenILS.data.hash.aous['ui.circ.show_billing_tab_on_bills'] ) == 'true';
310                                                     if (show_billing_tab_on_bills && Number(bs.balance_owed) > 0) {
311                                                         if (xulG) {
312                                                             if (xulG.display_window) {
313                                                                 if (! obj.show_billing_tab_on_bills_done_once ) {
314                                                                     xulG.display_window.g.patron.skip_hide_summary = true;
315                                                                     xulG.display_window.util.widgets.dispatch('command','cmd_patron_bills');
316                                                                     obj.show_billing_tab_on_bills_done_once = 1;
317                                                                 }
318                                                             }
319                                                         }
320                                                     };
321                                                     obj.bills_summary = bs;
322                                                     if (obj.holds_summary && obj.bills_summary)  {
323                                                         if (typeof window.xulG == 'object' && typeof window.xulG.stop_sign_page == 'function') {
324                                                             window.xulG.stop_sign_page( obj.patron, { 'holds_summary' : obj.holds_summary, 'bills_summary' : obj.bills_summary } ); 
325                                                         }
326                                                     }
327                                                 } catch(E) {
328                                                     alert('Error in summary.js, render_main_patron_bill_summary(): ' + E);
329                                                 }
330                                             }
331
332                                             var rendered_main_patron_bill_summary = false;
333                                             for (var i = 0; i < robj.length; i++) {
334                                                 if (robj[i].usr == obj.patron.id()) {
335                                                     render_main_patron_bill_summary( robj[i] );
336                                                     rendered_main_patron_bill_summary = true;
337                                                 } else {
338                                                     sum += util.money.dollars_float_to_cents_integer( robj[i].balance_owed );
339                                                     obj.group_owed[ robj[i].usr ] = robj[i].balance_owed;
340                                                 }
341                                             }
342                                             if (!rendered_main_patron_bill_summary) {
343                                                 render_main_patron_bill_summary( { balance_owed: 0.00, usr: obj.patron.id() } );
344                                             }
345                                             var tab = $('group_tab');
346                                             if (tab) {
347                                                 if (sum > 0) {
348                                                     addCSSClass(tab,'balance_owed');
349                                                 } else {
350                                                     removeCSSClass(tab,'balance_owed');
351                                                 }
352                                                 tab.setAttribute(
353                                                     'label',
354                                                     patronStrings.getFormattedString('staff.patron.summary.tab.group_list_with_total_owed.label',[ util.money.cents_as_dollars( sum ) ])
355                                                 );
356                                             }
357                                         } catch(E) {
358                                             alert('Error in summary.js, patron_bill callback: ' + E);
359                                         }
360                                     }
361                                 );
362                             };
363                         }
364                     ],
365                     'patron_checkouts' : [
366                         ['render'],
367                         function(e) {
368                             return function() { 
369                                 util.widgets.set_text(e,'...');
370                                 var e2 = document.getElementById( 'patron_overdue' ); if (e2) util.widgets.set_text(e2,'...');
371                                 var e3 = document.getElementById( 'patron_claimed_returned' ); if (e3) util.widgets.set_text(e3,'...');
372                                 var e4 = document.getElementById( 'patron_long_overdue' ); if (e4) util.widgets.set_text(e4,'...');
373                                 var e5 = document.getElementById( 'patron_lost' ); if (e5) util.widgets.set_text(e5,'...');
374                                 var e6 = document.getElementById( 'patron_noncat' ); if (e6) util.widgets.set_text(e6,'...');
375                                 var under_btn; 
376                                 if (xulG) {
377                                     if (xulG.display_window) {
378                                         under_btn = xulG.display_window.document.getElementById('under_items');
379                                         if (under_btn) util.widgets.set_text(under_btn,'...');
380                                     }
381                                 }
382                                 obj.network.simple_request(
383                                     'FM_CIRC_COUNT_RETRIEVE_VIA_USER.authoritative',
384                                     [ ses(), obj.patron.id() ],
385                                     function(req) {
386                                         try {
387                                             var robj = req.getResultObject();
388                                             var do_not_tally_claims_returned = String( obj.OpenILS.data.hash.aous['circ.do_not_tally_claims_returned'] ) == 'true';
389                                             var do_tally_lost = String( obj.OpenILS.data.hash.aous['circ.tally_lost'] ) == 'true';
390                                             util.widgets.set_text(e,
391                                                 robj.out
392                                                 + robj.overdue
393                                                 + (do_not_tally_claims_returned ? 0 : robj.claims_returned)
394                                                 + robj.long_overdue
395                                                 + (do_tally_lost ? robj.lost : 0)
396                                             );
397                                             if (e2) util.widgets.set_text(e2, robj.overdue    );
398                                             if (e3) util.widgets.set_text(e3, robj.claims_returned    );
399                                             if (e4) util.widgets.set_text(e4, robj.long_overdue    );
400                                             if (e5) util.widgets.set_text(e5, robj.lost    );
401                                             if (under_btn) util.widgets.set_text(under_btn, 
402                                                 String(
403                                                     robj.out
404                                                     + robj.overdue
405                                                     + (do_not_tally_claims_returned ? 0 : robj.claims_returned)
406                                                     + robj.long_overdue
407                                                     + (do_tally_lost ? robj.lost : 0)
408                                                 ) 
409                                                 /* + ( robj.overdue > 0 ? '*' : '' ) */
410                                             );
411                                         } catch(E) {
412                                             alert(E);
413                                         }
414                                     }
415                                 );
416                                 obj.network.simple_request(
417                                     'FM_ANCC_RETRIEVE_VIA_USER.authoritative',
418                                     [ ses(), obj.patron.id() ],
419                                     function(req) {
420                                         var robj = req.getResultObject();
421                                         if (e6) util.widgets.set_text(e6,robj.length);
422                                     }
423                                 );
424                             };
425                         }
426                     ],
427                     'patron_overdue' : [
428                         ['render'],
429                         function(e) {
430                             return function() { 
431                                 /* handled by 'patron_checkouts' */
432                             };
433                         }
434                     ],
435                     'patron_holds' : [
436                         ['render'],
437                         function(e) {
438                             return function() { 
439                                 util.widgets.set_text(e,'...');
440                                 var e2 = document.getElementById('patron_holds_available');
441                                 var e3 = document.getElementById('patron_holds_available_behind_desk');
442                                 if (e2) util.widgets.set_text(e2,'...');
443                                 if (e3) util.widgets.set_text(e3,'...');
444                                 var under_btn; 
445                                 if (xulG) {
446                                     if (xulG.display_window) {
447                                         under_btn = xulG.display_window.document.getElementById('under_holds');
448                                         if (under_btn) util.widgets.set_text(under_btn,'...');
449                                     }
450                                 }
451                                 obj.network.simple_request(
452                                     'FM_AHR_COUNT_RETRIEVE.authoritative',
453                                     [ ses(), obj.patron.id(), ses('ws_ou') ],
454                                     function(req) {
455                                         var robj = req.getResultObject();
456                                         util.widgets.set_text(e,
457                                             robj.total
458                                         );
459                                         if (e2) {
460                                             util.widgets.set_text(e2, robj.ready);
461                                         }
462                                         if (e3) {
463                                             if (robj.behind_desk) {
464                                                 removeCSSClass(e3.parentNode, 'hideme');
465                                                 util.widgets.set_text(e3, robj.behind_desk);
466                                             } else {
467                                                 addCSSClass(e3.parentNode, 'hideme');
468                                             }
469                                         }
470                                         if (under_btn) {
471                                             var str = robj.ready + '/' + robj.total;
472                                             if (robj.behind_desk) {
473                                                 str += ' (' + robj.behind_desk + ')';
474                                                 under_btn.setAttribute(
475                                                     'tooltiptext', patronStrings.getString(
476                                                         'staff.patron.summary.hold_counts_behind_desk')
477                                                 );
478                                             } else {
479                                                 under_btn.setAttribute(
480                                                     'tooltiptext', patronStrings.getString(
481                                                         'staff.patron.summary.hold_counts')
482                                                 );
483                                             }
484                                             util.widgets.set_text(under_btn, str);
485                                         }
486                                         obj.holds_summary = robj;
487                                         if (obj.holds_summary && obj.bills_summary) 
488                                             if (typeof window.xulG == 'object' && typeof window.xulG.stop_sign_page == 'function')
489                                                 window.xulG.stop_sign_page( obj.patron, { 'holds_summary' : obj.holds_summary, 'bills_summary' : obj.bills_summary } ); 
490                                     }
491                                 );
492                             };
493                         }
494                     ],
495                     'patron_holds_available' : [
496                         ['render'],
497                         function(e) {
498                             return function() { 
499                                 /* handled by 'patron_holds' */
500                             };
501                         }
502                     ],
503                     'patron_card' : [
504                         ['render'],
505                         function(e) {
506                             return function() { 
507                                 util.widgets.set_text(e,
508                                     obj.patron.card().barcode()
509                                 );
510                             };
511                         }
512                     ],
513                     'patron_ident_type_1' : [
514                         ['render'],
515                         function(e) {
516                             return function() { 
517                                 var ident_string = '';
518                                 var ident = obj.OpenILS.data.hash.cit[
519                                     obj.patron.ident_type()
520                                 ];
521                                 if (ident) ident_string = ident.name()
522                                 util.widgets.set_text(e,
523                                     ident_string
524                                 );
525                             };
526                         }
527                     ],
528                     'patron_ident_value_1' : [
529                         ['render'],
530                         function(e) {
531                             return function() { 
532                                 var val = obj.patron.ident_value();
533                                 if (val) val = val.replace(/.+(\d\d\d\d)$/,'xxxx$1');   // must avoid val.replace if val is NULL
534                                 util.widgets.set_text(e, val);
535                             };
536                         }
537                     ],
538                     'patron_ident_type_2' : [
539                         ['render'],
540                         function(e) {
541                             return function() { 
542                                 var ident_string = '';
543                                 var ident = obj.OpenILS.data.hash.cit[
544                                     obj.patron.ident_type2()
545                                 ];
546                                 if (ident) ident_string = ident.name()
547                                 util.widgets.set_text(e,
548                                     ident_string
549                                 );
550                             };
551                         }
552                     ],
553                     'patron_ident_value_2' : [
554                         ['render'],
555                         function(e) {
556                             return function() { 
557                                 var val = obj.patron.ident_value2();
558                                 if (val) val = val.replace(/.+(\d\d\d\d)$/,'xxxx$1');   // must avoid val.replace if val is NULL
559                                 util.widgets.set_text(e, val);
560                             };
561                         }
562                     ],
563                     'patron_account_create_date' : [
564                         ['render'],
565                         function(e) {
566                             return function() {
567                                 util.widgets.set_text(e,
568                                     patronStrings.getString('staff.patron.summary.create_date') + ' '
569                                     + util.date.formatted_date( obj.patron.create_date(), '%{localized_date}' )
570                                 );
571                             };
572                         }
573                     ],
574                     'patron_date_of_exp' : [
575                         ['render'],
576                         function(e) {
577                             return function() { 
578                                 util.widgets.set_text(e,
579                                     patronStrings.getString('staff.patron.summary.expires_on') + ' ' + (
580                                         obj.patron.expire_date() ?
581                                         util.date.formatted_date( obj.patron.expire_date(), '%{localized_date}' ) :
582                                         patronStrings.getString('staff.patron.field.unset') 
583                                     )
584                                 );
585                             };
586                         }
587                     ],
588                     'patron_last_activity_date' : [
589                         ['render'],
590                         function(e) {
591                             return function() { 
592                                 var act = obj.patron.usr_activity();
593                                 if (act && act.length) {
594                                     act = act[0];
595                                     util.widgets.set_text(e,
596                                         patronStrings.getString('staff.patron.summary.last_activity') + ' ' + 
597                                             util.date.formatted_date( act.event_time(), '%{localized_date}' ) 
598                                     );
599                                     e.setAttribute('tooltiptext', act.etype().label());
600                                 } else {
601
602                                     util.widgets.set_text(e,
603                                         patronStrings.getString('staff.patron.summary.last_activity') + ' ' + 
604                                             patronStrings.getString('staff.patron.field.unset') 
605                                     );
606                                 }
607                             };
608                         }
609                     ],
610                     'patron_date_of_last_update' : [
611                         ['render'],
612                         function(e) {
613                             return function() {
614                                 util.widgets.set_text(e,
615                                     patronStrings.getString('staff.patron.summary.updated_on') + ' ' + (
616                                         obj.patron.last_update_time() ?
617                                         util.date.formatted_date( obj.patron.last_update_time(), '%{localized_date}' ) :
618                                         patronStrings.getString('staff.patron.field.unset')
619                                     )
620                                 );
621                             };
622                         }
623                     ],
624                     'patron_hold_alias' : [
625                         ['render'],
626                         function(e) {
627                             return function() {
628                                 util.widgets.set_text(e,
629                                     obj.patron.alias() ? obj.patron.alias() : ''
630                                 );
631                             }
632                         }
633                     ],
634                     'patron_date_of_birth' : [
635                         ['render'],
636                         function(e) {
637                             return function() { 
638                                 var hide_value = e.getAttribute('hide_value');
639                                 if ( obscure_dob && hide_value == 'true' ) {
640                                     e.setAttribute( 'hidden_value',
641                                         obj.patron.dob() ?
642                                         util.date.formatted_date( obj.patron.dob(), '%{localized_date}' ) :
643                                         patronStrings.getString('staff.patron.field.unset') 
644                                     );
645                                     util.widgets.set_text(e,
646                                         patronStrings.getString('staff.patron.field.hidden') 
647                                     );
648                                 } else {
649                                     util.widgets.set_text(e,
650                                         obj.patron.dob() ?
651                                         util.date.formatted_date( obj.patron.dob(), '%{localized_date}' ) :
652                                         patronStrings.getString('staff.patron.field.unset') 
653                                     );
654                                     e.setAttribute( 'hidden_value',
655                                         patronStrings.getString('staff.patron.field.hidden') 
656                                     );
657                                 }
658                                 var x = document.getElementById('PatronSummaryContact_date_of_birth_label');
659                                 if (x) {
660                                     var click_to_hide_dob = x.getAttribute('click_to_hide_dob');
661                                     if (!obscure_dob || click_to_hide_dob != 'true') {
662                                         removeCSSClass(x,'click_link');
663                                     } 
664                                     if (obscure_dob && click_to_hide_dob == 'true') {
665                                         addCSSClass(x,'click_link');
666                                         x.onclick = function() {
667                                             hide_value = e.getAttribute('hide_value');
668                                             e.setAttribute('hide_value', hide_value == 'true' ? 'false' : 'true'); 
669                                             var value = util.widgets.get_text(e);
670                                             var hidden_value = e.getAttribute('hidden_value');
671                                             util.widgets.set_text(e,hidden_value);
672                                             e.setAttribute('hidden_value',value);
673                                         }
674                                     }
675                                 }
676                             };
677                         }
678                     ],
679                     'patron_day_phone' : [
680                         ['render'],
681                         function(e) {
682                             return function() { 
683                                 util.widgets.set_text(e,
684                                     obj.patron.day_phone()
685                                 );
686                             };
687                         }
688                     ],
689                     'patron_evening_phone' : [
690                         ['render'],
691                         function(e) {
692                             return function() { 
693                                 util.widgets.set_text(e,
694                                     obj.patron.evening_phone()
695                                 );
696                             };
697                         }
698                     ],
699                     'patron_other_phone' : [
700                         ['render'],
701                         function(e) {
702                             return function() { 
703                                 util.widgets.set_text(e,
704                                     obj.patron.other_phone()
705                                 );
706                             };
707                         }
708                     ],
709                     'patron_email' : [
710                         ['render'],
711                         function(e) {
712                             return function() { 
713                                 util.widgets.set_text(e,
714                                     obj.patron.email()
715                                 );
716                             };
717                         }
718                     ],
719                     'patron_alias' : [
720                         ['render'],
721                         function(e) {
722                             return function() { 
723                                 util.widgets.set_text(e,
724                                     obj.patron.alias()
725                                 );
726                             };
727                         }
728                     ],
729                     'patron_photo_url' : [
730                         ['render'],
731                         function(e) {
732                             return function() { 
733                                 e.setAttribute('src',
734                                     obj.patron.photo_url()
735                                 );
736                             };
737                         }
738                     ],
739                     'patron_library' : [
740                         ['render'],
741                         function(e) {
742                             return function() { 
743                                 util.widgets.set_text(e,
744                                     obj.OpenILS.data.hash.aou[
745                                         obj.patron.home_ou()
746                                     ].shortname()
747                                 );
748                                 e.setAttribute('tooltiptext',
749                                     obj.OpenILS.data.hash.aou[
750                                         obj.patron.home_ou()
751                                     ].name()
752                                 );
753                             };
754                         }
755                     ],
756                     'patron_last_library' : [
757                         ['render'],
758                         function(e) {
759                             return function() { 
760                                 util.widgets.set_text(e,
761                                     obj.OpenILS.data.hash.aou[
762                                         obj.patron.home_ou()
763                                     ].shortname()
764                                 );
765                                 e.setAttribute('tooltiptext',
766                                     obj.OpenILS.data.hash.aou[
767                                         obj.patron.home_ou()
768                                     ].name()
769                                 );
770                             };
771                         }
772                     ],
773                     'patron_mailing_address_street1' : [
774                         ['render'],
775                         function(e) {
776                             return function() { 
777                                 if (obj.patron.mailing_address()) {
778                                     util.widgets.set_text(e,
779                                         obj.patron.mailing_address().street1()
780                                     );
781                                     if (!get_bool(obj.patron.mailing_address().valid())){e.setAttribute('style','color: red');}
782                                 } else {
783                                     util.widgets.set_text(e,'');
784                                 }
785                             };
786                         }
787                     ],
788                     'patron_mailing_address_street2' : [
789                         ['render'],
790                         function(e) {
791                             return function() { 
792                                 if (obj.patron.mailing_address()) {
793                                     util.widgets.set_text(e,
794                                         obj.patron.mailing_address().street2()
795                                     );
796                                     if (!get_bool(obj.patron.mailing_address().valid())){e.setAttribute('style','color: red');}
797                                 } else {
798                                     util.widgets.set_text(e,'');
799                                 }
800                             };
801                         }
802                     ],
803                     'patron_mailing_address_city' : [
804                         ['render'],
805                         function(e) {
806                             return function() { 
807                                 if (obj.patron.mailing_address()) {
808                                     util.widgets.set_text(e,
809                                         obj.patron.mailing_address().city()
810                                     );
811                                     if (!get_bool(obj.patron.mailing_address().valid())){e.setAttribute('style','color: red');}
812                                 } else {
813                                     util.widgets.set_text(e,'');
814                                 }
815                             };
816                         }
817                     ],
818                     'patron_mailing_address_state' : [
819                         ['render'],
820                         function(e) {
821                             return function() { 
822                                 if (obj.patron.mailing_address()) {
823                                     util.widgets.set_text(e,
824                                         obj.patron.mailing_address().state()
825                                     );
826                                     if (!get_bool(obj.patron.mailing_address().valid())){e.setAttribute('style','color: red');}
827                                 } else {
828                                     util.widgets.set_text(e,'');
829                                 }
830                             };
831                         }
832                     ],
833                     'patron_mailing_address_post_code' : [
834                         ['render'],
835                         function(e) {
836                             return function() { 
837                                 if (obj.patron.mailing_address()) {
838                                     util.widgets.set_text(e,
839                                         obj.patron.mailing_address().post_code()
840                                     );
841                                     if (!get_bool(obj.patron.mailing_address().valid())){e.setAttribute('style','color: red');}
842                                 } else {
843                                     util.widgets.set_text(e,'');
844                                 }
845                             };
846                         }
847                     ],
848                     'patron_physical_address_street1' : [
849                         ['render'],
850                         function(e) {
851                             return function() { 
852                                 if (obj.patron.billing_address()) {
853                                     util.widgets.set_text(e,
854                                         obj.patron.billing_address().street1()
855                                     );
856                                     if (!get_bool(obj.patron.billing_address().valid())){e.setAttribute('style','color: red');}
857                                 } else {
858                                     util.widgets.set_text(e,'');
859                                 }
860                             };
861                         }
862                     ],
863                     'patron_physical_address_street2' : [
864                         ['render'],
865                         function(e) {
866                             return function() {
867                                 if (obj.patron.billing_address()) { 
868                                     util.widgets.set_text(e,
869                                         obj.patron.billing_address().street2()
870                                     );
871                                     if (!get_bool(obj.patron.billing_address().valid())){e.setAttribute('style','color: red');}
872                                 } else {
873                                     util.widgets.set_text(e,'');
874                                 }
875                             };
876                         }
877                     ],
878                     'patron_physical_address_city' : [
879                         ['render'],
880                         function(e) {
881                             return function() {
882                                 if (obj.patron.billing_address()) { 
883                                     util.widgets.set_text(e,
884                                         obj.patron.billing_address().city()
885                                     );
886                                     if (!get_bool(obj.patron.billing_address().valid())){e.setAttribute('style','color: red');}
887                                 } else {
888                                     util.widgets.set_text(e,'');
889                                 }
890                             };
891                         }
892                     ],
893                     'patron_physical_address_state' : [
894                         ['render'],
895                         function(e) {
896                             return function() {
897                                 if (obj.patron.billing_address()) { 
898                                     util.widgets.set_text(e,
899                                         obj.patron.billing_address().state()
900                                     );
901                                     if (!get_bool(obj.patron.billing_address().valid())){e.setAttribute('style','color: red');}
902                                 } else {
903                                     util.widgets.set_text(e,'');
904                                 }
905                             };
906                         }
907                     ],
908                     'patron_physical_address_post_code' : [
909                         ['render'],
910                         function(e) {
911                             return function() {
912                                 if (obj.patron.billing_address()) { 
913                                     util.widgets.set_text(e,
914                                         obj.patron.billing_address().post_code()
915                                     );
916                                     if (!get_bool(obj.patron.billing_address().valid())){e.setAttribute('style','color: red');}
917                                 } else {
918                                     util.widgets.set_text(e,'');
919                                 }
920                             };
921                         }
922                     ]
923                 }
924             }
925         );
926
927         obj.retrieve();
928
929         try {
930             var caption = document.getElementById("PatronSummaryContact_caption");
931             var arrow = document.getAnonymousNodes(caption)[0];
932             var gb_content = document.getAnonymousNodes(caption.parentNode)[1];
933             obj.event_listeners.add(arrow,
934                 'click',
935                 function() {
936                     setTimeout(
937                         function() {
938                             //alert('setting shrink_state to ' + gb_content.hidden);
939                             //caption.setAttribute('shrink_state',gb_content.hidden);
940                             JSAN.use('util.file'); var file = new util.file('patron_id_shrink');
941                             file.set_object(String(gb_content.hidden)); file.close();
942                         }, 0
943                     );
944                 }, false
945             );
946             //var shrink_state = caption.getAttribute('shrink_state');
947             var shrink_state = false;
948             JSAN.use('util.file'); var file = new util.file('patron_id_shrink');
949             if (file._file.exists()) {
950                 shrink_state = file.get_object(); file.close();
951             }
952             //alert('shrink_state retrieved as ' + shrink_state);
953             if (shrink_state != 'false' && shrink_state) {
954                 //alert('clicking the widget');
955                 util.widgets.click( arrow );
956             }
957         } catch(E) {
958             obj.error.sdump('D_ERROR','with shrink_state in summary.js: ' + E);
959         }
960     },
961
962     'cleanup' : function() {
963         var obj = this;
964         if (typeof obj.group_list != 'undefined') {
965             obj.group_list.cleanup();
966             obj.group_list.clear();
967         }
968         if (typeof obj.stat_cat_list != 'undefined') {
969             obj.stat_cat_list.cleanup();
970             obj.stat_cat_list.clear();
971         }
972         obj.controller.cleanup();
973         obj.event_listeners.removeAll();
974     },
975
976     'retrieve' : function() {
977
978         try {
979
980             var obj = this;
981
982             var chain = [];
983
984             // Retrieve the patron
985                 function blah_retrieve() {
986                     try {
987                         var robj;
988                         if (obj.barcode && obj.barcode != 'null') {
989                             robj = obj.network.simple_request(
990                                 'FM_AU_RETRIEVE_VIA_BARCODE.authoritative',
991                                 [ ses(), obj.barcode ]
992                             );
993                         } else if (obj.id && obj.id != 'null') {
994                             robj = obj.network.simple_request(
995                                 'FM_AU_FLESHED_RETRIEVE_VIA_ID',
996                                 [ ses(), obj.id ]
997                             );
998                         } else {
999                             throw(patronStrings.getString('staff.patron.summary.retrieve.no_barcode'));
1000                         }
1001                         if (robj) {
1002
1003                             if (instanceOf(robj,au)) {
1004
1005                                 obj.patron = robj;
1006                                 JSAN.use('patron.util');
1007                                 util.widgets.set_text('patron_name',
1008                                     patron.util.format_name( obj.patron )
1009                                 );
1010                                 patron.util.set_penalty_css(obj.patron);
1011                                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
1012                                 data.last_patron = obj.patron.id(); data.stash('last_patron');
1013
1014                             } else {
1015
1016                                 throw(robj);
1017
1018                             }
1019                         } else {
1020
1021                             throw(robj);
1022
1023                         }
1024
1025                     } catch(E) {
1026                         throw(E);
1027                     }
1028                 };
1029                 blah_retrieve();
1030
1031             /*
1032             // Retrieve the survey responses for required surveys
1033             chain.push(
1034                 function() {
1035                     try {
1036                         var surveys = obj.OpenILS.data.list.my_asv;
1037                         var survey_responses = {};
1038                         for (var i = 0; i < surveys.length; i++) {
1039                             var s = obj.network.request(
1040                                 api.FM_ASVR_RETRIEVE.app,
1041                                 api.FM_ASVR_RETRIEVE.method,
1042                                 [ ses(), surveys[i].id(), obj.patron.id() ]
1043                             );
1044                             survey_responses[ surveys[i].id() ] = s;
1045                         }
1046                         obj.patron.survey_responses( survey_responses );
1047                     } catch(E) {
1048                         var error = ('patron.summary.retrieve : ' + js2JSON(E));
1049                         obj.error.sdump('D_ERROR',error);
1050                         throw(error);
1051                     }
1052                 }
1053             );
1054             */
1055
1056             // Update the screen
1057             chain.push( function() {
1058                 obj.controller.render();
1059                 if ($('stat_cat_tab')) {
1060                     util.widgets.dispatch('command','stat_cat_tab'); 
1061                 }
1062                 if ($('pdcgpr')) {
1063                     try {
1064                         var rows = $('pdcgpr');
1065                         var entries = obj.patron.stat_cat_entries();
1066                         for (var i = 0; i < entries.length; i++) {
1067                             var stat_cat = obj.OpenILS.data.hash.my_actsc[ entries[i].stat_cat() ];
1068                             if (!stat_cat) {
1069                                 stat_cat = obj.OpenILS.data.lookup('actsc',entries[i].stat_cat());
1070                             }
1071                             if (!stat_cat) { continue; }
1072                             // Only a proud few share the Patron Info pane
1073                             if (rows && get_bool( stat_cat.usr_summary() )) {
1074                                 var row_id = 'stat_cat_id_' + stat_cat.id();
1075                                 var row; var label1; var label2;
1076                                 if ($(row_id)) {
1077                                     row = $(row_id);
1078                                     row.setAttribute('class','stat_cat_summary_row');
1079                                     label1 = row.firstChild;
1080                                     label2 = row.lastChild;
1081                                 } else {
1082                                     row = document.createElement('row');
1083                                     row.setAttribute('id',row_id);
1084                                     row.setAttribute('class','stat_cat_summary_row');
1085                                     label1 = document.createElement('label');
1086                                     label2 = document.createElement('label');
1087                                     row.appendChild(label1);
1088                                     row.appendChild(label2);
1089                                     // Place before the spacer at the end
1090                                     rows.insertBefore(row, rows.lastChild);
1091                                 }
1092                                 label1.setAttribute('value',stat_cat.name());
1093                                 label1.setAttribute('tooltiptext','stat cat id ' + stat_cat.id());
1094                                 label2.setAttribute('value',entries[i].stat_cat_entry());
1095                             }
1096                         }
1097                     } catch(E) {
1098                         alert('Error in summary.js: ' + E);
1099                     }
1100                 }
1101             } );
1102
1103             // On Complete
1104
1105             chain.push( function() {
1106
1107                 if (typeof window.xulG == 'object' && typeof window.xulG.on_finished == 'function') {
1108                     obj.error.sdump('D_PATRON_SUMMARY',
1109                         'patron.summary: Calling external .on_finished()\n');
1110                     window.xulG.on_finished(obj.patron);
1111                 } else {
1112                     obj.error.sdump('D_PATRON_SUMMARY','patron.summary: No external .on_finished()\n');
1113                 }
1114
1115             } );
1116
1117             // Do it
1118             JSAN.use('util.exec'); obj.exec = new util.exec();
1119             obj.exec.on_error = function(E) {
1120
1121                 if (typeof window.xulG == 'object' && typeof window.xulG.on_error == 'function') {
1122                     window.xulG.on_error(E);
1123                 } else {
1124                     alert(js2JSON(E));
1125                 }
1126
1127             }
1128             this.exec.chain( chain );
1129
1130         } catch(E) {
1131             if (typeof window.xulG == 'object' && typeof window.xulG.on_error == 'function') {
1132                 window.xulG.on_error(E);
1133             } else {
1134                 alert(js2JSON(E));
1135             }
1136         }
1137     },
1138
1139     'group_frame' : function() {
1140         var obj = this;
1141         try {
1142             obj.group_list.clear();
1143
1144             var robj = obj.network.simple_request(
1145                 'FM_AU_LIST_RETRIEVE_VIA_GROUP.authoritative',
1146                 [ ses(), obj.patron.usrgroup() ]
1147             );
1148             if ((robj == null) || (typeof robj.ilsevent != 'undefined') ) throw(robj);
1149             var ids = util.functional.filter_list( robj, function(o) { return o != obj.patron.id(); });
1150             var funcs = [];
1151
1152                 function gen_func(r) {
1153                     return function() {
1154                         obj.group_list.append( { 'retrieve_id' : r, 'row' : {} } );
1155                     }
1156                 }
1157
1158             //funcs.push( gen_func(obj.patron.id()) );
1159             for (var i = 0; i < ids.length; i++) {
1160                 funcs.push( gen_func(ids[i]) );
1161             }
1162             JSAN.use('util.exec'); var exec = new util.exec(4);
1163             exec.chain( funcs );
1164         } catch(E) {
1165             alert('Error in summary.js, group_frame(): ' + E);
1166         }
1167     }
1168 }
1169
1170 dump('exiting patron.summary.js\n');