Juttunetin testi sivu

Juttunetin laitetarkistus * { box-sizing: border-box; margin: 0; padding: 0; } body { font-family: ’Segoe UI’, Arial, sans-serif; background: #f7f7f7; color: #222; padding: 20px; max-width: 800px; margin: 0 auto; font-size: 1.08rem; } header { text-align: center; padding: 30px 20px 24px; } header h1 { font-size: 2rem; color: #5b2d8e; margin-bottom: 10px; line-height: 1.3; } header p { font-size: 1.1rem; color: #444; max-width: 580px; margin: 0 auto; line-height: 1.6; } .intro-box { background: #f0eaf8; border-radius: 12px; padding: 18px 22px; margin: 0 0 22px; line-height: 1.6; color: #333; font-size: 1.05rem; } .intro-box strong { color: #5b2d8e; } .test-card { background: #fff; border-radius: 14px; box-shadow: 0 2px 12px rgba(0,0,0,0.09); margin: 20px 0; overflow: hidden; } .test-header { display: flex; align-items: center; gap: 14px; padding: 18px 24px; background: #f0eaf8; border-bottom: 1px solid #ddd0f0; } .test-icon { font-size: 2.2rem; line-height: 1; } .test-title { font-size: 1.2rem; font-weight: 700; color: #5b2d8e; line-height: 1.3; } .test-subtitle { font-size: 0.95rem; color: #555; margin-top: 4px; line-height: 1.4; } .test-body { padding: 20px 24px; } .instructions { background: #fdf8ff; border-left: 4px solid #5b2d8e; border-radius: 0 8px 8px 0; padding: 14px 16px; margin-bottom: 16px; font-size: 1rem; line-height: 1.65; color: #333; } .instructions ol { margin: 8px 0 0 18px; } .instructions ol li { margin-bottom: 6px; } .status-row { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; } .status-badge { display: inline-flex; align-items: center; gap: 6px; padding: 8px 16px; border-radius: 20px; font-size: 1rem; font-weight: 600; } .badge-waiting { background: #f0eaf8; color: #555; } .badge-testing { background: #fff3cd; color: #856404; } .badge-ok { background: #d4edda; color: #155724; } .badge-warn { background: #fff3cd; color: #856404; } .badge-fail { background: #f8d7da; color: #721c24; } .result-list { list-style: none; margin: 10px 0 0; } .result-list li { padding: 9px 0; border-bottom: 1px solid #f0f0f0; font-size: 1rem; display: flex; align-items: flex-start; gap: 10px; line-height: 1.5; } .result-list li:last-child { border-bottom: none; } .ri { min-width: 22px; font-size: 1.15rem; } button.test-btn { margin-top: 16px; background: #5b2d8e; color: #fff; border: none; border-radius: 10px; padding: 13px 28px; font-size: 1.05rem; font-weight: 700; cursor: pointer; transition: background 0.2s; } button.test-btn:hover { background: #47206e; } button.test-btn:disabled { background: #aaa; cursor: not-allowed; } #camera-preview { display: none; width: 100%; max-width: 380px; border-radius: 10px; margin-top: 14px; background: #000; border: 3px solid #5b2d8e; } .camera-label { display: none; font-size: 0.95rem; color: #5b2d8e; margin-top: 6px; font-style: italic; } .speed-bar-wrap { background: #f0eaf8; border-radius: 6px; height: 16px; margin-top: 10px; overflow: hidden; display: none; } .speed-bar { height: 100%; border-radius: 6px; background: #5b2d8e; width: 0%; transition: width 0.6s; } .summary-section { background: #fff; border-radius: 14px; box-shadow: 0 2px 12px rgba(0,0,0,0.09); margin: 26px 0; padding: 28px 24px; text-align: center; display: none; } .summary-section h2 { font-size: 1.5rem; margin-bottom: 12px; color: #5b2d8e; } .summary-result { font-size: 1.25rem; font-weight: 700; padding: 10px 0; line-height: 1.4; } .summary-ok { color: #155724; } .summary-warn { color: #856404; } .summary-fail { color: #721c24; } .summary-note { font-size: 1.02rem; color: #444; margin-top: 10px; line-height: 1.6; } .run-all-wrap { text-align: center; margin: 4px 0 6px; } button#btn-run-all { background: #e8591a; color: #fff; border: none; border-radius: 12px; padding: 16px 40px; font-size: 1.15rem; font-weight: 700; cursor: pointer; transition: background 0.2s; box-shadow: 0 2px 10px rgba(232,89,26,0.22); } button#btn-run-all:hover { background: #c44a14; } /* Tekninen osio */ .tech-section { margin: 36px 0 10px; border-top: 2px dashed #c8b8e8; padding-top: 24px; } .tech-toggle { background: none; border: 1px solid #c8b8e8; border-radius: 8px; padding: 10px 18px; font-size: 0.92rem; color: #5b2d8e; cursor: pointer; display: flex; align-items: center; gap: 8px; margin: 0 auto; } .tech-toggle:hover { background: #f0eaf8; } .tech-content { display: none; background: #f8f4fc; border-radius: 10px; padding: 18px 20px; margin-top: 14px; font-size: 0.92rem; color: #444; line-height: 1.65; } .tech-content table { width: 100%; border-collapse: collapse; margin-top: 10px; } .tech-content td { padding: 7px 10px; border-bottom: 1px solid #e4d8f4; vertical-align: top; } .tech-content td:first-child { font-weight: 600; color: #5b2d8e; white-space: nowrap; width: 44%; } /* Korjausohjeet */ .fix-box { display: none; background: #fffbe6; border: 2px solid #f0c040; border-radius: 10px; margin-top: 16px; overflow: hidden; } .fix-box-header { display: flex; align-items: center; justify-content: space-between; padding: 12px 16px; background: #fef3cd; cursor: pointer; font-weight: 700; font-size: 1rem; color: #7a5700; gap: 10px; } .fix-box-header:hover { background: #fde9a2; } .fix-box-arrow { font-size: 0.85rem; transition: transform 0.2s; flex-shrink: 0; } .fix-box-body { padding: 16px 18px; display: none; font-size: 1rem; line-height: 1.7; color: #333; } .fix-box-body ol { margin: 10px 0 0 20px; } .fix-box-body ol li { margin-bottom: 8px; } .fix-box-body .fix-note { background: #fff8e1; border-left: 3px solid #f0c040; padding: 10px 14px; margin-top: 12px; border-radius: 0 6px 6px 0; font-size: 0.95rem; color: #5a4000; } .fix-box.fix-red { background: #fff5f5; border-color: #e74c3c; } .fix-box.fix-red .fix-box-header { background: #fde8e8; color: #7a1010; } .fix-box.fix-red .fix-box-header:hover { background: #fad0d0; } .fix-box.fix-red .fix-box-body .fix-note { background: #fff0f0; border-color: #e74c3c; color: #6a0000; } /* VTKL yläpalkki */ .site-topbar { background: #5b2d8e; padding: 13px 28px; display: flex; align-items: center; gap: 10px; } .site-topbar-logo { font-size: 1.1rem; font-weight: 700; color: #fff; letter-spacing: 0.01em; } .site-topbar-sub { color: rgba(255,255,255,0.65); font-size: 0.9rem; } /* Sisältöalue */ .page-content { padding: 24px 28px 10px; max-width: 860px; margin: 0 auto; } /* VTKL footer */ .site-footer { background: #2d2d2d; color: #ccc; text-align: center; font-size: 0.85rem; padding: 24px 20px 20px; margin-top: 40px; } .site-footer a { color: #c8b8e8; text-decoration: none; } .site-footer a:hover { text-decoration: underline; } @media (max-width: 540px) { header h1 { font-size: 1.5rem; } .test-title { font-size: 1.05rem; } button.test-btn, button#btn-run-all { width: 100%; } .page-content { padding: 16px 14px 10px; } .site-topbar { padding: 12px 16px; } }

🔧 Toimiiko laitteeni Juttunetissä?

Tämä tarkistus kertoo, toimiiko tietokoneesi tai tablettisi hyvin Juttunetissä.
Se kestää vain muutaman minuutin.

Juttunetissä voi kirjoittaa viestejä muille (kuten ilmoitustaululle) ja pitää kahvilakeskusteluja videon välityksellä. Tämä tarkistus varmistaa, että laitteesi sopii molempiin.
🌐
Tarkistus 1 – Toimiiko selain oikein?
Juttunetti toimii verkkoselaimessa, kuten Chrome tai Firefox
Tähän ei tarvitse tehdä mitään — painettuasi ”Aloita tarkistus”, tämä tarkistetaan automaattisesti.
⏳ Ei vielä tarkistettu
    💻
    Tarkistus 2 – Onko selain tarpeeksi uusi?
    Kahvilakeskustelut videolla vaativat melko uuden selaimen
    Tätä ei tarvitse erikseen tehdä — tarkistus tapahtuu automaattisesti. Jos selaimesi on vanha, neuvomme päivittämään sen.
    ⏳ Ei vielä tarkistettu
      🛠️ Näin vaihdat selaimen — paina tästä auki

      Internet Explorer on liian vanha Juttunetille. Hyvä uutinen: uuden selaimen asentaminen on ilmaista ja turvallista.

      Asenna Google Chrome näin:

      1. Avaa tietokoneellasi Internet Explorer tai jokin muu selain.
      2. Kirjoita osoitepalkkiin: www.google.fi/chrome ja paina Enter.
      3. Paina sivulla olevaa sinistä ”Lataa Chrome” -nappia.
      4. Tietokone lataa asennusohjelman. Se tallentuu yleensä ”Lataukset”-kansioon.
      5. Avaa ladattu tiedosto kaksoisnapsauttamalla sitä.
      6. Seuraa asennuksen ohjeita — paina vain ”Seuraava” tai ”Hyväksy” kunnes asennus on valmis.
      7. Chrome avautuu automaattisesti. Tule takaisin tähän sivuun Chromella ja paina ”Aloita tarkistus” uudelleen.
      💬 Digiopastajalle: Jos käyttäjällä on Windows 10 tai 11, Microsoft Edge on jo valmiina koneessa — ei tarvitse ladata mitään. Edge löytyy hakemalla ”Edge” tehtäväpalkin hakukentästä.
      🛠️ Näin päivität selaimen — paina tästä auki

      Selaimesi on niin vanha, ettei se osaa välittää videokuvaa. Päivittäminen ratkaisee yleensä ongelman.

      Päivitä Chrome näin:

      1. Avaa Chrome-selain.
      2. Katso oikeaan yläkulmaan — siellä on kolme pistettä pystysuoraan (⋮). Paina niitä.
      3. Avautuvasta valikosta valitse ”Ohje” ja sitten ”Tietoja Google Chromesta”.
      4. Chrome tarkistaa päivitykset automaattisesti. Jos päivitys on saatavilla, se latautuu itsestään.
      5. Kun päivitys on valmis, paina ”Käynnistä uudelleen” -nappia.
      6. Tule takaisin tähän sivuun ja paina ”Aloita tarkistus” uudelleen.
      💬 Digiopastajalle: Jos päivittäminen ei auta, suosittele asentamaan Chrome uudestaan osoitteesta www.google.fi/chrome. Varmista myös, että Windows on ajantasainen (Windows Update).
      📷
      Tarkistus 3 – Toimiiko kamera ja mikrofoni?
      Kahvilakeskusteluun tarvitaan kamera ja mikrofoni — tai kuulokkeet mikrofonilla
      Näin tarkistat kameran ja mikrofonin:
      1. Paina alla olevaa vihreää ”Salli kamera ja mikrofoni” -nappia.
      2. Selain kysyy lupaa: ”Haluatko sallia sivuston käyttää kameraasi?”
        Paina Salli tai Allow — tämä on turvallista.
      3. Jos kamera toimii, näet oman kuvasi ruudulla.
      4. Jos näet itsesi — homma toimii! 🎉

      Ei näy kuvaa? Tarkista, ettei kannettavan kansi tai erillinen kameran suojus ole suljettu. Joissain tietokoneissa on myös fyysinen kameran sulkija — pieni liukusäädin kameran vieressä.
      ⏳ Ei vielä tarkistettu
        👆 Tässä sinä olet! Kamera toimii.
        🛠️ Näin annat luvan kameralle uudelleen — paina tästä auki

        Olet aiemmin kieltänyt sivulta kameran käytön. Näin muutat sen:

        Google Chromessa:

        1. Katso selaimen osoitepalkkia sivun yläosassa. Osoitepalkin oikeassa reunassa näkyy pieni kamerakuvake 📷 tai lukon kuva 🔒.
        2. Paina tätä kuvaketta.
        3. Avautuu pieni valikko. Etsi sieltä ”Kamera” ja ”Mikrofoni”.
        4. Muuta molempien asetus ”Estetty” → ”Salli”.
        5. Paina sivun lopussa olevaa ”Lataa sivu uudelleen” -nappia tai paina F5-näppäintä näppäimistöllä.
        6. Paina sen jälkeen uudelleen ”Salli kamera ja mikrofoni” -nappia.

        Microsoft Edgessä:

        1. Paina osoitepalkin lukko- tai kamerakuvaketta.
        2. Valitse ”Sivuston oikeudet” → muuta kamera ja mikrofoni sallituiksi.
        3. Lataa sivu uudelleen.
        💬 Digiopastajalle: Jos käyttäjä ei löydä lupakuvaketta, Chromessa voi mennä myös: Asetukset → Tietosuoja ja turvallisuus → Sivuston asetukset → Kamera/Mikrofoni → poista sivu ”Estetty”-listalta.
        🛠️ Näin tarkistat kameran — paina tästä auki

        Kameraa ei löydy laitteeltasi. Kokeile näitä asioita järjestyksessä:

        1. Tarkista kameran suojus: Monissa kannettavissa on pieni liukusäädin kameran edessä. Siirrä se auki-asentoon.
        2. Tarkista, onko kansi tarpeeksi auki: Kannettavissa kamera on näytön yläreunassa — avaa näyttö kunnolla.
        3. Jos käytät erillistä kameraa (USB-kaapelilla kiinnitetty): Tarkista, että kaapeli on kunnolla kiinni sekä kamerassa että tietokoneessa.
        4. Käynnistä tietokone uudelleen: Sulje kaikki ohjelmat, käynnistä uudelleen ja kokeile testi uudelleen.
        5. Tarkista, käyttääkö jokin muu ohjelma kameraa: Jos Zoom, Teams tai jokin muu ohjelma on auki ja käyttää kameraa, se voi estää tätä sivua käyttämästä sitä. Sulje muut ohjelmat.
        💬 Digiopastajalle: Windows 10/11:ssä voi tarkistaa laitehallinnasta (Device Manager), näkyykö kamera lainkaan. Jos kamera näkyy keltaisella huutomerkillä, ajuri voi olla rikki — kokeile päivittää ajuri tai asenna se uudelleen.
        🛠️ Kuva on musta tai näkyy huonosti — paina tästä auki
        1. Tarkista valaistus: Istu niin, että valo tulee kasvoillesi edestäpäin — esimerkiksi ikkunan tulisi olla edessäsi, ei takana.
        2. Puhdista kamera: Pyyhi kameran linssi pehmeällä liinalla — se voi olla sormenjälkien tai pölyn peitossa.
        3. Tarkista suojus: Varmista, ettei kameran edessä ole liukusäädin tai tarra.
        4. Sulje muut ohjelmat: Jos jokin muu ohjelma käyttää kameraa samaan aikaan, kuva voi olla musta. Sulje Zoom, Teams tai muut vastaavat.
        5. Kokeile ladata sivu uudelleen ja anna kameralupa uudelleen.
        💬 Digiopastajalle: Musta kuva voi johtua myös siitä, että selain on saanut kameralle luvan, mutta jokin muu sovellus pitää kameran varattuna. Windowsissa Task Managerista voi tarkistaa, mitkä ohjelmat ovat käynnissä.
        📡
        Tarkistus 4 – Onko verkkoyhteys riittävä?
        Kahvilakeskusteluun tarvitaan kohtuullinen nettiyhteys
        Tarkistus mittaa, kuinka nopeasti laitteesi saa tietoa internetistä. Videokeskustelua varten yhteyden pitää olla riittävän nopea — suunnilleen kuin suoratoistovideon katseluun.

        Vinkki: Jos käytät wifi-yhteyttä, siirry lähemmäs reititintä (se ”boksi” josta wifi tulee) parempaa yhteyttä varten.
        ⏳ Ei vielä tarkistettu
          🛠️ Näin parannat nettiyhteyttä — paina tästä auki

          Verkkoyhteys on tällä hetkellä hidas. Kokeile näitä keinoja — useimmiten jokin niistä auttaa:

          1. Siirry lähemmäs reititintä. Reititin on se boksi, josta wifi-yhteys tulee — usein olohuoneessa tai eteisessä. Mitä lähempänä olet, sitä parempi yhteys.
          2. Sulje muut ohjelmat ja välilehdet. Jos tietokoneella on monta ohjelmaa auki tai selaimessa monta välilehteä, ne voivat hidastaa yhteyttä. Sulje turhat.
          3. Käynnistä reititin uudelleen. Irrota reititin seinästä 10 sekunniksi ja kytke takaisin. Odota noin minuutti ennen kuin kokeilet uudelleen.
          4. Kokeile eri aikaan. Illalla klo 18–21 moni käyttää nettiä samanaikaisesti, mikä voi hidastaa yhteyttä. Kokeile aamulla tai päivällä.
          5. Kokeile verkkokaapelia. Jos tietokoneessa on kaapeliliitäntä (ns. ethernet), voit kytkeä kaapelin suoraan reitittimestä tietokoneeseen — se on nopeampaa kuin wifi.
          6. Kysy apua internet-operaattoriltasi (esim. Elisa, DNA, Telia) — heiltä saa apua, jos yhteys on jatkuvasti hidas.
          💬 Digiopastajalle: Videokeskusteluun riittää noin 1,5 Mbit/s latausnopeus. Jos yhteys on alle 0,5 Mbit/s, pelkkä äänipuhelu ilman kuvaa voi silti toimia. Jitsissä voi tarvittaessa kytkeä oman kameran pois ja jättää vain ääni päälle.
          🛠️ Nettiyhteyttä ei löydy — paina tästä auki

          Laitteellasi ei näytä olevan internet-yhteyttä juuri nyt. Tarkista seuraavat:

          1. Onko wifi päällä? Tarkista tietokoneen oikeasta alareunasta wifi-kuvake 📶 — se kertoo, oletko yhdistetty verkkoon.
          2. Oletko kirjautunut wifi-verkkoon? Paina wifi-kuvaketta ja valitse oma verkkonimi (esim. kodin wifi). Anna salasana jos pyydetään.
          3. Käynnistä reititin uudelleen: Irrota se seinästä 10 sekunniksi ja kytke takaisin. Odota minuutti.
          4. Kokeile avata jokin toinen nettisivu (esim. yle.fi) — jos sekään ei aukea, ongelma on nettiyhteydessä.
          💬 Digiopastajalle: Jos sivu avautuu paikallisena tiedostona (file://), nopeustesti ei onnistu. Siirrä tiedosto palvelimelle tai testaa Chromessa. Lisäksi yritysverkoissa tai oppilaitoksissa palomuuri voi estää testikuvan lataamisen.

          📋 Yhteenveto

          Tekniset tiedot digiopastajalle tai tukihenkilölle:

          Selain
          Käyttöjärjestelmä
          Laitetyyppi
          WebRTC-tuki (kahvilakeskustelu)
          JavaScript
          Evästeet
          localStorage
          HTTPS-yhteys
          Kameralupa
          Mikrofonilupa
          Verkkoyhteyden nopeus (arvio)
          Tarkistuspäivä

          Juttunetin kahvilakeskustelut toimivat Jitsi Meet / JaaS -alustalla. Keskustelupalsta käyttää Discourse-ohjelmistoa. Molemmat vaativat WebRTC-tuen, evästeet ja JavaScriptin.

          Juttunetti • Laitetarkistus •
          var today = new Date().toLocaleDateString(’fi-FI’); document.getElementById(’test-date’).textContent = today; document.getElementById(’td-date’).textContent = today; var ua = navigator.userAgent; // Tunnista selain var browserName = ’Tuntematon’; if (/Edg\//.test(ua)) browserName = ’Microsoft Edge’; else if (/OPR\//.test(ua)) browserName = ’Opera’; else if (/Chrome\//.test(ua)) browserName = ’Google Chrome’; else if (/Firefox\//.test(ua))browserName = ’Mozilla Firefox’; else if (/Safari\//.test(ua) && !/Chrome/.test(ua)) browserName = ’Apple Safari’; else if (/Trident\//.test(ua))browserName = ’Internet Explorer (vanhentunut)’; // Tunnista OS var osName = ’Tuntematon’; if (/Windows NT 10/.test(ua)) osName = ’Windows 10/11’; else if (/Windows/.test(ua)) osName = ’Windows (vanha versio)’; else if (/Mac OS X/.test(ua)) osName = ’Mac / macOS’; else if (/iPad/.test(ua)) osName = ’iPad’; else if (/iPhone/.test(ua)) osName = ’iPhone’; else if (/Android/.test(ua)) osName = ’Android’; else if (/Linux/.test(ua)) osName = ’Linux’; var isMobile = /Mobi|Android|iPhone|iPad/.test(ua); var deviceType = isMobile ? ’Mobiililaite / tabletti’ : ’Tietokone’; document.getElementById(’td-browser’).textContent = browserName; document.getElementById(’td-os’).textContent = osName; document.getElementById(’td-device’).textContent = deviceType; document.getElementById(’td-https’).textContent = (location.protocol === ’https:’ || location.hostname === ’localhost’) ? ’Kyllä ✅’ : ’Ei ⚠️’; var scores = { js: null, browser: null, cam: null, speed: null }; function setBadge(id, type, text) { var el = document.getElementById(id); el.className = ’status-badge badge-’ + type; el.textContent = text; } function addResult(listId, icon, text) { var li = document.createElement(’li’); li.innerHTML = ’’ + icon + ’’ + text + ’’; document.getElementById(listId).appendChild(li); } function clearResults(listId) { document.getElementById(listId).innerHTML = ”; } // — TESTI 1: JS & evästeet — function testJS() { clearResults(’result-js’); setBadge(’badge-js’, ’testing’, ’🔄 Tarkistetaan…’); setTimeout(function() { var ok = true; addResult(’result-js’, ’✅’, ’Selain toimii — Juttunetti avautuu normaalisti’); document.getElementById(’td-js’).textContent = ’Kyllä ✅’; var cookieOk = navigator.cookieEnabled; if (cookieOk) { addResult(’result-js’, ’✅’, ’Selain muistaa kirjautumisesi — voit pysyä sisäänkirjautuneena’); document.getElementById(’td-cookies’).textContent = ’Kyllä ✅’; } else { addResult(’result-js’, ’❌’, ’Selain ei muista kirjautumistasi. Sinun täytyy ehkä kirjautua joka kerta uudelleen. Ota evästeet käyttöön selaimen asetuksista tai pyydä apua.’); document.getElementById(’td-cookies’).textContent = ’Ei ❌’; ok = false; } var lsOk = false; try { localStorage.setItem(’_jtest’, ’1’); localStorage.removeItem(’_jtest’); lsOk = true; } catch(e) {} document.getElementById(’td-ls’).textContent = lsOk ? ’Kyllä ✅’ : ’Ei ⚠️’; if (!lsOk) { addResult(’result-js’, ’⚠️’, ’Selain ei talletaa tietoja kunnolla. Saattaa aiheuttaa pieniä ongelmia kirjautuessa.’); ok = false; } scores.js = ok ? ’ok’ : ’fail’; setBadge(’badge-js’, ok ? ’ok’ : ’fail’, ok ? ’✅ Selain toimii’ : ’❌ Ongelma havaittu’); checkSummary(); }, 600); } // — TESTI 2: Selainyhteensopivuus — function testBrowser() { clearResults(’result-browser’); setBadge(’badge-browser’, ’testing’, ’🔄 Tarkistetaan…’); setTimeout(function() { var warn = false; var isIE = /Trident\//.test(ua); var rtcOk = !!(window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection); var isHttps = location.protocol === ’https:’ || location.hostname === ’localhost’; if (isIE) { addResult(’result-browser’, ’❌’, ’Selaimesi on Internet Explorer, joka on liian vanha Juttunetille.’); showFix(’fix-browser-old’); warn = true; } else { addResult(’result-browser’, ’✅’, ’Selaimesi on ’ + browserName + ’ — sopii Juttunetiin’); } document.getElementById(’td-webrtc’).textContent = rtcOk ? ’Kyllä ✅’ : ’Ei ❌’; if (rtcOk) { addResult(’result-browser’, ’✅’, ’Selaimesi pystyy välittämään videokuvaa — kahvilakeskustelut onnistuvat’); } else { addResult(’result-browser’, ’❌’, ’Selaimesi ei tue videokeskusteluja.’); showFix(’fix-browser-rtc’); warn = true; } addResult(’result-browser’, isMobile ? ’📱’ : ’💻’, isMobile ? ’Käytät mobiililaitetta tai tablettia — toimii Juttunetissä’ : ’Käytät tietokonetta — erinomainen valinta Juttunetille’); if (!isHttps) { addResult(’result-browser’, ’⚠️’, ’Huomio digiopastajalle: sivu ei toimi HTTPS-yhteydellä, mikä voi estää kameran käytön.’); warn = true; } scores.browser = warn ? ’warn’ : ’ok’; setBadge(’badge-browser’, warn ? ’warn’ : ’ok’, warn ? ’⚠️ Tarkista huomiot’ : ’✅ Selain on hyvä’); checkSummary(); }, 700); } // — TESTI 3: Kamera & mikrofoni — var camStream = null; function testCamera() { clearResults(’result-cam’); setBadge(’badge-cam’, ’testing’, ’🔄 Pyydetään lupaa…’); if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) { addResult(’result-cam’, ’❌’, ’Selaimesi ei tue kameraa tai mikrofonia.’); showFix(’fix-browser-rtc’); setBadge(’badge-cam’, ’fail’, ’❌ Ei onnistu’); document.getElementById(’td-cam’).textContent = ’Ei tuettu ❌’; document.getElementById(’td-mic’).textContent = ’Ei tuettu ❌’; scores.cam = ’fail’; checkSummary(); return; } addResult(’result-cam’, ’ℹ️’, ’Selain kysyy nyt lupaa kameraan ja mikrofoniin — paina ”Salli” tai ”Allow” aukeaavasta ikkunasta.’); navigator.mediaDevices.getUserMedia({ video: true, audio: true }) .then(function(stream) { camStream = stream; var preview = document.getElementById(’camera-preview’); preview.srcObject = stream; preview.style.display = ’block’; document.getElementById(’camera-label’).style.display = ’block’; var tracks = stream.getTracks(); var hasVideo = tracks.some(function(t) { return t.kind === ’video’; }); var hasAudio = tracks.some(function(t) { return t.kind === ’audio’; }); document.getElementById(’td-cam’).textContent = hasVideo ? ’Sallittu ✅’ : ’Ei löydy ⚠️’; document.getElementById(’td-mic’).textContent = hasAudio ? ’Sallittu ✅’ : ’Ei löydy ⚠️’; if (hasVideo) { addResult(’result-cam’, ’✅’, ’Kamera toimii — näet oman kuvasi ruudun alareunassa’); } else { addResult(’result-cam’, ’⚠️’, ’Kameraa ei löydy tästä laitteesta.’); showFix(’fix-cam-notfound’); } if (hasAudio) { addResult(’result-cam’, ’✅’, ’Mikrofoni toimii — muut kuulevat sinut kahvilakeskustelussa’); } else { addResult(’result-cam’, ’⚠️’, ’Mikrofonia ei löydy. Tarkista, onko kuulokkeet tai mikrofoni kytketty laitteeseen.’); showFix(’fix-cam-notfound’); } if (hasVideo && hasAudio) { addResult(’result-cam’, ’🎉’, ’Kaikki kunnossa — olet valmis kahvilakeskusteluihin!’); } addResult(’result-cam’, ’ℹ️’, ’Kamera sammuu automaattisesti, kun suljet tämän selaimen välilehden.’); var allOk = hasVideo && hasAudio; scores.cam = allOk ? ’ok’ : ’warn’; setBadge(’badge-cam’, allOk ? ’ok’ : ’warn’, allOk ? ’✅ Kamera ja mikrofoni toimivat’ : ’⚠️ Tarkista laitteet’); checkSummary(); }) .catch(function(err) { document.getElementById(’td-cam’).textContent = ’Lupa evätty / virhe ❌’; document.getElementById(’td-mic’).textContent = ’Lupa evätty / virhe ❌’; if (err.name === ’NotAllowedError’ || err.name === ’PermissionDeniedError’) { addResult(’result-cam’, ’❌’, ’Annoit ”Estä”-luvan kameralle tai mikrofonille.’); showFix(’fix-cam-denied’); } else if (err.name === ’NotFoundError’) { addResult(’result-cam’, ’❌’, ’Kameraa tai mikrofonia ei löydy tästä laitteesta.’); showFix(’fix-cam-notfound’); } else { addResult(’result-cam’, ’❌’, ’Kamera tai mikrofoni ei avautunut. Kokeile ladata sivu uudelleen.’); showFix(’fix-cam-notfound’); } scores.cam = ’fail’; setBadge(’badge-cam’, ’fail’, ’❌ Ei onnistunut’); checkSummary(); }); } // — TESTI 4: Verkkoyhteyden nopeus — function testSpeed() { clearResults(’result-speed’); setBadge(’badge-speed’, ’testing’, ’🔄 Mitataan…’); document.getElementById(’speed-bar-wrap’).style.display = ’block’; document.getElementById(’speed-bar’).style.width = ’5%’; var testUrl = ’https://upload.wikimedia.org/wikipedia/commons/3/3f/Bikesgray.jpg’; var imageSize = 232000; var rounds = 3; var results = []; function loadOnce(callback) { var img = new Image(); var t0 = Date.now(); img.onload = function() { var ms = Date.now() – t0; callback(((imageSize * 8) / (ms / 1000)) / 1000000); }; img.onerror = function() { callback(null); }; img.src = testUrl + ’?r=’ + Math.random(); } function runRound(n) { if (n >= rounds) { var valid = results.filter(function(x) { return x !== null; }); var avg = valid.length ? valid.reduce(function(a,b){return a+b;},0) / valid.length : 0; showSpeedResult(avg); return; } loadOnce(function(mbps) { results.push(mbps); document.getElementById(’speed-bar’).style.width = (Math.round(((n + 1) / rounds) * 80) + 10) + ’%’; runRound(n + 1); }); } runRound(0); } function showSpeedResult(mbps) { document.getElementById(’speed-bar’).style.width = ’100%’; var rounded = Math.round(mbps * 10) / 10; document.getElementById(’td-speed’).textContent = rounded + ’ Mbit/s (arvio)’; if (mbps = 5) { addResult(’result-speed’, ’✅’, ’Verkkoyhteys on erinomainen — videokeskustelut sujuvat ongelmitta’); scores.speed = ’ok’; setBadge(’badge-speed’, ’ok’, ’✅ Yhteys on hyvä’); } else if (mbps >= 1.5) { addResult(’result-speed’, ’✅’, ’Verkkoyhteys on riittävä videokeskusteluun’); scores.speed = ’ok’; setBadge(’badge-speed’, ’ok’, ’✅ Yhteys riittää’); } else if (mbps >= 0.5) { addResult(’result-speed’, ’⚠️’, ’Verkkoyhteys on melko hidas. Videokuva voi ajoittain pätkiä tai jumiutua.’); showFix(’fix-speed-slow’); scores.speed = ’warn’; setBadge(’badge-speed’, ’warn’, ’⚠️ Yhteys on hieman hidas’); } else { addResult(’result-speed’, ’❌’, ’Verkkoyhteys on liian hidas videokeskusteluun tällä hetkellä.’); showFix(’fix-speed-slow’); scores.speed = ’fail’; setBadge(’badge-speed’, ’fail’, ’❌ Yhteys liian hidas’); } addResult(’result-speed’, ’ℹ️’, ’Tämä on suuntaa-antava arvio — todellinen nopeus voi vaihdella.’); checkSummary(); } // — Kaikki testit kerralla — function runAll() { testJS(); setTimeout(testBrowser, 400); setTimeout(testSpeed, 900); // Kameratesti jätetään käyttäjän käynnistettäväksi (vaatii luvan) document.getElementById(’badge-cam’).className = ’status-badge badge-waiting’; document.getElementById(’badge-cam’).textContent = ’👆 Paina alla olevaa nappia’; } // — Yhteenveto — function checkSummary() { var vals = [scores.js, scores.browser, scores.cam, scores.speed]; if (vals.some(function(v) { return v === null; })) return; var hasFail = vals.includes(’fail’); var hasWarn = vals.includes(’warn’); var section = document.getElementById(’summary-section’); var resultEl = document.getElementById(’summary-result’); var noteEl = document.getElementById(’summary-note’); section.style.display = ’block’; if (hasFail) { resultEl.textContent = ’❌ Laitteessa on ongelma, joka voi haitata Juttunetin käyttöä’; resultEl.className = ’summary-result summary-fail’; noteEl.innerHTML = ’Katso yllä olevat punaiset merkinnät. Niissä kerrotaan, mitä pitää korjata.

          Voit myös näyttää tämän sivun digiopastajallesi — avaa alla oleva tekninen osio ja näytä se hänelle.’; } else if (hasWarn) { resultEl.textContent = ’⚠️ Laite toimii — mutta jokin asia kannattaa tarkistaa’; resultEl.className = ’summary-result summary-warn’; noteEl.innerHTML = ’Juttunettiä voi käyttää, mutta keltaisissa huomioissa on asioita, jotka voivat aiheuttaa pieniä hankaluuksia.

          Halutessasi näytä tämä sivu digiopastajallesi.’; } else { resultEl.textContent = ’✅ Hienoa! Laitteesi sopii Juttunetiin!’; resultEl.className = ’summary-result summary-ok’; noteEl.innerHTML = ’Kaikki toimii hyvin. Voit nyt siirtyä Juttunetiin, lukea viestejä ja osallistua kahvilakeskusteluihin.

          Tervetuloa mukaan! ☕’; } section.scrollIntoView({ behavior: ’smooth’, block: ’start’ }); } // — Korjausohjeiden avaus/sulku — function toggleFix(id) { var body = document.getElementById(’body-’ + id); var arrow = document.getElementById(’arrow-’ + id); if (body.style.display === ’block’) { body.style.display = ’none’; if (arrow) arrow.style.transform = ’rotate(0deg)’; } else { body.style.display = ’block’; if (arrow) arrow.style.transform = ’rotate(180deg)’; } } function showFix(id) { var box = document.getElementById(id); if (box) box.style.display = ’block’; } // — Tekninen osio — function toggleTech() { var content = document.getElementById(’tech-content’); var btn = document.getElementById(’tech-btn’); if (content.style.display === ’block’) { content.style.display = ’none’; btn.textContent = ’🔍 Näytä tekniset tiedot digiopastajalle’; } else { content.style.display = ’block’; btn.textContent = ’🔼 Piilota tekniset tiedot’; } }