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',
24 var required_addr_parts = {
30 address_type:'Address Label',
33 function set_perm(row) {
34 var pid = findNodeByName(row,'p.code').getAttribute('permid');
35 var papply = findNodeByName(row,'p.id').checked;
36 var pdepth = findNodeByName(row,'p.depth').options[findNodeByName(row,'p.depth').selectedIndex].value;
37 var pgrant = findNodeByName(row,'p.grantable').checked;
40 for (var i in user_perms) {
41 if (user_perms[i].perm() == pid) {
47 p.grantable(pgrant ? 1 : 0);
66 p.grantable(pgrant ? 1 : 0);
74 function reset_crc () {
75 document.forms.editor.elements["user.claims_returned_count"].value = '0';
76 user.claims_returned_count(0);
79 function clear_alert_message () {
80 document.forms.editor.elements["user.alert_message"].value = ' ';
81 user.alert_message('');
84 function save_user () {
87 alert( js2JSON(user.stat_cat_entries()) );
92 for (var i in user_perms) {
93 if (!user_perms[i].depth()) {
95 for (var j in perm_list) {
96 if (perm_list[j].id() == user_perms[i].perm()) {
101 throw "Depth is required on the " + p.code() + " permission.";
105 user.permissions(user_perms);
107 for (var i in required_user_parts) {
109 throw required_user_parts[i] + " is required.";
113 for (var j in user.addresses()) {
114 if (user.addresses()[j].isdeleted()) continue;
116 for (var i in required_addr_parts) {
117 if (!user.addresses()[j][i]()) {
118 throw required_addr_parts[i] + " is required.";
124 for (var i in responses) {
126 for (var j in responses[i]) {
132 r.answer(responses[i][j]);
133 r.answer_date( document.getElementById('e_date_'+i).value );
138 user.survey_responses( res );
142 if (user.billing_address().isdeleted())
143 throw "Please select a valid Billing Address";
145 if (user.mailing_address().isdeleted())
146 throw "Please select a valid Mailing Address";
148 var req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.patron.update', ses_id, user );
150 var ok = req.getResultObject();
152 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.set_groups', ses_id, ok.id(), user_groups );
154 req.getResultObject();
157 alert( 'User ' + ok.usrname() +
158 ' [' + ok.card().barcode() + '] ' +
159 ' successfully saved!');
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) {
207 user.mailing_address( new aua() );
208 user.mailing_address().isnew(1);
209 user.mailing_address().id(fakeid());
211 user.billing_address( user.mailing_address() );
213 user.card( new ac() );
214 user.card().isnew(1);
215 user.card().id(fakeid());
218 user.addresses().push(user.mailing_address());
221 user.cards().push(user.card());
226 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve', ses_id, usr_id );
228 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve_by_barcode', ses_id, usr_barcode );
231 user = req.getResultObject();
238 if (user.id()) x['user.id'].value = user.id();
239 if (cgi.param('adv')) x['user.id'].parentNode.parentNode.setAttribute('adv', 'false');
241 if (user.create_date()) x['user.create_date'].value = user.create_date();
243 if (user.usrname()) x['user.usrname'].value = user.usrname();
244 x['user.usrname'].setAttribute('onchange','user.usrname(this.value)');
246 if (user.card() && user.card().barcode()) x['user.card.barcode'].value = user.card().barcode();
247 x['user.card.barcode'].setAttribute('onchange','user.card().barcode(this.value)');
249 x['user.card.barcode'].disabled = false;
251 x['replace_card'].className = '';
252 x['replace_card'].setAttribute('onclick',
253 'user.card(new ac()); ' +
254 'user.card().isnew(1); ' +
255 'user.card().id(fakeid()); ' +
256 'user.cards().push(user.card()); ' +
257 'this.parentNode.firstChild.disabled = false; ' +
258 'this.parentNode.firstChild.value = ""; ' +
259 'this.parentNode.firstChild.focus(); ' +
264 if (user.passwd()) x['user.passwd'].value = user.passwd();
265 x['user.passwd'].setAttribute('onchange','user.passwd(this.value)');
267 if (user.prefix()) x['user.prefix'].value = user.prefix();
268 x['user.prefix'].setAttribute('onchange','user.prefix(this.value)');
270 if (user.first_given_name()) x['user.first_given_name'].value = user.first_given_name();
271 x['user.first_given_name'].setAttribute('onchange','user.first_given_name(this.value)');
273 if (user.second_given_name()) x['user.second_given_name'].value = user.second_given_name();
274 x['user.second_given_name'].setAttribute('onchange','user.second_given_name(this.value);');
276 if (user.family_name()) x['user.family_name'].value = user.family_name();
277 x['user.family_name'].setAttribute('onchange','user.family_name(this.value)');
279 if (user.suffix()) x['user.suffix'].value = user.suffix();
280 x['user.suffix'].setAttribute('onchange','user.suffix(this.value)');
282 if (user.dob()) x['user.dob'].value = user.dob();
283 x['user.dob'].setAttribute('onchange','user.dob(this.value)');
285 if (user.ident_value()) x['user.ident_value'].value = user.ident_value();
286 x['user.ident_value'].setAttribute('onchange','user.ident_value(this.value)');
288 if (user.ident_value2()) x['user.ident_value2'].value = user.ident_value2();
289 x['user.ident_value2'].setAttribute('onchange','user.ident_value2(this.value)');
291 if (user.email()) x['user.email'].value = user.email();
292 x['user.email'].setAttribute('onchange','user.email(this.value)');
294 if (user.day_phone()) x['user.day_phone'].value = user.day_phone();
295 x['user.day_phone'].setAttribute('onchange','user.day_phone(this.value)');
297 if (user.evening_phone()) x['user.evening_phone'].value = user.evening_phone();
298 x['user.evening_phone'].setAttribute('onchange','user.evening_phone(this.value)');
300 if (user.other_phone()) x['user.other_phone'].value = user.other_phone();
301 x['user.other_phone'].setAttribute('onchange','user.other_phone(this.value)');
303 if (user.expire_date()) x['user.expire_date'].value = user.expire_date();
304 x['user.expire_date'].setAttribute('onchange','user.expire_date(this.value)');
306 if (user.active()) x['user.active'].checked = true;
307 x['user.active'].setAttribute('onchange','user.active(this.checked ? "t" : "f" )');
309 if (user.master_account()) x['user.master_account'].checked = true;
310 x['user.master_account'].setAttribute('onchange','user.master_account(this.checked ? "t" : "f" )');
312 if (user.super_user()) x['user.super_user'].checked = true;
313 x['user.super_user'].setAttribute('onchange','user.super_user(this.checked ? "t" : "f" )');
314 if (cgi.param('adv')) x['user.super_user'].parentNode.parentNode.setAttribute('adv', 'false');
316 if (user.claims_returned_count()) x['user.claims_returned_count'].value = user.claims_returned_count();
317 // onchange handled by func above
319 if (user.alert_message()) x['user.alert_message'].value = user.alert_message();
320 x['user.alert_message'].setAttribute('onchange','user.alert_message(this.value)');
323 // set up the home_ou selector
324 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.org_tree.retrieve' );
326 orgTree = req.getResultObject();
332 { label_field : 'name',
334 empty_label : '-- Required --',
337 child_field_name : 'children' }
340 x['user.home_ou'].setAttribute('onchange','user.home_ou(this.options[this.selectedIndex].value)');
342 // set up the ident_type selector
343 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.ident_types.retrieve' );
345 ident_type_list = req.getResultObject();
351 { label_field : 'name',
353 empty_label : '-- Required --',
358 x['user.ident_type'].setAttribute('onchange','user.ident_type(this.options[this.selectedIndex].value)');
363 (user.ident_value2 == '' ? user.ident_type2() : ''),
364 { label_field : 'name',
366 empty_label : '-- Optional --',
371 x['user.ident_type2'].setAttribute('onchange','var x = this.options[this.selectedIndex].value; x ? user.ident_type2(x) : user.ident_type2(null);');
374 // set up the standing selector
375 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.standings.retrieve' );
377 standing_list = req.getResultObject();
383 { label_field : 'value',
385 empty_label : '-- Required --',
390 x['user.standing'].setAttribute('onchange','user.standing(this.options[this.selectedIndex].value)');
392 // set up the profile selector
393 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.groups.tree.retrieve' );
395 group_tree = req.getResultObject();
401 { label_field : 'name',
403 empty_label : '-- Required --',
406 child_field_name : 'children' }
409 x['user.profile'].setAttribute('onchange','user.profile(this.options[this.selectedIndex].value)');
411 // set up the profile selector
412 var user_group_objects = [];
414 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.get_groups', ses_id, user.id() );
416 user_group_objects = req.getResultObject();
420 for (var i in user_group_objects) {
421 user_groups.push(user_group_objects[i].grp());
428 { label_field : 'name',
431 child_field_name : 'children' }
434 x['permgroups'].setAttribute( 'onchange',
435 'window.user_groups = [];' +
436 'for (var i = 0; i < this.options.length; i++) {' +
437 ' if (this.options[i].selected)' +
438 ' window.user_groups.push(this.options[i].value);' +
441 display_all_addresses();
443 if (cgi.param('adv')) x['permgroups'].parentNode.parentNode.setAttribute('adv', 'false');
445 req = new RemoteRequest( 'open-ils.circ', 'open-ils.circ.survey.retrieve.required', ses_id );
447 surveys = req.getResultObject();
449 var f = document.getElementById('surveys');
450 while (f.firstChild) f.removeChild(f.lastChild);
452 for ( var i in surveys )
453 display_survey( f, surveys[i].id(), user.id() );
455 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id );
457 var staff_perms = req.getResultObject();
460 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id, user.id() );
462 var up = req.getResultObject();
465 user_perms.push(up[i]);
468 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.retrieve' );
470 perm_list = req.getResultObject();
472 f = document.getElementById('permissions');
473 while (f.firstChild) f.removeChild(f.lastChild);
475 for (var i in perm_list)
476 display_perm(f,perm_list[i],staff_perms);
479 req = new RemoteRequest( 'open-ils.circ', 'open-ils.circ.stat_cat.actor.retrieve.all', ses_id, user.home_ou() );
481 var sc_list = req.getResultObject();
483 var missing_scs = [];
484 for (var i in user.stat_cat_entries()) {
486 for (var j in sc_list) {
487 if (sc_list[j].id() == user.stat_cat_entries()[i].stat_cat()) {
493 missing_scs.push(user.stat_cat_entries()[i].stat_cat());
496 req = new RemoteRequest( 'open-ils.circ', 'open-ils.circ.stat_cat.actor.retrieve.batch', ses_id, missing_scs );
498 var foreign_sc_list = req.getResultObject();
500 f = document.getElementById('statcats');
501 while (f.firstChild) f.removeChild(f.lastChild);
503 for (var i in sc_list)
504 display_sc(f,sc_list[i],user.stat_cat_entries());
506 for (var i in foreign_sc_list)
507 display_sc(f,foreign_sc_list[i],user.stat_cat_entries(), true);
512 function set_sc_value (node) {
513 var id = parseInt(node.getAttribute('scid'));
514 var value = node.value;
518 for (var i in user.stat_cat_entries()) {
519 if (user.stat_cat_entries()[i].stat_cat() == id) {
520 user.stat_cat_entries()[i].stat_cat_entry(value);
522 user.stat_cat_entries()[i].isdeleted(1);
524 user.stat_cat_entries()[i].isdeleted(0);
525 user.stat_cat_entries()[i].ischanged(1);
527 sc = user.stat_cat_entries()[i];
535 sc.stat_cat_entry(value);
537 sc.target_usr(user.id());
539 user.stat_cat_entries().push(sc);
543 function display_sc (root,sc_def, user_scs, foreign) {
546 for (var i in user_scs) {
547 if (sc_def.id() == user_scs[i].stat_cat()) {
553 var sc_row = findNodeByName(document.getElementById('statcat-tmpl'), 'scrow').cloneNode(true);
554 root.appendChild(sc_row);
556 findNodeByName(sc_row,'sc.name').appendChild(text(sc_def.name()));
558 var text_box = findNodeByName(sc_row,'sce.value');
559 text_box.setAttribute('scid', sc_def.id());
560 if (sc) text_box.value = sc.stat_cat_entry();
563 if (sc_def.entries().length > 0) {
564 var selector = findNodeByName(sc_row,'sce_select');
565 selector.id = 'scid-' + sc_def.id();
567 removeCSSClass(selector.parentNode, 'hideme');
570 'scid-' + sc_def.id(),
572 (sc ? sc.stat_cat_entry() : ''),
573 { label_field : 'value',
574 value_field : 'value',
575 empty_label : '-- Select One --',
581 text_box.disabled = true;
582 text_box.parentNode.appendChild(text('(Foreign Stat Cat)'));
586 function display_perm (root,perm_def,staff_perms) {
588 var prow = findNodeByName(document.getElementById('permission-tmpl'), 'prow').cloneNode(true);
589 root.appendChild(prow);
592 for (var i in staff_perms) {
593 if (staff_perms[i].perm() == -1) {
602 for (var i in staff_perms) {
603 if (perm_def.id() == staff_perms[i].perm() || staff_perms[i].perm() == -1) {
610 for (var i in user_perms) {
611 if (perm_def.id() == user_perms[i].perm() && user_perms[i].id() > 0)
617 if (!sp || !sp.grantable()) dis = true;
618 if (all) dis = false;
620 var label_cell = findNodeByName(prow,'plabel');
621 findNodeByName(label_cell,'p.code').appendChild(text(perm_def.code()));
622 findNodeByName(label_cell,'p.code').setAttribute('title', perm_def.description());
623 findNodeByName(label_cell,'p.code').setAttribute('permid', perm_def.id());
625 var apply_cell = findNodeByName(prow,'papply');
626 findNodeByName(apply_cell,'p.id').disabled = dis;
627 findNodeByName(apply_cell,'p.id').checked = up ? true : false;
629 var depth_cell = findNodeByName(prow,'pdepth');
630 findNodeByName(depth_cell,'p.depth').disabled = dis;
631 findNodeByName(depth_cell,'p.depth').id = 'perm-depth-' + perm_def.id();
633 'perm-depth-' + perm_def.id(),
635 (up ? up.depth() : findOrgDepth(user.home_ou())),
636 { label_field : 'name',
637 value_field : 'depth',
638 empty_label : '-- Select One --',
643 var grant_cell = findNodeByName(prow,'pgrant');
644 findNodeByName(grant_cell,'p.grantable').disabled = dis;
645 findNodeByName(grant_cell,'p.grantable').checked = up ? (up.grantable() ? true : false) : false;
649 function display_all_addresses () {
650 d = document.getElementById('addresses');
652 d.removeChild(d.lastChild);
654 for (var i in user.addresses())
655 display_address(document.getElementById('addresses'), user.addresses()[i]);
658 function new_addr () {
663 user.addresses().push(x);
664 display_address(document.getElementById('addresses'), x);
667 function display_survey (div, sid, uid) {
669 var t = document.getElementById('survey-tmpl').firstChild.cloneNode(true);
672 init_survey(t,sid,uid);
675 function display_address (div, adr) {
678 if (adr.isdeleted()) dis = true;
680 var t = document.getElementById('addr-tmpl').getElementsByTagName('table')[0].cloneNode(true);
685 x = findNodeByName(t, 'adr.address_type');
687 if (adr.address_type()) x.value = adr.address_type();
688 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').address_type(this.value)');
690 x = findNodeByName(t, 'adr.street1');
692 if (adr.street1()) x.value = adr.street1();
693 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').street1(this.value)');
695 x = findNodeByName(t, 'adr.street2');
697 if (adr.street2()) x.value = adr.street2();
698 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').street2(this.value)');
700 x = findNodeByName(t, 'adr.city');
702 if (adr.city()) x.value = adr.city();
703 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').city(this.value)');
705 x = findNodeByName(t, 'adr.state');
707 if (adr.state()) x.value = adr.state();
708 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').state(this.value)');
710 x = findNodeByName(t, 'adr.post_code');
712 if (adr.post_code()) x.value = adr.post_code();
713 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').post_code(this.value)');
715 x = findNodeByName(t, 'adr.county');
717 if (adr.county()) x.value = adr.county();
718 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').county(this.value)');
720 x = findNodeByName(t, 'adr.country');
722 if (adr.country()) x.value = adr.country();
723 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').country(this.value)');
725 x = findNodeByName(t, 'adr.valid');
727 if (adr.valid()) x.checked = true;
728 x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').valid(this.checked ? "t" : "f")');
730 x = findNodeByName(t, 'is_mailing');
733 x.setAttribute( 'onclick', 'user.mailing_address(findAddressById(' + adr.id() + '))');
734 if (adr.id() == user.mailing_address().id()) {
738 x = findNodeByName(t, 'is_billing');
741 x.setAttribute( 'onclick', 'user.billing_address(findAddressById(' + adr.id() + '))');
742 if (adr.id() == user.billing_address().id()) {
746 x = findNodeByName(t, 'remove');
748 x.setAttribute('onclick', 'unremove_adr(' + adr.id() + '); return false;');
749 x.innerHTML = "Undelete this address";
751 x.setAttribute('onclick', 'remove_adr(' + adr.id() + '); return false;');
758 function unremove_adr (id) {
759 findAddressById(id).isdeleted(0);
760 display_all_addresses();
763 function remove_adr (id) {
764 findAddressById(id).isdeleted(1);
765 display_all_addresses();
768 function findAddressById (id) {
769 for (var i in user.addresses())
770 if (user.addresses()[i].id() == id) return user.addresses()[i];
774 function selectBuilder (id, objects, def, args) {
775 var label_field = args['label_field'];
776 var value_field = args['value_field'];
777 var depth = args['depth'];
779 if (!depth) depth = 0;
781 args['depth'] = parseInt(depth) + 1;
783 var child_field_name = args['child_field_name'];
786 if (typeof sel != 'object')
787 sel = document.getElementById(sel);
790 for (var o in sel.options) {
791 sel.options[o] = null;
793 args['clear'] = false;
794 if (args['empty_label']) {
795 sel.options[0] = new Option( args['empty_label'], args['empty_value'] );
796 sel.selectedIndex = 0;
800 for (var i in objects) {
801 var l = objects[i][label_field];
802 var v = objects[i][value_field];
804 if (typeof l == 'function')
805 l = objects[i][label_field]();
807 if (typeof v == 'function')
808 v = objects[i][value_field]();
810 var opt = new Option( l, v );
814 opt.style.paddingLeft = '' + d + 'px';
817 sel.options[sel.options.length] = opt;
820 if (typeof def == 'object') {
822 if (v == def[j]) opt.selected = true;
825 if (v == def) opt.selected = true;
828 if (child_field_name) {
829 var c = objects[i][child_field_name];
830 if (typeof c == 'function')
831 c = objects[i][child_field_name]();
837 { label_field : args['label_field'],
838 value_field : args['value_field'],
839 depth : args['depth'],
840 child_field_name : args['child_field_name'] }
847 function findNodesByClass(root, nodeClass, list) {
849 if( !root || !nodeClass) {
853 if(root.nodeType != 1) {
857 if(root.className.match(nodeClass)) list.push( root );
859 var children = root.childNodes;
861 for( var i = 0; i != children.length; i++ ) {
862 findNodesByClass(children[i], nodeClass, list);