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