Improved check_cells.
[fa-stable.git] / includes / ui / ui_input.inc
1 <?php
2 /**********************************************************************
3     Copyright (C) FrontAccounting, LLC.
4         Released under the terms of the GNU Affero General Public License,
5         AGPL, as published by the Free Software Foundation, either version 
6         3 of the License, or (at your option) any later version.
7     This program is distributed in the hope that it will be useful,
8     but WITHOUT ANY WARRANTY; without even the implied warranty of
9     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
10     See the License here <http://www.gnu.org/licenses/agpl-3.0.html>.
11 ***********************************************************************/
12
13 function get_post($name, $dflt='')
14 {
15         return ((!isset($_POST[$name]) || $_POST[$name] === '') ? $dflt : $_POST[$name]);
16 }
17 //
18 // Sets local POST value and adds Value to ajax posting if needed
19 //
20 /*function set_post($name, $value, $ajax_trigger=true) {
21     global $Ajax;
22
23     $_POST[$name] = $value;
24     if ($ajax_trigger) $Ajax->activate($name);
25 }
26 */
27 //------------------------------------------------------------------------------
28 //    Seek for _POST variable with $prefix.
29 //    If var is found returns variable name with prefix stripped,
30 //    and null or -1 otherwise.
31 //
32 function find_submit($prefix, $numeric=true)
33 {
34
35     foreach($_POST as $postkey=>$postval )
36     {
37                 if (strpos($postkey, $prefix) === 0)
38                 {
39                         $id = substr($postkey, strlen($prefix));
40                         return $numeric ? (int)$id : $id;
41                 }
42     }
43     return $numeric ? -1 : null;
44 }
45 //------------------------------------------------------------------------------
46 //
47 // Helper function for simple db table editor pages
48 //
49 function simple_page_mode($numeric_id = true)
50 {
51         global $Ajax, $Mode, $selected_id;
52
53         $default = $numeric_id ? -1 : '';
54         $selected_id = get_post('selected_id', $default);
55         foreach (array('ADD_ITEM', 'UPDATE_ITEM', 'RESET') as $m) {
56                 if (isset($_POST[$m])) {
57                         $Ajax->activate('_page_body');
58                         if ($m == 'RESET') 
59                                 $selected_id = $default;
60                         $Mode = $m; return;
61                 }
62         }
63         foreach (array('Edit', 'Delete') as $m) {
64                 foreach ($_POST as $p => $pvar) {
65                         if (strpos($p, $m) === 0) {
66 //                              $selected_id = strtr(substr($p, strlen($m)), array('%2E'=>'.'));
67                                 unset($_POST['_focus']); // focus on first form entry
68                                 $selected_id = quoted_printable_decode(substr($p, strlen($m)));
69                                 $Ajax->activate('_page_body');
70                                 $Mode = $m;
71                                 return;
72                         }
73                 }
74         }
75         $Mode = '';
76 }
77
78 //------------------------------------------------------------------------------
79 //
80 //      Read numeric value from user formatted input
81 //
82 function input_num($postname=null, $dflt=null)
83 {
84         if (!isset($_POST[$postname]) || $_POST[$postname] == "")
85                 return $dflt;
86
87     return user_numeric($_POST[$postname]);
88 }
89
90 //---------------------------------------------------------------------------------
91
92 function hidden($name, $value=null, $echo=true)
93 {
94         global $Ajax;
95         
96         if ($value === null) 
97                 $value = get_post($name);
98         
99         $ret = "<input type=\"hidden\" name=\"$name\" value=\"$value\">";
100         $Ajax->addUpdate($name, $name, $value);
101         if ($echo)
102                 echo $ret."\n";
103         else
104                 return $ret;
105 }
106
107 function submit($name, $value, $echo=true, $title=false, $async=false, $icon=false)
108 {
109         global $path_to_root;
110         
111         default_focus($name);
112         $submit_str = "<button class=\""
113             .($async ? 'ajaxsubmit' : 'inputsubmit')
114                 ."\" type=\"submit\""
115                 .($async === null ? (fallback_mode() ? ' aspect="fallback"' : " style='display:none;'" ): 
116                         ($async === 'process' ? 'aspect="process"' : '') )
117             ." name=\"$name\"  id=\"$name\" value=\"$value\""
118             .($title ? " title='$title'" : '')
119             ."><span>$value</span>"
120                 .($icon ? "<img src='$path_to_root/themes/".user_theme()."/images/$icon'>" : '')
121                 ."</button>\n";
122         if ($echo)
123                 echo $submit_str;
124         else
125                 return $submit_str;
126 }
127
128 function submit_center($name, $value, $echo=true, $title=false, $async=false, $icon=false)
129 {
130         echo "<center>";
131         submit($name, $value, $echo, $title, $async, $icon);
132         echo "</center>";
133 }
134
135 function submit_center_first($name, $value, $title=false, $async=false, $icon=false)
136 {
137         echo "<center>";
138         submit($name, $value, true, $title, $async, $icon);
139         echo "&nbsp;";
140 }
141
142 function submit_center_last($name, $value, $title=false, $async=false, $icon=false)
143 {
144         echo "&nbsp;";
145         submit($name, $value, true, $title, $async, $icon);
146         echo "</center>";
147 }
148
149 function submit_add_or_update($add=true, $title=false, $async=false)
150 {
151         if ($add)
152                 submit('ADD_ITEM', _("Add new"), true, $title, $async);
153         else {
154                 submit('UPDATE_ITEM', _("Update"), true, $title, $async);
155                 submit('RESET', _("Cancel"), true, $title, $async);
156         }
157 }
158
159 function submit_add_or_update_center($add=true, $title=false, $async=false)
160 {
161         echo "<center>";
162         submit_add_or_update($add, $title, $async);
163         echo "</center>";
164 }
165
166 /*
167 function submit_add_or_update_row($add=true)
168 {
169         echo "<tr><td colspan=99 align=center>";
170         submit_add_or_update($add);
171         echo "</td></tr>\n";
172 }
173 */
174 function submit_add_or_update_row($add=true, $right=true, $extra="", $title=false, $async=false)
175 {
176         echo "<tr>";
177         if ($right)
178                 echo "<td>&nbsp;</td>\n";
179         echo "<td $extra>";
180         submit_add_or_update($add, $title, $async);
181         echo "</td></tr>\n";
182 }
183
184 function submit_cells($name, $value, $extra="", $title=false, $async=false)
185 {
186         echo "<td $extra>";
187         submit($name, $value, true, $title, $async);
188         echo "</td>\n";
189 }
190
191 function submit_row($name, $value, $right=true, $extra="", $title=false, $async=false)
192 {
193         echo "<tr>";
194         if ($right)
195                 echo "<td>&nbsp;</td>\n";
196         submit_cells($name, $value, $extra, $title, $async);
197         echo "</tr>\n";
198 }
199
200 function submit_return($name, $value, $title=false, $async=false)
201 {
202         if (count($_SESSION['Context'])) {
203                 submit($name, $value, true, $title, $async);
204         }
205 }
206 //-----------------------------------------------------------------------------------
207
208 function set_icon($icon, $title=false)
209 {
210         global $path_to_root;
211         return "<img src='$path_to_root/themes/".user_theme()."/images/$icon' width='14' height='14' border='0'".($title ? " title='$title'" : "")." />\n";     
212 }
213
214 function button($name, $value, $title=false, $icon=false)
215 {
216         // php silently changes dots,spaces,'[' and characters 128-159
217         // to underscore in POST names, to maintain compatibility with register_globals
218         if (user_graphic_links() && $icon)
219         {
220                 if ($value == _("Delete")) // Helper during implementation
221                         $icon = ICON_DELETE;
222                 return "<button type='submit' class='editbutton' name='".
223                         htmlentities(strtr($name, array('.'=>'=2E',' '=>'=20','='=>'=3D','['=>'=5B'))).
224                         "' value=''" . ($title ? " title='$title'":" title='$value'")." />".set_icon($icon)."\n";
225         }
226         else
227                 return "<input type='submit' class='editbutton' name='"
228                         .htmlentities(strtr($name, array('.'=>'=2E',' '=>'=20','='=>'=3D','['=>'=5B')))
229                         ."' value='$value'"
230                         .($title ? " title='$title'":'')." />\n";
231 }
232
233 function button_cell($name, $value, $title=false, $icon=false)
234 {
235         echo "<td>";
236         echo button($name, $value, $title, $icon);
237         echo "</td>";
238 }
239
240 function delete_button_cell($name, $value, $title=false)
241 {
242         button_cell($name, $value, $title, ICON_DELETE);
243 }
244
245 function edit_button_cell($name, $value, $title=false)
246 {
247         button_cell($name, $value, $title, ICON_EDIT);
248 }
249 //-----------------------------------------------------------------------------------
250
251 function check_value($name)
252 {
253         if (!isset($_POST[$name]))
254                 return 0;
255         return 1;
256 }
257
258 function check($label, $name, $value=null, $submit_on_change=false, $title=false)
259 {
260         global $Ajax;
261         
262         default_focus($name);
263         if ($label)
264                 echo $label . "  ";
265         if ($submit_on_change !== false) {
266                 if ($submit_on_change === true)
267                         $submit_on_change = 
268                                 "JsHttpRequest.request(\"_{$name}_update\", this.form);";
269         }
270         if ($value === null)
271                 $value = get_post($name,0);
272
273                 echo "<input"
274                     .($value == 1 ? ' checked':'')
275                     ." type='checkbox' name='$name' value='1'"
276                     .($submit_on_change ? " onclick='$submit_on_change'" : '')
277                     .($title ? " title='$title'" : '')
278                     ." >\n";
279         $Ajax->addUpdate($name, $name, $value);
280 }
281
282 function check_cells($label, $name, $value, $submit_on_change=false, $title=false)
283 {
284         if ($label != null)
285                 echo "<td>$label</td>\n";
286         echo "<td>";
287         check(null, $name, $value, $submit_on_change, $title);
288         echo "</td>";
289 }
290
291 function check_row($label, $name, $value, $submit_on_change=false, $title=false)
292 {
293         echo "<tr>";
294         check_cells($label, $name, $value, $submit_on_change, $title);
295         echo "</tr>\n";
296 }
297
298 //-----------------------------------------------------------------------------------
299
300 function labelheader_cell($label, $params="")
301 {
302         echo "<td class='tableheader' $params>$label</td>\n";
303 }
304
305 function label_cell($label, $params="", $id=null)
306 {
307     global $Ajax;
308
309         if(isset($id))
310         {
311             $params .= " id='$id'";
312             $Ajax->addUpdate($id, $id, $label);
313         }
314         echo "<td $params>$label</td>\n";
315
316         return $label;
317 }
318
319 function email_cell($label, $params="", $id=null)
320 {
321         label_cell("<a href='mailto:$label'>$label</a>", $params, $id);
322 }
323
324 function amount_cell($label, $bold=false, $params="", $id=null)
325 {
326         if ($bold)
327                 label_cell("<b>".price_format($label)."</b>", "nowrap align=right ".$params, $id);
328         else
329                 label_cell(price_format($label), "nowrap align=right ".$params, $id);
330 }
331
332 function percent_cell($label, $bold=false, $id=null)
333 {
334         if ($bold)
335                 label_cell("<b>".percent_format($label)."</b>", "nowrap align=right", $id);
336         else
337                 label_cell(percent_format($label), "nowrap align=right", $id);
338 }
339 // 2008-06-15. Changed
340 function qty_cell($label, $bold=false, $dec=null, $id=null)
341 {
342         if (!isset($dec))
343                 $dec = get_qty_dec();
344         if ($bold)
345                 label_cell("<b>".number_format2($label, $dec)."</b>", "nowrap align=right", $id);
346         else
347                 label_cell(number_format2($label, $dec), "nowrap align=right", $id);
348 }
349
350 function label_cells($label, $value, $params="", $params2="", $id='')
351 {
352         if ($label != null)
353                 echo "<td $params>$label</td>\n";
354         label_cell($value, $params2, $id);
355 }
356
357 function label_row($label, $value, $params="", $params2="", $leftfill=0, $id='')
358 {
359         echo "<tr>";
360         label_cells($label, $value, $params, $params2, $id);
361         if ($leftfill!=0)
362                 echo "<td colspan=$leftfill></td>";
363         echo "</tr>\n";
364 }
365
366 //-----------------------------------------------------------------------------------
367
368 function text_cells($label, $name, $value=null, $size="", $max="", $title=false, $params="", $post_label="", $disabled="")
369 {
370         global $Ajax;
371
372         default_focus($name);
373         if ($label != null)
374                 label_cell($label, $params);
375         echo "<td>";
376
377         if ($value === null)
378                 $value = get_post($name);
379         echo "<input $disabled type=\"text\" name=\"$name\" size=\"$size\" maxlength=\"$max\" value=\"$value\""
380             .($title ? " title='$title'" : '')
381             .">";
382
383         if ($post_label != "")
384                 echo " " . $post_label;
385
386         echo "</td>\n";
387         $Ajax->addUpdate($name, $name, $value);
388 }
389
390 function text_cells_ex($label, $name, $size, $max=null, $init=null, $title=null, $params=null, $post_label=null, $submit_on_change=false)
391 {
392         global $Ajax;
393
394         default_focus($name);
395         if (!isset($_POST[$name]) || $_POST[$name] == "")
396         {
397                 if ($init)
398                         $_POST[$name] = $init;
399                 else
400                         $_POST[$name] = "";
401         }
402         if ($label != null)
403                 label_cell($label, $params);
404
405         if (!isset($max))
406                 $max = $size;
407
408         echo "<td>";
409         $class = $submit_on_change ? 'class="searchbox"' : '';
410         echo "<input $class type=\"text\" name=\"$name\" size=\"$size\" maxlength=\"$max\" value=\"" . $_POST[$name]. "\""
411          .($title ? " title='$title'": '')." >";
412
413         if ($post_label)
414                 echo " " . $post_label;
415
416         echo "</td>\n";
417         $Ajax->addUpdate($name, $name, $_POST[$name]);
418 }
419
420 function text_row($label, $name, $value, $size, $max, $title=null, $params="", $post_label="")
421 {
422         echo "<tr>";
423
424         text_cells($label, $name, $value, $size, $max, $title, $params, $post_label);
425
426         echo "</tr>\n";
427 }
428
429 //-----------------------------------------------------------------------------------
430
431 function text_row_ex($label, $name, $size, $max=null, $title=null, $value=null, $params=null, $post_label=null)
432 {
433         echo "<tr>";
434
435         text_cells_ex($label, $name, $size, $max, $value, $title, $params, $post_label);
436
437         echo "</tr>\n";
438 }
439
440 //-----------------------------------------------------------------------------------
441 function email_row($label, $name, $value, $size, $max, $title=null, $params="", $post_label="")
442 {
443         text_row("<a href='Mailto:".$_POST[$name]."'>$label</a>", $name, $value, $size, $max, $title, $params, $post_label);
444 }
445
446 function email_row_ex($label, $name, $size, $max=null, $title=null, $value=null, $params=null, $post_label=null)
447 {
448         text_row_ex("<a href='Mailto:".$_POST[$name]."'>$label</a>", $name, $size, $max, $title, $value, $params, $post_label);
449 }
450
451 function link_row($label, $name, $value, $size, $max, $title=null, $params="", $post_label="")
452 {
453         text_row("<a href='".$_POST[$name]."' target='_blank'>$label</a>", $name, $value, $size, $max, $title, $params, $post_label);
454 }
455
456 function link_row_ex($label, $name, $size, $max=null, $title=null, $value=null, $params=null, $post_label=null)
457 {
458         text_row_ex("<a href='".$_POST[$name]."' target='_blank'>$label</a>", $name, $size, $max, $title, $value, $params, $post_label);
459 }
460
461 //-----------------------------------------------------------------------------------
462
463 function date_cells($label, $name, $title = null, $init=null, $inc_days=0, 
464         $inc_months=0, $inc_years=0, $params=null, $submit_on_change=false)
465 {
466         global $use_date_picker, $path_to_root;
467         if (!isset($_POST[$name]) || $_POST[$name] == "")
468         {
469                 if (!$init)
470                 {
471                         if ($inc_years == 1001)
472                                 $_POST[$name] = null;
473                         else
474                         {
475                                 $dd = Today();
476                                 if ($inc_days != 0)
477                                         $dd = add_days($dd, $inc_days);
478                                 if ($inc_months != 0)
479                                         $dd = add_months($dd, $inc_months);
480                                 if ($inc_years != 0)
481                                         $dd = add_years($dd, $inc_years);
482                                 $_POST[$name] = $dd;
483                         }
484                 }
485                 else
486                         $_POST[$name] = $init;
487         }
488         if ($use_date_picker)
489                 $post_label = "<a tabindex='-1' href=\"javascript:date_picker(document.getElementsByName('$name')[0]);\">"
490                 . "     <img src='$path_to_root/themes/default/images/cal.gif' width='16' height='16' border='0' alt='"._('Click Here to Pick up the date')."'></a>\n";
491         else
492                 $post_label = "";
493         text_cells_ex($label, $name, 9, 12, $_POST[$name], $title, $params, $post_label, $submit_on_change);
494 }
495
496 function date_row($label, $name, $title=null, $init=null, $inc_days=0, $inc_months=0, 
497         $inc_years=0, $params=null, $submit_on_change=false)
498 {
499         echo "<tr>";
500         date_cells($label, $name, $title, $init, $inc_days, $inc_months, 
501                 $inc_years, $params, $submit_on_change);
502         echo "</tr>\n";
503 }
504
505 //-----------------------------------------------------------------------------------
506
507 function ref_cells($label, $name, $title=null, $init=null, $params=null, $submit_on_change=false)
508 {
509         text_cells_ex($label, $name, 16, 18, $init, $title, $params, null, $submit_on_change);
510 }
511
512 //-----------------------------------------------------------------------------------
513
514 function ref_row($label, $name, $title=null, $init=null, $submit_on_change=false)
515 {
516         echo "<tr>";
517         ref_cells($label, $name, $title, $init, null, $submit_on_change);
518         echo "</tr>\n";
519 }
520
521 //-----------------------------------------------------------------------------------
522
523 function percent_row($label, $name, $init=null)
524 {
525
526         if (!isset($_POST[$name]) || $_POST[$name]=="")
527         {
528                 $_POST[$name] = $init == null ? '' : $init;
529         }
530
531         small_amount_row($label, $name, $_POST[$name], null, "%", user_percent_dec());
532 }
533
534 function amount_cells_ex($label, $name, $size, $max=null, $init=null, $params=null, $post_label=null, $dec=null)
535 {
536         global $Ajax;
537
538         if (!isset($dec))
539                 $dec = user_price_dec();
540         if (!isset($_POST[$name]) || $_POST[$name] == "")
541         {
542                 if ($init !== null)
543                         $_POST[$name] = $init;
544                 else
545                         $_POST[$name] = '';
546         }
547         if ($label != null)
548                 label_cell($label, $params);
549
550         if (!isset($max))
551                 $max = $size;
552
553         if ($label != null)
554                 echo "<td>";
555         else
556                 echo "<td align='right'>";
557
558         echo "<input class='amount' type=\"text\" name=\"$name\" size=\"$size\" maxlength=\"$max\" dec=\"$dec\" value=\"" . $_POST[$name]. "\">";
559
560         if ($post_label) {
561                 echo "<span id='_{$name}_label'> $post_label</span>";
562                 $Ajax->addUpdate($name, '_'.$name.'_label', $post_label);
563         }
564         echo "</td>\n";
565         $Ajax->addUpdate($name, $name, $_POST[$name]);
566         $Ajax->addAssign($name, $name, 'dec', $dec);
567 }
568
569
570 //-----------------------------------------------------------------------------------
571
572 function amount_cells($label, $name, $init=null, $params=null, $post_label=null, $dec=null)
573 {
574         amount_cells_ex($label, $name, 15, 15, $init, $params, $post_label, $dec);
575 }
576
577 function amount_row($label, $name, $init=null, $params=null, $post_label=null, $dec=null)
578 {
579         echo "<tr>";
580         amount_cells($label, $name, $init, $params, $post_label, $dec);
581         echo "</tr>\n";
582 }
583
584 function small_amount_row($label, $name, $init=null, $params=null, $post_label=null, $dec=null)
585 {
586         echo "<tr>";
587         small_amount_cells($label, $name, $init, $params, $post_label, $dec);
588         echo "</tr>\n";
589 }
590
591 //-----------------------------------------------------------------------------------
592
593 function qty_cells($label, $name, $init=null, $params=null, $post_label=null, $dec=null)
594 {
595         if (!isset($dec))
596                 $dec = user_qty_dec();
597
598         amount_cells_ex($label, $name, 15, 15, $init, $params, $post_label, $dec);
599 }
600
601 function qty_row($label, $name, $init=null, $params=null, $post_label=null, $dec=null)
602 {
603         if (!isset($dec))
604                 $dec = user_qty_dec();
605
606         echo "<tr>";
607         amount_cells($label, $name, $init, $params, $post_label, $dec);
608         echo "</tr>\n";
609 }
610
611 function small_qty_row($label, $name, $init=null, $params=null, $post_label=null, $dec=null)
612 {
613         if (!isset($dec))
614                 $dec = user_qty_dec();
615
616         echo "<tr>";
617         small_amount_cells($label, $name, $init, $params, $post_label, $dec);
618         echo "</tr>\n";
619 }
620
621 //-----------------------------------------------------------------------------------
622
623 function small_amount_cells($label, $name, $init=null, $params=null, $post_label=null, $dec=null)
624 {
625         amount_cells_ex($label, $name, 7, 12, $init, $params, $post_label, $dec);
626 }
627
628 //-----------------------------------------------------------------------------------
629
630 function small_qty_cells($label, $name, $init=null, $params=null, $post_label=null, $dec=null)
631 {
632         if (!isset($dec))
633                 $dec = user_qty_dec();
634         amount_cells_ex($label, $name, 7, 12, $init, $params, $post_label, $dec);
635 }
636
637 //-----------------------------------------------------------------------------------
638
639 function textarea_cells($label, $name, $value, $cols, $rows, $title = null, $params="")
640 {
641         global $Ajax;
642
643         default_focus($name);
644         if ($label != null)
645                 echo "<td $params>$label</td>\n";
646         if ($value == null)
647                 $value = (!isset($_POST[$name]) ? "" : $_POST[$name]);
648         echo "<td><textarea name='$name' cols='$cols' rows='$rows'"
649         .($title ? " title='$title'" : '')
650         .">$value</textarea></td>\n";
651         $Ajax->addUpdate($name, $name, $value);
652 }
653
654 function textarea_row($label, $name, $value, $cols, $rows, $title=null, $params="")
655 {
656         echo "<tr>";
657         textarea_cells($label, $name, $value, $cols, $rows, $title, $params);
658         echo "</tr>\n";
659 }
660
661 //-----------------------------------------------------------------------------------
662 /*
663 function text_row_with_submit($label, $name, $value, $size, $max, $input_name, $input_value)
664 {
665         global $Ajax;
666
667         default_focus($name);
668         echo "<tr><td>$label</td>\n";
669         echo "<td>";
670
671         if ($value == null)
672                 $value = (!isset($_POST[$name]) ? "" : $_POST[$name]);
673         echo "<input type=\"text\" name=\"$name\" size=\"$size\" maxlength=\"$max\" value=\"$value\">   ";
674
675         submit($input_name, $input_value);
676
677         echo "</td></tr>\n";
678         $Ajax->addUpdate($name, $name, $value);
679 }
680 */
681 //-----------------------------------------------------------------------------------
682
683
684 ?>