$main::lxdebug->leave_sub();
 }
 
+# if $a is translatable to $b, return the factor between them.
+# else return 1
+sub convert_unit {
+  $main::lxdebug->enter_sub(2);
+  ($this, $a, $b, $all_units) = @_;
+
+  $main::lxdebug->leave_sub(2) and return 0 unless $all_units->{$a} && $all_units->{$b};
+  $main::lxdebug->leave_sub(2) and return 0 unless $all_units->{$a}{base_unit} eq $all_units->{$b}{base_unit};
+  $main::lxdebug->leave_sub(2) and return $all_units->{$a}{factor} / $all_units->{$b}{factor}; 
+}
+
 sub unit_select_data {
   $main::lxdebug->enter_sub();
 
 
                                  'EVAL_PERL'   => 0,
                                  'ABSOLUTE'    => 1,
                                  'CACHE_SIZE'  => 0,
+                                 'PLUGIN_BASE' => 'SL::Template::Plugin',
                                }) || die;
 
   map { $additional_params->{$_} ||= $self->{$_} } keys %{ $self };
 sub _get_customers {
   $main::lxdebug->enter_sub();
 
-  my ($self, $dbh, $key) = @_;
+  my ($self, $dbh, $key, $limit) = @_;
 
   $key = "all_customers" unless ($key);
+  $limit_clause = "LIMIT $limit" if $limit;
 
-  my $query = qq|SELECT * FROM customer WHERE NOT obsolete ORDER BY name|;
+  my $query = qq|SELECT * FROM customer WHERE NOT obsolete ORDER BY name $limit_clause|;
 
   $self->{$key} = selectall_hashref_query($self, $dbh, $query);
 
   }
   
   if($params{"customers"}) {
-    $self->_get_customers($dbh, $params{"customers"});
+    if (ref $params{"customers"} eq 'HASH') {
+      $self->_get_customers($dbh, $params{"customers"}{key}, $params{"customers"}{limit});
+    } else {
+      $self->_get_customers($dbh, $params{"customers"});
+    }
   }
   
   if($params{"vendors"}) {
-    $self->_get_vendors($dbh, $params{"vendors"});
+    if (ref $params{"vendors"} eq 'HASH') {
+      $self->_get_vendors($dbh, $params{"vendors"}{key}, $params{"vendors"}{limit});
+    } else {
+      $self->_get_vendors($dbh, $params{"vendors"});
+    }
   }
   
   if($params{"payments"}) {
 
 
   my @sort_cols = (@simple_filters, qw(id bin priceupdate onhand invnumber ordnumber quonumber name serialnumber soldtotal deliverydate));
   $form->{sort} = 'id' unless grep { $form->{"l_$_"} } grep { $form->{sort} eq $_ } @sort_cols;
-  my $order_clause = " ORDER BY $form->{sort} " . ($form->{revers} ? 'DESC' : 'ASC');
+
+  my $sort_order = ($form->{revers} ? ' DESC' : ' ASC');
+
+  # special case: sorting by partnumber
+  # since partnumbers are expected to be prefixed integers, a special sorting is implemented sorting first lexically by prefix and then by suffix.
+  # and yes, that expression is designed to hold that array of regexes only once, so the map is kinda messy, sorry about that.
+  # ToDO: implement proper functional sorting
+  $form->{sort} = join ', ', map { push @select_tokens, $_; ($table_prefix{$_} = "substring(partnumber,'[") . $_ } qw|^[:digit:]]+') [:digit:]]+')::INTEGER|
+    if $form->{sort} eq 'partnumber';
+
+  my $order_clause = " ORDER BY $form->{sort} $sort_order";
 
   my $limit_clause = " LIMIT 100" if $form->{top100};
 
 
   #============= build query ================#
 
