function initJsonFormatter() { const FORMAT_INDENT = 4; const inputEl = document.getElementById("jsonInput"); const outputEl = document.getElementById("jsonOutput"); const statusEl = document.getElementById("jsonStatus"); const validateBtn = document.getElementById("jsonValidateBtn"); const formatBtn = document.getElementById("jsonFormatBtn"); const minifyBtn = document.getElementById("jsonMinifyBtn"); const copyBtn = document.getElementById("jsonCopyBtn"); const clearBtn = document.getElementById("jsonClearBtn"); if (!inputEl || !outputEl) return; function setStatus(text, isError = false) { if (!statusEl) return; statusEl.textContent = text; statusEl.classList.toggle("status-error", isError); statusEl.classList.toggle("status-success", !isError); } function updateButtonStates(parsed) { const hasInput = !!inputEl.value.trim(); const hasOutput = !!outputEl.value.trim(); const isValid = parsed !== null; validateBtn && (validateBtn.disabled = !hasInput); formatBtn && (formatBtn.disabled = !hasInput); minifyBtn && (minifyBtn.disabled = !hasInput); copyBtn && (copyBtn.disabled = !hasOutput && !isValid); clearBtn && (clearBtn.disabled = !hasInput && !hasOutput); } function parseJson(showStatus = true) { const raw = inputEl.value.trim(); if (!raw) { if (showStatus) setStatus("Paste JSON to validate."); outputEl.value = ""; updateButtonStates(null); return null; } try { const parsed = JSON.parse(raw); if (showStatus) setStatus("Valid JSON."); updateButtonStates(parsed); return parsed; } catch (err) { const message = err && err.message ? `Invalid JSON: ${err.message}` : "Invalid JSON."; if (showStatus) setStatus(message, true); outputEl.value = ""; updateButtonStates(null); return null; } } function formatJson() { const parsed = parseJson(); if (parsed === null) return; outputEl.value = JSON.stringify(parsed, null, FORMAT_INDENT); setStatus("JSON formatted successfully."); updateButtonStates(parsed); } function minifyJson() { const parsed = parseJson(); if (parsed === null) return; outputEl.value = JSON.stringify(parsed); setStatus("JSON minified successfully."); updateButtonStates(parsed); } function validateJson() { const parsed = parseJson(); if (parsed === null) return; setStatus("JSON is valid."); } inputEl.addEventListener("input", () => { parseJson(false); }); validateBtn?.addEventListener("click", validateJson); formatBtn?.addEventListener("click", formatJson); minifyBtn?.addEventListener("click", minifyJson); copyBtn?.addEventListener("click", async () => { const text = outputEl.value || inputEl.value; if (!text.trim()) { setStatus("Nothing to copy.", true); return; } await navigator.clipboard.writeText(text); const original = copyBtn.textContent; copyBtn.textContent = "Copied"; setStatus("Copied to clipboard."); setTimeout(() => copyBtn.textContent = original, 1200); }); clearBtn?.addEventListener("click", () => { inputEl.value = ""; outputEl.value = ""; setStatus("Paste JSON to validate."); updateButtonStates(null); }); updateButtonStates(null); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", initJsonFormatter); } else { initJsonFormatter(); }