diff --git a/css/frontend.css b/css/frontend.css
index 6c8ffa9..fe3aecd 100644
--- a/css/frontend.css
+++ b/css/frontend.css
@@ -201,24 +201,40 @@ li {
.top-bar {
background-color: var(--primary-dark);
color: #d1e5ed;
- font-size: 0.85rem;
- padding: 0.5rem 0;
+ font-size: 0.82rem;
+ padding: 0.45rem 0;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
+ white-space: nowrap;
+}
+
+.top-bar .container {
+ max-width: 1400px;
}
.top-bar-inner {
display: flex;
justify-content: space-between;
align-items: center;
- flex-wrap: wrap;
- gap: 0.75rem;
+ flex-wrap: nowrap;
+ gap: 1rem;
+ width: 100%;
}
-.top-bar-left, .top-bar-right {
+.top-bar-left {
display: flex;
align-items: center;
- flex-wrap: wrap;
gap: 1.25rem;
+ flex-shrink: 0;
+ white-space: nowrap;
+}
+
+.top-bar-right {
+ display: flex;
+ align-items: center;
+ gap: 1.25rem;
+ flex-shrink: 0;
+ margin-left: auto;
+ white-space: nowrap;
}
.top-bar a {
@@ -228,6 +244,7 @@ li {
gap: 0.4rem;
text-decoration: none;
font-weight: 500;
+ white-space: nowrap;
}
.top-bar a:hover {
@@ -239,6 +256,8 @@ li {
display: inline-flex;
align-items: center;
gap: 0.4rem;
+ white-space: nowrap;
+ flex-shrink: 0;
}
.top-bar-icon {
@@ -246,6 +265,14 @@ li {
height: 14px;
fill: currentColor;
opacity: 0.85;
+ flex-shrink: 0;
+}
+
+/* Anti-Spam Email Obfuscation (RTL Bidi Fallback) */
+.c-rev {
+ unicode-bidi: bidi-override;
+ direction: rtl;
+ display: inline;
}
/* ==========================================================================
@@ -984,9 +1011,11 @@ li {
padding: 1.75rem;
box-shadow: var(--shadow-sm);
display: flex;
- gap: 1.5rem;
+ flex-direction: column;
+ gap: 1.25rem;
align-items: flex-start;
transition: var(--transition);
+ height: 100%;
}
.doctor-card:hover {
@@ -1015,6 +1044,9 @@ li {
.doctor-info {
flex: 1;
+ display: flex;
+ flex-direction: column;
+ width: 100%;
}
.doctor-name {
@@ -1028,12 +1060,15 @@ li {
color: var(--accent);
font-weight: 600;
font-size: 0.95rem;
+ line-height: 1.4;
+ min-height: 2.8em;
margin-bottom: 0.5rem;
}
.doctor-meta {
font-size: 0.9rem;
color: var(--text-muted);
+ margin-bottom: 1rem;
}
.doctor-meta span {
@@ -1048,10 +1083,11 @@ li {
font-size: 0.8rem;
background-color: var(--bg-alt);
color: var(--primary);
- padding: 0.25rem 0.65rem;
+ padding: 0.3rem 0.65rem;
border-radius: var(--radius-sm);
- margin-top: 0.65rem;
+ margin-top: auto;
font-weight: 600;
+ align-self: flex-start;
}
/* ==========================================================================
@@ -1432,6 +1468,28 @@ textarea.form-control {
Responsive Media Queries
========================================================================== */
+/* Prioritized Address Hiding when space is limited */
+@media screen and (max-width: 1240px) {
+ .top-bar-addr-satellite {
+ display: none !important;
+ }
+}
+
+@media screen and (max-width: 992px) {
+ .top-bar-left {
+ display: none !important;
+ }
+
+ .top-bar-inner {
+ justify-content: center !important;
+ }
+
+ .top-bar-right {
+ margin-left: 0 !important;
+ justify-content: center !important;
+ }
+}
+
/* Tablet (max 1024px) */
@media screen and (max-width: 1024px) {
.grid-4 {
@@ -1457,11 +1515,20 @@ textarea.form-control {
.top-bar-inner {
justify-content: center;
text-align: center;
+ overflow-x: auto;
+ scrollbar-width: none;
+ -webkit-overflow-scrolling: touch;
}
- .top-bar-left, .top-bar-right {
+ .top-bar-inner::-webkit-scrollbar {
+ display: none;
+ }
+
+ .top-bar-right {
justify-content: center;
- gap: 0.75rem;
+ gap: 0.85rem;
+ font-size: 0.8rem;
+ flex-wrap: nowrap;
}
.site-header {
@@ -1560,6 +1627,11 @@ textarea.form-control {
/* Small Smartphone (max 480px) */
@media screen and (max-width: 480px) {
+ .top-bar-right {
+ gap: 0.65rem;
+ font-size: 0.76rem;
+ }
+
.logo-title {
font-size: 1.05rem;
}
diff --git a/files/dialyse_flyer.pdf b/files/dialyse_flyer.pdf
index cc812ee..7f4997f 100644
Binary files a/files/dialyse_flyer.pdf and b/files/dialyse_flyer.pdf differ
diff --git a/files/flyer_map.png b/files/flyer_map.png
new file mode 100644
index 0000000..e9caf09
Binary files /dev/null and b/files/flyer_map.png differ
diff --git a/files/flyer_template.html b/files/flyer_template.html
new file mode 100644
index 0000000..bb3561a
--- /dev/null
+++ b/files/flyer_template.html
@@ -0,0 +1,573 @@
+
+
+
+
+Praxis-Flyer | Dialysezentrum Berlin-Mahlsdorf
+
+
+
+
+
+
+
+
+
+
+
„Die individuelle Dialyse im grünen Gürtel von Berlin“
+
Seit 1992 • 2 Standorte • Feriendialyse • Barrierefrei
+
+
+
+
+
+
Dr. med. Bianca Bischoff
+
Fachärztin für Innere Medizin & Nephrologie
+
+
+
Dr. med. Juliane Hoffzimmer
+
Fachärztin für Innere Medizin & Nephrologie
+
+
+
Dr. med. Claudia Körner
+
Fachärztin für Innere Medizin
+
+
+
+
+
+
+
+
+
+
+
+ Nephrologische Ambulanz: Diagnostik & Therapie aller Nierenerkrankungen
+ Optimale Blutdruck- & Blutzuckereinstellung als Schwerpunkt
+ Spezialisierte Betreuung niereninsuffizienter Diabetiker
+ Sonographie (Ultraschall Nieren/Abdomen), EKG, 24h-Blutdruck
+ Hämodialyse & Hämodiafiltration (HDF): Nikkiso DBB-07 und Nikkiso DBB-EXA mit Hemo-Master
+ Fresenius BCM: Bioelektrische Blutvolumenmessung
+ Vorbereitung & Betreuung transplantierter Patienten • Ernährungsberatung
+
+
+
+
+
+
+
+ Ganzjährige Feriendialysen für Berlin-Besucher und Urlauber
+ Vollständig barrierefreier Zugang für bewegungseingeschränkte Patienten
+ Wohlfühlatmosphäre mit kostenlosem WLAN, TV & Imbiss- und Getränkeservice
+ Enge Zusammenarbeit mit Haus- & Fachärzten und umliegenden Krankenhäusern
+
+
+
+
+
+
+
+
Dialyse (Mo, Mi, Fr):
+
+
1. Schicht 07:00 – 13:00 Uhr
+
2. Schicht 13:00 – 18:00 Uhr
+
3. Schicht 14:30 – 20:00 Uhr
+
+
+
+
Dialyse (Di, Do, Sa):
+
1. Schicht 07:00 – 13:00 Uhr
+
+
+
Ambulanz (Mo, Mi, Fr):
+
08:30 – 11:30 • n. Vereinb. 14:00 – 17:00
+
+
+
Ambulanz (Di, Do):
+
08:30 – 12:00 Uhr
+
+
+
+
+
+
+
+
+
+
+
Zentrumsdialyse (Hauptpraxis & Ambulanz)
+
+ Thorner Straße 1 • 12623 Berlin (16 Behandlungsplätze)
+ Telefon Dialyse: 030 / 566 24 84
+ Telefon Ambulanz: 030 / 566 25 39
+ E-Mail: kontakt@dialyse-berlin.net
+
+
+
+
Satellitendialyse
+
+ Blumberger Damm 130 • 12685 Berlin (18 Behandlungsplätze)
+ Eingang: Pritzhagener Weg 21
+
+
+
+
+
+
+
+
+
+
ÖPNV: S-Bahn S5 bis S-Bhf. Berlin-Mahlsdorf , von dort wenige Minuten Fußweg oder per Bus.
+
Pkw: Über die B1 / B5 (Alt-Mahlsdorf) in die Hönower Str., weiter über Waldowstr. / Wilhelmsmühlenweg in die Thorner Str. 1.
+
Gute Parkmöglichkeiten direkt vor der Praxis vorhanden.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dialysezentrum Berlin-Mahlsdorf • Dr. med. B. Bischoff & Dr. med. J. Hoffzimmer
+
E-Mail: kontakt@dialyse-berlin.net • Web: www.dialyse-berlin.net
+
Thorner Str. 1, 12623 Berlin • Blumberger Damm 130, 12685 Berlin
+
+
+
+
+
diff --git a/img/gallery/praxis1.jpg b/img/gallery/praxis1.jpg
index 12605ab..f23a2ec 100644
Binary files a/img/gallery/praxis1.jpg and b/img/gallery/praxis1.jpg differ
diff --git a/img/gallery/praxis1_thumb.jpg b/img/gallery/praxis1_thumb.jpg
index 9c47b62..f23a2ec 100644
Binary files a/img/gallery/praxis1_thumb.jpg and b/img/gallery/praxis1_thumb.jpg differ
diff --git a/img/gallery/praxis3.jpg b/img/gallery/praxis3.jpg
index 6dcb673..0387de0 100644
Binary files a/img/gallery/praxis3.jpg and b/img/gallery/praxis3.jpg differ
diff --git a/img/gallery/praxis3_thumb.jpg b/img/gallery/praxis3_thumb.jpg
index 3c05985..0387de0 100644
Binary files a/img/gallery/praxis3_thumb.jpg and b/img/gallery/praxis3_thumb.jpg differ
diff --git a/img/gallery/praxis4.jpg b/img/gallery/praxis4.jpg
index b589086..b78209b 100644
Binary files a/img/gallery/praxis4.jpg and b/img/gallery/praxis4.jpg differ
diff --git a/img/gallery/praxis4_thumb.jpg b/img/gallery/praxis4_thumb.jpg
index 39cd3b4..b78209b 100644
Binary files a/img/gallery/praxis4_thumb.jpg and b/img/gallery/praxis4_thumb.jpg differ
diff --git a/img/gallery/praxis6.jpg b/img/gallery/praxis6.jpg
index 303cb6c..5b6f0d1 100644
Binary files a/img/gallery/praxis6.jpg and b/img/gallery/praxis6.jpg differ
diff --git a/img/gallery/praxis6_thumb.jpg b/img/gallery/praxis6_thumb.jpg
index 8ecbf68..5b6f0d1 100644
Binary files a/img/gallery/praxis6_thumb.jpg and b/img/gallery/praxis6_thumb.jpg differ
diff --git a/img/gallery/praxis7.jpg b/img/gallery/praxis7.jpg
index f53e613..4b6b4fd 100644
Binary files a/img/gallery/praxis7.jpg and b/img/gallery/praxis7.jpg differ
diff --git a/img/gallery/praxis7_thumb.jpg b/img/gallery/praxis7_thumb.jpg
index d3b4278..4b6b4fd 100644
Binary files a/img/gallery/praxis7_thumb.jpg and b/img/gallery/praxis7_thumb.jpg differ
diff --git a/img/gallery/praxis8.jpg b/img/gallery/praxis8.jpg
index 86e5f09..e95daea 100644
Binary files a/img/gallery/praxis8.jpg and b/img/gallery/praxis8.jpg differ
diff --git a/img/gallery/praxis8_thumb.jpg b/img/gallery/praxis8_thumb.jpg
index 7dc9469..e95daea 100644
Binary files a/img/gallery/praxis8_thumb.jpg and b/img/gallery/praxis8_thumb.jpg differ
diff --git a/img/gallery/startseite1.jpg b/img/gallery/startseite1.jpg
index bab5e6d..7fae9e6 100644
Binary files a/img/gallery/startseite1.jpg and b/img/gallery/startseite1.jpg differ
diff --git a/img/gallery/startseite1_thumb.jpg b/img/gallery/startseite1_thumb.jpg
index e2fd866..7fae9e6 100644
Binary files a/img/gallery/startseite1_thumb.jpg and b/img/gallery/startseite1_thumb.jpg differ
diff --git a/js/contact.js b/js/contact.js
index 911e7e7..c06f8ab 100644
--- a/js/contact.js
+++ b/js/contact.js
@@ -3,13 +3,52 @@
* Dialysezentrum Berlin-Mahlsdorf
*/
-function sending() {
- // Obfuscated mailto link to prevent bot harvesting
- var parts = ['kontakt', 'dialyse-berlin.net'];
- window.location.href = 'mailto:' + parts[0] + '@' + parts[1];
+function sending(user, domain, tld) {
+ user = user || 'kontakt';
+ domain = domain || 'dialyse-berlin';
+ tld = tld || 'net';
+ window.location.href = 'mailto:' + user + '@' + domain + '.' + tld;
return true;
}
+function initObfuscatedEmails() {
+ // Dynamically reconstruct obfuscated email links and text for real visitors
+ $('.mail-obf').each(function() {
+ var $el = $(this);
+ var u = $el.attr('data-usr') || $el.data('usr');
+ var d = $el.attr('data-dom') || $el.data('dom');
+ var t = $el.attr('data-tld') || $el.data('tld');
+ if (u && d && t) {
+ var email = u + '@' + d + '.' + t;
+ $el.attr('href', 'mailto:' + email);
+ var $val = $el.find('.mail-val');
+ if ($val.length) {
+ $val.removeClass('c-rev').text(email);
+ }
+ }
+ });
+
+ $('.mail-obf-text').each(function() {
+ var $el = $(this);
+ var u = $el.attr('data-usr') || $el.data('usr');
+ var d = $el.attr('data-dom') || $el.data('dom');
+ var t = $el.attr('data-tld') || $el.data('tld');
+ if (u && d && t) {
+ var email = u + '@' + d + '.' + t;
+ var $val = $el.find('.mail-val');
+ if ($val.length) {
+ $val.removeClass('c-rev').text(email);
+ } else {
+ $el.text(email);
+ }
+ }
+ });
+}
+
+$(function() {
+ initObfuscatedEmails();
+});
+
function showMapLocation(loc) {
var $frame = $('#mapFrame');
var $addrText = $('#mapAddressText');
@@ -20,14 +59,14 @@ function showMapLocation(loc) {
if (loc === 'satellit') {
$frame.attr('src', 'https://maps.google.com/maps?q=Blumberger+Damm+130,+12685+Berlin&t=&z=15&ie=UTF8&iwloc=&output=embed');
$addrText.text('Blumberger Damm 130 (Eingang Pritzhagener Weg 21), 12685 Berlin');
- $extLink.attr('href', 'https://www.google.com/maps/place/Dialysezentrum+Berlin-Mahlsdorf+LC/@52.542799,13.5694855,17z/');
+ $extLink.attr('href', 'https://www.google.com/maps/place/Dialysezentrum+Berlin-Mahlsdorf+LC/@52.5428128,13.5716785,17z/data=!3m1!4b1!4m6!3m5!1s0x47a84991f9d5111b:0xda0b4785760166c5!8m2!3d52.5428128!4d13.5716785!16s%2Fg%2F1ts_5mmj');
$btnMahlsdorf.removeClass('btn-primary').addClass('btn-outline-primary');
$btnSatellit.removeClass('btn-outline-primary').addClass('btn-primary');
} else {
$frame.attr('src', 'https://maps.google.com/maps?q=Thorner+Stra%C3%9Fe+1,+12623+Berlin&t=&z=15&ie=UTF8&iwloc=&output=embed');
$addrText.text('Thorner Straße 1, 12623 Berlin');
- $extLink.attr('href', 'https://www.google.de/maps/place/Dialysezentrum+Berlin-Mahlsdorf/@52.5078935,13.6126659,16z/');
+ $extLink.attr('href', 'https://www.google.com/maps/place/Dialysezentrum+Berlin-Mahlsdorf/@52.5078291,13.6092903,17z/data=!3m1!4b1!4m6!3m5!1s0x47a84991f9c57f7f:0xad4486f559442067!8m2!3d52.5078291!4d13.6092903!16s%2Fg%2F1tdqghgn');
$btnMahlsdorf.removeClass('btn-outline-primary').addClass('btn-primary');
$btnSatellit.removeClass('btn-primary').addClass('btn-outline-primary');
diff --git a/lib/Helper.php b/lib/Helper.php
index 5d3585d..9a7122e 100644
--- a/lib/Helper.php
+++ b/lib/Helper.php
@@ -36,4 +36,91 @@ class Helper {
return ($dialogShowFrom <= $today && $until > $today);
}
+
+ /**
+ * Generate an obfuscated email link to protect against automated spambot harvesting.
+ * Raw HTML contains no plain email address or mailto: link.
+ * Splitting into data attributes with CSS bidi-override fallback renders correctly visually,
+ * while JavaScript dynamically activates the live mailto link for real human visitors.
+ *
+ * @param string $email
+ * @param string|null $label Optional text/label before or wrapping the email
+ * @param array $attrs Optional HTML attributes (class, style, title, icon, etc.)
+ * @return string
+ */
+ public static function obfuscateEmail($email, $label = null, $attrs = []) {
+ if (strpos($email, '@') === false) {
+ return htmlspecialchars($email);
+ }
+ list($user, $domainPart) = explode('@', $email, 2);
+ $lastDot = strrpos($domainPart, '.');
+ if ($lastDot !== false) {
+ $domain = substr($domainPart, 0, $lastDot);
+ $tld = substr($domainPart, $lastDot + 1);
+ } else {
+ $domain = $domainPart;
+ $tld = '';
+ }
+
+ $reversed = strrev($email);
+ $baseClass = isset($attrs['class']) ? $attrs['class'] . ' mail-obf' : 'mail-obf';
+ $title = isset($attrs['title']) ? ' title="' . htmlspecialchars($attrs['title']) . '"' : '';
+ $style = isset($attrs['style']) ? ' style="' . htmlspecialchars($attrs['style']) . '"' : '';
+ $id = isset($attrs['id']) ? ' id="' . htmlspecialchars($attrs['id']) . '"' : '';
+
+ $content = '';
+ if (isset($attrs['icon']) && !empty($attrs['icon'])) {
+ $content .= $attrs['icon'] . ' ';
+ }
+
+ if ($label !== null && $label !== '') {
+ $content .= htmlspecialchars($label) . ' ';
+ }
+
+ $content .= '' . htmlspecialchars($reversed) . ' ';
+
+ return sprintf(
+ '%s ',
+ htmlspecialchars($baseClass),
+ htmlspecialchars($user),
+ htmlspecialchars($domain),
+ htmlspecialchars($tld),
+ $title,
+ $style,
+ $id,
+ $content
+ );
+ }
+
+ /**
+ * Obfuscate plain text email (non-link).
+ */
+ public static function obfuscateEmailText($email, $attrs = []) {
+ if (strpos($email, '@') === false) {
+ return htmlspecialchars($email);
+ }
+ list($user, $domainPart) = explode('@', $email, 2);
+ $lastDot = strrpos($domainPart, '.');
+ if ($lastDot !== false) {
+ $domain = substr($domainPart, 0, $lastDot);
+ $tld = substr($domainPart, $lastDot + 1);
+ } else {
+ $domain = $domainPart;
+ $tld = '';
+ }
+
+ $reversed = strrev($email);
+ $baseClass = isset($attrs['class']) ? $attrs['class'] . ' mail-obf-text' : 'mail-obf-text';
+ $style = isset($attrs['style']) ? ' style="' . htmlspecialchars($attrs['style']) . '"' : '';
+
+ return sprintf(
+ '%s ',
+ htmlspecialchars($baseClass),
+ htmlspecialchars($user),
+ htmlspecialchars($domain),
+ htmlspecialchars($tld),
+ $style,
+ htmlspecialchars($reversed)
+ );
+ }
}
diff --git a/view/contact.php b/view/contact.php
index 72f877a..65c96c4 100644
--- a/view/contact.php
+++ b/view/contact.php
@@ -22,7 +22,7 @@
@@ -44,20 +44,13 @@
-
@@ -79,7 +72,7 @@
Blumberger Damm 130
(Eingang: Pritzhagener Weg 21)
12685 Berlin
-
+
» In Google Maps öffnen
@@ -88,11 +81,15 @@
-
+
+ Direkt per E-Mail schreiben: net.nilreb-esylaid@tkatnok
+
+
+
Online-Kontaktformular aufrufen »
-
+
Praxis-Flyer herunterladen (PDF)
@@ -119,7 +116,7 @@
diff --git a/view/frontend.php b/view/frontend.php
index 4c50fc4..c0ce237 100644
--- a/view/frontend.php
+++ b/view/frontend.php
@@ -32,7 +32,7 @@ $currentAction = isset($action) ? $action : 'main';
-
+
@@ -47,13 +47,13 @@ $currentAction = isset($action) ? $action : 'main';
-
+
- Thorner Str. 1, 12623 Berlin-Mahlsdorf
+ Thorner Str. 1, 12623 Berlin
-
+
- Satellit: Blumberger Damm 130, 12685 Berlin
+ Satellit: Blumberger Damm 130, 12685 Berlin
@@ -65,10 +65,10 @@ $currentAction = isset($action) ? $action : 'main';
Ambulanz: 030 / 566 25 39
-
-
- Fax: 030 / 566 25 30
-
+
+
+ net.nilreb-esylaid@tkatnok
+
@@ -179,7 +179,7 @@ $currentAction = isset($action) ? $action : 'main';