Add support for a configurable title for the edit box
[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             if (typeof data.errormsg == 'string')
11                 error(data.errormsg);
12             else
13                 error('Fehler im AJAX-Backend');
14             alert("Fehler im AJAX-Backend:\n" + data.error);
15         } else if (req.oncomplete)
16             req.oncomplete(data);
17     }
18 }
19
20 function ajax_request(func,params,oncomplete)
21 {
22     var req = new XMLHttpRequest();
23     if (!req) return;
24
25     var params = 'func=' + func + '&' + params;
26     req.open ("POST", 'ajax/ajax.php');
27     req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
28     req.setRequestHeader("Content-length", params.length);
29     req.setRequestHeader("Connection", "close");
30     req.onreadystatechange = function() { ajax_request_callback(req); }
31     if (typeof oncomplete == 'function')
32         req.oncomplete = oncomplete;
33     req.send(params);
34 }
35
36 function info(msg)
37 {
38     var status = document.getElementById('status');
39     if (!status) return;
40
41     status.innerHTML = msg;
42     status.className = 'status_ok';
43 }
44
45 function error(msg)
46 {
47     var status = document.getElementById('status');
48     if (!status) return;
49
50     status.innerHTML = msg;
51     status.className = 'status_error';
52 }
53
54 function set_value(id, value)
55 {
56     var obj = document.getElementById(id);
57     if (!obj) return;
58
59     if (obj.nodeName.toLowerCase() == 'input'
60         && obj.type.toLowerCase() == 'checkbox')
61         if (value) obj.checked = true;
62         else obj.checked = false;
63     else if (obj.nodeName.toLowerCase() == 'input'
64         || obj.nodeName.toLowerCase() == 'textarea')
65         obj.value = value;
66     else if (obj.nodeName.toLowerCase() == 'span')
67         obj.innerHTML = value;
68     else if (obj.nodeName.toLowerCase() == 'select')
69         for (var i=0; i < obj.options.length; i++)
70             if (obj.options[i].value == value)
71                 obj.selectedIndex = i;
72 }
73
74 function setvar(obj, name, callback, status)
75 {
76     if (!obj.options[obj.selectedIndex].value.length)
77         value = -1;
78     else
79         value = obj.options[obj.selectedIndex].value;
80
81     var source = document.getElementById('source');
82
83     if (!source) return false;
84
85     var parms = 'source=' + source.innerHTML + '&name=' + name + '&value=' + value;
86
87     ajax_request('setvar', parms, callback);
88
89     if (typeof status == 'function')
90         status(obj,value,obj.options[obj.selectedIndex].innerHTML);
91 }
92
93 /*
94  * Form functions
95  */
96 function form_init()
97 {
98     var form = document.getElementById('form_edit');
99
100     if (!form) return;
101
102     for (var i=0; i<form.children.length; i++)
103         if (form.children[i].tagName.toLowerCase() == 'input'
104             && form.children[i].type.toLowerCase() == 'password')
105             form.children[i].value = '';
106 }
107
108 function save_callback(data)
109 {
110     info('Datensatz gespeichert');
111     grid_update(grid);
112 }
113
114 function delete_callback(data)
115 {
116     info('Datensatz gelöscht');
117     grid_update(grid);
118 }
119
120 function form_save(obj)
121 {
122     info('');
123     ajax_request('save', Form.serialize(obj.form), save_callback);
124     return false;
125 }
126
127 function form_insert(obj)
128 {
129     info('');
130     ajax_request('insert', Form.serialize(obj.form), save_callback);
131     return false;
132 }
133
134 function form_delete(obj)
135 {
136     var id = document.getElementById('edit_id');
137     var source = document.getElementById('edit_source');
138     info('');
139     var params = 'id='+id.value + '&source='+source.value;
140     ajax_request('delete', params, delete_callback);
141     return false;
142 }
143
144 /*
145  * Table functions
146  */
147 function details_callback(data)
148 {
149     for (var id in data)
150         set_value('detail_'+id, data[id]);
151 }
152
153 function fetch_callback(data)
154 {
155     for (var id in data)
156         set_value('edit_'+id, data[id]);
157
158     var status = document.getElementById('form_status');
159     status.innerHTML = 'Geändert: ' + data.sys_edit + ' von ' + data.sys_user;
160 }
161
162 /*
163  * Rico functions
164  */
165 function gridDrillDown(e)
166 {
167     if (e.originalTarget && e.originalTarget.target && e.originalTarget.target == '_top')
168         return;
169
170     var id = 0; // Column 0 contains ID
171     var row = grid.edit.drillDown(e,0,0);
172     var cell = grid.columns[id].cell(row);
173     if (!cell) return;
174     var value = cell.innerHTML;
175
176     if (document.getElementById('details')) {
177         var params = 'source=' + grid.tableId.substr(5) + '&id=' + value;
178         ajax_request('details', params, details_callback);
179     }
180
181     if (document.getElementById('form_edit')) {
182         var params = 'source=' + grid.tableId.substr(5) + '&id=' + value;
183         ajax_request('fetch', params, fetch_callback);
184     }
185 }
186
187 /* Update an existing grid
188  *
189  * grid is a live grid
190  * filter is the array index of the $table_filters array in mskdef
191  * value is the value applied to the filter
192  */
193 function grid_update(grid, filter, value)
194 {
195     if (grid === undefined)
196         return;
197
198     if (filter !== undefined && filter !== false)
199                 grid.buffer.options.requestParameters = ['w'+filter+'=' + value];
200     grid.buffer.clear();
201     grid.buffer.setTotalRows(0);
202     grid.buffer.foundRowCount = false;
203     grid.cancelMenu();
204     grid.ClearSelection();
205     grid.setImages();
206     if (grid.bookmark) grid.bookmark.innerHTML="&nbsp;";
207     grid.clearRows();
208     grid.buffer.fetch(-1);
209 }
210
211 var calendars = new Array();
212 function calendar_callback(value)
213 {
214     this.input.value = value;
215 }
216
217 function calendar(name,event)
218 {
219     var input = document.getElementById(name);
220     if (!input) return;
221
222     if (calendars[name] == undefined) {
223         calendars[name] = new Rico.CalendarControl('calendar_'+name,
224                                                    {startAt: 1,
225                                                     dateFmt: 'dd.mm.yyyy',
226                                                     showWeekNumber: 1});
227         calendars[name].atLoad();
228         calendars[name].returnValue = calendar_callback;
229         RicoUtil.positionCtlOverIcon(calendars[name].container,input);
230         calendars[name].open(input.value);
231         calendars[name].input = input;
232     } else {
233         if (Element.visible(calendars[name].container))
234             calendars[name].close();
235         else
236             calendars[name].open(input.value);
237     }
238     Event.stop(event);
239 }