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 UPDATE_PATRON = 'open-ils.actor:open-ils.actor.patron.update';
13 var cachedSurveys = {};
14 var cachedSurveyQuestions = {};
15 var cachedSurveyAnswers = {};
16 var cachedStatCats = {};
17 var ERRORS = ""; /* global set of errors */
19 var myPerms = [ 'CREATE_USER', 'UPDATE_USER', 'CREATE_PATRON_STAT_CAT_ENTRY_MAP' ];
31 /* ID's of objects that should be focused when their page is made visible */
37 'ue_stat_cat_selector_1',
38 'ue_survey_selector_1',
43 regexes.phone = /\d{3}-\d{3}-\d{4}/;
44 regexes.email = /\w+\@\w+\.\w+/;
45 regexes.date = /^\d{4}-\d{2}-\d{2}/;
46 regexes.isnum = /^\d+$/;
48 /* fetch the necessary data to start off */
49 function uEditInit() {
52 session = cgi.param('ses');
53 if(cgi.param('adv')) advanced = true
54 if(!session) throw "User session is not defined";
57 $('uedit_user').appendChild(text(USER.usrname()));
58 uEditShowPage('uedit_userid');
62 fetchHighestPermOrgs( SESSION, USER.id(), myPerms );
63 uEditDrawUser(fetchFleshedUser(cgi.param('usr')));
64 uEditBuildLibSelector();
74 /* UI code ---------------------------------------------------- */
76 function uEditNext() {
77 var i = _findActive();
78 if( i < (pages.length - 1)) uEditShowPage(pages[i+1]);
81 function uEditPrev() {
82 var i = _findActive();
83 if( i > 0 ) uEditShowPage(pages[i-1]);
86 function uEditFetchError(id) { if($(id)) return $(id).innerHTML + "\n"; return "";}
88 function uEditShowPage(id) {
89 if( id == null ) return;
91 for( var p in pages ) {
94 removeCSSClass($(page+'_label'), 'label_active');
98 addCSSClass($(id+'_label'), 'label_active');
99 var idx = _findPageIdx(id);
100 var fpage = pageFocus[idx];
101 if(fpage) { $(fpage).focus(); try{$(fpage).select()}catch(e){} }
103 unHideMe($('ue_back'));
104 unHideMe($('ue_fwd'));
106 if(idx == 0) hideMe($('ue_back'));
107 if(idx == (pages.length-1)) hideMe($('ue_fwd'));
111 function _findActive() {
112 for( var p in pages ) {
113 if(! $(pages[p]).className.match(/hide_me/) )
118 function _findPageIdx(name) {
119 for( var i in pages ) {
121 if( page == name ) return i;
126 function uEditAddrHighlight( node, type ) {
127 var tbody = $('ue_address_tbody');
128 for( var c in tbody.childNodes ) {
129 var row = tbody.childNodes[c];
130 if(row.nodeType != XML_ELEMENT_NODE ) continue;
131 var div = $n(row,'ue_addr_'+type+'_yes').parentNode;
132 removeCSSClass(div, 'addr_info_checked');
134 addCSSClass(node.parentNode, 'addr_info_checked');
138 /* ------------------------------------------------------------------------------ */
140 /* ------------------------------------------------------------------------------ */
141 function uEditFetchIDTypes() {
142 var req = new Request(FETCH_ID_TYPES);
143 req.callback(uEditDrawIDTypes);
147 function uEditFetchStatCats() {
148 var req = new Request(SC_FETCH_ALL, SESSION);
149 req.callback(uEditDrawStatCats);
153 function uEditFetchSurveys() {
154 var req = new Request(SV_FETCH_ALL, SESSION);
155 req.callback(uEditDrawSurveys);
160 /* ------------------------------------------------------------------------------ */
162 /* ------------------------------------------------------------------------------ */
163 var uEditExistingStatEntries;
164 var uEditExistingSurveyResponses;
166 function uEditSaveUser() {
175 //alert(js2JSON(patron));
177 var req = new Request(UPDATE_PATRON, SESSION, patron);
179 var result = req.result();
180 if( checkILSEvent(result) ) alert(js2JSON(result));
181 else alert($('ue_success').innerHTML);
185 function uEditCollectData() {
194 patron.card(-1); /* attach to the virtual id of the card */
195 patron.cards([card]);
199 /* if this function is called again, patron will exist */
200 if(!patron.isnew()) {
203 uEditExistingStatEntries = patron.stat_cat_entries();
204 uEditExistingSurveyResponses = patron.survey_responses();
208 patron.stat_cat_entries([]);
209 patron.survey_responses([]);
211 uEditFleshCard(card);
212 uEditAddBasicPatronInfo(patron);
213 uEditAddPhones(patron);
214 uEditAddIdents(patron);
215 uEditAddAddresses(patron);
216 uEditAddGroupsAndPerms(patron);
217 uEditReapStatCats(patron);
218 uEditReapSurveys(patron);
224 /* ------------------------------------------------------------------------------ */
226 /* ------------------------------------------------------------------------------ */
227 function uEditDrawUser(patron) {
237 /* ------------------------------------------------------------------------------ */
239 /* ------------------------------------------------------------------------------ */
240 function uEditDrawIDTypes(r) {
242 var types = r.getResultObject();
243 var pri_sel = $('ue_primary_ident_type');
244 var sec_sel = $('ue_secondary_ident_type');
247 for( var t in types ) {
249 identTypes[type.id()] = type;
250 setSelectorVal( pri_sel, idx, type.name(), type.id() );
251 setSelectorVal( sec_sel, idx++, type.name(), type.id() );
257 /* ------------------------------------------------------------------------------ */
258 /* Stat Cat handling code
259 /* ------------------------------------------------------------------------------ */
260 function uEditDrawStatCats(r) {
261 var cats = r.getResultObject();
262 var tbody = $('ue_stat_cat_tbody');
263 var templ = tbody.removeChild($('ue_stat_cat_row'));
265 for( var c in cats ) {
266 var row = templ.cloneNode(true);
267 uEditInsertCat( tbody, row, cats[c], c );
268 tbody.appendChild(row);
272 /* fleshes the stat cat with entries in the dropdown */
273 function uEditInsertCat( tbody, row, cat, idx ) {
275 cat.entries().sort( /* sort the entries by value */
277 if( a.value().toLowerCase() > b.value().toLowerCase()) return 1;
278 if( a.value().toLowerCase() < b.value().toLowerCase()) return -1;
283 cachedStatCats[cat.id()] = cat;
285 row.setAttribute('statcat', cat.id());
286 var newval = $n(row, 'ue_stat_cat_newval');
287 newval.onchange = function(){
288 findParentByNodeName(newval,'tr').setAttribute('changed', '1'); }
290 var selector = $n(row, 'ue_stat_cat_selector');
291 selector.onchange = function(){
292 findParentByNodeName(selector, 'tr').setAttribute('changed', '1');
293 newval.value = getSelectorName(selector);
294 newval.setAttribute('entry', getSelectorVal(selector));
297 if( idx == 0 ) selector.id = 'ue_stat_cat_selector_1';
299 $n(row, 'ue_stat_cat_name').appendChild(text(cat.name()));
300 $n(row, 'ue_stat_cat_owner').appendChild(
301 text(fetchOrgUnit(cat.owner()).shortname()));
304 for( var e in cat.entries() ) {
305 var entry = cat.entries()[e];
306 setSelectorVal( selector, idx++, entry.value(), entry.id() );
310 /* finds all the changed/new stat entries and updates the patron object*/
311 function uEditReapStatCats(patron) {
312 var tbody = $('ue_stat_cat_tbody');
313 for( var r in tbody.childNodes ) {
314 var row = tbody.childNodes[r];
315 if( !row || row.nodeName != 'tr' ) continue;
316 if( row.getAttribute('changed') ) {
317 var val = $n( row, 'ue_stat_cat_newval' );
319 uEditCreateStatEntry( patron, row.getAttribute('statcat'),
320 val.value, val.getAttribute('entry') );
327 function uEditCreateStatEntry( patron, catid, newval, entryid ) {
328 var map = new actscecm();
331 if( ! patron.isnew() ) {
332 if( grep( uEditExistingStatEntries,
333 function(a) { return a.id() == entryid } ) )
337 map.stat_cat_entry(newval);
339 map.target_usr(patron.id());
340 patron.stat_cat_entries().push(map);
345 /* ------------------------------------------------------------------------------ */
346 /* Survey handling code
347 /* ------------------------------------------------------------------------------ */
348 function uEditDrawSurveys(r) {
350 var surveys = r.getResultObject();
351 var div = $('uedit_surveys');
352 var table = div.removeChild($('ue_survey_table'));
355 for( var s in surveys ) {
356 var survey = surveys[s];
357 cachedSurveys[survey.id()] = survey;
358 var clone = table.cloneNode(true);
359 uEditInsertSurvey( div, clone, survey, x++ );
360 div.appendChild(clone);
364 function uEditInsertSurvey( div, table, survey, sidx ) {
365 $n(table, 'ue_survey_name').appendChild(text(survey.name()));
366 $n(table, 'ue_survey_desc').appendChild(text(survey.description()));
367 var tbody = $n(table, 'ue_survey_tbody');
368 var templ = tbody.removeChild($n(table, 'ue_survey_row'));
370 var polldiv = $('ue_survey_answer_poll');
373 for( var q in survey.questions() ) {
374 var row = templ.cloneNode(true);
375 var quest = survey.questions()[q];
376 cachedSurveyQuestions[quest.id()] = quest;
377 uEditInsertSurveyQuestion( div, table, tbody, row, survey, quest, sidx );
378 tbody.appendChild(row);
382 function uEditInsertSurveyQuestion( div, table, tbody, row, survey, question, sidx ) {
384 $n(row, 'ue_survey_question').appendChild(text(question.question()));
386 var selector = $n(row, 'ue_survey_answer');
387 var polldiv = $n(row, 'ue_survey_answer_poll');
389 var polltbody = $n(row, 'ue_survey_answer_poll_tbody');
390 var pollrow = polltbody.removeChild($n(polltbody, 'ue_survey_answer_poll_row'));
392 table.setAttribute('survey', survey.id());
393 row.setAttribute('question', question.id());
395 selector.onchange = function() {
396 row.setAttribute('answer', getSelectorVal(selector));
397 row.setAttribute('changed', '1');
400 if( sidx == 0 ) selector.id = 'ue_survey_selector_1';
402 for( var a in question.answers() ) {
404 var answer = question.answers()[a];
405 cachedSurveyAnswers[answer.id()] = answer;
407 if( survey.poll() ) {
410 var prow = pollrow.cloneNode(true);
413 $n(prow, 'ue_survey_answer_poll_answer').appendChild(text(answer.answer()));
416 var input = elem('input', {
418 name : 'survey_poll_answer_'+survey.id(),
422 input.onchange = function() {
423 row.setAttribute('answer', answer.id());
424 row.setAttribute('changed', '1');
427 $n(prow, 'ue_survey_answer_poll_radio').appendChild(input);
428 polltbody.appendChild(prow);
432 unHideMe(selector.parentNode);
433 setSelectorVal( selector, idx++, answer.answer(), answer.id() );
439 function uEditReapSurveys(patron) {
441 var div = $('uedit_surveys');
442 var tables = getElementsByTagNameFlat(div, 'table');
444 for( var t in tables ) {
446 var table = tables[t];
447 var survey = cachedSurveys[table.getAttribute('survey')];
448 var tbody = getElementsByTagNameFlat( table, 'tbody' )[0];
449 var rows = getElementsByTagNameFlat( tbody, 'tr' );
451 for( var r in rows ) {
453 if(!row.getAttribute('changed')) continue;
455 var resp = new asvr();
457 resp.survey(survey.id());
458 resp.usr(patron.id());
459 resp.question(row.getAttribute('question'));
460 resp.answer(row.getAttribute('answer'));
461 patron.survey_responses().push( resp );
471 /* returns true if an error occurred */
472 function uEditSetVal( obj, func, val, regxtype, errtype ) {
474 var error = uEditFetchError(errtype);
479 if( val == null ) { iserr = true; break; }
481 if(!instanceOf(val, String)) {
482 try { val = val.value; } catch(e) { return; }
485 if(val == "" ) { iserr = true; break; }
487 if(regxtype && regexes[regxtype]
488 && !val.match(regexes[regxtype]) ) { iserr = true; break; }
490 try { obj[func](val); } catch(e) {
491 alert("Error running function: " +func);
497 if(iserr) { ERRORS += error; return true; }
502 function uEditAddBasicPatronInfo(patron) {
506 /* make sure passwords match */
507 var p1 = $('ue_password1').value;
508 var p2 = $('ue_password1').value;
509 if( p1 != p2 || uEditSetVal( patron, "passwd", p1 ))
510 ERRORS += uEditFetchError('ue_bad_password');
512 uEditSetVal(patron, "usrname", $('ue_username'), null, 'ue_bad_username' );
513 uEditSetVal(patron, "first_given_name", $('ue_firstname'), null, 'ue_bad_firstname' );
514 uEditSetVal(patron, "second_given_name", $('ue_middlename'), null, 'ue_bad_middlename' );
515 uEditSetVal(patron, "family_name", $('ue_lastname'), null, 'ue_bad_lastname' );
516 uEditSetVal(patron, "dob", $('ue_dob'), 'date', 'ue_bad_dob' );
518 patron.suffix($('ue_suffix').value); /* suffis isn't required */
521 /* make sure emails match */
522 var email = $('ue_email1').value;
523 var email2 = $('ue_email2').value;
524 if( email != email2 || uEditSetVal(patron, "email", email, 'email' ))
525 ERRORS += uEditFetchError('ue_bad_email');
527 patron.home_ou(getSelectorVal($('ue_org_selector')));
530 function uEditAddPhones(patron) {
533 /* verifies the phone numbers are formatted correctly */
534 var verify = function(n1, n2, n3) {
538 if( !a || !p || !s ) return false;
539 return a + '-' + p + '-' + s;
543 var er = 'ue_bad_phone'
545 uEditSetVal( patron, "day_phone",
546 verify($('ue_day_phone_area'),
547 $('ue_day_phone_prefix'),
548 $('ue_day_phone_suffix')), 'phone', er );
550 uEditSetVal( patron, "evening_phone",
551 verify($('ue_night_phone_area'),
552 $('ue_night_phone_prefix'),
553 $('ue_night_phone_suffix')), 'phone', er );
555 uEditSetVal( patron, "other_phone",
556 verify($('ue_other_phone_area'),
557 $('ue_other_phone_prefix'),
558 $('ue_other_phone_suffix')), 'phone', er );
562 function uEditFleshCard(card) {
565 if(uEditSetVal( card, "barcode", $('ue_barcode'), null, 'ue_bad_barcode' ))
573 function uEditAddIdents(patron) {
575 var err = 'ue_no_ident';
577 uEditSetVal( patron, "ident_type",
578 getSelectorVal($('ue_primary_ident_type')), 'isnum', err );
580 uEditSetVal( patron, "ident_type2",
581 getSelectorVal($('ue_secondary_ident_type')), 'isnum', err );
583 uEditSetVal( patron, "ident_value",
584 $('ue_primary_ident'), null, err );
586 uEditSetVal( patron, "ident_value2",
587 $('ue_secondary_ident'), null, err );
592 function uEditBuildLibSelector( node, depth, selector ) {
593 if(!selector) selector = $('ue_org_selector');
594 if(!node) { depth = 0; node = globalOrgTree; }
596 var opt = insertSelectorVal( selector, -1, node.name(), node.id(), null, depth++ );
598 /* allow these orgs to be selectable via permission? */
599 if(!findOrgType(node.ou_type()).can_have_vols()) opt.disabled = true;
601 if( node.id() == USER.home_ou() ) setSelector(selector, node.id());
602 for( var c in node.children() )
603 uEditBuildLibSelector(node.children()[c], depth, selector);
606 function uEditFetchGroups() {
607 var req = new Request(FETCH_GROUPS);
608 req.callback(uEditDrawGroups);
612 function uEditDrawGroups(r, tree, depth, selector) {
615 tree = r.getResultObject();
618 selector = $('ue_profile');
621 insertSelectorVal( selector, -1, tree.name(), tree.id(), null, depth++ );
622 for( var c in tree.children() )
623 uEditDrawGroups( null, tree.children()[c], depth, selector );
628 function uEditAddGroupsAndPerms(patron) {
630 uEditSetVal( patron, "profile",
631 getSelectorVal($('ue_profile')), 'isnum', 'ue_no_profile');
633 var expire = $('ue_expire').value;
635 uEditSetVal( patron, "expire_date", expire, 'date', 'ue_bad_expire' );
637 if($('ue_active').checked) patron.active(1);
638 if($('ue_barred').checked) patron.barred(1);
639 if($('ue_group_lead').checked) patron.master_account(1);
641 uEditSetVal( patron, "claims_returned_count",
642 $('ue_claims_returned'), 'isnum', 'ue_bad_claims_returned');
644 if($('ue_alert_message').value)
645 uEditSetVal(patron, "alert_message", $('ue_alert_message'));
650 function uEditAddAddresses(patron) {
651 var tbody = $('ue_address_tbody');
652 patron.addresses([]);
654 /* shove the addresses living in the page into the patron */
655 for( var r in tbody.childNodes ) {
656 var row = tbody.childNodes[r];
657 if(!(row && row.nodeName == 'tr')) continue;
658 patron.addresses().push( uEditBuildAddress( patron, tbody, row ));
662 /* extracts a single address from the page */
663 var uEditVirtualAddrId = -1;
664 function uEditBuildAddress( patron, tbody, row ) {
666 var addr = new aua();
667 var id = row.getAttribute('exists');
674 addr.id(uEditVirtualAddrId--);
678 if($n(row, 'ue_addr_mailing_yes').checked) patron.mailing_address(addr.id());
679 if($n(row, 'ue_addr_billing_yes').checked) patron.billing_address(addr.id());
680 if($n(row, 'ue_addr_valid_yes').checked) addr.valid(1);
681 if($n(row, 'ue_addr_street2').value) addr.street2($n(row, 'ue_addr_street2').value);
683 uEditSetVal(addr, "address_type", $n(row, 'ue_addr_label'), null, 'ue_bad_addr_label' );
684 uEditSetVal(addr, "street1", $n(row, 'ue_addr_street1'), null, 'ue_bad_addr_street' );
685 uEditSetVal(addr, "city", $n(row, 'ue_addr_city'), null, 'ue_bad_addr_city' );
686 uEditSetVal(addr, "county", $n(row, 'ue_addr_county'), null, 'ue_bad_addr_county' );
687 uEditSetVal(addr, "state", $n(row, 'ue_addr_state'), null, 'ue_bad_addr_state' );
688 uEditSetVal(addr, "post_code", $n(row, 'ue_addr_zip'), null, 'ue_bad_addr_zip' );
689 uEditSetVal(addr, "country", $n(row, 'ue_addr_country'), null, 'ue_bad_addr_country' );
695 var uEditAddrTemplate;
696 var uEditOrigAddrRow;
697 function uEditFetchAddrs() {
699 var tbody = $('ue_address_tbody');
700 uEditAddrTemplate = tbody.removeChild($('ue_address_template'));
702 $('ue_address_new').onclick =
704 /* we have to retain the mailing/billing radio input values */
705 var rows = getElementsByTagNameFlat(tbody,'tr');
708 for( var r in rows ) {
710 if($n(row,'ue_addr_mailing_yes').checked) mailrow = row;
711 if($n(row,'ue_addr_billing_yes').checked) billrow = row;
713 var newrow = uEditAddrTemplate.cloneNode(true);
714 tbody.appendChild(newrow);
715 $n(newrow, 'ue_addr_label').focus();
716 if(mailrow) $n(mailrow,'ue_addr_mailing_yes').checked = true;
717 if(billrow) $n(billrow,'ue_addr_billing_yes').checked = true;
720 /* go ahead and add a blank addr */
722 var row = uEditAddrTemplate.cloneNode(true);
723 uEditOrigAddrRow = row;
724 $n( row, 'ue_addr_label').id = 'ue_addr_label_1';
725 tbody.appendChild(row);
731 function uEditShowSummary() {
733 var table = $('ue_summary_table').cloneNode(true);;
734 uEditFleshSummaryTable(table);
735 var win = window.open("", $('ue_summary_window').innerHTML );
736 win.document.body.innerHTML = "";
737 win.document.body.appendChild(table);
740 function uEditFleshSummaryTable(table) {
742 var yes = $('yes').innerHTML;
743 var no = $('no').innerHTML;
750 if( patron.ident_type() != null)
751 identt1 = identTypes[patron.ident_type()].name();
752 if( patron.ident_type2() != null )
753 identt2 = identTypes[patron.ident_type2()].name();
754 if( patron.home_ou() != null )
755 homeorg = findOrgUnit(patron.home_ou()).name();
756 if( patron.profile() != null )
757 profile = findTreeItemById(groupTree, patron.profile()).name();
760 $n(table, 'ue_summary_username').appendChild(text(patron.usrname()));
761 $n(table, 'ue_summary_firstname').appendChild(text(patron.first_given_name()));
762 $n(table, 'ue_summary_middlename').appendChild(text(patron.second_given_name()));
763 $n(table, 'ue_summary_lastname').appendChild(text(patron.family_name()));
764 $n(table, 'ue_summary_suffix').appendChild(text(patron.suffix()));
765 $n(table, 'ue_summary_dob').appendChild(text(patron.dob()));
766 $n(table, 'ue_summary_primary_ident_type').appendChild(text(identt1));
767 $n(table, 'ue_summary_primary_ident').appendChild(text(patron.ident_value()));
768 $n(table, 'ue_summary_secondary_ident_type').appendChild(text(identt2));
769 $n(table, 'ue_summary_secondary_ident').appendChild(text(patron.ident_value2()));
770 $n(table, 'ue_summary_email').appendChild(text(patron.email()));
771 $n(table, 'ue_summary_dayphone').appendChild(text(patron.day_phone()));
772 $n(table, 'ue_summary_nightphone').appendChild(text(patron.evening_phone()));
773 $n(table, 'ue_summary_otherphone').appendChild(text(patron.other_phone()));
774 $n(table, 'ue_summary_home_lib').appendChild(text(homeorg));
775 $n(table, 'ue_summary_profile').appendChild(text(profile));
776 $n(table, 'ue_summary_expire').appendChild(text(patron.expire_date()));
777 $n(table, 'ue_summary_family_lead').appendChild(text( (patron.master_account()) ? yes : no ));
778 $n(table, 'ue_summary_claims_returned').appendChild(text(patron.claims_returned_count()));
779 $n(table, 'ue_summary_alert_message').appendChild(text(patron.alert_message()));
781 uEditFleshSummaryAddresses( table, patron );
782 uEditFleshSummaryStatCats( table, patron );
783 uEditFleshSummarySurveys( table, patron );
784 uEditFleshSummaryErrors( table );
789 function uEditFleshSummaryAddresses( table, patron ) {
791 var addrtbody = $n(table, 'ue_summary_addr_tbody');
792 var rowtmpl = addrtbody.removeChild($n(addrtbody, 'ue_summary_addr_row'));
793 var yes = $('yes').innerHTML;
794 var no = $('no').innerHTML;
796 for( var a in patron.addresses() ) {
798 var address = patron.addresses()[a];
799 var row = rowtmpl.cloneNode(true);
801 $n(row, 'label').appendChild(text(address.address_type()));
802 $n(row, 'street1').appendChild(text(address.street1()));
803 $n(row, 'street2').appendChild(text(address.street2()));
804 $n(row, 'city').appendChild(text(address.city()));
805 $n(row, 'county').appendChild(text(address.county()));
806 $n(row, 'state').appendChild(text(address.state()));
807 $n(row, 'country').appendChild(text(address.country()));
808 $n(row, 'zip').appendChild(text(address.post_code()));
809 $n(row, 'valid').appendChild(text( (address.valid()) ? yes : no ));
811 $n(row, 'mailing').appendChild(text(
812 (patron.mailing_address() == address.id()) ? yes : no ));
814 $n(row, 'billing').appendChild(text(
815 (patron.billing_address() == address.id()) ? yes : no ));
817 addrtbody.appendChild(row);
822 function uEditFleshSummaryStatCats( table, patron ) {
823 var tbody = $n(table, 'ue_summary_stats_tbody');
824 var rowtmpl = tbody.removeChild($n(tbody, 'ue_summary_stats_row'));
825 for( var s in patron.stat_cat_entries() ) {
826 unHideMe($n(table, 'ue_summary_stat_cat_td'));
827 row = rowtmpl.cloneNode(true);
828 var entry = patron.stat_cat_entries()[s];
829 var cat = cachedStatCats[entry.stat_cat()];
830 $n(row, 'ue_summary_stat_name').appendChild(text(cat.name()));
831 $n(row, 'ue_summary_stat_value').appendChild(text(entry.stat_cat_entry()));
832 tbody.appendChild(row);
837 function uEditFleshSummarySurveys( table, patron ) {
838 var tbody = $n(table, 'ue_summary_survey_tbody');
839 var rowtmpl = tbody.removeChild($n(tbody, 'ue_summary_survey_row'));
840 for( var r in patron.survey_responses() ) {
841 unHideMe($n(table, 'ue_summary_survey_td'));
842 var row = rowtmpl.cloneNode(rowtmpl);
843 var resp = patron.survey_responses()[r];
844 var survey = cachedSurveys[resp.survey()];
845 var quest = cachedSurveyQuestions[resp.question()];
846 var answer = cachedSurveyAnswers[resp.answer()];
847 $n(row, 'ue_summary_survey_name').appendChild(text(survey.name()));
848 $n(row, 'ue_summary_survey_question').appendChild(text(quest.question()));
849 $n(row, 'ue_summary_survey_answer').appendChild(text(answer.answer()));
850 tbody.appendChild(row);
855 function uEditFleshSummaryErrors( table ) {
857 unHideMe($n(table, 'ue_summary_errors_row'));
858 var errors = ERRORS.replace(/\n/g, "<br/>");
859 $n(table, 'ue_summary_errors').innerHTML += errors;