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