]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/patron/ue.js
added guardian notes to new juvenile users, verifying dob is a valid date not in...
[working/Evergreen.git] / Open-ILS / xul / staff_client / server / patron / ue.js
1 var cgi                                                 = null;
2 var clone                                               = false;
3 var patron                                              = null;
4 var counter                                             = 0;
5 var identTypesCache                     = {};
6 var statCatsCache                               = {};
7 var surveysCache                                = {};
8 var surveyQuestionsCache        = {};
9 var surveyAnswersCache          = {};
10 var userCache                                   = {};
11 var groupsCache                         = {};
12 var netLevelsCache                      = {};
13 var guardianNote                                = null; 
14
15
16 /* fetch the necessary data to start off */
17 function uEditInit() {
18
19         cgi             = new CGI();
20         session = cgi.param('ses');
21         clone           = cgi.param('clone');
22         if(!session) throw "User session is not defined";
23
24         fetchUser(session);
25         $('uedit_user').appendChild(text(USER.usrname()));
26
27         setTimeout( function() { 
28                 uEditBuild(); uEditShowPage('uedit_userid'); }, 20 );
29 }
30
31 /* ------------------------------------------------------------------------------ */
32 /* Fetch code
33 /* ------------------------------------------------------------------------------ */
34 function uEditFetchIdentTypes() {
35         var req = new Request(FETCH_ID_TYPES);
36         req.send(true);
37         return req.result();
38 }
39
40 function uEditFetchStatCats() {
41         var req = new Request(SC_FETCH_ALL, SESSION);
42         req.send(true);
43         return req.result();
44 }
45
46 function uEditFetchSurveys() {
47         var req = new Request(SV_FETCH_ALL, SESSION);
48         req.send(true);
49         return req.result();
50 }
51
52 function uEditFetchGroups() {
53         var req = new Request(FETCH_GROUPS);
54         req.send(true);
55         return req.result();
56 }
57
58 function uEditFetchNetLevels() {
59         var req = new Request(FETCH_NET_LEVELS, SESSION);
60         req.send(true);
61         return req.result();
62 }
63
64 /* ------------------------------------------------------------------------------ */
65
66
67
68 /* fetches necessary and builds the UI */
69 function uEditBuild() {
70         //fetchHighestPermOrgs( SESSION, USER.id(), myPerms );
71
72         uEditBuildLibSelector();
73         patron = fetchFleshedUser(cgi.param('usr'));
74         if(!patron) patron = uEditNewPatron(); 
75
76
77         uEditDraw( 
78                 uEditFetchIdentTypes(),
79                 uEditFetchGroups(),
80                 uEditFetchStatCats(),
81                 uEditFetchSurveys(),
82                 uEditFetchNetLevels()
83                 );
84
85         if(patron.isnew()) {
86                 if(clone) 
87                         uEditClone(clone);
88                 else 
89                         uEditCreateNewAddr();
90         }
91
92         if(!patron.isnew()) {
93                 $('ue_barcode').disabled = true;
94                 unHideMe($('ue_mark_card_lost'));
95                 unHideMe($('ue_reset_pw'));
96         }
97 }
98
99
100 /* creates a new patron object with card attached */
101 var uEditCardVirtId = -1;
102 function uEditNewPatron() {
103         var patron = new au(); 
104         patron.isnew(1);
105         patron.id(-1);
106         card = new ac();
107         card.id(uEditCardVirtId--);
108         card.isnew(1);
109         patron.card(card);
110         patron.cards([card]);
111         patron.stat_cat_entries([]);
112         patron.survey_responses([]);
113         patron.addresses([]);
114         patron.home_ou(USER.ws_ou());
115         uEditMakeRandomPw(patron);
116         return patron;
117 }
118
119 function uEditMakeRandomPw(patron) {
120         var rand  = Math.random();
121         rand = parseInt(rand * 10000) + '';
122         while(rand.length < 4) rand += '0';
123         appendClear($('ue_password_plain'),text(rand));
124         unHideMe($('ue_password_gen'));
125         patron.passwd(rand);
126         return rand;
127 }
128
129 function uEditResetPw() { 
130         var pw = uEditMakeRandomPw(patron);     
131         $('ue_password1').value = pw;
132         $('ue_password2').value = pw;
133 }
134
135 function uEditClone(clone) {
136
137         var cloneUser = fetchFleshedUser(clone);
138         patron.usrgroup(cloneUser.usrgroup());
139
140         if( cloneUser.day_phone() )
141                 $('ue_day_phone').value = cloneUser.day_phone();
142         if( cloneUser.evening_phone() )
143                 $('ue_night_phone').value = cloneUser.evening_phone();
144         if( cloneUser.other_phone() )
145                 $('ue_other_phone').value = cloneUser.other_phone();
146         setSelector($('ue_org_selector'), cloneUser.home_ou());
147
148
149         setSelector($('ue_profile'), cloneUser.profile());
150
151         /* force the expire date to be set */
152         $('ue_profile').onchange();
153
154         for( var a in cloneUser.addresses() ) {
155                 var addr = cloneUser.addresses()[a];
156                 if( addr.id() == cloneUser.mailing_address().id() )
157                         patron.mailing_address(addr);
158                 if( addr.id() == cloneUser.billing_address().id() )
159                         patron.billing_address(addr);
160                 patron.addresses().push(addr);
161         }
162
163         uEditBuildAddrs(patron);
164 }
165
166
167 /* Creates a new blank address, 
168         adds it to the user and the fields array */
169 var uEditVirtualAddrId = -1;
170 function uEditCreateNewAddr() {
171         var addr = new aua();
172         addr.id(uEditVirtualAddrId--);
173         addr.isnew(1);
174         addr.usr(patron.id());
175         addr.country(defaultCountry);
176         if(!patron.addresses()) 
177                 patron.addresses([]);
178         if(patron.addresses().length == 0) {
179                 patron.mailing_address(addr);
180                 patron.billing_address(addr);
181         }
182         uEditBuildAddrFields(patron, addr);
183         patron.addresses().push(addr);
184         uEditIterateFields(function(f) { uEditCheckValid(f); });
185         uEditCheckErrors();
186 }
187
188
189 /* kicks off the UI drawing */
190 function uEditDraw(identTypes, groups, statCats, surveys, netLevels ) {
191         hideMe($('uedit_loading'));
192         unHideMe($('ue_maintd'));
193
194         dataFields = [];
195         uEditDrawIDTypes(identTypes);
196         uEditDrawGroups(groups);
197         uEditDrawStatCats(statCats);
198         uEditDrawSurveys(surveys);
199         uEditDrawNetLevels(netLevels);
200         uEditDefineData(patron);
201
202         uEditIterateFields(function(f) { uEditActivateField(f) });
203         uEditIterateFields(function(f) { uEditCheckValid(f); });
204         uEditCheckErrors();
205 }
206
207
208 /** Applies the event handlers and sets the data for the field */
209 function uEditActivateField(field) {
210
211         if( field.widget.id ) {
212                 field.widget.node = $(field.widget.id);
213
214         } else {
215                 field.widget.node = 
216                         $n(field.widget.base, field.widget.name);
217         }
218
219         uEditSetOnchange(field);
220
221         if(field.widget.onblur) {
222                 field.widget.node.onblur = 
223                         function() { field.widget.onblur(field); };
224         }
225
226         field.widget.node.disabled = field.widget.disabled;
227         var val = field.object[field.key]();
228         if(val == null) return;
229
230         if( field.widget.type == 'input' )
231                 field.widget.node.value = val;
232
233         if( field.widget.type == 'select' )
234                 setSelector(field.widget.node, val);
235
236         if( field.widget.type == 'checkbox' )
237                 field.widget.node.checked = 
238                         (val && val != 'f') ? true : false;
239
240         if( field.widget.onload ) 
241                 field.widget.onload(val);
242
243         /*
244         alert(field.key);
245         if(field.key == 'ident_value') alert(field.widget.onblur);
246         */
247
248 }
249
250
251 /* set up the onchange event for the field */
252 function uEditSetOnchange(field) {
253         var func = function() {uEditOnChange( field );}
254         field.widget.node.onchange = func;
255
256         if(field.widget.type != 'select')
257                 field.widget.node.onkeyup = func;
258 }
259
260 /* find the current value of the field object's widget */
261 function uEditNodeVal(field) {
262         if(field.widget.type == 'input')
263                 return field.widget.node.value;
264
265         if(field.widget.type == 'checkbox')
266                 return field.widget.node.checked;
267
268         if(field.widget.type == 'select')
269                 return getSelectorVal(field.widget.node);
270 }
271
272
273 /* update a field value */
274 function uEditOnChange(field) {
275
276         var newval = uEditNodeVal(field);
277         field.object[field.key](newval);
278         field.object.ischanged(1);
279
280         if(field.widget.onpostchange)
281                 field.widget.onpostchange(field, newval);
282
283
284         uEditIterateFields(function(f) { uEditCheckValid(f); });
285         uEditCheckErrors();
286 }
287
288
289 function uEditCheckValid(field) {
290         var newval = uEditNodeVal(field);
291         if(newval) {
292
293                 if(field.widget.regex) { 
294                         if(newval.match(field.widget.regex)) 
295                                 removeCSSClass(field.widget.node, CSS_INVALID_DATA);
296                         else
297                                 addCSSClass(field.widget.node, CSS_INVALID_DATA);
298
299                 } else {
300                         removeCSSClass(field.widget.node, CSS_INVALID_DATA);
301                 }
302
303         } else {
304
305                 if(field.required) {
306                         addCSSClass(field.widget.node, CSS_INVALID_DATA);
307
308                 } else {
309                         removeCSSClass(field.widget.node, CSS_INVALID_DATA);
310                 }
311         }
312 }
313
314 /* find a field object by object key */
315 function uEditFindFieldByKey(key) {
316         var fields = grep( dataFields,
317                 function(item) { return (item.key == key); });
318         return (fields) ? fields[0] : null;
319 }
320
321 /* find a list of fields by object key */
322 function uEditFindFieldsByKey(key) {
323         return grep( dataFields,
324                 function(item) { return (item.key == key); });
325 }
326
327 /* find a field object by widget id */
328 function uEditFindFieldByWId(id) {
329         var fields = grep( dataFields,
330                 function(item) { return (item.widget.id == id); });
331         return (fields) ? fields[0] : null;
332 }
333
334
335 function uEditIterateFields(callback) {
336         for( var f in dataFields ) 
337                 callback(dataFields[f]);
338 }
339
340
341 function uEditGetErrorStrings() {
342         var errors = [];
343         uEditIterateFields(
344                 function(field) { 
345                         if(field.errkey) {
346                                 if( field.widget.node.className.indexOf(CSS_INVALID_DATA) != -1) {
347                                         var str = $(field.errkey).innerHTML;
348                                         if(str) errors.push(str);
349                                 }
350                         }
351                 }
352         );
353
354
355         /* munge up something for all of the required surveys 
356                 (which are not registered with the fields) */
357
358         /* AWAITS POLICY DECISION */
359
360         /*
361         var rows = $('ue_survey_table').getElementsByTagName('tr');
362         for( var r in rows ) {
363
364                 var row = rows[r];
365                 var sel = $n(row, 'ue_survey_answer');
366                 if(!sel) continue;
367                 var qstn = row.getAttribute('question');
368
369                 if(qstn) {
370                         qstn            = surveyQuestionsCache[qstn];
371                         survey  = surveysCache[qstn.survey()];
372                         var val = getSelectorVal(sel);
373                         if(!val && survey.required() && survey.required() != 'f')
374                                 errors.push($('ue_bad_survey').innerHTML);
375                 }
376         }
377         */
378
379         /* ------------------------------------------------------------ */
380
381         if(errors[0]) return errors;
382         return null;
383 }
384
385 function uEditAlertErrors() {
386         var errors = uEditGetErrorStrings();
387         if(!errors) return false;
388         alert(errors.join("\n"));
389         return true;
390 }
391
392
393 /* send the user to the database */
394 function uEditSaveUser(cloneme) {
395
396         if(uEditGetErrorStrings()) {
397                 uEditAlertErrors();
398                 return;
399         }
400
401         /* null is unique in the db, but '' is not */
402         if( ! patron.ident_value() ) patron.ident_value(null);
403         if( ! patron.ident_value2() ) patron.ident_value2(null);
404
405         var req = new Request(UPDATE_PATRON, SESSION, patron);
406         req.alertEvent = false;
407         req.send(true);
408         var newuser = req.result();
409
410         var evt;
411         if( (evt = checkILSEvent(newuser)) || ! newuser ) {
412                 if(evt) alert(js2JSON(newuser));
413                 return;
414
415         } else {
416                 
417                 /* if it's a new user and a guardian note was created for this user,
418                         create the note after we have the new user's id */
419                 if( guardianNote ) {
420                         guardianNote.usr( newuser.id() );
421                         var req = new Request(CREATE_USER_NOTE, SESSION, guardianNote);
422                         req.alertEvent = false;
423                         req.send(true);
424                         var resp = req.result();
425                         if( checkILSEvent(resp) ) {
426                                 alertILSEvent(resp, 
427                                         "Error creating patron guardian/parent note");
428                                 return;
429                         }
430                 }
431
432                 alert($('ue_success').innerHTML);
433         }
434
435         if(cloneme) {
436                 /* if the user we just created was a clone, and we want to clone it,
437                 we really want to clone the original */
438                 if( clone ) cloneme = clone;
439                 else cloneme = newuser.id();
440         }
441
442         if (window.xulG && typeof window.xulG.on_save == 'function') {
443                 window.xulG.on_save(newuser, cloneme); 
444
445         } else {
446
447                 var href = location.href;
448
449                 href = href.replace(/\&?usr=\d+/, '');
450                 href = href.replace(/\&?clone=\d+/, '');
451
452                 if( cloneme ) href += '&clone=' + cloneme;
453                 location.href = href;
454         }
455 }
456
457 function uEditCancel() {
458         var href = location.href;
459         href = href.replace(/\&?usr=\d+/, '');
460         href = href.replace(/\&?clone=\d+/, '');
461         location.href = href;
462 }
463
464
465 var uEditDupHashes = {};
466 var uEditDupTemplate;
467
468 function uEditRunDupeSearch(type, search_hash) {
469
470         if(!patron.isnew()) return;
471
472         _debug('dup search: ' + js2JSON(search_hash));
473
474         var req = new Request(PATRON_SEARCH, SESSION, search_hash);
475
476         var container = $('dup_div_container');
477         if(!uEditDupTemplate)
478                 uEditDupTemplate = container.removeChild($('dup_div'));
479
480         /* clear any existing dups for this type */
481         iterate( container.getElementsByTagName('div'),
482                 function(d) {
483                         if( d.getAttribute('type') == type ) {
484                                 container.removeChild(d)
485                                 return;
486                         }
487                 }
488         );
489
490         req.callback(
491                 function(r) {
492                         uEditHandleDupResults( r.getResultObject(), search_hash, type, container );
493                 }
494         );
495         req.send();
496 }
497
498
499 function uEditHandleDupResults(ids, search_hash, type, container) {
500
501         _debug('dup search results: ' + js2JSON(ids));
502
503         if(!(ids && ids[0]))  /* no results */
504                 return uEditDupHashes[type] = null;
505
506         /* add a dup link to the UI and plug in the data */
507         var node = uEditDupTemplate.cloneNode(true);
508         container.appendChild(node);
509         node.setAttribute('type', type);
510
511         var link = $n(node, 'link');
512         link.setAttribute('type', type);
513         unHideMe(link);
514         $n(node,'count').appendChild(text(ids.length));
515
516         for( var o in search_hash ) 
517                 $n(node, 'data').appendChild(
518                         text(search_hash[o].value + ' '));
519
520         uEditDupHashes[type] = search_hash;
521
522         switch(type) {
523                 case 'ident' :
524                         if(confirm($('ue_dup_ident1').innerHTML)) 
525                                 uEditShowSearch(null, type);
526                         break;
527         }
528 }
529
530
531 function uEditShowSearch(link,type) {
532         if(!type) type = link.getAttribute('type');
533         if(window.xulG)
534                 window.xulG.spawn_search(uEditDupHashes[type]); 
535         else alert('Search would be:\n' + js2JSON(uEditDupHashes[type]));
536 }
537
538 function uEditMarkCardLost() {
539
540         for( var c in patron.cards() ) {
541
542                 var card = patron.cards()[c];
543                 if( patron.card().id() == card.id() ) {
544
545                         /* de-activite the current card */
546                         card.ischanged(1);
547                         card.active(0);
548
549                         /* create a new card for the patron */
550                         var newcard = new ac();
551                         newcard.id(uEditCardVirtId--);
552                         newcard.isnew(1);
553                         patron.card(newcard);
554                         patron.cards().push(newcard);
555
556
557                         /* reset the widget */
558                         var field = uEditFindFieldByWId('ue_barcode');
559                         field.widget.node.disabled = false;
560                         field.widget.node.value = "";
561                         field.widget.node.onchange();
562                         field.object = newcard;
563                 }
564         }
565 }
566
567
568 function compactArray(arr) {
569         var a = [];
570         for( var i = 0; arr && i < arr.length; i++ ) {
571                 if( arr[i] != null )
572                         a.push(arr[i]);
573         }
574         return a;
575 }