3 function check_edit($name)
7 $sql = sprintf("SELECT sys_mask.id,edit FROM sys_mask "
8 . "JOIN sys_group_mask ON sys_mask.id = sys_group_mask.mask "
9 . "WHERE gid = %d AND fname = %s "
10 . "ORDER BY edit DESC LIMIT 1",
11 $_SESSION['sys']['group'], $db->quote(str_replace('__','|',$name)));
13 $sth = $db->query($sql);
15 if ($sth === false) return false;
18 if ($row === false) return false;
20 if ($row['edit'] == '0')
26 function build_form($name, $mask)
31 $jscode[] = "var form_check = {};";
33 $ret[] = '<div class="form">';
34 $toggle = '<img src="images/icons/minimise.gif" title="Show second table" id="icon_toggle" onclick="second_toggle()" style="right: 13px; display: none"/>';
35 $close = '<img src="lib/rico/images/close.gif" title="Close" onclick="edit_hide()" />';
36 $edit_title = empty($mask['edit_title']) ? 'Datensatz bearbeiten' : $mask['edit_title'];
37 $ret[] = sprintf('<div class="ricoTitle" style="position: relative;" id="mask_edit_title" class="title"><strong>%s</strong>%s%s</div>',
38 $edit_title, $toggle, $close);
39 $ret[] = '<form id="form_edit">';
41 $ret[] = '<input type="hidden" id="edit_id" name="id" value="">';
42 $ret[] = sprintf('<input type="hidden" id="edit_source" name="source" value="%s">', $name);
44 foreach ($mask['edit'] as $id => $info) {
45 if ($info['type'] == 'hidden')
46 $ret[] = sprintf('<input type="hidden" id="edit_%s" name="%s" value="%s">', $id, $id,
47 empty($info['default'])?'':$info['default']);
48 elseif ($info['type'] == 'html')
49 $ret[] = $info['code'];
51 $ret[] = sprintf('<label id="label_%s" for="edit_%s">%s</label><br>', $id, $id, $info['name']);
52 $v = array('id="edit_'.$id.'"',
56 if (isset($info['required']) && $info['required'] === true) {
57 $checks[] = 'required';
58 $v[] = 'onblur="form_elem_onblur(event)"';
61 if ($info['type'] == 'text' || $info['type'] == 'passwd' ||
62 $info['type'] == 'decimal' || $info['type'] == 'number') {
63 $v[] = 'size="'.(empty($info['size'])?'10':$info['size']).'"';
64 $v[] = 'type="'.($info['type']=='passwd'?'password':'text').'"';
65 $v[] = 'value="'.(empty($info['default'])?'':$info['default']).'"';
66 $ret[] = sprintf('<input %s>', implode(' ', $v));
68 if ($info['type'] == 'decimal') $checks[] = 'decimal';
69 if ($info['type'] == 'number') $checks[] = 'number';
70 } elseif ($info['type'] == 'date') {
72 $ret[] = sprintf('<input %s> ', implode(' ', $v));
73 $ret[] = sprintf('<img class="calendar" src="images/icons/calendar.gif" onclick="calendar(\'edit_%s\',event)" />',
77 } elseif ($info['type'] == 'boolean' || $info['type'] == 'file') {
78 $v[] = 'type="'.($info['type']=='boolean'?'checkbox':'file').'"';
79 $ret[] = sprintf('<input %s>', implode(' ', $v));
80 if ($info['type'] == 'file')
81 $js_file = sprintf(" var finput = document.getElementById('edit_%s');\n" .
82 " if (finput) finput.addEventListener('change', form_file_change, false);",
84 } elseif ($info['type'] == 'select') {
85 if (array_key_exists('onchange',$info))
86 $v[] = sprintf('onchange="%s"', $info['onchange']);
88 $ret[] = sprintf('<select %s>', implode(' ', $v));
89 if (array_key_exists('option_empty',$info))
90 $ret[] = sprintf('<option value="">%s</option>',
91 $info['option_empty']);
92 if (is_array($info['options'])) $options = $info['options'];
93 else $options = query_db($info['options']);
94 foreach ($options as $row)
95 $ret[] = sprintf('<option value="%s"%s>%s</option>',
97 !empty($info['selected']) && $row['id'] == $info['selected'] ? ' selected' : '',
100 } elseif ($info['type'] == 'textarea') {
101 $v[] = sprintf('cols="%d"', empty($info['columns'])?33:$info['columns']);
102 $v[] = sprintf('rows="%d"', empty($info['rows'])?5:$info['rows']);
103 $ret[] = sprintf('<textarea %s></textarea>', implode(' ', $v));
106 if (array_key_exists('comment',$info))
107 $ret[] = sprintf('<span class="comment">%s</span>', $info['comment']);
111 $jscode[] = sprintf('form_check["%s"] = "%s";', $id, implode(',', $checks));
115 $jscode[] = 'Rico.onLoad( function() {';
116 $jscode[] = " form_init();";
118 $jscode[] = $js_file;
121 $v_save = array('id="button_save"',
122 'onclick="return form_save(this);"');
123 if (isset($mask['buttons']) && isset($mask['buttons']['save']) && $mask['buttons']['save'] === false) $v_save[] = 'style="display: none"';
125 $v_insert = array('id="button_insert"',
126 'onclick="return form_insert(this);"');
127 if (isset($mask['buttons']) && isset($mask['buttons']['insert']) && $mask['buttons']['insert'] === false) $v_insert[] = 'style="display: none"';
129 $v_delete = array('id="button_delete"',
130 'onclick="return form_delete(this);"');
131 if (isset($mask['buttons']) && isset($mask['buttons']['delete']) && $mask['buttons']['delete'] === false) $v_delete[] = 'style="display: none"';
133 $v_changes = array('id="form_status"');
134 if (isset($mask['buttons']) && isset($mask['buttons']['changes']) && $mask['buttons']['changes'] === false) $v_changes[] = 'style="display: none"';
136 $ret[] = sprintf('<p %s> </p>', implode(' ', $v_changes));
137 $ret[] = '<div class="buttons">';
138 $ret[] = sprintf('<button class="builtin" %s>%s</button>', implode(' ', $v_save), 'Speichern');
139 $ret[] = '<span></span>';
140 $ret[] = sprintf('<button class="builtin" %s>%s</button>', implode(' ', $v_insert), 'Hinzufügen');
141 $ret[] = '<span></span>';
142 $ret[] = sprintf('<button class="builtin" %s>%s</button>', implode(' ', $v_delete), 'Löschen');
151 function build_grid($name, $mask, $gridname = false)
156 if ($gridname == false) {
158 $opts = array("click: gridDrillDown");
160 $name = $name . '__' . $gridname;
162 if (array_key_exists('onclick', $mask)) $opts[] = 'click: ' . $mask['onclick'];
165 $opts[] = "onscroll: gridOnScroll";
166 $opts[] = "menuEvent: 'contextmenu'";
167 $opts[] = "highlightElem: 'menuRow'";
169 if (array_key_exists('maxprint', $mask)) $opts[] = 'maxPrint: ' . $mask['maxprint'];
170 else $opts[] = 'maxPrint: 100000';
171 if (array_key_exists('rows', $mask)) $opts[] = 'visibleRows: ' . $mask['rows'];
172 if (array_key_exists('sort', $mask)) $opts[] = 'sortCol: ' . $mask['sort'];
173 if (isset($mask['prefetch']) && $mask['prefetch'] === false) $opts[] = 'prefetchBuffer: false';
174 # $opts[] = 'frozenColumns: ' . count($mask['list']);
175 $opts[] = 'saveColumnInfo: {width: true, filter: true, sort: true}';
177 $canEdit = array_key_exists('table_edit', $mask);
179 $opts[] = 'canEdit: true';
180 $opts[] = "updateURL: 'ajax/ajax.php'";
183 $ret[] = sprintf('<table id="grid_%s" class="ricoLiveGrid">', $name);
187 foreach ($mask['list'] as $field => $data) {
188 $ret[] = sprintf(' <th>%s</th>', $data['name']);
189 if ($canEdit && array_key_exists('edit', $data)) {
190 $s = array(sprintf("FieldName: 'listinput_%s'", $field),
191 sprintf("ColName: '%s'", $data['name']),
196 if (isset($data['visible']) && $data['visible'] === false) $s[] = 'visible: false';
197 if (isset($data['width']) && $data['width'] > 0) $s[] = 'width: ' . $data['width'];
198 if (array_key_exists('type', $data)) $s[] = "type: '" . $data['type'] . "'";
199 if (array_key_exists('specs', $data)) $s[] = $data['specs'];
200 if (array_key_exists('control', $data)) $s[] = 'control: ' . $data['control'];
201 $specs[] = '{' . implode(', ', $s) . '}';
203 if (array_key_exists('sql', $data))
204 $fields[] = $data['sql'] . ' AS ' . $field;
209 grid_sql($name, $mask);
214 $ret[] = sprintf('<div class="info" id="info_grid_%s">Datensatz 0</div>', $name);
215 if ($gridname == 'grid')
216 $ret[] = '<div class="status"><span id="status"></span></div>';
218 $ret[] = '<br style="clear:both;">';
220 $opts[] = 'columnSpecs: [' . implode(', ', $specs) . ']';
222 if (strstr($opts[count($opts)-1], 'filterUI') !== false) $opts[] = 'FilterLocation: -1';
224 $jscode[] = sprintf('var %s;', $gridname);;
225 $jscode[] = 'Rico.onLoad( function() {';
226 $jscode[] = sprintf("var %s_opts = {\n %s\n};", $name, implode(",\n ", $opts));
227 $jscode[] = sprintf("%s = new Rico.LiveGrid ('grid_%s', new Rico.Buffer.AjaxSQL('ajax/ricoXMLquery.php'), %s_opts);", $gridname, $name, $name);
228 $jscode[] = sprintf("%s.menu = new Rico.GridMenu();", $gridname);
229 $jscode[] = sprintf("%s.edit = new Rico.TableEdit(%s);", $gridname, $gridname);
230 if ($gridname == 'grid') {
231 $jscode[] = sprintf("%s.menu.options.dataMenuHandlerOriginal = %s.menu.options.dataMenuHandler;", $gridname, $gridname);
232 $jscode[] = sprintf("%s.menu.options.dataMenuHandler = grid_dataMenuHandler;", $gridname);
236 return array($ret, $jscode);
239 function build_details($name, $details)
243 $ret[] = '<div class="box" id="details">';
244 $ret[] = sprintf('<h3>%s</h3>', $details['title']);
245 if (array_key_exists('subtitle', $details))
246 $ret[] = sprintf('<p class="subtitle">%s</p>', $details['subtitle']);
247 if (array_key_exists('html',$details)) {
248 $ret[] = $details['html'];
249 } elseif (array_key_exists('list',$details)) {
251 foreach ($details['list'] as $name => $info) {
252 $ret[] = sprintf('<li>%s: <span id="detail_%s"></span></li>', $info['name'], $name);
261 function build_select($name, $details)
265 $ret[] = '<div class="form">';
266 $ret[] = sprintf('<p class="title">%s</p>', $details['title']);
267 $ret[] = sprintf ('<select%s>', array_key_exists('onchange',$details)?sprintf(' onchange="%s"',$details['onchange']):'');
268 if (is_array($details['options']))
269 $options = $details['options'];
271 $options = query_db($details['options']);
273 if (array_key_exists('default',$details))
274 $ret[] = sprintf('<option value="">%s</option>', $details['default']);
276 foreach ($options as $row) {
277 $selected = array_key_exists('selected',$details) && $details['selected'] == $row['id'] ? true : false;
278 $ret[] = sprintf('<option value="%s"%s>%s</option>', $row['id'], $selected?' selected':'',$row['text']);
281 $ret[] = '</select>';
287 function build_mask($name, $mask)
290 $jscode[] = 'Rico.writeDebugMsg = function(msg, resetFlag) {};';
292 if (array_key_exists('list', $mask)) {
293 $jscode[] = "Rico.acceptLanguage('de-de,de;q=0.8,en;q=0.5,en-us;q=0.3');";
294 $jscode[] = "Rico.loadModule('Effect','Calendar','LiveGridForms','LiveGridAjax','LiveGridMenu');";
296 if (array_key_exists('second', $mask) && !array_key_exists('rows', $mask))
297 $mask['rows'] = "'parent'";
299 list($grid,$js) = build_grid($name, $mask);
300 $grid = array_merge(array('<div id="div_grid">'), $grid, array('</div>'));
301 if (array_key_exists('second', $mask)) {
302 $mask['second']['prefetch'] = false;
304 list($second,$secondjs) = build_grid($name, $mask['second'], 'second');
305 $jscode = array_merge($jscode, $secondjs);
307 $grid[] = '<div id="second" class="second">';
308 $close = '<img src="images/icons/minimise.gif" title="Hide" onclick="second_toggle()" />';
309 $title = array_key_exists('title', $mask['second']) ? $mask['second']['title'] : '';
310 $grid[] = sprintf('<div style="position: relative;" id="second_title" class="ricoTitle title"><strong>%s</strong>%s</div>', $title, $close);
312 $grid = array_merge($grid, array('<div id="div_second">'), $second, array('</div>'));
316 $jscode = array_merge($jscode, $js);
317 if ($mask['rows'] == "'parent'")
318 $jscode[] = 'Rico.onLoad(function() {resize_grids()});';
322 if (array_key_exists('details', $mask))
323 $details = build_details($name, $mask['details']);
327 if (array_key_exists('select', $mask))
328 $select = build_select($name, $mask['select']);
332 if (array_key_exists('edit', $mask) && check_edit($name))
333 $edit = build_form($name, $mask);
337 $title = $mask['title'];
338 if (array_key_exists('subtitle', $mask))
339 $title .= ' – ' . $mask['subtitle'];
342 $head[] = sprintf('<h3 class="title">%s</h3>', $title);
344 if (array_key_exists('html', $mask) &&
345 !array_key_exists('details', $mask) &&
346 !array_key_exists('select', $mask) &&
347 !array_key_exists('edit', $mask))
348 return array_merge($head,
349 array($mask['html']),
350 array('<span id="status"></span><br>'));
352 if (empty($details) && empty($select) && empty($edit))
353 return array_merge($head,
354 array('<div id="column_grid" class="grid">'),
358 return array_merge($head,
359 array('<div id="column_grid" class="right grid">'),
361 array('</div>','<div id="column_edit" class="left">'),
375 if (load_mask($name) === false)
378 $jsfiles[] = 'lib/functions.js';
379 $jsfiles[] = 'lib/rico/rico.js';
381 if (array_key_exists('table',$mask))
382 $ret = build_mask($name, $mask);
384 return sprintf('<span id="source" style="display: none;">%s</span>', $_GET['mask'])
385 . implode("\n", $ret);