0%

ML. MASSAGE

document.addEventListener("DOMContentLoaded", function () {
    const startTime = Date.now(); // Record page script start time for preloader minimum display

    // =================================================================
    // SECTION: Preloader Setup & Logic
    // =================================================================
    const preloader = document.querySelector('.preloader-container');
    const preloaderCounter = document.querySelector('.preloader-counter');
    const vimeoDesktopIframe = document.getElementById('vimeo-desktop'); // Use your desktop ID
    const vimeoMobileIframe = document.getElementById('vimeo-mobile');   // Use your mobile ID
    const minimumDisplayTime = 1500; // Minimum preloader time in milliseconds (e.g., 1.5 seconds)

    let preloaderCount = 0;
    let pageLoadComplete = false;
    let videoReady = false;
    let preloaderHidden = false;
    let preloaderCounterInterval;
    let preloaderFailsafeTimeout;

    // --- Preloader Element Checks ---
    if (!preloader || !preloaderCounter) {
        console.warn('Preloader elements (.preloader-container or .preloader-counter) not found! Cannot initialize preloader.');
        // Attempt to hide preloader container if it exists but counter doesn't, to prevent blocking page
        if(preloader) {
            preloader.style.opacity = '0';
            preloader.style.visibility = 'hidden';
            preloader.style.display = 'none';
        }
        return; // Stop execution of preloader logic if elements are missing
    }

    // --- Determine visible Vimeo iframe ---
    let visibleVimeoIframe = null;
    if (vimeoDesktopIframe && vimeoDesktopIframe.offsetParent !== null) {
        // offsetParent is null if display:none (or parent is display:none)
        visibleVimeoIframe = vimeoDesktopIframe;
        console.log("Preloader: Detected visible video - Desktop");
    } else if (vimeoMobileIframe && vimeoMobileIframe.offsetParent !== null) {
        visibleVimeoIframe = vimeoMobileIframe;
        console.log("Preloader: Detected visible video - Mobile");
    } else {
        console.log("Preloader: No visible Vimeo background iframe detected on load.");
    }
    const shouldWaitForVideo = !!visibleVimeoIframe;
    // Initialize videoReady state: If no video visible, consider it 'ready'.
    videoReady = !shouldWaitForVideo;

    // --- Preloader Hide Function (with minimum display time) ---
    function checkAndHidePreloader() {
        // Prevent running if already hidden or elements missing
        if (preloaderHidden || !preloader || !preloaderCounter) return;

        // Check conditions: page loaded AND video ready (or not needed)
        if (pageLoadComplete && videoReady) {
            preloaderHidden = true; // Mark as hidden early to prevent race conditions
            console.log('Preloader: Conditions met. Calculating hide delay...');

            // Stop counter interval and failsafe timeout
            if (preloaderCounterInterval) clearInterval(preloaderCounterInterval);
            if (preloaderFailsafeTimeout) clearTimeout(preloaderFailsafeTimeout);

            // Ensure 100% is displayed
            preloaderCounter.textContent = '100%';

            // Calculate time needed to meet minimum display duration
            const elapsedTime = Date.now() - startTime;
            const delayNeeded = Math.max(0, minimumDisplayTime - elapsedTime);
            console.log(`Preloader: Elapsed: ${elapsedTime}ms, Delaying hide by: ${delayNeeded}ms to meet minimum of ${minimumDisplayTime}ms`);

            // Use calculated delay before starting fade-out animation
            setTimeout(() => {
                preloader.classList.add('preloader-hidden');
                preloader.setAttribute('aria-busy', 'false'); // Accessibility update

                // Remove from layout after animation (match CSS transition duration)
                setTimeout(() => {
                    preloader.style.display = 'none';
                    console.log('Preloader: Set display to none.');
                }, 500); // Should match your CSS transition duration for opacity/visibility
            }, delayNeeded);
        } else {
             // Optional log for debugging if called but conditions aren't met
             // console.log('checkAndHidePreloader called but conditions not met:', { pageLoadComplete, videoReady });
        }
    }

    // --- Preloader Failsafe Function ---
    function forceHidePreloader() {
        if (!preloaderHidden) {
            console.warn('Preloader failsafe triggered after timeout. Forcing hide.');
            pageLoadComplete = true; // Force completion states
            videoReady = true;
            checkAndHidePreloader(); // Attempt to hide gracefully
        }
    }

    // --- Preloader Event Listener: Window Load ---
    window.addEventListener('load', function() {
        console.log('Preloader: window.load event fired.');
        pageLoadComplete = true;
        checkAndHidePreloader();
    });

    // --- Preloader: Initialize Vimeo Player API (if needed) ---
    if (shouldWaitForVideo) {
        console.log("Preloader: Initializing Vimeo Player API for the visible iframe...");
        try {
            // Ensure the Vimeo Player API script is loaded before this runs
            if (typeof Vimeo === 'undefined' || !Vimeo.Player) {
                 console.error("Preloader: Vimeo Player API not loaded or available. Video readiness cannot be checked.");
                 videoReady = true; // Treat video as ready to not block indefinitely
                 checkAndHidePreloader(); // Check if page load is ready
            } else {
                const player = new Vimeo.Player(visibleVimeoIframe);

                player.on('playing', function() {
                    console.log('Preloader: Visible Vimeo player "playing" event fired.');
                    if (!videoReady) { // Ensure this runs only once
                        videoReady = true;
                        checkAndHidePreloader();
                    }
                });

                player.on('error', function(error) {
                    console.error('Preloader: Visible Vimeo player error:', error);
                    if (!videoReady) { // Prevent calling check multiple times
                        videoReady = true; // Don't block preloader on video error
                        checkAndHidePreloader();
                    }
                });

                 // Optional: Add loaded listener as a fallback in case playing never fires?
                 // player.on('loaded', function() { ... });
            }
        } catch (error) {
             console.error("Preloader: Error initializing or using Vimeo Player API:", error);
             if (!videoReady) { // Prevent calling check multiple times
                 videoReady = true; // Don't block preloader if API fails
                 checkAndHidePreloader();
             }
        }
    } else {
        console.log("Preloader: Skipping Vimeo Player API initialization (no visible video).");
    }

    // --- Preloader Counter Animation ---
    // Start only if conditions are not already met (preventing instant 100% jump if possible)
    if (!pageLoadComplete || !videoReady) {
        console.log("Preloader: Starting counter animation.");
        preloaderCounterInterval = setInterval(function() {
            if (preloaderHidden) { // Stop if hidden prematurely
                clearInterval(preloaderCounterInterval);
                return;
            }
            if (preloaderCount < 99) {
                preloaderCount++;
                preloaderCounter.textContent = preloaderCount + '%';
            } else {
                 // Stop incrementing counter at 99 if loading isn't finished.
                 // It will be forced to 100% in checkAndHidePreloader when ready.
                 // We can clear interval here if everything IS loaded, just waiting for min display time
                 if (pageLoadComplete && videoReady) {
                     clearInterval(preloaderCounterInterval);
                     console.log("Preloader: Counter reached 99%, conditions met, stopping interval.");
                 }
            }
        }, 30); // Adjust interval timing (e.g., 30-50ms)
    } else {
        // If conditions already met before interval logic runs (very fast load), attempt hide.
        console.log("Preloader: Conditions met before counter interval setup, attempting hide.");
        checkAndHidePreloader();
    }

    // --- Preloader Failsafe Timeout ---
    // Set a timeout to hide the preloader regardless after X seconds
    preloaderFailsafeTimeout = setTimeout(forceHidePreloader, 15000); // 15 seconds failsafe

}); // End DOMContentLoaded

