8554e2bfb4b5767dd1f055a799c6575f153e1591
[misc/kostenrechnung] / lib / functions.js
1 /*
2  * Small AJAX framework
3  */
4 function ajax_request_callback(req)
5 {
6     if (req.readyState == 4 && req.status == 200) {
7         var data = json_parse(req.responseText);
8
9         if (typeof data.error == 'string') {
10             error('Fehler im AJAX-Backend');
11             alert("Error in AJAX backend:\n" + data.error);
12         } else if (req.oncomplete)
13             req.oncomplete(data);
14     }
15 }
16
17 function ajax_request(func,params,oncomplete)
18 {
19     var req = new XMLHttpRequest();
20     if (!req) return;
21
22     var params = 'func=' + func + '&' + params;
23     req.open ("POST", 'ajax/ajax.php');
24     req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
25     req.setRequestHeader("Content-length", params.length);
26     req.setRequestHeader("Connection", "close");
27     if (typeof oncomplete == 'function') {
28         req.onreadystatechange = function() { ajax_request_callback(req); }
29         req.oncomplete = oncomplete;
30     }
31     req.send(params);
32 }
33
34 function info(msg)
35 {
36     var status = document.getElementById('status');
37     if (!status) return;
38
39     status.innerHTML = msg;
40     status.className = 'status_ok';
41 }
42
43 function error(msg)
44 {
45     var status = document.getElementById('status');
46     if (!status) return;
47
48     status.innerHTML = msg;
49     status.className = 'status_error';
50 }
51
52 function set_value(id, value)
53 {
54     var obj = document.getElementById(id);
55     if (!obj) return;
56
57     if (obj.nodeName.toLowerCase() == 'input'
58         && obj.type.toLowerCase() == 'checkbox')
59         if (value) obj.checked = true;
60         else obj.checked = false;
61     else if (obj.nodeName.toLowerCase() == 'input'
62         || obj.nodeName.toLowerCase() == 'textarea')
63         obj.value = value;
64     else if (obj.nodeName.toLowerCase() == 'span')
65         obj.innerHTML = value;
66     else if (obj.nodeName.toLowerCase() == 'select')
67         for (var i=0; i < obj.options.length; i++)
68             if (obj.options[i].value == value)
69                 obj.selectedIndex = i;
70 }
71
72 /*
73  * Form functions
74  */
75 function form_init()
76 {
77     var form = document.getElementById('form_edit');
78
79     if (!form) return;
80
81     for (var i=0; i<form.children.length; i++)
82         if (form.children[i].tagName.toLowerCase() == 'input'
83             && form.children[i].type.toLowerCase() == 'password')
84             form.children[i].value = '';
85 }
86
87 function save_callback(data)
88 {
89     info('Datensatz gespeichert');
90     grid_update(grid);
91 }
92
93 function delete_callback(data)
94 {
95     info('Datensatz gelöscht');
96     grid_update(grid);
97 }
98
99 function form_save(obj)
100 {
101     info('');
102     ajax_request('save', Form.serialize(obj.form), save_callback);
103     return false;
104 }
105
106 function form_insert(obj)
107 {
108     info('');
109     ajax_request('insert', Form.serialize(obj.form), save_callback);
110     return false;
111 }
112
113 function form_delete(obj)
114 {
115     var id = document.getElementById('edit_id');
116     var source = document.getElementById('edit_source');
117     info('');
118     var params = 'id='+id.value + '&source='+source.value;
119     ajax_request('delete', params, delete_callback);
120     return false;
121 }
122
123 /*
124  * Table functions
125  */
126 function details_callback(data)
127 {
128     for (var id in data)
129         set_value('detail_'+id, data[id]);
130 }
131
132 function fetch_callback(data)
133 {
134     for (var id in data)
135         set_value('edit_'+id, data[id]);
136
137     var status = document.getElementById('form_status');
138     status.innerHTML = 'Geändert: ' + data.sys_edit + ' von ' + data.sys_user;
139 }
140
141 /*
142  * Rico functions
143  */
144 function gridDrillDown(e)
145 {
146     if (e.originalTarget && e.originalTarget.target && e.originalTarget.target == '_top')
147         return;
148
149     var id = 0; // Column 0 contains ID
150     var row = grid.edit.drillDown(e,0,0);
151     var cell = grid.columns[id].cell(row);
152     if (!cell) return;
153     var value = cell.innerHTML;
154
155     if (document.getElementById('details')) {
156         var params = 'source=' + grid.tableId.substr(5) + '&id=' + value;
157         ajax_request('details', params, details_callback);
158     }
159
160     if (document.getElementById('form_edit')) {
161         var params = 'source=' + grid.tableId.substr(5) + '&id=' + value;
162         ajax_request('fetch', params, fetch_callback);
163     }
164 }
165
166 /* Update an existing grid
167  *
168  * grid is a live grid
169  * filter is the array index of the $table_filters array in mskdef
170  * value is the value applied to the filter
171  */
172 function grid_update(grid, filter, value)
173 {
174     if (grid === undefined)
175         return;
176
177     if (filter !== undefined && filter !== false)
178                 grid.buffer.options.requestParameters = ['w'+filter+'=' + value];
179     grid.buffer.clear();
180     grid.buffer.setTotalRows(0);
181     grid.buffer.foundRowCount = false;
182     grid.cancelMenu();
183     grid.ClearSelection();
184     grid.setImages();
185     if (grid.bookmark) grid.bookmark.innerHTML="&nbsp;";
186     grid.clearRows();
187     grid.buffer.fetch(-1);
188 }
189