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';
16 var identTypesCache = {};
17 var statCatsCache = {};
18 var surveysCache = {};
19 var surveyQuestionsCache = {};
20 var surveyAnswersCache = {};
24 /* fetch the necessary data to start off */
25 function uEditInit() {
28 session = cgi.param('ses');
29 clone = cgi.param('clone');
30 if(!session) throw "User session is not defined";
33 $('uedit_user').appendChild(text(USER.usrname()));
35 setTimeout( function() { uEditBuild(); uEditShowPage('uedit_userid'); }, 20 );
38 /* ------------------------------------------------------------------------------ */
40 /* ------------------------------------------------------------------------------ */
41 function uEditFetchIdentTypes() {
42 var req = new Request(FETCH_ID_TYPES);
47 function uEditFetchStatCats() {
48 var req = new Request(SC_FETCH_ALL, SESSION);
53 function uEditFetchSurveys() {
54 var req = new Request(SV_FETCH_ALL, SESSION);
59 function uEditFetchGroups() {
60 var req = new Request(FETCH_GROUPS);
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(),
81 uEditFetchSurveys() );
92 /* creates a new patron object with card attached */
93 function uEditNewPatron() {
94 var patron = new au();
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 );
109 $('ue_password_plain').appendChild(text(rand));
110 unHideMe($('ue_password_gen'));
115 function uEditClone(clone) {
117 var cloneUser = fetchFleshedUser(clone);
118 patron.usrgroup(cloneUser.usrgroup());
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());
129 setSelector($('ue_profile'), cloneUser.profile());
131 /* force the expire date to be set */
132 $('ue_profile').onchange();
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);
143 uEditBuildAddrs(patron);
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--);
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);
160 uEditBuildAddrFields(patron, addr);
161 patron.addresses().push(addr);
162 uEditIterateFields(function(f) { uEditCheckValid(f); });
167 /* kicks off the UI drawing */
168 function uEditDraw(identTypes, groups, statCats, surveys ) {
169 hideMe($('uedit_loading'));
170 unHideMe($('ue_maintd'));
173 uEditDrawIDTypes(identTypes);
174 uEditDrawGroups(groups);
175 uEditDrawStatCats(statCats);
176 uEditDrawSurveys(surveys);
177 uEditDefineData(patron);
179 uEditIterateFields(function(f) { uEditActivateField(f) });
180 uEditIterateFields(function(f) { uEditCheckValid(f); });
185 /** Applies the event handlers and sets the data for the field */
186 function uEditActivateField(field) {
188 if( field.widget.id ) {
189 field.widget.node = $(field.widget.id);
193 $n(field.widget.base, field.widget.name);
196 uEditSetOnchange(field);
198 if(field.widget.onblur) {
199 field.widget.node.onblur =
200 function() { field.widget.onblur(field); };
203 var val = field.object[field.key]();
204 if(val == null) return;
206 if( field.widget.type == 'input' )
207 field.widget.node.value = val;
209 if( field.widget.type == 'select' )
210 setSelector(field.widget.node, val);
212 if( field.widget.type == 'checkbox' )
213 field.widget.node.checked =
214 (val && val != 'f') ? true : false;
216 if( field.widget.onload )
217 field.widget.onload(val);
221 if(field.key == 'ident_value') alert(field.widget.onblur);
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;
232 if(field.widget.type != 'select')
233 field.widget.node.onkeyup = func;
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;
241 if(field.widget.type == 'checkbox')
242 return field.widget.node.checked;
244 if(field.widget.type == 'select')
245 return getSelectorVal(field.widget.node);
249 /* update a field value */
250 function uEditOnChange(field) {
252 var newval = uEditNodeVal(field);
253 field.object[field.key](newval);
254 field.object.ischanged(1);
256 if(field.widget.onpostchange)
257 field.widget.onpostchange(field, newval);
260 uEditIterateFields(function(f) { uEditCheckValid(f); });
265 function uEditCheckValid(field) {
266 var newval = uEditNodeVal(field);
269 if(field.widget.regex) {
270 if(newval.match(field.widget.regex))
271 removeCSSClass(field.widget.node, CSS_INVALID_DATA);
273 addCSSClass(field.widget.node, CSS_INVALID_DATA);
276 removeCSSClass(field.widget.node, CSS_INVALID_DATA);
282 addCSSClass(field.widget.node, CSS_INVALID_DATA);
285 removeCSSClass(field.widget.node, CSS_INVALID_DATA);
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;
297 /* find a list of fields by object key */
298 function uEditFindFieldsByKey(key) {
299 return grep( dataFields,
300 function(item) { return (item.key == key); });
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;
311 function uEditIterateFields(callback) {
312 for( var f in dataFields ) {
313 callback(dataFields[f]);
318 function uEditGetErrorStrings() {
323 if( field.widget.node.className.indexOf(CSS_INVALID_DATA) != -1) {
324 var str = $(field.errkey).innerHTML;
325 if(str) errors.push(str);
331 if(errors[0]) return errors;
335 function uEditAlertErrors() {
336 var errors = uEditGetErrorStrings();
337 if(!errors) return false;
338 alert(errors.join("\n"));
343 /* send the user to the database */
344 function uEditSaveUser(clone) {
346 if(uEditGetErrorStrings()) {
351 var req = new Request(UPDATE_PATRON, SESSION, patron);
353 var newuser = req.result();
355 if( checkILSEvent(newuser) )
356 alert(js2JSON(newuser));
358 alert($('ue_success').innerHTML);
360 if (window.xulG && typeof window.xulG.on_save == 'function') {
361 window.xulG.on_save(newuser, clone);
365 var href = location.href;
366 if( clone ) href += '&clone=' + newuser.id();
367 location.href = href;
372 var uEditDupHashes = {};
373 var uEditDupTemplate;
375 function uEditRunDupeSearch(type, search_hash) {
377 if(!patron.isnew()) return;
379 _debug('dup search: ' + js2JSON(search_hash));
381 var req = new Request(PATRON_SEARCH, SESSION, search_hash);
383 var container = $('dup_div_container');
384 if(!uEditDupTemplate)
385 uEditDupTemplate = container.removeChild($('dup_div'));
387 /* clear any existing dups for this type */
388 iterate( container.getElementsByTagName('div'),
390 if( d.getAttribute('type') == type ) {
391 container.removeChild(d)
397 /*req.callback(uEditHandleDupResults);*/
400 uEditHandleDupResults( r.getResultObject(), search_hash, type, container );
407 function uEditHandleDupResults(ids, search_hash, type, container) {
409 _debug('dup search results: ' + js2JSON(ids));
411 if(!(ids && ids[0])) /* no results */
412 return uEditDupHashes[type] = null;
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);
419 var link = $n(node, 'link');
420 link.setAttribute('type', type);
422 $n(node,'count').appendChild(text(ids.length));
424 for( var o in search_hash )
425 $n(node, 'data').appendChild(
426 text(search_hash[o].value + ' '));
428 uEditDupHashes[type] = search_hash;
432 if(confirm($('ue_dup_ident1').innerHTML))
433 uEditShowSearch(type);
439 function uEditShowSearch(link) {
440 var type = link.getAttribute('type');
442 window.xulG.spawn_search(uEditDupHashes[type]);
443 else alert('Search would be:\n' + js2JSON(uEditDupHashes[type]));