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 if (typeof data.logout != 'undefined' && data.logout == true)
16 window.location.href = 'index.php?logout=true';
17 } else if (req.oncomplete)
22 function ajax_request(func,params,oncomplete)
24 var req = new XMLHttpRequest();
27 var params = 'func=' + func + '&' + params;
28 req.open ("POST", 'ajax/ajax.php');
29 req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
30 req.setRequestHeader("Content-length", params.length);
31 req.setRequestHeader("Connection", "close");
32 req.onreadystatechange = function() { ajax_request_callback(req); }
33 if (typeof oncomplete == 'function')
34 req.oncomplete = oncomplete;
40 var logout_timer = false;
41 window.setTimeout(reset_logout, 4000);
42 function reset_logout()
45 window.clearTimeout(logout_timer);
47 logout_timer = window.setTimeout(function() {
48 window.location.href = 'index.php?logout=true';
49 }, parseInt(document.getElementById('logout_refresh').innerHTML)*1000);
52 var edit_hidden = false;
53 var form_file_name = null;
54 var form_file_content = null;
55 function form_file_change_onloadstart(e)
57 var button = document.getElementById('button_insert');
58 button.disabled = true;
59 info('Upload wird vorbereitet');
62 function form_file_change_onloadend(e)
64 var button = document.getElementById('button_insert');
65 button.disabled = false;
69 function form_file_change_onload(e)
71 form_file_content = new Uint8ClampedArray(e.target.result);
74 function form_file_change(e)
76 var file = e.target.files[0];
77 var reader = new FileReader();
78 reader.onload = form_file_change_onload;
79 reader.onloadend = form_file_change_onloadend;
80 reader.onloadstart = form_file_change_onloadstart;
81 reader.readAsArrayBuffer(file);
82 form_file_filename = file.name;
85 function ajax_form_submit(func,form,oncomplete)
87 var boundary = "---------------------------" + (new Date).getTime();
89 var req = new XMLHttpRequest();
92 var parts = new Array();
94 if (func && func.length) {
95 var part = 'Content-Disposition: form-data; ';
96 part += 'name="func"' + CRLF + CRLF;
101 for (var i=0; i < form.childNodes.length; i++) {
103 var element = form.childNodes[i];
104 var fieldName = element.name;
106 if (element.nodeName.toLowerCase() == 'input' &&
107 element.type.toLowerCase() == 'file') {
109 if (typeof element.files[0].getAsBinary != 'function' &&
110 typeof window.FileReader == 'undefined') {
111 error('Upload von Dateien nicht möglich');
112 alert("Upload von Dateien in dieser Version von Firefox nicht möglich.\n" +
113 "Bitte verwenden Sie Firefox in der Version 3.5.");
118 var binary = element.files[0].getAsBinary();
119 var filename = element.files[0].fileName;
121 if (form_file_content) {
124 for (var j=0; j < form_file_content.length; j++)
125 binary += String.fromCharCode(form_file_content[j]);
127 var filename = form_file_filename;
129 error('Problem beim Lesen der Datei');
130 alert("Problem beim Lesen der Datei\n" +
131 element.files[0].fileName + "\n" +
132 "Eventuell stimmt das Encoding nicht\n" +
133 "Die Daten wurden nicht gespeichert");
138 part = 'Content-Disposition: form-data; ';
139 part += 'name="' + fieldName + '"; ';
140 part += 'filename="'+ filename + '"' + CRLF;
141 part += "Content-Type: application/octet-stream" + CRLF + CRLF;
142 part += binary + CRLF;
143 } else if (element.nodeName.toLowerCase() == 'input' ||
144 element.nodeName.toLowerCase() == 'textarea' ||
145 element.nodeName.toLowerCase() == 'select') {
147 if (element.type.toLowerCase() == 'checkbox') {
148 if (element.checked) value = 'on';
151 value = element.value;
154 part = 'Content-Disposition: form-data; ';
155 part += 'name="' + element.name + '"' + CRLF + CRLF;
156 part += value + CRLF;
162 var params = "--" + boundary + CRLF;
163 params += parts.join("--" + boundary + CRLF);
164 params += "--" + boundary + "--" + CRLF;
166 req.open ("POST", 'ajax/ajax.php');
167 req.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + boundary);
168 req.setRequestHeader("Connection", "close");
169 req.onreadystatechange = function() { ajax_request_callback(req); }
170 if (typeof oncomplete == 'function')
171 req.oncomplete = oncomplete;
172 req.sendAsBinary(params);
180 var status = document.getElementById('status');
183 status.innerHTML = msg;
184 status.className = 'status_ok';
189 var status = document.getElementById('status');
192 status.innerHTML = msg;
193 status.className = 'status_error';
196 function button_enable(id)
198 var button = document.getElementById(id);
201 button.className = '';
202 button.disabled = false;
205 function button_disable(id)
207 var button = document.getElementById(id);
210 button.className = 'disabled';
211 button.disabled = true;
214 function set_value(id, value)
216 var obj = document.getElementById(id);
219 if (obj.nodeName.toLowerCase() == 'input') {
220 if (obj.type.toLowerCase() == 'checkbox') {
221 if (value) obj.checked = true;
222 else obj.checked = false;
223 } else if (obj.type.toLowerCase() == 'file')
227 } else if (obj.nodeName.toLowerCase() == 'textarea')
229 else if (obj.nodeName.toLowerCase() == 'span')
230 obj.innerHTML = value;
231 else if (obj.nodeName.toLowerCase() == 'select') {
232 for (var i=0; i < obj.options.length; i++)
233 if (obj.options[i].value == value)
234 obj.selectedIndex = i;
236 obj.innerHTML = value;
239 function setvar(obj, name, callback, status)
241 if (!obj.options[obj.selectedIndex].value.length)
244 value = obj.options[obj.selectedIndex].value;
246 var source = document.getElementById('source');
248 if (!source) return false;
250 var parms = 'source=' + source.innerHTML + '&name=' + name + '&value=' + value;
252 ajax_request('setvar', parms, callback);
254 if (typeof status == 'function')
255 status(obj,value,obj.options[obj.selectedIndex].innerHTML);
258 function get_info(name, values, callback)
260 var source = document.getElementById('source');
262 if (!source) return false;
264 var parms = 'source=' + source.innerHTML + '&name=' + name;
266 parms += '&' + key + '=' + values[key];
268 ajax_request('info', parms, callback);
274 function form_clear(form)
278 for (var i=0; i < form.childNodes.length; i++)
279 if (form.childNodes[i].nodeName.toLowerCase() == 'input'
280 && (form.childNodes[i].type.toLowerCase() == 'password' ||
281 form.childNodes[i].type.toLowerCase() == 'file'))
282 form.childNodes[i].value = '';
284 var id = document.getElementById('edit_id');
285 if (id) id.value = '';
288 var form_first_use = true;
291 var form = document.getElementById('form_edit');
297 var elem = form.findFirstElement();
298 if (elem) elem.activate();
301 function form_elem_error(elem,text)
303 elem.style.borderColor = 'red';
304 elem.style.borderWidth = '1px';
305 elem.style.borderStyle = 'solid';
309 function form_elem_ok(elem)
311 elem.style.borderColor = '';
312 elem.style.borderWidth = '';
313 elem.style.borderStyle = '';
316 function form_reset_errors()
318 for (name in form_check) {
319 var elem = document.getElementById('edit_' + name);
324 var form_check_regexp = {
326 decimal: /^\d*([,\.]\d+)?$/,
327 date: /^(\d\d?\.\d\d?\.[1-9]\d\d\d)|([1-9]\d\d\d-\d\d?-\d\d?)$/
330 function form_elem_check(elem,check)
332 var checks = check.split(',');
334 for (var i=0; i < checks.length; i++) {
335 var tagName = elem.tagName.toLowerCase();
336 var label = document.getElementById('label_' + elem.name);
337 if (checks[i] == 'required') {
338 if ((tagName == 'input' ||
339 tagName == 'textarea') &&
340 elem.value.length == 0)
341 return label.innerHTML + ' muss ausgefüllt werden';
343 if (tagName == 'select' && elem.value.length == 0)
344 return label.innerHTML + ' muss ausgewählt werden';
345 } else if (form_check_regexp[checks[i]]) {
346 if (elem.value.length && !form_check_regexp[checks[i]].test(elem.value))
347 return 'Ungültiger Wert für ' + label.innerHTML;
354 function form_elem_onblur(e)
356 var first_use = form_first_use;
357 form_first_use = false;
359 var elem = document.getElementById('form_edit').findFirstElement();
360 if (first_use && elem == e.originalTarget && !e.originalTarget.length) return;
362 if (form_check[e.originalTarget.name]) {
363 var error = form_elem_check(e.originalTarget, form_check[e.originalTarget.name]);
365 form_elem_error(e.originalTarget, error);
371 function form_checks(form)
374 for (name in form_check) {
375 var elem = document.getElementById('edit_' + name);
376 var error = form_elem_check(elem, form_check[name]);
378 form_elem_error(elem, error);
379 errors += '. ' + error + "\n";
384 alert("Fehler im Formular:\n" + errors);
391 function select_update(id, options, empty)
393 var obj = document.getElementById(id);
396 if (typeof empty == 'undefined') empty = 0;
398 obj.options.length = empty;
400 for (var i=0; i < options.length; i++)
401 obj.options[empty+i] = new Option(options[i].text,options[i].id,false,false);
404 var pre_save = false;
405 var pre_insert = false;
406 var post_save = function() { grid_update(grid); }
407 var post_delete = function() { grid_update(grid); }
409 function save_callback(data)
411 info('Datensatz gespeichert');
413 if (typeof post_save == 'function')
416 var form = document.getElementById('form_edit');
421 Form.focusFirstElement(form);
424 function delete_callback(data)
426 info('Datensatz gelöscht');
428 if (typeof post_delete == 'function')
432 function form_save(obj)
434 var id = document.getElementById('edit_id');
436 if (!id.value.length)
437 return form_insert(obj);
439 if (!form_checks(obj.form))
444 if (typeof pre_save == 'function')
449 ajax_request('save', Form.serialize(obj.form), save_callback);
453 function form_insert(obj)
455 if (!form_checks(obj.form))
460 if (typeof pre_insert == 'function')
464 ajax_form_submit('insert', obj.form, save_callback);
468 function form_delete(obj)
470 var id = document.getElementById('edit_id');
472 if (!id.value.length) return false;
474 var source = document.getElementById('edit_source');
476 var params = 'id='+id.value + '&source='+source.value;
477 ajax_request('delete', params, delete_callback);
484 function details_callback(data)
487 set_value('detail_'+id, data[id]);
490 function fetch_callback(data)
493 set_value('edit_'+id, data[id]);
495 var status = document.getElementById('form_status');
496 status.innerHTML = 'Geändert: ' + data.sys_edit + ' von ' + data.sys_user;
498 var form = document.getElementById('form_edit');
499 Form.focusFirstElement(form);
505 function gridDrillDown(e)
507 if (e.originalTarget && e.originalTarget.target && e.originalTarget.target == '_top')
510 if (e.originalTarget &&
511 e.originalTarget.tagName.toLowerCase() !== 'span' &&
512 (!e.originalTarget.className || (e.originalTarget.className.split('_'))[0] !== 'ricoLG'))
515 var id = 0; // Column 0 contains ID
516 var row = grid.edit.drillDown(e,0,0);
517 var cell = grid.columns[id].cell(row);
519 var value = cell.innerHTML;
521 if (!value.length || value == ' ') return;
523 if (document.getElementById('details')) {
524 var params = 'source=' + grid.tableId.substr(5) + '&id=' + value;
525 ajax_request('details', params, details_callback);
528 if (document.getElementById('form_edit')) {
529 var status = document.getElementById('form_status');
530 if (status.style.display == '') {
531 var params = 'source=' + grid.tableId.substr(5) + '&id=' + value;
532 ajax_request('fetch', params, fetch_callback);
535 if (edit_hidden) edit_show();
539 if (second_visible()) {
540 second.buffer.options.requestParameters = ['second_id=' + value];
544 if (typeof drilldown == 'function')
549 function gridOnScroll(grid, offset)
551 if (grid.tableId.substr(-8) !== '__second')
552 grid_offset = grid.buffer.lastOffset;
553 var max = Math.min(offset+grid.pageSize, grid.buffer.totalRows);
554 var info = document.getElementById('info_' + grid.tableId);
555 info.innerHTML = 'Datensatz ' + (offset+1) + ' - ' + max + ' von ' + grid.buffer.totalRows;
558 /* Update an existing grid
560 * grid is a live grid
561 * filter is the array index of the $table_filters array in mskdef
562 * value is the value applied to the filter
564 function grid_update(grid, filter, value)
566 if (grid === undefined)
569 if (filter !== undefined && filter !== false)
570 grid.buffer.options.requestParameters = ['w'+filter+'=' + value];
572 grid.buffer.setTotalRows(0);
573 grid.buffer.foundRowCount = false;
575 grid.ClearSelection();
577 if (grid.bookmark) grid.bookmark.innerHTML=" ";
579 if (grid.tableId.substr(-8) !== '__second')
580 grid.buffer.fetch(grid_offset);
582 grid.buffer.fetch(0);
585 function grid_update_filters(grid)
587 for (var c=0; c < grid.headerColCnt; c++) {
588 var fmt = grid.columns[c].format;
589 if (typeof fmt.filterUI != 'string') continue;
590 if (fmt.filterUI != 's') continue;
592 if (grid.columns[c]._getdesc) continue;
594 $(grid.filterId(c)).options.length = 1;
597 Object.extend(options, grid.buffer.ajaxOptions);
598 var colnum = typeof(fmt.filterCol)=='number' ? fmt.filterCol : c;
600 options.parameters = 'id='+grid.tableId+'&distinct='+colnum;
602 if (grid.filterCount() > 0) {
603 var cols = grid.columns.length;
604 for (var i = 0; i < cols; i++) {
605 var column = grid.columns[i];
606 if (column.filterType == Rico.TableColumn.USERFILTER) {
607 options.parameters += '&f['+i+'][0]='+column.filterValues;
608 options.parameters += '&f['+i+'][len]=1';
609 options.parameters += '&f['+i+'][op]='+column.filterOp;
614 options.onComplete = grid.filterValuesUpdate.bind(grid,c);
615 new Ajax.Request(grid.buffer.dataSource, options);
619 var grid_column_edit = new Array();
621 function grid_cell_save(id,col,value)
623 var source = document.getElementById('source');
625 if (!source) return false;
627 var parms = 'source=' + source.innerHTML;
628 parms += '&callback=cellsave';
629 parms += '&id=' + id;
630 parms += '&column=' + col;
631 parms += '&value=' + value;
633 ajax_request('function', parms, false);
636 function grid_cell_value()
638 this.grid.menu.cancelmenu();
640 var bufRow = this.row;
641 if (this.grid.lastRowPos > 0) bufRow += this.grid.lastRowPos;
643 this.grid.buffer.setValue(bufRow, this.col, this.visible);
645 if (this.value == 'prompt') {
646 var value = prompt(this.visible, '');
650 this.visible = value;
654 var cell = this.grid.cell(this.row,this.col);
655 cell.innerHTML = this.visible;
657 grid_cell_save(this.grid.buffer.getCell(bufRow,0), this.col, this.value);
660 function grid_dataMenuHandler(grid,row,col,onBlankRow)
662 var default_menu = true;
664 if (grid_column_edit[col] &&
665 typeof grid_column_edit[col].default_menu !== 'undefined' &&
666 grid_column_edit[col].default_menu == false)
667 default_menu = false;
669 if (default_menu && typeof grid.menu.options.dataMenuHandlerOriginal == 'function') {
670 grid.menu.options.dataMenuHandlerOriginal(grid,row,col,onBlankRow);
671 grid.menu.div.style.width = '17em';
674 if (grid_column_edit[col]) {
677 var submenu = new Rico.Menu(grid_column_edit[col].width);
682 for (i=0; i < grid_column_edit[col].values.length; i++)
683 submenu.addMenuItem(grid_column_edit[col].values[i][0],
684 grid_cell_value.bind({grid: grid, row: row, col: col,
685 visible: grid_column_edit[col].values[i][1],
686 value: grid_column_edit[col].values[i][2]}));
688 if (!default_menu && typeof grid_column_edit[col].width !== 'undefined')
689 grid.menu.div.style.width = grid_column_edit[col].width;
692 grid.menu.addSubMenuItem('Wert setzen', submenu, true);
701 var calendars = new Array();
702 function calendar_callback(value)
704 this.input.value = value;
707 function calendar(name,event)
709 var input = document.getElementById(name);
712 if (calendars[name] == undefined) {
713 calendars[name] = new Rico.CalendarControl('calendar_'+name,
715 dateFmt: 'dd.mm.yyyy',
717 calendars[name].atLoad();
718 calendars[name].returnValue = calendar_callback;
719 RicoUtil.positionCtlOverIcon(calendars[name].container,input);
720 calendars[name].open(input.value);
721 calendars[name].input = input;
723 if (Element.visible(calendars[name].container))
724 calendars[name].close();
726 calendars[name].open(input.value);
733 var col_edit = document.getElementById("column_edit");
734 var col_grid = document.getElementById("column_grid");
735 col_edit.style.display = 'none';
736 col_grid.style.width = '100%';
746 var col_edit = document.getElementById("column_edit");
747 var col_grid = document.getElementById("column_grid");
748 col_edit.style.display = '';
749 col_grid.style.width = '';
757 function resize_grids()
759 var div_grid = document.getElementById('div_grid');
760 var info = document.getElementById('info_'+second.tableId);
761 var height = RicoUtil.windowHeight() - (info.offsetTop - div_grid.offsetTop) - 60;
762 div_grid.style.height = height + 'px';
766 function second_visible()
768 if (typeof second == 'undefined') return false;
769 var div_second = document.getElementById('second');
770 return div_second.style.display == '';
773 var div_grid_height = '';
774 function second_toggle()
776 var div_grid = document.getElementById('div_grid');
777 var div_second = document.getElementById('second');
778 var toggle_icon = document.getElementById('icon_toggle');
780 if (second_visible()) {
781 div_grid_height = div_grid.style.height;
782 div_second.style.display = 'none';
784 var height = RicoUtil.windowHeight() - div_grid.offsetTop - 10;
785 div_grid.style.height = height + 'px';
787 toggle_icon.style.display = '';
789 div_grid.style.height = div_grid_height;
790 div_second.style.display = '';
793 second.resizeWindow();
794 toggle_icon.style.display = 'none';