about summary refs log tree commit diff stats
path: root/src/pages/options/shared.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/pages/options/shared.js')
-rw-r--r--src/pages/options/shared.js115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/pages/options/shared.js b/src/pages/options/shared.js
new file mode 100644
index 00000000..1d86f537
--- /dev/null
+++ b/src/pages/options/shared.js
@@ -0,0 +1,115 @@
+var autocompletes = [];
+
+function parseURL(urlString) {
+    if (urlString)
+        try {
+            const url = new URL(urlString);
+            if (url.username && url.password)
+                return `${url.protocol}//${url.username}:${url.password}@${url.host}`;
+            else
+                return url.origin;
+
+        } catch (error) {
+            console.log(error);
+            return "";
+        }
+    else
+        return "";
+}
+
+
+function autocomplete(input, list) {
+    let currentFocus;
+    input.addEventListener("focus", (e) => {
+        showOptions(e, true);
+    });
+    input.addEventListener("input", (e) => {
+        const val = e.target.value;
+        if (!val) {
+            return false;
+        }
+        currentFocus = -1;
+        showOptions(e);
+    });
+    input.addEventListener("keydown", function (e) {
+        let x = document.getElementById(this.id + "autocomplete-list");
+        if (x) x = x.getElementsByTagName("div");
+        if (e.keyCode == 40) {
+            currentFocus++;
+            addActive(x);
+        } else if (e.keyCode == 38) {
+            currentFocus--;
+            addActive(x);
+        } else if (e.keyCode == 13) {
+            e.preventDefault();
+            if (currentFocus > -1) {
+                if (x) x[currentFocus].click();
+            }
+        }
+    });
+    function showOptions(event, showAll = false) {
+        let div,
+            i,
+            val = event.target.value;
+        closeAllLists();
+        div = document.createElement("div");
+        div.setAttribute("id", event.target.id + "autocomplete-list");
+        div.setAttribute("class", "autocomplete-items");
+        event.target.parentNode.appendChild(div);
+        for (i = 0; i < list.length; i++) {
+            if (list[i].toLowerCase().indexOf(val.toLowerCase()) > -1) {
+                div.appendChild(getItem(list[i], val));
+            } else if (showAll) {
+                div.appendChild(getItem(list[i], val));
+            }
+        }
+    }
+    function getItem(item, val) {
+        const div = document.createElement("div");
+        const strong = document.createElement("strong");
+        strong.textContent = item.substr(0, val.length);
+        div.innerText = item.substr(val.length);
+        const hiddenInput = document.createElement("input");
+        hiddenInput.type = "hidden";
+        hiddenInput.value = item;
+        div.prepend(strong);
+        div.appendChild(hiddenInput);
+        div.addEventListener("click", function (e) {
+            input.value = div.getElementsByTagName("input")[0].value;
+            input.dispatchEvent(new Event("input"));
+            closeAllLists();
+        });
+        return div;
+    }
+    function addActive(x) {
+        if (!x) return false;
+        removeActive(x);
+        if (currentFocus >= x.length) currentFocus = 0;
+        if (currentFocus < 0) currentFocus = x.length - 1;
+        x[currentFocus].classList.add("autocomplete-active");
+    }
+    function removeActive(x) {
+        for (let i = 0; i < x.length; i++) {
+            x[i].classList.remove("autocomplete-active");
+        }
+    }
+    function closeAllLists(elmnt) {
+        let x = document.getElementsByClassName("autocomplete-items");
+        for (let i = 0; i < x.length; i++) {
+            if (elmnt != x[i] && elmnt != input) {
+                x[i].parentNode.removeChild(x[i]);
+            }
+        }
+    }
+    document.addEventListener("click", (e) => {
+        if (!autocompletes.find((element) => element.id === e.target.id)) {
+            closeAllLists(e.target);
+        }
+    });
+}
+
+export default {
+    autocompletes,
+    parseURL,
+    autocomplete
+}
\ No newline at end of file