function smart_split(cntn, first, second) { arr = cntn.split(first); obj = {}; arr.forEach(function (line) { parts = line.split(second); header = parts.shift(); value = parts.join(second); obj[header] = value; }); return obj; } /* function question(text) { q = text.split(' ')[0]; verb = text.split(' ')[1]; beforeSub = text.indexOf(verb) + verb.length + 1; questionmark = text.substr(-1) == '?' ? 1 : 0; substantiv = text.substr(beforeSub, text.length-beforeSub-questionmark).replace('du', 'jag'); //return 'Du verkar ha skrivit en fråga 🤔'; return 'Jag vet nog inte ' + q + ' ' + substantiv + ' ' + verb + ' 🤔'; } */ window.instantsearch = function(element, happening) { window.onload = function() { if (document.body.contains(document.getElementById('instant-search'))) { console.log('FINNS document.body.contains(document.getElementById(instant-search))'); //document.getElementById('instant-search').style.height = window.innerHeight - parseInt(window.getComputedStyle(document.getElementById('topmenu')).height) + 2 + 'px'; } else { console.log('FINNS INTE document.body.contains(document.getElementById(instant-search))'); } } //console.log('happenin', happening); // Ändra för guds skull inte från keyup till keydown eller keypress 2020-12-31 (Year of Corona) if (1) { // happening.key.length == 1 || happening.key == 'Backspace' document.querySelector('input[type=reset]').style.display = 'inline-block !important'; if (document.body.contains(document.querySelector('ul#instant-search'))) { document.querySelector('ul#instant-search').remove(); } clearTimeout(window.autocomplete); clearTimeout(window.search_countdown); ul = document.createElement('ul'); ul.id = 'instant-search'; // !element.value && !element.innerHTML if (!element.value) { // if (element.value == '' || element.innerHTML == '') { //document.querySelector('ul#instant-search').remove(); /* li = document.createElement('li'); a = document.createElement('a'); a.innerHTML = 'Det går inte att göra en tom sökning'; li.append(a); ul.append(li); document.querySelector('ul#list-search form').append(ul); */ } else if (!navigator.onLine) { li = document.createElement('li'); li.innerHTML = 'Jag behöver internet för att kunna skicka svar på saker som du skriver till dig 🫡 Du verkar vara offline just nu.Försök igen
Detta meddelandet skickade jag med för säkerhets skull när sidan laddades.'; // 2023-02-23 Nuvarande meddelande // Vår sökmotor behöver internet // Kan inte kontakta servern utan internet ul.append(li); document.querySelector('ul#list-search form').append(ul); } else { spin = document.createElement('i'); spin.classList.add('fa', 'fa-spinner'); li = document.createElement('li'); li.innerHTML = 'Väntar på att du ska skriva färdigt 😊'; li.firstChild.insertBefore(spin, li.firstChild.firstChild); ul.append(li); window.currentSearch = element.value; wait_until = 1000*2; interval = 1000/5; counter = 1; window.search_countdown = setInterval(function () { //document.getElementById('search_countdown').innerHTML = parseFloat((wait_until-counter*interval)/1000).toFixed(1); counter++; }, interval); if (window.xhr) {window.xhr.abort();} window.autocomplete = setTimeout(function () { clearTimeout(window.search_countdown); if (1 || typeof window.currentSearch == 'undefined' || window.currentSearch !== window.oldSearch) { window.xhr = new XMLHttpRequest(); window.xhr.onerror = function(event) { //alert('ERROR: ' + JSON.stringify(event)); //alert('Sökningen avbröts'); } window.xhr.onabort = function(event) { // alert('ABORT: ' + JSON.stringify(event)); } window.xhr.onreadystatechange = function() { if (typeof i == 'undefined') { i = 0; } else { //clearTimeout(myVar); } /* if (typeof myVar == 'undefined') { console.log('myVar fanns inte'); } else { console.log('myVar fanns'); clearTimeout(myVar); myVar = null; if (typeof myVar == 'undefined') { console.log('myVar fanns inte igen'); } else { console.log('myVar fanns igen'); } } */ //window.autocomplete = setTimeout(function () { if (window.xhr.readyState == 4) { if (window.xhr.status == 200) { // if (xhr.readyState == 4 && xhr.status == 200) { headers = smart_split(xhr.getAllResponseHeaders().trim(), /[\r\n]+/, ': '); type = smart_split('mime-type=' + headers['content-type'], '; ', '='); if (window.xhr.response && type['mime-type'].indexOf('json')) { try { quoteWhileLoading = JSON.parse(window.xhr.response).quote; document.querySelector('ul#instant-search').innerHTML = ''; if (JSON.parse(window.xhr.response).total) { // tidigare .hits code_li = document.createElement('li'); //code_li.style.display = 'block'; code_li.innerHTML = JSON.parse(xhr.response).total; ul.append(code_li); } if (element.value.mblength == 1 && window.location.host == 'xn--skmotorn-n4a.se') { code_li = document.createElement('li'); code_li.style.display = 'block'; cp = element.value.split("\u{200D}"); // codepoints /* code_li.innerHTML = ''; */ code_li.innerHTML = ''; ul.append(code_li); } resLi = document.createElement('li'); resLi.id = 'quick-result'; resUl = document.createElement('ul'); if (JSON.parse(window.xhr.response).gps) { //alert('GPS'); window.getLocation(); } if (JSON.parse(window.xhr.response).hits) { JSON.parse(window.xhr.response).hits.forEach(function(el, i) { a = document.createElement('a'); if (decodeURIComponent(window.location.pathname.split('/')[window.location.pathname.split('/').length-1]) == el.id) { a.href = 'javascript: alert(\'Du är redan på denna sidan\')'; } else { a.href = el.id; } a.innerHTML = '' + (el.title ? el.title : '') + (el.relevance ? ' (' + el.relevance + ' träff' + (el.relevance == 1 ? '' : 'ar') + ')' : '') + (el.description ? ' - ' + el.description + '' : '') + (el.soon ? ' - Coming soon' : '') + '' + (el.icons ? el.icons : '') + ''; if (typeof el.image != 'undefined' && 0 == 1) { img = document.createElement('img'); img.src = JSON.parse(window.xhr.response).hits[0].image; img.classList.add('pic'); a.append(img); } li = document.createElement('li'); if (decodeURIComponent(window.location.pathname.split('/')[window.location.pathname.split('/').length-1]) == el.id) { li.classList.add('here'); } li.append(a); /* ?php if ($view == 2) { ? */ if (el.edit == 1) { edit = document.createElement('a'); edit.href = '/edit/' + el.id; edit.innerHTML = pencil + 'Ändra'; li.append(edit); } else { if (el.distance) { // window.location.host == 'igbg.se' && rightSide = document.createElement('a'); rightSide.href = el.id; rightSide.innerHTML = '' + el.distance + ''; // ' ' + li.append(rightSide); } else if (el.access == 0) { arrow = document.createElement('i'); arrow.classList.add('fa'); arrow.classList.add('fa-arrow-right'); a.append(arrow); } } /* ?php } ? */ resUl.append(li); resLi.append(resUl); ul.append(resLi); }); } if (JSON.parse(window.xhr.response).similar) { JSON.parse(window.xhr.response).similar.forEach(function(el, i) { if (el) { /* a = document.createElement('a'); a.href = el.id; a.innerHTML = '' + el.title + ' - ' + el.description + '' + ''; */ li = document.createElement('li'); li.innerHTML = el.description + '' + ''; //li.append(a); ul.append(li); } }); } if (FALSE && element.value.indexOf(' ') > -1 && element.value.match(/ /g).length > 1 && ['vad', 'var', 'hur', 'när', 'varför', 'när', 'var', 'hur', 'vem', 'vilka', 'vilken'].indexOf(element.value.split(' ')[0]) > -1) { li = document.createElement('li'); a = document.createElement('a'); a.innerHTML = question(element.value); li.append(a); ul.append(li); } arren = [...element.value.matchAll(/[\ud800-\uddfd]+/g)]; if (arren.length && document.body.classList.contains('admin')) { code_li = document.createElement('li'); code_li.style.display = 'block'; code_a = document.createElement('a'); code_a.style.display = 'block'; code_a.innerHTML = (/^[\ud800-\uddfd]+$/.test(element.value) ? 'endast' + element.value + '' : 'delvis' + arren.join('') + '') + 'document.getElementById("indicator");'; code_li.append(code_a); ul.append(code_li); } if (element.value.mblength == 1) { //console.log('happening',happening); code_li = document.createElement('li'); code_li.style.display = 'block'; /* code (AltLeft), key (Alt), keyCode (18), which (18) code (ShiftLeft), key (Shift), keyCode (16), which (16) code (OSLeft), key (Meta), keyCode (224), which (224) code (KeyA), key (a), keyCode (65), which (65) */ console.warn('window.which', window.which); code = window.which.code; // happening.code key = window.which.key; // happening.key keyCode = window.which.keyCode; // happening.keyCode which = window.which.which; // happening.which // String.fromCharCode() /* dec = key.charAt(0); dec = key.charCodeAt(0); */ // String.fromCodePoint() dec = element.value.codePointAt(0); hex = ConvertBase.dec2hex(dec); oct = ConvertBase.dec2oct(dec); bin = ConvertBase.dec2bin(dec); if (document.body.classList.contains('admin')) { code_li.innerHTML += ''; code_li.innerHTML += '
'; code_li.innerHTML += ''; } //ul.append(code_li); ul.append(code_li); // ul.insertBefore(code_li, ul.firstChild) } //if (typeof JSON.parse(window.xhr.response).hits[0].image.source != 'undefined') { if (JSON.parse(window.xhr.response).hits && typeof JSON.parse(window.xhr.response).hits[0].image != 'undefined') { li = document.createElement('li'); // a = document.createElement('a'); // a.href = JSON.parse(window.xhr.response).hits[0].id; if (JSON.parse(window.xhr.response).hits[0].image) { img = document.createElement('img'); img.src = JSON.parse(window.xhr.response).hits[0].image.source; img.alt = JSON.parse(window.xhr.response).hits[0].image.description; img.title = JSON.parse(window.xhr.response).hits[0].image.description; //img.onError='alert("Hittar inte " + this.title)'; img.onerror = function(event) { //alert(JSON.stringify(event)); this.alt = 'Det gick inte att hämta någon bild för "' + this.alt + '"'; this.title = 'Det gick inte att hämta någon bild för "' + this.title + '"'; console.error('Hittar inte bilden "' + this.alt + '"'); } img.classList.add('pic'); img.style.maxWidth = '320px'; // 50vw img.style.maxHeight = '50vh'; if (JSON.parse(window.xhr.response).hits[0].image.censoring) { img.classList.add('blur'); } // a.append(img); li.append(img); if (JSON.parse(window.xhr.response).hits[0].image.price) { price = document.createElement('span'); price.classList.add('price'); price.classList.add('yardsale'); if (JSON.parse(window.xhr.response).hits[0].image.price != '') { if (JSON.parse(window.xhr.response).hits[0].image.sale) { price.innerHTML = '' + JSON.parse(window.xhr.response).hits[0].image.price + ':- (' + JSON.parse(window.xhr.response).hits[0].image.sale + ':-' + ')'; } else { price.innerHTML = 'Kostar ' + JSON.parse(window.xhr.response).hits[0].image.price + ':-'; } } else { price.innerHTML = 'Vet inte vad priset är'; } li.append(price); li.classList.add('product'); } } imageDescription = document.createElement('p'); imageDescription.innerHTML = '' + JSON.parse(window.xhr.response).hits[0].image.description + ''; li.append(imageDescription); ul.append(li); } } catch (e) { if (e instanceof EvalError) { alert('EvalError'); } else if (e instanceof RangeError) { alert('RangeError'); } else if (e instanceof ReferenceError) { //alert('ReferenceError'); } else if (e instanceof SyntaxError) { document.querySelector('ul#instant-search li span').innerHTML = '

Felmeddelande

' + window.xhr.response + '

'; alert(e); alert(window.xhr.response); // alert('SyntaxError'); } else if (e instanceof TypeError) { alert('TypeError'); } else { // alert(e.name + e.message); alert(e + window.xhr.response); } } if (document.body.classList.contains('admin')) { // alert('Fick ett svar: ' + window.xhr.response); } //document.querySelector('.fa-spinner').style.display = 'none'; instead using document.querySelector('ul#instant-search').innerHTML = ''; clearTimeout(window.searchCountup); } else { if (document.body.classList.contains('admin')) { headers = smart_split(xhr.getAllResponseHeaders().trim(), /[\r\n]+/, ': '); type = smart_split('mime-type=' + headers['content-type'], '; ', '='); // alert('Saknar JSON'); // alert((type['mime-type'].indexOf('json') ? 'Saknar stöd för JSON\n\n' : '') + window.xhr.response); } // alert('Inget svar från server'); document.querySelector('ul#instant-search li span').innerHTML = '

Inget svar från servern 📡 Jorden till mars...bzzt...kan ni höra oss?

' + spinner + 'Försök igen'; } } else if (window.xhr.status == 0) { if (document.body.classList.contains('admin')) { //alert('Status 0'); } document.querySelector('ul#instant-search li span').innerHTML = '

Sökningen avbröts. Om du inte håller du på att ladda om sidan kan du ha tappat anslutningen till internet. 🤭

' + spinner + 'Försök igen'; // Håller du på att ladda om sidan, eller har du tappat internet? // Tappat internet eller laddat om sidan? clearTimeout(window.searchCountup); } else { getLimit = 8192; // Den verkliga gränsen verkar ligga på 8153 tecken 2022-12-10 if (encodeURIComponent(element.value).length > getLimit) { //alert('För långt svar'); document.querySelector('ul#instant-search li span').innerHTML = '

För stor sökning. Gränsen för metoden GET i protokollet HTTP är ' + getLimit + ' tecken. Du har sökt på ' + document.querySelector('[type=search]').value.length + ' tecken. Tillsammans med headers för denna AJAX-förfrågan blir det mer än vad som är tillåtet.

'; // Den får i nuläget inte vara större än } else { //alert('Kopplingen till internet verkar ha försvunnit, eller har ett annat fel inträffat ⚠️'); /* fungerar ändå inte document.querySelector('ul#instant-search li i').classList.add('fa-times'); document.querySelector('ul#instant-search li i').classList.remove('fa-spinner'); */ //document.querySelector('ul#instant-search li span').innerHTML = 'Din sökning avbröts 🚫 Har du tappat internet? Du har väl inte skrivit kod? 😉'; // 👾 document.querySelector('ul#instant-search li span').innerHTML = 'Det verkar vara tillfälliga problem med snabb-sök 🔌Vi håller antagligen redan på att lösa det. Tryck gärna på knappen med förstoringsglaset för att söka vanligt. Försök igen om en liten stund...'; // document.querySelector('ul#instant-search li span').innerHTML = document.querySelector('ul#instant-search li span').innerHTML + '' + xhr.status + ': ' + xhr.statusText + '

Du kan läsa mer om felmeddelanden här'; } document.querySelector('ul#instant-search li span').innerHTML = document.querySelector('ul#instant-search li span').innerHTML + '

Felmeddelande

' + xhr.status + ': ' + xhr.statusText + '

Visa alla'; clearTimeout(window.searchCountup); } /* } else if (xhr.status == 200) { //alert('Oklart vad som egentligen har hänt 🤔'); document.querySelector('ul#instant-search li span').innerHTML = 'Jag är inte tillräckligt smart för att veta vad som har hänt 😩 Dethär borde aldrig hända'; clearTimeout(window.searchCountup); */ } else { // alert('window.xhr.readyState: ' + window.xhr.readyState + ', window.xhr.status: ' + window.xhr.status); document.querySelector('ul#instant-search li span').innerHTML = spinnerWhileLoading + 'Bearbetar din sökning'; // Din sökning är på gång clearTimeout(window.searchCountup); } i++; //}, 5000); }; window.xhr.open('GET', '/controller/q.php?q=' + encodeURIComponent(element.value), true); // '&emoji=' + (element.value.mblength == 1 ? 'true' : 'false') // window.xhr.open('POST', '/controller/search.php', true); /* xhr.withCredentials = true; */ formData = new FormData(); formData.append('q', element.value); window.xhr.send(formData); if (document.body.contains(document.querySelector('ul#instant-search'))) { //console.log('VI TOG DEN BORT'); document.querySelector('ul#instant-search').remove(); } ul = document.createElement('ul'); ul.id = 'instant-search'; if (document.activeElement.id != 'search-text') { ul.style.display = 'none'; } spin = document.createElement('i'); spin.innerHTML = spinnerWhileLoading; spin.classList.add('fa', 'fa-spinner', 'fa-pulse'); /* spin.style.position = 'absolute'; spin.style.top = '0.5em'; spin.style.right = '0.5em'; spin.style.color = '#fff'; spin.style.fontSize = '20px'; */ li = document.createElement('li'); /* li.classList.add('fa', 'fa-spinner', 'fa-spin', 'fa-3x'); li.style.position = 'absolute'; li.style.top = '0.5em'; li.style.right = '0.5em'; li.style.color = '#fff'; li.style.border = '0'; li.style.fontSize = '20px'; */ //li.classList.add('attention'); li.innerHTML = 'Söker för fullt 😌 Har väntat i 0.0 sekunder ' + quoteWhileLoading + ''; //li.append(spin); /* wave = document.createElement('div'); wave.innerHTML = */ li.firstChild.insertBefore(spin, li.firstChild.firstChild); ul.append(li); document.querySelector('ul#list-search form').append(ul); counter = 1; window.searchCountup = setInterval(function () { document.getElementById('search-countup').innerHTML = parseFloat(counter*interval/1000).toFixed(1); time_passed = Math.round(counter*interval/1000); if (time_passed > 15) { document.getElementById('better-reload').innerHTML = 'Det kan vara bättre att göra om sökningen. Vi arbetar ständigt med att göra sökningar snabbare och mer träffsäkra'; } else if (time_passed > 20) { document.getElementById('time-passed').innerHTML = ' väldigt länge'; document.getElementById('progress-face').innerHTML = '🤔'; } else if (time_passed > 15) { document.getElementById('time-passed').innerHTML = ' länge'; document.getElementById('progress-face').innerHTML = '😅'; } else if (time_passed > 10) { document.getElementById('time-passed').innerHTML = ' ganska länge'; document.getElementById('progress-face').innerHTML = '😅'; } else if (time_passed > 5) { document.getElementById('time-passed').innerHTML = ' lite'; document.getElementById('progress-face').innerHTML = '🙂'; } else if (time_passed > 3) { document.getElementById('time-passed').innerHTML = ' ganska lite'; document.getElementById('progress-face').innerHTML = '🙂'; } counter++; }, interval); window.oldSearch = window.currentSearch; // this.value; //console.log(i + ' New search was found: ' + this.value); } else { //console.log(i + ' Old search was found: ' + this.value); //document.querySelector('ul#instant-search').style.display = 'block'; //document.querySelector('ul#instant-search li span').innerHTML = 'Onödigt att söka på exakt samma sak en gång till 😌 (' + window.oldSearch + ')'; // ⛔️🚫✋🏻 } }, wait_until); } document.querySelector('ul#list-search form').append(ul); } else { console.log('No valid instant search', happening.key); } }