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