4 function ajax_request_callback(req)
6 if (req.readyState == 4 && req.status == 200) {
7 var data = json_parse(req.responseText);
9 if (data && typeof data.error == 'string') {
10 if (typeof data.errormsg == 'string')
15 } else if (req.oncomplete)
20 function ajax_request(func,params,oncomplete)
22 var req = new XMLHttpRequest();
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;
38 var logout_timer = false;
39 window.setTimeout(reset_logout, 4000);
40 function reset_logout()
43 window.clearTimeout(logout_timer);
45 logout_timer = window.setTimeout(function() {
46 window.location.href = 'index.php?logout=true';
47 }, parseInt(document.getElementById('logout_refresh').innerHTML)*1000);
50 var edit_hidden = false;
51 var form_file_name = null;
52 var form_file_content = null;
53 function form_file_change_onloadstart(e)
55 var button = document.getElementById('button_insert');
56 button.disabled = true;
57 info('Upload wird vorbereitet');
60 function form_file_change_onloadend(e)
62 var button = document.getElementById('button_insert');
63 button.disabled = false;
67 function form_file_change_onload(e)
69 form_file_content = new Uint8ClampedArray(e.target.result);
72 function form_file_change(e)
74 var file = e.target.files[0];
75 var reader = new FileReader();
76 reader.onload = form_file_change_onload;
77 reader.onloadend = form_file_change_onloadend;
78 reader.onloadstart = form_file_change_onloadstart;
79 reader.readAsArrayBuffer(file);
80 form_file_filename = file.name;
83 function ajax_form_submit(func,form,oncomplete)
85 var boundary = "---------------------------" + (new Date).getTime();
87 var req = new XMLHttpRequest();
90 var parts = new Array();
92 if (func && func.length) {
93 var part = 'Content-Disposition: form-data; ';
94 part += 'name="func"' + CRLF + CRLF;
99 for (var i=0; i < form.childNodes.length; i++) {
101 var element = form.childNodes[i];
102 var fieldName = element.name;
104 if (element.nodeName.toLowerCase() == 'input' &&
105 element.type.toLowerCase() == 'file') {
107 if (typeof element.files[0].getAsBinary != 'function' &&
108 typeof window.FileReader == 'undefined') {
109 error('Upload von Dateien nicht möglich');
110 alert("Upload von Dateien in dieser Version von Firefox nicht möglich.\n" +
111 "Bitte verwenden Sie Firefox in der Version 3.5.");
116 var binary = element.files[0].getAsBinary();
117 var filename = element.files[0].fileName;
119 if (form_file_content) {
122 for (var j=0; j < form_file_content.length; j++)
123 binary += String.fromCharCode(form_file_content[j]);
125 var filename = form_file_filename;
127 error('Problem beim Lesen der Datei');
128 alert("Problem beim Lesen der Datei\n" +
129 element.files[0].fileName + "\n" +
130 "Eventuell stimmt das Encoding nicht\n" +
131 "Die Daten wurden nicht gespeichert");
136 part = 'Content-Disposition: form-data; ';
137 part += 'name="' + fieldName + '"; ';
138 part += 'filename="'+ filename + '"' + CRLF;
139 part += "Content-Type: application/octet-stream" + CRLF + CRLF;
140 part += binary + CRLF;
141 } else if (element.nodeName.toLowerCase() == 'input' ||
142 element.nodeName.toLowerCase() == 'textarea' ||
143 element.nodeName.toLowerCase() == 'select') {
145 if (element.type.toLowerCase() == 'checkbox') {
146 if (element.checked) value = 'on';
149 value = element.value;
152 part = 'Content-Disposition: form-data; ';
153 part += 'name="' + element.name + '"' + CRLF + CRLF;
154 part += value + CRLF;
160 var params = "--" + boundary + CRLF;
161 params += parts.join("--" + boundary + CRLF);
162 params += "--" + boundary + "--" + CRLF;
164 req.open ("POST", 'ajax/ajax.php');
165 req.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + boundary);
166 req.setRequestHeader("Connection", "close");
167 req.onreadystatechange = function() { ajax_request_callback(req); }
168 if (typeof oncomplete == 'function')
169 req.oncomplete = oncomplete;
170 req.sendAsBinary(params);
178 var status = document.getElementById('status');
181 status.innerHTML = msg;
182 status.className = 'status_ok';
187 var status = document.getElementById('status');
190 status.innerHTML = msg;
191 status.className = 'status_error';
194 function button_enable(id)
196 var button = document.getElementById(id);
199 button.className = '';
200 button.disabled = false;
203 function button_disable(id)
205 var button = document.getElementById(id);
208 button.className = 'disabled';
209 button.disabled = true;
212 function set_value(id, value)
214 var obj = document.getElementById(id);
217 if (obj.nodeName.toLowerCase() == 'input') {
218 if (obj.type.toLowerCase() == 'checkbox') {
219 if (value) obj.checked = true;
220 else obj.checked = false;
221 } else if (obj.type.toLowerCase() == 'file')
225 } else if (obj.nodeName.toLowerCase() == 'textarea')
227 else if (obj.nodeName.toLowerCase() == 'span')
228 obj.innerHTML = value;
229 else if (obj.nodeName.toLowerCase() == 'select') {
230 for (var i=0; i < obj.options.length; i++)
231 if (obj.options[i].value == value)
232 obj.selectedIndex = i;
234 obj.innerHTML = value;
237 function setvar(obj, name, callback, status)
239 if (!obj.options[obj.selectedIndex].value.length)
242 value = obj.options[obj.selectedIndex].value;
244 var source = document.getElementById('source');
246 if (!source) return false;
248 var parms = 'source=' + source.innerHTML + '&name=' + name + '&value=' + value;
250 ajax_request('setvar', parms, callback);
252 if (typeof status == 'function')
253 status(obj,value,obj.options[obj.selectedIndex].innerHTML);
256 function get_info(name, values, callback)
258 var source = document.getElementById('source');
260 if (!source) return false;
262 var parms = 'source=' + source.innerHTML + '&name=' + name;
264 parms += '&' + key + '=' + values[key];
266 ajax_request('info', parms, callback);
272 function form_clear(form)
276 for (var i=0; i < form.childNodes.length; i++)
277 if (form.childNodes[i].nodeName.toLowerCase() == 'input'
278 && (form.childNodes[i].type.toLowerCase() == 'password' ||
279 form.childNodes[i].type.toLowerCase() == 'file'))
280 form.childNodes[i].value = '';
282 var id = document.getElementById('edit_id');
283 if (id) id.value = '';
286 var form_first_use = true;
289 var form = document.getElementById('form_edit');
295 var elem = form.findFirstElement();
296 if (elem) elem.activate();
299 function form_elem_error(elem,text)
301 elem.style.borderColor = 'red';
302 elem.style.borderWidth = '1px';
303 elem.style.borderStyle = 'solid';
307 function form_elem_ok(elem)
309 elem.style.borderColor = '';
310 elem.style.borderWidth = '';
311 elem.style.borderStyle = '';
314 function form_reset_errors()
316 for (name in form_check) {
317 var elem = document.getElementById('edit_' + name);
322 var form_check_regexp = {
324 decimal: /^\d*([,\.]\d+)?$/,
325 date: /^(\d\d?\.\d\d?\.[1-9]\d\d\d)|([1-9]\d\d\d-\d\d?-\d\d?)$/
328 function form_elem_check(elem,check)
330 var checks = check.split(',');
332 for (var i=0; i < checks.length; i++) {
333 var tagName = elem.tagName.toLowerCase();
334 var label = document.getElementById('label_' + elem.name);
335 if (checks[i] == 'required') {
336 if ((tagName == 'input' ||
337 tagName == 'textarea') &&
338 elem.value.length == 0)
339 return label.innerHTML + ' muss ausgefüllt werden';
341 if (tagName == 'select' && elem.value.length == 0)
342 return label.innerHTML + ' muss ausgewählt werden';
343 } else if (form_check_regexp[checks[i]]) {
344 if (elem.value.length && !form_check_regexp[checks[i]].test(elem.value))
345 return 'Ungültiger Wert für ' + label.innerHTML;
352 function form_elem_onblur(e)
354 var first_use = form_first_use;
355 form_first_use = false;
357 var elem = document.getElementById('form_edit').findFirstElement();
358 if (first_use && elem == e.originalTarget && !e.originalTarget.length) return;
360 if (form_check[e.originalTarget.name]) {
361 var error = form_elem_check(e.originalTarget, form_check[e.originalTarget.name]);
363 form_elem_error(e.originalTarget, error);
367 function form_checks(form)
370 for (name in form_check) {
371 var elem = document.getElementById('edit_' + name);
372 var error = form_elem_check(elem, form_check[name]);
374 form_elem_error(elem, error);
375 errors += '. ' + error + "\n";
380 alert("Fehler im Formular:\n" + errors);
387 function select_update(id, options, empty)
389 var obj = document.getElementById(id);
392 if (typeof empty == 'undefined') empty = 0;
394 obj.options.length = empty;
396 for (var i=0; i < options.length; i++)
397 obj.options[empty+i] = new Option(options[i].text,options[i].id,false,false);
400 var pre_save = false;
401 var pre_insert = false;
402 var post_save = function() { grid_update(grid); }
403 var post_delete = function() { grid_update(grid); }
405 function save_callback(data)
407 info('Datensatz gespeichert');
409 if (typeof post_save == 'function')
412 var form = document.getElementById('form_edit');
417 Form.focusFirstElement(form);
420 function delete_callback(data)
422 info('Datensatz gelöscht');
424 if (typeof post_delete == 'function')
428 function form_save(obj)
430 var id = document.getElementById('edit_id');
432 if (!id.value.length)
433 return form_insert(obj);
435 if (!form_checks(obj.form))
440 if (typeof pre_save == 'function')
445 ajax_request('save', Form.serialize(obj.form), save_callback);
449 function form_insert(obj)
451 if (!form_checks(obj.form))
456 if (typeof pre_insert == 'function')
460 ajax_form_submit('insert', obj.form, save_callback);
464 function form_delete(obj)
466 var id = document.getElementById('edit_id');
468 if (!id.value.length) return false;
470 var source = document.getElementById('edit_source');
472 var params = 'id='+id.value + '&source='+source.value;
473 ajax_request('delete', params, delete_callback);
480 function details_callback(data)
483 set_value('detail_'+id, data[id]);
486 function fetch_callback(data)
489 set_value('edit_'+id, data[id]);
491 var status = document.getElementById('form_status');
492 status.innerHTML = 'Geändert: ' + data.sys_edit + ' von ' + data.sys_user;
494 var form = document.getElementById('form_edit');
495 Form.focusFirstElement(form);
501 function gridDrillDown(e)
503 if (e.originalTarget && e.originalTarget.target && e.originalTarget.target == '_top')
506 if (e.originalTarget &&
507 e.originalTarget.tagName.toLowerCase() !== 'span' &&
508 (!e.originalTarget.className || (e.originalTarget.className.split('_'))[0] !== 'ricoLG'))
511 var id = 0; // Column 0 contains ID
512 var row = grid.edit.drillDown(e,0,0);
513 var cell = grid.columns[id].cell(row);
515 var value = cell.innerHTML;
517 if (!value.length || value == ' ') return;
519 if (document.getElementById('details')) {
520 var params = 'source=' + grid.tableId.substr(5) + '&id=' + value;
521 ajax_request('details', params, details_callback);
524 if (document.getElementById('form_edit')) {
525 var status = document.getElementById('form_status');
526 if (status.style.display == '') {
527 var params = 'source=' + grid.tableId.substr(5) + '&id=' + value;
528 ajax_request('fetch', params, fetch_callback);
531 if (edit_hidden) edit_show();
535 if (second_visible()) {
536 second.buffer.options.requestParameters = ['second_id=' + value];
540 if (typeof drilldown == 'function')
545 function gridOnScroll(grid, offset)
547 if (grid.tableId.substr(-8) !== '__second')
548 grid_offset = grid.buffer.lastOffset;
549 var max = Math.min(offset+grid.pageSize, grid.buffer.totalRows);
550 var info = document.getElementById('info_' + grid.tableId);
551 info.innerHTML = 'Datensatz ' + (offset+1) + ' - ' + max + ' von ' + grid.buffer.totalRows;
554 /* Update an existing grid
556 * grid is a live grid
557 * filter is the array index of the $table_filters array in mskdef
558 * value is the value applied to the filter
560 function grid_update(grid, filter, value)
562 if (grid === undefined)
565 if (filter !== undefined && filter !== false)
566 grid.buffer.options.requestParameters = ['w'+filter+'=' + value];
568 grid.buffer.setTotalRows(0);
569 grid.buffer.foundRowCount = false;
571 grid.ClearSelection();
573 if (grid.bookmark) grid.bookmark.innerHTML=" ";
575 if (grid.tableId.substr(-8) !== '__second')
576 grid.buffer.fetch(grid_offset);
578 grid.buffer.fetch(0);
581 function grid_update_filters(grid)
583 for (var c=0; c < grid.headerColCnt; c++) {
584 var fmt = grid.columns[c].format;
585 if (typeof fmt.filterUI != 'string') continue;
586 if (fmt.filterUI != 's') continue;
588 if (grid.columns[c]._getdesc) continue;
590 $(grid.filterId(c)).options.length = 1;
593 Object.extend(options, grid.buffer.ajaxOptions);
594 var colnum = typeof(fmt.filterCol)=='number' ? fmt.filterCol : c;
596 options.parameters = 'id='+grid.tableId+'&distinct='+colnum;
598 if (grid.filterCount() > 0) {
599 var cols = grid.columns.length;
600 for (var i = 0; i < cols; i++) {
601 var column = grid.columns[i];
602 if (column.filterType == Rico.TableColumn.USERFILTER) {
603 options.parameters += '&f['+i+'][0]='+column.filterValues;
604 options.parameters += '&f['+i+'][len]=1';
605 options.parameters += '&f['+i+'][op]='+column.filterOp;
610 options.onComplete = grid.filterValuesUpdate.bind(grid,c);
611 new Ajax.Request(grid.buffer.dataSource, options);
615 var grid_column_edit = new Array();
617 function grid_cell_save(id,col,value)
619 var source = document.getElementById('source');
621 if (!source) return false;
623 var parms = 'source=' + source.innerHTML;
624 parms += '&callback=cellsave';
625 parms += '&id=' + id;
626 parms += '&column=' + col;
627 parms += '&value=' + value;
629 ajax_request('function', parms, false);
632 function grid_cell_value()
634 this.grid.menu.cancelmenu();
636 var bufRow = this.row;
637 if (this.grid.lastRowPos > 0) bufRow += this.grid.lastRowPos;
639 this.grid.buffer.setValue(bufRow, this.col, this.visible);
641 if (this.value == 'prompt') {
642 var value = prompt(this.visible, '');
646 this.visible = value;
650 var cell = this.grid.cell(this.row,this.col);
651 cell.innerHTML = this.visible;
653 grid_cell_save(this.grid.buffer.getCell(bufRow,0), this.col, this.value);
656 function grid_dataMenuHandler(grid,row,col,onBlankRow)
658 var default_menu = true;
660 if (grid_column_edit[col] &&
661 typeof grid_column_edit[col].default_menu !== 'undefined' &&
662 grid_column_edit[col].default_menu == false)
663 default_menu = false;
665 if (default_menu && typeof grid.menu.options.dataMenuHandlerOriginal == 'function') {
666 grid.menu.options.dataMenuHandlerOriginal(grid,row,col,onBlankRow);
667 grid.menu.div.style.width = '17em';
670 if (grid_column_edit[col]) {
673 var submenu = new Rico.Menu(grid_column_edit[col].width);
678 for (i=0; i < grid_column_edit[col].values.length; i++)
679 submenu.addMenuItem(grid_column_edit[col].values[i][0],
680 grid_cell_value.bind({grid: grid, row: row, col: col,
681 visible: grid_column_edit[col].values[i][1],
682 value: grid_column_edit[col].values[i][2]}));
684 if (!default_menu && typeof grid_column_edit[col].width !== 'undefined')
685 grid.menu.div.style.width = grid_column_edit[col].width;
688 grid.menu.addSubMenuItem('Wert setzen', submenu, true);
697 var calendars = new Array();
698 function calendar_callback(value)
700 this.input.value = value;
703 function calendar(name,event)
705 var input = document.getElementById(name);
708 if (calendars[name] == undefined) {
709 calendars[name] = new Rico.CalendarControl('calendar_'+name,
711 dateFmt: 'dd.mm.yyyy',
713 calendars[name].atLoad();
714 calendars[name].returnValue = calendar_callback;
715 RicoUtil.positionCtlOverIcon(calendars[name].container,input);
716 calendars[name].open(input.value);
717 calendars[name].input = input;
719 if (Element.visible(calendars[name].container))
720 calendars[name].close();
722 calendars[name].open(input.value);
729 var col_edit = document.getElementById("column_edit");
730 var col_grid = document.getElementById("column_grid");
731 col_edit.style.display = 'none';
732 col_grid.style.width = '100%';
742 var col_edit = document.getElementById("column_edit");
743 var col_grid = document.getElementById("column_grid");
744 col_edit.style.display = '';
745 col_grid.style.width = '';
753 function resize_grids()
755 var div_grid = document.getElementById('div_grid');
756 var info = document.getElementById('info_'+second.tableId);
757 var height = RicoUtil.windowHeight() - (info.offsetTop - div_grid.offsetTop) - 60;
758 div_grid.style.height = height + 'px';
762 function second_visible()
764 if (typeof second == 'undefined') return false;
765 var div_second = document.getElementById('second');
766 return div_second.style.display == '';
769 var div_grid_height = '';
770 function second_toggle()
772 var div_grid = document.getElementById('div_grid');
773 var div_second = document.getElementById('second');
774 var toggle_icon = document.getElementById('icon_toggle');
776 if (second_visible()) {
777 div_grid_height = div_grid.style.height;
778 div_second.style.display = 'none';
780 var height = RicoUtil.windowHeight() - div_grid.offsetTop - 10;
781 div_grid.style.height = height + 'px';
783 toggle_icon.style.display = '';
785 div_grid.style.height = div_grid_height;
786 div_second.style.display = '';
789 second.resizeWindow();
790 toggle_icon.style.display = 'none';