Browse code

Umstellung auf Theme-Support (Frei nach phptemplate)

git-svn-id: https://svn.schokokeks.org/repos/tools/webinterface/trunk@1811 87cf0b9e-d624-0410-a070-f6ee81989793

bernd authored on 18/09/2010 13:35:10
Showing 12 changed files
... ...
@@ -1,6 +1,8 @@
1 1
 <?php
2 2
 
3
-require_once('../config.php');
3
+chdir('..');
4
+
5
+require_once('config.php');
4 6
 global $prefix;
5 7
 $prefix = '../';
6 8
 
... ...
@@ -11,6 +13,7 @@ require_once('session/start.php');
11 13
 require_once('inc/base.php');
12 14
 require_once('inc/debug.php');
13 15
 require_once('inc/error.php');
16
+require_once('inc/theme.php');
14 17
 
15 18
 
16 19
 function prepare_cert($cert)
... ...
@@ -116,8 +119,5 @@ else
116 119
   }
117 120
 }
118 121
 
119
-include('../inc/top.php');
120
-print $output;
121
-include('../inc/bottom.php');
122
-
122
+show_page('certlogin');
123 123
 ?>
124 124
similarity index 100%
125 125
rename from css/admin.css
126 126
rename to css/default.css
... ...
@@ -4,6 +4,7 @@ require_once('config.php');
4 4
 require_once('inc/debug.php');
5 5
 require_once('inc/db_connect.php');
6 6
 require_once("inc/base.php");
7
+require_once("inc/theme.php");
7 8
 
8 9
 
9 10
 $go = $_GET['go'];
