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();";
117 $jscode[] = "// ups?";
119 $jscode[] = $js_file;
122 $v_save = array('id="button_save"',
123 'onclick="return form_save(this);"');
124 if (isset($mask['buttons']) && isset($mask['buttons']['save']) && $mask['buttons']['save'] === false) $v_save[] = 'style="display: none"';
126 $v_insert = array('id="button_insert"',
127 'onclick="return form_insert(this);"');
128 if (isset($mask['buttons']) && isset($mask['buttons']['insert']) && $mask['buttons']['insert'] === false) $v_insert[] = 'style="display: none"';
130 $v_delete = array('id="button_delete"',
131 'onclick="return form_delete(this);"');
132 if (isset($mask['buttons']) && isset($mask['buttons']['delete']) && $mask['buttons']['delete'] === false) $v_delete[] = 'style="display: none"';
134 $v_changes = array('id="form_status"');
135 if (isset($mask['buttons']) && isset($mask['buttons']['changes']) && $mask['buttons']['changes'] === false) $v_changes[] = 'style="display: none"';
137 $ret[] = sprintf('<p %s> </p>', implode(' ', $v_changes));
138 $ret[] = '<div class="buttons">';
139 $ret[] = sprintf('<button %s>%s</button>', implode(' ', $v_save), 'Speichern');
140 $ret[] = '<span></span>';
141 $ret[] = sprintf('<button %s>%s</button>', implode(' ', $v_insert), 'Hinzufügen');
142 $ret[] = '<span></span>';
143 $ret[] = sprintf('<button %s>%s</button>', implode(' ', $v_delete), 'Löschen');
152 function build_grid($name, $mask, $gridname = false)
157 if ($gridname == false) {
159 $opts = array("click: gridDrillDown");
161 $name = $name . '__' . $gridname;
163 if (array_key_exists('onclick', $mask)) $opts[] = 'click: ' . $mask['onclick'];
166 $opts[] = "onscroll: gridOnScroll";
167 $opts[] = "menuEvent: 'contextmenu'";
168 $opts[] = "highlightElem: 'menuRow'";
170 if (array_key_exists('maxprint', $mask)) $opts[] = 'maxPrint: ' . $mask['maxprint'];
171 else $opts[] = 'maxPrint: 100000';
172 if (array_key_exists('rows', $mask)) $opts[] = 'visibleRows: ' . $mask['rows'];
173 if (array_key_exists('sort', $mask)) $opts[] = 'sortCol: ' . $mask['sort'];
174 if (isset($mask['prefetch']) && $mask['prefetch'] === false) $opts[] = 'prefetchBuffer: false';
175 # $opts[] = 'frozenColumns: ' . count($mask['list']);
176 $opts[] = 'saveColumnInfo: {width: true, filter: true, sort: true}';
178 $ret[] = sprintf('<table id="grid_%s" class="ricoLiveGrid">', $name);
182 foreach ($mask['list'] as $field => $data) {
183 $ret[] = sprintf(' <th>%s</th>', $data['name']);
184 $s = array(sprintf("FieldName: 'input_%s'", $field),
185 sprintf("ColName: 'input_%s'", $data['name']));
187 if (isset($data['visible']) && $data['visible'] === false) $s[] = 'visible: false';
188 if (isset($data['width']) && $data['width'] > 0) $s[] = 'width: ' . $data['width'];
189 if (array_key_exists('type', $data)) $s[] = "type: '" . $data['type'] . "'";
190 if (array_key_exists('specs', $data)) $s[] = $data['specs'];
191 if (array_key_exists('control', $data)) $s[] = 'control: ' . $data['control'];
192 $specs[] = '{' . implode(', ', $s) . '}';
194 if (array_key_exists('sql', $data))
195 $fields[] = $data['sql'] . ' AS ' . $field;
200 grid_sql($name, $mask);
205 $ret[] = sprintf('<div class="info" id="info_grid_%s">Datensatz 0</div>', $name);
206 if ($gridname == 'grid')
207 $ret[] = '<div class="status"><span id="status"></span></div>';
209 $ret[] = '<br style="clear:both;">';
211 $opts[] = 'columnSpecs: [' . implode(', ', $specs) . ']';
213 if (strstr($opts[count($opts)-1], 'filterUI') !== false) $opts[] = 'FilterLocation: -1';
215 $jscode[] = sprintf('var %s;', $gridname);;
216 $jscode[] = 'Rico.onLoad( function() {';
217 $jscode[] = sprintf("var %s_opts = {\n %s\n};", $name, implode(",\n ", $opts));
218 $jscode[] = sprintf("%s = new Rico.LiveGrid ('grid_%s', new Rico.Buffer.AjaxSQL('ajax/ricoXMLquery.php'), %s_opts);", $gridname, $name, $name);
219 $jscode[] = sprintf("%s.menu = new Rico.GridMenu();", $gridname);
220 $jscode[] = sprintf("%s.edit = new Rico.TableEdit(%s);", $gridname, $gridname);
221 if ($gridname == 'grid') {
222 $jscode[] = sprintf("%s.menu.options.dataMenuHandlerOriginal = %s.menu.options.dataMenuHandler;", $gridname, $gridname);
223 $jscode[] = sprintf("%s.menu.options.dataMenuHandler = grid_dataMenuHandler;", $gridname);
227 return array($ret, $jscode);
230 function build_details($name, $details)
234 $ret[] = '<div class="box" id="details">';
235 $ret[] = sprintf('<h3>%s</h3>', $details['title']);
236 if (array_key_exists('subtitle', $details))
237 $ret[] = sprintf('<p class="subtitle">%s</p>', $details['subtitle']);
238 if (array_key_exists('html',$details)) {
239 $ret[] = $details['html'];
240 } elseif (array_key_exists('list',$details)) {
242 foreach ($details['list'] as $name => $info) {
243 $ret[] = sprintf('<li>%s: <span id="detail_%s"></span></li>', $info['name'], $name);
252 function build_select($name, $details)
256 $ret[] = '<div class="form">';
257 $ret[] = sprintf('<p class="title">%s</p>', $details['title']);
258 $ret[] = sprintf ('<select%s>', array_key_exists('onchange',$details)?sprintf(' onchange="%s"',$details['onchange']):'');
259 if (is_array($details['options']))
260 $options = $details['options'];
262 $options = query_db($details['options']);
264 if (array_key_exists('default',$details))
265 $ret[] = sprintf('<option value="">%s</option>', $details['default']);
267 foreach ($options as $row) {
268 $selected = array_key_exists('selected',$details) && $details['selected'] == $row['id'] ? true : false;
269 $ret[] = sprintf('<option value="%s"%s>%s</option>', $row['id'], $selected?' selected':'',$row['text']);
272 $ret[] = '</select>';
278 function build_mask($name, $mask)
281 $jscode[] = 'Rico.writeDebugMsg = function(msg, resetFlag) {};';
283 if (array_key_exists('list', $mask)) {
284 $jscode[] = "Rico.acceptLanguage('de-de,de;q=0.8,en;q=0.5,en-us;q=0.3');";
285 $jscode[] = "Rico.loadModule('Effect','Calendar','LiveGridForms','LiveGridAjax','LiveGridMenu');";
287 if (array_key_exists('second', $mask) && !array_key_exists('rows', $mask))
288 $mask['rows'] = "'parent'";
290 list($grid,$js) = build_grid($name, $mask);
291 $grid = array_merge(array('<div id="div_grid">'), $grid, array('</div>'));
292 if (array_key_exists('second', $mask)) {
293 $mask['second']['prefetch'] = false;
295 list($second,$secondjs) = build_grid($name, $mask['second'], 'second');
296 $jscode = array_merge($jscode, $secondjs);
298 $grid[] = '<div id="second" class="second">';
299 $close = '<img src="images/icons/minimise.gif" title="Hide" onclick="second_toggle()" />';
300 $title = array_key_exists('title', $mask['second']) ? $mask['second']['title'] : '';
301 $grid[] = sprintf('<div style="position: relative;" id="second_title" class="ricoTitle title"><strong>%s</strong>%s</div>', $title, $close);
303 $grid = array_merge($grid, array('<div id="div_second">'), $second, array('</div>'));
307 $jscode = array_merge($jscode, $js);
308 if ($mask['rows'] == "'parent'")
309 $jscode[] = 'Rico.onLoad(function() {resize_grids()});';
313 if (array_key_exists('details', $mask))
314 $details = build_details($name, $mask['details']);
318 if (array_key_exists('select', $mask))
319 $select = build_select($name, $mask['select']);
323 if (array_key_exists('edit', $mask) && check_edit($name))
324 $edit = build_form($name, $mask);
328 $title = $mask['title'];
329 if (array_key_exists('subtitle', $mask))
330 $title .= ' – ' . $mask['subtitle'];
333 $head[] = sprintf('<h3 class="title">%s</h3>', $title);
335 if (array_key_exists('html', $mask) &&
336 !array_key_exists('details', $mask) &&
337 !array_key_exists('select', $mask) &&
338 !array_key_exists('edit', $mask))
339 return array_merge($head,
340 array($mask['html']),
341 array('<span id="status"></span><br>'));
343 if (empty($details) && empty($select) && empty($edit))
344 return array_merge($head,
345 array('<div id="column_grid" class="grid">'),
349 return array_merge($head,
350 array('<div id="column_grid" class="right grid">'),
352 array('</div>','<div id="column_edit" class="left">'),
366 if (load_mask($name) === false)
369 $jsfiles[] = 'lib/functions.js';
370 $jsfiles[] = 'lib/rico/rico.js';
372 if (array_key_exists('table',$mask))
373 $ret = build_mask($name, $mask);
375 return sprintf('<span id="source" style="display: none;">%s</span>', $_GET['mask'])
376 . implode("\n", $ret);