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