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