{"id":2818,"date":"2021-08-25T11:45:28","date_gmt":"2021-08-25T04:45:28","guid":{"rendered":"https:\/\/khoahocthethao.vn\/?page_id=2818"},"modified":"2026-01-31T21:32:47","modified_gmt":"2026-01-31T14:32:47","slug":"test-phan-xa","status":"publish","type":"page","link":"https:\/\/khoahocthethao.vn\/index.php\/test-phan-xa\/","title":{"rendered":"Test Ph\u1ea3n X\u1ea1"},"content":{"rendered":"\n<p class=\"has-text-align-center\"><strong>Click v\u00e0o \u00f4 m\u00e0u \u0111\u1ee3i chuy\u1ec3n t\u1eeb \u0111\u1ecf sang xanh, r\u1ed3i click l\u1ea7n n\u1eefa \u0111\u1ec3 \u0111o k\u1ebft qu\u1ea3<\/strong><\/p>\n\n\n    <div id=\"rt-reaction-time-test\" style=\"max-width:720px;\">\n        <select id=\"rt-language-selector\" style=\"margin-bottom:10px;\">\n        <option value=\"en\"  selected='selected'>English<\/option>\n        <option value=\"vi\" >Ti\u1ebfng Vi\u1ec7t<\/option>\n    <\/select>        <p>Click here to start the test<\/p>\n\n        <div id=\"rt-shape\" style=\"width:100%; height:300px; background-color:red; margin:20px auto; display:flex; align-items:center; justify-content:center; cursor:pointer; border-radius:12px;\">\n            <span id=\"rt-start-text\" style=\"color:white; font-size:24px;\">Click here to start the test<\/span>\n        <\/div>\n\n        <p id=\"rt-result\"><\/p>\n\n        <p>Highest Score:\n            0.15 seconds        <\/p>\n\n        <p>Average Score:\n            0.451 seconds        <\/p>\n\n        <div style=\"margin-top:10px;\"><table style=\"border-collapse:collapse; width:100%; max-width:520px;\">\n        <thead><tr>\n            <th style=\"border:1px solid #ddd; padding:8px;\">Country<\/th>\n            <th style=\"border:1px solid #ddd; padding:8px;\">Reaction Time (s)<\/th>\n        <\/tr><\/thead><tbody><tr>\n            <td style=\"border:1px solid #ddd; padding:8px;\">VN<\/td>\n            <td style=\"border:1px solid #ddd; padding:8px;\">0.15<\/td>\n        <\/tr><tr>\n            <td style=\"border:1px solid #ddd; padding:8px;\">VN<\/td>\n            <td style=\"border:1px solid #ddd; padding:8px;\">0.15<\/td>\n        <\/tr><tr>\n            <td style=\"border:1px solid #ddd; padding:8px;\">VN<\/td>\n            <td style=\"border:1px solid #ddd; padding:8px;\">0.15<\/td>\n        <\/tr><tr>\n            <td style=\"border:1px solid #ddd; padding:8px;\">VN<\/td>\n            <td style=\"border:1px solid #ddd; padding:8px;\">0.15<\/td>\n        <\/tr><tr>\n            <td style=\"border:1px solid #ddd; padding:8px;\">VN<\/td>\n            <td style=\"border:1px solid #ddd; padding:8px;\">0.15<\/td>\n        <\/tr><tr>\n            <td style=\"border:1px solid #ddd; padding:8px;\">VN<\/td>\n            <td style=\"border:1px solid #ddd; padding:8px;\">0.15<\/td>\n        <\/tr><tr>\n            <td style=\"border:1px solid #ddd; padding:8px;\">VN<\/td>\n            <td style=\"border:1px solid #ddd; padding:8px;\">0.15<\/td>\n        <\/tr><tr>\n            <td style=\"border:1px solid #ddd; padding:8px;\">VN<\/td>\n            <td style=\"border:1px solid #ddd; padding:8px;\">0.15<\/td>\n        <\/tr><tr>\n            <td style=\"border:1px solid #ddd; padding:8px;\">VN<\/td>\n            <td style=\"border:1px solid #ddd; padding:8px;\">0.15<\/td>\n        <\/tr><tr>\n            <td style=\"border:1px solid #ddd; padding:8px;\">VN<\/td>\n            <td style=\"border:1px solid #ddd; padding:8px;\">0.15<\/td>\n        <\/tr><\/tbody><\/table><\/div>\n    <\/div>\n\n    <script>\n    (function($){\n        $(document).ready(function(){\n            var startTime;\n            var shape = $('#rt-shape');\n            var result = $('#rt-result');\n            var startText = $('#rt-start-text');\n\n            $('#rt-language-selector').on('change', function() {\n                var selectedLang = $(this).val();\n                var currentUrl = new URL(window.location.href);\n                currentUrl.searchParams.set('lang', selectedLang);\n                window.location.href = currentUrl.href;\n            });\n\n            function isRed() { return shape.css('background-color') === 'rgb(255, 0, 0)'; }\n            function isGreen() { return shape.css('background-color') === 'rgb(0, 128, 0)'; }\n\n            shape.on('click', function(){\n                if (isRed()) {\n                    startText.hide();\n                    result.text('');\n                    shape.css('background-color', 'red');\n\n                    setTimeout(function(){\n                        shape.css('background-color', 'green');\n                        startTime = new Date().getTime();\n                    }, Math.random() * 2000 + 1000);\n\n                } else if (isGreen()) {\n                    var endTime = new Date().getTime();\n                    var reactionTime = (endTime - startTime) \/ 1000;\n\n                    if (reactionTime < 0.150) {\n                        result.text('Your reaction time is too fast to be humanly possible.');\n                        startText.show();\n                        shape.css('background-color', 'red');\n                        return;\n                    }\n                    if (reactionTime > 2.0) {\n                        result.text('Your reaction time is too slow. Please try again.');\n                        startText.show();\n                        shape.css('background-color', 'red');\n                        return;\n                    }\n\n                    result.text('Your reaction time: ' + reactionTime.toFixed(3) + ' seconds');\n\n                    $.post(\"https:\/\/khoahocthethao.vn\/wp-admin\/admin-ajax.php\", {\n                        action: 'rt_save_reaction_time_v34',\n                        reaction_time: reactionTime\n                    }, function(response){\n                        if (!response || !response.success) {\n                            result.text((response && response.data) ? response.data : 'Error');\n                        }\n                    });\n\n                    startText.show();\n                    shape.css('background-color', 'red');\n                }\n            });\n        });\n    })(jQuery);\n    <\/script>\n    \n\n\n    <div class=\"rt-stats-box\" data-nonce=\"9f77acafa8\" style=\"max-width:980px;\">\n        <div style=\"display:flex; gap:10px; align-items:center; flex-wrap:wrap;\">\n            <label for=\"rt-year\">N\u0103m:<\/label>\n            <select class=\"rt-year\" id=\"rt-year\"><option value=\"2026\">2026<\/option><option value=\"2025\">2025<\/option><option value=\"2024\">2024<\/option><\/select>\n            <button type=\"button\" class=\"rt-open\">Open chart<\/button>\n\n                    <\/div>\n\n        <p class=\"rt-status\" style=\"margin-top:10px;\"><\/p>\n\n        <div style=\"margin-top:15px;\">\n            <canvas class=\"rt-country-chart\" style=\"width:100%; height:350px;\"><\/canvas>\n        <\/div>\n        <div style=\"margin-top:15px;\">\n            <canvas class=\"rt-hist-chart\" style=\"width:100%; height:350px;\"><\/canvas>\n        <\/div>\n    <\/div>\n\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js\"><\/script>\n    <script>\n    (function(){\n      function parseJsonSafe(text){\n        try { return JSON.parse(text); }\n        catch(e){ console.log(\"Non-JSON:\", text); return {success:false, data:\"Non-JSON response\"}; }\n      }\n\n      function getAjax(url){\n        return fetch(url, { method:\"GET\", credentials:\"same-origin\" })\n          .then(r => r.text())\n          .then(t => parseJsonSafe(t));\n      }\n\n      function postAjax(url, data){\n        return fetch(url, {\n          method: \"POST\",\n          headers: {\"Content-Type\":\"application\/x-www-form-urlencoded; charset=UTF-8\"},\n          body: new URLSearchParams(data).toString(),\n          credentials: \"same-origin\"\n        }).then(r => r.text()).then(t => parseJsonSafe(t));\n      }\n\n      document.querySelectorAll('.rt-stats-box').forEach(function(box){\n        var nonce = box.getAttribute('data-nonce');\n        var selYear = box.querySelector('.rt-year');\n        var btnOpen = box.querySelector('.rt-open');\n        var btnRebuild = box.querySelector('.rt-rebuild');\n        var status = box.querySelector('.rt-status');\n\n        var countryCanvas = box.querySelector('.rt-country-chart');\n        var histCanvas = box.querySelector('.rt-hist-chart');\n\n        var countryChart = null;\n        var histChart = null;\n\n        function renderCharts(payload){\n          var cLabels = (payload.countries || []).map(x => x.country_code || '??');\n          var cCounts = (payload.countries || []).map(x => Number(x.cnt || 0));\n\n          if (countryChart) countryChart.destroy();\n          countryChart = new Chart(countryCanvas.getContext('2d'), {\n            type: 'bar',\n            data: { labels: cLabels, datasets: [{ label: 'Top countries (count)', data: cCounts }] },\n            options: { responsive: true, scales: { y: { beginAtZero: true } } }\n          });\n\n          var hLabels = (payload.hist || []).map(x => (Number(x.bucket)\/100).toFixed(2) + \"s\");\n          var hCounts = (payload.hist || []).map(x => Number(x.cnt || 0));\n\n          if (histChart) histChart.destroy();\n          histChart = new Chart(histCanvas.getContext('2d'), {\n            type: 'bar',\n            data: { labels: hLabels, datasets: [{ label: 'Histogram', data: hCounts }] },\n            options: {\n              responsive: true,\n              scales: {\n                y: { beginAtZero: true },\n                x: { ticks: { autoSkip: true, maxTicksLimit: 20 } }\n              }\n            }\n          });\n        }\n\n        function openStats(){\n          status.textContent = 'Loading stats...';\n          var year = selYear.value;\n\n          var url = \"https:\/\/khoahocthethao.vn\/wp-admin\/admin-ajax.php\" +\n                    \"?action=rt_get_year_stats_v34&year=\" + encodeURIComponent(year);\n\n          getAjax(url).then(function(res){\n            if (!res || !res.success) {\n              status.textContent = 'Error: ' + (res && res.data ? res.data : 'Unknown');\n              return;\n            }\n\n            var data = res.data || {};\n            var validCount = Number(data.valid_count || 0);\n\n            if ((!data.hist || data.hist.length === 0) && (!data.countries || data.countries.length === 0)) {\n              if (validCount === 0) status.textContent = 'N\u0103m ' + year + ' kh\u00f4ng c\u00f3 d\u1eef li\u1ec7u h\u1ee3p l\u1ec7 (0.150\u20132.0).';\n              else status.textContent = 'Ch\u01b0a build stats cho n\u0103m ' + year + ' (c\u00f3 ' + validCount + ' record h\u1ee3p l\u1ec7). Admin b\u1ea5m Rebuild.';\n              return;\n            }\n\n            status.textContent = 'Showing stats for ' + year + ' (valid records: ' + validCount + ')';\n            renderCharts(data);\n          }).catch(function(err){\n            console.log(err);\n            status.textContent = 'Error loading stats.';\n          });\n        }\n\n        btnOpen.addEventListener('click', openStats);\n\n        if (btnRebuild) {\n          btnRebuild.addEventListener('click', function(){\n            var year = selYear.value;\n            status.textContent = 'Rebuilding stats for ' + year + '...';\n\n            postAjax(\"https:\/\/khoahocthethao.vn\/wp-admin\/admin-ajax.php\", {\n              action: \"rt_rebuild_stats_v34\",\n              nonce: nonce,\n              year: year\n            }).then(function(res){\n              if (!res || !res.success) {\n                status.textContent = 'Rebuild failed: ' + (res && res.data ? res.data : 'Unknown');\n                return;\n              }\n              status.textContent = 'Rebuild done for ' + year + '. Loading charts...';\n              openStats();\n            }).catch(function(err){\n              console.log(err);\n              status.textContent = 'Rebuild error.';\n            });\n          });\n        }\n      });\n    })();\n    <\/script>\n    \n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"321\" src=\"https:\/\/khoahocthethao.vn\/wp-content\/uploads\/2026\/01\/image-1-1024x321.png\" alt=\"\" class=\"wp-image-4115\" srcset=\"https:\/\/khoahocthethao.vn\/wp-content\/uploads\/2026\/01\/image-1-1024x321.png 1024w, https:\/\/khoahocthethao.vn\/wp-content\/uploads\/2026\/01\/image-1-300x94.png 300w, https:\/\/khoahocthethao.vn\/wp-content\/uploads\/2026\/01\/image-1-768x241.png 768w, https:\/\/khoahocthethao.vn\/wp-content\/uploads\/2026\/01\/image-1-360x113.png 360w, https:\/\/khoahocthethao.vn\/wp-content\/uploads\/2026\/01\/image-1.png 1184w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Click v\u00e0o \u00f4 m\u00e0u \u0111\u1ee3i chuy\u1ec3n t\u1eeb \u0111\u1ecf sang xanh, r\u1ed3i click l\u1ea7n n\u1eefa \u0111\u1ec3 \u0111o k\u1ebft qu\u1ea3<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"wprm-recipe-roundup-name":"","wprm-recipe-roundup-description":"","footnotes":""},"class_list":["post-2818","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/khoahocthethao.vn\/index.php\/wp-json\/wp\/v2\/pages\/2818","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/khoahocthethao.vn\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/khoahocthethao.vn\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/khoahocthethao.vn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/khoahocthethao.vn\/index.php\/wp-json\/wp\/v2\/comments?post=2818"}],"version-history":[{"count":69,"href":"https:\/\/khoahocthethao.vn\/index.php\/wp-json\/wp\/v2\/pages\/2818\/revisions"}],"predecessor-version":[{"id":4121,"href":"https:\/\/khoahocthethao.vn\/index.php\/wp-json\/wp\/v2\/pages\/2818\/revisions\/4121"}],"wp:attachment":[{"href":"https:\/\/khoahocthethao.vn\/index.php\/wp-json\/wp\/v2\/media?parent=2818"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}