1 /* -----------------------------------------------------------------------
2 UI code for the user editor. Handles breaking up the components
3 into a wizard-like interface.
4 ----------------------------------------------------------------------- */
17 /* ID's of objects that should be focused when their page is made visible */
23 'ue_stat_cat_selector_1',
24 'ue_survey_selector_1',
29 function uEditNext() {
30 var i = _findActive();
31 if( i < (pages.length - 1)) uEditShowPage(pages[i+1]);
35 function uEditPrev() {
36 var i = _findActive();
37 if( i > 0 ) uEditShowPage(pages[i-1]);
40 function uEditCheckErrors() {
41 var errors = uEditGetErrorStrings();
42 if(errors) unHideMe($('ue_errors'));
43 else hideMe($('ue_errors'));
47 function uEditFetchError(id) { if($(id)) return $(id).innerHTML + "\n"; return "";}
50 function uEditShowPage(id) {
51 if( id == null ) return;
53 for( var p in pages ) {
56 removeCSSClass($(page+'_label'), 'label_active');
59 var idx = _findPageIdx(id);
62 addCSSClass($(id+'_label'), 'label_active');
63 var fpage = pageFocus[idx];
66 if( id == 'uedit_addresses' )
67 pnode = $n( $('ue_address_tbody').
68 getElementsByTagName('tr')[0], 'ue_addr_label');
72 try{pnode.select()}catch(e){}
75 unHideMe($('ue_back'));
76 unHideMe($('ue_fwd'));
78 if(idx == 0) hideMe($('ue_back'));
79 if(idx == (pages.length-1)) hideMe($('ue_fwd'));
82 function _findActive() {
83 for( var p in pages ) {
84 if(! $(pages[p]).className.match(/hide_me/) )
90 function _findPageIdx(name) {
91 for( var i in pages ) {
93 if( page == name ) return i;
98 /* ------------------------------------------------------------------------------ */
99 /* Below are the various UI components built from retrieved data */
100 /* ------------------------------------------------------------------------------ */
104 function uEditBuildLibSelector( node, depth, selector ) {
105 if(!selector) selector = $('ue_org_selector');
106 if(!node) { depth = 0; node = globalOrgTree; }
107 var opt = insertSelectorVal(
108 selector, -1, node.name(), node.id(), null, depth++ );
109 if(!findOrgType(node.ou_type()).can_have_users()) opt.disabled = true;
110 if( node.id() == USER.ws_ou() )
111 setSelector(selector, node.id());
113 for( var c in node.children() )
114 uEditBuildLibSelector(node.children()[c], depth, selector);
118 /* group tree selector */
119 function uEditDrawGroups(tree, depth, selector, drawme) {
121 selector = $('ue_profile');
124 groupsCache[tree.id()] = tree;
126 /* if the staff does not have perms to access this group,
127 remove it from the tree and don't add it's children */
128 var perm = uEditFindGroupPerm(tree);
129 var org = PERMS[perm];
130 if( org == -1 ) drawme = false;
133 var opt = insertSelectorVal( selector, -1, tree.name(), tree.id(), null, depth++ );
134 if(!isTrue(tree.usergroup())) opt.disabled = true;
137 for( var c in tree.children() )
138 uEditDrawGroups( tree.children()[c], depth, selector, drawme );
142 function uEditFindGroupPerm(group) {
143 if(!group) return null;
144 if( group.application_perm() )
145 return group.application_perm();
146 return uEditFindGroupPerm(groupsCache[group.parent()]);
150 /* user identification types */
151 function uEditDrawIDTypes(types) {
152 var pri_sel = $('ue_primary_ident_type');
153 //var sec_sel = $('ue_secondary_ident_type');
155 for( var t in types ) {
157 if(!type.name()) continue;
158 identTypesCache[type.id()] = type;
159 setSelectorVal( pri_sel, idx, type.name(), type.id() );
160 //setSelectorVal( sec_sel, idx++, type.name(), type.id() );
165 /* user statistical catagories */
166 function uEditDrawStatCats(cats) {
167 var tbody = $('ue_stat_cat_tbody');
168 var templ = tbody.removeChild($('ue_stat_cat_row'));
170 for( var c in cats ) {
171 var row = templ.cloneNode(true);
172 uEditInsertCat( row, cats[c], c );
173 tbody.appendChild(row);
178 function uEditInsertCat( row, cat, idx ) {
180 cat.entries().sort( /* sort the entries by value */
182 if( !a.value() ) return -1;
183 if( !b.value() ) return 1;
184 if( (a.value()+'').toLowerCase() > (b.value()+'').toLowerCase()) return 1;
185 if( (a.value()+'').toLowerCase() < (b.value()+'').toLowerCase()) return -1;
190 statCatsCache[cat.id()] = cat;
192 /* register the new map object */
193 uEditBuildSCMField(cat, row);
195 var newval = $n(row, 'ue_stat_cat_newval');
196 var selector = $n(row, 'ue_stat_cat_selector');
198 selector.onchange = function() {
199 newval.value = getSelectorVal(selector);
200 if(newval.onchange) newval.onchange();
203 if( idx == 0 ) selector.id = 'ue_stat_cat_selector_1';
205 $n(row, 'ue_stat_cat_name').appendChild(text(cat.name()));
206 $n(row, 'ue_stat_cat_owner').appendChild(
207 text(fetchOrgUnit(cat.owner()).shortname()));
209 for( var e in cat.entries() ) {
210 var entry = cat.entries()[e];
211 setSelectorVal( selector,
212 (parseInt(e)+1), entry.value(), entry.value() );
216 /* draw the surveys */
217 function uEditDrawSurveys(surveys) {
219 patron.survey_responses([]); /* clear out all surveys up front */
221 var div = $('uedit_surveys');
222 var table = div.removeChild($('ue_survey_table'));
223 if( surveys.length == 0 ) unHideMe($('uedit_no_surveys'));
225 for( var s in surveys ) {
226 var survey = surveys[s];
227 surveysCache[survey.id()] = survey;
228 var clone = table.cloneNode(true);
229 uEditInsertSurvey( div, clone, survey, s );
230 div.appendChild(clone);
234 /* insert the servey then insert each of that surveys questions */
235 function uEditInsertSurvey( div, table, survey, sidx ) {
237 $n(table, 'ue_survey_name').appendChild(text(survey.name()));
238 $n(table, 'ue_survey_desc').appendChild(text(survey.description()));
240 var tbody = $n(table, 'ue_survey_tbody');
241 var templ = tbody.removeChild($n(table, 'ue_survey_row'));
243 for( var q in survey.questions() ) {
244 var row = templ.cloneNode(true);
245 var quest = survey.questions()[q];
246 uEditInsertSurveyQuestion( row, survey, quest );
247 tbody.appendChild(row);
251 function uEditInsertSurveyQuestion( row, survey, question ) {
253 var selector = $n(row, 'ue_survey_answer');
254 row.setAttribute('question', question.id());
255 $n(row, 'ue_survey_question').appendChild(text(question.question()));
257 for( var a in question.answers() ) {
258 var answer = question.answers()[a];
259 surveyAnswersCache[answer.id()] = answer;
260 insertSelectorVal(selector, -1, answer.answer(), answer.id() );
263 surveyQuestionsCache[question.id()] = question;
265 if( patron.isnew() && isTrue(survey.required()) )
266 addCSSClass(selector, 'invalid_value');
268 selector.onchange = function() {
270 /* remove any existing responses for this question */
271 patron.survey_responses(
272 grep( patron.survey_responses(),
274 return (item.question() != row.getAttribute('question'));
280 if(!patron.survey_responses())
281 patron.survey_responses([]);
283 var val = getSelectorVal(selector);
285 if( patron.isnew() && isTrue(survey.required()) ) {
287 removeCSSClass(selector, 'invalid_value');
289 addCSSClass(selector, 'invalid_value');
295 var resp = new asvr();
297 resp.survey(survey.id());
298 resp.usr(patron.id());
299 resp.question(row.getAttribute('question'));
301 patron.survey_responses().push( resp );
309 /* -----------------------------------------------------------------------
310 Spit out the patron info to the summary display tables...
311 ----------------------------------------------------------------------- */
313 function uEditShowSummary() {
314 hideMe($('main_div_container'));
315 unHideMe($('summary_div_container'));
317 for( var f in dataFields ) {
319 var field = dataFields[f];
320 if( field.object == patron ) {
322 var val = uEditNodeVal(field);
324 if( field.key == 'profile' ||
325 field.key == 'home_ou' ||
326 field.key == 'ident_type' ||
327 field.key == 'ident_type2') {
329 val = getSelectorName($(field.widget.id));
332 var node = $('ue_summary_'+field.key);
333 if(node) appendClear(node, text(val));
336 if( field.object == patron.card() )
337 appendClear($('ue_summary_barcode'), text(uEditNodeVal(field)));
341 var table = $('ue_summary_table');
342 uEditFleshSummaryAddresses( table, patron );
343 uEditFleshSummaryStatCats( table, patron );
344 uEditFleshSummarySurveys( table, patron );
349 var uEditSummaryAddrRow;
350 function uEditFleshSummaryAddresses( table, patron ) {
352 var addrtbody = $n(table, 'ue_summary_addr_tbody');
353 if(!uEditSummaryAddrRow)
354 uEditSummaryAddrRow =
355 addrtbody.removeChild($n(addrtbody, 'ue_summary_addr_row'));
356 var rowtmpl = uEditSummaryAddrRow;
357 removeChildren(addrtbody);
359 for( var a in patron.addresses() ) {
360 var address = patron.addresses()[a];
361 var row = rowtmpl.cloneNode(true);
362 uEditFleshSummaryAddr( address, patron, row );
363 addrtbody.appendChild(row);
364 if(address.isdeleted()) addCSSClass(row, 'deleted');
369 function uEditFleshSummaryAddr( address, patron, row ) {
370 var yes = $('yes').innerHTML;
371 var no = $('no').innerHTML;
373 $n(row, 'label').appendChild(text(address.address_type()));
374 $n(row, 'street1').appendChild(text(address.street1()));
375 $n(row, 'street2').appendChild(text(address.street2()));
376 $n(row, 'city').appendChild(text(address.city()));
377 $n(row, 'county').appendChild(text(address.county()));
378 $n(row, 'state').appendChild(text(address.state()));
379 $n(row, 'country').appendChild(text(address.country()));
380 $n(row, 'zip').appendChild(text(address.post_code()));
381 $n(row, 'valid').appendChild(text( (isTrue(address.valid())) ? yes : no ));
382 $n(row, 'incorporated').appendChild(text( (isTrue(address.within_city_limits())) ? yes : no ));
384 var mid = patron.mailing_address();
385 if( typeof patron.mailing_address() == 'object' )
386 mid = patron.mailing_address().id();
387 $n(row, 'mailing').appendChild(text((mid == address.id()) ? yes : no ));
389 var bid = patron.billing_address();
390 if( typeof patron.billing_address() == 'object' )
391 bid = patron.billing_address().id();
392 $n(row, 'billing').appendChild(text((bid == address.id()) ? yes : no ));
397 var uEditSummaryStatCatRow;
398 function uEditFleshSummaryStatCats( table, patron ) {
399 var tbody = $n(table, 'ue_summary_stats_tbody');
401 if(!uEditSummaryStatCatRow)
402 uEditSummaryStatCatRow =
403 tbody.removeChild($n(tbody, 'ue_summary_stats_row'));
404 var rowtmpl = uEditSummaryStatCatRow;
405 removeChildren(tbody);
407 for( var s in patron.stat_cat_entries() ) {
408 row = rowtmpl.cloneNode(true);
409 var entry = patron.stat_cat_entries()[s];
410 var cat = statCatsCache[entry.stat_cat()];
411 $n(row, 'ue_summary_stat_name').appendChild(text(cat.name()));
412 $n(row, 'ue_summary_stat_value').appendChild(text(entry.stat_cat_entry()));
413 row.setAttribute('statcat', entry.stat_cat());
414 if( entry.isdeleted() ) addCSSClass(row, 'deleted');
415 tbody.appendChild(row);
418 if( ! getElementsByTagNameFlat( tbody, 'tr' )[0] )
419 hideMe(tbody.parentNode);
421 unHideMe(tbody.parentNode);
426 var uEditSummarySurveyRow;
427 function uEditFleshSummarySurveys( table, patron ) {
429 var tbody = $n(table, 'ue_summary_survey_tbody');
430 if(!uEditSummarySurveyRow)
431 uEditSummarySurveyRow =
432 tbody.removeChild($n(tbody, 'ue_summary_survey_row'));
433 var rowtmpl = uEditSummarySurveyRow;
435 removeChildren(tbody);
437 for( var r in patron.survey_responses() ) {
438 var row = rowtmpl.cloneNode(true);
439 var resp = patron.survey_responses()[r];
440 var survey = surveysCache[resp.survey()];
441 var quest = surveyQuestionsCache[resp.question()];
442 var answer = surveyAnswersCache[resp.answer()];
443 $n(row, 'ue_summary_survey_name').appendChild(text(survey.name()));
444 $n(row, 'ue_summary_survey_question').appendChild(text(quest.question()));
445 $n(row, 'ue_summary_survey_answer').appendChild(text(answer.answer()));
446 tbody.appendChild(row);
449 if( ! getElementsByTagNameFlat(tbody, 'tr')[0])
450 hideMe(tbody.parentNode);
452 unHideMe(tbody.parentNode);
456 function uEditDrawNetLevels(netLevels) {
457 var sel = $('ue_net_level');
460 insertSelectorVal( sel, -1, i.name(), i.id() );
463 setSelector(sel, defaultNetLevel);