(function() { let versionData = {}; function updateElements(selector, text) { const elements = document.querySelectorAll(selector); if (elements.length > 0) { elements.forEach(el => { el.textContent = text; }); return true; } return false; } function applyUpdates() { if (versionData.mkii) { updateElements('[data-role="fw_version_mkii"]', `Ver. ${versionData.mkii.name}`); updateElements('[data-role="fw_version_mkii_date"]', versionData.mkii.date); } if (versionData.one) { updateElements('[data-role="fw_version_one"]', `Ver. ${versionData.one.name}`); updateElements('[data-role="fw_version_one_date"]', versionData.one.date); } if (versionData.e16) { updateElements('[data-role="fw_version_e16"]', `Ver. ${versionData.e16.tag_name}`); updateElements('[data-role="fw_version_e16_date"]', versionData.e16.date); } if (versionData.desktop) { updateElements('[data-role="desktop_app_version"]', `Ver. ${versionData.desktop.tag_name}`); updateElements('[data-role="oxi_desktop_date"]', versionData.desktop.date); const baseDownloadUrl = `https://github.com/OXI-Instruments/OXI-Desktop-APP/releases/download/${versionData.desktop.tag_name}`; document.querySelectorAll('[data-role="oxi-desktop-mac"]').forEach(el => { el.href = `${baseDownloadUrl}/OXI.App.zip`; }); document.querySelectorAll('[data-role="oxi-desktop-win"]').forEach(el => { el.href = `${baseDownloadUrl}/oxi_app_installer.zip`; }); } if (versionData.meta) { updateElements('[data-role="fw_version_meta"]', `Ver. ${versionData.meta.name}`); updateElements('[data-role="fw_version_meta_date"]', versionData.meta.date); } if (versionData.coral) { updateElements('[data-role="fw_version_coral"]', `Ver. ${versionData.coral.name}`); updateElements('[data-role="fw_version_coral_date"]', versionData.coral.date); } } function formatDate(dateString) { const date = new Date(dateString); return `${String(date.getDate()).padStart(2, '0')}.${String(date.getMonth() + 1).padStart(2, '0')}.${date.getFullYear()}`; } function fetchAllVersions() { // === MKII FIRMWARE (GitHub) === fetch('https://api.github.com/repos/OXI-Instruments/OXI-One-MkII-Releases/releases/latest') .then(response => response.json()) .then(data => { versionData.mkii = { name: data.name, date: formatDate(data.published_at || data.created_at) }; applyUpdates(); }) .catch(console.error); // === MKI FIRMWARE (GitLab) === fetch('https://gitlab.com/api/v4/projects/25470905/releases/permalink/latest') .then(response => response.json()) .then(data => { versionData.one = { name: data.name, date: formatDate(data.released_at || data.created_at) }; applyUpdates(); }) .catch(console.error); // === E16 FIRMWARE (GitHub) === fetch('https://api.github.com/repos/OXI-Instruments/OXI-E16-Releases/releases/latest') .then(response => response.json()) .then(data => { versionData.e16 = { tag_name: data.tag_name, date: formatDate(data.published_at || data.created_at) }; applyUpdates(); }) .catch(console.error); // === DESKTOP APP (GitHub) === fetch('https://api.github.com/repos/OXI-Instruments/OXI-Desktop-APP/releases/latest') .then(response => response.json()) .then(data => { versionData.desktop = { tag_name: data.tag_name, date: formatDate(data.created_at) }; applyUpdates(); }) .catch(console.error); // === META FIRMWARE (GitHub) === fetch('https://api.github.com/repos/oxiinstruments/meta-releases/releases/latest') .then(response => response.json()) .then(data => { versionData.meta = { name: data.name, date: formatDate(data.published_at || data.created_at) }; applyUpdates(); }) .catch(console.error); // === CORAL FIRMWARE (GitHub) === fetch('https://api.github.com/repos/oxiinstruments/coral-releases/releases/latest') .then(response => response.json()) .then(data => { versionData.coral = { name: data.name, date: formatDate(data.published_at || data.created_at) }; applyUpdates(); }) .catch(console.error); } function runWithRetry(maxAttempts = 10, delay = 300) { let attempts = 0; function tryApply() { attempts++; applyUpdates(); if (attempts < maxAttempts) { setTimeout(tryApply, delay); } } tryApply(); } function init() { fetchAllVersions(); if (document.readyState === 'complete') { setTimeout(function() { runWithRetry(); }, 200); } else { window.addEventListener('load', function() { setTimeout(function() { runWithRetry(); }, 200); }); } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })();