]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/patron/user_edit.js
updates for the perm editor -- FM dance required
[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));
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                 alert(e)
166         };
167
168         return false;
169 }
170
171 var _fake_id = 0;
172 function fakeid () {
173         return --_fake_id;
174 };
175
176 var adv_mode = false;
177 function apply_adv_mode (root) {
178         adv_items = findNodesByClass(root,'advanced');
179         for (var i in adv_items) {
180                 adv_mode ?
181                         removeCSSClass(adv_items[i], 'hideme') :
182                         addCSSClass(adv_items[i], 'hideme');
183         }
184 }
185
186 function init_editor (u) {
187         
188         var x = document.getElementById('editor').elements;
189
190         
191         cgi = new CGI();
192         if (cgi.param('adv')) adv_mode = true;
193         apply_adv_mode(document.getElementById('editor'));
194
195         if (!u) {
196                 ses_id = cgi.param('ses');
197
198                 var usr_id = cgi.param('usr');
199                 if (!usr_id) {
200
201                         user = new au();
202                         user.isnew(1);
203
204                         user.mailing_address( new aua() );
205                         user.mailing_address().isnew(1);
206                         user.mailing_address().id(fakeid());
207
208                         user.billing_address( user.mailing_address() );
209
210                         user.card( new ac() );
211                         user.card().isnew(1);
212                         user.card().id(fakeid());
213
214                         user.addresses([]);
215                         user.addresses().push(user.mailing_address());
216                         
217                         user.cards([]);
218                         user.cards().push(user.card());
219
220                 } else {
221                         var req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.fleshed.retrieve', ses_id, usr_id );
222                         req.send(true);
223                         user = req.getResultObject();
224                 }
225
226         } else {
227                 user = u;
228         }
229
230         if (user.id()) x['user.id'].value = user.id();
231         if (cgi.param('adv')) x['user.id'].parentNode.parentNode.setAttribute('adv', 'false');
232
233         if (user.create_date()) x['user.create_date'].value = user.create_date();
234
235         if (user.usrname()) x['user.usrname'].value = user.usrname();
236         x['user.usrname'].setAttribute('onchange','user.usrname(this.value)');
237
238         if (user.card() && user.card().barcode()) x['user.card.barcode'].value = user.card().barcode();
239         x['user.card.barcode'].setAttribute('onchange','user.card().barcode(this.value)');
240         if (user.isnew()) {
241                 x['user.card.barcode'].disabled = false;
242         } else {
243                 x['replace_card'].className = '';
244                 x['replace_card'].setAttribute('onclick',
245                         'user.card(new ac()); ' +
246                         'user.card().isnew(1); ' +
247                         'user.card().id(fakeid()); ' +
248                         'user.cards().push(user.card()); ' +
249                         'this.parentNode.firstChild.disabled = false; ' +
250                         'this.parentNode.firstChild.value = ""; ' +
251                         'this.parentNode.firstChild.focus(); ' +
252                         'return false;'
253                 );
254         }
255
256         if (user.passwd()) x['user.passwd'].value = user.passwd();
257         x['user.passwd'].setAttribute('onchange','user.passwd(this.value)');
258
259         if (user.prefix()) x['user.prefix'].value = user.prefix();
260         x['user.prefix'].setAttribute('onchange','user.prefix(this.value)');
261
262         if (user.first_given_name()) x['user.first_given_name'].value = user.first_given_name();
263         x['user.first_given_name'].setAttribute('onchange','user.first_given_name(this.value)');
264
265         if (user.second_given_name()) x['user.second_given_name'].value = user.second_given_name();
266         x['user.second_given_name'].setAttribute('onchange','user.second_given_name(this.value);');
267
268         if (user.family_name()) x['user.family_name'].value = user.family_name();
269         x['user.family_name'].setAttribute('onchange','user.family_name(this.value)');
270
271         if (user.suffix()) x['user.suffix'].value = user.suffix();
272         x['user.suffix'].setAttribute('onchange','user.suffix(this.value)');
273
274         if (user.dob()) x['user.dob'].value = user.dob();
275         x['user.dob'].setAttribute('onchange','user.dob(this.value)');
276
277         if (user.ident_value()) x['user.ident_value'].value = user.ident_value();
278         x['user.ident_value'].setAttribute('onchange','user.ident_value(this.value)');
279
280         if (user.ident_value2()) x['user.ident_value2'].value = user.ident_value2();
281         x['user.ident_value2'].setAttribute('onchange','user.ident_value2(this.value)');
282
283         if (user.email()) x['user.email'].value = user.email();
284         x['user.email'].setAttribute('onchange','user.email(this.value)');
285
286         if (user.day_phone()) x['user.day_phone'].value = user.day_phone();
287         x['user.day_phone'].setAttribute('onchange','user.day_phone(this.value)');
288
289         if (user.evening_phone()) x['user.evening_phone'].value = user.evening_phone();
290         x['user.evening_phone'].setAttribute('onchange','user.evening_phone(this.value)');
291
292         if (user.other_phone()) x['user.other_phone'].value = user.other_phone();
293         x['user.other_phone'].setAttribute('onchange','user.other_phone(this.value)');
294
295         if (user.expire_date()) x['user.expire_date'].value = user.expire_date();
296         x['user.expire_date'].setAttribute('onchange','user.expire_date(this.value)');
297
298         if (user.active()) x['user.active'].checked = true;
299         x['user.active'].setAttribute('onchange','user.active(this.checked ? "t" : "f" )');
300
301         if (user.master_account()) x['user.master_account'].checked = true;
302         x['user.master_account'].setAttribute('onchange','user.master_account(this.checked ? "t" : "f" )');
303
304         if (user.super_user()) x['user.super_user'].checked = true;
305         x['user.super_user'].setAttribute('onchange','user.super_user(this.checked ? "t" : "f" )');
306         if (cgi.param('adv')) x['user.super_user'].parentNode.parentNode.setAttribute('adv', 'false');
307
308         if (user.claims_returned_count()) x['user.claims_returned_count'].value = user.claims_returned_count();
309         // onchange handled by func above
310
311         if (user.alert_message()) x['user.alert_message'].value = user.alert_message();
312         x['user.alert_message'].setAttribute('onchange','user.alert_message(this.value)');
313
314
315         // set up the home_ou selector
316         req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.org_tree.retrieve' );
317         req.send(true);
318         orgTree = req.getResultObject();
319
320         selectBuilder(
321                 'user.home_ou',
322                 [orgTree],
323                 user.home_ou(),
324                 { label_field           : 'name',
325                   value_field           : 'id',
326                   empty_label           : '-- Required --',
327                   empty_value           : '',
328                   clear                 : true,
329                   child_field_name      : 'children' }
330         );
331
332         x['user.home_ou'].setAttribute('onchange','user.home_ou(this.options[this.selectedIndex].value)');
333
334         // set up the ident_type selector
335         req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.ident_types.retrieve' );
336         req.send(true);
337         ident_type_list = req.getResultObject();
338
339         selectBuilder(
340                 'user.ident_type',
341                 ident_type_list,
342                 user.ident_type(),
343                 { label_field           : 'name',
344                   value_field           : 'id',
345                   empty_label           : '-- Required --',
346                   empty_value           : '',
347                   clear                 : true }
348         );
349
350         x['user.ident_type'].setAttribute('onchange','user.ident_type(this.options[this.selectedIndex].value)');
351
352         selectBuilder(
353                 'user.ident_type2',
354                 ident_type_list,
355                 (user.ident_value2 == '' ? user.ident_type2() : ''),
356                 { label_field           : 'name',
357                   value_field           : 'id',
358                   empty_label           : '-- Optional --',
359                   empty_value           : '',
360                   clear                 : true }
361         );
362
363         x['user.ident_type2'].setAttribute('onchange','var x = this.options[this.selectedIndex].value; x ? user.ident_type2(x) : user.ident_type2(null);');
364
365
366         // set up the standing selector
367         req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.standings.retrieve' );
368         req.send(true);
369         standing_list = req.getResultObject();
370
371         selectBuilder(
372                 'user.standing',
373                 standing_list,
374                 user.standing(),
375                 { label_field           : 'value',
376                   value_field           : 'id',
377                   empty_label           : '-- Required --',
378                   empty_value           : '',
379                   clear                 : true }
380         );
381
382         x['user.standing'].setAttribute('onchange','user.standing(this.options[this.selectedIndex].value)');
383
384         // set up the profile selector
385         req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.groups.tree.retrieve' );
386         req.send(true);
387         group_tree = req.getResultObject();
388
389         selectBuilder(
390                 'user.profile',
391                 [group_tree],
392                 user.profile(),
393                 { label_field           : 'name',
394                   value_field           : 'id',
395                   empty_label           : '-- Required --',
396                   empty_value           : '',
397                   clear                 : true,
398                   child_field_name      : 'children' }
399         );
400
401         x['user.profile'].setAttribute('onchange','user.profile(this.options[this.selectedIndex].value)');
402
403         // set up the profile selector
404         var user_group_objects = [];
405         if (user.id() > 0) {
406                 req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.user.get_groups', ses_id, user.id() );
407                 req.send(true);
408                 user_group_objects = req.getResultObject();
409         }
410
411         user_groups = [];
412         for (var i in user_group_objects) {
413                 user_groups.push(user_group_objects[i].grp());
414         }
415
416         selectBuilder(
417                 'permgroups',
418                 [group_tree],
419                 user_groups,
420                 { label_field           : 'name',
421                   value_field           : 'id',
422                   clear                 : true,
423                   child_field_name      : 'children' }
424         );
425
426         x['permgroups'].setAttribute( 'onchange', 
427                 'window.user_groups = [];' +
428                 'for (var i = 0; i < this.options.length; i++) {' +
429                 '       if (this.options[i].selected)' +
430                 '               window.user_groups.push(this.options[i].value);' +
431                 '}');
432
433                 display_all_addresses();
434
435         if (cgi.param('adv')) x['permgroups'].parentNode.parentNode.setAttribute('adv', 'false');
436
437         req = new RemoteRequest( 'open-ils.circ', 'open-ils.circ.survey.retrieve.required', ses_id );
438         req.send(true);
439         surveys = req.getResultObject();
440
441         var f = document.getElementById('surveys');
442         while (f.firstChild) f.removeChild(f.lastChild);
443
444         for ( var i in surveys )
445                 display_survey( f, surveys[i].id(), user.id() );
446
447         req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id );
448         req.send(true);
449         var staff_perms = req.getResultObject();
450
451         user_perms = [];
452         req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.user_perms.retrieve', ses_id, user.id() );
453         req.send(true);
454         var up = req.getResultObject();
455         for (var i in up) {
456                 if (up[i].id() > 0)
457                         user_perms.push(up[i]);
458         }
459
460         req = new RemoteRequest( 'open-ils.actor', 'open-ils.actor.permissions.retrieve' );
461         req.send(true);
462         perm_list = req.getResultObject();
463
464         f = document.getElementById('permissions');
465         while (f.firstChild) f.removeChild(f.lastChild);
466
467         for (var i in perm_list)
468                 display_perm(f,perm_list[i],staff_perms);
469
470         return true;
471 }
472
473 function display_perm (root,perm_def,staff_perms) {
474
475         var prow = findNodeByName(document.getElementById('permission-tmpl'), 'prow').cloneNode(true);
476         root.appendChild(prow);
477
478         var all = false;
479         for (var i in staff_perms) {
480                 if (staff_perms[i].perm() == -1) {
481                         all = true;
482                         break;
483                 }
484         }
485
486
487         var sp,up;
488         if (!all) {
489                 for (var i in staff_perms) {
490                         if (perm_def.id() == staff_perms[i].perm() || staff_perms[i].perm() == -1) {
491                                 sp = staff_perms[i];
492                                 break;
493                         }
494                 }
495         }
496
497         for (var i in user_perms) {
498                 if (perm_def.id() == user_perms[i].perm() && user_perms[i].id() > 0)
499                         up = user_perms[i];
500         }
501
502
503         var dis = false;
504         if (!sp || !sp.grantable()) dis = true; 
505         if (all) dis = false; 
506
507         var label_cell = findNodeByName(prow,'plabel');
508         findNodeByName(label_cell,'p.code').appendChild(text(perm_def.code()));
509         findNodeByName(label_cell,'p.code').setAttribute('title', perm_def.description());
510         findNodeByName(label_cell,'p.code').setAttribute('permid', perm_def.id());
511
512         var apply_cell = findNodeByName(prow,'papply');
513         findNodeByName(apply_cell,'p.id').disabled = dis;
514         findNodeByName(apply_cell,'p.id').checked = up ? true : false;
515
516         var depth_cell = findNodeByName(prow,'pdepth');
517         findNodeByName(depth_cell,'p.depth').disabled = dis;
518         findNodeByName(depth_cell,'p.depth').id = 'perm-depth-' + perm_def.id();
519         selectBuilder(
520                 'perm-depth-' + perm_def.id(),
521                 globalOrgTypes,
522                 (up ? up.depth() : findOrgDepth(user.home_ou())),
523                 { label_field           : 'name',
524                   value_field           : 'depth',
525                   empty_label           : '-- Select One --',
526                   empty_value           : '',
527                   clear                 : true }
528         );
529         
530         var grant_cell = findNodeByName(prow,'pgrant');
531         findNodeByName(grant_cell,'p.grantable').disabled = dis;
532         findNodeByName(grant_cell,'p.grantable').checked = up ? (up.grantable() ? true : false) : false;
533
534 }
535
536 function display_all_addresses () {
537         d = document.getElementById('addresses');
538         while (d.firstChild)
539                 d.removeChild(d.lastChild);
540
541         for (var i in user.addresses())
542                 display_address(document.getElementById('addresses'), user.addresses()[i]);
543 }
544
545 function new_addr () {
546         var x = new aua();
547         x.isnew(1);
548         x.id(fakeid());
549
550         user.addresses().push(x);
551         display_address(document.getElementById('addresses'), x);
552 }
553
554 function display_survey (div, sid, uid) {
555
556         var t = document.getElementById('survey-tmpl').firstChild.cloneNode(true);
557         div.appendChild(t);
558         
559         init_survey(t,sid,uid);
560 }
561
562 function display_address (div, adr) {
563
564         var dis = false;
565         if (adr.isdeleted()) dis = true;
566
567         var t = document.getElementById('addr-tmpl').getElementsByTagName('table')[0].cloneNode(true);
568         div.appendChild(t);
569
570         var x;
571
572         x = findNodeByName(t, 'adr.address_type');
573         x.disabled = dis;
574         if (adr.address_type()) x.value = adr.address_type();
575         x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').address_type(this.value)');
576
577         x = findNodeByName(t, 'adr.street1');
578         x.disabled = dis;
579         if (adr.street1()) x.value = adr.street1();
580         x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').street1(this.value)');
581
582         x = findNodeByName(t, 'adr.street2');
583         x.disabled = dis;
584         if (adr.street2()) x.value = adr.street2();
585         x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').street2(this.value)');
586
587         x = findNodeByName(t, 'adr.city');
588         x.disabled = dis;
589         if (adr.city()) x.value = adr.city();
590         x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').city(this.value)');
591
592         x = findNodeByName(t, 'adr.state');
593         x.disabled = dis;
594         if (adr.state()) x.value = adr.state();
595         x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').state(this.value)');
596
597         x = findNodeByName(t, 'adr.post_code');
598         x.disabled = dis;
599         if (adr.post_code()) x.value = adr.post_code();
600         x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').post_code(this.value)');
601
602         x = findNodeByName(t, 'adr.county');
603         x.disabled = dis;
604         if (adr.county()) x.value = adr.county();
605         x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').county(this.value)');
606
607         x = findNodeByName(t, 'adr.country');
608         x.disabled = dis;
609         if (adr.country()) x.value = adr.country();
610         x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').country(this.value)');
611
612         x = findNodeByName(t, 'adr.valid');
613         x.disabled = dis;
614         if (adr.valid()) x.checked = true;
615         x.setAttribute( 'onchange', 'findAddressById(' + adr.id() + ').valid(this.checked ? "t" : "f")');
616
617         x = findNodeByName(t, 'is_mailing');
618         x.disabled = dis;
619         x.value = adr.id();
620         x.setAttribute( 'onclick', 'user.mailing_address(findAddressById(' + adr.id() + '))');
621         if (adr.id() == user.mailing_address().id()) {
622                 x.checked = true;
623         }
624
625         x = findNodeByName(t, 'is_billing');
626         x.disabled = dis;
627         x.value = adr.id();
628         x.setAttribute( 'onclick', 'user.billing_address(findAddressById(' + adr.id() + '))');
629         if (adr.id() == user.billing_address().id()) {
630                 x.checked = true;
631         }
632
633         x = findNodeByName(t, 'remove');
634         if (dis) {
635                 x.setAttribute('onclick', 'unremove_adr(' + adr.id() + '); return false;');
636                 x.innerHTML = "Undelete this address";
637         } else {
638                 x.setAttribute('onclick', 'remove_adr(' + adr.id() + '); return false;');
639         }
640
641
642         return true;
643 }
644
645 function unremove_adr (id) {
646         findAddressById(id).isdeleted(0);
647         display_all_addresses();
648 }       
649
650 function remove_adr (id) {
651         findAddressById(id).isdeleted(1);
652         display_all_addresses();
653 }       
654
655 function findAddressById (id) {
656         for (var i in user.addresses())
657                 if (user.addresses()[i].id() == id) return user.addresses()[i];
658 }
659
660
661 function selectBuilder (id, objects, def, args) {
662         var label_field = args['label_field'];
663         var value_field = args['value_field'];
664         var depth = args['depth'];
665
666         if (!depth) depth = 0;
667
668         args['depth'] = parseInt(depth) + 1;
669
670         var child_field_name = args['child_field_name'];
671
672         var sel = id;
673         if (typeof sel != 'object')
674                 sel = document.getElementById(sel);
675
676         if (args['clear']) {
677                 for (var o in sel.options) {
678                         sel.options[o] = null;
679                 }
680                 args['clear'] = false;
681                 if (args['empty_label']) {
682                         sel.options[0] = new Option( args['empty_label'], args['empty_value'] );
683                         sel.selectedIndex = 0;
684                 }
685         }
686
687         for (var i in objects) {
688                 var l = objects[i][label_field];
689                 var v = objects[i][value_field];
690
691                 if (typeof l == 'function')
692                         l = objects[i][label_field]();
693
694                 if (typeof v == 'function')
695                         v = objects[i][value_field]();
696
697                 var opt = new Option( l, v );
698
699                 if (depth) {
700                         var d = 10 * depth;
701                         opt.style.paddingLeft = '' + d + 'px';
702                 }
703
704                 sel.options[sel.options.length] = opt;
705
706
707                 if (typeof def == 'object') {
708                         for (var j in def) {
709                                 if (v == def[j]) opt.selected = true;
710                         }
711                 } else {
712                         if (v == def) opt.selected = true;
713                 }
714
715                 if (child_field_name) {
716                         var c = objects[i][child_field_name];
717                         if (typeof c == 'function')
718                                 c = objects[i][child_field_name]();
719
720                         selectBuilder(
721                                 id,
722                                 c,
723                                 def,
724                                 { label_field           : args['label_field'],
725                                   value_field           : args['value_field'],
726                                   depth                 : args['depth'],
727                                   child_field_name      : args['child_field_name'] }
728                         );
729                 }
730
731         }
732 }       
733
734 function findNodesByClass(root, nodeClass, list) {
735         if(!list) list = [];
736         if( !root || !nodeClass) {
737                 return null;
738         }
739         
740         if(root.nodeType != 1) {
741                 return null;
742         }
743         
744         if(root.className.match(nodeClass)) list.push( root );
745
746         var children = root.childNodes;
747         
748         for( var i = 0; i != children.length; i++ ) {
749                 findNodesByClass(children[i], nodeClass, list);
750         }                       
751                         
752         return list;            
753 }                                       
754