... ...
@@ -23,11 +24,11 @@ if (strstr($go, "..") or strstr($go, "./") or strstr($go, ":") or (! file_exists
23 24
 {
24 25
   die("illegal command");
25 26
 }
26
-$tmp = explode('/', $go, 2);
27
-$module = $tmp[0];
27
+list($module, $page) = explode('/', $go, 2);
28
+$page = str_replace('/', '-', $page);
28 29
 if (! in_array($module, config('modules')))
29 30
 {
30
-  die("illegal command");
31
+  die("inactive module");
31 32
 }
32 33
 
33 34
 
... ...
@@ -57,12 +58,12 @@ $section = str_replace("/", "_", $go);
57 58
 /* Let the module work */
58 59
 include("modules/".$go.".php");
59 60
 
60
-//$title = '';
61 61
 if ($output)
62 62
 {
63
-  include('inc/top.php');
64
-  print $output;
65
-  include('inc/bottom.php');
63
+  if (!isset($title)) {
64
+    $title = '';
65
+  }
66
+  show_page($module, $page);
66 67
 }
67 68
 
68 69
 ?>
... ...
@@ -126,6 +126,18 @@ function html_header($arg)
126 126
   $html_header .= $arg;
127 127
 }
128 128
 
129
+function title($arg)
130
+{
131
+  global $title;
132
+  $title = $arg;
133
+}
134
+
135
+function headline($arg)
136
+{
137
+  global $headline;
138
+  $headline = $arg;
139
+}
140
+
129 141
 function output($arg)
130 142
 {
131 143
   global $output;
... ...
@@ -4,13 +4,8 @@ require_once("inc/security.php");
4 4
 
5 5
 function system_failure($reason)
6 6
 {
7
-        include('inc/top.php');
8
-        echo '
9
-        <h3>Fehler</h3>
10
-        <div class="error">
11
-          <p>Es ist ein Fehler aufgetreten:<br /> '.filter_input_general($reason).'</p>
12
-        </div>';
13
-        include('inc/bottom.php');
7
+	input_error($reason);
8
+	show_page();
14 9
         die();
15 10
 }
16 11
 
... ...
@@ -47,51 +42,57 @@ function we_have_an_error()
47 42
 }
48 43
 
49 44
 
50
-function show_messages()
45
+function get_messages()
51 46
 {
47
+  $messages = '';
52 48
   global $input_error;
53 49
   if (isset($input_error))
54 50
   {
55
-    echo '<div class="error">
51
+    $messages .= '<div class="error">
56 52
     <h3>Fehler</h3>
57 53
     <p>Folgende Fehler wurden festgestellt: </p>
58 54
     <ul>
59 55
     ';
60 56
     foreach ($input_error as $error)
61 57
     {
62
-      echo '<li>'.nl2br(filter_input_general($error))."</li>\n";
58
+      $messages .= '<li>'.nl2br(filter_input_general($error))."</li>\n";
63 59
     }
64
-    echo '</ul>
60
+    $messages .= '</ul>
65 61
     </div>';
66 62
   }
67 63
   if (isset($_SESSION['warning']))
68 64
   {
69
-    echo '<div class="error">
65
+    $messages .= '<div class="error">
70 66
     <ul>
71 67
     ';
72 68
     foreach ($_SESSION['warning'] as $msg)
73 69
     {
74
-      echo '<li>'.nl2br(filter_input_general($msg))."</li>\n";
70
+      $messages .= '<li>'.nl2br(filter_input_general($msg))."</li>\n";
75 71
     }
76
-    echo '</ul>
72
+    $messages .= '</ul>
77 73
     </div>';
78 74
     unset($_SESSION['warning']);
79 75
   }
80 76
   if (isset($_SESSION['success_msg']))
81 77
   {
82
-    echo '<div class="success">
78
+    $messages .= '<div class="success">
83 79
     <ul>
84 80
     ';
85 81
     foreach ($_SESSION['success_msg'] as $msg)
86 82
     {
87
-      echo '<li>'.nl2br(filter_input_general($msg))."</li>\n";
83
+      $messages .= '<li>'.nl2br(filter_input_general($msg))."</li>\n";
88 84
     }
89
-    echo '</ul>
85
+    $messages .= '</ul>
90 86
     </div>';
91 87
     unset($_SESSION['success_msg']);
92 88
   }
89
+  return $messages;
93 90
 }
94 91
 
92
+function show_messages() 
93
+{
94
+  echo get_messages();
95
+}
95 96
 
96 97
 function require_role($roles)
97 98
 {
... ...
@@ -111,37 +112,12 @@ function require_role($roles)
111 112
 
112 113
 function login_screen($why)
113 114
 {
114
-  global $go;
115
-        $title = 'Login';
116
-        include('inc/top.php');
117
-        if ($why != "")
118
-        {
119
-		// Der User hat einen deeplink benutzt (-> weiß was er tut)
120
-        	echo '<h3>Sie sind nicht am System angemeldet!</h3>';
121
-                echo '<p class="warning"><b>Fehler:</b> '.$why.'</p>';
122
-        }
123
-	else
124
-	{
125
-		// der User hat die Startseite aufgerufen
126
-	        echo '<h3>'.config('company_name').' Webinterface</h3>';
127
-		echo '<p>Auf dieser Seite können Sie diverse Einstellungen Ihres Accounts auf '.config('company_name').' festlegen. Sofern Sie noch kein Kunde von '.config('company_name').' sind, können Sie diese Seite nicht benutzen. Besuchen Sie in diesem Fall bitte unsere <a href="'.config('company_url').'">öffentliche Seite</a>.</p>';
128
-	}
129
-        echo '<form action="" method="post">
130
-        <p><span class="login_label">Benutzer<sup>*</sup>:</span> <input type="text" name="username" size="30" /></p>
131
-        <p><span class="login_label">Passwort:</span> <input type="password" name="password" size="30" /></p>
132
-        <p><span class="login_label">&#160;</span> <input type="submit" value="Anmelden" /></p>
133
-        </form>
134
-        <p><sup>*</sup> Sie können sich hier mit Ihrem System-Benutzernamen, Ihrem IMAP-Account oder Ihrer Kundennummer (jeweils mit zugehörigem Passwort) anmelden. Je nach gewählten Daten erhalten Sie unterschiedliche Zugriffsrechte.</p>
135
-        <p>Sollten Sie Ihr Passwort nicht mehr kennen, wenden Sie sich bitte unter Angabe Ihres Benutzernamens und/oder Ihrer Kundennummer an den Support. Passwörter für E-Mail-Konten kann der Eigentümer des Benutzeraccounts neu setzen.</p>
136
-
137
-        <p><em>'.internal_link('/certlogin?destination=go/'.$go, 'Mit einem Client-Zertifikat anmelden').'</em> ('.internal_link('/go/index/certinfo', 'Wie geht das?').')</p>';
138
-	/*
139
-	<p>Sofern Sie für Ihren Kundenaccount noch kein Passwort festgelegt haben oder Ihres vergessen haben, klicken Sie bitte <a href="new_password.php">hier</a></p>
140
-        <p>Sollten Sie als Benutzer Ihr Passwort vergessen haben, wenden Sie sich bitte an den Inhaber des Kundenaccounts.</p>';
141
-	*/
142
-        include('inc/bottom.php');
143
-        die();
144
-
115
+  require_once('inc/theme.php');
116
+  if ($why) {
117
+    warning($why);
118
+  }
119
+  show_page('login');
120
+  die();
145 121
 }
146 122
 
147 123
 
148 124
new file mode 100644
... ...
@@ -0,0 +1,44 @@
1
+<?php
2
+
3
+function show_page($path = NULL) 
4
+{
5
+  global $go, $title, $headline, $output, $module, $page;
6
+  if ($path) {
7
+  	$module = $path;
8
+  }
9
+  $theme = config('theme');
10
+  $theme_path = "themes/$theme/";
11
+  $candidates = array();
12
+  if ($page) {
13
+    $candidates[] = "{$theme_path}page-$module-$page.tpl.php";
14
+  }
15
+  $candidates[] = "{$theme_path}page-$module.tpl.php";
16
+  $candidates[] = "{$theme_path}page.tpl.php";
17
+  if ($page) {
18
+    $candidates[] = "modules/{$module}/theme/page-$page.tpl.php";
19
+  }
20
+  $candidates[] = "modules/{$module}/theme/page.tpl.php";
21
+  if ($page) {
22
+    $candidates[] = "themes/default/page-$module-$page.tpl.php";
23
+  }
24
+  $candidates[] = "themes/default/page-$module.tpl.php";
25
+  $candidates[] = "themes/default/page.tpl.php";
26
+
27
+  $theme_file = NULL;
28
+  foreach ($candidates AS $c) {
29
+  	if (file_exists($c)) {
30
+		$theme_file = $c;
31
+		break;
32
+	}
33
+  }
34
+  if (! file_exists($theme_file))
35
+    die("cannot get any theme file");
36
+
37
+  include('inc/top.php');
38
+  if (!isset($title))
39
+    $title = '';
40
+  $content = $output;
41
+
42
+  include($theme_file);
43
+}
44
+
... ...
@@ -61,38 +61,9 @@ DEBUG($submenu);
61 61
 // Verbiete das Laden in jeglichem Frameset
62 62
 header("X-FRAME-OPTIONS: DENY");
63 63
 header("Content-Type: ".config('mime_type'));
64
-?>
65
-<?php echo '<?xml version="1.0" encoding="utf-8"?>'."\n"; ?>
66
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
67
-    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
68
-
69
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
70
-<head>
71
-
72
-<?php
73
-if (isset($title) and ($title != ""))
74
-        echo '<title>Administration - '.$title.'</title>';
75
-else
76
-        echo '<title>Administration</title>';
77
-
78
-echo '
79
-<link rel="stylesheet" href="'.$prefix.'css/admin.css" type="text/css" media="screen" title="Normal" />
80
-<link rel="shortcut icon" href="'.$prefix.'favicon.ico" type="image/x-icon" />';
81
-
82
-if (isset($html_header))
83
-  echo $html_header;
84
-?>
85
-</head>
86
-<body>
87
-
88
-<div><a href="#content" style="display: none;">Zum Inhalt</a></div>
89
-
90
-<div class="menu">
91
-<a href="<?php echo $prefix; ?>"><img src="<?php echo $prefix.config('logo'); ?>" width="190" height="141" alt="<?php echo config('company_name'); ?>" /></a>
92 64
 
93
-
94
-<?php
95
-$role = $_SESSION['role'];
65
+if (!isset($html_header))
66
+  $html_header = '';
96 67
 
97 68
 function array_key_exists_r($needle, $haystack)
98 69
 {
... ...
@@ -108,71 +79,69 @@ function array_key_exists_r($needle, $haystack)
108 79
 }
109 80
 
110 81
 
82
+$menu = '';
111 83
 
112
-  foreach ($weighted_menuitem as $key => $menuitem)
84
+foreach ($weighted_menuitem as $key => $menuitem)
113 85
         foreach ($menuitem as $key => $item)
114 86
         {
115 87
                 if ($key == $section)
116
-                        echo '<a href="'.$item['file'].'" class="menuitem active">'.$item['label'].'</a>'."\n";
88
+                        $menu .= '<a href="'.$item['file'].'" class="menuitem active">'.$item['label'].'</a>'."\n";
117 89
                 else
118
-                        echo '<a href="'.$item['file'].'" class="menuitem">'.$item['label'].'</a>'."\n";
90
+                        $menu .= '<a href="'.$item['file'].'" class="menuitem">'.$item['label'].'</a>'."\n";
119 91
                 if ($key == $section || (array_key_exists($key, $submenu) && array_key_exists_r($section, $submenu[$key])))
120 92
                 {
121 93
                         if (isset($submenu[$key]))
122 94
                         {
123
-                                echo "\n";
95
+                                $menu .= "\n";
124 96
 				foreach ($submenu[$key] as $weight => $mysub) 
125 97
 				{
126 98
                                   foreach ($mysub as $sec => $item)
127 99
                                   {
128 100
                                           if ($sec == $section)
129
-                                                  echo '<a href="'.$item['file'].'" class="submenuitem menuitem active">'.$item['label'].'</a>'."\n";
101
+                                                  $menu .= '<a href="'.$item['file'].'" class="submenuitem menuitem active">'.$item['label'].'</a>'."\n";
130 102
                                           else
131
-                                                  echo '<a href="'.$item['file'].'" class="submenuitem menuitem">'.$item['label'].'</a>'."\n";
103
+                                                  $menu .= '<a href="'.$item['file'].'" class="submenuitem menuitem">'.$item['label'].'</a>'."\n";
132 104
                                   }
133 105
 				}
134
-                                echo "\n";
106
+                                $menu .= "\n";
135 107
                         }
136 108
 		}
137 109
 
138 110
         }
139 111
 
112
+$userinfo = '';
113
+
114
+$role = $_SESSION['role'];
140 115
 if ($role != ROLE_ANONYMOUS) {
141
-echo '<p class="userinfo">Angemeldet als:<br />';
116
+  $userinfo .= '<p class="userinfo">Angemeldet als:<br />';
142 117
   if ($role & ROLE_SYSTEMUSER) {
143
-    echo '<strong>'.$_SESSION['userinfo']['username'].'</strong>';
144
-    echo '<br />'.$_SESSION['userinfo']['name'];
145
-    echo '<br />(Benutzer'.(($role & ROLE_CUSTOMER) ? ', Kunde' : '').')';
118
+    $userinfo .= '<strong>'.$_SESSION['userinfo']['username'].'</strong>';
119
+    $userinfo .= '<br />'.$_SESSION['userinfo']['name'];
120
+    $userinfo .= '<br />(Benutzer'.(($role & ROLE_CUSTOMER) ? ', Kunde' : '').')';
146 121
   }
147 122
   elseif ($role & ROLE_CUSTOMER) {
148
-    echo '<strong>'.$_SESSION['customerinfo']['customerno'].'</strong>';
149
-    echo '<br />'.$_SESSION['customerinfo']['name'];
150
-    echo '<br />(Kunde)';
123
+    $userinfo .= '<strong>'.$_SESSION['customerinfo']['customerno'].'</strong>';
124
+    $userinfo .= '<br />'.$_SESSION['customerinfo']['name'];
125
+    $userinfo .= '<br />(Kunde)';
151 126
   }
152 127
   elseif ($role & (ROLE_MAILACCOUNT | ROLE_VMAIL_ACCOUNT)) {
153
-    echo '<strong>'.$_SESSION['mailaccount'].'</strong><br />(E-Mail-Account)';
128
+    $userinfo .= '<strong>'.$_SESSION['mailaccount'].'</strong><br />(E-Mail-Account)';
154 129
   }
155
-  echo '</p>';
130
+  $userinfo .= '</p>';
156 131
 }
157 132
 
158 133
 if (isset($_SESSION['admin_user'])) {
159
-  echo '<p class="admininfo">';
160
-  echo '<a href="'.$prefix.'go/su/back_to_admin">Zurück zu »'.$_SESSION['admin_user'].'«</a>';
161
-  echo '</p>';
134
+  $userinfo .= '<p class="admininfo">';
135
+  $userinfo .= '<a href="'.$prefix.'go/su/back_to_admin">Zurück zu »'.$_SESSION['admin_user'].'«</a>';
136
+  $userinfo .= '</p>';
162 137
 }
163
-?>
164 138
 
165
-</div>
166
-
167
-<div class="content">
168
-<a id="content" style="display: none"> </a>
169
-<?php
170
-show_messages();
171
-
172
-}
173
-
174
-?>
175 139
 
140
+$messages = get_messages();
176 141
 
142
+$BASE_PATH = $prefix;
143
+$THEME_PATH = $prefix."themes/".config('theme')."/";
177 144
 
178 145
 
146
+}
147
+?>
... ...
@@ -1,11 +1,11 @@
1 1
 <?php
