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 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.set_groups', ses_id, ok.id(), user_groups );
153 req.getResultObject();
156 alert( 'User ' + ok.usrname() +
157 ' [' + ok.card().barcode() + '] ' +
158 ' successfully saved!');
165 alert( js2JSON( e ));
178 var adv_mode = false;
179 function apply_adv_mode (root) {
180 adv_items = findNodesByClass(root,'advanced');
181 for (var i in adv_items) {
183 removeCSSClass(adv_items[i], 'hideme') :
184 addCSSClass(adv_items[i], 'hideme');
188 function init_editor (u) {
190 var x = document.getElementById('editor').elements;
194 if (cgi.param('adv')) adv_mode = true;
195 apply_adv_mode(document.getElementById('editor'));
198 ses_id = cgi.param('ses');
200 var usr_id = cgi.param('usr');
201 var usr_barcode = cgi.param('barcode');
202 if (!usr_id && !usr_barcode) {
208 user.mailing_address( new aua() );
209 user.mailing_address().isnew(1);
210 user.mailing_address().id(fakeid());
212 user.billing_address( user.mailing_address() );
214 user.card( new ac() );
215 user.card().isnew(1);
216 user.card().id(fakeid());
219 user.addresses().push(user.mailing_address());
222 user.cards().push(user.card());
227 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve', ses_id, usr_id );
229 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve_by_barcode', ses_id, usr_barcode );
232 user = req.getResultObject();
239 if (user.id() > 0) x['user.id'].value = user.id();
240 if (cgi.param('adv')) x['user.id'].parentNode.parentNode.setAttribute('adv', 'false');
242 if (user.create_date()) x['user.create_date'].value = user.create_date();
244 if (user.usrname()) x['user.usrname'].value = user.usrname();
245 x['user.usrname'].setAttribute('onchange','user.usrname(this.value)');
247 if (user.card() && user.card().barcode()) x['user.card.barcode'].value = user.card().barcode();
248 x['user.card.barcode'].setAttribute('onchange','user.card().barcode(this.value)');
250 x['user.card.barcode'].disabled = false;
252 x['replace_card'].className = '';
253 x['replace_card'].setAttribute('onclick',
254 'user.card(new ac()); ' +
255 'user.card().isnew(1); ' +
256 'user.card().id(fakeid()); ' +
257 'user.cards().push(user.card()); ' +
258 'this.parentNode.firstChild.disabled = false; ' +
259 'this.parentNode.firstChild.value = ""; ' +
260 'this.parentNode.firstChild.focus(); ' +
265 if (user.passwd()) x['user.passwd'].value = user.passwd();
266 x['user.passwd'].setAttribute('onchange','user.passwd(this.value)');
268 if (user.prefix()) x['user.prefix'].value = user.prefix();
269 x['user.prefix'].setAttribute('onchange','user.prefix(this.value)');
271 if (user.first_given_name()) x['user.first_given_name'].value = user.first_given_name();
272 x['user.first_given_name'].setAttribute('onchange','user.first_given_name(this.value)');
274 if (user.second_given_name()) x['user.second_given_name'].value = user.second_given_name();
275 x['user.second_given_name'].setAttribute('onchange','user.second_given_name(this.value);');
277 if (user.family_name()) x['user.family_name'].value = user.family_name();
278 x['user.family_name'].setAttribute('onchange','user.family_name(this.value)');
280 if (user.suffix()) x['user.suffix'].value = user.suffix();
281 x['user.suffix'].setAttribute('onchange','user.suffix(this.value)');
283 if (user.dob()) x['user.dob'].value = user.dob();
284 x['user.dob'].setAttribute('onchange','user.dob(this.value)');
286 if (user.ident_value()) x['user.ident_value'].value = user.ident_value();
287 x['user.ident_value'].setAttribute('onchange','user.ident_value(this.value)');
289 if (user.ident_value2()) x['user.ident_value2'].value = user.ident_value2();
290 x['user.ident_value2'].setAttribute('onchange','user.ident_value2(this.value)');
292 if (user.email()) x['user.email'].value = user.email();
293 x['user.email'].setAttribute('onchange','user.email(this.value)');
295 if (user.day_phone()) x['user.day_phone'].value = user.day_phone();
296 x['user.day_phone'].setAttribute('onchange','user.day_phone(this.value)');
298 if (user.evening_phone()) x['user.evening_phone'].value = user.evening_phone();
299 x['user.evening_phone'].setAttribute('onchange','user.evening_phone(this.value)');
301 if (user.other_phone()) x['user.other_phone'].value = user.other_phone();
302 x['user.other_phone'].setAttribute('onchange','user.other_phone(this.value)');
304 if (user.expire_date()) x['user.expire_date'].value = user.expire_date();
305 x['user.expire_date'].setAttribute('onchange','user.expire_date(this.value)');
307 if (user.active()) x['user.active'].checked = true;
308 x['user.active'].setAttribute('onchange','user.active(this.checked ? "t" : "f" )');
310 if (user.master_account()) x['user.master_account'].checked = true;
311 x['user.master_account'].setAttribute('onchange','user.master_account(this.checked ? "t" : "f" )');
313 if (user.super_user()) x['user.super_user'].checked = true;
314 x['user.super_user'].setAttribute('onchange','user.super_user(this.checked ? "t" : "f" )');
315 if (cgi.param('adv')) x['user.super_user'].parentNode.parentNode.setAttribute('adv', 'false');
317 if (user.barred()) x['user.barred'].checked = true;
318 x['user.barred'].setAttribute('onchange','user.barred(this.checked ? "t" : "f" )');
319 if (cgi.param('adv')) x['user.barred'].parentNode.parentNode.setAttribute('adv', 'false');
321 if (user.claims_returned_count()) x['user.claims_returned_count'].value = user.claims_returned_count();
322 // onchange handled by func above
324 if (user.alert_message()) x['user.alert_message'].value = user.alert_message();
325 x['user.alert_message'].setAttribute('onchange','user.alert_message(this.value)');
328 // set up the home_ou selector
329 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.org_tree.retrieve' );
331 orgTree = req.getResultObject();
337 { label_field : 'name',
339 empty_label : '-- Required --',
342 child_field_name : 'children' }
345 x['user.home_ou'].setAttribute('onchange','user.home_ou(this.options[this.selectedIndex].value)');
347 // set up the ident_type selector
348 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.ident_types.retrieve' );
350 ident_type_list = req.getResultObject();
356 { label_field : 'name',
358 empty_label : '-- Required --',
363 x['user.ident_type'].setAttribute('onchange','user.ident_type(this.options[this.selectedIndex].value)');
368 (user.ident_value2 == '' ? user.ident_type2() : ''),
369 { label_field : 'name',
371 empty_label : '-- Optional --',
376 x['user.ident_type2'].setAttribute('onchange','var x = this.options[this.selectedIndex].value; x ? user.ident_type2(x) : user.ident_type2(null);');
380 // set up the barred checkbox
381 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.standings.retrieve' );
383 standing_list = req.getResultObject();
389 { label_field : 'value',
391 empty_label : '-- Required --',
396 x['user.standing'].setAttribute('onchange','user.standing(this.options[this.selectedIndex].value)');
399 // set up the profile selector
400 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.groups.tree.retrieve' );
402 group_tree = req.getResultObject();
408 { label_field : 'name',
410 empty_label : '-- Required --',
413 child_field_name : 'children' }
416 x['user.profile'].setAttribute('onchange','user.profile(this.options[this.selectedIndex].value)');
418 // set up the profile selector
419 var user_group_objects = [];
421 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.get_groups', ses_id, user.id() );
423 user_group_objects = req.getResultObject();
427 for (var i in user_group_objects) {
428 user_groups.push(user_group_objects[i].grp());
435 { label_field : 'name',
438 child_field_name : 'children' }
441 x['permgroups'].setAttribute( 'onchange',
442 'window.user_groups = [];' +
443 'for (var i = 0; i < this.options.length; i++) {' +
444 ' if (this.options[i].selected)' +
445 ' window.user_groups.push(this.options[i].value);' +
448 display_all_addresses();
450 if (cgi.param('adv')) x['permgroups'].parentNode.parentNode.setAttribute('adv', 'false');
452 req = new RemoteRequest( 'open-ils.circ', 'open-ils.circ.survey.retrieve.required', ses_id );
454 surveys = req.getResultObject();
456 var f = document.getElementById('surveys');
457 while (f.firstChild) f.removeChild(f.lastChild);
459 for ( var i in surveys )
460 display_survey( f, surveys[i].id(), user.id() );
462 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id );
464 var staff_perms = req.getResultObject();
469 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id, user.id() );
471 var up = req.getResultObject();
474 user_perms.push(up[i]);
477 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.retrieve' );
479 perm_list = req.getResultObject();
482 f = document.getElementById('permissions');
483 while (f.firstChild) f.removeChild(f.lastChild);
485 for (var i in perm_list)
486 display_perm(f,perm_list[i],staff_perms);
489 req = new RemoteRequest( 'open-ils.circ', 'open-ils.circ.stat_cat.actor.retrieve.all', ses_id );
491 var sc_list = req.getResultObject();
493 var missing_scs = [];
494 for (var i in user.stat_cat_entries()) {
496 for (var j in sc_list) {
497 if (sc_list[j].id() == user.stat_cat_entries()[i].stat_cat()) {
503 missing_scs.push(user.stat_cat_entries()[i].stat_cat());
506 req = new RemoteRequest( 'open-ils.circ', 'open-ils.circ.stat_cat.actor.retrieve.batch', ses_id, missing_scs );
508 var foreign_sc_list = req.getResultObject();
510 f = document.getElementById('statcats');
511 while (f.firstChild) f.removeChild(f.lastChild);
513 for (var i in sc_list)
514 display_sc(f,sc_list[i],user.stat_cat_entries());
516 for (var i in foreign_sc_list)
517 display_sc(f,foreign_sc_list[i],user.stat_cat_entries(), true);
522 function set_sc_value (node) {
523 var id = parseInt(node.getAttribute('scid'));
524 var value = node.value;
528 for (var i in user.stat_cat_entries()) {
529 if (user.stat_cat_entries()[i].stat_cat() == id) {
530 user.stat_cat_entries()[i].stat_cat_entry(value);
532 user.stat_cat_entries()[i].isdeleted(1);
534 user.stat_cat_entries()[i].isdeleted(0);
535 user.stat_cat_entries()[i].ischanged(1);
537 sc = user.stat_cat_entries()[i];
545 sc.stat_cat_entry(value);
547 sc.target_usr(user.id());
549 user.stat_cat_entries().push(sc);
553 function display_sc (root,sc_def, user_scs, foreign) {
556 for (var i in user_scs) {
557 if (sc_def.id() == user_scs[i].stat_cat()) {
563 var sc_row = findNodeByName(document.getElementById('statcat-tmpl'), 'scrow').cloneNode(true);
564 root.appendChild(sc_row);
566 findNodeByName(sc_row,'sc.name').appendChild(text(sc_def.name()));
568 var text_box = findNodeByName(sc_row,'sce.value');
569 text_box.setAttribute('scid', sc_def.id());
570 if (sc) text_box.value = sc.stat_cat_entry();
573 if (sc_def.entries().length > 0) {
574 var selector = findNodeByName(sc_row,'sce_select');
575 selector.id = 'scid-' + sc_def.id();
577 removeCSSClass(selector.parentNode, 'hideme');
580 'scid-' + sc_def.id(),
582 (sc ? sc.stat_cat_entry() : ''),
583 { label_field : 'value',
584 value_field : 'value',
585 empty_label : '-- Select One --',
591 text_box.disabled = true;
592 text_box.parentNode.appendChild(text('(Foreign Stat Cat)'));
596 function display_perm (root,perm_def,staff_perms) {
598 var prow = findNodeByName(document.getElementById('permission-tmpl'), 'prow').cloneNode(true);
599 root.appendChild(prow);
602 for (var i in staff_perms) {
603 if (staff_perms[i].perm() == -1) {
612 for (var i in staff_perms) {
613 if (perm_def.id() == staff_perms[i].perm() || staff_perms[i].perm() == -1) {
620 for (var i in user_perms) {
621 if (perm_def.id() == user_perms[i].perm() && user_perms[i].id() > 0)
627 if (!sp || !sp.grantable()) dis = true;
628 if (all) dis = false;
630 var label_cell = findNodeByName(prow,'plabel');
631 findNodeByName(label_cell,'p.code').appendChild(text(perm_def.code()));
632 findNodeByName(label_cell,'p.code').setAttribute('title', perm_def.description());
633 findNodeByName(label_cell,'p.code').setAttribute('permid', perm_def.id());
635 var apply_cell = findNodeByName(prow,'papply');
636 findNodeByName(apply_cell,'p.id').disabled = dis;
637 findNodeByName(apply_cell,'p.id').checked = up ? true : false;
639 var depth_cell = findNodeByName(prow,'pdepth');
640 findNodeByName(depth_cell,'p.depth').disabled = dis;
641 findNodeByName(depth_cell,'p.depth').id = 'perm-depth-' + perm_def.id();
643 'perm-depth-' + perm_def.id(),
645 (up ? up.depth() : findOrgDepth(user.home_ou())),
646 { label_field : 'name',
647 value_field : 'depth',
648 empty_label : '-- Select One --',
653 var grant_cell = findNodeByName(prow,'pgrant');
654 findNodeByName(grant_cell,'p.grantable').disabled = dis;
655 findNodeByName(grant_cell,'p.grantable').checked = up ? (up.grantable() ? true : false) : false;
659 function display_all_addresses () {
660 d = document.getElementById('addresses');
662 d.removeChild(d.lastChild);
664 for (var i in user.addresses())
665 display_address(document.getElementById('addresses'), user.addresses()[i]);
668 function new_addr () {
673 user.addresses().push(x);
674 display_address(document.getElementById('addresses'), x);
677 function display_survey (div, sid, uid) {
679 var t = document.getElementById('survey-tmpl').firstChild.cloneNode(true);
682 init_survey(t,sid,uid);
685 function display_address (div, adr) {
688 if (adr.isdeleted()) dis = true;
690 var t = document.getElementById('addr-tmpl').getElementsByTagName('table')[0].cloneNode(true);
695 x = findNodeByName(t, 'adr.address_type');
697 if (adr.address_type()) x.value = adr.address_type();
698 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').address_type(this.value)');
700 x = findNodeByName(t, 'adr.street1');
702 if (adr.street1()) x.value = adr.street1();
703 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').street1(this.value)');
705 x = findNodeByName(t, 'adr.street2');
707 if (adr.street2()) x.value = adr.street2();
708 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').street2(this.value)');
710 x = findNodeByName(t, 'adr.city');
712 if (adr.city()) x.value = adr.city();
713 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').city(this.value)');
715 x = findNodeByName(t, 'adr.state');
717 if (adr.state()) x.value = adr.state();
718 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').state(this.value)');
720 x = findNodeByName(t, 'adr.post_code');
722 if (adr.post_code()) x.value = adr.post_code();
723 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').post_code(this.value)');
725 x = findNodeByName(t, 'adr.county');
727 if (adr.county()) x.value = adr.county();
728 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').county(this.value)');
730 x = findNodeByName(t, 'adr.country');
732 if (adr.country()) x.value = adr.country();
733 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').country(this.value)');
735 x = findNodeByName(t, 'adr.valid');
737 if (adr.valid()) x.checked = true;
738 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').valid(this.checked ? "t" : "f")');
740 x = findNodeByName(t, 'is_mailing');
743 x.setAttribute( 'onclick', 'user.mailing_address(findAddressById(' + adr.id() + '))');
744 if (adr.id() == user.mailing_address().id()) {
748 x = findNodeByName(t, 'is_billing');
751 x.setAttribute( 'onclick', 'user.billing_address(findAddressById(' + adr.id() + '))');
752 if (adr.id() == user.billing_address().id()) {
756 x = findNodeByName(t, 'remove');
758 x.setAttribute('onclick', 'unremove_adr(' + adr.id() + '); return false;');
759 x.innerHTML = "Undelete this address";
761 x.setAttribute('onclick', 'remove_adr(' + adr.id() + '); return false;');
768 function unremove_adr (id) {
769 findAddressById(id).isdeleted(0);
770 display_all_addresses();
773 function remove_adr (id) {
774 findAddressById(id).isdeleted(1);
775 display_all_addresses();
778 function findAddressById (id) {
779 for (var i in user.addresses())
780 if (user.addresses()[i].id() == id) return user.addresses()[i];
784 function selectBuilder (id, objects, def, args) {
785 var label_field = args['label_field'];
786 var value_field = args['value_field'];
787 var depth = args['depth'];
789 if (!depth) depth = 0;
791 args['depth'] = parseInt(depth) + 1;
793 var child_field_name = args['child_field_name'];
796 if (typeof sel != 'object')
797 sel = document.getElementById(sel);
800 for (var o in sel.options) {
801 sel.options[o] = null;
803 args['clear'] = false;
804 if (args['empty_label']) {
805 sel.options[0] = new Option( args['empty_label'], args['empty_value'] );
806 sel.selectedIndex = 0;
810 for (var i in objects) {
811 var l = objects[i][label_field];
812 var v = objects[i][value_field];
814 if (typeof l == 'function')
815 l = objects[i][label_field]();
817 if (typeof v == 'function')
818 v = objects[i][value_field]();
820 var opt = new Option( l, v );
824 opt.style.paddingLeft = '' + d + 'px';
827 sel.options[sel.options.length] = opt;
830 if (typeof def == 'object') {
832 if (v == def[j]) opt.selected = true;
835 if (v == def) opt.selected = true;
838 if (child_field_name) {
839 var c = objects[i][child_field_name];
840 if (typeof c == 'function')
841 c = objects[i][child_field_name]();
847 { label_field : args['label_field'],
848 value_field : args['value_field'],
849 depth : args['depth'],
850 child_field_name : args['child_field_name'] }
857 function findNodesByClass(root, nodeClass, list) {
859 if( !root || !nodeClass) {
863 if(root.nodeType != 1) {
867 if(root.className.match(nodeClass)) list.push( root );
869 var children = root.childNodes;
871 for( var i = 0; i != children.length; i++ ) {
872 findNodesByClass(children[i], nodeClass, list);