Merge branch 'master' of ssh://lx-office/~/lx-office-erp
authorHolger Lindemann <hli@lx-system.de>
Mon, 6 Sep 2010 09:49:03 +0000 (11:49 +0200)
committerHolger Lindemann <hli@lx-system.de>
Mon, 6 Sep 2010 09:49:03 +0000 (11:49 +0200)
78 files changed:
SL/Auth.pm
SL/CVar.pm
SL/DBUtils.pm
SL/Dispatcher.pm
SL/Form.pm
SL/InstallationCheck.pm
SL/LXDebug.pm
SL/Projects.pm
SL/Template/Excel.pm
SL/Template/Plugin/T8.pm
VERSION
bin/mozilla/ct.pl
bin/mozilla/ic.pl
bin/mozilla/invoice_io.pl
bin/mozilla/kopf.pl
bin/mozilla/licenses.pl
bin/mozilla/login.pl
bin/mozilla/menu.pl
bin/mozilla/projects.pl
bin/mozilla/ustva.pl
bin/mozilla/wh.pl
config/lx-erp.conf
config/lx-erp.conf.default
css/Mobile.css
css/lx-office-erp.css
dispatcher.fcgi [new symlink]
doc/2010_template_changes.txt
doc/INSTALL.fcgi
doc/INSTALL.texi
doc/INSTALL.txt
doc/INSTALL/Ben_00c3_00b6tigte-Software-und-Pakete.html
doc/languages_howto.txt
image/Program.png [new file with mode: 0644]
image/Programm.png [deleted file]
image/icons/16x16/Program--Logout.png [new file with mode: 0644]
image/icons/16x16/Program--Preferences.png [new file with mode: 0644]
image/icons/16x16/Program--Version.png [new file with mode: 0644]
image/icons/16x16/Program.png [new file with mode: 0644]
image/icons/16x16/Programm--Logout.png [deleted file]
image/icons/16x16/Programm--Preferences.png [deleted file]
image/icons/16x16/Programm--Version.png [deleted file]
image/icons/16x16/Programm.png [deleted file]
image/icons/24x24/Productivity.png [new file with mode: 0644]
image/icons/24x24/Program--Logout.png [new file with mode: 0644]
image/icons/24x24/Program--Preferences.png [new file with mode: 0644]
image/icons/24x24/Program--Version.png [new file with mode: 0644]
image/icons/24x24/Program.png [new file with mode: 0644]
image/icons/24x24/Programm--Logout.png [deleted file]
image/icons/24x24/Programm--Preferences.png [deleted file]
image/icons/24x24/Programm--Version.png [deleted file]
image/icons/24x24/Programm.png [deleted file]
image/icons/24x24/Warehouse.png [new file with mode: 0644]
image/icons/32x32/Program--Logout.png [new file with mode: 0644]
image/icons/32x32/Program--Preferences.png [new file with mode: 0644]
image/icons/32x32/Program--Version.png [new file with mode: 0644]
image/icons/32x32/Program.png [new file with mode: 0644]
image/icons/32x32/Programm--Logout.png [deleted file]
image/icons/32x32/Programm--Preferences.png [deleted file]
image/icons/32x32/Programm--Version.png [deleted file]
image/icons/32x32/Programm.png [deleted file]
js/switchmenuframe.js [new file with mode: 0644]
locale/de/all
locale/en/all
locale/en/charset [new file with mode: 0644]
locale/en/lost [deleted file]
menu.ini
scripts/installation_check.pl
scripts/locales.pl
templates/webpages/ct/form_header.html
templates/webpages/generic/error.html
templates/webpages/generic/information.html
templates/webpages/login/company_logo.html
templates/webpages/login/login_screen.html
templates/webpages/projects/search.html
templates/webpages/wh/journal_filter.html
templates/webpages/wh/report_filter.html
xslt/style1.css
xslt/xulmenu.xsl

