[]
Hattulassa etsitään seuraajaa Pekka Karvoselle – Uuden talous- ja henkilöstöjohtajan haku käynnistetään nopeasti | Paikalliset | Hämeen Sanomat { if (!Hyphenopoly.hyphenators) { return } Hyphenopoly.hyphenators[”HTML”].then((hyphenator) => { for (const itemSelector in Hyphenopoly.setup.selectors) { const containerNode = document.querySelector(containerSelector) const itemNodeList = containerNode.querySelectorAll(itemSelector) itemNodeList.forEach((itemNode) => { hyphenator(itemNode, itemSelector) }) } }) } ]]> { if (!previewAdUnits.includes(key)) { delete gamAdUnits[key]; elementsToHide.push(key); } }); // hide deleted adslots window.addEventListener(’load’, (event) => { elementsToHide.forEach(key => { if (document.getElementById(adSlotPrefix+key) != null) { let elementParent = document.getElementById(adSlotPrefix+key).parentElement; if (elementParent != null) { elementParent.style.display = ”none”; } } }); }); } function getCookie(name) { name = name + ’=’; const decodedCookie = decodeURIComponent(document.cookie); const cookies = decodedCookie.split(’;’); for (let i = 0; i 0) { generateTargetingParameters(”CxSegments”, cXsegmentIds); } if (Array.isArray(topics)) { let topicsAndMarketingCategories = []; if (topics.length > 0) { topicsAndMarketingCategories = topicsAndMarketingCategories.concat(topics); } if (appendMarketingCategoriesToTopics && Array.isArray(marketingCategories) && marketingCategories.length > 0) { topicsAndMarketingCategories = topicsAndMarketingCategories.concat(marketingCategories); } if (topicsAndMarketingCategories.length > 0) { generateTargetingParameters(’aihe’, topicsAndMarketingCategories); } } if (Array.isArray(marketingCategories) && marketingCategories.length > 0) { generateTargetingParameters(’mainoskategoria’, marketingCategories); } if (Array.isArray(advertisers) && advertisers.length > 0) { generateTargetingParameters(’mainostaja’, advertisers); } if (brandSafety) { generateTargetingParameters(’brand_safety’, brandSafety); } if (brandSafetyScore) { generateTargetingParameters(’brand_safety_score’, brandSafetyScore); } if (articleid) { generateTargetingParameters(’articleid’, articleid); } if (isPreview) { generateTargetingParameters(’is_preview’, ”1”); generateTargetingParameters(”url_params”, ”test”); } // Set general ad settings if (enableLazyLoad == true) { googletag.pubads().enableLazyLoad({ fetchMarginPercent: fetchMarginPercent, renderMarginPercent: renderMarginPercent, mobileScaling: mobileScaling }); } if (collapseEmptyDivs == true) { googletag.pubads().collapseEmptyDivs(true); } if (disableInitialLoad == true) { googletag.pubads().disableInitialLoad(); } if (enableSRA == true) { googletag.pubads().enableSingleRequest(); }googletag.enableServices(); // Handle notification texts / hide empty ad slots googletag.pubads().addEventListener(’slotRenderEnded’, function(event) { if (event.slot && typeof event.slot.getSlotId === ’function’) { let slotId = event.slot.getSlotId(); if (slotId && typeof slotId.getDomId === ’function’) { let domId = slotId.getDomId(); if (domId && document.getElementById(domId)) { let element = document.getElementById(domId); let wrapper = element.parentElement; // Handle filled ad request if (!event.isEmpty) { let iframe = document.querySelector(”#”+domId+” > [id^=google_ads_iframe_] > iframe”); if (iframe) { // Accessibility: remove landmarks iframe.removeAttribute(”role”); } // Ad labels and skip links if (wrapper && !(event.slot && typeof event.slot.getOutOfPage === ’function’ && event.slot.getOutOfPage() === true)) { function handleLabelsAndSkipLinks() { let elementStyle = window.getComputedStyle(element); if (wrapper.offsetHeight – (parseInt(elementStyle.marginTop, 10) + parseInt(elementStyle.marginBottom, 10)) > 100) { let adSlotKey = domId.replace(adSlotPrefix, ”); let adUnit = gamAdUnits[adSlotKey]; let currentConf = null; let adLabels = false; if (adUnit) { if (pageType === ’article’) { currentConf = adUnit.article_config; } else if (pageType === ’section’) { currentConf = adUnit.section_config; } adLabels = currentConf.show_labels; // If paywall is shown to user, use paywall specific config if (pageType === ’article’ && !userHasPermission && typeof currentConf.paywall_config !== ’undefined’ && currentConf.paywall_config.show_labels !== ’undefined’ && !isPreview) { adLabels = currentConf.paywall_config.show_labels; } else if (isComicArticle == true && typeof currentConf.comic_config !== ’undefined’ && currentConf.comic_config.show_labels !== ’undefined’) { adLabels = currentConf.comic_config.show_labels; } } // Show labels if necessary if (adLabels && !wrapper.querySelector(”.diks-display-ad__notice”)) { var adNoticeTop = document.createElement(”div”); var adNoticeBottom = document.createElement(”div”); adNoticeTop.classList.add(”diks-display-ad__notice”, ”diks-display-ad__notice–before”); adNoticeBottom.classList.add(”diks-display-ad__notice”, ”diks-display-ad__notice–after”); let noticeTextTop = document.createTextNode(inContentAdTextTop); let noticeTextBottom = document.createTextNode(inContentAdTextBottom); adNoticeTop.appendChild(noticeTextTop); adNoticeBottom.appendChild(noticeTextBottom); // Render notification texts for a single ad wrapper.insertBefore(adNoticeTop, wrapper.childNodes[0]); wrapper.insertBefore(adNoticeBottom, null); } // Create a skip link if (adUnit && adUnit.type === ’normal’ && skipLinksEnabled && !wrapper.querySelector(”.diks-display-ad__skip-link”)) { // Render render skip for a single ad let skipLinkStartElement = document.createElement(’a’); let skipLinkText = document.createTextNode(’Ohita mainos’); let skipLinkEndElement = document.createElement(’div’); let skipLinkEndElementId = ’diks-skip-link-’ + domId; skipLinkStartElement.appendChild(skipLinkText); skipLinkStartElement.classList.add(’diks-display-ad__skip-link’, ’diks-button’, ’diks-button–primary’, ’diks-a11y__screen-reader’, ’diks-a11y__screen-reader–focusable’); skipLinkStartElement.href = ’#’ + skipLinkEndElementId; skipLinkEndElement.id = skipLinkEndElementId; wrapper.insertBefore(skipLinkStartElement, wrapper.childNodes[0]); wrapper.insertBefore(skipLinkEndElement, null); } if (!adLabels) { element.classList.add(”diks-display-ad__unit–with-margin”); } } else { element.classList.remove(”diks-display-ad__unit–with-margin”); } } handleLabelsAndSkipLinks(); let resizeObserver = new ResizeObserver(function(entries) { entries.forEach(function(entry) { handleLabelsAndSkipLinks(); }); }); resizeObserver.observe(wrapper); } } else if (wrapper) { // Hide wrapper when ad request is unfilled console.log(”hiding: ”+domId); wrapper.style.display = ”none”; } } } } }); window.adSetupReady = true; displayAdsIfPossible(); }; }); }(window.googletag = window.googletag || {})); ]]>
Omat tiedot’); var logoutForm = stringToHTML(’
Talous- ja henkilöstöjohtaja Pekka Karvonen (vas.) oli mukana Hattulan valtuuston syyskuun kokouksessa. Hänen vieressään istuvat sivistys- ja hyvinvointijohtaja Jari Wihersaari ja elinvoimajohtaja Kari Uusitalo. Riku Hasari
Hattulassa on tarkoitus pitää keskiviikkona ylimääräinen valtuuston kokous, jotta haku saadaan käyntiin.
Sari Oksala
7.10.2024 14:35 | Päivitetty 7.10.2024 22:06
Hattulassa aletaan hakea seuraajaa kunnan talous- ja henkilöstöjohtajan paikan jättävälle Pekka Karvoselle. Karvonen valittiin aiemmin syksyllä Riihimäen talousjohtajaksi. Hänen viimeinen työpäivänsä Hattulassa on 4. marraskuuta.
Haluatko lukea koko jutun?
Tilaa digi ja pääset lukemaan kaikki Hämeen Sanomien sisällöt.
Tilaa 6 kk 4,90 €/kk Tilaa 2 kk 15 €/kk
- Hameensanomat.fi-verkkopalvelun rajaton käyttöoikeus vuoden jokaisena päivänä
- Näköislehti
- Mobiilisovelluksen käyttöoikeus (iOS ja Android)
- Lukuoikeus sinulle ja kolmelle perheenjäsenellesi
Mainos: Hämeen Sanomat
Mainos: Hämeen Sanomat
21.10.2024 0:00
1) { document.querySelector(’html’).classList.add(’diks-user-agent–ios’); } ]]> this.handleMouseDown(e)); this.slider.addEventListener(’mouseleave’, () => this.handleMouseLeave()); this.slider.addEventListener(’mouseup’, () => this.handleMouseUp()); this.slider.addEventListener(’mousemove’, (e) => this.handleMouseMove(e)); this.slider.addEventListener(’click’, (e) => this.handleClick(e)); } handleMouseDown(e) { this.isDown = true; this.slider.classList.add(’diks-navigation–draggable-active’); this.startX = e.pageX – this.slider.offsetLeft; this.scrollLeft = this.slider.scrollLeft; this.preventClick = false; } handleMouseLeave() { this.isDown = false; this.slider.classList.remove(’diks-navigation–draggable-active’); } handleMouseUp() { this.isDown = false; this.slider.classList.remove(’diks-navigation–draggable-active’); } handleMouseMove(e) { if (!this.isDown) return; e.preventDefault(); const x = e.pageX – this.slider.offsetLeft; const walk = (x – this.startX) * 3; //scroll-fast this.slider.scrollLeft = this.scrollLeft – walk; this.preventClick = true; } handleClick(e) { if (this.preventClick) { e.preventDefault(); } } } // Set the draggable navs (multiple) to handle their scrollbars let scrollableNavs = document.querySelectorAll(’.diks-navigation–draggable’); // Make draggable navigation draggable if ( scrollableNavs ) { scrollableNavs.forEach(function(element) { new HorizontalScrollDragger(element); }); } // Handle has-scrollbars class adding and removing function handleScrollableNavScrollbars(scrollableNavElement) { // Debugging: console.log(”Scroll width: ” + scrollableNavElement.scrollWidth + ” & client width: ” + scrollableNavElement.clientWidth); // If scrollable area is wider (scrollWidth) than what’s visible (clientWidth) the element has scrollbars if ( scrollableNavElement.scrollWidth > scrollableNavElement.clientWidth ) { scrollableNavElement.classList.add(’diks-navigation–draggable-has-scrollbars’); scrollableNavElement.parentElement.classList.add(’diks-navigation-wrapper–has-scrollbars’); } // Remove the has-scrollbars class if it exists but shouldn’t (element does not have scrollbars) else if ( scrollableNavElement.classList.contains(’diks-navigation–draggable-has-scrollbars’) ) { scrollableNavElement.classList.remove(’diks-navigation–draggable-has-scrollbars’); scrollableNavElement.parentElement.classList.remove(’diks-navigation-wrapper–has-scrollbars’); } } // If scrollable nav exists add (or remove) necessary classes // ”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 window.addEventListener(’load’, (event) => { if ( scrollableNavs ) { scrollableNavs.forEach(function(element) { handleScrollableNavScrollbars(element); }); } }); // Check if scrollable nav has scrollbar window.addEventListener(’resize’, function(event){ if ( scrollableNavs ) { scrollableNavs.forEach(function(element) { handleScrollableNavScrollbars(element); }); } }); ]]> 1 ? true : false); // Initialize lightGallery(gallery, { autoplay: galleryHasMultipleImages, counter: galleryHasMultipleImages, download: false, exThumbImage: thumbnailSource, hideControlOnEnd: true, licenseKey: ”96BAAD7E-3BF04397-BBB55AE3-6D5A2C0B”, loop: false, plugins: [lgAutoplay, lgFullscreen, lgThumbnail, lgZoom], selector: ’.diks-gallery__link’, mobileSettings: { controls: true, showCloseIcon: true }, strings: { closeGallery: ’Sulje galleria’, toggleMaximize: ’Maksimointi’, previousSlide: ’Edellinen’, nextSlide: ’Seuraava’, download: ’Lataa’, playVideo: ’Katso video’, mediaLoadingFailed: ’Sisällön lataus epäonnistui’, }, autoplayPluginStrings: { toggleAutoplay: ’Automaattinen toisto’ }, fullscreenPluginStrings: { toggleFullscreen: ’Kokoruututila’ }, thumbnailPluginStrings: { toggleThumbnails: ’Pikkukuvat’ }, zoomPluginStrings: { zoomIn: ’Suurenna’, zoomOut: ’Pienennä’, viewActualSize: ’Näytä täysikokoisena’ } }); // After closing LightGallery return focus to the image link that opened the gallery gallery.addEventListener(’lgAfterClose’, () => { galleryImageLinks[0].focus(); }); }); ]]> { // Stash the event so it can be triggered later deferredPrompt = e; const enablePrompt = 0; if(!enablePrompt) { e.preventDefault(); } // Update the UI to notify the user they can install PWA pwaShowInstallationOption(); // Handle installation document.querySelectorAll(’.js-diks-apps-pwa-installation-button’).forEach(function(button) { button.addEventListener(’click’, (e) => { // Show the prompt deferredPrompt.prompt(); // Wait for user to respond deferredPrompt.userChoice.then((choiceResult) => { if (choiceResult.outcome === ’accepted’) { console.log(’PWA: Installed (prompt)’); dataLayer.push({ ’event’: ’PWA.installation’, ’eventData’: ’success’ }); } else { console.log(’PWA: User dismissed installation prompt’); dataLayer.push({ ’event’: ’PWA.installation’, ’eventData’: ’canceled’ }); } deferredPrompt = null; }); }); }); }); // iOS installation process (show instructions modal) if (!navigator.standalone) { var userAgent = navigator.userAgent.toLowerCase(); var iPhoneUser = (/iphone/.test(userAgent)); var iPadUser = (/ipad/.test(userAgent) || (/macintosh/.test(userAgent) && navigator.maxTouchPoints > 1)); var safariUser = (/^(?!.*(brave|chrome|crios|duckduckgo|edgeios|firefox|fxios|opios|ucbrowser|yabrowser)).*safari.*$/.test(userAgent)); if (safariUser && (iPhoneUser || iPadUser)) { // Update the UI to notify the user they can install PWA pwaShowInstallationOption(); // Instructions var modals = document.querySelectorAll(’.js-diks-apps-pwa-ios-instructions’).forEach(function(element) { // Position on screen based on device if (iPhoneUser) { element.classList.add(’diks-apps__pwa-ios-modal–bottom’); } else if (iPadUser) { element.classList.add(’diks-apps__pwa-ios-modal–top’); } }); // Handle modal instructions from installation button document.querySelectorAll(’.js-diks-apps-pwa-installation-button’).forEach(function(button) { button.addEventListener(’click’, (e) => { // Show first modal document.querySelector(’.js-diks-apps-pwa-ios-instructions’).classList.toggle(’diks-apps__pwa-ios-modal–is-visible’); dataLayer.push({ ’event’: ’PWA.instructions.shown’, ’eventData’: ’iOS’ }); }); }); } } ]]>Lähde