Remove superflous comment
[infodrom/hallinta] / lib / mask.php
1 <?php
2
3 function check_edit($name)
4 {
5   global $db;
6
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)));
12
13   $sth = $db->query($sql);
14
15   if ($sth === false) return false;
16
17   $row = $sth->fetch();
18   if ($row === false) return false;
19
20   if ($row['edit'] == '0')
21     return false;
22
23   return true;
24 }
25
26 function build_form($name, $mask)
27 {
28   global $jscode;
29   $ret = array();
30
31   $jscode[] = "var form_check = {};";
32
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">';
40
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);
43
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'];
50     else {
51       $ret[] = sprintf('<label id="label_%s" for="edit_%s">%s</label><br>', $id, $id, $info['name']);
52       $v = array('id="edit_'.$id.'"',
53                  'name="'.$id.'"');
54       $checks = array();
55
56       if (isset($info['required']) && $info['required'] === true) {
57         $checks[] = 'required';
58         $v[] = 'onblur="form_elem_onblur(event)"';
59       }
60
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));
67
68         if ($info['type'] == 'decimal') $checks[] = 'decimal';
69         if ($info['type'] == 'number')  $checks[] = 'number';
70       } elseif ($info['type'] == 'date') {
71         $v[] = 'size="8"';
72         $ret[] = sprintf('<input %s>&nbsp;', implode(' ', $v));
73         $ret[] = sprintf('<img class="calendar" src="images/icons/calendar.gif" onclick="calendar(\'edit_%s\',event)" />',
74                          $id, $id, $id);
75
76         $checks[] = 'date';
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);",
83                              $id);
84       } elseif ($info['type'] == 'select') {
85         if (array_key_exists('onchange',$info))
86           $v[] = sprintf('onchange="%s"', $info['onchange']);
87
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>',
96                            $row['id'],
97                            !empty($info['selected']) && $row['id'] == $info['selected'] ? ' selected' : '',
98                            $row['text']);
99         $ret[] = '</select>';
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));
104       }
105
106       if (array_key_exists('comment',$info))
107         $ret[] = sprintf('<span class="comment">%s</span>', $info['comment']);
108       $ret[] = '<br>';
109
110       if (count($checks))
111         $jscode[] = sprintf('form_check["%s"] = "%s";', $id, implode(',', $checks));
112     }
113   }
114
115   $jscode[] = 'Rico.onLoad( function() {';
116   $jscode[] = "  form_init();";
117   if (isset($js_file))
118     $jscode[] = $js_file;
119   $jscode[] = '});';
120
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"';
124
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"';
128
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"';
132
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"';
135
136   $ret[] = sprintf('<p %s>&nbsp;</p>', implode(' ', $v_changes));
137   $ret[] = '<div class="buttons">';
138   $ret[] = sprintf('<button %s>%s</button>', implode(' ', $v_save), 'Speichern');
139   $ret[] = '<span></span>';
140   $ret[] = sprintf('<button %s>%s</button>', implode(' ', $v_insert), 'Hinzufügen');
141   $ret[] = '<span></span>';
142   $ret[] = sprintf('<button %s>%s</button>', implode(' ', $v_delete), 'Löschen');
143   $ret[] = '</div>';
144
145   $ret[] = '</form>';
146   $ret[] = '</div>';
147
148   return $ret;
149 }
150
151 function build_grid($name, $mask, $gridname = false)
152 {
153   $jscode = array();;
154   $ret = array();
155
156   if ($gridname == false) {
157     $gridname = 'grid';
158     $opts = array("click: gridDrillDown");
159   } else {
160     $name = $name . '__' . $gridname;
161     $opts = array();
162     if (array_key_exists('onclick', $mask)) $opts[] = 'click: ' . $mask['onclick'];
163   }
164
165   $opts[] = "onscroll: gridOnScroll";
166   $opts[] = "menuEvent: 'contextmenu'";
167   $opts[] = "highlightElem: 'menuRow'";
168
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}';
176
177   $ret[] = sprintf('<table id="grid_%s" class="ricoLiveGrid">', $name);
178   $ret[] = '  <tr>';
179   $specs = array();
180   $fields = array();
181   foreach ($mask['list'] as $field => $data) {
182     $ret[] = sprintf('  <th>%s</th>', $data['name']);
183     $s = array(sprintf("FieldName: 'input_%s'", $field),
184                sprintf("ColName: 'input_%s'", $data['name']));
185     $s = array();
186     if (isset($data['visible']) && $data['visible'] === false) $s[] = 'visible: false';
187     if (isset($data['width']) && $data['width'] > 0) $s[] = 'width: ' . $data['width'];
188     if (array_key_exists('type', $data)) $s[] = "type: '" . $data['type'] . "'";
189     if (array_key_exists('specs', $data)) $s[] = $data['specs'];
190     if (array_key_exists('control', $data)) $s[] = 'control: ' . $data['control'];
191     $specs[] = '{' . implode(', ', $s) . '}';
192
193     if (array_key_exists('sql', $data))
194       $fields[] = $data['sql'] . ' AS ' . $field;
195     else
196       $fields[] = $field;
197   }
198
199   grid_sql($name, $mask);
200
201   $ret[] = '  </tr>';
202   $ret[] = '</table>';
203   $ret[] = '<div>';
204   $ret[] = sprintf('<div class="info" id="info_grid_%s">Datensatz 0</div>', $name);
205   if ($gridname == 'grid')
206     $ret[] = '<div class="status"><span id="status"></span></div>';
207   $ret[] = '</div>';
208   $ret[] = '<br style="clear:both;">';
209
210   $opts[] = 'columnSpecs: [' . implode(', ', $specs) . ']';
211
212   if (strstr($opts[count($opts)-1], 'filterUI') !== false) $opts[] = 'FilterLocation: -1';
213
214   $jscode[] = sprintf('var %s;', $gridname);;
215   $jscode[] = 'Rico.onLoad( function() {';
216   $jscode[] = sprintf("var %s_opts = {\n  %s\n};", $name, implode(",\n  ", $opts));
217   $jscode[] = sprintf("%s = new Rico.LiveGrid ('grid_%s', new Rico.Buffer.AjaxSQL('ajax/ricoXMLquery.php'), %s_opts);", $gridname, $name, $name);
218   $jscode[] = sprintf("%s.menu = new Rico.GridMenu();", $gridname);
219   $jscode[] = sprintf("%s.edit = new Rico.TableEdit(%s);", $gridname, $gridname);
220   if ($gridname == 'grid') {
221     $jscode[] = sprintf("%s.menu.options.dataMenuHandlerOriginal = %s.menu.options.dataMenuHandler;", $gridname, $gridname);
222     $jscode[] = sprintf("%s.menu.options.dataMenuHandler = grid_dataMenuHandler;", $gridname);
223   }
224   $jscode[] = '});';
225
226   return array($ret, $jscode);
227 }
228
229 function build_details($name, $details)
230 {
231   $ret = array();
232
233   $ret[] = '<div class="box" id="details">';
234   $ret[] = sprintf('<h3>%s</h3>', $details['title']);
235   if (array_key_exists('subtitle', $details))
236     $ret[] = sprintf('<p class="subtitle">%s</p>', $details['subtitle']);
237   if (array_key_exists('html',$details)) {
238     $ret[] = $details['html'];
239   } elseif (array_key_exists('list',$details)) {
240     $ret[] = '<ul>';
241     foreach ($details['list'] as $name => $info) {
242       $ret[] = sprintf('<li>%s: <span id="detail_%s"></span></li>', $info['name'], $name);
243     }
244     $ret[] = '</ul>';
245   }
246   $ret[] = '</div>';
247
248   return $ret;
249 }
250
251 function build_select($name, $details)
252 {
253   $ret = array();
254
255   $ret[] = '<div class="form">';
256   $ret[] = sprintf('<p class="title">%s</p>', $details['title']);
257   $ret[] = sprintf ('<select%s>', array_key_exists('onchange',$details)?sprintf(' onchange="%s"',$details['onchange']):'');
258   if (is_array($details['options']))
259     $options = $details['options'];
260   else
261     $options = query_db($details['options']);
262
263   if (array_key_exists('default',$details))
264     $ret[] = sprintf('<option value="">%s</option>', $details['default']);
265
266   foreach ($options as $row) {
267     $selected = array_key_exists('selected',$details) && $details['selected'] == $row['id'] ? true : false;
268     $ret[] = sprintf('<option value="%s"%s>%s</option>', $row['id'], $selected?' selected':'',$row['text']);
269   }
270
271   $ret[] = '</select>';
272   $ret[] = '</div>';
273
274   return $ret;
275 }
276
277 function build_mask($name, $mask)
278 {
279   global $jscode;
280   $jscode[] = 'Rico.writeDebugMsg = function(msg, resetFlag) {};';
281
282   if (array_key_exists('list', $mask)) {
283     $jscode[] = "Rico.acceptLanguage('de-de,de;q=0.8,en;q=0.5,en-us;q=0.3');";
284     $jscode[] = "Rico.loadModule('Effect','Calendar','LiveGridForms','LiveGridAjax','LiveGridMenu');";
285
286     if (array_key_exists('second', $mask) && !array_key_exists('rows', $mask))
287       $mask['rows'] = "'parent'";
288
289     list($grid,$js) = build_grid($name, $mask);
290     $grid = array_merge(array('<div id="div_grid">'), $grid, array('</div>'));
291     if (array_key_exists('second', $mask)) {
292       $mask['second']['prefetch'] = false;
293
294       list($second,$secondjs) = build_grid($name, $mask['second'], 'second');
295       $jscode = array_merge($jscode, $secondjs);
296
297       $grid[] = '<div id="second" class="second">';
298       $close = '<img src="images/icons/minimise.gif" title="Hide" onclick="second_toggle()" />';
299       $title = array_key_exists('title', $mask['second']) ? $mask['second']['title'] : '';
300       $grid[] = sprintf('<div style="position: relative;" id="second_title" class="ricoTitle title"><strong>%s</strong>%s</div>', $title, $close);
301
302       $grid = array_merge($grid, array('<div id="div_second">'), $second, array('</div>'));
303
304       $grid[] = '</div>';
305     }
306     $jscode = array_merge($jscode, $js);
307     if ($mask['rows'] == "'parent'")
308       $jscode[] = 'Rico.onLoad(function() {resize_grids()});';
309   } else
310     $grid = array();
311
312   if (array_key_exists('details', $mask))
313     $details = build_details($name, $mask['details']);
314   else
315     $details = array();
316
317   if (array_key_exists('select', $mask))
318     $select = build_select($name, $mask['select']);
319   else
320     $select = array();
321
322   if (array_key_exists('edit', $mask) && check_edit($name))
323     $edit = build_form($name, $mask);
324   else
325     $edit = array();
326
327   $title = $mask['title'];
328   if (array_key_exists('subtitle', $mask))
329     $title .= ' &ndash; ' . $mask['subtitle'];
330
331   $head = array();
332   $head[] = sprintf('<h3 class="title">%s</h3>', $title);
333
334   if (array_key_exists('html', $mask) &&
335       !array_key_exists('details', $mask) &&
336       !array_key_exists('select', $mask) &&
337       !array_key_exists('edit', $mask))
338     return array_merge($head,
339                        array($mask['html']),
340                        array('<span id="status"></span><br>'));
341
342   if (empty($details) && empty($select) && empty($edit))
343     return array_merge($head,
344                      array('<div id="column_grid" class="grid">'),
345                      $grid,
346                      array('</div>'));
347   else
348     return array_merge($head,
349                      array('<div id="column_grid" class="right grid">'),
350                      $grid,
351                      array('</div>','<div id="column_edit" class="left">'),
352                      $details,
353                      $select,
354                      $edit,
355                      array('</div>'));
356 }
357
358 function mask($name)
359 {
360   global $jsfiles;
361   global $mask;
362
363   $ret = array();
364
365   if (load_mask($name) === false)
366     return;
367
368   $jsfiles[] = 'lib/functions.js';
369   $jsfiles[] = 'lib/rico/rico.js';
370
371   if (array_key_exists('table',$mask))
372     $ret = build_mask($name, $mask);
373
374   return sprintf('<span id="source" style="display: none;">%s</span>', $_GET['mask'])
375     . implode("\n", $ret);
376 }
377
378 ?>