Fieldify: add multiple ancestor object to allow multi-tr fields
[brisk.git] / web / fieldify.js
1 function __fieldify_findfirst(objarr, name)
2 {
3     for (var i = 0, obj = objarr[i] ; i < objarr.length ; i++) {
4         var item = obj.getElementsByClassName(name + '_id');
5         if (item.length > 0) {
6             return (item);
7         }
8     }
9     return false;
10 }
11
12 // fieldsdescr = { name: { type: 'typename' }, ... }
13 function Fieldify(ancestors, fieldsdescr)
14 {
15     this.ancestors = ancestors;
16     this.field = new Array();
17     for (k in fieldsdescr) {
18         this.field[k] = fieldsdescr[k];
19         if (this.field[k].type == 'fields') {
20             var item = __fieldify_findfirst(this.ancestors, k);
21             if (item) {
22                 this.field[k].obj = new Fieldify(item, this.field[k].fields);
23             }
24         }
25     }
26 }
27
28 Fieldify.prototype = {
29     ancestors: null,
30     field: null,
31
32     visible: function(is_visible) {
33         this.ancestors[0].style.visibility = (is_visible ? "visible" : "hidden" );
34     },
35
36     // { 'name': 'value' }
37     json2dom: function(field_values)
38     {
39         for (k in this.field) {
40             if (this.field[k].type == 'value') {
41                 this.fld_value_set(k, field_values[k]);
42             }
43             else if (this.field[k].type == 'radio') {
44                 this.fld_radio_set(k, field_values[k]);
45             }
46             else if (this.field[k].type == 'fields') {
47                 this.field[k].obj.json2dom(field_values[k]);
48             }
49         }
50     },
51
52     dom2json: function()
53     {
54         var ret = {};
55         for (k in this.field) {
56             if (this.field[k].perms == 'ro')
57                 continue;
58             if (this.field[k].type == 'value') {
59                 ret[k] = this.fld_value_get(k);
60             }
61             else if (this.field[k].type == 'radio') {
62                 ret[k] = this.fld_radio_get(k);
63             }
64             else if (this.field[k].type == 'fields') {
65                 ret[k] = this.field[k].obj.dom2json();
66             }
67         }
68         return ret;
69     },
70
71     fld_value_set: function(name, value)
72     {
73         var item = __fieldify_findfirst(this.ancestors, name);
74         if (item) {
75             item[0].innerHTML = value;
76         }
77     },
78
79     fld_value_get: function(name)
80     {
81         var item = __fieldify_findfirst(this.ancestors, name);
82         if (item) {
83             return (item[0].innerHTML);
84         }
85         return false;
86     },
87
88     fld_radio_set: function(name, value)
89     {
90         var arr = __fieldify_findfirst(this.ancestors, name);
91         if (arr) {
92             for (k in arr) {
93                 if (arr[k].value == value)
94                     arr[k].checked = true;
95                 else
96                     arr[k].checked = false;
97             }
98         }
99     },
100
101     fld_radio_get: function(name)
102     {
103         var ret = null;
104         var arr = __fieldify_findfirst(this.ancestors, name);
105         if (arr) {
106             for (k in arr) {
107                 if (arr[k].checked == true) {
108                     ret = arr[k].value;
109                     break;
110                 }
111             }
112         }
113         return ret;
114     },
115
116     tap: null
117 }