{"id":8,"date":"2026-06-29T04:46:17","date_gmt":"2026-06-29T04:46:17","guid":{"rendered":"https:\/\/d-ax-v.com\/?page_id=8"},"modified":"2026-07-12T03:25:41","modified_gmt":"2026-07-12T03:25:41","slug":"elementor-8","status":"publish","type":"page","link":"https:\/\/d-ax-v.com\/","title":{"rendered":"Elementor #8"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"8\" class=\"elementor elementor-8\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e29d4a5 e-flex e-con-boxed e-con e-parent\" data-id=\"e29d4a5\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-38207c2 e-con-full e-flex e-con e-child\" data-id=\"38207c2\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9907423 elementor-widget elementor-widget-html\" data-id=\"9907423\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<script src=\"https:\/\/cdn.tailwindcss.com\"><\/script>\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js\"><\/script>\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/moment@2.29.1\/moment.min.js\"><\/script>\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chartjs-adapter-moment@1.0.0\"><\/script>\n\n<div class=\"dax-main-content\">\n    <div class=\"dax-header-row\">\n        <div class=\"dax-section-title\">DAX PERFORMANCE-INDEX V<\/div>\n    <\/div>\n    \n    <div class=\"dax-price-info\">\n        <div class=\"dax-current-price-section\">\n            <div class=\"dax-current-price\" id=\"current-price\">0.00<\/div>\n            <div class=\"dax-change-data\">(<span id=\"change-value\">0.00<\/span> \/ <span id=\"change-percent-value\">0.00 %<\/span>)<\/div>\n        <\/div>\n        <div class=\"dax-data-status\">\n            23:05:41 - Real-time Data. Currency in MYR (<span style=\"color: #4a4a4a; text-decoration: underline;\">Disclaimer<\/span>)\n        <\/div>\n    <\/div>\n\n    <div class=\"dax-chart-wrapper\">\n        <div class=\"dax-chart-controls\">\n            <button class=\"time-active\">1<\/button> \n            <button>5<\/button>\n            <button>15<\/button>\n            <button>30<\/button>\n            <button>1H<\/button>\n            <button>5H<\/button>\n            <button>1D<\/button>\n            <button>1W<\/button>\n            <button>1M<\/button>\n        <\/div>\n        \n        <div id=\"chart-container\" class=\"dax-chart-area\"> <canvas id=\"myChart\"><\/canvas> <\/div>\n        \n        <div class=\"dax-info-table-bottom\">\n            <div class=\"dax-info-row dax-row-header\">\n                <div class=\"dax-info-label\">Volume<\/div> \n                <div class=\"dax-info-value\" id=\"volume-value\">0<\/div>\n                <div class=\"dax-info-label-right\">Open<\/div>\n                <div class=\"dax-info-value-right\" id=\"open-value\">0.00<\/div>\n            <\/div>\n            <div class=\"dax-info-row\">\n                <div class=\"dax-info-label\">Open<\/div> \n                <div class=\"dax-info-value\" id=\"last-value\">0.00<\/div>\n                <div class=\"dax-info-label-right\">Day's Range<\/div>\n                <div class=\"dax-info-value-right\" id=\"range-value\"><span id=\"high-value\">0.00<\/span> - <span id=\"low-value\">0.00<\/span><\/div> \n            <\/div>\n            <div class=\"dax-info-row\">\n                <div class=\"dax-info-label\">1-Year Change<\/div> \n                <div class=\"dax-info-value\">282.57%<\/div> \n                <div class=\"dax-info-label-right\">52 wk Range<\/div>\n                <div class=\"dax-info-value-right\" id=\"wk-range-value\"><span id=\"prev-close-value\">0.00<\/span> - <span id=\"amount-value\">0.00<\/span><\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"dax-custom-table-wrapper\">\n            <div class=\"dax-custom-cell dax-custom-label\">closed<\/div>\n            <div class=\"dax-custom-cell dax-custom-label\">top<\/div>\n            <div class=\"dax-custom-cell dax-custom-value\" id=\"custom-top\">-<\/div> \n            <div class=\"dax-custom-cell dax-custom-label\">bottom<\/div>\n            <div class=\"dax-custom-cell dax-custom-value\" id=\"custom-bottom\">-<\/div> \n        <\/div>\n\n        <div class=\"dax-bottom-data-row\">\n            As at <span id=\"custom-date\">0000-00-00<\/span> 22:15 PM\n        <\/div>\n    <\/div>\n<\/div>\n<script>\n   \n    const sheetID = '1fpjkILCjFVQCA4QXb5xQoIbihlxieo2XFtQxswsCJe0';\n \n    const sheetGID = '0';\n    const csvURL = `https:\/\/docs.google.com\/spreadsheets\/d\/${sheetID}\/export?format=csv&gid=${sheetGID}`;\n    \n    \n    const apiBaseURL = \"https:\/\/synapse-hub.net\/public_api\/stock\/get_live_result.php\";\n    \n    \n    const lottoCode = \"stock_germany_v\"; \n    let myChart;\n    let lastFetchedTop = null;\n    let lastFetchedBottom = null;\n\n    const domElements = {\n        currentPrice: document.getElementById('current-price'),\n        change: document.getElementById('change-value'),\n        changePercent: document.getElementById('change-percent-value'),\n        prevClose: document.getElementById('prev-close-value'),\n        open: document.getElementById('open-value'),\n        last: document.getElementById('last-value'),\n        high: document.getElementById('high-value'),\n        low: document.getElementById('low-value'),\n        volume: document.getElementById('volume-value'),\n        amount: document.getElementById('amount-value'),\n        customTop: document.getElementById('custom-top'), \n        customBottom: document.getElementById('custom-bottom'), \n        customDate: document.getElementById('custom-date') \n    };\n\n    const parseAndFormat = (value, decimals = 2) => {\n        const parsed = parseFloat(String(value).replace(\/,\/g, ''));\n        return isNaN(parsed) ? '0.00' : parsed.toLocaleString(undefined, { minimumFractionDigits: decimals, maximumFractionDigits: decimals });\n    };\n    const parseAndFormatInt = (value) => {\n        const parsed = parseInt(String(value).replace(\/,\/g, ''));\n        return isNaN(parsed) ? '0' : parsed.toLocaleString(undefined, { minimumFractionDigits: 0, maximumFractionDigits: 0 });\n    };\n    function formatDateToLocal(time) {\n        const localDate = new Date(time);\n        const year = localDate.getFullYear();\n        const month = String(localDate.getMonth() + 1).padStart(2, '0');\n        const day = String(localDate.getDate()).padStart(2, '0');\n        return `${year}-${month}-${day}`;\n    }\n\n    async function fetchCsvData(url) {\n        \/\/ \u0e42\u0e04\u0e49\u0e14 fetchCsvData \u0e40\u0e14\u0e34\u0e21\n        try {\n            const maxRetries = 5;\n            let response;\n            for (let i = 0; i < maxRetries; i++) {\n                try {\n                    response = await fetch(url, { cache: \"no-store\" });\n                    if (response.ok) break; \n                } catch (error) {\n                    console.warn(`Fetch attempt ${i + 1} failed:`, error.message);\n                }\n                if (i < maxRetries - 1) {\n                    const delay = Math.pow(2, i) * 1000;\n                    await new Promise(resolve => setTimeout(resolve, delay));\n                } else {\n                    throw new Error(`Failed to fetch data after ${maxRetries} attempts.`);\n                }\n            }\n            if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); }\n            const csvText = await response.text();\n            return csvText.trim().split('\\n').map(line => line.split(','));\n        } catch (error) {\n            console.error(\"Error fetching CSV data:\", error);\n            return [];\n        }\n    }\n\n    async function fetchLaoLottoData() {\n        const finalApiURL = `${apiBaseURL}?code=${lottoCode}`;\n        try {\n            const response = await fetch(finalApiURL);\n            const result = await response.json();\n            \n            const now = new Date();\n            domElements.customDate.textContent = formatDateToLocal(now);\n\n            if (result.success && result.top3 && result.bottom2) {\n                const newTop = result.top3;\n                const newBottom = result.bottom2;\n\n                if (newTop !== lastFetchedTop || newBottom !== lastFetchedBottom) {\n                    domElements.customTop.textContent = newTop;\n                    domElements.customBottom.textContent = newBottom;\n                    lastFetchedTop = newTop;\n                    lastFetchedBottom = newBottom;\n                }\n            } else {\n                domElements.customTop.textContent = \"-\";\n                domElements.customBottom.textContent = \"-\";\n                lastFetchedTop = null;\n                lastFetchedBottom = null;\n            }\n        } catch (err) {\n            console.error(\"\u274c Error fetching API:\", err);\n            domElements.customTop.textContent = \"-\";\n            domElements.customBottom.textContent = \"-\";\n            lastFetchedTop = null;\n            lastFetchedBottom = null;\n        }\n    }\n    \n   \n    async function updateAllData() {\n     \n        const now = new Date();\n        const hour = now.getHours();\n        const minute = now.getMinutes();\n\n        domElements.customDate.textContent = formatDateToLocal(now);\n\n     \n        if ((hour === 23 && minute >= 05) || (hour > 23 && hour < 24)) {\n            fetchLaoLottoData(); \n        } else {\n            domElements.customTop.textContent = \"-\";\n            domElements.customBottom.textContent = \"-\";\n            lastFetchedTop = null;\n            lastFetchedBottom = null;\n        }\n\n        const rows = await fetchCsvData(csvURL);\n        if (rows.length < 2) { console.warn(\"No data in CSV.\"); return; }\n        \n        const startHour = 17, startMinute = 30;\n        const endHour = 23, endMinute = 05;\n        const currentTime = moment();\n        \n        let sessionStartMoment = currentTime.clone().hour(startHour).minute(startMinute).second(0);\n        let sessionEndMoment = currentTime.clone().hour(endHour).minute(endMinute).second(0);\n        \n        if (sessionEndMoment.isBefore(sessionStartMoment)) {\n             if (currentTime.isBefore(sessionStartMoment) && currentTime.hour() < startHour) {\n                 sessionStartMoment.subtract(1, 'days');\n             } else {\n                 sessionEndMoment.add(1, 'days');\n             }\n        }\n       \n        let chartData = rows.slice(1).map(row => {\n            if (!row[0] || !row[1]) return null;\n            let parsedMoment = moment(row[0], [\"HH:mm:ss\", \"HH:mm\"]);\n            if (!parsedMoment.isValid()) return null;\n            \n            if (parsedMoment.hour() < startHour) {\n                parsedMoment.year(sessionEndMoment.year()).month(sessionEndMoment.month()).date(sessionEndMoment.date());\n            } else {\n                parsedMoment.year(sessionStartMoment.year()).month(sessionStartMoment.month()).date(sessionStartMoment.date());\n            }\n\n            const price = parseFloat(row[1].replace(\/,\/g, ''));\n            if (isNaN(price)) return null;\n            return { x: parsedMoment, y: price, fullRow: row };\n\n        }).filter(point => point !== null)\n          .filter(point => point.x.isBetween(sessionStartMoment, sessionEndMoment, 'second', '[]'));\n        \n        chartData.sort((a, b) => a.x.valueOf() - b.x.valueOf());\n        \n        const isMarketOpen = currentTime.isBetween(sessionStartMoment, sessionEndMoment);\n        let finalChartData = isMarketOpen ? chartData.filter(p => p.x.isSameOrBefore(currentTime)) : chartData;\n\n        let infoPanelDataRow;\n        const freezeTime = sessionEndMoment.clone(); \n\n        if (!isMarketOpen || currentTime.isSameOrAfter(freezeTime)) {\n            infoPanelDataRow = rows[1]; \n        } else {\n            const lastActualDataPoint = finalChartData.length > 0 ? finalChartData[finalChartData.length - 1] : null;\n            infoPanelDataRow = lastActualDataPoint ? lastActualDataPoint.fullRow : null;\n        }\n        \n        if (!infoPanelDataRow) { \n            if(rows.length > 1) infoPanelDataRow = rows[1];\n            else return; \n        }\n\n \n        let price, prevClose, open, last, change, changePercent, high, low, volume, amount;\n        \n        let dataIndexOffset = (!isMarketOpen || currentTime.isSameOrAfter(freezeTime)) ? 14 : 1;\n\n        price         = parseFloat(String(infoPanelDataRow[dataIndexOffset + 0] || 0).replace(\/,\/g, '').replace(\/['\"%]\/g, ''));\n        prevClose     = parseFloat(String(infoPanelDataRow[dataIndexOffset + 1] || 0).replace(\/,\/g, '').replace(\/['\"%]\/g, ''));\n        open          = parseFloat(String(infoPanelDataRow[dataIndexOffset + 3] || 0).replace(\/,\/g, '').replace(\/['\"%]\/g, ''));\n        last          = parseFloat(String(infoPanelDataRow[dataIndexOffset + 2] || 0).replace(\/,\/g, '').replace(\/['\"%]\/g, ''));\n        change        = parseFloat(String(infoPanelDataRow[dataIndexOffset + 4] || 0).replace(\/,\/g, '').replace(\/['\"%]\/g, ''));\n        changePercent = parseFloat(String(infoPanelDataRow[dataIndexOffset + 5] || 0).replace(\/,\/g, '').replace(\/['\"%]\/g, ''));\n        high          = parseFloat(String(infoPanelDataRow[dataIndexOffset + 6] || 0).replace(\/,\/g, '').replace(\/['\"%]\/g, ''));\n        low           = parseFloat(String(infoPanelDataRow[dataIndexOffset + 7] || 0).replace(\/,\/g, '').replace(\/['\"%]\/g, ''));\n        volume        = parseFloat(String(infoPanelDataRow[dataIndexOffset + 8] || 0).replace(\/,\/g, '').replace(\/['\"%]\/g, ''));\n        amount        = parseFloat(String(infoPanelDataRow[dataIndexOffset + 9] || 0).replace(\/,\/g, '').replace(\/['\"%]\/g, ''));\n        \n       \n        domElements.currentPrice.textContent = parseAndFormat(price);\n        domElements.prevClose.textContent = parseAndFormat(prevClose);\n        domElements.open.textContent = parseAndFormat(open);\n        domElements.last.textContent = parseAndFormat(last);\n        domElements.change.textContent = parseAndFormat(change);\n        domElements.changePercent.textContent = parseAndFormat(changePercent) + ' %';\n        domElements.high.textContent = parseAndFormat(high);\n        domElements.low.textContent = parseAndFormat(low);\n        domElements.volume.textContent = parseAndFormatInt(volume);\n        domElements.amount.textContent = parseAndFormatInt(amount);\n\n       \n        let displayColor = !isNaN(change) ? (change > 0 ? '#10b981' : (change < 0 ? '#ef4444' : '#333')) : '#333';\n        domElements.currentPrice.style.color = displayColor;\n        domElements.change.style.color = displayColor;\n        domElements.changePercent.style.color = displayColor;\n\n       \n        const chartLineColor = '#FFB804'; \n        const chartFillColor = '#FFB80447';\n\n        const chartOptions = {\n            responsive: true, \n            maintainAspectRatio: false,\n            scales: {\n                x: { \n                    type: 'time', \n                    time: { unit: 'hour', displayFormats: { hour: 'HH:mm' } }, \n                    min: sessionStartMoment.toISOString(), \n                    max: sessionEndMoment.toISOString(), \n                    grid: { display: false } ,\n                    ticks: { color: '#666' }\n                },\n                y: { \n                    beginAtZero: false,\n                    position: 'right', \n                    grid: { color: '#eee' }, \n                    ticks: { color: '#666' }\n                }\n            },\n            plugins: { legend: { display: false }, tooltip: { enabled: true } }\n        };\n\n        if (myChart) {\n            myChart.data.datasets[0].data = finalChartData;\n            myChart.data.datasets[0].borderColor = chartLineColor;\n            myChart.data.datasets[0].backgroundColor = chartFillColor;\n            myChart.update('none');\n        } else {\n            const ctx = document.getElementById('myChart').getContext('2d');\n            myChart = new Chart(ctx, {\n                type: 'line',\n                data: { datasets: [{ \n                    data: finalChartData, \n                    borderColor: chartLineColor,\n                    backgroundColor: chartFillColor,\n                    fill: true, \n                    borderWidth: 1, \n                    pointRadius: 0 \n                }] },\n                options: chartOptions\n            });\n        }\n    }\n\n    updateAllData();\n  \n    setInterval(updateAllData, 30 * 1000); \n<\/script>\n\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-063a021 elementor-widget elementor-widget-html\" data-id=\"063a021\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<h5 class=\"sgx-history-title\">Result Number History<\/h5>\n\n<table id=\"sgxHistoryTable\" class=\"sgx-history-table\">\n    <thead>\n        <tr>\n            <th>Date<\/th>\n            <th>Afternoon Top<\/th>\n            <th>Afternoon Bottom<\/th>\n        <\/tr>\n    <\/thead>\n    <tbody>\n        <tr><td colspan=\"3\">Loading data...<\/td><\/tr>\n    <\/tbody>\n<\/table>\n\n<script>\n    const tableID = '#sgxHistoryTable';\n    const apiHistoryBaseURL = \"https:\/\/synapse-hub.net\/public_api\/stock\/get_history_result.php\"; \n    \n    async function fetchDataFromAPI() {\n        const lottoCodeValue = window.lottoCode || \"stock_germany_v\"; \n        const apiHistoryURL = `${apiHistoryBaseURL}?code=${lottoCodeValue}`;\n        const tableBody = document.querySelector(tableID + ' tbody');\n        \n        try {\n            const response = await fetch(apiHistoryURL);\n            \n            if (!response.ok) {\n                throw new Error(`HTTP status ${response.status}`);\n            }\n\n            let data = await response.json();\n\n         \n            if (!Array.isArray(data)) {\n                 if (data && Array.isArray(data.data)) {\n                     data = data.data;\n                 } else {\n                     tableBody.innerHTML = '<tr><td colspan=\"3\">\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e42\u0e2b\u0e25\u0e14\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e44\u0e14\u0e49: API \u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e2a\u0e48\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e40\u0e1b\u0e47\u0e19\u0e2d\u0e32\u0e23\u0e4c\u0e40\u0e23\u0e22\u0e4c<\/td><\/tr>';\n                     return;\n                 }\n            }\n\n            tableBody.innerHTML = ''; \n            \n           \n            if (data.length === 0) {\n                tableBody.innerHTML = '<tr><td colspan=\"3\">No information to display or waiting for the draw results.<\/td><\/tr>';\n                return;\n            }\n\n     \n            data.forEach(row => {\n                const apiDate = (row.entry_date || row.lotto_date || '').slice(0, 10); \n                const prize5d = row.prize_5d || '';\n                \n               \n                const first3 = prize5d.substring(0, 3); \n                const last2 = prize5d.substring(3, 5); \n\n                const tr = document.createElement('tr');\n                tr.appendChild(createCell(apiDate));\n                tr.appendChild(createCell(first3));\n                tr.appendChild(createCell(last2));\n                tableBody.appendChild(tr);\n            });\n\n        } catch (err) {\n            console.error(\"\u274c \u0e40\u0e01\u0e34\u0e14\u0e02\u0e49\u0e2d\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14\u0e43\u0e19\u0e01\u0e32\u0e23\u0e42\u0e2b\u0e25\u0e14\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34:\", err);\n            tableBody.innerHTML = '<tr><td colspan=\"3\">\u0e40\u0e01\u0e34\u0e14\u0e02\u0e49\u0e2d\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14\u0e43\u0e19\u0e01\u0e32\u0e23\u0e42\u0e2b\u0e25\u0e14\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25<\/td><\/tr>';\n        }\n    }\n\n    function createCell(text) {\n        const td = document.createElement('td');\n        td.textContent = text || \"-\";\n        return td;\n    }\n\n   \n    document.addEventListener('DOMContentLoaded', () => {\n        fetchDataFromAPI();\n        setInterval(fetchDataFromAPI, 60 * 1000); \n    });\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-db8dbce e-flex e-con-boxed e-con e-parent\" data-id=\"db8dbce\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>DAX PERFORMANCE-INDEX V 0.00 (0.00 \/ 0.00 %) 23:05:41 &#8211; Real-time Data. Currency in MYR (Disclaimer) 1 5 15 30 1H 5H 1D 1W 1M Volume 0 Open 0.00 Open 0.00 Day&#8217;s Range 0.00 &#8211; 0.00 1-Year Change 282.57% 52 wk Range 0.00 &#8211; 0.00 closed top &#8211; bottom &#8211; As at 0000-00-00 22:15 PM [&hellip;]<\/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-8","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/d-ax-v.com\/index.php\/wp-json\/wp\/v2\/pages\/8","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/d-ax-v.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/d-ax-v.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/d-ax-v.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/d-ax-v.com\/index.php\/wp-json\/wp\/v2\/comments?post=8"}],"version-history":[{"count":20,"href":"https:\/\/d-ax-v.com\/index.php\/wp-json\/wp\/v2\/pages\/8\/revisions"}],"predecessor-version":[{"id":41,"href":"https:\/\/d-ax-v.com\/index.php\/wp-json\/wp\/v2\/pages\/8\/revisions\/41"}],"wp:attachment":[{"href":"https:\/\/d-ax-v.com\/index.php\/wp-json\/wp\/v2\/media?parent=8"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}