]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/patron/util.js
326d661bfe3ccf6d05fa4ba575828a2e0c07f74d
[Evergreen.git] / Open-ILS / xul / staff_client / server / patron / util.js
1 dump('entering patron/util.js\n');
2
3 if (typeof patron == 'undefined') var patron = {};
4 patron.util = {};
5
6 patron.util.EXPORT_OK   = [ 
7         'columns', 'mbts_columns', 'mb_columns', 'mp_columns', /*'std_map_row_to_column',*/ 'std_map_row_to_columns',
8         'retrieve_au_via_id', 'retrieve_fleshed_au_via_id', 'retrieve_fleshed_au_via_barcode', 'set_penalty_css', 'retrieve_name_via_id'
9 ];
10 patron.util.EXPORT_TAGS = { ':all' : patron.util.EXPORT_OK };
11
12 patron.util.mbts_columns = function(modify,params) {
13
14         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
15         JSAN.use('util.money'); JSAN.use('util.date');
16
17         var c = [
18                 {
19                         'persist' : 'hidden width ordinal', 'id' : 'id', 'label' : 'Id', 'flex' : 1,
20                         'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mbts.id(); },
21                 },
22                 {
23                         'persist' : 'hidden width ordinal', 'id' : 'usr', 'label' : 'User', 'flex' : 1,
24                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mbts.usr() ? "Id = " + my.mbts.usr() : ""; },
25                 },
26                 {
27                         'persist' : 'hidden width ordinal', 'id' : 'xact_type', 'label' : 'Type', 'flex' : 1,
28                         'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mbts.xact_type(); },
29                 },
30                 {
31                         'persist' : 'hidden width ordinal', 'id' : 'balance_owed', 'label' : 'Balance Owed', 'flex' : 1,
32                         'primary' : false, 'hidden' : false, 'render' : function(my) { return util.money.sanitize( my.mbts.balance_owed() ); },
33                         'sort_type' : 'money',
34                 },
35                 {
36                         'persist' : 'hidden width ordinal', 'id' : 'total_owed', 'label' : 'Total Billed', 'flex' : 1,
37                         'primary' : false, 'hidden' : false, 'render' : function(my) { return util.money.sanitize( my.mbts.total_owed() ); },
38                         'sort_type' : 'money',
39                 },
40                 {
41                         'persist' : 'hidden width ordinal', 'id' : 'total_paid', 'label' : 'Total Paid', 'flex' : 1,
42                         'primary' : false, 'hidden' : false, 'render' : function(my) { return util.money.sanitize( my.mbts.total_paid() ); },
43                         'sort_type' : 'money',
44                 },
45                 {
46                         'persist' : 'hidden width ordinal', 'id' : 'last_billing_note', 'label' : 'Last Billing Note', 'flex' : 2,
47                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mbts.last_billing_note(); },
48                 },
49                 {
50                         'persist' : 'hidden width ordinal', 'id' : 'last_billing_type', 'label' : 'Last Billing Type', 'flex' : 1,
51                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mbts.last_billing_type(); },
52                 },
53                 {
54                         'persist' : 'hidden width ordinal', 'id' : 'last_billing_ts', 'label' : 'Last Billed', 'flex' : 1,
55                         'primary' : false, 'hidden' : true, 'render' : function(my) { return util.date.formatted_date( my.mbts.last_billing_ts(), "" ); },
56                 },
57                 {
58                         'persist' : 'hidden width ordinal', 'id' : 'last_payment_note', 'label' : 'Last Payment Note', 'flex' : 2,
59                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mbts.last_payment_note(); },
60                 },
61                 {
62                         'persist' : 'hidden width ordinal', 'id' : 'last_payment_type', 'label' : 'Last Payment Type', 'flex' : 1,
63                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mbts.last_payment_type(); },
64                 },
65                 {
66                         'persist' : 'hidden width ordinal', 'id' : 'last_payment_ts', 'label' : 'Last Payment', 'flex' : 1,
67                         'primary' : false, 'hidden' : true, 'render' : function(my) { return util.date.formatted_date( my.mbts.last_payment_ts(), "" ); },
68                 },
69                 {
70                         'persist' : 'hidden width ordinal', 'id' : 'xact_start', 'label' : 'Created', 'flex' : 1,
71                         'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mbts.xact_start() ? my.mbts.xact_start().toString().substr(0,10) : ""; },
72                 },
73                 {
74                         'persist' : 'hidden width ordinal', 'id' : 'xact_finish', 'label' : 'Closed', 'flex' : 1,
75                         'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mbts.xact_finish() ? my.mbts.xact_finish().toString().substr(0,10) : ""; },
76                 },
77         ];
78         for (var i = 0; i < c.length; i++) {
79                 if (modify[ c[i].id ]) {
80                         for (var j in modify[ c[i].id ]) {
81                                 c[i][j] = modify[ c[i].id ][j];
82                         }
83                 }
84         }
85         if (params) {
86                 if (params.just_these) {
87                         JSAN.use('util.functional');
88                         var new_c = [];
89                         for (var i = 0; i < params.just_these.length; i++) {
90                                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
91                                 new_c.push( function(y){ return y; }( x ) );
92                         }
93                         c = new_c;
94                 }
95                 if (params.except_these) {
96                         JSAN.use('util.functional');
97                         var new_c = [];
98                         for (var i = 0; i < c.length; i++) {
99                                 var x = util.functional.find_list(params.except_these,function(d){return(d==c[i].id);});
100                                 if (!x) new_c.push(c[i]);
101                         }
102                         c = new_c;
103                 }
104         }
105         return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
106 }
107
108 patron.util.mb_columns = function(modify,params) {
109
110         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
111         JSAN.use('util.money'); JSAN.use('util.date');
112
113         var c = [
114                 {
115                         'persist' : 'hidden width ordinal', 'id' : 'id', 'label' : 'Id', 'flex' : 1,
116                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mb.id(); },
117                 },
118                 {
119                         'persist' : 'hidden width ordinal', 'id' : 'voided', 'label' : 'Voided', 'flex' : 1,
120                         'primary' : false, 'hidden' : false, 'render' : function(my) { return get_bool( my.mb.voided() ) ? "Yes" : "No"; },
121                 },
122                 {
123                         'persist' : 'hidden width ordinal', 'id' : 'voider', 'label' : 'Voider', 'flex' : 1,
124                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mb.voider() ? "Id = " + my.mb.voider() : ""; },
125                 },
126                 {
127                         'persist' : 'hidden width ordinal', 'id' : 'void_time', 'label' : 'Void Time', 'flex' : 1,
128                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mb.void_time(); },
129                 },
130                 {
131                         'persist' : 'hidden width ordinal', 'id' : 'amount', 'label' : 'Amount', 'flex' : 1,
132                         'primary' : false, 'hidden' : false, 'render' : function(my) { return util.money.sanitize( my.mb.amount() ); },
133                         'sort_type' : 'money',
134                 },
135                 {
136                         'persist' : 'hidden width ordinal', 'id' : 'billing_type', 'label' : 'Type', 'flex' : 1,
137                         'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mb.billing_type(); },
138                 },
139                 {
140                         'persist' : 'hidden width ordinal', 'id' : 'billing_ts', 'label' : 'When', 'flex' : 1,
141                         'primary' : false, 'hidden' : false, 'render' : function(my) { return util.date.formatted_date( my.mb.billing_ts(), "" ); },
142                 },
143                 {
144                         'persist' : 'hidden width ordinal', 'id' : 'note', 'label' : 'Note', 'flex' : 2,
145                         'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mb.note(); },
146                 },
147                 {
148                         'persist' : 'hidden width ordinal', 'id' : 'xact', 'label' : 'Transaction ID', 'flex' : 1,
149                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mb.xact(); },
150                 },
151         ];
152         for (var i = 0; i < c.length; i++) {
153                 if (modify[ c[i].id ]) {
154                         for (var j in modify[ c[i].id ]) {
155                                 c[i][j] = modify[ c[i].id ][j];
156                         }
157                 }
158         }
159         if (params) {
160                 if (params.just_these) {
161                         JSAN.use('util.functional');
162                         var new_c = [];
163                         for (var i = 0; i < params.just_these.length; i++) {
164                                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
165                                 new_c.push( function(y){ return y; }( x ) );
166                         }
167                         c = new_c;
168                 }
169                 if (params.except_these) {
170                         JSAN.use('util.functional');
171                         var new_c = [];
172                         for (var i = 0; i < c.length; i++) {
173                                 var x = util.functional.find_list(params.except_these,function(d){return(d==c[i].id);});
174                                 if (!x) new_c.push(c[i]);
175                         }
176                         c = new_c;
177                 }
178
179         }
180         return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
181 }
182
183 patron.util.mp_columns = function(modify,params) {
184
185         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
186         JSAN.use('util.money'); JSAN.use('util.date'); JSAN.use('patron.util');
187
188         var c = [
189                 {
190                         'persist' : 'hidden width ordinal', 'id' : 'mp_id', 'label' : 'ID', 'flex' : 1,
191                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mp.id(); },
192                 },
193                 {
194                         'persist' : 'hidden width ordinal', 'id' : 'mp_amount', 'label' : 'Amount', 'flex' : 1,
195                         'primary' : false, 'hidden' : false, 'render' : function(my) { return util.money.sanitize( my.mp.amount() ); },
196                         'sort_type' : 'money',
197                 },
198                 {
199                         'persist' : 'hidden width ordinal', 'id' : 'mp_payment_type', 'label' : 'Type', 'flex' : 1,
200                         'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mp.payment_type(); },
201                 },
202                 {
203                         'persist' : 'hidden width ordinal', 'id' : 'mp_payment_ts', 'label' : 'When', 'flex' : 1,
204                         'primary' : false, 'hidden' : false, 'render' : function(my) { return util.date.formatted_date( my.mp.payment_ts(), "" ); },
205                 },
206                 {
207                         'persist' : 'hidden width ordinal', 'id' : 'mp_note', 'label' : 'Note', 'flex' : 2,
208                         'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mp.note(); },
209                 },
210                 {
211                         'persist' : 'hidden width ordinal', 'id' : 'mp_ws', 'label' : 'Workstation', 'flex' : 1,
212                         'primary' : false, 'hidden' : false, 'render' : function(my) { return my.mp.cash_drawer().name(); }, 
213                 },
214                 {
215                         'persist' : 'hidden width ordinal', 'id' : 'mp_staff', 'label' : 'Staff', 'flex' : 1,
216                         'primary' : false, 'hidden' : false, 'render' : function(my) { var s = my.mp.accepting_usr(); if (s && typeof s != "object") s = patron.util.retrieve_fleshed_au_via_id(ses(),s); return s.card().barcode() + " @ " + data.hash.aou[ s.home_ou() ].shortname(); },
217                 },
218                 {
219                         'persist' : 'hidden width ordinal', 'id' : 'mp_xact', 'label' : 'Transaction ID', 'flex' : 1,
220                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.mp.xact(); },
221                 },
222         ];
223         for (var i = 0; i < c.length; i++) {
224                 if (modify[ c[i].id ]) {
225                         for (var j in modify[ c[i].id ]) {
226                                 c[i][j] = modify[ c[i].id ][j];
227                         }
228                 }
229         }
230         if (params) {
231                 if (params.just_these) {
232                         JSAN.use('util.functional');
233                         var new_c = [];
234                         for (var i = 0; i < params.just_these.length; i++) {
235                                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
236                                 new_c.push( function(y){ return y; }( x ) );
237                         }
238                         c = new_c;
239                 }
240                 if (params.except_these) {
241                         JSAN.use('util.functional');
242                         var new_c = [];
243                         for (var i = 0; i < c.length; i++) {
244                                 var x = util.functional.find_list(params.except_these,function(d){return(d==c[i].id);});
245                                 if (!x) new_c.push(c[i]);
246                         }
247                         c = new_c;
248                 }
249
250         }
251         return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
252 }
253
254 patron.util.columns = function(modify,params) {
255         
256         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
257
258         var c = [
259                 {
260                         'persist' : 'hidden width ordinal', 'id' : 'barcode', 'label' : 'Barcode', 'flex' : 1, 
261                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.card().barcode(); },
262                 },
263                 { 
264                         'persist' : 'hidden width ordinal', 'id' : 'usrname', 'label' : 'Login Name', 'flex' : 1, 
265                         'primary' : false, 'hidden' : true, 'render' : function(my) { my.au.usrname(); },
266                 },
267                 { 
268                         'persist' : 'hidden width ordinal', 'id' : 'profile', 'label' : 'Group', 'flex' : 1, 
269                         'primary' : false, 'hidden' : true, 'render' : function(my) { return data.hash.pgt[ my.au.profile() ].name(); },
270                 },
271                 { 
272                         'persist' : 'hidden width ordinal', 'id' : 'active', 'label' : document.getElementById('commonStrings').getString('staff.au_label_active'), 'flex' : 1, 
273                         'primary' : false, 'hidden' : true, 'render' : function(my) { return get_bool( my.au.active() ) ? "Yes" : "No"; },
274                 },
275                 {
276                         'persist' : 'hidden width ordinal', 'id' : 'barred', 'label' : 'Barred', 'flex' : 1,
277                         'primary' : false, 'hidden' : true, 'render' : function(my) { return get_bool( my.au.barred() ) ? "Yes" : "No"; },
278                 },
279                 { 
280                         'persist' : 'hidden width ordinal', 'id' : 'id', 'label' : document.getElementById('commonStrings').getString('staff.au_label_id'), 'flex' : 1, 
281                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.id(); },
282                 },
283                 { 
284                         'persist' : 'hidden width ordinal', 'id' : 'prefix', 'label' : document.getElementById('commonStrings').getString('staff.au_label_prefix'), 'flex' : 1, 
285                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.prefix(); },
286                 },
287                 { 
288                         'persist' : 'hidden width ordinal', 'id' : 'family_name', 'label' : document.getElementById('commonStrings').getString('staff.au_label_family_name'), 'flex' : 1, 
289                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.family_name(); },
290                 },
291                 { 
292                         'persist' : 'hidden width ordinal', 'id' : 'first_given_name', 'label' : document.getElementById('commonStrings').getString('staff.au_label_first_given_name'), 'flex' : 1, 
293                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.first_given_name(); },
294                 },
295                 { 
296                         'persist' : 'hidden width ordinal', 'id' : 'second_given_name', 'label' : document.getElementById('commonStrings').getString('staff.au_label_second_given_name'), 'flex' : 1, 
297                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.second_given_name(); },
298                 },
299                 { 
300                         'persist' : 'hidden width ordinal', 'id' : 'suffix', 'label' : document.getElementById('commonStrings').getString('staff.au_label_suffix'), 'flex' : 1, 
301                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.suffix(); },
302                 },
303                 { 
304                         'persist' : 'hidden width ordinal', 'id' : 'alert_message', 'label' : 'Alert', 'flex' : 1, 
305                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.alert_message(); },
306                 },
307                 { 
308                         'persist' : 'hidden width ordinal', 'id' : 'claims_returned_count', 'label' : 'Returns Claimed', 'flex' : 1, 
309                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.claims_returned_count(); },
310                         'sort_type' : 'number',
311                 },
312                 { 
313                         'persist' : 'hidden width ordinal', 'id' : 'create_date', 'label' : 'Created On', 'flex' : 1, 
314                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.create_date(); },
315                 },
316                 { 
317                         'persist' : 'hidden width ordinal', 'id' : 'expire_date', 'label' : 'Expires On', 'flex' : 1, 
318                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.expire_date().substr(0,10); },
319                 },
320                 { 
321                         'persist' : 'hidden width ordinal', 'id' : 'home_ou', 'label' : 'Home Lib', 'flex' : 1, 
322                         'primary' : false, 'hidden' : true, 'render' : function(my) { return data.hash.aou[ my.au.home_ou() ].shortname(); },
323                 },
324                 { 
325                         'persist' : 'hidden width ordinal', 'id' : 'credit_forward_balance', 'label' : 'Credit', 'flex' : 1, 
326                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.credit_forward_balance(); },
327                         'sort_type' : 'money',
328                 },
329                 { 
330                         'persist' : 'hidden width ordinal', 'id' : 'day_phone', 'label' : 'Day Phone', 'flex' : 1, 
331                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.day_phone(); },
332                 },
333                 { 
334                         'persist' : 'hidden width ordinal', 'id' : 'evening_phone', 'label' : 'Evening Phone', 'flex' : 1, 
335                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.evening_phone(); },
336                 },
337                 { 
338                         'persist' : 'hidden width ordinal', 'id' : 'other_phone', 'label' : 'Other Phone', 'flex' : 1, 
339                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.other_phone(); },
340                 },
341                 { 
342                         'persist' : 'hidden width ordinal', 'id' : 'email', 'label' : 'Email', 'flex' : 1, 
343                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.email(); },
344                 },
345                 { 
346                         'persist' : 'hidden width ordinal', 'id' : 'dob', 'label' : 'Birth Date', 'flex' : 1, 
347                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.dob().substr(0,10); },
348                 },
349                 { 
350                         'persist' : 'hidden width ordinal', 'id' : 'ident_type', 'label' : 'Ident Type', 'flex' : 1, 
351                         'primary' : false, 'hidden' : true, 'render' : function(my) { return data.hash.cit[ my.au.ident_type() ].name(); },
352                 },
353                 { 
354                         'persist' : 'hidden width ordinal', 'id' : 'ident_value', 'label' : 'Ident Value', 'flex' : 1, 
355                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.ident_value(); },
356                 },
357                 { 
358                         'persist' : 'hidden width ordinal', 'id' : 'ident_type2', 'label' : 'Ident Type 2', 'flex' : 1, 
359                         'primary' : false, 'hidden' : true, 'render' : function(my) { return data.hash.cit[ my.au.ident_type2() ].name(); },
360                 },
361                 { 
362                         'persist' : 'hidden width ordinal', 'id' : 'ident_value2', 'label' : 'Ident Value 2', 'flex' : 1, 
363                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.ident_value2(); },
364                 },
365                 { 
366                         'persist' : 'hidden width ordinal', 'id' : 'net_access_level', 'label' : 'Net Access', 'flex' : 1, 
367                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.net_access_level(); },
368                 },
369                 { 
370                         'persist' : 'hidden width ordinal', 'id' : 'master_account', 'label' : 'Group Lead', 'flex' : 1, 
371                         'primary' : false, 'hidden' : true, 'render' : function(my) { return get_bool( my.au.master_account() ) ? "Yes" : "No"; },
372                 },
373                 { 
374                         'persist' : 'hidden width ordinal', 'id' : 'usrgroup', 'label' : 'Group ID', 'flex' : 1, 
375                         'primary' : false, 'hidden' : true, 'render' : function(my) { return my.au.usrgroup(); },
376                 },
377         ];
378         for (var i = 0; i < c.length; i++) {
379                 if (modify[ c[i].id ]) {
380                         for (var j in modify[ c[i].id ]) {
381                                 c[i][j] = modify[ c[i].id ][j];
382                         }
383                 }
384         }
385         if (params) {
386                 if (params.just_these) {
387                         JSAN.use('util.functional');
388                         var new_c = [];
389                         for (var i = 0; i < params.just_these.length; i++) {
390                                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
391                                 new_c.push( function(y){ return y; }( x ) );
392                         }
393                         c = new_c;
394                 }
395                 if (params.except_these) {
396                         JSAN.use('util.functional');
397                         var new_c = [];
398                         for (var i = 0; i < c.length; i++) {
399                                 var x = util.functional.find_list(params.except_these,function(d){return(d==c[i].id);});
400                                 if (!x) new_c.push(c[i]);
401                         }
402                         c = new_c;
403                 }
404
405         }
406         return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
407 }
408 /*
409 patron.util.std_map_row_to_column = function(error_value) {
410         return function(row,col) {
411                 // row contains { 'my' : { 'au' : {} } }
412                 // col contains one of the objects listed above in columns
413                 
414                 var obj = {}; obj.OpenILS = {}; 
415                 JSAN.use('util.error'); obj.error = new util.error();
416                 JSAN.use('OpenILS.data'); obj.OpenILS.data = new OpenILS.data(); obj.OpenILS.data.init({'via':'stash'});
417                 JSAN.use('util.date'); JSAN.use('util.money');
418
419                 var my = row.my;
420                 var value;
421                 try { 
422                         value = eval( col.render );
423                 } catch(E) {
424                         obj.error.sdump('D_WARN','map_row_to_column: ' + E);
425                         if (error_value) { value = error_value; } else { value = '   ' };
426                 }
427                 return value;
428         }
429 }
430 */
431 patron.util.std_map_row_to_columns = function(error_value) {
432         return function(row,cols) {
433                 // row contains { 'my' : { 'au' : {} } }
434                 // cols contains all of the objects listed above in columns
435                 
436                 var obj = {}; obj.OpenILS = {}; 
437                 JSAN.use('util.error'); obj.error = new util.error();
438                 JSAN.use('OpenILS.data'); obj.OpenILS.data = new OpenILS.data(); obj.OpenILS.data.init({'via':'stash'});
439                 JSAN.use('util.date'); JSAN.use('util.money');
440
441                 var my = row.my;
442                 var values = [];
443                 var cmd = '';
444                 try { 
445                         for (var i = 0; i < cols.length; i++) {
446                                 switch (typeof cols[i].render) {
447                                         case 'function': try { values[i] = cols[i].render(my); } catch(E) { values[i] = error_value; dump(E+'\n'); } break;
448                                         case 'string' : cmd += 'try { ' + cols[i].render + '; values['+i+'] = v; } catch(E) { values['+i+'] = error_value; }'; break;
449                                         default: cmd += 'values['+i+'] = "??? '+(typeof cols[i].render)+'"; ';
450                                 }
451                         }
452                         if (cmd) eval( cmd );
453                 } catch(E) {
454                         obj.error.sdump('D_WARN','map_row_to_column: ' + E);
455                         if (error_value) { value = error_value; } else { value = '   ' };
456                 }
457                 return values;
458         }
459 }
460
461 patron.util.retrieve_au_via_id = function(session, id, f) {
462         JSAN.use('util.network');
463         var network = new util.network();
464         var patron_obj = network.simple_request(
465                 'FM_AU_RETRIEVE_VIA_ID',
466                 [ session, id ],
467                 f
468         );
469         return patron_obj;
470 }
471
472 patron.util.retrieve_name_via_id = function(session, id) {
473         JSAN.use('util.network');
474         var network = new util.network();
475         var parts = network.simple_request(
476                 'BLOB_AU_PARTS_RETRIEVE',
477                 [ session, id, ['family_name', 'first_given_name', 'second_given_name', 'home_ou' ] ]
478         );
479         return parts;
480 }
481
482 patron.util.retrieve_fleshed_au_via_id = function(session, id) {
483         JSAN.use('util.network');
484         var network = new util.network();
485         var patron_obj = network.simple_request(
486                 'FM_AU_FLESHED_RETRIEVE_VIA_ID',
487                 [ session, id ]
488         );
489         patron.util.set_penalty_css(patron_obj);
490         return patron_obj;
491 }
492
493 patron.util.retrieve_fleshed_au_via_barcode = function(session, id) {
494         JSAN.use('util.network');
495         var network = new util.network();
496         var patron_obj = network.simple_request(
497                 'FM_AU_RETRIEVE_VIA_BARCODE',
498                 [ session, id ]
499         );
500         patron.util.set_penalty_css(patron_obj);
501         return patron_obj;
502 }
503
504 var TIME = { minute : 60, hour : 60*60, day : 60*60*24, year : 60*60*24*365 };
505
506 patron.util.set_penalty_css = function(patron) {
507         try {
508                                                         removeCSSClass(document.documentElement,'PATRON_HAS_BILLS');
509                                                         removeCSSClass(document.documentElement,'PATRON_HAS_OVERDUES');
510                                                         removeCSSClass(document.documentElement,'PATRON_HAS_NOTES');
511                                                         removeCSSClass(document.documentElement,'PATRON_EXCEEDS_CHECKOUT_COUNT');
512                                                         removeCSSClass(document.documentElement,'PATRON_EXCEEDS_OVERDUE_COUNT');
513                                                         removeCSSClass(document.documentElement,'PATRON_EXCEEDS_FINES');
514                                                         removeCSSClass(document.documentElement,'NO_PENALTIES');
515                                                         removeCSSClass(document.documentElement,'ONE_PENALTY');
516                                                         removeCSSClass(document.documentElement,'MULTIPLE_PENALTIES');
517                                                         removeCSSClass(document.documentElement,'PATRON_HAS_ALERT');
518                                                         removeCSSClass(document.documentElement,'PATRON_BARRED');
519                                                         removeCSSClass(document.documentElement,'PATRON_INACTIVE');
520                                                         removeCSSClass(document.documentElement,'PATRON_EXPIRED');
521                                                         removeCSSClass(document.documentElement,'PATRON_HAS_INVALID_DOB');
522                                                         removeCSSClass(document.documentElement,'PATRON_HAS_INVALID_ADDRESS');
523                                                         removeCSSClass(document.documentElement,'PATRON_AGE_GE_65');
524                                                         removeCSSClass(document.documentElement,'PATRON_AGE_LT_65');
525                                                         removeCSSClass(document.documentElement,'PATRON_AGE_GE_24');
526                                                         removeCSSClass(document.documentElement,'PATRON_AGE_LT_24');
527                                                         removeCSSClass(document.documentElement,'PATRON_AGE_GE_21');
528                                                         removeCSSClass(document.documentElement,'PATRON_AGE_LT_21');
529                                                         removeCSSClass(document.documentElement,'PATRON_AGE_GE_18');
530                                                         removeCSSClass(document.documentElement,'PATRON_AGE_LT_18');
531                                                         removeCSSClass(document.documentElement,'PATRON_AGE_GE_13');
532                                                         removeCSSClass(document.documentElement,'PATRON_AGE_LT_13');
533                                                         removeCSSClass(document.documentElement,'PATRON_NET_ACCESS_1');
534                                                         removeCSSClass(document.documentElement,'PATRON_NET_ACCESS_2');
535                                                         removeCSSClass(document.documentElement,'PATRON_NET_ACCESS_3');
536
537                 JSAN.use('util.network'); var net = new util.network();
538                 net.simple_request('FM_MOUS_RETRIEVE',[ ses(), patron.id() ], function(req) {
539                         if (req.getResultObject().balance_owed() > 0) addCSSClass(document.documentElement,'PATRON_HAS_BILLS');
540                 });
541                 net.simple_request('FM_CIRC_COUNT_RETRIEVE_VIA_USER',[ ses(), patron.id() ], function(req) {
542                         try {
543                                 var co = req.getResultObject();
544                                 if (co.overdue > 0 || co.long_overdue > 0) addCSSClass(document.documentElement,'PATRON_HAS_OVERDUES');
545                         } catch(E) {
546                                 alert(E);
547                         }
548                 });
549                 net.simple_request('FM_AUN_RETRIEVE_ALL',[ ses(), { 'patronid' : patron.id() } ], function(req) {
550                         var notes = req.getResultObject();
551                         if (notes.length > 0) addCSSClass(document.documentElement,'PATRON_HAS_NOTES');
552                 });
553
554                 /*
555                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
556                 data.last_patron = patron.id(); data.stash('last_patron');
557                 */
558
559                 var penalties = patron.standing_penalties();
560                 for (var i = 0; i < penalties.length; i++) {
561                         /* this comes from /opac/common/js/utils.js */
562                         addCSSClass(document.documentElement,penalties[i].penalty_type());
563                 }
564
565                 switch(penalties.length) {
566                         case 0: addCSSClass(document.documentElement,'NO_PENALTIES'); break;
567                         case 1: addCSSClass(document.documentElement,'ONE_PENALTY'); break;
568                         default: addCSSClass(document.documentElement,'MULTIPLE_PENALTIES'); break;
569                 }
570
571                 if (patron.alert_message()) {
572                         addCSSClass(document.documentElement,'PATRON_HAS_ALERT');
573                 }
574
575                 if (get_bool( patron.barred() )) {
576                         addCSSClass(document.documentElement,'PATRON_BARRED');
577                 }
578
579                 if (!get_bool( patron.active() )) {
580                         addCSSClass(document.documentElement,'PATRON_INACTIVE');
581                 }
582
583                 try { addCSSClass(document.documentElement,'PATRON_NET_ACCESS_' + patron.net_access_level()); } catch(E) {}
584
585                 var now = new Date();
586                 now = now.getTime()/1000;
587
588                 var expire_parts = patron.expire_date().substr(0,10).split('-');
589                 expire_parts[1] = expire_parts[1] - 1;
590
591                 var expire = new Date();
592                 expire.setFullYear(expire_parts[0], expire_parts[1], expire_parts[2]);
593                 expire = expire.getTime()/1000
594
595                 if (expire < now) addCSSClass(document.documentElement,'PATRON_EXPIRED');
596
597                 if (patron.dob()) {
598                         var age_parts = patron.dob().substr(0,10).split('-');
599                         age_parts[1] = age_parts[1] - 1;
600
601                         var born = new Date();
602                         born.setFullYear(age_parts[0], age_parts[1], age_parts[2]);
603                         born = born.getTime()/1000
604
605                         var patron_age = now - born;
606                         var years_old = Number(patron_age / TIME.year);
607
608                         addCSSClass(document.documentElement,'PATRON_AGE_IS_' + years_old);
609
610                         if ( years_old >= 65 ) addCSSClass(document.documentElement,'PATRON_AGE_GE_65');
611                         if ( years_old < 65 )  addCSSClass(document.documentElement,'PATRON_AGE_LT_65');
612                 
613                         if ( years_old >= 24 ) addCSSClass(document.documentElement,'PATRON_AGE_GE_24');
614                         if ( years_old < 24 )  addCSSClass(document.documentElement,'PATRON_AGE_LT_24');
615                         
616                         if ( years_old >= 21 ) addCSSClass(document.documentElement,'PATRON_AGE_GE_21');
617                         if ( years_old < 21 )  addCSSClass(document.documentElement,'PATRON_AGE_LT_21');
618                 
619                         if ( years_old >= 18 ) addCSSClass(document.documentElement,'PATRON_AGE_GE_18');
620                         if ( years_old < 18 )  addCSSClass(document.documentElement,'PATRON_AGE_LT_18');
621                 
622                         if ( years_old >= 13 ) addCSSClass(document.documentElement,'PATRON_AGE_GE_13');
623                         if ( years_old < 13 )  addCSSClass(document.documentElement,'PATRON_AGE_LT_13');
624                 } else {
625                         addCSSClass(document.documentElement,'PATRON_HAS_INVALID_DOB');
626                 }
627
628                 if (patron.mailing_address()) {
629                         if (!get_bool(patron.mailing_address().valid())) {
630                                 addCSSClass(document.documentElement,'PATRON_HAS_INVALID_ADDRESS');
631                         }
632                 }
633                 if (patron.billing_address()) {
634                         if (!get_bool(patron.billing_address().valid())) {
635                                 addCSSClass(document.documentElement,'PATRON_HAS_INVALID_ADDRESS');
636                         }
637                 }
638
639         } catch(E) {
640                 dump('patron.util.set_penalty_css: ' + E + '\n');
641                 alert('patron.util.set_penalty_css: ' + E + '\n');
642         }
643 }
644
645
646 dump('exiting patron/util.js\n');