{"id":252,"date":"2025-05-13T16:39:41","date_gmt":"2025-05-13T16:39:41","guid":{"rendered":"https:\/\/book.filemondr.hu\/?page_id=252"},"modified":"2025-07-05T13:59:25","modified_gmt":"2025-07-05T13:59:25","slug":"vakond","status":"publish","type":"page","link":"https:\/\/book.filemondr.hu\/index.php\/vakond\/","title":{"rendered":"Kapd el a k\u00f3p\u00e9t!"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"hu\">\n  <head>\n    <meta charset=\"UTF-8\" \/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\n    <title>Vakond \u00dct\u0151s J\u00e1t\u00e9k<\/title>\n    <!-- Glob\u00e1lis CSS \u00e9s bet\u0171t\u00edpusok -->\n    <link rel=\"stylesheet\" href=\"\/egyseges-stilus.css\" \/>\n    <link rel=\"stylesheet\" href=\"\/moderation.css\" \/>\n    <link\n      href=\"https:\/\/fonts.googleapis.com\/css2?family=Baloo+2&#038;display=swap\"\n      rel=\"stylesheet\"\n    \/>\n\n    <style>\n      \/* J\u00e1t\u00e9k specifikus st\u00edlusok *\/\n      body {\n        font-family: 'Baloo 2', cursive, Arial, sans-serif;\n        text-align: center;\n      }\n\n      #startScreen {\n        padding: 20px;\n        margin-top: 30px;\n      }\n\n      #gameContainer {\n        margin-top: 20px;\n      }\n\n      #infoPanel {\n        display: flex;\n        justify-content: center;\n        align-items: center;\n        gap: 20px;\n        margin-bottom: 20px;\n        flex-wrap: wrap;\n      }\n\n      #score,\n      #timer {\n        font-size: 22px;\n        font-weight: bold;\n        color: var(--text-color);\n      }\n\n      #missIndicators {\n        display: flex;\n        gap: 8px;\n        align-items: center;\n      }\n\n      .miss-dot {\n        width: 20px;\n        height: 20px;\n        background-color: var(--game-cell-bg);\n        border-radius: 50%;\n        border: 1px solid var(--border-color);\n        transition: background-color 0.3s, transform 0.2s;\n      }\n\n      .miss-dot.missed {\n        background-color: var(--error-indicator-color);\n        border-color: color-mix(in srgb, var(--error-indicator-color) 80%, black);\n        transform: scale(1.1);\n      }\n\n      #game {\n        display: grid;\n        grid-template-columns: repeat(3, 100px);\n        gap: 10px;\n        justify-content: center;\n        margin: 20px auto;\n      }\n\n      .cell {\n        width: 100px;\n        height: 100px;\n        background-color: var(--game-cell-bg);\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        border-radius: 12px;\n        position: relative;\n        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n        animation: fadeInUp 0.6s ease forwards;\n        opacity: 0;\n        overflow: hidden;\n      }\n\n      @keyframes fadeInUp {\n        from {\n          transform: translateY(20px);\n          opacity: 0;\n        }\n        to {\n          transform: translateY(0);\n          opacity: 1;\n        }\n      }\n\n      @keyframes slideIn {\n        from {\n          transform: translateY(100%);\n          opacity: 0;\n        }\n        to {\n          transform: translateY(0);\n          opacity: 1;\n        }\n      }\n\n      .vakond {\n        width: 100%;\n        height: 100%;\n        object-fit: cover;\n        cursor: pointer;\n        animation: slideIn 0.2s ease-out;\n      }\n\n      #gameControls {\n        margin-top: 20px;\n        margin-bottom: 20px;\n        display: flex;\n        justify-content: center;\n        gap: 15px;\n        flex-wrap: wrap;\n      }\n\n      #endScreen {\n        display: none;\n        position: fixed;\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n        background-color: rgba(0, 0, 0, 0.7);\n        z-index: 1000;\n        align-items: center;\n        justify-content: center;\n      }\n\n      .end-content {\n        background: var(--secondary-bg);\n        color: var(--text-color);\n        padding: 30px;\n        border-radius: 15px;\n        max-width: 80%;\n        animation: popIn 0.4s ease-in-out;\n        text-align: center;\n        box-shadow: 0 8px 30px rgba(0, 0, 0, 0.5);\n        max-height: 80vh;\n        overflow-y: auto;\n      }\n\n      .end-content h2 {\n        margin-top: 0;\n        color: var(--accent-color);\n      }\n\n      @keyframes popIn {\n        from {\n          transform: scale(0.8);\n          opacity: 0;\n        }\n        to {\n          transform: scale(1);\n          opacity: 1;\n        }\n      }\n\n      .leaderboard-panel {\n        position: fixed;\n        top: 50%;\n        left: 50%;\n        transform: translate(-50%, -50%);\n        background-color: var(--secondary-bg, #333);\n        color: var(--text-color, #f3f3f3);\n        padding: 20px;\n        border-radius: 12px;\n        box-shadow: 0 8px 30px rgba(0, 0, 0, 0.5);\n        z-index: 1001;\n        max-width: 90%;\n        width: 500px;\n        max-height: 80vh;\n        overflow-y: auto;\n      }\n\n      .leaderboard-panel h3 {\n        color: var(--accent-color);\n        margin-bottom: 15px;\n        text-align: center;\n      }\n\n      .leaderboard-list {\n        list-style: none;\n        padding: 0;\n        margin: 0;\n      }\n\n      .leaderboard-item {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        padding: 8px 12px;\n        margin: 5px 0;\n        background-color: var(--primary-bg, #222);\n        border-radius: 8px;\n        border-left: 4px solid var(--accent-color);\n      }\n\n      .leaderboard-item.top-3 {\n        background-color: var(--highlight-color, #4CAF50);\n        color: #fff;\n      }\n\n      .leaderboard-rank {\n        font-weight: bold;\n        min-width: 30px;\n      }\n\n      .leaderboard-name {\n        flex: 1;\n        margin: 0 10px;\n        text-align: left;\n      }\n\n      .leaderboard-score {\n        font-weight: bold;\n        color: var(--accent-color);\n        text-align: right;\n      }\n\n      .leaderboard-item.top-3 .leaderboard-score {\n        color: #fff;\n      }\n\n      .name-input {\n        width: 100%;\n        padding: 10px;\n        margin: 10px 0;\n        border: 2px solid var(--accent-color);\n        border-radius: 8px;\n        background-color: var(--primary-bg, #222);\n        color: var(--text-color, #f3f3f3);\n        font-size: 1rem;\n      }\n\n      .name-input:focus {\n        outline: none;\n        border-color: var(--highlight-color);\n        box-shadow: 0 0 5px rgba(76, 175, 80, 0.5);\n      }\n\n      .end-buttons {\n        display: flex;\n        justify-content: center;\n        gap: 15px;\n        margin-top: 20px;\n        flex-wrap: wrap;\n      }\n\n      .loading {\n        text-align: center;\n        color: var(--text-color);\n        padding: 20px;\n      }\n\n      .error {\n        color: #ff6b6b;\n        text-align: center;\n        padding: 10px;\n        background-color: rgba(255, 107, 107, 0.1);\n        border-radius: 8px;\n        margin: 10px 0;\n      }\n\n      .validation-error {\n        color: #ff6b6b;\n        font-size: 0.9em;\n        margin-top: 5px;\n        padding: 5px;\n        background-color: rgba(255, 107, 107, 0.1);\n        border-radius: 4px;\n        border-left: 3px solid #ff6b6b;\n      }\n\n      .report-btn {\n        background: none;\n        border: none;\n        cursor: pointer;\n        font-size: 16px;\n        margin-left: 10px;\n        color: var(--text-color);\n      }\n\n      .report-btn:hover {\n        opacity: 0.7;\n      }\n\n      .moderation-notice {\n        margin-top: 15px;\n        padding: 10px;\n        background-color: rgba(255, 193, 7, 0.1);\n        border-radius: 8px;\n        border-left: 3px solid #ffc107;\n      }\n\n      .moderation-notice p {\n        margin: 0;\n        font-size: 0.9em;\n        color: var(--text-color);\n      }\n\n      #back-to-home-icon svg {\n        width: 22px;\n        height: 22px;\n      }\n\n      .btn svg {\n        width: 20px;\n        height: 20px;\n      }\n\n      \/* Mobil n\u00e9zet finom\u00edt\u00e1sok *\/\n      @media (max-width: 600px) {\n        #infoPanel {\n          flex-direction: column;\n          gap: 10px;\n        }\n        #score,\n        #timer {\n          font-size: 18px;\n        }\n        #game {\n          grid-template-columns: repeat(3, 80px);\n          gap: 8px;\n        }\n        .cell {\n          width: 80px;\n          height: 80px;\n        }\n        .end-content, .leaderboard-panel {\n          padding: 20px;\n          max-width: 90%;\n        }\n        #gameControls {\n          flex-direction: column;\n          align-items: center;\n        }\n      }\n    <\/style>\n  <\/head>\n  <body>\n    <h1 id=\"gameTitle\" style=\"display: none;\">Vakond \u00dct\u0151s J\u00e1t\u00e9k<\/h1>\n\n    <div id=\"startScreen\">\n      <button id=\"startGameBtn\" class=\"btn\">J\u00e1t\u00e9k ind\u00edt\u00e1sa<\/button>\n      <div style=\"margin-top: 15px;\">\n        <button id=\"showLeaderboardBtn\" class=\"btn\">\n          <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n            <path d=\"M7 14H5v5h2v-5zm3-7H8v12h2V7zm3 3h-2v9h2v-9zm3-6h-2v15h2V4z\"\/>\n          <\/svg>\n          Ranglista\n        <\/button>\n      <\/div>\n    <\/div>\n\n    <div id=\"gameContainer\" style=\"display: none;\">\n      <div id=\"infoPanel\">\n        <div id=\"score\">Pontsz\u00e1m: 0<\/div>\n        <div id=\"timer\">Id\u0151: 0 mp<\/div>\n        <div id=\"missIndicators\">\n          <span class=\"miss-dot\"><\/span>\n          <span class=\"miss-dot\"><\/span>\n          <span class=\"miss-dot\"><\/span>\n        <\/div>\n      <\/div>\n      <div id=\"game\"><\/div>\n      <div id=\"gameControls\">\n        <button id=\"fullscreenBtn\" class=\"btn\">Teljes k\u00e9perny\u0151<\/button>\n        <button id=\"leaderboardBtn\" class=\"btn\">\n          <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n            <path d=\"M7 14H5v5h2v-5zm3-7H8v12h2V7zm3 3h-2v9h2v-9zm3-6h-2v15h2V4z\"\/>\n          <\/svg>\n          Ranglista\n        <\/button>\n      <\/div>\n    <\/div>\n\n    <div id=\"endScreen\">\n      <div class=\"end-content\" id=\"endContent\">\n        <!-- Tartalom JS-b\u0151l t\u00f6lt\u0151dik -->\n      <\/div>\n    <\/div>\n\n    <audio id=\"hitSound\" src=\"https:\/\/book.filemondr.hu\/hangok\/hit2.mp3\" preload=\"auto\"><\/audio>\n    <audio id=\"missSound\" src=\"https:\/\/book.filemondr.hu\/hangok\/hit.mp3\" preload=\"auto\"><\/audio>\n    <audio id=\"endSound\" src=\"https:\/\/book.filemondr.hu\/hangok\/completion-sound.mp3\" preload=\"auto\"><\/audio>\n\n    <!-- Firebase Scripts -->\n    <script type=\"module\">\n        import { initializeApp } from \"https:\/\/www.gstatic.com\/firebasejs\/11.10.0\/firebase-app.js\";\n        import { getFirestore, collection, addDoc, query, orderBy, limit, getDocs } from \"https:\/\/www.gstatic.com\/firebasejs\/11.10.0\/firebase-firestore.js\";\n        import { getAnalytics } from \"https:\/\/www.gstatic.com\/firebasejs\/11.10.0\/firebase-analytics.js\";\n\n        const firebaseConfig = {\n            apiKey: \"AIzaSyDGrQ8PJCvYynEi1Vq-QtPgljUvGUPNba0\",\n            authDomain: \"par-perc-pihi-8ddfc.firebaseapp.com\",\n            projectId: \"par-perc-pihi-8ddfc\",\n            storageBucket: \"par-perc-pihi-8ddfc.firebasestorage.app\",\n            messagingSenderId: \"169472205893\",\n            appId: \"1:169472205893:web:a0f955e2b1662e5f85af2c\",\n            measurementId: \"G-RBWKR6YYQF\"\n        };\n\n        const app = initializeApp(firebaseConfig);\n        const db = getFirestore(app);\n        const analytics = getAnalytics(app);\n\n        \/\/ Make Firebase functions globally available\n        window.firebaseDB = db;\n        window.firebaseUtils = {\n            collection,\n            addDoc,\n            query,\n            orderBy,\n            limit,\n            getDocs\n        };\n\n        \/\/ Firebase inicializ\u00e1l\u00e1s ut\u00e1n jelezz\u00fck, hogy k\u00e9sz\n        window.firebaseReady = true;\n        console.log('Firebase initialized successfully');\n    <\/script>\n\n    <!-- Moder\u00e1l\u00e1si rendszer -->\n    <script>\n        \/\/ V\u00e1rjuk meg a Firebase inicializ\u00e1l\u00e1s\u00e1t\n        function waitForFirebase() {\n            return new Promise((resolve) => {\n                if (window.firebaseReady) {\n                    resolve();\n                } else {\n                    const checkFirebase = setInterval(() => {\n                        if (window.firebaseReady) {\n                            clearInterval(checkFirebase);\n                            resolve();\n                        }\n                    }, 100);\n                }\n            });\n        }\n\n        class ModerationSystem {\n            constructor() {\n                this.bannedWords = [\n                    \/\/ Magyar tr\u00e1g\u00e1r szavak\n                    'fasz', 'szar', 'kurva', 'pina', 'pics\u00e1', 'geci', 'bazmeg', 'bassza', 'szopj',\n                    'buzi', 'ribanc', 'cafka', 'picsa', 'fing', 'szarik', 'szaros', 'rohadt',\n                    'k\u00f6cs\u00f6g', 'seggfej', 'faszfej', 'szarh\u00e1zi', 'pics\u00e1ba', 'francba',\n                    \/\/ Angol tr\u00e1g\u00e1r szavak\n                    'fuck', 'shit', 'bitch', 'damn', 'hell', 'ass', 'crap', 'piss', 'cock',\n                    'dick', 'pussy', 'whore', 'slut', 'bastard', 'motherfucker', 'asshole', 'suck', 'sucks',\n                    \/\/ Egy\u00e9b probl\u00e9m\u00e1s szavak\n                    'hitler', 'nazi', 'fasiszta', 'kommunista'\n                ];\n                this.moderationCollectionName = 'moderation-queue';\n            }\n\n            containsProfanity(text) {\n                if (!text || typeof text !== 'string') return false;\n                \n                const normalizedText = text.toLowerCase()\n                    .replace(\/[\u00e1\u00e0\u00e2\u00e4]\/g, 'a')\n                    .replace(\/[\u00e9\u00e8\u00ea\u00eb]\/g, 'e')\n                    .replace(\/[\u00ed\u00ec\u00ee\u00ef]\/g, 'i')\n                    .replace(\/[\u00f3\u00f2\u00f4\u00f6]\/g, 'o')\n                    .replace(\/[\u00fa\u00f9\u00fb\u00fc]\/g, 'u')\n                    .replace(\/[\u0151]\/g, 'o')\n                    .replace(\/[\u0171]\/g, 'u')\n                    .replace(\/[^a-z0-9]\/g, '');\n\n                return this.bannedWords.some(word => {\n                    const normalizedWord = word.toLowerCase().replace(\/[^a-z0-9]\/g, '');\n                    if (normalizedWord.length >= 3) {\n                        return normalizedText.includes(normalizedWord);\n                    }\n                    return normalizedText === normalizedWord;\n                });\n            }\n\n            validatePlayerName(name) {\n                if (!name) {\n                    return { valid: false, message: 'K\u00e9rlek add meg a neved!' };\n                }\n\n                const trimmedName = name.trim();\n                \n                if (trimmedName.length === 0) {\n                    return { valid: false, message: 'K\u00e9rlek add meg a neved!' };\n                }\n                \n                if (trimmedName.length < 2) {\n                    return { valid: false, message: 'A n\u00e9v legal\u00e1bb 2 karakter hossz\u00fa legyen!' };\n                }\n                \n                if (trimmedName.length > 20) {\n                    return { valid: false, message: 'A n\u00e9v maximum 20 karakter hossz\u00fa lehet!' };\n                }\n                \n                const allowedCharsRegex = \/^[a-zA-Z\u00e1\u00e9\u00ed\u00f3\u00f6\u0151\u00fa\u00fc\u0171\u00c1\u00c9\u00cd\u00d3\u00d6\u0150\u00da\u00dc\u01700-9\\s\\-_.]+$\/;\n                if (!allowedCharsRegex.test(trimmedName)) {\n                    return { valid: false, message: 'A n\u00e9v csak bet\u0171ket, sz\u00e1mokat \u00e9s alapvet\u0151 \u00edr\u00e1sjeleket tartalmazhat!' };\n                }\n                \n                if (this.containsProfanity(trimmedName)) {\n                    return { valid: false, message: 'K\u00e9rlek v\u00e1lassz egy megfelel\u0151 nevet!' };\n                }\n                \n                return { valid: true };\n            }\n\n            async reportEntry(entryId, gameType, reason = 'inappropriate_name') {\n                try {\n                    if (!window.firebaseDB || !window.firebaseUtils) {\n                        console.error('Firebase not available for reporting');\n                        return { success: false, error: 'Firebase not available' };\n                    }\n\n                    await window.firebaseUtils.addDoc(\n                        window.firebaseUtils.collection(window.firebaseDB, this.moderationCollectionName),\n                        {\n                            entryId: entryId,\n                            gameType: gameType,\n                            reason: reason,\n                            timestamp: new Date()\n                        }\n                    );\n                    return { success: true };\n                } catch (error) {\n                    console.error(\"Error reporting entry:\", error);\n                    return { success: false, error: error.message };\n                }\n            }\n\n            addReportButton(entry, gameType) {\n                return `<button class=\"report-btn\" onclick=\"reportEntry('${entry.id}', '${gameType}')\" title=\"Jelent\u00e9s\">\u26a0\ufe0f<\/button>`;\n            }\n\n            addValidationError(parentElement, message) {\n                if (!parentElement) return;\n                \n                this.removeValidationError(parentElement);\n                \n                const errorDiv = document.createElement('div');\n                errorDiv.className = 'validation-error';\n                errorDiv.textContent = message;\n                parentElement.appendChild(errorDiv);\n            }\n\n            removeValidationError(parentElement) {\n                if (!parentElement) return;\n                \n                const errorDiv = parentElement.querySelector('.validation-error');\n                if (errorDiv) {\n                    errorDiv.remove();\n                }\n            }\n        }\n\n        \/\/ Glob\u00e1lis v\u00e1ltoz\u00f3k inicializ\u00e1l\u00e1sa Firebase bet\u00f6lt\u00e9se ut\u00e1n\n        waitForFirebase().then(() => {\n            window.moderationSystem = new ModerationSystem();\n            \n            window.reportEntry = async function(entryId, gameType) {\n                if (confirm('Biztosan jelenteni szeretn\u00e9d ezt a bejegyz\u00e9st?')) {\n                    const result = await window.moderationSystem.reportEntry(entryId, gameType);\n                    if (result.success) {\n                        alert('K\u00f6sz\u00f6nj\u00fck a jelent\u00e9st! Moder\u00e1toraink hamarosan \u00e1tn\u00e9zik.');\n                    } else {\n                        alert('Hiba t\u00f6rt\u00e9nt a jelent\u00e9s sor\u00e1n: ' + (result.error || 'Ismeretlen hiba'));\n                    }\n                }\n            };\n            \n            console.log('Moderation system loaded successfully');\n        });\n    <\/script>\n\n    <script>\n      const gameArea = document.getElementById(\"game\");\n      const scoreDisplay = document.getElementById(\"score\");\n      const timerDisplay = document.getElementById(\"timer\");\n      const endScreen = document.getElementById(\"endScreen\");\n      const endContent = document.getElementById(\"endContent\");\n      const vakondURL = \"https:\/\/book.filemondr.hu\/kepek\/v01.png\";\n      const hitSound = document.getElementById(\"hitSound\");\n      const missSound = document.getElementById(\"missSound\");\n      const endSound = document.getElementById(\"endSound\");\n\n      const startScreen = document.getElementById(\"startScreen\");\n      const startGameBtn = document.getElementById(\"startGameBtn\");\n      const gameContainer = document.getElementById(\"gameContainer\");\n      const fullscreenBtn = document.getElementById(\"fullscreenBtn\");\n      const leaderboardBtn = document.getElementById(\"leaderboardBtn\");\n      const showLeaderboardBtn = document.getElementById(\"showLeaderboardBtn\");\n      const missIndicatorDots = document.querySelectorAll(\"#missIndicators .miss-dot\");\n\n      let score = 0;\n      let activeCell = null;\n      let gameInterval = null;\n      let gameTimer = null;\n      let seconds = 0;\n      let intervalSpeed = 1000;\n      let misses = 0;\n      const MAX_MISSES = 3;\n\n      \/\/ Leaderboard Manager for Whack-a-Mole\n      class WhackMoleLeaderboardManager {\n        constructor() {\n          this.collectionName = 'whackmole-leaderboard';\n        }\n\n        calculateScore(points, timeInSeconds) {\n          \/\/ Higher score is better for this game\n          \/\/ Bonus points for efficiency (points per second)\n          const efficiency = timeInSeconds > 0 ? points \/ timeInSeconds : points;\n          const timeBonus = Math.max(0, 300 - timeInSeconds); \/\/ Bonus for finishing faster\n          return Math.round(points * 100 + efficiency * 50 + timeBonus);\n        }\n\n        async saveScore(playerName, points, timeInSeconds) {\n          try {\n            \/\/ V\u00e1rjuk meg a Firebase \u00e9s moder\u00e1l\u00e1si rendszer inicializ\u00e1l\u00e1s\u00e1t\n            if (!window.firebaseDB || !window.moderationSystem) {\n              console.error('Firebase or moderation system not ready');\n              return { success: false, error: 'Rendszer m\u00e9g nem \u00e1ll k\u00e9szen' };\n            }\n\n            \/\/ Valid\u00e1l\u00e1s a k\u00f6z\u00f6s moder\u00e1l\u00e1si rendszerrel\n            const validation = window.moderationSystem.validatePlayerName(playerName);\n            if (!validation.valid) {\n              return { success: false, error: validation.message };\n            }\n\n            const score = this.calculateScore(points, timeInSeconds);\n            \n            console.log('Saving score:', { playerName, points, timeInSeconds, score });\n            \n            const docRef = await window.firebaseUtils.addDoc(\n              window.firebaseUtils.collection(window.firebaseDB, this.collectionName),\n              {\n                playerName: playerName.trim(),\n                points: points,\n                timeInSeconds: timeInSeconds,\n                score: score,\n                timestamp: new Date(),\n                gameType: 'whackmole',\n                moderated: false,\n                reportCount: 0\n              }\n            );\n            \n            console.log('Score saved successfully:', docRef.id);\n            return { success: true, score: score };\n          } catch (error) {\n            console.error(\"Error saving score:\", error);\n            return { success: false, error: error.message };\n          }\n        }\n\n        async getLeaderboard(limitCount = 10) {\n          try {\n            const q = window.firebaseUtils.query(\n              window.firebaseUtils.collection(window.firebaseDB, this.collectionName),\n              window.firebaseUtils.orderBy(\"score\", \"desc\"),\n              window.firebaseUtils.limit(limitCount)\n            );\n            \n            const querySnapshot = await window.firebaseUtils.getDocs(q);\n            const leaderboard = [];\n            \n            querySnapshot.forEach((doc) => {\n              leaderboard.push({\n                id: doc.id,\n                ...doc.data()\n              });\n            });\n            \n            return leaderboard;\n          } catch (error) {\n            console.error(\"Error getting leaderboard:\", error);\n            return [];\n          }\n        }\n\n        formatTime(seconds) {\n          const mins = Math.floor(seconds \/ 60);\n          const secs = seconds % 60;\n          return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\n        }\n\n        async showLeaderboard() {\n          const existingPanel = document.querySelector('.leaderboard-panel');\n          if (existingPanel) {\n            existingPanel.remove();\n            return;\n          }\n\n          const panel = document.createElement('div');\n          panel.className = 'leaderboard-panel';\n          panel.innerHTML = `\n            <h3>Vakond \u00dct\u0151s - Ranglista<\/h3>\n            <div class=\"loading\">Bet\u00f6lt\u00e9s...<\/div>\n            <div class=\"end-buttons\">\n              <button id=\"close-leaderboard\" class=\"btn\">Bez\u00e1r\u00e1s<\/button>\n            <\/div>\n          `;\n\n          document.body.appendChild(panel);\n\n          try {\n            const leaderboard = await this.getLeaderboard();\n            const loadingDiv = panel.querySelector('.loading');\n            \n            if (leaderboard.length === 0) {\n              loadingDiv.innerHTML = '<p>M\u00e9g nincsenek eredm\u00e9nyek.<\/p>';\n            } else {\n              const listHTML = leaderboard.map((entry, index) => {\n                const rank = index + 1;\n                const topClass = rank <= 3 ? 'top-3' : '';\n                return `\n                  <li class=\"leaderboard-item ${topClass}\">\n                    <span class=\"leaderboard-rank\">${rank}.<\/span>\n                    <span class=\"leaderboard-name\">${entry.playerName}<\/span>\n                    <span class=\"leaderboard-score\">\n                      ${entry.score} pont<br>\n                      <small>${entry.points} vakond, ${this.formatTime(entry.timeInSeconds)}<\/small>\n                    <\/span>\n                    ${window.moderationSystem ? window.moderationSystem.addReportButton(entry, 'whackmole') : ''}\n                  <\/li>\n                `;\n              }).join('');\n              \n              loadingDiv.innerHTML = `\n                <ul class=\"leaderboard-list\">${listHTML}<\/ul>\n                <div class=\"moderation-notice\">\n                  <p>Nem megfelel\u0151 tartalom eset\u00e9n haszn\u00e1ld a \u26a0\ufe0f gombot!<\/p>\n                <\/div>\n              `;\n            }\n          } catch (error) {\n            const loadingDiv = panel.querySelector('.loading');\n            loadingDiv.innerHTML = '<div class=\"error\">Hiba t\u00f6rt\u00e9nt a ranglista bet\u00f6lt\u00e9sekor.<\/div>';\n          }\n\n          panel.querySelector('#close-leaderboard').addEventListener('click', () => {\n            panel.remove();\n          });\n\n          \/\/ Close on background click\n          panel.addEventListener('click', (e) => {\n            if (e.target === panel) {\n              panel.remove();\n            }\n          });\n        }\n      }\n\n      const leaderboardManager = new WhackMoleLeaderboardManager();\n\n      function updateMissDisplay() {\n        missIndicatorDots.forEach((dot, index) => {\n          if (index < misses) {\n            dot.classList.add(\"missed\");\n          } else {\n            dot.classList.remove(\"missed\");\n          }\n        });\n      }\n\n      function startTimer() {\n        seconds = 0;\n        timerDisplay.textContent = `Id\u0151: 0 mp`;\n        if (gameTimer) clearInterval(gameTimer);\n        gameTimer = setInterval(() => {\n          seconds++;\n          timerDisplay.textContent = `Id\u0151: ${seconds} mp`;\n        }, 1000);\n      }\n\n      async function stopGame(message = \"Gratul\u00e1lok az el\u00e9rt eredm\u00e9nyhez!\") {\n        clearInterval(gameInterval);\n        clearInterval(gameTimer);\n        gameArea.innerHTML = \"\";\n        endSound.play().catch(e => console.warn(\"End sound error:\", e));\n        \n        gameContainer.style.display = \"none\";\n        endScreen.style.display = \"flex\";\n\n        const finalScore = leaderboardManager.calculateScore(score, seconds);\n        const timeFormatted = leaderboardManager.formatTime(seconds);\n\n        endContent.innerHTML = `\n          <h2>${message}<\/h2>\n          <div style=\"margin: 15px 0;\">\n            <strong>Eltal\u00e1lt vakondok:<\/strong> ${score}<br>\n            <strong>Id\u0151:<\/strong> ${timeFormatted}<br>\n            <strong>V\u00e9gs\u0151 pontsz\u00e1m:<\/strong> ${finalScore}\n          <\/div>\n          <div id=\"name-input-container\">\n            <input type=\"text\" id=\"player-name\" class=\"name-input\" placeholder=\"Add meg a neved a ranglist\u00e1hoz\" maxlength=\"20\">\n          <\/div>\n          <div class=\"end-buttons\">\n            <button id=\"save-score\" class=\"btn\">Ment\u00e9s ranglist\u00e1ra<\/button>\n            <button class=\"btn\" onclick='initGameStart()'>\u00daj j\u00e1t\u00e9k<\/button>\n            <button id=\"show-leaderboard-end\" class=\"btn\">Ranglista<\/button>\n            <a href=\"https:\/\/book.filemondr.hu\/index.php\/\" class=\"btn\">F\u0151oldal<\/a>\n          <\/div>\n        `;\n\n        const playerNameInput = document.getElementById('player-name');\n        const saveScoreBtn = document.getElementById('save-score');\n        const showLeaderboardEndBtn = document.getElementById('show-leaderboard-end');\n        const nameInputContainer = document.getElementById('name-input-container');\n\n        \/\/ Auto-focus on name input\n        setTimeout(() => playerNameInput.focus(), 100);\n\n        \/\/ Save score functionality\n        saveScoreBtn.addEventListener('click', async () => {\n          const playerName = playerNameInput.value.trim();\n          \n          \/\/ Valid\u00e1l\u00e1s a k\u00f6z\u00f6s moder\u00e1l\u00e1si rendszerrel\n          if (!window.moderationSystem) {\n            alert('Moder\u00e1l\u00e1si rendszer m\u00e9g nem \u00e1ll k\u00e9szen. Pr\u00f3b\u00e1ld \u00fajra!');\n            return;\n          }\n\n          const validation = window.moderationSystem.validatePlayerName(playerName);\n          if (!validation.valid) {\n            window.moderationSystem.removeValidationError(nameInputContainer);\n            window.moderationSystem.addValidationError(nameInputContainer, validation.message);\n            playerNameInput.focus();\n            return;\n          }\n\n          \/\/ Hiba\u00fczenet elt\u00e1vol\u00edt\u00e1sa, ha volt\n          window.moderationSystem.removeValidationError(nameInputContainer);\n\n          saveScoreBtn.disabled = true;\n          saveScoreBtn.textContent = 'Ment\u00e9s...';\n\n          try {\n            const result = await leaderboardManager.saveScore(playerName, score, seconds);\n\n            if (result.success) {\n              saveScoreBtn.textContent = 'Mentve!';\n              saveScoreBtn.style.backgroundColor = '#4CAF50';\n              playerNameInput.disabled = true;\n            } else {\n              throw new Error(result.error);\n            }\n          } catch (error) {\n            console.error('Error saving score:', error);\n            alert('Hiba t\u00f6rt\u00e9nt a ment\u00e9s sor\u00e1n: ' + error.message);\n            saveScoreBtn.disabled = false;\n            saveScoreBtn.textContent = 'Ment\u00e9s ranglist\u00e1ra';\n          }\n        });\n\n        \/\/ Enter key to save score\n        playerNameInput.addEventListener('keypress', (e) => {\n          if (e.key === 'Enter' && !saveScoreBtn.disabled) {\n            saveScoreBtn.click();\n          }\n        });\n\n        \/\/ Show leaderboard\n        showLeaderboardEndBtn.addEventListener('click', () => {\n          leaderboardManager.showLeaderboard();\n        });\n      }\n\n      function showVakond() {\n        if (activeCell) {\n          missSound.play().catch(e => console.warn(\"Miss sound error:\", e));\n          misses++;\n          updateMissDisplay();\n          if (misses >= MAX_MISSES) {\n            stopGame(\"J\u00e1t\u00e9k v\u00e9ge: T\u00fal sok vakond sz\u00f6k\u00f6tt meg!\");\n            return;\n          }\n          activeCell.innerHTML = \"\";\n        }\n\n        const cells = document.querySelectorAll(\"#game .cell\");\n        if (cells.length === 0) return;\n\n        const index = Math.floor(Math.random() * cells.length);\n        const selected = cells[index];\n        \n        if (selected === activeCell && cells.length > 1) {\n            showVakond();\n            return;\n        }\n\n        const img = document.createElement(\"img\");\n        img.src = vakondURL;\n        img.classList.add(\"vakond\");\n        img.draggable = false;\n        img.alt = \"Vakond\";\n\n        img.addEventListener(\"click\", hitVakond);\n        img.addEventListener(\"touchstart\", hitVakond, { passive: true });\n\n        selected.innerHTML = \"\";\n        selected.appendChild(img);\n        activeCell = selected;\n      }\n\n      function hitVakond(event) {\n        event.preventDefault();\n        if (!activeCell || !activeCell.contains(event.target)) return;\n\n        score++;\n        scoreDisplay.textContent = `Pontsz\u00e1m: ${score}`;\n        \n        if(activeCell) {\n            activeCell.innerHTML = \"\";\n        }\n        activeCell = null;\n        hitSound.play().catch(e => console.warn(\"Hit sound error:\", e));\n\n        if (score > 0 && score % 10 === 0) {\n          intervalSpeed = Math.max(300, intervalSpeed - 100);\n          clearInterval(gameInterval);\n          gameInterval = setInterval(showVakond, intervalSpeed);\n        }\n      }\n      \n      function createGrid() {\n        gameArea.innerHTML = \"\";\n        for (let i = 0; i < 9; i++) {\n          const cell = document.createElement(\"div\");\n          cell.classList.add(\"cell\");\n          gameArea.appendChild(cell);\n        }\n      }\n\n      function initGameStart() {\n        score = 0;\n        misses = 0;\n        seconds = 0;\n        intervalSpeed = 1000;\n\n        scoreDisplay.textContent = `Pontsz\u00e1m: ${score}`;\n        timerDisplay.textContent = `Id\u0151: ${seconds} mp`;\n        updateMissDisplay();\n        \n        endScreen.style.display = \"none\";\n        startScreen.style.display = \"none\";\n        gameContainer.style.display = \"block\";\n        \n        createGrid();\n        startTimer();\n        if (gameInterval) clearInterval(gameInterval);\n        gameInterval = setInterval(showVakond, intervalSpeed);\n        showVakond();\n      }\n\n      \/\/ Event listeners\n      startGameBtn.addEventListener(\"click\", initGameStart);\n      leaderboardBtn.addEventListener(\"click\", () => leaderboardManager.showLeaderboard());\n      showLeaderboardBtn.addEventListener(\"click\", () => leaderboardManager.showLeaderboard());\n\n      function toggleFullScreen() {\n        if (!document.fullscreenElement) {\n          document.documentElement.requestFullscreen().catch(err => {\n            console.warn(`Teljes k\u00e9perny\u0151 nem el\u00e9rhet\u0151: ${err.message}`);\n          });\n        } else {\n          if (document.exitFullscreen) {\n            document.exitFullscreen();\n          }\n        }\n      }\n      fullscreenBtn.addEventListener(\"click\", toggleFullScreen);\n\n      \/\/ Alap\u00e9rtelmezett \u00e1llapot\n      startScreen.style.display = \"block\";\n      gameContainer.style.display = \"none\";\n      endScreen.style.display = \"none\";\n    <\/script>\n\n    <div style=\"text-align: center; margin-top: 20px; margin-bottom: 20px;\">\n      <a href=\"https:\/\/book.filemondr.hu\/index.php\/\" class=\"btn\" id=\"back-to-home-icon\" aria-label=\"F\u0151oldal\">\n        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n          <path d=\"M0 0h24v24H0z\" fill=\"none\"\/>\n          <path d=\"M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z\"\/>\n        <\/svg>\n      <\/a>\n    <\/div>\n  <\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>Vakond \u00dct\u0151s J\u00e1t\u00e9k Vakond \u00dct\u0151s J\u00e1t\u00e9k J\u00e1t\u00e9k ind\u00edt\u00e1sa Ranglista Pontsz\u00e1m: 0 Id\u0151: 0 mp Teljes k\u00e9perny\u0151 Ranglista<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-252","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/book.filemondr.hu\/index.php\/wp-json\/wp\/v2\/pages\/252","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/book.filemondr.hu\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/book.filemondr.hu\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/book.filemondr.hu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/book.filemondr.hu\/index.php\/wp-json\/wp\/v2\/comments?post=252"}],"version-history":[{"count":41,"href":"https:\/\/book.filemondr.hu\/index.php\/wp-json\/wp\/v2\/pages\/252\/revisions"}],"predecessor-version":[{"id":620,"href":"https:\/\/book.filemondr.hu\/index.php\/wp-json\/wp\/v2\/pages\/252\/revisions\/620"}],"wp:attachment":[{"href":"https:\/\/book.filemondr.hu\/index.php\/wp-json\/wp\/v2\/media?parent=252"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}