function explode_sanitize_string_list(list, explodeAt = ",") { let elements = list.split(explodeAt); let sanitized = []; elements.forEach((e) => { if (e.trim() !== "") { sanitized.push(e); } }); return sanitized; } const HINTBOX_ID = "HINTBOX"; function close_hintbox(close_if_focused = false) { setTimeout(() => { if (close_if_focused || (document.getElementById(HINTBOX_ID).firstChild !== document.activeElement)) { hide(HINTBOX_ID); } }, 20); } function open_hintbox(x, y, contents, print_fun, insert_fun) { let hbw = document.getElementById(HINTBOX_ID); if (hbw === null) { hbw = document.createElement("section"); hbw.id = HINTBOX_ID; hbw.classList.add("hintbox-window"); let lb = document.createElement("select"); lb.size = 5; lb.style.width = "100%"; hbw.appendChild(lb); document.body.appendChild(hbw); } let lb = hbw.firstChild; hbw.style.left = `${x}px`; hbw.style.top = `${y}px`; lb.innerHTML = ""; contents.forEach((record) => { let line = print_fun(record); let opt = document.createElement("option"); opt.value = line; opt.innerText = line; lb.appendChild(opt); }); lb.ondblclick = () => { insert_fun(lb.value); }; show(HINTBOX_ID); } function open_hintbox_at(target_element_id, req_data, print_fn, insert_fn) { let targetF = document.getElementById(target_element_id); let bbox = targetF.getBoundingClientRect(); let list_str = targetF.value.trim().split(","); if (list_str.length > 0) { let last_le_str = list_str[list_str.length - 1].trim(); if (last_le_str.length > 2) { req_data["needle"] = last_le_str; // auto-insert needle request(req_data).then(resp => { let groups = JSON.parse(resp); let x = bbox.x + bbox.width; let y = bbox.y; open_hintbox(x, y, groups, print_fn, insert_fn); }); } } }