function comboOpenFormById(formId) { var form = qi(formId); form && comboOpenForm(form); } function comboCloseFormById(formId) { var form = qi(formId); form && comboCloseForm(form); } function comboOpenForm(container) { var dropdown = container.parentNode.querySelector('.dropdown'); container.scrollTop = 0; container.parentNode.classList.add('dropdown-open'); dropdown.classList.add('dropdown-open'); activeForm = container.id; }; function comboCloseForm(container) { container.parentNode.classList.remove('dropdown-open'); //container.previousSibling.classList.remove('dropdown-open'); activeForm = undefined; }; function comboLookupTextApply(dom) { let elem = qi(dom); if (elem) { let textareaSplit = dom.split('_'); textareaSplit.pop(); const textarea = qi(textareaSplit.join('_')); textarea ? textarea.value = elem.value : null; } } function comboClear(dom) { let elem = qi('comboContainer_' + dom) var dropdown = qi(dom).closest('.dropdown'); if (elem) { elem.style.display = 'none' } dropdown.classList.remove('dropdown-open'); dropdown.classList.remove('is-reversed'); activeCombo = undefined; currentItem = undefined; } function comboSelect(dom, row, feed, mod, id) { let elem = qi(dom); comboClear(dom); if (qi(id)) elem.setAttribute("data-bind", qi(id).getAttribute('data-bind')); elem.value = row; elem.style.backgroundColor = 'white'; var dropdown = qi(dom).closest('.dropdown'); dropdown.classList.remove('dropdown-open'); dropdown.classList.remove('is-reversed'); dropdown.classList.add('dropdown-bind'); let value = qi(id) ? dec(unbase64(qi(id).getAttribute('data-bind'))) : string(row); direct(tuple(atom('comboSelect'), value, string(dom), string(feed), atom(mod))); comboLookupTextApply(dom); } function comboLookupChange(dom) { let elem = qi(dom); if (elem) { elem.removeAttribute("data-bind"); const dropdown = qi(dom).closest('.dropdown'); if (dropdown) { dropdown.classList.remove('dropdown-bind'); } comboLookupTextApply(dom); } } function comboLookupClick(uid, dom, feed, mod) { var dropdown = qi(dom).closest('.dropdown'); var char = event.which || event.keyCode; if (char == 1 && !activeCombo && qi(dom).value == '') { activeCombo = dom; currentItem = undefined; dropdown.classList.add('dropdown-open'); if (window.innerHeight - dropdown.getBoundingClientRect().bottom < 100) dropdown.classList.add('is-reversed'); direct(tuple(atom('comboKey'), bin(uid), bin('all'), string(dom), string(feed), atom(mod))); return } else if (char == 1 && activeCombo == dom) { comboClear(dom); } } function comboLookupKeydown(uid, dom, feed, mod) { var dropdown = qi(dom).closest('.dropdown'); var char = event.which || event.keyCode; if (char == 40 && !activeCombo && qi(dom).value == '') { activeCombo = dom; currentItem = undefined; dropdown.classList.add('dropdown-open'); if (window.innerHeight - dropdown.getBoundingClientRect().bottom < 100) dropdown.classList.add('is-reversed'); direct(tuple(atom('comboKey'), bin(uid), bin('all'), string(dom), string(feed), atom(mod))); return } if (activeCombo && [35, 36, 38, 40].includes(char)) { event.preventDefault(); if (char == 40) { set_focus( currentItem && ( !cycleEnabled || currentItem.nextSibling) ? currentItem.nextSibling : qi('comboContainer_' + dom).firstChild, true) } if (char == 35) { set_focus( currentItem && ( !cycleEnabled || currentItem.nextSibling) ? currentItem.parentNode.lastChild : currentItem, true) } if (char == 38) { set_focus( currentItem && ( !cycleEnabled || currentItem.previousSibling) ? currentItem.previousSibling : qi('comboContainer_' + dom).lastChild, true) } if (char == 36) { set_focus( currentItem && ( !cycleEnabled || currentItem.previousSibling) ? currentItem.parentNode.firstChild : currentItem, true) } } if (char == 13) { event.preventDefault(); return } } function comboLookupKeyup(uid, dom, feed, mod) { var dropdown = qi(dom).closest('.dropdown') var char = event.which || event.keyCode; if (char == 27 || (char == 8 || char == 46) && qi(dom).value == '') { clearInput(dom); return } if (char == 13 && currentItem) { currentItem.click(); return } if ([33, 34, 37, 39].includes(char)) { return } if (activeCombo && [35, 36, 38, 40].includes(char)) { return } else { activeCombo = dom; currentItem = undefined; dropdown.classList.add('dropdown-open'); if (window.innerHeight - dropdown.getBoundingClientRect().bottom < 100) dropdown.classList.add('is-reversed'); direct(tuple(atom('comboKey'), bin(uid), bin(qi(dom).value), string(dom), string(feed), atom(mod))); } } function comboLookupMouseMove(dom) { set_focus(event.target.closest('.dropdown-item'), false) } function set_focus(elem, scroll) { if (elem) { if(currentItem) {currentItem.className = "dropdown-item"} elem.className = "dropdown-item focus" if (scroll==true) {elem.scrollIntoView({block: "nearest", inline: "nearest"})} currentItem = elem } } function clearInput(dom) { const input = qi(dom); if (input) { input.value = ''; input.removeAttribute('value'); } comboLookupChange(dom); comboClear(dom); } document.addEventListener("click", () => { if (activeCombo && event.target.className != 'triangle' && !event.target.closest('#comboContainer_' + activeCombo)) { qi(activeCombo).value = ''; comboClear(activeCombo); } else if (activeForm && event.target.className != 'triangle' && !event.target.closest("#" + activeForm)) { comboCloseFormById(activeForm); } }) function comboLostFocus(e) { } function comboOnFocus(e) { } function comboLookupMouseOut(dom) { } var activeCombo = undefined var activeForm = undefined var currentItem = undefined var cycleEnabled = false