-  my %table_prefix = (
+  %table_prefix = (
+     %table_prefix,
      deliverydate => 'apoe.', serialnumber => 'ioi.',
      transdate    => 'apoe.', trans_id     => 'ioi.',
      module       => 'apoe.', name         => 'cv.',
 
 sub get_vendor {
   $main::lxdebug->enter_sub();
 
-  my ($self, $myconfig, $form) = @_;
+  my ($self, $myconfig, $form, $params) = @_;
+
+  $params = $form unless defined $params && ref $params eq "HASH";
+  $main::lxdebug->message(0, Dumper($params));
 
   # connect to database
   my $dbh = $form->dbconnect($myconfig);
   my $dateformat = $myconfig->{dateformat};
   $dateformat .= "yy" if $myconfig->{dateformat} !~ /^y/;
 
-  my $vid = conv_i($form->{vendor_id});
+  my $vid = conv_i($params->{vendor_id});
+  my $vnr = conv_i($params->{vendornumber});
 
   my $duedate =
-    ($form->{invdate})
-    ? "to_date(" . $dbh->quote($form->{invdate}) . ", '$dateformat')"
+    ($params->{invdate})
+    ? "to_date(" . $dbh->quote($params->{invdate}) . ", '$dateformat')"
     : "current_date";
 
   # get vendor
+  @values = ();
+  if ($vid) {
+    $where .= 'AND v.id = ?';
+    push @values, $vid;
+  }
+  if ($vnr) {
+    $where .= 'AND v.vendornumber = ?';
+    push @values, $vnr;
+  }
   my $query =
     qq|SELECT
-         v.name AS vendor, v.creditlimit, v.terms, v.notes AS intnotes,
+         v.id, v.name AS vendor, v.creditlimit, v.terms, v.notes AS intnotes,
          v.email, v.cc, v.bcc, v.language_id, v.payment_id,
          v.street, v.zipcode, v.city, v.country, v.taxzone_id,
          $duedate + COALESCE(pt.terms_netto, 0) AS duedate,
        FROM vendor v
        LEFT JOIN business b       ON (b.id = v.business_id)
        LEFT JOIN payment_terms pt ON (v.payment_id = pt.id)
-       WHERE v.id = ?|;
-  $ref = selectfirst_hashref_query($form, $dbh, $query, $vid);
-  map { $form->{$_} = $ref->{$_} } keys %$ref;
+       WHERE 1=1 $where|;
+  $ref = selectfirst_hashref_query($form, $dbh, $query, @values);
+  map { $params->{$_} = $ref->{$_} } keys %$ref;
 
-  $form->{creditremaining} = $form->{creditlimit};
+  $params->{creditremaining} = $params->{creditlimit};
 
   $query = qq|SELECT SUM(amount - paid) FROM ap WHERE vendor_id = ?|;
   my ($unpaid_invoices) = selectfirst_array_query($form, $dbh, $query, $vid);
-  $form->{creditremaining} -= $unpaid_invoices;
+  $params->{creditremaining} -= $unpaid_invoices;
 
   $query = qq|SELECT o.amount,
                 (SELECT e.sell
   my $sth = prepare_execute_query($form, $dbh, $query, $vid);
   while (my ($amount, $exch) = $sth->fetchrow_array()) {
     $exch = 1 unless $exch;
-    $form->{creditremaining} -= $amount * $exch;
+    $params->{creditremaining} -= $amount * $exch;
   }
   $sth->finish();
 
   # get shipto if we do not convert an order or invoice
-  if (!$form->{shipto}) {
-    delete @{$form}{qw(shiptoname shiptostreet shiptozipcode shiptocity shiptocountry shiptocontact shiptophone shiptofax shiptoemail)};
+  if (!$params->{shipto}) {
+    delete @{$params}{qw(shiptoname shiptostreet shiptozipcode shiptocity shiptocountry shiptocontact shiptophone shiptofax shiptoemail)};
 
     $query = qq|SELECT * FROM shipto WHERE (trans_id = ?) AND (module= 'CT')|;
     $ref = selectfirst_hashref_query($form, $dbh, $query, $vid);
-    @{$form}{keys %$ref} = @{$ref}{keys %$ref};
-    map { $form->{$_} = $ref->{$_} } keys %$ref;
+    @{$params}{keys %$ref} = @{$ref}{keys %$ref};
+    map { $params->{$_} = $ref->{$_} } keys %$ref;
   }
 
-  if (!$form->{id} && $form->{type} !~ /_(order|quotation)/) {
+  if (!$params->{id} && $params->{type} !~ /_(order|quotation)/) {
     # setup last accounts used
     $query =
       qq|SELECT c.id, c.accno, c.description, c.link, c.category
       if ($ref->{category} eq 'E') {
         $i++;
 
-        if ($form->{initial_transdate}) {
+        if ($params->{initial_transdate}) {
           my $tax_query = qq|SELECT tk.tax_id, t.rate FROM taxkeys tk
                              LEFT JOIN tax t ON (tk.tax_id = t.id)
                              WHERE (tk.chart_id = ?) AND (startdate <= ?)
                              ORDER BY tk.startdate DESC
                              LIMIT 1|;
-          my ($tax_id, $rate) = selectrow_query($form, $dbh, $tax_query, $ref->{id}, $form->{initial_transdate});
-          $form->{"taxchart_$i"} = "${tax_id}--${rate}";
+          my ($tax_id, $rate) = selectrow_query($form, $dbh, $tax_query, $ref->{id}, $params->{initial_transdate});
+          $params->{"taxchart_$i"} = "${tax_id}--${rate}";
         }
 
-        $form->{"AP_amount_$i"} = "$ref->{accno}--$tax_id";
+        $params->{"AP_amount_$i"} = "$ref->{accno}--$tax_id";
       }
 
       if ($ref->{category} eq 'L') {
-        $form->{APselected} = $form->{AP_1} = $ref->{accno};
+        $params->{APselected} = $params->{AP_1} = $ref->{accno};
       }
     }
-    $form->{rowcount} = $i if ($i && !$form->{type});
+    $params->{rowcount} = $i if ($i && !$params->{type});
   }
 
   $dbh->disconnect();
 
 
   for my $i (1 .. $form->{rowcount}) {
 
-    map({ $form->{"${_}_$i"} =
-            $form->parse_amount($myconfig, $form->{"${_}_$i"}) } qw(qty ship));
+    map({ $form->{"${_}_$i"} = $form->parse_amount($myconfig, $form->{"${_}_$i"}) } qw(qty ship));
 
     if ($form->{"id_$i"}) {
 
       my $basefactor = 1;
       if (defined($all_units->{$item_unit}->{factor}) &&
           (($all_units->{$item_unit}->{factor} * 1) != 0)) {
-        $basefactor = $all_units->{$form->{"unit_$i"}}->{factor} /
-          $all_units->{$item_unit}->{factor};
+        $basefactor = $all_units->{$form->{"unit_$i"}}->{factor} / $all_units->{$item_unit}->{factor};
       }
       my $baseqty = $form->{"qty_$i"} * $basefactor;
 
       $form->{"lastcost_$i"} = $form->{"lastcost_$i"} * 1;
 
       # set values to 0 if nothing entered
-      $form->{"discount_$i"} =
-        $form->parse_amount($myconfig, $form->{"discount_$i"}) / 100;
+      $form->{"discount_$i"} = $form->parse_amount($myconfig, $form->{"discount_$i"}) / 100;
 
-      $form->{"sellprice_$i"} =
-        $form->parse_amount($myconfig, $form->{"sellprice_$i"});
+      $form->{"sellprice_$i"} = $form->parse_amount($myconfig, $form->{"sellprice_$i"});
       $fxsellprice = $form->{"sellprice_$i"};
 
       my ($dec) = ($form->{"sellprice_$i"} =~ /\.(\d+)/);
       $dec = length($dec);
       my $decimalplaces = ($dec > 2) ? $dec : 2;
 
-      $discount =
-        $form->round_amount($form->{"sellprice_$i"} * $form->{"discount_$i"},
-                            $decimalplaces);
-      $form->{"sellprice_$i"} =
-        $form->round_amount($form->{"sellprice_$i"} - $discount,
-                            $decimalplaces);
+      $discount = $form->round_amount($form->{"sellprice_$i"} * $form->{"discount_$i"}, $decimalplaces);
+      $form->{"sellprice_$i"} = $form->round_amount($form->{"sellprice_$i"} - $discount, $decimalplaces);
 
       $form->{"inventory_accno_$i"} *= 1;
       $form->{"expense_accno_$i"}   *= 1;
       if ($form->round_amount($taxrate, 7) == 0) {
         if ($form->{taxincluded}) {
           foreach $item (@taxaccounts) {
-            $taxamount =
-              $form->round_amount($linetotal * $form->{"${item}_rate"} /
-                                    (1 + abs($form->{"${item}_rate"})),
-                                  2);
-
+            $taxamount = $form->round_amount($linetotal * $form->{"${item}_rate"} / (1 + abs($form->{"${item}_rate"})), 2);
             $taxaccounts{$item} += $taxamount;
             $taxdiff            += $taxamount;
-
-            $taxbase{$item} += $taxbase;
+            $taxbase{$item}     += $taxbase;
           }
           $taxaccounts{ $taxaccounts[0] } += $taxdiff;
         } else {
         }
       } else {
         foreach $item (@taxaccounts) {
-          $taxaccounts{$item} +=
-            $taxamount * $form->{"${item}_rate"} / $taxrate;
+          $taxaccounts{$item} += $taxamount * $form->{"${item}_rate"} / $taxrate;
           $taxbase{$item} += $taxbase;
         }
       }
 
       $netamount += $form->{"sellprice_$i"} * $form->{"qty_$i"} / $price_factor;
 
-      $reqdate =
-        ($form->{"reqdate_$i"}) ? $form->{"reqdate_$i"} : undef;
+      $reqdate = ($form->{"reqdate_$i"}) ? $form->{"reqdate_$i"} : undef;
 
       # get pricegroup_id and save ist
       ($null, my $pricegroup_id) = split(/--/, $form->{"sellprice_pg_$i"});
       }
       $query .= qq|?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
                    (SELECT factor FROM price_factors WHERE id = ?), ?)|;
-                 push(@values,
+        push(@values,
            conv_i($form->{id}), conv_i($form->{"id_$i"}),
            $form->{"description_$i"}, $form->{"longdescription_$i"},
            $form->{"qty_$i"}, $baseqty,
   if ($form->{currency} eq $form->{defaultcurrency}) {
     $form->{exchangerate} = 1;
   } else {
-    $exchangerate =
-      $form->check_exchangerate($myconfig,
-                                $form->{currency},
-                                $form->{transdate},
-                                ($form->{vc} eq 'customer') ? 'buy' : 'sell');
+    $exchangerate = $form->check_exchangerate($myconfig, $form->{currency}, $form->{transdate}, ($form->{vc} eq 'customer') ? 'buy' : 'sell');
   }
 
-  $form->{exchangerate} =
-    ($exchangerate)
-    ? $exchangerate
-    : $form->parse_amount($myconfig, $form->{exchangerate});
+  $form->{exchangerate} = ($exchangerate) ? $exchangerate : $form->parse_amount($myconfig, $form->{exchangerate});
 
   my $quotation = $form->{type} =~ /_order$/ ? 'f' : 't';
 
 
   if (($form->{currency} ne $form->{defaultcurrency}) && !$exchangerate) {
     if ($form->{vc} eq 'customer') {
-      $form->update_exchangerate($dbh, $form->{currency}, $form->{transdate},
-                                 $form->{exchangerate}, 0);
+      $form->update_exchangerate($dbh, $form->{currency}, $form->{transdate}, $form->{exchangerate}, 0);
     }
     if ($form->{vc} eq 'vendor') {
-      $form->update_exchangerate($dbh, $form->{currency}, $form->{transdate},
-                                 0, $form->{exchangerate});
+      $form->update_exchangerate($dbh, $form->{currency}, $form->{transdate}, 0, $form->{exchangerate});
     }
   }
 
     &adj_onhand($dbh, $form, $ml * -1);
   }
 
-  my $rc = $dbh->commit;
-  $dbh->disconnect;
-
   $form->{saved_xyznumber} = $form->{$form->{type} =~ /_quotation$/ ?
                                        "quonumber" : "ordnumber"};
 
   Common::webdav_folder($form) if ($main::webdav);
 
+  my $rc = $dbh->commit;
+  $dbh->disconnect;
+
   $main::lxdebug->leave_sub();
 
   return $rc;
     $sth->finish();
   }
 
-  $form->{"globalprojectnumber"} =
-    $projectnumbers{$form->{"globalproject_id"}};
+  $form->{"globalprojectnumber"} = $projectnumbers{$form->{"globalproject_id"}};
 
   my @arrays =
     qw(runningnumber number description longdescription qty ship unit bin
 
       if ($taxamount != 0) {
         foreach my $item (split / /, $form->{"taxaccounts_$i"}) {
-          $taxaccounts{$item} +=
-            $taxamount * $form->{"${item}_rate"} / $taxrate;
-          $taxbase{$item} += $taxbase;
+          $taxaccounts{$item} += $taxamount * $form->{"${item}_rate"} / $taxrate;
+          $taxbase{$item}     += $taxbase;
         }
       }
 
         # get parts and push them onto the stack
         my $sortorder = "";
         if ($form->{groupitems}) {
-          $sortorder =
-            qq|ORDER BY pg.partsgroup, a.$oid{$myconfig->{dbdriver}}|;
+          $sortorder = qq|ORDER BY pg.partsgroup, a.$oid{$myconfig->{dbdriver}}|;
         } else {
           $sortorder = qq|ORDER BY a.$oid{$myconfig->{dbdriver}}|;
         }
 
         while (my $ref = $sth->fetchrow_hashref(NAME_lc)) {
           if ($form->{groupitems} && $ref->{partsgroup} ne $sameitem) {
-            map({ push(@{ $form->{$_} }, "") }
-                grep({ $_ ne "description" } @arrays));
+            map({ push(@{ $form->{$_} }, "") } grep({ $_ ne "description" } @arrays));
             $sameitem = ($ref->{partsgroup}) ? $ref->{partsgroup} : "--";
             push(@{ $form->{description} }, $sameitem);
           }
 
-          push(@{ $form->{description} },
-               $form->format_amount($myconfig, $ref->{qty} * $form->{"qty_$i"}
-                 )
-                 . qq|, $ref->{partnumber}, $ref->{description}|);
-
-          map({ push(@{ $form->{$_} }, "") }
-              grep({ $_ ne "description" } @arrays));
+          push(@{ $form->{description} }, $form->format_amount($myconfig, $ref->{qty} * $form->{"qty_$i"}) . qq|, $ref->{partnumber}, $ref->{description}|); 
+          map({ push(@{ $form->{$_} }, "") } grep({ $_ ne "description" } @arrays));
         }
         $sth->finish;
       }
       my ($item_unit) = selectrow_query($form, $dbh, $query, $ref->{parts_id});
 
       my $basefactor = 1;
-      if (defined($all_units->{$item_unit}->{factor}) &&
-          (($all_units->{$item_unit}->{factor} * 1) != 0)) {
-        $basefactor = $all_units->{$ref->{unit}}->{factor} /
-          $all_units->{$item_unit}->{factor};
+      if (defined($all_units->{$item_unit}->{factor}) && (($all_units->{$item_unit}->{factor} * 1) != 0)) {
+        $basefactor = $all_units->{$ref->{unit}}->{factor} / $all_units->{$item_unit}->{factor};
       }
       my $baseqty = $ref->{ship} * $basefactor;
 
       # adjust onhand in parts table
-      $form->update_balance($dbh, "parts", "onhand",
-                            qq|id = $ref->{parts_id}|,
-                            $baseqty * $ml);
+      $form->update_balance($dbh, "parts", "onhand", qq|id = $ref->{parts_id}|, $baseqty * $ml);
     }
   }
 
 
 use SL::LXDebug;
 $lxdebug = LXDebug->new();
 
-use CGI;
+use CGI qw( -no_xhtml);
 use SL::Form;
 use SL::Locale;
 
 $form = new Form;
 $cgi = new CGI('');
 
+# this prevents most of the tabindexes being created by CGI.
+# note: most. popup menus and selecttables will still have tabindexes
+# use common.pl's NTI function to get rid of those
+local $CGI::TABINDEX = 0;
+
 # name of this script
 $0 =~ tr/\\/\//;
 $pos = rindex $0, '/';
 
 our ($form, $locale, %myconfig, $lxdebug);
 
 require "bin/mozilla/io.pl";
+require "bin/mozilla/invoice_io.pl";
 require "bin/mozilla/common.pl";
 require "bin/mozilla/reportgenerator.pl";
 
      |;
 
     #write Trigger
-    $jsscript =
-      Form->write_trigger(\%myconfig, "2", "transdatefrom", "BL", "trigger1",
-                          "transdateto", "BL", "trigger2");
+    $jsscript = Form->write_trigger(\%myconfig, "2", "transdatefrom", "BL", "trigger1", "transdateto", "BL", "trigger2");
   } else {
 
     # without JavaScript Calendar
-    $button1 = qq|
-                              <td><input name=transdatefrom id=transdatefrom size=11 title="$myconfig{dateformat}"></td>|;
-    $button2 = qq|
-                              <td><input name=transdateto id=transdateto size=11 title="$myconfig{dateformat}"></td>|;
+    $button1 = qq| <td><input name=transdatefrom id=transdatefrom size=11 title="$myconfig{dateformat}"></td>|;
+    $button2 = qq| <td><input name=transdateto id=transdateto size=11 title="$myconfig{dateformat}"></td>|;
   }
 
   unless ($form->{searchitems} eq 'service') {
 
-    $onhand = qq|
-            <input name=itemstatus class=radio type=radio value=onhand> |
-      . $locale->text('On Hand') . qq|
-            <input name=itemstatus class=radio type=radio value=short> |
-      . $locale->text('Short') . qq|
+    $onhand = qq| <input name=itemstatus class=radio type=radio value=onhand> | . $locale->text('On Hand') . qq|
+                  <input name=itemstatus class=radio type=radio value=short> | . $locale->text('Short') . qq|
 |;
 
     $makemodel = qq|
         <tr>
-          <th align=right nowrap>| . $locale->text('Make') . qq|</th>
-          <td><input name=make size=20></td>
-          <th align=right nowrap>| . $locale->text('Model') . qq|</th>
-          <td><input name=model size=20></td>
+          <th align=right nowrap>| . $locale->text('Make') . qq|</th> <td><input name=make size=20></td>
+          <th align=right nowrap>| . $locale->text('Model') . qq|</th> <td><input name=model size=20></td>
         </tr>
 |;
 
     $serialnumber = qq|
-          <th align=right nowrap>| . $locale->text('Serial Number') . qq|</th>
-          <td><input name=serialnumber size=20></td>
+          <th align=right nowrap>| . $locale->text('Serial Number') . qq|</th> <td><input name=serialnumber size=20></td>
 |;
 
     $l_serialnumber = qq|
-        <td><input name=l_serialnumber class=checkbox type=checkbox value=Y> |
-      . $locale->text('Serial Number') . qq|</td>
+        <td><input name=l_serialnumber class=checkbox type=checkbox value=Y> | . $locale->text('Serial Number') . qq|</td>
 |;
 
   }
 
 # Eintrag fuer Version 2.2.0 geaendert #
 # neue Optik im Rechnungsformular      #
 ########################################
-sub display_row {
-  $lxdebug->enter_sub();
-  my $numrows = shift;
-
-  my $is_sales =
-    (substr($form->{type}, 0, 6) eq "sales_")
-    || (($form->{type} eq "invoice") && ($form->{script} eq "is.pl"))
-    || ($form->{type} eq 'credit_note');
-
-  if ($lizenzen && $form->{vc} eq "customer") {
-    if ($form->{type} =~ /sales_order/) {
-      @column_index = (runningnumber, partnumber, description, ship, qty);
-    } elsif ($form->{type} =~ /sales_quotation/) {
-      @column_index = (runningnumber, partnumber, description, qty);
-    } else {
-      @column_index = (runningnumber, partnumber, description, qty);
-    }
-  } else {
-    if (   ($form->{type} =~ /purchase_order/)
-        || ($form->{type} =~ /sales_order/)) {
-      @column_index = (runningnumber, partnumber, description, ship, qty);
-        } else {
-      @column_index = (runningnumber, partnumber, description, qty);
-    }
-  }
-############## ENDE Neueintrag ##################
-
-  my $dimension_units = AM->retrieve_units(\%myconfig, $form, "dimension");
-  my $service_units = AM->retrieve_units(\%myconfig, $form, "service");
-  my $all_units = AM->retrieve_units(\%myconfig, $form);
-
-  my %price_factors = map { $_->{id} => $_->{factor} } @{ $form->{ALL_PRICE_FACTORS} };
-
-  push @column_index, qw(unit);
-
-  #for pricegroups column
-  if (   $form->{type} =~ (/sales_quotation/)
-      or (($form->{level} =~ /Sales/) and ($form->{type} =~ /invoice/))
-      or (($form->{level} eq undef) and ($form->{type} =~ /invoice/))
-      or ($form->{type} =~ /sales_order/)) {
-    push @column_index, qw(sellprice_pg);
-  }
-
-  push @column_index, qw(sellprice);
-
-  if ($form->{vc} eq 'customer') {
-    push @column_index, qw(discount);
-  }
-
-  push @column_index, "linetotal";
-
-  my $colspan = $#column_index + 1;
-
-  $form->{invsubtotal} = 0;
-  map { $form->{"${_}_base"} = 0 } (split(/ /, $form->{taxaccounts}));
-
-########################################
-  # Eintrag fuer Version 2.2.0 geaendert #
-  # neue Optik im Rechnungsformular      #
-########################################
-  $column_data{runningnumber} =
-      qq|<th align="left" nowrap width="5" class="listheading">|
-    . $locale->text('No.')
-    . qq|</th>|;
-  $column_data{partnumber} =
-      qq|<th align="left" nowrap width="12" class="listheading">|
-    . $locale->text('Number')
-    . qq|</th>|;
-  $column_data{description} =
-      qq|<th align="left" nowrap width="30" class="listheading">|
-    . $locale->text('Part Description')
-    . qq|</th>|;
-  if ($form->{"type"} eq "purchase_order") {
-    $column_data{ship} =
-      qq|<th align="left" nowrap width="5" class="listheading">|
-      . $locale->text('Ship rcvd')
-      . qq|</th>|;
-  } else {
-    $column_data{ship} =
-      qq|<th align="left" nowrap width="5" class="listheading">|
-      . $locale->text('Ship')
-      . qq|</th>|;
-  }
-  $column_data{qty} =
-      qq|<th align="left" nowrap width="5" class="listheading">|
-    . $locale->text('Qty')
-    . qq|</th>|;
-  $column_data{unit} =
-      qq|<th align="left" nowrap width="5" class="listheading">|
-    . $locale->text('Unit')
-    . qq|</th>|;
-  $column_data{license} =
-      qq|<th align="left" nowrap width="10" class="listheading">|
-    . $locale->text('License')
-    . qq|</th>|;
-  $column_data{serialnr} =
-      qq|<th align="left" nowrap width="10" class="listheading">|
-    . $locale->text('Serial No.')
-    . qq|</th>|;
-  $column_data{projectnr} =
-      qq|<th align="left" nowrap width="10" class="listheading">|
-    . $locale->text('Project')
-    . qq|</th>|;
-  $column_data{sellprice} =
-      qq|<th align="left" nowrap width="15" class="listheading">|
-    . $locale->text('Price')
-    . qq|</th>|;
-  $column_data{sellprice_pg} =
-      qq|<th align="left" nowrap width="15" class="listheading">|
-    . $locale->text('Pricegroup')
-    . qq|</th>|;
-  $column_data{discount} =
-      qq|<th align="left" class="listheading">|
-    . $locale->text('Discount')
-    . qq|</th>|;
-  $column_data{linetotal} =
-      qq|<th align="left" nowrap width="10" class="listheading">|
-    . $locale->text('Extended')
-    . qq|</th>|;
-  $column_data{bin} =
-      qq|<th align="left" nowrap width="10" class="listheading">|
-    . $locale->text('Bin')
-    . qq|</th>|;
-############## ENDE Neueintrag ##################
-
-  $myconfig{"show_form_details"} = 1
-    unless (defined($myconfig{"show_form_details"}));
-  $form->{"show_details"} = $myconfig{"show_form_details"}
-    unless (defined($form->{"show_details"}));
-  $form->{"show_details"} = $form->{"show_details"} ? 1 : 0;
-  my $show_details_new = 1 - $form->{"show_details"};
-  my $show_details_checked = $form->{"show_details"} ? "checked" : "";
-
-  print qq|
-  <tr>
-    <td>| . $cgi->hidden("-name" => "show_details", "-value" => $form->{show_details}) . qq|
-      <input type="checkbox" id="cb_show_details" onclick="show_form_details($show_details_new);" $show_details_checked>
-      <label for="cb_show_details">| . $locale->text("Show details") . qq|</label><br>
-      <table width="100%">
-       <tr class="listheading">|;
-
-  map { print "\n$column_data{$_}" } @column_index;
-
-  print qq|
-        </tr>
-|;
-
-  $runningnumber = $locale->text('No.');
-  $deliverydate  = $locale->text('Delivery Date');
-  $serialnumber  = $locale->text('Serial No.');
-  $projectnumber = $locale->text('Project');
-  $partsgroup    = $locale->text('Group');
-  $reqdate       = $locale->text('Reqdate');
-
-  $delvar = 'deliverydate';
-
-  if ($form->{type} =~ /_order$/ || $form->{type} =~ /_quotation$/) {
-    $deliverydate = $locale->text('Required by');
-    $delvar       = 'reqdate';
-  }
-
-  $form->{marge_total} = 0;
-  $form->{sellprice_total} = 0;
-  $form->{lastcost_total} = 0;
-  my %projectnumber_labels = ();
-  my @projectnumber_values = ("");
-  foreach my $item (@{ $form->{"ALL_PROJECTS"} }) {
-    push(@projectnumber_values, $item->{"id"});
-    $projectnumber_labels{$item->{"id"}} = $item->{"projectnumber"};
-  }
-
-  for $i (1 .. $numrows) {
-
-    # undo formatting
-    map {
-      $form->{"${_}_$i"} =
-        $form->parse_amount(\%myconfig, $form->{"${_}_$i"})
-    } qw(qty ship discount sellprice price_new price_old) unless ($form->{simple_save});
-
-    if (!$form->{"unit_old_$i"}) {
-      # Neue Ware aus der Datenbank. In diesem Fall ist unit_$i die
-      # Einheit, wie sie in den Stammdaten hinterlegt wurde.
-      # Es sollte also angenommen werden, dass diese ausgewaehlt war.
-      $form->{"unit_old_$i"} = $form->{"unit_$i"};
-    }
-
-    # Die zuletzt ausgewaehlte mit der aktuell ausgewaehlten Einheit
-    # vergleichen und bei Unterschied den Preis entsprechend umrechnen.
-    $form->{"selected_unit_$i"} = $form->{"unit_$i"} unless ($form->{"selected_unit_$i"});
-
-    my $check_units = $form->{"inventory_accno_$i"} ? $dimension_units : $service_units;
-    if (!$check_units->{$form->{"selected_unit_$i"}} ||
-        ($check_units->{$form->{"selected_unit_$i"}}->{"base_unit"} ne
-         $all_units->{$form->{"unit_old_$i"}}->{"base_unit"})) {
-      # Die ausgewaehlte Einheit ist fuer diesen Artikel nicht gueltig
-      # (z.B. Dimensionseinheit war ausgewaehlt, es handelt sich aber
-      # um eine Dienstleistung). Dann keinerlei Umrechnung vornehmen.
-      $form->{"unit_old_$i"} = $form->{"selected_unit_$i"} = $form->{"unit_$i"};
-    }
-    if ((!$form->{"prices_$i"}) || ($form->{"new_pricegroup_$i"} == $form->{"old_pricegroup_$i"})) {
-      if ($form->{"unit_old_$i"} ne $form->{"selected_unit_$i"}) {
-        my $basefactor = 1;
-        if (defined($all_units->{$form->{"unit_old_$i"}}->{"factor"}) &&
-            $all_units->{$form->{"unit_old_$i"}}->{"factor"}) {
-          $basefactor = $all_units->{$form->{"selected_unit_$i"}}->{"factor"} /
-            $all_units->{$form->{"unit_old_$i"}}->{"factor"};
-        }
-        $form->{"sellprice_$i"} *= $basefactor;
-        $form->{"unit_old_$i"} = $form->{"selected_unit_$i"};
-      }
-    }
-
-    ($dec) = ($form->{"sellprice_$i"} =~ /\.(\d+)/);
-    $decimalplaces = max length($dec), 2;
-
-    $price_factor = $price_factors{$form->{"price_factor_id_$i"}} || 1;
-    $discount     = (100 - $form->{"discount_$i"} * 1) / 100;
-
-    $linetotal    = $form->round_amount($form->{"sellprice_$i"} * $form->{"qty_$i"} * $discount / $price_factor, $decimalplaces);
-
-    my $real_sellprice = $form->{"sellprice_$i"} * $discount / $price_factor;
-
-    # marge calculations
-    my ($marge_font_start, $marge_font_end);
-
-    $form->{"lastcost_$i"} *= 1;
-
-    $marge_price_factor = $form->{"marge_price_factor_$i"} * 1 || 1;
-
-    if ($real_sellprice && ($form->{"qty_$i"} * 1)) {
-      $form->{"marge_percent_$i"}     = ($real_sellprice - $form->{"lastcost_$i"} / $marge_price_factor) * 100 / $real_sellprice;
-      $myconfig{"marge_percent_warn"} = 15 unless (defined($myconfig{"marge_percent_warn"}));
-
-      if ($form->{"id_$i"} &&
-          ($form->{"marge_percent_$i"} < (1 * $myconfig{"marge_percent_warn"}))) {
-        $marge_font_start = "<font color=\"#ff0000\">";
-        $marge_font_end   = "</font>";
-      }
-
-    } else {
-      $form->{"marge_percent_$i"} = 0;
-    }
-
-    my $marge_adjust_credit_note = $form->{type} eq 'credit_note' ? -1 : 1;
-    $form->{"marge_total_$i"}  = ($real_sellprice - $form->{"lastcost_$i"} / $marge_price_factor) * $form->{"qty_$i"} * $marge_adjust_credit_note;
-    $form->{"marge_total"}      += $form->{"marge_total_$i"};
-    $form->{"lastcost_total"}   += $form->{"lastcost_$i"} * $form->{"qty_$i"} / $marge_price_factor;
-    $form->{"sellprice_total"}  += $real_sellprice * $form->{"qty_$i"};
-
-    map { $form->{"${_}_$i"} = $form->format_amount(\%myconfig, $form->{"${_}_$i"}, 2) } qw(marge_total marge_percent);
-
-    # convert " to "
-    map { $form->{"${_}_$i"} =~ s/\"/"/g }
-      qw(partnumber description unit unit_old);
-
-########################################
-    # Eintrag fuer Version 2.2.0 geaendert #
-    # neue Optik im Rechnungsformular      #
-########################################
-    $column_data{runningnumber} =
-      qq|<td><input name="runningnumber_$i" size="5" value="$i"></td>|;    # HuT
-############## ENDE Neueintrag ##################
-
-    $column_data{partnumber} =
-      qq|<td><input name="partnumber_$i" size=12 value="$form->{"partnumber_$i"}"></td>|;
-
-    if (($rows = $form->numtextrows($form->{"description_$i"}, 30, 6)) > 1) {
-      $column_data{description} =
-        qq|<td><textarea name="description_$i" rows="$rows" cols="30" wrap="soft">| . H($form->{"description_$i"}) . qq|</textarea><button type="button" onclick="set_longdescription_window('longdescription_$i')">| . $locale->text('L') . qq|</button></td>|;
-    } else {
-      $column_data{description} =
-        qq|<td><input name="description_$i" size="30" value="| . $form->quote($form->{"description_$i"}) . qq|"><button type="button" onclick="set_longdescription_window('longdescription_$i')">| . $locale->text('L') . qq|</button></td>|;
-    }
-
-    (my $qty_dec) = ($form->{"qty_$i"} =~ /\.(\d+)/);
-    $qty_dec = length $qty_dec;
-
-    $column_data{qty} =
-        qq|<td align="right"><input name="qty_$i" size="5" value="|
-      . $form->format_amount(\%myconfig, $form->{"qty_$i"}, $qty_dec) .qq|">|;
-    if ($form->{"formel_$i"}) {
-      $column_data{qty} .= qq|<button type="button" onclick="calculate_qty_selection_window('qty_$i','alu_$i', 'formel_$i', $i)">| . $locale->text('*/') . qq|</button>|
-        . $cgi->hidden("-name" => "formel_$i", "-value" => $form->{"formel_$i"}) . $cgi->hidden("-name" => "alu_$i", "-value" => $form->{"alu_$i"});
-    }
-    $column_data{qty} .= qq|</td>|;
-    $column_data{ship} =
-        qq|<td align="right"><input name="ship_$i" size=5 value="|
-      . $form->format_amount(\%myconfig, $form->{"ship_$i"})
-      . qq|"></td>|;
-
-    my $is_part     = $form->{"inventory_accno_$i"};
-    my $is_assembly = $form->{"assembly_$i"};
-    my $is_assigned = $form->{"id_$i"};
-    my $this_unit = $form->{"unit_$i"};
-    if ($form->{"selected_unit_$i"} && $this_unit &&
-        $all_units->{$form->{"selected_unit_$i"}} && $all_units->{$this_unit} &&
-        ($all_units->{$form->{"selected_unit_$i"}}->{"base_unit"} eq $all_units->{$this_unit}->{"base_unit"})) {
-      $this_unit = $form->{"selected_unit_$i"};
-    } elsif (!$is_assigned ||
-             ($is_part && !$this_unit && ($all_units->{$this_unit} && ($all_units->{$this_unit}->{"base_unit"} eq $all_units->{"kg"}->{"base_unit"})))) {
-      $this_unit = "kg";
-    }
-
-    my $price_factor_select;
-    if (0 < scalar @{ $form->{ALL_PRICE_FACTORS} }) {
-      my @values = ('', map { $_->{id}                      } @{ $form->{ALL_PRICE_FACTORS} });
-      my %labels =      map { $_->{id} => $_->{description} } @{ $form->{ALL_PRICE_FACTORS} };
-
-      $price_factor_select =
-        NTI($cgi->popup_menu('-name'    => "price_factor_id_$i",
-                             '-default' => $form->{"price_factor_id_$i"},
-                             '-values'  => \@values,
-                             '-labels'  => \%labels,
-                             '-style'   => 'width:90px'))
-        . ' ';
-    }
-
-    $column_data{"unit"} = "<td>" .
-      $price_factor_select .
-       AM->unit_select_html($is_part || $is_assembly ? $dimension_units :
-                            $is_assigned ? $service_units : $all_units,
-                            "unit_$i", $this_unit,
-                            $is_assigned ? $form->{"unit_$i"} : undef)
-      . "</td>";
-
-    # build in drop down list for pricesgroups
-    if ($form->{"prices_$i"}) {
-      if  ($form->{"new_pricegroup_$i"} != $form->{"old_pricegroup_$i"}) {
-        $price_tmp = $form->format_amount(\%myconfig, $form->{"price_new_$i"}, $decimalplaces);
-      } else {
-        $price_tmp = $form->format_amount(\%myconfig, $form->{"sellprice_$i"}, $decimalplaces);
-      }
-
-      $column_data{sellprice_pg} =
-      qq|<td align="right"><select name="sellprice_pg_$i">$form->{"prices_$i"}</select></td>|;
-      $column_data{sellprice} =
-      qq|<td><input name="sellprice_$i" size="10" value="$price_tmp" onBlur=\"check_right_number_format(this)\"></td>|;
-    } else {
-
-      # for last row and report
-      # set pricegroup drop down list from report menu
-      if ($form->{"sellprice_$i"} != 0) {
-        $prices =
-          qq|<option value="$form->{"sellprice_$i"}--$form->{"pricegroup_id_$i"}" selected>$form->{"pricegroup_$i"}</option>\n|;
-
-        $form->{"pricegroup_old_$i"} = $form->{"pricegroup_id_$i"};
-
-        $column_data{sellprice_pg} =
-          qq|<td align="right"><select name="sellprice_pg_$i">$prices</select></td>|;
-
-      } else {
-
-        # for last row
-        $column_data{sellprice_pg} = qq|<td align="right"> </td>|;
-        }
-        
-      $column_data{sellprice} =
-      qq|<td><input name="sellprice_$i" size="10" onBlur=\"check_right_number_format(this)\" value="|
-        . $form->format_amount(\%myconfig, $form->{"sellprice_$i"},
-                               $decimalplaces)
-        . qq|"></td>|;
-    }
-    $column_data{discount} =
-        qq|<td align="right"><input name="discount_$i" size=3 value="|
-      . $form->format_amount(\%myconfig, $form->{"discount_$i"})
-      . qq|"></td>|;
-    $column_data{linetotal} =
-        qq|<td align="right">|
-      . $form->format_amount(\%myconfig, $linetotal, 2)
-      . qq|</td>|;
-    $column_data{bin} = qq|<td>$form->{"bin_$i"}</td>|;
-
-########################################
-    # Eintrag fuer Version 2.2.0 geaendert #
-    # neue Optik im Rechnungsformular      #
-########################################
-    #     if ($lizenzen &&  $form->{type} eq "invoice" &&  $form->{vc} eq "customer") {
-    #     $column_data{license} = qq|<td><select name="licensenumber_$i">$form->{"lizenzen_$i"}></select></td>|;
-    #     }
-    #
-    #     if ($form->{type} !~ /_quotation/) {
-    #     $column_data{serialnr} = qq|<td><input name="serialnumber_$i" size=10 value="$form->{"serialnumber_$i"}"></td>|;
-    #     }
-    #
-    #     $column_data{projectnr} = qq|<td><input name="projectnumber_$i" size=10 value="$form->{"projectnumber_$i"}"></td>|;
-############## ENDE Neueintrag ##################
-    my $j = $i % 2;
-    print qq|
-
-        <tr valign="top" class="listrow$j">|;
-
-    map { print "\n$column_data{$_}" } @column_index;
-
-    print("</tr>\n" .
-          $cgi->hidden("-name" => "unit_old_$i",
-                       "-value" => $form->{"selected_unit_$i"})
-          . "\n" .
-          $cgi->hidden("-name" => "price_new_$i",
-                       "-value" => $form->format_amount(\%myconfig, $form->{"price_new_$i"}))
-          . "\n");
-    map({ print($cgi->hidden("-name" => $_, "-value" => $form->{$_}) . "\n"); }
-        ("orderitems_id_$i", "bo_$i", "pricegroup_old_$i", "price_old_$i",
-         "id_$i", "inventory_accno_$i", "bin_$i", "partsgroup_$i", "partnotes_$i",
-         "income_accno_$i", "expense_accno_$i", "listprice_$i", "assembly_$i",
-         "taxaccounts_$i", "ordnumber_$i", "transdate_$i", "cusordnumber_$i",
-         "longdescription_$i", "basefactor_$i", "marge_total_$i", "marge_percent_$i", "lastcost_$i",
-         "marge_price_factor_$i"));
-
-########################################
-    # Eintrag fuer Version 2.2.0 geaendert #
-    # neue Optik im Rechnungsformular      #
-########################################
-
-    my $row_style_attr =
-      'style="display:none;"' if (!$form->{"show_details"});
-
-    # print second row
-    print qq|
-        <tr  class="listrow$j" $row_style_attr>
-         <td colspan="$colspan">
-|;
-    if ($lizenzen && $form->{type} eq "invoice" && $form->{vc} eq "customer") {
-      my $selected = $form->{"licensenumber_$i"};
-      my $lizenzen_quoted;
-      $form->{"lizenzen_$i"} =~ s/ selected//g;
-      $form->{"lizenzen_$i"} =~
-        s/value="${selected}"\>/value="${selected}" selected\>/;
-      $lizenzen_quoted = $form->{"lizenzen_$i"};
-      $lizenzen_quoted =~ s/\"/"/g;
-      print qq|
-       <b>Lizenz\#</b> <select name="licensenumber_$i" size="1">
-       $form->{"lizenzen_$i"}
-        </select>
-       <input type="hidden" name="lizenzen_$i" value="${lizenzen_quoted}">
-|;
-    }
-    if ($form->{type} !~ /_quotation/) {
-      print qq|
-          <b>$serialnumber</b> <input name="serialnumber_$i" size="15" value="$form->{"serialnumber_$i"}">|;
-    }
-
-    print qq|<b>$projectnumber</b> | .
-      NTI($cgi->popup_menu('-name' => "project_id_$i",
-                           '-values' => \@projectnumber_values,
-                           '-labels' => \%projectnumber_labels,
-                           '-default' => $form->{"project_id_$i"}));
-
-    if ($form->{type} eq 'invoice' or $form->{type} =~ /order/) {
-      my $reqdate_term =
-        ($form->{type} eq 'invoice')
-        ? 'deliverydate'
-        : 'reqdate';    # invoice uses a different term for the same thing.
-      print qq|
-        <b>${$reqdate_term}</b> <input name="${reqdate_term}_$i" size="11" onBlur="check_right_date_format(this)" value="$form->{"${reqdate_term}_$i"}">
-|;
-    }
-    my $subtotalchecked = ($form->{"subtotal_$i"}) ? "checked" : "";
-    print qq|
-          <b>|.$locale->text('Subtotal').qq|</b> <input type="checkbox" name="subtotal_$i" value="1" $subtotalchecked>
-|;
-
-    if ($form->{"id_$i"} && $is_sales) {
-      my $marge_price_factor;
-
-      $form->{"marge_price_factor_$i"} *= 1;
-
-      if ($form->{"marge_price_factor_$i"} && (1 != $form->{"marge_price_factor_$i"})) {
-        $marge_price_factor = '/' . $form->format_amount(\%myconfig, $form->{"marge_price_factor_$i"});
-      }
-
-      print qq|
-          ${marge_font_start}<b>| . $locale->text('Ertrag') . qq|</b> $form->{"marge_total_$i"} $form->{"marge_percent_$i"} % ${marge_font_end}|;
-   }
-   print qq|
-           <b>| . $locale->text('LP') . qq|</b> | . $form->format_amount(\%myconfig, $form->{"listprice_$i"}, 2) . qq|
-           <b>| . $locale->text('EK') . qq|</b> | . $form->format_amount(\%myconfig, $form->{"lastcost_$i"}, 2) . $marge_price_factor;
-
-
-    print qq|
-         </td>
-       </tr>
-|;
-
-############## ENDE Neueintrag ##################
-
-    map { $form->{"${_}_base"} += $linetotal }
-      (split(/ /, $form->{"taxaccounts_$i"}));
-
-    $form->{invsubtotal} += $linetotal;
-  }
-
-  print qq|
-      </table>
-    </td>
-  </tr>
-|;
-
-  if (0 != ($form->{sellprice_total} * 1)) {
-    $form->{marge_percent} = ($form->{sellprice_total} - $form->{lastcost_total}) / $form->{sellprice_total} * 100;
-  }
-
-  $lxdebug->leave_sub();
-}
 
 ##################################################
 # build html-code for pricegroups in variable $form->{prices_$j}
   $lxdebug->enter_sub();
   my $rowcount = shift;
   for $j (1 .. $rowcount) {
-    my $pricegroup_old = $form->{"pricegroup_old_$i"};
-    if ($form->{PRICES}{$j}) {
-      $len    = 0;
-      $prices = '<option value="--">' . $locale->text("none (pricegroup)") . '</option>';
-      $price  = 0;
-      foreach $item (@{ $form->{PRICES}{$j} }) {
-
-        #$price = $form->round_amount($myconfig,  $item->{price}, 5);
-        #$price = $form->format_amount($myconfig, $item->{price}, 2);
-        $price         = $item->{price};
-        $pricegroup_id = $item->{pricegroup_id};
-        $pricegroup    = $item->{pricegroup};
-
-        # build drop down list for pricegroups
-        $prices .=
-          qq|<option value="$price--$pricegroup_id"$item->{selected}>$pricegroup</option>\n|;
-
-        $len += 1;
-
-        #        map {
-        #               $form->{"${_}_$j"} =
-        #               $form->format_amount(\%myconfig, $form->{"${_}_$j"})
-        #              } qw(sellprice price_new price_old);
-
-        # set new selectedpricegroup_id and prices for "Preis"
-        if ($item->{selected} && ($pricegroup_id != 0)) {
-          $form->{"pricegroup_old_$j"} = $pricegroup_id;
-          $form->{"price_new_$j"}      = $price;
-          $form->{"sellprice_$j"}      = $price;
-        }
-        if ($pricegroup_id == 0) {
-          $form->{"price_new_$j"} = $form->{"sellprice_$j"};
-        }
-      }
-      $form->{"prices_$j"} = $prices;
+    next unless $form->{PRICES}{$j};
+    # build drop down list for pricegroups
+    my $option_tmpl = qq|<option value="%s--%s" %s>%s</option>|;
+    $form->{"prices_$j"}  = join '', map { sprintf $option_tmpl, @$_{qw(price pricegroup_id selected pricegroup)} } 
+                                         (+{ pricegroup => $locale->text("none (pricegroup)") }, @{ $form->{PRICES}{$j} });
+
+    foreach $item (@{ $form->{PRICES}{$j} }) {
+      # set new selectedpricegroup_id and prices for "Preis"
+      $form->{"pricegroup_old_$j"} = $item->{pricegroup_id}   if $item->{selected} &&  $item->{pricegroup_id};
+      $form->{"sellprice_$j"}      = $item->{price}           if $item->{selected} &&  $item->{pricegroup_id};
+      $form->{"price_new_$j"}      = $form->{"sellprice_$j"}  if $item->{selected} || !$item->{pricegroup_id};
     }
   }
   $lxdebug->leave_sub();
 
   # change callback
   $form->{old_callback} = $form->escape($form->{callback}, 1);
-  $form->{callback} = $form->escape("$form->{script}?action=display_form", 1);
-
-  # delete action
-  delete $form->{action};
-
-  # save all other form variables in a previousform variable
-  foreach $key (keys %$form) {
+  $form->{callback}     = $form->escape("$form->{script}?action=display_form", 1);
 
-    # escape ampersands
-    $form->{$key} =~ s/&/%26/g;
-    $previousform .= qq|$key=$form->{$key}&|;
-  }
-  chop $previousform;
-  $previousform = $form->escape($previousform, 1);
+  # save all form variables except action in a previousform variable
+  my $previousform = join '&', map { $form->{$_} =~ s/&/%26/; "$_=$form->{$_}" } grep { !/action/ } keys %$form;
 
-  $i = $form->{rowcount};
-  map { $form->{"${_}_$i"} =~ s/\"/"/g } qw(partnumber description);
+  map { $form->{"${_}_$form->{rowcount}"} =~ s/\"/"/g } qw(partnumber description);
 
   $form->header;
 
-  print qq|
-<body>
-
-<h4 class="error">| . $locale->text('Item not on file!') . qq|
-
-<p>
-| . $locale->text('What type of item is this?') . qq|</h4>
-
-<form method="post" action="ic.pl">
-
-<p>
-
-  <input class="radio" type="radio" name="item" value="part" checked> |
-    . $locale->text('Part') . qq|<br>
-  <input class="radio" type="radio" name="item" value="service"> |
-    . $locale->text('Service');
-
-  print $cgi->hidden("-name" => "previousform", "-value" => $previousform);
-  map { print $cgi->hidden("-name" => $_, "-value" => $form->{$_}); }        qw(rowcount vc login password);
-  map { print $cgi->hidden("-name" => $_, "-value" => $form->{"${_}_$i"}); } qw(partnumber description unit sellprice price_factor_id);
-  print $cgi->hidden("-name" => "taxaccount2", "-value" => $form->{taxaccounts});
-
-print qq|
-<input type="hidden" name="nextsub" value="add">
-
-<p>
-<input class="submit" type="submit" name="action" value="|
-    . $locale->text('Continue') . qq|">
-</form>
-
-</body>
-</html>
-|;
-
-  $lxdebug->leave_sub();
-}
-
-sub display_form {
-  $lxdebug->enter_sub();
-
-  relink_accounts();
-
-  my $new_rowcount = $form->{"rowcount"} * 1 + 1;
-  $form->{"project_id_${new_rowcount}"} = $form->{"globalproject_id"};
-
-  $form->language_payment(\%myconfig);
-
-  # if we have a display_form
-  if ($form->{display_form}) {
-    call_sub($form->{"display_form"});
-    exit;
-  }
-
-  Common::webdav_folder($form) if ($webdav);
-
-  #   if (   $form->{print_and_post}
-  #       && $form->{second_run}
-  #       && ($form->{action} eq "display_form")) {
-  #     for (keys %$form) { $old_form->{$_} = $form->{$_} }
-  #     $old_form->{rowcount}++;
-  #
-  #     #$form->{rowcount}--;
-  #     #$form->{rowcount}--;
-  #
-  #     $form->{print_and_post} = 0;
-  #
-  #     &print_form($old_form);
-  #     exit;
-  #   }
-  #
-  #   $form->{action}   = "";
-  #   $form->{resubmit} = 0;
-  #
-  #   if ($form->{print_and_post} && !$form->{second_run}) {
-  #     $form->{second_run} = 1;
-  #     $form->{action}     = "display_form";
-  #     $form->{rowcount}--;
-  #     my $rowcount = $form->{rowcount};
-  #
-  #     # get pricegroups for parts
-  #     IS->get_pricegroups_for_parts(\%myconfig, \%$form);
-  #
-  #     # build up html code for prices_$i
-  #     set_pricegroup($rowcount);
-  #
-  #     $form->{resubmit} = 1;
-  #
-  #   }
-  &form_header;
-
-  $numrows    = ++$form->{rowcount};
-  $subroutine = "display_row";
-
-  if ($form->{item} eq 'part') {
-
-    #set preisgruppenanzahl
-    $numrows    = $form->{price_rows};
-    $subroutine = "price_row";
-
-    &{$subroutine}($numrows);
-
-    $numrows    = ++$form->{makemodel_rows};
-    $subroutine = "makemodel_row";
-  }
-  if ($form->{item} eq 'assembly') {
-    $numrows    = $form->{price_rows};
-    $subroutine = "price_row";
-
-    &{$subroutine}($numrows);
-
-    $numrows    = ++$form->{makemodel_rows};
-    $subroutine = "makemodel_row";
-
-    # create makemodel rows
-    &{$subroutine}($numrows);
-
-    $numrows    = ++$form->{assembly_rows};
-    $subroutine = "assembly_row";
-  }
-  if ($form->{item} eq 'service') {
-    $numrows    = $form->{price_rows};
-    $subroutine = "price_row";
-
-    &{$subroutine}($numrows);
-
-    $numrows = 0;
-  }
-
-  # create rows
-  &{$subroutine}($numrows) if $numrows;
+  push @HIDDENS, { value => $cgi->hidden("-name" => "previousform", "-value" => $form->escape($previousform, 1)) };
+  push @HIDDENS, map +{ value => $cgi->hidden("-name" => $_, "-value" => $form->{$_}) },                       qw(rowcount vc login password);
+  push @HIDDENS, map +{ value => $cgi->hidden("-name" => $_, "-value" => $form->{"${_}_$form->{rowcount}"}) }, qw(partnumber description unit sellprice);
+  push @HIDDENS, { value => $cgi->hidden("-name" => "taxaccount2", "-value" => $form->{taxaccounts}) };
 
-  &form_footer;
+  print $form->parse_html_template("generic/new_item", { HIDDENS => \@HIDDENS} );
 
   $lxdebug->leave_sub();
 }
   # note: "||"-selection is only correct for values where "0" is _not_ a correct entry
   $form->{sendmode}   = "attachment";
   $form->{format}     = $form->{format} || $myconfig{template_format} || "pdf";
-  $form->{copies}     = $form->{copies} || $myconfig{copies} || 3;
-  $form->{media}      = $form->{media} || $myconfig{default_media} || "screen";
+  $form->{copies}     = $form->{copies} || $myconfig{copies}          || 3;
+  $form->{media}      = $form->{media}  || $myconfig{default_media}   || "screen";
   $form->{printer_id} = defined $form->{printer_id}           ? $form->{printer_id} :
                         defined $myconfig{default_printer_id} ? $myconfig{default_printer_id} : "";
 
 
   push @FORMNAME, grep $_,
     ($form->{type} eq 'purchase_order') ? (
-      opthash("purchase_order", $form->{PD}{purchase_order}, $locale->text('Purchase Order')),
-      opthash("bin_list", $form->{PD}{bin_list}, $locale->text('Bin List')) 
+      opthash("purchase_order",      $form->{PD}{purchase_order},      $locale->text('Purchase Order')),
+      opthash("bin_list",            $form->{PD}{bin_list},            $locale->text('Bin List')) 
     ) : undef,
     ($form->{type} eq 'credit_note') ?
-      opthash("credit_note", $form->{PD}{credit_note}, $locale->text('Credit Note')) : undef,
+      opthash("credit_note",         $form->{PD}{credit_note},         $locale->text('Credit Note')) : undef,
     ($form->{type} eq 'sales_order') ? (
-      opthash("sales_order", $form->{PD}{sales_order}, $locale->text('Confirmation')),
-      opthash("proforma", $form->{PD}{proforma}, $locale->text('Proforma Invoice')),
-      opthash("pick_list", $form->{PD}{pick_list}, $locale->text('Pick List')),
-      opthash("packing_list", $form->{PD}{packing_list}, $locale->text('Packing List')) 
+      opthash("sales_order",         $form->{PD}{sales_order},         $locale->text('Confirmation')),
+      opthash("proforma",            $form->{PD}{proforma},            $locale->text('Proforma Invoice')),
+      opthash("pick_list",           $form->{PD}{pick_list},           $locale->text('Pick List')),
+      opthash("packing_list",        $form->{PD}{packing_list},        $locale->text('Packing List')) 
     ) : undef,
     ($form->{type} =~ /_quotation$/) ?
-      opthash("$`_quotation", $form->{PD}{"$`_quotation"}, $locale->text('Quotation')) : undef,
+      opthash("$`_quotation",        $form->{PD}{"$`_quotation"},      $locale->text('Quotation')) : undef,
     ($form->{type} eq 'invoice') ? (
-      opthash("invoice", $form->{PD}{invoice}, $locale->text('Invoice')),
-      opthash("proforma", $form->{PD}{proforma}, $locale->text('Proforma Invoice')),
-      opthash("packing_list", $form->{PD}{packing_list}, $locale->text('Packing List'))
+      opthash("invoice",             $form->{PD}{invoice},             $locale->text('Invoice')),
+      opthash("proforma",            $form->{PD}{proforma},            $locale->text('Proforma Invoice')),
+      opthash("packing_list",        $form->{PD}{packing_list},        $locale->text('Packing List'))
     ) : undef,
     ($form->{type} eq 'invoice' && $form->{storno}) ? (
-      opthash("storno_invoice", $form->{PD}{storno_invoice}, $locale->text('Storno Invoice')),
+      opthash("storno_invoice",      $form->{PD}{storno_invoice},      $locale->text('Storno Invoice')),
       opthash("storno_packing_list", $form->{PD}{storno_packing_list}, $locale->text('Storno Packing List')) 
     ) : undef,
     ($form->{type} eq 'credit_note') ?
-      opthash("credit_note", $form->{PD}{credit_note}, $locale->text('Credit Note')) : undef;
+      opthash("credit_note",         $form->{PD}{credit_note},         $locale->text('Credit Note')) : undef;
 
   push @SENDMODE, 
-    opthash("attachment", $form->{SM}{attachment}, $locale->text('Attachment')),
-    opthash("inline", $form->{SM}{inline}, $locale->text('In-line'))
+    opthash("attachment",            $form->{SM}{attachment},          $locale->text('Attachment')),
+    opthash("inline",                $form->{SM}{inline},              $locale->text('In-line'))
       if ($form->{media} eq 'email');
 
   push @MEDIA, grep $_,
-      opthash("screen", $form->{OP}{screen}, $locale->text('Screen')),
+      opthash("screen",              $form->{OP}{screen},              $locale->text('Screen')),
     (scalar @{ $form->{printers} } && $latex_templates) ?
-      opthash("printer", $form->{OP}{printer}, $locale->text('Printer')) : undef,
-    ($latex_templates && !$options{no_queue}) ?
-      opthash("queue", $form->{OP}{queue}, $locale->text('Queue')) : undef
+      opthash("printer",             $form->{OP}{printer},             $locale->text('Printer')) : undef,
+    ($latex_templates && !$options->{no_queue}) ?
+      opthash("queue",               $form->{OP}{queue},               $locale->text('Queue')) : undef
         if ($form->{media} ne 'email');
 
   push @FORMAT, grep $_,
     ($opendocument_templates && $openofficeorg_writer_bin && $xvfb_bin && (-x $openofficeorg_writer_bin) && (-x $xvfb_bin)
-     && !$options{no_opendocument_pdf}) ?
-      opthash("opendocument_pdf", $form->{DF}{"opendocument_pdf"}, $locale->text("PDF (OpenDocument/OASIS)")) : undef,
+     && !$options->{no_opendocument_pdf}) ?
+      opthash("opendocument_pdf",    $form->{DF}{"opendocument_pdf"},  $locale->text("PDF (OpenDocument/OASIS)")) : undef,
     ($latex_templates) ?
-      opthash("pdf", $form->{DF}{pdf}, $locale->text('PDF')) : undef,
-    ($latex_templates && !$options{no_postscript}) ?
-      opthash("postscript", $form->{DF}{postscript}, $locale->text('Postscript')) : undef,
-    (!$options{no_html}) ?
+      opthash("pdf",                 $form->{DF}{pdf},                 $locale->text('PDF')) : undef,
+    ($latex_templates && !$options->{no_postscript}) ?
+      opthash("postscript",          $form->{DF}{postscript},          $locale->text('Postscript')) : undef,
+    (!$options->{no_html}) ?
       opthash("html", $form->{DF}{html}, "HTML") : undef,
-    ($opendocument_templates && !$options{no_opendocument}) ?
-      opthash("opendocument", $form->{DF}{opendocument}, $locale->text("OpenDocument/OASIS")) : undef;
+    ($opendocument_templates && !$options->{no_opendocument}) ?
+      opthash("opendocument",        $form->{DF}{opendocument},        $locale->text("OpenDocument/OASIS")) : undef;
 
   push @LANGUAGE_ID, 
     map { opthash($_->{id}, ($_->{id} eq $form->{language_id} ? 'selected' : ''), $_->{description}) } +{}, @{ $form->{languages} }
 
 use List::Util qw(max);
 
 require "bin/mozilla/io.pl";
+require "bin/mozilla/invoice_io.pl";
 require "bin/mozilla/arap.pl";
 require "bin/mozilla/common.pl";
 require "bin/mozilla/drafts.pl";
 
 use List::Util qw(max);
 
 require "bin/mozilla/io.pl";
+require "bin/mozilla/invoice_io.pl";
 require "bin/mozilla/arap.pl";
 require "bin/mozilla/drafts.pl";
 
 
-# #=====================================================================
+#=====================================================================
 # LX-Office ERP
 # Copyright (C) 2004
 # Based on SQL-Ledger Version 2.1.9
 use SL::IS;
 use SL::PE;
 use SL::ReportGenerator;
-use List::Util qw(max);
+use List::Util qw(max reduce);
 
 require "bin/mozilla/io.pl";
 require "bin/mozilla/arap.pl";
 sub order_links {
   $lxdebug->enter_sub();
   # get customer/vendor
-  $form->all_vc(\%myconfig, $form->{vc},
-                ($form->{vc} eq 'customer') ? "AR" : "AP");
+  $form->all_vc(\%myconfig, $form->{vc}, ($form->{vc} eq 'customer') ? "AR" : "AP");
 
   # retrieve order/quotation
   $form->{webdav}   = $webdav;
   }
   $form->{intnotes} = $intnotes if $intnotes;
   ($form->{ $form->{vc} }) = split /--/, $form->{ $form->{vc} };
-  $form->{"old$form->{vc}"} =
-    qq|$form->{$form->{vc}}--$form->{"$form->{vc}_id"}|;
+  $form->{"old$form->{vc}"} = qq|$form->{$form->{vc}}--$form->{"$form->{vc}_id"}|;
 
   # build the popup menus
   if (@{ $form->{"all_$form->{vc}"} }) {
     $form->{department}       = "$form->{department}--$form->{department_id}";
 
     map {
-      $form->{selectdepartment} .=
-        "<option>$_->{description}--$_->{id}</option>\n"
-    } (@{ $form->{all_departments} });
+      $form->{selectdepartment} .= "<option>$_->{description}--$_->{id}</option>\n"
+    } @{ $form->{all_departments} };
   }
 
   $form->{employee} = "$form->{employee}--$form->{employee_id}";
   my $i = 0;
   foreach $ref (@{ $form->{form_details} }) {
     $form->{rowcount} = ++$i;
-
     map { $form->{"${_}_$i"} = $ref->{$_} } keys %{$ref};
   }
   for my $i (1 .. $form->{rowcount}) {
-    if ($form->{id}) {
-      $form->{"discount_$i"} =
-        $form->format_amount(\%myconfig, $form->{"discount_$i"} * 100);
-    } else {
-      $form->{"discount_$i"} =
-        $form->format_amount(\%myconfig, $form->{"discount_$i"});
-    }
-    ($dec) = ($form->{"sellprice_$i"} =~ /\.(\d+)/);
-    $dec           = length $dec;
-    $decimalplaces = ($dec > 2) ? $dec : 2;
-
-    # copy reqdate from deliverydate for invoice -> order conversion
-    $form->{"reqdate_$i"} = $form->{"deliverydate_$i"}
-      unless $form->{"reqdate_$i"};
-
-    $form->{"sellprice_$i"} =
-      $form->format_amount(\%myconfig, $form->{"sellprice_$i"},
-                           $decimalplaces);
-
-    (my $dec_qty) = ($form->{"qty_$i"} =~ /\.(\d+)/);
-    $dec_qty = length $dec_qty;
-    $form->{"qty_$i"} =
-      $form->format_amount(\%myconfig, $form->{"qty_$i"}, $dec_qty);
-
-    map { $form->{"${_}_$i"} =~ s/\"/"/g }
-      qw(partnumber description unit);
+    $form->{"reqdate_$i"}   = $form->{"deliverydate_$i"} unless $form->{"reqdate_$i"};
+    $form->{"discount_$i"}  = $form->format_amount(\%myconfig, $form->{"discount_$i"} * ($form->{id} ? 100 : 1));
+    $form->{"sellprice_$i"} = $form->format_amount(\%myconfig, $form->{"sellprice_$i"});
+    $form->{"qty_$i"}       = $form->format_amount(\%myconfig, $form->{"qty_$i"});
+    map { $form->{"${_}_$i"} =~ s/\"/"/g } qw(partnumber description unit);
   }
 
   $lxdebug->leave_sub();
 
 sub form_header {
   $lxdebug->enter_sub();
-
-  my $checkedclosed    = $form->{"closed"}    ? "checked" : "";
-  my $checkeddelivered = $form->{"delivered"} ? "checked" : "";
+  my @custom_hiddens;
+  %TMPL_VAR = ();
 
   $form->{employee_id} = $form->{old_employee_id} if $form->{old_employee_id};
   $form->{salesman_id} = $form->{old_salesman_id} if $form->{old_salesman_id};
     qw(ordnumber quonumber shippingpoint shipvia notes intnotes shiptoname
        shiptostreet shiptozipcode shiptocity shiptocountry shiptocontact
        shiptophone shiptofax shiptodepartment_1 shiptodepartment_2);
-
+ 
   # use JavaScript Calendar or not
   $form->{jsscript} = 1;
-  $jsscript = "";
-
-  $button1 = qq|
+  $TMPL_VAR{button1} = qq|
      <td><input name=transdate id=transdate size=11 title="$myconfig{dateformat}" value="$form->{transdate}" onBlur=\"check_right_date_format(this)\">
-      <input type=button name=transdate id="trigger1" value=|
-    . $locale->text('button') . qq|></td>
+      <input type=button name=transdate id="trigger1" value=| . $locale->text('button') . qq|></td>
     |;
-  $button2 = qq|
+  $TMPL_VAR{button2} = qq|
      <td width="13"><input name=reqdate id=reqdate size=11 title="$myconfig{dateformat}" value="$form->{reqdate}" onBlur=\"check_right_date_format(this)\">
-      <input type=button name=reqdate name=reqdate id="trigger2" value=|
-    . $locale->text('button') . qq|></td>
+      <input type=button name=reqdate name=reqdate id="trigger2" value=| . $locale->text('button') . qq|></td>
    |;
-
   #write Trigger
-  $jsscript = Form->write_trigger(\%myconfig, "2", "transdate", "BL", "trigger1", "reqdate", "BL", "trigger2");
+  $TMPL_VAR{jsscript} = Form->write_trigger(\%myconfig, "2", "transdate", "BL", "trigger1", "reqdate", "BL", "trigger2");
 
+  # openclosed checkboxes
   my @tmp;
-
-  if (($form->{"type"} eq "sales_order") ||
-      ($form->{"type"} eq "purchase_order")) {
-    push(@tmp, qq|<input name="delivered" id="delivered" type="checkbox" class="checkbox" value="1" $checkeddelivered>
-                  <label for="delivered">| . $locale->text('Delivered') . qq|</label>|);
-  }
-
-  if ($form->{id}) {
-    push(@tmp, qq|<input name="closed" id="closed" type="checkbox" class="checkbox" value="1" $checkedclosed>
-                  <label for="closed">| . $locale->text('Closed') . qq|</label>|);
-  }
-
-  if (@tmp) {
-    $openclosed .= qq|<tr>
-                        <td colspan=| . (2 * scalar(@tmp)) . qq| align=center>| . join("\n", @tmp) . qq|
-                        </td>
-                      </tr>\n|;
-  }
+  push @tmp, sprintf qq|<input name="delivered" id="delivered" type="checkbox" class="checkbox" value="1" %s><label for="delivered">%s</label>|,
+                        $form->{"delivered"} ? "checked" : "",  $locale->text('Delivered') if $form->{"type"} =~ /_order$/;
+  push @tmp, sprintf qq|<input name="closed" id="closed" type="checkbox" class="checkbox" value="1" %s><label for="closed">%s</label>|,
+                        $form->{"closed"}    ? "checked" : "",  $locale->text('Closed')    if $form->{id};
+  $TMPL_VAR{openclosed} = sprintf qq|<tr><td colspan=%d align=center>%s</td></tr>\n|, 2 * scalar @tmp, join "\n", @tmp if @tmp;
 
   # set option selected
-  foreach $item ($form->{vc}, currency, department, ($form->{vc} eq "customer" ? customer : vendor)) {
+  foreach $item ($form->{vc}, 'currency', 'department', ($form->{vc} eq "customer" ? 'customer' : 'vendor')) {
     $form->{"select$item"} =~ s/ selected//;
     $form->{"select$item"} =~ s/option>\Q$form->{$item}\E/option selected>$form->{$item}/;
   }
   #substitute \n and \r to \s (bug 543)
   $form->{"select$form->{vc}"} =~ s/[\n\r]/ /g;
   
-  my @old_project_ids = ($form->{"globalproject_id"});
-  map({ push(@old_project_ids, $form->{"project_id_$_"})
-          if ($form->{"project_id_$_"}); } (1..$form->{"rowcount"}));
+  my @old_project_ids = ($form->{"globalproject_id"}, grep { $_ } map { $form->{"project_id_$_"} } 1..$form->{"rowcount"});
 
   my $vc = $form->{vc} eq "customer" ? "customers" : "vendors";
-  $form->get_lists("contacts"   => "ALL_CONTACTS",
-                   "shipto"     => "ALL_SHIPTO",
-                   "projects"   => {
-                     "key"      => "ALL_PROJECTS",
-                     "all"      => 0,
-                     "old_id"   => \@old_project_ids
-                   },
+  $form->get_lists("contacts"      => "ALL_CONTACTS",
+                   "shipto"        => "ALL_SHIPTO",
+                   "projects"      => { "key"      => "ALL_PROJECTS",
+                                        "all"      => 0,
+                                        "old_id"   => \@old_project_ids },
                    "employees"     => "ALL_EMPLOYEES",
                    "salesmen"      => "ALL_SALESMEN",
                    "taxzones"      => "ALL_TAXZONES",
                    "payments"      => "ALL_PAYMENTS",
                    "currencies"    => "ALL_CURRENCIES",
-                   $vc             => "ALL_" . uc($vc),
+                   $vc             => { key   => "ALL_" . uc($vc),
+                                        limit => $myconfig{vclimit} + 1 },
                    "price_factors" => "ALL_PRICE_FACTORS");
 
-  my %labels;
-  my @values = (undef);
-  foreach my $item (@{ $form->{"ALL_CONTACTS"} }) {
-    push(@values, $item->{"cp_id"});
-    $labels{$item->{"cp_id"}} = $item->{"cp_name"} . ($item->{"cp_abteilung"} ? " ($item->{cp_abteilung})" : "");
-  }
-
-  my $contact;
-  if (scalar @values > 1) {
-    $contact = qq|
-    <tr>
-      <th align="right">| . $locale->text('Contact Person') . qq|</th>
-      <td>| .
-      NTI($cgi->popup_menu('-name' => 'cp_id', '-values' => \@values, '-style' => 'width: 250px',
-                           '-labels' => \%labels, '-default' => $form->{"cp_id"}))
-      . qq|
-      </td>
-    </tr>|;
-  }
-
-  %labels = ();
-  @values = ();
-
-  foreach my $item (@{ $form->{($form->{vc} eq "customer" ? "ALL_CUSTOMERS" : "ALL_VENDORS")}}) {
-    push(@values, $item->{"name"}.qq|--|.$item->{"id"});
-    $labels{$item->{"name"}.qq|--|.$item->{"id"}} = $item->{name};
-  }
-
-  $vc = qq|
-      <input type="hidden" name="$form->{vc}_id" value="| . H($form->{"$form->{vc}_id"}) . qq|">
-      <input type="hidden" name="old$form->{vc}" value="| . H($form->{"old$form->{vc}"}) . qq|">
-      <th align="right">| . $locale->text(ucfirst($form->{vc})) . qq|</th>
-      <td>| . 
-        (($myconfig{vclimit} <=  scalar(@values)) 
-              ? qq|<input type="text" value="| . H(($form->{"old$form->{vc}"} =~ /^(.*)\-\-.*$/)) . qq|" name="$form->{vc}">| 
-              : (NTI($cgi->popup_menu('-name' => "$form->{vc}", '-default' => $form->{"old$form->{vc}"}, 
-                             '-onChange' => 'document.getElementById(\'update_button\').click();',
-                             '-values' => \@values, '-labels' => \%labels, '-style' => 'width: 250px')))) . qq|
-        <input type="button" value="?" onclick="show_vc_details('$form->{vc}')">
-      </td><input type=hidden name="select$form->{vc}" value="| .
-    Q($form->{"select$form->{vc}"}) . qq|">|;
-
-  if ($form->{vc} eq 'customer') {
-    $vc .= qq|<input type="hidden" name="customer_klass" value="$form->{customer_klass}">|;
-  }
-
-  %labels = ();
-  @values = ("");
-  foreach my $item (@{ $form->{"ALL_PAYMENTS"} }) {
-    push(@values, $item->{"id"});
-    $labels{$item->{"id"}} = $item->{"description"};
-  }
-  
-  $payments = qq|
-    <th align="right">| . $locale->text('Payment Terms') . qq|</th>
-    <td>| .
-    NTI($cgi->popup_menu('-name' => 'payment_id', '-values' => \@values, '-style' => 'width: 250px',
-                         '-labels' => \%labels, '-default' => $form->{payment_id}))
-    . qq|</td>|;
-
-  %labels = ();
-  @values = ("");
-  foreach my $item (@{ $form->{"ALL_SHIPTO"} }) {
-    push(@values, $item->{"shipto_id"});
-    $labels{$item->{"shipto_id"}} = join "; ", grep { $_ } map { $item->{"shipto${_}" } } qw(name department_1 street city);
-  }
-
-  my $shipto;
-  if (scalar @values > 1) {
-    $shipto = qq|
-    <tr>
-      <th align="right">| . $locale->text('Shipping Address') . qq|</th>
-      <td>| .
-      NTI($cgi->popup_menu('-name' => 'shipto_id', '-values' => \@values, '-style' => 'width: 250px',
-                           '-labels' => \%labels, '-default' => $form->{"shipto_id"}))
-    . qq|</td>|;
-  }
-
-  %labels = ();
-  @values = ("");
-  foreach my $item (@{ $form->{"ALL_PROJECTS"} }) {
-    push(@values, $item->{"id"});
-    $labels{$item->{"id"}} = $item->{"projectnumber"};
-  }
-  my $globalprojectnumber = NTI($cgi->popup_menu('-name' => 'globalproject_id', '-values' => \@values,
-                                                 '-labels' => \%labels,
-                                                 '-default' => $form->{"globalproject_id"}));
+  # contacts
+  @values = ("", map { $_->{cp_id} } @{ $form->{ALL_CONTACTS} });
+  %labels = map { $_->{cp_id} => $_->{"cp_name"} . ($_->{cp_abteilung} ? " ($_->{cp_abteilung})" : "") } @{ $form->{ALL_CONTACTS} };
+  $TMPL_VAR{contact} = NTI($cgi->popup_menu('-name' => 'cp_id', '-values' => \@values, '-style' => 'width: 250px',
+                                            '-labels' => \%labels, '-default' => $form->{"cp_id"})) if scalar @values > 1;
+
+  # vendor/customer
+  @values = map { "$_->{name}--$_->{id}" } @{ $form->{uc "all_$form->{vc}s" } };
+  %labels = map { +"$_->{name}--$_->{id}" => $_->{name} } @{ $form->{uc "all_$form->{vc}s" } };
+  push @custom_hiddens, "$form->{vc}_id";
+  push @custom_hiddens, "old$form->{vc}";
+  push @custom_hiddens, "select$form->{vc}";
+  $TMPL_VAR{vc} = sprintf qq|<th align="right">%s</th><td>%s<input type="button" value="?" onclick="show_vc_details('$form->{vc}')"></td>|,
+       $locale->text(ucfirst $form->{vc}), 
+       ($myconfig{vclimit} <=  scalar(@values)) 
+        ? $cgi->textfield(-value => H($form->{"old$form->{vc}"} =~ /^(.*)\-\-.*$/), -name => $form->{vc}) 
+        : NTI($cgi->popup_menu('-name' => "$form->{vc}", '-default' => $form->{"old$form->{vc}"}, 
+                               '-onChange' => 'document.getElementById(\'update_button\').click();',
+                               '-values' => \@values, '-labels' => \%labels, '-style' => 'width: 250px'));
+
+  # payments (for footer)
+  @values = ("", map { $_->{id} } @{ $form->{ALL_PAYMENTS} });
+  %labels = map { $_->{id} => $_->{description} } @{ $form->{ALL_PAYMENTS} };
+  $TMPL_VAR{payments} = NTI($cgi->popup_menu('-name' => 'payment_id', '-values' => \@values, '-style' => 'width: 250px',
+                                             '-labels' => \%labels, '-default' => $form->{payment_id}));
+
+  # shipto
+  @values = ("", map { $_->{shipto_id} } @{ $form->{ALL_SHIPTO} });
+  %labels = map { my $item=$_; $_->{shipto_id} => join "; ", grep { $_ } map { $item->{"shipto${_}" } } qw(name department_1 street city) } @{ $form->{ALL_SHIPTO} };
+  $TMPL_VAR{shipto} = NTI($cgi->popup_menu('-name' => 'shipto_id', '-values' => \@values, '-style' => 'width: 250px',
+                                           '-labels' => \%labels, '-default' => $form->{"shipto_id"})) if scalar @values > 1;
+
+  # projects
+  @values = ("", map { $_->{id} } @{ $form->{ALL_PROJECTS} });
+  %labels = map { $_->{id} => $_->{projectnumber} } @{ $form->{ALL_PROJECTS} };
+  $TMPL_VAR{globalprojectnumber} = NTI($cgi->popup_menu('-name' => 'globalproject_id', '-values' => \@values,
+                                                        '-labels' => \%labels, '-default' => $form->{"globalproject_id"}));
   
-  my $salesmen = "";
-  %labels = ();
-  @values = ();
-  if ($form->{type} =~ /^sales_/) {
-    foreach my $item (@{ $form->{"ALL_SALESMEN"} }) {
-      push(@values, $item->{"id"});
-      $labels{$item->{"id"}} = ($item->{"name"} ne "" ? $item->{"name"} : $item->{"login"});
-    }
-    $salesmen =
-      qq|<tr>
-          <th align="right">| . $locale->text('Salesman') . qq|</th>
-          <td>| .
-      NTI($cgi->popup_menu('-name' => 'salesman_id', '-default' => $form->{"salesman_id"} ? $form->{"salesman_id"} : $form->{"employee_id"},
-                           '-values' => \@values, '-labels' => \%labels))
-      . qq|</td>
-         </tr>|;
-  }
-
-  %labels = ();
-  @values = ();
-  foreach my $item (@{ $form->{"ALL_EMPLOYEES"} }) {
-    push(@values, $item->{"id"});
-    $labels{$item->{"id"}} = $item->{"name"} ne "" ? $item->{"name"} : $item->{"login"};
-  }
-
-  my $employee = qq|
-    <tr>
-      <th align="right">| . $locale->text('Employee') . qq|</th>
-      <td>| .
-        NTI($cgi->popup_menu('-name' => 'employee_id', '-default' => $form->{"employee_id"},
-                             '-values' => \@values, '-labels' => \%labels)) . qq|
-      </td>
-    </tr>|;
-
-  %labels = ();
-  @values = ();
-  foreach my $item (@{ $form->{"ALL_TAXZONES"} }) {
-    push(@values, $item->{"id"});
-    $labels{$item->{"id"}} = $item->{"description"};
-  }
-
-  $taxzone = qq|
-    <tr>
-      <th align="right">| . $locale->text('Steuersatz') . qq|</th>
-      <td>| .
-        NTI($cgi->popup_menu('-name' => 'taxzone_id', '-default' => $form->{"taxzone_id"},
-                             '-values' => \@values, '-labels' => \%labels, '-style' => 'width: 250px')) . qq|
-      </td>
-    </tr>|;
-
-  %labels = ();
-  @values = ();
-  my $i = 0;
-  foreach my $item (@{ $form->{"ALL_CURRENCIES"} }) {
-    push(@values, $item);
-    $labels{$item} = $item;
-  }
-
-  $form->{currency} = $form->{defaultcurrency} unless $form->{currency};
-  my $currencies;
-  if (scalar @values) {
-    $currencies = qq|
-    <tr>
-      <th align="right">| . $locale->text('Currency') . qq|</th>
-      <td>| .
-        NTI($cgi->popup_menu('-name' => 'currency', '-default' => $form->{"currency"},
-                             '-values' => \@values, '-labels' => \%labels)) . qq|
-      </td>
-    </tr>|;
-  }
-
-  $form->{exchangerate} = $form->format_amount(\%myconfig, $form->{exchangerate});
-  $form->{exchangerate} = "" unless $form->{exchangerate};
-
+  # salesmen
+  @values = map { $_->{id} } @{ $form->{ALL_SALESMEN} };
+  %labels = map { $_->{id} => ($_->{name} || $_->{login}) } @{ $form->{ALL_SALESMEN} };
+  $TMPL_VAR{salesmen} = NTI($cgi->popup_menu('-name' => 'salesman_id', '-default' => $form->{"salesman_id"} ? $form->{"salesman_id"} : $form->{"employee_id"},
+                                             '-values' => \@values, '-labels' => \%labels)) if $form->{type} =~ /^sales_/ && scalar @values;
+
+  # employees
+  @values = map { $_->{id} } @{ $form->{ALL_EMPLOYEES} };
+  %labels = map { $_->{id} => $_->{name} || $_->{login} } @{ $form->{ALL_EMPLOYEES} };
+  $TMPL_VAR{employee} = NTI($cgi->popup_menu('-name' => 'employee_id', '-default' => $form->{"employee_id"},
+                                             '-values' => \@values, '-labels' => \%labels));
+
+  # taxzone
+  @values = map { $_->{id} } @{ $form->{ALL_TAXZONES} };
+  %labels = map { $_->{id} => $_->{description} } @{ $form->{ALL_TAXZONES} };
+  $TMPL_VAR{taxzone} = NTI($cgi->popup_menu('-name' => 'taxzone_id', '-default' => $form->{"taxzone_id"},
+                                            '-values' => \@values, '-labels' => \%labels, '-style' => 'width: 250px'));
+
+  # currencies and exchangerate
+  @values = map { $_ } @{ $form->{ALL_CURRENCIES} };
+  %labels = map { $_ => $_ } @{ $form->{ALL_CURRENCIES} };
+  $form->{currency}            = $form->{defaultcurrency} unless $form->{currency};
+  $TMPL_VAR{show_exchangerate} = $form->{currency} ne $form->{defaultcurrency} && $form->{exchangerate};
+  $TMPL_VAR{currencies}        = NTI($cgi->popup_menu('-name' => 'currency', '-default' => $form->{"currency"},
+                                                      '-values' => \@values, '-labels' => \%labels)) if scalar @values;
+  push @custom_hiddens, "forex";
+  push @custom_hiddens, "exchangerate" if $form->{forex};
+
+  # credit remaining
   $creditwarning = (($form->{creditlimit} != 0) && ($form->{creditremaining} < 0) && !$form->{update}) ? 1 : 0;
+  $TMPL_VAR{is_credit_remaining_negativ} = ($form->{creditremaining} =~ /-/) ? "0" : "1";
+  
+  # business
+  $TMPL_VAR{business_label} = ($form->{vc} eq "customer" ? $locale->text('Customer type') : $locale->text('Vendor type'));
 
-  $form->{creditlimit}     = $form->format_amount(\%myconfig, $form->{creditlimit}, 0, "0");
-  $form->{creditremaining} = $form->format_amount(\%myconfig, $form->{creditremaining}, 0, "0");
-
-  $exchangerate = qq|\n<input type=hidden name=forex value=$form->{forex}>\n|;
-
-  if ($form->{currency} ne $form->{defaultcurrency}) {
-    if ($form->{forex}) {
-      $exchangerate .=
-          qq|<th align=right>| . $locale->text('Exchangerate')
-        . qq|</th><td>$form->{exchangerate}</td>
-      <input type=hidden name=exchangerate value=$form->{exchangerate}>
-|;
-    } else {
-      $exchangerate .=
-          qq|<th align=right>| . $locale->text('Exchangerate')
-        . qq|</th><td><input name=exchangerate size=10 value=$form->{exchangerate}></td>|;
-    }
-  }
-
-  if ($form->{business}) {
-    $business = qq|
-             <tr>
-          <th align="right">| . ($form->{vc} eq "customer" ? $locale->text('Customer type') : $locale->text('Vendor type')) . qq|</th>
-          <td>$form->{business}; | . $locale->text('Trade Discount') . qq| |
-      . $form->format_amount(\%myconfig, $form->{tradediscount} * 100)
-      . qq| %</td>
-        </tr>
-|;
-  }
-
-  if ($form->{max_dunning_level}) {
-    $dunning = qq|
-      <tr>
-        <th align="right">| . $locale->text('Max. Dunning Level') . qq|:</th>
-        <td>
-          <b>$form->{max_dunning_level}</b>;
-          | . $locale->text('Dunning Amount') . qq|: <b>|
-        . $form->format_amount(\%myconfig, $form->{dunning_amount},2)
-        . qq|</b>
-        </td>
-      </tr>
-|;
-  }
-
-  if ($form->{type} !~ /_quotation$/) {
-    $ordnumber = qq|
-             <tr>
-               <th width=70% align=right nowrap>| . $locale->text('Order Number') . qq|</th>
-                <td><input name=ordnumber size=11 value="$form->{ordnumber}"></td>
-             </tr>
-             <tr>
-               <th width=70% align=right nowrap>|
-      . $locale->text('Quotation Number') . qq|</th>
-                <td><input name=quonumber size=11 value="$form->{quonumber}"></td>
-             </tr>
-              <tr>
-               <th width=70% align=right nowrap>|
-      . $locale->text('Customer Order Number') . qq|</th>
-                <td><input name=cusordnumber size=11 value="$form->{cusordnumber}"></td>
-             </tr>
-             <tr>
-               <th align=right nowrap>| . $locale->text('Order Date') . qq|</th>
-                $button1
-
-             </tr>
-             <tr>
-               <th align=right nowrap=true>| . $locale->text('Required by') . qq|</th>
-                $button2
-             </tr>
-|;
-
-    $n = ($form->{creditremaining} =~ /-/) ? "0" : "1";
-
-    $creditremaining = qq|
-        $shipto
-        <tr>
-          <td align="right">| . $locale->text('Credit Limit') . qq|</td>
-          <td>$form->{creditlimit}; | . $locale->text('Remaining') . qq| <span class="plus$n">$form->{creditremaining}</span></td>
-        </tr>
-             </tr>
-|;
-  } else {
-    $reqlabel = ($form->{type} eq 'sales_quotation') ? $locale->text('Valid until') : $locale->text('Required by');
-    if ($form->{type} eq 'sales_quotation') {
-      $ordnumber = qq|
-             <tr>
-               <th width=70% align=right nowrap>|
-        . $locale->text('Quotation Number') . qq|</th>
-               <td><input name=quonumber size=11 value="$form->{quonumber}"></td>
-               <input type=hidden name=ordnumber value="$form->{ordnumber}">
-             </tr>
-|;
-    } else {
-      $ordnumber = qq|
-             <tr>
-               <th width=70% align=right nowrap>| . $locale->text('RFQ Number') . qq|</th>
-               <td><input name=quonumber size=11 value="$form->{quonumber}"></td>
-               <input type=hidden name=ordnumber value="$form->{ordnumber}">
-             </tr>
-|;
-
-    }
-
-    $ordnumber      .= qq| <tr> <th align=right nowrap>| . $locale->text('Quotation Date') . qq|</th> $button1 </tr>
-                           <tr> <th align=right nowrap=true>$reqlabel</th> $button2 </tr>\n|;
-    $creditremaining = qq| <tr> <td colspan=4></td> $shipto </tr>|;
-  }
-
-  $department = qq|
-              <tr>
-               <th align="right" nowrap>| . $locale->text('Department') . qq|</th>
-               <td colspan=3><select name=department style="width: 250px">$form->{selectdepartment}</select>
-               <input type=hidden name=selectdepartment value="$form->{selectdepartment}">
-               </td>
-             </tr> | if $form->{selectdepartment};
+  push @custom_hiddens, "ordnumber"      if $form->{type} =~ /_quotation$/;
+  push @custom_hiddens, "customer_klass" if $form->{vc} eq 'customer';
 
   $credittext = $locale->text('Credit Limit exceeded!!!');
 
 
   $onload .= qq|;setupDateFormat('|. $myconfig{dateformat} .qq|', '|. $locale->text("Falsches Datumsformat!") .qq|')|;
   $onload .= qq|;setupPoints('|.   $myconfig{numberformat} .qq|', '|. $locale->text("wrongformat") .qq|')|;
+  $TMPL_VAR{onload} = $onload;
   
   $form->{javascript} .= qq|<script type="text/javascript" src="js/show_form_details.js"></script>|;
   $form->{javascript} .= qq|<script type="text/javascript" src="js/show_history.js"></script>|;
 
   $form->header;
 
-  print qq|
-<body onLoad="$onload">
-
-<form method=post name=oe action=$form->{script}>
-
- <script type="text/javascript" src="js/common.js"></script>
- <script type="text/javascript" src="js/delivery_customer_selection.js"></script>
- <script type="text/javascript" src="js/vendor_selection.js"></script>
- <script type="text/javascript" src="js/calculate_qty.js"></script>
-|;
-
-  $form->hide_form(qw(id action type vc formname media format proforma queued printed emailed
-                      title discount creditlimit creditremaining tradediscount business
-                      max_dunning_level dunning_amount shiptoname shiptostreet shiptozipcode
-                      shiptocity shiptocountry shiptocontact shiptophone shiptofax 
-                      shiptodepartment_1 shiptodepartment_2 shiptoemail 
-                      message email subject cc bcc taxpart taxservice taxaccounts), 
-                      map { $_.'_rate', $_.'_description' } split / /, $form->{taxaccounts} );
-  print qq|
-
-<table width=100%>
-  <tr class=listtop>
-    <th class=listtop>$form->{title}</th>
-  </tr>
-  <tr height="5"></tr>
-  <tr>
-    <td>
-      <table width="100%">
-        <tr valign=top>
-         <td>
-           <table width=100%>
-             <tr>
-        $vc
-        $contact
-             $creditremaining
-             $business
-              $dunning
-              $taxzone
-             $department
-             <tr>
-               $currencies
-               $exchangerate
-             </tr>
-             <tr>
-               <th align=right>| . $locale->text('Shipping Point') . qq|</th>
-               <td colspan=3><input name=shippingpoint size=35 value="$form->{shippingpoint}"></td>
-             </tr>
-             <tr>
-               <th align=right>| . $locale->text('Ship via') . qq|</th>
-               <td colspan=3><input name=shipvia size=35 value="$form->{shipvia}"></td>
-             </tr>
-              <tr>
-                <th align="right">| . $locale->text('Transaction description') . qq|</th>
-                <td colspan="3"><input name="transaction_description" size="35" value="| . H($form->{transaction_description}) . qq|"></td>
-              </tr>|;
-#              <tr>
-#                 <td colspan=4>
-#                   <table>
-#                     <tr>
-#                       <td colspan=2>
-#                         <button type="button" onclick="delivery_customer_selection_window('delivery_customer_string','delivery_customer_id')">| . $locale->text('Choose Customer') . qq|</button>
-#                       </td>
-#                       <td colspan=2><input type=hidden name=delivery_customer_id value="$form->{delivery_customer_id}">
-#                       <input size=45 id=delivery_customer_string name=delivery_customer_string value="$form->{delivery_customer_string}"></td>
-#                     </tr>
-#                     <tr>
-#                       <td colspan=2>
-#                         <button type="button" onclick="vendor_selection_window('delivery_vendor_string','delivery_vendor_id')">| . $locale->text('Choose Vendor') . qq|</button>
-#                       </td>
-#                       <td colspan=2><input type=hidden name=delivery_vendor_id value="$form->{delivery_vendor_id}">
-#                       <input size=45 id=vendor_string name=delivery_vendor_string value="$form->{delivery_vendor_string}"></td>
-#                     </tr>
-#                   </table>
-#                 </td>
-#               </tr>
-print qq|          </table>
-         </td>
-         <td align=right>
-           <table>
-             $openclosed
-             $employee
-        $salesmen
-             $ordnumber
-             <tr>
-          <th width="70%" align="right" nowrap>| . $locale->text('Project Number') . qq|</th>
-          <td>$globalprojectnumber</td>
-             </tr>
-           </table>
-         </td>
-       </tr>
-      </table>
-    </td>
-  </tr>
-
-$jsscript
+  $TMPL_VAR{HIDDENS} = [ map { name => $_, value => $form->{$_} },
+     qw(id action type vc formname media format proforma queued printed emailed
+        title creditlimit creditremaining tradediscount business
+        max_dunning_level dunning_amount shiptoname shiptostreet shiptozipcode
+        shiptocity shiptocountry shiptocontact shiptophone shiptofax
+        shiptodepartment_1 shiptodepartment_2 shiptoemail
+        message email subject cc bcc taxpart taxservice taxaccounts),
+        @custom_hiddens,
+        map { $_.'_rate', $_.'_description' } split / /, $form->{taxaccounts} ];  # deleted: discount
+
+  %TMPL_VAR = (
+     %TMPL_VAR,
+     is_sales        => scalar ($form->{type} =~ /^sales_/),              # these vars are exported, so that the template
+     is_order        => scalar ($form->{type} =~ /_order$/),              # may determine what to show
+     is_sales_quo    => scalar ($form->{type} =~ /sales_quotation$/),
+     is_req_quo      => scalar ($form->{type} =~ /request_quotation$/),
+     is_sales_ord    => scalar ($form->{type} =~ /sales_order$/),
+     is_pur_ord      => scalar ($form->{type} =~ /purchase_order$/),
+  );
 
-|;
+  print $form->parse_html_template2("oe/orders_header", { %TMPL_VAR });
 
   $lxdebug->leave_sub();
 }
 
   $form->{invtotal} = $form->{invsubtotal};
 
-  if (($rows = $form->numtextrows($form->{notes}, 25, 8)) < 2) {
-    $rows = 2;
-  }
-  if (($introws = $form->numtextrows($form->{intnotes}, 35, 8)) < 2) {
-    $introws = 2;
-  }
-  $rows = ($rows > $introws) ? $rows : $introws;
-  $notes =
-    qq|<textarea name=notes rows=$rows cols=25 wrap=soft>$form->{notes}</textarea>|;
-  $intnotes =
-    qq|<textarea name=intnotes rows=$rows cols=35 wrap=soft>$form->{intnotes}</textarea>|;
-
-  $form->{taxincluded} = ($form->{taxincluded}) ? "checked" : "";
+  $rows    = max 2, $form->numtextrows($form->{notes}, 25, 8);
+  $introws = max 2, $form->numtextrows($form->{intnotes}, 35, 8);
+  $rows    = max $rows, $introws;
 
-  $taxincluded = "";
-  if ($form->{taxaccounts}) {
-    $taxincluded = qq|
-             <input name=taxincluded class=checkbox type=checkbox value=1 $form->{taxincluded}> <b>|
-      . $locale->text('Tax Included') . qq|</b><br><br>
-|;
-  }
+  $TMPL_VAR{notes} = qq|<textarea name=notes rows=$rows cols=25 wrap=soft>$form->{notes}</textarea>|;
+  $TMPL_VAR{intnotes} = qq|<textarea name=intnotes rows=$rows cols=35 wrap=soft>$form->{intnotes}</textarea>|;
 
   if (!$form->{taxincluded}) {
 
     foreach $item (split / /, $form->{taxaccounts}) {
       if ($form->{"${item}_base"}) {
-        $form->{invtotal} += $form->{"${item}_total"} =
-          $form->round_amount(
-                             $form->{"${item}_base"} * $form->{"${item}_rate"},
-                             2);
-        $form->{"${item}_total"} =
-          $form->format_amount(\%myconfig, $form->{"${item}_total"}, 2);
-
-        $tax .= qq|
+        $form->{invtotal} += $form->{"${item}_total"} = $form->round_amount( $form->{"${item}_base"} * $form->{"${item}_rate"}, 2);
+        $form->{"${item}_total"} = $form->format_amount(\%myconfig, $form->{"${item}_total"}, 2);
+
+        $TMPL_VAR{tax} .= qq|
              <tr>
-               <th align=right>$form->{"${item}_description"} |
-                                   . $form->{"${item}_rate"} * 100 .qq|%</th>
+               <th align=right>$form->{"${item}_description"} | . $form->{"${item}_rate"} * 100 .qq|%</th>
                <td align=right>$form->{"${item}_total"}</td>
-             </tr>
-|;
+             </tr> |;
       }
     }
 
-    $form->{invsubtotal} =
-      $form->format_amount(\%myconfig, $form->{invsubtotal}, 2, 0);
-
-    $subtotal = qq|
-             <tr>
-               <th align=right>| . $locale->text('Subtotal') . qq|</th>
-               <td align=right>$form->{invsubtotal}</td>
-             </tr>
-|;
-
-  }
+    $form->{invsubtotal} = $form->format_amount(\%myconfig, $form->{invsubtotal}, 2, 0);
 
-  if ($form->{taxincluded}) {
+  } else {
     foreach $item (split / /, $form->{taxaccounts}) {
       if ($form->{"${item}_base"}) {
-        $form->{"${item}_total"} =
-          $form->round_amount(
-                           ($form->{"${item}_base"} * $form->{"${item}_rate"} /
-                              (1 + $form->{"${item}_rate"})
-                           ),
-                           2);
-        $form->{"${item}_netto"} =
-          $form->round_amount(
-                          ($form->{"${item}_base"} - $form->{"${item}_total"}),
-                          2);
-        $form->{"${item}_total"} =
-          $form->format_amount(\%myconfig, $form->{"${item}_total"}, 2);
-        $form->{"${item}_netto"} =
-          $form->format_amount(\%myconfig, $form->{"${item}_netto"}, 2);
-
-        $tax .= qq|
+        $form->{"${item}_total"} = $form->round_amount( ($form->{"${item}_base"} * $form->{"${item}_rate"} / (1 + $form->{"${item}_rate"})), 2);
+        $form->{"${item}_netto"} = $form->round_amount( ($form->{"${item}_base"} - $form->{"${item}_total"}), 2);
+        $form->{"${item}_total"} = $form->format_amount(\%myconfig, $form->{"${item}_total"}, 2);
+        $form->{"${item}_netto"} = $form->format_amount(\%myconfig, $form->{"${item}_netto"}, 2);
+
+        $TMPL_VAR{tax} .= qq|
              <tr>
-               <th align=right>Enthaltene $form->{"${item}_description"} |
-                                   . $form->{"${item}_rate"} * 100 .qq|%</th>
+               <th align=right>Enthaltene $form->{"${item}_description"} | . $form->{"${item}_rate"} * 100 .qq|%</th>
                <td align=right>$form->{"${item}_total"}</td>
              </tr>
              <tr>
                <th align=right>Nettobetrag</th>
                <td align=right>$form->{"${item}_netto"}</td>
-             </tr>
-|;
+             </tr> |;
       }
     }
-
   }
 
   $form->{oldinvtotal} = $form->{invtotal};
-  $form->{invtotal}    =
-    $form->format_amount(\%myconfig, $form->{invtotal}, 2, 0);
-
-  print qq|
-  <tr>
-    <td>
-      <table width=100%>
-       <tr valign=bottom>
-         <td>
-           <table>
-             <tr>
-               <th align=left>| . $locale->text('Notes') . qq|</th>
-               <th align=left>| . $locale->text('Internal Notes') . qq|</th>
-             </tr>
-             <tr valign=top>
-               <td>$notes</td>
-               <td>$intnotes</td>
-             </tr>
-         <tr>
-    $payments
-           </tr>
-      </table>
-         </td>
-          <td>
-            <table>
-|;
-
-  if ($form->{type} =~ /^sales_/) {
-    print qq|
-            <tr>
-              <th  align=left>| . $locale->text('Ertrag') . qq|</th>
-              <td>| .  $form->format_amount(\%myconfig, $form->{marge_total}, 2, 0) . qq|</td>
-            </tr>
-            <tr>
-              <th  align=left>| . $locale->text('Ertrag prozentual') . qq|</th>
-              <td>| .  $form->format_amount(\%myconfig, $form->{marge_percent}, 2, 0) . qq| %</td>
-            </tr>
-|;
-  }
-
-  print qq|
-            <input type=hidden name="marge_total" value="$form->{"marge_total"}">
-            <input type=hidden name="marge_percent" value="$form->{"marge_percent"}">
-            </table>
-          </td>
-         <td align=right>
-           $taxincluded
-           <table>
-             $subtotal
-             $tax
-             <tr>
-               <th align=right>| . $locale->text('Total') . qq|</th>
-               <td align=right>$form->{invtotal}</td>
-             </tr>
-           </table>
-         </td>
-       </tr>
-      </table>
-    </td>
-  </tr>
-<input type=hidden name=oldinvtotal value=$form->{oldinvtotal}>
-<input type=hidden name=oldtotalpaid value=$totalpaid>
-  <tr>
-    <td><hr size=3 noshade></td>
-  </tr>
-|;
-
-  if ($webdav) {
-    $webdav_list = qq|
-
-  <tr>
-    <th class=listtop align=left>Dokumente im Webdav-Repository</th>
-  </tr>
-    <table width=100%>
-      <td align=left width=30%><b>Dateiname</b></td>
-      <td align=left width=70%><b>Webdavlink</b></td>
-|;
-    foreach $file (@{ $form->{WEBDAV} }) {
-      $webdav_list .= qq|
-      <tr>
-        <td align="left">$file->{name}</td>
-        <td align="left"><a href="$file->{link}">$file->{type}</a></td>
-      </tr>
-|;
-    }
-    $webdav_list .= qq|
-    </table>
-  </tr>
-  <tr>
-    <td><hr size=3 noshade></td>
-  </tr>
-|;
-
-    print $webdav_list;
-  }
-
-  print qq|
-  <tr>
-    <td>
-|;
-  print_options();
 
-  print qq|
-    </td>
-  </tr>
-</table>
+  print $form->parse_html_template2("oe/orders_footer", {
+     %TMPL_VAR,
+     webdav          => $webdav,
+     print_options   => print_options(inline => 1),
+     label_edit      => $locale->text("Edit the $form->{type}"),
+     label_workflow  => $locale->text("Workflow $form->{type}"),
+  });
 
-| . $locale->text("Edit the $form->{type}") . qq|<br>
-<input class=submit type=submit name=action id=update_button value="|
-    . $locale->text('Update') . qq|">
-<input class=submit type=submit name=action value="|
-    . $locale->text('Ship to') . qq|">
-<input class=submit type=submit name=action value="|
-    . $locale->text('Print') . qq|">
-<input class=submit type=submit name=action value="|
-    . $locale->text('E-mail') . qq|">
-<input class=submit type=submit name=action value="|
-    . $locale->text('Save') . qq|">
-<input class=submit type=submit name=action value="|
-    . $locale->text('Save and Close') . qq|">
-|;
-
-  if (($form->{id})) {
-    print qq|
-       <input type="button" class="submit" onclick="set_history_window(|
-       . Q($form->{id})
-       . qq|);" name="history" id="history" value="|
-       . $locale->text('history')
-       . qq|">
-
-<br>| . $locale->text("Workflow $form->{type}") . qq|<br>
-<input class=submit type=submit name=action value="|
-      . $locale->text('Save as new') . qq|">
-<input class=submit type=submit name=action value="|
-      . $locale->text('Delete') . qq|">|;
-    if (($form->{type} =~ /sales_quotation$/)) {
-      print qq|
-<input class=submit type=submit name=action value="|
-        . $locale->text('Sales Order') . qq|">|;
-    }
-    if ($form->{type} =~ /request_quotation$/) {
-      print qq|
-<input class=submit type=submit name=action value="|
-        . $locale->text('Purchase Order') . qq|">|;
-    }
-    print qq|
-<input class=submit type=submit name=action value="|
-      . $locale->text('Invoice') . qq|">
-|;
-
-    if ($form->{type} =~ /sales_order$/) {
-      print qq|
-<br>$form->{heading} als neue Vorlage verwenden für<br>
-<input class=submit type=submit name=action value="|
-        . $locale->text('Purchase Order') . qq|">
-<input class=submit type=submit name=action value="|
-        . $locale->text('Quotation') . qq|">
-|;
-
-    } elsif ($form->{type} =~ /purchase_order$/) {
-      print qq|
-<br>$form->{heading} als neue Vorlage verwenden für<br>
-<input class=submit type=submit name=action value="|
-        . $locale->text('Sales Order') . qq|">
-<input class=submit type=submit name=action value="|
-        . $locale->text('Request for Quotation') . qq|">
-|;
-
-    } else {
-      print qq|
-<br>$form->{heading} als neue Vorlage verwenden für<br>
-<input class=submit type=submit name=action value="|
-        . $locale->text('Order') . qq|">
-|;
-    }
-  }
-
-  $form->hide_form("saved_xyznumber");
-
-  print qq|
-
-<input type=hidden name=rowcount value=$form->{rowcount}>
-
-<input name=callback type=hidden value="$form->{callback}">
-
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
-</form>
-
-</body>
-</html>
-|;
   $lxdebug->leave_sub();
 }
 
   $form->{exchangerate} = $exchangerate if 
     $form->{forex} = $exchangerate = $form->check_exchangerate(\%myconfig, $form->{currency}, $form->{transdate}, $buysell);
 
-  # for pricegroups
-  $i = $form->{rowcount};
-
   $exchangerate = $form->{exchangerate} || 1;
 
+##################### process items ######################################
+  # for pricegroups
+  $i = $form->{rowcount};
   if (   ($form->{"partnumber_$i"} eq "")
       && ($form->{"description_$i"} eq "")
       && ($form->{"partsgroup_$i"}  eq "")) {
 
   } else {
 
-    if (   $form->{type} eq 'purchase_order'
-        || $form->{type} eq 'request_quotation') {
-      IR->retrieve_item(\%myconfig, \%$form);
-    }
-    if (   $form->{type} eq 'sales_order' 
-        || $form->{type} eq 'sales_quotation') {
+    if ($form->{type} =~ /^sales/) {
       IS->retrieve_item(\%myconfig, \%$form);
+    } else {
+      IR->retrieve_item(\%myconfig, \%$form);
     }
 
     my $rows = scalar @{ $form->{item_list} };
         &set_pricegroup($i);
       }
 
-      &display_form;
-
+      display_form();
     } else {
 
       # ok, so this is a new part
           && ($form->{"description_$i"} eq "")) {
         $form->{rowcount}--;
         $form->{"discount_$i"} = "";
-        display_form();
 
+        display_form();
       } else {
         $form->{"id_$i"}   = 0;
         new_item();
       }
     }
   }
