{"id":917,"date":"2026-06-10T22:30:04","date_gmt":"2026-06-10T20:30:04","guid":{"rendered":"https:\/\/test.garpcity.no\/ikmtoday\/?page_id=917"},"modified":"2026-06-11T00:39:13","modified_gmt":"2026-06-10T22:39:13","slug":"ons26","status":"publish","type":"page","link":"https:\/\/test.garpcity.no\/ikmtoday\/ons26\/","title":{"rendered":"ONS26"},"content":{"rendered":"\n<div class=\"wp-block-columns alignfull is-layout-flex wp-container-core-columns-is-layout-995f960e wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column sticky-col is-layout-flow wp-container-core-column-is-layout-cc39918e wp-block-column-is-layout-flow\" style=\"padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\">\n<div class=\"wp-block-cover has-custom-content-position is-position-top-center\" style=\"margin-top:0px;margin-bottom:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;min-height:100vh;aspect-ratio:unset;\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-palette-color-3-background-color has-background-dim-100 has-background-dim\"><\/span><div class=\"wp-block-cover__inner-container is-layout-constrained wp-container-core-cover-is-layout-1b85de1f wp-block-cover-is-layout-constrained\"><script type=\"text\/javascript\">jQuery(function() { _initLayerSlider( '#layerslider_9_1i4941lk6chsu', {createdWith: '7.8.0', sliderVersion: '8.2.0', type: 'fixedsize', performanceMode: true, slideDuration: 4400, slideOnSwipe: false, startInViewport: false, keybNav: false, touchNav: false, cycles: 1, skin: 'v6', navPrevNext: false, hoverPrevNext: false, navStartStop: false, navButtons: false, showCircleTimer: false, youtubePreview: 'hqdefault.jpg', useSrcset: false, skinsPath: 'https:\/\/test.garpcity.no\/ikmtoday\/wp-content\/plugins\/LayerSlider\/assets\/static\/layerslider\/skins\/', ajaxURL: 'https:\/\/test.garpcity.no\/ikmtoday\/wp-admin\/admin-ajax.php'}); });<\/script><div id=\"layerslider_9_1i4941lk6chsu\"  class=\"ls-wp-container fitvidsignore ls-selectable\" style=\"width:1920px;height:1080px;margin:0 auto;\"><div class=\"ls-slide\" ><ls-layer style=\"width:1600px;height:1000px;\" class=\"ls-l ls-media-layer\" data-ls=\"muted:enabled;loopmedia:disabled;backgroundvideo:true;\"><video width=\"640\" height=\"360\" preload=\"metadata\" controls playsinline muted><source src=\"https:\/\/test.garpcity.no\/ikmtoday\/wp-content\/uploads\/sites\/83\/2024\/08\/LOW_FAST_Yard_Motion_26_8.mp4\" type=\"video\/mp4\" \/><\/video><\/ls-layer><\/div><div class=\"ls-slide\" ><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"720\" src=\"https:\/\/test.garpcity.no\/ikmtoday\/wp-content\/uploads\/sites\/83\/2024\/06\/ls-project-9-slide-1.jpg\" class=\"ls-tn\" alt=\"\"   \/><ls-layer style=\"font-size:15px;padding-top:10px;padding-bottom:10px;padding-right:20px;padding-left:20px;background-color:#fff;border-radius:0px 0px 0px 0px;cursor:pointer;left:78.95%;top:82.55%;color:#000000;\" class=\"ls-l ls-hide-phone ls-button-layer\" data-ls=\"minresponsiveratio:0.7;\" data-ls-actions='[{\"action\":\"openPopup\",\"trigger\":\"click\",\"delay\":0,\"popup\":88,\"slide\":\"\",\"toggle\":true}]'>Maritime equipment<\/ls-layer><ls-layer style=\"font-size:15px;padding-top:10px;padding-bottom:10px;padding-right:20px;padding-left:20px;background-color:#fff;border-radius:0px 0px 0px 0px;cursor:pointer;left:13.71%;top:24.03%;color:#000000;\" class=\"ls-l ls-hide-phone ls-button-layer\" data-ls=\"minresponsiveratio:0.7;\" data-ls-actions='[{\"action\":\"openPopup\",\"trigger\":\"click\",\"delay\":0,\"popup\":52,\"slide\":\"\",\"toggle\":true}]'>Inspection<\/ls-layer><ls-layer style=\"font-size:15px;padding-top:10px;padding-bottom:10px;padding-right:20px;padding-left:20px;background-color:#fff;border-radius:0px 0px 0px 0px;cursor:pointer;left:14.37%;top:59.68%;color:#000000;\" class=\"ls-l ls-hide-phone ls-button-layer\" data-ls=\"minresponsiveratio:0.7;\" data-ls-actions='[{\"action\":\"openPopup\",\"trigger\":\"click\",\"delay\":0,\"popup\":147,\"slide\":\"\",\"toggle\":true}]'>Mechanical processing \/ HVAC<\/ls-layer><ls-layer style=\"font-size:15px;padding-top:10px;padding-bottom:10px;padding-right:20px;padding-left:20px;background-color:#fff;border-radius:0px 0px 0px 0px;cursor:pointer;left:28.75%;top:38.01%;color:#000000;\" class=\"ls-l ls-hide-phone ls-button-layer\" data-ls=\"minresponsiveratio:0.7;\" data-ls-actions='[{\"action\":\"openPopup\",\"trigger\":\"click\",\"delay\":0,\"popup\":82,\"slide\":\"\",\"toggle\":true}]'>Maintenance.<\/ls-layer><ls-layer style=\"font-size:15px;padding-top:10px;padding-bottom:10px;padding-right:20px;padding-left:20px;background-color:#fff;border-radius:0px 0px 0px 0px;cursor:pointer;left:46.67%;top:78.47%;color:#000000;\" class=\"ls-l ls-hide-phone ls-button-layer\" data-ls=\"minresponsiveratio:0.7;\" data-ls-actions='[{\"action\":\"openPopup\",\"trigger\":\"click\",\"delay\":0,\"popup\":85,\"slide\":\"\",\"toggle\":true}]'>Operating support<\/ls-layer><ls-layer style=\"font-size:15px;padding-top:10px;padding-bottom:10px;padding-right:20px;padding-left:20px;background-color:#fff;border-radius:0px 0px 0px 0px;cursor:pointer;left:50.03%;top:62.18%;color:#000000;\" class=\"ls-l ls-hide-phone ls-button-layer\" data-ls=\"minresponsiveratio:0.7;\" data-ls-actions='[{\"action\":\"openPopup\",\"trigger\":\"click\",\"delay\":0,\"popup\":83,\"slide\":\"\",\"toggle\":true}]'>Engineering \/ Support \/ Project management<\/ls-layer><a style=\"\" class=\"ls-l ls-hide-phone\" href=\"https:\/\/test.garpcity.no\/ikmtoday\/start\/\" target=\"_self\"><ls-layer style=\"padding-top:0.6em;padding-bottom:0.6em;padding-right:0.6em;padding-left:0.6em;border-radius:10em;left:266px;top:92px;text-shadow:0px 0px 0px;background-color:#ffffff;color:#756e6e;\" class=\"ls-button-layer\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"fas\" data-icon=\"chevron-left\" class=\"svg-inline--fa fa-chevron-left fa-w-10\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewbox=\"0 0 320 512\" style=\"color:#2e2e2e;font-size:1em;\"><path fill=\"currentColor\" d=\"M34.52 239.03L228.87 44.69c9.37-9.37 24.57-9.37 33.94 0l22.67 22.67c9.36 9.36 9.37 24.52.04 33.9L131.49 256l154.02 154.75c9.34 9.38 9.32 24.54-.04 33.9l-22.67 22.67c-9.37 9.37-24.57 9.37-33.94 0L34.52 272.97c-9.37-9.37-9.37-24.57 0-33.94z\"><\/path><\/svg><\/ls-layer><\/a><ls-layer style=\"top:179px;left:262px;color:#ffffff;font-size:19px;\" class=\"ls-l ls-hide-phone ls-text-layer\">Go to start<\/ls-layer><ls-layer style=\"font-size:15px;padding-top:10px;padding-bottom:10px;padding-right:20px;padding-left:20px;background-color:#fff;border-radius:0px 0px 0px 0px;cursor:pointer;left:1033px;top:56.62%;color:#000000;\" class=\"ls-l ls-hide-desktop ls-hide-tablet ls-button-layer\" data-ls=\"minresponsiveratio:0.7;\" data-ls-actions='[{\"action\":\"openPopup\",\"trigger\":\"click\",\"delay\":0,\"popup\":88,\"slide\":\"\",\"toggle\":true}]'>Maritime equipment<\/ls-layer><ls-layer style=\"font-size:15px;padding-top:10px;padding-bottom:10px;padding-right:20px;padding-left:20px;background-color:#fff;border-radius:0px 0px 0px 0px;cursor:pointer;left:1097px;top:43.38%;color:#000000;\" class=\"ls-l ls-hide-desktop ls-hide-tablet ls-button-layer\" data-ls=\"minresponsiveratio:0.7;\" data-ls-actions='[{\"action\":\"openPopup\",\"trigger\":\"click\",\"delay\":0,\"popup\":52,\"slide\":\"\",\"toggle\":true}]'>Inspection<\/ls-layer><ls-layer style=\"font-size:15px;padding-top:10px;padding-bottom:10px;padding-right:20px;padding-left:20px;background-color:#fff;border-radius:0px 0px 0px 0px;cursor:pointer;left:960px;top:61.16%;color:#000000;\" class=\"ls-l ls-hide-desktop ls-hide-tablet ls-button-layer\" data-ls=\"minresponsiveratio:0.7;\" data-ls-actions='[{\"action\":\"openPopup\",\"trigger\":\"click\",\"delay\":0,\"popup\":147,\"slide\":\"\",\"toggle\":true}]'>Mechanical processing \/ HVAC<\/ls-layer><ls-layer style=\"font-size:15px;padding-top:10px;padding-bottom:10px;padding-right:20px;padding-left:20px;background-color:#fff;border-radius:0px 0px 0px 0px;cursor:pointer;left:1076px;top:47.73%;color:#000000;\" class=\"ls-l ls-hide-desktop ls-hide-tablet ls-button-layer\" data-ls=\"minresponsiveratio:0.7;\" data-ls-actions='[{\"action\":\"openPopup\",\"trigger\":\"click\",\"delay\":0,\"popup\":82,\"slide\":\"\",\"toggle\":true}]'>Maintenance.<\/ls-layer><ls-layer style=\"font-size:15px;padding-top:10px;padding-bottom:10px;padding-right:20px;padding-left:20px;background-color:#fff;border-radius:0px 0px 0px 0px;cursor:pointer;left:1046px;top:52.18%;color:#000000;\" class=\"ls-l ls-hide-desktop ls-hide-tablet ls-button-layer\" data-ls=\"minresponsiveratio:0.7;\" data-ls-actions='[{\"action\":\"openPopup\",\"trigger\":\"click\",\"delay\":0,\"popup\":85,\"slide\":\"\",\"toggle\":true}]'>Operating support<\/ls-layer><ls-layer style=\"font-size:15px;padding-top:10px;padding-bottom:10px;padding-right:20px;padding-left:20px;background-color:#fff;border-radius:0px 0px 0px 0px;cursor:pointer;left:868px;top:39.12%;color:#000000;\" class=\"ls-l ls-hide-desktop ls-hide-tablet ls-button-layer\" data-ls=\"minresponsiveratio:0.7;\" data-ls-actions='[{\"action\":\"openPopup\",\"trigger\":\"click\",\"delay\":0,\"popup\":83,\"slide\":\"\",\"toggle\":true}]'>Engineering \/ Support \/ Project management<\/ls-layer><a style=\"\" class=\"ls-l ls-hide-desktop ls-hide-tablet\" href=\"https:\/\/test.garpcity.no\/ikmtoday\/start\/\" target=\"_self\"><ls-layer style=\"padding-top:0.6em;padding-bottom:0.6em;padding-right:0.6em;padding-left:0.6em;border-radius:0px 0px 0px 0px;left:0%;top:50%;text-shadow:0px 0px 0px;background-color:#ffffff;color:#756e6e;font-size:75px;\" class=\"ls-button-layer\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"fas\" data-icon=\"chevron-left\" class=\"svg-inline--fa fa-chevron-left fa-w-10\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewbox=\"0 0 320 512\" style=\"color:#2e2e2e;font-size:1em;\"><path fill=\"currentColor\" d=\"M34.52 239.03L228.87 44.69c9.37-9.37 24.57-9.37 33.94 0l22.67 22.67c9.36 9.36 9.37 24.52.04 33.9L131.49 256l154.02 154.75c9.34 9.38 9.32 24.54-.04 33.9l-22.67 22.67c-9.37 9.37-24.57 9.37-33.94 0L34.52 272.97c-9.37-9.37-9.37-24.57 0-33.94z\"><\/path><\/svg><\/ls-layer><\/a><ls-layer style=\"width:1600px;height:1000px;\" class=\"ls-l ls-media-layer\" data-ls=\"muted:enabled;loopmedia:enabled;backgroundvideo:true;\"><video width=\"640\" height=\"360\" preload=\"metadata\" controls playsinline muted><source src=\"https:\/\/test.garpcity.no\/ikmtoday\/wp-content\/uploads\/sites\/83\/2024\/08\/LOW_RUN_Yard3_25_8.mp4\" type=\"video\/mp4\" \/><\/video><\/ls-layer><\/div><\/div>\n<\/div><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:30%\">\n<div class=\"wp-block-cover has-custom-content-position is-position-top-center\" style=\"padding-top:30px;padding-right:30px;padding-bottom:30px;padding-left:30px;min-height:341px;aspect-ratio:unset;\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" class=\"wp-block-cover__image-background wp-image-889 size-large\" alt=\"\" src=\"https:\/\/test.garpcity.no\/ikmtoday\/wp-content\/uploads\/sites\/83\/2026\/06\/6a167e40c744660fcb40b512_Framegrab_30236_IKM_Subsea-1024x576.jpg\" data-object-fit=\"cover\" srcset=\"https:\/\/test.garpcity.no\/ikmtoday\/wp-content\/uploads\/sites\/83\/2026\/06\/6a167e40c744660fcb40b512_Framegrab_30236_IKM_Subsea-1024x576.jpg 1024w, https:\/\/test.garpcity.no\/ikmtoday\/wp-content\/uploads\/sites\/83\/2026\/06\/6a167e40c744660fcb40b512_Framegrab_30236_IKM_Subsea-300x169.jpg 300w, https:\/\/test.garpcity.no\/ikmtoday\/wp-content\/uploads\/sites\/83\/2026\/06\/6a167e40c744660fcb40b512_Framegrab_30236_IKM_Subsea-768x432.jpg 768w, https:\/\/test.garpcity.no\/ikmtoday\/wp-content\/uploads\/sites\/83\/2026\/06\/6a167e40c744660fcb40b512_Framegrab_30236_IKM_Subsea-1536x864.jpg 1536w, https:\/\/test.garpcity.no\/ikmtoday\/wp-content\/uploads\/sites\/83\/2026\/06\/6a167e40c744660fcb40b512_Framegrab_30236_IKM_Subsea.jpg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><span aria-hidden=\"true\" class=\"wp-block-cover__background has-palette-color-4-background-color has-background-dim-60 has-background-dim\"><\/span><div class=\"wp-block-cover__inner-container is-layout-constrained wp-container-core-cover-is-layout-c849644e wp-block-cover-is-layout-constrained\">\n<p class=\"has-text-align-center has-palette-color-5-color has-text-color has-link-color wp-elements-a8e267cbafd574388a09c36743705547 wp-block-paragraph\" style=\"font-size:clamp(23.043px, 1.44rem + ((1vw - 3.2px) * 1.169), 38px);font-style:normal;font-weight:700\">IKM AI Assist<\/p>\n\n\n\n<div style=\"height:44px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-995f960e wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:35%\"><\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image aligncenter size-full has-custom-border\" style=\"margin-right:31.1%;margin-left:199px\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/test.garpcity.no\/ikmtoday\/wp-content\/uploads\/sites\/83\/2026\/06\/IKM1.png\" alt=\"\" class=\"wp-image-912\" style=\"border-style:none;border-width:0px\"\/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:30%\"><\/div>\n<\/div>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-cover is-light has-custom-content-position is-position-top-center\" style=\"padding-top:40px;padding-right:40px;padding-bottom:40px;padding-left:40px;min-height:100vh;aspect-ratio:unset;\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-100 has-background-dim\" style=\"background-color:#ededed\"><\/span><div class=\"wp-block-cover__inner-container is-layout-constrained wp-container-core-cover-is-layout-9cf33cdc wp-block-cover-is-layout-constrained\">\n<meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Minimalistisk Chat<\/title>\n    <script src=\"https:\/\/cdn.tailwindcss.com\"><\/script>\n    <style>\n        \/* === ALT SCOPET TIL #chat-widget === *\/\n\n        #chat-widget {\n            display: flex;\n            flex-direction: column;\n            width: 100%;\n            height: 100%;\n        }\n\n        #chat-widget #chat-input,\n        #chat-widget #chat-input:focus,\n        #chat-widget #chat-input:active {\n            outline: none !important;\n            box-shadow: none !important;\n            border: none !important;\n            -webkit-appearance: none !important;\n            appearance: none !important;\n        }\n\n        #chat-widget .layout-transition {\n            transition: all 0.6s cubic-bezier(0.23, 1, 0.32, 1);\n        }\n\n        #chat-widget #chat-container::-webkit-scrollbar {\n            width: 6px;\n        }\n        #chat-widget #chat-container::-webkit-scrollbar-track {\n            background: transparent;\n        }\n        #chat-widget #chat-container::-webkit-scrollbar-thumb {\n            background-color: #e5e7eb;\n            border-radius: 20px;\n        }\n\n        #chat-widget .typing-dot {\n            animation: chat-widget-typing 1.4s infinite ease-in-out both;\n        }\n        #chat-widget .typing-dot:nth-child(1) { animation-delay: -0.32s; }\n        #chat-widget .typing-dot:nth-child(2) { animation-delay: -0.16s; }\n        @keyframes chat-widget-typing {\n            0%, 80%, 100% { transform: scale(0); opacity: 0.5; }\n            40% { transform: scale(1); opacity: 1; }\n        }\n\n        @keyframes chat-widget-pulse-red {\n            0% { color: #ef4444; transform: scale(1); }\n            50% { color: #dc2626; transform: scale(1.1); }\n            100% { color: #ef4444; transform: scale(1); }\n        }\n        #chat-widget .listening {\n            animation: chat-widget-pulse-red 1.5s infinite;\n            color: #ef4444 !important;\n        }\n    <\/style>\n\n    <!-- WRAPPER MED UNIK ID -->\n    <div id=\"chat-widget\">\n\n        <div id=\"chat-container\" class=\"flex-1 w-full max-w-3xl mx-auto overflow-y-auto px-4 pt-10 pb-4 opacity-0 hidden flex-col space-y-6 layout-transition\"><\/div>\n\n        <div id=\"input-wrapper\" class=\"w-full max-w-3xl mx-auto p-4 flex flex-col justify-center h-full layout-transition relative z-10\">\n            \n            <div id=\"welcome-text\" class=\"text-center mb-10 layout-transition\">\n                <h1 class=\"text-[25px] font-light text-[#424242]\">Ask me about Operational support, maintenance and shutdown of offshore installations.<\/h1>\n            <\/div>\n\n            <div class=\"flex items-center w-full bg-white rounded-[2rem] shadow-[0_4px_20px_-3px_rgba(0,0,0,0.04)] transition-all focus-within:shadow-[0_4px_25px_-3px_rgba(0,0,0,0.08)]\">\n                \n                <input type=\"text\" id=\"chat-input\" class=\"flex-1 bg-transparent py-4 pl-6 pr-2 text-lg placeholder-gray-300 w-full\" placeholder=\"Ask here...\" autocomplete=\"off\">\n                \n                <button id=\"mic-button\" type=\"button\" class=\"p-2 mr-1 text-gray-400 hover:text-gray-600 transition-colors flex-shrink-0 hidden\" title=\"Bruk stemme\">\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n                        <path d=\"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z\"><\/path>\n                        <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"><\/path>\n                        <line x1=\"12\" x2=\"12\" y1=\"19\" y2=\"22\"><\/line>\n                    <\/svg>\n                <\/button>\n                \n                <button id=\"send-button\" class=\"m-2 w-11 h-11 flex-shrink-0 flex items-center justify-center bg-black text-white rounded-full hover:bg-gray-800 transition-transform active:scale-90 disabled:opacity-30 disabled:hover:bg-black\">\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n                        <path d=\"m5 12 7-7 7 7\"><\/path>\n                        <path d=\"M12 19V5\"><\/path>\n                    <\/svg>\n                <\/button>\n\n            <\/div>\n        <\/div>\n\n    <\/div><!-- END #chat-widget -->\n\n    <script>\n        const N8N_WEBHOOK_URL = 'https:\/\/garpcity.app.n8n.cloud\/webhook\/z0mwAI6U1E40uvdZ'; \n\n        const chatInput = document.getElementById('chat-input');\n        const sendButton = document.getElementById('send-button');\n        const micButton = document.getElementById('mic-button');\n        const chatContainer = document.getElementById('chat-container');\n        const inputWrapper = document.getElementById('input-wrapper');\n        const welcomeText = document.getElementById('welcome-text');\n        \n        let isFirstMessage = true;\n        const currentSessionId = crypto.randomUUID ? crypto.randomUUID() : 'session-' + Date.now() + '-' + Math.random().toString(36).substring(2, 9);\n\n        let recognition;\n        let isListening = false;\n        let originalText = \"\";\n\n        if ('SpeechRecognition' in window || 'webkitSpeechRecognition' in window) {\n            micButton.classList.remove('hidden');\n            \n            const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;\n            recognition = new SpeechRecognition();\n            recognition.lang = 'no-NO';\n            recognition.continuous = false;\n            recognition.interimResults = true;\n\n            recognition.onstart = function() {\n                isListening = true;\n                micButton.classList.add('listening');\n                originalText = chatInput.value; \n                if (originalText && !originalText.endsWith(' ')) {\n                    originalText += ' '; \n                }\n                chatInput.placeholder = \"Lytter...\";\n            };\n\n            recognition.onresult = function(event) {\n                let transcript = '';\n                for (let i = event.resultIndex; i < event.results.length; ++i) {\n                    transcript += event.results[i][0].transcript;\n                }\n                chatInput.value = originalText + transcript;\n                sendButton.disabled = chatInput.value.trim() === '';\n            };\n\n            recognition.onerror = function() {\n                stopListening();\n            };\n\n            recognition.onend = function() {\n                stopListening();\n            };\n\n            micButton.addEventListener('click', () => {\n                if (isListening) {\n                    recognition.stop();\n                } else {\n                    try {\n                        recognition.start();\n                        setTimeout(() => chatInput.focus(), 10);\n                    } catch (error) {\n                        console.error(error);\n                    }\n                }\n            });\n        }\n\n        function stopListening() {\n            isListening = false;\n            micButton.classList.remove('listening');\n            chatInput.placeholder = \"Ask here...\";\n        }\n\n        sendButton.addEventListener('click', () => {\n            handleSend();\n            setTimeout(() => chatInput.focus(), 10);\n        });\n        \n        chatInput.addEventListener('keypress', (e) => {\n            if (e.key === 'Enter') handleSend();\n        });\n\n        chatInput.addEventListener('input', () => {\n            sendButton.disabled = chatInput.value.trim() === '';\n        });\n        sendButton.disabled = true;\n\n        async function handleSend() {\n            const messageText = chatInput.value.trim();\n            if (!messageText) return;\n\n            if (isListening && recognition) {\n                recognition.stop();\n            }\n\n            chatInput.value = '';\n            sendButton.disabled = true;\n\n            if (isFirstMessage) {\n                transitionLayout();\n                isFirstMessage = false;\n            }\n\n            addMessageToChat(messageText, 'user');\n            const typingIndicatorId = showTypingIndicator();\n            const responseText = await fetchFromN8n(messageText);\n            removeTypingIndicator(typingIndicatorId);\n            addMessageToChat(responseText, 'bot');\n        }\n\n        function transitionLayout() {\n            welcomeText.style.opacity = '0';\n            welcomeText.style.height = '0';\n            welcomeText.style.margin = '0';\n            welcomeText.style.overflow = 'hidden';\n\n            inputWrapper.classList.remove('h-full', 'justify-center');\n            inputWrapper.classList.add('pb-6', 'pt-2');\n\n            chatContainer.classList.remove('hidden');\n            void chatContainer.offsetWidth; \n            chatContainer.classList.add('opacity-100');\n        }\n\n        function formatTextWithLinks(text) {\n            if (!text) return \"\";\n\n            let formattedText = text;\n\n            formattedText = formattedText.replace(\/\\*\\*(.*?)\\*\\*\/g, '<strong class=\"font-semibold text-gray-900\">$1<\/strong>');\n            formattedText = formattedText.replace(\/(^|\\n)\\*\\s\/g, '$1&bull; ');\n            formattedText = formattedText.replace(\/\\[([^\\]]+)\\]\\((https?:\\\/\\\/[^\\s)]+)\\)\/g, function(match, title, url) {\n                return `<a href=\"${url}\" target=\"_blank\" class=\"text-blue-600 hover:underline font-medium\">${title}<\/a>`;\n            });\n\n            const plainUrlRegex = \/(?<!href=\"|\">)(https?:\\\/\\\/[^\\s<]+[^.,\\s!?:)])\/g;\n            formattedText = formattedText.replace(plainUrlRegex, function(url) {\n                return `<a href=\"${url}\" target=\"_blank\" class=\"text-blue-600 hover:underline break-all\">${url}<\/a>`;\n            });\n\n            return formattedText.replace(\/\\n\/g, '<br>');\n        }\n\n        function addMessageToChat(text, sender) {\n            const messageDiv = document.createElement('div');\n            messageDiv.className = `flex w-full ${sender === 'user' ? 'justify-end' : 'justify-start'}`;\n            const bubbleDiv = document.createElement('div');\n            \n            if (sender === 'user') {\n                bubbleDiv.className = 'max-w-[80%] bg-black text-white rounded-2xl rounded-tr-sm px-5 py-3.5 text-[15px] leading-relaxed shadow-sm';\n            } else {\n                bubbleDiv.className = 'w-full bg-white border border-gray-100 text-gray-800 rounded-2xl px-5 py-3.5 text-[15px] leading-relaxed shadow-sm';\n            }\n\n            bubbleDiv.innerHTML = formatTextWithLinks(text);\n            messageDiv.appendChild(bubbleDiv);\n            chatContainer.appendChild(messageDiv);\n            scrollToBottom();\n        }\n\n        function showTypingIndicator() {\n            const id = 'typing-' + Date.now();\n            const messageDiv = document.createElement('div');\n            messageDiv.id = id;\n            messageDiv.className = `flex w-full justify-start`;\n            const bubbleDiv = document.createElement('div');\n            bubbleDiv.className = 'bg-white border border-gray-100 rounded-2xl rounded-tl-sm px-5 py-4 shadow-sm flex items-center space-x-1';\n            bubbleDiv.innerHTML = `\n                <div class=\"w-1.5 h-1.5 bg-gray-400 rounded-full typing-dot\"><\/div>\n                <div class=\"w-1.5 h-1.5 bg-gray-400 rounded-full typing-dot\"><\/div>\n                <div class=\"w-1.5 h-1.5 bg-gray-400 rounded-full typing-dot\"><\/div>\n            `;\n            messageDiv.appendChild(bubbleDiv);\n            chatContainer.appendChild(messageDiv);\n            scrollToBottom();\n            return id;\n        }\n\n        function removeTypingIndicator(id) {\n            const el = document.getElementById(id);\n            if (el) el.remove();\n        }\n\n        function scrollToBottom() {\n            chatContainer.scrollTo({\n                top: chatContainer.scrollHeight,\n                behavior: 'smooth'\n            });\n        }\n\n        async function fetchFromN8n(message) {\n            if (!N8N_WEBHOOK_URL) return \"Feil: Mangler Webhook URL.\";\n\n            try {\n                const response = await fetch(N8N_WEBHOOK_URL, {\n                    method: 'POST',\n                    headers: { 'Content-Type': 'application\/json' },\n                    body: JSON.stringify({ message: message, sessionId: currentSessionId })\n                });\n\n                if (!response.ok) throw new Error(response.status);\n\n                const contentType = response.headers.get(\"content-type\");\n                if (contentType && contentType.indexOf(\"application\/json\") !== -1) {\n                    const data = await response.json();\n                    return data.output || data.response || data.text || data.reply || JSON.stringify(data);\n                } else {\n                    return await response.text();\n                }\n            } catch (error) {\n                return \"Tilkoblingsfeil.\";\n            }\n        }\n    <\/script>\n\n\n\n<p class=\"has-text-align-center has-small-font-size wp-block-paragraph\" style=\"padding-top:var(--wp--preset--spacing--40);padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)\">This AI service is trained with information from IKM. <br><strong>Privacy BY Design<\/strong>: Operated by Google Gemini where no information is passed on for training AI language models.<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-995f960e wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:45%\"><\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<div style=\"height:110px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"835\" src=\"https:\/\/test.garpcity.no\/ikmtoday\/wp-content\/uploads\/sites\/83\/2026\/06\/IKM_logo.png\" alt=\"\" class=\"wp-image-937\" style=\"aspect-ratio:0.9581423770241368;width:65px;height:auto\" srcset=\"https:\/\/test.garpcity.no\/ikmtoday\/wp-content\/uploads\/sites\/83\/2026\/06\/IKM_logo.png 800w, https:\/\/test.garpcity.no\/ikmtoday\/wp-content\/uploads\/sites\/83\/2026\/06\/IKM_logo-287x300.png 287w, https:\/\/test.garpcity.no\/ikmtoday\/wp-content\/uploads\/sites\/83\/2026\/06\/IKM_logo-768x802.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:30%\"><\/div>\n<\/div>\n<\/div><\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-917","page","type-page","status-publish","hentry"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/test.garpcity.no\/ikmtoday\/wp-json\/wp\/v2\/pages\/917","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/test.garpcity.no\/ikmtoday\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/test.garpcity.no\/ikmtoday\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/test.garpcity.no\/ikmtoday\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/test.garpcity.no\/ikmtoday\/wp-json\/wp\/v2\/comments?post=917"}],"version-history":[{"count":28,"href":"https:\/\/test.garpcity.no\/ikmtoday\/wp-json\/wp\/v2\/pages\/917\/revisions"}],"predecessor-version":[{"id":949,"href":"https:\/\/test.garpcity.no\/ikmtoday\/wp-json\/wp\/v2\/pages\/917\/revisions\/949"}],"wp:attachment":[{"href":"https:\/\/test.garpcity.no\/ikmtoday\/wp-json\/wp\/v2\/media?parent=917"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}