]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/circ/offline_checkout.js
Improve Firefox/XULRunner Support
[Evergreen.git] / Open-ILS / xul / staff_client / chrome / content / circ / offline_checkout.js
1 var offlineStrings;
2 var local_lock = false;
3
4 function my_init() {
5     try {
6         offlineStrings = $('offlineStrings');
7
8         if (typeof JSAN == 'undefined') { throw(offlineStrings.getString('common.jsan.missing')); }
9         JSAN.errorLevel = "die"; // none, warn, or die
10         JSAN.addRepository('..');
11         JSAN.use('util.error'); g.error = new util.error();
12         g.error.sdump('D_TRACE','my_init() for offline_checkout.xul');
13
14         JSAN.use('util.widgets'); JSAN.use('util.file');
15
16         if (typeof window.xulG == 'object' && typeof window.xulG.set_tab_name == 'function') {
17             try { window.xulG.set_tab_name(offlineStrings.getString('circ.standalone')); } catch(E) { alert(E); }
18         }
19
20         JSAN.use('OpenILS.data'); g.data = new OpenILS.data(); g.data.init({'via':'stash'});
21
22         JSAN.use('util.list'); g.list = new util.list('checkout_list');
23         JSAN.use('circ.util');
24         g.list.init( {
25             'columns' : circ.util.offline_checkout_columns(),
26             'map_row_to_column' : circ.util.std_map_row_to_column(),
27         } );
28
29         JSAN.use('util.date');
30         var today = new Date();
31         var todayPlus = new Date(); todayPlus.setTime( today.getTime() + 24*60*60*1000*14 );
32         todayPlus = util.date.formatted_date(todayPlus,"%F");
33
34         function handle_lock(ev) {
35             if (!(ev.altKey || ev.ctrlKey || ev.metakey)) {
36                 if (!local_lock) {
37                     local_lock = true;
38                     xulG.lock();
39                 }
40             }
41         }
42
43         $('duedate').setAttribute('value',todayPlus);
44         $('duedate').addEventListener('change',check_date,false);
45
46         $('p_barcode').addEventListener('change',test_patron,false);
47         $('p_barcode').addEventListener('keypress',handle_lock,false);
48
49         $('p_barcode').addEventListener('keypress',handle_keypress,false);
50         $('p_barcode').focus();    
51
52         $('i_barcode').addEventListener('keypress',handle_lock,false);
53         $('i_barcode').addEventListener('keypress',handle_keypress,false);
54         $('enter').addEventListener('command',handle_enter,false);
55
56         $('duedate_menu').addEventListener('command',handle_duedate_menu,false);
57
58         $('submit').addEventListener('command',function(ev){
59             save_xacts(); next_patron();
60         },false);
61         $('cancel').addEventListener('command',function(ev){
62             next_patron('cancel');
63         },false);
64
65         var file; var list_data; var ml;
66
67         file = new util.file('offline_cnct_list'); 
68         if (file._file.exists()) {
69             list_data = file.get_object(); file.close();
70             ml = util.widgets.make_menulist( 
71                 [ [offlineStrings.getString('circ.offline_checkout.nonbarcoded'), ''] ].concat(list_data[0]), 
72                 list_data[1] 
73             );
74             ml.setAttribute('id','noncat_type_menu'); $('x_noncat_type').appendChild(ml);
75             ml.addEventListener(
76                 'command',
77                 function(ev) { 
78                     var count = window.prompt(offlineStrings.getString('circ.offline_checkout.items'),1,ml.getAttribute('label'));
79                     append_to_list('noncat',count);    
80                     ml.value = '';
81                 },
82                 false
83             );
84         } else {
85             alert(offlineStrings.getString('circ.offline_checkout.download.warning'));
86         }
87
88         var file = new util.file('offline_delta'); 
89         if (file._file.exists()) { g.delta = file.get_object()[0]; file.close(); } else { g.delta = 0; }
90
91     } catch(E) {
92         var err_msg = offlineStrings.getFormattedString('common.exception', ["circ/offline_checkout.xul", E]);
93         try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
94         alert(err_msg);
95     }
96 }
97
98 function $(id) { return document.getElementById(id); }
99
100 function test_patron(ev) {
101     try {
102         var barcode = ev.target.value;
103         JSAN.use('util.barcode');
104         if ( ($('strict_p_barcode').checked) && (! util.barcode.check(barcode)) ) {
105             var r = g.error.yns_alert(offlineStrings.getString('circ.bad_checkdigit'),offlineStrings.getString('circ.barcode.warning'),offlineStrings.getString('common.ok'),offlineStrings.getString('common.clear'),null,offlineStrings.getString('common.confirm'));
106             if (r == 1) {
107                 setTimeout(
108                     function() {
109                         ev.target.value = '';
110                         ev.target.focus();
111                     },0
112                 );
113             }
114
115         }
116
117         if (g.data.bad_patrons[barcode]) {
118             var code;
119             switch(g.data.bad_patrons[barcode]) {
120                 case 'L' : code = offlineStrings.getString('common.barcode.status.warning.lost'); break;
121                 case 'E' : code = offlineStrings.getString('common.barcode.status.warning.expired'); break;
122                 case 'B' : code = offlineStrings.getString('common.barcode.status.warning.barred'); break;
123                 case 'D' : code = offlineStrings.getString('common.barcode.status.warning.blocked'); break;
124                 default : code = offlineStrings.getFormattedString('common.barcode.status.warning.blocked', [g.data.bad_patrons[barcode]]); break;
125             }
126
127             var msg = offlineStrings.getFormattedString('common.barcode.status.warning', [g.data.bad_patrons_date.substr(0,15), barcode, code]);
128             var r = g.error.yns_alert(msg,offlineStrings.getString('circ.barcode.warning'),offlineStrings.getString('common.ok'),offlineStrings.getString('common.clear'),null,offlineStrings.getString('common.confirm'));
129             if (r == 1) {
130                 setTimeout(
131                     function() {
132                         ev.target.value = '';
133                         ev.target.focus();
134                     },0
135                 );
136             }
137         }
138     } catch(E) {
139         alert(E);
140     }
141 }
142
143 function check_date(ev) {
144     JSAN.use('util.date');
145     try {
146         if (! util.date.check('YYYY-MM-DD',ev.target.value) ) { throw(offlineStrings.getString('common.date.invalid')); }
147         if (util.date.check_past('YYYY-MM-DD',ev.target.value) ) { throw(offlineStrings.getString('circ.offline_checkout.date.early')); }
148         if (util.date.formatted_date(new Date(),'%F') == ev.target.value) { throw(offlineStrings.getString('circ.offline_checkout.date.early')); }
149     } catch(E) {
150         alert(E);
151         var today = new Date();
152         var todayPlus = new Date(); todayPlus.setTime( today.getTime() + 24*60*60*1000*14 );
153         todayPlus = util.date.formatted_date(todayPlus,"%F");
154         ev.target.value = todayPlus;
155     }
156 }
157
158 function handle_keypress(ev) {
159     if ( (! ev.keyCode) || (ev.keyCode != 13) ) return;
160     switch(ev.target) {
161         case $('p_barcode') : /*$('p_barcode').disabled = true;*/ setTimeout( function() { $('i_barcode').focus(); },0 ); break;
162         case $('i_barcode') : handle_enter(); break;
163         default: break;
164     }
165 }
166
167 function handle_enter(ev) {
168     JSAN.use('util.barcode');
169     if ( ($('strict_i_barcode').checked) && (! util.barcode.check($('i_barcode').value)) ) {
170         var r = g.error.yns_alert(offlineStrings.getString('circ.bad_checkdigit'),offlineStrings.getString('circ.barcode.warning'),offlineStrings.getString('common.ok'),offlineStrings.getString('common.clear'),null,offlineStrings.getString('common.confirm'));
171         if (r == 1) {
172             setTimeout(
173                 function() {
174                     $('i_barcode').value = '';
175                     $('i_barcode').focus();
176                 },0
177             );
178         } else {
179             append_to_list('barcode');
180         }
181     } else {
182         append_to_list('barcode');
183     }
184 }
185
186 function handle_duedate_menu(ev) {
187     if (ev.target.value=='0') return; 
188     JSAN.use('util.date'); 
189     var today = new Date(); 
190     var todayPlus = new Date(); 
191     todayPlus.setTime( today.getTime() + 24*60*60*1000*ev.target.value ); 
192     todayPlus = util.date.formatted_date(todayPlus,'%F'); 
193     $('duedate').setAttribute('value',todayPlus); 
194     $('duedate').value = todayPlus;
195 }
196
197 function append_to_list(checkout_type,count) {
198
199     try {
200
201         var my = {};
202
203         my.type = 'checkout';
204         my.timestamp = parseInt( new Date().getTime() / 1000) + g.delta;
205         my.checkout_time = util.date.formatted_date(new Date(),"%F %H:%M:%s");
206
207         var p_barcode = $('p_barcode').value;
208         if (! p_barcode) {
209             g.error.yns_alert(offlineStrings.getString('circ.barcode.enter'),offlineStrings.getString('circ.offline_checkout.required_field'),offlineStrings.getString('common.ok'),null,null,offlineStrings.getString('common.confirm'));
210             return;
211         } else {
212
213             // Need to validate patron barcode against bad patron list
214             my.patron_barcode = p_barcode;
215         }
216
217         var due_date = $('duedate').value; // Need to validate this
218         my.due_date = due_date;
219
220         var i_barcode = $('i_barcode').value;
221         switch(checkout_type) {
222             case 'barcode' : 
223                 if (! i_barcode) return; 
224                 
225                 var rows = g.list.dump_with_keys();
226                 for (var i = 0; i < rows.length; i++) {
227                     if (rows[i].barcode == i_barcode) {
228                         g.error.yns_alert(offlineStrings.getString('circ.duplicate_scan.msg'),offlineStrings.getString('circ.duplicate_scan.field'),offlineStrings.getString('common.ok'),null,null,offlineStrings.getString('common.confirm'));
229                         return;
230                     }
231                 }
232
233                 my.barcode = i_barcode; 
234             break;
235             case 'noncat' :
236                 count = parseInt(count); if (! (count>0) ) {
237                     g.error.yns_alert(offlineStrings.getString('circ.offline_checkout.valid_count'),offlineStrings.getString('circ.offline_checkout.required_value'),offlineStrings.getString('common.ok'),null,null,offlineStrings.getString('common.confirm'));
238                     return;
239                 }
240                 my.barcode = $('noncat_type_menu').getAttribute('label');
241                 my.noncat = 1;
242                 my.noncat_type = JSON2js($('noncat_type_menu').value)[0];
243                 my.noncat_count = count;
244             break;
245             default: alert(offlineStrings.getString('common.error.default')); break;
246         }
247     
248         g.list.append( { 'row' : { 'my' : my }, 'to_top' : true } );
249
250         var x = $('i_barcode'); x.value = ''; x.focus();
251
252         if (!local_lock) {
253             local_lock = true;
254             xulG.lock();
255         }
256
257     } catch(E) {
258
259         dump(E+'\n'); alert(E);
260
261     }
262 }
263
264
265 function save_xacts() {
266     JSAN.use('util.file'); var file = new util.file('pending_xacts');
267     var rows = g.list.dump_with_keys();
268     for (var i = 0; i < rows.length; i++) {
269         var row = rows[i]; row.delta = g.delta;
270         if (row.noncat == 1) {
271             delete(row.barcode);
272         } else {
273             delete(row.noncat);
274             delete(row.noncat_type);
275             delete(row.noncat_count);
276         }
277         file.append_object(row);
278     }
279     file.close();
280
281     if (local_lock) {
282         local_lock = false;
283         xulG.unlock();
284     }
285 }
286
287 function next_patron(cancel) {
288     try {
289     
290         if ($('print_receipt').checked && (cancel!='cancel')) {
291             try {
292                 var params = {
293                     'patron_barcode' : $('p_barcode').value,
294                     'template' : 'offline_checkout',
295                     'printer_context' : 'offline',
296                     'callback' : function() {
297                         g.list.clear();
298                         var x = $('i_barcode'); x.value = '';
299                         x = $('p_barcode'); x.value = ''; 
300                         x.setAttribute('disabled','false'); x.disabled = false; 
301                         x.focus();
302                     }
303                 };
304                 g.list.print( params );
305             } catch(E) {
306                 g.error.sdump('D_ERROR','print: ' + E);
307                 alert('print: ' + E);
308             }
309         } else {
310             g.list.clear();
311             var x = $('i_barcode'); x.value = '';
312             x = $('p_barcode'); x.value = ''; 
313             x.setAttribute('disabled','false'); x.disabled = false; 
314             x.focus();
315         }
316     } catch(E) {
317         dump(E+'\n'); alert(E);
318     }
319 }