fdc9795cc49d4aaa06164539398344752fb8bcf2
[brisk.git] / web / fieldify.js
1 function ends_with(s, suffix)
2 {
3     if (s.indexOf(suffix, s.length - suffix.length) !== -1) {
4         return true;
5     }
6     return false;
7 }
8
9 function __ffa_nav(obj, ret, name)
10 {
11     var arr;
12
13     arr = obj.className.split(" ");
14     if (arr.indexOf(name + "_id") != -1) {
15         ret.push(obj);
16         return;
17     }
18
19     // check if the current element is a leaf or a node
20     // if it is then return
21     for (var i = 0 ; i < arr.length ; i++) {
22         if (ends_with(arr[i], "_id")) {
23             return;
24         }
25     }
26
27     for (var i = 0 ; i < obj.children.length ; i++) {
28         __ffa_nav(obj.children[i], ret, name);
29     }
30     return;
31 }
32
33 function fieldify_get_dom_element(objarr, name)
34 {
35     var obj, ret = [];
36
37     for (var i = 0 ; i < objarr.length ; i++) {
38         obj = objarr[i];
39         for (var e = 0 ; e < obj.children.length ; e++) {
40             __ffa_nav(obj.children[e], ret, name);
41         }
42     }
43
44     if (ret.length > 0) {
45         return ret;
46     }
47     return false;
48 }
49
50 // fieldsdescr = { name: { type: 'typename' }, ... }
51 function Fieldify(dom_elements, fieldsdescr)
52 {
53     var item;
54
55     this.dom_elements = dom_elements;
56     this.field = new Array();
57     for (k in fieldsdescr) {
58         this.field[k] = fieldsdescr[k];
59         if (this.field[k].type == 'fields') {
60             if (item = fieldify_get_dom_element(this.dom_elements, k)) {
61                 this.field[k].obj = new Fieldify(item, this.field[k].fields);
62             }
63         }
64     }
65 }
66
67 Fieldify.prototype = {
68     dom_elements: null,
69     field: null,
70
71     visible: function(is_visible) {
72         this.dom_elements[0].style.visibility = (is_visible ? "visible" : "hidden" );
73     },
74
75     // { 'name': 'value' }
76     json2dom: function(field_values)
77     {
78         for (k in this.field) {
79             if (this.field[k].type == 'value') {
80                 this.fld_value_set(k, field_values[k]);
81             }
82             else if (this.field[k].type == 'radio') {
83                 this.fld_radio_set(k, field_values[k]);
84             }
85             else if (this.field[k].type == 'fields') {
86                 this.field[k].obj.json2dom(field_values[k]);
87             }
88         }
89     },
90
91     dom2json: function()
92     {
93         var ret = {};
94         for (k in this.field) {
95             if (this.field[k].perms == 'ro')
96                 continue;
97             if (this.field[k].type == 'value') {
98                 ret[k] = this.fld_value_get(k);
99             }
100             else if (this.field[k].type == 'radio') {
101                 ret[k] = this.fld_radio_get(k);
102             }
103             else if (this.field[k].type == 'fields') {
104                 ret[k] = this.field[k].obj.dom2json();
105             }
106         }
107         return ret;
108     },
109
110     fld_value_set: function(name, value)
111     {
112         var item = fieldify_get_dom_element(this.dom_elements, name);
113         if (item) {
114             item[0].innerHTML = value;
115         }
116     },
117
118     fld_value_get: function(name)
119     {
120         var item = fieldify_get_dom_element(this.dom_elements, name);
121         if (item) {
122             return (item[0].innerHTML);
123         }
124         return false;
125     },
126
127     fld_radio_set: function(name, value)
128     {
129         var arr = fieldify_get_dom_element(this.dom_elements, name);
130         if (arr) {
131             for (k in arr) {
132                 if (arr[k].value == value)
133                     arr[k].checked = true;
134                 else
135                     arr[k].checked = false;
136             }
137         }
138     },
139
140     fld_radio_get: function(name)
141     {
142         var ret = null;
143         var arr = fieldify_get_dom_element(this.dom_elements, name);
144         if (arr) {
145             for (k in arr) {
146                 if (arr[k].checked == true) {
147                     ret = arr[k].value;
148                     break;
149                 }
150             }
151         }
152         return ret;
153     },
154
155     tap: null
156 }