Skip to content

Beklimm Hochdruckreinigung #531

@yaserabdelaal2005-lab

Description

@yaserabdelaal2005-lab
<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>
Beklimm
<!-- 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">Hochdruck­reinigung</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>&copy; 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');

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions