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