<title>Beklimm - Professionelle Hochdruckreinigung in Frechen</title>
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://unpkg.com/
[email protected]/dist/leaflet.js"></script>
<style>
/* ALLES KOPIEREN AB HIER BIS ZUR SCHLIEßENDEN </style> TAG */
* {
font-family: 'Montserrat', sans-serif;
font-style: italic;
box-sizing: border-box;
max-width: 100%;
}
body {
background-color: #0A1533;
color: #FFFFFF;
overflow-x: hidden;
}
.company-name {
color: #FFD700;
}
.loading-screen {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: #0A1533;
display: flex;
justify-content: center;
align-items: center;
z-index: 9999;
transition: opacity 0.5s ease-out;
}
.loading-logo {
font-size: 4rem;
color: #FFD700;
animation: pulse 2s infinite;
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
.whatsapp-float {
position: fixed;
width: 60px;
height: 60px;
bottom: 40px;
right: 40px;
background-color: #25d366;
color: #FFF;
border-radius: 50px;
text-align: center;
font-size: 30px;
box-shadow: 2px 2px 10px rgba(0,0,0,0.3);
z-index: 100;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s;
animation: pulseWhatsApp 2s infinite;
}
@keyframes pulseWhatsApp {
0% { transform: scale(1); box-shadow: 0 0 0 0 rgba(37, 211, 102, 0.7); }
70% { transform: scale(1.05); box-shadow: 0 0 0 10px rgba(37, 211, 102, 0); }
100% { transform: scale(1); box-shadow: 0 0 0 0 rgba(37, 211, 102, 0); }
}
.whatsapp-float:hover {
transform: scale(1.1);
animation: none;
box-shadow: 0 0 20px rgba(37, 211, 102, 0.7);
}
.service-card {
background: linear-gradient(135deg, rgba(255, 215, 0, 0.1), rgba(255, 255, 255, 0.05));
border: 1px solid rgba(255, 215, 0, 0.3);
transition: all 0.3s ease;
}
.service-card:hover {
transform: translateY(-5px);
box-shadow: 0 10px 25px rgba(255, 215, 0, 0.2);
}
.btn-primary {
background: linear-gradient(135deg, #FFD700, #FFA500);
color: #000000;
transition: all 0.3s ease;
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(255, 215, 0, 0.4);
}
.map-container {
height: 400px;
border-radius: 12px;
overflow: hidden;
}
.section-title-container {
display: inline-block;
padding: 8px 16px;
background-color: #FFD700;
border-radius: 8px;
margin-bottom: 20px;
}
.section-title-text {
color: #000000;
margin: 0;
}
.gallery-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 20px;
}
/* Hamburger Menu Styles */
.hamburger-menu {
display: flex;
flex-direction: column;
justify-content: space-between;
width: 30px;
height: 21px;
cursor: pointer;
z-index: 1000;
}
.hamburger-line {
height: 3px;
width: 100%;
background-color: #FFD700;
border-radius: 3px;
transition: all 0.3s ease;
}
.menu-open .hamburger-line:nth-child(1) {
transform: translateY(9px) rotate(45deg);
}
.menu-open .hamburger-line:nth-child(2) {
opacity: 0;
}
.menu-open .hamburger-line:nth-child(3) {
transform: translateY(-9px) rotate(-45deg);
}
.mobile-menu {
position: fixed;
top: 0;
right: -300px;
width: 300px;
height: 100vh;
background-color: #0A1533;
box-shadow: -5px 0 15px rgba(0, 0, 0, 0.3);
transition: right 0.3s ease;
z-index: 999;
padding: 80px 20px 20px;
overflow-y: auto;
}
.mobile-menu.open {
right: 0;
}
.mobile-menu a {
display: block;
padding: 15px;
color: #FFD700;
text-decoration: none;
border-bottom: 1px solid rgba(255, 215, 0, 0.2);
font-size: 18px;
}
.mobile-menu a:hover {
background-color: rgba(255, 215, 0, 0.1);
}
.overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
display: none;
z-index: 998;
}
.overlay.open {
display: block;
}
/* Modal Styles */
.modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.7);
display: flex;
justify-content: center;
align-items: center;
z-index: 1000;
display: none;
}
.modal.open {
display: flex;
}
.modal-content {
background: #0A1533;
padding: 30px;
border-radius: 8px;
border: 2px solid #FFD700;
max-width: 500px;
width: 90%;
max-height: 90vh;
overflow-y: auto;
}
/* Multiselect Hintergrund */
.selectBox.open + #servicesCheckboxes {
background-color: white !important;
color: black;
border: 1px solid #FFD700;
}
.selectBox.open + #servicesCheckboxes label {
color: black;
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
}
.selectBox.open + #servicesCheckboxes label:hover {
background-color: #f0f0f0;
}
.password-input {
width: 100%;
padding: 10px;
margin-bottom: 10px;
border: 1px solid #FFD700;
background: rgba(0, 0, 0, 0.3);
color: white;
border-radius: 4px;
}
.admin-btn {
width: 100%;
padding: 12px;
margin: 5px 0;
background: rgba(255, 215, 0, 0.2);
border: 1px solid #FFD700;
color: white;
border-radius: 4px;
cursor: pointer;
transition: all 0.3s;
}
.admin-btn:hover {
background: rgba(255, 215, 0, 0.4);
}
@media (max-width: 768px) {
.desktop-nav {
display: none;
}
.hamburger-menu {
display: flex;
}
}
@media (min-width: 769px) {
.mobile-menu {
display: none;
}
}
.legal-modal {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.7);
z-index: 1000;
justify-content: center;
align-items: center;
}
.legal-modal.open {
display: flex;
}
.legal-content {
background: #0A1533;
padding: 30px;
border-radius: 8px;
border: 2px solid #FFD700;
max-width: 700px;
width: 90%;
max-height: 80vh;
overflow-y: auto;
color: white;
}
/* Wortumbruch für lange Wörter */
.word-wrap {
overflow-wrap: break-word;
word-wrap: break-word;
hyphens: auto;
}
/* Multi-Select Styling */
.multiselect {
width: 100%;
}
.selectBox {
position: relative;
}
.selectBox select {
width: 100%;
padding: 12px;
border-radius: 4px;
background: white;
color: black;
}
.overSelect {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
}
#servicesCheckboxes {
display: none;
border: 1px solid #FFD700;
background-color: white;
color: black;
max-height: 200px;
overflow-y: auto;
margin-top: 5px;
padding: 10px;
border-radius: 4px;
position: absolute;
width: 100%;
z-index: 10;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}
#servicesCheckboxes label {
display: block;
padding: 8px 5px;
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
}
#servicesCheckboxes label:hover {
background-color: #f0f0f0;
}
/* Password Toggle Styles */
.password-container {
position: relative;
}
.toggle-password {
position: absolute;
right: 10px;
top: 10px;
cursor: pointer;
color: #FFD700;
}
/* Logo Image Styling */
.logo-image {
width: 100%;
height: 100%;
object-fit: contain;
}
/* Gallery Item Styles */
.gallery-item {
position: relative;
}
.delete-gallery-item {
position: absolute;
top: 10px;
right: 10px;
background: rgba(239, 68, 68, 0.8);
color: white;
border: none;
border-radius: 50%;
width: 30px;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
opacity: 0;
transition: opacity 0.3s;
}
.gallery-item:hover .delete-gallery-item {
opacity: 1;
}
.review-item {
border-bottom: 1px solid rgba(255, 215, 0, 0.3);
padding: 15px 0;
}
/* Debug Info */
.debug-info {
position: fixed;
bottom: 10px;
left: 10px;
background: rgba(0,0,0,0.7);
color: white;
padding: 10px;
border-radius: 5px;
font-size: 12px;
z-index: 1000;
display: none;
}
</style>
<!-- MOBILE MENU OVERLAY -->
<div class="overlay" id="overlay"></div>
<!-- MOBILE MENU -->
<div class="mobile-menu" id="mobileMenu">
<a href="#home" onclick="scrollToSection('home')">Start</a>
<a href="#services" onclick="scrollToSection('services')">Leistungen</a>
<a href="#calculator" onclick="scrollToSection('calculator')">Preisrechner</a>
<a href="#gallery" onclick="scrollToSection('gallery')">Galerie</a>
<a href="#reviews" onclick="scrollToSection('reviews')">Kunden-bewertungen</a>
<a href="#contact" onclick="scrollToSection('contact')">Kontakt</a>
<a href="#" onclick="showAdminLogin()">Admin Login</a>
</div>
<!-- ALL MODALS FÜR ADMIN-FUNKTIONEN -->
<!-- Admin Login Modal -->
<div class="modal" id="adminModal">
<div class="modal-content">
<h2 class="text-2xl font-bold text-yellow-500 mb-4">Admin Login</h2>
<div class="password-container">
<input type="password" id="adminPassword" placeholder="Admin-Passwort" class="password-input">
<span class="toggle-password" onclick="togglePassword('adminPassword')">
<i class="far fa-eye"></i>
</span>
</div>
<div class="flex space-x-4">
<button onclick="checkAdminPassword()" class="btn-primary px-4 py-2 rounded font-bold">Login</button>
<button onclick="closeModal('adminModal')" class="bg-gray-500 text-white px-4 py-2 rounded font-bold">Abbrechen</button>
</div>
<p id="passwordError" class="text-red-400 mt-2 hidden">Falsches Passwort!</p>
</div>
</div>
<!-- Admin Panel Modal -->
<div class="modal" id="adminPanelModal">
<div class="modal-content">
<h2 class="text-2xl font-bold text-yellow-500 mb-6">Admin Panel</h2>
<div class="space-y-4">
<button onclick="showGalleryUpload()" class="admin-btn">Galerie verwalten</button>
<button onclick="showReviewManagement()" class="admin-btn">Bewertungen verwalten</button>
<button onclick="showLogoUpload()" class="admin-btn">Logo ändern</button>
<button onclick="showPasswordChange()" class="admin-btn">Passwörter ändern</button>
<button onclick="logoutAdmin()" class="admin-btn bg-red-500">Logout</button>
</div>
</div>
</div>
<!-- Gallery Password Modal -->
<div class="modal" id="galleryPasswordModal">
<div class="modal-content">
<h2 class="text-2xl font-bold text-yellow-500 mb-4">Galerie Passwort</h2>
<div class="password-container">
<input type="password" id="galleryPassword" placeholder="Galerie-Passwort" class="password-input">
<span class="toggle-password" onclick="togglePassword('galleryPassword')">
<i class="far fa-eye"></i>
</span>
</div>
<div class="flex space-x-4">
<button onclick="checkGalleryPassword()" class="btn-primary px-4 py-2 rounded font-bold">Bestätigen</button>
<button onclick="closeModal('galleryPasswordModal')" class="bg-gray-500 text-white px-4 py-2 rounded font-bold">Abbrechen</button>
</div>
<p id="galleryPasswordError" class="text-red-400 mt-2 hidden">Falsches Passwort!</p>
</div>
</div>
<!-- Reviews Password Modal -->
<div class="modal" id="reviewsPasswordModal">
<div class="modal-content">
<h2 class="text-2xl font-bold text-yellow-500 mb-4">Bewertungen Passwort</h2>
<div class="password-container">
<input type="password" id="reviewsPassword" placeholder="Bewertungen-Passwort" class="password-input">
<span class="toggle-password" onclick="togglePassword('reviewsPassword')">
<i class="far fa-eye"></i>
</span>
</div>
<div class="flex space-x-4">
<button onclick="checkReviewsPassword()" class="btn-primary px-4 py-2 rounded font-bold">Bestätigen</button>
<button onclick="closeModal('reviewsPasswordModal')" class="bg-gray-500 text-white px-4 py-2 rounded font-bold">Abbrechen</button>
</div>
<p id="reviewsPasswordError" class="text-red-400 mt-2 hidden">Falsches Passwort!</p>
</div>
</div>
<!-- Logo Password Modal -->
<div class="modal" id="logoPasswordModal">
<div class="modal-content">
<h2 class="text-2xl font-bold text-yellow-500 mb-4">Logo Passwort</h2>
<div class="password-container">
<input type="password" id="logoPassword" placeholder="Logo-Passwort" class="password-input">
<span class="toggle-password" onclick="togglePassword('logoPassword')">
<i class="far fa-eye"></i>
</span>
</div>
<div class="flex space-x-4">
<button onclick="checkLogoPassword()" class="btn-primary px-4 py-2 rounded font-bold">Bestätigen</button>
<button onclick="closeModal('logoPasswordModal')" class="bg-gray-500 text-white px-4 py-2 rounded font-bold">Abbrechen</button>
</div>
<p id="logoPasswordError" class="text-red-400 mt-2 hidden">Falsches Passwort!</p>
</div>
</div>
<!-- Password Auth Modal -->
<div class="modal" id="passwordAuthModal">
<div class="modal-content">
<h2 class="text-2xl font-bold text-yellow-500 mb-4">Passwort bestätigen</h2>
<div class="password-container">
<input type="password" id="passwordAuth" placeholder="Passwort für Passwortänderung" class="password-input">
<span class="toggle-password" onclick="togglePassword('passwordAuth')">
<i class="far fa-eye"></i>
</span>
</div>
<div class="flex space-x-4">
<button onclick="checkPasswordAuth()" class="btn-primary px-4 py-2 rounded font-bold">Bestätigen</button>
<button onclick="closeModal('passwordAuthModal')" class="bg-gray-500 text-white px-4 py-2 rounded font-bold">Abbrechen</button>
</div>
<p id="passwordAuthError" class="text-red-400 mt-2 hidden">Falsches Passwort!</p>
</div>
</div>
<!-- Password Change Modal -->
<div class="modal" id="passwordChangeModal">
<div class="modal-content">
<h2 class="text-2xl font-bold text-yellow-500 mb-4">Passwörter ändern</h2>
<div class="space-y-4">
<div>
<label class="block mb-2">Admin-Passwort:</label>
<div class="password-container">
<input type="password" id="newAdminPassword" placeholder="Neues Admin-Passwort" class="password-input">
<span class="toggle-password" onclick="togglePassword('newAdminPassword')">
<i class="far fa-eye"></i>
</span>
</div>
</div>
<div>
<label class="block mb-2">Bild-Passwort:</label>
<div class="password-container">
<input type="password" id="newImagePassword" placeholder="Neues Bild-Passwort" class="password-input">
<span class="toggle-password" onclick="togglePassword('newImagePassword')">
<i class="far fa-eye"></i>
</span>
</div>
</div>
<div>
<label class="block mb-2">Logo-Passwort:</label>
<div class="password-container">
<input type="password" id="newLogoPassword" placeholder="Neues Logo-Passwort" class="password-input">
<span class="toggle-password" onclick="togglePassword('newLogoPassword')">
<i class="far fa-eye"></i>
</span>
</div>
</div>
<div>
<label class="block mb-2">Bewertungs-Passwort:</label>
<div class="password-container">
<input type="password" id="newReviewPassword" placeholder="Neues Bewertungs-Passwort" class="password-input">
<span class="toggle-password" onclick="togglePassword('newReviewPassword')">
<i class="far fa-eye"></i>
</span>
</div>
</div>
</div>
<div class="flex space-x-4 mt-6">
<button onclick="saveNewPasswords()" class="btn-primary px-4 py-2 rounded font-bold">Speichern</button>
<button onclick="closeModal('passwordChangeModal')" class="bg-gray-500 text-white px-4 py-2 rounded font-bold">Abbrechen</button>
</div>
</div>
</div>
<!-- Gallery Upload Modal -->
<div class="modal" id="galleryUploadModal">
<div class="modal-content">
<h2 class="text-2xl font-bold text-yellow-500 mb-4">Galerie verwalten</h2>
<div class="mb-4">
<h3 class="text-lg font-bold text-yellow-500 mb-2">Neues Bild hochladen</h3>
<div class="mb-4">
<label class="block mb-2">Vorher-Bild:</label>
<input type="file" id="beforeImage" class="w-full p-2 rounded bg-gray-800 text-white">
</div>
<div class="mb-4">
<label class="block mb-2">Nachher-Bild:</label>
<input type="file" id="afterImage" class="w-full p-2 rounded bg-gray-800 text-white">
</div>
<div class="mb-4">
<label class="block mb-2">Beschreibung:</label>
<input type="text" id="imageDescription" placeholder="Beschreibung der Bilder" class="w-full p-2 rounded bg-gray-800 text-white">
</div>
<button onclick="uploadGalleryImage()" class="btn-primary px-4 py-2 rounded font-bold mb-6">Hochladen</button>
</div>
<div class="mb-4">
<h3 class="text-lg font-bold text-yellow-500 mb-2">Bilder entfernen</h3>
<p class="text-sm text-gray-300 mb-4">Klicken Sie auf das X-Symbol, um Bilder zu entfernen (im Admin-Modus sichtbar)</p>
</div>
<div class="flex space-x-4">
<button onclick="closeModal('galleryUploadModal')" class="bg-gray-500 text-white px-4 py-2 rounded font-bold">Schließen</button>
</div>
</div>
</div>
<!-- Review Management Modal -->
<div class="modal" id="reviewManagementModal">
<div class="modal-content">
<h2 class="text-2xl font-bold text-yellow-500 mb-4">Bewertungen verwalten</h2>
<div class="mb-4">
<h3 class="text-lg font-bold text-yellow-500 mb-2">Aktuelle Bewertungen</h3>
<div id="adminReviewsList" class="max-h-60 overflow-y-auto mb-4">
<!-- Bewertungen werden hier geladen -->
</div>
</div>
<div class="mb-4">
<h3 class="text-lg font-bold text-yellow-500 mb-2">Bewertungscode ändern</h3>
<input type="text" id="newReviewCode" placeholder="Neuer Bewertungscode" class="password-input" value="BEKLIMM2025">
</div>
<div class="flex space-x-4">
<button onclick="saveReviewSettings()" class="btn-primary px-4 py-2 rounded font-bold">Speichern</button>
<button onclick="closeModal('reviewManagementModal')" class="bg-gray-500 text-white px-4 py-2 rounded font-bold">Abbrechen</button>
</div>
</div>
</div>
<!-- Logo Upload Modal -->
<div class="modal" id="logoUploadModal">
<div class="modal-content">
<h2 class="text-2xl font-bold text-yellow-500 mb-4">Logo verwalten</h2>
<div class="mb-4">
<label class="block mb-2">Logo-Bild hochladen:</label>
<input type="file" id="logoImage" class="w-full p-2 rounded bg-gray-800 text-white" accept="image/*">
</div>
<div class="flex space-x-4 mb-6">
<button onclick="uploadLogo()" class="btn-primary px-4 py-2 rounded font-bold">Hochladen</button>
</div>
<div class="mb-4">
<h3 class="text-lg font-bold text-yellow-500 mb-2">Logo entfernen</h3>
<button onclick="removeLogo()" class="bg-red-500 text-white px-4 py-2 rounded font-bold">Logo entfernen</button>
</div>
<div class="flex space-x-4">
<button onclick="closeModal('logoUploadModal')" class="bg-gray-500 text-white px-4 py-2 rounded font-bold">Schließen</button>
</div>
</div>
</div>
<!-- Legal Modals (Impressum & Datenschutz) -->
<div id="imprintModal" class="legal-modal">
<div class="legal-content">
<h2 class="text-2xl font-bold mb-4 text-yellow-500">Impressum</h2>
<div class="space-y-4">
<p><strong>Angaben gemäß § 5 TMG:</strong></p>
<p>Beklimm<br>
Musterstraße 123<br>
50226 Frechen</p>
<p><strong>Kontakt:</strong><br>
Telefon: +49 157 31614484<br>
E-Mail: [email protected]</p>
<p><strong>Umsatzsteuer-ID:</strong><br>
Umsatzsteuer-Identifikationsnummer gemäß §27 a Umsatzsteuergesetz:<br>
DE123456789</p>
<p><strong>Verantwortlich für den Inhalt nach § 55 Abs. 2 RStV:</strong><br>
Max Mustermann<br>
Musterstraße 123<br>
50226 Frechen</p>
</div>
<button onclick="closeModal('imprintModal')" class="mt-4 bg-blue-600 text-white px-4 py-2 rounded">Schließen</button>
</div>
</div>
<div id="privacyModal" class="legal-modal">
<div class="legal-content">
<h2 class="text-2xl font-bold mb-4 text-yellow-500">Datenschutzerklärung</h2>
<div class="space-y-4">
<p><strong>1. Datenschutz auf einen Blick</strong></p>
<p><strong>Allgemeine Informationen</strong><br>
Die folgenden Hinweise geben einen einfachen Überblick darüber, was mit Ihren personenbezogenen Daten passiert, wenn Sie diese Website besuchen.</p>
<p><strong>Datenerfassung auf dieser Website</strong><br>
Wer verantwortlich für die Datenerfassung auf dieser Website ist, erfahren Sie im Impressum.</p>
<p><strong>Wie erfassen wir Ihre Daten?</strong><br>
Ihre Daten werden zum einen dadurch erhoben, dass Sie uns diese mitteilen. Hierbei kann es sich z.B. um Daten handeln, die Sie in ein Kontaktformular eingeben.</p>
<p><strong>Wofür nutzen wir Ihre Daten?</strong><br>
Ein Teil der Daten wird erhoben, um eine fehlerfreie Bereitstellung der Website zu gewährleisten. Andere Daten können zur Analyse Ihres Nutzerverhaltens verwendet werden.</p>
<p><strong>Welche Rechte haben Sie bezüglich Ihrer Daten?</strong><br>
Sie haben jederzeit das Recht, unentgeltlich Auskunft über Herkunft, Empfänger und Zweck Ihrer gespeicherten personenbezogenen Daten zu erhalten.</p>
</div>
<button onclick="closeModal('privacyModal')" class="mt-4 bg-blue-600 text-white px-4 py-2 rounded">Schließen</button>
</div>
</div>
<!-- WHATSAPP FLOAT BUTTON -->
<a href="https://wa.me/4915731614484" target="_blank" class="whatsapp-float">
<i class="fab fa-whatsapp"></i>
</a>
<!-- HEADER MIT NAVIGATION -->
<header class="bg-opacity-90 backdrop-blur-sm sticky top-0 z-50" style="background-color: rgba(10, 21, 51, 0.9);">
<div class="container mx-auto px-4 py-4">
<div class="flex items-center justify-between">
<div class="flex items-center space-x-4">
<div id="logoContainer" class="w-24 h-24 bg-yellow-500 rounded-full flex items-center justify-center text-black font-bold text-xl overflow-hidden">
<img id="logoImageElement" src="" alt="Beklimm Logo" class="logo-image" style="display: none;">
<span id="logoPlaceholder">B</span>
</div>
<h1 class="company-name text-3xl font-bold">Beklimm</h1>
</div>
<nav class="desktop-nav hidden md:flex space-x-6">
<a href="#home" class="hover:text-yellow-500 transition">Start</a>
<a href="#services" class="hover:text-yellow-500 transition">Leistungen</a>
<a href="#calculator" class="hover:text-yellow-500 transition">Preisrechner</a>
<a href="#gallery" class="hover:text-yellow-500 transition">Galerie</a>
<a href="#reviews" class="hover:text-yellow-500 transition">Kunden-bewertungen</a>
<a href="#contact" class="hover:text-yellow-500 transition">Kontakt</a>
</nav>
<div class="md:hidden">
<div class="hamburger-menu" id="hamburgerMenu">
<div class="hamburger-line"></div>
<div class="hamburger-line"></div>
<div class="hamburger-line"></div>
</div>
</div>
</div>
</div>
</header>
<!-- HERO SECTION -->
<section id="home" class="py-20 text-center">
<div class="container mx-auto px-4">
<h2 class="text-5xl font-bold mb-6 word-wrap">Professionelle <span class="company-name">Hochdruckreinigung</span> in Frechen</h2>
<p class="text-xl mb-8 max-w-3xl mx-auto">Wir reinigen Ihre Fassaden, Terrassen, Einfahrten und Dächer mit modernster Hochdrucktechnik. Saubere Ergebnisse ohne versteckten Kosten.</p>
<div class="flex flex-col md:flex-row justify-center items-center space-y-4 md:space-y-0 md:space-x-6">
<button onclick="scrollToSection('contact')" class="btn-primary px-8 py-4 rounded-lg font-bold text-lg">Jetzt Angebot anfordern</button>
<div class="text-yellow-500 font-bold">📍 Köln, Rhein-Erft-Kreis & Umgebung - Auf Anfrage auch weitere Strecken</div>
</div>
</div>
</section>
<!-- SERVICES SECTION -->
<section id="services" class="py-16">
<div class="container mx-auto px-4">
<div class="section-title-container">
<h2 class="section-title-text text-4xl font-bold text-center">Unsere Leistungen</h2>
</div>
<div class="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
<!-- Fassadenreinigung -->
<div class="service-card p-6 rounded-lg">
<div class="text-4xl mb-4">🏠</div>
<h3 class="text-xl font-bold mb-3">Fassadenreinigung</h3>
<p class="mb-4">Schonende Reinigung Ihrer Hausfassade mit professioneller Hochdrucktechnik.</p>
<div class="text-yellow-500 font-bold">ab 6,90 € pro m² bis 30m², darüber ab 3,90 €/m²</div>
</div>
<!-- Einfahrten & Terrassen -->
<div class="service-card p-6 rounded-lg">
<div class="text-4xl mb-4">🚗</div>
<h3 class="text-xl font-bold mb-3">Einfahrten & Terrassen</h3>
<p class="mb-4">Gründliche Reinigung von Einfahrten, Terrassen und Gehwegen.</p>
<div class="text-yellow-500 font-bold">ab 7,90 € pro m² bis 30m², darüber ab 4,90 €/m²</div>
</div>
<!-- Dachreinigung -->
<div class="service-card p-6 rounded-lg">
<div class="text-4xl mb-4">🏘️</div>
<h3 class="text-xl font-bold mb-3">Dachreinigung</h3>
<p class="mb-4">Professionelle Dachreinigung inklusive Moosentfernung.</p>
<div class="text-yellow-500 font-bold">ab 9,90 € pro m² bis 50m², darüber ab 6,90 €/m²</div>
</div>
<!-- Wandreinigung -->
<div class="service-card p-6 rounded-lg">
<div class="text-4xl mb-4">🧱</div>
<h3 class="text-xl font-bold mb-3">Wandreinigung</h3>
<p class="mb-4">Professionelle Reinigung von Außenwänden und Mauern.</p>
<div class="text-yellow-500 font-bold">ab 6,90 € pro m² bis 30m², darüber ab 3,90 €/m²</div>
</div>
<!-- Graffitientfernung -->
<div class="service-card p-6 rounded-lg">
<div class="text-4xl mb-4">🎨</div>
<h3 class="text-xl font-bold mb-3">Graffitientfernung</h3>
<p class="mb-4">Effektive Entfernung von Graffiti und Verschmutzungen.</p>
<div class="text-yellow-500 font-bold">ab 29 € pro m² bis 20m², darüber ab 19 €/m²</div>
</div>
<!-- Algen- & Moosentfernung -->
<div class="service-card p-6 rounded-lg">
<div class="text-4xl mb-4">🌿</div>
<h3 class="text-xl font-bold mb-3">Algen- & Moosentfernung</h3>
<p class="mb-4">Gründliche Entfernung von Algen und Moos von allen Oberflächen.</p>
<div class="text-yellow-500 font-bold">ab 5,50 € pro m² bis 30m², darüber ab 2,90 €/m²</div>
</div>
<!-- Großfahrzeugreinigung -->
<div class="service-card p-6 rounded-lg">
<div class="text-4xl mb-4">🚛</div>
<h3 class="text-xl font-bold mb-3">Großfahrzeugreinigung</h3>
<p class="mb-4">Außenreinigung von großen Fahrzeugen wie LKW, Traktoren und anderen Großfahrzeugen.</p>
<div class="text-yellow-500 font-bold">49 € pro Fahrzeug</div>
</div>
</div>
</div>
</section>
<!-- PRICE CALCULATOR SECTION -->
<section id="calculator" class="py-16 bg-opacity-50" style="background-color: rgba(255, 215, 0, 0.1);">
<div class="container mx-auto px-4">
<div class="section-title-container">
<h2 class="section-title-text text-4xl font-bold text-center">Preisrechner</h2>
</div>
<div class="max-w-4xl mx-auto bg-white bg-opacity-10 p-8 rounded-lg backdrop-blur-sm">
<div class="mb-6">
<h3 class="text-xl font-bold mb-4 text-yellow-500">Mehrere Leistungen berechnen</h3>
<div id="serviceItems">
<div class="service-item grid grid-cols-1 md:grid-cols-4 gap-4 mb-4 p-4 bg-white bg-opacity-10 rounded">
<select class="service-select p-3 rounded bg-white text-black" onchange="updateInputPlaceholder(this); calculateTotalPrice()">
<option value="">Leistung wählen</option>
<option value="fassade">Fassadenreinigung (ab 6,90 € pro m² bis 30m², darüber ab 3,90 €/m²)</option>
<option value="einfahrt">Einfahrten, Terrassen, Gehwege (ab 7,90 € pro m² bis 30m², darüber ab 4,90 €/m²)</option>
<option value="dach">Dachreinigung inkl. Moosentfernung (ab 9,90 € pro m² bis 50m², darüber ab 6,90 €/m²)</option>
<option value="wand">Wandreinigung (ab 6,90 € pro m² bis 30m², darüber ab 3,90 €/m²)</option>
<option value="graffiti">Graffitientfernung (ab 29 € pro m² bis 20m², darüber ab 19 €/m²)</option>
<option value="algen">Algen- & Moosentfernung (ab 5,50 € pro m² bis 30m², darüber ab 2,90 €/m²)</option>
<option value="grossfahrzeug">Großfahrzeugreinigung (49 € pro Fahrzeug)</option>
</select>
<input type="number" class="area-input p-3 rounded bg-white text-black" placeholder="Fläche in m²" oninput="calculateTotalPrice()">
<div class="item-price text-center font-bold text-yellow-500 flex items-center justify-center">0,00 €</div>
<button onclick="removeServiceItem(this)" class="bg-red-500 text-white px-3 py-2 rounded hover:bg-red-600 transition">Entfernen</button>
</div>
</div>
<button onclick="addServiceItem()" class="bg-green-500 text-white px-4 py-2 rounded hover:bg-green-600 transition mb-6">+ Weitere Leistung hinzufügen</button>
</div>
<div class="text-center border-t border-yellow-500 pt-6">
<div id="totalPrice" class="text-3xl font-bold text-yellow-500 mb-4">Gesamtpreis: ab 0,00 €</div>
<div id="minimumWarning" class="text-red-400 text-sm" style="display: none;">
⚠️ Mindestbestellwert: 400 €
</div>
<div class="text-sm text-gray-300 mt-2">Alle Preise inkl. MwSt. - Keine versteckten Kosten</div>
</div>
</div>
</div>
</section>
<!-- SERVICE AREA SECTION -->
<section class="py-16">
<div class="container mx-auto px-4">
<div class="section-title-container">
<h2 class="section-title-text text-4xl font-bold text-center">Unser Einsatzgebiet</h2>
</div>
<div class="text-center mb-8">
<p class="text-lg">Wir sind in Köln, Rhein-Erft-Kreis & Umgebung für Sie da. Auf Anfrage fahren wir auch weitere Strecken.</p>
</div>
<div id="map" class="map-container mx-auto max-w-4xl"></div>
</div>
</section>
<!-- GALLERY SECTION -->
<section id="gallery" class="py-16">
<div class="container mx-auto px-4">
<div class="section-title-container">
<h2 class="section-title-text text-4xl font-bold text-center">Vorher-Nachher Galerie</h2>
</div>
<div class="gallery-grid" id="galleryContainer">
<!-- Galerie wird per JavaScript geladen -->
</div>
</div>
</section>
<!-- REVIEWS SECTION -->
<section id="reviews" class="py-16 bg-opacity-50" style="background-color: rgba(255, 215, 0, 0.1);">
<div class="container mx-auto px-4">
<div class="section-title-container">
<h2 class="section-title-text text-4xl font-bold text-center">Kunden-bewertungen</h2>
</div>
<div class="max-w-2xl mx-auto mb-12 bg-white bg-opacity-10 p-6 rounded-lg">
<h3 class="text-xl font-bold mb-4 text-yellow-500">Bewertung abgeben</h3>
<div class="mb-4">
<label class="block mb-2">Bewertungscode:</label>
<input type="text" id="reviewCode" placeholder="Geben Sie den Bewertungscode ein" class="w-full p-3 rounded bg-white text-black">
</div>
<div class="mb-4">
<label class="block mb-2">Bewertung:</label>
<div class="flex space-x-2 mb-2">
<span class="star cursor-pointer text-2xl" data-rating="1">⭐</span>
<span class="star cursor-pointer text-2xl" data-rating="2">⭐</span>
<span class="star cursor-pointer text-2xl" data-rating="3">⭐</span>
<span class="star cursor-pointer text-2xl" data-rating="4">⭐</span>
<span class="star cursor-pointer text-2xl" data-rating="5">⭐</span>
</div>
</div>
<div class="mb-4">
<label class="block mb-2">Name:</label>
<input type="text" id="reviewerName" placeholder="Ihr Name" class="w-full p-3 rounded bg-white text-black">
</div>
<div class="mb-4">
<label class="block mb-2">Kommentar:</label>
<textarea id="reviewComment" placeholder="Ihre Bewertung..." class="w-full p-3 rounded bg-white text-black h-24"></textarea>
</div>
<button onclick="submitReview()" class="btn-primary px-6 py-2 rounded font-bold">Bewertung abgeben</button>
</div>
<div id="reviewsDisplay" class="grid md:grid-cols-2 gap-6">
<!-- Bewertungen werden per JavaScript geladen -->
</div>
</div>
</section>
<!-- CONTACT SECTION -->
<section id="contact" class="py-16">
<div class="container mx-auto px-4">
<div class="section-title-container">
<h2 class="section-title-text text-4xl font-bold text-center">Kontakt</h2>
</div>
<div class="grid md:grid-cols-2 gap-12">
<div>
<h3 class="text-2xl font-bold mb-6 text-yellow-500">Kontaktinformationen</h3>
<div class="space-y-4">
<div class="flex items-center">
<span class="text-2xl mr-4">📍</span>
<div>
<div class="font-bold">Standort</div>
<div>50226 Frechen - Köln, Rhein-Erft-Kreis & Umgebung</div>
</div>
</div>
<div class="flex items-center">
<span class="text-2xl mr-4">📞</span>
<div>
<div class="font-bold">Telefon</div>
<div>+49 157 31614484</div>
</div>
</div>
<div class="flex items-center">
<span class="text-2xl mr-4">🕒</span>
<div>
<div class="font-bold">Servicezeiten</div>
<div>Montag - Samstag: 10:00 - 18:00 Uhr</div>
</div>
</div>
<div class="flex items-center">
<span class="text-2xl mr-4">💧</span>
<div>
<div class="font-bold">Wasseranschluss</div>
<div>Wir nutzen Ihren Wasseranschluss</div>
</div>
</div>
<div class="flex items-center">
<span class="text-2xl mr-4">💰</span>
<div>
<div class="font-bold">Mindestbestellwert</div>
<div>400 € (keine versteckten Kosten)</div>
</div>
</div>
<div class="flex items-center">
<span class="text-2xl mr-4">✉️</span>
<div>
<div class="font-bold">Email</div>
<div>[email protected]</div>
</div>
</div>
</div>
</div>
<div>
<form id="contactForm" class="space-y-4">
<div class="grid md:grid-cols-2 gap-4">
<input type="text" id="name" placeholder="Name *" required class="p-3 rounded bg-white text-black">
<input type="email" id="email" placeholder="E-Mail *" required class="p-3 rounded bg-white text-black">
</div>
<div class="grid md:grid-cols-2 gap-4">
<input type="tel" id="phone" placeholder="Telefonnummer *" required class="p-3 rounded bg-white text-black">
<input type="text" id="location" placeholder="PLZ/Ort *" required class="p-3 rounded bg-white text-black">
</div>
<input type="text" id="address" placeholder="Straße und Hausnummer *" required class="w-full p-3 rounded bg-white text-black">
<div class="multiselect">
<div class="selectBox">
<select class="w-full p-3 rounded bg-white text-black">
<option>Leistungen auswählen *</option>
</select>
<div class="overSelect"></div>
</div>
<div id="servicesCheckboxes">
<label for="service1"><input type="checkbox" id="service1" name="service" value="fassade" /> Fassadenreinigung</label>
<label for="service2"><input type="checkbox" id="service2" name="service" value="terrasse" /> Einfahrten, Terrassen, Gehwege</label>
<label for="service3"><input type="checkbox" id="service3" name="service" value="dach" /> Dachreinigung</label>
<label for="service4"><input type="checkbox" id="service4" name="service" value="wand" /> Wandreinigung</label>
<label for="service5"><input type="checkbox" id="service5" name="service" value="graffiti" /> Graffitientfernung</label>
<label for="service6"><input type="checkbox" id="service6" name="service" value="algen" /> Algen- & Moosentfernung</label>
<label for="service7"><input type="checkbox" id="service7" name="service" value="grossfahrzeug" /> Großfahrzeugreinigung</label>
</div>
</div>
<textarea id="message" placeholder="Ihre Nachricht..." class="w-full p-3 rounded bg-white text-black h-32"></textarea>
<button type="submit" class="btn-primary px-8 py-3 rounded font-bold">Anfrage senden</button>
</form>
</div>
</div>
</div>
</section>
<!-- FOOTER -->
<footer class="py-12 border-t border-yellow-500">
<div class="container mx-auto px-4">
<div class="grid md:grid-cols-3 gap-8">
<div>
<h3 class="company-name text-2xl font-bold mb-4">Beklimm</h3>
<p>Ihr Partner für professionelle Hochdruckreinigung in Frechen und Umgebung.</p>
</div>
<div>
<h4 class="text-lg font-bold mb-4 text-yellow-500">Schnelllinks</h4>
<div class="space-y-2">
<a href="#services" class="block hover:text-yellow-500 transition">Leistungen</a>
<a href="#calculator" class="block hover:text-yellow-500 transition">Preisrechner</a>
<a href="#contact" class="block hover:text-yellow-500 transition">Kontakt</a>
</div>
</div>
<div>
<h4 class="text-lg font-bold mb-4 text-yellow-500">Rechtliches</h4>
<div class="space-y-2">
<a href="#" onclick="showModal('imprintModal')" class="block hover:text-yellow-500 transition">Impressum</a>
<a href="#" onclick="showModal('privacyModal')" class="block hover:text-yellow-500 transition">Datenschutz</a>
</div>
</div>
</div>
<div class="text-center mt-8 pt-8 border-t border-gray-600">
<p>© 2025 Beklimm. Alle Rechte vorbehalten.</p>
</div>
</div>
</footer>
<!-- JAVASCRIPT -->
<script>
// SICHERE PASSWORT-VERWALTUNG
class SecurePasswordManager {
constructor() {
this.salts = {
admin: "beklimm_admin_2025_salt_secure",
image: "beklimm_image_1909_salt_secure",
logo: "beklimm_logo_1910_salt_secure",
review: "beklimm_review_1911_salt_secure",
passwordChange: "beklimm_pwchange_1912_salt_secure"
};
this.hashes = {
admin: this.createSecureHash("THGJLMBEKLIMM2025", this.salts.admin),
image: this.createSecureHash("THGJLM1909", this.salts.image),
logo: this.createSecureHash("THGJLM1910", this.salts.logo),
review: this.createSecureHash("THGJLM1911", this.salts.review),
passwordChange: this.createSecureHash("THGJLM1912", this.salts.passwordChange)
};
}
createSecureHash(password, salt) {
let hash = 0;
const combined = password + salt;
for (let i = 0; i < combined.length; i++) {
const char = combined.charCodeAt(i);
hash = ((hash << 7) - hash) + char;
hash = hash & hash;
}
for (let i = 0; i < 10000; i++) {
hash = ((hash << 5) - hash) + i + salt.charCodeAt(i % salt.length);
hash = hash & hash;
}
return 'secure_' + Math.abs(hash).toString(36) + '_' + salt.substring(salt.length - 4);
}
verifyPassword(input, type) {
const testHash = this.createSecureHash(input, this.salts[type]);
return testHash === this.hashes[type];
}
updatePassword(type, newPassword) {
this.hashes[type] = this.createSecureHash(newPassword, this.salts[type]);
return true;
}
}
const passwordManager = new SecurePasswordManager();
let REVIEW_CODE = "BEKLIMM2025";
let adminAuthenticated = false;
let selectedRating = 0;
let reviews = [];
let galleryItems = [];
// BEIM LADEN DER SEITE
window.addEventListener('load', function() {
setTimeout(() => {
document.getElementById('loadingScreen').style.opacity = '0';
setTimeout(() => {
document.getElementById('loadingScreen').style.display = 'none';
}, 500);
}, 1500);
initStars();
initMap();
loadReviews();
loadGallery();
initMultiselect();
loadLogo();
document.getElementById('newReviewCode').value = REVIEW_CODE;
document.querySelectorAll('.service-select').forEach(select => {
updateInputPlaceholder(select);
});
});
// HAMBURGER MENU
const hamburgerMenu = document.getElementById('hamburgerMenu');
const mobileMenu = document.getElementById('mobileMenu');
const overlay = document.getElementById('overlay');
hamburgerMenu.addEventListener('click', function() {
this.classList.toggle('menu-open');
mobileMenu.classList.toggle('open');
overlay.classList.toggle('open');
});
overlay.addEventListener('click', function() {
hamburgerMenu.classList.remove('menu-open');
mobileMenu.classList.remove('open');
this.classList.remove('open');
});
function closeMobileMenu() {
hamburgerMenu.classList.remove('menu-open');
mobileMenu.classList.remove('open');
overlay.classList.remove('open');
}
// MODAL FUNKTIONEN
function showAdminLogin() {
showModal('adminModal');
closeMobileMenu();
}
function checkAdminPassword() {
const input = document.getElementById('adminPassword').value;
const errorElement = document.getElementById('passwordError');
if (passwordManager.verifyPassword(input, 'admin')) {
adminAuthenticated = true;
errorElement.classList.add('hidden');
closeModal('adminModal');
showModal('adminPanelModal');
} else {
errorElement.classList.remove('hidden');
}
}
function checkGalleryPassword() {
const input = document.getElementById('galleryPassword').value;
const errorElement = document.getElementById('galleryPasswordError');
if (passwordManager.verifyPassword(input, 'image')) {
errorElement.classList.add('hidden');
closeModal('galleryPasswordModal');
showModal('galleryUploadModal');
} else {
errorElement.classList.remove('hidden');
}
}
function checkReviewsPassword() {
const input = document.getElementById('reviewsPassword').value;
const errorElement = document.getElementById('reviewsPasswordError');
if (passwordManager.verifyPassword(input, 'review')) {
errorElement.classList.add('hidden');
closeModal('reviewsPasswordModal');
showModal('reviewManagementModal');
renderAdminReviewsList();
} else {
errorElement.classList.remove('hidden');
}
}
function checkLogoPassword() {
const input = document.getElementById('logoPassword').value;
const errorElement = document.getElementById('logoPasswordError');
if (passwordManager.verifyPassword(input, 'logo')) {
errorElement.classList.add('hidden');
closeModal('logoPasswordModal');
showModal('logoUploadModal');
} else {
errorElement.classList.remove('hidden');
}
}
function checkPasswordAuth() {
const input = document.getElementById('passwordAuth').value;
const errorElement = document.getElementById('passwordAuthError');
if (passwordManager.verifyPassword(input, 'passwordChange')) {
errorElement.classList.add('hidden');
closeModal('passwordAuthModal');
showModal('passwordChangeModal');
} else {
errorElement.classList.remove('hidden');
}
}
function showModal(modalId) {
document.getElementById(modalId).classList.add('open');
}
function closeModal(modalId) {
document.getElementById(modalId).classList.remove('open');
}
function showGalleryUpload() {
closeModal('adminPanelModal');
showModal('galleryPasswordModal');
}
function showReviewManagement() {
closeModal('adminPanelModal');
showModal('reviewsPasswordModal');
}
function showLogoUpload() {
closeModal('adminPanelModal');
showModal('logoPasswordModal');