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