import {type Element, DOMParser} from "../../deps.deno_ext.ts";
function selectedElement(elements:Element[], attribute:"checked" | "selected"){ return elements.find(v => typeof v.getAttribute(attribute) === "string");}
function getValue(element?:Element){ return element?.getAttribute("value") ?? "";}
function getContent({textContent}:Element){ return textContent;}
function extractValue(element?:Element){ switch(element?.tagName){ case "SELECT": return getValue(selectedElement(element.getElementsByTagName("option"), "selected")); case "DATALIST": return getValue(selectedElement(element.getElementsByTagName("option"), "selected")); case "OPTION": return getValue(element); case "INPUT": return getValue(element); case "TEXTAREA": return getContent(element); default: return ""; }}
export function parseDOM(html:string):Element{ const element = new DOMParser().parseFromString(html, "text/html")?.documentElement;
if(!element){ throw new Error(); }
return element;}
export function collectInputById(element:Element):Record<string, string>{ const records:Record<string, string> = {};
for(const input of element.getElementsByTagName("INPUT")){ if(!input.id){ continue; }
records[input.id] = getValue(input); }
for(const textarea of element.getElementsByTagName("TEXTAREA")){ if(!textarea.id){ continue; }
records[textarea.id] = getContent(textarea); }
return structuredClone(records);}
export function getElementsByName(element:Element, name:string):Element[]{ return element.getElementsByTagName("*").filter(v => v.getAttribute("name") === name);}
export function getValueById(element:Element, id:string):string{ return extractValue(element.getElementById(id) ?? undefined);}
export function getValuesByName(element:Element, name:string):string[]{ return getElementsByName(element, name).map(v => extractValue(v));}
export function getValueByRadioActive(element:Element, name:string):string{ const elements = getElementsByName(element, name);
if(elements.some(v => v.tagName !== "INPUT" || v.getAttribute("type") !== "radio")){ return ""; }
return extractValue(selectedElement(elements, "checked"));}