2 2
 require_once('inc/debug.php');
3 3
 require_once('inc/security.php');
4
+require_role(array(ROLE_SYSTEMUSER, ROLE_CUSTOMER));
4 5
 
5 6
 $title = "Passwort ändern";
6 7
 $error = '';
7 8
 
8
-require_role(array(ROLE_SYSTEMUSER, ROLE_CUSTOMER));
9 9
 
10 10
 
11 11
 if (isset($_POST['password1']))
... ...
@@ -44,8 +44,9 @@ default:
44 44
 }
45 45
 
46 46
 
47
-output('<h3>Administration</h3>
48
-<p>Herzlich willkommen, '.$role.".</p>\n");
47
+title('Übersicht');
48
+headline('Administration');
49
+output('<p>Herzlich willkommen, '.$role.".</p>\n");
49 50
 
50 51
 output("<p>Auf der linken Seite sehen Sie ein Auswahlmenü mit den Funktionen, die Ihnen in diesem Webinterface zur Verfügung stehen.</p>
51 52
 <p>Nachfolgend sehen Sie eine Auswahl typischer Aufgaben.</p>\n");
52 53
similarity index 100%
53 54
rename from images/schokokeks.png
54 55
rename to themes/default/images/schokokeks.png
55 56
new file mode 100644
... ...
@@ -0,0 +1,63 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
3
+    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
4
+
5
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
6
+<head>
7
+
8
+<?php 
9
+if ($title)
10
+	echo "<title>$title - Administration</title>";
11
+else
12
+	echo "<title>Administration</title>";
13
+?>
14
+<link rel="stylesheet" href="<?php echo $BASE_PATH; ?>css/default.css" type="text/css" media="screen" title="Normal" />
15
+<link rel="stylesheet" href="<?php echo $THEME_PATH; ?>style.css" type="text/css" media="screen" title="Normal" />
16
+<link rel="shortcut icon" href="<?php echo $THEME_PATH; ?>favicon.ico" type="image/x-icon" />
17
+<?php echo $html_header; ?>
18
+</head>
19
+
20
+<body>
21
+<div><a href="#content" style="display: none;">Zum Inhalt</a></div>
22
+
23
+<div class="menu">
24
+<a href="<?php echo $BASE_PATH; ?>"><img src="<?php echo $THEME_PATH; ?>images/schokokeks.png" width="190" height="141" alt="schokokeks.org Hosting" /></a>
25
+
26
+<?php echo $menu; ?>
27
+
28
+<?php echo $userinfo; ?>
29
+
30
+</div>
31
+
32
+<div class="content">
33
+<a id="content" style="display: none"> </a>
34
+
35
+<?php
36
+if ($messages) {
37
+  echo $messages;
38
+}
39
+?>
40
+
41
+<h3>schokokeks.org Hosting Webinterface</h3>
42
+<p>Auf dieser Seite können Sie diverse Einstellungen Ihres Accounts auf schokokeks.org Hosting festlegen. Sofern Sie noch kein Kunde von schokokeks.org Hosting sind, können Sie diese Seite nicht benutzen. Besuchen Sie in diesem Fall bitte unsere <a href="http://www.schokokeks.org">öffentliche Seite</a>.</p>
43
+<form action="" method="post">
44
+<p><span class="login_label">Benutzer<sup>*</sup>:</span> <input type="text" name="username" size="30" /></p>
45
+<p><span class="login_label">Passwort:</span> <input type="password" name="password" size="30" /></p>
46
+<p><span class="login_label">&#160;</span> <input type="submit" value="Anmelden" /></p>
47
+</form>
48
+<p><sup>*</sup> Sie können sich hier mit Ihrem System-Benutzernamen, Ihrem IMAP-Account oder Ihrer Kundennummer (jeweils mit zugehörigem Passwort) anmelden. Je nach gewählten Daten erhalten Sie unterschiedliche Zugriffsrechte.</p>
49
+<p>Sollten Sie Ihr Passwort nicht mehr kennen, wenden Sie sich bitte unter Angabe Ihres Benutzernamens und/oder Ihrer Kundennummer an den Support. Passwörter für E-Mail-Konten kann der Eigentümer des Benutzeraccounts neu setzen.</p>
50
+
51
+<p><em><a href="../../certlogin?destination=go/index/index"  >Mit einem Client-Zertifikat anmelden</a></em> (<a href="../../go/index/certinfo"  >Wie geht das?</a>)</p></div>
52
+
53
+
54
+</div>
55
+
56
+<div class="foot">
57
+<p>Sollten Sie auf dieser Administrations-Oberfläche ein Problem entdecken oder Hilfe benötigen, schreiben Sie bitte eine einfache eMail an <a href="mailto:root@schokokeks.org">root@schokokeks.org</a>. Unser <a href="http://www.schokokeks.org/kontakt">Impressum</a> finden Sie auf der <a href="http://www.schokokeks.org/">öffentlichen Seite</a>. Lizenzinformationen zu diesem Webinterface und verwendeten Rechten finden Sie <a href="../../images/about.php">indem Sie hier klicken</a>.</p>
58
+
59
+</div>
60
+
61
+
62
+</body>
63
+</html>
0 64
new file mode 100644
... ...
@@ -0,0 +1,57 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
3
+    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
4
+
5
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
6
+<head>
7
+
8
+<?php 
9
+if ($title)
10
+	echo "<title>$title - Administration</title>";
11
+else
12
+	echo "<title>Administration</title>";
13
+?>
14
+<link rel="stylesheet" href="<?php echo $BASE_PATH; ?>css/default.css" type="text/css" media="screen" title="Normal" />
15
+<link rel="stylesheet" href="<?php echo $THEME_PATH; ?>style.css" type="text/css" media="screen" title="Normal" />
16
+<link rel="shortcut icon" href="<?php echo $THEME_PATH; ?>favicon.ico" type="image/x-icon" />
17
+<?php echo $html_header; ?>
18
+</head>
19
+
20
+<body>
21
+<div><a href="#content" style="display: none;">Zum Inhalt</a></div>
22
+
23
+<div class="menu">
24
+<a href="<?php echo $BASE_PATH; ?>"><img src="<?php echo $THEME_PATH; ?>images/schokokeks.png" width="190" height="141" alt="schokokeks.org Hosting" /></a>
25
+
26
+<?php echo $menu; ?>
27
+
28
+<?php echo $userinfo; ?>
29
+
30
+</div>
31
+
32
+<div class="content">
33
+<a id="content" style="display: none"> </a>
34
+
35
+<?php
36
+if ($messages) {
37
+  echo $messages;
38
+}
39
+?>
40
+
41
+<?php 
42
+if ($headline) {
43
+  echo "<h3>$headline</h3>";
44
+}
45
+?>
46
+
47
+<?php echo $content; ?>
48
+
49
+</div>
50
+<div class="foot">
51
+<p>Sollten Sie auf dieser Administrations-Oberfläche ein Problem entdecken oder Hilfe benötigen, schreiben Sie bitte eine einfache eMail an <a href="mailto:root@schokokeks.org">root@schokokeks.org</a>. Unser <a href="http://www.schokokeks.org/kontakt">Impressum</a> finden Sie auf der <a href="http://www.schokokeks.org/">öffentlichen Seite</a>. Lizenzinformationen zu diesem Webinterface und verwendeten Rechten finden Sie <a href="../../images/about.php">indem Sie hier klicken</a>.</p>
52
+
53
+</div>
54
+
55
+
56
+</body>
57
+</html>