+##################### process items ######################################
+
 
   $lxdebug->leave_sub();
 }
   my $employee_block = qq|
     <tr>
       <th align="right">| . $locale->text('Employee') . qq|</th>
-      <td>| .
-        NTI($cgi->popup_menu('-name'   => 'employee_id',
-                             '-values' => \@values,
-                             '-labels' => \%labels)) . qq|
-      </td>
+      <td>| .  NTI($cgi->popup_menu('-name'   => 'employee_id', '-values' => \@values, '-labels' => \%labels)) . qq|</td>
     </tr>
     <tr>
       <th align="right">| . $locale->text('Salesman') . qq|</th>
           <th align=right>$vc_label</th>
           <td colspan=3>$vc</td>
         </tr>
-       $department
+$department
         <tr>
           <th align=right>$ordlabel</th>
           <td colspan=3><input name="$ordnumber" size=20></td>
         </tr>
-  $employee_block
+$employee_block
         <tr>
           <th align="right">| . $locale->text('Transaction description') . qq|</th>
           <td colspan="3"><input name="transaction_description" size=20></td>
           <td colspan="3">$projectnumber</td>
         </tr>
         <tr>
-          <th align=right>| . $locale->text('From') . qq|</th>
-          $button1
-          <th align=right>| . $locale->text('Bis') . qq|</th>
-          $button2
+          <th align=right>| . $locale->text('From') . qq|</th> $button1
+          <th align=right>| . $locale->text('Bis') . qq|</th> $button2
         </tr>
         <input type=hidden name=sort value=transdate>
         <tr>
           <td colspan=5>
            <table>
         <tr>
