{"version":3,"sources":["dbs.auto.ts"],"names":["DBS","ajax","timeout","rateLimitDelay","initiateSearch","ev","clearTimeout","readyState","XMLHttpRequest","DONE","abort","setInterval","ctrl","inputCtrl","value","length","addEventListener","status","items","JSON","parse","responseText","autoWrapper","parentElement","oldItems","getElementsByTagName","i","remove","autoList","document","createElement","listItem","innerText","selectSearch","appendChild","completeSearch","open","send","sendSearch","target","item","widget","recurseUntilClass","elem","cssClass","classList","contains","AutoComplete","Initialise","searchWidgets","getElementsByClassName","window"],"mappings":"AACA,IAAOA,KAAP,SAAOA,GAAI,IAGHC,EACAC,EAFEC,EAIN,SAASC,EAAeC,QAEK,IAAd,GAEPC,aAAaJ,QAGK,IAAX,GAA0BD,EAAKM,aAAeC,eAAeC,MAEpER,EAAKS,QAGTR,EAAUS,YAAY,WAAM,OAGhC,SAAoBC,QAES,IAAd,GAEPN,aAAaJ,GAGjB,IAAMW,EAAYD,EAEdC,EAAUC,MAAMC,OAAS,KAK7Bd,EAAO,IAAIO,gBACNQ,iBAAiB,mBAAoB,SAACX,GAAsB,OAKrE,SAA2CO,GAEvC,GAAIX,EAAKM,aAAeC,eAAeC,MAAwB,MAAhBR,EAAKgB,OAApD,CAWA,IANA,IAAMC,EAAQC,KAAKC,MAAMnB,EAAKoB,cAGxBC,EAAeV,EAA0BW,cACzCC,EAAWF,EAAYG,qBAAqB,MAEzCC,EAAI,EAAGA,EAAIF,EAAST,OAAQW,IAEjCF,EAASE,GAAGC,SAGhB,GAAqB,IAAjBT,EAAMH,OAAV,CAOA,IAFA,IAAMa,EAAWC,SAASC,cAAc,MAE/BJ,EAAI,EAAGA,EAAIR,EAAMH,OAAQW,IAClC,CACI,IAAMK,EAAWF,SAASC,cAAc,MACxCC,EAASC,UAAYd,EAAMQ,GAC3BK,EAASf,iBAAiB,QAASiB,GACnCL,EAASM,YAAYH,GAGzBT,EAAYY,YAAYN,KAtCyCO,CAAmBvB,KACpFX,EAAKmC,KAAK,MAAO,qBAAqBvB,EAAUC,MAAK,KAAK,GAC1Db,EAAKoC,QApBuBC,CAAWjC,EAAGkC,SAASpC,GA2DvD,SAAS8B,EAAa5B,GAElB,IAAMmC,EAAOnC,EAAGkC,OACVE,EAYV,SAASC,EAAkBC,EAAmBC,GAE1C,GAAY,MAARD,EAEA,OAAO,KAGX,GAAIA,EAAKE,UAAUC,SAASF,GAExB,OAAOD,EAGX,OAAOD,EAAkBC,EAAKpB,cAAeqB,GAxB9BF,CAAkBF,EAAM,eAC3BC,EAAOhB,qBAAqB,SAAS,GAE7CX,MAAQ0B,EAAKR,UAGjB,IADA,IAAMR,EAAWiB,EAAOhB,qBAAqB,MACpCC,EAAI,EAAGA,EAAIF,EAAST,OAAQW,IAEjCF,EAASE,GAAGC,SAxFboB,EAAA/C,EAAA+C,eAAA/C,EAAA+C,aAAY,IAEb5C,EAAiB,IAyGP4C,EAAAC,WAAhB,WAII,IAFA,IAAMC,EAAgBpB,SAASqB,uBAAuB,eAE7CxB,EAAI,EAAGA,EAAIuB,EAAclC,OAAQW,IAEvBuB,EAAcvB,GACVD,qBAAqB,SAAS,GAE7CT,iBAAiB,QAASZ,IApH1C,CAAOJ,IAAAA,KAAG,IAyHVmD,OAAOnC,iBAAiB,OAAQhB,IAAI+C,aAAaC","file":"dbs.auto.js","sourcesContent":["\r\nmodule DBS.AutoComplete\r\n{\r\n const rateLimitDelay = 100;\r\n let ajax: XMLHttpRequest;\r\n let timeout: number;\r\n\r\n function initiateSearch(ev: KeyboardEvent)\r\n {\r\n if (typeof (timeout) !== \"undefined\")\r\n {\r\n clearTimeout(timeout);\r\n }\r\n\r\n if (typeof (ajax) !== \"undefined\" && ajax.readyState !== XMLHttpRequest.DONE)\r\n {\r\n ajax.abort();\r\n }\r\n\r\n timeout = setInterval(() => sendSearch(ev.target), rateLimitDelay);\r\n }\r\n\r\n function sendSearch(ctrl: EventTarget)\r\n {\r\n if (typeof (timeout) !== \"undefined\")\r\n {\r\n clearTimeout(timeout);\r\n }\r\n\r\n const inputCtrl = ctrl as HTMLInputElement;\r\n\r\n if (inputCtrl.value.length < 4)\r\n {\r\n return;\r\n }\r\n\r\n ajax = new XMLHttpRequest();\r\n ajax.addEventListener(\"readystatechange\", (ev: ProgressEvent) => completeSearch(ev, ctrl));\r\n ajax.open(\"GET\", `/api/autocomplete/${inputCtrl.value}/`, true);\r\n ajax.send();\r\n }\r\n\r\n function completeSearch(ev: ProgressEvent, ctrl: EventTarget)\r\n {\r\n if (ajax.readyState !== XMLHttpRequest.DONE || ajax.status !== 200)\r\n {\r\n return;\r\n }\r\n\r\n const items = JSON.parse(ajax.responseText) as string[];\r\n\r\n\r\n const autoWrapper = (ctrl as HTMLInputElement).parentElement as HTMLDivElement;\r\n const oldItems = autoWrapper.getElementsByTagName(\"ul\");\r\n\r\n for (let i = 0; i < oldItems.length; i++)\r\n {\r\n oldItems[i].remove();\r\n }\r\n\r\n if (items.length === 0)\r\n {\r\n return;\r\n }\r\n\r\n const autoList = document.createElement(\"ul\") as HTMLUListElement;\r\n\r\n for (let i = 0; i < items.length; i++)\r\n {\r\n const listItem = document.createElement(\"li\") as HTMLLIElement;\r\n listItem.innerText = items[i];\r\n listItem.addEventListener(\"click\", selectSearch);\r\n autoList.appendChild(listItem);\r\n }\r\n\r\n autoWrapper.appendChild(autoList);\r\n }\r\n\r\n function selectSearch(ev: Event)\r\n {\r\n const item = ev.target as HTMLLIElement;\r\n const widget = recurseUntilClass(item, \"search-auto\");\r\n const box = widget.getElementsByTagName(\"input\")[0] as HTMLInputElement;\r\n\r\n box.value = item.innerText;\r\n\r\n const oldItems = widget.getElementsByTagName(\"ul\");\r\n for (let i = 0; i < oldItems.length; i++)\r\n {\r\n oldItems[i].remove();\r\n }\r\n }\r\n\r\n function recurseUntilClass(elem: HTMLElement, cssClass: string)\r\n {\r\n if (elem == null)\r\n {\r\n return null;\r\n }\r\n\r\n if (elem.classList.contains(cssClass))\r\n {\r\n return elem;\r\n }\r\n\r\n return recurseUntilClass(elem.parentElement, cssClass);\r\n }\r\n\r\n export function Initialise()\r\n {\r\n const searchWidgets = document.getElementsByClassName(\"search-auto\");\r\n\r\n for (let i = 0; i < searchWidgets.length; i++)\r\n {\r\n const widget = searchWidgets[i] as HTMLDivElement;\r\n const box = widget.getElementsByTagName(\"input\")[0] as HTMLInputElement;\r\n\r\n box.addEventListener(\"keyup\", initiateSearch);\r\n }\r\n }\r\n}\r\n\r\nwindow.addEventListener(\"load\", DBS.AutoComplete.Initialise);"]}