5 var SC_FETCH_ALL = 'open-ils.circ:open-ils.circ.stat_cat.actor.retrieve.all';
6 var SC_CREATE_MAP = 'open-ils.circ:open-ils.circ.stat_cat.actor.user_map.create';
7 var SV_FETCH_ALL = 'open-ils.circ:open-ils.circ.survey.retrieve.all';
8 var FETCH_ID_TYPES = 'open-ils.actor:open-ils.actor.user.ident_types.retrieve';
9 var FETCH_GROUPS = 'open-ils.actor:open-ils.actor.groups.tree.retrieve';
10 var identTypes = null;
12 var ERRORS = ""; /* global set of errors */
14 var myPerms = [ 'CREATE_USER', 'UPDATE_USER', 'CREATE_PATRON_STAT_CAT_ENTRY_MAP' ];
26 /* ID's of objects that should be focused when their page is made visible */
32 'ue_stat_cat_selector_1',
33 'ue_survey_selector_1',
38 regexes.phone = /\d{3}-\d{3}-\d{4}/;
39 regexes.email = /\w+\@\w+\.\w+/;
40 regexes.date = /^\d{4}-\d{2}-\d{2}/;
41 regexes.isnum = /^\d+$/;
43 /* fetch the necessary data to start off */
44 function uEditInit() {
47 session = cgi.param('ses');
48 if(cgi.param('adv')) advanced = true
49 if(!session) throw "User session is not defined";
52 $('uedit_user').appendChild(text(USER.usrname()));
53 uEditShowPage('uedit_userid');
57 fetchHighestPermOrgs( SESSION, USER.id(), myPerms );
58 uEditDrawUser(fetchFleshedUser(cgi.param('usr')));
59 uEditBuildLibSelector();
69 function uEditNext() {
70 var i = _findActive();
71 if( i < (pages.length - 1)) uEditShowPage(pages[i+1]);
74 function uEditPrev() {
75 var i = _findActive();
76 if( i > 0 ) uEditShowPage(pages[i-1]);
80 function uEditShowPage(id) {
81 if( id == null ) return;
83 for( var p in pages ) {
86 removeCSSClass($(page+'_label'), 'label_active');
90 addCSSClass($(id+'_label'), 'label_active');
91 var idx = _findPageIdx(id);
92 var fpage = pageFocus[idx];
93 if(fpage) { $(fpage).focus(); try{$(fpage).select()}catch(e){} }
95 unHideMe($('ue_back'));
96 unHideMe($('ue_fwd'));
98 if(idx == 0) hideMe($('ue_back'));
99 if(idx == (pages.length-1)) hideMe($('ue_fwd'));
103 function _findActive() {
104 for( var p in pages ) {
105 if(! $(pages[p]).className.match(/hide_me/) )
110 function _findPageIdx(name) {
111 for( var i in pages ) {
113 if( page == name ) return i;
118 function uEditAddrHighlight( node, type ) {
119 var tbody = $('ue_address_tbody');
120 for( var c in tbody.childNodes ) {
121 var row = tbody.childNodes[c];
122 if(row.nodeType != XML_ELEMENT_NODE ) continue;
123 var div = $n(row,'ue_addr_'+type+'_yes').parentNode;
124 removeCSSClass(div, 'addr_info_checked');
126 addCSSClass(node.parentNode, 'addr_info_checked');
131 function uEditDrawUser(patron) {
132 if(!patron) return 0;
135 function uEditFetchIDTypes() {
136 var req = new Request(FETCH_ID_TYPES);
137 req.callback(uEditDrawIDTypes);
141 function uEditDrawIDTypes(r) {
143 var types = r.getResultObject();
144 var pri_sel = $('ue_primary_ident_type');
145 var sec_sel = $('ue_secondary_ident_type');
148 for( var t in types ) {
150 setSelectorVal( pri_sel, idx, type.name(), type.id() );
151 setSelectorVal( sec_sel, idx++, type.name(), type.id() );
156 function uEditFetchStatCats() {
157 var req = new Request(SC_FETCH_ALL, SESSION);
158 req.callback(uEditDrawStatCats);
162 function uEditDrawStatCats(r) {
163 var cats = r.getResultObject();
164 var tbody = $('ue_stat_cat_tbody');
165 var templ = tbody.removeChild($('ue_stat_cat_row'));
167 for( var c in cats ) {
168 var row = templ.cloneNode(true);
169 uEditInsertCat( tbody, row, cats[c], c );
170 tbody.appendChild(row);
174 function uEditInsertCat( tbody, row, cat, idx ) {
176 cat.entries().sort( /* sort the entries by value */
178 if( a.value().toLowerCase() > b.value().toLowerCase()) return 1;
179 if( a.value().toLowerCase() < b.value().toLowerCase()) return -1;
184 var selector = $n(row, 'ue_stat_cat_selector');
185 if( idx == 0 ) selector.id = 'ue_stat_cat_selector_1';
186 $n(row, 'ue_stat_cat_name').appendChild(text(cat.name()));
187 $n(row, 'ue_stat_cat_owner').appendChild(text(fetchOrgUnit(cat.owner()).shortname()));
190 for( var e in cat.entries() ) {
191 var entry = cat.entries()[e];
192 setSelectorVal( selector, idx++, entry.value(), entry.id() );
196 function uEditFetchSurveys() {
197 var req = new Request(SV_FETCH_ALL, SESSION);
198 req.callback(uEditDrawSurveys);
202 function uEditDrawSurveys(r) {
204 var surveys = r.getResultObject();
205 var div = $('uedit_surveys');
206 var table = div.removeChild($('ue_survey_table'));
209 for( var s in surveys ) {
210 var survey = surveys[s];
211 var clone = table.cloneNode(true);
212 uEditInsertSurvey( div, clone, survey, x++ );
213 div.appendChild(clone);
217 function uEditInsertSurvey( div, table, survey, sidx ) {
218 $n(table, 'ue_survey_name').appendChild(text(survey.name()));
219 $n(table, 'ue_survey_desc').appendChild(text(survey.description()));
220 var tbody = $n(table, 'ue_survey_tbody');
221 var templ = tbody.removeChild($n(table, 'ue_survey_row'));
223 var polldiv = $('ue_survey_answer_poll');
226 for( var q in survey.questions() ) {
227 var row = templ.cloneNode(true);
228 uEditInsertSurveyQuestion( div, table, tbody, row, survey, survey.questions()[q], sidx );
229 tbody.appendChild(row);
233 function uEditInsertSurveyQuestion( div, table, tbody, row, survey, question, sidx ) {
235 $n(row, 'ue_survey_question').appendChild(text(question.question()));
237 var selector = $n(row, 'ue_survey_answer');
238 var polldiv = $n(row, 'ue_survey_answer_poll');
240 var polltbody = $n(row, 'ue_survey_answer_poll_tbody');
241 var pollrow = polltbody.removeChild($n(polltbody, 'ue_survey_answer_poll_row'));
243 if( sidx == 0 ) selector.id = 'ue_survey_selector_1';
245 for( var a in question.answers() ) {
247 var answer = question.answers()[a];
249 if( survey.poll() ) {
252 var prow = pollrow.cloneNode(true);
253 $n(prow, 'ue_survey_answer_poll_answer').appendChild(text(answer.answer()));
255 $n(prow, 'ue_survey_answer_poll_radio').appendChild(
258 name : 'survey_poll_answer_'+survey.id(),
262 polltbody.appendChild(prow);
266 unHideMe(selector.parentNode);
267 setSelectorVal( selector, idx++, answer.answer(), answer.id() );
273 function uEditFetchError(id) { if($(id)) return $(id).innerHTML + "\n"; return "";}
276 function uEditSaveUser() {
284 patron.card(-1); /* attach to the virtual id of the card */
285 patron.cards([card]);
292 uEditFleshCard(card);
293 uEditAddBasicPatronInfo(patron);
294 uEditAddPhones(patron);
295 uEditAddIdents(patron);
296 uEditAddAddresses(patron);
297 uEditAddGroupsAndPerms(patron);
299 if(ERRORS) { alert(ERRORS); ERRORS = ""; }
300 else alert(js2JSON(patron));
303 /* returns true if an error occurred */
304 function uEditSetVal( obj, func, val, regxtype, errtype ) {
306 var error = uEditFetchError(errtype);
311 if( val == null ) { iserr = true; break; }
313 if(!instanceOf(val, String)) {
314 try { val = val.value; } catch(e) { return; }
317 if(val == "" ) { iserr = true; break; }
319 if(regxtype && regexes[regxtype]
320 && !val.match(regexes[regxtype]) ) { iserr = true; break; }
322 try { obj[func](val); } catch(e) {
323 alert("Error running function: " +func);
329 if(iserr) { ERRORS += error; return true; }
334 function uEditAddBasicPatronInfo(patron) {
338 /* make sure passwords match */
339 var p1 = $('ue_password1').value;
340 var p2 = $('ue_password1').value;
341 if( p1 != p2 || uEditSetVal( patron, "passwd", p1 ))
342 ERRORS += uEditFetchError('ue_bad_password');
344 uEditSetVal(patron, "usrname", $('ue_username'), null, 'ue_bad_username' );
345 uEditSetVal(patron, "first_given_name", $('ue_firstname'), null, 'ue_bad_firstname' );
346 uEditSetVal(patron, "second_given_name", $('ue_middlename'), null, 'ue_bad_middlename' );
347 uEditSetVal(patron, "family_name", $('ue_lastname'), null, 'ue_bad_lastname' );
348 uEditSetVal(patron, "dob", $('ue_dob'), 'date', 'ue_bad_dob' );
350 patron.suffix($('ue_suffix').value); /* suffis isn't required */
353 /* make sure emails match */
354 var email = $('ue_email1').value;
355 var email2 = $('ue_email2').value;
356 if( email != email2 || uEditSetVal(patron, "email", email, 'email' ))
357 ERRORS += uEditFetchError('ue_bad_email');
359 patron.home_ou(getSelectorVal($('ue_org_selector')));
362 function uEditAddPhones(patron) {
365 /* verifies the phone numbers are formatted correctly */
366 var verify = function(n1, n2, n3) {
370 if( !a || !p || !s ) return false;
371 return a + '-' + p + '-' + s;
375 var er = 'ue_bad_phone'
377 uEditSetVal( patron, "day_phone",
378 verify($('ue_day_phone_area'),
379 $('ue_day_phone_prefix'),
380 $('ue_day_phone_suffix')), 'phone', er );
382 uEditSetVal( patron, "evening_phone",
383 verify($('ue_night_phone_area'),
384 $('ue_night_phone_prefix'),
385 $('ue_night_phone_suffix')), 'phone', er );
387 uEditSetVal( patron, "other_phone",
388 verify($('ue_other_phone_area'),
389 $('ue_other_phone_prefix'),
390 $('ue_other_phone_suffix')), 'phone', er );
394 function uEditFleshCard(card) {
397 if(uEditSetVal( card, "barcode", $('ue_barcode'), null, 'ue_bad_barcode' ))
405 function uEditAddIdents(patron) {
407 var err = 'ue_no_ident';
409 uEditSetVal( patron, "ident_type",
410 getSelectorVal($('ue_primary_ident_type')), 'isnum', err );
412 uEditSetVal( patron, "ident_type2",
413 getSelectorVal($('ue_secondary_ident_type')), 'isnum', err );
415 uEditSetVal( patron, "ident_value",
416 $('ue_primary_ident'), null, err );
418 uEditSetVal( patron, "ident_value2",
419 $('ue_secondary_ident'), null, err );
424 function uEditBuildLibSelector( node, depth, selector ) {
425 if(!selector) selector = $('ue_org_selector');
426 if(!node) { depth = 0; node = globalOrgTree; }
428 var opt = insertSelectorVal( selector, -1, node.name(), node.id(), null, depth++ );
430 /* allow these orgs to be selectable via permission? */
431 if(!findOrgType(node.ou_type()).can_have_vols()) opt.disabled = true;
433 if( node.id() == USER.home_ou() ) setSelector(selector, node.id());
434 for( var c in node.children() )
435 uEditBuildLibSelector(node.children()[c], depth, selector);
438 function uEditFetchGroups() {
439 var req = new Request(FETCH_GROUPS);
440 req.callback(uEditDrawGroups);
444 function uEditDrawGroups(r, tree, depth, selector) {
447 tree = r.getResultObject();
450 selector = $('ue_profile');
453 insertSelectorVal( selector, -1, tree.name(), tree.id(), null, depth++ );
454 for( var c in tree.children() )
455 uEditDrawGroups( null, tree.children()[c], depth, selector );
460 function uEditAddGroupsAndPerms(patron) {
462 uEditSetVal( patron, "profile",
463 getSelectorVal($('ue_profile')), 'isnum', 'ue_no_profile');
465 var expire = $('ue_expire').value;
467 uEditSetVal( patron, "expire_date", expire, 'date', 'ue_bad_expire' );
469 if($('ue_active').checked) patron.active(1);
470 if($('ue_barred').checked) patron.barred(1);
471 if($('ue_group_lead').checked) patron.master_account(1);
473 uEditSetVal( patron, "claims_returned_count",
474 $('ue_claims_returned'), 'isnum', 'ue_bad_claims_returned');
476 if($('ue_alert_message').value)
477 uEditSetVal(patron, "alert_message", $('ue_alert_message'));
482 function uEditAddAddresses(patron) {
483 var tbody = $('ue_address_tbody');
485 for( var r in tbody.childNodes ) {
486 var row = tbody.childNodes[r];
487 if(!(row && row.nodeName == 'tr')) continue;
488 uEditSetAddress( tbody, row );
492 /* extracts a single address from the page */
493 function uEditSetAddress( tbody, row ) {
495 var label = $n(row, 'ue_addr_label');
496 var street1 = $n(row, 'ue_addr_street1');
497 var street2 = $n(row, 'ue_addr_street2');
498 var city = $n(row, 'ue_addr_city');
499 var county = $n(row, 'ue_addr_county');
500 var state = $n(row, 'ue_addr_state');
501 var zip = $n(row, 'ue_addr_zip');
502 var country = $n(row, 'ue_addr_country');
507 var uEditAddrTemplate;
508 function uEditFetchAddrs() {
510 var tbody = $('ue_address_tbody');
511 uEditAddrTemplate = tbody.removeChild($('ue_address_template'));
513 $('ue_address_new').onclick =
514 function() { tbody.appendChild(uEditAddrTemplate.cloneNode(true)); }
516 /* go ahead and add a blank addr */
518 var row = uEditAddrTemplate.cloneNode(true);
519 $n( row, 'ue_addr_label').id = 'ue_addr_label_1';
520 tbody.appendChild(row);