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