{"id":23812,"date":"2026-09-24T10:08:52","date_gmt":"2026-09-24T08:08:52","guid":{"rendered":"https:\/\/www.kabel1.cz\/www\/?page_id=23812"},"modified":"2026-09-24T11:23:45","modified_gmt":"2026-09-24T09:23:45","slug":"speed","status":"publish","type":"page","link":"https:\/\/www.kabel1.cz\/www\/speed\/","title":{"rendered":"Speed"},"content":{"rendered":"<style>.kb-row-layout-id23812_6b6032-eb > .kt-row-column-wrap{align-content:start;}:where(.kb-row-layout-id23812_6b6032-eb > .kt-row-column-wrap) > .wp-block-kadence-column{justify-content:start;}.kb-row-layout-id23812_6b6032-eb > .kt-row-column-wrap{column-gap:var(--global-kb-gap-md, 2rem);row-gap:var(--global-kb-gap-md, 2rem);max-width:var( --global-content-width, 1290px );padding-left:var(--global-content-edge-padding);padding-right:var(--global-content-edge-padding);padding-top:var(--global-kb-spacing-sm, 1.5rem);padding-bottom:var(--global-kb-spacing-sm, 1.5rem);grid-template-columns:minmax(0, 1fr);}.kb-row-layout-id23812_6b6032-eb > .kt-row-layout-overlay{opacity:0.30;}@media all and (max-width: 1024px){.kb-row-layout-id23812_6b6032-eb > .kt-row-column-wrap{grid-template-columns:minmax(0, 1fr);}}@media all and (max-width: 767px){.kb-row-layout-id23812_6b6032-eb > .kt-row-column-wrap{grid-template-columns:minmax(0, 1fr);}}<\/style><div class=\"kb-row-layout-wrap kb-row-layout-id23812_6b6032-eb alignnone wp-block-kadence-rowlayout\"><div class=\"kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top kb-theme-content-width\">\n<style>.kadence-column23812_e2448d-3d > .kt-inside-inner-col,.kadence-column23812_e2448d-3d > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-column23812_e2448d-3d > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-column23812_e2448d-3d > .kt-inside-inner-col{flex-direction:column;}.kadence-column23812_e2448d-3d > .kt-inside-inner-col > .aligncenter{width:100%;}.kadence-column23812_e2448d-3d > .kt-inside-inner-col:before{opacity:0.3;}.kadence-column23812_e2448d-3d{position:relative;}@media all and (max-width: 1024px){.kadence-column23812_e2448d-3d > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}@media all and (max-width: 767px){.kadence-column23812_e2448d-3d > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}<\/style>\n<div class=\"wp-block-kadence-column kadence-column23812_e2448d-3d\"><div class=\"kt-inside-inner-col\"><div style=\"font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; background: #ffffff; border: 2px solid #eaeeed; padding: 30px; border-radius: 16px; max-width: 650px; margin: 0 auto; box-shadow: 0 10px 25px rgba(0,0,0,0.05); text-align: center;\">\r\n    \r\n    <div style=\"margin-bottom: 25px;\">\r\n        <h5 style=\"margin: 0 0 8px 0; color: #1a202c; font-size: 24px; font-weight: 700;\">Test rychlosti s\u00edt\u011b LAN<\/h5>\r\n        <p style=\"margin: 0; color: #718096; font-size: 14px;\">Ov\u011b\u0159te si aktu\u00e1ln\u00ed propustnost a odezvu va\u0161\u00ed p\u0159\u00edpojky<\/p>\r\n    <\/div>\r\n\r\n    <button id=\"start-btn\" onclick=\"runSpeedTest()\" style=\"background: #B0CB1F; color: #1a202c; border: none; border-radius: 50px; padding: 14px 36px; font-size: 16px; font-weight: 700; cursor: pointer; box-shadow: 0 4px 14px rgba(176,203,31,0.35); transition: all 0.2s ease;\">Spustit m\u011b\u0159en\u00ed<\/button>\r\n\r\n    <div style=\"display: flex; gap: 12px; margin-top: 30px;\">\r\n        <!-- Ping Box -->\r\n        <div style=\"flex: 1; background: #f8fafc; padding: 20px 10px; border-radius: 12px; box-shadow: 0 4px 12px rgba(0,0,0,0.02); border: 1px solid #edf2f7;\">\r\n            <div style=\"color: #718096; font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 8px;\">Odezva (Ping)<\/div>\r\n            <div id=\"result-ping\" style=\"color: #1a202c; font-size: 22px; font-weight: 700;\">\u2014<\/div>\r\n            <div style=\"color: #a0aec0; font-size: 12px; margin-top: 4px;\">ms<\/div>\r\n        <\/div>\r\n\r\n        <!-- Download Box -->\r\n        <div style=\"flex: 1; background: #f8fafc; padding: 20px 10px; border-radius: 12px; box-shadow: 0 4px 12px rgba(0,0,0,0.02); border: 1px solid #edf2f7;\">\r\n            <div style=\"color: #718096; font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 8px;\">Stahov\u00e1n\u00ed<\/div>\r\n            <div id=\"result-download\" style=\"color: #1a202c; font-size: 22px; font-weight: 700;\">\u2014<\/div>\r\n            <div style=\"color: #a0aec0; font-size: 12px; margin-top: 4px;\">Mb\/s<\/div>\r\n        <\/div>\r\n\r\n        <!-- Upload Box -->\r\n        <div style=\"flex: 1; background: #f8fafc; padding: 20px 10px; border-radius: 12px; box-shadow: 0 4px 12px rgba(0,0,0,0.02); border: 1px solid #edf2f7;\">\r\n            <div style=\"color: #718096; font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 8px;\">Odes\u00edl\u00e1n\u00ed<\/div>\r\n            <div id=\"result-upload\" style=\"color: #1a202c; font-size: 22px; font-weight: 700;\">\u2014<\/div>\r\n            <div style=\"color: #a0aec0; font-size: 12px; margin-top: 4px;\">Mb\/s<\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <div id=\"status-msg\" style=\"margin-top: 20px; font-size: 15px; color: #4a5568; font-weight: 600; min-height: 24px;\"><\/div>\r\n<\/div>\r\n\r\n<script>\r\nlet animationInterval;\r\nlet finalPing = 0;\r\nlet finalDownload = 0;\r\nlet finalUpload = 0;\r\n\r\nfunction startAnimation(text) {\r\n    let dots = \"\";\r\n    const statusMsg = document.getElementById('status-msg');\r\n    statusMsg.style.color = \"#E21E51\";\r\n    \r\n    clearInterval(animationInterval);\r\n    animationInterval = setInterval(() => {\r\n        dots = dots.length >= 3 ? \"\" : dots + \".\";\r\n        statusMsg.innerHTML = text + dots;\r\n    }, 400);\r\n}\r\n\r\nfunction runSpeedTest() {\r\n    const resPing = document.getElementById('result-ping');\r\n    const resDL = document.getElementById('result-download');\r\n    const resUL = document.getElementById('result-upload');\r\n    const startBtn = document.getElementById('start-btn');\r\n    \r\n    startBtn.disabled = true;\r\n    startBtn.style.opacity = \"0.6\";\r\n    startBtn.style.cursor = \"not-allowed\";\r\n    startBtn.innerHTML = \"M\u011b\u0159en\u00ed prob\u00edh\u00e1...\";\r\n    \r\n    resPing.innerHTML = \"\u2014\";\r\n    resDL.innerHTML = \"\u2014\";\r\n    resUL.innerHTML = \"\u2014\";\r\n    \r\n    startAnimation(\"M\u011b\u0159\u00edm odezvu (Ping)\");\r\n    measurePing(0, [], function(avgPing) {\r\n        finalPing = avgPing;\r\n        resPing.innerHTML = '<span style=\"color: #E21E51;\">' + finalPing + '<\/span>';\r\n        \r\n        startAnimation(\"M\u011b\u0159\u00edm stahov\u00e1n\u00ed (Download)\");\r\n        runDownloadTest();\r\n    });\r\n}\r\n\r\nfunction measurePing(index, results, callback) {\r\n    if (index >= 3) {\r\n        const sum = results.reduce((a, b) => a + b, 0);\r\n        const avg = Math.round(sum \/ results.length);\r\n        callback(avg);\r\n        return;\r\n    }\r\n\r\n    const pingUrl = 'https:\/\/www.kabel1.cz\/upload.php?ping=' + Date.now();\r\n    const startTime = performance.now();\r\n\r\n    fetch(pingUrl, { method: 'HEAD' })\r\n    .then(() => {\r\n        const duration = performance.now() - startTime;\r\n        results.push(duration);\r\n        measurePing(index + 1, results, callback);\r\n    })\r\n    .catch(() => {\r\n        const duration = performance.now() - startTime;\r\n        results.push(duration);\r\n        measurePing(index + 1, results, callback);\r\n    });\r\n}\r\n\r\n\/\/ --- DOWNLOAD ---\r\nfunction runDownloadTest() {\r\n    const miniUrl = 'https:\/\/www.kabel1.cz\/testdownmini.bin?t=' + Date.now();\r\n    const startTime = performance.now();\r\n    \r\n    fetch(miniUrl)\r\n    .then(response => {\r\n        if (!response.ok) throw new Error('Nelze st\u00e1hnout mini soubor');\r\n        return response.blob();\r\n    })\r\n    .then(miniBlob => {\r\n        const endTime = performance.now();\r\n        const durationSeconds = (endTime - startTime) \/ 1000;\r\n        \/\/ Pou\u017eit\u00ed re\u00e1ln\u00e9 velikosti mini souboru (31457280 bajt\u016f)\r\n        const fileSizeMbits = (miniBlob.size * 8) \/ (1024 * 1024);\r\n        const miniSpeed = Math.round((fileSizeMbits \/ durationSeconds) * 100) \/ 100;\r\n        \r\n        if (miniSpeed < 95) {\r\n            finalDownload = miniSpeed;\r\n            document.getElementById('result-download').innerHTML = '<span style=\"color: #E21E51;\">' + finalDownload + '<\/span>';\r\n            startAnimation(\"M\u011b\u0159\u00edm odes\u00edl\u00e1n\u00ed (Upload)\");\r\n            runUploadTest();\r\n        } else {\r\n            runBigDownloadTest();\r\n        }\r\n    })\r\n    .catch(error => handleDownloadError(error));\r\n}\r\n\r\nfunction runBigDownloadTest() {\r\n    const fileUrl = 'https:\/\/www.kabel1.cz\/testdown.bin?t=' + Date.now();\r\n    const startTime = performance.now();\r\n    \r\n    fetch(fileUrl)\r\n    .then(response => {\r\n        if (!response.ok) throw new Error('Nelze st\u00e1hnout velk\u00fd soubor');\r\n        return response.blob();\r\n    })\r\n    .then(blob => {\r\n        const endTime = performance.now();\r\n        const durationSeconds = (endTime - startTime) \/ 1000;\r\n        \/\/ Pou\u017eit\u00ed re\u00e1ln\u00e9 velikosti velk\u00e9ho souboru (104857600 bajt\u016f)\r\n        const fileSizeMbits = (blob.size * 8) \/ (1024 * 1024);\r\n        finalDownload = Math.round((fileSizeMbits \/ durationSeconds) * 100) \/ 100;\r\n        \r\n        document.getElementById('result-download').innerHTML = '<span style=\"color: #E21E51;\">' + finalDownload + '<\/span>';\r\n        \r\n        startAnimation(\"M\u011b\u0159\u00edm odes\u00edl\u00e1n\u00ed (Upload)\");\r\n        runUploadTest();\r\n    })\r\n    .catch(error => handleDownloadError(error));\r\n}\r\n\r\nfunction handleDownloadError(error) {\r\n    clearInterval(animationInterval);\r\n    document.getElementById('status-msg').style.color = \"#e53e3e\";\r\n    document.getElementById('status-msg').innerHTML = \"Chyba p\u0159i m\u011b\u0159en\u00ed stahov\u00e1n\u00ed.\";\r\n    resetButton();\r\n    console.error(error);\r\n}\r\n\r\n\/\/ --- UPLOAD ---\r\nfunction runUploadTest() {\r\n    fetch('https:\/\/www.kabel1.cz\/testdownmini.bin?t=' + Date.now())\r\n    .then(res => res.blob())\r\n    .then(miniBlob => {\r\n        const uploadUrl = 'https:\/\/www.kabel1.cz\/upload.php?t=' + Date.now();\r\n        const startTime = performance.now();\r\n\r\n        fetch(uploadUrl, {\r\n            method: 'POST',\r\n            body: miniBlob\r\n        })\r\n        .then(response => {\r\n            const endTime = performance.now();\r\n            const durationSeconds = (endTime - startTime) \/ 1000;\r\n            const uploadSizeMbits = (miniBlob.size * 8) \/ (1024 * 1024);\r\n            const miniUploadSpeed = Math.round((uploadSizeMbits \/ durationSeconds) * 100) \/ 100;\r\n\r\n            if (miniUploadSpeed < 95) {\r\n                finalUpload = miniUploadSpeed;\r\n                document.getElementById('result-upload').innerHTML = '<span style=\"color: #E21E51;\">' + finalUpload + '<\/span>';\r\n                saveResultsToDB();\r\n            } else {\r\n                runBigUploadTest();\r\n            }\r\n        })\r\n        .catch(error => handleUploadError(error));\r\n    })\r\n    .catch(error => handleUploadError(error));\r\n}\r\n\r\nfunction runBigUploadTest() {\r\n    fetch('https:\/\/www.kabel1.cz\/testdown.bin?t=' + Date.now())\r\n    .then(res => res.blob())\r\n    .then(bigBlob => {\r\n        const uploadUrl = 'https:\/\/www.kabel1.cz\/upload.php?t=' + Date.now();\r\n        const startTime = performance.now();\r\n\r\n        fetch(uploadUrl, {\r\n            method: 'POST',\r\n            body: bigBlob\r\n        })\r\n        .then(response => {\r\n            const endTime = performance.now();\r\n            const durationSeconds = (endTime - startTime) \/ 1000;\r\n            const uploadSizeMbits = (bigBlob.size * 8) \/ (1024 * 1024);\r\n            finalUpload = Math.round((uploadSizeMbits \/ durationSeconds) * 100) \/ 100;\r\n\r\n            document.getElementById('result-upload').innerHTML = '<span style=\"color: #E21E51;\">' + finalUpload + '<\/span>';\r\n            saveResultsToDB();\r\n        })\r\n        .catch(error => handleUploadError(error));\r\n    })\r\n    .catch(error => handleUploadError(error));\r\n}\r\n\r\nfunction handleUploadError(error) {\r\n    clearInterval(animationInterval);\r\n    document.getElementById('status-msg').style.color = \"#e53e3e\";\r\n    document.getElementById('status-msg').innerHTML = \"Chyba p\u0159i m\u011b\u0159en\u00ed odes\u00edl\u00e1n\u00ed.\";\r\n    resetButton();\r\n    console.error(error);\r\n}\r\n\r\nfunction saveResultsToDB() {\r\n    const statusMsg = document.getElementById('status-msg');\r\n    \r\n    const formData = new URLSearchParams();\r\n    formData.append('ping', finalPing);\r\n    formData.append('download', finalDownload);\r\n    formData.append('upload', finalUpload);\r\n    formData.append('screen_res', window.screen.width + 'x' + window.screen.height);\r\n    formData.append('language', navigator.language || navigator.userLanguage || '');\r\n    formData.append('referrer', document.referrer || '');\r\n\r\n    fetch('https:\/\/www.kabel1.cz\/upload.php?save=1', {\r\n        method: 'POST',\r\n        body: formData\r\n    })\r\n    .then(response => response.json())\r\n    .then(data => {\r\n        clearInterval(animationInterval);\r\n        statusMsg.style.color = \"#E21E51\";\r\n        statusMsg.innerHTML = \"M\u011b\u0159en\u00ed dokon\u010deno!\";\r\n        resetButton();\r\n    })\r\n    .catch(error => {\r\n        clearInterval(animationInterval);\r\n        statusMsg.style.color = \"#E21E51\";\r\n        statusMsg.innerHTML = \"M\u011b\u0159en\u00ed dokon\u010deno!\";\r\n        resetButton();\r\n        console.error('Chyba p\u0159i ukl\u00e1d\u00e1n\u00ed do DB:', error);\r\n    });\r\n}\r\n\r\nfunction resetButton() {\r\n    const startBtn = document.getElementById('start-btn');\r\n    startBtn.disabled = false;\r\n    startBtn.style.opacity = \"1\";\r\n    startBtn.style.cursor = \"pointer\";\r\n    startBtn.innerHTML = \"Zopakovat m\u011b\u0159en\u00ed\";\r\n}\r\n<\/script><\/div><\/div>\n\n<\/div><\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":5,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_eb_attr":"","_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-23812","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.kabel1.cz\/www\/wp-json\/wp\/v2\/pages\/23812","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kabel1.cz\/www\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.kabel1.cz\/www\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.kabel1.cz\/www\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kabel1.cz\/www\/wp-json\/wp\/v2\/comments?post=23812"}],"version-history":[{"count":13,"href":"https:\/\/www.kabel1.cz\/www\/wp-json\/wp\/v2\/pages\/23812\/revisions"}],"predecessor-version":[{"id":23866,"href":"https:\/\/www.kabel1.cz\/www\/wp-json\/wp\/v2\/pages\/23812\/revisions\/23866"}],"wp:attachment":[{"href":"https:\/\/www.kabel1.cz\/www\/wp-json\/wp\/v2\/media?parent=23812"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}