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