]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/circ/util.js
localize dates in various list columns using dojo (hey, no more .substring(0,10)...
[working/Evergreen.git] / Open-ILS / xul / staff_client / server / circ / util.js
1 dump('entering circ/util.js\n');
2 // vim:noet:sw=4:ts=4:
3
4 if (typeof circ == 'undefined') { var circ = {}; }
5 circ.util = {};
6
7 circ.util.EXPORT_OK    = [
8     'offline_checkout_columns', 'offline_checkin_columns', 'offline_renew_columns', 'offline_inhouse_use_columns',
9     'columns', 'hold_columns', 'checkin_via_barcode', 'std_map_row_to_columns',
10     'show_last_few_circs', 'abort_transits', 'transit_columns', 'work_log_columns', 'renew_via_barcode', 'backdate_post_checkin', 'batch_hold_update'
11 ];
12 circ.util.EXPORT_TAGS    = { ':all' : circ.util.EXPORT_OK };
13
14 circ.util.abort_transits = function(selection_list) {
15     var obj = {};
16     JSAN.use('util.error'); obj.error = new util.error();
17     JSAN.use('util.network'); obj.network = new util.network();
18     JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
19     JSAN.use('util.functional');
20     var copies = util.functional.map_list( selection_list, function(o){return o.copy_id;}).join(', ');
21     var msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.abort_transits.confirm', [copies]);
22     var r = obj.error.yns_alert(
23         msg,
24         document.getElementById('circStrings').getString('staff.circ.utils.abort_transits.title'),
25         document.getElementById('circStrings').getString('staff.circ.utils.yes'),
26         document.getElementById('circStrings').getString('staff.circ.utils.no'),
27         null,
28         document.getElementById('circStrings').getString('staff.circ.confirm')
29     );
30     if (r == 0) {
31         try {
32             for (var i = 0; i < selection_list.length; i++) {
33                 var copy_id = selection_list[i].copy_id;
34                 var robj = obj.network.simple_request('FM_ATC_VOID',[ ses(), { 'copyid' : copy_id } ]);
35                 if (typeof robj.ilsevent != 'undefined') {
36                     switch(Number(robj.ilsevent)) {
37                         case 1225 /* TRANSIT_ABORT_NOT_ALLOWED */ :
38                             alert(document.getElementById('circString').getFormattedString('staff.circ.utils.abort_transits.not_allowed', [copy_id]) + '\n' + robj.desc);
39                         break;
40                         case 1504 /* ACTION_TRANSIT_COPY_NOT_FOUND */ :
41                             alert(document.getElementById('circString').getString('staff.circ.utils.abort_transits.not_found'));
42                         break;
43                         case 5000 /* PERM_FAILURE */ :
44                         break;
45                         default:
46                             throw(robj);
47                         break;
48                     }
49                 }
50             }
51         } catch(E) {
52             obj.error.standard_unexpected_error_alert(document.getElementById('circString').getString('staff.circ.utils.abort_transits.unexpected_error'),E);
53         }
54     }
55 };
56
57 circ.util.show_copy_details = function(copy_id) {
58     var obj = {};
59     JSAN.use('util.error'); obj.error = new util.error();
60     JSAN.use('util.window'); obj.win = new util.window();
61     JSAN.use('util.network'); obj.network = new util.network();
62     JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
63
64     if (typeof copy_id == 'object' && copy_id != null) copy_id = copy_id.id();
65
66     try {
67         var url = xulG.url_prefix( urls.XUL_COPY_DETAILS ); // + '?copy_id=' + copy_id;
68         var my_xulG = obj.win.open( url, 'show_copy_details', 'chrome,resizable,modal', { 'copy_id' : copy_id } );
69
70         if (typeof my_xulG.retrieve_these_patrons == 'undefined') return;
71         var patrons = my_xulG.retrieve_these_patrons;
72         for (var j = 0; j < patrons.length; j++) {
73             if (typeof window.xulG == 'object' && typeof window.xulG.new_tab == 'function') {
74                 try {
75                     window.xulG.new_patron_tab( {}, { 'id' : patrons[j] } );
76                 } catch(E) {
77                     obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.utils.retrieve_patron.failure'), E);
78                 }
79             }
80         }
81
82     } catch(E) {
83         obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.utils.retrieve_copy.failure'),E);
84     }
85 };
86
87 circ.util.item_details_new = function(barcodes) {
88     try {
89         var content_params = {
90             'from_item_details_new': true,
91             'barcodes': barcodes
92         };
93         xulG.new_tab(urls.XUL_COPY_STATUS, {}, content_params);
94     } catch(E) {
95         JSAN.use('util.error');
96         (new util.error()).standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.utils.retrieve_copy.failure'),E);
97     }
98 };
99
100 circ.util.backdate_post_checkin = function(circ_ids) {
101     var obj = {};
102     JSAN.use('util.error'); obj.error = new util.error();
103     JSAN.use('util.window'); obj.win = new util.window();
104     JSAN.use('util.network'); obj.network = new util.network();
105     JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
106     JSAN.use('util.sound'); obj.sound = new util.sound();
107
108     var circStrings = document.getElementById('circStrings');
109
110     dojo.forEach(
111         circ_ids,
112         function(element,idx,list) {
113             if (typeof element == 'object' && element != null) list[idx] = element.id();
114         }
115     );
116
117     try {
118         var url = xulG.url_prefix( urls.XUL_BACKDATE );
119         var my_xulG = obj.win.open( url, 'backdate_post_checkin', 'chrome,resizable,modal', { 'circ_ids' : circ_ids } );
120
121         return my_xulG;
122
123     } catch(E) {
124         obj.error.standard_unexpected_error_alert(circStrings.getString('staff.circ.utils.retrieve_copy.failure'),E);
125     }
126 };
127
128
129 circ.util.show_last_few_circs = function(selection_list) {
130     var obj = {};
131     JSAN.use('util.error'); obj.error = new util.error();
132     JSAN.use('util.window'); obj.win = new util.window();
133     JSAN.use('util.network'); obj.network = new util.network();
134     JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
135
136     for (var i = 0; i < selection_list.length; i++) {
137         try {
138             if (typeof selection_list[i].copy_id == 'undefined' || selection_list[i].copy_id == null) continue;
139             var url = xulG.url_prefix( urls.XUL_CIRC_SUMMARY ); // + '?copy_id=' + selection_list[i].copy_id + '&count=' + count;
140             var my_xulG = obj.win.open( url, 'show_last_few_circs', 'chrome,resizable,modal', { 'copy_id' : selection_list[i].copy_id } );
141
142             if (typeof my_xulG.retrieve_these_patrons == 'undefined') continue;
143             var patrons = my_xulG.retrieve_these_patrons;
144             for (var j = 0; j < patrons.length; j++) {
145                 if (typeof window.xulG == 'object' && typeof window.xulG.new_tab == 'function') {
146                     try {
147                         window.xulG.new_patron_tab( {}, { 'id' : patrons[j] } );
148                     } catch(E) {
149                         obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.utils.retrieve_patron.failure') ,E);
150                     }
151                 }
152             }
153
154         } catch(E) {
155             obj.error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.utils.retrieve_circs.failure') ,E);
156         }
157     }
158 };
159
160 circ.util.offline_checkout_columns = function(modify,params) {
161
162     var c = [
163         {
164             'id' : 'timestamp',
165             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.timestamp'),
166             'flex' : 1,
167             'primary' : false,
168             'hidden' : true,
169             'editable' : false, 'render' : function(my) { return my.timestamp; }
170         },
171         {
172             'id' : 'checkout_time',
173             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.checkout_time'),
174             'flex' : 1,
175             'primary' : false,
176             'hidden' : true,
177             'editable' : false, 'render' : function(my) { return my.checkout_time; }
178         },
179         {
180             'id' : 'type',
181             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.type'),
182             'flex' : 1,
183             'primary' : false,
184             'hidden' : true,
185             'editable' : false, 'render' : function(my) { return my.type; }
186         },
187         {
188             'id' : 'noncat',
189             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.noncat'),
190             'flex' : 1,
191             'primary' : false,
192             'hidden' : true,
193             'editable' : false, 'render' : function(my) { return my.noncat; }
194         },
195         {
196             'id' : 'noncat_type',
197             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.noncat_type'),
198             'flex' : 1,
199             'primary' : false,
200             'hidden' : true,
201             'editable' : false, 'render' : function(my) { return my.noncat_type; }
202         },
203         {
204             'id' : 'noncat_count',
205             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.count'),
206             'sort_type' : 'number',
207             'flex' : 1,
208             'primary' : false,
209             'hidden' : false,
210             'editable' : false, 'render' : function(my) { return my.noncat_count; }
211         },
212         {
213             'id' : 'patron_barcode',
214             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.patron_barcode'),
215             'flex' : 1,
216             'primary' : false,
217             'hidden' : true,
218             'editable' : false, 'render' : function(my) { return my.patron_barcode; }
219         },
220         {
221             'id' : 'barcode',
222             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.item_barcode'),
223             'flex' : 2,
224             'primary' : true,
225             'hidden' : false,
226             'editable' : false, 'render' : function(my) { return my.barcode; }
227         },
228         {
229             'id' : 'due_date',
230             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.due_date'),
231             'flex' : 1,
232             'primary' : false,
233             'hidden' : false,
234             'editable' : false, 'render' : function(my) { return my.due_date; }
235         },
236         {
237             'id' : 'due_time',
238             'label' : document.getElementById('commonStrings').getString('staff.circ_label_due_time'),
239             'flex' : 1,
240             'primary' : false,
241             'hidden' : false,
242             'editable' : false, 'render' : function(my) { return my.due_time; }
243         }
244
245     ];
246     if (modify) for (var i = 0; i < c.length; i++) {
247         if (modify[ c[i].id ]) {
248             for (var j in modify[ c[i].id ]) {
249                 c[i][j] = modify[ c[i].id ][j];
250             }
251         }
252     }
253     if (params) {
254         if (params.just_these) {
255             JSAN.use('util.functional');
256             var new_c = [];
257             for (var i = 0; i < params.just_these.length; i++) {
258                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
259                 new_c.push( function(y){ return y; }( x ) );
260             }
261             c = new_c;
262         }
263         if (params.except_these) {
264             JSAN.use('util.functional');
265             var new_c = [];
266             for (var i = 0; i < c.length; i++) {
267                 var x = util.functional.find_list(params.except_these,function(d){return(d==c[i].id);});
268                 if (!x) new_c.push(c[i]);
269             }
270             c = new_c;
271         }
272
273     }
274     return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
275 };
276
277 circ.util.offline_checkin_columns = function(modify,params) {
278
279     var c = [
280         {
281             'id' : 'timestamp',
282             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.timestamp'),
283             'flex' : 1,
284             'primary' : false,
285             'hidden' : true,
286             'editable' : false, 'render' : function(my) { return my.timestamp; }
287         },
288         {
289             'id' : 'backdate',
290             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.backdate'),
291             'flex' : 1,
292             'primary' : false,
293             'hidden' : true,
294             'editable' : false, 'render' : function(my) { return my.backdate; }
295         },
296         {
297             'id' : 'type',
298             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.type'),
299             'flex' : 1,
300             'primary' : false,
301             'hidden' : true,
302             'editable' : false, 'render' : function(my) { return my.type; }
303         },
304         {
305             'id' : 'barcode',
306             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.item_barcode'),
307             'flex' : 2,
308             'primary' : true,
309             'hidden' : false,
310             'editable' : false, 'render' : function(my) { return my.barcode; }
311         }
312     ];
313     if (modify) for (var i = 0; i < c.length; i++) {
314         if (modify[ c[i].id ]) {
315             for (var j in modify[ c[i].id ]) {
316                 c[i][j] = modify[ c[i].id ][j];
317             }
318         }
319     }
320     if (params) {
321         if (params.just_these) {
322             JSAN.use('util.functional');
323             var new_c = [];
324             for (var i = 0; i < params.just_these.length; i++) {
325                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
326                 new_c.push( function(y){ return y; }( x ) );
327             }
328             c = new_c;
329         }
330         if (params.except_these) {
331             JSAN.use('util.functional');
332             var new_c = [];
333             for (var i = 0; i < c.length; i++) {
334                 var x = util.functional.find_list(params.except_these,function(d){return(d==c[i].id);});
335                 if (!x) new_c.push(c[i]);
336             }
337             c = new_c;
338         }
339
340     }
341     return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
342 };
343
344 circ.util.offline_renew_columns = function(modify,params) {
345
346     var c = [
347         {
348             'id' : 'timestamp',
349             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.timestamp'),
350             'flex' : 1,
351             'primary' : false,
352             'hidden' : true,
353             'editable' : false, 'render' : function(my) { return my.timestamp; }
354         },
355         {
356             'id' : 'checkout_time',
357             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.checkout_time'),
358             'flex' : 1,
359             'primary' : false,
360             'hidden' : true,
361             'editable' : false, 'render' : function(my) { return my.checkout_time; }
362         },
363         {
364             'id' : 'type',
365             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.type'),
366             'flex' : 1,
367             'primary' : false,
368             'hidden' : true,
369             'editable' : false, 'render' : function(my) { return my.type; }
370         },
371         {
372             'id' : 'patron_barcode',
373             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.patron_barcode'),
374             'flex' : 1,
375             'primary' : false,
376             'hidden' : true,
377             'editable' : false, 'render' : function(my) { return my.patron_barcode; }
378         },
379         {
380             'id' : 'barcode',
381             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.item_barcode'),
382             'flex' : 2,
383             'primary' : true,
384             'hidden' : false,
385             'editable' : false, 'render' : function(my) { return my.barcode; }
386         },
387         {
388             'id' : 'due_date',
389             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.due_date'),
390             'flex' : 1,
391             'primary' : false,
392             'hidden' : false,
393             'editable' : false, 'render' : function(my) { return my.due_date; }
394         },
395         {
396             'id' : 'due_time',
397             'label' : document.getElementById('commonStrings').getString('staff.circ_label_due_time'),
398             'flex' : 1,
399             'primary' : false,
400             'hidden' : false,
401             'editable' : false, 'render' : function(my) { return my.due_time; }
402         }
403     ];
404     if (modify) for (var i = 0; i < c.length; i++) {
405         if (modify[ c[i].id ]) {
406             for (var j in modify[ c[i].id ]) {
407                 c[i][j] = modify[ c[i].id ][j];
408             }
409         }
410     }
411     if (params) {
412         if (params.just_these) {
413             JSAN.use('util.functional');
414             var new_c = [];
415             for (var i = 0; i < params.just_these.length; i++) {
416                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
417                 new_c.push( function(y){ return y; }( x ) );
418             }
419             c = new_c;
420         }
421         if (params.except_these) {
422             JSAN.use('util.functional');
423             var new_c = [];
424             for (var i = 0; i < c.length; i++) {
425                 var x = util.functional.find_list(params.except_these,function(d){return(d==c[i].id);});
426                 if (!x) new_c.push(c[i]);
427             }
428             c = new_c;
429         }
430
431     }
432     return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
433 };
434
435 circ.util.offline_inhouse_use_columns = function(modify,params) {
436
437     var c = [
438         {
439             'id' : 'timestamp',
440             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.timestamp'),
441             'flex' : 1,
442             'primary' : false,
443             'hidden' : true,
444             'editable' : false, 'render' : function(my) { return my.timestamp; }
445         },
446         {
447             'id' : 'use_time',
448             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.use_time'),
449             'flex' : 1,
450             'primary' : false,
451             'hidden' : true,
452             'editable' : false, 'render' : function(my) { return my.use_time; }
453         },
454         {
455             'id' : 'type',
456             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.type'),
457             'flex' : 1,
458             'primary' : false,
459             'hidden' : true,
460             'editable' : false, 'render' : function(my) { return my.type; }
461         },
462         {
463             'id' : 'count',
464             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.count'),
465             'sort_type' : 'number',
466             'flex' : 1,
467             'primary' : false,
468             'hidden' : false,
469             'editable' : false, 'render' : function(my) { return my.count; }
470         },
471         {
472             'id' : 'barcode',
473             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.item_barcode'),
474             'flex' : 2,
475             'primary' : true,
476             'hidden' : false,
477             'editable' : false, 'render' : function(my) { return my.barcode; }
478         }
479     ];
480     if (modify) for (var i = 0; i < c.length; i++) {
481         if (modify[ c[i].id ]) {
482             for (var j in modify[ c[i].id ]) {
483                 c[i][j] = modify[ c[i].id ][j];
484             }
485         }
486     }
487     if (params) {
488         if (params.just_these) {
489             JSAN.use('util.functional');
490             var new_c = [];
491             for (var i = 0; i < params.just_these.length; i++) {
492                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
493                 new_c.push( function(y){ return y; }( x ) );
494             }
495             c = new_c;
496         }
497         if (params.except_these) {
498             JSAN.use('util.functional');
499             var new_c = [];
500             for (var i = 0; i < c.length; i++) {
501                 var x = util.functional.find_list(params.except_these,function(d){return(d==c[i].id);});
502                 if (!x) new_c.push(c[i]);
503             }
504             c = new_c;
505         }
506
507     }
508     return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
509 };
510
511 circ.util.columns = function(modify,params) {
512
513     JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
514     JSAN.use('util.network'); var network = new util.network();
515     JSAN.use('util.money');
516
517     var c = [
518         {
519             'id' : 'acp_id',
520             'fm_class' : 'acp',
521             'label' : document.getElementById('commonStrings').getString('staff.acp_label_id'),
522             'flex' : 1,
523             'primary' : false,
524             'hidden' : true,
525             'editable' : false, 'render' : function(my) { return my.acp.id(); },
526             'persist' : 'hidden width ordinal'
527         },
528         {
529             'id' : 'circ_id',
530             'fm_class' : 'circ',
531             'label' : document.getElementById('commonStrings').getString('staff.circ_label_id'),
532             'flex' : 1,
533             'primary' : false,
534             'hidden' : true,
535             'editable' : false, 'render' : function(my) { return my.circ ? my.circ.id() : ""; },
536             'persist' : 'hidden width ordinal'
537         },
538         {
539             'id' : 'mvr_doc_id',
540             'fm_class' : 'mvr',
541             'label' : document.getElementById('commonStrings').getString('staff.mvr_label_doc_id'),
542             'flex' : 1,
543             'primary' : false,
544             'hidden' : true,
545             'editable' : false, 'render' : function(my) { return my.mvr.doc_id(); },
546             'persist' : 'hidden width ordinal'
547         },
548         {
549             'persist' : 'hidden width ordinal',
550             'id' : 'service',
551             'label' : 'Service',
552             'flex' : 1,
553             'primary' : false,
554             'hidden' : true,
555             'editable' : false, 'render' : function(my) { return my.service; }
556         },
557         {
558             'id' : 'barcode',
559             'fm_class' : 'acp',
560             'label' : document.getElementById('commonStrings').getString('staff.acp_label_barcode'),
561             'flex' : 1,
562             'primary' : false,
563             'hidden' : true,
564             'editable' : false, 'render' : function(my) { return my.acp.barcode(); },
565             'persist' : 'hidden width ordinal'
566         },
567         {
568             'id' : 'call_number',
569             'fm_class' : 'acp',
570             'label' : document.getElementById('commonStrings').getString('staff.acp_label_call_number'),
571             'flex' : 1,
572             'primary' : false,
573             'hidden' : true,
574             'editable' : false, 'render' : function(my) {
575                 if (my.acp && my.acp.call_number() == -1) {
576                     return document.getElementById('circStrings').getString('staff.circ.utils.not_cataloged');
577                 } else if (my.acp && my.acp.call_number() == -2) {
578                     return document.getElementById('circStrings').getString('staff.circ.utils.retrieving');
579                 } else {
580                     if (!my.acn) {
581                         var x = network.simple_request("FM_ACN_RETRIEVE.authoritative",[ my.acp.call_number() ]);
582                         if (x.ilsevent) {
583                             return document.getElementById('circStrings').getString('staff.circ.utils.not_cataloged');
584                         } else {
585                             my.acn = x; return x.label();
586                         }
587                     } else {
588                         return my.acn.label();
589                     }
590                 }
591             },
592             'persist' : 'hidden width ordinal'
593         },
594         {
595             'id' : 'owning_lib',
596             'fm_class' : 'acn',
597             'label' : document.getElementById('circStrings').getString('staff.circ.utils.owning_lib'),
598             'flex' : 1,
599             'primary' : false,
600             'hidden' : true,
601             'editable' : false, 'render' : function(my) {
602                 if (Number(my.acn.owning_lib())>=0) {
603                     return data.hash.aou[ my.acn.owning_lib() ].shortname();
604                 } else {
605                     return my.acn.owning_lib().shortname();
606                 }
607             },
608             'persist' : 'hidden width ordinal'
609         },
610         {
611             'id' : 'copy_number',
612             'fm_class' : 'acp',
613             'label' : document.getElementById('commonStrings').getString('staff.acp_label_copy_number'),
614             'flex' : 1,
615             'sort_type' : 'number',
616             'primary' : false,
617             'hidden' : true,
618             'editable' : false, 'render' : function(my) { return my.acp.copy_number(); },
619             'persist' : 'hidden width ordinal'
620         },
621         {
622             'id' : 'location',
623             'fm_class' : 'acp',
624             'label' : document.getElementById('commonStrings').getString('staff.acp_label_location'),
625             'flex' : 1,
626             'primary' : false,
627             'hidden' : true,
628             'editable' : false, 'render' : function(my) {
629                 if (Number(my.acp.location())>=0) {
630                     return data.lookup("acpl", my.acp.location() ).name();
631                 } else {
632                     return my.acp.location().name();
633                 }
634             },
635             'persist' : 'hidden width ordinal'
636         },
637         {
638             'id' : 'loan_duration',
639             'fm_class' : 'acp',
640             'label' : document.getElementById('commonStrings').getString('staff.acp_label_loan_duration'),
641             'flex' : 1,
642             'primary' : false,
643             'hidden' : true,
644             'editable' : false, 'render' : function(my) {
645                 switch(Number(my.acp.loan_duration())) {
646                     case 1:
647                         return document.getElementById('circStrings').getString('staff.circ.utils.loan_duration.short');
648                         break;
649                     case 2:
650                         return document.getElementById('circStrings').getString('staff.circ.utils.loan_duration.normal');
651                         break;
652                     case 3:
653                         return document.getElementById('circStrings').getString('staff.circ.utils.loan_duration.long');
654                         break;
655                 };
656             },
657             'persist' : 'hidden width ordinal'
658         },
659         {
660             'id' : 'circ_lib',
661             'fm_class' : 'acp',
662             'label' : document.getElementById('commonStrings').getString('staff.acp_label_circ_lib'),
663             'flex' : 1,
664             'primary' : false,
665             'hidden' : true,
666             'editable' : false, 'render' : function(my) {
667                 if (Number(my.acp.circ_lib())>=0) {
668                     return data.hash.aou[ my.acp.circ_lib() ].shortname();
669                 } else {
670                     return my.acp.circ_lib().shortname();
671                 }
672             },
673             'persist' : 'hidden width ordinal'
674         },
675         {
676             'id' : 'fine_level',
677             'fm_class' : 'acp',
678             'label' : document.getElementById('commonStrings').getString('staff.acp_label_fine_level'),
679             'flex' : 1,
680             'primary' : false,
681             'hidden' : true,
682             'editable' : false, 'render' : function(my) {
683                 switch(Number(my.acp.fine_level())) {
684                     case 1:
685                         return document.getElementById('circStrings').getString('staff.circ.utils.fine_level.low');
686                         break;
687                     case 2:
688                         return document.getElementById('circStrings').getString('staff.circ.utils.fine_level.normal');
689                         break;
690                     case 3:
691                         return document.getElementById('circStrings').getString('staff.circ.utils.fine_level.high');
692                         break;
693                 };
694             },
695             'persist' : 'hidden width ordinal'
696         },
697         {
698             'id' : 'circulate',
699             'fm_class' : 'acp',
700             'label' : document.getElementById('circStrings').getString('staff.circ.utils.circulate'),
701             'flex' : 1,
702             'primary' : false,
703             'hidden' : true,
704             'editable' : false, 'render' : function(my) {
705                 if (get_bool( my.acp.circulate() )) {
706                     return document.getElementById('circStrings').getString('staff.circ.utils.yes');
707                 } else {
708                     return document.getElementById('circStrings').getString('staff.circ.utils.no');
709                 }
710             },
711             'persist' : 'hidden width ordinal'
712         },
713         {
714             'id' : 'deleted',
715             'fm_class' : 'acp',
716             'label' : document.getElementById('circStrings').getString('staff.circ.utils.deleted'),
717             'flex' : 1,
718             'primary' : false,
719             'hidden' : true,
720             'editable' : false, 'render' : function(my) {
721                 if (get_bool( my.acp.deleted() )) {
722                     return document.getElementById('circStrings').getString('staff.circ.utils.yes');
723                 } else {
724                     return document.getElementById('circStrings').getString('staff.circ.utils.no');
725                 }
726             },
727             'persist' : 'hidden width ordinal'
728         },
729         {
730             'id' : 'holdable',
731             'fm_class' : 'acp',
732             'label' : document.getElementById('circStrings').getString('staff.circ.utils.holdable'),
733             'flex' : 1,
734             'primary' : false,
735             'hidden' : true,
736             'editable' : false, 'render' : function(my) {
737                 if (get_bool( my.acp.holdable() )) {
738                     return document.getElementById('circStrings').getString('staff.circ.utils.yes');
739                 } else {
740                     return document.getElementById('circStrings').getString('staff.circ.utils.no');
741                 }
742             },
743             'persist' : 'hidden width ordinal'
744         },
745         {
746             'id' : 'opac_visible',
747             'fm_class' : 'acp',
748             'label' : document.getElementById('circStrings').getString('staff.circ.utils.opac_visible'),
749             'flex' : 1,
750             'primary' : false,
751             'hidden' : true,
752             'editable' : false, 'render' : function(my) {
753                 if (get_bool( my.acp.opac_visible() )) {
754                     return document.getElementById('circStrings').getString('staff.circ.utils.yes');
755                 } else {
756                     return document.getElementById('circStrings').getString('staff.circ.utils.no');
757                 }
758             },
759             'persist' : 'hidden width ordinal'
760         },
761         {
762             'persist' : 'hidden width ordinal',
763             'id' : 'acp_mint_condition',
764             'fm_class' : 'acp',
765             'label' : document.getElementById('circStrings').getString('staff.circ.utils.acp_mint_condition'),
766             'flex' : 0,
767             'primary' : false,
768             'hidden' : true,
769             'editable' : false, 'render' : function(my) {
770                 if (get_bool( my.acp.mint_condition() )) {
771                     return document.getElementById('circStrings').getString('staff.circ.utils.acp_mint_condition.true');
772                 } else {
773                     return document.getElementById('circStrings').getString('staff.circ.utils.acp_mint_condition.false');
774                 }
775             }
776         },
777         {
778             'persist' : 'hidden width ordinal',
779             'fm_class' : 'acp',
780             'id' : 'ref',
781             'label' : document.getElementById('circStrings').getString('staff.circ.utils.reference'),
782             'flex' : 1,
783             'primary' : false,
784             'hidden' : true,
785             'editable' : false, 'render' : function(my) {
786                 if (get_bool( my.acp.ref() )) {
787                     return document.getElementById('circStrings').getString('staff.circ.utils.yes');
788                 } else {
789                     return document.getElementById('circStrings').getString('staff.circ.utils.no');
790                 }
791             }
792         },
793         {
794             'persist' : 'hidden width ordinal',
795             'fm_class' : 'acp',
796             'id' : 'deposit',
797             'label' : document.getElementById('circStrings').getString('staff.circ.utils.deposit'),
798             'flex' : 1,
799             'primary' : false,
800             'hidden' : true,
801             'editable' : false, 'render' : function(my) {
802                 if (get_bool( my.acp.deposit() )) {
803                     return document.getElementById('circStrings').getString('staff.circ.utils.yes');
804                 } else {
805                     return document.getElementById('circStrings').getString('staff.circ.utils.no');
806                 }
807             }
808         },
809         {
810             'persist' : 'hidden width ordinal',
811             'fm_class' : 'acp',
812             'id' : 'deposit_amount',
813             'label' : document.getElementById('commonStrings').getString('staff.acp_label_deposit_amount'),
814             'flex' : 1,
815             'primary' : false,
816             'hidden' : true,
817             'editable' : false, 'render' : function(my) {
818                 if (my.acp.price() == null) {
819                     return document.getElementById('circStrings').getString('staff.circ.utils.unset');
820                 } else {
821                     return util.money.sanitize(my.acp.deposit_amount());
822                 }
823             },
824             'sort_type' : 'money'
825         },
826         {
827             'persist' : 'hidden width ordinal',
828             'fm_class' : 'acp',
829             'id' : 'price',
830             'label' : document.getElementById('commonStrings').getString('staff.acp_label_price'),
831             'flex' : 1,
832             'primary' : false,
833             'hidden' : true,
834             'editable' : false, 'render' : function(my) {
835                 if (my.acp.price() == null) {
836                     return document.getElementById('circStrings').getString('staff.circ.utils.unset');
837                 } else {
838                     return util.money.sanitize(my.acp.price());
839                 }
840             },
841             'sort_type' : 'money'
842         },
843         {
844             'persist' : 'hidden width ordinal',
845             'fm_class' : 'acp',
846             'id' : 'circ_as_type',
847             'label' : document.getElementById('commonStrings').getString('staff.acp_label_circ_as_type'),
848             'flex' : 1,
849             'primary' : false,
850             'hidden' : true,
851             'editable' : false, 'render' : function(my) { return my.acp.circ_as_type(); }
852         },
853         {
854             'persist' : 'hidden width ordinal',
855             'fm_class' : 'acp',
856             'id' : 'circ_modifier',
857             'label' : document.getElementById('commonStrings').getString('staff.acp_label_circ_modifier'),
858             'flex' : 1,
859             'primary' : false,
860             'hidden' : true,
861             'editable' : false, 'render' : function(my) { return my.acp.circ_modifier(); }
862         },
863         {
864             'id' : 'status_changed_time',
865             'fm_class' : 'acp',
866             'label' : document.getElementById('circStrings').getString('staff.circ.utils.status_changed_time'),
867             'flex' : 1,
868             'primary' : false,
869             'hidden' : true,
870             'editable' : false, 'render' : function(my) { return util.date.formatted_date( my.acp.status_changed_time(), '%{localized}' ); },
871             'persist' : 'hidden width ordinal'
872         },
873         {
874             'persist' : 'hidden width ordinal',
875             'fm_class' : 'circ',
876             'id' : 'checkout_lib',
877             'label' : document.getElementById('circStrings').getString('staff.circ.utils.checkout_lib'),
878             'flex' : 1,
879             'primary' : false,
880             'hidden' : true,
881             'editable' : false, 'render' : function(my) {
882                 if (my.circ) {
883                     return data.hash.aou[ my.circ.circ_lib() ].shortname();
884                 } else {
885                     return "";
886                 }
887             }
888         },
889         {
890             'persist' : 'hidden width ordinal',
891             'fm_class' : 'circ',
892             'id' : 'xact_start',
893             'label' : document.getElementById('circStrings').getString('staff.circ.utils.xact_start'),
894             'flex' : 1,
895             'primary' : false,
896             'hidden' : true,
897             'editable' : false, 'render' : function(my) {
898                 if (my.circ) {
899                     return util.date.formatted_date( my.circ.xact_start(), '%{localized}' );
900                 } else {
901                     return "";
902                 }
903             }
904         },
905         {
906             'persist' : 'hidden width ordinal',
907             'fm_class' : 'circ',
908             'id' : 'checkin_time',
909             'label' : document.getElementById('circStrings').getString('staff.circ.utils.checkin_time'),
910             'flex' : 1,
911             'primary' : false,
912             'hidden' : true,
913             'editable' : false, 'render' : function(my) {
914                 if (my.circ) {
915                     return util.date.formatted_date( my.circ.checkin_time(), '%{localized}' );
916                 } else {
917                     return "";
918                 }
919             }
920         },
921         {
922             'persist' : 'hidden width ordinal',
923             'fm_class' : 'circ',
924             'id' : 'xact_finish',
925             'label' : document.getElementById('circStrings').getString('staff.circ.utils.xact_finish'),
926             'flex' : 1,
927             'primary' : false,
928             'hidden' : true,
929             'editable' : false, 'render' : function(my) { return my.circ ? util.date.formatted_date( my.circ.xact_finish(), '%{localized}' ) : ""; },
930         },
931         {
932             'persist' : 'hidden width ordinal',
933             'fm_class' : 'circ',
934             'id' : 'due_date',
935             'label' : document.getElementById('commonStrings').getString('staff.circ_label_due_date'),
936             'flex' : 1,
937             'primary' : false,
938             'hidden' : true,
939             'editable' : false, 'render' : function(my) {
940                 if (my.circ) {
941                     return util.date.formatted_date( my.circ.due_date(), '%{localized}' );
942                 } else {
943                     return "";
944                 }
945             }
946         },
947         {
948             'persist' : 'hidden width ordinal',
949             'fm_class' : 'acp',
950             'id' : 'create_date',
951             'label' : document.getElementById('circStrings').getString('staff.circ.utils.create_date'),
952             'flex' : 1,
953             'primary' : false,
954             'hidden' : true,
955             'editable' : false, 'render' : function(my) { return util.date.formatted_date( my.acp.create_date(), '%{localized}' ); }
956         },
957         {
958             'persist' : 'hidden width ordinal',
959             'fm_class' : 'acp',
960             'id' : 'edit_date',
961             'label' : document.getElementById('circStrings').getString('staff.circ.utils.edit_date'),
962             'flex' : 1,
963             'primary' : false,
964             'hidden' : true,
965             'editable' : false, 'render' : function(my) { return util.date.formatted_date( my.acp.edit_date(), '%{localized}' ); }
966         },
967         {
968             'persist' : 'hidden width ordinal',
969             'fm_class' : 'mvr',
970             'id' : 'title',
971             'label' : document.getElementById('commonStrings').getString('staff.mvr_label_title'),
972             'flex' : 2,
973             'sort_type' : 'title',
974             'primary' : false,
975             'hidden' : true,
976             'editable' : false, 'render' : function(my) {
977                 try {  return my.mvr.title(); }
978                 catch(E) { return my.acp.dummy_title(); }
979             }
980         },
981         {
982             'persist' : 'hidden width ordinal',
983             'fm_class' : 'mvr',
984             'id' : 'author',
985             'label' : document.getElementById('commonStrings').getString('staff.mvr_label_author'),
986             'flex' : 1,
987             'primary' : false,
988             'hidden' : true,
989             'editable' : false, 'render' : function(my) {
990                 try { return my.mvr.author(); }
991                 catch(E) { return my.acp.dummy_author(); }
992             }
993         },
994         {
995             'persist' : 'hidden width ordinal',
996             'fm_class' : 'mvr',
997             'id' : 'edition',
998             'label' : document.getElementById('circStrings').getString('staff.circ.utils.edition'),
999             'flex' : 1,
1000             'primary' : false,
1001             'hidden' : true,
1002             'editable' : false, 'render' : function(my) { return my.mvr.edition(); }
1003         },
1004         {
1005             'persist' : 'hidden width ordinal',
1006             'fm_class' : 'mvr',
1007             'id' : 'isbn',
1008             'label' : document.getElementById('circStrings').getString('staff.circ.utils.isbn'),
1009             'flex' : 1,
1010             'primary' : false,
1011             'hidden' : true,
1012             'editable' : false, 'render' : function(my) { 
1013                 try { return my.mvr.isbn(); }
1014                 catch(E) { return my.acp.dummy_isbn(); }
1015             }
1016         },
1017         {
1018             'persist' : 'hidden width ordinal',
1019             'fm_class' : 'mvr',
1020             'id' : 'pubdate',
1021             'label' : document.getElementById('circStrings').getString('staff.circ.utils.pubdate'),
1022             'flex' : 1,
1023             'primary' : false,
1024             'hidden' : true,
1025             'editable' : false, 'render' : function(my) { return my.mvr.pubdate(); }
1026         },
1027         {
1028             'persist' : 'hidden width ordinal',
1029             'fm_class' : 'mvr',
1030             'id' : 'publisher',
1031             'label' : document.getElementById('circStrings').getString('staff.circ.utils.publisher'),
1032             'flex' : 1,
1033             'primary' : false,
1034             'hidden' : true,
1035             'editable' : false, 'render' : function(my) { return my.mvr.publisher(); }
1036         },
1037         {
1038             'persist' : 'hidden width ordinal',
1039             'fm_class' : 'mvr',
1040             'id' : 'tcn',
1041             'label' : document.getElementById('circStrings').getString('staff.circ.utils.tcn'),
1042             'flex' : 1,
1043             'primary' : false,
1044             'hidden' : true,
1045             'editable' : false, 'render' : function(my) { return my.mvr.tcn(); }
1046         },
1047         {
1048             'persist' : 'hidden width ordinal',
1049             'fm_class' : 'circ',
1050             'id' : 'renewal_remaining',
1051             'label' : document.getElementById('commonStrings').getString('staff.circ_label_renewal_remaining'),
1052             'flex' : 0,
1053             'primary' : false,
1054             'hidden' : true,
1055             'editable' : false, 'render' : function(my) {
1056                 if (my.circ) {
1057                     return my.circ.renewal_remaining();
1058                 } else {
1059                     return "";
1060                 }
1061             },
1062             'sort_type' : 'number'
1063         },
1064         {
1065             'persist' : 'hidden width ordinal',
1066             'fm_class' : 'circ',
1067             'id' : 'stop_fines',
1068             'label' : document.getElementById('circStrings').getString('staff.circ.utils.stop_fines'),
1069             'flex' : 0,
1070             'primary' : false,
1071             'hidden' : true,
1072             'editable' : false, 'render' : function(my) {
1073                 if (my.circ) {
1074                     return my.circ.stop_fines();
1075                 } else {
1076                     return "";
1077                 }
1078             }
1079         },
1080         {
1081             'persist' : 'hidden width ordinal',
1082             'fm_class' : 'circ',
1083             'id' : 'stop_fines_time',
1084             'label' : document.getElementById('circStrings').getString('staff.circ.utils.stop_fines_time'),
1085             'flex' : 0,
1086             'primary' : false,
1087             'hidden' : true,
1088             'editable' : false, 'render' : function(my) {
1089                 if (my.circ) {
1090                     return util.date.formatted_date( my.circ.stop_fines_time(), '%{localized}' );
1091                 } else {
1092                     return "";
1093                 }
1094             }
1095         },
1096         {
1097             'persist' : 'hidden width ordinal',
1098             'fm_class' : 'acp',
1099             'id' : 'acp_status',
1100             'label' : document.getElementById('commonStrings').getString('staff.acp_label_status'),
1101             'flex' : 1,
1102             'primary' : false,
1103             'hidden' : true,
1104             'editable' : false, 'render' : function(my) {
1105                 if (Number(my.acp.status())>=0) {
1106                     return data.hash.ccs[ my.acp.status() ].name();
1107                 } else {
1108                     return my.acp.status().name();
1109                 }
1110             }
1111         },
1112         {
1113             'persist' : 'hidden width ordinal',
1114             'id' : 'route_to',
1115             'label' : document.getElementById('circStrings').getString('staff.circ.utils.route_to'),
1116             'flex' : 1,
1117             'primary' : false,
1118             'hidden' : true,
1119             'editable' : false, 'render' : function(my) { return my.route_to.toString(); }
1120         },
1121         {
1122             'persist' : 'hidden width ordinal',
1123             'id' : 'message',
1124             'label' : document.getElementById('circStrings').getString('staff.circ.utils.message'),
1125             'flex' : 1,
1126             'primary' : false,
1127             'hidden' : true,
1128             'editable' : false, 'render' : function(my) { return my.message.toString(); }
1129         },
1130         {
1131             'persist' : 'hidden width ordinal',
1132             'id' : 'uses',
1133             'label' : document.getElementById('circStrings').getString('staff.circ.utils.uses'),
1134             'flex' : 1,
1135             'primary' : false,
1136             'hidden' : true,
1137             'editable' : false, 'render' : function(my) { return my.uses; },
1138             'sort_type' : 'number'
1139         },
1140         {
1141             'persist' : 'hidden width ordinal',
1142             'fm_class' : 'acp',
1143             'id' : 'alert_message',
1144             'label' : document.getElementById('circStrings').getString('staff.circ.utils.alert_message'),
1145             'flex' : 1,
1146             'primary' : false,
1147             'hidden' : true,
1148             'editable' : false, 'render' : function(my) { return my.acp.alert_message(); }
1149         },
1150         {
1151             'persist' : 'hidden width ordinal',
1152             'fm_class' : 'circ',
1153             'id' : 'checkin_workstation',
1154             'label' : document.getElementById('circStrings').getString('staff.circ.utils.checkin_workstation'),
1155             'flex' : 1,
1156             'primary' : false,
1157             'hidden' : true,
1158             'editable' : false, 'render' : function(my) { return my.circ ? ( typeof my.circ.checkin_workstation() == 'object' ? my.circ.checkin_workstation().name() : my.circ.checkin_workstation() ) : ""; },
1159         },
1160         {
1161             'persist' : 'hidden width ordinal',
1162             'fm_class' : 'circ',
1163             'id' : 'checkout_workstation',
1164             'label' : document.getElementById('circStrings').getString('staff.circ.utils.checkout_workstation'),
1165             'flex' : 1,
1166             'primary' : false,
1167             'hidden' : true,
1168             'editable' : false, 'render' : function(my) { return my.circ ? ( typeof my.circ.workstation() == 'object' ? my.circ.workstation().name() : my.circ.workstation() ) : ""; },
1169         },
1170         {
1171             'persist' : 'hidden width ordinal',
1172             'fm_class' : 'circ',
1173             'id' : 'checkout_workstation_top_of_chain',
1174             'label' : document.getElementById('circStrings').getString('staff.circ.utils.checkout_workstation_top_of_chain'),
1175             'flex' : 1,
1176             'primary' : false,
1177             'hidden' : true,
1178             'editable' : false, 'render' : function(my) { if (my.circ&&!my.original_circ) { if(!get_bool(my.circ.desk_renewal())&&!get_bool(my.circ.opac_renewal())&&!get_bool(my.circ.phone_renewal())){my.original_circ = my.circ;}}; return my.original_circ ? ( typeof my.original_circ.workstation() == 'object' ? my.original_circ.workstation().name() : my.original_circ.workstation() ) : ""; },
1179         },
1180         {
1181             'persist' : 'hidden width ordinal',
1182             'fm_class' : 'circ',
1183             'id' : 'checkin_scan_time',
1184             'label' : document.getElementById('circStrings').getString('staff.circ.utils.checkin_scan_time'),
1185             'flex' : 1,
1186             'primary' : false,
1187             'hidden' : true,
1188             'editable' : false, 'render' : function(my) { return my.circ ? util.date.formatted_date( my.circ.checkin_scan_time(), '%{localized}' ) : ""; },
1189         },
1190         {
1191             'persist' : 'hidden width ordinal',
1192             'fm_class' : 'bre',
1193             'id' : 'creator',
1194             'label' : document.getElementById('circStrings').getString('staff.circ.utils.creator'),
1195             'flex' : 1,
1196             'primary' : false,
1197             'hidden' : true,
1198             'editable' : false, 'render' : function(my) { return my.bre ? (typeof my.bre.creator() == 'object' ? my.bre.creator().usrname() : '#' + my.bre.creator() ) : ''; }
1199         },
1200         {
1201             'persist' : 'hidden width ordinal',
1202             'fm_class' : 'bre',
1203             'id' : 'editor',
1204             'label' : document.getElementById('circStrings').getString('staff.circ.utils.editor'),
1205             'flex' : 1,
1206             'primary' : false,
1207             'hidden' : true,
1208             'editable' : false, 'render' : function(my) { return my.bre ? (typeof my.bre.editor() == 'object' ? my.bre.editor().usrname() : '#' + my.bre.editor() ) : ''; }
1209         },
1210         {
1211             'persist' : 'hidden width ordinal',
1212             'fm_class' : 'bre',
1213             'id' : 'create_date',
1214             'label' : document.getElementById('circStrings').getString('staff.circ.utils.bre.create_date'),
1215             'flex' : 1,
1216             'primary' : false,
1217             'hidden' : true,
1218             'editable' : false, 'render' : function(my) { return my.bre ? util.date.formatted_date( my.bre.create_date(), '%{localized}' ) : ''; }
1219         },
1220         {
1221             'persist' : 'hidden width ordinal',
1222             'fm_class' : 'bre',
1223             'id' : 'edit_date',
1224             'label' : document.getElementById('circStrings').getString('staff.circ.utils.bre.edit_date'),
1225             'flex' : 1,
1226             'primary' : false,
1227             'hidden' : true,
1228             'editable' : false, 'render' : function(my) { return my.bre ? util.date.formatted_date( my.bre.edit_date(), '%{localized}' ) : ''; }
1229         },
1230         {
1231             'persist' : 'hidden width ordinal',
1232             'fm_class' : 'bre',
1233             'id' : 'tcn_value',
1234             'label' : document.getElementById('circStrings').getString('staff.circ.utils.tcn'),
1235             'flex' : 1,
1236             'primary' : false,
1237             'hidden' : true,
1238             'editable' : false, 'render' : function(my) { return my.bre ? my.bre.tcn_value() : ''; }
1239         },
1240         {
1241             'persist' : 'hidden width ordinal',
1242             'fm_class' : 'bre',
1243             'id' : 'tcn_source',
1244             'label' : document.getElementById('circStrings').getString('staff.circ.utils.tcn_source'),
1245             'flex' : 1,
1246             'primary' : false,
1247             'hidden' : true,
1248             'editable' : false, 'render' : function(my) { return my.bre ? my.bre.tcn_source() : ''; }
1249         }
1250
1251     ];
1252     for (var i = 0; i < c.length; i++) {
1253         if (modify[ c[i].id ]) {
1254             for (var j in modify[ c[i].id ]) {
1255                 c[i][j] = modify[ c[i].id ][j];
1256             }
1257         }
1258     }
1259     if (params) {
1260         if (params.just_these) {
1261             JSAN.use('util.functional');
1262             var new_c = [];
1263             for (var i = 0; i < params.just_these.length; i++) {
1264                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
1265                 new_c.push( function(y){ return y; }( x ) );
1266             }
1267             c = new_c;
1268         }
1269         if (params.except_these) {
1270             JSAN.use('util.functional');
1271             var new_c = [];
1272             for (var i = 0; i < c.length; i++) {
1273                 var x = util.functional.find_list(params.except_these,function(d){return(d==c[i].id);});
1274                 if (!x) new_c.push(c[i]);
1275             }
1276             c = new_c;
1277         }
1278     }
1279     return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
1280 };
1281
1282 circ.util.work_log_columns = function(modify,params) {
1283
1284     JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
1285
1286     var c = [
1287         {
1288             'persist' : 'hidden width ordinal',
1289             'id' : 'message',
1290             'label' : document.getElementById('circStrings').getString('staff.circ.work_log_column.message'),
1291             'flex' : 3,
1292             'primary' : true,
1293             'hidden' : false,
1294             'editable' : false, 'render' : function(my) { return my.message; }
1295         },
1296         {
1297             'persist' : 'hidden width ordinal',
1298             'id' : 'when',
1299             'label' : document.getElementById('circStrings').getString('staff.circ.work_log_column.when'),
1300             'flex' : 1,
1301             'primary' : false,
1302             'hidden' : false,
1303             'editable' : false, 'render' : function(my) { return String( my.when ); }
1304         }
1305
1306     ];
1307     for (var i = 0; i < c.length; i++) {
1308         if (modify[ c[i].id ]) {
1309             for (var j in modify[ c[i].id ]) {
1310                 c[i][j] = modify[ c[i].id ][j];
1311             }
1312         }
1313     }
1314     if (params) {
1315         if (params.just_these) {
1316             JSAN.use('util.functional');
1317             var new_c = [];
1318             for (var i = 0; i < params.just_these.length; i++) {
1319                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
1320                 new_c.push( function(y){ return y; }( x ) );
1321             }
1322             c = new_c;
1323         }
1324         if (params.except_these) {
1325             JSAN.use('util.functional');
1326             var new_c = [];
1327             for (var i = 0; i < c.length; i++) {
1328                 var x = util.functional.find_list(params.except_these,function(d){return(d==c[i].id);});
1329                 if (!x) new_c.push(c[i]);
1330             }
1331             c = new_c;
1332         }
1333
1334     }
1335     return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
1336 };
1337
1338 circ.util.transit_columns = function(modify,params) {
1339
1340     JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
1341
1342     var c = [
1343         {
1344             'persist' : 'hidden width ordinal',
1345             'id' : 'transit_item_barcode',
1346             'label' : document.getElementById('circStrings').getString('staff.circ.utils.barcode'),
1347             'flex' : 1,
1348             'primary' : false,
1349             'hidden' : true,
1350             'editable' : false, 'render' : function(my) { return my.acp.barcode(); }
1351         },
1352         {
1353             'persist' : 'hidden width ordinal',
1354             'id' : 'transit_item_title',
1355             'label' : document.getElementById('circStrings').getString('staff.circ.utils.title'),
1356             'flex' : 1,
1357             'primary' : false,
1358             'hidden' : true,
1359             'editable' : false, 'render' : function(my) {
1360                 try { return my.mvr.title(); }
1361                 catch(E) { return my.acp.dummy_title(); }
1362             }
1363         },
1364         {
1365             'persist' : 'hidden width ordinal',
1366             'id' : 'transit_item_author',
1367             'label' : document.getElementById('circStrings').getString('staff.circ.utils.author'),
1368             'flex' : 1,
1369             'primary' : false,
1370             'hidden' : true,
1371             'editable' : false, 'render' : function(my) {
1372                 try { return my.mvr.author(); }
1373                 catch(E) { return my.acp.dummy_author(); }
1374             }
1375         },
1376         {
1377             'persist' : 'hidden width ordinal',
1378             'id' : 'transit_item_callnumber',
1379             'label' : document.getElementById('circStrings').getString('staff.circ.utils.callnumber'),
1380             'flex' : 1,
1381             'primary' : false,
1382             'hidden' : true,
1383             'editable' : false, 'render' : function(my) { return my.acn.label(); }
1384         },
1385         {
1386             'persist' : 'hidden width ordinal',
1387             'id' : 'transit_id',
1388             'label' : document.getElementById('circStrings').getString('staff.circ.utils.transit_id'),
1389             'flex' : 1,
1390             'primary' : false,
1391             'hidden' : true,
1392             'editable' : false, 'render' : function(my) { return my.atc.id(); }
1393         },
1394         {
1395             'persist' : 'hidden width ordinal',
1396             'id' : 'transit_source',
1397             'label' : document.getElementById('circStrings').getString('staff.circ.utils.transit_source'),
1398             'flex' : 1,
1399             'primary' : false,
1400             'hidden' : false,
1401             'editable' : false, 'render' : function(my) {
1402                 if (typeof my.atc.source() == "object") {
1403                     return my.atc.source().shortname();
1404                 } else {
1405                     return data.hash.aou[ my.atc.source() ].shortname();
1406                 }
1407             }
1408         },
1409         {
1410             'persist' : 'hidden width ordinal',
1411             'id' : 'transit_source_send_time',
1412             'label' : document.getElementById('circStrings').getString('staff.circ.utils.transit_source_send_time'),
1413             'flex' : 1,
1414             'primary' : false,
1415             'hidden' : false,
1416             'editable' : false, 'render' : function(my) { return util.date.formatted_date( my.atc.source_send_time(), '%{localized}' ); }
1417         },
1418         {
1419             'persist' : 'hidden width ordinal',
1420             'id' : 'transit_dest_lib',
1421             'label' : document.getElementById('circStrings').getString('staff.circ.utils.transit_dest'),
1422             'flex' : 1,
1423             'primary' : false,
1424             'hidden' : false,
1425             'editable' : false, 'render' : function(my) {
1426                 if (typeof my.atc.dest() == "object") {
1427                     return my.atc.dest().shortname();
1428                 } else {
1429                     return data.hash.aou[ my.atc.dest() ].shortname();
1430                 }
1431             }
1432         },
1433         {
1434             'persist' : 'hidden width ordinal',
1435             'id' : 'transit_dest_recv_time',
1436             'label' : document.getElementById('circStrings').getString('staff.circ.utils.transit_dest_recv_time'),
1437             'flex' : 1,
1438             'primary' : false,
1439             'hidden' : false,
1440             'editable' : false, 'render' : function(my) { return util.date.formatted_date( my.atc.dest_recv_time(), '%{localized}' ); }
1441         },
1442         {
1443             'persist' : 'hidden width ordinal',
1444             'id' : 'transit_target_copy',
1445             'label' : document.getElementById('circStrings').getString('staff.circ.utils.transit_target_copy'),
1446             'flex' : 1,
1447             'primary' : false,
1448             'hidden' : true,
1449             'editable' : false, 'render' : function(my) { return my.atc.target_copy(); }
1450         },
1451     ];
1452     for (var i = 0; i < c.length; i++) {
1453         if (modify[ c[i].id ]) {
1454             for (var j in modify[ c[i].id ]) {
1455                 c[i][j] = modify[ c[i].id ][j];
1456             }
1457         }
1458     }
1459     if (params) {
1460         if (params.just_these) {
1461             JSAN.use('util.functional');
1462             var new_c = [];
1463             for (var i = 0; i < params.just_these.length; i++) {
1464                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
1465                 new_c.push( function(y){ return y; }( x ) );
1466             }
1467             c = new_c;
1468         }
1469         if (params.except_these) {
1470             JSAN.use('util.functional');
1471             var new_c = [];
1472             for (var i = 0; i < c.length; i++) {
1473                 var x = util.functional.find_list(params.except_these,function(d){return(d==c[i].id);});
1474                 if (!x) new_c.push(c[i]);
1475             }
1476             c = new_c;
1477         }
1478
1479     }
1480     return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
1481 };
1482
1483 circ.util.hold_columns = function(modify,params) {
1484
1485     JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
1486
1487     var c = [
1488         {
1489             'persist' : 'hidden width ordinal',
1490             'id' : 'cancel_time',
1491             'label' : document.getElementById('circStrings').getString('staff.circ.utils.hold_cancel_time'),
1492             'flex' : 1,
1493             'primary' : false,
1494             'hidden' : true,
1495             'editable' : false, 'render' : function(my) { return util.date.formatted_date( my.ahr.cancel_time(), '%{localized}' ); }
1496         },
1497         {
1498             'persist' : 'hidden width ordinal',
1499             'id' : 'cancel_cause',
1500             'label' : document.getElementById('circStrings').getString('staff.circ.utils.hold_cancel_cause'),
1501             'flex' : 1,
1502             'primary' : false,
1503             'hidden' : true,
1504             'editable' : false, 'render' : function(my) { return typeof my.ahr.cancel_cause == 'object' ? my.ahr.cancel_cause().label() : data.hash.ahrcc[ my.ahr.cancel_cause() ].label(); }
1505         },
1506         {
1507             'persist' : 'hidden width ordinal',
1508             'id' : 'cancel_note',
1509             'label' : document.getElementById('circStrings').getString('staff.circ.utils.hold_cancel_note'),
1510             'flex' : 1,
1511             'primary' : false,
1512             'hidden' : true,
1513             'editable' : false, 'render' : function(my) { return my.ahr.cancel_note(); }
1514         },
1515         {
1516             'persist' : 'hidden width ordinal',
1517             'id' : 'request_lib',
1518             'label' : document.getElementById('circStrings').getString('staff.circ.utils.request_lib'),
1519             'flex' : 1,
1520             'primary' : false,
1521             'hidden' : true,
1522             'editable' : false, 'render' : function(my) {
1523                 if (Number(my.ahr.request_lib())>=0) {
1524                     return data.hash.aou[ my.ahr.request_lib() ].name();
1525                 } else {
1526                     return my.ahr.request_lib().name();
1527                 }
1528             }
1529         },
1530         {
1531             'persist' : 'hidden width ordinal',
1532             'id' : 'request_lib_shortname',
1533             'label' : document.getElementById('circStrings').getString('staff.circ.utils.request_lib_shortname'),
1534             'flex' : 0,
1535             'primary' : false,
1536             'hidden' : true,
1537             'editable' : false, 'render' : function(my) {
1538                 if (Number(my.ahr.request_lib())>=0) {
1539                     return data.hash.aou[ my.ahr.request_lib() ].shortname();
1540                 } else {
1541                     return my.ahr.request_lib().shortname();
1542                 }
1543             }
1544         },
1545         {
1546             'persist' : 'hidden width ordinal',
1547             'id' : 'request_time',
1548             'label' : document.getElementById('circStrings').getString('staff.circ.utils.request_time'),
1549             'flex' : 0,
1550             'primary' : false,
1551             'hidden' : true,
1552             'editable' : false, 'render' : function(my) { return util.date.formatted_date( my.ahr.request_time(), '%{localized}' ); }
1553         },
1554         {
1555             'persist' : 'hidden width ordinal',
1556             'id' : 'shelf_time',
1557             'label' : document.getElementById('circStrings').getString('staff.circ.utils.holds.shelf_time'),
1558             'flex' : 0,
1559             'primary' : false,
1560             'hidden' : true,
1561             'editable' : false, 'render' : function(my) { return util.date.formatted_date( my.ahr.shelf_time(), '%{localized}' ); }
1562         },
1563         {
1564             'persist' : 'hidden width ordinal',
1565             'id' : 'shelf_expire_time',
1566             'label' : document.getElementById('circStrings').getString('staff.circ.utils.holds.shelf_expire_time'),
1567             'flex' : 0,
1568             'primary' : false,
1569             'hidden' : true,
1570             'editable' : false, 'render' : function(my) { return util.date.formatted_date( my.ahr.shelf_expire_time(), '%{localized}' ); }
1571         },
1572         {
1573             'persist' : 'hidden width ordinal',
1574             'id' : 'available_time',
1575             'label' : document.getElementById('circStrings').getString('staff.circ.utils.available_time'),
1576             'flex' : 1,
1577             'primary' : false,
1578             'hidden' : false,
1579             'editable' : false, 'render' : function(my) {
1580                 if (my.ahr.transit() && my.ahr.transit().dest_recv_time()) {
1581                     return util.date.formatted_date( my.ahr.transit().dest_recv_time(), '%{localized}' );
1582                 }
1583                 if (!my.ahr.transit() && my.ahr.capture_time()) {
1584                     return util.date.formatted_date( my.ahr.capture_time(), '%{localized}' );
1585                 }
1586                 return "";
1587             }
1588         },
1589         {
1590             'persist' : 'hidden width ordinal',
1591             'id' : 'capture_time',
1592             'label' : document.getElementById('circStrings').getString('staff.circ.utils.capture_time'),
1593             'flex' : 1,
1594             'primary' : false,
1595             'hidden' : true,
1596             'editable' : false, 'render' : function(my) { return my.ahr.capture_time() ? util.date.formatted_date( my.ahr.capture_time(), '%{localized}' ) : ""; }
1597         },
1598         {
1599             'persist' : 'hidden width ordinal',
1600             'id' : 'ahr_status',
1601             'label' : document.getElementById('commonStrings').getString('staff.ahr_status_label'),
1602             'flex' : 1,
1603             'primary' : false,
1604             'hidden' : false,
1605             'editable' : false, 'render' : function(my) {
1606                 switch (Number(my.status)) {
1607                     case 1:
1608                         return document.getElementById('circStrings').getString('staff.circ.utils.hold_status.1');
1609                         break;
1610                     case 2:
1611                         return document.getElementById('circStrings').getString('staff.circ.utils.hold_status.2');
1612                         break;
1613                     case 3:
1614                         return document.getElementById('circStrings').getString('staff.circ.utils.hold_status.3');
1615                         break;
1616                     case 4:
1617                         return document.getElementById('circStrings').getString('staff.circ.utils.hold_status.4');
1618                         break;
1619                                         case 5:
1620                         return document.getElementById('circStrings').getString('staff.circ.utils.hold_status.5');
1621                         break;
1622                     default:
1623                         return my.status;
1624                         break;
1625                 };
1626             }
1627         },
1628         {
1629             'persist' : 'hidden width ordinal',
1630             'id' : 'hold_type',
1631             'label' : document.getElementById('commonStrings').getString('staff.ahr_hold_type_label'),
1632             'flex' : 0,
1633             'primary' : false,
1634             'hidden' : true,
1635             'editable' : false, 'render' : function(my) { return my.ahr.hold_type(); }
1636         },
1637         {
1638             'persist' : 'hidden width ordinal',
1639             'id' : 'ahr_mint_condition',
1640             'label' : document.getElementById('circStrings').getString('staff.circ.utils.ahr_mint_condition'),
1641             'flex' : 0,
1642             'primary' : false,
1643             'hidden' : true,
1644             'editable' : false, 'render' : function(my) {
1645                 if (get_bool( my.ahr.mint_condition() )) {
1646                     return document.getElementById('circStrings').getString('staff.circ.utils.ahr_mint_condition.true');
1647                 } else {
1648                     return document.getElementById('circStrings').getString('staff.circ.utils.ahr_mint_condition.false');
1649                 }
1650             }
1651         },
1652         {
1653             'persist' : 'hidden width ordinal',
1654             'id' : 'frozen',
1655             'label' : document.getElementById('circStrings').getString('staff.circ.utils.active'),
1656             'flex' : 0,
1657             'primary' : false,
1658             'hidden' : true,
1659             'editable' : false, 'render' : function(my) {
1660                 if (!get_bool( my.ahr.frozen() )) {
1661                     return document.getElementById('circStrings').getString('staff.circ.utils.yes');
1662                 } else {
1663                     return document.getElementById('circStrings').getString('staff.circ.utils.no');
1664                 }
1665             }
1666         },
1667         {
1668             'persist' : 'hidden width ordinal',
1669             'id' : 'thaw_date',
1670             'label' : document.getElementById('circStrings').getString('staff.circ.utils.thaw_date'),
1671             'flex' : 0,
1672             'primary' : false,
1673             'hidden' : true,
1674             'editable' : false, 'render' : function(my) {
1675                 if (my.ahr.thaw_date() == null) {
1676                     return document.getElementById('circStrings').getString('staff.circ.utils.thaw_date.none');
1677                 } else {
1678                     return util.date.formatted_date( my.ahr.thaw_date(), '%{localized}' );
1679                 }
1680             }
1681         },
1682         {
1683             'persist' : 'hidden width ordinal',
1684             'id' : 'pickup_lib',
1685             'label' : document.getElementById('circStrings').getString('staff.circ.utils.pickup_lib'),
1686             'flex' : 1,
1687             'primary' : false,
1688             'hidden' : true,
1689             'editable' : false, 'render' : function(my) {
1690                 if (Number(my.ahr.pickup_lib())>=0) {
1691                     return data.hash.aou[ my.ahr.pickup_lib() ].name();
1692                 } else {
1693                     return my.ahr.pickup_lib().name();
1694                 }
1695             }
1696         },
1697         {
1698             'persist' : 'hidden width ordinal',
1699             'id' : 'pickup_lib_shortname',
1700             'label' : document.getElementById('commonStrings').getString('staff.ahr_pickup_lib_label'),
1701             'flex' : 0,
1702             'primary' : false,
1703             'hidden' : true,
1704             'editable' : false, 'render' : function(my) {
1705                 if (Number(my.ahr.pickup_lib())>=0) {
1706                     return data.hash.aou[ my.ahr.pickup_lib() ].shortname();
1707                 } else {
1708                     return my.ahr.pickup_lib().shortname();
1709                 }
1710             }
1711         },
1712         {
1713             'persist' : 'hidden width ordinal',
1714             'id' : 'current_copy',
1715             'label' : document.getElementById('commonStrings').getString('staff.ahr_current_copy_label'),
1716             'flex' : 1,
1717             'primary' : false,
1718             'hidden' : true,
1719             'editable' : false, 'render' : function(my) {
1720                 if (my.acp) {
1721                     return my.acp.barcode();
1722                 } else {
1723                     return document.getElementById('circStrings').getString('staff.circ.utils.current_copy.none');
1724                 }
1725             }
1726         },
1727         {
1728             'persist' : 'hidden width ordinal',
1729             'id' : 'current_copy_location',
1730             'label' : document.getElementById('commonStrings').getString('staff.ahr_current_copy_location_label'),
1731             'flex' : 1,
1732             'primary' : false,
1733             'hidden' : true,
1734             'editable' : false, 'render' : function(my) {
1735                 if (!my.acp) { return ""; } else { if (Number(my.acp.location())>=0) return data.lookup("acpl", my.acp.location() ).name(); else return my.acp.location().name(); }
1736             }
1737         },
1738         {
1739             'persist' : 'hidden width ordinal',
1740             'id' : 'email_notify',
1741             'label' : document.getElementById('commonStrings').getString('staff.ahr_email_notify_label'),
1742             'flex' : 1,
1743             'primary' : false,
1744             'hidden' : true,
1745             'editable' : false, 'render' : function(my) {
1746                 if (get_bool(my.ahr.email_notify())) {
1747                     return document.getElementById('circStrings').getString('staff.circ.utils.yes');
1748                 } else {
1749                     return document.getElementById('circStrings').getString('staff.circ.utils.no');
1750                 }
1751             }
1752         },
1753         {
1754             'persist' : 'hidden width ordinal',
1755             'id' : 'expire_date',
1756             'label' : document.getElementById('commonStrings').getString('staff.ahr_expire_date_label'),
1757             'flex' : 1,
1758             'primary' : false,
1759             'hidden' : true,
1760             'editable' : false, 'render' : function(my) { return my.ahr.expire_time() ? util.date.formatted_date( my.ahr.expire_time(), '%{localized}' ) : ''; }
1761         },
1762         {
1763             'persist' : 'hidden width ordinal',
1764             'id' : 'fulfillment_time',
1765             'label' : document.getElementById('commonStrings').getString('staff.ahr_fulfillment_time_label'),
1766             'flex' : 1,
1767             'primary' : false,
1768             'hidden' : true,
1769             'editable' : false, 'render' : function(my) { return util.date.formatted_date( my.ahr.fulfillment_time(), '%{localized}' ); }
1770         },
1771         {
1772             'persist' : 'hidden width ordinal',
1773             'id' : 'holdable_formats',
1774             'label' : document.getElementById('commonStrings').getString('staff.ahr_holdable_formats_label'),
1775             'flex' : 1,
1776             'primary' : false,
1777             'hidden' : true,
1778             'editable' : false, 'render' : function(my) { return my.ahr.holdable_formats(); }
1779         },
1780         {
1781             'persist' : 'hidden width ordinal',
1782             'id' : 'ahr_id',
1783             'label' : document.getElementById('commonStrings').getString('staff.ahr_id_label'),
1784             'flex' : 1,
1785             'primary' : false,
1786             'hidden' : true,
1787             'editable' : false, 'render' : function(my) { return my.ahr.id(); }
1788         },
1789         {
1790             'persist' : 'hidden width ordinal',
1791             'id' : 'phone_notify',
1792             'label' : document.getElementById('commonStrings').getString('staff.ahr_phone_notify_label'),
1793             'flex' : 1,
1794             'primary' : false,
1795             'hidden' : true,
1796             'editable' : false, 'render' : function(my) { return my.ahr.phone_notify(); }
1797         },
1798         {
1799             'persist' : 'hidden width ordinal',
1800             'id' : 'prev_check_time',
1801             'label' : document.getElementById('commonStrings').getString('staff.ahr_prev_check_time_label'),
1802             'flex' : 1,
1803             'primary' : false,
1804             'hidden' : true,
1805             'editable' : false, 'render' : function(my) { return util.date.formatted_date( my.ahr.prev_check_time(), '%{localized}' ); }
1806         },
1807         {
1808             'persist' : 'hidden width ordinal',
1809             'id' : 'requestor',
1810             'label' : document.getElementById('commonStrings').getString('staff.ahr_requestor_label'),
1811             'flex' : 1,
1812             'primary' : false,
1813             'hidden' : true,
1814             'editable' : false, 'render' : function(my) { return my.ahr.requestor(); }
1815         },
1816         {
1817             'persist' : 'hidden width ordinal',
1818             'id' : 'selection_depth',
1819             'label' : document.getElementById('commonStrings').getString('staff.ahr_selection_depth_label'),
1820             'flex' : 1,
1821             'primary' : false,
1822             'hidden' : true,
1823             'editable' : false, 'render' : function(my) { return my.ahr.selection_depth(); }
1824         },
1825         {
1826             'persist' : 'hidden width ordinal',
1827             'id' : 'top_of_queue',
1828             'label' : document.getElementById('commonStrings').getString('staff.ahr_top_of_queue_label'),
1829             'flex' : 1,
1830             'primary' : false,
1831             'hidden' : true,
1832             'editable' : false, 'render' : function(my) { return get_bool( my.ahr.cut_in_line() ) ? document.getElementById('commonStrings').getString('common.yes') : document.getElementById('commonStrings').getString('common.no') ; }
1833         },
1834         {
1835             'persist' : 'hidden width ordinal',
1836             'id' : 'target',
1837             'label' : document.getElementById('commonStrings').getString('staff.ahr_target_label'),
1838             'flex' : 1,
1839             'primary' : false,
1840             'hidden' : true,
1841             'editable' : false, 'render' : function(my) { return my.ahr.target(); }
1842         },
1843         {
1844             'persist' : 'hidden width ordinal',
1845             'id' : 'usr',
1846             'label' : document.getElementById('commonStrings').getString('staff.ahr_usr_label'),
1847             'flex' : 1,
1848             'primary' : false,
1849             'hidden' : true,
1850             'editable' : false, 'render' : function(my) { return my.ahr.usr(); }
1851         },
1852         {
1853             'persist' : 'hidden width ordinal',
1854             'id' : 'title',
1855             'label' : document.getElementById('commonStrings').getString('staff.mvr_label_title'),
1856             'flex' : 1,
1857             'sort_type' : 'title',
1858             'primary' : false,
1859             'hidden' : true,
1860             'editable' : false, 'render' : function(my) {
1861                 if (my.mvr) {
1862                     return my.mvr.title();
1863                 } else {
1864                     return document.getElementById('circStrings').getString('staff.circ.utils.title.none');
1865                 }
1866             }
1867         },
1868         {
1869             'persist' : 'hidden width ordinal',
1870             'id' : 'author',
1871             'label' : document.getElementById('commonStrings').getString('staff.mvr_label_author'),
1872             'flex' : 1,
1873             'primary' : false,
1874             'hidden' : true,
1875             'editable' : false, 'render' : function(my) {
1876                 if (my.mvr) {
1877                     return my.mvr.author();
1878                 } else {
1879                     return document.getElementById('circStrings').getString('staff.circ.utils.author.none');
1880                 }
1881             }
1882         },
1883         {
1884             'persist' : 'hidden width ordinal',
1885             'id' : 'edition',
1886             'label' : document.getElementById('circStrings').getString('staff.circ.utils.edition'),
1887             'flex' : 1,
1888             'primary' : false,
1889             'hidden' : true,
1890             'editable' : false, 'render' : function(my) { return my.mvr.edition(); }
1891         },
1892         {
1893             'persist' : 'hidden width ordinal',
1894             'id' : 'isbn',
1895             'label' : document.getElementById('circStrings').getString('staff.circ.utils.isbn'),
1896             'flex' : 1,
1897             'primary' : false,
1898             'hidden' : true,
1899             'editable' : false, 'render' : function(my) { return my.mvr.isbn(); }
1900         },
1901         {
1902             'persist' : 'hidden width ordinal',
1903             'id' : 'pubdate',
1904             'label' : document.getElementById('circStrings').getString('staff.circ.utils.pubdate'),
1905             'flex' : 1,
1906             'primary' : false,
1907             'hidden' : true,
1908             'editable' : false, 'render' : function(my) { return my.mvr.pubdate(); }
1909         },
1910         {
1911             'persist' : 'hidden width ordinal',
1912             'id' : 'publisher',
1913             'label' : document.getElementById('circStrings').getString('staff.circ.utils.publisher'),
1914             'flex' : 1,
1915             'primary' : false,
1916             'hidden' : true,
1917             'editable' : false, 'render' : function(my) { return my.mvr.publisher(); }
1918         },
1919         {
1920             'persist' : 'hidden width ordinal',
1921             'id' : 'tcn',
1922             'label' : document.getElementById('circStrings').getString('staff.circ.utils.tcn'),
1923             'flex' : 1,
1924             'primary' : false,
1925             'hidden' : true,
1926             'editable' : false, 'render' : function(my) { return my.mvr.tcn(); }
1927         },
1928         {
1929             'persist' : 'hidden width ordinal',
1930             'id' : 'notify_time',
1931             'label' : document.getElementById('circStrings').getString('staff.circ.utils.notify_time'),
1932             'flex' : 1,
1933             'primary' : false,
1934             'hidden' : true,
1935             'editable' : false, 'render' : function(my) { return util.date.formatted_date( my.ahr.notify_time(), '%{localized}' ); }
1936         },
1937         {
1938             'persist' : 'hidden width ordinal',
1939             'id' : 'notify_count',
1940             'label' : document.getElementById('circStrings').getString('staff.circ.utils.notify_count'),
1941             'flex' : 1,
1942             'primary' : false,
1943             'hidden' : true,
1944             'editable' : false, 'render' : function(my) { return my.ahr.notify_count(); }
1945         },
1946         {
1947             'persist' : 'hidden width ordinal',
1948             'id' : 'transit_source',
1949             'label' : document.getElementById('circStrings').getString('staff.circ.utils.transit_source'),
1950             'flex' : 1,
1951             'primary' : false,
1952             'hidden' : true,
1953             'editable' : false, 'render' : function(my) {
1954                 if (my.ahr.transit()) {
1955                     return data.hash.aou[ my.ahr.transit().source() ].shortname();
1956                 } else {
1957                     return "";
1958                 }
1959             }
1960         },
1961         {
1962             'persist' : 'hidden width ordinal',
1963             'id' : 'transit_source_send_time',
1964             'label' : document.getElementById('circStrings').getString('staff.circ.utils.transit_source_send_time'),
1965             'flex' : 1,
1966             'primary' : false,
1967             'hidden' : true,
1968             'editable' : false, 'render' : function(my) { return my.ahr.transit() ?  util.date.formatted_date( my.ahr.transit().source_send_time(), '%{localized}' ) : ""; }
1969         },
1970         {
1971             'persist' : 'hidden width ordinal',
1972             'id' : 'transit_dest_lib',
1973             'label' : document.getElementById('circStrings').getString('staff.circ.utils.transit_dest'),
1974             'flex' : 1,
1975             'primary' : false,
1976             'hidden' : true,
1977             'editable' : false, 'render' : function(my) { return my.ahr.transit() ?  data.hash.aou[ my.ahr.transit().dest() ].shortname() : ""; }
1978         },
1979         {
1980             'persist' : 'hidden width ordinal',
1981             'id' : 'transit_dest_recv_time',
1982             'label' : document.getElementById('circStrings').getString('staff.circ.utils.transit_dest_recv_time'),
1983             'flex' : 1,
1984             'primary' : false,
1985             'hidden' : true,
1986             'editable' : false, 'render' : function(my) { return my.ahr.transit() ?  util.date.formatted_date( my.ahr.transit().dest_recv_time(), '%{localized}' ) : ""; }
1987         },
1988         {
1989             'persist' : 'hidden width ordinal',
1990             'id' : 'patron_barcode',
1991             'label' : document.getElementById('circStrings').getString('staff.circ.utils.offline.patron_barcode'),
1992             'flex' : 1,
1993             'primary' : false,
1994             'hidden' : true,
1995             'editable' : false, 'render' : function(my) { return my.patron_barcode ? my.patron_barcode : ""; }
1996         },
1997         {
1998             'persist' : 'hidden width ordinal',
1999             'id' : 'patron_family_name',
2000             'label' : document.getElementById('circStrings').getString('staff.circ.utils.patron_family_name'),
2001             'flex' : 1,
2002             'primary' : false,
2003             'hidden' : true,
2004             'editable' : false, 'render' : function(my) { return my.patron_family_name ? my.patron_family_name : ""; }
2005         },
2006         {
2007             'persist' : 'hidden width ordinal',
2008             'id' : 'patron_first_given_name',
2009             'label' : document.getElementById('circStrings').getString('staff.circ.utils.patron_first_given_name'),
2010             'flex' : 1,
2011             'primary' : false,
2012             'hidden' : true,
2013             'editable' : false, 'render' : function(my) { return my.patron_first_given_name ? my.patron_first_given_name : ""; }
2014         },
2015         {
2016             'persist' : 'hidden width ordinal',
2017             'id' : 'callnumber',
2018             'label' : document.getElementById('circStrings').getString('staff.circ.utils.callnumber'),
2019             'flex' : 1,
2020             'primary' : false,
2021             'hidden' : true,
2022             'editable' : false, 'render' : function(my) { return my.acn.label(); }
2023         },
2024                 {
2025             'persist' : 'hidden width ordinal',
2026             'id' : 'total_holds',
2027             'label' : document.getElementById('circStrings').getString('staff.circ.utils.total_holds'),
2028             'flex' : 1,
2029             'primary' : false,
2030             'hidden' : true,
2031             'editable' : false, 'render' : function(my) { return my.total_holds; }
2032         },
2033                 {
2034             'persist' : 'hidden width ordinal',
2035             'id' : 'queue_position',
2036             'label' : document.getElementById('circStrings').getString('staff.circ.utils.queue_position'),
2037             'flex' : 1,
2038             'primary' : false,
2039             'hidden' : true,
2040             'editable' : false, 'render' : function(my) { return my.queue_position; }
2041         },
2042                 {
2043             'persist' : 'hidden width ordinal',
2044             'id' : 'potential_copies',
2045             'label' : document.getElementById('circStrings').getString('staff.circ.utils.potential_copies'),
2046             'flex' : 1,
2047             'primary' : false,
2048             'hidden' : true,
2049             'editable' : false, 'render' : function(my) { return my.potential_copies; }
2050         },
2051                 {
2052             'persist' : 'hidden width ordinal',
2053             'id' : 'estimated_wait',
2054             'label' : document.getElementById('circStrings').getString('staff.circ.utils.estimated_wait'),
2055             'flex' : 1,
2056             'primary' : false,
2057             'hidden' : true,
2058             'editable' : false, 'render' : function(my) { return my.estimated_wait; }
2059         },
2060         {
2061             'persist' : 'hidden width ordinal',
2062             'id' : 'hold_note',
2063             'label' : document.getElementById('circStrings').getString('staff.circ.utils.hold_note'),
2064             'flex' : 1,
2065             'primary' : false,
2066             'hidden' : true,
2067             'editable' : false, 'render' : function(my) { return my.ahrn_count; }
2068         },
2069         {
2070             'persist' : 'hidden width ordinal',
2071             'id' : 'staff_hold',
2072             'label' : document.getElementById('circStrings').getString('staff.circ.utils.staff_hold'),
2073             'flex' : 1,
2074             'primary' : false,
2075             'hidden' : true,
2076             'editable' : false, 
2077             'render' : function(my) {
2078                 if (my.ahr.usr() != my.ahr.requestor()){
2079                     return document.getElementById('circStrings').getString('staff.circ.utils.yes');
2080                 } else {
2081                     return document.getElementById('circStrings').getString('staff.circ.utils.no');
2082                 }
2083             }
2084         }
2085     ];
2086     for (var i = 0; i < c.length; i++) {
2087         if (modify[ c[i].id ]) {
2088             for (var j in modify[ c[i].id ]) {
2089                 c[i][j] = modify[ c[i].id ][j];
2090             }
2091         }
2092     }
2093     if (params) {
2094         if (params.just_these) {
2095             JSAN.use('util.functional');
2096             var new_c = [];
2097             for (var i = 0; i < params.just_these.length; i++) {
2098                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
2099                 new_c.push( function(y){ return y; }( x ) );
2100             }
2101             c = new_c;
2102         }
2103         if (params.except_these) {
2104             JSAN.use('util.functional');
2105             var new_c = [];
2106             for (var i = 0; i < c.length; i++) {
2107                 var x = util.functional.find_list(params.except_these,function(d){return(d==c[i].id);});
2108                 if (!x) new_c.push(c[i]);
2109             }
2110             c = new_c;
2111         }
2112
2113     }
2114     return c.sort( function(a,b) { if (a.label < b.label) return -1; if (a.label > b.label) return 1; return 0; } );
2115 };
2116 /*
2117 circ.util.std_map_row_to_column = function(error_value) {
2118     return function(row,col) {
2119         // row contains { 'my' : { 'acp' : {}, 'circ' : {}, 'mvr' : {} } }
2120         // col contains one of the objects listed above in columns
2121
2122         // mimicking some of the obj in circ.checkin and circ.checkout where map_row_to_column is usually defined
2123         var obj = {};
2124         JSAN.use('util.error'); obj.error = new util.error();
2125         JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
2126         JSAN.use('util.network'); obj.network = new util.network();
2127         JSAN.use('util.money');
2128
2129         var my = row.my;
2130         var value;
2131         try {
2132             value = eval( col.render );
2133         } catch(E) {
2134             obj.error.sdump('D_WARN','map_row_to_column: ' + E);
2135             if (error_value) value = error_value; else value = '   ';
2136         }
2137         return value;
2138     }
2139 };
2140 */
2141 circ.util.std_map_row_to_columns = function(error_value) {
2142     return function(row,cols) {
2143         // row contains { 'my' : { 'acp' : {}, 'circ' : {}, 'mvr' : {} } }
2144         // cols contains all of the objects listed above in columns
2145
2146         var obj = {};
2147         JSAN.use('util.error'); obj.error = new util.error();
2148         JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
2149         JSAN.use('util.network'); obj.network = new util.network();
2150         JSAN.use('util.money');
2151
2152         var my = row.my;
2153         var values = [];
2154         var cmd = '';
2155         try {
2156             for (var i = 0; i < cols.length; i++) {
2157                 switch (typeof cols[i].render) {
2158                     case 'function': try { values[i] = cols[i].render(my); } catch(E) { values[i] = error_value; obj.error.sdump('D_COLUMN_RENDER_ERROR',E); } break;
2159                     case 'string' : cmd += 'try { ' + cols[i].render + '; values['+i+'] = v; } catch(E) { values['+i+'] = error_value; }'; break;
2160                     default: cmd += 'values['+i+'] = "??? '+(typeof cols[i].render)+'"; ';
2161                 }
2162             }
2163             if (cmd) eval( cmd );
2164         } catch(E) {
2165             obj.error.sdump('D_WARN','map_row_to_column: ' + E);
2166             if (error_value) { value = error_value; } else { value = '   ' };
2167         }
2168         return values;
2169     }
2170 };
2171
2172 circ.util.checkin_via_barcode = function(session,params,backdate,auto_print,async) {
2173     try {
2174         JSAN.use('util.error'); var error = new util.error();
2175         JSAN.use('util.network'); var network = new util.network();
2176         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
2177         JSAN.use('util.date'); JSAN.use('util.functional');
2178
2179         if (backdate && (backdate == util.date.formatted_date(new Date(),'%Y-%m-%d')) ) backdate = null;
2180
2181         //var params = { 'barcode' : barcode };
2182         if (backdate) params.backdate = util.date.formatted_date(backdate + ' 00:00:00','%{iso8601}');
2183
2184         if (typeof params.disable_textbox == 'function') {
2185             try { params.disable_textbox(); }
2186             catch(E) { error.sdump('D_ERROR','params.disable_textbox() = ' + E); };
2187         }
2188
2189         function checkin_callback(req) {
2190             JSAN.use('util.error'); var error = new util.error();
2191             try {
2192                 var check = req.getResultObject();
2193                 var r = circ.util.checkin_via_barcode2(session,params,backdate,auto_print,check);
2194                 if (typeof params.checkin_result == 'function') {
2195                     try { params.checkin_result(r); } catch(E) { error.sdump('D_ERROR','params.checkin_result() = ' + E); };
2196                 }
2197                 if (typeof async == 'function') async(check);
2198                 return check;
2199             } catch(E) {
2200                 error.standard_unexpected_error_alert(document.getElementById('circStrings').getFormattedString('staff.circ.checkin.error', ['1']), E);
2201                 if (typeof params.enable_textbox == 'function') {
2202                     try { params.enable_textbox(); }
2203                     catch(E) { error.sdump('D_ERROR','params.disable_textbox() = ' + E); };
2204                 }
2205                 return null;
2206             }
2207         }
2208
2209         var check = network.request(
2210             api.CHECKIN_VIA_BARCODE.app,
2211             api.CHECKIN_VIA_BARCODE.method,
2212             [ session, util.functional.filter_object( params, function(i,o) { return typeof o != 'function'; } ) ],
2213             async ? checkin_callback : null,
2214             {
2215                 'title' : document.getElementById('circStrings').getString('staff.circ.utils.checkin.override'),
2216                 'overridable_events' : [
2217                     null /* custom event */,
2218                     1203 /* COPY_BAD_STATUS */,
2219                     1213 /* PATRON_BARRED */,
2220                     1217 /* PATRON_INACTIVE */,
2221                     1224 /* PATRON_ACCOUNT_EXPIRED */,
2222                     1234 /* ITEM_DEPOSIT_PAID */,
2223                     7009 /* CIRC_CLAIMS_RETURNED */,
2224                     7010 /* COPY_ALERT_MESSAGE */,
2225                     7011 /* COPY_STATUS_LOST */,
2226                     7012 /* COPY_STATUS_MISSING */,
2227                     7013 /* PATRON_EXCEEDS_FINES */,
2228                 ],
2229                 'text' : {
2230                     '1203' : function(r) {
2231                         return typeof r.payload.status() == 'object' ? r.payload.status().name() : data.hash.ccs[ r.payload.status() ].name();
2232                     },
2233                     '1234' : function(r) {
2234                         return document.getElementById('circStrings').getString('staff.circ.utils.checkin.override.item_deposit_paid.warning');
2235                     },
2236                     '7010' : function(r) {
2237                         return r.payload;
2238                     }
2239                 }
2240             }
2241         );
2242         if (! async ) {
2243             return checkin_callback( { 'getResultObject' : function() { return check; } } );
2244         }
2245
2246
2247     } catch(E) {
2248         JSAN.use('util.error'); var error = new util.error();
2249         error.standard_unexpected_error_alert(document.getElementById('circStrings').getFormattedString('staff.circ.checkin.error', ['2']), E);
2250         if (typeof params.enable_textbox == 'function') {
2251             try { params.enable_textbox(); } catch(E) { error.sdump('D_ERROR','params.disable_textbox() = ' + E); };
2252         }
2253         return null;
2254     }
2255 };
2256
2257 circ.util.checkin_via_barcode2 = function(session,params,backdate,auto_print,check) {
2258     try {
2259         JSAN.use('util.error'); var error = new util.error();
2260         JSAN.use('util.network'); var network = new util.network();
2261         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
2262         JSAN.use('util.date');
2263
2264         error.sdump('D_DEBUG','check = ' + error.pretty_print( js2JSON( check ) ) );
2265
2266         check.message = check.textcode;
2267
2268         if (check.payload && check.payload.copy) { check.copy = check.payload.copy; }
2269         if (check.payload && check.payload.record) { check.record = check.payload.record; }
2270         if (check.payload && check.payload.circ) { check.circ = check.payload.circ; }
2271         if (check.payload && check.payload.patron) { check.patron = check.payload.patron; }
2272
2273         if (!check.route_to) { check.route_to = '   '; }
2274
2275         if (document.getElementById('no_change_label')) {
2276             document.getElementById('no_change_label').setAttribute('value','');
2277             document.getElementById('no_change_label').setAttribute('hidden','true');
2278         }
2279
2280         var msg = '';
2281         var print_list = [];
2282         var print_data = { 
2283             'error' : '',
2284             'error_msg' : '',
2285             'cancelled' : '',
2286             'route_to' : '',
2287             'route_to_msg' : '',
2288             'route_to_org_fullname' : '',
2289             'street1' : '',
2290             'street2' : '',
2291             'city_state_zip' : '',
2292             'city' : '',
2293             'state' : '',
2294             'county' : '',
2295             'country' : '',
2296             'post_code' : '',
2297             'item_barcode' : '',
2298             'item_barcode_msg' : '',
2299             'item_title' : '',
2300             'item_title_msg' : '',
2301             'item_author' : '',
2302             'item_author_msg' : '',
2303             'hold_for_msg' : '',
2304             'hold_for_alias' : '',
2305             'hold_for_family_name' : '',
2306             'hold_for_first_given_name' : '',
2307             'hold_for_second_given_name' : '',
2308             'user_barcode' : '',
2309             'user_barcode_msg' : '',
2310             'notify_by_phone' : '',
2311             'notify_by_phone_msg' : '',
2312             'notify_by_email' : '',
2313             'notify_by_email_msg' : '',
2314             'request_date' : '',
2315             'request_date_msg' : '',
2316             'slip_date' : '',
2317             'slip_date_msg' : ''
2318         };
2319
2320         if (check.payload && check.payload.cancelled_hold_transit) {
2321             print_data.cancelled = document.getElementById('circStrings').getString('staff.circ.utils.transit_hold_cancelled');
2322             msg += print_data.cancelled;
2323             msg += '\n\n';
2324         }
2325
2326         /* SUCCESS  /  NO_CHANGE  /  ITEM_NOT_CATALOGED */
2327         if (check.ilsevent == 0 || check.ilsevent == 3 || check.ilsevent == 1202) {
2328             try { check.route_to = data.lookup('acpl', check.copy.location() ).name(); }
2329             catch(E) {
2330                 print_data.error_msg = document.getElementById('commonStrings').getString('common.error');
2331                 print_data.error_msg += '\nFIXME: ' + E + '\n';
2332                 msg += print_data.error_msg;
2333             }
2334             if (check.ilsevent == 3 /* NO_CHANGE */) {
2335                 //msg = 'This item is already checked in.\n';
2336                 if (document.getElementById('no_change_label')) {
2337                     var m = document.getElementById('no_change_label').getAttribute('value');
2338                     document.getElementById('no_change_label').setAttribute('value', m + document.getElementById('circStrings').getFormattedString('staff.circ.utils.item_checked_in', [params.barcode]) + '  ');
2339                     document.getElementById('no_change_label').setAttribute('hidden','false');
2340                 }
2341             }
2342             if (check.ilsevent == 1202 /* ITEM_NOT_CATALOGED */ && check.copy.status() != 11) {
2343                 var copy_status = (data.hash.ccs[ check.copy.status() ] ? data.hash.ccs[ check.copy.status() ].name() : check.copy.status().name() );
2344                 var err_msg = document.getElementById('commonStrings').getString('common.error');
2345                 err_msg += '\nFIXME --';
2346                 err_msg += document.getElementById('circStrings').getFormattedString('staff.circ.utils.item_not_cataloged', [copy_status]);
2347                 err_msg += '\n';
2348                 msg += err_msg;
2349                 print_data.error_msg += err_msg;
2350             }
2351             switch(Number(check.copy.status())) {
2352                 case 0: /* AVAILABLE */
2353                 case 7: /* RESHELVING */
2354                     if (msg) {
2355                         print_data.route_to_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.route_to.msg', [check.route_to]);
2356                         print_data.route_to = check.route_to;
2357                         msg += print_data.route_to_msg;
2358                         msg += '\n';
2359                     }
2360                 break;
2361                 case 8: /* ON HOLDS SHELF */
2362                     check.route_to = document.getElementById('circStrings').getString('staff.circ.route_to.hold_shelf');
2363                     if (check.payload.hold) {
2364                         if (check.payload.hold.pickup_lib() != data.list.au[0].ws_ou()) {
2365                             var err_msg = document.getElementById('commonStrings').getString('common.error');
2366                             err_msg += '\nFIXME: ';
2367                             err_msg += document.getElementById('circStrings').getString('staff.circ.utils.route_item_error');
2368                             err_msg += '\n';
2369                             msg += err_msg;
2370                             print_data.error_msg += err_msg;
2371                         } else {
2372                             print_data.route_to_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.route_to.msg', [check.route_to]);
2373                             print_data.route_to = check.route_to;
2374                             var behind_the_desk_support = String( data.hash.aous['circ.holds.behind_desk_pickup_supported'] ) == 'true';
2375                             if (behind_the_desk_support) {
2376                                var usr_settings = network.simple_request('FM_AUS_RETRIEVE',[ses(),check.payload.hold.usr()]); 
2377                                 if (typeof usr_settings['circ.holds_behind_desk'] != 'undefined') {
2378                                     print_data.prefer_behind_holds_desk = true;
2379                                     check.route_to = document.getElementById('circStrings').getString('staff.circ.route_to.private_hold_shelf');
2380                                     print_data.route_to_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.route_to.msg', [check.route_to]);
2381                                     print_data.route_to = check.route_to;
2382                                 } else {
2383                                     check.route_to = document.getElementById('circStrings').getString('staff.circ.route_to.public_hold_shelf');
2384                                     print_data.route_to_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.route_to.msg', [check.route_to]);
2385                                     print_data.route_to = check.route_to;
2386                                 }
2387                             }
2388                             msg += print_data.route_to_msg;
2389                             msg += '\n';
2390                         }
2391                     } else {
2392                         var err_msg = document.getElementById('commonStrings').getString('common.error');
2393                         err_msg += '\nFIXME: ';
2394                         err_msg += document.getElementById('circStrings').getString('staff.circ.utils.route_item_status_error');
2395                         err_msg += '\n';
2396                         msg += err_msg;
2397                         print_data.error_msg += err_msg;
2398                     }
2399                     JSAN.use('util.date');
2400                     if (check.payload.hold) {
2401                         JSAN.use('patron.util');
2402                         msg += '\n';
2403                         print_data.item_barcode_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.barcode', [check.payload.copy.barcode()]);
2404                         print_data.item_barcode = check.payload.copy.barcode();
2405                         msg += print_data.item_barcode_msg;
2406                         msg += '\n';
2407                         var payload_title  = (check.payload.record ? check.payload.record.title() : check.payload.copy.dummy_title() );
2408                         print_data.item_title_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.title', [payload_title]);
2409                         print_data.item_title = payload_title;
2410                         msg += print_data.item_title_msg;
2411                         msg += '\n';
2412                         var au_obj = patron.util.retrieve_fleshed_au_via_id( session, check.payload.hold.usr() );
2413                         print_data.user = au_obj;
2414                         msg += '\n';
2415                         if (au_obj.alias()) {
2416                             print_data.hold_for_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.patron_alias',  [au_obj.alias()]);
2417                             print_data.hold_for_alias = au_obj.alias();
2418                             msg += print_data.hold_for_msg;
2419                         } else {
2420                             print_data.hold_for_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.patron',  [au_obj.family_name() ? au_obj.family_name() : '', au_obj.first_given_name() ? au_obj.first_given_name() : '', au_obj.second_given_name() ? au_obj.second_given_name() : '']);
2421                             msg += print_data.hold_for_msg;
2422                             print_data.hold_for_family_name = au_obj.family_name() ? au_obj.family_name() : '';
2423                             print_data.hold_for_first_given_name = au_obj.first_given_name() ? au_obj.first_given_name() : '';
2424                             print_data.hold_for_second_given_name = au_obj.second_given_name() ? au_obj.second_given_name() : '';
2425                         }
2426                         msg += '\n';
2427                         print_data.user_barcode_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.barcode', [au_obj.card().barcode()]);
2428                         print_data.user_barcode = au_obj.card().barcode();
2429                         msg += print_data.user_barcode_msg;
2430                         msg += '\n';
2431                         if (check.payload.hold.phone_notify()) {
2432                             print_data.notify_by_phone_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.phone_notify', [check.payload.hold.phone_notify()]);
2433                             print_data.notify_by_phone = check.payload.hold.phone_notify();
2434                             msg += print_data.notify_by_phone_msg;
2435                             msg += '\n';
2436                         }
2437                         if (get_bool(check.payload.hold.email_notify())) {
2438                             var payload_email = au_obj.email() ? au_obj.email() : '';
2439                             print_data.notify_by_email_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.email_notify', [payload_email]);
2440                             print_data.notify_by_email = payload_email;
2441                             msg += print_data.notify_by_email_msg;
2442                             msg += '\n';
2443                         }
2444                         msg += '\n';
2445                         var notes = check.payload.hold.notes();
2446                         print_data.notes_raw = notes;
2447                         for (var i = 0; i < notes.length; i++) {
2448                             if ( get_bool( notes[i].slip() ) ) {
2449                                 var temp_msg;
2450                                 if ( get_bool( notes[i].staff() ) ) {
2451                                     temp_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.notes.staff_note', [ notes[i].title(), notes[i].body() ]);
2452                                 } else {
2453                                     temp_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.notes.patron_note', [ notes[i].title(), notes[i].body() ]);
2454                                 }
2455                                 msg += temp_msg + '\n';
2456                                 print_list.push(
2457                                     {
2458                                         'formatted_note' : temp_msg,
2459                                         'note_title' : notes[i].title(),
2460                                         'note_body' : notes[i].body(),
2461                                         'note_public' : notes[i].pub(),
2462                                         'note_by_staff' : notes[i].staff()
2463                                     }
2464                                 );
2465                             }
2466                         }
2467                         msg += '\n';
2468                         msg += '\n';
2469                         print_data.request_date = util.date.formatted_date(check.payload.hold.request_time(),'%F');
2470                         print_data.request_date_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.request_date', [print_data.request_date]);
2471                         msg += print_data.request_date_msg;
2472                         msg += '\n';
2473                     }
2474                     var rv = 0;
2475                     var no_print_prompting = data.hash.aous['circ.staff_client.do_not_auto_attempt_print'];
2476                     if (no_print_prompting) {
2477                         if (no_print_prompting.indexOf( "Hold Slip" ) > -1) {
2478                             rv = -1; auto_print = true; // DO NOT PRINT and skip dialog
2479                         }
2480                     }
2481                     print_data.slip_date = util.date.formatted_date(new Date(),'%F');
2482                     print_data.slip_date_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.slip_date', [print_data.slip_date]);
2483                     msg += print_data.slip_date_msg;
2484                     msg += '\n';
2485                     print_data.payload = check.payload;
2486
2487                     if (!auto_print) {
2488                         rv = error.yns_alert_formatted(
2489                             msg,
2490                             document.getElementById('circStrings').getString('staff.circ.utils.hold_slip'),
2491                             document.getElementById('circStrings').getString('staff.circ.utils.hold_slip.print.yes'),
2492                             document.getElementById('circStrings').getString('staff.circ.utils.hold_slip.print.no'),
2493                             null,
2494                             document.getElementById('circStrings').getString('staff.circ.confirm.msg'),
2495                             '/xul/server/skin/media/images/turtle.gif'
2496                         );
2497                     }
2498                     if (rv == 0) {
2499                         try {
2500                             JSAN.use('util.print'); var print = new util.print();
2501                             var old_template = String( data.hash.aous['ui.circ.old_harcoded_slip_template'] ) == 'true';
2502                             if (old_template) {
2503                                 msg = msg.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\n/g,'<br/>');
2504                                 print.simple( msg , { 'no_prompt' : true, 'content_type' : 'text/html' } );
2505                             } else {
2506                                 var template = 'hold_slip';
2507                                 var params = {
2508                                     'patron' : print_data.user,
2509                                     'lib' : data.hash.aou[ check.payload.hold.pickup_lib() ],
2510                                     'staff' : data.list.au[0],
2511                                     'header' : data.print_list_templates[ template ].header,
2512                                     'line_item' : data.print_list_templates[ template ].line_item,
2513                                     'footer' : data.print_list_templates[ template ].footer,
2514                                     'type' : data.print_list_templates[ template ].type,
2515                                     'list' : print_list,
2516                                     'data' : print_data
2517                                 };
2518                                 print.tree_list( params );
2519                             }
2520                         } catch(E) {
2521                             var err_msg = document.getElementById('commonStrings').getString('common.error');
2522                             err_msg += '\nFIXME: ' + E + '\n';
2523                             dump(err_msg);
2524                             alert(err_msg);
2525                         }
2526                     }
2527                     msg = '';
2528                     if (document.getElementById('no_change_label')) {
2529                         var m = document.getElementById('no_change_label').getAttribute('value');
2530                         m += document.getElementById('circStrings').getFormattedString('staff.circ.utils.capture', [params.barcode]);
2531                         document.getElementById('no_change_label').setAttribute('value', m);
2532                         document.getElementById('no_change_label').setAttribute('hidden','false');
2533                     }
2534                 break;
2535                 case 6: /* IN TRANSIT */
2536                     check.route_to = 'TRANSIT SHELF??';
2537                     print_data.route_to;
2538                     var err_msg = document.getElementById('commonStrings').getString('common.error');
2539                     err_msg += "\nFIXME -- I didn't think we could get here.\n";
2540                     print_data.error_msg += err_msg;
2541                     msg += err_msg;
2542                 break;
2543                 case 11: /* CATALOGING */
2544                     check.route_to = 'CATALOGING';
2545                     print_data.route_to;
2546                     if (document.getElementById('do_not_alert_on_precat')) {
2547                         var x = document.getElementById('do_not_alert_on_precat');
2548                         if (x.getAttribute('checked') != 'true') {
2549                             print_data.route_to_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.route_to.msg', [check.route_to]);
2550                             msg += print_data.route_to_msg;
2551                         }
2552                     } else {
2553                         print_data.route_to_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.route_to.msg', [check.route_to]);
2554                         msg += print_data.route_to_msg;
2555                     }
2556                     if (document.getElementById('no_change_label')) {
2557                         var m = document.getElementById('no_change_label').getAttribute('value');
2558                         var needs_cat = document.getElementById('circStrings').getFormattedString('staff.circ.utils.needs_cataloging', [params.barcode]);
2559                         document.getElementById('no_change_label').setAttribute('value', m + needs_cat + '  ');
2560                         document.getElementById('no_change_label').setAttribute('hidden','false');
2561                     }
2562                 break;
2563                 default:
2564                     msg += document.getElementById('commonStrings').getString('common.error');
2565                     var copy_status = data.hash.ccs[check.copy.status()] ? data.hash.ccs[check.copy.status()].name() : check.copy.status().name();
2566                     msg += '\n';
2567                     var error_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.copy_status.error', [copy_status]);
2568                     print_data.error_msg += error_msg;
2569                     msg += error_msg;
2570                     msg += '\n';
2571                     print_data.route_to_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.route_to.msg', [check.route_to]);
2572                     msg += print_data.route_to_msg;
2573                 break;
2574             }
2575             if (msg) {
2576                 error.yns_alert(
2577                     msg,
2578                     document.getElementById('circStrings').getString('staff.circ.alert'),
2579                     null,
2580                     document.getElementById('circStrings').getString('staff.circ.utils.msg.ok'),
2581                     null,
2582                     document.getElementById('circStrings').getString('staff.circ.confirm.msg')
2583                 );
2584             }
2585         } else /* ROUTE_ITEM */ if (check.ilsevent == 7000) {
2586
2587             var lib = data.hash.aou[ check.org ];
2588             check.route_to = lib.shortname();
2589             print_data.route_to = check.route_to;
2590             print_data.route_to_org = lib;
2591             print_data.route_to_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.route_to.destination', [check.route_to]);
2592             print_data.route_to_org_fullname = lib.name();
2593             msg += print_data.route_to_msg;
2594             msg += '\n\n';
2595             msg += lib.name();
2596             msg += '\n';
2597             try {
2598                 if (lib.holds_address() ) {
2599                     var a = network.simple_request('FM_AOA_RETRIEVE',[ lib.holds_address() ]);
2600                     if (typeof a.ilsevent != 'undefined') throw(a);
2601                     if (a.street1()) { msg += a.street1() + '\n'; print_data.street1 = a.street1(); }
2602                     if (a.street2()) { msg += a.street2() + '\n'; print_data.street2 = a.street2(); }
2603                     print_data.city_state_zip = (a.city() ? a.city() + ', ' : '') + (a.state() ? a.state() + ' ' : '') + (a.post_code() ? a.post_code() : '');
2604                     print_data.city = a.city();
2605                     print_data.state = a.state();
2606                     print_data.county = a.county();
2607                     print_data.country = a.country();
2608                     print_data.post_code = a.post_code();
2609                     msg += print_data.city_state_zip + '\n';
2610                 } else {
2611                     print_data.street1 = document.getElementById('circStrings').getString('staff.circ.utils.route_to.no_address');
2612                     print_data.no_address = true;
2613                     msg += print_data.street1;
2614                     msg += '\n';
2615                 }
2616             } catch(E) {
2617                 var err_msg = document.getElementById('circStrings').getString('staff.circ.utils.route_to.no_address.error');
2618                 print_data.error_msg += err_msg + '\n';
2619                 msg += err_msg + '\n';
2620                 error.standard_unexpected_error_alert(document.getElementById('circStrings').getString('staff.circ.utils.route_to.no_address.error'), E);
2621             }
2622             msg += '\n';
2623             print_data.item_barcode_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.barcode', [check.payload.copy.barcode()]);
2624             print_data.item_barcode = check.payload.copy.barcode();
2625             msg += print_data.item_barcode_msg;
2626             msg += '\n';
2627             var payload_title  = (check.payload.record ? check.payload.record.title() : check.payload.copy.dummy_title() );
2628             print_data.item_title_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.title', [payload_title]);
2629             print_data.item_title = payload_title;
2630             msg += print_data.item_title_msg;
2631             msg += '\n';
2632             var payload_author = (check.payload.record ? check.payload.record.author() :check.payload.copy.dummy_author());
2633             print_data.item_author_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.author', [payload_author]);
2634             print_data.item_author = payload_author;
2635             msg += print_data.item_author_msg;
2636             msg += '\n';
2637             JSAN.use('util.date');
2638             if (check.payload.hold) {
2639                 JSAN.use('patron.util');
2640                 var au_obj = patron.util.retrieve_fleshed_au_via_id( session, check.payload.hold.usr() );
2641                 print_data.user = au_obj;
2642                 msg += '\n';
2643                 if (au_obj.alias()) {
2644                     print_data.hold_for_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.patron_alias',  [au_obj.alias()]);
2645                     print_data.hold_for_alias = au_obj.alias();
2646                     msg += print_data.hold_for_msg;
2647                 } else {
2648                     print_data.hold_for_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.patron',  [au_obj.family_name() ? au_obj.family_name() : '', au_obj.first_given_name() ? au_obj.first_given_name() : '', au_obj.second_given_name() ? au_obj.second_given_name() : '']);
2649                     msg += print_data.hold_for_msg;
2650                     print_data.hold_for_family_name = au_obj.family_name() ? au_obj.family_name() : '';
2651                     print_data.hold_for_first_given_name = au_obj.first_given_name() ? au_obj.first_given_name() : '';
2652                     print_data.hold_for_second_given_name = au_obj.second_given_name() ? au_obj.second_given_name() : '';
2653                 }
2654                 msg += '\n';
2655                 print_data.user_barcode_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.barcode', [au_obj.card().barcode()]);
2656                 print_data.user_barcode = au_obj.card().barcode();
2657                 msg += print_data.user_barcode_msg;
2658                 msg += '\n';
2659                 if (check.payload.hold.phone_notify()) {
2660                     print_data.notify_by_phone_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.phone_notify', [check.payload.hold.phone_notify()]);
2661                     print_data.notify_by_phone = check.payload.hold.phone_notify();
2662                     msg += print_data.notify_by_phone_msg;
2663                     msg += '\n';
2664                 }
2665                 if (get_bool(check.payload.hold.email_notify())) {
2666                     var payload_email = au_obj.email() ? au_obj.email() : '';
2667                     print_data.notify_by_email_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.email_notify', [payload_email]);
2668                     print_data.notify_by_email = payload_email;
2669                     msg += print_data.notify_by_email_msg;
2670                     msg += '\n';
2671                 }
2672                 msg += '\n';
2673                 var notes = check.payload.hold.notes();
2674                 print_data.notes_raw = notes;
2675                 for (var i = 0; i < notes.length; i++) {
2676                     if ( get_bool( notes[i].slip() ) ) {
2677                         var temp_msg;
2678                         if ( get_bool( notes[i].staff() ) ) {
2679                             temp_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.notes.staff_note', [ notes[i].title(), notes[i].body() ]);
2680                         } else {
2681                             temp_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.notes.patron_note', [ notes[i].title(), notes[i].body() ]);
2682                         }
2683                         msg += temp_msg + '\n';
2684                         print_list.push(
2685                             {
2686                                 'formatted_note' : temp_msg,
2687                                 'note_title' : notes[i].title(),
2688                                 'note_body' : notes[i].body(),
2689                                 'note_public' : notes[i].pub(),
2690                                 'note_by_staff' : notes[i].staff()
2691                             }
2692                         );
2693                     }
2694                 }
2695                 msg += '\n';
2696                 msg += '\n';
2697                 print_data.request_date = util.date.formatted_date(check.payload.hold.request_time(),'%F');
2698                 print_data.request_date_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.request_date', [print_data.request_date]);
2699                 msg += print_data.request_date_msg;
2700                 msg += '\n';
2701             }
2702             var rv = 0;
2703             var no_print_prompting = data.hash.aous['circ.staff_client.do_not_auto_attempt_print'];
2704             if (no_print_prompting) {
2705                 if (no_print_prompting.indexOf( check.payload.hold ? "Hold/Transit Slip" : "Transit Slip" ) > -1) {
2706                     rv = -1; auto_print = true; // DO NOT PRINT and skip dialog
2707                 }
2708             }
2709             print_data.slip_date = util.date.formatted_date(new Date(),'%F');
2710             print_data.slip_date_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.hold.slip_date', [print_data.slip_date]);
2711             msg += print_data.slip_date_msg;
2712             print_data.payload = check.payload;
2713
2714             if (!auto_print) {
2715                 rv = error.yns_alert_formatted(
2716                     msg,
2717                     document.getElementById('circStrings').getString('staff.circ.utils.transit_slip'),
2718                     document.getElementById('circStrings').getString('staff.circ.utils.transit_slip.print.yes'),
2719                     document.getElementById('circStrings').getString('staff.circ.utils.transit_slip.print.no'),
2720                     null,
2721                     document.getElementById('circStrings').getString('staff.circ.confirm.msg'),
2722                     '/xul/server/skin/media/images/turtle.gif'
2723                 );
2724             }
2725             if (rv == 0) {
2726                 try {
2727                     JSAN.use('util.print'); var print = new util.print();
2728                     var old_template = String( data.hash.aous['ui.circ.old_harcoded_slip_template'] ) == 'true';
2729                     if (old_template) {
2730                         msg = msg.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\n/g,'<br/>');
2731                         print.simple( msg , { 'no_prompt' : true, 'content_type' : 'text/html' } );
2732                     } else {
2733                         var template = check.payload.hold ? 'hold_transit_slip' : 'transit_slip';
2734                         var params = {
2735                             'patron' : print_data.user,
2736                             'lib' : data.hash.aou[ check.payload.hold ? check.payload.hold.pickup_lib() : check.payload.transit.source() ],
2737                             'staff' : data.list.au[0],
2738                             'header' : data.print_list_templates[ template ].header,
2739                             'line_item' : data.print_list_templates[ template ].line_item,
2740                             'footer' : data.print_list_templates[ template ].footer,
2741                             'type' : data.print_list_templates[ template ].type,
2742                             'list' : print_list,
2743                             'data' : print_data 
2744                         };
2745                         print.tree_list( params );
2746                     }
2747                 } catch(E) {
2748                     var err_msg = document.getElementById('commonStrings').getString('common.error');
2749                     err_msg += '\nFIXME: ' + E + '\n';
2750                     dump(err_msg);
2751                     alert(err_msg);
2752                 }
2753             }
2754             if (document.getElementById('no_change_label')) {
2755                 var m = document.getElementById('no_change_label').getAttribute('value');
2756                 var trans_msg = document.getElementById('circStrings').getFormattedString('staff.circ.utils.payload.in_transit', [params.barcode]);
2757                 document.getElementById('no_change_label').setAttribute('value', m + trans_msg + '  ');
2758                 document.getElementById('no_change_label').setAttribute('hidden','false');
2759             }
2760
2761         } else /* ASSET_COPY_NOT_FOUND */ if (check.ilsevent == 1502) {
2762
2763             check.route_to = 'CATALOGING';
2764             var mis_scan_msg = document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.status.copy_not_found', [params.barcode]);
2765             error.yns_alert(
2766                 mis_scan_msg,
2767                 document.getElementById('circStrings').getString('staff.circ.alert'),
2768                 null,
2769                 document.getElementById('circStrings').getString('staff.circ.utils.msg.ok'),
2770                 null,
2771                 document.getElementById('circStrings').getString('staff.circ.confirm.msg')
2772             );
2773             if (document.getElementById('no_change_label')) {
2774                 var m = document.getElementById('no_change_label').getAttribute('value');
2775                 document.getElementById('no_change_label').setAttribute('value',m + mis_scan_msg + '  ');
2776                 document.getElementById('no_change_label').setAttribute('hidden','false');
2777             }
2778
2779         } else /* HOLD_CAPTURE_DELAYED */ if (check.ilsevent == 7019) {
2780
2781             var rv = 0;
2782             msg += document.getElementById('circStrings').getString('staff.circ.utils.hold_capture_delayed.description');
2783             rv = error.yns_alert_formatted(
2784                 msg,
2785                 document.getElementById('circStrings').getString('staff.circ.utils.hold_capture_delayed.titlebar'),
2786                 document.getElementById('circStrings').getString('staff.circ.utils.hold_capture_delayed.prompt_for_nocapture'),
2787                 document.getElementById('circStrings').getString('staff.circ.utils.hold_capture_delayed.prompt_for_capture'),
2788                 null,
2789                 document.getElementById('circStrings').getString('staff.circ.confirm.msg'),
2790                 '/xul/server/skin/media/images/stop_sign.png'
2791             );
2792             params.capture = rv == 0 ? 'nocapture' : 'capture';
2793
2794             return circ.util.checkin_via_barcode(session,params,backdate,auto_print,false);
2795
2796         } else /* NETWORK TIMEOUT */ if (check.ilsevent == -1) {
2797             error.standard_network_error_alert(document.getElementById('circStrings').getString('staff.circ.checkin.suggest_offline'));
2798         } else {
2799
2800             if (check.ilsevent == null) { return null; /* handled */ }
2801             switch (Number(check.ilsevent)) {
2802                 case 1203 /* COPY_BAD_STATUS */ :
2803                 case 1213 /* PATRON_BARRED */ :
2804                 case 1217 /* PATRON_INACTIVE */ :
2805                 case 1224 /* PATRON_ACCOUNT_EXPIRED */ :
2806                 case 1234 /* ITEM_DEPOSIT_PAID */ :
2807                 case 7009 /* CIRC_CLAIMS_RETURNED */ :
2808                 case 7010 /* COPY_ALERT_MESSAGE */ :
2809                 case 7011 /* COPY_STATUS_LOST */ :
2810                 case 7012 /* COPY_STATUS_MISSING */ :
2811                 case 7013 /* PATRON_EXCEEDS_FINES */ :
2812                     return null; /* handled */
2813                 break;
2814             }
2815
2816             throw(check);
2817
2818         }
2819
2820         return check;
2821     } catch(E) {
2822         JSAN.use('util.error'); var error = new util.error();
2823         error.standard_unexpected_error_alert(document.getElementById('circStrings').getFormattedString('staff.circ.checkin.error', ['3']), E);
2824         return null;
2825     }
2826 };
2827
2828 circ.util.renew_via_barcode = function ( params, async ) {
2829     try {
2830         var obj = {};
2831         JSAN.use('util.network'); obj.network = new util.network();
2832         JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.stash_retrieve();
2833
2834         function renew_callback(req) {
2835             try {
2836                 JSAN.use('util.error'); var error = new util.error();
2837                 var renew = req.getResultObject();
2838                 if (typeof renew.ilsevent != 'undefined') renew = [ renew ];
2839                 for (var j = 0; j < renew.length; j++) {
2840                     switch(renew[j].ilsevent == null ? null : Number(renew[j].ilsevent)) {
2841                         case 0 /* SUCCESS */ : break;
2842                         case null /* custom event */ : break;
2843                         case 5000 /* PERM_FAILURE */: break;
2844                         case 1212 /* PATRON_EXCEEDS_OVERDUE_COUNT */ : break;
2845                         case 1213 /* PATRON_BARRED */ : break;
2846                         case 1215 /* CIRC_EXCEEDS_COPY_RANGE */ : break;
2847                         case 1224 /* PATRON_ACCOUNT_EXPIRED */ : break;
2848                         case 1232 /* ITEM_DEPOSIT_REQUIRED */ : break;
2849                         case 1233 /* ITEM_RENTAL_FEE_REQUIRED */ : break;
2850                         case 1234 /* ITEM_DEPOSIT_PAID */ : break;
2851                         case 1500 /* ACTION_CIRCULATION_NOT_FOUND */ : break;
2852                         case 1502 /* ASSET_COPY_NOT_FOUND */ : 
2853                             var mis_scan_msg = document.getElementById('circStrings').getFormattedString('staff.circ.copy_status.status.copy_not_found', [params.barcode]);
2854                             error.yns_alert(
2855                                 mis_scan_msg,
2856                                 document.getElementById('circStrings').getString('staff.circ.alert'),
2857                                 null,
2858                                 document.getElementById('circStrings').getString('staff.circ.utils.msg.ok'),
2859                                 null,
2860                                 document.getElementById('circStrings').getString('staff.circ.confirm.msg')
2861                             );
2862                             if (document.getElementById('no_change_label')) {
2863                                 var m = document.getElementById('no_change_label').getAttribute('value');
2864                                 document.getElementById('no_change_label').setAttribute('value',m + mis_scan_msg + '  ');
2865                                 document.getElementById('no_change_label').setAttribute('hidden','false');
2866                             }
2867                         break;
2868                         case 7002 /* PATRON_EXCEEDS_CHECKOUT_COUNT */ : break;
2869                         case 7003 /* COPY_CIRC_NOT_ALLOWED */ : break;
2870                         case 7004 /* COPY_NOT_AVAILABLE */ : break;
2871                         case 7006 /* COPY_IS_REFERENCE */ : break;
2872                         case 7007 /* COPY_NEEDED_FOR_HOLD */ : break;
2873                         case 7008 /* MAX_RENEWALS_REACHED */ : break;
2874                         case 7009 /* CIRC_CLAIMS_RETURNED */ : break;
2875                         case 7010 /* COPY_ALERT_MESSAGE */ : break;
2876                         case 7013 /* PATRON_EXCEEDS_FINES */ : break;
2877                         default:
2878                             throw(renew);
2879                         break;
2880                     }
2881                 }
2882                 if (typeof async == 'function') async(renew);
2883                 return renew;
2884             } catch(E) {
2885                 JSAN.use('util.error'); var error = new util.error();
2886                 error.standard_unexpected_error_alert(document.getElementById('circStrings').getFormattedString('staff.circ.checkin.renew_failed.error', [params.barcode]), E);
2887                 return null;
2888             }
2889         }
2890
2891         var renew = obj.network.simple_request(
2892             'CHECKOUT_RENEW',
2893             [ ses(), params ],
2894             async ? renew_callback : null,
2895             {
2896                 'title' : document.getElementById('circStrings').getString('staff.circ.checkin.renew_failed.override'),
2897                 'overridable_events' : [
2898                     null /* custom event */,
2899                     1212 /* PATRON_EXCEEDS_OVERDUE_COUNT */,
2900                     1213 /* PATRON_BARRED */,
2901                     1215 /* CIRC_EXCEEDS_COPY_RANGE */,
2902                     1232 /* ITEM_DEPOSIT_REQUIRED */,
2903                     1233 /* ITEM_RENTAL_FEE_REQUIRED */,
2904                     1234 /* ITEM_DEPOSIT_PAID */,
2905                     7002 /* PATRON_EXCEEDS_CHECKOUT_COUNT */,
2906                     7003 /* COPY_CIRC_NOT_ALLOWED */,
2907                     7004 /* COPY_NOT_AVAILABLE */,
2908                     7006 /* COPY_IS_REFERENCE */,
2909                     7007 /* COPY_NEEDED_FOR_HOLD */,
2910                     7008 /* MAX_RENEWALS_REACHED */,
2911                     7009 /* CIRC_CLAIMS_RETURNED */,
2912                     7010 /* COPY_ALERT_MESSAGE */,
2913                     7013 /* PATRON_EXCEEDS_FINES */,
2914                 ],
2915                 'text' : {
2916                     '1212' : function(r) { return document.getElementById('circStrings').getFormattedString('staff.circ.renew.barcode', [params.barcode]); },
2917                     '1213' : function(r) { return document.getElementById('circStrings').getFormattedString('staff.circ.renew.barcode', [params.barcode]); },
2918                     '1215' : function(r) { return document.getElementById('circStrings').getFormattedString('staff.circ.renew.barcode', [params.barcode]); },
2919                     '1232' : function(r) {
2920                         return document.getElementById('circStrings').getFormattedString('staff.circ.renew.override.item_deposit_required.warning.barcode', [params.barcode]);
2921                     },
2922                     '1233' : function(r) {
2923                         return document.getElementById('circStrings').getFormattedString('staff.circ.renew.override.item_rental_fee_required.warning.barcode', [params.barcode]);
2924                     },
2925                     '1234' : function(r) {
2926                         return document.getElementById('circStrings').getFormattedString('staff.circ.utils.checkin.override.item_deposit_paid.warning');
2927                     },
2928                     '7002' : function(r) { return document.getElementById('circStrings').getFormattedString('staff.circ.renew.barcode', [params.barcode]); },
2929                     '7003' : function(r) { return document.getElementById('circStrings').getFormattedString('staff.circ.renew.barcode', [params.barcode]); },
2930                     '7004' : function(r) {
2931                         return document.getElementById('circStrings').getFormattedString('staff.circ.renew.barcode.status', [params.barcode, typeof r.payload.status() == 'object' ? r.payload.status().name() : obj.data.hash.ccs[ r.payload.status() ].name()]);
2932                     },
2933                     '7006' : function(r) { return document.getElementById('circStrings').getFormattedString('staff.circ.renew.barcode', [params.barcode]); },
2934                     '7007' : function(r) { return document.getElementById('circStrings').getFormattedString('staff.circ.renew.barcode', [params.barcode]); },
2935                     '7008' : function(r) { return document.getElementById('circStrings').getFormattedString('staff.circ.renew.barcode', [params.barcode]); },
2936                     '7009' : function(r) { return document.getElementById('circStrings').getFormattedString('staff.circ.renew.barcode', [params.barcode]); },
2937                     '7010' : function(r) {
2938                         return document.getElementById('circStrings').getFormattedString('staff.circ.renew.barcode.msg', [params.barcode, r.payload]);
2939                     },
2940                     '7013' : function(r) { return document.getElementById('circStrings').getFormattedString('staff.circ.renew.barcode', [params.barcode]); }
2941                 }
2942             }
2943         );
2944         if (! async ) {
2945             return renew_callback( { 'getResultObject' : function() { return renew; } } );
2946         }
2947
2948     } catch(E) {
2949         JSAN.use('util.error'); var error = new util.error();
2950         error.standard_unexpected_error_alert(document.getElementById('circStrings').getFormattedString('staff.circ.checkin.renew_failed.error', [params.barcode]), E);
2951         return null;
2952     }
2953 };
2954
2955 circ.util.batch_hold_update = function ( hold_ids, field_changes, params ) {
2956     try {
2957         JSAN.use('util.sound'); var sound = new util.sound();
2958         var change_list = []; var idx = -1; var bad_holds = [];
2959         dojo.forEach(
2960             hold_ids,
2961             function(el) {
2962                 change_list.push( function(id,fc){ var clone = JSON2js(js2JSON(fc)); clone.id = id; return clone; }(el,field_changes) ); // Is there a better way to do this?
2963             }
2964         );
2965         if (params.progressmeter) { params.progressmeter.value = 0; params.progressmeter.hidden = false; }
2966         fieldmapper.standardRequest(
2967             [ api.FM_AHR_UPDATE_BATCH.app, api.FM_AHR_UPDATE_BATCH.method ],
2968             {   async: true,
2969                 params: [ses(), null, change_list],
2970                 onresponse: function(r) {
2971                     idx++; 
2972                     if (params.progressmeter) { params.progressmeter.value = Number( params.progressmeter.value ) + 100/hold_ids.length; }
2973                     var result = r.recv().content();
2974                     if (result != hold_ids[ idx ]) {
2975                         bad_holds.push( { 'hold_id' : hold_ids[ idx ], 'result' : result } );
2976                     }
2977                 },
2978                 oncomplete: function() {
2979                     if (bad_holds.length > 0) {
2980                         sound.circ_bad();
2981                         alert( $('circStrings').getFormattedString('staff.circ.hold_update.hold_ids.failed',[ bad_holds.length ]) );
2982                     } else {
2983                         sound.circ_good();
2984                     }
2985                     if (typeof params.oncomplete == 'function') {
2986                         params.oncomplete( bad_holds );
2987                     }
2988                     if (params.progressmeter) { params.progressmeter.value = 0; params.progressmeter.hidden = true; }
2989                 }
2990             }
2991         );
2992     } catch(E) {
2993         alert('Error in circ.util.js, circ.util.batch_hold_update(): ' + E);
2994     }
2995 };
2996
2997 dump('exiting circ/util.js\n');