]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/circ/offline_register.js
Improve Firefox/XULRunner Support
[Evergreen.git] / Open-ILS / xul / staff_client / chrome / content / circ / offline_register.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_register.xul');
13
14         JSAN.use('OpenILS.data'); g.data = new OpenILS.data(); g.data.init({'via':'stash'});
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         $('barcode').addEventListener('change',test_patron,false);
21         $('barcode').addEventListener('keypress',handle_keypress,false);
22         $('submit').addEventListener('command',next_patron,false);
23
24         function handle_lock(ev) {
25             if (!(ev.altKey || ev.ctrlKey || ev.metakey)) {
26                 if (!local_lock) {
27                     local_lock = true;
28                     xulG.lock();
29                 }
30             }
31         }
32         $('barcode').addEventListener('keypress',handle_lock,false);
33         $('passwd').addEventListener('keypress',handle_lock,false);
34         $('ident_value').addEventListener('keypress',handle_lock,false);
35         $('first_given_name').addEventListener('keypress',handle_lock,false);
36         $('family_name').addEventListener('keypress',handle_lock,false);
37         $('dob').addEventListener('keypress',handle_lock,false);
38         $('street1').addEventListener('keypress',handle_lock,false);
39         $('street2').addEventListener('keypress',handle_lock,false);
40         $('city').addEventListener('keypress',handle_lock,false);
41         $('state').addEventListener('keypress',handle_lock,false);
42         $('country').addEventListener('keypress',handle_lock,false);
43         $('post_code').addEventListener('keypress',handle_lock,false);
44
45         $('cancel').addEventListener(
46             'command',
47             function(ev) {
48                 $('barcode').value = '';
49                 $('passwd').value = '';
50                 $('ident_value').value = '';
51                 $('first_given_name').value = '';
52                 $('family_name').value = '';
53                 $('dob').value = '';
54                 $('street1').value = '';
55                 $('street2').value = '';
56                 $('city').value = '';
57                 $('state').value = '';
58                 $('country').value = '';
59                 $('post_code').value = '';
60                 if (local_lock) {
61                     local_lock = false;
62                     xulG.unlock();
63                 }
64             },
65             false
66         );
67
68         JSAN.use('util.file');
69         JSAN.use('util.widgets');
70
71         var file; var list_data; var ml; var errors = '';
72
73         file = new util.file('offline_ou_list'); 
74         if (file._file.exists()) {
75             list_data = file.get_object(); file.close();
76             ml = util.widgets.make_menulist( list_data[0], list_data[1] );
77             ml.setAttribute('id','home_ou'); $('x_home_ou').appendChild(ml);
78         } else {
79             errors += offlineStrings.getString('circ.offline_register.missing.library.list') + "\n";
80         }
81
82         file = new util.file('offline_pgt_list');
83         if (file._file.exists()) {
84             list_data = file.get_object(); file.close();
85             ml = util.widgets.make_menulist( list_data[0], list_data[1] );
86             ml.setAttribute('id','profile'); $('x_profile').appendChild(ml);
87         } else {
88             errors += offlineStrings.getString('circ.offline_register.missing.profile.list') + "\n";
89         }
90
91         file = new util.file('offline_cit_list'); 
92         if (file._file.exists()) {
93             list_data = file.get_object(); file.close();
94             ml = util.widgets.make_menulist( list_data[0], list_data[1] );
95             ml.setAttribute('id','ident_type'); $('x_ident_type').appendChild(ml);
96         } else {
97             errors += offlineStrings.getString('circ.offline_register.missing.id.type.list') + "\n";
98         }
99
100         file = new util.file('offline_asv_list'); 
101         if (file._file.exists()) {
102             list_data = file.get_object(); file.close();
103             render_surveys('x_surveys', list_data);
104         } else {
105             errors += offlineStrings.getString('circ.offline_register.missing.required.surveys');
106         }
107
108         if (errors != '') {
109             alert(offlineStrings.getString('circ.offline_register.missing.files.error') + errors);
110             location.href = 'about:blank';
111         }
112
113         $('passwd').value = parseInt(Math.random()*8999+1000);
114
115         $('dob').addEventListener('change',handle_check_date,false);
116         $('barcode').focus();
117
118         var file = new util.file('offline_delta'); 
119         if (file._file.exists()) { g.delta = file.get_object()[0]; file.close(); } else { g.delta = 0; }
120
121     } catch(E) {
122         var err_msg = offlineStrings.getFormattedString('common.exception', ["circ/offline_register.xul", E]);
123         try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
124         alert(err_msg);
125     }
126 }
127
128 function $(id) { return document.getElementById(id); }
129
130 function test_patron(ev) {
131     try {
132         var barcode = ev.target.value;
133         JSAN.use('util.barcode');
134         if ( ! util.barcode.check(ev.target.value) ) {
135             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'));
136             if (r == 1) {
137                 setTimeout(
138                     function() {
139                         ev.target.value = '';
140                         ev.target.focus();
141                     },0
142                 );
143             }
144
145         }
146         if (g.data.bad_patrons[barcode]) {
147             var code;
148             switch(g.data.bad_patrons[barcode]) {
149                 case 'L' : code = offlineStrings.getString('common.barcode.status.warning.lost'); break;
150                 case 'E' : code = offlineStrings.getString('common.barcode.status.warning.expired'); break;
151                 case 'B' : code = offlineStrings.getString('common.barcode.status.warning.barred'); break;
152                 case 'D' : code = offlineStrings.getString('common.barcode.status.warning.blocked'); break;
153                 default : code = offlineStrings.getFormattedString('common.barcode.status.warning.blocked', [g.data.bad_patrons[barcode]]); break;
154             }
155
156             var msg = offlineStrings.getFormattedString('common.barcode.status.warning', [g.data.bad_patrons_date.substr(0,15), barcode, code]);
157             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'));
158             if (r == 1) {
159                 setTimeout(
160                     function() {
161                         ev.target.value = '';
162                         ev.target.focus();
163                     },0
164                 );
165             }
166         }
167     } catch(E) {
168         alert(E);
169     }
170 }
171
172 function handle_check_date(ev) {
173     ev.target.value = check_date(ev.target.value);
174 }
175
176 function check_date(value) {
177     JSAN.use('util.date');
178     try {
179         if (! util.date.check('YYYY-MM-DD',value) ) { throw(offlineStrings.getString('common.date.invalid')); }
180         if (! util.date.check_past('YYYY-MM-DD',value) ) { throw(offlineStrings.getString('circ.offline_register.future.birth.date')); }
181         if ( util.date.formatted_date(new Date(),'%F') == value) { throw(offlineStrings.getString('circ.offline_register.invalid.birth.date')); }
182     } catch(E) {
183         alert(E);
184         value = '';
185     }
186     return value;
187 }
188
189 function render_surveys(node,obj) {
190     node = util.widgets.get(node);
191     util.widgets.remove_children(node);
192
193     for (var i in obj) {
194         var survey = obj[i];
195         var x_gb = document.createElement('groupbox'); node.appendChild(x_gb);
196         var x_cp = document.createElement('caption'); 
197         x_cp.setAttribute('label',i); x_gb.appendChild(x_cp);
198         var x_d = document.createElement('description');
199         x_d.appendChild( document.createTextNode( survey.description ) ); x_gb.appendChild(x_d);
200         for (var j = 0; j < survey.questions.length; j++) {
201             var question = survey.questions[j];
202             var x_d = document.createElement('description');
203             x_d.appendChild( document.createTextNode( (j+1) + ') ' + question.question ) ); 
204             x_gb.appendChild( x_d );
205             var x_hb = document.createElement('hbox'); x_hb.setAttribute('flex','1'); 
206             x_gb.appendChild(x_hb);
207             var x_spacer = document.createElement('spacer'); x_spacer.setAttribute('flex','1');
208             x_hb.appendChild(x_spacer);
209             var x_ml = util.widgets.make_menulist( [ [offlineStrings.getString('circ.offline_register.survey.prompt'),''] ].concat(question.answers) );
210             x_ml.setAttribute('name','survey'); x_hb.appendChild(x_ml);
211         }
212     }
213 }
214
215 function handle_keypress(ev) {
216     if ( (! ev.keyCode) || (ev.keyCode != 13) ) return;
217     switch(ev.target) {
218         case $('barcode') : setTimeout( function() { $('family_name').focus(); },0 ); break;
219         default: break;
220     }
221 }
222
223 function check_patron(obj) {
224     var errors = '';
225     if (! obj.user.billing_address.post_code ) {
226         errors += offlineStrings.getString('circ.offline_register.missing.post_code') + "\n";
227         $('post_code').focus();
228         $('post_code').parentNode.setAttribute('style','background-color: red');
229     } else {
230         $('post_code').parentNode.setAttribute('style','');
231     }
232     if (! obj.user.billing_address.state ) {
233         errors += offlineStrings.getString('circ.offline_register.missing.state') + "\n";
234         $('state').focus();
235         $('state').parentNode.setAttribute('style','background-color: red');
236     } else {
237         $('state').parentNode.setAttribute('style','');
238     }
239     if (! obj.user.billing_address.city ) {
240         errors += offlineStrings.getString('circ.offline_register.missing.city') + "\n";
241         $('city').focus();
242         $('city').parentNode.setAttribute('style','background-color: red');
243     } else {
244         $('city').parentNode.setAttribute('style','');
245     }
246     if (! obj.user.billing_address.street1 ) {
247         errors += offlineStrings.getString('circ.offline_register.missing.street1') + "\n";
248         $('street1').focus();
249         $('street1').parentNode.setAttribute('style','background-color: red');
250     } else {
251         $('street1').parentNode.setAttribute('style','');
252     }
253     /*if (! obj.user.ident_value ) {
254         errors += offlineStrings.getString('circ.offline_register.missing.ident_value') + "\n";
255         $('ident_value').focus();
256         $('ident_value').parentNode.setAttribute('style','background-color: red');
257     } else {
258         $('ident_value').parentNode.setAttribute('style','');
259     }*/
260     if (! obj.user.ident_type ) {
261         errors += offlineStrings.getString('circ.offline_register.missing.ident_type') + "\n";
262         $('ident_type').focus();
263         $('ident_type').parentNode.setAttribute('style','background-color: red');
264     } else {
265         $('ident_type').parentNode.setAttribute('style','');
266     }
267     if (! obj.user.dob ) {
268         errors += offlineStrings.getString('circ.offline_register.missing.dob') + "\n";
269         $('dob').focus();
270         $('dob').parentNode.parentNode.setAttribute('style','background-color: red');
271     } else {
272         $('dob').parentNode.parentNode.setAttribute('style','');
273     }
274     if (! obj.user.first_given_name ) {
275         errors += offlineStrings.getString('circ.offline_register.missing.first_given_name') + "\n";
276         $('first_given_name').focus();
277         $('first_given_name').parentNode.setAttribute('style','background-color: red');
278     } else {
279         $('first_given_name').parentNode.setAttribute('style','');
280     }
281     if (! obj.user.family_name ) {
282         errors += offlineStrings.getString('circ.offline_register.missing.family_name') + "\n";
283         $('family_name').focus();
284         $('family_name').parentNode.setAttribute('style','background-color: red');
285     } else {
286         $('family_name').parentNode.setAttribute('style','');
287     }
288     if (! obj.user.passwd ) {
289         errors += offlineStrings.getString('circ.offline_register.missing.passwd') + "\n";
290         $('passwd').focus();
291         $('passwd').parentNode.setAttribute('style','background-color: red');
292     } else {
293         $('passwd').parentNode.setAttribute('style','');
294     }
295     if (! obj.user.card.barcode ) {
296         errors += offlineStrings.getString('circ.offline_register.missing.barcode') + "\n";
297         $('barcode').focus();
298         $('barcode').parentNode.setAttribute('style','background-color: red');
299     } else {
300         $('barcode').parentNode.setAttribute('style','');
301     }
302     if (! obj.user.profile ) {
303         errors += offlineStrings.getString('circ.offline_register.missing.profile') + "\n";
304         $('profile').focus();
305         $('profile').parentNode.setAttribute('style','background-color: red');
306     } else {
307         $('profile').parentNode.setAttribute('style','');
308     }
309     if (! obj.user.home_ou ) {
310         errors += offlineStrings.getString('circ.offline_register.missing.home_ou') + "\n";
311         $('home_ou').focus();
312         $('home_ou').parentNode.setAttribute('style','background-color: red');
313     } else {
314         $('home_ou').parentNode.setAttribute('style','');
315     }
316     if (errors != '') throw(errors);
317 }
318
319 function next_patron() {
320     try {
321         var obj = {}
322         obj.timestamp = parseInt( new Date().getTime() / 1000) + g.delta;
323         obj.type = 'register';
324         obj.user = {};
325         obj.user.card = { 'barcode' : $('barcode').value };
326         obj.user.profile = $('profile').value;
327         obj.user.passwd = $('passwd').value;
328         obj.user.ident_type = $('ident_type').value;
329         obj.user.ident_value = $('ident_value').value;
330         obj.user.first_given_name = $('first_given_name').value;
331         obj.user.family_name = $('family_name').value;
332         obj.user.home_ou = $('home_ou').value;
333         obj.user.dob = $('dob').value;
334         obj.user.billing_address = {};
335         obj.user.billing_address.street1 = $('street1').value;
336         obj.user.billing_address.street2 = $('street2').value;
337         obj.user.billing_address.city = $('city').value;
338         obj.user.billing_address.state = $('state').value;
339         obj.user.billing_address.country = $('country').value;
340         obj.user.billing_address.post_code = $('post_code').value;
341         obj.user.survey_responses = [];
342
343         var nl = document.getElementsByAttribute('name','survey');
344         for (var i = 0; i < nl.length; i++) {
345             var value = nl[i].value; if (value == '') continue;
346             var values = JSON2js( value );
347             var response = { 'survey' : values[2], 'question' : values[1], 'answer' : values[0] };
348             obj.user.survey_responses.push( response );
349         }
350
351         try {
352             check_patron(obj);
353         } catch(E) {
354             alert(offlineStrings.getString('circ.offline_register.missing.alert') + "\n" + E);
355             return;
356         }
357
358         JSAN.use('util.file'); var file = new util.file('pending_xacts');
359         obj.delta = g.delta;
360         file.append_object(obj);
361         file.close();
362
363         if (local_lock) {
364             local_lock = false;
365             xulG.unlock();
366         }
367
368         alert(offlineStrings.getString('circ.offline_register.patron.saved'));
369
370         $('passwd').value = parseInt(Math.random()*8999+1000);
371         $('barcode').value = ''; $('ident_value').value = ''; $('first_given_name').value = '';
372         $('family_name').value = ''; $('dob').value = ''; $('street1').value = '';
373         $('street2').value = '';
374
375         file = new util.file('offline_asv_list'); var list_data = file.get_object(); file.close();
376         render_surveys('x_surveys', list_data);
377
378         $('barcode').focus();
379
380     } catch(E) {
381         dump(E+'\n'); alert(E);
382     }
383 }