Professionelle Massage
in der Mitte von Hamburg.

Professionelle Massage
in der Mitte von Hamburg.

Bei Uns Sind
Sie Bestens
Versorgt

Massagen

Jetzt Buchen

Paarmassagen

Gemeinsam entspannt es sich noch besser. Deshalb bieten wir Ihnen in unserem Massage-Studio die Möglichkeit, sich zu zweit oder zu dritt massieren zu lassen.

Mehr Erfahren

Büromassagen

Gemeinsam entspannt es sich noch besser. Deshalb bieten wir Ihnen in unserem Massage-Studio die Möglichkeit, sich zu zweit oder zu dritt massieren zu lassen.

Anfragen

Massage Rücken Büro

Gutscheine

Gemeinsam entspannt es sich noch besser. Deshalb bieten wir Ihnen in unserem Massage-Studio die Möglichkeit, sich zu zweit oder zu dritt massieren zu lassen.

Zu den Gutscheinen

Gutschein

Gutscheine

Digital

Die Gutscheine finden Sie ganz unten in der Buchung.

Gutscheine

Gedruckt

Zum Abholen bei uns im Salon oder per Postversand. Rufen Sie an oder scheiben Sie uns, wir beraten Sie gerne!

Unser Salon

Erleben Sie exklusive Massagen auf höchstem Niveau – individuell, medizinisch fundiert und ganz auf Ihr Wohlbefinden abgestimmt.
Wir bieten Ihnen wohltuende Ganzkörper- und Gesichtsbehandlungen, gezielte Linderung bei Rücken- und Muskelverspannungen, effektive Reduktion von Schwellungen und Cellulite, sichtbare Straffung der Hau Konturverbesserung.

Ob entspannend oder therapeutisch – wir finden die richtige Massage für Sie.

5 Sterne bei Google!
Wir danken für
Ihre Bewertungen.

Unser Team

Mehr zum Team

Lisa

Kosmetologin

Nataliia

Iryna

Yury

Maryna

Mitarbeiterin

Anna

3. Gründe
die für uns
sprechen

1.
Wir begleiten Sie in Ihrem Prozess und stehen bei allen Fragen zur verfügung.

2.
Höchste Qualität an Massageölen mit
La Sultan de Saba und
Thalgo.

3.
Erfahrene Masseure mit medizinischer Ausbildung die gezielt auf Ihre Bedürfnisse eingehen

Kosmetik

Bei uns im Salon: Kosmetikprodukte der renommierten Marken Thalgo, La Sultane de Saba, Institutum, Hedonic und Lipps zum Kauf an.

Zu den Produkten

Anfrageformular

Buchung

Salonregeln

  1. Bei einer Absage weniger als 24 Stunden vor dem Termin ist eine Zahlung von 50% des Dienstleistungspreises erforderlich.

     

  2. Verspätung: Wenn Sie mehr als 10 Minuten zu spät kommen, wird die Massagezeit entsprechend verkürzt.

     

  3. Abonement: Wenn Sie ein Abonement gekauft haben und die Buchung weniger als 24 Stunden vor dem Termin absagen, verfällt die Massageeinheit.