]> wagnertech.de Git - kivitendo-erp.git/commitdiff
Ein oben angedocktes, auf CSS basierendes Menü hinzugefügt.
authorMoritz Bunkus <m.bunkus@linet-services.de>
Tue, 16 Jan 2007 09:30:19 +0000 (09:30 +0000)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Tue, 16 Jan 2007 09:30:19 +0000 (09:30 +0000)
14 files changed:
SL/Form.pm
SL/Menu.pm
bin/mozilla/admin.pl
bin/mozilla/am.pl
bin/mozilla/login.pl
bin/mozilla/menuv3.pl [new file with mode: 0644]
css/csshover.htc [new file with mode: 0644]
css/menuv3.css [new file with mode: 0644]
image/expand3.gif [new file with mode: 0644]
locale/de/admin
locale/de/all
locale/de/am
locale/de/menuv3 [new file with mode: 0644]
makesymlinks

index 9b3a67ca6d7bb572d54c734a98889a639b866b16..4bea5f094d4dc51386abb29df1940b52289e6e98 100644 (file)
@@ -349,7 +349,7 @@ sub isblank {
 sub header {
   $main::lxdebug->enter_sub();
 
 sub header {
   $main::lxdebug->enter_sub();
 
-  my ($self) = @_;
+  my ($self, $extra_code) = @_;
 
   if ($self->{header}) {
     $main::lxdebug->leave_sub();
 
   if ($self->{header}) {
     $main::lxdebug->leave_sub();
@@ -439,6 +439,7 @@ function fokus(){document.$self->{fokus}.focus();}
   
   </script>
 
   
   </script>
 
+  $extra_code
 </head>
 
 |;
 </head>
 
 |;
index 5da42e64a06443e3932c839a1aaa02bb2d04875f..b3ffd0f94e0eb82b216610b206cc6ff101975281 100644 (file)
@@ -83,7 +83,7 @@ sub menuitem {
   # add other params
   foreach my $key (keys %{ $self->{$item} }) {
     $str .= "&" . $form->escape($key, 1) . "=";
   # add other params
   foreach my $key (keys %{ $self->{$item} }) {
     $str .= "&" . $form->escape($key, 1) . "=";
-    ($value, $conf) = split /=/, $self->{$item}{$key}, 2;
+    ($value, $conf) = split(/=/, $self->{$item}{$key}, 2);
     $value = $myconfig->{$value} . "/$conf" if ($conf);
     $str .= $form->escape($value, 1);
   }
     $value = $myconfig->{$value} . "/$conf" if ($conf);
     $str .= $form->escape($value, 1);
   }
@@ -99,6 +99,67 @@ sub menuitem {
   return $str;
 }
 
   return $str;
 }
 
+sub menuitem_v3 {
+  $main::lxdebug->enter_sub();
+
+  my ($self, $myconfig, $form, $item, $other) = @_;
+
+  my $module = $form->{script};
+  my $action = "section_menu";
+  my $target = "";
+
+  if ($self->{$item}{module}) {
+    $module = $self->{$item}{module};
+  }
+  if ($self->{$item}{action}) {
+    $action = $self->{$item}{action};
+  }
+  if ($self->{$item}{target}) {
+    $target = $self->{$item}{target};
+  }
+
+  my $level = $form->escape($item);
+
+  my $str = qq|<a href="$module?action=| . $form->escape($action) .
+    qq|&level=| . $form->escape($level);
+  map({ $str .= "&${_}=" . $form->escape($form->{$_}); } qw(path login password));
+
+  my @vars = qw(module action target href);
+
+  if ($self->{$item}{href}) {
+    $str  = qq|<a href=$self->{$item}{href}|;
+    @vars = qw(module target href);
+  }
+
+  map { delete $self->{$item}{$_} } @vars;
+
+  # add other params
+  foreach my $key (keys %{ $self->{$item} }) {
+    $str .= "&" . $form->escape($key, 1) . "=";
+    ($value, $conf) = split(/=/, $self->{$item}{$key}, 2);
+    $value = $myconfig->{$value} . "/$conf" if ($conf);
+    $str .= $form->escape($value, 1);
+  }
+
+  $str .= '"';
+
+  if ($target) {
+    $str .= qq| target="| . $form->quote($target) . qq|"|;
+  }
+
+  if ($other) {
+    foreach my $key (keys(%{$other})) {
+      $str .= qq| ${key}="| . $form->quote($other->{$key}) . qq|"|;
+    }
+  }
+
+  $str .= ">";
+
+  $main::lxdebug->leave_sub();
+
+  return $str;
+}
+
 sub menuitemNew {
   my ($self, $myconfig, $form, $item) = @_;
 
 sub menuitemNew {
   my ($self, $myconfig, $form, $item) = @_;
 
@@ -128,7 +189,7 @@ sub menuitemNew {
   # add other params
   foreach my $key (keys %{ $self->{$item} }) {
     $str .= "&" . $form->escape($key, 1) . "=";
   # add other params
   foreach my $key (keys %{ $self->{$item} }) {
     $str .= "&" . $form->escape($key, 1) . "=";
-    ($value, $conf) = split /=/, $self->{$item}{$key}, 2;
+    ($value, $conf) = split(/=/, $self->{$item}{$key}, 2);
     $value = $myconfig->{$value} . "/$conf" if ($conf);
     $str .= $form->escape($value, 1);
   }
     $value = $myconfig->{$value} . "/$conf" if ($conf);
     $str .= $form->escape($value, 1);
   }
@@ -150,7 +211,7 @@ sub access_control {
     @menu = grep { /^${menulevel}--/ } @{ $self->{ORDER} };
   }
 
     @menu = grep { /^${menulevel}--/ } @{ $self->{ORDER} };
   }
 
-  my @a    = split /;/, $myconfig->{acs};
+  my @a    = split(/;/, $myconfig->{acs});
   my $excl = ();
 
   # remove --AR, --AP from array
   my $excl = ();
 
   # remove --AR, --AP from array
index cd08e3f9f050f44d412586e2c53ce7b762f38f84..2eb53876cc29b7aecf22f5237a17f7ff7e06501e 100644 (file)
@@ -601,7 +601,9 @@ sub form_header {
        </tr>
        <tr>
            <th align=right>| . $locale->text('Setup Menu') . qq|</th>
        </tr>
        <tr>
            <th align=right>| . $locale->text('Setup Menu') . qq|</th>
-           <td><input name=menustyle type=radio class=radio value=neu $menustyle_neu>&nbsp;| .
+           <td><input name=menustyle type=radio class=radio value=v3 $menustyle_v3>&nbsp;| .
+           $locale->text("Top (CSS)") . qq|
+           <input name=menustyle type=radio class=radio value=neu $menustyle_neu>&nbsp;| .
            $locale->text("Top (Javascript)") . qq|
            <input name=menustyle type=radio class=radio value=old $menustyle_old>&nbsp;| .
            $locale->text("Old (on the side)") . qq|
            $locale->text("Top (Javascript)") . qq|
            <input name=menustyle type=radio class=radio value=old $menustyle_old>&nbsp;| .
            $locale->text("Old (on the side)") . qq|
index 86b4eb20ab86436e8c987ad53783ff2befa08fd9..1fe78205cfe8aa2cf2bc633b488a2348f8db793f 100644 (file)
@@ -3074,7 +3074,9 @@ sub config {
        </tr>
        <tr>
          <th align=right>| . $locale->text('Setup Menu') . qq|</th>
        </tr>
        <tr>
          <th align=right>| . $locale->text('Setup Menu') . qq|</th>
-         <td><input name=menustyle type=radio class=radio value=neu $menustyle_neu>&nbsp;| .
+         <td><input name=menustyle type=radio class=radio value=v3 $menustyle_v3>&nbsp;| .
+    $locale->text("Top (CSS)") . qq|
+         <input name=menustyle type=radio class=radio value=neu $menustyle_neu>&nbsp;| .
     $locale->text("Top (Javascript)") . qq|
     <input name=menustyle type=radio class=radio value=old $menustyle_old>&nbsp;| .
     $locale->text("Old (on the side)") . qq|</td>
     $locale->text("Top (Javascript)") . qq|
     <input name=menustyle type=radio class=radio value=old $menustyle_old>&nbsp;| .
     $locale->text("Old (on the side)") . qq|</td>
index 770df5ce361b669d591d1f14b11b299b6d717e3e..9541684aa3d44095bfc10a3cb2a9065557f0aafe 100644 (file)
@@ -149,7 +149,10 @@ sub login {
   }
 
   # made it this far, execute the menu
   }
 
   # made it this far, execute the menu
-  if ($user->{menustyle} eq "neu") {
+  if ($user->{menustyle} eq "v3") {
+    $form->{callback} =
+      "menuv3.pl?login=$form->{login}&password=$form->{password}&path=$form->{path}&action=display";
+  } elsif ($user->{menustyle} eq "neu") {
     $form->{callback} =
       "menunew.pl?login=$form->{login}&password=$form->{password}&path=$form->{path}&action=display";
   } else {
     $form->{callback} =
       "menunew.pl?login=$form->{login}&password=$form->{password}&path=$form->{path}&action=display";
   } else {
diff --git a/bin/mozilla/menuv3.pl b/bin/mozilla/menuv3.pl
new file mode 100644 (file)
index 0000000..807db35
--- /dev/null
@@ -0,0 +1,250 @@
+#=====================================================================
+# LX-Office ERP
+# Copyright (C) 2004
+# Based on SQL-Ledger Version 2.1.9
+# Web http://www.lx-office.org
+#
+######################################################################
+# SQL-Ledger Accounting
+# Copyright (c) 1998-2002
+#
+#  Author: Dieter Simader
+#   Email: dsimader@sql-ledger.org
+#     Web: http://www.sql-ledger.org
+#
+#  Contributors: Christopher Browne
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#######################################################################
+#
+# thre frame layout with refractured menu
+#
+#######################################################################
+
+$menufile = "menu.ini";
+use SL::Menu;
+
+1;
+
+# end of main
+
+sub display {
+  $form->header(qq|<link rel="stylesheet" href="css/menuv3.css?id=| .
+                int(rand(100000)) . qq|" type="text/css">|);
+
+  print(qq|<body>\n|);
+
+  clock_line();
+
+  print qq|
+
+<div id="menu">
+
+| . acc_menu() . qq|
+
+</div>
+
+<div style="clear: both;"></div>
+
+<iframe id="win1" src="login.pl?login=$form->{login}&password=$form->{password}&action=company_logo&path=$form->{path}" width="100%" height="93%" name="main_window" style="position: absolute; border: 0px; z-index: 99; ">
+<p>Ihr Browser kann leider keine eingebetteten Frames anzeigen.
+</p>
+</iframe>
+</body>
+</html>
+
+|;
+
+}
+
+sub clock_line {
+
+  $login = "["
+    . $form->{login}
+    . " - <a href=\"login.pl?path="
+    . $form->{"path"}
+    . "&password="
+    . $form->{"password"}
+    . "&action=logout\" target=\"_top\">"
+    . $locale->text('Logout')
+    . "</a>] ";
+  my ($Sekunden, $Minuten,   $Stunden,   $Monatstag, $Monat,
+      $Jahr,     $Wochentag, $Jahrestag, $Sommerzeit)
+    = localtime(time);
+  my $CTIME_String = localtime(time);
+  $Monat     += 1;
+  $Jahrestag += 1;
+  $Monat     = $Monat < 10     ? $Monat     = "0" . $Monat     : $Monat;
+  $Monatstag = $Monatstag < 10 ? $Monatstag = "0" . $Monatstag : $Monatstag;
+  $Jahr += 1900;
+  my @Wochentage = ("Sonntag",    "Montag",  "Dienstag", "Mittwoch",
+                    "Donnerstag", "Freitag", "Samstag");
+  my @Monatsnamen = ("",       "Januar",    "Februar", "M&auml;rz",
+                     "April",  "Mai",       "Juni",    "Juli",
+                     "August", "September", "Oktober", "November",
+                     "Dezember");
+  $datum =
+      $Wochentage[$Wochentag] . ", der "
+    . $Monatstag . "."
+    . $Monat . "."
+    . $Jahr . " - ";
+
+  #$zeit="<div id='Uhr'>".$Stunden.":".$Minuten.":".$Sekunden."</div>";
+  $zeit = "<div id='Uhr'>" . $Stunden . ":" . $Minuten . "</div>";
+  print qq|
+<script type="text/javascript">
+<!--
+var clockid=new Array()
+var clockidoutside=new Array()
+var i_clock=-1
+var thistime= new Date()
+var hours= | . $Stunden . qq|;
+var minutes= | . $Minuten . qq|;
+var seconds= | . $Sekunden . qq|;
+if (eval(hours) <10) {hours="0"+hours}
+if (eval(minutes) < 10) {minutes="0"+minutes}
+if (seconds < 10) {seconds="0"+seconds}
+//var thistime = hours+":"+minutes+":"+seconds
+var thistime = hours+":"+minutes
+
+function writeclock() {
+       i_clock++
+       if (document.all \|\| document.getElementById \|\| document.layers) {
+               clockid[i_clock]="clock"+i_clock
+               document.write("<font family=arial size=2><span id='"+clockid[i_clock]+"' style='position:relative'>"+thistime+"</span></font>")
+       }
+}
+
+function clockon() {
+       thistime= new Date()
+       hours=thistime.getHours()
+       minutes=thistime.getMinutes()
+       seconds=thistime.getSeconds()
+       if (eval(hours) <10) {hours="0"+hours}
+       if (eval(minutes) < 10) {minutes="0"+minutes}
+       if (seconds < 10) {seconds="0"+seconds}
+       //thistime = hours+":"+minutes+":"+seconds
+       thistime = hours+":"+minutes
+
+       if (document.all) {
+               for (i=0;i<=clockid.length-1;i++) {
+                       var thisclock=eval(clockid[i])
+                       thisclock.innerHTML=thistime
+               }
+       }
+
+       if (document.getElementById) {
+               for (i=0;i<=clockid.length-1;i++) {
+                       document.getElementById(clockid[i]).innerHTML=thistime
+               }
+       }
+       var timer=setTimeout("clockon()",60000)
+}
+//window.onload=clockon
+//-->
+</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;"> &nbsp; [<a href="JavaScript:top.main_window.print()">drucken</a>]</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;
+               </td>
+       </tr>
+</table>
+|;
+}
+
+sub acc_menu {
+  $locale = Locale->new($language, "menu");
+
+  $mainlevel = $form->{level};
+  $mainlevel =~ s/$mainlevel--//g;
+  my $menu = new Menu "$menufile";
+  $menu = new Menu "custom_$menufile" if (-f "custom_$menufile");
+  $menu = new Menu "$form->{login}_$menufile"
+    if (-f "$form->{login}_$menufile");
+
+  $| = 1;
+
+  return print_menu($menu);
+}
+
+sub my_length {
+  my ($s) = @_;
+  my $len = 0;
+  my $i;
+  my $skip = 0;
+
+  for ($i = 0; $i < length($s); $i++) {
+    my $c = substr($s, $i, 1);
+    if ($skip && ($c eq ";")) {
+      $skip = 0;
+    } elsif ($skip) {
+      next;
+    } elsif ($c eq "&") {
+      $skip = 1;
+      $len++;
+    } else {
+      $len++;
+    }
+  }
+
+  return $len;
+}
+
+sub print_menu {
+  my ($menu, $parent, $depth) = @_;
+  my $html;
+
+  die if ($depth * 1 > 5);
+
+  my @menuorder;
+
+  @menuorder = $menu->access_control(\%myconfig, $parent);
+
+  $parent .= "--" if ($parent);
+
+  foreach my $item (@menuorder) {
+    substr($item, 0, length($parent)) = "";
+    next if (($item eq "") || ($item =~ /--/));
+
+    my $menu_item = $menu->{"${parent}${item}"};
+    my $menu_title = $locale->text($item);
+    my $menu_text = $menu_title;
+
+    $menu_text =~ s/ /<br>/ if ($parent && (my_length($menu_text) >= 17));
+
+    my $target = "main_window";
+    $target = $menu_item->{"target"} if ($menu_item->{"target"});
+
+    if ($menu_item->{"submenu"} || !defined($menu_item->{"module"}) ||
+        ($menu_item->{"module"} eq "menu.pl")) {
+
+      my $h = print_menu($menu, "${parent}${item}", $depth * 1 + 1);
+      if (!$parent) {
+        $html .= qq|<ul><li><h2>${menu_text}</h2><ul>${h}</ul></li></ul>|;
+      } else {
+        $html .= qq|<li><div class="x">${menu_text}</div><ul>${h}</ul></li>|;
+      }
+    } else {
+      $html .= qq|<li>|;
+      $html .= $menu->menuitem_v3(\%myconfig, $form, "${parent}$item",
+                                  { "title" => $menu_title,
+                                    "target" => $target });
+      $html .= qq|${menu_text}</a></li>|;
+    }
+  }
+
+  return $html;
+}
diff --git a/css/csshover.htc b/css/csshover.htc
new file mode 100644 (file)
index 0000000..e2dcced
--- /dev/null
@@ -0,0 +1,121 @@
+<attach event="ondocumentready" handler="parseStylesheets" />\r
+<script>\r
+/**\r
+ *     Whatever:hover - V2.02.060206 - hover, active & focus\r
+ *     ------------------------------------------------------------\r
+ *     (c) 2005 - Peter Nederlof\r
+ *     Peterned - http://www.xs4all.nl/~peterned/\r
+ *     License  - http://creativecommons.org/licenses/LGPL/2.1/\r
+ *\r
+ *     Whatever:hover is free software; you can redistribute it and/or\r
+ *     modify it under the terms of the GNU Lesser General Public\r
+ *     License as published by the Free Software Foundation; either\r
+ *     version 2.1 of the License, or (at your option) any later version.\r
+ *\r
+ *     Whatever:hover is distributed in the hope that it will be useful,\r
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ *     Lesser General Public License for more details.\r
+ *\r
+ *     Credits and thanks to:\r
+ *     Arnoud Berendsen, Martin Reurings, Robert Hanson\r
+ *\r
+ *     howto: body { behavior:url("csshover.htc"); }\r
+ *     ------------------------------------------------------------\r
+ */\r
+\r
+var csshoverReg = /(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active))|((a|input|textarea)([#.][^ ]+)?:unknown)/i,\r
+currentSheet, doc = window.document, hoverEvents = [], activators = {\r
+       onhover:{on:'onmouseover', off:'onmouseout'},\r
+       onactive:{on:'onmousedown', off:'onmouseup'},\r
+       onunknown:{on:'onfocus', off:'onblur'}\r
+}\r
+\r
+function parseStylesheets() {\r
+       if(!/MSIE (5|6)/.test(navigator.userAgent)) return;\r
+       window.attachEvent('onunload', unhookHoverEvents);\r
+       var sheets = doc.styleSheets, l = sheets.length;\r
+       for(var i=0; i<l; i++) \r
+               parseStylesheet(sheets[i]);\r
+}\r
+       function parseStylesheet(sheet) {\r
+               if(sheet.imports) {\r
+                       try {\r
+                               var imports = sheet.imports, l = imports.length;\r
+                               for(var i=0; i<l; i++) parseStylesheet(sheet.imports[i]);\r
+                       } catch(securityException){}\r
+               }\r
+\r
+               try {\r
+                       var rules = (currentSheet = sheet).rules, l = rules.length;\r
+                       for(var j=0; j<l; j++) parseCSSRule(rules[j]);\r
+               } catch(securityException){}\r
+       }\r
+\r
+       function parseCSSRule(rule) {\r
+               var select = rule.selectorText, style = rule.style.cssText;\r
+               if(!csshoverReg.test(select) || !style) return;\r
+               \r
+               var pseudo = select.replace(/[^:]+:([a-z-]+).*/i, 'on$1');\r
+               var newSelect = select.replace(/(\.([a-z0-9_-]+):[a-z]+)|(:[a-z]+)/gi, '.$2' + pseudo);\r
+               var className = (/\.([a-z0-9_-]*on(hover|active|unknown))/i).exec(newSelect)[1];\r
+               var affected = select.replace(/:(hover|active|unknown).*$/, '');\r
+               var elements = getElementsBySelect(affected);\r
+               if(elements.length == 0) return;\r
+\r
+               currentSheet.addRule(newSelect, style);\r
+               for(var i=0; i<elements.length; i++)\r
+                       new HoverElement(elements[i], className, activators[pseudo]);\r
+       }\r
+\r
+function HoverElement(node, className, events) {\r
+       if(!node.hovers) node.hovers = {};\r
+       if(node.hovers[className]) return;\r
+       node.hovers[className] = true;\r
+       hookHoverEvent(node, events.on, function() { node.className += ' ' + className; });\r
+       hookHoverEvent(node, events.off, function() { node.className = node.className.replace(new RegExp('\\s+'+className, 'g'),''); });\r
+}\r
+       function hookHoverEvent(node, type, handler) {\r
+               node.attachEvent(type, handler);\r
+               hoverEvents[hoverEvents.length] = { \r
+                       node:node, type:type, handler:handler \r
+               };\r
+       }\r
+\r
+       function unhookHoverEvents() {\r
+               for(var e,i=0; i<hoverEvents.length; i++) {\r
+                       e = hoverEvents[i]; \r
+                       e.node.detachEvent(e.type, e.handler);\r
+               }\r
+       }\r
+\r
+function getElementsBySelect(rule) {\r
+       var parts, nodes = [doc];\r
+       parts = rule.split(' ');\r
+       for(var i=0; i<parts.length; i++) {\r
+               nodes = getSelectedNodes(parts[i], nodes);\r
+       }       return nodes;\r
+}\r
+       function getSelectedNodes(select, elements) {\r
+               var result, node, nodes = [];\r
+               var identify = (/\#([a-z0-9_-]+)/i).exec(select);\r
+               if(identify) {\r
+                       var element = doc.getElementById(identify[1]);\r
+                       return element? [element]:nodes;\r
+               }\r
+               \r
+               var classname = (/\.([a-z0-9_-]+)/i).exec(select);\r
+               var tagName = select.replace(/(\.|\#|\:)[a-z0-9_-]+/i, '');\r
+               var classReg = classname? new RegExp('\\b' + classname[1] + '\\b'):false;\r
+               for(var i=0; i<elements.length; i++) {\r
+                       result = tagName? elements[i].all.tags(tagName):elements[i].all; \r
+                       for(var j=0; j<result.length; j++) {\r
+                               node = result[j];\r
+                               if(classReg && !classReg.test(node.className)) continue;\r
+                               nodes[nodes.length] = node;\r
+                       }\r
+               }       \r
+               \r
+               return nodes;\r
+       }\r
+</script>
\ No newline at end of file
diff --git a/css/menuv3.css b/css/menuv3.css
new file mode 100644 (file)
index 0000000..cbb2d66
--- /dev/null
@@ -0,0 +1,132 @@
+body {\r
+behavior:url("css/csshover.htc");\r
+}\r
+\r
+#menu{\r
+width:100%;\r
+float:left;\r
+}\r
+\r
+#menu a, #menu h2, #menu div.x {\r
+font:11px/16px arial,helvetica,sans-serif;\r
+display:block;\r
+border-width:1px;\r
+border-style:solid;\r
+border-color:#ccc #888 #555 #bbb;\r
+white-space:nowrap;\r
+margin:0;\r
+padding:1px 0 1px 3px;\r
+}\r
+\r
+#menu h2{\r
+color:#fff;\r
+background:#000 url(../image/expand3.gif) no-repeat 100% 100%;\r
+}\r
+\r
+#menu a{\r
+background:#eee;\r
+text-decoration:none;\r
+}\r
+\r
+#menu a, #menu a:visited{\r
+color:#000;\r
+}\r
+\r
+#menu a:hover{\r
+color:#a00;\r
+background:#ddd;\r
+}\r
+\r
+#menu a:active{\r
+color:#060;\r
+background:#ccc;\r
+}\r
+\r
+#menu ul{\r
+list-style:none;\r
+margin:0;\r
+padding:0;\r
+float:left;\r
+width:9em;\r
+}\r
+\r
+#menu li{\r
+position:relative;\r
+}\r
+\r
+#menu ul ul{\r
+position:absolute;\r
+z-index:500;\r
+top:auto;\r
+display:none;\r
+}\r
+\r
+#menu ul ul ul{\r
+top:0;\r
+left:100%;\r
+}\r
+\r
+/* Begin non-anchor hover selectors */\r
+\r
+/* Enter the more specific element (div) selector\r
+on non-anchor hovers for IE5.x to comply with the\r
+older version of csshover.htc - V1.21.041022. It\r
+improves IE's performance speed to use the older\r
+file and this method */\r
+\r
+div#menu h2:hover{\r
+background:#000 url(../image/expand3.gif) no-repeat -999px -9999px;\r
+}\r
+\r
+div#menu li:hover{\r
+cursor:pointer;\r
+z-index:100;\r
+}\r
+\r
+div#menu li:hover ul ul,\r
+div#menu li li:hover ul ul,\r
+div#menu li li li:hover ul ul,\r
+div#menu li li li li:hover ul ul\r
+{display:none;}\r
+\r
+div#menu li:hover ul,\r
+div#menu li li:hover ul,\r
+div#menu li li li:hover ul,\r
+div#menu li li li li:hover ul\r
+{display:block;}\r
+\r
+/* End of non-anchor hover selectors */\r
+\r
+/* Styling for Expand */\r
+\r
+#menu a.x, #menu a.x:visited{\r
+/*font-weight:bold;*/\r
+color:#000;\r
+background:#eee url(../image/expand3.gif) no-repeat 100% 100%;\r
+}\r
+\r
+#menu a.x:hover{\r
+color:#fff;\r
+background:#000;\r
+}\r
+\r
+#menu a.x:active{\r
+color:#060;\r
+background:#ccc;\r
+}\r
+\r
+#menu div.x, #menu div.x:visited{\r
+/*font-weight:bold;*/\r
+color:#000;\r
+background:#eee url(../image/expand3.gif) no-repeat 100% 100%;\r
+}\r
+\r
+#menu div.x:hover{\r
+color:#fff;\r
+background:#000;\r
+}\r
+\r
+#menu div.x:active{\r
+color:#060;\r
+background:#ccc;\r
+}\r
diff --git a/image/expand3.gif b/image/expand3.gif
new file mode 100644 (file)
index 0000000..2c46f4e
Binary files /dev/null and b/image/expand3.gif differ
index f49175f5990938d57496f96f06cb72e3bed631c7..cceb1f20b757b018625e3bc53ad09a3b77d8bb60 100644 (file)
@@ -84,6 +84,7 @@ $self->{texts} = {
   'The passwords do not match.' => 'Die Passw&ouml;rter stimmen nicht &uuml;berein.',
   'This is a preliminary check for existing sources. Nothing will be created or deleted at this stage!' => 'In diesem Schritt werden bestehende Datenbanken gesucht. Es werden noch keine Änderungen vorgenommen!',
   'To add a user to a group edit a name, change the login name and save.  A new user with the same variables will then be saved under the new login name.' => 'Um einer Gruppe einen neuen Benutzer hinzuzufügen, ändern und speichern Sie am einfachsten einen bestehen den Zugriffsnamen. Unter dem neuen Namen wird dann ein Benutzer mit denselben Einstellungen angelegt.',
   'The passwords do not match.' => 'Die Passw&ouml;rter stimmen nicht &uuml;berein.',
   'This is a preliminary check for existing sources. Nothing will be created or deleted at this stage!' => 'In diesem Schritt werden bestehende Datenbanken gesucht. Es werden noch keine Änderungen vorgenommen!',
   'To add a user to a group edit a name, change the login name and save.  A new user with the same variables will then be saved under the new login name.' => 'Um einer Gruppe einen neuen Benutzer hinzuzufügen, ändern und speichern Sie am einfachsten einen bestehen den Zugriffsnamen. Unter dem neuen Namen wird dann ein Benutzer mit denselben Einstellungen angelegt.',
+  'Top (CSS)'                   => 'Oben (mit CSS)',
   'Top (Javascript)'            => 'Oben (mit Javascript)',
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
   'Unlock System'               => 'System entsperren',
   'Top (Javascript)'            => 'Oben (mit Javascript)',
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
   'Unlock System'               => 'System entsperren',
index fe074be9bc3a0be22f8606e5859ff4b45cf815dc..6e6162edd55f30cf3c1f42dfe8840602dc9bf392 100644 (file)
@@ -993,6 +993,7 @@ gestartet',
   'Title'                       => 'Titel',
   'To'                          => 'An',
   'To add a user to a group edit a name, change the login name and save.  A new user with the same variables will then be saved under the new login name.' => 'Um einer Gruppe einen neuen Benutzer hinzuzufügen, ändern und speichern Sie am einfachsten einen bestehen den Zugriffsnamen. Unter dem neuen Namen wird dann ein Benutzer mit denselben Einstellungen angelegt.',
   'Title'                       => 'Titel',
   'To'                          => 'An',
   'To add a user to a group edit a name, change the login name and save.  A new user with the same variables will then be saved under the new login name.' => 'Um einer Gruppe einen neuen Benutzer hinzuzufügen, ändern und speichern Sie am einfachsten einen bestehen den Zugriffsnamen. Unter dem neuen Namen wird dann ein Benutzer mit denselben Einstellungen angelegt.',
+  'Top (CSS)'                   => 'Oben (mit CSS)',
   'Top (Javascript)'            => 'Oben (mit Javascript)',
   'Top 100'                     => 'Top 100',
   'Top 100 hinzufuegen'         => 'Top 100 hinzufügen',
   'Top (Javascript)'            => 'Oben (mit Javascript)',
   'Top 100'                     => 'Top 100',
   'Top 100 hinzufuegen'         => 'Top 100 hinzufügen',
index 68bfc155c9fa2ccb49c860538944a86f460349c0..eb7aef1f6467268c58e2485afd0b84a7f46c7a9a 100644 (file)
@@ -224,6 +224,7 @@ $self->{texts} = {
   'The unit in row %d has been deleted in the meantime.' => 'Die Einheit in Zeile %d ist in der Zwischentzeit gel&ouml;scht worden.',
   'The unit in row %d has been used in the meantime and cannot be changed anymore.' => 'Die Einheit in Zeile %d wurde in der Zwischenzeit benutzt und kann nicht mehr ge&auml;ndert werden.',
   'The units have been saved.'  => 'Die Einheiten wurden gespeichert.',
   'The unit in row %d has been deleted in the meantime.' => 'Die Einheit in Zeile %d ist in der Zwischentzeit gel&ouml;scht worden.',
   'The unit in row %d has been used in the meantime and cannot be changed anymore.' => 'Die Einheit in Zeile %d wurde in der Zwischenzeit benutzt und kann nicht mehr ge&auml;ndert werden.',
   'The units have been saved.'  => 'Die Einheiten wurden gespeichert.',
+  'Top (CSS)'                   => 'Oben (mit CSS)',
   'Top (Javascript)'            => 'Oben (mit Javascript)',
   'Transaction reversal enforced for all dates' => 'Fehleintragungen müssen für jeden Zeitraum mit einer Kontraeintragung ausgebessert werden',
   'Transaction reversal enforced up to' => 'Fehleintragungen können bis zu dem angegebenen Zeitraum nur mit einer Kontraeintragung ausgebessert werden!',
   'Top (Javascript)'            => 'Oben (mit Javascript)',
   'Transaction reversal enforced for all dates' => 'Fehleintragungen müssen für jeden Zeitraum mit einer Kontraeintragung ausgebessert werden',
   'Transaction reversal enforced up to' => 'Fehleintragungen können bis zu dem angegebenen Zeitraum nur mit einer Kontraeintragung ausgebessert werden!',
diff --git a/locale/de/menuv3 b/locale/de/menuv3
new file mode 100644 (file)
index 0000000..281bb67
--- /dev/null
@@ -0,0 +1,12 @@
+$self->{texts} = {
+  'Logout'                      => 'Abmeldung',
+};
+
+$self->{subs} = {
+  'acc_menu'                    => 'acc_menu',
+  'clock_line'                  => 'clock_line',
+  'display'                     => 'display',
+  'section_menu'                => 'section_menu',
+};
+
+1;
index b5c0b04619e93ce37ad7f8c79ae592d75b684e2c..25f95e71edb2a7d78dbe13dd8b8f8bfdf338c310 100755 (executable)
@@ -3,7 +3,7 @@
 # Erstellt die benotigten Symlinks
 
 ln -vsf login.pl admin.pl
 # Erstellt die benotigten Symlinks
 
 ln -vsf login.pl admin.pl
-for i in ap ar bp ca cp ct cn dn gl ic ir is menu oe pe rc rp datev licenses fa ustva menunew common; do
+for i in ap ar bp ca cp ct cn dn gl ic ir is menu oe pe rc rp datev licenses fa ustva menunew common menuv3; do
   ln -vsf am.pl $i.pl
 done
 
   ln -vsf am.pl $i.pl
 done