2 var local_lock = false;
6 offlineStrings = $('offlineStrings');
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');
15 JSAN.use('util.widgets'); JSAN.use('util.file');
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); }
21 JSAN.use('OpenILS.data'); g.data = new OpenILS.data(); g.data.init({'via':'stash'});
23 JSAN.use('util.list'); g.list = new util.list('checkout_list');
24 JSAN.use('circ.util');
26 'columns' : circ.util.offline_checkout_columns(),
27 'map_row_to_column' : circ.util.std_map_row_to_column(),
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");
35 function handle_lock(ev) {
36 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
37 if (!(ev.altKey || ev.ctrlKey || ev.metakey)) {
45 $('duedate').setAttribute('value',todayPlus);
46 $('duedate').addEventListener('change',check_date,false);
48 $('p_barcode').addEventListener('change',test_patron,false);
49 $('p_barcode').addEventListener('keypress',handle_lock,false);
51 $('p_barcode').addEventListener('keypress',handle_keypress,false);
52 $('p_barcode').focus();
54 $('i_barcode').addEventListener('keypress',handle_lock,false);
55 $('i_barcode').addEventListener('keypress',handle_keypress,false);
56 $('enter').addEventListener('command',handle_enter,false);
58 $('duedate_menu').addEventListener('command',handle_duedate_menu,false);
60 $('submit').addEventListener('command',function(ev){
61 save_xacts(); next_patron();
63 $('cancel').addEventListener('command',function(ev){
64 next_patron('cancel');
67 var file; var list_data; var ml;
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]),
76 ml.setAttribute('id','noncat_type_menu'); $('x_noncat_type').appendChild(ml);
80 var count = window.prompt(offlineStrings.getString('circ.offline_checkout.items'),1,ml.getAttribute('label'));
81 append_to_list('noncat',count);
87 alert(offlineStrings.getString('circ.offline_checkout.download.warning'));
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; }
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); }
100 function $(id) { return document.getElementById(id); }
102 function test_patron(ev) {
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'));
111 ev.target.value = '';
119 if (g.data.bad_patrons[barcode]) {
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;
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'));
134 ev.target.value = '';
145 function check_date(ev) {
146 JSAN.use('util.date');
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')); }
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;
160 function handle_keypress(ev) {
161 if ( (! ev.keyCode) || (ev.keyCode != 13) ) return;
163 case $('p_barcode') : /*$('p_barcode').disabled = true;*/ setTimeout( function() { $('i_barcode').focus(); },0 ); break;
164 case $('i_barcode') : handle_enter(); break;
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'));
176 $('i_barcode').value = '';
177 $('i_barcode').focus();
181 append_to_list('barcode');
184 append_to_list('barcode');
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;
199 function append_to_list(checkout_type,count) {
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");
209 var p_barcode = $('p_barcode').value;
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'));
215 // Need to validate patron barcode against bad patron list
216 my.patron_barcode = p_barcode;
219 var due_date = $('duedate').value; // Need to validate this
220 my.due_date = due_date;
222 var i_barcode = $('i_barcode').value;
223 switch(checkout_type) {
225 if (! i_barcode) return;
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'));
235 my.barcode = i_barcode;
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'));
242 my.barcode = $('noncat_type_menu').getAttribute('label');
244 my.noncat_type = JSON2js($('noncat_type_menu').value)[0];
245 my.noncat_count = count;
247 default: alert(offlineStrings.getString('common.error.default')); break;
250 g.list.append( { 'row' : { 'my' : my }, 'to_top' : true } );
252 var x = $('i_barcode'); x.value = ''; x.focus();
261 dump(E+'\n'); alert(E);
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) {
276 delete(row.noncat_type);
277 delete(row.noncat_count);
279 file.append_object(row);
289 function next_patron(cancel) {
292 if ($('print_receipt').checked && (cancel!='cancel')) {
295 'patron_barcode' : $('p_barcode').value,
296 'template' : 'offline_checkout',
297 'printer_context' : 'offline',
298 'callback' : function() {
300 var x = $('i_barcode'); x.value = '';
301 x = $('p_barcode'); x.value = '';
302 x.setAttribute('disabled','false'); x.disabled = false;
306 g.list.print( params );
308 g.error.sdump('D_ERROR','print: ' + E);
309 alert('print: ' + E);
313 var x = $('i_barcode'); x.value = '';
314 x = $('p_barcode'); x.value = '';
315 x.setAttribute('disabled','false'); x.disabled = false;
319 dump(E+'\n'); alert(E);