]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/patron/user_edit.js
fixed bug which wouldn't allow the user alert to be cleared
[Evergreen.git] / Open-ILS / xul / staff_client / server / patron / user_edit.js
1 var cgi;
2 var orgTree;
3 var user;
4 var ses_id;
5 var user_groups = [];
6 var adv_items = [];
7 var user_perms = [];
8 var perm_list = [];
9
10
11 var required_user_parts = {
12         usrname:'User Name',
13         first_given_name:'First Name',
14         family_name:'Last Name',
15         dob:'Date of Birth',
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',
21 };
22
23 var required_addr_parts = {
24         street1:'Street 1',
25         city:'City',
26         state:'State',
27         post_code:'ZIP',
28         country:'Country',
29         address_type:'Address Label',
30 };
31
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;
37
38         var p;
39         for (var i in user_perms) {
40                 if (user_perms[i].perm() == pid) {
41                         p = user_perms[i];
42                         if (papply) {
43                                 p.isdeleted(0);
44                                 p.ischanged(1);
45                                 p.depth(pdepth);
46                                 p.grantable(pgrant ? 1 : 0);
47                         } else {
48                                 if (p.isnew()) {
49                                         user_perms[i] = null;
50                                 } else {
51                                         p.isdeleted(1);
52                                 }
53                         }
54                         break;
55                 }
56         }
57
58         if (!p) {
59                 if (papply) {
60                         p = new pupm();
61                         p.isnew(1);
62                         p.perm(pid);
63                         p.usr(user.id());
64                         p.depth('' + pdepth);
65                         p.grantable(pgrant ? 1 : 0);
66
67                         user_perms.push(p);
68                 }
69         }
70
71 }
72
73 function reset_crc () {
74         document.forms.editor.elements["user.claims_returned_count"].value = '0';
75         user.claims_returned_count(0);
76 }
77
78 function clear_alert_message () {
79         document.forms.editor.elements["user.alert_message"].value = ' ';
80         user.alert_message('');
81 }
82
83 function save_user () {
84         user.ischanged(1);
85
86         //alert(        js2JSON(user.stat_cat_entries()) );
87         //return false;
88
89         try {
90
91                 for (var i in user_perms) {
92                         if (!user_perms[i].depth()) {
93                                 var p;
94                                 for (var j in perm_list) {
95                                         if (perm_list[j].id() == user_perms[i].perm()) {
96                                                 p = perm_list[j];
97                                                 break;
98                                         }
99                                 }
100                                 throw "Depth is required on the " + p.code() + " permission.";
101                         }
102                 }
103
104                 user.permissions(user_perms);
105
106                 for (var i in required_user_parts) {
107                         if (!user[i]()) {
108                                 throw required_user_parts[i] + " is required.";
109                         }
110                 }
111
112                 for (var j in user.addresses()) {
113                         if (user.addresses()[j].isdeleted()) continue;
114
115                         for (var i in required_addr_parts) {
116                                 if (!user.addresses()[j][i]()) {
117                                         throw required_addr_parts[i] + " is required.";
118                                 }
119                         }
120                 }
121
122                 var res = [];
123                 for (var i in responses) {
124                         if (!i) continue;
125                         for (var j in responses[i]) {
126                                 if (!j) continue;
127                                 var r = new asvr();
128                                 r.usr(survey_user);
129                                 r.survey(i);
130                                 r.question(j);
131                                 r.answer(responses[i][j]);
132                                 r.answer_date( document.getElementById('e_date_'+i).value );
133                                 res.push(r);
134                         }
135                 }
136
137                 user.survey_responses( res );
138                 responses = {};
139
140
141                 if (user.billing_address().isdeleted()) 
142                         throw "Please select a valid Billing Address";
143
144                 if (user.mailing_address().isdeleted()) 
145                         throw "Please select a valid Mailing Address";
146
147                 var req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.patron.update', ses_id, user );
148                 req.send(true);
149                 var ok = req.getResultObject();
150
151                 if (ok.ilsevent) throw ok;
152                         
153                 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.set_groups', ses_id, ok.id(), user_groups );
154                 req.send(true);
155                 req.getResultObject();
156
157                 if (ok) {
158                         alert(  'User ' + ok.usrname() +
159                                 ' [' + ok.card().barcode() + '] ' +
160                                 ' successfully saved!');
161                 }
162
163                 init_editor(ok);
164
165         } catch (e) {
166                 dump( js2JSON( e ));
167                 alert( js2JSON( e ));
168         };
169
170
171
172         return false;
173 }
174
175 var _fake_id = 0;
176 function fakeid () {
177         return --_fake_id;
178 };
179
180 var adv_mode = false;
181 function apply_adv_mode (root) {
182         adv_items = findNodesByClass(root,'advanced');
183         for (var i in adv_items) {
184                 adv_mode ?
185                         removeCSSClass(adv_items[i], 'hideme') :
186                         addCSSClass(adv_items[i], 'hideme');
187         }
188 }
189
190 function init_editor (u) {
191         
192         var x = document.getElementById('editor').elements;
193
194         
195         cgi = new CGI();
196         if (cgi.param('adv')) adv_mode = true;
197         apply_adv_mode(document.getElementById('editor'));
198
199         if (!u) {
200                 ses_id = cgi.param('ses');
201
202                 var usr_id = cgi.param('usr');
203                 var usr_barcode = cgi.param('barcode');
204                 if (!usr_id && !usr_barcode) {
205
206                         user = new au();
207                         user.id(fakeid());
208                         user.isnew(1);
209
210                         user.mailing_address( new aua() );
211                         user.mailing_address().isnew(1);
212                         user.mailing_address().id(fakeid());
213
214                         user.billing_address( user.mailing_address() );
215
216                         user.card( new ac() );
217                         user.card().isnew(1);
218                         user.card().id(fakeid());
219
220                         user.addresses([]);
221                         user.addresses().push(user.mailing_address());
222                         
223                         user.cards([]);
224                         user.cards().push(user.card());
225
226                 } else {
227                         var req;
228                         if (usr_id) {
229                                 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve', ses_id, usr_id );
230                         } else {
231                                 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve_by_barcode', ses_id, usr_barcode );
232                         }
233                         req.send(true);
234                         user = req.getResultObject();
235                 }
236
237         } else {
238                 user = u;
239         }
240
241         if (user.id() > 0) x['user.id'].value = user.id();
242         if (cgi.param('adv')) x['user.id'].parentNode.parentNode.setAttribute('adv', 'false');
243
244         if (user.create_date()) x['user.create_date'].value = user.create_date();
245
246         if (user.usrname()) x['user.usrname'].value = user.usrname();
247         x['user.usrname'].setAttribute('onchange','user.usrname(this.value)');
248
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)');
251         if (user.isnew()) {
252                 x['user.card.barcode'].disabled = false;
253         } else {
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(); ' +
263                         'return false;'
264                 );
265         }
266
267         if (user.passwd()) x['user.passwd'].value = user.passwd();
268         x['user.passwd'].setAttribute('onchange','user.passwd(this.value)');
269
270         if (user.prefix()) x['user.prefix'].value = user.prefix();
271         x['user.prefix'].setAttribute('onchange','user.prefix(this.value)');
272
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)');
275
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);');
278
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)');
281
282         if (user.suffix()) x['user.suffix'].value = user.suffix();
283         x['user.suffix'].setAttribute('onchange','user.suffix(this.value)');
284
285         if (user.dob()) x['user.dob'].value = user.dob();
286         x['user.dob'].setAttribute('onchange','user.dob(this.value)');
287
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)');
290
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)');
293
294         if (user.email()) x['user.email'].value = user.email();
295         x['user.email'].setAttribute('onchange','user.email(this.value)');
296
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)');
299
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)');
302
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)');
305
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)');
308
309         if (user.active()) x['user.active'].checked = true;
310         x['user.active'].setAttribute('onchange','user.active(this.checked ? "t" : "f" )');
311
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" )');
314
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');
318
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');
322
323         if (user.claims_returned_count()) x['user.claims_returned_count'].value = user.claims_returned_count();
324         // onchange handled by func above
325
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)');
328
329
330         // set up the home_ou selector
331         req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.org_tree.retrieve' );
332         req.send(true);
333         orgTree = req.getResultObject();
334
335         selectBuilder(
336                 'user.home_ou',
337                 [orgTree],
338                 user.home_ou(),
339                 { label_field           : 'name',
340                   value_field           : 'id',
341                   empty_label           : '-- Required --',
342                   empty_value           : '',
343                   clear                 : true,
344                   child_field_name      : 'children' }
345         );
346
347         x['user.home_ou'].setAttribute('onchange','user.home_ou(this.options[this.selectedIndex].value)');
348
349         // set up the ident_type selector
350         req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.ident_types.retrieve' );
351         req.send(true);
352         ident_type_list = req.getResultObject();
353
354         selectBuilder(
355                 'user.ident_type',
356                 ident_type_list,
357                 user.ident_type(),
358                 { label_field           : 'name',
359                   value_field           : 'id',
360                   empty_label           : '-- Required --',
361                   empty_value           : '',
362                   clear                 : true }
363         );
364
365         x['user.ident_type'].setAttribute('onchange','user.ident_type(this.options[this.selectedIndex].value)');
366
367         selectBuilder(
368                 'user.ident_type2',
369                 ident_type_list,
370                 (user.ident_value2 == '' ? user.ident_type2() : ''),
371                 { label_field           : 'name',
372                   value_field           : 'id',
373                   empty_label           : '-- Optional --',
374                   empty_value           : '',
375                   clear                 : true }
376         );
377
378         x['user.ident_type2'].setAttribute('onchange','var x = this.options[this.selectedIndex].value; x ? user.ident_type2(x) : user.ident_type2(null);');
379
380
381 /*
382         // set up the barred checkbox
383         req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.standings.retrieve' );
384         req.send(true);
385         standing_list = req.getResultObject();
386
387         selectBuilder(
388                 'user.standing',
389                 standing_list,
390                 user.standing(),
391                 { label_field           : 'value',
392                   value_field           : 'id',
393                   empty_label           : '-- Required --',
394                   empty_value           : '',
395                   clear                 : true }
396         );
397
398         x['user.standing'].setAttribute('onchange','user.standing(this.options[this.selectedIndex].value)');
399 */
400
401         // set up the profile selector
402         req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.groups.tree.retrieve' );
403         req.send(true);
404         group_tree = req.getResultObject();
405
406         selectBuilder(
407                 'user.profile',
408                 [group_tree],
409                 user.profile(),
410                 { label_field           : 'name',
411                   value_field           : 'id',
412                   empty_label           : '-- Required --',
413                   empty_value           : '',
414                   clear                 : true,
415                   child_field_name      : 'children' }
416         );
417
418         x['user.profile'].setAttribute('onchange','user.profile(this.options[this.selectedIndex].value)');
419
420         // set up the profile selector
421         var user_group_objects = [];
422         if (user.id() > 0) {
423                 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.get_groups', ses_id, user.id() );
424                 req.send(true);
425                 user_group_objects = req.getResultObject();
426         }
427
428         user_groups = [];
429         for (var i in user_group_objects) {
430                 user_groups.push(user_group_objects[i].grp());
431         }
432
433         selectBuilder(
434                 'permgroups',
435                 [group_tree],
436                 user_groups,
437                 { label_field           : 'name',
438                   value_field           : 'id',
439                   clear                 : true,
440                   child_field_name      : 'children' }
441         );
442
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);' +
448                 '}');
449
450                 display_all_addresses();
451
452         if (cgi.param('adv')) x['permgroups'].parentNode.parentNode.setAttribute('adv', 'false');
453
454         req = new RemoteRequest( 'open-ils.circ', 'open-ils.circ.survey.retrieve.required', ses_id );
455         req.send(true);
456         surveys = req.getResultObject();
457
458         var f = document.getElementById('surveys');
459         while (f.firstChild) f.removeChild(f.lastChild);
460
461         for ( var i in surveys )
462                 display_survey( f, surveys[i].id(), user.id() );
463
464         req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id );
465         req.send(true);
466         var staff_perms = req.getResultObject();
467
468         user_perms = [];
469         perm_list = [];
470         if (user.id() > 0) {
471                 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id, user.id() );
472                 req.send(true);
473                 var up = req.getResultObject();
474                 for (var i in up) {
475                         if (up[i].id() > 0)
476                                 user_perms.push(up[i]);
477                 }
478
479                 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.retrieve' );
480                 req.send(true);
481                 perm_list = req.getResultObject();
482         }
483
484         f = document.getElementById('permissions');
485         while (f.firstChild) f.removeChild(f.lastChild);
486
487         for (var i in perm_list)
488                 display_perm(f,perm_list[i],staff_perms);
489
490
491         req = new RemoteRequest( 'open-ils.circ', 'open-ils.circ.stat_cat.actor.retrieve.all', ses_id );
492         req.send(true);
493         var sc_list = req.getResultObject();
494
495         var missing_scs = [];
496         for (var i in user.stat_cat_entries()) {
497                 var found = 0;
498                 for (var j in sc_list) {
499                         if (sc_list[j].id() == user.stat_cat_entries()[i].stat_cat()) {
500                                 found = 1;
501                                 break;
502                         }
503                 }
504                 if (!found)
505                         missing_scs.push(user.stat_cat_entries()[i].stat_cat());
506         }
507         
508         req = new RemoteRequest( 'open-ils.circ', 'open-ils.circ.stat_cat.actor.retrieve.batch', ses_id, missing_scs );
509         req.send(true);
510         var foreign_sc_list = req.getResultObject();
511
512         f = document.getElementById('statcats');
513         while (f.firstChild) f.removeChild(f.lastChild);
514
515         for (var i in sc_list)
516                 display_sc(f,sc_list[i],user.stat_cat_entries());
517
518         for (var i in foreign_sc_list)
519                 display_sc(f,foreign_sc_list[i],user.stat_cat_entries(), true);
520
521         return true;
522 }
523
524 function set_sc_value (node) {
525         var id = parseInt(node.getAttribute('scid'));
526         var value = node.value;
527
528
529         var sc;
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);
533                         if (value == '') {
534                                 user.stat_cat_entries()[i].isdeleted(1);
535                         } else {
536                                 user.stat_cat_entries()[i].isdeleted(0);
537                                 user.stat_cat_entries()[i].ischanged(1);
538                         }
539                         sc = user.stat_cat_entries()[i];
540                         break;
541                 }
542         }
543
544         if (!sc) {
545                 sc = new actscecm();
546                 sc.isnew(1);
547                 sc.stat_cat_entry(value);
548                 sc.stat_cat(id);
549                 sc.target_usr(user.id());
550
551                 user.stat_cat_entries().push(sc);
552         }
553 }
554
555 function display_sc (root,sc_def, user_scs, foreign) {
556
557         var sc;
558         for (var i in user_scs) {
559                 if (sc_def.id() == user_scs[i].stat_cat()) {
560                         sc = user_scs[i];
561                         break;
562                 }
563         }
564
565         var sc_row = findNodeByName(document.getElementById('statcat-tmpl'), 'scrow').cloneNode(true);
566         root.appendChild(sc_row);
567
568         findNodeByName(sc_row,'sc.name').appendChild(text(sc_def.name()));
569
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();
573
574         if (!foreign) {
575                 if (sc_def.entries().length > 0) {
576                         var selector = findNodeByName(sc_row,'sce_select');
577                         selector.id = 'scid-' + sc_def.id();
578
579                         removeCSSClass(selector.parentNode, 'hideme');
580         
581                         selectBuilder(
582                                 'scid-' + sc_def.id(),
583                                 sc_def.entries(),
584                                 (sc ? sc.stat_cat_entry() : ''),
585                                 { label_field           : 'value',
586                                 value_field             : 'value',
587                                 empty_label             : '-- Select One --',
588                                 empty_value             : '',
589                                 clear                   : true }
590                         );
591                 }
592         } else {
593                 text_box.disabled = true;
594                 text_box.parentNode.appendChild(text('(Foreign Stat Cat)'));
595         }
596 }
597
598 function display_perm (root,perm_def,staff_perms) {
599
600         var prow = findNodeByName(document.getElementById('permission-tmpl'), 'prow').cloneNode(true);
601         root.appendChild(prow);
602
603         var all = false;
604         for (var i in staff_perms) {
605                 if (staff_perms[i].perm() == -1) {
606                         all = true;
607                         break;
608                 }
609         }
610
611
612         var sp,up;
613         if (!all) {
614                 for (var i in staff_perms) {
615                         if (perm_def.id() == staff_perms[i].perm() || staff_perms[i].perm() == -1) {
616                                 sp = staff_perms[i];
617                                 break;
618                         }
619                 }
620         }
621
622         for (var i in user_perms) {
623                 if (perm_def.id() == user_perms[i].perm() && user_perms[i].id() > 0)
624                         up = user_perms[i];
625         }
626
627
628         var dis = false;
629         if (!sp || !sp.grantable()) dis = true; 
630         if (all) dis = false; 
631
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());
636
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;
640
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();
644         selectBuilder(
645                 'perm-depth-' + perm_def.id(),
646                 globalOrgTypes,
647                 (up ? up.depth() : findOrgDepth(user.home_ou())),
648                 { label_field           : 'name',
649                   value_field           : 'depth',
650                   empty_label           : '-- Select One --',
651                   empty_value           : '',
652                   clear                 : true }
653         );
654         
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;
658
659 }
660
661 function display_all_addresses () {
662         d = document.getElementById('addresses');
663         while (d.firstChild)
664                 d.removeChild(d.lastChild);
665
666         for (var i in user.addresses())
667                 display_address(document.getElementById('addresses'), user.addresses()[i]);
668 }
669
670 function new_addr () {
671         var x = new aua();
672         x.isnew(1);
673         x.id(fakeid());
674
675         user.addresses().push(x);
676         display_address(document.getElementById('addresses'), x);
677 }
678
679 function display_survey (div, sid, uid) {
680
681         var t = document.getElementById('survey-tmpl').firstChild.cloneNode(true);
682         div.appendChild(t);
683         
684         init_survey(t,sid,uid);
685 }
686
687 function display_address (div, adr) {
688
689         var dis = false;
690         if (adr.isdeleted()) dis = true;
691
692         var t = document.getElementById('addr-tmpl').getElementsByTagName('table')[0].cloneNode(true);
693         div.appendChild(t);
694
695         var x;
696
697         x = findNodeByName(t, 'adr.address_type');
698         x.disabled = dis;
699         if (adr.address_type()) x.value = adr.address_type();
700         x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').address_type(this.value)');
701
702         x = findNodeByName(t, 'adr.street1');
703         x.disabled = dis;
704         if (adr.street1()) x.value = adr.street1();
705         x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').street1(this.value)');
706
707         x = findNodeByName(t, 'adr.street2');
708         x.disabled = dis;
709         if (adr.street2()) x.value = adr.street2();
710         x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').street2(this.value)');
711
712         x = findNodeByName(t, 'adr.city');
713         x.disabled = dis;
714         if (adr.city()) x.value = adr.city();
715         x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').city(this.value)');
716
717         x = findNodeByName(t, 'adr.state');
718         x.disabled = dis;
719         if (adr.state()) x.value = adr.state();
720         x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').state(this.value)');
721
722         x = findNodeByName(t, 'adr.post_code');
723         x.disabled = dis;
724         if (adr.post_code()) x.value = adr.post_code();
725         x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').post_code(this.value)');
726
727         x = findNodeByName(t, 'adr.county');
728         x.disabled = dis;
729         if (adr.county()) x.value = adr.county();
730         x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').county(this.value)');
731
732         x = findNodeByName(t, 'adr.country');
733         x.disabled = dis;
734         if (adr.country()) x.value = adr.country();
735         x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').country(this.value)');
736
737         x = findNodeByName(t, 'adr.valid');
738         x.disabled = dis;
739         if (adr.valid()) x.checked = true;
740         x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').valid(this.checked ? "t" : "f")');
741
742         x = findNodeByName(t, 'is_mailing');
743         x.disabled = dis;
744         x.value = adr.id();
745         x.setAttribute( 'onclick', 'user.mailing_address(findAddressById(' + adr.id() + '))');
746         if (adr.id() == user.mailing_address().id()) {
747                 x.checked = true;
748         }
749
750         x = findNodeByName(t, 'is_billing');
751         x.disabled = dis;
752         x.value = adr.id();
753         x.setAttribute( 'onclick', 'user.billing_address(findAddressById(' + adr.id() + '))');
754         if (adr.id() == user.billing_address().id()) {
755                 x.checked = true;
756         }
757
758         x = findNodeByName(t, 'remove');
759         if (dis) {
760                 x.setAttribute('onclick', 'unremove_adr(' + adr.id() + '); return false;');
761                 x.innerHTML = "Undelete this address";
762         } else {
763                 x.setAttribute('onclick', 'remove_adr(' + adr.id() + '); return false;');
764         }
765
766
767         return true;
768 }
769
770 function unremove_adr (id) {
771         findAddressById(id).isdeleted(0);
772         display_all_addresses();
773 }       
774
775 function remove_adr (id) {
776         findAddressById(id).isdeleted(1);
777         display_all_addresses();
778 }       
779
780 function findAddressById (id) {
781         for (var i in user.addresses())
782                 if (user.addresses()[i].id() == id) return user.addresses()[i];
783 }
784
785
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'];
790
791         if (!depth) depth = 0;
792
793         args['depth'] = parseInt(depth) + 1;
794
795         var child_field_name = args['child_field_name'];
796
797         var sel = id;
798         if (typeof sel != 'object')
799                 sel = document.getElementById(sel);
800
801         if (args['clear']) {
802                 for (var o in sel.options) {
803                         sel.options[o] = null;
804                 }
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;
809                 }
810         }
811
812         for (var i in objects) {
813                 var l = objects[i][label_field];
814                 var v = objects[i][value_field];
815
816                 if (typeof l == 'function')
817                         l = objects[i][label_field]();
818
819                 if (typeof v == 'function')
820                         v = objects[i][value_field]();
821
822                 var opt = new Option( l, v );
823
824                 if (depth) {
825                         var d = 10 * depth;
826                         opt.style.paddingLeft = '' + d + 'px';
827                 }
828
829                 sel.options[sel.options.length] = opt;
830
831
832                 if (typeof def == 'object') {
833                         for (var j in def) {
834                                 if (v == def[j]) opt.selected = true;
835                         }
836                 } else {
837                         if (v == def) opt.selected = true;
838                 }
839
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]();
844
845                         selectBuilder(
846                                 id,
847                                 c,
848                                 def,
849                                 { label_field           : args['label_field'],
850                                   value_field           : args['value_field'],
851                                   depth                 : args['depth'],
852                                   child_field_name      : args['child_field_name'] }
853                         );
854                 }
855
856         }
857 }       
858
859 function findNodesByClass(root, nodeClass, list) {
860         if(!list) list = [];
861         if( !root || !nodeClass) {
862                 return null;
863         }
864         
865         if(root.nodeType != 1) {
866                 return null;
867         }
868         
869         if(root.className.match(nodeClass)) list.push( root );
870
871         var children = root.childNodes;
872         
873         for( var i = 0; i != children.length; i++ ) {
874                 findNodesByClass(children[i], nodeClass, list);
875         }                       
876                         
877         return list;            
878 }                                       
879