Check error code when no completion function is defined as well
[misc/kostenrechnung] / lib / functions.js
index 3a69024..e4c6e50 100644 (file)
@@ -6,7 +6,10 @@ function ajax_request_callback(req)
     if (req.readyState == 4 && req.status == 200) {
        var data = json_parse(req.responseText);
 
-       if (req.oncomplete)
+       if (typeof data.error == 'string') {
+           error('Fehler im AJAX-Backend');
+           alert("Error in AJAX backend:\n" + data.error);
+       } else if (req.oncomplete)
            req.oncomplete(data);
     }
 }
@@ -21,21 +24,119 @@ function ajax_request(func,params,oncomplete)
     req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
     req.setRequestHeader("Content-length", params.length);
     req.setRequestHeader("Connection", "close");
-    if (typeof oncomplete == 'function') {
-       req.onreadystatechange = function() { ajax_request_callback(req); }
+    req.onreadystatechange = function() { ajax_request_callback(req); }
+    if (typeof oncomplete == 'function')
        req.oncomplete = oncomplete;
-    }
     req.send(params);
 }
 
+function info(msg)
+{
+    var status = document.getElementById('status');
+    if (!status) return;
+
+    status.innerHTML = msg;
+    status.className = 'status_ok';
+}
+
+function error(msg)
+{
+    var status = document.getElementById('status');
+    if (!status) return;
+
+    status.innerHTML = msg;
+    status.className = 'status_error';
+}
+
+function set_value(id, value)
+{
+    var obj = document.getElementById(id);
+    if (!obj) return;
+
+    if (obj.nodeName.toLowerCase() == 'input'
+       && obj.type.toLowerCase() == 'checkbox')
+       if (value) obj.checked = true;
+       else obj.checked = false;
+    else if (obj.nodeName.toLowerCase() == 'input'
+       || obj.nodeName.toLowerCase() == 'textarea')
+       obj.value = value;
+    else if (obj.nodeName.toLowerCase() == 'span')
+       obj.innerHTML = value;
+    else if (obj.nodeName.toLowerCase() == 'select')
+       for (var i=0; i < obj.options.length; i++)
+           if (obj.options[i].value == value)
+               obj.selectedIndex = i;
+}
+
 /*
  * Form functions
  */
+function form_init()
+{
+    var form = document.getElementById('form_edit');
+
+    if (!form) return;
+
+    for (var i=0; i<form.children.length; i++)
+       if (form.children[i].tagName.toLowerCase() == 'input'
+           && form.children[i].type.toLowerCase() == 'password')
+           form.children[i].value = '';
+}
+
+function save_callback(data)
+{
+    info('Datensatz gespeichert');
+    grid_update(grid);
+}
+
+function delete_callback(data)
+{
+    info('Datensatz gelöscht');
+    grid_update(grid);
+}
+
 function form_save(obj)
 {
+    info('');
+    ajax_request('save', Form.serialize(obj.form), save_callback);
+    return false;
+}
+
+function form_insert(obj)
+{
+    info('');
+    ajax_request('insert', Form.serialize(obj.form), save_callback);
+    return false;
+}
+
+function form_delete(obj)
+{
+    var id = document.getElementById('edit_id');
+    var source = document.getElementById('edit_source');
+    info('');
+    var params = 'id='+id.value + '&source='+source.value;
+    ajax_request('delete', params, delete_callback);
     return false;
 }
 
+/*
+ * Table functions
+ */
+function details_callback(data)
+{
+    for (var id in data)
+       set_value('detail_'+id, data[id]);
+}
+
+function fetch_callback(data)
+{
+    for (var id in data)
+       set_value('edit_'+id, data[id]);
+
+    var status = document.getElementById('form_status');
+    status.innerHTML = 'Geändert: ' + data.sys_edit + ' von ' + data.sys_user;
+}
+
 /*
  * Rico functions
  */
@@ -50,8 +151,38 @@ function gridDrillDown(e)
     if (!cell) return;
     var value = cell.innerHTML;
 
+    if (document.getElementById('details')) {
+       var params = 'source=' + grid.tableId.substr(5) + '&id=' + value;
+       ajax_request('details', params, details_callback);
+    }
+
     if (document.getElementById('form_edit')) {
-       var params = 'mask=' + grid.tableId.substr(5) + '&id=' + value;
-       ajax_request('fetch', params, false);
+       var params = 'source=' + grid.tableId.substr(5) + '&id=' + value;
+       ajax_request('fetch', params, fetch_callback);
     }
 }
+
+/* Update an existing grid
+ *
+ * grid is a live grid
+ * filter is the array index of the $table_filters array in mskdef
+ * value is the value applied to the filter
+ */
+function grid_update(grid, filter, value)
+{
+    if (grid === undefined)
+       return;
+
+    if (filter !== undefined && filter !== false)
+               grid.buffer.options.requestParameters = ['w'+filter+'=' + value];
+    grid.buffer.clear();
+    grid.buffer.setTotalRows(0);
+    grid.buffer.foundRowCount = false;
+    grid.cancelMenu();
+    grid.ClearSelection();
+    grid.setImages();
+    if (grid.bookmark) grid.bookmark.innerHTML="&nbsp;";
+    grid.clearRows();
+    grid.buffer.fetch(-1);
+}
+