Merged changes up to version 2.3.4 into unstable.
[fa-stable.git] / includes / ui / ui_input.inc
index ccd62b48164f70671e26a23f2a82e587d090135f..9048cac4641d00e536164537c6a5657482a05956 100644 (file)
@@ -47,11 +47,12 @@ function simple_page_mode($numeric_id = true)
 
        $default = $numeric_id ? -1 : '';
        $selected_id = get_post('selected_id', $default);
-       foreach (array('ADD_ITEM', 'UPDATE_ITEM', 'RESET') as $m) {
+       foreach (array('ADD_ITEM', 'UPDATE_ITEM', 'RESET', 'CLONE') as $m) {
                if (isset($_POST[$m])) {
                        $Ajax->activate('_page_body');
-                       if ($m == 'RESET') 
+                       if ($m == 'RESET'  || $m == 'CLONE'
                                $selected_id = $default;
+                       unset($_POST['_focus']);
                        $Mode = $m; return;
                }
        }
@@ -74,7 +75,7 @@ function simple_page_mode($numeric_id = true)
 //
 //     Read numeric value from user formatted input
 //
-function input_num($postname=null, $dflt=null)
+function input_num($postname=null, $dflt=0)
 {
        if (!isset($_POST[$postname]) || $_POST[$postname] == "")
                return $dflt;
@@ -106,36 +107,43 @@ function hidden($name, $value=null, $echo=true)
                null  - button visible only in fallback mode; optional icon
         Ajax submit:
                true      - standard button; optional icon
-               'process' - displays progress bar during call; optional icon
+
                'default' - default form submit on Ctrl-Enter press; dflt ICON_OK icon
                'selector' - ditto with closing current popup editor window
                'cancel'  - cancel form entry on Escape press; dflt ICON_CANCEL
+               'process' - displays progress bar during call; optional icon
+
+       $atype can contain also multiply type selectors separated by space, 
+       however make sense only combination of 'process' and one of defualt/selector/cancel
 */
 function submit($name, $value, $echo=true, $title=false, $atype=false, $icon=false)
 {
        global $path_to_root;
 
        $aspect='';
-       if (!is_bool($atype)) // necessary: switch uses '=='
-         switch($atype) {
-               case 'process':
-                       $aspect = " aspect='process'"; break;
-               case 'selector':
-                       $aspect = " aspect='selector' rel = '$value'"; 
-                       $value = _("Select");
-                       if ($icon===false) $icon=ICON_SUBMIT; break;
-               case 'default':
-                       $aspect = " aspect='default'"; 
-                       if ($icon===false) $icon=ICON_SUBMIT; break;
-               case 'cancel':
-                       $aspect = " aspect='cancel'"; 
-                       if ($icon===false) $icon=ICON_ESCAPE; break;
-               case null: 
-                       $aspect = fallback_mode() ? 
-                               " aspect='fallback'" : " style='display:none;'"; break;
-        }
+       if ($atype === null) {
+               $aspect = fallback_mode() ? " aspect='fallback'" : " style='display:none;'";
 
-       default_focus($name);
+       } elseif (!is_bool($atype)) { // necessary: switch uses '=='
+
+               $aspect = "aspect='$atype' ";
+               $types = explode(' ', $atype);
+
+               foreach ($types as $type) {
+                       switch($type) {
+                               case 'selector':
+                                       $aspect = " aspect='selector' rel = '$value'"; 
+                                       $value = _("Select");
+                                       if ($icon===false) $icon=ICON_SUBMIT; break;
+
+                               case 'default':
+                                       if ($icon===false) $icon=ICON_SUBMIT; break;
+
+                               case 'cancel':
+                                       if ($icon===false) $icon=ICON_ESCAPE; break;
+                       }
+               }
+       }
        $submit_str = "<button class=\""
            .($atype ? 'ajaxsubmit' : 'inputsubmit')
                ."\" type=\"submit\""
@@ -143,7 +151,7 @@ function submit($name, $value, $echo=true, $title=false, $atype=false, $icon=fal
            ." name=\"$name\"  id=\"$name\" value=\"$value\""
            .($title ? " title='$title'" : '')
            .">"
-               .($icon ? "<img src='$path_to_root/themes/".user_theme()."/images/$icon'>" : '')
+               .($icon ? "<img src='$path_to_root/themes/".user_theme()."/images/$icon' height='12'>" : '')
                ."<span>$value</span>"
                ."</button>\n";
        if ($echo)
@@ -154,9 +162,9 @@ function submit($name, $value, $echo=true, $title=false, $atype=false, $icon=fal
 
 function submit_center($name, $value, $echo=true, $title=false, $async=false, $icon=false)
 {
-       echo "<center>";
+       if ($echo) echo "<center>";
        submit($name, $value, $echo, $title, $async, $icon);
-       echo "</center>";
+       if ($echo) echo "</center>";
 }
 
 function submit_center_first($name, $value, $title=false, $async=false, $icon=false)
@@ -177,7 +185,7 @@ function submit_center_last($name, $value, $title=false, $async=false, $icon=fal
        'both' - use both Ctrl-Enter and Escape hotkeys 
        'cancel' - apply to 'RESET' button
 */
-function submit_add_or_update($add=true, $title=false, $async=false)
+function submit_add_or_update($add=true, $title=false, $async=false, $clone=false)
 {
        $cancel = $async;
 
@@ -192,25 +200,27 @@ function submit_add_or_update($add=true, $title=false, $async=false)
        if ($add)
                submit('ADD_ITEM', _("Add new"), true, $title, $async);
        else {
-               submit('UPDATE_ITEM', _("Update"), true, $title, $async);
-               submit('RESET', _("Cancel"), true, $title, $cancel);
+               submit('UPDATE_ITEM', _("Update"), true, _('Submit changes'), $async);
+               if ($clone) submit('CLONE', _("Clone"), true, 
+                       _('Edit new record with current data'), $async);
+               submit('RESET', _("Cancel"), true, _('Cancel edition'), $cancel);
        }
 }
 
-function submit_add_or_update_center($add=true, $title=false, $async=false)
+function submit_add_or_update_center($add=true, $title=false, $async=false, $clone=false)
 {
        echo "<center>";
-       submit_add_or_update($add, $title, $async);
+       submit_add_or_update($add, $title, $async, $clone);
        echo "</center>";
 }
 
-function submit_add_or_update_row($add=true, $right=true, $extra="", $title=false, $async=false)
+function submit_add_or_update_row($add=true, $right=true, $extra="", $title=false, $async=false, $clone = false)
 {
        echo "<tr>";
        if ($right)
                echo "<td>&nbsp;</td>\n";
        echo "<td $extra>";
-       submit_add_or_update($add, $title, $async);
+       submit_add_or_update($add, $title, $async, $clone);
        echo "</td></tr>\n";
 }
 
@@ -237,16 +247,24 @@ function submit_return($name, $value, $title=false)
        }
 }
 
-function submit_js_confirm($name, $msg) {
-       add_js_source(
-               "_validate.$name=function(){ return confirm('$msg');};");
-};
+function submit_js_confirm($name, $msg, $set = true) {
+       global $Ajax;
+       $js = "_validate.$name=".($set ? "function(){ return confirm('"
+                               . strtr($msg, array("\n"=>'\\n')) . "');};"
+                               : 'null;');
+       if (in_ajax()) {
+               $Ajax->addScript(true, $js);
+       } else
+               add_js_source($js);
+}
 //-----------------------------------------------------------------------------------
 
 function set_icon($icon, $title=false)
 {
        global $path_to_root;
-       return "<img src='$path_to_root/themes/".user_theme()."/images/$icon' width='14' height='14' border='0'".($title ? " title='$title'" : "")." />\n";     
+       if (basename($icon) === $icon) // standard icons does not contain path separator
+               $icon = "$path_to_root/themes/".user_theme()."/images/$icon";
+       return "<img src='$icon' width='12' height='12' border='0'".($title ? " title='$title'" : "")." />\n";  
 }
 
 function button($name, $value, $title=false, $icon=false,  $aspect='')
@@ -262,16 +280,18 @@ function button($name, $value, $title=false, $icon=false,  $aspect='')
        {
                if ($value == _("Delete")) // Helper during implementation
                        $icon = ICON_DELETE;
-               return "<button type='submit' class='editbutton' name='".
-                       htmlentities(strtr($name, array('.'=>'=2E',' '=>'=20','='=>'=3D','['=>'=5B'))).
-                       "' value='1'" . ($title ? " title='$title'":" title='$value'")
+               return "<button type='submit' class='editbutton' name='"
+                       .htmlentities(strtr($name, array('.'=>'=2E', '='=>'=3D',// ' '=>'=20','['=>'=5B'
+                       )))
+                       ."' value='1'" . ($title ? " title='$title'":" title='$value'")
                        . ($aspect ? " aspect='$aspect'" : '')
                        . $rel
-                       ." />".set_icon($icon)."\n";
+                       ." />".set_icon($icon)."</button>\n";
        }
        else
                return "<input type='submit' class='editbutton' name='"
-                       .htmlentities(strtr($name, array('.'=>'=2E',' '=>'=20','='=>'=3D','['=>'=5B')))
+                       .htmlentities(strtr($name, array('.'=>'=2E', '='=>'=3D',// ' '=>'=20','['=>'=5B'
+                       )))
                        ."' value='$value'"
                        .($title ? " title='$title'":'')
                        . ($aspect ? " aspect='$aspect'" : '')
@@ -314,7 +334,7 @@ function checkbox($label, $name, $value=null, $submit_on_change=false, $title=fa
        global $Ajax;
 
        $str = '';      
-       default_focus($name);
+
        if ($label)
                $str .= $label . "  ";
        if ($submit_on_change !== false) {
@@ -341,7 +361,7 @@ function check($label, $name, $value=null, $submit_on_change=false, $title=false
        echo checkbox($label, $name, $value, $submit_on_change, $title);
 }
 
-function check_cells($label, $name, $value, $submit_on_change=false, $title=false,
+function check_cells($label, $name, $value=null, $submit_on_change=false, $title=false,
        $params='')
 {
        if ($label != null)
@@ -351,15 +371,26 @@ function check_cells($label, $name, $value, $submit_on_change=false, $title=fals
        echo "</td>";
 }
 
-function check_row($label, $name, $value, $submit_on_change=false, $title=false)
+function check_row($label, $name, $value=null, $submit_on_change=false, $title=false)
 {
-       echo "<tr>";
-       echo check_cells($label, $name, $value, $submit_on_change, $title);
+       echo "<tr><td class='label'>$label</td>";
+       echo check_cells(NULL, $name, $value, $submit_on_change, $title);
        echo "</tr>\n";
 }
 
 //-----------------------------------------------------------------------------------
+function radio($label, $name, $value, $selected, $submit_on_change=false) {
+
+       if ($submit_on_change === true)
+               $submit_on_change = 
+                       "JsHttpRequest.request(\"_{$name}_update\", this.form);";
 
+       return "<input type='radio' name=$name value='$value' ".($selected ? "checked":'')
+           .($submit_on_change ? " onclick='$submit_on_change'" : '')
+               .">".($label ? $label : '');
+}
+
+//-----------------------------------------------------------------------------------
 function labelheader_cell($label, $params="")
 {
        echo "<td class='tableheader' $params>$label</td>\n";
@@ -384,6 +415,12 @@ function email_cell($label, $params="", $id=null)
        label_cell("<a href='mailto:$label'>$label</a>", $params, $id);
 }
 
+function amount_decimal_cell($label, $params="", $id=null)
+{
+       $dec = 0;
+       label_cell(price_decimal_format($label, $dec), "nowrap align=right ".$params, $id);
+}
+
 function amount_cell($label, $bold=false, $params="", $id=null)
 {
        if ($bold)
@@ -392,6 +429,16 @@ function amount_cell($label, $bold=false, $params="", $id=null)
                label_cell(price_format($label), "nowrap align=right ".$params, $id);
 }
 
+//JAM  Allow entered unit prices to be fractional
+function unit_amount_cell($label, $bold=false, $params="", $id=null)
+{
+       if ($bold)
+               label_cell("<b>".unit_price_format($label)."</b>", "nowrap align=right ".$params, $id);
+       else
+               label_cell(unit_price_format($label), "nowrap align=right ".$params, $id);
+}
+
+
 function percent_cell($label, $bold=false, $id=null)
 {
        if ($bold)
@@ -420,6 +467,11 @@ function label_cells($label, $value, $params="", $params2="", $id='')
 function label_row($label, $value, $params="", $params2="", $leftfill=0, $id='')
 {
        echo "<tr>";
+       if ($params == "")
+       {
+               echo "<td class='label'>$label</td>";
+               $label = null;
+       }       
        label_cells($label, $value, $params, $params2, $id);
        if ($leftfill!=0)
                echo "<td colspan=$leftfill></td>";
@@ -484,9 +536,8 @@ function text_cells_ex($label, $name, $size, $max=null, $init=null, $title=null,
 
 function text_row($label, $name, $value, $size, $max, $title=null, $params="", $post_label="")
 {
-       echo "<tr>";
-
-       text_cells($label, $name, $value, $size, $max, $title, $params, $post_label);
+       echo "<tr><td class='label'>$label</td>";
+       text_cells(null, $name, $value, $size, $max, $title, $params, $post_label);
 
        echo "</tr>\n";
 }
@@ -495,9 +546,8 @@ function text_row($label, $name, $value, $size, $max, $title=null, $params="", $
 
 function text_row_ex($label, $name, $size, $max=null, $title=null, $value=null, $params=null, $post_label=null)
 {
-       echo "<tr>";
-
-       text_cells_ex($label, $name, $size, $max, $value, $title, $params, $post_label);
+       echo "<tr><td class='label'>$label</td>";
+       text_cells_ex(null, $name, $size, $max, $value, $title, $params, $post_label);
 
        echo "</tr>\n";
 }
@@ -583,6 +633,8 @@ function date_cells($label, $name, $title = null, $check=null, $inc_days=0,
        if ($check && (get_post($name) != Today()))
                $aspect .= ' style="color:#FF0000"';
 
+       default_focus($name);
+
        echo "<input type=\"text\" name=\"$name\" $class $aspect size=\"9\" maxlength=\"12\" value=\"" 
         . $_POST[$name]. "\""
         .($title ? " title='$title'": '')." > $post_label";
@@ -593,12 +645,34 @@ function date_cells($label, $name, $title = null, $check=null, $inc_days=0,
 function date_row($label, $name, $title=null, $check=null, $inc_days=0, $inc_months=0, 
        $inc_years=0, $params=null, $submit_on_change=false)
 {
-       echo "<tr>";
-       date_cells($label, $name, $title, $check, $inc_days, $inc_months, 
+       echo "<tr><td class='label'>$label</td>";
+       date_cells(null, $name, $title, $check, $inc_days, $inc_months, 
                $inc_years, $params, $submit_on_change);
        echo "</tr>\n";
 }
 
+//-----------------------------------------------------------------------------------
+function password_row($label, $name, $value)
+{
+       echo "<tr><td class='label'>$label</td>";
+       label_cell("<input type='password' name='$name' size=20 maxlength=20 value='$value' />");
+       echo "</tr>\n";
+}      
+
+//-----------------------------------------------------------------------------------
+function file_cells($label, $name, $id="")
+{
+       if ($id != "")
+               $id = "id='$id'";
+       label_cells($label, "<input type='file' name='$name' $id />");
+}              
+function file_row($label, $name, $id = "")
+{
+       echo "<tr><td class='label'>$label</td>";
+       file_cells(null, $name, $id);
+       echo "</tr>\n";
+}      
+
 //-----------------------------------------------------------------------------------
 
 function ref_cells($label, $name, $title=null, $init=null, $params=null, $submit_on_change=false)
@@ -610,8 +684,8 @@ function ref_cells($label, $name, $title=null, $init=null, $params=null, $submit
 
 function ref_row($label, $name, $title=null, $init=null, $submit_on_change=false)
 {
-       echo "<tr>";
-       ref_cells($label, $name, $title, $init, null, $submit_on_change);
+       echo "<tr><td class='label'>$label</td>";
+       ref_cells(null, $name, $title, $init, null, $submit_on_change);
        echo "</tr>\n";
 }
 
@@ -642,8 +716,11 @@ function amount_cells_ex($label, $name, $size, $max=null, $init=null, $params=nu
                        $_POST[$name] = '';
        }
        if ($label != null)
+       {
+               if ($params == null)
+                       $params = "class='label'";
                label_cell($label, $params);
-
+       }
        if (!isset($max))
                $max = $size;
 
@@ -671,6 +748,15 @@ function amount_cells($label, $name, $init=null, $params=null, $post_label=null,
        amount_cells_ex($label, $name, 15, 15, $init, $params, $post_label, $dec);
 }
 
+//JAM  Allow entered unit prices to be fractional
+function unit_amount_cells($label, $name, $init=null, $params=null, $post_label=null, $dec=null)
+{
+       if (!isset($dec))
+               $dec = user_price_dec()+2;
+
+       amount_cells_ex($label, $name, 15, 15, $init, $params, $post_label, $dec+2);
+}
+
 function amount_row($label, $name, $init=null, $params=null, $post_label=null, $dec=null)
 {
        echo "<tr>";
@@ -750,8 +836,8 @@ function textarea_cells($label, $name, $value, $cols, $rows, $title = null, $par
 
 function textarea_row($label, $name, $value, $cols, $rows, $title=null, $params="")
 {
-       echo "<tr>";
-       textarea_cells($label, $name, $value, $cols, $rows, $title, $params);
+       echo "<tr><td class='label'>$label</td>";
+       textarea_cells(null, $name, $value, $cols, $rows, $title, $params);
        echo "</tr>\n";
 }
 
@@ -820,4 +906,63 @@ function inactive_control_column(&$th) {
                $Ajax->activate('_page_body');
        }
 }
+
+function customer_credit_row($customer, $credit, $parms='')
+{
+       global $path_to_root;
+       
+       label_row( _("Current Credit:"),
+               "<a target='_blank' " . ($credit<0 ? 'class="redfg"' : '')
+               ."href='$path_to_root/sales/inquiry/customer_inquiry.php?customer_id=".$customer."'"
+               ." onclick=\"javascript:openWindow(this.href,this.target); return false;\" >"
+               . price_format($credit)
+               ."</a>", $parms);
+}
+
+function supplier_credit_row($supplier, $credit, $parms='')
+{
+       global $path_to_root;
+       
+       label_row( _("Current Credit:"),
+               "<a target='_blank' " . ($credit<0 ? 'class="redfg"' : '')
+               ."href='$path_to_root/purchasing/inquiry/supplier_inquiry.php?supplier_id=".$supplier."'"
+               ." onclick=\"javascript:openWindow(this.href,this.target); return false;\" >"
+               . price_format($credit)
+               ."</a>", $parms);
+}
+
+/*
+       Edit transaction link to be used in transaction inquires
+*/
+function edit_trans_link($trans_type, $trans_no, $url='')
+{
+       global $path_to_root, $trans_editors;
+
+       if (!$url) $url = @$trans_editors[$trans_type];
+
+       if (!$trans_no || !$url)
+               return '';
+
+       if (is_closed_trans($trans_type, $trans_no)) {
+               return set_icon(ICON_CLOSED, _('Closed'));
+       } else {
+               $link_text = user_graphic_links() ? set_icon(ICON_EDIT, _('Edit')) : _('Edit');
+               return "<a href='".$path_to_root . sprintf($url, $trans_no, $trans_type)."'>$link_text</a>";
+       }
+}
+
+function bank_balance_row($bank_acc, $parms='')
+{
+       global $path_to_root;
+       
+       $to = add_days(Today(), 1);
+       $bal = get_balance_before_for_bank_account($bank_acc, $to);
+       label_row( _("Bank Balance:"),
+               "<a target='_blank' " . ($bal<0 ? 'class="redfg"' : '')
+               ."href='$path_to_root/gl/inquiry/bank_inquiry.php?bank_account=".$bank_acc."'"
+               ." onclick=\"javascript:openWindow(this.href,this.target); return false;\" >&nbsp;"
+               . price_format($bal)
+               ."</a>", $parms);
+}
+
 ?>
\ No newline at end of file