-          <td><input type="checkbox" name="open" value="1" id="open" checked>
-            <label for="open">| . $locale->text("Open") . qq|</td>
-          <td><input type="checkbox" name="closed" value="1" id="closed">
-            <label for="closed">| . $locale->text("Closed") . qq|</td>
+          <td><input type="checkbox" name="open" value="1" id="open" checked> <label for="open">| . $locale->text("Open") . qq|</td>
+          <td><input type="checkbox" name="closed" value="1" id="closed"> <label for="closed">| . $locale->text("Closed") . qq|</td>
         </tr>
         $delivered
              <tr>
-               <td><input name="l_id" class=checkbox type=checkbox value=Y>
-               | . $locale->text('ID') . qq|</td>
+               <td><input name="l_id" class=checkbox type=checkbox value=Y> | . $locale->text('ID') . qq|</td>
                <td><input name="l_$ordnumber" class=checkbox type=checkbox value=Y checked> $ordlabel</td>
-               <td><input name="l_transdate" class=checkbox type=checkbox value=Y checked> |
-    . $locale->text('Date') . qq|</td>
-               <td><input name="l_reqdate" class=checkbox type=checkbox value=Y checked> |
-    . $locale->text('Required by') . qq|</td>
+               <td><input name="l_transdate" class=checkbox type=checkbox value=Y checked> | . $locale->text('Date') . qq|</td>
+               <td><input name="l_reqdate" class=checkbox type=checkbox value=Y checked> | . $locale->text('Required by') . qq|</td>
              </tr>
              <tr>
                <td><input name="l_name" class=checkbox type=checkbox value=Y checked> $vc_label</td>
                <td><input name="l_employee" class=checkbox type=checkbox value=Y checked> $employee</td>
                
