]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/patron/user_editor.js
fixed some typos, gathering more data
[Evergreen.git] / Open-ILS / xul / staff_client / server / patron / user_editor.js
1
2 var cgi                                 = null;
3 var patron                              = null;
4 var advanced                    = false;
5 var SC_FETCH_ALL     = 'open-ils.circ:open-ils.circ.stat_cat.actor.retrieve.all';
6 var SC_CREATE_MAP               = 'open-ils.circ:open-ils.circ.stat_cat.actor.user_map.create';
7 var SV_FETCH_ALL                = 'open-ils.circ:open-ils.circ.survey.retrieve.all';
8 var FETCH_ID_TYPES      = 'open-ils.actor:open-ils.actor.user.ident_types.retrieve';
9 var identTypes                  = null;
10
11 var myPerms             = [ 'CREATE_USER', 'UPDATE_USER', 'CREATE_PATRON_STAT_CAT_ENTRY_MAP' ];
12
13 var pages               = [ 
14         'uedit_userid', 
15         'uedit_contact_info', 
16         'uedit_addresses', 
17         'uedit_groups', 
18         'uedit_stat_cats', 
19         'uedit_surveys',
20         'uedit_finalize',
21         ];
22
23 /* ID's of objects that should be focused when their page is made visible */
24 var pageFocus   = [
25         'ue_barcode',
26         'ue_email1',
27         'ue_addr_label',
28         'ue_profile',
29         'ue_stat_cat_selector_1',
30         'ue_survey_selector_1',
31         'ue_view_summary'
32 ];
33
34 var regexes = {};
35 regexes.phone   = /\d{3}-\d{3}-\d{4}/;
36 regexes.email   = /.+\@.+\..+/;
37 regexes.date    = /^\d{4}-\d{2}-\d{2}/;
38 regexes.isid    = /^\d+$/;
39
40 /* fetch the necessary data to start off */
41 function uEditInit() {
42
43         cgi             = new CGI();
44         session = cgi.param('ses');
45         if(cgi.param('adv')) advanced = true 
46         if(!session) throw "User session is not defined";
47
48         fetchUser(session);
49         $('uedit_user').appendChild(text(USER.usrname()));
50         uEditShowPage('uedit_userid');
51
52         setTimeout( 
53                 function() { 
54                         fetchHighestPermOrgs( SESSION, USER.id(), myPerms );
55                         uEditDrawUser(fetchFleshedUser(cgi.param('usr')));
56                         uEditBuildLibSelector();
57                         uEditFetchIDTypes();
58                         uEditFetchStatCats();
59                         uEditFetchSurveys();
60                 }, 20 
61         );
62 }
63
64 function uEditNext() {
65         var i = _findActive();
66         if( i < (pages.length - 1)) uEditShowPage(pages[i+1]);
67 }
68
69 function uEditPrev() {
70         var i = _findActive();
71         if( i > 0 ) uEditShowPage(pages[i-1]);
72 }
73
74
75 function uEditShowPage(id) {
76         if( id == null ) return;
77
78         for( var p in pages ) {
79                 var page = pages[p];
80                 hideMe($(page));
81                 removeCSSClass($(page+'_label'), 'label_active');
82         }
83
84         unHideMe($(id));
85         addCSSClass($(id+'_label'), 'label_active');
86         var idx = _findPageIdx(id);
87         var fpage = pageFocus[idx];
88         if(fpage) { $(fpage).focus(); try{$(fpage).select()}catch(e){} }
89
90         unHideMe($('ue_back'));
91         unHideMe($('ue_fwd'));
92
93         if(idx == 0) hideMe($('ue_back'));
94         if(idx == (pages.length-1)) hideMe($('ue_fwd'));
95 }
96
97
98 function _findActive() {
99         for( var p in pages ) {
100                 if(! $(pages[p]).className.match(/hide_me/) )
101                         return parseInt(p);
102         }
103         return null;
104 }
105 function _findPageIdx(name) {
106         for( var i in pages ) {
107                 var page = pages[i];
108                 if( page == name ) return i;
109         }
110         return -1;
111 }
112
113 function uEditAddrHighlight( node, type ) {
114         var tbody = $('ue_address_tbody');
115         for( var c in tbody.childNodes ) {
116                 var row = tbody.childNodes[c];
117                 if(row.nodeType != XML_ELEMENT_NODE ) continue;
118                 var div = $n(row,'ue_addr_'+type+'_yes').parentNode;
119                 removeCSSClass(div, 'addr_info_checked');
120         }
121         addCSSClass(node.parentNode, 'addr_info_checked');
122 }
123
124
125
126 function uEditDrawUser(patron) {
127         if(!patron) return 0;
128 }
129
130 function uEditFetchIDTypes() {
131         var req = new Request(FETCH_ID_TYPES);
132         req.callback(uEditDrawIDTypes);
133         req.send();
134 }
135
136 function uEditDrawIDTypes(r) {
137
138         var types = r.getResultObject();
139         var pri_sel = $('ue_primary_ident_type');
140         var sec_sel = $('ue_secondary_ident_type');
141
142         var idx = 1;
143         for( var t in types ) {
144                 var type = types[t];
145                 setSelectorVal( pri_sel, idx, type.name(), type.id() );
146                 setSelectorVal( sec_sel, idx++, type.name(), type.id() );
147         }
148 }
149
150 function uEditFetchStatCats() {
151         var req = new Request(SC_FETCH_ALL, SESSION);
152         req.callback(uEditDrawStatCats);
153         req.send();
154 }
155
156 function uEditDrawStatCats(r) {
157         var cats = r.getResultObject();
158         var tbody = $('ue_stat_cat_tbody');
159         var templ = tbody.removeChild($('ue_stat_cat_row'));
160
161         for( var c in cats ) {
162                 var row = templ.cloneNode(true);
163                 uEditInsertCat( tbody, row, cats[c], c );
164                 tbody.appendChild(row);
165         }
166 }
167
168 function uEditInsertCat( tbody, row, cat, idx ) {
169
170         cat.entries().sort(  /* sort the entries by value */
171                 function( a, b ) { 
172                         if( a.value().toLowerCase() > b.value().toLowerCase()) return 1;
173                         if( a.value().toLowerCase() < b.value().toLowerCase()) return -1;
174                         return 0;
175                 }
176         );
177
178         var selector = $n(row, 'ue_stat_cat_selector');
179         if( idx == 0 ) selector.id = 'ue_stat_cat_selector_1'; 
180         $n(row, 'ue_stat_cat_name').appendChild(text(cat.name()));
181         $n(row, 'ue_stat_cat_owner').appendChild(text(fetchOrgUnit(cat.owner()).shortname()));
182
183         var idx = 1;
184         for( var e in cat.entries() ) {
185                 var entry = cat.entries()[e];
186                 setSelectorVal( selector, idx++, entry.value(), entry.id() );
187         }
188 }
189
190 function uEditFetchSurveys() {
191         var req = new Request(SV_FETCH_ALL, SESSION);
192         req.callback(uEditDrawSurveys);
193         req.send();
194 }
195
196 function uEditDrawSurveys(r) {
197
198         var surveys = r.getResultObject();
199         var div = $('uedit_surveys');
200         var table = div.removeChild($('ue_survey_table'));
201
202         var x = 0;
203         for( var s in surveys ) {
204                 var survey = surveys[s];
205                 var clone = table.cloneNode(true);
206                 uEditInsertSurvey( div, clone, survey, x++ );
207                 div.appendChild(clone);
208         }
209 }
210
211 function uEditInsertSurvey( div, table, survey, sidx ) {
212         $n(table, 'ue_survey_name').appendChild(text(survey.name()));
213         $n(table, 'ue_survey_desc').appendChild(text(survey.description()));
214         var tbody = $n(table, 'ue_survey_tbody');
215         var templ = tbody.removeChild($n(table, 'ue_survey_row'));
216
217         var polldiv             = $('ue_survey_answer_poll');
218
219         var idx = 1;
220         for( var q in survey.questions() ) {
221                 var row = templ.cloneNode(true);
222                 uEditInsertSurveyQuestion( div, table, tbody, row, survey, survey.questions()[q], sidx );
223                 tbody.appendChild(row);
224         }
225 }
226
227 function uEditInsertSurveyQuestion( div, table, tbody, row, survey, question, sidx ) {
228
229         $n(row, 'ue_survey_question').appendChild(text(question.question()));
230
231         var selector    = $n(row, 'ue_survey_answer');
232         var polldiv             = $n(row, 'ue_survey_answer_poll');
233         var idx                 = 1;
234         var polltbody   = $n(row, 'ue_survey_answer_poll_tbody');
235         var pollrow             = polltbody.removeChild($n(polltbody, 'ue_survey_answer_poll_row'));
236
237         if( sidx == 0 ) selector.id = 'ue_survey_selector_1'; 
238
239         for( var a in question.answers() ) {
240
241                 var answer = question.answers()[a];
242
243                 if( survey.poll() ) {
244
245                         unHideMe(polldiv);
246                         var prow = pollrow.cloneNode(true);
247                         $n(prow, 'ue_survey_answer_poll_answer').appendChild(text(answer.answer()));
248
249                         $n(prow, 'ue_survey_answer_poll_radio').appendChild(
250                                 elem('input', { 
251                                         type    : 'radio', 
252                                         name    : 'survey_poll_answer_'+survey.id(),
253                                         id              :  answer.id()
254                                 }));
255
256                         polltbody.appendChild(prow);
257
258                 } else {
259
260                         unHideMe(selector.parentNode);
261                         setSelectorVal( selector, idx++, answer.answer(), answer.id() );
262                 }
263         }
264 }
265
266
267 function uEditFetchError(id) { return $(id).innerHTML + "\n"; }
268
269
270 function uEditSaveUser() {
271
272         var card                = null;
273         var errors      = "";
274
275         if(patron == null) { 
276                 patron = new au(); 
277                 patron.isnew(1);
278                 card = new ac();
279                 patron.card(-1); /* attach to the virtual id of the card */
280                 patron.cards([card]);
281
282         } else { 
283                 patron.ischanged(1); 
284                 patron.isnew(0);
285         }
286
287         errors += uEditFleshCard(card);
288         errors += uEditAddBasicPatronInfo(patron);
289         errors += uEditAddPhones(patron);
290         errors += uEditAddIdents(patron);
291
292         if(errors) alert(errors);
293         else alert(js2JSON(patron));
294 }
295
296 function uEditSetVal( obj, func, val, regxtype ) {
297
298         if( val == null ) return false;
299         if(!instanceOf(val, String)) {
300                 try {
301                         val = val.value;
302                 } catch(e) { return false; }
303         }
304
305         if(val == "" ) return false;
306
307         if(regxtype && regexes[regxtype] 
308                 && !val.match(regexes[regxtype]) ) return false;
309
310         obj[func](val);
311         alert("Setting val: "+val);
312
313         return true;
314 }
315
316
317 function uEditAddBasicPatronInfo(patron) {
318
319         var errors = "";
320
321         if(!uEditSetVal(patron, "usrname", $('ue_username') ))
322                 errors += uEditFetchError('ue_bad_username');
323
324         /* make sure passwords match */
325         var p1 = $('ue_password1').value;
326         var p2 = $('ue_password1').value;
327         if( p1 != p2 || !uEditSetVal( patron, "passwd", p1 )) 
328                 errors += uEditFetchError('ue_bad_password');
329
330         if(!uEditSetVal(patron, "first_given_name", $('ue_firstname') )) 
331                 errors += uEditFetchError('ue_bad_firstname');
332
333         if(!uEditSetVal(patron, "second_given_name", $('ue_middlename') )) 
334                 errors += uEditFetchError('ue_bad_middlename');
335
336         if(!uEditSetVal(patron, "family_name", $('ue_lastname') )) 
337                 errors += uEditFetchError('ue_bad_lastname');
338
339         patron.suffix($('ue_suffix').value); /* suffis isn't required */
340
341         if(!uEditSetVal(patron, "dob", $('ue_dob'), 'date' ) )
342                 errors += uEditFetchError('ue_bad_dob');
343
344         /* make sure emails match */
345         var email       = $('ue_email1').value;
346         var email2      = $('ue_email2').value;
347         if( email != email2 || !uEditSetVal(patron, "email", email, 'email' ))
348                 errors += uEditFetchError('ue_bad_email');
349
350
351         return errors;
352 }
353
354 function uEditAddPhones(patron) {
355
356         var errors = "";
357
358         /* verifies the phone numbers are formatted correctly */
359         var verify = function(n1, n2, n3) {
360                 var a = n1.value;
361                 var p = n2.value;
362                 var s = n3.value;
363                 if( !a || !b || !c ) return false;
364                 return a + '-' + p + '-' + s;
365         }
366
367
368         if(!uEditSetVal( patron, "day_phone", 
369                 verify($('ue_day_phone_area'), 
370                 $('ue_day_phone_prefix'), 
371                 $('ue_day_phone_suffix')), 'phone' ))
372                         errors += uEditFetchError('ue_bad_phone');
373
374         if(!uEditSetVal( patron, "night_phone", 
375                 verify($('ue_night_phone_area'), 
376                 $('ue_night_phone_prefix'), 
377                 $('ue_night_phone_suffix')), 'phone' ))
378                         errors += uEditFetchError('ue_bad_phone');
379
380         if(!uEditSetVal( patron, "other_phone", 
381                 verify($('ue_other_phone_area'), 
382                 $('ue_other_phone_prefix'), 
383                 $('ue_other_phone_suffix')), 'phone' ))
384                         errors += uEditFetchError('ue_bad_phone');
385
386         return errors;
387 }
388
389 function uEditFleshCard(card) {
390         if(!card) return "";
391
392         if(!uEditSetVal( card, "barcode", $('ue_barcode') ))
393                 return uEditFetchError('ue_bad_barcode');
394
395         card.id(-1);
396         card.active(1);
397         return "";
398 }
399
400 function uEditAddIdents(patron) {
401
402         if( !uEditSetVal( patron, 
403                 "ident_type", getSelectorVal($('ue_primary_ident_type')), 'isid' ))
404                 return uEditFetchError('ue_no_ident');
405
406         if( !uEditSetVal( patron, 
407                 "ident_type2", getSelectorVal($('ue_secondary_ident_type')), 'isid' ))
408                 return uEditFetchError('ue_no_ident');
409
410         if( !uEditSetVal( patron, "ident_value", $('ue_primary_ident') ))
411                 return uEditFetchError('ue_no_ident');
412
413         if( !uEditSetVal( patron, "ident_value2", $('ue_secondary_ident') ))
414                 return uEditFetchError('ue_no_ident');
415
416         return "";
417 }
418
419
420 var orgSelecto
421 function uEditBuildLibSelector( node, depth, selector ) {
422         if(!selector) selector = $('ue_org_selector');
423         if(!node) { depth = 0; node = globalOrgTree; }
424         
425         insertSelectorVal( selector, -1, node.name(), node.id(), null, depth++ );
426         if( node.id() == USER.home_ou() ) setSelector(selector, node.id());
427         for( var c in node.children() ) 
428                 uEditBuildLibSelector(node.children()[c], depth, selector);
429 }
430
431