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