-               <td><input name="l_shipvia" class=checkbox type=checkbox value=Y> |
-    . $locale->text('Ship via') . qq|</td>
+               <td><input name="l_shipvia" class=checkbox type=checkbox value=Y> | . $locale->text('Ship via') . qq|</td>
              </tr>
              <tr>
-               <td><input name="l_netamount" class=checkbox type=checkbox value=Y> |
-    . $locale->text('Amount') . qq|</td>
-               <td><input name="l_tax" class=checkbox type=checkbox value=Y> |
-    . $locale->text('Tax') . qq|</td>
-               <td><input name="l_amount" class=checkbox type=checkbox value=Y checked> |
-    . $locale->text('Total') . qq|</td>
+               <td><input name="l_netamount" class=checkbox type=checkbox value=Y> | . $locale->text('Amount') . qq|</td>
+               <td><input name="l_tax" class=checkbox type=checkbox value=Y> | . $locale->text('Tax') . qq|</td>
+               <td><input name="l_amount" class=checkbox type=checkbox value=Y checked> | . $locale->text('Total') . qq|</td>
              </tr>
              <tr>
-               <td><input name="l_marge_total" class=checkbox type=checkbox value=Y> |
-    .             $locale->text('Ertrag') . qq|</td>
-               <td><input name="l_marge_percent" class=checkbox type=checkbox value=Y> |
-    .             $locale->text('Ertrag prozentual') . qq|</td>
+               <td><input name="l_marge_total" class=checkbox type=checkbox value=Y> | .             $locale->text('Ertrag') . qq|</td>
+               <td><input name="l_marge_percent" class=checkbox type=checkbox value=Y> | .             $locale->text('Ertrag prozentual') . qq|</td>
              </tr>
              <tr>
