const MINIMUM_NEEDLE_LENGTH = 3; function fetch_name_and_group(needle) { let ret = { needle: "", group: "" }; let group_regex = /(\[[a-záéíóöúü]+\]$)/gi; let group_extracted = needle.match(group_regex); if (group_extracted != null) { ret["group"] = group_extracted[0].substring(1, group_extracted[0].length - 1); ret["needle"] = needle.substring(0, needle.length - group_extracted[0].length - 1).trim(); } else { ret["needle"] = needle; } return ret; } let ELECTOR_ID; // keresés indítása a nevek között function search_in_names() { let hintbox = document.getElementById("hintbox"); let needle = document.getElementById("nameinput").value; if (needle.trim().length < MINIMUM_NEEDLE_LENGTH) { hintbox.innerHTML = ""; collapse("hintzone"); collapse("submitbtn"); stop_submit_caption_generator(); o("nameinput").setAttribute("validity", ""); return; } // csoport és név szétválasztása let request_data = {}; request_data["data"] = fetch_name_and_group(needle); request_data["action"] = "search"; request_data["elector_id"] = ELECTOR_ID; request(request_data).then(resp => { hintbox.innerHTML = ""; let hits = JSON.parse(resp); hits.forEach((val) => { if (needle.length < 3) { return; } let hit = document.createElement("span"); hit.classList.add("hit"); hit.addEventListener("click", () => { let group_id = val["duplicate"] ? ` [${val["group"]}]` : ""; fill_name_input(`${val["name"]}${group_id}`); collapse("hintzone"); ninput.setAttribute("validity", "ok"); expand("submitbtn"); start_submit_caption_generator(); }); let name_node = document.createElement("span"); name_node.classList.add("name"); let hp = val["hitpos"]; let name = val["name"]; if (hp > 0) { let name_begin = name.slice(0, hp); name_node.appendChild(document.createTextNode(name_begin)); } let hl = document.createElement("span"); hl.classList.add("highlight"); hl.innerText = name.slice(hp, hp + needle.length); name_node.appendChild(hl); if (hp + needle.length < name.length) { let name_end = name.slice(hp + needle.length, name.length); name_node.appendChild(document.createTextNode(name_end)); } hit.appendChild(name_node); let group = val["group"]; if (group.length > 0) { let group_node = document.createElement("span"); group_node.innerHTML = ` ${print_from_group(group)}`; group_node.classList.add("group"); hit.appendChild(group_node); } hintbox.appendChild(hit); }); // doboz megjelenítése, ha szükséges hits.length > 0 ? expand("hintzone") : collapse("hintzone"); // szövegmező színezése let validity = ""; let ninput = document.getElementById("nameinput"); if (ninput.value.length > MINIMUM_NEEDLE_LENGTH) { if (hits.length === 0) { validity = "bad"; collapse("submitbtn"); stop_submit_caption_generator(); } else if (hits.length === 1 && hits[0]["exact_match"]) { validity = "ok"; collapse("hintzone"); expand("submitbtn"); start_submit_caption_generator(); } else { expand("hintzone"); collapse("submitbtn"); stop_submit_caption_generator(); } } ninput.setAttribute("validity", validity); }); } // csoport kiírása ("...az Azúrból" -- no reference of course :D), ha megkapja a szervertől function print_from_group(group) { group = group.trim(); if (group === "") { return ""; } let vowels = /[aáeéiíoóöőuúüű]/i; // magánhangzók regexe let highpitched_vowels = /[eéiíöőüű]/i; // magas hangrendű maánhangzók regexe // első betű megvizsgálása a névelő kiválasztásához let b = group.charAt(0); let article = (vowels.exec(b) != null) ? "az" : "a"; // hátulról az első magánhangzó keresése let g_rev = group.split("").reverse().join(""); let last_vowel = g_rev.match(vowels)[0]; // megvizsgáljuk, hogy az utolsó betű volt-e a megtalált magánhangzó let last_letter = g_rev.charAt(0).toLowerCase(); if (last_letter === last_vowel.charAt(0).toLowerCase()) { if (last_letter === "a") { last_letter = "á"; } else if (last_letter === "e") { last_letter = "é"; } // utolsó betű kicserélése group = group.substring(0, group.length - 1) + last_letter; } // utolsó magánhangzó hangrendjének vizsgálata és rag kiválasztása let suffix = highpitched_vowels.test(last_vowel) ? "ből" : "ból"; return `${article} ${group}${suffix}`; } // szöveggel kitölti a nevet function fill_name_input(str) { document.getElementById("nameinput").value = str; } const ARROWS = [/*"→",*/ "↠", "↣", "↦", "↬", "⇉", /*"⇒",*/ "⇛", "⇝"]; const SUBMIT_CAPTION_PREFIX = "Mehet! "; function generate_new_caption() { document.getElementById("submitbtn").innerHTML = SUBMIT_CAPTION_PREFIX + ARROWS[Math.floor(Math.random() * (ARROWS.length))]; } CAPTION_TIMER = -1; function start_submit_caption_generator() { if (CAPTION_TIMER === -1) { generate_new_caption(); CAPTION_TIMER = setInterval(() => { generate_new_caption(); }, 1000); } } function stop_submit_caption_generator() { if (CAPTION_TIMER !== -1) { clearInterval(CAPTION_TIMER); CAPTION_TIMER = -1; } } function submit_name() { stop_submit_caption_generator(); let submitbtn = document.getElementById("submitbtn"); submitbtn.innerText = "Már megy is!..."; needle = document.getElementById("nameinput").value; // csoport és név szétválasztása let request_data = {}; request_data["data"] = fetch_name_and_group(needle); request_data["action"] = "submit"; request_data["elector_id"] = ELECTOR_ID; request(request_data).then(resp_str => { let resp = JSON.parse(resp_str); console.log(resp); if (resp["successful"]) { hide("mainbox"); show("thankbox"); o("elector_index").innerText = `${resp["index"]}.`; } else { submitbtn.innerText = "Hiba, próbáld meg újra!"; } }); } function login() { let id_str = document.getElementById("idinput").value; if (id_str.trim().length === 0) { return; } if (login.login_in_progress === undefined) { login.login_in_progress = true; } else if (login.login_in_progress) { return; } let request_data = { action: "login", data: { elector_id: id_str } } let loginbtn = document.getElementById("loginbtn"); loginbtn.innerText = "Türelem..."; request(request_data).then(resp_str => { let resp = JSON.parse(resp_str); if (resp["valid"]) { ELECTOR_ID = id_str; // így nem kell süti... loginbtn.innerText = "Sikeres! :)"; hide("loginbox"); if (resp["open"]) { if (resp["results_public"]) { // eredmények publikálva vannak show("resultbox"); load_results(); } else if (resp["open_for_submit"] && !resp["used"]) { // nem publikusak az eredmények, lehet szavazni és még nem szavazott show("mainbox"); } else if (resp["open_for_submit"] && resp["used"]) { // nem publikusak az eredmények, lehet szavazni és de már szavazott show("infobox"); o("infoheader").innerText = "Már szavaztál. Az eredmények még nem elérhetők, de mi is kíváncsian várjuk őket! :)"; } else { // nem publikusak az eredmények, nem lehet szavazni show("infobox"); o("infoheader").innerText = "Még vagy már nem lehet szavazatot leadni!"; } } else { show("infobox"); o("infoheader").innerText = "A szavazófelület még vagy már nem elérhető, nézz vissza később!"; } } else { loginbtn.innerText = "Megpróbálom újra!"; } login.login_in_progress = false; } ) ; } function load_results() { let request_data = { action: "results", elector_id: ELECTOR_ID, data: { mobile: MOBILE } } request(request_data).then(resp_str => { let resbox = document.getElementById("resultbox"); let resp = JSON.parse(resp_str); if (resp["available"]) { let pie_plot_url = resp["plot_url"]; let details = resp["details"]; let headline = `