/* * Small AJAX framework */ function ajax_request_callback(req) { if (req.readyState == 4 && req.status == 200) { var data = json_parse(req.responseText); if (typeof data.error == 'string') { if (typeof data.errormsg == 'string') error(data.errormsg); else error('Fehler im AJAX-Backend'); alert("Fehler im AJAX-Backend:\n" + data.error); } else if (req.oncomplete) req.oncomplete(data); } } function ajax_request(func,params,oncomplete) { var req = new XMLHttpRequest(); if (!req) return; var params = 'func=' + func + '&' + params; req.open ("POST", 'ajax/ajax.php'); req.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); req.setRequestHeader("Content-length", params.length); req.setRequestHeader("Connection", "close"); req.onreadystatechange = function() { ajax_request_callback(req); } if (typeof oncomplete == 'function') req.oncomplete = oncomplete; req.send(params); info(''); } 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; } else obj.innerHTML = value; } function setvar(obj, name, callback, status) { if (!obj.options[obj.selectedIndex].value.length) value = -1; else value = obj.options[obj.selectedIndex].value; var source = document.getElementById('source'); if (!source) return false; var parms = 'source=' + source.innerHTML + '&name=' + name + '&value=' + value; ajax_request('setvar', parms, callback); if (typeof status == 'function') status(obj,value,obj.options[obj.selectedIndex].innerHTML); } function get_info(name, values, callback) { var source = document.getElementById('source'); if (!source) return false; var parms = 'source=' + source.innerHTML + '&name=' + name; for (key in values) parms += '&' + key + '=' + values[key]; ajax_request('info', parms, callback); } /* * Form functions */ function form_init() { var form = document.getElementById('form_edit'); if (!form) return; for (var i=0; i < form.childNodes.length; i++) if (form.childNodes[i].nodeName.toLowerCase() == 'input' && form.childNodes[i].type.toLowerCase() == 'password') form.childNodes[i].value = ''; } function select_update(id, options, empty) { var obj = document.getElementById(id); if (!obj) return; if (typeof empty == 'undefined') empty = 0; obj.options.length = empty; for (var i=0; i < options.length; i++) obj.options[empty+i] = new Option(options[i].text,options[i].id,false,false); } var pre_save = false; var pre_insert = false; var post_save = function() { grid_update(grid); } var post_delete = function() { grid_update(grid); } function save_callback(data) { info('Datensatz gespeichert'); if (typeof post_save == 'function') post_save(); } function delete_callback(data) { info('Datensatz gelöscht'); if (typeof post_delete == 'function') post_delete(); } function form_save(obj) { var id = document.getElementById('edit_id'); if (!id.value.length) return form_insert(obj); info(''); if (typeof pre_save == 'function') if (!pre_save()) return false; ajax_request('save', Form.serialize(obj.form), save_callback); return false; } function form_insert(obj) { info(''); if (typeof pre_insert == 'function') if (!pre_insert()) return false; ajax_request('insert', Form.serialize(obj.form), save_callback); return false; } function form_delete(obj) { var id = document.getElementById('edit_id'); if (!id.value.length) return; 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 */ function gridDrillDown(e) { if (e.originalTarget && e.originalTarget.target && e.originalTarget.target == '_top') return; var id = 0; // Column 0 contains ID var row = grid.edit.drillDown(e,0,0); var cell = grid.columns[id].cell(row); if (!cell) return; var value = cell.innerHTML; if (!value.length || value == ' ') return; 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 = '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=" "; grid.clearRows(); grid.buffer.fetch(-1); } function grid_update_filters(grid) { var todo = false; for (var c=0; c < grid.headerColCnt; c++) { var fmt = grid.columns[c].format; if (typeof fmt.filterUI != 'string') continue; if (fmt.filterUI != 's') continue; $(grid.filterId(c)).options.length = 1; var options = {}; Object.extend(options, grid.buffer.ajaxOptions); var colnum = typeof(fmt.filterCol)=='number' ? fmt.filterCol : c; options.parameters = 'id='+grid.tableId+'&distinct='+colnum; options.onComplete = grid.filterValuesUpdate.bind(grid,c); new Ajax.Request(grid.buffer.dataSource, options); } } var calendars = new Array(); function calendar_callback(value) { this.input.value = value; } function calendar(name,event) { var input = document.getElementById(name); if (!input) return; if (calendars[name] == undefined) { calendars[name] = new Rico.CalendarControl('calendar_'+name, {startAt: 1, dateFmt: 'dd.mm.yyyy', showWeekNumber: 1}); calendars[name].atLoad(); calendars[name].returnValue = calendar_callback; RicoUtil.positionCtlOverIcon(calendars[name].container,input); calendars[name].open(input.value); calendars[name].input = input; } else { if (Element.visible(calendars[name].container)) calendars[name].close(); else calendars[name].open(input.value); } Event.stop(event); }