]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/patron/ue.js
added a 'Mark Lost' button for the patron card and wired it up
[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         if(!patron.isnew()) {
82                 $('ue_barcode').disabled = true;
83                 unHideMe($('ue_mark_card_lost'));
84         }
85 }
86
87
88 /* creates a new patron object with card attached */
89 var uEditCardVirtId = -1;
90 function uEditNewPatron() {
91         var patron = new au(); 
92         patron.isnew(1);
93         patron.id(-1);
94         card = new ac();
95         card.id(uEditCardVirtId--);
96         card.isnew(1);
97         patron.card(card);
98         patron.cards([card]);
99         patron.stat_cat_entries([]);
100         patron.survey_responses([]);
101         patron.addresses([]);
102         patron.home_ou(USER.ws_ou());
103         var rand  = Math.random();
104         rand = parseInt(rand * 10000) + '';
105         while(rand.length < 4) rand += '0';
106         patron.passwd(rand);
107         $('ue_password_plain').appendChild(text(rand));
108         unHideMe($('ue_password_gen'));
109         return patron;
110 }
111
112
113 function uEditClone(clone) {
114
115         var cloneUser = fetchFleshedUser(clone);
116         patron.usrgroup(cloneUser.usrgroup());
117
118         if( cloneUser.day_phone() )
119                 $('ue_day_phone').value = cloneUser.day_phone();
120         if( cloneUser.evening_phone() )
121                 $('ue_night_phone').value = cloneUser.evening_phone();
122         if( cloneUser.other_phone() )
123                 $('ue_other_phone').value = cloneUser.other_phone();
124         setSelector($('ue_org_selector'), cloneUser.home_ou());
125
126
127         setSelector($('ue_profile'), cloneUser.profile());
128
129         /* force the expire date to be set */
130         $('ue_profile').onchange();
131
132         for( var a in cloneUser.addresses() ) {
133                 var addr = cloneUser.addresses()[a];
134                 if( addr.id() == cloneUser.mailing_address().id() )
135                         patron.mailing_address(addr);
136                 if( addr.id() == cloneUser.billing_address().id() )
137                         patron.billing_address(addr);
138                 patron.addresses().push(addr);
139         }
140
141         uEditBuildAddrs(patron);
142 }
143
144
145 /* Creates a new blank address, 
146         adds it to the user and the fields array */
147 var uEditVirtualAddrId = -1;
148 function uEditCreateNewAddr() {
149         var addr = new aua();
150         addr.id(uEditVirtualAddrId--);
151         addr.isnew(1);
152         addr.usr(patron.id());
153         addr.country(defaultCountry);
154         if(patron.addresses().length == 0) {
155                 patron.mailing_address(addr);
156                 patron.billing_address(addr);
157         }
158         uEditBuildAddrFields(patron, addr);
159         patron.addresses().push(addr);
160         uEditIterateFields(function(f) { uEditCheckValid(f); });
161         uEditCheckErrors();
162 }
163
164
165 /* kicks off the UI drawing */
166 function uEditDraw(identTypes, groups, statCats, surveys ) {
167         hideMe($('uedit_loading'));
168         unHideMe($('ue_maintd'));
169
170         dataFields = [];
171         uEditDrawIDTypes(identTypes);
172         uEditDrawGroups(groups);
173         uEditDrawStatCats(statCats);
174         uEditDrawSurveys(surveys);
175         uEditDefineData(patron);
176
177         uEditIterateFields(function(f) { uEditActivateField(f) });
178         uEditIterateFields(function(f) { uEditCheckValid(f); });
179         uEditCheckErrors();
180 }
181
182
183 /** Applies the event handlers and sets the data for the field */
184 function uEditActivateField(field) {
185
186         if( field.widget.id ) {
187                 field.widget.node = $(field.widget.id);
188
189         } else {
190                 field.widget.node = 
191                         $n(field.widget.base, field.widget.name);
192         }
193
194         uEditSetOnchange(field);
195
196         if(field.widget.onblur) {
197                 field.widget.node.onblur = 
198                         function() { field.widget.onblur(field); };
199         }
200
201         field.widget.node.disabled = field.widget.disabled;
202         var val = field.object[field.key]();
203         if(val == null) return;
204
205         if( field.widget.type == 'input' )
206                 field.widget.node.value = val;
207
208         if( field.widget.type == 'select' )
209                 setSelector(field.widget.node, val);
210
211         if( field.widget.type == 'checkbox' )
212                 field.widget.node.checked = 
213                         (val && val != 'f') ? true : false;
214
215         if( field.widget.onload ) 
216                 field.widget.onload(val);
217
218         /*
219         alert(field.key);
220         if(field.key == 'ident_value') alert(field.widget.onblur);
221         */
222
223 }
224
225
226 /* set up the onchange event for the field */
227 function uEditSetOnchange(field) {
228         var func = function() {uEditOnChange( field );}
229         field.widget.node.onchange = func;
230
231         if(field.widget.type != 'select')
232                 field.widget.node.onkeyup = func;
233 }
234
235 /* find the current value of the field object's widget */
236 function uEditNodeVal(field) {
237         if(field.widget.type == 'input')
238                 return field.widget.node.value;
239
240         if(field.widget.type == 'checkbox')
241                 return field.widget.node.checked;
242
243         if(field.widget.type == 'select')
244                 return getSelectorVal(field.widget.node);
245 }
246
247
248 /* update a field value */
249 function uEditOnChange(field) {
250
251         var newval = uEditNodeVal(field);
252         field.object[field.key](newval);
253         field.object.ischanged(1);
254
255         if(field.widget.onpostchange)
256                 field.widget.onpostchange(field, newval);
257
258
259         uEditIterateFields(function(f) { uEditCheckValid(f); });
260         uEditCheckErrors();
261 }
262
263
264 function uEditCheckValid(field) {
265         var newval = uEditNodeVal(field);
266         if(newval) {
267
268                 if(field.widget.regex) { 
269                         if(newval.match(field.widget.regex)) 
270                                 removeCSSClass(field.widget.node, CSS_INVALID_DATA);
271                         else
272                                 addCSSClass(field.widget.node, CSS_INVALID_DATA);
273
274                 } else {
275                         removeCSSClass(field.widget.node, CSS_INVALID_DATA);
276                 }
277
278         } else {
279
280                 if(field.required) {
281                         addCSSClass(field.widget.node, CSS_INVALID_DATA);
282
283                 } else {
284                         removeCSSClass(field.widget.node, CSS_INVALID_DATA);
285                 }
286         }
287 }
288
289 /* find a field object by object key */
290 function uEditFindFieldByKey(key) {
291         var fields = grep( dataFields,
292                 function(item) { return (item.key == key); });
293         return (fields) ? fields[0] : null;
294 }
295
296 /* find a list of fields by object key */
297 function uEditFindFieldsByKey(key) {
298         return grep( dataFields,
299                 function(item) { return (item.key == key); });
300 }
301
302 /* find a field object by widget id */
303 function uEditFindFieldByWId(id) {
304         var fields = grep( dataFields,
305                 function(item) { return (item.widget.id == id); });
306         return (fields) ? fields[0] : null;
307 }
308
309
310 function uEditIterateFields(callback) {
311         for( var f in dataFields ) {
312                 callback(dataFields[f]);
313         }
314 }
315
316
317 function uEditGetErrorStrings() {
318         var errors = [];
319         uEditIterateFields(
320                 function(field) { 
321                         if(field.errkey) {
322                                 if( field.widget.node.className.indexOf(CSS_INVALID_DATA) != -1) {
323                                         var str = $(field.errkey).innerHTML;
324                                         if(str) errors.push(str);
325                                 }
326                         }
327                 }
328         );
329
330         if(errors[0]) return errors;
331         return null;
332 }
333
334 function uEditAlertErrors() {
335         var errors = uEditGetErrorStrings();
336         if(!errors) return false;
337         alert(errors.join("\n"));
338         return true;
339 }
340
341
342 /* send the user to the database */
343 function uEditSaveUser(cloneme) {
344
345         if(uEditGetErrorStrings()) {
346                 uEditAlertErrors();
347                 return;
348         }
349
350         /* null is unique in the db, but '' is not */
351         if( ! patron.ident_value() ) patron.ident_value(null);
352         if( ! patron.ident_value2() ) patron.ident_value2(null);
353
354         var req = new Request(UPDATE_PATRON, SESSION, patron);
355         req.send(true);
356         var newuser = req.result();
357
358         if( checkILSEvent(newuser) ) 
359                 alert(js2JSON(newuser));
360         else 
361                 alert($('ue_success').innerHTML);
362
363         if(cloneme) {
364                 /* if the user we just created was a clone, and we want to clone it,
365                 we really want to clone the original */
366                 if( clone ) cloneme = clone;
367                 else cloneme = newuser.id();
368         }
369
370         if (window.xulG && typeof window.xulG.on_save == 'function') {
371                 window.xulG.on_save(newuser, cloneme); 
372
373         } else {
374
375                 var href = location.href;
376
377                 href = href.replace(/\&?usr=\d+/, '');
378                 href = href.replace(/\&?clone=\d+/, '');
379
380                 if( cloneme ) href += '&clone=' + cloneme;
381                 location.href = href;
382         }
383 }
384
385
386 var uEditDupHashes = {};
387 var uEditDupTemplate;
388
389 function uEditRunDupeSearch(type, search_hash) {
390
391         if(!patron.isnew()) return;
392
393         _debug('dup search: ' + js2JSON(search_hash));
394
395         var req = new Request(PATRON_SEARCH, SESSION, search_hash);
396
397         var container = $('dup_div_container');
398         if(!uEditDupTemplate)
399                 uEditDupTemplate = container.removeChild($('dup_div'));
400
401         /* clear any existing dups for this type */
402         iterate( container.getElementsByTagName('div'),
403                 function(d) {
404                         if( d.getAttribute('type') == type ) {
405                                 container.removeChild(d)
406                                 return;
407                         }
408                 }
409         );
410
411         /*req.callback(uEditHandleDupResults);*/
412         req.callback(
413                 function(r) {
414                         uEditHandleDupResults( r.getResultObject(), search_hash, type, container );
415                 }
416         );
417         req.send();
418 }
419
420
421 function uEditHandleDupResults(ids, search_hash, type, container) {
422
423         _debug('dup search results: ' + js2JSON(ids));
424
425         if(!(ids && ids[0]))  /* no results */
426                 return uEditDupHashes[type] = null;
427
428         /* add a dup link to the UI and plug in the data */
429         var node = uEditDupTemplate.cloneNode(true);
430         container.appendChild(node);
431         node.setAttribute('type', type);
432
433         var link = $n(node, 'link');
434         link.setAttribute('type', type);
435         unHideMe(link);
436         $n(node,'count').appendChild(text(ids.length));
437
438         for( var o in search_hash ) 
439                 $n(node, 'data').appendChild(
440                         text(search_hash[o].value + ' '));
441
442         uEditDupHashes[type] = search_hash;
443
444         switch(type) {
445                 case 'ident1' :
446                         if(confirm($('ue_dup_ident1').innerHTML)) 
447                                 uEditShowSearch(type);
448                         break;
449         }
450 }
451
452
453 function uEditShowSearch(link) {
454         var type = link.getAttribute('type');
455         if(window.xulG)
456                 window.xulG.spawn_search(uEditDupHashes[type]); 
457         else alert('Search would be:\n' + js2JSON(uEditDupHashes[type]));
458 }
459
460 function uEditMarkCardLost() {
461
462         for( var c in patron.cards() ) {
463
464                 var card = patron.cards()[c];
465                 if( patron.card().id() == card.id() ) {
466
467                         /* de-activite the current card */
468                         card.ischanged(1);
469                         card.active(0);
470
471                         /* create a new card for the patron */
472                         var newcard = new ac();
473                         newcard.id(uEditCardVirtId--);
474                         newcard.isnew(1);
475                         patron.card(newcard);
476                         patron.cards().push(newcard);
477
478
479                         /* reset the widget */
480                         var field = uEditFindFieldByWId('ue_barcode');
481                         field.widget.node.disabled = false;
482                         field.widget.node.value = "";
483                         field.widget.node.onchange();
484                         field.object = newcard;
485                 }
486         }
487 }
488
489