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)');
253 x['user.card.barcode'].disabled = false;
255 x['replace_card'].className = '';
256 x['replace_card'].setAttribute('onclick',
257 'user.card(new ac()); ' +
258 'user.card().isnew(1); ' +
259 'user.card().id(fakeid()); ' +
260 'user.cards().push(user.card()); ' +
261 'this.parentNode.firstChild.disabled = false; ' +
262 'this.parentNode.firstChild.value = ""; ' +
263 'this.parentNode.firstChild.focus(); ' +
269 if (user.passwd()) x['user.passwd'].value = user.passwd();
270 x['user.passwd'].setAttribute('onchange','user.passwd(this.value)');
272 if (user.prefix()) x['user.prefix'].value = user.prefix();
273 x['user.prefix'].setAttribute('onchange','user.prefix(this.value)');
275 if (user.first_given_name()) x['user.first_given_name'].value = user.first_given_name();
276 x['user.first_given_name'].setAttribute('onchange','user.first_given_name(this.value)');
278 if (user.second_given_name()) x['user.second_given_name'].value = user.second_given_name();
279 x['user.second_given_name'].setAttribute('onchange','user.second_given_name(this.value);');
281 if (user.family_name()) x['user.family_name'].value = user.family_name();
282 x['user.family_name'].setAttribute('onchange','user.family_name(this.value)');
284 if (user.suffix()) x['user.suffix'].value = user.suffix();
285 x['user.suffix'].setAttribute('onchange','user.suffix(this.value)');
287 if (user.dob()) x['user.dob'].value = user.dob();
288 x['user.dob'].setAttribute('onchange','user.dob(this.value)');
290 if (user.ident_value()) x['user.ident_value'].value = user.ident_value();
291 x['user.ident_value'].setAttribute('onchange','user.ident_value(this.value)');
293 if (user.ident_value2()) x['user.ident_value2'].value = user.ident_value2();
294 x['user.ident_value2'].setAttribute('onchange','user.ident_value2(this.value)');
296 if (user.email()) x['user.email'].value = user.email();
297 x['user.email'].setAttribute('onchange','user.email(this.value)');
299 if (user.day_phone()) x['user.day_phone'].value = user.day_phone();
300 x['user.day_phone'].setAttribute('onchange','user.day_phone(this.value)');
302 if (user.evening_phone()) x['user.evening_phone'].value = user.evening_phone();
303 x['user.evening_phone'].setAttribute('onchange','user.evening_phone(this.value)');
305 if (user.other_phone()) x['user.other_phone'].value = user.other_phone();
306 x['user.other_phone'].setAttribute('onchange','user.other_phone(this.value)');
308 if (user.expire_date()) x['user.expire_date'].value = user.expire_date();
309 x['user.expire_date'].setAttribute('onchange','user.expire_date(this.value)');
311 if (user.active()) x['user.active'].checked = true;
312 x['user.active'].setAttribute('onchange','user.active(this.checked ? "t" : "f" )');
314 if (user.master_account()) x['user.master_account'].checked = true;
315 x['user.master_account'].setAttribute('onchange','user.master_account(this.checked ? "t" : "f" )');
317 if (user.super_user()) x['user.super_user'].checked = true;
318 x['user.super_user'].setAttribute('onchange','user.super_user(this.checked ? "t" : "f" )');
319 if (cgi.param('adv')) x['user.super_user'].parentNode.parentNode.setAttribute('adv', 'false');
321 if (user.barred()) x['user.barred'].checked = true;
322 x['user.barred'].setAttribute('onchange','user.barred(this.checked ? "t" : "f" )');
323 if (cgi.param('adv')) x['user.barred'].parentNode.parentNode.setAttribute('adv', 'false');
325 if (user.claims_returned_count()) x['user.claims_returned_count'].value = user.claims_returned_count();
326 // onchange handled by func above
328 if (user.alert_message()) x['user.alert_message'].value = user.alert_message();
329 x['user.alert_message'].setAttribute('onchange','user.alert_message(this.value)');
332 // set up the home_ou selector
333 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.org_tree.retrieve' );
335 orgTree = req.getResultObject();
341 { label_field : 'name',
343 empty_label : '-- Required --',
346 child_field_name : 'children' }
349 x['user.home_ou'].setAttribute('onchange','user.home_ou(this.options[this.selectedIndex].value)');
351 // set up the ident_type selector
352 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.ident_types.retrieve' );
354 ident_type_list = req.getResultObject();
360 { label_field : 'name',
362 empty_label : '-- Required --',
367 x['user.ident_type'].setAttribute('onchange','user.ident_type(this.options[this.selectedIndex].value)');
372 (user.ident_value2 == '' ? user.ident_type2() : ''),
373 { label_field : 'name',
375 empty_label : '-- Optional --',
380 x['user.ident_type2'].setAttribute('onchange','var x = this.options[this.selectedIndex].value; x ? user.ident_type2(x) : user.ident_type2(null);');
384 // set up the barred checkbox
385 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.standings.retrieve' );
387 standing_list = req.getResultObject();
393 { label_field : 'value',
395 empty_label : '-- Required --',
400 x['user.standing'].setAttribute('onchange','user.standing(this.options[this.selectedIndex].value)');
403 // set up the profile selector
404 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.groups.tree.retrieve' );
406 group_tree = req.getResultObject();
412 { label_field : 'name',
414 empty_label : '-- Required --',
417 child_field_name : 'children' }
420 x['user.profile'].setAttribute('onchange','user.profile(this.options[this.selectedIndex].value)');
422 // set up the profile selector
423 var user_group_objects = [];
425 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.get_groups', ses_id, user.id() );
427 user_group_objects = req.getResultObject();
431 for (var i in user_group_objects) {
432 user_groups.push(user_group_objects[i].grp());
439 { label_field : 'name',
442 child_field_name : 'children' }
445 x['permgroups'].setAttribute( 'onchange',
446 'window.user_groups = [];' +
447 'for (var i = 0; i < this.options.length; i++) {' +
448 ' if (this.options[i].selected)' +
449 ' window.user_groups.push(this.options[i].value);' +
452 display_all_addresses();
454 if (cgi.param('adv')) x['permgroups'].parentNode.parentNode.setAttribute('adv', 'false');
456 req = new RemoteRequest( 'open-ils.circ', 'open-ils.circ.survey.retrieve.required', ses_id );
458 surveys = req.getResultObject();
460 var f = document.getElementById('surveys');
461 while (f.firstChild) f.removeChild(f.lastChild);
463 for ( var i in surveys )
464 display_survey( f, surveys[i].id(), user.id() );
466 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id );
468 var staff_perms = req.getResultObject();
473 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id, user.id() );
475 var up = req.getResultObject();
478 user_perms.push(up[i]);
481 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.retrieve' );
483 perm_list = req.getResultObject();
486 f = document.getElementById('permissions');
487 while (f.firstChild) f.removeChild(f.lastChild);
489 for (var i in perm_list)
490 display_perm(f,perm_list[i],staff_perms);
493 req = new RemoteRequest( 'open-ils.circ', 'open-ils.circ.stat_cat.actor.retrieve.all', ses_id );
495 var sc_list = req.getResultObject();
497 var missing_scs = [];
498 for (var i in user.stat_cat_entries()) {
500 for (var j in sc_list) {
501 if (sc_list[j].id() == user.stat_cat_entries()[i].stat_cat()) {
507 missing_scs.push(user.stat_cat_entries()[i].stat_cat());
510 req = new RemoteRequest( 'open-ils.circ', 'open-ils.circ.stat_cat.actor.retrieve.batch', ses_id, missing_scs );
512 var foreign_sc_list = req.getResultObject();
514 f = document.getElementById('statcats');
515 while (f.firstChild) f.removeChild(f.lastChild);
517 for (var i in sc_list)
518 display_sc(f,sc_list[i],user.stat_cat_entries());
520 for (var i in foreign_sc_list)
521 display_sc(f,foreign_sc_list[i],user.stat_cat_entries(), true);
526 function set_sc_value (node) {
527 var id = parseInt(node.getAttribute('scid'));
528 var value = node.value;
532 for (var i in user.stat_cat_entries()) {
533 if (user.stat_cat_entries()[i].stat_cat() == id) {
534 user.stat_cat_entries()[i].stat_cat_entry(value);
536 user.stat_cat_entries()[i].isdeleted(1);
538 user.stat_cat_entries()[i].isdeleted(0);
539 user.stat_cat_entries()[i].ischanged(1);
541 sc = user.stat_cat_entries()[i];
549 sc.stat_cat_entry(value);
551 sc.target_usr(user.id());
553 user.stat_cat_entries().push(sc);
557 function display_sc (root,sc_def, user_scs, foreign) {
560 for (var i in user_scs) {
561 if (sc_def.id() == user_scs[i].stat_cat()) {
567 var sc_row = findNodeByName(document.getElementById('statcat-tmpl'), 'scrow').cloneNode(true);
568 root.appendChild(sc_row);
570 findNodeByName(sc_row,'sc.name').appendChild(text(sc_def.name()));
572 var text_box = findNodeByName(sc_row,'sce.value');
573 text_box.setAttribute('scid', sc_def.id());
574 if (sc) text_box.value = sc.stat_cat_entry();
577 if (sc_def.entries().length > 0) {
578 var selector = findNodeByName(sc_row,'sce_select');
579 selector.id = 'scid-' + sc_def.id();
581 removeCSSClass(selector.parentNode, 'hideme');
584 'scid-' + sc_def.id(),
586 (sc ? sc.stat_cat_entry() : ''),
587 { label_field : 'value',
588 value_field : 'value',
589 empty_label : '-- Select One --',
595 text_box.disabled = true;
596 text_box.parentNode.appendChild(text('(Foreign Stat Cat)'));
600 function display_perm (root,perm_def,staff_perms) {
602 var prow = findNodeByName(document.getElementById('permission-tmpl'), 'prow').cloneNode(true);
603 root.appendChild(prow);
606 for (var i in staff_perms) {
607 if (staff_perms[i].perm() == -1) {
616 for (var i in staff_perms) {
617 if (perm_def.id() == staff_perms[i].perm() || staff_perms[i].perm() == -1) {
624 for (var i in user_perms) {
625 if (perm_def.id() == user_perms[i].perm() && user_perms[i].id() > 0)
631 if (!sp || !sp.grantable()) dis = true;
632 if (all) dis = false;
634 var label_cell = findNodeByName(prow,'plabel');
635 findNodeByName(label_cell,'p.code').appendChild(text(perm_def.code()));
636 findNodeByName(label_cell,'p.code').setAttribute('title', perm_def.description());
637 findNodeByName(label_cell,'p.code').setAttribute('permid', perm_def.id());
639 var apply_cell = findNodeByName(prow,'papply');
640 findNodeByName(apply_cell,'p.id').disabled = dis;
641 findNodeByName(apply_cell,'p.id').checked = up ? true : false;
643 var depth_cell = findNodeByName(prow,'pdepth');
644 findNodeByName(depth_cell,'p.depth').disabled = dis;
645 findNodeByName(depth_cell,'p.depth').id = 'perm-depth-' + perm_def.id();
647 'perm-depth-' + perm_def.id(),
649 (up ? up.depth() : findOrgDepth(user.home_ou())),
650 { label_field : 'name',
651 value_field : 'depth',
652 empty_label : '-- Select One --',
657 var grant_cell = findNodeByName(prow,'pgrant');
658 findNodeByName(grant_cell,'p.grantable').disabled = dis;
659 findNodeByName(grant_cell,'p.grantable').checked = up ? (up.grantable() ? true : false) : false;
663 function display_all_addresses () {
664 d = document.getElementById('addresses');
666 d.removeChild(d.lastChild);
668 for (var i in user.addresses())
669 display_address(document.getElementById('addresses'), user.addresses()[i]);
672 function new_addr () {
677 user.addresses().push(x);
678 display_address(document.getElementById('addresses'), x);
681 function display_survey (div, sid, uid) {
683 var t = document.getElementById('survey-tmpl').firstChild.cloneNode(true);
686 init_survey(t,sid,uid);
689 function display_address (div, adr) {
692 if (adr.isdeleted()) dis = true;
694 var t = document.getElementById('addr-tmpl').getElementsByTagName('table')[0].cloneNode(true);
699 x = findNodeByName(t, 'adr.address_type');
701 if (adr.address_type()) x.value = adr.address_type();
702 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').address_type(this.value)');
704 x = findNodeByName(t, 'adr.street1');
706 if (adr.street1()) x.value = adr.street1();
707 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').street1(this.value)');
709 x = findNodeByName(t, 'adr.street2');
711 if (adr.street2()) x.value = adr.street2();
712 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').street2(this.value)');
714 x = findNodeByName(t, 'adr.city');
716 if (adr.city()) x.value = adr.city();
717 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').city(this.value)');
719 x = findNodeByName(t, 'adr.state');
721 if (adr.state()) x.value = adr.state();
722 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').state(this.value)');
724 x = findNodeByName(t, 'adr.post_code');
726 if (adr.post_code()) x.value = adr.post_code();
727 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').post_code(this.value)');
729 x = findNodeByName(t, 'adr.county');
731 if (adr.county()) x.value = adr.county();
732 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').county(this.value)');
734 x = findNodeByName(t, 'adr.country');
736 if (adr.country()) x.value = adr.country();
737 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').country(this.value)');
739 x = findNodeByName(t, 'adr.valid');
741 if (adr.valid()) x.checked = true;
742 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').valid(this.checked ? "t" : "f")');
744 x = findNodeByName(t, 'is_mailing');
747 x.setAttribute( 'onclick', 'user.mailing_address(findAddressById(' + adr.id() + '))');
748 if (adr.id() == user.mailing_address().id()) {
752 x = findNodeByName(t, 'is_billing');
755 x.setAttribute( 'onclick', 'user.billing_address(findAddressById(' + adr.id() + '))');
756 if (adr.id() == user.billing_address().id()) {
760 x = findNodeByName(t, 'remove');
762 x.setAttribute('onclick', 'unremove_adr(' + adr.id() + '); return false;');
763 x.innerHTML = "Undelete this address";
765 x.setAttribute('onclick', 'remove_adr(' + adr.id() + '); return false;');
772 function unremove_adr (id) {
773 findAddressById(id).isdeleted(0);
774 display_all_addresses();
777 function remove_adr (id) {
778 findAddressById(id).isdeleted(1);
779 display_all_addresses();
782 function findAddressById (id) {
783 for (var i in user.addresses())
784 if (user.addresses()[i].id() == id) return user.addresses()[i];
788 function selectBuilder (id, objects, def, args) {
789 var label_field = args['label_field'];
790 var value_field = args['value_field'];
791 var depth = args['depth'];
793 if (!depth) depth = 0;
795 args['depth'] = parseInt(depth) + 1;
797 var child_field_name = args['child_field_name'];
800 if (typeof sel != 'object')
801 sel = document.getElementById(sel);
804 for (var o in sel.options) {
805 sel.options[o] = null;
807 args['clear'] = false;
808 if (args['empty_label']) {
809 sel.options[0] = new Option( args['empty_label'], args['empty_value'] );
810 sel.selectedIndex = 0;
814 for (var i in objects) {
815 var l = objects[i][label_field];
816 var v = objects[i][value_field];
818 if (typeof l == 'function')
819 l = objects[i][label_field]();
821 if (typeof v == 'function')
822 v = objects[i][value_field]();
824 var opt = new Option( l, v );
828 opt.style.paddingLeft = '' + d + 'px';
831 sel.options[sel.options.length] = opt;
834 if (typeof def == 'object') {
836 if (v == def[j]) opt.selected = true;
839 if (v == def) opt.selected = true;
842 if (child_field_name) {
843 var c = objects[i][child_field_name];
844 if (typeof c == 'function')
845 c = objects[i][child_field_name]();
851 { label_field : args['label_field'],
852 value_field : args['value_field'],
853 depth : args['depth'],
854 child_field_name : args['child_field_name'] }
861 function findNodesByClass(root, nodeClass, list) {
863 if( !root || !nodeClass) {
867 if(root.nodeType != 1) {
871 if(root.className.match(nodeClass)) list.push( root );
873 var children = root.childNodes;
875 for( var i = 0; i != children.length; i++ ) {
876 findNodesByClass(children[i], nodeClass, list);