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';
12 var cachedSurveys = {};
13 var ERRORS = ""; /* global set of errors */
15 var myPerms = [ 'CREATE_USER', 'UPDATE_USER', 'CREATE_PATRON_STAT_CAT_ENTRY_MAP' ];
27 /* ID's of objects that should be focused when their page is made visible */
33 'ue_stat_cat_selector_1',
34 'ue_survey_selector_1',
39 regexes.phone = /\d{3}-\d{3}-\d{4}/;
40 regexes.email = /\w+\@\w+\.\w+/;
41 regexes.date = /^\d{4}-\d{2}-\d{2}/;
42 regexes.isnum = /^\d+$/;
44 /* fetch the necessary data to start off */
45 function uEditInit() {
48 session = cgi.param('ses');
49 if(cgi.param('adv')) advanced = true
50 if(!session) throw "User session is not defined";
53 $('uedit_user').appendChild(text(USER.usrname()));
54 uEditShowPage('uedit_userid');
58 fetchHighestPermOrgs( SESSION, USER.id(), myPerms );
59 uEditDrawUser(fetchFleshedUser(cgi.param('usr')));
60 uEditBuildLibSelector();
70 /* UI code ---------------------------------------------------- */
72 function uEditNext() {
73 var i = _findActive();
74 if( i < (pages.length - 1)) uEditShowPage(pages[i+1]);
77 function uEditPrev() {
78 var i = _findActive();
79 if( i > 0 ) uEditShowPage(pages[i-1]);
82 function uEditFetchError(id) { if($(id)) return $(id).innerHTML + "\n"; return "";}
84 function uEditShowPage(id) {
85 if( id == null ) return;
87 for( var p in pages ) {
90 removeCSSClass($(page+'_label'), 'label_active');
94 addCSSClass($(id+'_label'), 'label_active');
95 var idx = _findPageIdx(id);
96 var fpage = pageFocus[idx];
97 if(fpage) { $(fpage).focus(); try{$(fpage).select()}catch(e){} }
99 unHideMe($('ue_back'));
100 unHideMe($('ue_fwd'));
102 if(idx == 0) hideMe($('ue_back'));
103 if(idx == (pages.length-1)) hideMe($('ue_fwd'));
107 function _findActive() {
108 for( var p in pages ) {
109 if(! $(pages[p]).className.match(/hide_me/) )
114 function _findPageIdx(name) {
115 for( var i in pages ) {
117 if( page == name ) return i;
122 function uEditAddrHighlight( node, type ) {
123 var tbody = $('ue_address_tbody');
124 for( var c in tbody.childNodes ) {
125 var row = tbody.childNodes[c];
126 if(row.nodeType != XML_ELEMENT_NODE ) continue;
127 var div = $n(row,'ue_addr_'+type+'_yes').parentNode;
128 removeCSSClass(div, 'addr_info_checked');
130 addCSSClass(node.parentNode, 'addr_info_checked');
134 /* ------------------------------------------------------------------------------ */
136 /* ------------------------------------------------------------------------------ */
137 function uEditFetchIDTypes() {
138 var req = new Request(FETCH_ID_TYPES);
139 req.callback(uEditDrawIDTypes);
143 function uEditFetchStatCats() {
144 var req = new Request(SC_FETCH_ALL, SESSION);
145 req.callback(uEditDrawStatCats);
149 function uEditFetchSurveys() {
150 var req = new Request(SV_FETCH_ALL, SESSION);
151 req.callback(uEditDrawSurveys);
156 /* ------------------------------------------------------------------------------ */
158 /* ------------------------------------------------------------------------------ */
159 var uEditExistingStatEnties;
160 var uEditExistingSurveyResponses;
162 function uEditSaveUser() {
164 if(ERRORS) { alert(ERRORS); ERRORS = ""; }
165 else alert(js2JSON(patron));
168 function uEditCollectData() {
177 patron.card(-1); /* attach to the virtual id of the card */
178 patron.cards([card]);
184 uEditExistingStatEnties = patron.stat_cat_entries();
185 uEditExistingSurveyResponses = patron.survey_responses();
188 patron.stat_cat_entries([]);
189 patron.survey_responses([]);
191 uEditFleshCard(card);
192 uEditAddBasicPatronInfo(patron);
193 uEditAddPhones(patron);
194 uEditAddIdents(patron);
195 uEditAddAddresses(patron);
196 uEditAddGroupsAndPerms(patron);
197 uEditReapStatCats(patron);
198 uEditReapSurveys(patron);
204 /* ------------------------------------------------------------------------------ */
206 /* ------------------------------------------------------------------------------ */
207 function uEditDrawUser(patron) {
208 if(!patron) return 0;
215 /* ------------------------------------------------------------------------------ */
217 /* ------------------------------------------------------------------------------ */
218 function uEditDrawIDTypes(r) {
220 var types = r.getResultObject();
221 var pri_sel = $('ue_primary_ident_type');
222 var sec_sel = $('ue_secondary_ident_type');
225 for( var t in types ) {
227 identTypes[type.id()] = type;
228 setSelectorVal( pri_sel, idx, type.name(), type.id() );
229 setSelectorVal( sec_sel, idx++, type.name(), type.id() );
235 /* ------------------------------------------------------------------------------ */
236 /* Stat Cat handling code
237 /* ------------------------------------------------------------------------------ */
238 function uEditDrawStatCats(r) {
239 var cats = r.getResultObject();
240 var tbody = $('ue_stat_cat_tbody');
241 var templ = tbody.removeChild($('ue_stat_cat_row'));
243 for( var c in cats ) {
244 var row = templ.cloneNode(true);
245 uEditInsertCat( tbody, row, cats[c], c );
246 tbody.appendChild(row);
250 /* fleshes the stat cat with entries in the dropdown */
251 function uEditInsertCat( tbody, row, cat, idx ) {
253 cat.entries().sort( /* sort the entries by value */
255 if( a.value().toLowerCase() > b.value().toLowerCase()) return 1;
256 if( a.value().toLowerCase() < b.value().toLowerCase()) return -1;
261 row.setAttribute('statcat', cat.id());
262 var newval = $n(row, 'ue_stat_cat_newval');
263 newval.onchange = function(){
264 findParentNodeByName(newval,'tr').setAttribute('changed', '1'); }
266 var selector = $n(row, 'ue_stat_cat_selector');
267 selector.onchange = function(){
268 findParentByNodeName(selector, 'tr').setAttribute('changed', '1');
269 newval.value = getSelectorName(selector);
270 newval.setAttribute('entry', getSelectorVal(selector));
273 if( idx == 0 ) selector.id = 'ue_stat_cat_selector_1';
275 $n(row, 'ue_stat_cat_name').appendChild(text(cat.name()));
276 $n(row, 'ue_stat_cat_owner').appendChild(
277 text(fetchOrgUnit(cat.owner()).shortname()));
280 for( var e in cat.entries() ) {
281 var entry = cat.entries()[e];
282 setSelectorVal( selector, idx++, entry.value(), entry.id() );
286 /* finds all the changed/new stat entries and updates the patron object*/
287 function uEditReapStatCats(patron) {
288 var tbody = $('ue_stat_cat_tbody');
289 for( var r in tbody.childNodes ) {
290 var row = tbody.childNodes[r];
291 if( !row || row.nodeName != 'tr' ) continue;
292 if( row.getAttribute('changed') ) {
293 var val = $n( row, 'ue_stat_cat_newval' );
294 uEditCreateStatEntry( patron, row.getAttribute('statcat'),
295 val.value, val.getAttribute('entry') );
301 function uEditCreateStatEntry( patron, catid, newval, entryid ) {
302 var map = new actscecm();
305 if( ! patron.isnew() ) {
306 if( grep( uEditExistingStatEntries,
307 function(a) { return a.id() == entryid } ) )
311 map.stat_cat_entry(newval);
313 map.target_usr(patron.id());
314 patron.stat_cat_entries().push(map);
319 /* ------------------------------------------------------------------------------ */
320 /* Survey handling code
321 /* ------------------------------------------------------------------------------ */
322 function uEditDrawSurveys(r) {
324 var surveys = r.getResultObject();
325 var div = $('uedit_surveys');
326 var table = div.removeChild($('ue_survey_table'));
329 for( var s in surveys ) {
330 var survey = surveys[s];
331 cachedSurveys[survey.id()] = survey;
332 var clone = table.cloneNode(true);
333 uEditInsertSurvey( div, clone, survey, x++ );
334 div.appendChild(clone);
338 function uEditInsertSurvey( div, table, survey, sidx ) {
339 $n(table, 'ue_survey_name').appendChild(text(survey.name()));
340 $n(table, 'ue_survey_desc').appendChild(text(survey.description()));
341 var tbody = $n(table, 'ue_survey_tbody');
342 var templ = tbody.removeChild($n(table, 'ue_survey_row'));
344 var polldiv = $('ue_survey_answer_poll');
347 for( var q in survey.questions() ) {
348 var row = templ.cloneNode(true);
349 uEditInsertSurveyQuestion( div, table, tbody, row, survey, survey.questions()[q], sidx );
350 tbody.appendChild(row);
354 function uEditInsertSurveyQuestion( div, table, tbody, row, survey, question, sidx ) {
356 $n(row, 'ue_survey_question').appendChild(text(question.question()));
358 var selector = $n(row, 'ue_survey_answer');
359 var polldiv = $n(row, 'ue_survey_answer_poll');
361 var polltbody = $n(row, 'ue_survey_answer_poll_tbody');
362 var pollrow = polltbody.removeChild($n(polltbody, 'ue_survey_answer_poll_row'));
364 table.setAttribute('survey', survey.id());
365 row.setAttribute('question', question.id());
367 selector.onchange = function() {
368 row.setAttribute('answer', getSelectorVal(selector));
369 row.setAttribute('changed', '1');
372 if( sidx == 0 ) selector.id = 'ue_survey_selector_1';
374 for( var a in question.answers() ) {
376 var answer = question.answers()[a];
378 if( survey.poll() ) {
381 var prow = pollrow.cloneNode(true);
383 prow.onselect = function() {
384 row.setAttribute('answer', answer.id());
385 row.setAttribute('changed', '1');
388 $n(prow, 'ue_survey_answer_poll_answer').appendChild(text(answer.answer()));
390 $n(prow, 'ue_survey_answer_poll_radio').appendChild(
393 name : 'survey_poll_answer_'+survey.id(),
397 polltbody.appendChild(prow);
401 unHideMe(selector.parentNode);
402 setSelectorVal( selector, idx++, answer.answer(), answer.id() );
408 function uEditReapSurveys(patron) {
410 var div = $('uedit_surveys');
411 var tables = getElementsByTagNameFlat(div, 'table');
413 for( var t in tables ) {
415 var table = tables[t];
416 var survey = cachedSurveys[table.getAttribute('survey')];
417 var tbody = getElementsByTagNameFlat( table, 'tbody' )[0];
418 var rows = getElementsByTagNameFlat( tbody, 'tr' );
420 for( var r in rows ) {
422 var resp = new asvr();
424 resp.survey(survey.id());
425 resp.usr(patron.id());
426 resp.question(row.getAttribute('question'));
427 resp.answer(row.getAttribute('answer'));
428 patron.survey_responses().push( resp );
438 /* returns true if an error occurred */
439 function uEditSetVal( obj, func, val, regxtype, errtype ) {
441 var error = uEditFetchError(errtype);
446 if( val == null ) { iserr = true; break; }
448 if(!instanceOf(val, String)) {
449 try { val = val.value; } catch(e) { return; }
452 if(val == "" ) { iserr = true; break; }
454 if(regxtype && regexes[regxtype]
455 && !val.match(regexes[regxtype]) ) { iserr = true; break; }
457 try { obj[func](val); } catch(e) {
458 alert("Error running function: " +func);
464 if(iserr) { ERRORS += error; return true; }
469 function uEditAddBasicPatronInfo(patron) {
473 /* make sure passwords match */
474 var p1 = $('ue_password1').value;
475 var p2 = $('ue_password1').value;
476 if( p1 != p2 || uEditSetVal( patron, "passwd", p1 ))
477 ERRORS += uEditFetchError('ue_bad_password');
479 uEditSetVal(patron, "usrname", $('ue_username'), null, 'ue_bad_username' );
480 uEditSetVal(patron, "first_given_name", $('ue_firstname'), null, 'ue_bad_firstname' );
481 uEditSetVal(patron, "second_given_name", $('ue_middlename'), null, 'ue_bad_middlename' );
482 uEditSetVal(patron, "family_name", $('ue_lastname'), null, 'ue_bad_lastname' );
483 uEditSetVal(patron, "dob", $('ue_dob'), 'date', 'ue_bad_dob' );
485 patron.suffix($('ue_suffix').value); /* suffis isn't required */
488 /* make sure emails match */
489 var email = $('ue_email1').value;
490 var email2 = $('ue_email2').value;
491 if( email != email2 || uEditSetVal(patron, "email", email, 'email' ))
492 ERRORS += uEditFetchError('ue_bad_email');
494 patron.home_ou(getSelectorVal($('ue_org_selector')));
497 function uEditAddPhones(patron) {
500 /* verifies the phone numbers are formatted correctly */
501 var verify = function(n1, n2, n3) {
505 if( !a || !p || !s ) return false;
506 return a + '-' + p + '-' + s;
510 var er = 'ue_bad_phone'
512 uEditSetVal( patron, "day_phone",
513 verify($('ue_day_phone_area'),
514 $('ue_day_phone_prefix'),
515 $('ue_day_phone_suffix')), 'phone', er );
517 uEditSetVal( patron, "evening_phone",
518 verify($('ue_night_phone_area'),
519 $('ue_night_phone_prefix'),
520 $('ue_night_phone_suffix')), 'phone', er );
522 uEditSetVal( patron, "other_phone",
523 verify($('ue_other_phone_area'),
524 $('ue_other_phone_prefix'),
525 $('ue_other_phone_suffix')), 'phone', er );
529 function uEditFleshCard(card) {
532 if(uEditSetVal( card, "barcode", $('ue_barcode'), null, 'ue_bad_barcode' ))
540 function uEditAddIdents(patron) {
542 var err = 'ue_no_ident';
544 uEditSetVal( patron, "ident_type",
545 getSelectorVal($('ue_primary_ident_type')), 'isnum', err );
547 uEditSetVal( patron, "ident_type2",
548 getSelectorVal($('ue_secondary_ident_type')), 'isnum', err );
550 uEditSetVal( patron, "ident_value",
551 $('ue_primary_ident'), null, err );
553 uEditSetVal( patron, "ident_value2",
554 $('ue_secondary_ident'), null, err );
559 function uEditBuildLibSelector( node, depth, selector ) {
560 if(!selector) selector = $('ue_org_selector');
561 if(!node) { depth = 0; node = globalOrgTree; }
563 var opt = insertSelectorVal( selector, -1, node.name(), node.id(), null, depth++ );
565 /* allow these orgs to be selectable via permission? */
566 if(!findOrgType(node.ou_type()).can_have_vols()) opt.disabled = true;
568 if( node.id() == USER.home_ou() ) setSelector(selector, node.id());
569 for( var c in node.children() )
570 uEditBuildLibSelector(node.children()[c], depth, selector);
573 function uEditFetchGroups() {
574 var req = new Request(FETCH_GROUPS);
575 req.callback(uEditDrawGroups);
579 function uEditDrawGroups(r, tree, depth, selector) {
582 tree = r.getResultObject();
585 selector = $('ue_profile');
588 insertSelectorVal( selector, -1, tree.name(), tree.id(), null, depth++ );
589 for( var c in tree.children() )
590 uEditDrawGroups( null, tree.children()[c], depth, selector );
595 function uEditAddGroupsAndPerms(patron) {
597 uEditSetVal( patron, "profile",
598 getSelectorVal($('ue_profile')), 'isnum', 'ue_no_profile');
600 var expire = $('ue_expire').value;
602 uEditSetVal( patron, "expire_date", expire, 'date', 'ue_bad_expire' );
604 if($('ue_active').checked) patron.active(1);
605 if($('ue_barred').checked) patron.barred(1);
606 if($('ue_group_lead').checked) patron.master_account(1);
608 uEditSetVal( patron, "claims_returned_count",
609 $('ue_claims_returned'), 'isnum', 'ue_bad_claims_returned');
611 if($('ue_alert_message').value)
612 uEditSetVal(patron, "alert_message", $('ue_alert_message'));
617 function uEditAddAddresses(patron) {
618 var tbody = $('ue_address_tbody');
619 patron.addresses([]);
621 /* shove the addresses living in the page into the patron */
622 for( var r in tbody.childNodes ) {
623 var row = tbody.childNodes[r];
624 if(!(row && row.nodeName == 'tr')) continue;
625 patron.addresses().push( uEditBuildAddress( patron, tbody, row ));
629 /* extracts a single address from the page */
630 var uEditVirtualAddrId = -1;
631 function uEditBuildAddress( patron, tbody, row ) {
633 var addr = new aua();
634 var id = row.getAttribute('exists');
641 addr.id(uEditVirtualAddrId--);
645 if($n(row, 'ue_addr_mailing_yes')) patron.mailing_address(addr.id());
646 if($n(row, 'ue_addr_billing_yes')) patron.billing_address(addr.id());
648 uEditSetVal(addr, "address_type", $n(row, 'ue_addr_address_type'), null, 'ue_bad_addr_address_type' );
649 uEditSetVal(addr, "street1", $n(row, 'ue_addr_street1'), null, 'ue_bad_addr_street' );
650 uEditSetVal(addr, "street2", $n(row, 'ue_addr_street2'), null, 'ue_bad_addr_street' );
651 uEditSetVal(addr, "city", $n(row, 'ue_addr_city'), null, 'ue_bad_addr_city' );
652 uEditSetVal(addr, "county", $n(row, 'ue_addr_county'), null, 'ue_bad_addr_county' );
653 uEditSetVal(addr, "state", $n(row, 'ue_addr_state'), null, 'ue_bad_addr_state' );
654 uEditSetVal(addr, "post_code", $n(row, 'ue_addr_post_code'), null, 'ue_bad_addr_post_code' );
655 uEditSetVal(addr, "country", $n(row, 'ue_addr_country'), null, 'ue_bad_addr_country' );
661 var uEditAddrTemplate;
662 function uEditFetchAddrs() {
664 var tbody = $('ue_address_tbody');
665 uEditAddrTemplate = tbody.removeChild($('ue_address_template'));
667 $('ue_address_new').onclick =
668 function() { tbody.appendChild(uEditAddrTemplate.cloneNode(true)); }
670 /* go ahead and add a blank addr */
672 var row = uEditAddrTemplate.cloneNode(true);
673 $n( row, 'ue_addr_label').id = 'ue_addr_label_1';
674 tbody.appendChild(row);
680 function uEditShowSummary() {
682 var table = $('ue_summary_table');
683 uEditFleshSummaryTable(table);
684 var win = window.open("", $('ue_summary_window').innerHTML );
685 win.document.body.appendChild(table.cloneNode(true));
688 function uEditFleshSummaryTable(table) {
693 if( patron.ident_type() != null)
694 identt1 = identTypes[patron.ident_type()].name();
695 if( patron.ident_type2() != null )
696 identt2 = identTypes[patron.ident_type()].name();
697 if( patron.home_ou() != null )
698 homeorg = findOrgUnit(patron.home_ou()).name();
700 $('ue_summary_username').appendChild(text(patron.usrname()));
701 $('ue_summary_firstname').appendChild(text(patron.first_given_name()));
702 $('ue_summary_middlename').appendChild(text(patron.second_given_name()));
703 $('ue_summary_lastname').appendChild(text(patron.family_name()));
704 $('ue_summary_suffix').appendChild(text(patron.suffix()));
705 $('ue_summary_dob').appendChild(text(patron.dob()));
706 $('ue_summary_primary_ident_type').appendChild(text(identt1));
707 $('ue_summary_primary_ident').appendChild(text(patron.ident_value()));
708 $('ue_summary_secondary_ident_type').appendChild(text(identt2));
709 $('ue_summary_secondary_ident').appendChild(text(patron.ident_value2()));
710 $('ue_summary_email').appendChild(text(patron.email()));
711 $('ue_summary_dayphone').appendChild(text(patron.day_phone()));
712 $('ue_summary_nightphone').appendChild(text(patron.evening_phone()));
713 $('ue_summary_otherphone').appendChild(text(patron.other_phone()));
714 $('ue_summary_home_lib').appendChild(text(homeorg));