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