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