-          <td><input name="l_globalprojectnumber" class=checkbox type=checkbox value=Y> |
-          . $locale->text('Project Number') . qq|</td>
-          <td><input name="l_transaction_description" class=checkbox type=checkbox value=Y> |
-          . $locale->text('Transaction description') . qq|</td>
+          <td><input name="l_globalprojectnumber" class=checkbox type=checkbox value=Y> | . $locale->text('Project Number') . qq|</td>
+          <td><input name="l_transaction_description" class=checkbox type=checkbox value=Y> | . $locale->text('Transaction description') . qq|</td>
              </tr>
              <tr>
-               <td><input name="l_subtotal" class=checkbox type=checkbox value=Y> |
-    . $locale->text('Subtotal') . qq|</td>
-                <td><input name="l_salesman" class="checkbox" type="checkbox" value="Y"> |
-    . $locale->text('Salesman') . qq|</td>
+               <td><input name="l_subtotal" class=checkbox type=checkbox value=Y> | . $locale->text('Subtotal') . qq|</td>
+                <td><input name="l_salesman" class="checkbox" type="checkbox" value="Y"> | . $locale->text('Salesman') . qq|</td>
              </tr>
            </table>
           </td>
 sub no {
   call_sub($form->{no_nextsub});
 }
+
+######################################################################################################
+# IO ENTKOPPLUNG
+# ###############################################################################################
+sub display_form {
+  $lxdebug->enter_sub();
+
+  $form->{"taxaccounts"} =~ s/\s*$//;
+  $form->{"taxaccounts"} =~ s/^\s*//;
+  foreach my $accno (split(/\s*/, $form->{"taxaccounts"})) {
+    map({ delete($form->{"${accno}_${_}"}); } qw(rate description taxnumber));
+  }
+  $form->{"taxaccounts"} = "";
+
+  for my $i (1 .. $form->{"rowcount"}) {
+    IC->retrieve_accounts(\%myconfig, $form, $form->{"id_$i"}, $i, 1) if $form->{"id_$i"};
+  }
+
+  $form->{rowcount}++;
+  $form->{"project_id_$form->{rowcount}"} = $form->{globalproject_id};
+
+  $form->language_payment(\%myconfig);
+
+  Common::webdav_folder($form) if ($webdav);
+
+  &form_header;
+
+  # create rows
+  display_row($form->{rowcount}) if $form->{rowcount};
+
+  &form_footer;
+
+  $lxdebug->leave_sub();
+}
+
+sub display_row {
+  $lxdebug->enter_sub();
+  my $numrows = shift;
+
+  # column_index
+  my @header_sort = qw(runningnumber partnumber description ship qty unit sellprice_pg sellprice discount linetotal);
+  my @HEADER = (
+    {  id => 'runningnumber', width => 5,     value => $locale->text('No.'),                  display => 1, },
+    {  id => 'partnumber',    width => 12,    value => $locale->text('Number'),               display => 1, },
+    {  id => 'description',   width => 30,    value => $locale->text('Part Description'),     display => 1, },
+    {  id => 'ship',          width => 5,     value => ($form->{type} eq 'purchase_order' ? $locale->text('Ship rcvd') : $locale->text('Ship')),                 
+       display => $form->{type} =~ /sales_order/ || ($form->{type} =~ /purchase_order/ && !($lizenzen && $form->{vc} eq "customer")) , },
+    {  id => 'qty',           width => 5,     value => $locale->text('Qty'),                  display => 1, },
+    {  id => 'unit',          width => 5,     value => $locale->text('Unit'),                 display => 1, },
+    {  id => 'license',       width => 10,    value => $locale->text('License'),              display => 0, },
+    {  id => 'serialnr',      width => 10,    value => $locale->text('Serial No.'),           display => 0, },
+    {  id => 'projectnr',     width => 10,    value => $locale->text('Project'),              display => 0, },
+    {  id => 'sellprice',     width => 15,    value => $locale->text('Price'),                display => 1, },
+    {  id => 'sellprice_pg',  width => 15,    value => $locale->text('Pricegroup'),           display => $form->{type} =~ /^sales_/,  },
+    {  id => 'discount',      width => undef, value => $locale->text('Discount'),             display => $form->{vc} eq 'customer', },
+    {  id => 'linetotal',     width => 10,    value => $locale->text('Extended'),             display => 1, },
+    {  id => 'bin',           width => 10,    value => $locale->text('Bin'),                  display => 0, },
+  ); 
+  my @column_index = map { $_->{id} } grep { $_->{display} } @HEADER;
+
+  # cache units
+  my $dimension_units = AM->retrieve_units(\%myconfig, $form, "dimension");
+  my $service_units   = AM->retrieve_units(\%myconfig, $form, "service");
+  my $all_units       = AM->retrieve_units(\%myconfig, $form);
+
+  my $colspan = scalar @column_index;
+
+  $form->{invsubtotal} = 0;
+  map { $form->{"${_}_base"} = 0 } (split(/ /, $form->{taxaccounts}));
+
+  # about details 
+  $myconfig{show_form_details} = 1                            unless (defined($myconfig{show_form_details}));
+  $form->{show_details}        = $myconfig{show_form_details} unless (defined($form->{show_details}));
+  # /about details
+
+  # translations, unused commented out
+#  $runningnumber = $locale->text('No.');
+  $deliverydate  = $locale->text('Delivery Date');
+  $serialnumber  = $locale->text('Serial No.');
+  $projectnumber = $locale->text('Project');
+#  $partsgroup    = $locale->text('Group');
+  $reqdate       = $locale->text('Reqdate');
+  $deliverydate  = $locale->text('Required by');
+
+  # special alignings
+  my %align = map { $_ => 'right' } qw(qty ship right sellprice_pg discount linetotal);
+
+  $form->{marge_total}           = 0;
+  $form->{sellprice_total}       = 0;
+  $form->{lastcost_total}        = 0;
+  my %projectnumber_labels = ();
+  my @projectnumber_values = ("");
+
+  foreach my $item (@{ $form->{"ALL_PROJECTS"} }) {
+    push(@projectnumber_values, $item->{"id"});
+    $projectnumber_labels{$item->{"id"}} = $item->{"projectnumber"};
+  }
+
+  # rows
+  for $i (1 .. $numrows) {
+
+    # undo formatting
+    map { $form->{"${_}_$i"} = $form->parse_amount(\%myconfig, $form->{"${_}_$i"}) } qw(qty ship discount sellprice price_new price_old) unless ($form->{simple_save});
+
+# unit begin
+    $form->{"unit_old_$i"}      ||= $form->{"unit_$i"};
+    $form->{"selected_unit_$i"} ||= $form->{"unit_$i"};
+
+    my $local_units = $form->{"inventory_accno_$i"} || $form->{"assembly_$i"} ? $dimension_units 
+                    : $form->{"id_$i"}                                        ? $service_units 
+                    :                                                           $all_units;
+    if (   !$local_units->{$form->{"selected_unit_$i"}}                                          # Die ausgewaehlte Einheit ist fuer diesen Artikel nicht gueltig
+        || !AM->convert_unit($form->{"selected_unit_$i"}, $form->{"unit_old_$i"}, $all_units)) { # (z.B. Dimensionseinheit war ausgewaehlt, es handelt sich aber
+      $form->{"unit_old_$i"} = $form->{"selected_unit_$i"} = $form->{"unit_$i"};                 # um eine Dienstleistung). Dann keinerlei Umrechnung vornehmen.
+    }
+    # adjust prices by unit, ignore if pricegroup changed
+    if ((!$form->{"prices_$i"}) || ($form->{"new_pricegroup_$i"} == $form->{"old_pricegroup_$i"})) {
+        $form->{"sellprice_$i"} *= AM->convert_unit($form->{"selected_unit_$i"}, $form->{"unit_old_$i"}, $all_units) || 1;
+        $form->{"unit_old_$i"}   = $form->{"selected_unit_$i"};
+    }
+    my $this_unit = $form->{"unit_$i"};
+    $this_unit    = $form->{"selected_unit_$i"} if AM->convert_unit($this_unit, $form->{"selected_unit_$i"}, $all_units);
+    $this_unit  ||= "kg";
+
+    $column_data{"unit"} = AM->unit_select_html($local_units, "unit_$i", $this_unit, $form->{"id_$i"} ? $form->{"unit_$i"} : undef);
+# / unit ending
+
+    $form->{"sellprice_$i"} =~ /\.(\d+)/;
+    $decimalplaces = max 2, length $1;
+
+    $discount  = $form->round_amount($form->{"sellprice_$i"} * $form->{"discount_$i"} / 100, $decimalplaces);
+    $linetotal = $form->round_amount($form->{"sellprice_$i"} - $discount, $decimalplaces);
+    $linetotal = $form->round_amount($linetotal * $form->{"qty_$i"}, 2);
+
+    # convert " to "
+    map { $form->{"${_}_$i"} =~ s/\"/"/g } qw(partnumber description unit unit_old);
+
+    $column_data{runningnumber} = $cgi->textfield(-name => "runningnumber_$i", -size => 5,  -value => $i);    # HuT
+    $column_data{partnumber}    = $cgi->textfield(-name => "partnumber_$i",    -size => 12, -value => $form->{"partnumber_$i"});
+    $column_data{description} = ((($rows = $form->numtextrows($form->{"description_$i"}, 30, 6)) > 1) # if description is too large, use a textbox instead
+                                ? $cgi->textarea( -name => "description_$i", -default => H($form->{"description_$i"}), -rows => $rows, -columns => 30)
+                                : $cgi->textfield(-name => "description_$i",   -size => 30, -value => $form->quote($form->{"description_$i"})))
+                                . $cgi->button(-value => $locale->text('L'), -onClick => "set_longdescription_window('longdescription_$i')");
+
+    $form->{"qty_$i"} =~ /\.(\d+)/;
+    my $qty_dec = length $1;
+
+    $column_data{qty}  = $cgi->textfield(-name => "qty_$i", -size => 5, -value => $form->format_amount(\%myconfig, $form->{"qty_$i"}, $qty_dec));
+    $column_data{qty} .= $cgi->button(-onclick => "calculate_qty_selection_window('qty_$i','alu_$i', 'formel_$i', $i)", -value => $locale->text('*/'))
+                       . $cgi->hidden(-name => "formel_$i", -value => $form->{"formel_$i"}) . $cgi->hidden("-name" => "alu_$i", "-value" => $form->{"alu_$i"})
+      if $form->{"formel_$i"};
+    $column_data{ship} = $cgi->textfield(-name => "ship_$i", -size => 5, -value => $form->format_amount(\%myconfig, $form->{"ship_$i"}));
+
+    # build in drop down list for pricesgroups
+    if ($form->{"prices_$i"}) {
+      $column_data{sellprice_pg} = qq|<select name="sellprice_pg_$i">$form->{"prices_$i"}</select>|;
+      $column_data{sellprice}    = $cgi->textfield(-name => "sellprice_$i", -size => 10, -onBlur => 'check_right_number_format(this)', -value =>
+                                   (($form->{"new_pricegroup_$i"} != $form->{"old_pricegroup_$i"})
+                                      ? $form->format_amount(\%myconfig, $form->{"price_new_$i"}, $decimalplaces)
+                                      : $form->format_amount(\%myconfig, $form->{"sellprice_$i"}, $decimalplaces)));
+    } else {
+      # for last row and report
+      # set pricegroup drop down list from report menu
+      if ($form->{"sellprice_$i"} != 0) {
+        $form->{"pricegroup_old_$i"} = $form->{"pricegroup_id_$i"};
+        my $default_option           = $form->{"sellprice_$i"}.'--'.$form->{"pricegroup_id_$i"};
+        $column_data{sellprice_pg}   = NTI($cgi->popup_menu("sellpricepg_$i", [ $default_option ], $default_option, { $default_option => $form->{"pricegroup_$i"} || '' }));
+      } else {
+        $column_data{sellprice_pg} = qq| |;
+      }
+      $column_data{sellprice} = $cgi->textfield(-name => "sellprice_$i", -size => 10, -onBlur => "check_right_number_format(this)", -value =>
+                                                $form->format_amount(\%myconfig, $form->{"sellprice_$i"}, $decimalplaces));
+    }
+    $column_data{discount}    = $cgi->textfield(-name => "discount_$i", -size => 3, -value => $form->format_amount(\%myconfig, $form->{"discount_$i"}));
+    $column_data{linetotal}   = $form->format_amount(\%myconfig, $linetotal, 2);
+    $column_data{bin}         = $form->{"bin_$i"};
+
+    my @ROW1 = map { value => $column_data{$_}, align => $align{$_} }, @column_index;
+
+    # second row
+    my @ROW2 = ();
+    push @ROW2, { value => qq|<b>$serialnumber</b> <input name="serialnumber_$i" size="15" value="$form->{"serialnumber_$i"}">| } 
+      if $form->{type} !~ /_quotation/;
+    push @ROW2, { value => qq|<b>$projectnumber</b> | . NTI($cgi->popup_menu('-name'  => "project_id_$i",        '-values'  => \@projectnumber_values,
+                                                                             '-labels' => \%projectnumber_labels, '-default' => $form->{"project_id_$i"})) };
+    push @ROW2, { value => qq|<b>$reqdate</b> <input name="reqdate_$i" size="11" onBlur="check_right_date_format(this)" value="$form->{"reqdate_$i"}">| }
+      if $form->{type} =~ /order/;
+    push @ROW2, { value => sprintf qq|<b>%s</b> <input type="checkbox" name="subtotal_$i" value="1" %s>|, 
+                   $locale->text('Subtotal'), $form->{"subtotal_$i"} ? 'checked' : '' };
+
+# begin marge calculations
+    my $marge_color;
+    my $real_sellprice = $form->{"sellprice_$i"} - $discount;
+
+    $form->{"lastcost_$i"} *= 1;
+    $form->{"marge_percent_$i"} = 0;
+
+    if ($real_sellprice && ($form->{"qty_$i"} * 1)) {
+      $form->{"marge_percent_$i"}     = ($real_sellprice - $form->{"lastcost_$i"}) * 100 / $real_sellprice;
+      $myconfig{marge_percent_warn} ||= 15;
+      $marge_color                    = 'color="#ff0000"' if $form->{"id_$i"} && ($form->{"marge_percent_$i"} < (1 * $myconfig{marge_percent_warn}));
+    }
+
+    my $marge_adjust_credit_note = $form->{type} eq 'credit_note' ? -1 : 1;
+    $form->{"marge_absolut_$i"}  = ($real_sellprice - $form->{"lastcost_$i"}) * $form->{"qty_$i"} * $marge_adjust_credit_note;
+    $form->{"marge_total"}      += $form->{"marge_absolut_$i"};
+    $form->{"lastcost_total"}   += $form->{"lastcost_$i"} * $form->{"qty_$i"};
+    $form->{"sellprice_total"}  += $real_sellprice * $form->{"qty_$i"};
+
+    map { $form->{"${_}_$i"} = $form->format_amount(\%myconfig, $form->{"${_}_$i"}, 2) } qw(marge_absolut marge_percent);
+
+    push @ROW2, { value => sprintf qq|<font %s><b>%s</b> %s  %s%% </font>  <b>%s</b> %s  <b>%s</b> %s|,
+                   $marge_color, $locale->text('Ertrag'),$form->{"marge_absolut_$i"}, $form->{"marge_percent_$i"},
+                   $locale->text('LP'), $form->format_amount(\%myconfig, $form->{"listprice_$i"}, 2),
+                   $locale->text('EK'), $form->format_amount(\%myconfig, $form->{"lastcost_$i"}, 2) }
+      if $form->{"id_$i"} && $form->{type} =~ /^sales_/;
+# / marge calculations ending
+
+    my @HIDDENS = map { value => $_}, (
+          $cgi->hidden("-name" => "unit_old_$i", "-value" => $form->{"selected_unit_$i"}),
+          $cgi->hidden("-name" => "price_new_$i", "-value" => $form->format_amount(\%myconfig, $form->{"price_new_$i"})),
+          map { ($cgi->hidden("-name" => $_, "-value" => $form->{$_})); } map { $_."_$i" } 
+            qw(orderitems_id bo pricegroup_old price_old id inventory_accno bin partsgroup partnotes
+               income_accno expense_accno listprice assembly taxaccounts ordnumber transdate cusordnumber
+               longdescription basefactor marge_absolut marge_percent lastcost)
+    );
+
+    map { $form->{"${_}_base"} += $linetotal } (split(/ /, $form->{"taxaccounts_$i"}));
+
+    $form->{invsubtotal} += $linetotal;
+
+    push @ROWS, { ROW1 => \@ROW1, ROW2 => \@ROW2, HIDDENS => \@HIDDENS, colspan => $colspan, };
+  }
+
+  print $form->parse_html_template('oe/sales_order', { ROWS   => \@ROWS, 
+                                                       HEADER => \@HEADER,
+                                                       show_details_checked => ($form->{show_details} ? "checked" : ""),
+                                                       show_details_new     => !$form->{show_details},
+                                                     });
+
+  if (0 != ($form->{sellprice_total} * 1)) {
+    $form->{marge_percent} = ($form->{sellprice_total} - $form->{lastcost_total}) / $form->{sellprice_total} * 100;
+  }
+
+  $lxdebug->leave_sub();
+}
 
   if ($form->{arap} eq 'ar') {
     $raw_top_info_text    = $form->parse_html_template('rp/aging_ar_top');
     $raw_bottom_info_text = $form->parse_html_template('rp/aging_ar_bottom', { 'row_idx' => $row_idx,
-                                                                               'PRINT_OPTIONS' => print_options(1), });
+                                                                               'PRINT_OPTIONS' => print_options(inline => 1), });
     $report->set_options('raw_top_info_text'    => $raw_top_info_text,
                          'raw_bottom_info_text' => $raw_bottom_info_text);
   }
 
   'Monat'                       => 'Monat',
   'Monthly'                     => 'monatlich',
   'More than one control file with the tag \'%s\' exist.' => 'Es gibt mehr als eine Kontrolldatei mit dem Tag \'%s\'.',
