1 2<!doctype html> 3<html class="diks-no-js diks-site--ylakarjala diks-user--is-not-logged-in diks-user--is-not-subscriber diks-user--is-not-company-subscriber diks-site--layout-master diks-site--ads-disabled-from-page-level" lang="fi" prefix="og: http://ogp.me/ns#"> 4 <head> 5 <meta charset="utf-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1"> 7 <title>Sovellus | Ylä-Karjala</title> 8 <link id="diks-stylesheet" rel="stylesheet" href="https://a.ylakarjala.fi/styles/e5576057/styles/diks-news.css"> 9 <link rel="dns-prefetch" href="https://cdn.gravito.net"> 10 <link rel="dns-prefetch" href="https://cdn.gravito.network"> 11 <link rel="dns-prefetch" href="https://handshake.gravito.network"> 12
12<script> 13 14 const checkUserPreferenceEnabled = 1; 15 const darkmodeStylesheet = "https://a.ylakarjala.fi/styles/e5576057/styles/diks-news-darkmode.css"; 16 const defaultStylesheet = "https://a.ylakarjala.fi/styles/e5576057/styles/diks-news.css"; 17 const savedTheme = localStorage.getItem('theme'); 18 const stylesheet = document.getElementById("diks-stylesheet"); 19 20 // Check local storage for saved theme 21 if ( savedTheme == 'darkmode' ) { 22 stylesheet.href = darkmodeStylesheet; 23 document.documentElement.classList.add('diks-theme--darkmode'); 24 } 25 // Check user's theme preference through an OS setting or a user agent setting 26 else if ( checkUserPreferenceEnabled && savedTheme != 'default' && ( window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ) ) { 27 stylesheet.href = darkmodeStylesheet; 28 document.documentElement.classList.add('diks-theme--darkmode'); 29 } 30 else { 31 document.documentElement.classList.add('diks-theme--default'); 32 } 33 34 35 // Darkmode toggle switch 36 document.addEventListener('DOMContentLoaded', function () { 37 const darkmodeButton = document.getElementById("diks-darkmode-toggler"); 38 39 if (darkmodeButton) { 40 // Set darkmode button to checked if darkmode is already on 41 // Check local storage for saved theme 42 if (savedTheme == 'darkmode' ) { 43 darkmodeButton.checked = true; 44 } 45 // Check user's theme preference through an OS setting or a user agent setting 46 else if ( checkUserPreferenceEnabled && savedTheme != 'default' && ( window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ) ) { 47 darkmodeButton.checked = true; 48 } 49 50 // Change theme based on darkmode button checked/unchecked 51 darkmodeButton.addEventListener("click", function() { 52 // Swap out the URL for the different stylesheets 53 if ( stylesheet.getAttribute("href") == defaultStylesheet ) { 54 stylesheet.href = darkmodeStylesheet; 55 document.documentElement.classList.remove('diks-theme--default'); 56 document.documentElement.classList.add('diks-theme--darkmode'); 57 // Save theme to local storage 58 window.localStorage.setItem('theme', 'darkmode'); 59 } else { 60 stylesheet.href = defaultStylesheet; 61 document.documentElement.classList.remove('diks-theme--darkmode'); 62 document.documentElement.classList.add('diks-theme--default'); 63 // Save theme to local storage 64 window.localStorage.setItem('theme', 'default'); 65 } 66 // Dispatch event ThemeChanged when theme inside Local Storage changes 67 window.dispatchEvent(new Event("ThemeChanged")); 68 }); 69 } 70 }, false); 71 72 </script>
72 73 74 <link rel="preload" href="/gravito-cmp.js" as="script"> 75 <link rel="preload" href="https://cdn.gravito.net/sdk/v6/latest/sdk.js" as="script"><link rel="preload" href="https://r209.ylakarjala.fi/script.js" as="script"> 76
76<script> 77 window.JankkoSSOConfig = { 78 accountOrigin: "YLKA" 79 }; 80 </script>
80 81 82 83
83<script id="jankko-sso-script" src="https://sso.ylakarjala.fi/assets/jankko-sso-client.modern.min.js"></script>
83 84 85 86 87 88 89
89<script> 90 // Hyphenopoly library initialization. The library will add soft-hyphen characters into the content if the 91 // browser doesn't support CSS hyphenation. For debugging on macOS Chrome: require: { 'fi': 'FORCEHYPHENOPOLY' } 92 const Hyphenopoly = { 93 require: { 'fi': 'yhdyssanahirviö' }, 94 setup: { 95 defaultLanguage: "fi", 96 selectors: { '.diks-card__title': { minWordLength: 11, leftmin: 4, rightmin: 4 }, '.diks-article__headline': { minWordLength: 11, leftmin: 4, rightmin: 4 }, '.diks-parallax-content .diks-article-box .diks-sub-headline': { minWordLength: 11, leftmin: 4, rightmin: 4 } } 97 } 98 } 99 console.log('Hyphenopoly settings:', Hyphenopoly.setup) 100 101 // Helper function for hyphenating content that was added after pageload. We must query a nodelist and iterate 102 // each node because the library can't handle a nodelist. 103 // https://mnater.github.io/Hyphenopoly/Hyphenators.html 104 // https://github.com/mnater/Hyphenopoly/issues/92#issuecomment-597728300 105 const diksHyphenateContent = (containerSelector) => { 106 if (!Hyphenopoly.hyphenators) { 107 return 108 } 109 Hyphenopoly.hyphenators["HTML"].then((hyphenator) => { 110 for (const itemSelector in Hyphenopoly.setup.selectors) { 111 const containerNode = document.querySelector(containerSelector) 112 const itemNodeList = containerNode.querySelectorAll(itemSelector) 113 itemNodeList.forEach((itemNode) => { hyphenator(itemNode, itemSelector) }) 114 } 115 }) 116 } 117 </script>
117 118
118<script src="https://a.ylakarjala.fi/styles/e5576057/includes/hyphenopoly/Hyphenopoly_Loader.js"></script>
118 119
119<script src="/theme/css/includes/waypoints/lib/noframework.waypoints.min.js"></script>
119 120 <link rel="icon" type="image/png" href="/favicon.png" sizes="96x96" /><link rel="icon" href="/favicon.ico" sizes="48x48"><link rel="icon" href="/favicon.svg" sizes="any" type="image/svg+xml" /><link rel="apple-touch-icon" href="/icon-180.png"/><meta name="theme-color" content="#FFFFFF" media="(prefers-color-scheme: light)" /> 121 <meta name="theme-color" content="#121416" media="(prefers-color-scheme: dark)" /><link rel="alternate" type="application/rss+xml" title="Ylä-Karjala" href="https://www.ylakarjala.fi/feed/rss"><meta name="robots" content="max-image-preview:large">
121<script> 122 var pageData = {}; 123 124 pageData.section = { 125 'name': 'Sovellus', 126 'uname': 'asenna', 127 'url': 'https\u003A\/\/www.ylakarjala.fi\/asenna\/' 128 } 129 pageData.publication = { 130 'name': 'ylakarjala', 131 'url': 'https\u003A\/\/www.ylakarjala.fi\/', 132 'engage': 'YLKA', 133 'paywallEnabled': true, 134 'registrationWallEnabled': true, 135 'env':'prod' 136 } 137 pageData.user = {} 138 pageData.companyUser = {} 139 140 function isPwa() { 141 // window.navigator.standalone = iOS 142 // window.matchMedia('(display-mode: standalone)').matches = Android/universal 143 return (window.navigator.standalone) || 144 (["fullscreen", "standalone", "minimal-ui"].some( 145 function(displayMode) { return window.matchMedia('(display-mode: ' + displayMode + ')') 146 .matches })); 147 } 148 149 pageData.general = { 150 'browseMode': (isPwa() ? 'pwa' : 'browser') 151 } 152</script>
152 153 <meta property="og:site_name" content="Ylä-Karjala"> 154 <meta property="og:locale" content="fi_FI"><meta name='description' content='Sovellus sisältää tuoreet juttumme, joita ilmestyy ympäri vuorokauden vuoden jokaisena päivänä sekä näköislehtemme liitteineen sekä näköislehtien arkiston.'> 155<meta property='og:title' content='Sovellus | Ylä-Karjala'> 156<meta property='og:description' content='Sovellus sisältää tuoreet juttumme, joita ilmestyy ympäri vuorokauden vuoden jokaisena päivänä sekä näköislehtemme liitteineen sekä näköislehtien arkiston.'> 157<meta property='og:url' content='https://www.ylakarjala.fi/asenna/'> 158<meta property='og:type' content='webpage'><meta property='og:image' content='https://a.ylakarjala.fi/styles/e5576057/images/default/og-image-ylakarjala.jpg'> 159<meta property='og:image:width' content='1200'> 160<meta property='og:image:height' content='630'> 161 <link rel="manifest" href="/manifest.webmanifest"> 162 <style>@media (max-width: 600px) { .gravitoCMP-footer { margin-top: 1.5em; } }</style> 163
163<script type="text/javascript">window.cX = window.cX || {};// Async load of cx.js 164 (function(d,s,e,t){e=d.createElement(s);e.type='text/java'+s;e.async='async'; 165 e.src='http'+('https:'===location.protocol?'s://s':'://')+'cdn.cxense.com/cx.js'; 166 t=d.getElementsByTagName(s)[0];t.parentNode.insertBefore(e,t);})(document,'script'); 167 </script>
167 168
168<script src="https://a.ylakarjala.fi/styles/e5576057/js/blueconic/dialog.min.js"></script>
168 169
169<script> 170 BCinst = 'blueconic'; 171 BCshortcode = 'YLKA'; 172 </script>
172<script src="https://a.ylakarjala.fi/styles/e5576057/js/blueconic/events.min.js"></script>
172 173
173<script> 174 const BCPlatform = "web"; 175 const BCChannel = 'YLKA'; 176 177 const BCArticleViewProperties = {}; 178 const BCSessionStartProperties = {}; 179 180 BCArticleViewProperties["platform"] = BCPlatform; 181 BCArticleViewProperties["channel"] = BCChannel; 182 BCSessionStartProperties["platform"] = BCPlatform; 183 BCSessionStartProperties["channel"] = BCChannel; 184 185 const BCArticleID = pageData?.article?.id || ''; 186 const BCArticleMarketingCategories = pageData?.article?.marketingCategories || []; 187 const BCArticleTopics = pageData?.article?.topics || []; 188 189 if (BCArticleID) { 190 BCArticleViewProperties["articleID"] = BCArticleID; 191 } 192 193 if (Array.isArray(BCArticleMarketingCategories) && BCArticleMarketingCategories.length > 0) { 194 BCArticleViewProperties["marketing_categories"] = BCArticleMarketingCategories.join(', '); 195 } 196 197 if (Array.isArray(BCArticleTopics) && BCArticleTopics.length > 0) { 198 BCArticleViewProperties["tags"] = BCArticleTopics.join(', '); 199 } 200 201 const BCEventParams = { 202 currentPage: '/asenna/' || null, 203 pageType: 'section' || null, 204 dependenciesTimeout: 5000, 205 inHouseAdEnabled: true, 206 articleViewEventEnabled: true, 207 articleViewProperties: BCArticleViewProperties, 208 sessionStartEventEnabled: true, 209 sessionStartProperties: BCSessionStartProperties, 210 recommendationsEnabled: false, 211 recommendationsMaxItems: 3, 212 recommendationsTitle: 'Luitko\u0020jo\u0020n\u00E4m\u00E4\u003F' 213 }; 214 InitializeEventScript(BCEventParams); 215 </script>
215<script> 216 window.BCDatalayer = []; 217 </script>
217<script> 218 (function () { 219 window.BCscriptInjected = false; 220 var scriptSrc = ''; 221 222 scriptSrc = 'https://r209.ylakarjala.fi/script.js'; 223 224 window.addEventListener( 225 "gravito:tcfv2:client", 226 function (event) { 227 let eventType = event.detail.eventType; 228 let consentUpdateEventsList = [ 229 "layer1:opt-out:all", 230 "layer2:opt-out:all", 231 "layer2:opt-in:selected", 232 "layer1:opt-in:all", 233 "layer2:opt-in:all", 234 "opt-in:previously", 235 ]; 236 if (consentUpdateEventsList.includes(eventType) && window.BCscriptInjected === false) { 237 window.BCscriptInjected = true; 238 239 var script = document.createElement("script"); 240 script.src = scriptSrc; 241 document.head.appendChild(script); 242 } 243 }, 244 true 245 ); 246 }()); 247 </script>
247 248 249
249<script type='text/javascript'> 250 (function() { 251 /** CONFIGURATION START **/ 252 var _sf_async_config = window._sf_async_config = (window._sf_async_config || {}); 253 _sf_async_config.uid = 60754; 254 _sf_async_config.domain = location.host.replace("www.",""); 255 _sf_async_config.flickerControl = false; 256 _sf_async_config.useCanonical = true; 257 _sf_async_config.useCanonicalDomain = true; 258 /** CONFIGURATION END **/ 259 })(); 260 </script>
260<script> 261 function configureChartbeat(userType) { 262 /** CONFIGURATION START **/ 263 var _sf_async_config = window._sf_async_config = (window._sf_async_config || {}); 264 _sf_async_config.sections = pageData && pageData.section ? pageData.section.name : ''; 265 _sf_async_config.authors = pageData && pageData.article && Array.isArray(pageData.article.authors) ? pageData.article.authors.toString() : ''; 266 267 if (userType) { 268 var _cbq = window._cbq = (window._cbq || []); 269 _cbq.push(['_acct', userType]); 270 } 271 /** CONFIGURATION END **/ 272 function loadChartbeat() { 273 var e = document.createElement('script'); 274 var n = document.getElementsByTagName('script')[0]; 275 e.type = 'text/javascript'; 276 e.async = true; 277 e.src = 'https://static.chartbeat.com/js/chartbeat.js'; 278 n.parentNode.insertBefore(e, n); 279 } 280 loadChartbeat(); 281 }; 282 283 if (typeof JankkoSSOClient !== 'undefined') { 284 JankkoSSOClient.getSession().then(function(data) { 285 if (data && data.user && data.user.id) { 286 var userType = Array.isArray(data.permissions) && data.permissions.includes("paywall") ? 'paid' : 'lgdin'; 287 288 configureChartbeat(userType); 289 } else { 290 configureChartbeat('anon'); 291 } 292 }).catch(function(error) { 293 configureChartbeat('anon'); 294 }); 295 } else { 296 configureChartbeat('anon'); 297 } 298 </script>
298 299
299<script> 300 const gtmContainerId = 'GTM-KTJNB7R'; 301 const sendDatalayerPush = Boolean(1); 302 const context = 'sec'; 303 304 (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 305 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 306 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 307 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 308 })(window,document,'script','dataLayer',gtmContainerId); 309 310 if (sendDatalayerPush) { 311 window.dataLayer.push({'event':'pageDataPush','pageData': window.pageData}); 312 } 313 314 (async function () { 315 const paywallEnabled = window?.pageData?.publication?.paywallEnabled ?? true; 316 const registrationWallEnabled = window?.pageData?.publication?.registrationWallEnabled ?? true; 317 318 const user = {}; 319 const companyUser = {}; 320 321 let articleState; 322 let articlePaywall = 'free'; // free is always the safer fallback 323 324 if (context === 'art') { 325 if (window?.pageData?.article?.effectivePaywall) { 326 articlePaywall = window.pageData.article.effectivePaywall; 327 } else if (window?.pageData?.article?.paywall){ 328 articlePaywall = window.pageData.article.paywall; 329 } 330 331 if ((articlePaywall === 'free' || !paywallEnabled) || (articlePaywall === "registered" && !registrationWallEnabled)) { 332 articleState = "full"; 333 } 334 else { 335 articleState = 'preview'; 336 } 337 } 338 339 function getCookie(name) { 340 name = name + '='; 341 const decodedCookie = decodeURIComponent(document.cookie); 342 const cookies = decodedCookie.split(';'); 343 for (let i = 0; i < cookies.length; i++) { 344 const cookie = cookies[i].trim(); 345 if (cookie.indexOf(name) === 0) { 346 return cookie.substring(name.length, cookie.length); 347 } 348 } 349 } 350 351 function pushDataLayerEvent() { 352 let segmentsCookie = getCookie('jankkosegments'); 353 354 if (segmentsCookie) { 355 let segmentsData = JSON.parse(segmentsCookie); 356 let segments = segmentsData.segments; 357 358 if (segments && typeof segments === 'object') { 359 user.segments = segments; 360 } 361 } 362 const pageData = { 363 'user': user,
364 'companyUser': companyUser 365 }; 366 if (context === 'art') { 367 pageData.article = { 'state': articleState }; 368 } 369 if (sendDatalayerPush) { 370 window.dataLayer.push({'event': 'userDataPush', 'pageData': pageData }); 371 } 372 } 373 374 async function modifyDatalayerData() { 375 const sessionData = await JankkoSSOClient.getSession(); 376 if (!sessionData) { 377 return; 378 } 379 380 user.id = sessionData?.personal?.personal_user_id; 381 user.products = sessionData?.personal?.personal_active_products; 382 user.permissions = sessionData?.personal?.personal_permissions; 383 384 companyUser.id = sessionData?.company?.company_user_id ?? null; 385 companyUser.products = sessionData?.company?.company_active_products ?? null; 386 companyUser.permissions = sessionData?.company?.company_permissions ?? null; 387 388 const permissions = sessionData?.permissions ?? []; 389 if (context === 'art') { 390 var userIsLoggedIn = false;if ((articlePaywall != "free" && permissions.includes("paywall") && articlePaywall != "registered") || (userIsLoggedIn === true && articlePaywall === "registered")) { 391 articleState = "full"; 392 } 393 } 394 } 395 396 try { 397 await modifyDatalayerData(); 398 } 399 catch (error) { 400 console.warn(error); 401 } 402 403 pushDataLayerEvent(); 404 }()); 405 406 </script>
406 407 408 </head> 409 <body class="diks-body diks-body--page-type-apps"> 410 <!-- Google Tag Manager (noscript) -->
vendor: 72 bytes, lines 410-411
410 411 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
411GTM-KTJNB7R
vendor: 95 bytes, lines 411-413
411" 412 height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 413
413<!-- End Google Tag Manager (noscript) --> 414
414<script src='/gravito-cmp.js'></script>
414 415 416 417 418 419 <header id="main-header" class="diks-header diks-header diks-header--is-fixed"> 420 <div class="diks-skip-link-navigation diks-skip-link-navigation--top"> 421 <ul class="diks-navigation diks-navigation--skip-links"> 422 <li class="diks-navigation__item"> 423 <a class="diks-button diks-button--primary diks-a11y__screen-reader diks-a11y__screen-reader--focusable" href="#sisalto" >Siirry suoraan sisältöön</a> 424 </li> 425 </ul> 426 </div> 427 428 <div class="diks-header-wrapper"> 429 <div class="diks-container diks-container--header"> 430 <div class="diks-header-container"><div class="diks-header__navigation-container diks-header__navigation-container--left"> 431 <button class="diks-button diks-button--icon-only diks-button--ghost diks-navigation__link js-diks-toggler diks-dropdown-toggler diks-dropdown-toggler--main" id="diks-dropdown-toggle" data-toggle="diks-dropdown-navigation" aria-expanded="false" aria-controls="diks-dropdown-navigation" aria-label="Valikko"><span class="diks-icon diks-icon--size-m" aria-hidden="true"><svg role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24"> 432 <path fill-rule="evenodd" d="M22 6H2V4H22V6ZM22 13H2V11H22V13ZM22 20H2V18H22V20Z" clip-rule="evenodd"/> 433</svg> 434</span><span class="diks-icon diks-icon--size-m diks-icon--hidden" aria-hidden="true"><svg role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24"> 435 <path fill-rule="evenodd" d="M10.5858 12L4.2218 5.63603L5.63602 4.22182L12 10.5858L18.3639 4.22183L19.7782 5.63605L13.4142 12L19.7782 18.364L18.3639 19.7782L12 13.4142L5.63602 19.7782L4.2218 18.364L10.5858 12Z" clip-rule="evenodd"/> 436</svg> 437</span></button> 438 439 <div class="diks-dropdown-navigation" id="diks-dropdown-navigation"> 440 <button id="diks-close-dropdown-main-nav" class="diks-button diks-button--outline diks-dropdown-navigation__close-button diks-a11y__screen-reader diks-a11y__screen-reader--focusable">Sulje valikko</button><div class="diks-dropdown-navigation__sign-container"> 441 <img src="https://a.ylakarjala.fi/styles/e5576057/images/logos/keskisuomalainen-sign.svg" class="diks-logo diks-dropdown-navigation__sign" alt="Keskisuomalainen Oyj"> 442 </div><form id="dropdown-navigation-search" name="dropdownnavigationsearch" class="diks-form diks-form--fluid" action="/haku/" method="get"> 443 <div class="diks-form__field-wrapper diks-form__field-wrapper--padding-right diks-form__field-wrapper--required"><input class="diks-form__field" type="search" name="q" id="dropdown-navigation-searchSearch1" aria-label="Haku" placeholder="Hae sivustolta" required value=""></div> 444 445 <div class="diks-form__field-wrapper diks-form__field-wrapper--submit-button-icon-only"> 446 <button class="diks-form__submit" type="submit" id="dropdown-navigation-searchSubmitbutton2"><span class="diks-icon diks-icon--color-primary" aria-hidden="true"><svg role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24"> 447 <path fill-rule="evenodd" d="M9.5 4C6.46243 4 4 6.46243 4 9.5C4 12.5376 6.46243 15 9.5 15C12.5376 15 15 12.5376 15 9.5C15 6.46243 12.5376 4 9.5 4ZM2 9.5C2 5.35786 5.35786 2 9.5 2C13.6421 2 17 5.35786 17 9.5C17 11.2106 16.4273 12.7874 15.4632 14.0493L19.7782 18.3642L18.3639 19.7784L14.049 15.4634C12.7872 16.4274 11.2105 17 9.5 17C5.35786 17 2 13.6421 2 9.5Z" clip-rule="evenodd"/> 448</svg> 449</span>Hae 450 </button> 451 </div> 452 </form> <nav class="diks-navigation-wrapper diks-navigation-wrapper--border-bottom diks-navigation-wrapper--border-top" ><ul class="diks-navigation diks-navigation--row diks-navigation--mobile-row diks-navigation--no-active-links diks-navigation--size-s" id="dropdown-highlights-nav"><li class="diks-navigation__item " ><a class="diks-navigation__link " href="/asenna/">Sovellus</a></li><li class="diks-navigation__item " ><a class="diks-navigation__link " href="/nakoislehti/">Lehdet</a></li><li class="diks-navigation__item diks-navigation__item--button diks-navigation__item--align-right diks-hide-from-subscribers" ><a class="diks-navigation__link diks-bc-order-button" href="/jatka/">Tilaa</a></li></ul> 453 </nav> <nav class="diks-navigation-wrapper diks-navigation-wrapper--divider-bottom" ><ul class="diks-navigation diks-navigation--no-active-links diks-navigation--size-s" id="dropdown-customer-upper-nav"><li class="diks-navigation__item " ><a class="diks-navigation__link " href="https://oma.media.fi/yla-karjala/"><span class="diks-icon diks-icon--size-m" aria-hidden="true"><svg role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24"> 454 <path d="M17 8H22V17H19.1875V20.8125L14.1045 17H9V13.4307L4.4375 17.0811V13H2V3H17V8ZM17 13H11V15H14.7705L17.1875 16.8125V15H20V10H17V13ZM4 11H6.4375V12.918L8.5625 11.2188L8.83691 11H15V5H4V11Z"/> 455</svg> 456</span>Asiakaspalvelu</a></li><li class="diks-navigation__item " ><a class="diks-navigation__link " href="https://oma.media.fi/yla-karjala/yhteystiedot/juttuvinkki/"><span class="diks-icon diks-icon--size-m" aria-hidden="true"><svg role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24"> 457 <path fill-rule="evenodd" d="M7.38197 4H16.618L17.618 6H22V20H2V6H6.38197L7.38197 4ZM8.61803 6L7.61803 8H4V18H20V8H16.382L15.382 6H8.61803ZM12 11C10.8954 11 10 11.8954 10 13C10 14.1046 10.8954 15 12 15C13.1046 15 14 14.1046 14 13C14 11.8954 13.1046 11 12 11ZM8 13C8 10.7909 9.79086 9 12 9C14.2091 9 16 10.7909 16 13C16 15.2091 14.2091 17 12 17C9.79086 17 8 15.2091 8 13Z" clip-rule="evenodd"/> 458</svg> 459</span>Lähetä juttuvinkki</a></li></ul> 460 </nav> <nav class="diks-navigation-wrapper " ><ul class="diks-navigation diks-navigation--light" id="dropdown-section-nav"><li class="diks-navigation__item " ><a class="diks-navigation__link " href="/">Etusivu</a></li><li class="diks-navigation__item " ><a class="diks-navigation__link " href="/uusimmat/">Uusimmat</a></li><li class="diks-navigation__item " ><a class="diks-navigation__link " href="/luetuimmat/">Luetuimmat</a></li><li class="diks-navigation__item " ><a class="diks-navigation__link " href="/paikalliset">Uutiset</a></li><li class="diks-navigation__item " ><a class="diks-navigation__link " href="/paakirjoitus-mielipide/">Mielipiteet</a></li><li class="diks-navigation__item " ><a class="diks-navigation__link " href="/aihe/blogit">Blogit</a></li><li class="diks-navigation__item " ><a class="diks-navigation__link " href="/aihe/menneilta-vuosilta">Menneiltä vuosilta</a></li><li class="diks-navigation__item " ><a class="diks-navigation__link " href="https://pohjois-karjala.menoinfo.fi/fi-FI?sort=startDate&area=area-143">Menoinfo</a></li></ul> 461 </nav><!-- ESI start element "recommendedTopics" generated at 25-09-2026 04:44:16.018018 --> <nav class="diks-navigation-wrapper diks-navigation-wrapper--divider-top" ><ul class="diks-navigation diks-navigation--light diks-navigation--size-s" ><li class="diks-navigation__item " ><a class="diks-navigation__link " href="/aihe/yla-karjalan-visat">Ylä-Karjalan visat</a></li></ul> 462 </nav><!-- ESI end element "recommendedTopics" --><!-- ESI start element "promotedAdvertisers" generated at 25-09-2026 04:48:30.397458 --><!-- ESI end element "promotedAdvertisers" --> <nav class="diks-navigation-wrapper diks-navigation-wrapper--divider-top" ><h2 class="diks-navigation__title">Yhteystiedot</h2><ul class="diks-navigation diks-navigation--light diks-navigation--size-s" id="dropdown-customer-nav"><li class="diks-navigation__item " ><a class="diks-navigation__link " href="https://www.meks.fi/mainonta/alueet/savon-media/">Mediamyynti</a></li><li class="diks-navigation__item " ><a class="diks-navigation__link " href="https://oma.media.fi/yla-karjala/yhteystiedot/">Kaikki yhteystiedot</a></li></ul> 463 </nav><div class="diks-navigation-wrapper diks-navigation-wrapper--divider-top"><h2 class="diks-navigation__title">Ulkoasu</h2><label for="diks-darkmode-toggler" class="diks-form__switch"> 464 <span class="diks-form__switch-label"><span class="diks-icon diks-icon--size-m" aria-hidden="true"><svg role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24"> 465 <path fill-rule="evenodd" d="M13.7547 1.76065L11.7581 3.75666C10.6708 4.8436 10 6.34252 10 8C10 11.3137 12.6863 14 16 14C17.6575 14 19.1564 13.3292 20.2433 12.2419L22.2394 10.2453L21.9451 13.0531C21.4182 18.0815 17.1674 22 12 22C6.47715 22 2 17.5229 2 12C2 6.83263 5.91855 2.58178 10.9469 2.05488L13.7
465547 1.76065ZM8.70749 4.70657C5.93176 5.9617 4 8.75566 4 12C4 16.4183 7.58172 20 12 20C15.2443 20 18.0383 18.0682 19.2934 15.2925C18.289 15.7468 17.1738 16 16 16C11.5817 16 8 12.4183 8 8C8 6.82623 8.25316 5.71105 8.70749 4.70657Z" clip-rule="evenodd"/> 466</svg> 467</span>Käytä tummaa tilaa</span> 468 <div class="diks-form__switch-wrapper"> 469 <input id="diks-darkmode-toggler" class="diks-form__switch-input" type="checkbox"> 470 <span class="diks-form__switch-slider"></span> 471 </div> 472 </label> 473 </div></div> <nav class="diks-navigation-wrapper " ><ul class="diks-navigation diks-navigation--main diks-navigation--size-s diks-navigation--row diks-navigation--mobile-row diks-navigation--no-active-links diks-hide-below-large" ><li class="diks-navigation__item " ><a class="diks-navigation__link " href="/uusimmat/"><span class="diks-icon diks-hide-above-large" aria-hidden="true"><svg role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24"> 474 <path fill-rule="evenodd" d="M12 4a8 8 0 100 16 8 8 0 000-16zM2 12C2 6.477 6.477 2 12 2s10 4.477 10 10-4.477 10-10 10S2 17.523 2 12zm9-6h2v5.586l2.707 2.707-1.414 1.414L11 12.414V6z" clip-rule="evenodd"/> 475</svg> 476</span>Uusimmat</a></li><li class="diks-navigation__item " ><a class="diks-navigation__link " href="/luetuimmat/"><span class="diks-icon diks-hide-above-large" aria-hidden="true"><svg role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24"> 477 <path fill-rule="evenodd" d="M11.03 3.455c1.168-1.438 3.495-.652 3.55 1.2l.117 3.845h6a1.25 1.25 0 0 1 1.229 1.484l-1.905 10A1.25 1.25 0 0 1 18.793 21H9.06a1.25 1.25 0 0 1-.559-.132L6.764 20H3.25C2.56 20 2 19.44 2 18.75v-8.5C2 9.56 2.56 9 3.25 9h3.274l4.506-5.545ZM8 10.355v8.027L9.236 19h8.936l1.62-8.5h-5.58a1.5 1.5 0 0 1-1.499-1.455l-.131-4.33L8 10.356Zm10.056 9.255ZM4 11v7h2v-7H4Zm14.793 8.75.145.027Z" clip-rule="evenodd"/> 478</svg> 479</span>Luetuimmat</a></li><li class="diks-navigation__item " ><a class="diks-navigation__link " href="/nakoislehti/"><span class="diks-icon diks-hide-above-large" aria-hidden="true"><svg role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24"> 480 <path fill-rule="evenodd" d="M4 2H20V22H4V2ZM6 4V20H18V4H6ZM8 6H16V12H8V6ZM10 8V10H14V8H10ZM16 15H8V13H16V15ZM16 18H8V16H16V18Z" clip-rule="evenodd"/> 481</svg> 482</span>Lehdet</a></li><li class="diks-navigation__item diks-navigation__item--button diks-navigation__item--align-right diks-hide-above-medium diks-hide-from-subscribers" ><a class="diks-navigation__link diks-bc-order-button" href="/jatka/">Tilaa</a></li></ul> 483 </nav></div><div class="diks-header__logo-container"><a class="diks-logo__link diks-header__logo-link diks-header__main-logo-link" href="/"><img src="https://a.ylakarjala.fi/styles/e5576057/images/logos/ylakarjala.svg" class="diks-logo diks-logo--default diks-header__logo diks-header__main-logo" alt="Ylä-Karjala"><img src="https://a.ylakarjala.fi/styles/e5576057/images/logos/ylakarjala-white.svg" class="diks-logo diks-logo--darkmode diks-header__logo diks-header__main-logo" alt="Ylä-Karjala"></a> 484 </div><div class="diks-header__navigation-container diks-header__navigation-container--right"><a class="diks-bc-order-button diks-button diks-button--primary diks-button--size-m diks-hide-from-subscribers diks-hide-below-medium " href="/jatka/">Tilaa</a><div class="diks-user-navigation-wrapper"> 485 <button class="diks-button diks-button--icon-only diks-button--ghost diks-navigation__link diks-dropdown-toggler diks-dropdown-toggler--user" aria-expanded="false" id="diks-sso-user" data-diks-toggle="diks-user-navigation" data-diks-toggle-class="diks-user-navigation" aria-controls="diks-user-navigation"><span class="diks-icon diks-icon--size-m" aria-hidden="true"><svg role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24"> 486 <path fill-rule="evenodd" d="M4 12a8 8 0 1 1 13.496 5.814c-1.216-1.593-3.262-2.602-5.491-2.602-2.231 0-4.28 1.011-5.495 2.607A7.978 7.978 0 0 1 4 12Zm4.04 6.953A7.963 7.963 0 0 0 12 20a7.964 7.964 0 0 0 3.966-1.05c-.83-1.087-2.254-1.84-3.961-1.84-1.71 0-3.135.754-3.965 1.843ZM12 2C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2Zm.005 5.898c-1.247 0-2.305 1.049-2.305 2.4 0 1.353 1.058 2.402 2.305 2.402s2.305-1.05 2.305-2.401c0-1.352-1.058-2.4-2.305-2.4Zm-4.203 2.4C7.802 7.952 9.658 6 12.005 6c2.347 0 4.203 1.95 4.203 4.299 0 2.348-1.856 4.299-4.203 4.299-2.347 0-4.203-1.951-4.203-4.3Z" clip-rule="evenodd"/> 487</svg> 488</span><span class="diks-icon diks-icon--size-m diks-icon--hidden" aria-hidden="true"><svg role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24"> 489 <path fill-rule="evenodd" d="M10.5858 12L4.2218 5.63603L5.63602 4.22182L12 10.5858L18.3639 4.22183L19.7782 5.63605L13.4142 12L19.7782 18.364L18.3639 19.7782L12 13.4142L5.63602 19.7782L4.2218
48918.364L10.5858 12Z" clip-rule="evenodd"/> 490</svg> 491</span></button> 492 493 <div class="diks-navigation diks-sub-navigation diks-user-navigation" id="diks-user-navigation"> 494 <button id="diks-close-dropdown-user-nav" class="diks-button diks-button--outline diks-dropdown-navigation__close-button diks-a11y__screen-reader diks-a11y__screen-reader--focusable">Sulje valikko</button> 495 <p id="diks-sso-username" class="diks-user-navigation__username diks-hide-from-company-subscribers"></p><p class="diks-user-navigation__username diks-show-for-company-subscribers">Yritystilaus tunnistettu</p><div class="diks-show-for-company-subscribers"><p>Voit käyttää palvelun kaikkia sisältöjä vapaasti. Jos haluat kommentoida, kirjaudu sisään henkilökohtaisella Mediatunnuksella.</p></div> <ul class="diks-navigation diks-navigation--size-m" id="diks-sso-links"><li class="diks-navigation__item " ><a class="diks-navigation__link " href="javascript:window.gravito.cmp.openPreferences();">Evästevalinnat</a></li></ul> 496 </div> 497</div> 498 </div> 499 </div> 500 </div> 501 </div><div class="diks-section-navigation-wrapper"> 502 <div class="diks-container diks-container--narrow-mobile diks-container--full-width-before-l"> 503 <nav class="diks-navigation-wrapper diks-navigation-wrapper--border-bottom" aria-label="Osastovalikko"><ul class="diks-navigation diks-navigation--row diks-navigation--light diks-navigation--centered diks-navigation--mobile-row diks-navigation--draggable diks-navigation--size-xs diks-navigation--active-subtle" id="osastovalikko"><li class="diks-navigation__item " ><a class="diks-navigation__link " href="/paikalliset"draggable="false">Uutiset</a></li><li class="diks-navigation__item " ><a class="diks-navigation__link " href="/paakirjoitus-mielipide/"draggable="false">Mielipiteet</a></li><li class="diks-navigation__item " ><a class="diks-navigation__link " href="/aihe/blogit"draggable="false">Blogit</a></li><li class="diks-navigation__item " ><a class="diks-navigation__link " href="/aihe/menneilta-vuosilta"draggable="false">Menneiltä vuosilta</a></li><li class="diks-navigation__item " ><a class="diks-navigation__link " href="https://pohjois-karjala.menoinfo.fi/fi-FI?sort=startDate&area=area-143"draggable="false">Menoinfo</a></li></ul> 504 </nav> 505 </div> 506 </div><div class="diks-quicklinks-wrapper"> 507 <div class="diks-container diks-container--narrow-mobile"> 508 <nav class="diks-navigation-wrapper " ><ul class="diks-navigation diks-navigation--main diks-navigation--size-s diks-navigation--row diks-navigation--mobile-row diks-navigation--no-active-links diks-navigation--centered diks-hide-above-large" ><li class="diks-navigation__item " ><a class="diks-navigation__link " href="/uusimmat/"><span class="diks-icon diks-hide-above-large" aria-hidden="true"><svg role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24"> 509 <path fill-rule="evenodd" d="M12 4a8 8 0 100 16 8 8 0 000-16zM2 12C2 6.477 6.477 2 12 2s10 4.477 10 10-4.477 10-10 10S2 17.523 2 12zm9-6h2v5.586l2.707 2.707-1.414 1.414L11 12.414V6z" clip-rule="evenodd"/> 510</svg> 511</span>Uusimmat</a></li><li class="diks-navigation__item " ><a class="diks-navigation__link " href="/luetuimmat/"><span class="diks-icon diks-hide-above-large" aria-hidden="true"><svg role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24"> 512 <path fill-rule="evenodd" d="M11.03 3.455c1.168-1.438 3.495-.652 3.55 1.2l.117 3.845h6a1.25 1.25 0 0 1 1.229 1.484l-1.905 10A1.25 1.25 0 0 1 18.793 21H9.06a1.25 1.25 0 0 1-.559-.132L6.764 20H3.25C2.56 20 2 19.44 2 18.75v-8.5C2 9.56 2.56 9 3.25 9h3.274l4.506-5.545ZM8 10.355v8.027L9.236 19h8.936l1.62-8.5h-5.58a1.5 1.5 0 0 1-1.499-1.455l-.131-4.33L8 10.356Zm10.056 9.255ZM4 11v7h2v-7H4Zm14.793 8.75.145.027Z" clip-rule="evenodd"/> 513</svg> 514</span>Luetuimmat</a></li><li class="diks-navigation__item " ><a class="diks-navigation__link " href="/nakoislehti/"><span class="diks-icon diks-hide-above-large" aria-hidden="true"><svg role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24"> 515 <path fill-rule="evenodd" d="M4 2H20V22H4V2ZM6 4V20H18V4H6ZM8 6H16V12H8V6ZM10 8V10H14V8H10ZM16 15H8V13H16V15ZM16 18H8V16H16V18Z" clip-rule="evenodd"/> 516</svg> 517</span>Lehdet</a></li><li class="diks-navigation__item diks-navigation__item--button diks-navigation__item--align-right diks-hide-above-medium diks-hide-from-subscribers" ><a class="diks-navigation__link diks-bc-order-button" href="/jatka/">Tilaa</a></li></ul> 518 </nav> 519 </div> 520 </div><div id="diks-dropdown-navigation-shade" class="diks-dropdown-navigation-shade"></div></header>
520<script src="/theme/css/includes/waypoints/lib/noframework.waypoints.min.js"></script>
520 521
521<script> 522 // Fix forEach for IE 523 if (window.NodeList && !NodeList.prototype.forEach) { 524 NodeList.prototype.forEach = Array.prototype.forEach; 525 } 526 527 // Element.closest() needs a polyfill for older browsers. 528 // While we only need the closest() functionality for mobile browsers, 529 // we don't want the code to fail even on old desktop browsers. 530 // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill 531 // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Browser_compatibility 532 if (!Element.prototype.matches) { 533 Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector; 534 } 535 536 if (!Element.prototype.closest) { 537 Element.prototype.closest = function(s) { 538 var el = this; 539 540 do { 541 if (el.matches(s)) return el; 542 el = el.parentElement || el.parentNode; 543 } while (el !== null && el.nodeType === 1); 544 return null; 545 }; 546 } 547 548 (function () { 549 if (typeof JankkoSSOClient !== 'undefined') { 550 var stringToHTML = function (htmlString) { 551 var div = document.createElement('div'); 552 div.innerHTML = htmlString.trim(); 553 return div.firstChild; 554 }; 555 556 var showUserRelatedItems = function(personalData) { 557 var usernameElement = document.querySelector('#diks-sso-username'); 558 if (usernameElement) { 559 usernameElement.innerHTML = personalData.full_name; 560 } 561 562 var linksElement = document.querySelector('#diks-sso-links'); 563 if (linksElement) { 564 var myAccountLink = stringToHTML('<li class="diks-navigation__item"><a class="diks-navigation__link" href="'+JankkoSSOClient.serviceUrls.myAccount+'">Omat tiedot</a></li>'); 565 var logoutForm = stringToHTML('<li class="diks-navigation__item diks-navigation__item--logout"><form id="logout-form" action="'+JankkoSSOClient.serviceUrls.logout+'" method="post"><input class="diks-navigation__link" type="submit" value="Kirjaudu ulos"></form></li>'); 566 linksElement.insertBefore(myAccountLink, linksElement.childNodes[0]); 567 linksElement.appendChild(logoutForm); 568 } 569 570 var htmlElement = document.querySelector('.diks-user--is-not-logged-in'); // Class is set to main html element 571 if (htmlElement) { 572 htmlElement.classList.replace('diks-user--is-not-logged-in', 'diks-user--is-logged-in'); 573 } 574 } 575 576 var showMenuLinksForLoggedOutUser = function() { 577 const linksElement = document.querySelector('#diks-sso-links'); 578 if (!linksElement) { 579 return; 580 } 581 582 // Pidetään vain tietyt query-parametrit. Alunperin tässä poistettiin kaikki query-parametrit. 583 // @todo Selvitetään voisiko tässä sallia kaikki query-parametrit. 584 const currentUrlObject = new URL(window.location.href); 585 const returnUrlObject = new URL(`${currentUrlObject.origin}${currentUrlObject.pathname}`); 586 const allowedParams = ['limit-active-products']; 587 allowedParams.forEach(function(name) { 588 if (currentUrlObject.searchParams.get(name)) { 589 returnUrlObject.searchParams.set(name, currentUrlObject.searchParams.get(name)); 590 } 591 }); 592 593 const loginPageUrlObject = new URL(`${window.location.origin}/kirjaudu/`); 594 loginPageUrlObject.searchParams.set('returnUrl', returnUrlObject.toString()); 595 const loginLinkString = `<li class="diks-navigation__item"><a class="diks-navigation__link" href="${loginPageUrlObject.toString()}">Kirjaudu</a></li>`; 596 597 linksElement.insertBefore(stringToHTML(loginLinkString), linksElement.childNodes[0]); 598 } 599 600 var showCompanyUserRelatedItems = function(companyData) { 601 var htmlElement = document.querySelector('.diks-user--is-not-company-subscriber'); // Class is set to main html element 602 var permissions = companyData?.company_permissions || []; 603 if (htmlElement && permissions.length) { 604 htmlElement.classList.replace('diks-user--is-not-company-subscriber', 'diks-user--is-company-subscriber'); 605 } 606 } 607 608 document.addEventListener("DOMContentLoaded", async function() { 609 try { 610 const data = await JankkoSSOClient.getSession(); 611 if (data.company?.company_user_id) { 612 showCompanyUserRelatedItems(data.company); 613 }
614 if (data.personal?.personal_user_id) { 615 showUserRelatedItems(data.personal); 616 } else { 617 showMenuLinksForLoggedOutUser(); 618 } 619 } catch (error) { 620 showMenuLinksForLoggedOutUser(); 621 } 622 }); 623 } 624 }()); 625 626 627 ////////////////////////////////////////////////////////////////////////////////////////// 628 // NAVIGATIONS 629 ////////////////////////////////////////////////////////////////////////////////////////// 630 631 // Toggle icon inside a toggler 632 function toggleTogglerIcon(toggler) { 633 togglerIcons = toggler.querySelectorAll('.diks-icon'); 634 if ( togglerIcons.length > 1 ) { 635 for (var j= 0; j < togglerIcons.length; j++) { 636 togglerIcons[j].classList.toggle('diks-icon--hidden'); 637 } 638 } 639 } 640 641 // Function for closing all dropdown navigations 642 function closeAllDropdownNavigations() { 643 closeMainDropdownNavigation(); 644 closeUserDropdownNavigation(); 645 } 646 647 // Close main nav or user nav if hidden screen reader only close navigation button is clicked 648 let closeDropdownMainNav = document.getElementById('diks-close-dropdown-main-nav'); 649 let closeDropdownUserNav = document.getElementById('diks-close-dropdown-user-nav'); 650 if ( closeDropdownMainNav ) { 651 closeDropdownMainNav.addEventListener('click', function() { 652 closeMainDropdownNavigation(); 653 }); 654 } 655 if ( closeDropdownUserNav ) { 656 closeDropdownUserNav.addEventListener('click', function(e) { 657 e.stopPropagation(); 658 closeUserDropdownNavigation(); 659 }); 660 } 661 662 // Trap focus inside opened dropdown navigation 663 document.addEventListener('keydown', function(event) { 664 // Initialize variables 665 var ssoLinks = document.getElementById('diks-sso-links'); 666 var linksUserNav = ""; 667 var firstElUserNav = ""; 668 var lastElUserNav = ""; 669 var mainDropdownLastNavLinks = document.getElementById('dropdown-customer-nav'); // Last navigation element inside of main dropdown navigation 670 var linksMainDropdownNav = ""; 671 var firstElMainDropdownNav = "" 672 var lastElMainDropdownNav = ""; 673 674 // Set user nav variable values if SSO links exist 675 if (ssoLinks) { 676 linksUserNav = ssoLinks.querySelectorAll('.diks-navigation__link'); 677 firstElUserNav = document.getElementById('diks-close-dropdown-user-nav'); 678 lastElUserNav = linksUserNav[linksUserNav.length - 1]; 679 } 680 681 // Set main dropdown nav variable values if main dropdown last nav links exist 682 if (mainDropdownLastNavLinks) { 683 linksMainDropdownNav = mainDropdownLastNavLinks.querySelectorAll('.diks-navigation__link'); 684 firstElMainDropdownNav = document.getElementById('diks-close-dropdown-main-nav'); 685 lastElMainDropdownNav = linksMainDropdownNav[linksMainDropdownNav.length - 1]; 686 } 687 688 // If darkmode-toggler is found set it as the last element of main dropdown nav 689 if ( document.getElementById('diks-darkmode-toggler') ) { 690 lastElMainDropdownNav = document.getElementById('diks-darkmode-toggler'); 691 } 692 693 // Close all dropdown navigations & reposition fixed header when ESC key is pressed 694 if (event.key === "Escape" || event.key === "Esc") { 695 closeAllDropdownNavigations(); 696 } 697 // Trap focus inside user navigation and/or main dropdown navigation when they are open 698 if (event.keyCode === 9) { 699 if (event.shiftKey && (document.activeElement === firstElUserNav || document.activeElement === firstElMainDropdownNav)) { 700 event.preventDefault(); 701 if (document.activeElement === firstElUserNav) { 702 lastElUserNav.focus(); 703 } 704 else if ( document.activeElement === firstElMainDropdownNav ) { 705 lastElMainDropdownNav.focus(); 706 } 707 } 708 else if (!event.shiftKey && (document.activeElement === lastElUserNav || document.activeElement === lastElMainDropdownNav)) { 709 event.preventDefault(); 710 if (document.activeElement === lastElUserNav) { 711 firstElUserNav.focus(); 712 } 713 else if ( document.activeElement === lastElMainDropdownNav ) { 714 firstElMainDropdownNav.focus(); 715 } 716 } 717 } 718 }); 719 720 721 ////////////////////////////////////////////////////////////////////////////////////////// 722 // User navigation 723 ////////////////////////////////////////////////////////////////////////////////////////// 724 725 let userDropdownNavigation = document.getElementById('diks-user-navigation'); // user dropdown navigation 726 let userDropdownNavigationToggler = document.getElementById('diks-sso-user'); // user dropdown navigation toggler button (opens and closes user dropdown navigation) 727 let userDropdownNavigationCloseButton = document.getElementById('diks-close-dropdown-main-nav'); // Hidden screen-reader-only close button inside user dropdown navigation 728 729 // Close user dropdown navigation if hidden screen-reader-only close button is clicked 730 if ( userDropdownNavigationCloseButton ) { 731 userDropdownNavigationCloseButton.addEventListener('click', function() { 732 closeUserDropdownNavigation(); 733 }); 734 } 735 736 function closeUserDropdownNavigation() { 737 if (userDropdownNavigation) { 738 if (userDropdownNavigation.classList.contains('diks-user-navigation--is-open')) { 739 // Close user dropdown nav by removing --is-open class 740 userDropdownNavigation.classList.remove('diks-user-navigation--is-open'); 741 // Remove --is-open class from user dropdown navigation toggler 742 userDropdownNavigationToggler.classList.remove('diks-dropdown-toggle--is-open'); 743 // Toggle icon 744 toggleTogglerIcon(userDropdownNavigationToggler); 745
746 // Set aria-expanded to false for user dropdown toggler 747 userDropdownNavigationToggler.setAttribute('aria-expanded', 'false'); 748 } 749 } 750 } 751 752 // User Navigation Dropdown 753 if (userDropdownNavigation) { 754 let userDropdownNavigationAriaControls = userDropdownNavigationToggler.getAttribute('data-diks-toggle'); // aria-controls value for user dropown navigation toggler 755 userDropdownNavigationToggler.setAttribute('aria-controls', userDropdownNavigationAriaControls); 756 userDropdownNavigationToggler.addEventListener('click', function(e) { 757 e.preventDefault(); 758 // If the main dropdown navigation is already open (contains --is-open class) close it 759 if ( (userDropdownNavigation).classList.contains('diks-user-navigation--is-open') ) { 760 closeUserDropdownNavigation(); 761 } 762 // If the main dropdown navigation isn't open (doesn't contain --is-open class) open it 763 else { 764 // If other toggles are open, close them 765 document.querySelectorAll('.diks-user-navigation--is-open').forEach(function(item) { 766 item.classList.remove('diks-user-navigation--is-open'); 767 userDropdownNavigationToggler.classList.remove('diks-dropdown-toggler--is-open'); 768 }); 769 770 // Toggle icon 771 toggleTogglerIcon(userDropdownNavigationToggler); 772 773 // Set aria-expanded 774 userDropdownNavigationToggler.setAttribute('aria-expanded', 'true'); 775 776 // Open this toggle 777 userDropdownNavigation.classList.add('diks-user-navigation--is-open'); 778 779 // Close main dropdown navigation if it's open 780 closeMainDropdownNavigation(); 781 782 // Add event listener to window when user nav toggler is clicked and user nav is open 783 window.addEventListener('click', function(e){ 784 if (document.querySelector('.diks-user-navigation-wrapper').contains(e.target)){ 785 // Clicked inside user nav, do nothing 786 } 787 else { 788 // Clicked outside user nav, close user nav 789 closeUserDropdownNavigation(); 790 } 791 }); 792 793 } 794 }); 795 } 796 797 ////////////////////////////////////////////////////////////////////////////////////////// 798 // Main navigation 799 ////////////////////////////////////////////////////////////////////////////////////////// 800 801 let mainDropdownNavigation = document.getElementById('diks-dropdown-navigation'); // main dropdown navigation 802 let mainDropdownNavigationToggler = document.getElementById('diks-dropdown-toggle'); // main dropdown navigation toggler button (opens and closes main dropdown navigation) 803 let mainDropdownNavigationShade = document.querySelector('.diks-dropdown-navigation-shade'); // shade effect that is visible when main dropdown navigation is open 804 let mainDropdownNavigationCloseButton = document.getElementById('diks-close-dropdown-main-nav'); // Hidden screen-reader-only close button inside main dropdown navigation 805 806 // Close main dropdown navigation if hidden screen-reader-only close button is clicked 807 if ( mainDropdownNavigationCloseButton ) { 808 mainDropdownNavigationCloseButton.addEventListener('click', function() { 809 closeMainDropdownNavigation(); 810 }); 811 } 812 813 // Function for closing main dropdown navigation 814 function closeMainDropdownNavigation() { 815 // Main dropdown navigation 816 if (mainDropdownNavigation) { 817 if (mainDropdownNavigation.classList.contains('diks-dropdown-navigation--is-open')) { 818 // Close main dropdown nav by removing --is-open class 819 mainDropdownNavigation.classList.remove('diks-dropdown-navigation--is-open'); 820 // Remove --is-open class from main dropdown navigation toggler 821 mainDropdownNavigationToggler.classList.remove('diks-dropdown-toggle--is-open'); 822 // Toggle icon 823 toggleTogglerIcon(mainDropdownNavigationToggler); 824 825 // Set aria-expanded to false for main dropdown toggler 826 mainDropdownNavigationToggler.setAttribute('aria-expanded', 'false'); 827 828 // Remove --is-open class from body 829 document.body.classList.remove('diks-body--dropdown-navigation-is-open'); 830 831 // Turn off shade effect 832 mainDropdownNavigationShade.classList.remove('diks-dropdown-navigation-shade--is-visible'); 833 } 834 } 835 } 836 837 838 // Main Navigation Dropdown 839 if (mainDropdownNavigation) {
840 let mainDropdownNavigationAriaControls = mainDropdownNavigationToggler.getAttribute('data-toggle'); // aria-controls value for main dropown navigation toggler 841 mainDropdownNavigationToggler.setAttribute('aria-controls', mainDropdownNavigationAriaControls); 842 mainDropdownNavigationToggler.addEventListener('click', function(e) { 843 e.preventDefault(); 844 // If the main dropdown navigation is already open (contains --is-open class) close it 845 if ( (mainDropdownNavigation).classList.contains('diks-dropdown-navigation--is-open') ) { 846 closeMainDropdownNavigation(); 847 } 848 // If the main dropdown navigation isn't open (doesn't contain --is-open class) open it 849 else { 850 // If other toggles are open, close them 851 document.querySelectorAll('.diks-dropdown-navigation--is-open').forEach(function(item) { 852 item.classList.remove('diks-dropdown-navigation--is-open'); 853 mainDropdownNavigationToggler.classList.remove('diks-dropdown-toggler--is-open'); 854 }); 855 856 // Toggle icon 857 toggleTogglerIcon(mainDropdownNavigationToggler); 858 859 // Set aria-expanded 860 mainDropdownNavigationToggler.setAttribute('aria-expanded', 'true'); 861 862 // Open this toggle 863 mainDropdownNavigation.classList.add('diks-dropdown-navigation--is-open'); 864 // Add is-open class to body 865 document.body.classList.add('diks-body--dropdown-navigation-is-open'); 866 // Turn on shade effect 867 mainDropdownNavigationShade.classList.add('diks-dropdown-navigation-shade--is-visible'); 868 869 // Close main Dropdown Navigation when visible shade area is clicked 870 document.querySelector('.diks-dropdown-navigation-shade--is-visible').addEventListener('click', function() { 871 closeMainDropdownNavigation(); 872 }); 873 874 // Close user dropdown navigation if it's open 875 closeUserDropdownNavigation(); 876 877 } 878 }); 879 } 880 881 882</script>
882 883 884 885 886 887 888 889 890 <div class="diks-note-wrapper "><div class="diks-container diks-container--narrower-mobile"> 891 <div id="diks-segment-notes"></div><div id="diks-bc-notes"></div></div></div>
891<script> 892 let segmentTeasersContainer = document.getElementById("diks-segment-notes"); 893 894 (function() { 895 function getCookie(name) { 896 name = name + '='; 897 const decodedCookie = decodeURIComponent(document.cookie); 898 const cookies = decodedCookie.split(';'); 899 900 for (let i = 0; i < cookies.length; i++) { 901 const cookie = cookies[i].trim(); 902 if (cookie.indexOf(name) == 0) { 903 return cookie.substring(name.length, cookie.length); 904 } 905 } 906 } 907 908 function injectSegmentTeasers(segmentsQueryString) { 909 var xhttp = new XMLHttpRequest(); 910 911 xhttp.onreadystatechange = function() { 912 if (this.readyState == 4 && this.status == 200) { 913 var segmentTeasers = this.responseText.trim(); 914 915 if (segmentTeasers) { 916 if (segmentTeasersContainer) { 917 segmentTeasersContainer.innerHTML = segmentTeasers; 918 } 919 } 920 else { 921 // Remove segment teaser container if there are no segment teasers 922 if (segmentTeasersContainer) { 923 segmentTeasersContainer.remove(); 924 } 925 } 926 } 927 }; 928 929 xhttp.open("GET", "/.ajax/segmentTeaser?" + segmentsQueryString, true); 930 xhttp.send(); 931 } 932 933 var segmentsCookie = getCookie('jankkosegments'); 934 935 if (segmentsCookie) { 936 var segmentsData = JSON.parse(segmentsCookie); 937 var segments = segmentsData.segments; 938 939 if (segments && typeof segments === 'object') { 940 var segmentsQueryString = ""; 941 942 Object.keys(segments).forEach(function(key, index) { 943 segmentsQueryString = index === 0 ? "" : segmentsQueryString + "&"; 944 var value = segments[key]; 945 946 if (Array.isArray(value)) { 947 value = value.join(','); 948 } 949 950 segmentsQueryString = segmentsQueryString + key + "=" + value; 951 }); 952 953 injectSegmentTeasers(segmentsQueryString); 954 } 955 } 956 else { 957 // Remove segment teaser container if there are no segment teasers 958 if (segmentTeasersContainer) { 959 segmentTeasersContainer.remove(); 960 } 961 } 962 })(); 963</script>
963 964 965 <div class="diks-custom-page diks-apps"> 966 <div class="diks-container"> 967 <div class="diks-grid"> 968 <div class="diks-column diks-column--span-4 diks-column--m-span-8 diks-column--l-span-12 diks-column--xl-span-16"><nav aria-label="Murupolku"> 969 <ul class="diks-breadcrumb"><li class="diks-breadcrumb__item"><a class="diks-breadcrumb__link" href="/">Etusivu</a></li><li class="diks-breadcrumb__item"><span class="diks-breadcrumb__sub-item">Sovellus</span></li></ul> 970 </nav></div> 971 </div> 972 <main id="sisalto"> 973 <div class="diks-apps__content-wrapper"> 974 <div class="diks-grid"> 975 <div class="diks-column diks-column--span-4 diks-column--m-span-8 diks-column--l-span-12 diks-column--xl-span-2"></div> 976 <div class="diks-column diks-column--span-4 diks-column--m-span-8 diks-column--l-span-12 diks-column--xl-span-12"> 977 <h1 class="diks-title diks-title--size-3xl" >Sovellus</h1> 978 </div> 979 <div class="diks-column diks-column--span-4 diks-column--m-span-8 diks-column--l-span-12 diks-column--xl-span-2"></div> 980 <div class="diks-column diks-column--span-4 diks-column--m-span-8 diks-column--l-span-12 diks-column--xl-span-2"></div><div class="diks-apps-installation-wrapper diks-column diks-column--span-4 diks-column--m-span-4 diks-column--l-span-6 diks-column--xl-span-6"> 981 <div class="diks-apps__icon-wrapper"> 982 <span class="diks-icon diks-icon--size-l diks-icon--color-primary" aria-hidden="true"><svg role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24"> 983 <path fill-rule="evenodd" d="M5 2H19V22H5V2ZM7 4V20H17V4H7ZM15 19H9V17H15V19Z" clip-rule="evenodd"/> 984</svg> 985</span> 986 </div> <h2 class="diks-title diks-title--size-xl" >Sovellus</h2><p>Sovellus sisältää tuoreet juttumme, joita ilmestyy ympäri vuorokauden vuoden jokaisena päivänä sekä näköislehtemme liitteineen sekä näköislehtien arkiston. Asenna sovellus laitteesi sovelluskaupasta.</p><div class="diks-apps-image-wrapper"> 987 <a class="diks-apps__app-link diks-hide-on-android" href="https://apps.apple.com/fi/app/yl%C3%A4-karjala/id6695740400"><img class="diks-apps__app-image" src="https://a.ylakarjala.fi/styles/e5576057/images/default/appstore-badge.svg" alt="Lataa sovellus App Storesta"></a> 988 <a class="diks-apps__app-link diks-hide-on-ios" href="https://play.google.com/store/apps/details?id=fi.media.ylakarjala"><img class="diks-apps__app-image" src="https://a.ylakarjala.fi/styles/e5576057/images/default/google-play-badge.svg" alt="Lataa sovellus Google Play -kaupasta"></a> 989 </div></div> 990 <div class="diks-column diks-column--span-4 diks-column--m-span-8 diks-column--l-span-12 diks-column--xl-span-2"></div> 991 </div> 992 </div> 993 </main> 994 </div> 995 </div> 996 997 <footer class="diks-footer"><div class="diks-container diks-container--narrow-mobile diks-container--full-width-before-l"> 998 <div class="diks-footer__top"> <nav class="diks-navigation-wrapper " aria-label="Osastovalikko"><ul class="diks-navigation diks-navigation--row diks-navigation--light diks-navigation--centered diks-navigation--mobile-row diks-navigation--draggable diks-navigation--size-xs diks-navigation--active-subtle" ><li class="diks-navigation__item " ><a class="diks-navigation__link " href="/paikalliset"draggable="false">Uutiset</a></li><li class="diks-navigation__item " ><a class="diks-navigation__link " href="/paakirjoitus-mielipide/"draggable="false">Mielipiteet</a></li><li class="diks-navigation__item " ><a class="diks-navigation__link " href="/aihe/blogit"draggable="false">Blogit</a></li><li class="diks-navigation__item " ><a class="diks-navigation__link " href="/aihe/menneilta-vuosilta"draggable="false">Menneiltä vuosilta</a></li><li class="diks-navigation__item " ><a class="diks-navigation__link " href="https://pohjois-karjala.menoinfo.fi/fi-FI?sort=startDate&area=area-143"draggable="false">Menoinfo</a></li></ul> 999 </nav></div> 1000 </div><div class="diks-container"><div class="diks-footer__main"> 1001 <div class="diks-grid"> 1002 <div class="diks-column diks-column--span-4 diks-column--m-span-8 diks-column--l-span-4 diks-column--xl-span-4"> 1003 <p><img src="https://a.ylakarjala.fi/styles/e5576057/images/logos/ylakarjala.svg" class="diks-logo diks-logo--default diks-footer__main-logo--wide" alt="Ylä-Karjala"><img src="https://a.ylakarjala.fi/styles/e5576057/images/logos/ylakarjala-w
1003hite.svg" class="diks-logo diks-logo--darkmode diks-footer__main-logo--wide" alt="Ylä-Karjala"></p> 1004 <p><strong>Päätoimittaja:</strong> Anu Saarelainen</p></div> 1005 1006 <div class="diks-column diks-column--span-4 diks-column--m-span-8 diks-column--l-span-4 diks-column--xl-span-5"><div class="diks-footer__main-secondary-logos-container"><div class="diks-footer__main-secondary-logo"><a href="https://vastuullistajournalismia.fi/"><img src="https://a.ylakarjala.fi/styles/e5576057/images/logos/vastuullista-journalismia.png" loading="lazy" alt="Vastuullisen journalismin merkki kertoo, että sitä käyttävä media on sitoutunut noudattamaan Julkisen sanan neuvoston laatimia Journalistin ohjeita."></a></div></div><div class="diks-footer__main-links-wrapper"> 1007 <div class="diks-column diks-column--span-2"><a class="diks-footer__main-link" href="https://www.keskisuomalainen.com/tietosuojalauseke/">Tietosuojalauseke</a><a class="diks-footer__main-link" href="javascript:window.gravito.cmp.openPreferences();">Evästevalinnat</a><a class="diks-footer__main-link" href="https://www.keskisuomalainen.com/kayttoehdot/">Käyttöehdot</a><a class="diks-footer__main-link" href="https://keskisuomalainen.com/medianvapausasetus/">Medianvapausasetus</a><a class="diks-footer__main-link" href="https://oma.media.fi/tekoaly-journalismissamme/">Tekoäly journalismissamme</a></div> 1008 <div class="diks-column diks-column--span-2"><a class="diks-footer__main-link" href="https://oma.media.fi/yla-karjala/">Asiakaspalvelu</a><a class="diks-footer__main-link" href="https://www.meks.fi/mainonta/alueet/savon-media/">Mediamyynti</a><a class="diks-footer__main-link" href="https://oma.media.fi/yla-karjala/yhteystiedot/">Yhteystiedot</a></div> 1009 </div></div> 1010 1011 <div class="diks-column diks-column--span-4 diks-column--m-span-8 diks-column--l-span-4 diks-column--xl-span-5"> 1012 <h2 class="diks-footer__main-title">Sovellus</h2><p>Sovellus sisältää tuoreet juttumme, joita ilmestyy ympäri vuorokauden vuoden jokaisena päivänä sekä näköislehtemme liitteineen sekä näköislehtien arkiston. Asenna sovellus laitteesi sovelluskaupasta.</p><div class="diks-footer__main-app-image-wrapper"> 1013 <a class="diks-apps__app-link diks-hide-on-android" href="https://apps.apple.com/fi/app/yl%C3%A4-karjala/id6695740400"><img class="diks-apps__app-image" src="https://a.ylakarjala.fi/styles/e5576057/images/default/appstore-badge.svg" loading="lazy" alt="Lataa sovellus App Storesta"></a> 1014 <a class="diks-apps__app-link diks-hide-on-ios" href="https://play.google.com/store/apps/details?id=fi.media.ylakarjala"><img class="diks-apps__app-image" src="https://a.ylakarjala.fi/styles/e5576057/images/default/google-play-badge.svg" loading="lazy" alt="Lataa sovellus Google Play -kaupasta"></a> 1015 </div> 1016 1017 1018 </div> 1019 </div> 1020 </div><div class="diks-footer__bottom"> 1021 <div class="diks-footer__bottom-row"><div class="diks-footer__bottom-logo-wrapper"><a href="https://www.keskisuomalainen.com/"><img class="diks-footer__bottom-logo" src="https://a.ylakarjala.fi/styles/e5576057/images/logos/keskisuomalainen-sign.svg" loading="lazy" alt="Keskisuomalainen Oyj"></a></div><span>Kuulumme Mediakonserni Keskisuomalaiseen</span></div> 1022 <div class="diks-footer__bottom-link-farm-wrapper"> 1023 <p><a class='diks-footer__bottom-link-farm-item' href='https://www.aamuposti.fi/'>Aamuposti</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.avecmedia.fi/'>Avec</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.esaimaa.fi/'>Etelä-Saimaa</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.ess.fi/'>Etelä-Suomen Sanomat</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.forssanlehti.fi/'>Forssan Lehti</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.hankasalmensanomat.fi/'>Hankasalmen Sanomat </a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.heinavedenlehti.fi/'>Heinäveden Lehti</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.helsinginuutiset.fi/'>Helsingin Uutiset</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.hameensanomat.fi/'>Hämeen Sanomat</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.hameenlinnankaupunkiuutiset.fi/'>Hämeenlinnan Kaupunkiuutiset</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.iisalmensanomat.fi/'>Iisalmen Sanomat</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.itahame.fi/'>Itä-Häme</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.ita-savo.fi/'>Itä-Savo</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.joroistenlehti.fi/'>Joroisten Lehti</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.juvanlehti.fi/'>Juvan Lehti</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.kaakonkulma.fi/'>Kaakonkulma</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.kangasniemenlehti.fi/'>Kangasniemen Kunnallislehti</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.karjalainen.fi/'>Karjalainen</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.heili.fi/'>Karjalan Heili</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.karkkilalainen.fi/'>Karkkilalainen</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.keski-hame.fi/'>Keski-Häme</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.keski-uusimaa.fi/'>Keski-Uusimaa</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.keskilaakso.fi/'>Keskilaakso</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.ksml.fi/'>Keskisuomalainen</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.koillis-savo.fi/'>Koillis-Savo</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.kouvolansanomat.fi/'>Kouvolan Sanomat</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.kymensanomat.fi/'>Kymen Sanomat</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.lappeenrannanuutiset.fi/'>Lappeenrannan Uutiset</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.laukaa-konnevesi.fi/'>Laukaa-Konnevesi</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.lieksanlehti.fi/'>Lieksan Lehti</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.lopenlehti.fi/'>Lopen Lehti</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.loviisansanomat.fi/'>Loviisan Sanomat</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.luumaenlehti.fi/'>Luumäen Lehti</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.lansisaimaa.fi/'>Länsi-Saimaan Sanomat</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.lansi-savo.fi/'>Länsi-Savo</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.lansi-uusimaa.fi/'>Länsi-Uusimaa</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.lansivayla.fi/'>Länsiväylä</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.mattijaliisa.fi/'>Matti ja Liisa</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.meksi.fi/'>Meksi Urheilumedia</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.miilu.fi/'>Miilu</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.mikkelinkaupunkilehti.fi/'>Mikkelin Kaupunkilehti</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.mantsalanuutiset.fi/'>Mäntsälän Uutiset</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.aamuposti.fi/aihe/Nurmij%C3%A4rvi'>Nurmijärven Uutiset</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.outokummunseutu.fi/'>Outokummun Seutu</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.joutsenolehti.fi/'>Paikallislehti Joutseno</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.prsanomat.fi/'>Parikkalan-Rautjärven Sanomat</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.pernionseudunlehti.fi/'>Perniönseudun Lehti</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.pieksamaenlehti.fi/'>Pieksämäen Lehti</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.pielavesi-keitele.fi/'>Pielavesi-Keitele</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.pielisjokiseutu.fi/'>Pielisjokiseutu</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.pitajalainen.fi/'>Pitäjäläinen</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.pitajanuutiset.fi/'>Pitäjänuutiset</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.pogostansanomat.fi/'>Pogostan Sanomat</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.puruvesi.net/'>Puruvesi</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.pyhtaanlehti.fi/'>Pyhtäänlehti</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.salonjokilaakso.fi/'>Salonjokilaakso</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.sampolehti.fi/'>Sampo</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.savonsanomat.fi/'>Savon Sanomat</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.sinunsavo.fi/'>Sinun Savo</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.sisa-savolehti.fi/'>Sisä-Savo</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.sisasuomenlehti.fi/'>Sisä-Suomen Lehti</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.soisalonseutu.fi/'>Soisalon Seutu</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.sjl.fi/'>Suur-Jyväskylän Lehti</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.tamperelainen.fi/'>Tamperelainen</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.tollotin.fi/'>Töllötin</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.uusimaa.fi/'>Uusimaa</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.uutis-jousi.fi/'>Uutis-Jousi</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.uutisvuoksi.fi/'>Uutisvuoksi</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.vantaansanomat.fi/'>Vantaan Sanomat</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.vihdinuutiset.fi/'>Vihdin Uutiset</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.viikkosavo.fi/'>Viikkosavo</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.viispiikkinen.fi/'>
1023Viispiikkinen</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.viitasaarenseutu.fi/'>Viitasaaren Seutu</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.warkaudenlehti.fi/'>Warkauden Lehti</a> • <a class='diks-footer__bottom-link-farm-item' href='https://www.ylakarjala.fi/'>Ylä-Karjala</a></p><p>Kaikki sisällöt voidaan julkaista kaikissa Mediakonserni Keskisuomalaisen medioissa.</p> 1024 </div> 1025 </div></div> 1026</footer> 1027 1028 1029
1029<script> 1030 if (!DOMTokenList.prototype.replace) { 1031 // IE Polyfill 1032 DOMTokenList.prototype.replace = function (a, b) { 1033 if (this.contains(a)) { 1034 this.add(b); 1035 this.remove(a); 1036 return true; 1037 } 1038 return false; 1039 } 1040 } 1041 1042 document.querySelector('.diks-no-js').classList.replace('diks-no-js', 'diks-js'); 1043 1044 // User agent sniffing is not reliable and it's going away. 1045 // Use only to sprinkle a little bit of progressive enhancement on top. 1046 // Dear Apple, stop lying, iPad on iOS 13 is not a Mac. You're turning into 90s Microsoft. 1047 var userAgent = navigator.userAgent || navigator.vendor || window.opera; 1048 if (/android/i.test(userAgent)) { 1049 document.querySelector('html').classList.add('diks-user-agent--android'); 1050 } else if (/iPad|iPhone|iPod/i.test(userAgent) && !window.MSStream) { 1051 document.querySelector('html').classList.add('diks-user-agent--ios'); 1052 } else if (/macintosh/i.test(userAgent) && navigator.maxTouchPoints > 1) { 1053 document.querySelector('html').classList.add('diks-user-agent--ios'); 1054 } 1055</script>
1055 1056
1057<script> 1058 // Fix forEach for IE 1059 if (window.NodeList && !NodeList.prototype.forEach) { 1060 NodeList.prototype.forEach = Array.prototype.forEach; 1061 } 1062 1063 // Element.closest() needs a polyfill for older browsers. 1064 // While we only need the closest() functionality for mobile browsers, 1065 // we don't want the code to fail even on old desktop browsers. 1066 // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill 1067 // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Browser_compatibility 1068 if (!Element.prototype.matches) { 1069 Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector; 1070 } 1071 1072 if (!Element.prototype.closest) { 1073 Element.prototype.closest = function(s) { 1074 var el = this; 1075 1076 do { 1077 if (el.matches(s)) return el; 1078 el = el.parentElement || el.parentNode; 1079 } while (el !== null && el.nodeType === 1); 1080 return null; 1081 }; 1082 } 1083 1084 function setAriaExpanded(toggler, ariaExpandedValue) { 1085 // Set aria-expanded attribute of dropdown toggler 1086 // If the toggler contains a button, set the aria-expanded attribute for the button instead 1087 if ( toggler.querySelector('button') != null ) { 1088 toggler.querySelector('button').setAttribute('aria-expanded', ariaExpandedValue); 1089 } 1090 else { 1091 toggler.setAttribute('aria-expanded', ariaExpandedValue); 1092 } 1093 } 1094 1095 function toggleElement(target, toggleClass, toggler) { 1096 if (toggleClass) { 1097 var isOpenClass = toggleClass + '--is-open'; 1098 var isClosedClass = toggleClass + '--is-closed'; 1099 1100 if (target.classList.contains(isOpenClass)) { 1101 // Close this toggle 1102 target.classList.remove(isOpenClass); 1103 target.classList.add(isClosedClass); 1104 1105 // Set aria-expanded to false for the toggler 1106 setAriaExpanded(toggler, 'false'); 1107 1108 } else if (target.classList.contains(isClosedClass)) { 1109 // Open this toggle 1110 target.classList.remove(isClosedClass); 1111 target.classList.add(isOpenClass); 1112 1113 // Set aria-expanded to true for the toggler 1114 setAriaExpanded(toggler, 'true'); 1115 } else { 1116 // Open this toggle as a fallback 1117 target.classList.add(isOpenClass); 1118 1119 // Set aria-expanded to true for the toggler 1120 setAriaExpanded(toggler, 'true'); 1121 } 1122 } else { 1123 if (window.getComputedStyle(target).display !== 'none') { 1124 target.style.display = 'none'; 1125 } else { 1126 target.style.display = 'block'; 1127 } 1128 } 1129 }; 1130 1131 document.querySelectorAll('.js-diks-toggler').forEach(function(toggler) { 1132 var toggleId = toggler.getAttribute('data-diks-toggle'); 1133 var target = document.getElementById(toggleId); 1134 var eventListenerAttached = toggler.getAttribute('data-diks-event-click'); 1135 1136 if (target && !eventListenerAttached) { 1137 1138 // Set aria-controls of toggler 1139 if ( toggler.querySelector('button') != null ) { 1140 toggler.querySelector('button').setAttribute('aria-controls', toggleId); 1141 } 1142 else { 1143 toggler.setAttribute('aria-controls', toggleId); 1144 } 1145 1146 toggler.addEventListener('click', function(e) { 1147 e.preventDefault(); 1148 1149 var toggleClass = toggler.getAttribute('data-diks-toggle-class'); 1150 1151 if (webShareAPIEnabled(toggleId)) { 1152 share(); 1153 } else { 1154 toggleElement(target, toggleClass, toggler); 1155 } 1156 }); 1157 1158 toggler.setAttribute('data-diks-event-click', true); 1159 } 1160 }); 1161 1162 // Web Share and Clipboard API capabilities 1163 1164 function webShareAPIEnabled(toggleId) { 1165 const webShareAPIEnabled = true; 1166 const webShareAPIDropdownShareIds = ["jaa","jakopainikkeet"]; 1167 const isMobileDevice = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent); 1168 1169 return webShareAPIEnabled && webShareAPIDropdownShareIds.includes(toggleId) && isMobileDevice && navigator.share ? true : false; 1170 } 1171 1172 function share() { 1173 const metaTitleElement = document.querySelector('meta[property="og:title"]'); 1174 const metaDescriptionElement = document.querySelector('meta[name="description"]'); 1175 const metaUrlElement = document.querySelector('meta[property="og:url"]'); 1176 let title = ''; 1177 let description = ''; 1178 let url = document.location.href; 1179 1180 if (metaTitleElement && metaTitleElement.content) { 1181 title = metaTitleElement.content; 1182 } 1183 1184 if (metaDescriptionElement && metaDescriptionElement.content) { 1185 description = metaDescriptionElement.content; 1186 } 1187 1188 if (metaUrlElement && metaUrlElement.content) { 1189 url = metaUrlElement.content; 1190 } 1191 1192 navigator.share({ 1193 title: title, 1194 text: description, 1195 url: url 1196 }); 1197 } 1198 1199 document.querySelectorAll('.js-diks-share-clipboard').forEach(function(element) { 1200 element.addEventListener('click', function(e) { 1201 e.preventDefault(); 1202 1203 let url = document.location.href; 1204 const metaUrlElement = document.querySelector('meta[property="og:url"]'); 1205 1206 if (metaUrlElement && metaUrlElement.content) { 1207 url = metaUrlElement.content; 1208 } 1209 1210 // Copy URL to clipboard 1211 navigator.clipboard.writeText(url).then(function () { 1212 // Copying URL to clipboard succeeded 1213 const dropdownId = element.getAttribute('data-diks-dropdown-id'); 1214 // Find closest dropdown toggler 1215 let dropdownToggler = element.closest('.diks-dropdown').querySelector('.js-diks-toggler'); 1216 1217 if (dropdownId) { 1218 const dropdownElement = document.getElementById(dropdownId); 1219 1220 if (dropdownElement) { 1221 // Close currently open dropdown 1222 toggleElement(dropdownElement, 'diks-dropdown__content', dropdownToggler); 1223 } 1224 1225 // Show link copied notification text 1226 const notificationTextWrapperDiv = document.createElement('div'); 1227 const notificationTextDiv = document.createElement('div'); 1228 const notificationText = document.createTextNode('Linkki kopioitu leikepöydälle'); 1229 1230 notificationTextDiv.classList.add('diks-dropdown__notification-text'); 1231 notificationTextDiv.appendChild(notificationText); 1232 notificationTextWrapperDiv.classList.add('diks-dropdown__notification-text-wrapper'); 1233 notificationTextWrapperDiv.appendChild(notificationTextDiv); 1234 dropdownElement.parentNode.insertBefore(notificationTextWrapperDiv, null); 1235 1236 setTimeout(function () { 1237 notificationTextWrapperDiv.remove(); 1238 }, 5000); 1239 } 1240 }); 1241 }); 1242 }); 1243
1244 const initContentBlockToggleButtons = () => { 1245 const toggleContainers = document.querySelectorAll('[data-diks-init="toggle"]'); 1246 toggleContainers.forEach(container => { 1247 const toggleButton = container.querySelector('.diks-toggle-button'); 1248 const toggleContent = container.querySelector('.diks-toggle-content-container'); 1249 if (toggleButton && toggleContent) { 1250 toggleButton.addEventListener('click', () => { 1251 toggleElement(toggleContent, 'diks-toggle', toggleButton); 1252 }); 1253 } 1254 }); 1255 }; 1256 document.addEventListener('DOMContentLoaded', () => { 1257 initContentBlockToggleButtons(); 1258 }); 1259 1260</script>
1260 1261
1262<script> 1263 const useDragThreshold = true; 1264 1265 // Horizontally scrollable & draggable navigation 1266 class HorizontalScrollDragger { 1267 constructor(element) { 1268 this.slider = typeof element === 'string' ? document.querySelector(element) : element instanceof Element ? element : null; 1269 if (this.slider === null) return console.error('HorizontalScrollDragger: Element not found'); 1270 1271 this.isDown = false; 1272 this.preventClick = false; 1273 this.startX; 1274 this.scrollLeft; 1275 1276 this.dragThreshold = 5; 1277 this.dragSensitivity = 1; 1278 this.dragged = false; 1279 1280 this.init(); 1281 } 1282 1283 init() { 1284 this.slider.addEventListener('mousedown', (e) => this.handleMouseDown(e)); 1285 this.slider.addEventListener('mouseleave', () => this.handleMouseLeave()); 1286 this.slider.addEventListener('mouseup', () => this.handleMouseUp()); 1287 this.slider.addEventListener('mousemove', (e) => this.handleMouseMove(e)); 1288 this.slider.addEventListener('click', (e) => this.handleClick(e)); 1289 } 1290 1291 handleMouseDown(e) { 1292 this.isDown = true; 1293 this.slider.classList.add('diks-navigation--draggable-active'); 1294 this.startX = e.pageX - this.slider.offsetLeft; 1295 this.scrollLeft = this.slider.scrollLeft; 1296 this.preventClick = false; 1297 } 1298 1299 handleMouseLeave() { 1300 this.isDown = false; 1301 this.slider.classList.remove('diks-navigation--draggable-active'); 1302 } 1303 1304 handleMouseUp() { 1305 this.isDown = false; 1306 this.slider.classList.remove('diks-navigation--draggable-active'); 1307 } 1308 1309 handleMouseMove(e) { 1310 if (!this.isDown) return; 1311 1312 if ( useDragThreshold == true ) { 1313 const xWithThreshold = e.pageX - this.slider.offsetLeft; 1314 const delta = xWithThreshold - this.startX; 1315 1316 // If not yet dragging, check threshold 1317 if (!this.dragged && Math.abs(delta) > this.dragThreshold) { 1318 this.dragged = true; 1319 this.preventClick = true; 1320 1321 // Reset baseline so scrolling starts smoothly from here 1322 this.startX = xWithThreshold; 1323 this.scrollLeft = this.slider.scrollLeft; 1324 } 1325 1326 if (this.dragged) { 1327 e.preventDefault(); 1328 const walkWithThreshold = (xWithThreshold - this.startX) * this.dragSensitivity; // adjust sensitivity 1329 this.slider.scrollLeft = this.scrollLeft - walkWithThreshold; 1330 } 1331 } 1332 else { 1333 e.preventDefault(); 1334 const x = e.pageX - this.slider.offsetLeft; 1335 const walk = (x - this.startX) * this.dragSensitivity; // adjust sensitivity 1336 this.slider.scrollLeft = this.scrollLeft - walk; 1337 this.preventClick = true; 1338 } 1339 1340 } 1341 1342 handleClick(e) { 1343 if ( useDragThreshold == true && this.preventClick && this.dragged ) { 1344 e.preventDefault(); 1345 } 1346 else if ( useDragThreshold == false && this.preventClick) { 1347 e.preventDefault(); 1348 } 1349 } 1350 } 1351 1352 // Set the draggable navs (multiple) to handle their scrollbars 1353 let scrollableNavs = document.querySelectorAll('.diks-navigation--draggable'); 1354 1355 // Make draggable navigation draggable 1356 if ( scrollableNavs ) { 1357 scrollableNavs.forEach(function(element) { 1358 new HorizontalScrollDragger(element); 1359 }); 1360 } 1361 1362 1363 // Handle has-scrollbars class adding and removing 1364 function handleScrollableNavScrollbars(scrollableNavElement) { 1365 // If scrollable area is wider (scrollWidth) than what's visible (clientWidth) the element has scrollbars 1366 if ( scrollableNavElement.scrollWidth > scrollableNavElement.clientWidth ) { 1367 scrollableNavElement.classList.add('diks-navigation--draggable-has-scrollbars'); 1368 scrollableNavElement.parentElement.classList.add('diks-navigation-wrapper--has-scrollbars'); 1369 } 1370 // Remove the has-scrollbars class if it exists but shouldn't (element does not have scrollbars) 1371 else if ( scrollableNavElement.classList.contains('diks-navigation--draggable-has-scrollbars') ) { 1372 scrollableNavElement.classList.remove('diks-navigation--draggable-has-scrollbars'); 1373 scrollableNavElement.parentElement.classList.remove('diks-navigation-wrapper--has-scrollbars'); 1374 } 1375 } 1376 1377 // If scrollable nav exists add (or remove) necessary classes 1378 // "DOMContentLoaded" does not wait for styles to load and styles affect the size of the scrollable nav directly so we have to use "load" instead 1379 window.addEventListener('load', (event) => { 1380 if ( scrollableNavs ) {
1381 scrollableNavs.forEach(function(element) { 1382 handleScrollableNavScrollbars(element); 1383 }); 1384 } 1385 }); 1386 1387 // Check if scrollable nav has scrollbar 1388 window.addEventListener('resize', function(event){ 1389 if ( scrollableNavs ) { 1390 scrollableNavs.forEach(function(element) { 1391 handleScrollableNavScrollbars(element); 1392 }); 1393 } 1394 }); 1395</script>
1395 1396
1397<script> 1398 // Back button handling 1399 document.querySelectorAll('a.js-diks-back-button').forEach(function(item) { 1400 var referrerIsSameDomain = false; 1401 // Check if referrer is found as referrer isn't always available (browser, tab, window, bookmark, privacy). 1402 if (typeof(document.referrer) === 'string' && document.referrer.length > 0) { 1403 // Set referrerIsSameDomain to true if referrer is in the same domain as current location hostname and referrer is not the same page as current page (window.location.href) 1404 if ( document.referrer.includes(document.location.hostname) && document.referrer != window.location.href ) { 1405 referrerIsSameDomain = true; 1406 } 1407 } 1408 1409 // Overwrite link with history.go, as it also remembers scroll position but only if referrer is the same domain as current location hostname 1410 if (history.length > 1 && referrerIsSameDomain == true) { 1411 // Set referrer as back button href to enable visual cue & opening to a new window 1412 item.setAttribute('href', document.referrer); 1413 1414 // Set back button text 1415 item.querySelector('.diks-header__cta-text').innerHTML = "Takaisin"; 1416 1417 var stepsToGoBack = -1; 1418 1419 item.addEventListener('click', function(e) { 1420 e.preventDefault(); 1421 history.go(stepsToGoBack); 1422 }); 1423 } 1424 }); 1425</script>
1425 1426 1427 <link rel="stylesheet" href="/theme/css/includes/lightgallery/css/lightgallery-bundle.min.css"> 1428 <style>.lg-sub-html { background-color: rgba(0,0,0, .6); }</style> 1429
1429<script src="/theme/css/includes/lightgallery/lightgallery.min.js"></script>
1429 1430
1430<script src="/theme/css/includes/lightgallery/plugins/autoplay/lg-autoplay.min.js"></script>
1430 1431
1431<script src="/theme/css/includes/lightgallery/plugins/fullscreen/lg-fullscreen.min.js"></script>
1431 1432
1432<script src="/theme/css/includes/lightgallery/plugins/thumbnail/lg-thumbnail.min.js"></script>
1432 1433
1433<script src="/theme/css/includes/lightgallery/plugins/zoom/lg-zoom.min.js"></script>
1433 1434
1434<script> 1435 // lightGallery 1436 // Separate gallery for every .js-lightgallery 1437 // Gallery items come from .js-lightgallery .js-lightgallery__link 1438 // https://www.lightgalleryjs.com/docs/getting-started/ 1439 document.querySelectorAll('.js-diks-lightgallery').forEach(function(gallery) { 1440 var galleryImageLinks = gallery.getElementsByClassName('diks-gallery__link'); 1441 1442 // Thumbnails come from img inside the links, unless links specify data-thumbnail 1443 var thumbnailSource = (galleryImageLinks[0].hasAttribute('data-thumbnail')) ? ('data-thumbnail') : (false); 1444 1445 // Adjust certain settings depending on whether the gallery has one or more images 1446 var galleryHasMultipleImages = (galleryImageLinks.length > 1 ? true : false); 1447 1448 // Initialize 1449 lightGallery(gallery, { 1450 autoplay: galleryHasMultipleImages, 1451 counter: galleryHasMultipleImages, 1452 download: false, 1453 exThumbImage: thumbnailSource, 1454 hideControlOnEnd: true, 1455 licenseKey: "96BAAD7E-3BF04397-BBB55AE3-6D5A2C0B", 1456 loop: false, 1457 plugins: [lgAutoplay, lgFullscreen, lgThumbnail, lgZoom], 1458 selector: '.diks-gallery__link', 1459 mobileSettings: { 1460 controls: true, 1461 showCloseIcon: true 1462 }, 1463 strings: { 1464 closeGallery: 'Sulje galleria', 1465 toggleMaximize: 'Maksimointi', 1466 previousSlide: 'Edellinen', 1467 nextSlide: 'Seuraava', 1468 download: 'Lataa', 1469 playVideo: 'Katso video', 1470 mediaLoadingFailed: 'Sisällön lataus epäonnistui', 1471 }, 1472 autoplayPluginStrings: { 1473 toggleAutoplay: 'Automaattinen toisto' 1474 }, 1475 fullscreenPluginStrings: { 1476 toggleFullscreen: 'Kokoruututila' 1477 }, 1478 thumbnailPluginStrings: { 1479 toggleThumbnails: 'Pikkukuvat' 1480 }, 1481 zoomPluginStrings: { 1482 zoomIn: 'Suurenna', 1483 zoomOut: 'Pienennä', 1484 viewActualSize: 'Näytä täysikokoisena' 1485 } 1486 }); 1487 1488 // After closing LightGallery return focus to the image link that opened the gallery 1489 gallery.addEventListener('lgAfterClose', () => { 1490 galleryImageLinks[0].focus(); 1491 }); 1492 1493 }); 1494 1495 </script>
1495 1496
1497<script> 1498 function loadScript(url, callback) { 1499 var script = document.createElement("script"); 1500 script.type = "text/javascript"; 1501 if (script.readyState) { // IE 1502 script.onreadystatechange = function() { 1503 if (script.readyState === "loaded" || script.readyState === "complete") { 1504 script.onreadystatechange = null; 1505 callback(); 1506 } 1507 }; 1508 } else { // Others 1509 script.onload = function() { 1510 callback(); 1511 }; 1512 } 1513 script.src = url; 1514 document.getElementsByTagName("head")[0].appendChild(script); 1515 } 1516 function checkAudioElements() { 1517 // load audioplayer script only when audio elements are found 1518 if (document.querySelector(".init-audio-player")) { 1519 loadScript("https://a.ylakarjala.fi/styles/e5576057/js/audioplayer/diks-audioplayer.min.js", function() { 1520 DiksAudioPlayer.init({ 1521 selector: '.init-audio-player', 1522 stopOthersOnPlay: true, 1523 enableKeystrokes: true 1524 }); 1525 }); 1526 } 1527 } 1528 window.onload = (event) => { 1529 checkAudioElements(); 1530 }; 1531</script>
1531<script> 1532 // Service Worker 1533 if ('serviceWorker' in navigator) { 1534 window.addEventListener('load', function() { 1535 navigator.serviceWorker.register('/sw.js').then( 1536 function(registration) { 1537 console.log('PWA: Service worker registered to scope: ', registration.scope); 1538 }, 1539 function(err) { 1540 console.error('PWA: Service worker failed to register with error: ', err); 1541 } 1542 ); 1543 }); 1544 } 1545 1546 // Show installation option, hide generic fallback instructions 1547 function pwaShowInstallationOption() { 1548 document.querySelectorAll('.js-diks-apps-pwa-installation').forEach(function(element) { 1549 element.style.display = 'block'; 1550 }); 1551 document.querySelectorAll('.js-diks-apps-pwa-instructions').forEach(function(element) { 1552 element.style.display = 'none'; 1553 }); 1554 } 1555 1556 let deferredPrompt; 1557 var dataLayer = window.dataLayer || []; 1558 1559 // Basic installation process 1560 window.addEventListener('beforeinstallprompt', (e) => { 1561 // Stash the event so it can be triggered later 1562 deferredPrompt = e; 1563 1564 const enablePrompt = 0; 1565 1566 if(!enablePrompt) { 1567 e.preventDefault(); 1568 } 1569 1570 // Update the UI to notify the user they can install PWA 1571 pwaShowInstallationOption(); 1572 1573 // Handle installation 1574 document.querySelectorAll('.js-diks-apps-pwa-installation-button').forEach(function(button) { 1575 button.addEventListener('click', (e) => { 1576 // Show the prompt 1577 deferredPrompt.prompt(); 1578 1579 // Wait for user to respond 1580 deferredPrompt.userChoice.then((choiceResult) => { 1581 if (choiceResult.outcome === 'accepted') { 1582 console.log('PWA: Installed (prompt)'); 1583 dataLayer.push({ 1584 'event': 'PWA.installation', 1585 'eventData': 'success' 1586 }); 1587 } else { 1588 console.log('PWA: User dismissed installation prompt'); 1589 dataLayer.push({ 1590 'event': 'PWA.installation', 1591 'eventData': 'canceled' 1592 }); 1593 } 1594 deferredPrompt = null; 1595 }); 1596 }); 1597 }); 1598 }); 1599 1600 // iOS installation process (show instructions modal) 1601 if (!navigator.standalone) { 1602 var userAgent = navigator.userAgent.toLowerCase(); 1603 var iPhoneUser = (/iphone/.test(userAgent)); 1604 var iPadUser = (/ipad/.test(userAgent) || (/macintosh/.test(userAgent) && navigator.maxTouchPoints > 1)); 1605 var safariUser = (/^(?!.*(brave|chrome|crios|duckduckgo|edgeios|firefox|fxios|opios|ucbrowser|yabrowser)).*safari.*$/.test(userAgent)); 1606 1607 if (safariUser && (iPhoneUser || iPadUser)) { 1608 // Update the UI to notify the user they can install PWA 1609 pwaShowInstallationOption(); 1610 1611 // Instructions 1612 var modals = document.querySelectorAll('.js-diks-apps-pwa-ios-instructions').forEach(function(element) { 1613 // Position on screen based on device 1614 if (iPhoneUser) { 1615 element.classList.add('diks-apps__pwa-ios-modal--bottom'); 1616 } else if (iPadUser) { 1617 element.classList.add('diks-apps__pwa-ios-modal--top'); 1618 } 1619 }); 1620 1621 // Handle modal instructions from installation button 1622 document.querySelectorAll('.js-diks-apps-pwa-installation-button').forEach(function(button) { 1623 button.addEventListener('click', (e) => { 1624 // Show first modal 1625 document.querySelector('.js-diks-apps-pwa-ios-instructions').classList.toggle('diks-apps__pwa-ios-modal--is-visible'); 1626 dataLayer.push({ 1627 'event': 'PWA.instructions.shown', 1628 'eventData': 'iOS' 1629 }); 1630 }); 1631 }); 1632 } 1633 } 1634</script>
1634 1635
1635<script class="coral-script" src="//coral.prod.diks.fi/assets/js/count.js?v=9.3.1.3" defer></script>
1635 1636<div id="diks-bc-order-button" style="display: none;"></div> 1637 </body> 1638</html> 1639
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.