]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/patron/util.js
don't treat Hold Alias (which is for replacing a name entirely on a hold slip) as...
[working/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     'merge', 'ausp_columns', 'format_name'
10 ];
11 patron.util.EXPORT_TAGS = { ':all' : patron.util.EXPORT_OK };
12
13 patron.util.mbts_columns = function(modify,params) {
14
15         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
16         JSAN.use('util.money'); JSAN.use('util.date');
17
18     var commonStrings = document.getElementById('commonStrings');
19
20         var c = [
21                 {
22                         'persist' : 'hidden width ordinal', 'id' : 'mbts_id', 'label' : commonStrings.getString('staff.mbts_id_label'), 'flex' : 1,
23                         'primary' : false, 'hidden' : false, 'editable' : false, 'render' : function(my) { return my.mbts.id(); }
24                 },
25                 {
26                         'persist' : 'hidden width ordinal', 'id' : 'usr', 'label' : commonStrings.getString('staff.mbts_usr_label'), 'flex' : 1,
27                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.mbts.usr() ? "Id = " + my.mbts.usr() : ""; }
28                 },
29                 {
30                         'persist' : 'hidden width ordinal', 'id' : 'xact_type', 'label' : commonStrings.getString('staff.mbts_xact_type_label'), 'flex' : 1,
31                         'primary' : false, 'hidden' : false, 'editable' : false, 'render' : function(my) { return my.mbts.xact_type(); }
32                 },
33                 {
34                         'persist' : 'hidden width ordinal', 'id' : 'balance_owed', 'label' : commonStrings.getString('staff.mbts_balance_owed_label'), 'flex' : 1,
35                         'primary' : false, 'hidden' : false, 'editable' : false, 'render' : function(my) { return util.money.sanitize( my.mbts.balance_owed() ); },
36                         'sort_type' : 'money'
37                 },
38                 {
39                         'persist' : 'hidden width ordinal', 'id' : 'total_owed', 'label' : commonStrings.getString('staff.mbts_total_owed_label'), 'flex' : 1,
40                         'primary' : false, 'hidden' : false, 'editable' : false, 'render' : function(my) { return util.money.sanitize( my.mbts.total_owed() ); },
41                         'sort_type' : 'money'
42                 },
43                 {
44                         'persist' : 'hidden width ordinal', 'id' : 'total_paid', 'label' : commonStrings.getString('staff.mbts_total_paid_label'), 'flex' : 1,
45                         'primary' : false, 'hidden' : false, 'editable' : false, 'render' : function(my) { return util.money.sanitize( my.mbts.total_paid() ); },
46                         'sort_type' : 'money'
47                 },
48                 {
49                         'persist' : 'hidden width ordinal', 'id' : 'last_billing_note', 'label' : commonStrings.getString('staff.mbts_last_billing_note_label'), 'flex' : 2,
50                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.mbts.last_billing_note(); }
51                 },
52                 {
53                         'persist' : 'hidden width ordinal', 'id' : 'last_billing_type', 'label' : commonStrings.getString('staff.mbts_last_billing_type_label'), 'flex' : 1,
54                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.mbts.last_billing_type(); }
55                 },
56                 {
57                         'persist' : 'hidden width ordinal', 'id' : 'last_billing_ts', 'label' : commonStrings.getString('staff.mbts_last_billing_timestamp_label'), 'flex' : 1,
58                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return util.date.formatted_date( my.mbts.last_billing_ts(), "" ); }
59                 },
60                 {
61                         'persist' : 'hidden width ordinal', 'id' : 'last_payment_note', 'label' : commonStrings.getString('staff.mbts_last_payment_note_label'), 'flex' : 2,
62                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.mbts.last_payment_note(); }
63                 },
64                 {
65                         'persist' : 'hidden width ordinal', 'id' : 'last_payment_type', 'label' : commonStrings.getString('staff.mbts_last_payment_type_label'), 'flex' : 1,
66                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.mbts.last_payment_type(); }
67                 },
68                 {
69                         'persist' : 'hidden width ordinal', 'id' : 'last_payment_ts', 'label' : commonStrings.getString('staff.mbts_last_payment_timestamp_label'), 'flex' : 1,
70                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return util.date.formatted_date( my.mbts.last_payment_ts(), "" ); }
71                 },
72                 {
73                         'persist' : 'hidden width ordinal', 'id' : 'xact_start', 'label' : commonStrings.getString('staff.mbts_xact_start_label'), 'flex' : 1,
74                         'primary' : false, 'hidden' : false, 'editable' : false, 'render' : function(my) { return my.mbts.xact_start() ? my.mbts.xact_start().toString().substr(0,10) : ""; }
75                 },
76                 {
77                         'persist' : 'hidden width ordinal', 'id' : 'xact_finish', 'label' : commonStrings.getString('staff.mbts_xact_finish_label'), 'flex' : 1,
78                         'primary' : false, 'hidden' : false, 'editable' : false, 'render' : function(my) { return my.mbts.xact_finish() ? my.mbts.xact_finish().toString().substr(0,10) : ""; }
79                 },
80         ];
81         for (var i = 0; i < c.length; i++) {
82                 if (modify[ c[i].id ]) {
83                         for (var j in modify[ c[i].id ]) {
84                                 c[i][j] = modify[ c[i].id ][j];
85                         }
86                 }
87         }
88         if (params) {
89                 if (params.just_these) {
90                         JSAN.use('util.functional');
91                         var new_c = [];
92                         for (var i = 0; i < params.just_these.length; i++) {
93                                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
94                                 new_c.push( function(y){ return y; }( x ) );
95                         }
96                         c = new_c;
97                 }
98                 if (params.except_these) {
99                         JSAN.use('util.functional');
100                         var new_c = [];
101                         for (var i = 0; i < c.length; i++) {
102                                 var x = util.functional.find_list(params.except_these,function(d){return(d==c[i].id);});
103                                 if (!x) new_c.push(c[i]);
104                         }
105                         c = new_c;
106                 }
107         }
108         return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
109 }
110
111 patron.util.mb_columns = function(modify,params) {
112
113         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
114         JSAN.use('util.money'); JSAN.use('util.date');
115
116     var commonStrings = document.getElementById('commonStrings');
117
118         var c = [
119                 {
120                         'persist' : 'hidden width ordinal', 'id' : 'mb_id', 'label' : commonStrings.getString('staff.mb_id_label'), 'flex' : 1,
121                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.mb.id(); }
122                 },
123                 {
124                         'persist' : 'hidden width ordinal', 'id' : 'voided', 'label' : commonStrings.getString('staff.mb_voided_label'), 'flex' : 1,
125                         'primary' : false, 'hidden' : false, 'editable' : false, 'render' : function(my) { return get_bool( my.mb.voided() ) ? "Yes" : "No"; }
126                 },
127                 {
128                         'persist' : 'hidden width ordinal', 'id' : 'voider', 'label' : commonStrings.getString('staff.mb_voider_label'), 'flex' : 1,
129                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.mb.voider() ? "Id = " + my.mb.voider() : ""; }
130                 },
131                 {
132                         'persist' : 'hidden width ordinal', 'id' : 'void_time', 'label' : commonStrings.getString('staff.mb_void_time_label'), 'flex' : 1,
133                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.mb.void_time(); }
134                 },
135                 {
136                         'persist' : 'hidden width ordinal', 'id' : 'amount', 'label' : commonStrings.getString('staff.mb_amount_label'), 'flex' : 1,
137                         'primary' : false, 'hidden' : false, 'editable' : false, 'render' : function(my) { return util.money.sanitize( my.mb.amount() ); },
138                         'sort_type' : 'money'
139                 },
140                 {
141                         'persist' : 'hidden width ordinal', 'id' : 'billing_type', 'label' : commonStrings.getString('staff.mb_billing_type_label'), 'flex' : 1,
142                         'primary' : false, 'hidden' : false, 'editable' : false, 'render' : function(my) { return my.mb.billing_type(); }
143                 },
144                 {
145                         'persist' : 'hidden width ordinal', 'id' : 'billing_ts', 'label' : commonStrings.getString('staff.mb_billing_ts_label'), 'flex' : 1,
146                         'primary' : false, 'hidden' : false, 'editable' : false, 'render' : function(my) { return util.date.formatted_date( my.mb.billing_ts(), "" ); }
147                 },
148                 {
149                         'persist' : 'hidden width ordinal', 'id' : 'note', 'label' : commonStrings.getString('staff.mb_note_label'), 'flex' : 2,
150                         'primary' : false, 'hidden' : false, 'editable' : false, 'render' : function(my) { return my.mb.note(); }
151                 },
152                 {
153                         'persist' : 'hidden width ordinal', 'id' : 'xact', 'label' : commonStrings.getString('staff.mb_xact_label'), 'flex' : 1,
154                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.mb.xact(); }
155                 },
156         ];
157         for (var i = 0; i < c.length; i++) {
158                 if (modify[ c[i].id ]) {
159                         for (var j in modify[ c[i].id ]) {
160                                 c[i][j] = modify[ c[i].id ][j];
161                         }
162                 }
163         }
164         if (params) {
165                 if (params.just_these) {
166                         JSAN.use('util.functional');
167                         var new_c = [];
168                         for (var i = 0; i < params.just_these.length; i++) {
169                                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
170                                 new_c.push( function(y){ return y; }( x ) );
171                         }
172                         c = new_c;
173                 }
174                 if (params.except_these) {
175                         JSAN.use('util.functional');
176                         var new_c = [];
177                         for (var i = 0; i < c.length; i++) {
178                                 var x = util.functional.find_list(params.except_these,function(d){return(d==c[i].id);});
179                                 if (!x) new_c.push(c[i]);
180                         }
181                         c = new_c;
182                 }
183
184         }
185         return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
186 }
187
188 patron.util.mp_columns = function(modify,params) {
189
190         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
191         JSAN.use('util.money'); JSAN.use('util.date'); JSAN.use('patron.util');
192
193     var commonStrings = document.getElementById('commonStrings');
194
195         var c = [
196                 {
197                         'persist' : 'hidden width ordinal', 'id' : 'mp_id', 'label' : commonStrings.getString('staff.mp_id_label'), 'flex' : 1,
198                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.mp.id(); }
199                 },
200                 {
201                         'persist' : 'hidden width ordinal', 'id' : 'mp_amount', 'label' : commonStrings.getString('staff.mp_amount_label'), 'flex' : 1,
202                         'primary' : false, 'hidden' : false, 'editable' : false, 'render' : function(my) { return util.money.sanitize( my.mp.amount() ); },
203                         'sort_type' : 'money'
204                 },
205                 {
206                         'persist' : 'hidden width ordinal', 'id' : 'mp_payment_type', 'label' : commonStrings.getString('staff.mp_payment_type_label'), 'flex' : 1,
207                         'primary' : false, 'hidden' : false, 'editable' : false, 'render' : function(my) { return my.mp.payment_type(); }
208                 },
209                 {
210                         'persist' : 'hidden width ordinal', 'id' : 'mp_payment_ts', 'label' : commonStrings.getString('staff.mp_payment_timestamp_label'), 'flex' : 1,
211                         'primary' : false, 'hidden' : false, 'editable' : false, 'render' : function(my) { return util.date.formatted_date( my.mp.payment_ts(), "" ); }
212                 },
213                 {
214                         'persist' : 'hidden width ordinal', 'id' : 'mp_note', 'label' : commonStrings.getString('staff.mp_note_label'), 'flex' : 2,
215                         'primary' : false, 'hidden' : false, 'editable' : false, 'render' : function(my) { return my.mp.note(); }
216                 },
217                 {
218                         'persist' : 'hidden width ordinal', 'id' : 'mp_ws', 'label' : commonStrings.getString('staff.mp_cash_drawer_label'), 'flex' : 1,
219                         'primary' : false, 'hidden' : false, 'editable' : false, 'render' : function(my) { return my.mp.cash_drawer().name(); }
220                 },
221                 {
222                         'persist' : 'hidden width ordinal', 'id' : 'mp_staff', 'label' : commonStrings.getString('staff.mp_accepting_usr_label'), 'flex' : 1,
223                         'primary' : false, 'hidden' : false, 'editable' : 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.family_name() + " (" + s.card().barcode() + ") @ " + data.hash.aou[ s.home_ou() ].shortname(); }
224                 },
225                 {
226                         'persist' : 'hidden width ordinal', 'id' : 'mp_xact', 'label' : commonStrings.getString('staff.mp_xact_label'), 'flex' : 1,
227                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.mp.xact(); }
228                 },
229         ];
230         for (var i = 0; i < c.length; i++) {
231                 if (modify[ c[i].id ]) {
232                         for (var j in modify[ c[i].id ]) {
233                                 c[i][j] = modify[ c[i].id ][j];
234                         }
235                 }
236         }
237         if (params) {
238                 if (params.just_these) {
239                         JSAN.use('util.functional');
240                         var new_c = [];
241                         for (var i = 0; i < params.just_these.length; i++) {
242                                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
243                                 new_c.push( function(y){ return y; }( x ) );
244                         }
245                         c = new_c;
246                 }
247                 if (params.except_these) {
248                         JSAN.use('util.functional');
249                         var new_c = [];
250                         for (var i = 0; i < c.length; i++) {
251                                 var x = util.functional.find_list(params.except_these,function(d){return(d==c[i].id);});
252                                 if (!x) new_c.push(c[i]);
253                         }
254                         c = new_c;
255                 }
256
257         }
258         return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
259 }
260
261 patron.util.ausp_columns = function(modify,params) {
262
263         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
264     JSAN.use('util.functional');
265
266     var commonStrings = document.getElementById('commonStrings');
267
268         var c = [
269                 {
270                         'persist' : 'hidden width ordinal', 'id' : 'csp_id', 'label' : commonStrings.getString('staff.csp_id_label'), 'flex' : 1,
271                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return typeof my.csp == 'object' ? my.csp.id() : my.csp; }
272                 },
273                 {
274                         'persist' : 'hidden width ordinal', 'id' : 'csp_name', 'label' : commonStrings.getString('staff.csp_name_label'), 'flex' : 1,
275                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return typeof my.csp == 'object' ? my.csp.name() : data.hash.csp[ my.csp ].name(); }
276                 },
277                 {
278                         'persist' : 'hidden width ordinal', 'id' : 'csp_label', 'label' : commonStrings.getString('staff.csp_label_label'), 'flex' : 1,
279                         'primary' : false, 'hidden' : false, 'editable' : false, 'render' : function(my) { return typeof my.csp == 'object' ? my.csp.label() : data.hash.csp[ my.csp ].label(); }
280                 },
281                 {
282                         'persist' : 'hidden width ordinal', 'id' : 'csp_block_list', 'label' : commonStrings.getString('staff.csp_block_list_label'), 'flex' : 1,
283                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return typeof my.csp == 'object' ? my.csp.block_list() : data.hash.csp[ my.csp ].block_list(); }
284                 },
285                 {
286                         'persist' : 'hidden width ordinal', 'id' : 'csp_block_circ', 'label' : commonStrings.getString('staff.csp_block_circ_label'), 'flex' : 1,
287                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { 
288                 var my_csp = typeof my.csp == 'object' ? my.csp : data.hash.csp[ my.csp ];
289                 return String( my_csp.block_list() ).match('CIRC') ? commonStrings.getString('staff.csp_block_circ_yes') : commonStrings.getString('staff.csp_block_circ_no'); 
290             }
291                 },
292                 {
293                         'persist' : 'hidden width ordinal', 'id' : 'csp_block_renew', 'label' : commonStrings.getString('staff.csp_block_renew_label'), 'flex' : 1,
294                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { 
295                 var my_csp = typeof my.csp == 'object' ? my.csp : data.hash.csp[ my.csp ];
296                 return String( my_csp.block_list() ).match('RENEW') ? commonStrings.getString('staff.csp_block_renew_yes') : commonStrings.getString('staff.csp_block_renew_no'); 
297
298             }
299                 },
300                 {
301                         'persist' : 'hidden width ordinal', 'id' : 'csp_block_hold', 'label' : commonStrings.getString('staff.csp_block_hold_label'), 'flex' : 1,
302                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { 
303                 var my_csp = typeof my.csp == 'object' ? my.csp : data.hash.csp[ my.csp ];
304                 return String( my_csp.block_list() ).match('HOLD') ?  commonStrings.getString('staff.csp_block_hold_yes') : commonStrings.getString('staff.csp_block_hold_no'); 
305             }
306                 },
307                 {
308                         'persist' : 'hidden width ordinal', 'id' : 'ausp_id', 'label' : commonStrings.getString('staff.ausp_id_label'), 'flex' : 1,
309                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.ausp ? my.ausp.id() : ''; }
310                 },
311                 {
312                         'persist' : 'hidden width ordinal', 'id' : 'ausp_staff', 'label' : commonStrings.getString('staff.ausp_staff_label'), 'flex' : 1,
313                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { 
314                 return my.ausp ? my.ausp.staff() : '';
315             }
316         },
317                 {
318                         'persist' : 'hidden width ordinal', 'id' : 'ausp_set_date', 'label' : commonStrings.getString('staff.ausp_set_date_label'), 'flex' : 1,
319                         'primary' : false, 'hidden' : false, 'editable' : false, 'render' : function(my) { 
320                 return my.ausp ? my.ausp.set_date() : '';
321             }
322         },
323                 {
324                         'persist' : 'hidden width ordinal', 'id' : 'ausp_note', 'label' : commonStrings.getString('staff.ausp_note_label'), 'flex' : 1,
325                         'primary' : false, 'hidden' : false, 'editable' : false, 'render' : function(my) { 
326                 return my.ausp ? my.ausp.note() : '';
327             }
328         },
329                 {
330                         'persist' : 'hidden width ordinal', 'id' : 'ausp_org_unit', 'label' : commonStrings.getString('staff.ausp_org_unit_label'), 'flex' : 1,
331                         'primary' : false, 'hidden' : false, 'editable' : false, 'render' : function(my) { 
332                 return my.ausp ? data.hash.aou[ my.ausp.org_unit() ].shortname() : '';
333             }
334         }
335         ];
336         for (var i = 0; i < c.length; i++) {
337                 if (modify[ c[i].id ]) {
338                         for (var j in modify[ c[i].id ]) {
339                                 c[i][j] = modify[ c[i].id ][j];
340                         }
341                 }
342         }
343         if (params) {
344                 if (params.just_these) {
345                         var new_c = [];
346                         for (var i = 0; i < params.just_these.length; i++) {
347                                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
348                                 new_c.push( function(y){ return y; }( x ) );
349                         }
350                         c = new_c;
351                 }
352                 if (params.except_these) {
353                         var new_c = [];
354                         for (var i = 0; i < c.length; i++) {
355                                 var x = util.functional.find_list(params.except_these,function(d){return(d==c[i].id);});
356                                 if (!x) new_c.push(c[i]);
357                         }
358                         c = new_c;
359                 }
360
361         }
362         return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
363 }
364
365
366 patron.util.columns = function(modify,params) {
367         
368         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
369
370     var commonStrings = document.getElementById('commonStrings');
371
372         var c = [
373                 {
374                         'persist' : 'hidden width ordinal', 'id' : 'barcode', 'label' : commonStrings.getString('staff.card_barcode_label'), 'flex' : 1, 
375                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.au.card().barcode(); }
376                 },
377                 { 
378                         'persist' : 'hidden width ordinal', 'id' : 'usrname', 'label' : commonStrings.getString('staff.au_usrname_label'), 'flex' : 1, 
379                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.au.usrname(); }
380                 },
381                 { 
382                         'persist' : 'hidden width ordinal', 'id' : 'profile', 'label' : commonStrings.getString('staff.au_profile_label'), 'flex' : 1, 
383                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return data.hash.pgt[ my.au.profile() ].name(); }
384                 },
385                 { 
386                         'persist' : 'hidden width ordinal', 'id' : 'active', 'label' : commonStrings.getString('staff.au_active_label'), 'flex' : 1, 
387                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return get_bool( my.au.active() ) ? "Yes" : "No"; }
388                 },
389                 {
390                         'persist' : 'hidden width ordinal', 'id' : 'barred', 'label' : commonStrings.getString('staff.au_barred_label'), 'flex' : 1,
391                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return get_bool( my.au.barred() ) ? "Yes" : "No"; }
392                 },
393                 { 
394                         'persist' : 'hidden width ordinal', 'id' : 'au_id', 'label' : document.getElementById('commonStrings').getString('staff.au_id_label'), 'flex' : 1, 
395                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.au.id(); }
396                 },
397                 { 
398                         'persist' : 'hidden width ordinal', 'id' : 'prefix', 'label' : document.getElementById('commonStrings').getString('staff.au_name_prefix_label'), 'flex' : 1, 
399                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.au.prefix(); }
400                 },
401                 { 
402                         'persist' : 'hidden width ordinal', 'id' : 'family_name', 'label' : document.getElementById('commonStrings').getString('staff.au_family_name_label'), 'flex' : 1, 
403                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.au.family_name(); }
404                 },
405                 { 
406                         'persist' : 'hidden width ordinal', 'id' : 'first_given_name', 'label' : document.getElementById('commonStrings').getString('staff.au_first_given_name_label'), 'flex' : 1, 
407                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.au.first_given_name(); }
408                 },
409                 { 
410                         'persist' : 'hidden width ordinal', 'id' : 'second_given_name', 'label' : document.getElementById('commonStrings').getString('staff.au_second_given_name_label'), 'flex' : 1, 
411                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.au.second_given_name(); }
412                 },
413                 { 
414                         'persist' : 'hidden width ordinal', 'id' : 'suffix', 'label' : document.getElementById('commonStrings').getString('staff.au_name_suffix_label'), 'flex' : 1, 
415                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.au.suffix(); }
416                 },
417                 { 
418                         'persist' : 'hidden width ordinal', 'id' : 'alert_message', 'label' : commonStrings.getString('staff.au_alert_message_label'), 'flex' : 1, 
419                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.au.alert_message(); }
420                 },
421                 { 
422                         'persist' : 'hidden width ordinal', 'id' : 'claims_returned_count', 'label' : commonStrings.getString('staff.au_claims_returned_count_label'), 'flex' : 1, 
423                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.au.claims_returned_count(); },
424                         'sort_type' : 'number'
425                 },
426                 { 
427                         'persist' : 'hidden width ordinal', 'id' : 'create_date', 'label' : commonStrings.getString('staff.au_create_date_label'), 'flex' : 1, 
428                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.au.create_date(); }
429                 },
430                 { 
431                         'persist' : 'hidden width ordinal', 'id' : 'expire_date', 'label' : commonStrings.getString('staff.au_expire_date_label'), 'flex' : 1, 
432                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.au.expire_date().substr(0,10); }
433                 },
434                 { 
435                         'persist' : 'hidden width ordinal', 'id' : 'home_ou', 'label' : commonStrings.getString('staff.au_home_library_label'), 'flex' : 1, 
436                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return data.hash.aou[ my.au.home_ou() ].shortname(); }
437                 },
438                 { 
439                         'persist' : 'hidden width ordinal', 'id' : 'home_ou_fullname', 'label' : commonStrings.getString('staff.au_home_library_fullname_label'), 'flex' : 1, 
440                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return data.hash.aou[ my.au.home_ou() ].name(); }
441                 },
442                 { 
443                         'persist' : 'hidden width ordinal', 'id' : 'credit_forward_balance', 'label' : commonStrings.getString('staff.au_credit_forward_balance_label'), 'flex' : 1, 
444                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.au.credit_forward_balance(); },
445                         'sort_type' : 'money'
446                 },
447                 { 
448                         'persist' : 'hidden width ordinal', 'id' : 'day_phone', 'label' : commonStrings.getString('staff.au_day_phone_label'), 'flex' : 1, 
449                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.au.day_phone(); }
450                 },
451                 { 
452                         'persist' : 'hidden width ordinal', 'id' : 'evening_phone', 'label' : commonStrings.getString('staff.au_evening_phone_label'), 'flex' : 1, 
453                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.au.evening_phone(); }
454                 },
455                 { 
456                         'persist' : 'hidden width ordinal', 'id' : 'other_phone', 'label' : commonStrings.getString('staff.au_other_phone_label'), 'flex' : 1, 
457                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.au.other_phone(); }
458                 },
459                 { 
460                         'persist' : 'hidden width ordinal', 'id' : 'email', 'label' : commonStrings.getString('staff.au_email_label'), 'flex' : 1, 
461                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.au.email(); }
462                 },
463                 { 
464                         'persist' : 'hidden width ordinal', 'id' : 'alias', 'label' : commonStrings.getString('staff.au_alias_label'), 'flex' : 1, 
465                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.au.alias(); }
466                 },
467                 { 
468                         'persist' : 'hidden width ordinal', 'id' : 'dob', 'label' : commonStrings.getString('staff.au_birth_date_label'), 'flex' : 1, 
469                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.au.dob().substr(0,10); }
470                 },
471                 { 
472                         'persist' : 'hidden width ordinal', 'id' : 'ident_type', 'label' : commonStrings.getString('staff.au_ident_type_label'), 'flex' : 1, 
473                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return data.hash.cit[ my.au.ident_type() ].name(); }
474                 },
475                 { 
476                         'persist' : 'hidden width ordinal', 'id' : 'ident_value', 'label' : commonStrings.getString('staff.au_ident_value_label'), 'flex' : 1, 
477                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.au.ident_value(); }
478                 },
479                 { 
480                         'persist' : 'hidden width ordinal', 'id' : 'ident_type2', 'label' : commonStrings.getString('staff.au_ident_type2_label'), 'flex' : 1, 
481                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return data.hash.cit[ my.au.ident_type2() ].name(); }
482                 },
483                 { 
484                         'persist' : 'hidden width ordinal', 'id' : 'ident_value2', 'label' : commonStrings.getString('staff.au_ident_value2_label'), 'flex' : 1, 
485                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.au.ident_value2(); }
486                 },
487                 { 
488                         'persist' : 'hidden width ordinal', 'id' : 'net_access_level', 'label' : commonStrings.getString('staff.au_net_access_level_label'), 'flex' : 1, 
489                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.au.net_access_level(); }
490                 },
491                 { 
492                         'persist' : 'hidden width ordinal', 'id' : 'master_account', 'label' : commonStrings.getString('staff.au_master_account_label'), 'flex' : 1, 
493                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return get_bool( my.au.master_account() ) ? "Yes" : "No"; }
494                 },
495                 { 
496                         'persist' : 'hidden width ordinal', 'id' : 'usrgroup', 'label' : commonStrings.getString('staff.au_group_id_label'), 'flex' : 1, 
497                         'primary' : false, 'hidden' : true, 'editable' : false, 'render' : function(my) { return my.au.usrgroup(); }
498                 },
499         ];
500         for (var i = 0; i < c.length; i++) {
501                 if (modify[ c[i].id ]) {
502                         for (var j in modify[ c[i].id ]) {
503                                 c[i][j] = modify[ c[i].id ][j];
504                         }
505                 }
506         }
507         if (params) {
508                 if (params.just_these) {
509                         JSAN.use('util.functional');
510                         var new_c = [];
511                         for (var i = 0; i < params.just_these.length; i++) {
512                                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
513                                 new_c.push( function(y){ return y; }( x ) );
514                         }
515                         c = new_c;
516                 }
517                 if (params.except_these) {
518                         JSAN.use('util.functional');
519                         var new_c = [];
520                         for (var i = 0; i < c.length; i++) {
521                                 var x = util.functional.find_list(params.except_these,function(d){return(d==c[i].id);});
522                                 if (!x) new_c.push(c[i]);
523                         }
524                         c = new_c;
525                 }
526
527         }
528         return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
529 }
530
531 patron.util.std_map_row_to_columns = function(error_value) {
532         return function(row,cols) {
533                 // row contains { 'my' : { 'au' : {} } }
534                 // cols contains all of the objects listed above in columns
535                 
536                 var obj = {}; obj.OpenILS = {}; 
537                 JSAN.use('util.error'); obj.error = new util.error();
538                 JSAN.use('OpenILS.data'); obj.OpenILS.data = new OpenILS.data(); obj.OpenILS.data.init({'via':'stash'});
539                 JSAN.use('util.date'); JSAN.use('util.money');
540
541                 var my = row.my;
542                 var values = [];
543                 var cmd = '';
544                 try { 
545                         for (var i = 0; i < cols.length; i++) {
546                                 switch (typeof cols[i].render) {
547                                         case 'function': try { values[i] = cols[i].render(my); } catch(E) { values[i] = error_value; obj.error.sdump('D_COLUMN_RENDER_ERROR',E); } break;
548                                         case 'string' : cmd += 'try { ' + cols[i].render + '; values['+i+'] = v; } catch(E) { values['+i+'] = error_value; }'; break;
549                                         default: cmd += 'values['+i+'] = "??? '+(typeof cols[i].render)+'"; ';
550                                 }
551                         }
552                         if (cmd) eval( cmd );
553                 } catch(E) {
554                         obj.error.sdump('D_WARN','map_row_to_column: ' + E);
555                         if (error_value) { value = error_value; } else { value = '   ' };
556                 }
557                 return values;
558         }
559 }
560
561 patron.util.retrieve_au_via_id = function(session, id, f) {
562         JSAN.use('util.network');
563         var network = new util.network();
564         var patron_obj = network.simple_request(
565                 'FM_AU_RETRIEVE_VIA_ID',
566                 [ session, id ],
567                 f
568         );
569         return patron_obj;
570 }
571
572 patron.util.retrieve_name_via_id = function(session, id) {
573         JSAN.use('util.network');
574         var network = new util.network();
575         var parts = network.simple_request(
576                 'BLOB_AU_PARTS_RETRIEVE',
577                 [ session, id, ['family_name', 'first_given_name', 'second_given_name', 'home_ou' ] ]
578         );
579         return parts;
580 }
581
582 patron.util.retrieve_fleshed_au_via_id = function(session, id) {
583         JSAN.use('util.network');
584         var network = new util.network();
585         var patron_obj = network.simple_request(
586                 'FM_AU_FLESHED_RETRIEVE_VIA_ID.authoritative',
587                 [ session, id ]
588         );
589         patron.util.set_penalty_css(patron_obj);
590         return patron_obj;
591 }
592
593 patron.util.retrieve_fleshed_au_via_barcode = function(session, id) {
594         JSAN.use('util.network');
595         var network = new util.network();
596         var patron_obj = network.simple_request(
597                 'FM_AU_RETRIEVE_VIA_BARCODE.authoritative',
598                 [ session, id ]
599         );
600         if (typeof patron_obj.ilsevent == 'undefined') patron.util.set_penalty_css(patron_obj);
601         return patron_obj;
602 }
603
604 var TIME = { minute : 60, hour : 60*60, day : 60*60*24, year : 60*60*24*365 };
605
606 patron.util.set_penalty_css = function(patron) {
607         try {
608                                                         removeCSSClass(document.documentElement,'PATRON_HAS_BILLS');
609                                                         removeCSSClass(document.documentElement,'PATRON_HAS_OVERDUES');
610                                                         removeCSSClass(document.documentElement,'PATRON_HAS_NOTES');
611                                                         removeCSSClass(document.documentElement,'PATRON_EXCEEDS_CHECKOUT_COUNT');
612                                                         removeCSSClass(document.documentElement,'PATRON_EXCEEDS_OVERDUE_COUNT');
613                                                         removeCSSClass(document.documentElement,'PATRON_EXCEEDS_FINES');
614                                                         removeCSSClass(document.documentElement,'NO_PENALTIES');
615                                                         removeCSSClass(document.documentElement,'ONE_PENALTY');
616                                                         removeCSSClass(document.documentElement,'MULTIPLE_PENALTIES');
617                                                         removeCSSClass(document.documentElement,'PATRON_HAS_ALERT');
618                                                         removeCSSClass(document.documentElement,'PATRON_BARRED');
619                                                         removeCSSClass(document.documentElement,'PATRON_INACTIVE');
620                                                         removeCSSClass(document.documentElement,'PATRON_EXPIRED');
621                                                         removeCSSClass(document.documentElement,'PATRON_HAS_INVALID_DOB');
622                                                         removeCSSClass(document.documentElement,'PATRON_HAS_INVALID_ADDRESS');
623                                                         removeCSSClass(document.documentElement,'PATRON_AGE_GE_65');
624                                                         removeCSSClass(document.documentElement,'PATRON_AGE_LT_65');
625                                                         removeCSSClass(document.documentElement,'PATRON_AGE_GE_24');
626                                                         removeCSSClass(document.documentElement,'PATRON_AGE_LT_24');
627                                                         removeCSSClass(document.documentElement,'PATRON_AGE_GE_21');
628                                                         removeCSSClass(document.documentElement,'PATRON_AGE_LT_21');
629                                                         removeCSSClass(document.documentElement,'PATRON_AGE_GE_18');
630                                                         removeCSSClass(document.documentElement,'PATRON_AGE_LT_18');
631                                                         removeCSSClass(document.documentElement,'PATRON_AGE_GE_13');
632                                                         removeCSSClass(document.documentElement,'PATRON_AGE_LT_13');
633                                                         removeCSSClass(document.documentElement,'PATRON_NET_ACCESS_1');
634                                                         removeCSSClass(document.documentElement,'PATRON_NET_ACCESS_2');
635                                                         removeCSSClass(document.documentElement,'PATRON_NET_ACCESS_3');
636
637                 JSAN.use('util.network'); var net = new util.network();
638                 net.simple_request('FM_MOUS_RETRIEVE.authoritative',[ ses(), patron.id() ], function(req) {
639                         if (req.getResultObject().balance_owed() > 0) addCSSClass(document.documentElement,'PATRON_HAS_BILLS');
640                 });
641                 net.simple_request('FM_CIRC_COUNT_RETRIEVE_VIA_USER.authoritative',[ ses(), patron.id() ], function(req) {
642                         try {
643                                 var co = req.getResultObject();
644                                 if (co.overdue > 0 || co.long_overdue > 0) addCSSClass(document.documentElement,'PATRON_HAS_OVERDUES');
645                         } catch(E) {
646                                 alert(E);
647                         }
648                 });
649                 net.simple_request('FM_AUN_RETRIEVE_ALL.authoritative',[ ses(), { 'patronid' : patron.id() } ], function(req) {
650                         var notes = req.getResultObject();
651                         if (notes.length > 0) addCSSClass(document.documentElement,'PATRON_HAS_NOTES');
652                 });
653
654                 /*
655                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
656                 data.last_patron = patron.id(); data.stash('last_patron');
657                 */
658
659                 var penalties = patron.standing_penalties();
660                 for (var i = 0; i < penalties.length; i++) {
661                         /* this comes from /opac/common/js/utils.js */
662                         addCSSClass(document.documentElement,penalties[i].standing_penalty().name());
663                 }
664
665                 switch(penalties.length) {
666                         case 0: addCSSClass(document.documentElement,'NO_PENALTIES'); break;
667                         case 1: addCSSClass(document.documentElement,'ONE_PENALTY'); break;
668                         default: addCSSClass(document.documentElement,'MULTIPLE_PENALTIES'); break;
669                 }
670
671                 if (patron.alert_message()) {
672                         addCSSClass(document.documentElement,'PATRON_HAS_ALERT');
673                 }
674
675                 if (get_bool( patron.barred() )) {
676                         addCSSClass(document.documentElement,'PATRON_BARRED');
677                 }
678
679                 if (!get_bool( patron.active() )) {
680                         addCSSClass(document.documentElement,'PATRON_INACTIVE');
681                 }
682
683                 try { addCSSClass(document.documentElement,'PATRON_NET_ACCESS_' + patron.net_access_level()); } catch(E) {}
684
685                 var now = new Date();
686                 now = now.getTime()/1000;
687
688                 var expire_parts = patron.expire_date().substr(0,10).split('-');
689                 expire_parts[1] = expire_parts[1] - 1;
690
691                 var expire = new Date();
692                 expire.setFullYear(expire_parts[0], expire_parts[1], expire_parts[2]);
693                 expire = expire.getTime()/1000
694
695                 if (expire < now) addCSSClass(document.documentElement,'PATRON_EXPIRED');
696
697                 if (patron.dob()) {
698                         var age_parts = patron.dob().substr(0,10).split('-');
699                         age_parts[1] = age_parts[1] - 1;
700
701                         var born = new Date();
702                         born.setFullYear(age_parts[0], age_parts[1], age_parts[2]);
703                         born = born.getTime()/1000
704
705                         var patron_age = now - born;
706                         var years_old = Number(patron_age / TIME.year);
707
708                         addCSSClass(document.documentElement,'PATRON_AGE_IS_' + years_old);
709
710                         if ( years_old >= 65 ) addCSSClass(document.documentElement,'PATRON_AGE_GE_65');
711                         if ( years_old < 65 )  addCSSClass(document.documentElement,'PATRON_AGE_LT_65');
712                 
713                         if ( years_old >= 24 ) addCSSClass(document.documentElement,'PATRON_AGE_GE_24');
714                         if ( years_old < 24 )  addCSSClass(document.documentElement,'PATRON_AGE_LT_24');
715                         
716                         if ( years_old >= 21 ) addCSSClass(document.documentElement,'PATRON_AGE_GE_21');
717                         if ( years_old < 21 )  addCSSClass(document.documentElement,'PATRON_AGE_LT_21');
718                 
719                         if ( years_old >= 18 ) addCSSClass(document.documentElement,'PATRON_AGE_GE_18');
720                         if ( years_old < 18 )  addCSSClass(document.documentElement,'PATRON_AGE_LT_18');
721                 
722                         if ( years_old >= 13 ) addCSSClass(document.documentElement,'PATRON_AGE_GE_13');
723                         if ( years_old < 13 )  addCSSClass(document.documentElement,'PATRON_AGE_LT_13');
724                 } else {
725                         addCSSClass(document.documentElement,'PATRON_HAS_INVALID_DOB');
726                 }
727
728         if ( get_bool( patron.juvenile() ) ) addCSSClass(document.documentElement,'PATRON_JUVENILE');
729         else removeCSSClass(document.documentElement,'PATRON_JUVENILE');
730
731                 if (patron.mailing_address()) {
732                         if (!get_bool(patron.mailing_address().valid())) {
733                                 addCSSClass(document.documentElement,'PATRON_HAS_INVALID_ADDRESS');
734                         }
735                 }
736                 if (patron.billing_address()) {
737                         if (!get_bool(patron.billing_address().valid())) {
738                                 addCSSClass(document.documentElement,'PATRON_HAS_INVALID_ADDRESS');
739                         }
740                 }
741
742         } catch(E) {
743                 dump('patron.util.set_penalty_css: ' + E + '\n');
744                 alert('patron.util.set_penalty_css: ' + E + '\n');
745         }
746 }
747
748 patron.util.merge = function(record_ids) {
749     var error;
750     try {
751         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
752         JSAN.use('util.error'); error = new util.error();
753         var top_xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" >';
754         top_xml += '<description>' + $("patronStrings").getString('staff.patron.usr_buckets.merge_records.merge_lead') + '</description>';
755         top_xml += '<hbox>';
756         top_xml += '<button id="lead" disabled="true" label="'
757                 + $("patronStrings").getString('staff.patron.usr_buckets.merge_records.button.label') + '" name="fancy_submit"/>';
758         top_xml += '<button label="' + $("patronStrings").getString('staff.patron.usr_buckets.merge_records.cancel_button.label') +'" accesskey="'
759                 + $("patronStrings").getString('staff.patron.usr_buckets.merge_records.cancel_button.accesskey') +'" name="fancy_cancel"/></hbox></vbox>';
760
761         var xml = '<form xmlns="http://www.w3.org/1999/xhtml">';
762         xml += '<table><tr valign="top">';
763         for (var i = 0; i < record_ids.length; i++) {
764             xml += '<td><input value="' + $("patronStrings").getString('staff.patron.usr_buckets.merge_records.lead')
765             xml += '" id="record_' + record_ids[i] + '" type="radio" name="lead"';
766             xml += ' onclick="' + "try { var x = $('lead'); x.setAttribute('value',";
767             xml += record_ids[i] + '); x.disabled = false; } catch(E) { alert(E); }">';
768             xml += '</input>' + $("patronStrings").getFormattedString('staff.patron.usr_buckets.merge_records.lead_record_number',[record_ids[i]]) + '</td>';
769         }
770         xml += '</tr><tr valign="top">';
771         for (var i = 0; i < record_ids.length; i++) {
772             xml += '<td nowrap="nowrap"><iframe style="min-height: 1000px; min-width: 300px" flex="1" src="' + urls.XUL_PATRON_SUMMARY; 
773             xml += '?id=' + record_ids[i] + '&amp;show_name=1"/></td>';
774         }
775         xml += '</tr></table></form>';
776         JSAN.use('util.window'); var win = new util.window();
777         var fancy_prompt_data = win.open(
778             urls.XUL_FANCY_PROMPT,
779             'fancy_prompt', 'chrome,resizable,modal,width=750,height=500',
780             {
781                 'top_xml' : top_xml, 'xml' : xml, 'title' : $("patronStrings").getString('staff.patron.usr_buckets.merge_records.fancy_prompt_title')
782             }
783         );
784
785         if (typeof fancy_prompt_data.fancy_status == 'undefined' || fancy_prompt_data.fancy_status == 'incomplete') {
786             alert($("patronStrings").getString('staff.patron.usr_buckets.merge_records.fancy_prompt.alert'));
787             return false;
788         }
789
790         JSAN.use('util.functional'); JSAN.use('util.network'); var network = new util.network();
791         var robj = network.simple_request('FM_AU_MERGE', 
792             [ 
793                 ses(), 
794                 fancy_prompt_data.lead,
795                 util.functional.filter_list( record_ids,
796                     function(o) {
797                         return o != fancy_prompt_data.lead;
798                     }
799                 )
800             ]
801         );
802         if (Number(robj) != 1) { throw(robj); }
803         return fancy_prompt_data.lead;
804     } catch(E) {
805                 dump('patron.util.merge: ' + js2JSON(E) + '\n');
806         try { error.standard_unexpected_error_alert('Error in patron.util.merge',E); } catch(F) { alert('patron.util.merge: ' + E + '\n'); }
807         return false;
808     }
809 }
810
811 patron.util.format_name = function(patron_obj) {
812     var patron_name = ( patron_obj.prefix() ? patron_obj.prefix() + ' ' : '') +
813         patron_obj.family_name() + ', ' +
814         patron_obj.first_given_name() + ' ' +
815         ( patron_obj.second_given_name() ? patron_obj.second_given_name() + ' ' : '' ) +
816         ( patron_obj.suffix() ? patron_obj.suffix() : ''); 
817     return patron_name;
818 }
819
820 dump('exiting patron/util.js\n');