5 var identTypesCache = {};
6 var statCatsCache = {};
8 var surveyQuestionsCache = {};
9 var surveyAnswersCache = {};
14 /* fetch the necessary data to start off */
15 function uEditInit() {
18 session = cgi.param('ses');
19 clone = cgi.param('clone');
20 if(!session) throw "User session is not defined";
23 $('uedit_user').appendChild(text(USER.usrname()));
25 setTimeout( function() {
26 uEditBuild(); uEditShowPage('uedit_userid'); }, 20 );
29 /* ------------------------------------------------------------------------------ */
31 /* ------------------------------------------------------------------------------ */
32 function uEditFetchIdentTypes() {
33 var req = new Request(FETCH_ID_TYPES);
38 function uEditFetchStatCats() {
39 var req = new Request(SC_FETCH_ALL, SESSION);
44 function uEditFetchSurveys() {
45 var req = new Request(SV_FETCH_ALL, SESSION);
50 function uEditFetchGroups() {
51 var req = new Request(FETCH_GROUPS);
55 /* ------------------------------------------------------------------------------ */
59 /* fetches necessary and builds the UI */
60 function uEditBuild() {
61 //fetchHighestPermOrgs( SESSION, USER.id(), myPerms );
63 uEditBuildLibSelector();
64 patron = fetchFleshedUser(cgi.param('usr'));
65 if(!patron) patron = uEditNewPatron();
69 uEditFetchIdentTypes(),
72 uEditFetchSurveys() );
83 /* creates a new patron object with card attached */
84 function uEditNewPatron() {
85 var patron = new au();
93 patron.stat_cat_entries([]);
94 patron.survey_responses([]);
96 patron.home_ou(USER.ws_ou());
97 var rand = Math.random();
98 rand = parseInt(rand * 10000) + '';
99 while(rand.length < 4) rand += '0';
101 $('ue_password_plain').appendChild(text(rand));
102 unHideMe($('ue_password_gen'));
107 function uEditClone(clone) {
109 var cloneUser = fetchFleshedUser(clone);
110 patron.usrgroup(cloneUser.usrgroup());
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());
121 setSelector($('ue_profile'), cloneUser.profile());
123 /* force the expire date to be set */
124 $('ue_profile').onchange();
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);
135 uEditBuildAddrs(patron);
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--);
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);
152 uEditBuildAddrFields(patron, addr);
153 patron.addresses().push(addr);
154 uEditIterateFields(function(f) { uEditCheckValid(f); });
159 /* kicks off the UI drawing */
160 function uEditDraw(identTypes, groups, statCats, surveys ) {
161 hideMe($('uedit_loading'));
162 unHideMe($('ue_maintd'));
165 uEditDrawIDTypes(identTypes);
166 uEditDrawGroups(groups);
167 uEditDrawStatCats(statCats);
168 uEditDrawSurveys(surveys);
169 uEditDefineData(patron);
171 uEditIterateFields(function(f) { uEditActivateField(f) });
172 uEditIterateFields(function(f) { uEditCheckValid(f); });
177 /** Applies the event handlers and sets the data for the field */
178 function uEditActivateField(field) {
180 if( field.widget.id ) {
181 field.widget.node = $(field.widget.id);
185 $n(field.widget.base, field.widget.name);
188 uEditSetOnchange(field);
190 if(field.widget.onblur) {
191 field.widget.node.onblur =
192 function() { field.widget.onblur(field); };
195 field.widget.node.disabled = field.widget.disabled;
196 var val = field.object[field.key]();
197 if(val == null) return;
199 if( field.widget.type == 'input' )
200 field.widget.node.value = val;
202 if( field.widget.type == 'select' )
203 setSelector(field.widget.node, val);
205 if( field.widget.type == 'checkbox' )
206 field.widget.node.checked =
207 (val && val != 'f') ? true : false;
209 if( field.widget.onload )
210 field.widget.onload(val);
214 if(field.key == 'ident_value') alert(field.widget.onblur);
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;
225 if(field.widget.type != 'select')
226 field.widget.node.onkeyup = func;
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;
234 if(field.widget.type == 'checkbox')
235 return field.widget.node.checked;
237 if(field.widget.type == 'select')
238 return getSelectorVal(field.widget.node);
242 /* update a field value */
243 function uEditOnChange(field) {
245 var newval = uEditNodeVal(field);
246 field.object[field.key](newval);
247 field.object.ischanged(1);
249 if(field.widget.onpostchange)
250 field.widget.onpostchange(field, newval);
253 uEditIterateFields(function(f) { uEditCheckValid(f); });
258 function uEditCheckValid(field) {
259 var newval = uEditNodeVal(field);
262 if(field.widget.regex) {
263 if(newval.match(field.widget.regex))
264 removeCSSClass(field.widget.node, CSS_INVALID_DATA);
266 addCSSClass(field.widget.node, CSS_INVALID_DATA);
269 removeCSSClass(field.widget.node, CSS_INVALID_DATA);
275 addCSSClass(field.widget.node, CSS_INVALID_DATA);
278 removeCSSClass(field.widget.node, CSS_INVALID_DATA);
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;
290 /* find a list of fields by object key */
291 function uEditFindFieldsByKey(key) {
292 return grep( dataFields,
293 function(item) { return (item.key == key); });
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;
304 function uEditIterateFields(callback) {
305 for( var f in dataFields ) {
306 callback(dataFields[f]);
311 function uEditGetErrorStrings() {
316 if( field.widget.node.className.indexOf(CSS_INVALID_DATA) != -1) {
317 var str = $(field.errkey).innerHTML;
318 if(str) errors.push(str);
324 if(errors[0]) return errors;
328 function uEditAlertErrors() {
329 var errors = uEditGetErrorStrings();
330 if(!errors) return false;
331 alert(errors.join("\n"));
336 /* send the user to the database */
337 function uEditSaveUser(clone) {
339 if(uEditGetErrorStrings()) {
344 var req = new Request(UPDATE_PATRON, SESSION, patron);
346 var newuser = req.result();
348 if( checkILSEvent(newuser) )
349 alert(js2JSON(newuser));
351 alert($('ue_success').innerHTML);
353 if(clone) clone = newuser.id();
355 if (window.xulG && typeof window.xulG.on_save == 'function') {
356 window.xulG.on_save(newuser, clone);
360 var href = location.href;
362 href = href.replace(/\&?usr=\d+/, '');
363 href += '&clone=' + clone;
365 location.href = href;
370 var uEditDupHashes = {};
371 var uEditDupTemplate;
373 function uEditRunDupeSearch(type, search_hash) {
375 if(!patron.isnew()) return;
377 _debug('dup search: ' + js2JSON(search_hash));
379 var req = new Request(PATRON_SEARCH, SESSION, search_hash);
381 var container = $('dup_div_container');
382 if(!uEditDupTemplate)
383 uEditDupTemplate = container.removeChild($('dup_div'));
385 /* clear any existing dups for this type */
386 iterate( container.getElementsByTagName('div'),
388 if( d.getAttribute('type') == type ) {
389 container.removeChild(d)
395 /*req.callback(uEditHandleDupResults);*/
398 uEditHandleDupResults( r.getResultObject(), search_hash, type, container );
405 function uEditHandleDupResults(ids, search_hash, type, container) {
407 _debug('dup search results: ' + js2JSON(ids));
409 if(!(ids && ids[0])) /* no results */
410 return uEditDupHashes[type] = null;
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);
417 var link = $n(node, 'link');
418 link.setAttribute('type', type);
420 $n(node,'count').appendChild(text(ids.length));
422 for( var o in search_hash )
423 $n(node, 'data').appendChild(
424 text(search_hash[o].value + ' '));
426 uEditDupHashes[type] = search_hash;
430 if(confirm($('ue_dup_ident1').innerHTML))
431 uEditShowSearch(type);
437 function uEditShowSearch(link) {
438 var type = link.getAttribute('type');
440 window.xulG.spawn_search(uEditDupHashes[type]);
441 else alert('Search would be:\n' + js2JSON(uEditDupHashes[type]));