11 var required_user_parts = {
13 first_given_name:'First Name',
14 family_name:'Last Name',
16 ident_type:'Primary Identification Type',
17 ident_value:'Primary Identification',
18 day_phone:'Daytime Phone',
19 home_ou:'Home Library',
20 profile:'Profile Group',
23 var required_addr_parts = {
29 address_type:'Address Label',
32 function set_perm(row) {
33 var pid = findNodeByName(row,'p.code').getAttribute('permid');
34 var papply = findNodeByName(row,'p.id').checked;
35 var pdepth = findNodeByName(row,'p.depth').options[findNodeByName(row,'p.depth').selectedIndex].value;
36 var pgrant = findNodeByName(row,'p.grantable').checked;
39 for (var i in user_perms) {
40 if (user_perms[i].perm() == pid) {
46 p.grantable(pgrant ? 1 : 0);
65 p.grantable(pgrant ? 1 : 0);
73 function reset_crc () {
74 document.forms.editor.elements["user.claims_returned_count"].value = '0';
75 user.claims_returned_count(0);
78 function clear_alert_message () {
79 document.forms.editor.elements["user.alert_message"].value = ' ';
80 user.alert_message('');
83 function save_user () {
86 //alert( js2JSON(user.stat_cat_entries()) );
91 for (var i in user_perms) {
92 if (!user_perms[i].depth()) {
94 for (var j in perm_list) {
95 if (perm_list[j].id() == user_perms[i].perm()) {
100 throw "Depth is required on the " + p.code() + " permission.";
104 user.permissions(user_perms);
106 for (var i in required_user_parts) {
108 throw required_user_parts[i] + " is required.";
112 for (var j in user.addresses()) {
113 if (user.addresses()[j].isdeleted()) continue;
115 for (var i in required_addr_parts) {
116 if (!user.addresses()[j][i]()) {
117 throw required_addr_parts[i] + " is required.";
123 for (var i in responses) {
125 for (var j in responses[i]) {
131 r.answer(responses[i][j]);
132 r.answer_date( document.getElementById('e_date_'+i).value );
137 user.survey_responses( res );
141 if (user.billing_address().isdeleted())
142 throw "Please select a valid Billing Address";
144 if (user.mailing_address().isdeleted())
145 throw "Please select a valid Mailing Address";
147 var req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.patron.update', ses_id, user );
149 var ok = req.getResultObject();
151 if (ok.ilsevent) throw ok;
153 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.set_groups', ses_id, ok.id(), user_groups );
155 req.getResultObject();
158 alert( 'User ' + ok.usrname() +
159 ' [' + ok.card().barcode() + '] ' +
160 ' successfully saved!');
167 alert( js2JSON( e ));
180 var adv_mode = false;
181 function apply_adv_mode (root) {
182 adv_items = findNodesByClass(root,'advanced');
183 for (var i in adv_items) {
185 removeCSSClass(adv_items[i], 'hideme') :
186 addCSSClass(adv_items[i], 'hideme');
190 function init_editor (u) {
192 var x = document.getElementById('editor').elements;
196 if (cgi.param('adv')) adv_mode = true;
197 apply_adv_mode(document.getElementById('editor'));
200 ses_id = cgi.param('ses');
202 var usr_id = cgi.param('usr');
203 var usr_barcode = cgi.param('barcode');
204 if (!usr_id && !usr_barcode) {
210 user.mailing_address( new aua() );
211 user.mailing_address().isnew(1);
212 user.mailing_address().id(fakeid());
214 user.billing_address( user.mailing_address() );
216 user.card( new ac() );
217 user.card().isnew(1);
218 user.card().id(fakeid());
221 user.addresses().push(user.mailing_address());
224 user.cards().push(user.card());
229 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve', ses_id, usr_id );
231 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve_by_barcode', ses_id, usr_barcode );
234 user = req.getResultObject();
241 if (user.id() > 0) x['user.id'].value = user.id();
242 if (cgi.param('adv')) x['user.id'].parentNode.parentNode.setAttribute('adv', 'false');
244 if (user.create_date()) x['user.create_date'].value = user.create_date();
246 if (user.usrname()) x['user.usrname'].value = user.usrname();
247 x['user.usrname'].setAttribute('onchange','user.usrname(this.value)');
249 if (user.card() && user.card().barcode()) x['user.card.barcode'].value = user.card().barcode();
250 x['user.card.barcode'].setAttribute('onchange','user.card().barcode(this.value)');
252 x['user.card.barcode'].disabled = false;
254 x['replace_card'].className = '';
255 x['replace_card'].setAttribute('onclick',
256 'user.card(new ac()); ' +
257 'user.card().isnew(1); ' +
258 'user.card().id(fakeid()); ' +
259 'user.cards().push(user.card()); ' +
260 'this.parentNode.firstChild.disabled = false; ' +
261 'this.parentNode.firstChild.value = ""; ' +
262 'this.parentNode.firstChild.focus(); ' +
267 if (user.passwd()) x['user.passwd'].value = user.passwd();
268 x['user.passwd'].setAttribute('onchange','user.passwd(this.value)');
270 if (user.prefix()) x['user.prefix'].value = user.prefix();
271 x['user.prefix'].setAttribute('onchange','user.prefix(this.value)');
273 if (user.first_given_name()) x['user.first_given_name'].value = user.first_given_name();
274 x['user.first_given_name'].setAttribute('onchange','user.first_given_name(this.value)');
276 if (user.second_given_name()) x['user.second_given_name'].value = user.second_given_name();
277 x['user.second_given_name'].setAttribute('onchange','user.second_given_name(this.value);');
279 if (user.family_name()) x['user.family_name'].value = user.family_name();
280 x['user.family_name'].setAttribute('onchange','user.family_name(this.value)');
282 if (user.suffix()) x['user.suffix'].value = user.suffix();
283 x['user.suffix'].setAttribute('onchange','user.suffix(this.value)');
285 if (user.dob()) x['user.dob'].value = user.dob();
286 x['user.dob'].setAttribute('onchange','user.dob(this.value)');
288 if (user.ident_value()) x['user.ident_value'].value = user.ident_value();
289 x['user.ident_value'].setAttribute('onchange','user.ident_value(this.value)');
291 if (user.ident_value2()) x['user.ident_value2'].value = user.ident_value2();
292 x['user.ident_value2'].setAttribute('onchange','user.ident_value2(this.value)');
294 if (user.email()) x['user.email'].value = user.email();
295 x['user.email'].setAttribute('onchange','user.email(this.value)');
297 if (user.day_phone()) x['user.day_phone'].value = user.day_phone();
298 x['user.day_phone'].setAttribute('onchange','user.day_phone(this.value)');
300 if (user.evening_phone()) x['user.evening_phone'].value = user.evening_phone();
301 x['user.evening_phone'].setAttribute('onchange','user.evening_phone(this.value)');
303 if (user.other_phone()) x['user.other_phone'].value = user.other_phone();
304 x['user.other_phone'].setAttribute('onchange','user.other_phone(this.value)');
306 if (user.expire_date()) x['user.expire_date'].value = user.expire_date();
307 x['user.expire_date'].setAttribute('onchange','user.expire_date(this.value)');
309 if (user.active()) x['user.active'].checked = true;
310 x['user.active'].setAttribute('onchange','user.active(this.checked ? "t" : "f" )');
312 if (user.master_account()) x['user.master_account'].checked = true;
313 x['user.master_account'].setAttribute('onchange','user.master_account(this.checked ? "t" : "f" )');
315 if (user.super_user()) x['user.super_user'].checked = true;
316 x['user.super_user'].setAttribute('onchange','user.super_user(this.checked ? "t" : "f" )');
317 if (cgi.param('adv')) x['user.super_user'].parentNode.parentNode.setAttribute('adv', 'false');
319 if (user.barred()) x['user.barred'].checked = true;
320 x['user.barred'].setAttribute('onchange','user.barred(this.checked ? "t" : "f" )');
321 if (cgi.param('adv')) x['user.barred'].parentNode.parentNode.setAttribute('adv', 'false');
323 if (user.claims_returned_count()) x['user.claims_returned_count'].value = user.claims_returned_count();
324 // onchange handled by func above
326 if (user.alert_message()) x['user.alert_message'].value = user.alert_message();
327 x['user.alert_message'].setAttribute('onchange','user.alert_message(this.value)');
330 // set up the home_ou selector
331 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.org_tree.retrieve' );
333 orgTree = req.getResultObject();
339 { label_field : 'name',
341 empty_label : '-- Required --',
344 child_field_name : 'children' }
347 x['user.home_ou'].setAttribute('onchange','user.home_ou(this.options[this.selectedIndex].value)');
349 // set up the ident_type selector
350 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.ident_types.retrieve' );
352 ident_type_list = req.getResultObject();
358 { label_field : 'name',
360 empty_label : '-- Required --',
365 x['user.ident_type'].setAttribute('onchange','user.ident_type(this.options[this.selectedIndex].value)');
370 (user.ident_value2 == '' ? user.ident_type2() : ''),
371 { label_field : 'name',
373 empty_label : '-- Optional --',
378 x['user.ident_type2'].setAttribute('onchange','var x = this.options[this.selectedIndex].value; x ? user.ident_type2(x) : user.ident_type2(null);');
382 // set up the barred checkbox
383 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.standings.retrieve' );
385 standing_list = req.getResultObject();
391 { label_field : 'value',
393 empty_label : '-- Required --',
398 x['user.standing'].setAttribute('onchange','user.standing(this.options[this.selectedIndex].value)');
401 // set up the profile selector
402 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.groups.tree.retrieve' );
404 group_tree = req.getResultObject();
410 { label_field : 'name',
412 empty_label : '-- Required --',
415 child_field_name : 'children' }
418 x['user.profile'].setAttribute('onchange','user.profile(this.options[this.selectedIndex].value)');
420 // set up the profile selector
421 var user_group_objects = [];
423 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.get_groups', ses_id, user.id() );
425 user_group_objects = req.getResultObject();
429 for (var i in user_group_objects) {
430 user_groups.push(user_group_objects[i].grp());
437 { label_field : 'name',
440 child_field_name : 'children' }
443 x['permgroups'].setAttribute( 'onchange',
444 'window.user_groups = [];' +
445 'for (var i = 0; i < this.options.length; i++) {' +
446 ' if (this.options[i].selected)' +
447 ' window.user_groups.push(this.options[i].value);' +
450 display_all_addresses();
452 if (cgi.param('adv')) x['permgroups'].parentNode.parentNode.setAttribute('adv', 'false');
454 req = new RemoteRequest( 'open-ils.circ', 'open-ils.circ.survey.retrieve.required', ses_id );
456 surveys = req.getResultObject();
458 var f = document.getElementById('surveys');
459 while (f.firstChild) f.removeChild(f.lastChild);
461 for ( var i in surveys )
462 display_survey( f, surveys[i].id(), user.id() );
464 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id );
466 var staff_perms = req.getResultObject();
471 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id, user.id() );
473 var up = req.getResultObject();
476 user_perms.push(up[i]);
479 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.retrieve' );
481 perm_list = req.getResultObject();
484 f = document.getElementById('permissions');
485 while (f.firstChild) f.removeChild(f.lastChild);
487 for (var i in perm_list)
488 display_perm(f,perm_list[i],staff_perms);
491 req = new RemoteRequest( 'open-ils.circ', 'open-ils.circ.stat_cat.actor.retrieve.all', ses_id );
493 var sc_list = req.getResultObject();
495 var missing_scs = [];
496 for (var i in user.stat_cat_entries()) {
498 for (var j in sc_list) {
499 if (sc_list[j].id() == user.stat_cat_entries()[i].stat_cat()) {
505 missing_scs.push(user.stat_cat_entries()[i].stat_cat());
508 req = new RemoteRequest( 'open-ils.circ', 'open-ils.circ.stat_cat.actor.retrieve.batch', ses_id, missing_scs );
510 var foreign_sc_list = req.getResultObject();
512 f = document.getElementById('statcats');
513 while (f.firstChild) f.removeChild(f.lastChild);
515 for (var i in sc_list)
516 display_sc(f,sc_list[i],user.stat_cat_entries());
518 for (var i in foreign_sc_list)
519 display_sc(f,foreign_sc_list[i],user.stat_cat_entries(), true);
524 function set_sc_value (node) {
525 var id = parseInt(node.getAttribute('scid'));
526 var value = node.value;
530 for (var i in user.stat_cat_entries()) {
531 if (user.stat_cat_entries()[i].stat_cat() == id) {
532 user.stat_cat_entries()[i].stat_cat_entry(value);
534 user.stat_cat_entries()[i].isdeleted(1);
536 user.stat_cat_entries()[i].isdeleted(0);
537 user.stat_cat_entries()[i].ischanged(1);
539 sc = user.stat_cat_entries()[i];
547 sc.stat_cat_entry(value);
549 sc.target_usr(user.id());
551 user.stat_cat_entries().push(sc);
555 function display_sc (root,sc_def, user_scs, foreign) {
558 for (var i in user_scs) {
559 if (sc_def.id() == user_scs[i].stat_cat()) {
565 var sc_row = findNodeByName(document.getElementById('statcat-tmpl'), 'scrow').cloneNode(true);
566 root.appendChild(sc_row);
568 findNodeByName(sc_row,'sc.name').appendChild(text(sc_def.name()));
570 var text_box = findNodeByName(sc_row,'sce.value');
571 text_box.setAttribute('scid', sc_def.id());
572 if (sc) text_box.value = sc.stat_cat_entry();
575 if (sc_def.entries().length > 0) {
576 var selector = findNodeByName(sc_row,'sce_select');
577 selector.id = 'scid-' + sc_def.id();
579 removeCSSClass(selector.parentNode, 'hideme');
582 'scid-' + sc_def.id(),
584 (sc ? sc.stat_cat_entry() : ''),
585 { label_field : 'value',
586 value_field : 'value',
587 empty_label : '-- Select One --',
593 text_box.disabled = true;
594 text_box.parentNode.appendChild(text('(Foreign Stat Cat)'));
598 function display_perm (root,perm_def,staff_perms) {
600 var prow = findNodeByName(document.getElementById('permission-tmpl'), 'prow').cloneNode(true);
601 root.appendChild(prow);
604 for (var i in staff_perms) {
605 if (staff_perms[i].perm() == -1) {
614 for (var i in staff_perms) {
615 if (perm_def.id() == staff_perms[i].perm() || staff_perms[i].perm() == -1) {
622 for (var i in user_perms) {
623 if (perm_def.id() == user_perms[i].perm() && user_perms[i].id() > 0)
629 if (!sp || !sp.grantable()) dis = true;
630 if (all) dis = false;
632 var label_cell = findNodeByName(prow,'plabel');
633 findNodeByName(label_cell,'p.code').appendChild(text(perm_def.code()));
634 findNodeByName(label_cell,'p.code').setAttribute('title', perm_def.description());
635 findNodeByName(label_cell,'p.code').setAttribute('permid', perm_def.id());
637 var apply_cell = findNodeByName(prow,'papply');
638 findNodeByName(apply_cell,'p.id').disabled = dis;
639 findNodeByName(apply_cell,'p.id').checked = up ? true : false;
641 var depth_cell = findNodeByName(prow,'pdepth');
642 findNodeByName(depth_cell,'p.depth').disabled = dis;
643 findNodeByName(depth_cell,'p.depth').id = 'perm-depth-' + perm_def.id();
645 'perm-depth-' + perm_def.id(),
647 (up ? up.depth() : findOrgDepth(user.home_ou())),
648 { label_field : 'name',
649 value_field : 'depth',
650 empty_label : '-- Select One --',
655 var grant_cell = findNodeByName(prow,'pgrant');
656 findNodeByName(grant_cell,'p.grantable').disabled = dis;
657 findNodeByName(grant_cell,'p.grantable').checked = up ? (up.grantable() ? true : false) : false;
661 function display_all_addresses () {
662 d = document.getElementById('addresses');
664 d.removeChild(d.lastChild);
666 for (var i in user.addresses())
667 display_address(document.getElementById('addresses'), user.addresses()[i]);
670 function new_addr () {
675 user.addresses().push(x);
676 display_address(document.getElementById('addresses'), x);
679 function display_survey (div, sid, uid) {
681 var t = document.getElementById('survey-tmpl').firstChild.cloneNode(true);
684 init_survey(t,sid,uid);
687 function display_address (div, adr) {
690 if (adr.isdeleted()) dis = true;
692 var t = document.getElementById('addr-tmpl').getElementsByTagName('table')[0].cloneNode(true);
697 x = findNodeByName(t, 'adr.address_type');
699 if (adr.address_type()) x.value = adr.address_type();
700 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').address_type(this.value)');
702 x = findNodeByName(t, 'adr.street1');
704 if (adr.street1()) x.value = adr.street1();
705 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').street1(this.value)');
707 x = findNodeByName(t, 'adr.street2');
709 if (adr.street2()) x.value = adr.street2();
710 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').street2(this.value)');
712 x = findNodeByName(t, 'adr.city');
714 if (adr.city()) x.value = adr.city();
715 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').city(this.value)');
717 x = findNodeByName(t, 'adr.state');
719 if (adr.state()) x.value = adr.state();
720 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').state(this.value)');
722 x = findNodeByName(t, 'adr.post_code');
724 if (adr.post_code()) x.value = adr.post_code();
725 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').post_code(this.value)');
727 x = findNodeByName(t, 'adr.county');
729 if (adr.county()) x.value = adr.county();
730 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').county(this.value)');
732 x = findNodeByName(t, 'adr.country');
734 if (adr.country()) x.value = adr.country();
735 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').country(this.value)');
737 x = findNodeByName(t, 'adr.valid');
739 if (adr.valid()) x.checked = true;
740 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').valid(this.checked ? "t" : "f")');
742 x = findNodeByName(t, 'is_mailing');
745 x.setAttribute( 'onclick', 'user.mailing_address(findAddressById(' + adr.id() + '))');
746 if (adr.id() == user.mailing_address().id()) {
750 x = findNodeByName(t, 'is_billing');
753 x.setAttribute( 'onclick', 'user.billing_address(findAddressById(' + adr.id() + '))');
754 if (adr.id() == user.billing_address().id()) {
758 x = findNodeByName(t, 'remove');
760 x.setAttribute('onclick', 'unremove_adr(' + adr.id() + '); return false;');
761 x.innerHTML = "Undelete this address";
763 x.setAttribute('onclick', 'remove_adr(' + adr.id() + '); return false;');
770 function unremove_adr (id) {
771 findAddressById(id).isdeleted(0);
772 display_all_addresses();
775 function remove_adr (id) {
776 findAddressById(id).isdeleted(1);
777 display_all_addresses();
780 function findAddressById (id) {
781 for (var i in user.addresses())
782 if (user.addresses()[i].id() == id) return user.addresses()[i];
786 function selectBuilder (id, objects, def, args) {
787 var label_field = args['label_field'];
788 var value_field = args['value_field'];
789 var depth = args['depth'];
791 if (!depth) depth = 0;
793 args['depth'] = parseInt(depth) + 1;
795 var child_field_name = args['child_field_name'];
798 if (typeof sel != 'object')
799 sel = document.getElementById(sel);
802 for (var o in sel.options) {
803 sel.options[o] = null;
805 args['clear'] = false;
806 if (args['empty_label']) {
807 sel.options[0] = new Option( args['empty_label'], args['empty_value'] );
808 sel.selectedIndex = 0;
812 for (var i in objects) {
813 var l = objects[i][label_field];
814 var v = objects[i][value_field];
816 if (typeof l == 'function')
817 l = objects[i][label_field]();
819 if (typeof v == 'function')
820 v = objects[i][value_field]();
822 var opt = new Option( l, v );
826 opt.style.paddingLeft = '' + d + 'px';
829 sel.options[sel.options.length] = opt;
832 if (typeof def == 'object') {
834 if (v == def[j]) opt.selected = true;
837 if (v == def) opt.selected = true;
840 if (child_field_name) {
841 var c = objects[i][child_field_name];
842 if (typeof c == 'function')
843 c = objects[i][child_field_name]();
849 { label_field : args['label_field'],
850 value_field : args['value_field'],
851 depth : args['depth'],
852 child_field_name : args['child_field_name'] }
859 function findNodesByClass(root, nodeClass, list) {
861 if( !root || !nodeClass) {
865 if(root.nodeType != 1) {
869 if(root.className.match(nodeClass)) list.push( root );
871 var children = root.childNodes;
873 for( var i = 0; i != children.length; i++ ) {
874 findNodesByClass(children[i], nodeClass, list);