5 var identTypesCache = {};
6 var statCatsCache = {};
8 var surveyQuestionsCache = {};
9 var surveyAnswersCache = {};
12 var netLevelsCache = {};
13 var guardianNote = null;
16 /* fetch the necessary data to start off */
17 function uEditInit() {
20 session = cgi.param('ses');
21 clone = cgi.param('clone');
22 if(!session) throw "User session is not defined";
25 $('uedit_user').appendChild(text(USER.usrname()));
27 setTimeout( function() {
28 uEditBuild(); uEditShowPage('uedit_userid'); }, 20 );
31 /* ------------------------------------------------------------------------------ */
33 /* ------------------------------------------------------------------------------ */
34 function uEditFetchIdentTypes() {
35 var req = new Request(FETCH_ID_TYPES);
40 function uEditFetchStatCats() {
41 var req = new Request(SC_FETCH_ALL, SESSION);
46 function uEditFetchSurveys() {
47 var req = new Request(SV_FETCH_ALL, SESSION);
52 function uEditFetchGroups() {
53 var req = new Request(FETCH_GROUPS);
58 function uEditFetchNetLevels() {
59 var req = new Request(FETCH_NET_LEVELS, SESSION);
64 /* ------------------------------------------------------------------------------ */
68 /* fetches necessary and builds the UI */
69 function uEditBuild() {
70 fetchHighestPermOrgs( SESSION, USER.id(), myPerms );
72 uEditBuildLibSelector();
73 patron = fetchFleshedUser(cgi.param('usr'));
74 if(!patron) patron = uEditNewPatron();
78 uEditFetchIdentTypes(),
93 $('ue_barcode').disabled = true;
94 unHideMe($('ue_mark_card_lost'));
95 unHideMe($('ue_reset_pw'));
98 if(PERMS['BAR_PATRON'] == -1)
99 $('ue_barred').disabled = true;
103 /* creates a new patron object with card attached */
104 var uEditCardVirtId = -1;
105 function uEditNewPatron() {
106 var patron = new au();
110 card.id(uEditCardVirtId--);
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);
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'));
132 function uEditResetPw() {
133 var pw = uEditMakeRandomPw(patron);
134 $('ue_password1').value = pw;
135 $('ue_password2').value = pw;
138 function uEditClone(clone) {
140 var cloneUser = fetchFleshedUser(clone);
141 patron.usrgroup(cloneUser.usrgroup());
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());
152 setSelector($('ue_profile'), cloneUser.profile());
154 /* force the expire date to be set */
155 $('ue_profile').onchange();
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);
166 uEditBuildAddrs(patron);
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--);
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);
185 uEditBuildAddrFields(patron, addr);
186 patron.addresses().push(addr);
187 uEditIterateFields(function(f) { uEditCheckValid(f); });
192 /* kicks off the UI drawing */
193 function uEditDraw(identTypes, groups, statCats, surveys, netLevels ) {
194 hideMe($('uedit_loading'));
195 unHideMe($('ue_maintd'));
198 uEditDrawIDTypes(identTypes);
199 uEditDrawGroups(groups);
200 uEditDrawStatCats(statCats);
201 uEditDrawSurveys(surveys);
202 uEditDrawNetLevels(netLevels);
203 uEditDefineData(patron);
205 uEditIterateFields(function(f) { uEditActivateField(f) });
206 uEditIterateFields(function(f) { uEditCheckValid(f); });
211 /** Applies the event handlers and sets the data for the field */
212 function uEditActivateField(field) {
214 if( field.widget.id ) {
215 field.widget.node = $(field.widget.id);
219 $n(field.widget.base, field.widget.name);
222 uEditSetOnchange(field);
224 if(field.widget.onblur) {
225 field.widget.node.onblur =
226 function() { field.widget.onblur(field); };
229 field.widget.node.disabled = field.widget.disabled;
230 var val = field.object[field.key]();
231 if(val == null) return;
233 if( field.widget.type == 'input' )
234 field.widget.node.value = val;
236 if( field.widget.type == 'select' )
237 setSelector(field.widget.node, val);
239 if( field.widget.type == 'checkbox' )
240 field.widget.node.checked =
241 (val && val != 'f') ? true : false;
243 if( field.widget.onload )
244 field.widget.onload(val);
248 if(field.key == 'ident_value') alert(field.widget.onblur);
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;
259 if(field.widget.type != 'select')
260 field.widget.node.onkeyup = func;
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;
268 if(field.widget.type == 'checkbox')
269 return field.widget.node.checked;
271 if(field.widget.type == 'select')
272 return getSelectorVal(field.widget.node);
276 /* update a field value */
277 function uEditOnChange(field) {
279 var newval = uEditNodeVal(field);
280 field.object[field.key](newval);
281 field.object.ischanged(1);
283 if(field.widget.onpostchange)
284 field.widget.onpostchange(field, newval);
287 uEditIterateFields(function(f) { uEditCheckValid(f); });
292 function uEditCheckValid(field) {
293 var newval = uEditNodeVal(field);
296 if(field.widget.regex) {
297 if(newval.match(field.widget.regex))
298 removeCSSClass(field.widget.node, CSS_INVALID_DATA);
300 addCSSClass(field.widget.node, CSS_INVALID_DATA);
303 removeCSSClass(field.widget.node, CSS_INVALID_DATA);
309 addCSSClass(field.widget.node, CSS_INVALID_DATA);
312 removeCSSClass(field.widget.node, CSS_INVALID_DATA);
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;
324 /* find a list of fields by object key */
325 function uEditFindFieldsByKey(key) {
326 return grep( dataFields,
327 function(item) { return (item.key == key); });
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;
338 function uEditIterateFields(callback) {
339 for( var f in dataFields )
340 callback(dataFields[f]);
344 function uEditGetErrorStrings() {
349 if( field.widget.node.className.indexOf(CSS_INVALID_DATA) != -1) {
350 var str = $(field.errkey).innerHTML;
351 if(str) errors.push(str);
358 /* munge up something for all of the required surveys
359 (which are not registered with the fields) */
361 /* AWAITS POLICY DECISION */
364 var rows = $('ue_survey_table').getElementsByTagName('tr');
365 for( var r in rows ) {
368 var sel = $n(row, 'ue_survey_answer');
370 var qstn = row.getAttribute('question');
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);
382 /* ------------------------------------------------------------ */
384 if(errors[0]) return errors;
388 function uEditAlertErrors() {
389 var errors = uEditGetErrorStrings();
390 if(!errors) return false;
391 alert(errors.join("\n"));
396 /* send the user to the database */
397 function uEditSaveUser(cloneme) {
399 if(uEditGetErrorStrings()) {
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);
408 var req = new Request(UPDATE_PATRON, SESSION, patron);
409 req.alertEvent = false;
411 var newuser = req.result();
414 if( (evt = checkILSEvent(newuser)) || ! newuser ) {
415 if(evt) alert(js2JSON(newuser));
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 */
423 guardianNote.usr( newuser.id() );
424 var req = new Request(CREATE_USER_NOTE, SESSION, guardianNote);
425 req.alertEvent = false;
427 var resp = req.result();
428 if( checkILSEvent(resp) ) {
430 "Error creating patron guardian/parent note");
435 alert($('ue_success').innerHTML);
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();
445 if (window.xulG && typeof window.xulG.on_save == 'function') {
446 window.xulG.on_save(newuser, cloneme);
450 var href = location.href;
452 href = href.replace(/\&?usr=\d+/, '');
453 href = href.replace(/\&?clone=\d+/, '');
455 if( cloneme ) href += '&clone=' + cloneme;
456 location.href = href;
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;
471 var uEditDupHashes = {};
472 var uEditDupTemplate;
474 function uEditRunDupeSearch(type, search_hash) {
476 if(!patron.isnew()) return;
478 _debug('dup search: ' + js2JSON(search_hash));
480 var req = new Request(PATRON_SEARCH, SESSION, search_hash);
482 var container = $('dup_div_container');
483 if(!uEditDupTemplate)
484 uEditDupTemplate = container.removeChild($('dup_div'));
486 /* clear any existing dups for this type */
487 iterate( container.getElementsByTagName('div'),
489 if( d.getAttribute('type') == type ) {
490 container.removeChild(d)
498 uEditHandleDupResults( r.getResultObject(), search_hash, type, container );
505 function uEditHandleDupResults(ids, search_hash, type, container) {
507 _debug('dup search results: ' + js2JSON(ids));
509 if(!(ids && ids[0])) /* no results */
510 return uEditDupHashes[type] = null;
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);
517 var link = $n(node, 'link');
518 link.setAttribute('type', type);
520 $n(node,'count').appendChild(text(ids.length));
522 for( var o in search_hash )
523 $n(node, 'data').appendChild(
524 text(search_hash[o].value + ' '));
526 uEditDupHashes[type] = search_hash;
530 if(confirm($('ue_dup_ident1').innerHTML))
531 uEditShowSearch(null, type);
537 function uEditShowSearch(link,type) {
538 if(!type) type = link.getAttribute('type');
540 window.xulG.spawn_search(uEditDupHashes[type]);
541 else alert('Search would be:\n' + js2JSON(uEditDupHashes[type]));
544 function uEditMarkCardLost() {
546 for( var c in patron.cards() ) {
548 var card = patron.cards()[c];
549 if( patron.card().id() == card.id() ) {
551 /* de-activite the current card */
555 /* create a new card for the patron */
556 var newcard = new ac();
557 newcard.id(uEditCardVirtId--);
559 patron.card(newcard);
560 patron.cards().push(newcard);
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;
574 function compactArray(arr) {
576 for( var i = 0; arr && i < arr.length; i++ ) {