index e7f8f7b..bf2a6a8 100644 (file)
@@ -139,7 +139,7 @@ sub dbconnect {
 
   $main::lxdebug->message(LXDebug->DEBUG1, "Auth::dbconnect DSN: $dsn");
 
-  $self->{dbh} = DBI->connect($dsn, $cfg->{user}, $cfg->{password}, { 'AutoCommit' => 0 });
+  $self->{dbh} = DBI->connect($dsn, $cfg->{user}, $cfg->{password}, { pg_enable_utf8 => $::locale->is_utf8, AutoCommit => 0 });
 
   if (!$may_fail && !$self->{dbh}) {
     $main::form->error($main::locale->text('The connection to the authentication database failed:') . "\n" . $DBI::errstr);
@@ -214,17 +214,17 @@ sub create_database {
 
   $main::lxdebug->message(LXDebug->DEBUG1(), "Auth::create_database DSN: $dsn");
 
-  my $dbh = DBI->connect($dsn, $params{superuser}, $params{superuser_password});
-
-  if (!$dbh) {
-    $main::form->error($main::locale->text('The connection to the template database failed:') . "\n" . $DBI::errstr);
-  }
-
   my $charset    = $main::dbcharset;
   $charset     ||= Common::DEFAULT_CHARSET;
   my $encoding   = $Common::charset_to_db_encoding{$charset};
   $encoding    ||= 'UNICODE';
 
+  my $dbh        = DBI->connect($dsn, $params{superuser}, $params{superuser_password}, { pg_enable_utf8 => $charset =~ m/^utf-?8$/i });
+
+  if (!$dbh) {
+    $main::form->error($main::locale->text('The connection to the template database failed:') . "\n" . $DBI::errstr);
+  }
+
   my $query = qq|CREATE DATABASE "$cfg->{db}" OWNER "$cfg->{user}" TEMPLATE "$params{template}" ENCODING '$encoding'|;
 
   $main::lxdebug->message(LXDebug->DEBUG1(), "Auth::create_database query: $query");
index 19f1e5f..7f82a2d 100644 (file)
@@ -337,11 +337,10 @@ sub save_custom_variables {
 
     do_statement($form, $sth, $query, @values);
 
-    unless ($params{always_valid}) {
-      $self->save_custom_variables_validity(trans_id => $params{trans_id}, config_id => $config->{id},
-        validity => ($params{variables}->{"$params{name_prefix}cvar_$config->{name}$params{name_postfix}_valid"} ? 1 : 0)
-      );
-    };
+    my $valid_index = "$params{name_prefix}cvar_$config->{name}$params{name_postfix}_valid";
+    $self->save_custom_variables_validity(trans_id => $params{trans_id}, config_id => $config->{id},
+      validity => ($params{variables}{$valid_index} || $params{always_valid} ? 1 : 0)
+    );
   }
 
   $sth->finish();
index e041e10..4a4ac25 100644 (file)
@@ -84,7 +84,7 @@ sub dump_query {
   }
 
   while ($query =~ /\?/) {
-    my $value = shift(@_);
+    my $value = shift || '';
     $value =~ s/\'/\\\'/g;
     $value = "'${value}'";
     $query =~ s/\?/$value/;
@@ -147,12 +147,11 @@ sub selectall_hashref_query {
 
   my ($form, $dbh, $query) = splice(@_, 0, 3);
 
-  my $sth = prepare_execute_query($form, $dbh, $query, @_);
-  my $result = [];
-  while (my $ref = $sth->fetchrow_hashref()) {
-    push(@{ $result }, $ref);
-  }
-  $sth->finish();
+  dump_query(LXDebug->QUERY(), '', $query, @_);
+
+  # this works back 'til at least DBI 1.46 on perl 5.8.4 on Debian Sarge (2004)
+  my $result = $dbh->selectall_arrayref($query, { Slice => {} }, @_)
+    or $form->dberror($query . (@_ ? " (" . join(", ", @_) . ")" : ''));
 
   $main::lxdebug->leave_sub(2);
 
index e5a7daa..2c0539b 100644 (file)
@@ -82,6 +82,10 @@ sub pre_startup_setup {
     %::myconfig    = ();
     %::called_subs = (); # currently used for recursion detection
   }
+
+  $SIG{__WARN__} = sub {
+    $::lxdebug->warn(@_);
+  }
 }
 
 sub pre_startup_checks {
index cab29d4..fbd1d85 100644 (file)
@@ -265,7 +265,11 @@ sub new {
   $self->{action}  =  lc $self->{action};
   $self->{action}  =~ s/( |-|,|\#)/_/g;
 
-  $self->{version} =  "2.6.1";
+  #$self->{version} =  "2.6.1";                 # Old hardcoded but secure style
+  open VERSION_FILE, "VERSION";                 # New but flexible code reads version from VERSION-file
+  $self->{version} =  <VERSION_FILE>;
+  close VERSION_FILE;                                                  
+  $self->{version}  =~ s/[^0-9A-Za-z\.\_\-]//g; # only allow numbers, letters, points, underscores and dashes. Prevents injecting of malicious code.
 
   $main::lxdebug->leave_sub();
 
@@ -466,13 +470,22 @@ sub info {
 
     if (!$self->{header}) {
       $self->header;
-      print qq|
-      <body>|;
+      print qq|<body>|;
     }
 
     print qq|
-
-    <p><b>$msg</b>
+    <p class="message_ok"><b>$msg</b></p>
+    
+    <script type="text/javascript">
+    <!--
+    // If JavaScript is enabled, the whole thing will be reloaded.
+    // The reason is: When one changes his menu setup (HTML / XUL / CSS ...)
+    // it now loads the correct code into the browser instead of do nothing.
+    setTimeout("top.frames.location.href='login.pl'",500);
+    //-->
+    </script>
+    
+</body>
     |;
 
   } else {
@@ -659,6 +672,20 @@ sub header {
     </script>
     | if $self->{"fokus"};
 
+  # if there is a title, we put some JavaScript in to the page, wich writes a 
+  # meaningful title-tag for our frameset.
+    my $title_hack;          
+    if ($self->{"title"}){
+               $title_hack = qq|
+               <script type="text/javascript">
+               <!--
+                 // Write a meaningful title-tag for our frameset.
+                 top.document.title="| . $self->{"title"} . qq| - | . $self->{"login"} . qq| - | . $::myconfig{dbname} . qq| - Ver. | . $self->{"version"} . qq|";
+               //-->
+               </script>
+               |;
+       }
+    
     #Set Calendar
     my $jsscript = "";
     if ($self->{jsscript} == 1) {
@@ -694,9 +721,9 @@ sub header {
   $favicon
   $jsscript
   $ajax
-
   $fokus
-
+  $title_hack
+  
   <link rel="stylesheet" href="css/jquery.autocomplete.css" type="text/css" />
 
   <meta name="robots" content="noindex,nofollow" />
index cf523be..6e1a6c7 100644 (file)
@@ -7,63 +7,51 @@ use vars qw(@required_modules @optional_modules);
 
 use strict;
 
+BEGIN {
 @required_modules = (
-  { name => "Archive::Zip",    url => "http://search.cpan.org/~adamk/" },
-  { name => "Class::Accessor", url => "http://search.cpan.org/~kasei/" },
-  { name => "CGI::Ajax",       url => "http://search.cpan.org/~bct/" },
-  { name => "DBI",             url => "http://search.cpan.org/~timb/" },
-  { name => "DBD::Pg",         url => "http://search.cpan.org/~dbdpg/" },
-  { name => "Email::Address",  url => "http://search.cpan.org/~rjbs/" },
-  { name => "FCGI",            url => "http://search.cpan.org/~mstrout/" },
-  { name => "IO::Wrap",        url => "http://search.cpan.org/~dskoll/" },
-  { name => "List::MoreUtils", url => "http://search.cpan.org/~vparseval/" },
-  { name => "PDF::API2",       url => "http://search.cpan.org/~areibens/" },
-  { name => "Template",        url => "http://search.cpan.org/~abw/" },
-  { name => "Text::CSV_XS",    url => "http://search.cpan.org/~hmbrand/" },
-  { name => "Text::Iconv",     url => "http://search.cpan.org/~mpiotr/" },
-  { name => "URI",             url => "http://search.cpan.org/~gaas/" },
-  { name => "XML::Writer",     url => "http://search.cpan.org/~josephw/" },
-  { name => "YAML",            url => "http://search.cpan.org/~ingy/" },
+  { name => "parent",                              url => "http://search.cpan.org/~corion/" },
+  { name => "Archive::Zip",                        url => "http://search.cpan.org/~adamk/" },
+  { name => "Class::Accessor",                     url => "http://search.cpan.org/~kasei/" },
+  { name => "CGI::Ajax",                           url => "http://search.cpan.org/~bct/" },
+  { name => "DateTime",                            url => "http://search.cpan.org/~drolsky/" },
+  { name => "DBI",                                 url => "http://search.cpan.org/~timb/" },
+  { name => "DBD::Pg",                             url => "http://search.cpan.org/~dbdpg/" },
+  { name => "Email::Address",                      url => "http://search.cpan.org/~rjbs/" },
+  { name => "FCGI",                                url => "http://search.cpan.org/~mstrout/" },
+  { name => "IO::Wrap",                            url => "http://search.cpan.org/~dskoll/" },
+  { name => "List::MoreUtils",                     url => "http://search.cpan.org/~vparseval/" },
+  { name => "PDF::API2",                           url => "http://search.cpan.org/~areibens/" },
+  { name => "Template",        version => '2.18',  url => "http://search.cpan.org/~abw/" },
+  { name => "Text::CSV_XS",                        url => "http://search.cpan.org/~hmbrand/" },
+  { name => "Text::Iconv",                         url => "http://search.cpan.org/~mpiotr/" },
+  { name => "URI",                                 url => "http://search.cpan.org/~gaas/" },
+  { name => "XML::Writer",                         url => "http://search.cpan.org/~josephw/" },
+  { name => "YAML",                                url => "http://search.cpan.org/~ingy/" },
 );
 
 @optional_modules = ();
 
+$_->{fullname} = join ' ', grep $_, @$_{qw(name version)}
+  for @required_modules, @optional_modules;
+}
+
 sub module_available {
-  my ($module) = @_;
+  my $module  = $_[0];
+  my $version = $_[1] || '' ;
 
-  if (!defined(eval("require $module;"))) {
-    return 0;
-  } else {
-    return 1;
-  }
+  return eval "use $module $version; 1";
 }
 
 my %conditional_dependencies;
 
 sub check_for_conditional_dependencies {
-  if (!$conditional_dependencies{net_ldap}) {
-    $conditional_dependencies{net_ldap} = 1;
-
-    my $in = IO::File->new('config/authentication.pl', 'r');
-    if ($in) {
-      my $self = {};
-      my $code;
-
-      while (my $line = <$in>) {
-        $code .= $line;
-      }
-      $in->close();
-
-      eval $code;
+  return if $conditional_dependencies{net_ldap}++;
 
-      if (! $EVAL_ERROR) {
+  my $self = {};
+  eval do { local (@ARGV, $/) = 'config/authentication.pl'; <> } or return;
 
-        if ($self->{module} && ($self->{module} eq 'LDAP')) {
-          push @required_modules, { 'name' => 'Net::LDAP', 'url' => 'http://search.cpan.org/~gbarr/' };
-        }
-      }
-    }
-  }
+  push @required_modules, { 'name' => 'Net::LDAP', 'url' => 'http://search.cpan.org/~gbarr/' }
+    if $self->{module} && ($self->{module} eq 'LDAP');
 }
 
 sub test_all_modules {
index e3778d4..7d17aec 100644 (file)
@@ -8,7 +8,8 @@ use constant QUERY              =>  1 << 3;
 use constant TRACE              =>  1 << 4;
 use constant BACKTRACE_ON_ERROR =>  1 << 5;
 use constant REQUEST_TIMER      =>  1 << 6;
-use constant ALL                => (1 << 7) - 1;
+use constant WARN               =>  1 << 7;
+use constant ALL                => (1 << 8) - 1;
 use constant DEVEL              => INFO | QUERY | TRACE | BACKTRACE_ON_ERROR | REQUEST_TIMER;
 
 use constant FILE_TARGET   => 0;
@@ -65,8 +66,8 @@ sub set_target {
 }
 
 sub enter_sub {
-  my ($self, $level) = @_;
-  $level *= 1;
+  my $self  = shift;
+  my $level = shift || 0;
 
   return 1 unless ($global_level & TRACE);          # ignore if traces aren't active
   return 1 if $level && !($global_level & $level);  # ignore if level of trace isn't active
@@ -89,8 +90,8 @@ sub enter_sub {
 }
 
 sub leave_sub {
-  my ($self, $level) = @_;
-  $level *= 1;
+  my $self  = shift;
+  my $level = shift || 0;
 
   return 1 unless ($global_level & TRACE);           # ignore if traces aren't active
   return 1 if $level && !($global_level & $level);   # ignore if level of trace isn't active
@@ -125,10 +126,16 @@ sub show_backtrace {
 }
 
 sub message {
+  no warnings;
   my ($self, $level, $message) = @_;
 
   $self->_write(level2string($level), $message) if (($self->{"level"} | $global_level) & $level || !$level);
 }
+sub warn {
+  no warnings;
+  my ($self, $message) = @_;
+  $self->message(WARN, $message);
+}
 
 sub dump {
   my ($self, $level, $name, $variable) = @_;
@@ -210,6 +217,7 @@ sub is_tracing_enabled {
 }
 
 sub _write {
+  no warnings;
   my ($self, $prefix, $message) = @_;
   my $date = strftime("%Y-%m-%d %H:%M:%S $$ [" . getppid() . "] ${prefix}: ", localtime(time()));
   local *FILE;
@@ -227,8 +235,9 @@ sub _write {
 }
 
 sub level2string {
+  no warnings;
   # use $_[0] as a bit mask and return levelstrings separated by /
-  join '/', qw(info debug1 debug2 query trace error_call_trace)[ grep { (reverse split //, sprintf "%05b", $_[0])[$_] } 0..5 ]
+  join '/', qw(info debug1 debug2 query trace error_call_trace request_timer WARNING)[ grep { (reverse split //, sprintf "%08b", $_[0])[$_] } 0..7 ]
 }
 
 sub begin_request {
index f5f48e7..c25e75a 100644 (file)
@@ -189,7 +189,8 @@ sub save_project {
   CVar->save_custom_variables('dbh'       => $dbh,
                               'module'    => 'Projects',
                               'trans_id'  => $params{id},
-                              'variables' => $form);
+                              'variables' => $form,
+                              'always_valid' => 1);
 
   $dbh->commit();
 
index 206e043..e961f28 100644 (file)
@@ -1,5 +1,6 @@
 package SL::Template::Excel;
 
+use strict;
 use parent qw(SL::Template::Simple);
 
 sub new {
index 2208ff4..6c584d7 100644 (file)
@@ -1,5 +1,7 @@
 package SL::Template::Plugin::T8;
 
+use strict;
+
 use Template::Plugin::Filter;
 use base qw( Template::Plugin::Filter );
 
diff --git a/VERSION b/VERSION
index 6a6a3d8..832eee0 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.6.1
+2.6.2-unstable
index b6526b9..07a6d2e 100644 (file)
@@ -289,7 +289,7 @@ sub form_header {
                    taxzones  => "ALL_TAXZONES");
   $form->get_pricegroup(\%myconfig, { all => 1 });
 
-  $form->get_lists(customers => { key => "ALL_SALESMAN_CUSTOMERS", business_is_salesman => 1, with_obsolete => 1 }) if $::vertreter;
+  $form->get_lists(customers => { key => "ALL_SALESMAN_CUSTOMERS", business_is_salesman => 1 }) if $::vertreter;
 
   $form->{ALL_SALESMEN}   = $form->{ALL_EMPLOYEES};
   $form->{taxincluded}    = ($form->{taxincluded}) ? "checked" : "";
@@ -336,6 +336,29 @@ sub form_footer {
   $main::lxdebug->leave_sub();
 }
 
+sub _do_save {
+  $main::auth->assert('customer_vendor_edit & ' .
+                      '(general_ledger         | invoice_edit         | vendor_invoice_edit | ' .
+                      ' request_quotation_edit | sales_quotation_edit | sales_order_edit    | purchase_order_edit)');
+
+  $::form->isblank("name", $::locale->text("Name missing!"));
+
+  if ($::form->{new_salesman_id} && $::vertreter) {
+    $::form->{salesman_id} = $::form->{new_salesman_id};
+    delete $::form->{new_salesman_id};
+  }
+
+  my $res = $::form->{db} eq 'customer' ? CT->save_customer(\%::myconfig, $::form) : CT->save_vendor(\%::myconfig, $::form);
+
+  if (3 == $res) {
+    if ($::form->{"db"} eq "customer") {
+      $::form->error($::locale->text('This customer number is already in use.'));
+    } else {
+      $::form->error($::locale->text('This vendor number is already in use.'));
+    }
+  }
+}
+
 sub add_transaction {
   $main::lxdebug->enter_sub();
 
@@ -354,12 +377,7 @@ sub add_transaction {
 #  }
 #  # /saving the history
 
-  $form->isblank("name", $locale->text("Name missing!"));
-  if ($form->{"db"} eq "customer") {
-    CT->save_customer(\%myconfig, \%$form);
-  } else {
-    CT->save_vendor(\%myconfig, \%$form);
-  }
+  _do_save();
 
   $form->{callback} = $form->escape($form->{callback}, 1);
   my $name = $form->escape("$form->{name}", 1);
@@ -516,16 +534,8 @@ sub save_and_close {
   my $msg = ucfirst $form->{db};
   $msg .= " saved!";
 
-  $form->isblank("name", $locale->text("Name missing!"));
-  my $rc;
-  if ($form->{"db"} eq "customer") {
-    $rc = CT->save_customer(\%myconfig, \%$form);
-  } else {
-    $rc = CT->save_vendor(\%myconfig, \%$form);
-  }
-  if ($rc == 3) {
-    $form->error($locale->text('customernumber not unique!'));
-  }
+  _do_save();
+
   # saving the history
   if(!exists $form->{addition}) {
     $form->{snumbers} = ($form->{"db"} eq "customer" ? qq|customernumber_| . $form->{customernumber} : qq|vendornumber_| . $form->{vendornumber});
@@ -550,22 +560,8 @@ sub save {
   my $msg = ucfirst $form->{db};
   $msg .= " saved!";
 
-  $form->isblank("name", $locale->text("Name missing!"));
-
-  my $res;
-  if ($form->{"db"} eq "customer") {
-    $res = CT->save_customer(\%myconfig, \%$form);
-  } else {
-    $res = CT->save_vendor(\%myconfig, \%$form);
-  }
+  _do_save();
 
-  if (3 == $res) {
-    if ($form->{"db"} eq "customer") {
-      $form->error($locale->text('This customer number is already in use.'));
-    } else {
-      $form->error($locale->text('This vendor number is already in use.'));
-    }
-  }
   # saving the history
   if(!exists $form->{addition}) {
     $form->{snumbers} = ($form->{"db"} eq "customer" ? qq|customernumber_| . $form->{customernumber} : qq|vendornumber_| . $form->{vendornumber});
index 5c9b550..3fa0da5 100644 (file)
@@ -78,7 +78,8 @@ sub add {
 
   $auth->assert('part_service_assembly_edit');
 
-  $form->{title}           = $locale->text('Add ' . ucfirst $form->{item});
+  my $title                = 'Add ' . ucfirst $form->{item};
+  $form->{title}           = $locale->text($title);
   $form->{callback}        = "$form->{script}?action=add&item=$form->{item}" unless $form->{callback};
   $form->{unit_changeable} = 1;
 
@@ -127,6 +128,8 @@ sub search_update_prices {
 
   my $pricegroups = IC->get_pricegroups(\%myconfig, \%$form);
 
+  $form->{title} = $locale->text('Update Prices');
+
   $form->header;
 
   print $form->parse_html_template('ic/search_update_prices', { PRICE_ROWS => $pricegroups });
@@ -1417,7 +1420,8 @@ sub edit {
 
   $form->{"original_partnumber"} = $form->{"partnumber"};
 
-  $form->{title} = $locale->text('Edit ' . ucfirst $form->{item});
+  my $title      = 'Edit ' . ucfirst $form->{item};
+  $form->{title} = $locale->text($title);
 
   &link_part;
   &display_form;
index 7203f92..8c803fb 100644 (file)
@@ -47,7 +47,7 @@ use strict;
 
 # any custom scripts for this one
 if (-f "bin/mozilla/custom_invoice_io.pl") {
-  eval { require "bin/mozilla/custom_ivvoice_io.pl"; };
+  eval { require "bin/mozilla/custom_invoice_io.pl"; };
 }
 if (-f "bin/mozilla/$main::form->{login}_invoice_io.pl") {
   eval { require "bin/mozilla/$main::form->{login}_invoice_io.pl"; };
index 8f12b61..952405c 100644 (file)
@@ -25,8 +25,8 @@ foreach (@felder) {
   $name = $wert;
 }
 my $login =
-    "[" . $form->{login}
-  . " - <a href=\"login.pl?action=logout\" target=\"_top\">"
+    "". $locale->text('User') . ": " . $form->{login}
+  . "  [<a href=\"login.pl?action=logout\" target=\"_top\" title=\"". $locale->text('Logout now') . "\">"
   . $locale->text('Logout')
   . "</a>] ";
 my ($Sekunden, $Minuten,   $Stunden,   $Monatstag, $Monat,
@@ -108,16 +108,21 @@ window.onload=clockon
 |;
 
 #
+my $framesize = _calc_framesize(); # framesize calculation as in menu.pl is only a quick and dirty hack here
+                                   # it would be better to use a global or config variable
+
 print qq|
 <body bgcolor="#ffffff" text="#ffffff" link="#ffffff" vlink="#ffffff" alink="#ffffff" topmargin="0" leftmargin="0"  marginwidth="0" marginheight="0" style="background-image: url('image/fade.png'); background-repeat:repeat-x;">
-
+<script language='JavaScript' src='js/switchmenuframe.js'></script>
 <table border="0" width="100%" background="image/bg_titel.gif" cellpadding="0" cellspacing="0">
   <tr>
     <td  style="color:white; font-family:verdana,arial,sans-serif; font-size: 12px;">
+      [<a href="JavaScript:Switch_Menu(|.$framesize.qq|);" title="| . $locale->text('Switch Menu on / off') . qq|">| . $locale->text('Menu') . qq|</a>]
+      &nbsp;[<a HREF="login.pl" target="_blank" title="| . $locale->text('Open a further Lx-Office Window or Tab') . qq|">| . $locale->text('New Win/Tab') . qq|</a>]
       &nbsp;[<a href="JavaScript:top.main_window.print();" title="| . $locale->text('Hardcopy') . qq|">| . $locale->text('Print') . qq|</a>]
-      &nbsp;[<a HREF="login.pl" target="_blank" "title="| . $locale->text('Open a further Lx-Office Window or Tab') . qq|">| . $locale->text('New Win/Tab') . qq|</a>]
       &nbsp;[<a href="Javascript:top.main_window.history.back();" title="| . $locale->text('Go one step back') . qq|">| . $locale->text('Back') . qq|</a>]
-      <!-- is there a better solution for Back? Possibly with the callback variable? -->
+      &nbsp;[<a href="Javascript:top.main_window.history.forward();" title="| . $locale->text('Go one step forward') . qq|">| . $locale->text('Fwd') . qq|</a>]
+      <!-- is there any better solution for Back? Possibly with the callback variable? -->
     </td>
     <td align="right" style="vertical-align:middle; color:white; font-family:verdana,arial,sans-serif; font-size: 12px;" nowrap>|
   . $login . $datum . qq| <script>writeclock()</script>&nbsp;
@@ -128,6 +133,16 @@ print qq|
 </html>
 |;
 
+sub _calc_framesize {
+  my $is_lynx_browser   = $ENV{HTTP_USER_AGENT} =~ /links/i;
+  my $is_mobile_browser = $ENV{HTTP_USER_AGENT} =~ /mobile/i;
+  my $is_mobile_style   = $::form->{stylesheet} =~ /mobile/i;
+
+  return  $is_mobile_browser && $is_mobile_style ?  130
+        : $is_lynx_browser                       ?  240
+        :                                           180;
+}
+
 }
 
 1;
index 4902205..95f520f 100644 (file)
@@ -323,6 +323,8 @@ sub add {
   my $form     = $main::form;
   my $locale   = $main::locale;
 
+  $form->{title} = $locale->text('Add License');
+
   if (!$main::lizenzen) {
     $form->error(
                  $locale->text(
@@ -514,6 +516,8 @@ sub search {
   my $form     = $main::form;
   my $locale   = $main::locale;
 
+  $form->{title} = $locale->text('Licenses');
+
   if (!$main::lizenzen) {
     $form->error(
                  $locale->text(
index 072432a..5ecc695 100644 (file)
@@ -162,7 +162,7 @@ sub company_logo {
   $form->{todo_list}  =  create_todo_list('login_screen' => 1) if (!$form->{no_todo_list});
 
   $form->{stylesheet} =  $myconfig{stylesheet};
-  $form->{title}      =  $::locale->text('About');
+  $form->{title}      =  $::locale->text('Lx-Office');
 
   # create the logo screen
   $form->header() unless $form->{noheader};
index 4a46026..115880d 100644 (file)
 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 #######################################################################
 #
-# thre frame layout with refractured menu
+# the frame layout with refractured menu
 #
 # CHANGE LOG:
 #   DS. 2002-03-25  Created
 #  2004-12-14 - New Optik - Marco Welter <mawe@linux-studio.de>
+#  2010-08-19 - Icons for sub entries and one click 
+#               JS switchable HTML-menu - Sven Donath <lxo@dexo.de>
 #######################################################################
 
 use strict;
@@ -61,7 +63,7 @@ sub display {
   print qq|
 <frameset rows="28px,*" cols="*" framespacing="0" frameborder="0">
   <frame  src="kopf.pl" name="kopf"  scrolling="NO">
-  <frameset cols="$framesize,*" framespacing="0" frameborder="0" border="0" >
+  <frameset cols="$framesize,*" framespacing="0" frameborder="0" border="0" id="menuframe" name="menuframe">
     <frame src="$form->{script}?action=acc_menu" name="acc_menu"  scrolling="auto" noresize marginwidth="0">
     <frame src="$callback" name="main_window" scrolling="auto">
   </frameset>
@@ -80,13 +82,13 @@ sub acc_menu {
 
   my $form      = $main::form;
   my $locale    = $main::locale;
-  my $framesize = _calc_framesize();
+  my $framesize = _calc_framesize(); # how to get it into kopf.pl or vice versa?
 
   $mainlevel = $form->{level};
   $mainlevel =~ s/\Q$mainlevel\E--//g;
   my $menu = Menu->new($::menufile);
 
-  $form->{title} = $locale->text('Accounting Menu');
+  $form->{title} = $locale->text('Lx-Office');
 
   $form->header;
 
@@ -96,7 +98,7 @@ sub acc_menu {
 |;
   print qq|<div align="left">\n<table width="|
     . $framesize
-    . qq|" border=0>\n|;
+    . qq|" border="0">\n|;
 
   &section_menu($menu);
 
@@ -129,9 +131,9 @@ sub section_menu {
     $ml    =~ s/--.*//;
     if ($ml eq $mainlevel) { $zeige = 1; }
     else { $zeige = 0; }
-    my $spacer = "&nbsp;" x (($item =~ s/--/--/g) * 1);
+    my $spacer = "&nbsp;" x (($item =~ s/--/--/g) * 2);
     $label =~ s/.*--//g;
-    my $label_icon = $label . ".gif";
+    my $label_icon = $level . "--" . $label . ".png";
     my $mlab       = $label;
     $label      = $locale->text($label);
 
@@ -197,18 +199,29 @@ sub section_menu {
           if ($zeige) {
             if (scalar @chunks <= 1) {
               print
-                qq|<tr><td class="hover" height="13" >$spacer<img src="image/unterpunkt.png"  style="vertical-align:text-top">|
-                . $menu->menuitem(\%myconfig, \%$form, $item, $level)
-                . qq|$label</a></td></tr>\n|;
+                qq|<tr><td class="hover" height="16" >$spacer| 
+                . $menu->menuitem(\%myconfig, \%$form, $item, $level) ;
+              
+            if (-f "image/icons/16x16/$label_icon")
+             { print 
+                qq|<img src="image/icons/16x16/$label_icon" border="0" style="vertical-align:text-top" title="| 
+                . $label 
+                . qq|">&nbsp;&nbsp;| } 
+            else {
+               print qq|<img src="image/unterpunkt.png" border="0" style="vertical-align:text-top">|;   
+                }
+                
+               print
+                 qq|$label</a></td></tr>\n|;
             } else {
               my $tmpitem = $menu->menuitem(\%myconfig, \%$form, $item, $level);
               print
-                qq|<tr><td class="hover" height="13" >$spacer<img src="image/unterpunkt.png"  style="vertical-align:text-top">|
+                qq|<tr><td class="hover" height="16" >$spacer<img src="image/unterpunkt.png"  style="vertical-align:text-top">|
                 . $tmpitem
                 . qq|$chunks[0]</a></td></tr>\n|;
               map {
                 print
-                  qq|<tr style="vertical-align:top""><td class="hover">$spacer<img src="image/unterpunkt.png" style="visibility:hidden; width:23; height=2;">|
+                  qq|<tr style="vertical-align:top""><td class="hover">$spacer<img src="image/unterpunkt.png" style="visibility:hidden; width:24; height=2;">|
                   . $tmpitem
                   . qq|$chunks[$_]</a></td></tr>\n|;
               } 1..$#chunks;
@@ -218,10 +231,10 @@ sub section_menu {
       } else {
         my $ml_ = $form->escape($ml);
         print
-          qq|<tr><td class="bg" height="22" align="left" valign="middle" ><img src="image/$item.png" style="vertical-align:middle">&nbsp;<a href="menu.pl?action=acc_menu&level=$ml_" class="nohover">$label</a>&nbsp;&nbsp;&nbsp;&nbsp;</td></tr>\n|;
+          qq|<tr><td class="bg" height="24" align="left" valign="middle"><a href="menu.pl?action=acc_menu&level=$ml_" class="nohover" title="$label"><img src="image/icons/24x24/$item.png" border="0" style="vertical-align:middle" title="$label">&nbsp;$label</a>&nbsp;&nbsp;&nbsp;&nbsp;</td></tr>\n|;
         &section_menu($menu, $item);
 
-        #print qq|<br>\n|;
+        print qq|\n|;
       }
     }
   }
@@ -235,7 +248,7 @@ sub _calc_framesize {
 
   return  $is_mobile_browser && $is_mobile_style ?  130
         : $is_lynx_browser                       ?  240
-        :                                           190;
+        :                                           180;
 }
 
 1;
index a59ecc9..f854a4a 100644 (file)
@@ -92,6 +92,7 @@ sub search {
    $form->{CUSTOM_VARIABLES_INCLUSION_CODE}) = CVar->render_search_options('variables'      => $form->{CUSTOM_VARIABLES},
                                                                            'include_prefix' => 'l_',
                                                                            'include_value'  => 'Y');
+  $form->{fokus}    = 'getElementById("projectnumber")';
 
   $form->header();
   print $form->parse_html_template('projects/search');
index 945de31..e255717 100644 (file)
@@ -1066,6 +1066,8 @@ sub config_step1 {
 
   $auth->assert('advance_turnover_tax_return');
 
+$form->{title} = $locale->text('Tax Office Preferences');
+
   # edit all taxauthority prefs
 
   $form->header;
index 26f22ce..3857672 100644 (file)
@@ -635,7 +635,9 @@ sub journal {
 
   my $form     = $main::form;
   my %myconfig = %main::myconfig;
+  my $locale   = $main::locale;
 
+  $form->{title} = $locale->text('Report about warehouse transactions');
   $form->get_lists('warehouses' => { 'key'  => 'WAREHOUSES',
                                      'bins' => 'BINS', });
 
@@ -790,7 +792,7 @@ sub report {
 
 #  $form->{fokus}   = "partnumber";
 #  $form->{onload} .= "focus();";
-  $form->{title}   = $locale->text("Report about wareouse contents");
+  $form->{title}   = $locale->text("Report about warehouse contents");
 
   $form->header();
   print $form->parse_html_template("wh/report_filter",
@@ -810,7 +812,7 @@ sub generate_report {
   my %myconfig = %main::myconfig;
   my $locale   = $main::locale;
 
-  $form->{title}   = $locale->text("Report about wareouse contents");
+  $form->{title}   = $locale->text("Report about warehouse contents");
   $form->{sort}  ||= 'partnumber';
   my $sort_col     = $form->{sort};
 
index 205147d..e388b85 100644 (file)
@@ -101,6 +101,7 @@ $pg_restore_exe = "pg_restore";
 # LXDebug::TRACE  - Tracing von Funktionsaufrufen
 # LXDebug::BACKTRACE_ON_ERROR - Vollständiger Aufrufpfad, wenn $form->error() aufgerufen wird
 # LXDebug::REQUEST_TIMER - Timing von Requests loggen
+# LXDebug::WARN - warnings
 # LXDebug::ALL    - alle Debugausgaben
 #
 # LXDebug::DEVEL  - wie INFO | QUERY | TRACE | BACKTRACE_ON_ERROR
@@ -116,4 +117,10 @@ $LXDebug::global_level = LXDebug->NONE;
 # weshalb sie normalerweise deaktiviert ist.
 $LXDebug::watch_form = 0;
 
+# Zum debuggen von Latexausgaben. Wenn diese Option auf 1 gesetzt wird, werden
+# temporäre Dateien, die bei der Erstellung von PDFs aus Latex erzeugt werden,
+# nach Abschluß der Erstellung oder im Fehlerfall nicht gelöscht, damit man sie
+# untersuchen kann.
+$::keep_temp_files = 0;
+
 1;
index e031c3e..6b3b80f 100644 (file)
@@ -99,6 +99,8 @@ $pg_restore_exe = "pg_restore";
 # LXDebug::QUERY  - SQL Queries
 # LXDebug::TRACE  - Tracing von Funktionsaufrufen
 # LXDebug::BACKTRACE_ON_ERROR - Vollständiger Aufrufpfad, wenn $form->error() aufgerufen wird
+# LXDebug::REQUEST_TIMER - Timing von Requests loggen
+# LXDebug::WARN - warnings
 # LXDebug::ALL    - alle Debugausgaben
 #
 # LXDebug::DEVEL  - wie INFO | QUERY | TRACE | BACKTRACE_ON_ERROR
index 01a4c00..1550f01 100644 (file)
@@ -95,6 +95,29 @@ body.menu {
   border-width:1px;
   background:#D4D0C8;
 }
+
+.message_ok {
+    font-size: 10pt;
+       padding:3px;
+       background-color: lightgreen;
+       color: black;
+       font-weight: bolder;
+       text-align:center;
+       border-style:solid;
+       border-width:thin;
+}
+
+.message_error {
+    font-size: 10pt;
+       padding:5px;
+       background-color: #FFAAAA;
+       color: white;
+       font-weight: bolder;
+       text-align:center;
+       border-style:solid;
+       border-width:thin;
+}
+
 /* Bei Listen den Farbwechsel zur besseren Lesbarkeit: */
 .listrow1 { background-color: #C8D4C6; color: black; vertical-align: top; }
 .listrow0 { background-color: white; color: black; vertical-align: top; }
index 1a317d0..b647950 100644 (file)
@@ -81,6 +81,27 @@ body.menu {
   color: black;
 }
 
+.message_ok {
+    font-size: 12pt;
+       padding:5px;
+       background-color: lightgreen;
+       color: black;
+       font-weight: bolder;
+       text-align:center;
+       border-style:solid;
+       border-width:thin;
+}
+
+.message_error {
+    font-size: 12pt;
+       padding:5px;
+       background-color: #FFAAAA;
+       color: black;
+       font-weight: bolder;
+       text-align:center;
+       border-style:solid;
+       border-width:thin;
+}
 
 /*
        Ãœberschriftsbalken
diff --git a/dispatcher.fcgi b/dispatcher.fcgi
new file mode 120000 (symlink)
index 0000000..777f2b6
--- /dev/null
@@ -0,0 +1 @@
+dispatcher.fpl
\ No newline at end of file
index 7c3a3d3..c833994 100644 (file)
@@ -102,6 +102,6 @@ Um die <translate> Operatoren umzuwandeln steht ein Hilfsscript bereit:
 Bitte vorher die Dokumentation von dem Script lesen.
 
 Es gibt einige Fälle die nicht abgedeckt sind davon, aber die sollte mit einem
-Diff danach zu finden sein. vor allem kann es keine LxERP.format_text Aufrufe
+Diff danach zu finden sein. Vor allem kann es keine LxERP.format_text Aufrufe
 umwandeln, und es hat keinen Schutz gegen nicht escapte Anführungszeichen in
 den zu Ã¼bersetzenden Strings.
index 063aa42..06ed3a9 100644 (file)
@@ -38,10 +38,7 @@ eigentliche Programmlogik ausgef
 Folgende Kombinationen sind getestet:
 
  * Apache 2.2.11 (Ubuntu) und mod_fastcgi.
-
-Folgende Kombinationen funktionieren nicht:
-
- * Apache 2.2.11 (Ubuntu) + mod_fcgid:
+ * Apache 2.2.11 (Ubuntu) und mod_fcgid:
 
 Als Perl Backend wird das Modul FCGI.pm verwendet. Vorsicht: FCGI 0.69 und
 höher ist extrem strict in der Behandlung von Unicode, und verweigert bestimmte
@@ -56,13 +53,20 @@ Debian/Ubuntu z.B. mit folgendem Befehl geschehen:
 
   a2enmod fastcgi
 
+bzw.
+
+  a2enmod fcgid
+
 Die Konfiguration für die Verwendung von Lx-Office mit FastCGI erfolgt
 durch Anpassung der vorhandenen Alias- und Directory-Direktiven. Dabei
 wird zwischen dem Installationspfad von Lx-Office im Dateisystem
 ("/path/to/lx-office-erp") und der URL unterschieden, unter der
 Lx-Office im Webbrowser erreichbar ist ("/web/path/to/lx-office-erp").
 
+Folgendes Template funktioniert mit mod_fastcgi:
+
   AliasMatch ^/web/path/to/lx-office-erp/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fpl
+  Alias       /web/path/to/lx-office-erp/          /path/to/lx-office-erp/
 
   <Directory /path/to/lx-office-erp>
     AllowOverride All
@@ -77,6 +81,11 @@ Lx-Office im Webbrowser erreichbar ist ("/web/path/to/lx-office-erp").
     Deny from All
   </DirectoryMatch>
 
+...und für mod_fcgid muss die erste Zeile geändert werden in:
+
+  AliasMatch ^/web/path/to/lx-office-erp/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fcgi
+
+
 Hierdurch wird nur ein zentraler Dispatcher gestartet. Alle Zugriffe
 auf die einzelnen Scripte werden auf diesen umgeleitet. Dadurch, dass
 zur Laufzeit Ã¶fter mal Scripte neu geladen werden, gibt es hier kleine
@@ -84,22 +93,12 @@ Performance-Einbu
 Benutzung von "AddHandler fastcgi-script .pl" vorzuziehen.
 
 
-=head2 Entwicklungsaspekte
-
-Die AddHandler Direktive vom Apache ist entgegen der Dokumentation
-anscheinend nicht lokal auf das Verzeichnis beschränkt sondern global im
-vhost.
-
-Wenn Ã„nderungen in der Konfiguration von Lx-Office gemacht werden, oder wenn
-Templates editiert werden muss der Server neu gestartet werden.
-
 Es ist möglich die gleiche Lx-Office Version parallel unter cgi und fastcgi zu
-betreiben. Da nimmt man Variante 2 wie oben beschrieben, und Ã¤ndert die
-AliasMatch Zeile auf eine andere URL, und lässt alle anderen URLs auch
-weiterleiten:
+betreiben. Dafür bleiben Directorydirektiven bleiben wie oben beschrieben, die
+URLs werden aber umgeleitet:
 
   # Zugriff ohne FastCGI
-  Alias /web/path/to/lx-office-erp /path/to/lx-office-erp
+  Alias       /web/path/to/lx-office-erp                /path/to/lx-office-erp
 
   # Zugriff mit FastCGI:
   AliasMatch ^/web/path/to/lx-office-erp-fcgi/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fpl
@@ -108,6 +107,17 @@ weiterleiten:
 Dann ist unter C</web/path/to/lx-office-erp/> die normale Version erreichbar,
 und unter C</web/opath/to/lx-office-erp-fcgi/> die FastCGI Version.
 
+Achtung:
+
+Die AddHandler Direktive vom Apache ist entgegen der Dokumentation
+anscheinend nicht lokal auf das Verzeichnis beschränkt sondern global im
+vhost.
+
+=head2 Entwicklungsaspekte
+
+Wenn Ã„nderungen in der Konfiguration von Lx-Office gemacht werden, muss der
+Server neu gestartet werden.
+
 Bei der Entwicklung für FastCGI ist auf ein paar Fallstricke zu achten. Dadurch
 dass das Programm in einer Endlosschleife läuft, müssen folgende Aspekte
 geachtet werden:
@@ -120,11 +130,12 @@ kann mit C<die>, C<confess> oder C<carp> Fehler ausgeben, die dann vom Dispatche
 angezeigt werden. Die Lx-Office eigene C<$::form->error()> tut im Prinzip das
 Gleiche, mit ein paar Extraoptionen. C<warn> und C<exit> hingegen werden nicht
 abgefangen. C<warn> wird direkt nach STDERR, also in Server Log eine Nachricht
-schreiben, und C<exit> wird die Ausführung beenden.
+schreiben (sofern in der Konfiguration nicht die Warnungen in das Lx-Office Log
+umgeleitet wurden), und C<exit> wird die Ausführung beenden.
 
 Prinzipiell ist es kein Beinbruch, wenn sich der Prozess beendet, fcgi wird ihn
 sofort neu starten. Allerdings sollte das die Ausnahme sein. Quintessenz: Bitte
-kein C<warn> oder C<exit> benutzen, alle anderen Exceptionmechanismen sind ok.
+kein C<exit> benutzen, alle anderen Exceptionmechanismen sind ok.
 
 =head3 Globale Variablen
 
@@ -133,6 +144,10 @@ m
 Das ist besonders wichtig im C<$::cgi> und C<$::auth> Objekt, weil diese nicht
 gelöscht werden pro Instanz, sondern persistent gehalten werden.
 
+In C<SL::Dispatcher> gibt es einen sauber abgetrennten Block der alle
+kanonischen globalen Variablen listet und erklärt. Bitte keine anderen
+einführen ohne das sauber zu dokumentieren.
+
 Datenbankverbindungen wird noch ein Guide verfasst werden, wie man sichergeht,
 dass man die richtige erwischt.
 
@@ -140,12 +155,20 @@ dass man die richtige erwischt.
 
 Die kritischen Pfade des Programms sind die Belegmasken, und unter diesen ganz
 besonders die Verkaufsrechnungsmaske. Ein Aufruf der Rechnungsmaske in
-Lx-Office 2.4.3 stable dauert auf einem Core2duo mit 2GB Arbeitsspeicher und
+Lx-Office 2.4.3 stable dauert auf einem Core2duo mit 4GB Arbeitsspeicher und
 Ubuntu 9.10 eine halbe Sekunde. In der 2.6.0 sind es je nach Menge der
 definierten Variablen 1-2s. Ab der Moose/Rose::DB Version sind es 5-6s.
 
-Mit FastCGI ist die neuste Version auf 0,4 Sekunden selbst in den kritischen
+Mit FastCGI ist die neuste Version auf 0,26 Sekunden selbst in den kritischen
 Pfaden, unter 0,15 sonst.
 
 =head2 Bekannte Probleme
 
+=head3 Encoding Awareness
+
+UTF-8 kodierte Installationen sind sehr anfällig gegen fehlerhfate Encodings
+unter FCGI. latin9 Installationen behandeln falsch kodierte Zeichen eher
+unwissend, und geben sie einfach weiter. UTF-8 verweigert bei fehlerhaften
+Programmpfaden kurzerhand aus ausliefern. Es wird noch daran gearbeitet alles
+Fehler da zu beseitigen.
+
index c95a834..23ba2e0 100644 (file)
@@ -68,6 +68,8 @@ Class::Accessor
 @item
 CGI::Ajax
 @item
+DateTime
+@item
 DBI
 @item
 DBD::Pg
@@ -109,15 +111,15 @@ Die zu installierenden Pakete können in den verschiedenen Distributionen unters
 
 Für Debian oder Ubuntu benötigen Sie diese Pakete:
 
-@code{apache postgresql libarchive-zip-perl libclass-accessor-perl libdbi-perl libdbd-pg-perl libpg-perl libemail-address-perl libio-stringy-perl liblist-moreutils-perl libpdf-api2-perl libtemplate-perl libtext-csv-xs-perl libtext-iconv-perl lib-uriperl libxml-writer-perl libyaml-perl}
+@code{apache2 postgresql libarchive-zip-perl libclass-accessor-perl libdatetime-perl libdbi-perl libdbd-pg-perl libpg-perl libemail-address-perl libio-stringy-perl liblist-moreutils-perl libpdf-api2-perl libtemplate-perl libtext-csv-xs-perl libtext-iconv-perl liburi-perl libxml-writer-perl libyaml-perl}
 
 Für Fedora Core benötigen Sie diese Pakete:
 
-@code{httpd postgresql-server perl-Class-Accessor perl-DBI perl-DBD-Pg perl-Email-Address perl-IO-stringy perl-List-MoreUtils perl-PDF-API2 perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI perl-XML-Writer perl-YAML}
+@code{httpd postgresql-server perl-Class-Accessor perl-DateTime perl-DBI perl-DBD-Pg perl-Email-Address perl-IO-stringy perl-List-MoreUtils perl-PDF-API2 perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI perl-XML-Writer perl-YAML}
 
 Für OpenSuSE benötigen Sie diese Pakete:
 
-@code{apache2 postgresql-server perl-Archive-Zip perl-Class-Accessor perl-DBI perl-DBD-Pg perl-MailTools perl-IO-stringy perl-List-MoreUtils perl-PDF-API2 perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI perl-XML-Writer perl-YAML}
+@code{apache2 postgresql-server perl-Archive-Zip perl-Class-Accessor perl-DateTime perl-DBI perl-DBD-Pg perl-MailTools perl-IO-stringy perl-List-MoreUtils perl-PDF-API2 perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI perl-XML-Writer perl-YAML}
 
 Lx-Office enthält ein Script, mit dem Ã¼berprüft werden kann, ob alle
 benötigten Perl-Module installiert sind. Der Aufruf lautet wie folgt:
index d8e8f60..86d5687 100644 (file)
@@ -60,6 +60,8 @@ Bestandteil einer Standard-Perl-Installation sind:
 
    * CGI::Ajax
 
+   * DateTime
+
    * DBI
 
    * DBD::Pg
@@ -102,25 +104,25 @@ Distributionen unterschiedlich heißen.
 
    Für Debian oder Ubuntu benötigen Sie diese Pakete:
 
-   `apache postgresql libarchive-zip-perl libclass-accessor-perl
-libdbi-perl libdbd-pg-perl libpg-perl libemail-address-perl
-libio-stringy-perl liblist-moreutils-perl libpdf-api2-perl
-libtemplate-perl libtext-csv-xs-perl libtext-iconv-perl lib-uriperl
-libxml-writer-perl libyaml-perl'
+   `apache2 postgresql libarchive-zip-perl libclass-accessor-perl
+libdatetime-perl libdbi-perl libdbd-pg-perl libpg-perl
+libemail-address-perl libio-stringy-perl liblist-moreutils-perl
+libpdf-api2-perl libtemplate-perl libtext-csv-xs-perl
+libtext-iconv-perl liburi-perl libxml-writer-perl libyaml-perl'
 
    Für Fedora Core benötigen Sie diese Pakete:
 
-   `httpd postgresql-server perl-Class-Accessor perl-DBI perl-DBD-Pg
-perl-Email-Address perl-IO-stringy perl-List-MoreUtils perl-PDF-API2
-perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI
-perl-XML-Writer perl-YAML'
+   `httpd postgresql-server perl-Class-Accessor perl-DateTime perl-DBI
+perl-DBD-Pg perl-Email-Address perl-IO-stringy perl-List-MoreUtils
+perl-PDF-API2 perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv
+perl-URI perl-XML-Writer perl-YAML'
 
    Für OpenSuSE benötigen Sie diese Pakete:
 
    `apache2 postgresql-server perl-Archive-Zip perl-Class-Accessor
-perl-DBI perl-DBD-Pg perl-MailTools perl-IO-stringy perl-List-MoreUtils
-perl-PDF-API2 perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv
-perl-URI perl-XML-Writer perl-YAML'
+perl-DateTime perl-DBI perl-DBD-Pg perl-MailTools perl-IO-stringy
+perl-List-MoreUtils perl-PDF-API2 perl-Template-Toolkit
+perl-Text-CSV_XS perl-Text-Iconv perl-URI perl-XML-Writer perl-YAML'
 
    Lx-Office enthält ein Script, mit dem Ã¼berprüft werden kann, ob alle
 benötigten Perl-Module installiert sind. Der Aufruf lautet wie folgt:
index 6bb34e3..52c3c51 100644 (file)
@@ -42,6 +42,7 @@ aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
 <li>Archive::Zip
 <li>Class::Accessor
 <li>CGI::Ajax
+<li>DateTime
 <li>DBI
 <li>DBD::Pg
 <li>Email::Address
@@ -72,15 +73,15 @@ und braucht nicht nachinstalliert werden.
 
    <p>Für Debian oder Ubuntu benötigen Sie diese Pakete:
 
-   <p><code>apache postgresql libarchive-zip-perl libclass-accessor-perl libdbi-perl libdbd-pg-perl libpg-perl libemail-address-perl libio-stringy-perl liblist-moreutils-perl libpdf-api2-perl libtemplate-perl libtext-csv-xs-perl libtext-iconv-perl lib-uriperl libxml-writer-perl libyaml-perl</code>
+   <p><code>apache2 postgresql libarchive-zip-perl libclass-accessor-perl libdatetime-perl libdbi-perl libdbd-pg-perl libpg-perl libemail-address-perl libio-stringy-perl liblist-moreutils-perl libpdf-api2-perl libtemplate-perl libtext-csv-xs-perl libtext-iconv-perl liburi-perl libxml-writer-perl libyaml-perl</code>
 
    <p>Für Fedora Core benötigen Sie diese Pakete:
 
-   <p><code>httpd postgresql-server perl-Class-Accessor perl-DBI perl-DBD-Pg perl-Email-Address perl-IO-stringy perl-List-MoreUtils perl-PDF-API2 perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI perl-XML-Writer perl-YAML</code>
+   <p><code>httpd postgresql-server perl-Class-Accessor perl-DateTime perl-DBI perl-DBD-Pg perl-Email-Address perl-IO-stringy perl-List-MoreUtils perl-PDF-API2 perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI perl-XML-Writer perl-YAML</code>
 
    <p>Für OpenSuSE benötigen Sie diese Pakete:
 
-   <p><code>apache2 postgresql-server perl-Archive-Zip perl-Class-Accessor perl-DBI perl-DBD-Pg perl-MailTools perl-IO-stringy perl-List-MoreUtils perl-PDF-API2 perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI perl-XML-Writer perl-YAML</code>
+   <p><code>apache2 postgresql-server perl-Archive-Zip perl-Class-Accessor perl-DateTime perl-DBI perl-DBD-Pg perl-MailTools perl-IO-stringy perl-List-MoreUtils perl-PDF-API2 perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI perl-XML-Writer perl-YAML</code>
 
    <p>Lx-Office enthält ein Script, mit dem Ã¼berprüft werden kann, ob alle
 benötigten Perl-Module installiert sind. Der Aufruf lautet wie folgt:
index cb4a188..defff69 100644 (file)
@@ -27,7 +27,7 @@ File Structure
 
 The structure of locales in Lx-Office is:
 
-  lx-office/locale/<lnagcode>/
+  lx-office/locale/<langcode>/
 
 where <langcode> stands for an abbreviation of the language package. The builtin
 packages use two letter ISO 639-1 codes, but the actual name is not relevant for
@@ -72,7 +72,7 @@ The central translation file. It is essentially an inline perlscript
 autogenerated by locales.pl. To generate it, generate the directory and the two
 files mentioned above, and execute
 
-  scripts/locaes.pl <langcode>
+  scripts/locales.pl <langcode>
 
 or simply copy one of the other languages. You will be told how many are missing
 like this:
@@ -81,14 +81,12 @@ like this:
 
   English - 0.6% - 2015/2028 missing
 
-A "missing" file will be generated and can be edited. You can also edit the all
-directly. Edit all that sounds differently in your language, and execute
+A "missing" file will be generated and can be edited. You can also edit the "all" file
+directly. Edit everything you like to fit the target language, and execute
 locales.pl again. See how the missing words get fewer.
 
 
 
-
-
 These three files are necessary for a localization to be working. Other files
 are optional, but will have special effects:
 
@@ -98,7 +96,7 @@ Num2text (optional)
 
 Legacy code from sql ledger. It provides a means for numbers to be converted
 into natural language, like 1523 => one thousand five hundred twenty three. If
-you want to provide it, it must be inlinable perl code which privdes a num2text
+you want to provide it, it must be inlinable perl code which provides a num2text
 sub. If an init sub exists, it will be executed first.
 
 Only used in the check and receipt printing module.
@@ -108,12 +106,12 @@ special_chars
 
 Lx-Office comes with a lot of interfaces to different formats, some of which are
 rather picky with their accepted charset. The special_chars file contains a
-listing of chars not suited for diefferent file format, and provides
+listing of chars not suited for different file format, and provides
 substitutions. It is written in "Simple Ini" style, containing a block for every
 file format.
 
 First entry should be the order of substitution for entries as a whitespace
-separated list. all entries are interpolated, so \n, \x20 and \\ all work.
+separated list. All entries are interpolated, so \n, \x20 and \\ all work.
 
 After that every entry is a special char that should be translated when writing
 text into such a file.
@@ -127,7 +125,7 @@ Example:
   >=&gt;
   \n=<br>
 
-Note how in this example the order is important. Substituting < and > befor &
+Note the importance of the order in this example. Substituting < and > befor &
 would lead to $gt; become &amp;gt;
 
 For a list of valid formats, see the german special_chars entry. As of this
@@ -144,7 +142,7 @@ writing the following are recognized:
 
 The last of which is very machine dependant. Remember that a lot of characters
 are forbidden by some filesystems, for exmaple MS Windows doesn't like ':' in
-its files where linux doesn't mind that. If you want the files created with your
+its files where Linux doesn't mind that. If you want the files created with your
 language pack to be portable, find all chars that could cause trouble.
 
 
@@ -153,7 +151,7 @@ missing (not part of language package)
 
 This is a file generated by scripts/locales.pl while processing your locales.
 It's only to have the missing entries singled out and does not belong to a
-languge package.
+language package.
 
 
 lost (not part of language package)
diff --git a/image/Program.png b/image/Program.png
new file mode 100644 (file)
index 0000000..01509c3
Binary files /dev/null and b/image/Program.png differ
diff --git a/image/Programm.png b/image/Programm.png
deleted file mode 100644 (file)
index 01509c3..0000000
Binary files a/image/Programm.png and /dev/null differ
diff --git a/image/icons/16x16/Program--Logout.png b/image/icons/16x16/Program--Logout.png
new file mode 100644 (file)
index 0000000..eab7516
Binary files /dev/null and b/image/icons/16x16/Program--Logout.png differ
diff --git a/image/icons/16x16/Program--Preferences.png b/image/icons/16x16/Program--Preferences.png
new file mode 100644 (file)
index 0000000..aa51a32
Binary files /dev/null and b/image/icons/16x16/Program--Preferences.png differ
diff --git a/image/icons/16x16/Program--Version.png b/image/icons/16x16/Program--Version.png
new file mode 100644 (file)
index 0000000..22c18fe
Binary files /dev/null and b/image/icons/16x16/Program--Version.png differ
diff --git a/image/icons/16x16/Program.png b/image/icons/16x16/Program.png
new file mode 100644 (file)
index 0000000..cb9d10c
Binary files /dev/null and b/image/icons/16x16/Program.png differ
diff --git a/image/icons/16x16/Programm--Logout.png b/image/icons/16x16/Programm--Logout.png
deleted file mode 100644 (file)
index eab7516..0000000
Binary files a/image/icons/16x16/Programm--Logout.png and /dev/null differ
diff --git a/image/icons/16x16/Programm--Preferences.png b/image/icons/16x16/Programm--Preferences.png
deleted file mode 100644 (file)
index aa51a32..0000000
Binary files a/image/icons/16x16/Programm--Preferences.png and /dev/null differ
diff --git a/image/icons/16x16/Programm--Version.png b/image/icons/16x16/Programm--Version.png
deleted file mode 100644 (file)
index 22c18fe..0000000
Binary files a/image/icons/16x16/Programm--Version.png and /dev/null differ
diff --git a/image/icons/16x16/Programm.png b/image/icons/16x16/Programm.png
deleted file mode 100644 (file)
index cb9d10c..0000000
Binary files a/image/icons/16x16/Programm.png and /dev/null differ
diff --git a/image/icons/24x24/Productivity.png b/image/icons/24x24/Productivity.png
new file mode 100644 (file)
index 0000000..bfa0b5f
Binary files /dev/null and b/image/icons/24x24/Productivity.png differ
diff --git a/image/icons/24x24/Program--Logout.png b/image/icons/24x24/Program--Logout.png
new file mode 100644 (file)
index 0000000..0d94416
Binary files /dev/null and b/image/icons/24x24/Program--Logout.png differ
diff --git a/image/icons/24x24/Program--Preferences.png b/image/icons/24x24/Program--Preferences.png
new file mode 100644 (file)
index 0000000..0800858
Binary files /dev/null and b/image/icons/24x24/Program--Preferences.png differ
diff --git a/image/icons/24x24/Program--Version.png b/image/icons/24x24/Program--Version.png
new file mode 100644 (file)
index 0000000..849a8a5
Binary files /dev/null and b/image/icons/24x24/Program--Version.png differ
diff --git a/image/icons/24x24/Program.png b/image/icons/24x24/Program.png
new file mode 100644 (file)
index 0000000..69eb2b3
Binary files /dev/null and b/image/icons/24x24/Program.png differ
diff --git a/image/icons/24x24/Programm--Logout.png b/image/icons/24x24/Programm--Logout.png
deleted file mode 100644 (file)
index 0d94416..0000000
Binary files a/image/icons/24x24/Programm--Logout.png and /dev/null differ
diff --git a/image/icons/24x24/Programm--Preferences.png b/image/icons/24x24/Programm--Preferences.png
deleted file mode 100644 (file)
index 0800858..0000000
Binary files a/image/icons/24x24/Programm--Preferences.png and /dev/null differ
diff --git a/image/icons/24x24/Programm--Version.png b/image/icons/24x24/Programm--Version.png
deleted file mode 100644 (file)
index 849a8a5..0000000
Binary files a/image/icons/24x24/Programm--Version.png and /dev/null differ
diff --git a/image/icons/24x24/Programm.png b/image/icons/24x24/Programm.png
deleted file mode 100644 (file)
index 69eb2b3..0000000
Binary files a/image/icons/24x24/Programm.png and /dev/null differ
diff --git a/image/icons/24x24/Warehouse.png b/image/icons/24x24/Warehouse.png
new file mode 100644 (file)
index 0000000..d4ad386
Binary files /dev/null and b/image/icons/24x24/Warehouse.png differ
diff --git a/image/icons/32x32/Program--Logout.png b/image/icons/32x32/Program--Logout.png
new file mode 100644 (file)
index 0000000..09969c2
Binary files /dev/null and b/image/icons/32x32/Program--Logout.png differ
diff --git a/image/icons/32x32/Program--Preferences.png b/image/icons/32x32/Program--Preferences.png
new file mode 100644 (file)
index 0000000..c52def9
Binary files /dev/null and b/image/icons/32x32/Program--Preferences.png differ
diff --git a/image/icons/32x32/Program--Version.png b/image/icons/32x32/Program--Version.png
new file mode 100644 (file)
index 0000000..7e1b9bf
Binary files /dev/null and b/image/icons/32x32/Program--Version.png differ
diff --git a/image/icons/32x32/Program.png b/image/icons/32x32/Program.png
new file mode 100644 (file)
index 0000000..341aa25
Binary files /dev/null and b/image/icons/32x32/Program.png differ
diff --git a/image/icons/32x32/Programm--Logout.png b/image/icons/32x32/Programm--Logout.png
deleted file mode 100644 (file)
index 09969c2..0000000
Binary files a/image/icons/32x32/Programm--Logout.png and /dev/null differ
diff --git a/image/icons/32x32/Programm--Preferences.png b/image/icons/32x32/Programm--Preferences.png
deleted file mode 100644 (file)
index c52def9..0000000
Binary files a/image/icons/32x32/Programm--Preferences.png and /dev/null differ
diff --git a/image/icons/32x32/Programm--Version.png b/image/icons/32x32/Programm--Version.png
deleted file mode 100644 (file)
index 7e1b9bf..0000000
Binary files a/image/icons/32x32/Programm--Version.png and /dev/null differ
diff --git a/image/icons/32x32/Programm.png b/image/icons/32x32/Programm.png
deleted file mode 100644 (file)
index 341aa25..0000000
Binary files a/image/icons/32x32/Programm.png and /dev/null differ
diff --git a/js/switchmenuframe.js b/js/switchmenuframe.js
new file mode 100644 (file)
index 0000000..0399a2e
--- /dev/null
@@ -0,0 +1,20 @@
+/* This is used in bin/mozilla/kopf.pl to switch the HTML sidemenu on/off
+   2010, Sven Donath, lxo@dexo.de  */
+
+var vSwitch_Menu = 1;
+
+function Switch_Menu(framesize)
+{
+       if (vSwitch_Menu)
+       {
+               vSwitch_Menu=false;
+                parent.document.getElementById('menuframe').setAttribute('cols','30,*')
+       }
+       else
+       {
+               vSwitch_Menu=true;
+                               framesize = framesize + ',*';
+                parent.document.getElementById('menuframe').setAttribute('cols',framesize);
+    }
+       return;
+}
index e61de8c..2c37213 100644 (file)
@@ -1,4 +1,6 @@
 #!/usr/bin/perl
+# -*- coding: ISO-8859-15; -*-
+# vim: fenc=ISO-8859-15
 
 # These are all the texts to build the translations files.
 # The file has the form of 'english text'  => 'foreign text',
@@ -57,7 +59,6 @@ $self->{texts} = {
   'AR Transaction (abbreviation)' => 'D',
   'AR Transactions'             => 'Debitorenbuchungen',
   'ASSETS'                      => 'AKTIVA',
-  'About'                       => 'über',
   'Abrechnungsnummer'           => 'Abrechnungsnummer',
   'Abteilung'                   => 'Abteilung',
   'Account'                     => 'Konto',
@@ -99,12 +100,10 @@ $self->{texts} = {
   'Account saved!'              => 'Konto gespeichert!',
   'Accounting Group deleted!'   => 'Buchungsgruppe gel&ouml;scht!',
   'Accounting Group saved!'     => 'Buchungsgruppe gespeichert!',
-  'Accounting Menu'             => 'Kontoverwaltung',
   'Accrual'                     => 'Bilanzierung',
   'Active'                      => 'Aktiv',
   'Active?'                     => 'Aktiviert?',
   'Add'                         => 'Erfassen',
-  'Add '                        => 'Hinzufügen',
   'Add AP Transaction'          => 'Kreditorenbuchung',
   'Add AR Transaction'          => 'Debitorenbuchung',
   'Add Account'                 => 'Konto erfassen',
@@ -157,7 +156,7 @@ $self->{texts} = {
   'Add unit'                    => 'Einheit hinzuf&uuml;gen',
   'Address'                     => 'Adresse',
   'Administration'              => 'Administration',
-  'Administration area'         => 'Administrationsbereich',
+  'Administration area'         => 'Administration',
   'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
   'Aktion'                      => 'Aktion',
   'All'                         => 'Alle',
@@ -179,7 +178,6 @@ $self->{texts} = {
   'Amount Due'                  => 'Betrag fällig',
   'Annotations'                 => 'Anmerkungen',
   'Another user with the login #1 does already exist.' => 'Es existiert bereits ein anderer Benutzer mit diesem Login.',
-  'Ansprechpartner'             => 'Ansprechpartner',
   'Ap aging on %s'              => 'Offene Verbindlichkeiten zum %s',
   'Application Error. No Format given' => 'Fehler in der Anwendung. Das Ausgabeformat fehlt.',
   'Application Error. Wrong Format' => 'Fehler in der Anwendung. Falsches Format: ',
@@ -336,13 +334,14 @@ $self->{texts} = {
   'Cannot remove files!'        => 'Dateien können nicht gelöscht werden!',
   'Cannot save account!'        => 'Konto kann nicht gespeichert werden!',
   'Cannot save order!'          => 'Auftrag kann nicht gespeichert werden!',
-  'Cannot save preferences!'    => 'Benutzereinstellungen können nicht gespeichert werden!',
+  'Cannot save preferences!'    => 'Einstellungen können nicht gespeichert werden!',
   'Cannot save quotation!'      => 'Angebot kann nicht gespeichert werden!',
   'Cannot storno storno invoice!' => 'Kann eine Stornorechnung nicht stornieren',
   'Carry over shipping address' => 'Lieferadresse &uuml;bernehmen',
   'Cash'                        => 'Zahlungsverkehr',
   'Cc'                          => 'Cc',
   'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
+  'Change representative to'    => 'Vertreter Ã¤ndern in',
   'Charge Number'               => 'Chargennummer',
   'Charge number'               => 'Chargennummer',
   'Chart'                       => 'Buchungskonto',
@@ -379,7 +378,7 @@ $self->{texts} = {
   'Contact'                     => 'Kontakt',
   'Contact Person'              => 'Ansprechpartner',
   'Contact person (surname)'    => 'Ansprechpartner (Nachname)',
-  'Contacts'                    => 'Kontakte',
+  'Contacts'                    => 'Ansprechpartner',
   'Continue'                    => 'Weiter',
   'Contra'                      => 'gegen',
   'Copies'                      => 'Kopien',
@@ -604,9 +603,8 @@ $self->{texts} = {
   'EUR'                         => 'E/Ãœ-Rechnung',
   'Earlier versions of Lx-Office contained bugs which might have led to wrong entries in the general ledger.' => 'Frühere Versionen von Lx-Office enthielten Bugs, die zu falschen Einträgen im Hauptbuch geführt haben können.',
   'Edit'                        => 'Bearbeiten',
-  'Edit '                       => 'Bearbeiten',
   'Edit Access Rights'          => 'Zugriffsrechte bearbeiten',
-  'Edit Access Rights for Follow-Ups' => 'Zugriffsrechte f&uuml;r Wiedervorlagen bearbeiten',
+  'Edit Access Rights for Follow-Ups' => 'Zugriff auf meine Wiedervorlagen regeln',
   'Edit Account'                => 'Kontodaten bearbeiten',
   'Edit Accounting Group'       => 'Buchungsgruppe bearbeiten',
   'Edit Accounts Payables Transaction' => 'Kreditorenbuchung bearbeiten',
@@ -628,7 +626,7 @@ $self->{texts} = {
   'Edit Lead'                   => 'Kundenquelle bearbeiten',
   'Edit Part'                   => 'Ware bearbeiten',
   'Edit Payment Terms'          => 'Zahlungskonditionen bearbeiten',
-  'Edit Preferences for #1'     => 'Benutzereinstellungen f&uuml;r #1 bearbeiten',
+  'Edit Preferences for #1'     => 'Einstellungen von #1 bearbeiten',
   'Edit Price Factor'           => 'Preisfaktor bearbeiten',
   'Edit Pricegroup'             => 'Preisgruppe bearbeiten',
   'Edit Printer'                => 'Drucker bearbeiten',
@@ -721,7 +719,7 @@ $self->{texts} = {
   'Factor'                      => 'Faktor',
   'Factor missing!'             => 'Der Faktor fehlt.',
   'Falsches Datumsformat!'      => 'Falsches Datumsformat!',
-  'Favorites'                   => 'Favoriten',
+  'Favorites'                   => 'Favoriten (nur im XUL-Menü)',
   'Fax'                         => 'Fax',
   'Feb'                         => 'Feb',
   'February'                    => 'Februar',
@@ -761,6 +759,7 @@ $self->{texts} = {
   'From Date'                   => 'Von',
   'Full Access'                 => 'Vollzugriff',
   'Full access to all functions' => 'Vollzugriff auf alle Funktionen',
+  'Fwd'                         => 'Vorw&auml;rts',
   'GL Transaction'              => 'Dialogbuchung',
   'Gegenkonto'                  => 'Gegenkonto',
   'Gender'                      => 'Geschlecht',
@@ -772,6 +771,7 @@ $self->{texts} = {
   'Generic Tax Report'          => 'USTVA Bericht',
   'Given Name'                  => 'Vorname',
   'Go one step back'            => 'Einen Schritt zur&uuml;ck',
+  'Go one step forward'         => 'Einen Schritt vorw&auml;rts',
   'Greeting'                    => 'Anrede',
   'Greetings'                   => 'Anreden',
   'Group'                       => 'Warengruppe',
@@ -923,11 +923,10 @@ $self->{texts} = {
   'License key'                 => 'Lizenzschlüssel',
   'Licensed to'                 => 'Lizenziert für',
   'Licenses'                    => 'Lizenzen',
-  'Lieferungen'                 => 'Lieferungen',
   'Limit part selection'        => 'Artikelauswahl eingrenzen',
   'Line Total'                  => 'Zeilensumme',
   'Line endings'                => 'Zeilenumbr&uuml;che',
-  'List'                        => 'List',
+  'List'                        => 'Anzeigen',
   'List Accounting Groups'      => 'Buchungsgruppen anzeigen',
   'List Accounts'               => 'Konten anzeigen',
   'List Businesses'             => 'Kunden-/Lieferantentypen anzeigen',
@@ -954,12 +953,14 @@ $self->{texts} = {
   'Lock System'                 => 'System sperren',
   'Lockfile created!'           => 'System gesperrt!',
   'Lockfile removed!'           => 'System entsperrt!',
-  'Login'                       => 'Anmeldung',
+  'Login'                       => 'Anmelden',
   'Login Name'                  => 'Benutzername',
   'Login name missing!'         => 'Loginname fehlt.',
   'Logout'                      => 'Abmelden',
+  'Logout now'                  => 'Lx-Office jetzt verlassen',
   'Long Dates'                  => 'Lange Monatsnamen',
   'Long Description'            => 'Langtext',
+  'Lx-Office'                   => 'Lx-Office',
   'Lx-Office 2.4.0 introduces two new concepts: tax zones and Buchungsgruppen.' => 'Lx-Office 2.4.0 f&uuml;hrt zwei neue Konzepte ein: Steuerzonen und Buchungsgruppen.',
   'Lx-Office can fix these problems automatically.' => 'Lx-Office kann solche Probleme automatisch beheben.',
   'Lx-Office has been switched to group-based access restrictions.' => 'Lx-Office wurde auf eine gruppenbasierte Benutzerzugriffsverwaltung umgestellt.',
@@ -989,6 +990,7 @@ $self->{texts} = {
   'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Medium Number'               => 'Datentr&auml;gernummer',
   'Memo'                        => 'Memo',
+  'Menu'                        => 'Men&uuml;',
   'Message'                     => 'Nachricht',
   'Method'                      => 'Verfahren',
   'Microfiche'                  => 'Mikrofilm',
@@ -1100,7 +1102,7 @@ $self->{texts} = {
   'Oct'                         => 'Okt',
   'October'                     => 'Oktober',
   'Off'                         => 'Aus',
-  'Old (on the side)'           => 'Alt (seitlich)',
+  'Old (on the side)'           => 'Links (HTML)',
   'On'                          => 'An',
   'On Hand'                     => 'Auf Lager',
   'On Order'                    => 'Ist bestellt',
@@ -1126,7 +1128,7 @@ $self->{texts} = {
   'Other users\' follow-ups'    => 'Wiedervorlagen anderer Benutzer',
   'Other values are ignored.'   => 'Andere Eingaben werden ignoriert.',
   'Others'                      => 'Andere',
-  'Otherwise all users will only have access to their own settings.' => 'Andernfalls haben alle Benutzer nur Zugriff auf ihre Benutzereinstellungen.',
+  'Otherwise all users will only have access to their own settings.' => 'Andernfalls haben alle Benutzer nur Zugriff auf ihre Einstellungen.',
   'Otherwise the variable is only available for printing.' => 'Andernfalls steht die Variable nur beim Ausdruck zur Verfügung.',
   'Out of balance transaction!' => 'Buchung ist nicht ausgeglichen!',
   'Out of balance!'             => 'Summen stimmen nicht berein!',
@@ -1210,7 +1212,7 @@ $self->{texts} = {
   'Post payments'               => 'Zahlungen buchen',
   'Postscript'                  => 'Postscript',
   'Posustva_coa'                => 'USTVA Kennz.',
-  'Preferences'                 => 'Benutzereinstellungen',
+  'Preferences'                 => 'Einstellungen',
   'Preferences saved!'          => 'Einstellungen gespeichert!',
   'Prefix for the new bins\' names' => 'Namenspr&auml;fix f&uuml;r die neuen Lagerpl&auml;tze',
   'Preis'                       => 'Preis',
@@ -1252,7 +1254,7 @@ $self->{texts} = {
   'Productivity'                => 'Produktivität',
   'Profit Center'               => 'Erfolgsbereich',
   'Proforma Invoice'            => 'Proformarechnung',
-  'Programm'                    => 'Programm',
+  'Program                    => 'Programm',
   'Project'                     => 'Projekt',
   'Project Number'              => 'Projektnummer',
   'Project Number missing!'     => 'Projektnummer fehlt!',
@@ -1323,8 +1325,8 @@ $self->{texts} = {
   'Removing marked entries from queue ...' => 'Markierte Einträge werden von der Warteschlange entfernt ...',
   'Rename the group'            => 'Gruppe umbenennen',
   'Report Positions'            => 'Berichte',
-  'Report about wareouse contents' => 'Bericht &uuml;ber eingelagerte Waren',
-  'Report about wareouse transactions' => 'Bericht &uuml;ber Lagerbewegungen',
+  'Report about warehouse contents' => 'Lagerbestand anzeigen',
+  'Report about warehouse transactions' => 'Lagerbewegungen anzeigen',
   'Report and misc. Preferences' => 'Sonstige Einstellungen',
   'Report for'                  => 'Bericht für',
   'Reports'                     => 'Berichte',
@@ -1419,7 +1421,7 @@ $self->{texts} = {
   'Services'                    => 'Dienstleistungen',
   'Set Language Values'         => 'Spracheinstellungen',
   'Set eMail text'              => 'eMail Text eingeben',
-  'Setup Menu'                  => 'Menüsetup',
+  'Setup Menu'                  => 'Menü-Variante',
   'Setup Templates'             => 'Vorlagen auswählen',
   'Ship to'                     => 'Lieferadresse',
   'Ship via'                    => 'Transportmittel',
@@ -1484,6 +1486,8 @@ $self->{texts} = {
   'Sum per'                     => 'Summe per',
   'Summen- und Saldenliste'     => 'Summen- und Saldenliste',
   'Superuser name'              => 'Datenbankadministrator',
+  'Supplies'                    => 'Lieferungen',
+  'Switch Menu on / off'        => 'Men&uuml; ein- / ausklappen',
   'System'                      => 'System',
   'TODO list'                   => 'Aufgabenliste',
   'TODO list options'           => 'Aufgabenlistenoptionen',
@@ -1701,7 +1705,7 @@ $self->{texts} = {
   'Top (CSS)'                   => 'Oben (mit CSS)',
   'Top (CSS) new'               => 'Oben (mit CSS, neu)',
   'Top (Javascript)'            => 'Oben (mit Javascript)',
-  'Top (XUL; only for Mozilla Firefox)' => 'Oben (XUL; nur f&uuml;r Mozilla Firefox)',
+  'Top (XUL; only for Mozilla Firefox)' => 'Oben + links (XUL, nur Mozilla Firefox)',
   'Top 100'                     => 'Top 100',
   'Top 100 hinzufuegen'         => 'Top 100 hinzufügen',
   'Top Level'                   => 'Hauptartikelbezeichnung',
@@ -1731,7 +1735,7 @@ $self->{texts} = {
   'Transfer out'                => 'Auslagern',
   'Transfer qty'                => 'Umlagermenge',
   'Translation (%s)'            => '&Uuml;bersetzung (%s)',
-  'Trial Balance'               => 'Summen- u. Saldenliste',
+  'Trial Balance'               => 'Summen- und Saldenliste',
   'Trial balance between %s and %s' => 'Summen- und Saldenlisten vom %s bis zum %s',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Type'                        => 'Typ',
@@ -1777,7 +1781,7 @@ $self->{texts} = {
   'Use As Template'             => 'Als Vorlage verwenden',
   'Use Templates'               => 'benutze Vorlagen',
   'User'                        => 'Benutzer',
-  'User Config'                 => 'Benutzereinstellungen',
+  'User Config'                 => 'Einstellungen',
   'User data migration'         => 'Benutzerdatenmigration',
   'User deleted!'               => 'Benutzer gelöscht!',
   'User migration complete'     => 'Benutzermigration abgeschlossen',
@@ -1873,7 +1877,7 @@ $self->{texts} = {
   'You have to chose which unit to save for each of them.' => 'Sie m&uuml;ssen f&uuml;r jeden Artikel die neue Einheit ausw&auml;hlen.',
   'You have to create at least one group, grant it access to Lx-Office\'s functions and assign users to it.' => 'Sie m&uuml;ssen mindestens eine Benutzergruppe anlegen, ihr Zugriff auf die verschiedenen Funktionsbereiche von Lx-Office gew&auml;hren und Benutzer dieser Gruppe zuordnen.',
   'You have to create new Buchungsgruppen for all the combinations of inventory, income and expense accounts that have been used already.' => 'Sie m&uuml;ssen neue Buchungsgruppen f&uuml;r alle Kombinationen aus Inventar-, Erl&ouml;s- und Aufwandskonto, die bereits benutzt wurden.',
-  'You have to enter a company name in your user preferences (see the "Program" menu, "Preferences").' => 'Sie müssen einen Firmennamen in Ihren Benutzereinstellungen angeben (siehe "Programm"-Menü, "Benuztereinstellungen).',
+  'You have to enter a company name in your user preferences (see the "Program" menu, "Preferences").' => 'Sie müssen einen Firmennamen in Ihren Einstellungen angeben (siehe Menü "Programm", "Einstellungen").',
   'You have to fill in at least an account number, the bank code, the IBAN and the BIC.' => 'Sie müssen zumindest die Kontonummer, die Bankleitzahl, die IBAN und den BIC angeben.',
   'You have to specify a department.' => 'Sie müssen eine Abteilung wählen.',
   'You have to specify an execution date for each antry.' => 'Sie müssen für jeden zu buchenden Eintrag ein Ausführungsdatum angeben.',
@@ -1925,7 +1929,6 @@ $self->{texts} = {
   'cp_greeting to cp_gender migration' => 'Datenumwandlung von Titel nach Geschlecht (cp_greeting to cp_gender)',
   'customer'                    => 'Kunde',
   'customer_list'               => 'kundenliste',
-  'customernumber not unique!'  => 'Die Kundennummer ist schon vergeben',
   'debug'                       => 'Debug',
   'delete'                      => 'Löschen',
   'deliverydate'                => 'Lieferdatum',
index c64472d..d1c54e3 100644 (file)
@@ -1,4 +1,6 @@
 #!/usr/bin/perl
+# -*- coding: ISO-8859-15; -*-
+# vim: fenc=ISO-8859-15
 
 # These are all the texts to build the translations files.
 # The file has the form of 'english text'  => 'foreign text',
@@ -57,7 +59,6 @@ $self->{texts} = {
   'AR Transaction (abbreviation)' => '',
   'AR Transactions'             => 'Sales Transactions',
   'ASSETS'                      => '',
-  'About'                       => '',
   'Abrechnungsnummer'           => '',
   'Abteilung'                   => '',
   'Account'                     => '',
@@ -99,12 +100,10 @@ $self->{texts} = {
   'Account saved!'              => '',
   'Accounting Group deleted!'   => '',
   'Accounting Group saved!'     => '',
-  'Accounting Menu'             => '',
   'Accrual'                     => '',
   'Active'                      => '',
   'Active?'                     => '',
   'Add'                         => '',
-  'Add '                        => '',
   'Add AP Transaction'          => '',
   'Add AR Transaction'          => '',
   'Add Account'                 => '',
@@ -179,7 +178,6 @@ $self->{texts} = {
   'Amount Due'                  => '',
   'Annotations'                 => '',
   'Another user with the login #1 does already exist.' => '',
-  'Ansprechpartner'             => '',
   'Ap aging on %s'              => '',
   'Application Error. No Format given' => '',
   'Application Error. Wrong Format' => '',
@@ -343,6 +341,7 @@ $self->{texts} = {
   'Cash'                        => '',
   'Cc'                          => '',
   'Change Lx-Office installation settings (all menu entries beneath \'System\')' => '',
+  'Change representative to'    => '',
   'Charge Number'               => '',
   'Charge number'               => '',
   'Chart'                       => '',
@@ -603,7 +602,6 @@ $self->{texts} = {
   'EUR'                         => '',
   'Earlier versions of Lx-Office contained bugs which might have led to wrong entries in the general ledger.' => '',
   'Edit'                        => '',
-  'Edit '                       => '',
   'Edit Access Rights'          => '',
   'Edit Access Rights for Follow-Ups' => '',
   'Edit Account'                => '',
@@ -760,6 +758,7 @@ $self->{texts} = {
   'From Date'                   => '',
   'Full Access'                 => '',
   'Full access to all functions' => '',
+  'Fwd'                         => 'Forward',
   'GL Transaction'              => '',
   'Gegenkonto'                  => '',
   'Gender'                      => '',
@@ -771,6 +770,7 @@ $self->{texts} = {
   'Generic Tax Report'          => '',
   'Given Name'                  => '',
   'Go one step back'            => '',
+  'Go one step forward'         => '',
   'Greeting'                    => '',
   'Greetings'                   => '',
   'Group'                       => '',
@@ -922,7 +922,6 @@ $self->{texts} = {
   'License key'                 => '',
   'Licensed to'                 => '',
   'Licenses'                    => '',
-  'Lieferungen'                 => '',
   'Limit part selection'        => '',
   'Line Total'                  => '',
   'Line endings'                => '',
@@ -957,8 +956,10 @@ $self->{texts} = {
   'Login Name'                  => '',
   'Login name missing!'         => '',
   'Logout'                      => '',
+  'Logout now'                  => '',
   'Long Dates'                  => '',
   'Long Description'            => '',
+  'Lx-Office'                   => '',
   'Lx-Office 2.4.0 introduces two new concepts: tax zones and Buchungsgruppen.' => '',
   'Lx-Office can fix these problems automatically.' => '',
   'Lx-Office has been switched to group-based access restrictions.' => '',
@@ -988,6 +989,7 @@ $self->{texts} = {
   'May set the BCC field when sending emails' => '',
   'Medium Number'               => '',
   'Memo'                        => '',
+  'Menu'                        => '',
   'Message'                     => '',
   'Method'                      => '',
   'Microfiche'                  => '',
@@ -1251,7 +1253,7 @@ $self->{texts} = {
   'Productivity'                => '',
   'Profit Center'               => '',
   'Proforma Invoice'            => '',
-  'Programm'                    => '',
+  'Program                    => '',
   'Project'                     => '',
   'Project Number'              => '',
   'Project Number missing!'     => '',
@@ -1322,8 +1324,8 @@ $self->{texts} = {
   'Removing marked entries from queue ...' => '',
   'Rename the group'            => '',
   'Report Positions'            => '',
-  'Report about wareouse contents' => '',
-  'Report about wareouse transactions' => '',
+  'Report about warehouse contents' => '',
+  'Report about warehouse transactions' => '',
   'Report and misc. Preferences' => '',
   'Report for'                  => '',
   'Reports'                     => '',
@@ -1482,6 +1484,8 @@ $self->{texts} = {
   'Sum per'                     => '',
   'Summen- und Saldenliste'     => '',
   'Superuser name'              => '',
+  'Supplies'                    => '',
+  'Switch Menu on / off'        => '',
   'System'                      => '',
   'TODO list'                   => '',
   'TODO list options'           => '',
@@ -1922,7 +1926,6 @@ $self->{texts} = {
   'cp_greeting to cp_gender migration' => '',
   'customer'                    => '',
   'customer_list'               => '',
-  'customernumber not unique!'  => '',
   'debug'                       => '',
   'delete'                      => '',
   'deliverydate'                => '',
diff --git a/locale/en/charset b/locale/en/charset
new file mode 100644 (file)
index 0000000..208bac8
--- /dev/null
@@ -0,0 +1 @@
+ISO-8859-15
diff --git a/locale/en/lost b/locale/en/lost
deleted file mode 100644 (file)
index 4178095..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/usr/bin/perl
-
-# The last 50 texts that have been removed.
-# This file will be auto-generated by locales.pl. Do not edit it.
-
-@lost = (
-  { 'text' => 'GIFI deleted!', 'translation' => '' },
-  { 'text' => 'Assemblies restocked!', 'translation' => '' },
-  { 'text' => 'Amount does not equal applied!', 'translation' => '' },
-  { 'text' => 'Post as new', 'translation' => '' },
-  { 'text' => 'Amount missing!', 'translation' => '' },
-  { 'text' => 'Edit Template', 'translation' => '' },
-  { 'text' => 'Applied', 'translation' => '' },
-  { 'text' => 'Paid in full', 'translation' => '' },
-  { 'text' => 'Cannot stock assemblies!', 'translation' => '' },
-  { 'text' => 'Access Control', 'translation' => '' },
-  { 'text' => 'Password changed!', 'translation' => '' },
-  { 'text' => 'Check printing failed!', 'translation' => '' },
-  { 'text' => 'Oracle Database Administration', 'translation' => '' },
-  { 'text' => 'Check printed!', 'translation' => '' },
-  { 'text' => 'Edit Preferences for', 'translation' => '' },
-  { 'text' => 'Include this account on the customer/vendor forms to flag customer/vendor as taxable?', 'translation' => 'Include this account on debtor/creditor forms to set debtor/creditor taxable?' },
-  { 'text' => 'DBI not installed!', 'translation' => '' },
-  { 'text' => 'successfully created!', 'translation' => '' },
-  { 'text' => 'Order saved!', 'translation' => '' },
-  { 'text' => 'is not a member!', 'translation' => '' },
-  { 'text' => 'Standard', 'translation' => '' },
-  { 'text' => 'Weight Unit', 'translation' => '' },
-  { 'text' => 'Tax Accounts', 'translation' => '' },
-  { 'text' => 'localhost', 'translation' => '' },
-  { 'text' => 'to', 'translation' => '' },
-  { 'text' => 'Hostname missing!', 'translation' => '' },
-  { 'text' => 'Last Numbers & Default Accounts', 'translation' => '' },
-  { 'text' => 'Link', 'translation' => '' },
-  { 'text' => 'Transactions exist, cannot delete customer!', 'translation' => '' },
-  { 'text' => 'Order Entry', 'translation' => '' },
-  { 'text' => 'GIFI missing!', 'translation' => '' },
-  { 'text' => 'Recd', 'translation' => '' },
-  { 'text' => 'Receipt printed!', 'translation' => '' },
-  { 'text' => 'Stock Assembly', 'translation' => '' },
-  { 'text' => 'Administrator', 'translation' => '' },
-  { 'text' => 'Dataset updated!', 'translation' => '' },
-  { 'text' => 'Change Password', 'translation' => '' },
-  { 'text' => 'The following Datasets are not in use and can be deleted', 'translation' => '' },
-  { 'text' => 'hr', 'translation' => '' },
-  { 'text' => 'paid on purchases', 'translation' => '' },
-  { 'text' => 'is already a member!', 'translation' => '' },
-  { 'text' => 'Edit GIFI', 'translation' => '' },
-  { 'text' => 'O', 'translation' => '' },
-  { 'text' => 'Accounts', 'translation' => '' },
-  { 'text' => 'Retained Earnings', 'translation' => '' },
-  { 'text' => 'Ship rcvd', 'translation' => '' },
-  { 'text' => 'Ship', 'translation' => '' },
-  { 'text' => 'There is not enough available of \'#1\' at warehouse \'#2\', bin \'#3\', #4, for the transfer of #5.', 'translation' => '' },
-  { 'text' => 'Warehouse MIgration', 'translation' => '' },
-  { 'text' => 'WEBDAV access', 'translation' => '' },
-);
-
-1;
index e1feedf..2edc346 100644 (file)
--- a/menu.ini
+++ b/menu.ini
@@ -316,7 +316,6 @@ module=gl.pl
 action=search
 
 
-
 [Cash]
 ACCESS=cash
 
@@ -811,22 +810,26 @@ module=admin.pl
 action=login
 
 
-[Programm]
+[Program]
 
-[Programm--Preferences]
+[Program--Preferences]
 module=am.pl
 action=config
 
-[Programm--Logout]
-module=login.pl
-action=logout
-target=_top
+[Program--Administration area]
+module=admin.pl
+action=login
 
-[Programm--Version]
+[Program--Version]
 module=login.pl
 action=company_logo
 no_todo_list=1
 
+[Program--Logout]
+module=login.pl
+action=logout
+target=_top
+
 
 #################################
 # WEISS NOCH NICHT WAS DAMIT IST #
index c7a7cdc..0e6a6c5 100755 (executable)
@@ -1,5 +1,7 @@
 #!/usr/bin/perl -w
 
+use strict;
+
 BEGIN {
   unshift @INC, "modules/override"; # Use our own versions of various modules (e.g. YAML).
   push    @INC, "modules/fallback"; # Only use our own versions of modules if there's no system version.
@@ -9,32 +11,55 @@ use SL::InstallationCheck;
 
 $| = 1;
 
-foreach my $module (@SL::InstallationCheck::required_modules) {
-  print("Looking for $module->{name}...");
-  if (!SL::InstallationCheck::module_available($module->{"name"})) {
-    print(" NOT found\n" .
-          "  The module '$module->{name}' is not available on your system.\n" .
-          "  Please install it with the CPAN shell, e.g.\n" .
-          "    perl -MCPAN -e \"install $module->{name}\"\n" .
-          "  or download it from this URL and install it manually:\n" .
-          "    $module->{url}\n\n");
-  } else {
-    print(" ok\n");
-  }
+check($_, 0) for @SL::InstallationCheck::required_modules;
+check($_, 1) for @SL::InstallationCheck::optional_modules;
+
+sub check {
+  my ($module, $optional) = @_;
+
+  print "Looking for $module->{fullname}...";
+  my $res = SL::InstallationCheck::module_available($module->{"name"}, $module->{version});
+  print $res ? '' : " NOT", " ok\n";
+
+  return if $res;
+
+  my $needed_text = $optional
+    ? 'It is OPTIONAL for Lx-Office but recommended for improved functionality.'
+    : 'It is NEEDED by Lx-Office and must be installed.';
+
+  my @source_texts = source_texts($module);
+  local $" = $/;
+  print <<EOL;
++-----------------------------------------------------------------------------+
+  $module->{fullname} could not be loaded.
+
+  This module is either too old or not available on your system.
+  $needed_text
+
+  Here are some ideas how to get it:
+
+@source_texts
++-----------------------------------------------------------------------------+
+EOL
 }
 
-foreach my $module (@SL::InstallationCheck::optional_modules) {
-  print("Looking for $module->{name} (optional)...");
-  if (!SL::InstallationCheck::module_available($module->{"name"})) {
-    print(" NOT found\n" .
-          "  The module '$module->{name}' is not available on your system.\n" .
-          "  While it is not strictly needed it provides extra functionality\n" .
-          "  and should be installed.\n" .
-          "  You can install it with the CPAN shell, e.g.\n" .
-          "    perl -MCPAN -e \"install $module->{name}\"\n" .
-          "  or download it from this URL and install it manually:\n" .
-          "    $module->{url}\n\n");
-  } else {
-    print(" ok\n");
-  }
+sub source_texts {
+  my ($module) = @_;
+  my @texts;
+  push @texts, <<EOL;
+  - You can get it from CPAN:
+      perl -MCPAN -e "install $module->{name}"
+EOL
+  push @texts, <<EOL if $module->{url};
+  - You can download it from this URL and install it manually:
+      $module->{url}
+EOL
+  push @texts, <<EOL if $module->{debian};
+  - On Debian, Ubuntu and other distros you can install it with apt-get:
+      sudo apt-get install $module->{debian}
+    Note these may be out of date as well if you system is old.
+EOL
+ # TODO: SuSE and Fedora packaging. Windows packaging.
+
+  return @texts;
 }
index 211593f..24b0687 100755 (executable)
@@ -85,6 +85,9 @@ if (-f "$locales_dir/lost") {
   unlink "$locales_dir/lost";
 }
 
+my $charset = slurp("$locales_dir/charset") || 'utf-8';
+chomp $charset;
+
 my %old_texts = %{ $self->{texts} || {} };
 
 map({ handle_file($_, $bindir); } @progfiles);
@@ -157,8 +160,8 @@ EOL
 # add the missing texts and run locales.pl to rebuild
 EOL
   $LOST_HEADER  = <<EOL;
-# The last 50 texts that have been removed.
-# This file will be auto-generated by locales.pl. Do not edit it.
+# The last 50 text strings, that have been removed.
+# This file has been auto-generated by locales.pl. Please don't edit!
 EOL
 }
 
@@ -598,7 +601,7 @@ sub generate_file {
 
   open my $fh, '>', $file or die "$! : $file";
 
-  print $fh "#!/usr/bin/perl\n\n";
+  print $fh "#!/usr/bin/perl\n# -*- coding: $charset; -*-\n# vim: fenc=$charset\n\n";
   print $fh $header, "\n" if $header;
   print $fh "$data_name = $delim[0]\n" if $data_name;
 
@@ -608,6 +611,11 @@ sub generate_file {
   close $fh;
 }
 
+sub slurp {
+  my $file = shift;
+  do { local ( @ARGV, $/ ) = $file; <> }
+}
+
 __END__
 
 =head1 NAME
index 71a2a16..79d8d25 100644 (file)
@@ -9,8 +9,8 @@
   <ul id="maintab" class="shadetabs">
    <li class="selected"><a href="#" rel="billing">[% 'Billing Address' | $T8 %]</a></li>
    <li><a href="#" rel="shipto">[% 'Shipping Address' | $T8 %]</a></li>
-   <li><a href="#" rel="contacts">Ansprechpartner</a></li>
-   <li><a href="#" rel="deliveries">[% 'Lieferungen' | $T8 %]</a></li>
+   <li><a href="#" rel="contacts">[% 'Contacts' | $T8 %]</a></li>
+   <li><a href="#" rel="deliveries">[% 'Supplies' | $T8 %]</a></li>
    <li><a href="#" rel="vcnotes">[% 'Notes' | $T8 %]</a></li>
    [%- IF CUSTOM_VARIABLES.size %]
    <li><a href="#" rel="custom_variables">[% 'Custom Variables' | $T8 %]</a></li>
         -%]
        </td>
       </tr>
+      [%- IF id %]
       <tr>
        <th align="right">[% 'Representative' | $T8 %]</th>
+       <td>
+        <input type="hidden" name="salesman_id" value="[%- HTML.escape(salesman_id) %]"%>
+        [%- HTML.escape(salesman) %]
+       </td>
+      </tr>
+      [%- END %]
+      <tr>
+       <th align="right">
+        [%- IF !id %]
+         [% 'Representative' | $T8 %]
+        [%- ELSE %]
+         [% 'Change representative to' | $T8 %]
+        [%- END %]
+       </th>
        <td>
         [%- INCLUDE generic/multibox.html
-              name      = 'salesman_id',
-              DATA      = ALL_SALESMAN_CUSTOMERS,
-              id_key    = 'id',
-              label_key = 'name',
+              name       = 'new_salesman_id',
+              DATA       = ALL_SALESMAN_CUSTOMERS,
+              id_key     = 'id',
+              label_key  = 'name',
+              show_empty = id,
         -%]
        </td>
       </tr>
     <table>
      <input type="hidden" name="cp_id" value="[% HTML.escape(cp_id) %]">
      <tr>
-      <th align="right">[% 'Ansprechpartner' | $T8 %]</th>
+      <th align="left">[% 'Contacts' | $T8 %]</th>
       <td>
        [%- INCLUDE generic/multibox.html
              name       = 'cp_id',
index 6282085..7d4ef89 100644 (file)
@@ -1,7 +1,7 @@
 [%- USE T8 %]
 [% USE HTML %]<body>
 
- <div class="listtop">[% IF title_error %][% title_error %][% ELSE %][% 'Error!' | $T8 %][% END %]</div>
+ <div class="message_error">[% IF title_error %][% title_error %][% ELSE %][% 'Error!' | $T8 %][% END %]</div>
 
  <p>[% label_error %]</p>
 
index 29e4171..a6f6bd7 100644 (file)
@@ -2,7 +2,7 @@
 [% USE HTML %]<body>
  <table width="100%">
   <tr>
-   <th class="listtop">[% IF title_information %][% title_information %][% ELSE %][% 'Information' | $T8 %][% END %]</th>
+   <th class="message_ok">[% IF title_information %][% title_information %][% ELSE %][% 'Information' | $T8 %][% END %]</th>
   </tr>
   <tr height="5"></tr>
 
index a306456..173d76a 100644 (file)
@@ -1,7 +1,12 @@
 [%- USE T8 %]
 [% USE HTML %][% USE LxERP %]<body>
  [%- DEFAULT myconfig_dbhost = 'localhost' %]
-
+   <noscript>
+   [% INCLUDE 'generic/information.html'
+     title_information = LxERP.t8('Your browser does not currently support Javascript.'),
+     label_information = LxERP.t8('A lot of the usability of Lx-Office has been enhanced with javascript. Although it is currently possible to use every aspect of Lx-Office without javascript, we strongly recommend it. In a future version this may change and javascript may be necessary to access advanced features.'),
+   %]
+   </noscript>
  <center>
   <a class="nomobile" href="http://www.lx-office.org" target="_top"><img src="image/lx-office-erp.png" border="0"></a>
 
      <th colspan="2" align="center"><a href="http://lx-office.org" target="blank">http://lx-office.org</a></th>
     </tr>
    </table>
-
-   <noscript>
-   [% INCLUDE 'generic/information.html'
-     title_information = LxERP.t8('Your browser does not currently support Javascript.'),
-     label_information = LxERP.t8('A lot of the usability of Lx-Office has been enhanced with javascript. Although it is currently possible to use every aspect of Lx-Office without javascript, we strongly recommend it. In a future version this may change and javascript may be necessary to access advanced features.'),
-   %]
-   </noscript>
  </center>
 
  [%- todo_list %]
index 1c421fb..dd82fe5 100644 (file)
@@ -33,7 +33,8 @@
           </table>
 
           <br>
-          <input type="submit" name="action" value="[% 'Login' | $T8 %]" tabindex="3">
+          <input type="hidden" name="action" value="login">
+          <input type="submit" value="[% 'Login' | $T8 %]" tabindex="3">
 
          </td>
         </tr>
index e7b030c..25c74c3 100644 (file)
@@ -1,7 +1,7 @@
 [%- USE T8 %]
-[% USE HTML %]<body>
+[% USE HTML %]<body onload="fokus()">
 
- <form method="post" action="projects.pl">
+ <form method="post" action="projects.pl" name="Form">
 
   <div class="listtop">[% title %]</div>
 
@@ -9,7 +9,7 @@
    <table>
     <tr>
      <th align="right">[% 'Number' | $T8 %]</th>
-     <td><input name="filter.projectnumber" size="20"></td>
+     <td><input name="filter.projectnumber" id="projectnumber" size="20"></td>
     </tr>
 
     <tr>
index 83ba78b..2308794 100644 (file)
@@ -63,7 +63,7 @@
      -->
  </script>
 
- <div class="listtop">[% 'Report about wareouse transactions' | $T8 %]</div>
+ <div class="listtop">[% 'Report about warehouse transactions' | $T8 %]</div>
 
  <form method="post" name="Form" action="wh.pl">
 
index e0ef887..affe4c2 100644 (file)
@@ -63,7 +63,7 @@
      -->
  </script>
 
- <div class="listtop">[% 'Report about wareouse contents' | $T8 %]</div>
+ <div class="listtop">[% 'Report about warehouse contents' | $T8 %]</div>
 
  <form method="post" name="Form" action="wh.pl">
 
index cddc7ba..21130e5 100644 (file)
@@ -2,7 +2,7 @@
 toolbar{
  -moz-appearance:none !important;
  background: url('../image/fade.png');
- border-bottom:1px solid black;
+ border-bottom:1px solid #888;
 }
 
 /* sidebar styles */
@@ -19,14 +19,14 @@ tree{
  width:150px;
  font:12px Arial;
  margin:0px;
- border-right:1px solid black
+ border-right:1px solid #888;
 }
 
 /* menubar styles */
 menubar{
  -moz-appearance:none !important;
  background: url('../image/bg_titel.gif');
- border:0px
+ border:0px;
 }
 
 menu, 
@@ -34,15 +34,20 @@ menuitem{
  font:12px Arial;
 }
 
+menu menu{
+ -moz-appearance: none !important;
+ color:white;
+ background: #35a;
+}
+
 menubar menu{
  -moz-appearance: none !important;
  color:white;
- background: url('../image/bg_titel.gif');
 }
 
 menubar menu:hover{
  -moz-appearance:none !important;
- background:#4466cc;
+ background:#46d;
  color:yellow;
 }
 
@@ -53,5 +58,5 @@ splitter{
  border:0px;
 }
 iframe{
- border-left:1px solid black !important;
+ border-left:1px solid #888 !important;
 }
index 0263d04..4381560 100644 (file)
 <xsl:template match="doc" mode="html">
   <html xmlns="http://www.w3.org/1999/xhtml">
     <head>
-      <meta http-equiv="refresh" content="2;url=menuv3.pl?action=display"/>
+      <meta http-equiv="refresh" content="5;url=menu.pl?action=display"/>
     </head>
-    <body>
-Ihr Browser unterstuetzt kein XUL!<br/>
-wenn die automatische weiterleitung nicht funktioniert klicken sie <a href="menuv3.pl?action=display">hier</a>
+    <body style="background-color: #eee; color: #333;">
+     <div style="margin-top: 2em; margin-left: auto; margin-right: auto; border: solid 0.1em #f88; width: 30em; background-color:#fff; font-size: 0.8em;font-family: Verdana, Arial, Helvetica; padding: 2em;">
+      <h2>XUL-Men&#252; ist aktiviert</h2>
+      <h3>Nur der Firefox-Browser mag das XUL-Men&#252;.</h3>
+      Wir schalten auf die kompatiblere <a href="menu.pl?action=display">HTML-Variante</a> um.
+      <h3>Only the Firefox-Browser likes the XUL-Menu.</h3>
+      We switch to the <a href="menu.pl?action=display">HTML-Version</a> now.      
+     </div>
     </body>
   </html>
 </xsl:template>
@@ -122,7 +127,7 @@ wenn die automatische weiterleitung nicht funktioniert klicken sie <a href="menu
 **********************************************************************************   -->
 <xsl:template match="menu" mode="tree">
 <toolbar>
-<label value="Hauptmenue"/>
+<label value="Hauptmen&#252;"/>
 </toolbar>
   <tree flex="1" onselect="openTreeLink(event)" style="margin:0px;" hidecolumnpicker="true">
     <treecols>
@@ -260,7 +265,7 @@ https://developer.mozilla.org/en/XUL/Attribute/tooltiptext
 <xsl:template name="specialbuttons">
     <toolbarbutton image="image/icons/24x24/Batch Printing.png" oncommand="PrintW(event)" tooltiptext="Drucken"/>
     <toolbarbutton image="image/icons/24x24/Neues Fenster.png" tooltiptext="Neues Fenster" link="menuXML.pl?action=display" target="_top" oncommand="openLinkNewWindow(event)"/>
-    <toolbarbutton image="image/icons/24x24/Programm--Logout.png" link="{/*//item[@id='Programm--Logout']/@link}" target="_top" oncommand="openLink(event)" tooltiptext="Abmelden"/>
+    <toolbarbutton image="image/icons/24x24/Program--Logout.png" link="{/*//item[@id='Program--Logout']/@link}" target="_top" oncommand="openLink(event)" tooltiptext="Abmelden"/>
   <toolbarseparator/>
     <toolbarbutton image="image/icons/24x24/leftarrow_24.png" tooltiptext="Schritt zurück" oncommand="MyGoBack()"/>
     <toolbarbutton image="image/icons/24x24/rightarrow_24.png" tooltiptext="Schritt vor" oncommand="MyGoForward()"/>