PageSourceSearch

https://www.ylakarjala.fi/asenna/

html ylakarjala.fi collected 2026-09-25 01:48:45 UTC 88,979 bytes, 1,639 lines download raw bytes

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&amp;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&amp;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&amp;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> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.avecmedia.fi/'>Avec</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.esaimaa.fi/'>Etelä-Saimaa</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.ess.fi/'>Etelä-Suomen Sanomat</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.forssanlehti.fi/'>Forssan Lehti</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.hankasalmensanomat.fi/'>Hankasalmen Sanomat </a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.heinavedenlehti.fi/'>Heinäveden Lehti</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.helsinginuutiset.fi/'>Helsingin Uutiset</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.hameensanomat.fi/'>Hämeen Sanomat</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.hameenlinnankaupunkiuutiset.fi/'>Hämeenlinnan Kaupunkiuutiset</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.iisalmensanomat.fi/'>Iisalmen Sanomat</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.itahame.fi/'>Itä-Häme</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.ita-savo.fi/'>Itä-Savo</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.joroistenlehti.fi/'>Joroisten Lehti</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.juvanlehti.fi/'>Juvan Lehti</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.kaakonkulma.fi/'>Kaakonkulma</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.kangasniemenlehti.fi/'>Kangasniemen Kunnallislehti</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.karjalainen.fi/'>Karjalainen</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.heili.fi/'>Karjalan Heili</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.karkkilalainen.fi/'>Karkkilalainen</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.keski-hame.fi/'>Keski-Häme</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.keski-uusimaa.fi/'>Keski-Uusimaa</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.keskilaakso.fi/'>Keskilaakso</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.ksml.fi/'>Keskisuomalainen</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.koillis-savo.fi/'>Koillis-Savo</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.kouvolansanomat.fi/'>Kouvolan Sanomat</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.kymensanomat.fi/'>Kymen Sanomat</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.lappeenrannanuutiset.fi/'>Lappeenrannan Uutiset</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.laukaa-konnevesi.fi/'>Laukaa-Konnevesi</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.lieksanlehti.fi/'>Lieksan Lehti</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.lopenlehti.fi/'>Lopen Lehti</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.loviisansanomat.fi/'>Loviisan Sanomat</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.luumaenlehti.fi/'>Luumäen Lehti</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.lansisaimaa.fi/'>Länsi-Saimaan Sanomat</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.lansi-savo.fi/'>Länsi-Savo</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.lansi-uusimaa.fi/'>Länsi-Uusimaa</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.lansivayla.fi/'>Länsiväylä</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.mattijaliisa.fi/'>Matti ja Liisa</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.meksi.fi/'>Meksi Urheilumedia</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.miilu.fi/'>Miilu</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.mikkelinkaupunkilehti.fi/'>Mikkelin Kaupunkilehti</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.mantsalanuutiset.fi/'>Mäntsälän Uutiset</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.aamuposti.fi/aihe/Nurmij%C3%A4rvi'>Nurmijärven Uutiset</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.outokummunseutu.fi/'>Outokummun Seutu</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.joutsenolehti.fi/'>Paikallislehti Joutseno</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.prsanomat.fi/'>Parikkalan-Rautjärven Sanomat</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.pernionseudunlehti.fi/'>Perniönseudun Lehti</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.pieksamaenlehti.fi/'>Pieksämäen Lehti</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.pielavesi-keitele.fi/'>Pielavesi-Keitele</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.pielisjokiseutu.fi/'>Pielisjokiseutu</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.pitajalainen.fi/'>Pitäjäläinen</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.pitajanuutiset.fi/'>Pitäjänuutiset</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.pogostansanomat.fi/'>Pogostan Sanomat</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.puruvesi.net/'>Puruvesi</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.pyhtaanlehti.fi/'>Pyhtäänlehti</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.salonjokilaakso.fi/'>Salonjokilaakso</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.sampolehti.fi/'>Sampo</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.savonsanomat.fi/'>Savon Sanomat</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.sinunsavo.fi/'>Sinun Savo</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.sisa-savolehti.fi/'>Sisä-Savo</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.sisasuomenlehti.fi/'>Sisä-Suomen Lehti</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.soisalonseutu.fi/'>Soisalon Seutu</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.sjl.fi/'>Suur-Jyväskylän Lehti</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.tamperelainen.fi/'>Tamperelainen</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.tollotin.fi/'>Töllötin</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.uusimaa.fi/'>Uusimaa</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.uutis-jousi.fi/'>Uutis-Jousi</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.uutisvuoksi.fi/'>Uutisvuoksi</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.vantaansanomat.fi/'>Vantaan Sanomat</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.vihdinuutiset.fi/'>Vihdin Uutiset</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.viikkosavo.fi/'>Viikkosavo</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.viispiikkinen.fi/'>
1023Viispiikkinen</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.viitasaarenseutu.fi/'>Viitasaaren Seutu</a> &bull; <a class='diks-footer__bottom-link-farm-item' href='https://www.warkaudenlehti.fi/'>Warkauden Lehti</a> &bull; <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.