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