]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/circ/util.js
start refactoring
[Evergreen.git] / Open-ILS / xul / staff_client / server / circ / util.js
1 dump('entering circ/util.js\n');
2
3 if (typeof circ == 'undefined') var circ = {};
4 circ.util = {};
5
6 circ.util.EXPORT_OK     = [ 
7         'offline_checkout_columns', 'offline_checkin_columns', 'offline_renew_columns', 'offline_inhouse_use_columns', 
8         'columns', 'hold_columns', 'checkin_via_barcode', 'std_map_row_to_column', 'hold_capture_via_copy_barcode',
9 ];
10 circ.util.EXPORT_TAGS   = { ':all' : circ.util.EXPORT_OK };
11
12 circ.util.offline_checkout_columns = function(modify,params) {
13         
14         var c = [
15                 { 
16                         'id' : 'timestamp', 
17                         'label' : 'Timestamp', 
18                         'flex' : 1, 'primary' : false, 'hidden' : true, 
19                         'render' : 'my.timestamp' 
20                 },
21                 { 
22                         'id' : 'checkout_time', 
23                         'label' : 'Check Out Time', 
24                         'flex' : 1, 'primary' : false, 'hidden' : true, 
25                         'render' : 'my.checkout_time' 
26                 },
27                 { 
28                         'id' : 'type', 
29                         'label' : 'Transaction Type', 
30                         'flex' : 1, 'primary' : false, 'hidden' : true, 
31                         'render' : 'my.type' 
32                 },
33                 {
34                         'id' : 'noncat',
35                         'label' : 'Non-Cataloged?',
36                         'flex' : 1, 'primary' : false, 'hidden' : true, 
37                         'render' : 'my.noncat'
38                 },
39                 {
40                         'id' : 'noncat_type',
41                         'label' : 'Non-Cat Type ID',
42                         'flex' : 1, 'primary' : false, 'hidden' : true,
43                         'render' : 'my.noncat_type'
44                 },
45                 {
46                         'id' : 'noncat_count',
47                         'label' : 'Count',
48                         'flex' : 1, 'primary' : false, 'hidden' : false,
49                         'render' : 'my.noncat_count'
50                 },
51                 { 
52                         'id' : 'patron_barcode', 
53                         'label' : 'Patron Barcode', 
54                         'flex' : 1, 'primary' : false, 'hidden' : true, 
55                         'render' : 'my.patron_barcode' 
56                 },
57                 { 
58                         'id' : 'barcode', 
59                         'label' : 'Item Barcode', 
60                         'flex' : 2, 'primary' : true, 'hidden' : false, 
61                         'render' : 'my.barcode' 
62                 },
63                 { 
64                         'id' : 'due_date', 
65                         'label' : 'Due Date', 
66                         'flex' : 1, 'primary' : false, 'hidden' : false, 
67                         'render' : 'my.due_date' 
68                 },
69         ];
70         if (modify) for (var i = 0; i < c.length; i++) {
71                 if (modify[ c[i].id ]) {
72                         for (var j in modify[ c[i].id ]) {
73                                 c[i][j] = modify[ c[i].id ][j];
74                         }
75                 }
76         }
77         if (params) {
78                 if (params.just_these) {
79                         JSAN.use('util.functional');
80                         var new_c = [];
81                         for (var i = 0; i < params.just_these.length; i++) {
82                                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
83                                 new_c.push( function(y){ return y; }( x ) );
84                         }
85                         return new_c;
86                 }
87         }
88         return c;
89 }
90
91 circ.util.offline_checkin_columns = function(modify,params) {
92         
93         var c = [
94                 { 
95                         'id' : 'timestamp', 
96                         'label' : 'Timestamp', 
97                         'flex' : 1, 'primary' : false, 'hidden' : true, 
98                         'render' : 'my.timestamp' 
99                 },
100                 { 
101                         'id' : 'backdate', 
102                         'label' : 'Back Date', 
103                         'flex' : 1, 'primary' : false, 'hidden' : true, 
104                         'render' : 'my.backdate' 
105                 },
106                 { 
107                         'id' : 'type', 
108                         'label' : 'Transaction Type', 
109                         'flex' : 1, 'primary' : false, 'hidden' : true, 
110                         'render' : 'my.type' 
111                 },
112                 { 
113                         'id' : 'barcode', 
114                         'label' : 'Item Barcode', 
115                         'flex' : 2, 'primary' : true, 'hidden' : false, 
116                         'render' : 'my.barcode' 
117                 },
118         ];
119         if (modify) for (var i = 0; i < c.length; i++) {
120                 if (modify[ c[i].id ]) {
121                         for (var j in modify[ c[i].id ]) {
122                                 c[i][j] = modify[ c[i].id ][j];
123                         }
124                 }
125         }
126         if (params) {
127                 if (params.just_these) {
128                         JSAN.use('util.functional');
129                         var new_c = [];
130                         for (var i = 0; i < params.just_these.length; i++) {
131                                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
132                                 new_c.push( function(y){ return y; }( x ) );
133                         }
134                         return new_c;
135                 }
136         }
137         return c;
138 }
139
140 circ.util.offline_renew_columns = function(modify,params) {
141         
142         var c = [
143                 { 
144                         'id' : 'timestamp', 
145                         'label' : 'Timestamp', 
146                         'flex' : 1, 'primary' : false, 'hidden' : true, 
147                         'render' : 'my.timestamp' 
148                 },
149                 { 
150                         'id' : 'checkout_time', 
151                         'label' : 'Check Out Time', 
152                         'flex' : 1, 'primary' : false, 'hidden' : true, 
153                         'render' : 'my.checkout_time' 
154                 },
155                 { 
156                         'id' : 'type', 
157                         'label' : 'Transaction Type', 
158                         'flex' : 1, 'primary' : false, 'hidden' : true, 
159                         'render' : 'my.type' 
160                 },
161                 { 
162                         'id' : 'patron_barcode', 
163                         'label' : 'Patron Barcode', 
164                         'flex' : 1, 'primary' : false, 'hidden' : true, 
165                         'render' : 'my.patron_barcode' 
166                 },
167                 { 
168                         'id' : 'barcode', 
169                         'label' : 'Item Barcode', 
170                         'flex' : 2, 'primary' : true, 'hidden' : false, 
171                         'render' : 'my.barcode' 
172                 },
173                 { 
174                         'id' : 'due_date', 
175                         'label' : 'Due Date', 
176                         'flex' : 1, 'primary' : false, 'hidden' : false, 
177                         'render' : 'my.due_date' 
178                 },
179         ];
180         if (modify) for (var i = 0; i < c.length; i++) {
181                 if (modify[ c[i].id ]) {
182                         for (var j in modify[ c[i].id ]) {
183                                 c[i][j] = modify[ c[i].id ][j];
184                         }
185                 }
186         }
187         if (params) {
188                 if (params.just_these) {
189                         JSAN.use('util.functional');
190                         var new_c = [];
191                         for (var i = 0; i < params.just_these.length; i++) {
192                                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
193                                 new_c.push( function(y){ return y; }( x ) );
194                         }
195                         return new_c;
196                 }
197         }
198         return c;
199 }
200
201 circ.util.offline_inhouse_use_columns = function(modify,params) {
202         
203         var c = [
204                 { 
205                         'id' : 'timestamp', 
206                         'label' : 'Timestamp', 
207                         'flex' : 1, 'primary' : false, 'hidden' : true, 
208                         'render' : 'my.timestamp' 
209                 },
210                 { 
211                         'id' : 'use_time', 
212                         'label' : 'Use Time', 
213                         'flex' : 1, 'primary' : false, 'hidden' : true, 
214                         'render' : 'my.use_time' 
215                 },
216                 { 
217                         'id' : 'type', 
218                         'label' : 'Transaction Type', 
219                         'flex' : 1, 'primary' : false, 'hidden' : true, 
220                         'render' : 'my.type' 
221                 },
222                 {
223                         'id' : 'count',
224                         'label' : 'Count',
225                         'flex' : 1, 'primary' : false, 'hidden' : false,
226                         'render' : 'my.count'
227                 },
228                 { 
229                         'id' : 'barcode', 
230                         'label' : 'Item Barcode', 
231                         'flex' : 2, 'primary' : true, 'hidden' : false, 
232                         'render' : 'my.barcode' 
233                 },
234         ];
235         if (modify) for (var i = 0; i < c.length; i++) {
236                 if (modify[ c[i].id ]) {
237                         for (var j in modify[ c[i].id ]) {
238                                 c[i][j] = modify[ c[i].id ][j];
239                         }
240                 }
241         }
242         if (params) {
243                 if (params.just_these) {
244                         JSAN.use('util.functional');
245                         var new_c = [];
246                         for (var i = 0; i < params.just_these.length; i++) {
247                                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
248                                 new_c.push( function(y){ return y; }( x ) );
249                         }
250                         return new_c;
251                 }
252         }
253         return c;
254 }
255
256
257
258 circ.util.columns = function(modify,params) {
259         
260         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
261
262         function getString(s) { return data.entities[s]; }
263
264         var c = [
265                 {
266                         'id' : 'acp_id', 'label' : getString('staff.acp_label_id'), 'flex' : 1,
267                         'primary' : false, 'hidden' : true, 'render' : 'my.acp.id()', 'persist' : 'hidden width',
268                 },
269                 {
270                         'id' : 'circ_id', 'label' : getString('staff.circ_label_id'), 'flex' : 1,
271                         'primary' : false, 'hidden' : true, 'render' : 'my.circ.id()', 'persist' : 'hidden width',
272                 },
273                 {
274                         'id' : 'mvr_doc_id', 'label' : getString('staff.mvr_label_doc_id'), 'flex' : 1,
275                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr.doc_id()', 'persist' : 'hidden width',
276                 },
277                 {
278                         'id' : 'barcode', 'label' : getString('staff.acp_label_barcode'), 'flex' : 1,
279                         'primary' : false, 'hidden' : true, 'render' : 'my.acp.barcode()', 'persist' : 'hidden width',
280                 },
281                 {
282                         'id' : 'call_number', 'label' : getString('staff.acp_label_call_number'), 'flex' : 1,
283                         'primary' : false, 'hidden' : true, 'render' : ' if (my.acp && my.acp.call_number() == -1) { "Not Cataloged"; } else { if (!my.acn) { var x = obj.network.simple_request("FM_ACN_RETRIEVE",[ my.acp.call_number() ]); if (x.ilsevent) { "Not Cataloged"; } else { my.acn = x; x.label(); } } else { my.acn.label(); } } ' , 'persist' : 'hidden width',
284                 },
285                 {
286                         'id' : 'owning_lib', 'label' : 'Owning Lib', 'flex' : 1,
287                         'primary' : false, 'hidden' : true,
288                         'render' : 'if (Number(my.acn.owning_lib())>=0) obj.data.hash.aou[ my.acn.owning_lib() ].shortname(); else my.acn.owning_lib().shortname();', 'persist' : 'hidden width',
289                 },
290                 {
291                         'id' : 'copy_number', 'label' : getString('staff.acp_label_copy_number'), 'flex' : 1,
292                         'primary' : false, 'hidden' : true, 'render' : 'my.acp.copy_number()', 'persist' : 'hidden width',
293                 },
294                 {
295                         'id' : 'location', 'label' : getString('staff.acp_label_location'), 'flex' : 1,
296                         'primary' : false, 'hidden' : true, 'render' : 'if (Number(my.acp.location())>=0) obj.data.hash.acpl[ my.acp.location() ].name(); else my.acp.location().name();', 'persist' : 'hidden width',
297                 },
298                 {
299                         'id' : 'loan_duration', 'label' : getString('staff.acp_label_loan_duration'), 'flex' : 1,
300                         'primary' : false, 'hidden' : true, 
301                         'render' : 'switch(my.acp.loan_duration()){ case 1: "Short"; break; case 2: "Normal"; break; case 3: "Long"; break; }', 'persist' : 'hidden width',
302                 },
303                 {
304                         'id' : 'circ_lib', 'label' : getString('staff.acp_label_circ_lib'), 'flex' : 1,
305                         'primary' : false, 'hidden' : true, 'render' : 'if (Number(my.acp.circ_lib())>=0) obj.data.hash.aou[ my.acp.circ_lib() ].shortname(); else my.acp.circ_lib().shortname();', 'persist' : 'hidden width',
306                 },
307                 {
308                         'id' : 'fine_level', 'label' : getString('staff.acp_label_fine_level'), 'flex' : 1,
309                         'primary' : false, 'hidden' : true,
310                         'render' : 'switch(my.acp.fine_level()){ case 1: "Low"; break; case 2: "Normal"; break; case 3: "High"; break; }', 'persist' : 'hidden width',
311                 },
312                 {
313                         'id' : 'circulate', 'label' : 'Circulate?', 'flex' : 1,
314                         'primary' : false, 'hidden' : true, 'render' : 'my.acp.circulate() == 1 ? "Yes" : "No"', 'persist' : 'hidden width',
315                 },
316                 {
317                         'id' : 'holdable', 'label' : 'Holdable?', 'flex' : 1,
318                         'primary' : false, 'hidden' : true, 'render' : 'my.acp.holdable() == 1 ? "Yes" : "No"', 'persist' : 'hidden width',
319                 },
320                 {
321                         'id' : 'opac_visible', 'label' : 'OPAC Visible?', 'flex' : 1,
322                         'primary' : false, 'hidden' : true, 'render' : 'my.acp.opac_visible() == 1 ? "Yes" : "No"', 'persist' : 'hidden width',
323                 },
324                 {
325                         'persist' : 'hidden width', 'id' : 'ref', 'label' : 'Reference?', 'flex' : 1,
326                         'primary' : false, 'hidden' : true, 'render' : 'my.acp.ref() == 1 ? "Yes" : "No"'
327                 },
328                 {
329                         'persist' : 'hidden width', 'id' : 'deposit', 'label' : 'Deposit?', 'flex' : 1,
330                         'primary' : false, 'hidden' : true, 'render' : 'my.acp.deposit() == 1 ? "Yes" : "No"'
331                 },
332                 {
333                         'persist' : 'hidden width', 'id' : 'deposit_amount', 'label' : getString('staff.acp_label_deposit_amount'), 'flex' : 1,
334                         'primary' : false, 'hidden' : true, 'render' : 'my.acp.deposit_amount()'
335                 },
336                 {
337                         'persist' : 'hidden width', 'id' : 'price', 'label' : getString('staff.acp_label_price'), 'flex' : 1,
338                         'primary' : false, 'hidden' : true, 'render' : 'my.acp.price()'
339                 },
340                 {
341                         'persist' : 'hidden width', 'id' : 'circ_as_type', 'label' : getString('staff.acp_label_circ_as_type'), 'flex' : 1,
342                         'primary' : false, 'hidden' : true, 'render' : 'my.acp.circ_as_type()'
343                 },
344                 {
345                         'persist' : 'hidden width', 'id' : 'circ_modifier', 'label' : getString('staff.acp_label_circ_modifier'), 'flex' : 1,
346                         'primary' : false, 'hidden' : true, 'render' : 'my.acp.circ_modifier()'
347                 },
348                 {
349                         'persist' : 'hidden width', 'id' : 'xact_start', 'label' : getString('staff.circ_label_xact_start'), 'flex' : 1,
350                         'primary' : false, 'hidden' : true, 'render' : 'my.circ.xact_start()'
351                 },
352                 {
353                         'persist' : 'hidden width', 'id' : 'xact_finish', 'label' : getString('staff.circ_label_xact_finish'), 'flex' : 1,
354                         'primary' : false, 'hidden' : true, 'render' : 'my.circ.xact_finish()'
355                 },
356                 {
357                         'persist' : 'hidden width', 'id' : 'due_date', 'label' : getString('staff.circ_label_due_date'), 'flex' : 1,
358                         'primary' : false, 'hidden' : true, 'render' : 'my.circ.due_date().substr(0,10)'
359                 },
360                 {
361                         'persist' : 'hidden width', 'id' : 'title', 'label' : getString('staff.mvr_label_title'), 'flex' : 2,
362                         'primary' : false, 'hidden' : true, 'render' : 'try { my.mvr.title(); } catch(E) { my.acp.dummy_title(); }'
363                 },
364                 {
365                         'persist' : 'hidden width', 'id' : 'author', 'label' : getString('staff.mvr_label_author'), 'flex' : 1,
366                         'primary' : false, 'hidden' : true, 'render' : 'try { my.mvr.author(); } catch(E) { my.acp.dummy_author(); }'
367                 },
368                 {
369                         'persist' : 'hidden width', 'id' : 'edition', 'label' : 'Edition', 'flex' : 1,
370                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr.edition();'
371                 },
372                 {
373                         'persist' : 'hidden width', 'id' : 'isbn', 'label' : 'ISBN', 'flex' : 1,
374                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr.isbn();'
375                 },
376                 {
377                         'persist' : 'hidden width', 'id' : 'pubdate', 'label' : 'PubDate', 'flex' : 1,
378                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr.pubdate();'
379                 },
380                 {
381                         'persist' : 'hidden width', 'id' : 'publisher', 'label' : 'Publisher', 'flex' : 1,
382                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr.publisher();'
383                 },
384                 {
385                         'persist' : 'hidden width', 'id' : 'tcn', 'label' : 'TCN', 'flex' : 1,
386                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr.tcn();'
387                 },
388                 {
389                         'persist' : 'hidden width', 'id' : 'renewal_remaining', 'label' : getString('staff.circ_label_renewal_remaining'), 'flex' : 0,
390                         'primary' : false, 'hidden' : true, 'render' : 'my.circ.renewal_remaining()'
391                 },
392                 {
393                         'persist' : 'hidden width', 'id' : 'stop_fines', 'label' : 'Fines Stopped', 'flex' : 0,
394                         'primary' : false, 'hidden' : true, 'render' : 'my.circ.stop_fines()'
395                 },
396                 {
397                         'persist' : 'hidden width', 'id' : 'status', 'label' : getString('staff.acp_label_status'), 'flex' : 1,
398                         'primary' : false, 'hidden' : true, 'render' : 'if (Number(my.acp.status())>=0) obj.data.hash.ccs[ my.acp.status() ].name(); else my.acp.status().name();'
399                 },
400                 {
401                         'persist' : 'hidden width', 'id' : 'route_to', 'label' : 'Route To', 'flex' : 1,
402                         'primary' : false, 'hidden' : true, 'render' : 'my.route_to.toString()'
403                 },
404                 {
405                         'persist' : 'hidden width', 'id' : 'message', 'label' : 'Message', 'flex' : 1,
406                         'primary' : false, 'hidden' : true, 'render' : 'my.message.toString()'
407                 },
408                 {
409                         'persist' : 'hidden width', 'id' : 'uses', 'label' : '# of Uses', 'flex' : 1,
410                         'primary' : false, 'hidden' : true, 'render' : 'my.uses'
411                 },
412                 {
413                         'persist' : 'hidden width', 'id' : 'alert_message', 'label' : 'Alert Message', 'flex' : 1,
414                         'primary' : false, 'hidden' : true, 'render' : 'my.acp.alert_message()'
415                 },
416         ];
417         for (var i = 0; i < c.length; i++) {
418                 if (modify[ c[i].id ]) {
419                         for (var j in modify[ c[i].id ]) {
420                                 c[i][j] = modify[ c[i].id ][j];
421                         }
422                 }
423         }
424         if (params) {
425                 if (params.just_these) {
426                         JSAN.use('util.functional');
427                         var new_c = [];
428                         for (var i = 0; i < params.just_these.length; i++) {
429                                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
430                                 new_c.push( function(y){ return y; }( x ) );
431                         }
432                         return new_c;
433                 }
434         }
435         return c;
436 }
437
438 circ.util.hold_columns = function(modify,params) {
439         
440         JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
441
442         function getString(s) { return data.entities[s]; }
443
444         var c = [
445                 {
446                         'persist' : 'hidden width', 'id' : 'request_time', 'label' : getString('staff.ahr_request_time_label'), 'flex' : 0,
447                         'primary' : false, 'hidden' : true,  
448                         'render' : 'my.ahr.request_time().toString().substr(0,10)'
449                 },
450                 {
451                         'persist' : 'hidden width', 'id' : 'capture_time', 'label' : getString('staff.ahr_capture_time_label'), 'flex' : 1,
452                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.capture_time()'
453                 },
454                 {
455                         'persist' : 'hidden width', 'id' : 'status', 'label' : getString('staff.ahr_status_label'), 'flex' : 1,
456                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.status()'
457                 },
458                 {
459                         'persist' : 'hidden width', 'id' : 'hold_type', 'label' : getString('staff.ahr_hold_type_label'), 'flex' : 0,
460                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.hold_type()'
461                 },
462                 {
463                         'persist' : 'hidden width', 'id' : 'pickup_lib', 'label' : getString('staff.ahr_pickup_lib_label'), 'flex' : 1,
464                         'primary' : false, 'hidden' : true,  
465                         'render' : 'if (Number(my.ahr.pickup_lib())>=0) obj.data.hash.aou[ my.ahr.pickup_lib() ].name(); else my.ahr.pickup_lib().name();'
466                 },
467                 {
468                         'persist' : 'hidden width', 'id' : 'pickup_lib_shortname', 'label' : getString('staff.ahr_pickup_lib_label'), 'flex' : 0,
469                         'primary' : false, 'hidden' : true,  
470                         'render' : 'if (Number(my.ahr.pickup_lib())>=0) obj.data.hash.aou[ my.ahr.pickup_lib() ].shortname(); else my.ahr.pickup_lib().shortname();'
471                 },
472                 {
473                         'persist' : 'hidden width', 'id' : 'current_copy', 'label' : getString('staff.ahr_current_copy_label'), 'flex' : 1,
474                         'primary' : false, 'hidden' : true,  'render' : 'my.acp ? my.acp.barcode() : "No Copy"'
475                 },
476                 {
477                         'persist' : 'hidden width', 'id' : 'email_notify', 'label' : getString('staff.ahr_email_notify_label'), 'flex' : 1,
478                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.email_notify() == 1 ? "Yes" : "No"'
479                 },
480                 {
481                         'persist' : 'hidden width', 'id' : 'expire_time', 'label' : getString('staff.ahr_expire_time_label'), 'flex' : 1,
482                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.expire_time()'
483                 },
484                 {
485                         'persist' : 'hidden width', 'id' : 'fulfillment_time', 'label' : getString('staff.ahr_fulfillment_time_label'), 'flex' : 1,
486                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.fulfillment_time()'
487                 },
488                 {
489                         'persist' : 'hidden width', 'id' : 'holdable_formats', 'label' : getString('staff.ahr_holdable_formats_label'), 'flex' : 1,
490                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.holdable_formats()'
491                 },
492                 {
493                         'persist' : 'hidden width', 'id' : 'id', 'label' : getString('staff.ahr_id_label'), 'flex' : 1,
494                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.id()'
495                 },
496                 {
497                         'persist' : 'hidden width', 'id' : 'phone_notify', 'label' : getString('staff.ahr_phone_notify_label'), 'flex' : 1,
498                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.phone_notify()'
499                 },
500                 {
501                         'persist' : 'hidden width', 'id' : 'prev_check_time', 'label' : getString('staff.ahr_prev_check_time_label'), 'flex' : 1,
502                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.prev_check_time()'
503                 },
504                 {
505                         'persist' : 'hidden width', 'id' : 'requestor', 'label' : getString('staff.ahr_requestor_label'), 'flex' : 1,
506                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.requestor()'
507                 },
508                 {
509                         'persist' : 'hidden width', 'id' : 'selection_depth', 'label' : getString('staff.ahr_selection_depth_label'), 'flex' : 1,
510                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.selection_depth()'
511                 },
512                 {
513                         'persist' : 'hidden width', 'id' : 'target', 'label' : getString('staff.ahr_target_label'), 'flex' : 1,
514                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.target()'
515                 },
516                 {
517                         'persist' : 'hidden width', 'id' : 'usr', 'label' : getString('staff.ahr_usr_label'), 'flex' : 1,
518                         'primary' : false, 'hidden' : true,  'render' : 'my.ahr.usr()'
519                 },
520                 {
521                         'persist' : 'hidden width', 'id' : 'title', 'label' : getString('staff.mvr_label_title'), 'flex' : 1,
522                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr ? my.mvr.title() : "No Title?"'
523                 },
524                 {
525                         'persist' : 'hidden width', 'id' : 'author', 'label' : getString('staff.mvr_label_author'), 'flex' : 1,
526                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr ? my.mvr.author() : "No Author?"'
527                 },
528                 {
529                         'persist' : 'hidden width', 'id' : 'edition', 'label' : 'Edition', 'flex' : 1,
530                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr.edition();'
531                 },
532                 {
533                         'persist' : 'hidden width', 'id' : 'isbn', 'label' : 'ISBN', 'flex' : 1,
534                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr.isbn();'
535                 },
536                 {
537                         'persist' : 'hidden width', 'id' : 'pubdate', 'label' : 'PubDate', 'flex' : 1,
538                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr.pubdate();'
539                 },
540                 {
541                         'persist' : 'hidden width', 'id' : 'publisher', 'label' : 'Publisher', 'flex' : 1,
542                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr.publisher();'
543                 },
544                 {
545                         'persist' : 'hidden width', 'id' : 'tcn', 'label' : 'TCN', 'flex' : 1,
546                         'primary' : false, 'hidden' : true, 'render' : 'my.mvr.tcn();'
547                 },
548
549
550         ];
551         for (var i = 0; i < c.length; i++) {
552                 if (modify[ c[i].id ]) {
553                         for (var j in modify[ c[i].id ]) {
554                                 c[i][j] = modify[ c[i].id ][j];
555                         }
556                 }
557         }
558         if (params) {
559                 if (params.just_these) {
560                         JSAN.use('util.functional');
561                         var new_c = [];
562                         for (var i = 0; i < params.just_these.length; i++) {
563                                 var x = util.functional.find_list(c,function(d){return(d.id==params.just_these[i]);});
564                                 new_c.push( function(y){ return y; }( x ) );
565                         }
566                         return new_c;
567                 }
568         }
569         return c;
570 }
571
572 circ.util.std_map_row_to_column = function(error_value) {
573         return function(row,col) {
574                 // row contains { 'my' : { 'acp' : {}, 'circ' : {}, 'mvr' : {} } }
575                 // col contains one of the objects listed above in columns
576                 
577                 // mimicking some of the obj in circ.checkin and circ.checkout where map_row_to_column is usually defined
578                 var obj = {}; 
579                 JSAN.use('util.error'); obj.error = new util.error();
580                 JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
581                 JSAN.use('util.network'); obj.network = new util.network();
582
583                 var my = row.my;
584                 var value;
585                 try { 
586                         value = eval( col.render );
587                 } catch(E) {
588                         obj.error.sdump('D_WARN','map_row_to_column: ' + E);
589                         if (error_value) value = error_value; else value = '???';
590                 }
591                 return value;
592         }
593 }
594
595 circ.util.checkin_via_barcode = function(session,barcode,backdate,auto_print) {
596         try {
597                 JSAN.use('util.error'); var error = new util.error();
598                 JSAN.use('util.network'); var network = new util.network();
599                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
600                 JSAN.use('util.date');
601                 if (backdate && (backdate == util.date.formatted_date(new Date(),'%Y-%m-%d')) ) backdate = null;
602
603                 var params = { 'barcode' : barcode };
604                 if (backdate) params.backdate = backdate;
605
606                 var check = network.request(
607                         api.CHECKIN_VIA_BARCODE.app,
608                         api.CHECKIN_VIA_BARCODE.method,
609                         [ session, params ],
610                         null,
611                         {
612                                 'title' : 'Override Checkin Failure?',
613                                 'overridable_events' : [ 
614                                         1203 /* COPY_BAD_STATUS */, 
615                                         7010 /* COPY_ALERT_MESSAGE */, 
616                                         7011 /* COPY_STATUS_LOST */, 
617                                         7012 /* COPY_STATUS_MISSING */, 
618                                 ],
619                                 'text' : {
620                                         '1203' : function(r) {
621                                                 return data.hash.ccs[ r.payload.status() ].name();
622                                         },
623                                         '7010' : function(r) {
624                                                 return r.payload;
625                                         },
626                                 }
627                         }
628                 );
629
630                 check.message = check.textcode;
631
632                 if (check.payload && check.payload.copy) check.copy = check.payload.copy;
633                 if (check.payload && check.payload.record) check.record = check.payload.record;
634                 if (check.payload && check.payload.circ) check.circ = check.payload.circ;
635
636                 if (!check.route_to) check.route_to = '???';
637
638                 /* SUCCESS  /  NO_CHANGE  /  ITEM_NOT_CATALOGED */
639                 if (check.ilsevent == 0 || check.ilsevent == 3 || check.ilsevent == 1202) {
640                         check.route_to = data.hash.acpl[ check.copy.location() ].name();
641                         var msg = '';
642                         if (check.ilsevent == 3) msg = 'This item is already checked in.\n';
643                         if (check.ilsevent == 1202 && check.copy.status() != 11) {
644                                 msg = 'FIXME -- ITEM_NOT_CATALOGED event but copy status is '
645                                         + data.hash.ccs[ check.copy.status() ].name() + '\n';
646                         }
647                         switch(check.copy.status()) {
648                                 case 0: /* AVAILABLE */
649                                 case 7: /* RESHELVING */
650                                         if (msg) msg += 'This item needs to be routed to ' + check.route_to + '.';
651                                 break;
652                                 case 8: /* ON HOLDS SHELF */
653                                         check.route_to = 'HOLDS SHELF';
654                                         if (check.payload.hold) {
655                                                 if (check.payload.hold.pickup_lib() != data.list.au[0].ws_ou()) {
656                                                         msg += 'FIXME:  We should have received a ROUTE_ITEM\n';
657                                                 } else {
658                                                         msg += 'This item needs to be routed to ' + check.route_to + '.\n';
659                                                 }
660                                         } else { 
661                                                 msg += 'FIXME: status of Holds Shelf, but no hold in payload';
662                                         }
663                                         if (check.payload.hold) {
664                                                 JSAN.use('patron.util');
665                                                 msg += '\nBarcode: ' + check.payload.copy.barcode() + '\n';
666                                                 msg += 'Title: ' + (check.payload.record ? check.payload.record.title() : check.payload.copy.dummy_title() ) + '\n';
667                                                 var au_obj = patron.util.retrieve_fleshed_au_via_id( session, check.payload.hold.usr() );
668                                                 msg += '\nHold for patron ' + au_obj.family_name() + ', ' + au_obj.first_given_name() + '\n';
669                                                 msg += 'Barcode: ' + au_obj.card().barcode() + '\n';
670                                                 if (check.payload.hold.phone_notify()) msg += 'Notify by phone: ' + check.payload.hold.phone_notify() + '\n';
671                                                 if (check.payload.hold.email_notify()) msg += 'Notify by email: ' + au_obj.email() + '\n';
672                                         }
673                                         var rv = 0;
674                                         if (!auto_print) rv = error.yns_alert(
675                                                 msg,
676                                                 'Hold Slip',
677                                                 "Print",
678                                                 "Don't Print",
679                                                 null,
680                                                 "Check here to confirm this message"
681                                         );
682                                         if (rv == 0) {
683                                                 try {
684                                                         JSAN.use('util.print'); var print = new util.print();
685                                                         print.simple( msg, { 'no_prompt' : true, 'content_type' : 'text/plain' } );
686                                                 } catch(E) {
687                                                         dump('FIXME: ' + E + '\n');
688                                                         alert('FIXME: ' + E + '\n');
689                                                 }
690                                         }
691                                         msg = '';
692                                 break;
693                                 case 6: /* IN TRANSIT */
694                                         check.route_to = 'TRANSIT SHELF??';
695                                         msg += ("FIXME -- I didn't think we could get here.\n");
696                                 break;
697                                 case 11: /* CATALOGING */
698                                         check.route_to = 'CATALOGING';
699                                         msg += 'This item needs to be routed to ' + check.route_to + '.';
700                                 break;
701                                 default:
702                                         msg += ('FIXME -- this case "' + data.hash.ccs[check.copy.status()].name() + '" is unhandled.\n');
703                                         msg += 'This item needs to be routed to ' + check.route_to + '.';
704                                 break;
705                         }
706                         if (msg) error.yns_alert(msg,'Alert',null,'OK',null,"Check here to confirm this message");
707                 }
708
709                 /* ROUTE_ITEM */
710                 if (check.ilsevent == 7000) {
711                         var lib = data.hash.aou[ check.org ];
712                         check.route_to = lib.shortname();
713                         var msg = 'This item is in transit to ' + check.route_to + '.\n';
714                         msg += '\n' + lib.name() + '\n';
715                         try {
716                                 if (lib.holds_address() ) {
717                                         var a = network.simple_request('FM_AOA_RETRIEVE',[ lib.holds_address() ]);
718                                         if (typeof a.ilsevent != 'undefined') throw(a);
719                                         if (a.street1()) msg += a.street1() + '\n';
720                                         if (a.street2()) msg += a.street2() + '\n';
721                                         msg += (a.city() ? a.city() + ', ' : '') + (a.state() ? a.state() + ' ' : '') + (a.post_code() ? a.post_code() : '') + '\n';
722                                 } else {
723                                         msg += "We do not have a holds address for this library.\n";
724                                 }
725                         } catch(E) {
726                                 msg += 'Unable to retrieve mailing address.\n';
727                                 error.standard_unexpected_error_alert('Unable to retrieve mailing address.',E);
728                         }
729                         msg += '\nBarcode: ' + check.payload.copy.barcode() + '\n';
730                         msg += 'Title: ' + (check.payload.record ? check.payload.record.title() : check.payload.copy.dummy_title() ) + '\n';
731                         msg += 'Author: ' + (check.payload.record ? check.payload.record.author() :check.payload.copy.dummy_author()  ) + '\n';
732                         if (check.payload.hold) {
733                                 JSAN.use('patron.util');
734                                 var au_obj = patron.util.retrieve_fleshed_au_via_id( session, check.payload.hold.usr() );
735                                 msg += '\nHold for patron ' + au_obj.family_name() + ', ' + au_obj.first_given_name() + '\n';
736                                 msg += 'Barcode: ' + au_obj.card().barcode() + '\n';
737                                 if (check.payload.hold.phone_notify()) msg += 'Notify by phone: ' + check.payload.hold.phone_notify() + '\n';
738                                 if (check.payload.hold.email_notify()) msg += 'Notify by email: ' + au_obj.email() + '\n';
739                         }
740                         var rv = 0;
741                         if (!auto_print) rv = error.yns_alert(
742                                 msg,
743                                 'Transit Slip',
744                                 "Print",
745                                 "Don't Print",
746                                 null,
747                                 "Check here to confirm this message"
748                         );
749                         if (rv == 0) {
750                                 try {
751                                         JSAN.use('util.print'); var print = new util.print();
752                                         print.simple( msg, { 'no_prompt' : true, 'content_type' : 'text/plain' } );
753                                 } catch(E) {
754                                         dump('FIXME: ' + E + '\n');
755                                         alert('FIXME: ' + E + '\n');
756                                 }
757                         }
758                 }
759
760                 /* ASSET_COPY_NOT_FOUND */
761                 if (check.ilsevent == 1502) {
762                         check.route_to = 'CATALOGING';
763                         error.yns_alert(
764                                 'The barcode was either mis-scanned or the item needs to be cataloged.',
765                                 'Alert',
766                                 null,
767                                 'OK',
768                                 null,
769                                 "Check here to confirm this message"
770                         );
771                 }
772
773                 /* NETWORK TIMEOUT */
774                 if (check.ilsevent == -1) {
775                         error.standard_network_error_alert('Check In Failed.  If you wish to use the offline interface, in the top menubar select Circulation -> Offline Interface');
776                 }
777
778 //                              case '2': case 2: /* LOST??? */
779 //                                      JSAN.use('patron.util');
780 //                                      var au_obj = patron.util.retrieve_au_via_id( session, check.circ.usr() );
781 //                                      var msg = check.text + '\r\n' + 'Barcode: ' + barcode + '  Title: ' + 
782 //                                                      check.record.title() + '  Author: ' + check.record.author() + '\r\n' +
783 //                                                      'Patron: ' + au_obj.card().barcode() + ' ' + au_obj.family_name() + ', ' +
784 //                                                      au_obj.first_given_name();
785 //                                      var pcheck = error.yns_alert(
786 //                                              msg,
787 //                                              'Lost Item',
788 //                                              'Edit Copy & Patron',
789 //                                              "Just Continue",
790 //                                              null,
791 //                                              "Check here to confirm this message"
792 //                                      ); 
793 //                                      if (pcheck == 0) {
794 //                                              //FIXME//Re-implement
795 //                                              /*
796 //                                              var w = mw.spawn_main();
797 //                                              setTimeout(
798 //                                                      function() {
799 //                                                              mw.spawn_patron_display(w.document,'new_tab','main_tabbox',{'patron':au_obj});
800 //                                                              mw.spawn_batch_copy_editor(w.document,'new_tab','main_tabbox',
801 //                                                                      {'copy_ids':[ check.copy.id() ]});
802 //                                                      }, 0
803 //                                              );
804 //                                              */
805 //                                      }
806 //                              break;
807                 return check;
808         } catch(E) {
809                 JSAN.use('util.error'); var error = new util.error();
810                 error.standard_unexpected_error_alert('Check In Failed (in circ.util.checkin): ',E);
811                 return null;
812         }
813 }
814
815 circ.util.hold_capture_via_copy_barcode = function ( session, barcode, retrieve_flag ) {
816         try {
817                 JSAN.use('util.network'); var network = new util.network();
818                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
819                 var params = { barcode: barcode }
820                 if (retrieve_flag) { params.flesh_record = retrieve_flag; params.flesh_copy = retrieve_flag; }
821                 var robj = network.request(
822                         api.CAPTURE_COPY_FOR_HOLD_VIA_BARCODE.app,
823                         api.CAPTURE_COPY_FOR_HOLD_VIA_BARCODE.method,
824                         [ session, params ]
825                 );
826                 var check = robj.payload;
827                 if (!check) {
828                         check = {};
829                         check.status = robj.ilsevent;
830                         check.copy = new acp(); check.copy.barcode( barcode );
831                 }
832                 check.text = robj.textcode;
833                 check.route_to = robj.route_to;
834                 //check.text = 'Captured for Hold';
835                 if (parseInt(check.route_to)) check.route_to = data.hash.aou[ check.route_to ].shortname();
836                 return check;
837         } catch(E) {
838                 JSAN.use('util.error'); var error = new util.error();
839                 error.standard_unexpected_error_alert('Hold Capture Failed',E);
840                 return null;
841         }
842 }
843
844
845 dump('exiting circ/util.js\n');