+  'Motiv'                       => 'Motiv',
   'Multibyte Encoding'          => 'Schriftsatz',
   'MwSt. inkl.'                 => 'MwSt. inkl.',
   'Name'                        => 'Name',
 
 $self->{texts} = {
   ' Date missing!'              => ' Datum fehlt!',
-  '*/'                          => '*/',
   'ADDED'                       => 'Hinzugefügt',
   'Add Purchase Order'          => 'Lieferantenauftrag erfassen',
   'Add Quotation'               => 'Angebot erfassen',
   'Automatically created invoice for fee and interest for dunning %s' => 'Automatisch erzeugte Rechnung für Gebühren und Zinsen zu Mahnung %s',
   'Bcc'                         => 'Bcc',
   'Billing Address'             => 'Rechnungsadresse',
-  'Bin'                         => 'Lagerplatz',
   'Bin List'                    => 'Lagerliste',
   'CANCELED'                    => 'Storniert',
   'CSV export -- options'       => 'CSV-Export -- Optionen',
   'Date'                        => 'Datum',
   'Dec'                         => 'Dez',
   'December'                    => 'Dezember',
-  'Delivery Date'               => 'Lieferdatum',
   'Department'                  => 'Abteilung',
   'Dependency loop detected:'   => 'Schleife in den Abhängigkeiten entdeckt:',
   'Description'                 => 'Beschreibung',
   'Directory'                   => 'Verzeichnis',
-  'Discount'                    => 'Rabatt',
   'Dunning Date'                => 'Mahndatum',
   'Dunning Description missing in row ' => 'Mahnstufenbeschreibung fehlt in Zeile ',
   'Dunning Duedate'             => 'Zahlbar bis',
   'Dunning overview'            => 'Mahnungsübersicht',
   'E-mail'                      => 'eMail',
   'E-mail address missing!'     => 'E-Mail-Adresse fehlt!',
-  'EK'                          => 'EK',
   'ELSE'                        => 'Zusatz',
   'Edit Dunning Process Config' => 'Mahnwesenkonfiguration bearbeiten',
   'Enter longdescription'       => 'Langtext eingeben',
   'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s',
-  'Ertrag'                      => 'Ertrag',
-  'Extended'                    => 'Gesamt',
   'Falsches Datumsformat!'      => 'Falsches Datumsformat!',
   'Fax'                         => 'Fax',
   'Feb'                         => 'Feb',
   'February'                    => 'Februar',
   'File'                        => 'Datei',
-  'Group'                       => 'Warengruppe',
   'History'                     => 'Historie',
   'In-line'                     => 'im Text',
   'Interest'                    => 'Zinsen',
   'Invoice Date missing!'       => 'Rechnungsdatum fehlt!',
   'Invoice Duedate'             => 'Fälligkeitsdatum',
   'Invoice Number missing!'     => 'Rechnungsnummer fehlt!',
-  'Item not on file!'           => 'Dieser Artikel ist nicht in der Datenbank!',
   'Jan'                         => 'Jan',
   'January'                     => 'Januar',
   'Jul'                         => 'Jul',
   'July'                        => 'Juli',
   'Jun'                         => 'Jun',
   'June'                        => 'Juni',
-  'L'                           => 'L',
-  'LP'                          => 'LP',
-  'License'                     => 'Lizenz',
   'MAILED'                      => 'Gesendet',
   'Mar'                         => 'März',
   'March'                       => 'März',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
   'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
-  'No.'                         => 'Position',
   'Nov'                         => 'Nov',
   'November'                    => 'November',
   'Number'                      => 'Nummer',
   'Packing List'                => 'Lieferschein',
   'Packing List Date missing!'  => 'Datum für Verpackungsliste fehlt!',
   'Packing List Number missing!' => 'Verpackungslistennummer fehlt!',
-  'Part'                        => 'Ware',
   'Part Description'            => 'Artikelbeschreibung',
   'Part Number'                 => 'Artikelnummer',
   'Part description'            => 'Artikelbeschreibung',
   'Please enter values'         => 'Bitte Werte eingeben',
   'Postscript'                  => 'Postscript',
   'Price'                       => 'Preis',
-  'Pricegroup'                  => 'Preisgruppe',
   'Print dunnings'              => 'Mahnungen drucken',
   'Printer'                     => 'Drucker',
   'Proforma Invoice'            => 'Proformarechnung',
-  'Project'                     => 'Projekt',
   'Project Number'              => 'Projektnummer',
   'Project description'         => 'Projektbeschreibung',
   'Project not on file!'        => 'Dieses Projekt ist nicht in der Datenbank!',
   'Quotation Date missing!'     => 'Angebotsdatum fehlt!',
   'Quotation Number missing!'   => 'Angebotsnummer fehlt!',
   'RFQ'                         => 'Anfrage',
-  'Reqdate'                     => 'Lieferdatum',
-  'Required by'                 => 'Lieferdatum',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
   'Select postscript or PDF!'   => 'Postscript oder PDF auswählen!',
   'Sep'                         => 'Sep',
   'September'                   => 'September',
-  'Serial No.'                  => 'Seriennummer',
-  'Service'                     => 'Dienstleistung',
   'Set eMail text'              => 'eMail Text eingeben',
-  'Ship'                        => 'Lagerausgang',
-  'Ship rcvd'                   => 'Lagereingang',
   'Ship to'                     => 'Lieferadresse',
   'Shipping Address'            => 'Lieferadresse',
-  'Show details'                => 'Details anzeigen',
   'Start Dunning Process'       => 'Mahnprozess starten',
   'Storno Invoice'              => 'Stornorechnung',
   'Storno Packing List'         => 'Stornolieferschein',
   'Street'                      => 'Straße',
   'Subject'                     => 'Betreff',
-  'Subtotal'                    => 'Zwischensumme',
   'Terms missing in row '       => '+Tage fehlen in Zeile ',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
   'The dunnings have been printed.' => 'Die Mahnung(en) wurden gedruckt.',
   'Vendor details'              => 'Lieferantendetails',
   'Vendor not on file or locked!' => 'Dieser Lieferant existiert nicht oder ist gesperrt.',
   'Vendor not on file!'         => 'Lieferant ist nicht in der Datenbank!',
-  'What type of item is this?'  => 'Was ist dieser Artikel?',
   'Zipcode'                     => 'PLZ',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
   'continue'                    => 'continue',
   'customer_details'            => 'customer_details',
   'delivery_customer_selection' => 'delivery_customer_selection',
-  'display_form'                => 'display_form',
-  'display_row'                 => 'display_row',
   'edit_config'                 => 'edit_config',
   'edit_e_mail'                 => 'edit_e_mail',
   'employee_selection_internal' => 'employee_selection_internal',
 
   'Invoice Number'              => 'Rechnungsnummer',
   'Invoice Number missing!'     => 'Rechnungsnummer fehlt!',
   'Item deleted!'               => 'Artikel gelöscht!',
-  'Item not on file!'           => 'Dieser Artikel ist nicht in der Datenbank!',
   'Jan'                         => 'Jan',
   'January'                     => 'Januar',
   'Jul'                         => 'Jul',
   'Packing List'                => 'Lieferschein',
   'Packing List Date missing!'  => 'Datum für Verpackungsliste fehlt!',
   'Packing List Number missing!' => 'Verpackungslistennummer fehlt!',
-  'Part'                        => 'Ware',
   'Part Description'            => 'Artikelbeschreibung',
   'Part Description missing!'   => 'Artikelbezeichnung fehlt!',
   'Part Number'                 => 'Artikelnummer',
   'September'                   => 'September',
   'Serial No.'                  => 'Seriennummer',
   'Serial Number'               => 'Seriennummer',
-  'Service'                     => 'Dienstleistung',
   'Service Number missing!'     => 'Dienstleistungsnummer fehlt!',
   'Services'                    => 'Dienstleistungen',
   'Set Language Values'         => 'Spracheinstellungen',
   'Vendor details'              => 'Lieferantendetails',
   'Verrechnungseinheit'         => 'Verrechnungseinheit',
   'Weight'                      => 'Gewicht',
-  'What type of item is this?'  => 'Was ist dieser Artikel?',
   'Zipcode'                     => 'PLZ',
   '[email]'                     => '[email]',
   'assembly_list'               => 'erzeugnisliste',
 
   'Invoice'                     => 'Rechnung',
   'Invoice Date missing!'       => 'Rechnungsdatum fehlt!',
   'Invoice Number missing!'     => 'Rechnungsnummer fehlt!',
-  'Item not on file!'           => 'Dieser Artikel ist nicht in der Datenbank!',
   'Jan'                         => 'Jan',
   'January'                     => 'Januar',
   'Jul'                         => 'Jul',
   'Packing List'                => 'Lieferschein',
   'Packing List Date missing!'  => 'Datum für Verpackungsliste fehlt!',
   'Packing List Number missing!' => 'Verpackungslistennummer fehlt!',
-  'Part'                        => 'Ware',
   'Part Description'            => 'Artikelbeschreibung',
   'Part Number'                 => 'Artikelnummer',
   'Part description'            => 'Artikelbeschreibung',
   'Sep'                         => 'Sep',
   'September'                   => 'September',
   'Serial No.'                  => 'Seriennummer',
-  'Service'                     => 'Dienstleistung',
   'Ship'                        => 'Lagerausgang',
   'Ship rcvd'                   => 'Lagereingang',
   'Ship to'                     => 'Lieferadresse',
   'Variable'                    => 'Variable',
   'Vendor Number'               => 'Lieferantennummer',
   'Vendor details'              => 'Lieferantendetails',
-  'What type of item is this?'  => 'Was ist dieser Artikel?',
   'Zipcode'                     => 'PLZ',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
 
   'Invoice Number missing!'     => 'Rechnungsnummer fehlt!',
   'Invoice deleted!'            => 'Rechnung gelöscht!',
   'Invoice has already been storno\'d!' => 'Diese Rechnung wurde bereits storniert.',
-  'Item not on file!'           => 'Dieser Artikel ist nicht in der Datenbank!',
   'Jan'                         => 'Jan',
   'January'                     => 'Januar',
   'Jul'                         => 'Jul',
   'Packing List'                => 'Lieferschein',
   'Packing List Date missing!'  => 'Datum für Verpackungsliste fehlt!',
   'Packing List Number missing!' => 'Verpackungslistennummer fehlt!',
-  'Part'                        => 'Ware',
   'Part Description'            => 'Artikelbeschreibung',
   'Part Number'                 => 'Artikelnummer',
   'Part description'            => 'Artikelbeschreibung',
   'Sep'                         => 'Sep',
   'September'                   => 'September',
   'Serial No.'                  => 'Seriennummer',
-  'Service'                     => 'Dienstleistung',
   'Ship'                        => 'Lagerausgang',
   'Ship rcvd'                   => 'Lagereingang',
   'Ship to'                     => 'Lieferadresse',
   'Vendor missing!'             => 'Lieferant fehlt!',
   'Vendor not on file or locked!' => 'Dieser Lieferant existiert nicht oder ist gesperrt.',
   'Vendor not on file!'         => 'Lieferant ist nicht in der Datenbank!',
-  'What type of item is this?'  => 'Was ist dieser Artikel?',
   'Yes'                         => 'Ja',
   'Zipcode'                     => 'PLZ',
   '[email]'                     => '[email]',
 
   'Invoice Number missing!'     => 'Rechnungsnummer fehlt!',
   'Invoice deleted!'            => 'Rechnung gelöscht!',
   'Invoice has already been storno\'d!' => 'Diese Rechnung wurde bereits storniert.',
-  'Item not on file!'           => 'Dieser Artikel ist nicht in der Datenbank!',
   'Jan'                         => 'Jan',
   'January'                     => 'Januar',
   'Jul'                         => 'Jul',
   'Packing List'                => 'Lieferschein',
   'Packing List Date missing!'  => 'Datum für Verpackungsliste fehlt!',
   'Packing List Number missing!' => 'Verpackungslistennummer fehlt!',
-  'Part'                        => 'Ware',
   'Part Description'            => 'Artikelbeschreibung',
   'Part Number'                 => 'Artikelnummer',
   'Part description'            => 'Artikelbeschreibung',
   'Sep'                         => 'Sep',
   'September'                   => 'September',
   'Serial No.'                  => 'Seriennummer',
-  'Service'                     => 'Dienstleistung',
   'Ship'                        => 'Lagerausgang',
   'Ship rcvd'                   => 'Lagereingang',
   'Ship to'                     => 'Lieferadresse',
   'Vendor details'              => 'Lieferantendetails',
   'Vendor not on file or locked!' => 'Dieser Lieferant existiert nicht oder ist gesperrt.',
   'Vendor not on file!'         => 'Lieferant ist nicht in der Datenbank!',
-  'What type of item is this?'  => 'Was ist dieser Artikel?',
   'Yes'                         => 'Ja',
   'Zipcode'                     => 'PLZ',
   '[email]'                     => '[email]',
 
   'Cannot save order!'          => 'Auftrag kann nicht gespeichert werden!',
   'Cannot save quotation!'      => 'Angebot kann nicht gespeichert werden!',
   'Cc'                          => 'Cc',
-  'Choose Customer'             => 'Endkunde wählen:',
-  'Choose Vendor'               => 'Händler wählen',
   'City'                        => 'Stadt',
   'Closed'                      => 'Geschlossen',
   'Collective Orders only work for orders from one customer!' => 'Sammelaufträge funktionieren nur für Aufträge von einem Kunden!',
   'Confirm!'                    => 'Bestätigen Sie!',
   'Confirmation'                => 'Auftragsbestätigung',
   'Contact'                     => 'Kontakt',
-  'Contact Person'              => 'Ansprechpartner',
   'Continue'                    => 'Weiter',
   'Could not spawn html2ps or GhostScript.' => 'html2ps oder GhostScript konnte nicht gestartet werden.',
   'Could not spawn the printer command.' => 'Die Druckanwendung konnte nicht gestartet werden.',
   'Could not write the html2ps config file.' => 'Die temporäre html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
   'Could not write the temporary HTML file.' => 'Eine temporäre HTML-Datei konnte nicht geschrieben werden.',
   'Country'                     => 'Land',
-  'Credit Limit'                => 'Kreditlimit',
   'Credit Limit exceeded!!!'    => 'Kreditlimit überschritten!',
   'Credit Note'                 => 'Gutschrift',
   'Curr'                        => 'Währung',
   'Currency'                    => 'Währung',
   'Customer'                    => 'Kunde',
   'Customer Number'             => 'Kundennummer',
-  'Customer Order Number'       => 'Bestellnummer des Kunden',
   'Customer details'            => 'Kundendetails',
   'Customer missing!'           => 'Kundenname fehlt!',
   'Customer not on file or locked!' => 'Dieser Kunde existiert nicht oder ist gesperrt.',
   'Date'                        => 'Datum',
   'Dec'                         => 'Dez',
   'December'                    => 'Dezember',
-  'Delete'                      => 'Löschen',
   'Delivered'                   => 'Geliefert',
   'Delivery Date'               => 'Lieferdatum',
   'Department'                  => 'Abteilung',
   'Description'                 => 'Beschreibung',
   'Directory'                   => 'Verzeichnis',
   'Discount'                    => 'Rabatt',
-  'Dunning Amount'              => 'gemahnter Betrag',
   'E-mail'                      => 'eMail',
   'E-mail address missing!'     => 'E-Mail-Adresse fehlt!',
   'EK'                          => 'EK',
   'ID'                          => 'Buchungsnummer',
   'In-line'                     => 'im Text',
   'Include in Report'           => 'In Bericht aufnehmen',
-  'Internal Notes'              => 'interne Bemerkungen',
   'Invoice'                     => 'Rechnung',
   'Invoice Date missing!'       => 'Rechnungsdatum fehlt!',
   'Invoice Number missing!'     => 'Rechnungsnummer fehlt!',
-  'Item not on file!'           => 'Dieser Artikel ist nicht in der Datenbank!',
   'Jan'                         => 'Jan',
   'January'                     => 'Januar',
   'Jul'                         => 'Jul',
   'March'                       => 'März',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
-  'Max. Dunning Level'          => 'höchste Mahnstufe',
   'May'                         => 'Mai',
   'May '                        => 'Mai',
   'Message'                     => 'Nachricht',
   'Open'                        => 'Offen',
   'OpenDocument/OASIS'          => 'OpenDocument/OASIS',
   'Order'                       => 'Auftrag',
-  'Order Date'                  => 'Auftragsdatum',
   'Order Date missing!'         => 'Auftragsdatum fehlt!',
   'Order Number'                => 'Auftragsnummer',
   'Order Number missing!'       => 'Auftragsnummer fehlt!',
   'Packing List'                => 'Lieferschein',
   'Packing List Date missing!'  => 'Datum für Verpackungsliste fehlt!',
   'Packing List Number missing!' => 'Verpackungslistennummer fehlt!',
-  'Part'                        => 'Ware',
   'Part Description'            => 'Artikelbeschreibung',
   'Part Number'                 => 'Artikelnummer',
   'Part description'            => 'Artikelbeschreibung',
-  'Payment Terms'               => 'Zahlungskonditionen',
   'Phone'                       => 'Telefon',
   'Pick List'                   => 'Sammelliste',
   'Please enter values'         => 'Bitte Werte eingeben',
   'Postscript'                  => 'Postscript',
   'Price'                       => 'Preis',
   'Pricegroup'                  => 'Preisgruppe',
-  'Print'                       => 'Drucken',
   'Printer'                     => 'Drucker',
   'Proforma Invoice'            => 'Proformarechnung',
   'Project'                     => 'Projekt',
   'Qty'                         => 'Menge',
   'Queue'                       => 'Warteschlange',
   'Quotation'                   => 'Angebot',
-  'Quotation Date'              => 'Angebotsdatum',
   'Quotation Date missing!'     => 'Angebotsdatum fehlt!',
   'Quotation Number'            => 'Angebotsnummer',
   'Quotation Number missing!'   => 'Angebotsnummer fehlt!',
   'Quotations'                  => 'Angebote',
   'RFQ'                         => 'Anfrage',
   'RFQ Number'                  => 'Anfragenummer',
-  'Remaining'                   => 'Rest',
   'Reqdate'                     => 'Lieferdatum',
   'Request for Quotation'       => 'Anfrage',
   'Request for Quotations'      => 'Anfragen',
   'Sales Order'                 => 'Kundenauftrag',
   'Sales Orders'                => 'Aufträge',
   'Salesman'                    => 'Verkäufer/in',
-  'Salesperson'                 => 'Verkäufer',
-  'Save'                        => 'Speichern',
-  'Save and Close'              => 'Speichern und schließen',
-  'Save as new'                 => 'als neu speichern',
   'Screen'                      => 'Bildschirm',
   'Select a Customer'           => 'Endkunde auswählen',
   'Select a part'               => 'Artikel auswählen',
   'Sep'                         => 'Sep',
   'September'                   => 'September',
   'Serial No.'                  => 'Seriennummer',
-  'Service'                     => 'Dienstleistung',
   'Ship'                        => 'Lagerausgang',
   'Ship rcvd'                   => 'Lagereingang',
   'Ship to'                     => 'Lieferadresse',
   'Ship via'                    => 'Transportmittel',
   'Shipping Address'            => 'Lieferadresse',
-  'Shipping Point'              => 'Versandort',
-  'Show details'                => 'Details anzeigen',
-  'Steuersatz'                  => 'Steuersatz',
   'Storno Invoice'              => 'Stornorechnung',
   'Storno Packing List'         => 'Stornolieferschein',
   'Street'                      => 'Straße',
   'Subject'                     => 'Betreff',
   'Subtotal'                    => 'Zwischensumme',
   'Tax'                         => 'Steuer',
-  'Tax Included'                => 'Steuer im Preis inbegriffen',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
   'The list has been printed.'  => 'Die Liste wurde ausgedruckt.',
   'To (email)'                  => 'An',
   'Total'                       => 'Summe',
-  'Trade Discount'              => 'Rabatt',
   'Transaction description'     => 'Vorgangsbezeichnung',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Unit'                        => 'Einheit',
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abhängigkeit \'%s\'.',
-  'Update'                      => 'Erneuern',
-  'Valid until'                 => 'gültig bis',
   'Value'                       => 'Wert',
   'Variable'                    => 'Variable',
   'Vendor'                      => 'Lieferant',
   'Vendor not on file or locked!' => 'Dieser Lieferant existiert nicht oder ist gesperrt.',
   'Vendor not on file!'         => 'Lieferant ist nicht in der Datenbank!',
   'Vendor type'                 => 'Lieferantentyp',
-  'What type of item is this?'  => 'Was ist dieser Artikel?',
   'Workflow purchase_order'     => 'Workflow Lieferantenauftrag',
   'Workflow request_quotation'  => 'Workflow Preisanfrage',
   'Workflow sales_order'        => 'Workflow Auftrag',
   'bin_list'                    => 'Lagerliste',
   'button'                      => '?',
   'emailed to'                  => 'gemailt an',
-  'history'                     => 'Historie',
   'invoice'                     => 'Rechnung',
   'no'                          => 'nein',
   'none (pricegroup)'           => 'keine',