{"id":45470,"date":"2022-06-16T15:14:22","date_gmt":"2022-06-16T15:14:22","guid":{"rendered":"https:\/\/spaineasy.com\/property-search\/"},"modified":"2026-11-03T14:35:54","modified_gmt":"2026-11-03T14:35:54","slug":"boligsok","status":"publish","type":"page","link":"https:\/\/spaineasy.com\/no\/boligsok\/","title":{"rendered":"Boligs\u00f8k"},"content":{"rendered":"<style>#main{padding-left:0!important;padding-right:0!important}#main>.fusion-row{max-width:100%!important}<\/style>\n<h1 class=\"screen-reader-text\">Boligs\u00f8k i Spania<\/h1>\n<div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-1 fusion-flex-container has-pattern-background has-mask-background nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-padding-top:0px;--awb-padding-right:0px;--awb-padding-bottom:0px;--awb-padding-left:0px;--awb-padding-top-small:0.5em;--awb-padding-right-small:0px;--awb-padding-bottom-small:0px;--awb-padding-left-small:0px;--awb-margin-top:0px;--awb-margin-bottom:0px;--awb-margin-top-small:0px;--awb-margin-bottom-small:0px;--awb-min-height:1200px;--awb-flex-wrap:wrap;\" id=\"sablewarm\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:1216.8px;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:0%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:0%;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"ole-form-outer\" style=\"min-height:100vh; width:100%; background:#fdfaf1; display:flex; align-items:flex-start; justify-content:center;\">\n  <div id=\"ole-form-root\"><\/div>\n<\/div>\n\n<script>\n(function(){\n\n  \"use strict\";\n\n  \/* =========================================================\n     1) HUBSPOT + OUTPUT CONFIG  (SpainEasy brand)\n     ========================================================= *\/\n  var HS = {\n    portalId: \"26258389\",\n    formGuid: \"14d59464-0052-402a-940c-17bd74709ff3\", \/\/ SpainEasy form \"Your property search (Optimized)\"\n    googleMapsKey: \"AIzaSyC-DNEU1BU8KyQPlRVDRGJEb1cwtZ3W6nk\", \/\/ restricted to spaineasy.com \u2014 enables Spanish city autocomplete (falls back to pills)\n    sendToHubSpot: true,\n      redirectUrl: \"https:\/\/spaineasy.com\/no\/takk\/\", \/\/ success -> thank-you page (passes firstname & location params)\n    subscriptionTypeId: 152859509, \/\/ \"Marketing Information\" (account-level)\n    fields: {\n      timing:     \"o_en_tesvous_dans_votre_projet_\",\n      worries:    \"questce_qui_vous_inquite_le_plus_\",\n      budget:     \"budget_pour_l_achat\",\n      location:   \"ville_ou_region_recherchee\",\n      property:   \"quelles_caractristiques_recherchezvous_dans_le_bien_immobilier_\",\n      motivation: \"quelle_est_votre_principale_motivation_pour_acheter_en_espagne_\",\n      service:    \"seriezvous_intress_par_un_service_qui_gre_les_dmarches_sur_place_pour_vous_\",\n      cb_days:    \"jour_rappel_souhaite\",\n      cb_slot:    \"creneau_rappel\",\n      cb_date:    \"date_rappel_souhaitee\",\n      cb_clienttime: \"heure_chez_le_client\", \/\/ single-line text \u2014 local time at the client + their time zone\n      cb_rdv:     \"a_voulu_prendre_rendez_vous\",\n      lang:\"spaineasy_site_language\", hslang:\"hs_language\", vcountry:\"spaineasy_visitor_country\", firstname:  \"firstname\", lastname:\"lastname\", email:\"email\", phone:\"phone\"\n    }\n  };\n\n  var SHOW_HERO = true;\n  var RISKS_FORMAT = \"quiz\";\n    var CLOSE_URL = \"https:\/\/spaineasy.com\/no\/\";\n  var RDV_URL = \"https:\/\/spaineasy.com\/no\/mote\/\"; \/\/ booking page, used if \"I'd rather book a call\"\n  var PRIVACY_URL = \"https:\/\/spaineasy.com\/no\/bruksvilkar-og-personvernerklaering\/\";\n  var SCROLL_TOTOP = true;\n  var SCROLL_OFFSET = 24;\n\n  \/* =========================================================\n     2) STEPS  (  Norwegian Bokm\u00e5l)\n     ========================================================= *\/\n  var STEPS = [\n    { id:\"timing\", type:\"single\", required:true, ebIco:\"award\", heroIco:\"calendar-clock\",\n       heroCap:\"Hvert prosjekt har sitt eget tempo, og vi f\u00f8lger ditt.\",\n      eyebrow:\"Ekspertise p\u00e5 kj\u00f8pers side\",\n      q:\"N\u00e5r vil du starte s\u00f8ket?\",\n      options:[\n        {  label:\"S\u00e5 snart som mulig\", ic:\"zap\"},\n        {label:\"I l\u00f8pet av de neste 6 m\u00e5nedene\", ic:\"calendar-days\"},\n        {label:\"I l\u00f8pet av 12 m\u00e5neder\", ic:\"sprout\"},\n        {label:\"Det avhenger av noe som p\u00e5g\u00e5r (boligsalg, sparing \u2026)\", ic:\"git-branch\"},\n        {label:\"Jeg ser meg bare om forel\u00f8pig\", ic:\"lightbulb\"}\n      ],\n      react:{\n          \"S\u00e5 snart som mulig\":{emoji:\"\\u2600\\uFE0F\",msg:\"Ol\u00e9! Vi kan sette i gang med en gang.\"},\n        \"I l\u00f8pet av de neste 6 m\u00e5nedene\":{emoji:\"\\uD83D\\uDDD3\\uFE0F\",msg:\"Det ideelle tidsrommet for \u00e5 forberede seg i ro og fred.\"},\n        \"I l\u00f8pet av 12 m\u00e5neder\":{emoji:\"\\uD83C\\uDF31\",msg:\"God tid til \u00e5 finne akkurat riktig bolig.\"},\n        \"Det avhenger av noe som p\u00e5g\u00e5r (boligsalg, sparing \u2026)\":{emoji:\"\\uD83E\\uDD1D\",msg:\"Vi f\u00f8lger ditt tempo, helt uten press.\"},\n        \"Jeg ser meg bare om forel\u00f8pig\":{emoji:\"\\uD83D\\uDCA1\",msg:\"Se deg rundt i ro og fred, vi er her n\u00e5r du er klar.\"}\n      }},\n\n    { id:\"worries\", type:\"multi\", required:true, ebIco:\"shield-check\", heroIco:\"shield-check\",\n       heroCap:\"Bekymringene dine er nettopp det vi tar oss av.\",\n      eyebrow:\"En kj\u00f8peragent som bare jobber for deg\",\n      q:\"Hva bekymrer deg mest?\", sub:\"Velg alt som passer\",\n      options:[\n        {label:\"Juss og papirarbeid (NIE, notar)\", ic:\"file-text\"},\n        {label:\"Spr\u00e5kbarrieren (spansk)\", ic:\"languages\"},\n        {label:\"Om boligen er i god stand\", ic:\"search-check\"},\n        {label:\"Avstanden (flyreiser frem og tilbake hjemmefra)\", ic:\"plane\"},\n        {label:\"Den spanske kj\u00f8psprosessen (f\u00e6rre kontroller enn hjemme)\", ic:\"scale\"},\n        {label:\"Overf\u00f8ring av penger, valuta og skatt\", ic:\"banknote\"},\n        {label:\"For lite tid\", ic:\"clock\"}\n      ],\n      optMsg:{\n        \"Juss og papirarbeid (NIE, notar)\":{emoji:\"\\uD83D\\uDDC2\\uFE0F\",msg:\"Papirarbeidet (NIE, notar, bank) tar vi oss av fra start til slutt, s\u00e5 du slipper.\"},\n        \"Spr\u00e5kbarrieren (spansk)\":{emoji:\"\\uD83D\\uDDE3\\uFE0F\",msg:\"Spr\u00e5kbarriere? Vi oversetter og forhandler p\u00e5 spansk for deg, og forklarer alt p\u00e5 engelsk.\"},\n        \"Om boligen er i god stand\":{emoji:\"\\uD83D\\uDD0D\",msg:\"Vi sjekker og vurderer alt p\u00e5 stedet f\u00f8r du binder deg.\"},\n        \"Avstanden (flyreiser frem og tilbake hjemmefra)\":{emoji:\"\\u2708\\uFE0F\",msg:\"Vi er dine \u00f8yne og \u00f8rer i Spania, med langt f\u00e6rre reiser for deg.\"},\n        \"Den spanske kj\u00f8psprosessen (f\u00e6rre kontroller enn hjemme)\":{emoji:\"\\u2696\\uFE0F\",msg:\"Vi gj\u00f8r v\u00e5r egen juridiske gjennomgang i tillegg til notaren, ingenting slipper gjennom.\"},\n        \"Overf\u00f8ring av penger, valuta og skatt\":{emoji:\"\\uD83D\\uDCB1\",msg:\"Vi setter deg i kontakt med valuta- og skatteeksperter som kan overf\u00f8ringer til Spania ut og inn.\"},\n        \"For lite tid\":{emoji:\"\\u23F3\",msg:\"Vi gj\u00f8r grovarbeidet; du har siste ord.\"}\n      },\n      multiMsg:{\n        \"2\":{emoji:\"\\uD83D\\uDEE1\\uFE0F\",msg:\"To reelle bekymringer, og akkurat dem sikrer vi for deg fra start til slutt.\"},\n        \"3\":{emoji:\"\\uD83D\\uDEE1\\uFE0F\",msg:\"Tre forst\u00e5elige bekymringer. Den gode nyheten: \u00e5 ta h\u00e5nd om dem er kjernen i jobben v\u00e5r.\"},\n        \"4\":{emoji:\"\\uD83D\\uDCAA\",msg:\"Mange sp\u00f8rsm\u00e5l er normalt n\u00e5r man kj\u00f8per i utlandet. Det er nettopp derfor SpainEasy finnes.\"},\n        \"5\":{emoji:\"\\uD83D\\uDCAA\",msg:\"Du ser nesten alle fallgruvene, og du har rett. Vi uskadeliggj\u00f8r dem \u00e9n etter \u00e9n.\"},\n        \"6\":{emoji:\"\\uD83E\\uDD1D\",msg:\"Du ser hele bildet. Vi tar oss av hvert av disse punktene for deg.\"},\n        \"7\":{emoji:\"\\uD83E\\uDD1D\",msg:\"Du ser hele bildet. Vi tar oss av hvert av disse punktene for deg.\"}\n      },\n      reactAny:{emoji:\"\\uD83D\\uDEE1\\uFE0F\",msg:\"Alle disse punktene er v\u00e5r jobb, vi tar oss av alt.\"}},\n\n    { id:\"location\", type:\"location\", required:true, ebIco:\"map\", heroIco:\"map-pin\",\n      heroCap:\"Hele Spania, fra kyst til kyst: vi s\u00f8ker overalt for deg.\",\n      eyebrow:\"Vi dekker hele Spania\",\n      q:\"Hvor i Spania leter du?\", placeholder:\"f.eks. Marbella\",\n      cities:[\"Alicante\",\"Barcelona\",\"Benidorm\",\"C\u00e1diz\",\"Estepona\",\"Fuengirola\",\"Girona\",\"Granada\",\"Ibiza\",\"Madrid\",\"M\u00e1laga\",\"Marbella\",\"Mijas\",\"Nerja\",\"Palma de Mallorca\",\"Sevilla\",\"Sitges\",\"Tarragona\",\"Torrevieja\",\"Valencia\"],\n      regions:[\"Costa del Sol\",\"Costa Blanca\",\"Costa Brava\",\"Costa Dorada\",\"Andaluc\u00eda\",\"Balearene\",\"Kanari\u00f8yene\",\"Catalonia\"]},\n\n    { id:\"budget\", type:\"budget\", required:true, ebIco:\"handshake\", heroIco:\"wallet\",\n       heroCap:\"Vi forhandler alltid i din interesse, og det er ofte verdt langt mer enn honoraret v\u00e5rt.\",\n      eyebrow:\"Vi forhandler alltid i din interesse\",\n      q:\"Hva er budsjettet ditt?\", placeholder:\"f.eks. 350 000 \u20ac\", min:100000,\n      pills:[150000,200000,250000,300000,400000,500000,750000,1000000,1500000,2000000,3000000],\n      reactRanges:[\n        {max:149999,  emoji:\"\\uD83E\\uDDED\",  msg:\"Under 150 000 \u20ac er det trangere, men vi finner fortsatt perler i de riktige omr\u00e5dene.\"},\n        {max:299999,  emoji:\"\\uD83D\\uDD0D\",msg:\"I denne prisklassen finnes det reelle muligheter.\"},\n        {max:499999,  emoji:\"\\u2600\\uFE0F\",msg:\"Et ideelt niv\u00e5 for en plass i den spanske solen.\"},\n        {max:999999,  emoji:\"\\uD83C\\uDFE1\",msg:\"Nok til \u00e5 sikte mot noe helt spesielt.\"},\n        {max:999999999,emoji:\"\\u2728\",msg:\"Ol\u00e9! Toppsegmentet i Spania st\u00e5r \u00e5pent for deg.\"}\n      ]},\n\n    { id:\"property\", type:\"single\", required:true, ebIco:\"key-round\", heroIco:\"home\",\n      heroCap:\"Vi leter etter boligen som passer deg, ikke en vi tilfeldigvis har i portef\u00f8ljen.\",\n      eyebrow:\"Annerledes enn en megler som selger egne boliger\",\n      q:\"Hva slags bolig ser du etter?\",\n      options:[\n        {  label:\"Leilighet\", ic:\"building-2\"},\n        {label:\"Hus\", ic:\"home\"},\n        {label:\"Hus med hage eller basseng\", ic:\"trees\"},\n        {label:\"Luksusbolig\", ic:\"gem\"},\n        {label:\"Annet\", ic:\"search\"}\n      ],\n      react:{\n        \"Leilighet\":{emoji:\"\\uD83C\\uDF07\",msg:\"Enkelt, lyst og lettstelt: en spansk klassiker.\"},\n        \"Hus\":{emoji:\"\\uD83C\\uDFE0\",msg:\"Plass og sol helt for deg selv.\"},\n        \"Hus med hage eller basseng\":{emoji:\"\\uD83C\\uDF3F\",msg:\"Terrasse, hage, basseng: dr\u00f8mmen.\"},\n        \"Luksusbolig\":{emoji:\"\\u2728\",msg:\"Toppsegmentet: vi vet n\u00f8yaktig hvor vi skal lete.\"},\n        \"Annet\":{emoji:\"\\uD83D\\uDD0E\",msg:\"Fortell oss alt, s\u00e5 finner vi det som passer.\"}\n      }},\n\n    { id:\"motivation\", type:\"single\", required:true, ebIco:\"compass\", heroIco:\"compass\",\n      heroCap:\"Hjem, feriested, pensjonisttilv\u00e6relse eller investering: m\u00e5let ditt styrer s\u00f8ket v\u00e5rt.\",\n      eyebrow:\"Veiledning i hele Spania\",\n      q:\"Hva er hovedgrunnen til at du vil kj\u00f8pe i Spania?\",\n      options:[\n        {  label:\"Flytte \/ fast bolig\", ic:\"sun\"},\n        {label:\"Ferie \/ feriebolig\", ic:\"umbrella\"},\n        {label:\"Pensjonisttilv\u00e6relse\", ic:\"palmtree\"},\n        {label:\"Utleieinvestering\", ic:\"trending-up\"},\n        {label:\"Annet\", ic:\"handshake\"}\n      ],\n      react:{\n        \"Flytte \/ fast bolig\":{emoji:\"\\u2600\\uFE0F\",msg:\"Et helt nytt liv i solen begynner.\"},\n        \"Ferie \/ feriebolig\":{emoji:\"\\uD83C\\uDFD6\\uFE0F\",msg:\"Din egen bit av Middelhavet \u00e5 r\u00f8mme til.\"},\n        \"Pensjonisttilv\u00e6relse\":{emoji:\"\\uD83C\\uDF34\",msg:\"Sol, rolige morgener og lavere levekostnader: vel fortjent.\"},\n        \"Utleieinvestering\":{emoji:\"\\uD83D\\uDCC8\",msg:\"Utleiemarkedet i Spania er sterkt og i vekst.\"},\n        \"Annet\":{emoji:\"\\uD83E\\uDD1D\",msg:\"Uansett m\u00e5l tilpasser vi s\u00f8ket etter det.\"}\n      }},\n\n    { id:\"service\", type:\"single\", variant:\"yesno\", required:true, ebIco:\"headset\", heroIco:\"concierge-bell\",\n      heroCap:\"Vi kan ta oss av alt p\u00e5 stedet for deg: visninger, papirarbeid, forhandling.\",\n      eyebrow:\"Se hva kj\u00f8pere sier om oss\",\n      q:\"Vil du at vi tar oss av hele prosessen p\u00e5 stedet for deg?\",\n      options:[\n        {label:\"Ja, det ville spart meg for mye tid\", tone:\"pos\", ic:\"thumbs-up\"},\n        {label:\"Nei, jeg vil heller gj\u00f8re det selv\", tone:\"neg\", ic:\"hand\"}\n      ],\n      react:{ \"Ja, det ville spart meg for mye tid\":{emoji:\"\\uD83D\\uDE4C\",msg:\"Ol\u00e9! Vi tar oss av alt for deg.\"} }},\n\n    \/* Educational path: shown only if \"No\" to service (ids edu_*). *\/\n    { id:\"edu_couts\", type:\"teach\", skip:true, quizMix:true, ebIco:\"plane\", heroIco:\"plane\",\n        heroCap:\"Det g\u00e5r an \u00e5 gj\u00f8re det alene, men la oss se hva det egentlig inneb\u00e6rer.\",\n      eyebrow:\"Punkt 1: de skjulte kostnadene\",\n      q:\"\u00c5 kj\u00f8pe alene koster mer enn du tror, f\u00f8r du i det hele tatt signerer.\",\n      quiz:{ ask:\"Hvor mange tur-retur-reiser til Spania b\u00f8r et par regne med for visninger og overtakelse?\",\n        options:[{label:\"Bare \u00e9n\"},{label:\"To\"},{label:\"Minst tre\",correct:true}],\n        reveal:\"Vanligvis 3 tur-retur-reiser (2 visningsreiser + overtakelsen), flere hotellnetter og fridager, pluss en advokat som sjekker dokumentene og en tolk, som er p\u00e5krevd hos notaren. Regningen vokser fort.\" },\n      body:\"F\u00f8r selve boligprisen: rundt 3 tur-retur-reiser (visninger + overtakelse), hotellnetter, fridager, en advokat som g\u00e5r gjennom dokumentene og en tolk som er p\u00e5krevd hos notaren. Kostnader mange glemmer \u00e5 regne med.\" },\n\n    { id:\"edu_notaire\", type:\"teach\", skip:true, quizMix:true, ebIco:\"scale\", heroIco:\"landmark\",\n      heroCap:\"En spansk notar gj\u00f8r ikke det samme som en eiendomsmegler gj\u00f8r ved oppgj\u00f8ret hjemme.\",\n      eyebrow:\"Punkt 2: juridisk trygghet\",\n      q:\"Notaren sjekker ikke det du kanskje tror.\",\n      quiz:{ ask:\"Sant eller usant: en enkel administrativ forsinkelse (NIE ikke utstedt i tide) kan koste deg penger.\",\n        options:[{label:\"Usant, man kan alltid flytte datoen\"},{label:\"Sant, og det kan bli dyrt\",correct:true}],\n        reveal:\"Sant. Uten NIE i tide blir overtakelsen utsatt, og du kan tape reservasjonsdepositumet, vanligvis 10 % av prisen. Og notaren sjekker verken gjeld og heftelser eller om boligen er lovlig bygget.\" },\n      body:\"Notaren bekrefter skj\u00f8tet, men sjekker verken gjeld og heftelser eller boligens lovlighet. Verre: et NIE som ikke er utstedt i tide, kan utsette overtakelsen og koste deg reservasjonsdepositumet, rundt 10 % av prisen.\" },\n\n    { id:\"edu_objectivite\", type:\"teach\", skip:true, ebIco:\"compass\", heroIco:\"user-check\",\n       heroCap:\"Alene m\u00e5 du selv st\u00e5 for advokat, tolk og all research.\",\n      eyebrow:\"Punkt 3: hvem jobber for deg?\",\n      q:\"P\u00e5 egen h\u00e5nd hviler alt p\u00e5 deg.\",\n      quiz:{ ask:\"N\u00e5r du kj\u00f8per alene, hvem kontrollerer boligen og ivaretar DINE interesser?\",\n        options:[{label:\"Megleren som viser boligen\"},{label:\"Notaren\"},{label:\"Du, pluss ekspertene du engasjerer\",correct:true}],\n        reveal:\"Du. En megler representerer selgers bolig; \u00e5 gj\u00f8re kontroller er ikke dens jobb, og noen vil presse deg til \u00e5 signere fort. Alene m\u00e5 du engasjere advokat og tolk og gj\u00f8re all research selv. SpainEasy st\u00e5r p\u00e5 din side.\" },\n      body:\"Alene engasjerer du advokat og tolk og gj\u00f8r all research selv, overfor meglere som representerer selgers bolig (kontroll er ikke deres jobb, og noen vil presse deg til \u00e5 signere fort). SpainEasy st\u00e5r p\u00e5 din side: vi s\u00f8ker, kontrollerer, oversetter og forhandler i din interesse.\" },\n\n    { id:\"edu_valeur\", type:\"teach\", skip:true, ebIco:\"piggy-bank\", heroIco:\"piggy-bank\",\n       heroCap:\"\u00abDet er sikkert dyrt\u00bb \u2026 her er n\u00f8yaktig hva du f\u00e5r.\",\n      eyebrow:\"Punkt 4: det faktiske regnestykket\",\n      q:\"\u00abTjenesten deres er sikkert dyr \u2026\u00bb\",\n      body:\"La oss v\u00e6re konkrete. Her er hva hjelpen v\u00e5r sparer deg for, og fellene den holder deg unna.\",\n      valueRecap:{\n        saves:[\n          {ic:\"plane\",  t:\"Bortkastede reiser: vi er p\u00e5 visning for deg\"},\n          {ic:\"clock\", t:\"Uker med s\u00f8k og papirarbeid\"},\n          {ic:\"languages\", t:\"Advokat og tolk koordinert for deg, p\u00e5 engelsk\"},\n          {ic:\"badge-percent\", t:\"Vi kjemper for \u00e5 f\u00e5 den beste prisen for deg (eksempler p\u00e5 nettstedet v\u00e5rt)\"}\n        ],\n        avoids:[\n          {ic:\"scale\", t:\"Skjult gjeld eller en ulovlig bygget bolig som ikke blir sjekket\"},\n          {ic:\"alarm-clock\", t:\"Et forsinket NIE som koster deg depositumet p\u00e5 10 %\"},\n          {ic:\"search-check\", t:\"En ulovlig bolig eller en skjult feil\"},\n          {ic:\"trending-up\", t:\"\u00c5 betale for mye fordi ingen forhandlet\"}\n        ]\n      },\n      closing:{   t:\"Du kj\u00f8per raskere, trygt, og ofte billigere.\", d:\"Vi ordner overf\u00f8ringen av vann og str\u00f8m; resten (skatt for ikke-residenter, IBI, digitalt sertifikat, forsikring \u2026) er valgfritt, med det samme engelsktalende teamet.\" } },\n\n      { id:\"contact\", type:\"contact\", required:true, ebIco:\"badge-check\", heroIco:\"phone-call\",\n        heroCap:\"Siste steg: vi tar kontakt snart, helt uforpliktende.\",\n      eyebrow:\"Siste steg\",\n      q:\"Bare kontaktinformasjonen din, s\u00e5 vi kan svare deg raskt.\",\n      consent:\"Ved \u00e5 sende inn skjemaet godtar du \u00e5 dele opplysningene dine, slik at teamet v\u00e5rt kan kontakte deg om prosjektet ditt.\"}\n  ];\n\n    \/\/ Norwegian label -> original English value sent to HubSpot (keeps CRM picklists intact)\n  var EN_VAL = {\"S\u00e5 snart som mulig\": \"As soon as possible\", \"I l\u00f8pet av de neste 6 m\u00e5nedene\": \"Within the next 6 months\", \"I l\u00f8pet av 12 m\u00e5neder\": \"Within 12 months\", \"Det avhenger av noe som p\u00e5g\u00e5r (boligsalg, sparing \u2026)\": \"It depends on something in progress (selling a home, saving up\u2026)\", \"Jeg ser meg bare om forel\u00f8pig\": \"Just exploring for now\", \"Juss og papirarbeid (NIE, notar)\": \"The legal & paperwork (NIE, notary)\", \"Spr\u00e5kbarrieren (spansk)\": \"The language barrier (Spanish)\", \"Om boligen er i god stand\": \"Whether the property is sound\", \"Avstanden (flyreiser frem og tilbake hjemmefra)\": \"The distance (flying back & forth from the U.S.)\", \"Den spanske kj\u00f8psprosessen (f\u00e6rre kontroller enn hjemme)\": \"The Spanish closing process (less verification than in the U.S.)\", \"Overf\u00f8ring av penger, valuta og skatt\": \"Moving money, currency & taxes\", \"For lite tid\": \"Not enough time\", \"Leilighet\": \"Apartment \/ condo\", \"Hus\": \"House\", \"Hus med hage eller basseng\": \"House with yard or pool\", \"Luksusbolig\": \"Luxury property\", \"Annet\": \"Other\", \"Flytte \/ fast bolig\": \"Relocating \/ primary home\", \"Ferie \/ feriebolig\": \"Vacation \/ second home\", \"Pensjonisttilv\u00e6relse\": \"Retirement\", \"Utleieinvestering\": \"Rental investment\", \"Ja, det ville spart meg for mye tid\": \"Yes \u2014 that would save me so much time\", \"Nei, jeg vil heller gj\u00f8re det selv\": \"No, I'd rather handle it myself\"};\n  var ORDER = [\"timing\",\"worries\",\"budget\",\"location\",\"property\",\"motivation\",\"service\",\"edu_couts\",\"edu_notaire\",\"edu_objectivite\",\"edu_valeur\",\"contact\"];\n    var RISK_IDS = [\"edu_couts\",\"edu_notaire\",\"edu_objectivite\",\"edu_valeur\"];\n  function isEdu(id){ return RISK_IDS.indexOf(id)>-1; }\n\n  \/* =========================================================\n     2b) CALLBACK \u2014 timezone-aware (US buyer)\n     ========================================================= *\/\n  var US_ZONES = [\n    { l:\"Norge (CET)\", tz:\"Europe\/Oslo\"},\n    {l:\"Sverige (CET)\", tz:\"Europe\/Stockholm\"},\n    {l:\"Spania (CET)\", tz:\"Europe\/Madrid\"},\n    {l:\"Storbritannia (UK)\", tz:\"Europe\/London\"}\n  ];\n  \/\/ \"Other country\" picker \u2014 short token + IANA zone\n  var WORLD_ZONES = [\n    { l:\"USA: Alaska (AKST)\", s:\"AKST\", tz:\"America\/Anchorage\"},\n    {l:\"USA: Hawaii (HST)\", s:\"HST\", tz:\"Pacific\/Honolulu\"},\n    {l:\"Canada: Toronto (ET)\", s:\"ET\", tz:\"America\/Toronto\"},\n    {l:\"Canada: Vancouver (PT)\", s:\"PT\", tz:\"America\/Vancouver\"},\n    {l:\"Mexico: Mexico by\", s:\"CST\", tz:\"America\/Mexico_City\"},\n    {l:\"Brasil: S\u00e3o Paulo\", s:\"BRT\", tz:\"America\/Sao_Paulo\"},\n    {l:\"Argentina: Buenos Aires\", s:\"ART\", tz:\"America\/Argentina\/Buenos_Aires\"},\n    {l:\"Storbritannia \/ Irland: London\", s:\"britisk tid\", tz:\"Europe\/London\"},\n    {l:\"Portugal: Lisboa\", s:\"WET\", tz:\"Europe\/Lisbon\"},\n    {l:\"Frankrike \/ Spania: Paris\", s:\"CET\", tz:\"Europe\/Paris\"},\n    {l:\"Sentral-Europa: Berlin\", s:\"CET\", tz:\"Europe\/Berlin\"},\n    {l:\"Hellas \/ \u00d8st-Europa: Athen\", s:\"EET\", tz:\"Europe\/Athens\"},\n    {l:\"Tyrkia: Istanbul\", s:\"TRT\", tz:\"Europe\/Istanbul\"},\n    {l:\"Marokko: Casablanca\", s:\"lokal tid\", tz:\"Africa\/Casablanca\"},\n    {l:\"S\u00f8r-Afrika: Johannesburg\", s:\"SAST\", tz:\"Africa\/Johannesburg\"},\n    {l:\"De forente arabiske emirater: Dubai\", s:\"GST\", tz:\"Asia\/Dubai\"},\n    {l:\"Israel: Tel Aviv\", s:\"lokal tid\", tz:\"Asia\/Jerusalem\"},\n    {l:\"India: Mumbai\", s:\"IST\", tz:\"Asia\/Kolkata\"},\n    {l:\"Singapore\", s:\"SGT\", tz:\"Asia\/Singapore\"},\n    { l:\"Hongkong\", s:\"HKT\", tz:\"Asia\/Hong_Kong\"},\n    {l:\"Japan: Tokyo\", s:\"JST\", tz:\"Asia\/Tokyo\"},\n    {l:\"Australia: Perth\", s:\"AWST\", tz:\"Australia\/Perth\"},\n    {l:\"Australia: Sydney\", s:\"AEST\", tz:\"Australia\/Sydney\"},\n    {l:\"New Zealand: Auckland\", s:\"NZST\", tz:\"Pacific\/Auckland\"}\n  ];\n  \/\/ SpainEasy office: calls only happen during Spanish business hours (Europe\/Madrid, CET\/CEST).\n  var TEAM = { tz:\"Europe\/Madrid\", week:{open:9,close:19}, sat:{open:10,close:14}, localFloor:7, localCeil:21 };\n  function cbDetectIana(){ var tz=\"\"; try{ tz=Intl.DateTimeFormat().resolvedOptions().timeZone||\"\"; }catch(e){  } return tz||\"Europe\/Oslo\"; }\n  function cbUsLabelFor(tz){ for(var i=0;i<US_ZONES.length;i++) if(US_ZONES[i].tz===tz) return US_ZONES[i].l; return null; }\n  function cbWorldFor(tz){ for(var j=0;j<WORLD_ZONES.length;j++) if(WORLD_ZONES[j].tz===tz) return WORLD_ZONES[j]; return null; }\n  function cbShortFromTz(tz){ return String(tz||\"\").split(\"\/\").pop().replace(\/_\/g,\" \"); }\n  function cbInitZone(){ if(state.answers.cb_tz) return; var tz=cbDetectIana(); state.answers.cb_tz=tz; var w=cbWorldFor(tz); state.answers.cb_zone = cbUsLabelFor(tz) || (w?w.s:null) || cbShortFromTz(tz); }\n  function cbIsUsZone(){ for(var i=0;i<US_ZONES.length;i++) if(US_ZONES[i].tz===state.answers.cb_tz) return true; return false; }\n  function cbZoneIana(){ if(state.answers.cb_tz) return state.answers.cb_tz; var l=state.answers.cb_zone; for(var i=0;i<US_ZONES.length;i++) if(US_ZONES[i].l===l) return US_ZONES[i].tz; return cbDetectIana(); }\n  function cbZoneShort(){ return state.answers.cb_zone || cbShortFromTz(cbZoneIana()); }\n  var CB_DOWS = {\"Mon\":1,\"Tue\":2,\"Wed\":3,\"Thu\":4,\"Fri\":5,\"Sat\":6};\n    var CB_DAY_NO = {\"Mon\":\"man.\",\"Tue\":\"tir.\",\"Wed\":\"ons.\",\"Thu\":\"tor.\",\"Fri\":\"fre.\",\"Sat\":\"l\u00f8r.\"};\n  var CB_DAY_FULL = {\"Mon\":\"mandag\",\"Tue\":\"tirsdag\",\"Wed\":\"onsdag\",\"Thu\":\"torsdag\",\"Fri\":\"fredag\",\"Sat\":\"l\u00f8rdag\"};\n  var CB_MONTHS = [\"jan.\",\"feb.\",\"mars\",\"apr.\",\"mai\",\"juni\",\"juli\",\"aug.\",\"sep.\",\"okt.\",\"nov.\",\"des.\"];\n  function fmt12(h){ h=((h%24)+24)%24; return (h<10?\"0\":\"\")+h+\":00\"; }\n  function cbWantsRdv(){ return false; }\n  function cbIsSaturday(){ return Array.isArray(state.answers.cb_days) && state.answers.cb_days.indexOf(\"Sat\")>-1; }\n  function cbNextDateForDow(dow){ var now=new Date(), d=new Date(now.getFullYear(),now.getMonth(),now.getDate()); var diff=(dow-d.getDay()+7)%7; d.setDate(d.getDate()+diff); return d; }\n  function cbNearestDateObj(){\n    var a=state.answers;\n    if(a.cb_days_indif || !Array.isArray(a.cb_days) || !a.cb_days.length) return null;\n    var times=[];\n    a.cb_days.forEach(function(lbl){ if(CB_DOWS[lbl]!=null) times.push(cbNextDateForDow(CB_DOWS[lbl]).getTime()); });\n    if(!times.length) return null;\n    return new Date(Math.min.apply(null,times));\n  }\n  function cbDateLong(d){ return d ? (CB_DAY_FULL[Object.keys(CB_DOWS).find(function(k){return CB_DOWS[k]===d.getDay();  })] || \"\")+\" \"+d.getDate()+\". \"+CB_MONTHS[d.getMonth()] : \"\"; }\n  function cbTzOffsetMin(date, tz){\n    try{\n      var dtf = new Intl.DateTimeFormat(\"en-US\",{timeZone:tz,hour12:false,year:\"numeric\",month:\"2-digit\",day:\"2-digit\",hour:\"2-digit\",minute:\"2-digit\",second:\"2-digit\"});\n      var pr = {}; dtf.formatToParts(date).forEach(function(x){ pr[x.type]=x.value; });\n      var asUTC = Date.UTC(pr.year, pr.month-1, pr.day, pr.hour, pr.minute, pr.second);\n      return Math.round((asUTC - date.getTime())\/60000);\n    }catch(e){ return null; }\n  }\n  function cbInstantForLocalHour(dateObj, H, tz){ var guess=Date.UTC(dateObj.getFullYear(),dateObj.getMonth(),dateObj.getDate(),H,0,0); var off=cbTzOffsetMin(new Date(guess),tz); return (off==null)?guess:(guess-off*60000); }\n  function cbTzPartsAt(instant, tz){ var off=cbTzOffsetMin(new Date(instant),tz); var d=new Date(instant+((off||0)*60000)); return {dow:d.getUTCDay(), hour:d.getUTCHours()}; }\n  function cbSlotStartMs(dateObj, hour24){ if(!dateObj || hour24==null) return null; return cbInstantForLocalHour(dateObj, hour24, cbZoneIana()); }\n  function cbBizForMadDow(dow){ if(dow===6) return TEAM.sat; if(dow>=1&&dow<=5) return TEAM.week; return null; }\n  function cbWindowDate(){\n    if(cbIsSaturday()) return cbNextDateForDow(6);\n    var d=cbNearestDateObj(); if(d) return d;\n    var now=new Date(), x=new Date(now.getFullYear(),now.getMonth(),now.getDate());\n    for(var i=0;i<8;i++){ var t=new Date(x); t.setDate(x.getDate()+i); var dw=t.getDay(); if(dw>=1&&dw<=5) return t; }\n    return x;\n  }\n  \/\/ Buyer-local start hours that map to inside SpainEasy's Madrid office hours\n  function cbAllowedHours(){\n    var d=cbWindowDate(); if(!d) return []; var tz=cbZoneIana(), res=[];\n    for(var H=TEAM.localFloor; H<=TEAM.localCeil; H++){\n      var inst=cbInstantForLocalHour(d,H,tz), mp=cbTzPartsAt(inst, TEAM.tz);\n      var biz=cbBizForMadDow(mp.dow); if(!biz) continue;\n      if(mp.hour>=biz.open && mp.hour<=biz.close-1) res.push(H);\n    }\n    return res;\n  }\n  function cbCurrentSlots(){ var a=cbAllowedHours(), out=[]; for(var i=0;i<a.length;i+=2){ var H=a[i]; out.push({h:H, l:fmt12( H)+\" til \"+fmt12(H+2)}); } return out; }\n  function cbHours(){ return cbAllowedHours(); }\n  function cbHasSlots(){ return cbCurrentSlots().length>0; }\n  function cbSlotLabel(h){ var s=cbCurrentSlots(); for(var i=0;i<s.length;i++) if(s[i].h===h) return s[i].l; return fmt12( h)+\" til \"+fmt12(h+2); }\n  function cbSlotsHTML(){\n    var slots=cbCurrentSlots(), html=\"\";\n    slots.forEach(function(s){\n      html += '<button type=\"button\" class=\"ole-pill'+(!state.answers.cb_precise && !state.answers.cb_any && state.answers.cb_slot===s.h?\" sel\":\"\")+'\" data-cbslot=\"'+s.h+'\">'+esc(s.l)+'<\/button>';\n    });\n    if(cbHours().length) html += '<button type=\"button\" class=\"ole-pill ole-pill-precise'+(  state.answers.cb_precise?\" sel\":\"\")+'\" data-cbprecise=\"1\"><span class=\"ole-pill-ico ole-ico\"><i data-lucide=\"alarm-clock\"><\/i><\/span>Bestemt klokkeslett<\/button>';\n    html += '<button type=\"button\" class=\"ole-pill'+(state.answers.cb_any?\" sel\":\"\")+'\" data-cbany=\"1\">N\u00e5r som helst<\/button>';\n    return html;\n  }\n  function cbHoursHTML(){\n    return cbHours().map(function(hh){\n      return '<button type=\"button\" class=\"ole-pill'+(state.answers.cb_hour===hh?\" sel\":\"\")+'\" data-cbhour=\"'+hh+'\">'+esc(fmt12(hh))+'<\/button>';\n    }).join(\"\");\n  }\n  function cbPreciseMsg(){\n    var h=state.answers.cb_hour; if(h==null) return \"\";\n      return \"Vi gj\u00f8r v\u00e5rt beste for \u00e5 ringe deg rundt \"+fmt12(h)+\" \"+cbZoneShort()+\". Vi holder til i Spania og kan ikke love n\u00f8yaktig minutt; vil du ha et fast tidspunkt, kan du bestille en samtale.\";\n  }\n  function cbReaction(){\n    var a=state.answers, z=cbZoneShort();\n    if(cbWantsRdv()) return {emoji:\"\\uD83D\\uDCC5\", msg:\"Perfekt, du velger tidspunkt for m\u00f8tet rett etter dette skjemaet.\"};\n    if(a.cb_any) return {emoji:\"\\uD83D\\uDC4D\",msg:\"Flott, vi finner det beste tidspunktet \u00e5 n\u00e5 deg innenfor kontortiden v\u00e5r i Spania.\"};\n    var dObj=cbNearestDateObj(); var dTxt=dObj?cbDateLong(dObj):\"\";\n    if(a.cb_precise && a.cb_hour!=null) return {emoji:\"\\uD83D\\uDC4D\", msg:\"Notert, vi gj\u00f8r v\u00e5rt beste for \u00e5 ringe \"+(dTxt?dTxt+\" \":\"\")+\"rundt \"+fmt12(a.cb_hour)+\" \"+z+\".\"};\n    var sTxt = a.cb_slot!=null ? cbSlotLabel(a.cb_slot) : \"\";\n    if(dTxt && sTxt) return {emoji:\"\\uD83D\\uDC4D\",  msg:\"Flott, vi pr\u00f8ver \u00e5 ringe deg \"+dTxt+\", \"+sTxt+\" \"+z+\".\"};\n    if(dTxt) return {emoji:\"\\uD83D\\uDC4D\",msg:\"Flott, vi pr\u00f8ver \u00e5 ringe deg \"+dTxt+\".\"};\n    if(sTxt) return {emoji:\"\\uD83D\\uDC4D\",msg:\"Flott, vi pr\u00f8ver \u00e5 ringe deg \"+sTxt+\" \"+z+\".\"};\n    if(a.cb_days_indif) return {emoji:\"\\uD83D\\uDC4D\",msg:\"Skj\u00f8nner, vi ringer s\u00e5 snart vi kan.\"};\n    return null;\n  }\n  function cbRecapText(){ return \"\"; \n    var a=state.answers, z=cbZoneShort();\n    if(cbWantsRdv( )) return \"Du bestiller en samtale rett etterp\u00e5\";\n    if(a.cb_any){ var dA=cbNearestDateObj(); var dAt=dA?cbDateLong(dA):\"\"; return dAt ? (\"Ring \"+dAt+\", n\u00e5r som helst\") : \"Ring n\u00e5r som helst\"; }\n    var dObj=cbNearestDateObj(); var dTxt=dObj?cbDateLong(dObj):\"\";\n    if( a.cb_precise && a.cb_hour!=null) return \"Ring \"+(dTxt?dTxt+\", \":\"\")+\"rundt \"+fmt12(a.cb_hour)+\" \"+z;\n    var sTxt = a.cb_slot!=null ? cbSlotLabel(a.cb_slot) : \"\";\n    if(dTxt && sTxt) return \"Ring \"+dTxt+\", \"+sTxt+\" \"+z;\n    if(dTxt) return \"Ring \"+dTxt;\n    if(sTxt) return \"Ring \"+sTxt+\" \"+z;\n    if(a.cb_days_indif) return \"Ring s\u00e5 snart som mulig\";\n    return \"\";\n  }\n  \/\/ The requested call time expressed in the CLIENT's own local time + zone (for HubSpot \"Heure chez le client\").\n  function cbClientTimeStr(){ return \"\";\n     var a=state.answers, z=cbZoneShort();\n    if(cbWantsRdv()) return \"Will pick a slot on the booking page\";\n    var dObj=cbNearestDateObj(); var dTxt=dObj?cbDateLong(dObj):(a.cb_days_indif?\"Any day\":\"\");\n    var t=\"\";\n    if(a.cb_any) t=\"any time\";\n    else if(a.cb_precise && a.cb_hour!=null) t=\"around \"+fmt12(a.cb_hour);\n    else if(a.cb_slot!=null) t=cbSlotLabel(a.cb_slot);\n    if(!dTxt && !t) return \"\";\n    var s=(dTxt||\"\")+((dTxt&&t)?\", \":\"\")+(t||\"\");\n    return s+\" \"+z+\" (client local time)\";\n  }\n\n  \/* =========================================================\n     3) LOCATION FLAVOR\n     ========================================================= *\/\n  var CITY_REF = {\n      \"Alicante\":\"Santa B\u00e1rbara-borgen og strendene\",\n    \"Barcelona\":\"Gaud\u00ed, Sagrada Fam\u00edlia og Las Ramblas\",\n    \"Benidorm\":\"skylinen og de livlige strendene\",\n    \"C\u00e1diz\":\"en av Europas eldste byer\",\n    \"Estepona\":\"den blomsterfylte gamlebyen\",\n    \"Fuengirola\":\"den avslappede strandpromenaden\",\n    \"Girona\":\"de middelalderske smugene\",\n    \"Granada\":\"Alhambra og Sierra Nevada\",\n    \"Ibiza\":\"turkise viker og \u00f8yliv\",\n    \"Madrid\":\"Prado, Retiro-parken og byens energi\",\n    \"M\u00e1laga\":\"Picassos f\u00f8deby\",\n    \"Marbella\":\"glamouren i Puerto Ban\u00fas\",\n    \"Mijas\":\"den hvitkalkede sjarmen i lia\",\n    \"Nerja\":\"den ber\u00f8mte Balc\u00f3n de Europa\",\n    \"Palma de Mallorca\":\"katedralen og den baleariske stilen\",\n    \"Sevilla\":\"flamenco, Giralda og gr\u00f8nne patioer\",\n    \"Sitges\":\"eleganse ved sj\u00f8en n\u00e6r Barcelona\",\n    \"Tarragona\":\"det romerske amfiteateret ved sj\u00f8en\",\n    \"Torrevieja\":\"de rosa saltlagunene og solen\",\n    \"Valencia\":\"paella og Ciudad de las Artes y las Ciencias\",\n    \"Costa del Sol\":\"over 300 soldager i \u00e5ret\",\n    \"Costa Blanca\":\"postkortstrender hele \u00e5ret\",\n    \"Costa Brava\":\"ville viker og karakter\",\n    \"Costa Dorada\":\"gyllen sand og romersk arv\",\n    \"Andaluc\u00eda\":\"flamenco, tapas og det gode liv\",\n    \"Balearene\":\"lys og turkist vann\",\n    \"Kanari\u00f8yene\":\"evig v\u00e5r\",\n    \"Catalonia\":\"hav, fjell og katalansk stil\"\n  };\n  var CITY_NOTE = {\n      \"Alicante\":\"juvelen p\u00e5 Costa Blanca\",\"Barcelona\":\"Gaud\u00eds by\",\"Benidorm\":\"Spanias lille Manhattan\",\n    \"C\u00e1diz\":\"Europas eldste by\",\"Estepona\":\"hagen p\u00e5 Costa del Sol\",\"Fuengirola\":\"avslappet liv ved sj\u00f8en\",\n    \"Girona\":\"en katalansk middelalderperle\",\"Granada\":\"Alhambra-byen\",\"Ibiza\":\"turkist \u00f8yliv\",\"Madrid\":\"Spanias hjerte\",\n    \"M\u00e1laga\":\"Picassos f\u00f8dested\",\"Marbella\":\"glamouren p\u00e5 Costa del Sol\",\"Mijas\":\"en hvitkalket fjellby\",\n    \"Nerja\":\"Europas balkong\",\"Palma de Mallorca\":\"juvelen p\u00e5 Balearene\",\"Sevilla\":\"flamencoens hovedstad\",\n    \"Sitges\":\"eleganse ved sj\u00f8en\",\"Tarragona\":\"romersk arv ved sj\u00f8en\",\"Torrevieja\":\"rosa laguner og saltsletter\",\n    \"Valencia\":\"paellaens hjem\",\"Costa del Sol\":\"over 300 soldager i \u00e5ret\",\"Costa Blanca\":\"sol hele \u00e5ret\",\n    \"Costa Brava\":\"ville viker\",\"Costa Dorada\":\"gyllen sand og romerske ruiner\",\"Andaluc\u00eda\":\"flamenco og det gode liv\",\n    \"Balearene\":\"turkist vann\",\"Kanari\u00f8yene\":\"evig v\u00e5r\",\"Catalonia\":\"hav og katalansk s\u00e6rpreg\"\n  };\n  var REGION_NOTE = {\n     \"Andaluc\u00eda\":\"andalusisk sol og flamenco\",\"Comunidad Valenciana\":\"solen p\u00e5 Valencia-kysten\",\"Comunitat Valenciana\":\"solen p\u00e5 Valencia-kysten\",\n    \"Catalu\u00f1a\":\"hav og katalansk s\u00e6rpreg\",\"Catalunya\":\"hav og katalansk s\u00e6rpreg\",\"Islas Baleares\":\"turkist vann p\u00e5 Balearene\",\"Illes Balears\":\"turkist vann p\u00e5 Balearene\",\n    \"Canarias\":\"evig v\u00e5r p\u00e5 Kanari\u00f8yene\",\"Islas Canarias\":\"evig v\u00e5r p\u00e5 Kanari\u00f8yene\",\"Regi\u00f3n de Murcia\":\"den milde Costa C\u00e1lida\",\"Comunidad de Madrid\":\"Spanias hjerte\",\n    \"Galicia\":\"kysten og naturen i Galicia\",\"Pa\u00eds Vasco\":\"baskisk hav og mat\",\"Andaluc\u00eda\":\"andalusisk sol og flamenco\"\n  };\n  var LOC_PILL = {\n    \"Alicante\":{emoji:\"\\uD83C\\uDF0A\",  msg:\"Alicante: turkist hav og en livlig gamleby.\"},\n    \"Barcelona\":{emoji:\"\\u2728\",msg:\"Barcelona: storbyen som aldri sover.\"},\n    \"Benidorm\":{emoji:\"\\uD83C\\uDFD9\\uFE0F\",msg:\"Benidorm: skyline, strender og liv hele \u00e5ret.\"},\n    \"C\u00e1diz\":{emoji:\"\\uD83C\\uDF0A\",msg:\"C\u00e1diz: en av Europas eldste byer, ut mot Atlanterhavet.\"},\n    \"Estepona\":{emoji:\"\\uD83C\\uDF3A\",msg:\"Estepona: den blomsterfylte perlen p\u00e5 Costa del Sol.\"},\n    \"Fuengirola\":{emoji:\"\\uD83C\\uDFD6\\uFE0F\",msg:\"Fuengirola: avslappet, solfylt, med f\u00f8ttene i vannet.\"},\n    \"Girona\":{emoji:\"\\uD83C\\uDFF0\",msg:\"Girona: middelalderske smug og katalansk ro.\"},\n    \"Granada\":{emoji:\"\\uD83C\\uDFD4\\uFE0F\",msg:\"Granada: Alhambra med Sierra Nevada i bakgrunnen.\"},\n    \"Ibiza\":{emoji:\"\\uD83C\\uDFDD\\uFE0F\",msg:\"Ibiza: turkise viker og \u00f8yliv.\"},\n    \"Madrid\":{emoji:\"\\u2728\",msg:\"Madrid: Spanias pulserende hjerte.\"},\n    \"M\u00e1laga\":{emoji:\"\\u2600\\uFE0F\",msg:\"M\u00e1laga: Picassos f\u00f8deby, solfylt og levende.\"},\n    \"Marbella\":{emoji:\"\\uD83C\\uDF34\",msg:\"Marbella: all glamouren p\u00e5 Costa del Sol.\"},\n    \"Mijas\":{emoji:\"\\uD83E\\uDD0D\",msg:\"Mijas: hvitkalket sjarm over kysten.\"},\n    \"Nerja\":{emoji:\"\\uD83C\\uDF05\",msg:\"Nerja: Europas balkong over Middelhavet.\"},\n    \"Palma de Mallorca\":{emoji:\"\\uD83C\\uDFDD\\uFE0F\",msg:\"Palma de Mallorca: \u00f8yeleganse p\u00e5 Balearene.\"},\n    \"Sevilla\":{emoji:\"\\uD83D\\uDC83\",msg:\"Sevilla: flamenco, patioer og andalusisk livsstil.\"},\n    \"Sitges\":{emoji:\"\\uD83C\\uDF0A\",msg:\"Sitges: eleganse ved sj\u00f8en like s\u00f8r for Barcelona.\"},\n    \"Tarragona\":{emoji:\"\\uD83C\\uDFDB\\uFE0F\",msg:\"Tarragona: romersk arv ut mot Middelhavet.\"},\n    \"Torrevieja\":{emoji:\"\\uD83C\\uDF38\",msg:\"Torrevieja: rosa laguner og nesten konstant sol.\"},\n    \"Valencia\":{emoji:\"\\uD83E\\uDD58\",msg:\"Valencia: paella, strender og moderne stil.\"},\n    \"Costa del Sol\":{emoji:\"\\u2600\\uFE0F\",msg:\"Costa del Sol: over 300 soldager i \u00e5ret.\"},\n    \"Costa Blanca\":{emoji:\"\\uD83C\\uDFD6\\uFE0F\",msg:\"Costa Blanca: postkortstrender hele \u00e5ret.\"},\n    \"Costa Brava\":{emoji:\"\\uD83C\\uDF0A\",msg:\"Costa Brava: ville viker og karakter.\"},\n    \"Costa Dorada\":{emoji:\"\\uD83C\\uDFDB\\uFE0F\",msg:\"Costa Dorada: gyllen sand og romersk arv.\"},\n    \"Andaluc\u00eda\":{emoji:\"\\uD83D\\uDC83\",msg:\"Andaluc\u00eda: sol, hav og livskunst.\"},\n    \"Balearene\":{emoji:\"\\uD83C\\uDFDD\\uFE0F\",msg:\"Balearene: en bit av Middelhavets paradis.\"},\n    \"Kanari\u00f8yene\":{emoji:\"\\uD83C\\uDF34\",msg:\"Kanari\u00f8yene: evig v\u00e5r, hele \u00e5ret.\"},\n    \"Catalonia\":{emoji:\"\\uD83C\\uDF0A\",msg:\"Catalonia: ville viker, kultur og god smak.\"}\n  };\n  var REACTIONS = [\n    {match:[\"malaga\",\"m\u00e1laga\",\"marbella\",\"estepona\",\"fuengirola\",\"nerja\",\"mijas\",\"costa del sol\"],emoji:\"\\u2600\\uFE0F\",  msg:\"Costa del Sol: over 300 soldager i \u00e5ret.\"},\n    {match:[\"seville\",\"sevilla\",\"cadiz\",\"c\u00e1diz\",\"granada\",\"almeria\",\"almer\u00eda\",\"andaluc\"],emoji:\"\\uD83D\\uDC83\",msg:\"Andaluc\u00eda: sol, hav og livskunst.\"},\n    {match:[\"alicante\",\"benidorm\",\"calpe\",\"denia\",\"javea\",\"j\u00e1vea\",\"torrevieja\",\"costa blanca\"],emoji:\"\\uD83C\\uDFD6\\uFE0F\",msg:\"Costa Blanca: postkortstrender hele \u00e5ret.\"},\n    {match:[\"valencia\",\"valence\"],emoji:\"\\uD83E\\uDD58\",msg:\"Valencia: paella, strender og avslappet liv.\"},\n    {match:[\"murcia\",\"costa calida\",\"costa c\u00e1lida\"],emoji:\"\\uD83C\\uDF05\",msg:\"Costa C\u00e1lida: Spanias mildeste hav.\"},\n    {match:[\"barcelona\",\"girona\",\"sitges\",\"lloret\",\"roses\",\"tarragona\",\"costa brava\",\"costa dorada\",\"catal\"],emoji:\"\\uD83C\\uDF0A\",msg:\"Catalonia: ville viker, kultur og god smak.\"},\n    {match:[\"palma\",\"mallorca\",\"baleares\",\"balearic\",\"ibiza\",\"menorca\"],emoji:\"\\uD83C\\uDFDD\\uFE0F\",msg:\"Balearene: en bit av Middelhavets paradis.\"},\n    {match:[\"canar\",\"tenerife\",\"las palmas\",\"fuerteventura\",\"lanzarote\"],emoji:\"\\uD83C\\uDF34\",msg:\"Kanari\u00f8yene: evig v\u00e5r, hele \u00e5ret.\"},\n    {match:[\"madrid\"],emoji:\"\\u2728\",msg:\"Madrid: Spanias pulserende hjerte.\"}\n  ];\n\n  \/* =========================================================\n     4) UTILITIES\n     ========================================================= *\/\n  var root = document.getElementById(\"ole-form-root\");\n  if(!root) return;\n  var state = { i:0, answers:{}, history:[], locked:false, busy:false, reaction:null };\n  var startTime = Date.now();\n  var gMapsReady = false;\n  var nf = new Intl.NumberFormat(\"nb-NO\");\n  function fmt(n){ return nf.format(n) + \" \u20ac\"; }\n  function getCookie(k){ var m=document.cookie.match(\"(^|;)\\\\s*\"+k+\"\\\\s*=\\\\s*([^;]+)\"); return m?m.pop():\"\"; }\n  function esc(s){ var a=String.fromCharCode(38); return String(s).replace(\/&\/g,a+\"#38;\").replace(\/<\/g,a+\"#60;\").replace(\/>\/g,a+\"#62;\").replace(\/\"\/g,a+\"#34;\"); }\n  function refreshIcons(){ if(window.lucide && lucide.createIcons){ try{ lucide.createIcons(); }catch(e){} } }\n  function stepIndexById(id){ for(var i=0;i<STEPS.length;i++) if(STEPS[i].id===id) return i; return -1; }\n  function isRisksPath(){ return \/^(no|nei)\/i.test(state.answers.service||\"\"); }\n  function hasAnswers(){ for(var k in state.answers){ if(state.answers.hasOwnProperty(k)){ var v=state.answers[k]; if(Array.isArray(v)?v.length:(v!==null&&v!==undefined&&v!==\"\")) return true; } } return false; }\n\n  var LS_KEY=\"spaineasy_form_v1_\"+((location.pathname.match(\/^\\\/([a-z]{2})\\\/\/)||[])[1]||\"en\"), LS_TTL=1000*60*60*24*7;\n  var _saveT=null;\n  function saveState(){ try{ localStorage.setItem(LS_KEY, JSON.stringify({ i:state.i, answers:state.answers, history:state.history, t:Date.now() })); }catch(e){} }\n  function saveSoon(){ clearTimeout(_saveT); _saveT=setTimeout(saveState,250); }\n  function loadState(){\n    try{\n      var raw=localStorage.getItem(LS_KEY); if(!raw) return false;\n      var s=JSON.parse(raw);\n      if(!s || !s.t || (Date.now()-s.t)>LS_TTL){ localStorage.removeItem(LS_KEY); return false; }\n      if(typeof s.i===\"number\" && s.answers && typeof s.answers===\"object\"){\n        state.i=Math.min(Math.max(s.i,0), STEPS.length-1);\n        state.answers=s.answers; state.history=Array.isArray(s.history)?s.history:[];\n        return true;\n      }\n    }catch(e){}\n    return false;\n  }\n  function clearState(){ try{ localStorage.removeItem(LS_KEY); }catch(e){} }\n\n  var MAIL_DOMAINS=[\"gmail.com\",\"yahoo.com\",\"hotmail.com\",\"outlook.com\",\"icloud.com\",\"aol.com\",\"comcast.net\",\"att.net\",\"verizon.net\",\"sbcglobal.net\",\"me.com\",\"live.com\",\"msn.com\",\"ymail.com\",\"protonmail.com\"];\n  var MAIL_TLDS=[\"com\",\"net\",\"org\",\"us\",\"edu\",\"co\",\"io\",\"gov\"];\n  function lev(a,b){ var m=a.length,n=b.length; if(!m) return n; if(!n) return m; var d=[],i,j; for(i=0;i<=m;i++) d[i]=[i]; for(j=0;j<=n;j++) d[0][j]=j; for(i=1;i<=m;i++) for(j=1;j<=n;j++){ var c=a.charAt(i-1)===b.charAt(j-1)?0:1; d[i][j]=Math.min(d[i-1][j]+1,d[i][j-1]+1,d[i-1][j-1]+c); } return d[m][n]; }\n  function suggestEmail(email){\n    if(!email) return null;\n    var at=email.lastIndexOf(\"@\"); if(at<1) return null;\n    var local=email.slice(0,at), domain=email.slice(at+1).toLowerCase();\n    if(!domain || domain.indexOf(\".\")<1) return null;\n    if(MAIL_DOMAINS.indexOf(domain)>-1) return null;\n    var best=null,bd=99,i;\n    for(i=0;i<MAIL_DOMAINS.length;i++){ var dd=lev(domain,MAIL_DOMAINS[i]); if(dd<bd){ bd=dd; best=MAIL_DOMAINS[i]; } }\n    if(best && bd>0 && bd<=2) return local+\"@\"+best;\n    var dot=domain.lastIndexOf(\".\"), sld=domain.slice(0,dot), tld=domain.slice(dot+1);\n    if(MAIL_TLDS.indexOf(tld)===-1){ var bt=null,bt2=99; for(i=0;i<MAIL_TLDS.length;i++){ var td=lev(tld,MAIL_TLDS[i]); if(td<bt2){ bt2=td; bt=MAIL_TLDS[i]; } } if(bt && bt2>0 && bt2<=1) return local+\"@\"+sld+\".\"+bt; }\n    return null;\n  }\n\n  function recapHTML(){\n    var a=state.answers, rows=[];\n    function row(ic,val){ if(val) rows.push('<div class=\"ole-recap-item\"><span class=\"ole-recap-ico ole-ico\"><i data-lucide=\"'+ic+'\"><\/i><\/span><span class=\"ole-recap-val\">'+esc(val)+'<\/span><\/div>'); }\n    row(\"home\", a.property);\n    var loc = a.location ? cityName(a.location) : \"\";\n    if(loc){\n      var flavor = CITY_NOTE[loc];\n      if(!flavor){ var m=(a.location||\"\").match(\/\\(([^)]+)\\)\/); if(m) flavor=REGION_NOTE[m[1].trim()]; }\n      var noteFull = flavor ? \"(\"+flavor+\")\" : \"\";\n      var locHtml = esc(loc) + (noteFull ? ' <span class=\"ole-recap-note\" id=\"ole-recap-note\" data-note=\"'+esc(noteFull)+'\"><\/span>' : '');\n      rows.push('<div class=\"ole-recap-item\"><span class=\"ole-recap-ico ole-ico\"><i data-lucide=\"map-pin\"><\/i><\/span><span class=\"ole-recap-val\">'+locHtml+'<\/span><\/div>');\n    }\n    row(\"wallet\", a.budget?fmt(a.budget):\"\");\n    row(\"calendar-clock\", a.timing);\n    row(\"compass\", a.motivation);\n    var cbTxt = cbRecapText();\n    if(cbTxt){ rows.push(  '<div class=\"ole-recap-item ole-recap-cb\" id=\"ole-recap-cb-edit\" role=\"button\" tabindex=\"0\" aria-label=\"Endre tidspunkt for samtale\"><span class=\"ole-recap-ico ole-ico\"><i data-lucide=\"'+(cbWantsRdv()?\"calendar-check\":\"phone-call\")+'\"><\/i><\/span><span class=\"ole-recap-val\">'+esc(cbTxt)+'<\/span><span class=\"ole-recap-edit\"><i data-lucide=\"pencil\"><\/i>Endre<\/span><\/div>'); }\n    if(!rows.length) return \"\";\n    return '<div class=\"ole-recap\"><div class=\"ole-recap-title\"><span class=\"ole-ico\"><i data-lucide=\"clipboard-check\"><\/i><\/span>Prosjektet ditt<\/div>'+rows.join(\"\")+'<\/div>';\n  }\n\n  function cityReaction(v){ if(!v) return null; var s=String(v).toLowerCase(); for(var i=0;i<REACTIONS.length;i++) for(var j=0;j<REACTIONS[i].match.length;j++) if(s.indexOf(REACTIONS[i].match[j].toLowerCase())>-1) return REACTIONS[i]; return null; }\n  function reactionFor(step, value){\n    if(step.type===\"location\"){ return LOC_PILL[value] || cityReaction(value); }\n    if(step.type===\"single\" && step.react){\n      var rb = step.react[value] || null;\n      if(step.id===\"property\" && rb && value!==\"Annet\" && state.answers.location){\n        var pcity = cityName(state.answers.location); var ref = CITY_REF[pcity];\n        return { emoji:\"\\uD83D\\uDCCD\", msg: value+\" \"+locWithPrep(pcity)+(ref ? \", \"+ref : \"\")+\". For et fint prosjekt!\" };\n      }\n      return rb;\n    }\n    if(step.type===\"multi\"){\n      if(!Array.isArray(value) || !value.length) return null;\n      if(value.length===1 && step.optMsg) return step.optMsg[value[0]] || step.reactAny || null;\n      if(step.multiMsg && step.multiMsg[String(value.length)]) return step.multiMsg[String(value.length)];\n      return step.reactAny || null;\n    }\n    if(step.type===\"budget\" && value){ return budgetReaction(value); }\n    return null;\n  }\n  function posHTML(){\n    return '<div class=\"ole-pos\" id=\"ole-pos\">'+\n      '<div class=\"ole-pos-head\"><span class=\"ole-pos-ico ole-ico\"><i data-lucide=\"compass\"><\/i><\/span>'+\n          '<div><strong>SpainEasy er en kj\u00f8peragent, ikke et meglerbyr\u00e5.<\/strong>'+\n        '<span>Vi s\u00f8ker, kontrollerer og forhandler for deg, kun i din interesse.<\/span><\/div>'+\n      '<\/div>'+\n        '<button type=\"button\" class=\"ole-pos-toggle\" id=\"ole-pos-toggle\" aria-expanded=\"false\">Hvordan fungerer det? <i data-lucide=\"chevron-down\"><\/i><\/button>'+\n      '<div class=\"ole-pos-steps\">'+\n         '<div class=\"ole-pos-step\"><span class=\"ole-pos-step-ico ole-ico\"><i data-lucide=\"search\"><\/i><\/span><div><div class=\"ole-pos-step-t\">Vi s\u00f8ker<\/div><div class=\"ole-pos-step-d\">Vi finner boligen som passer deg, hvor som helst i Spania.<\/div><\/div><\/div>'+\n        '<div class=\"ole-pos-step\"><span class=\"ole-pos-step-ico ole-ico\"><i data-lucide=\"shield-check\"><\/i><\/span><div><div class=\"ole-pos-step-t\">Vi kontrollerer<\/div><div class=\"ole-pos-step-d\">Lovlighet, gjeld, faktisk tilstand: vi sjekker alt f\u00f8r du binder deg.<\/div><\/div><\/div>'+\n        '<div class=\"ole-pos-step\"><span class=\"ole-pos-step-ico ole-ico\"><i data-lucide=\"badge-percent\"><\/i><\/span><div><div class=\"ole-pos-step-t\">Vi forhandler<\/div><div class=\"ole-pos-step-d\">Vi forsvarer budsjettet ditt for \u00e5 f\u00e5 den beste prisen, kun i din interesse.<\/div><\/div><\/div>'+\n      '<\/div>'+\n    '<\/div>';\n  }\n\n  var CITY_MIN = {\n    \/* --- Values matching Ol\\u00e9's confirmed FR reference (same numeric minimums) --- *\/\n    \"Alicante\":150000, \"Torrevieja\":150000, \"M\\u00e1laga\":200000, \"Fuengirola\":200000,\n    \"Marbella\":250000, \"Estepona\":250000, \"Madrid\":250000, \"Valencia\":170000,\n    \"Sevilla\":150000, \"Barcelona\":250000,\n    \/* --- Provisional estimates (to confirm) --- *\/\n    \"Benidorm\":150000, \"C\\u00e1diz\":120000, \"Girona\":130000, \"Nerja\":160000,\n    \"Palma de Mallorca\":200000, \"Tarragona\":120000\n    \/* No reference figure yet for: Granada, Ibiza, Mijas, Sitges \\u2014 left unmapped on purpose, falls back to the generic budget-tier reaction below *\/\n  };\n  var REGION_MIN = {\n    \"Andaluc\\u00eda\":70000, \"Comunidad Valenciana\":90000, \"Comunitat Valenciana\":90000,\n    \"Catalu\\u00f1a\":120000, \"Catalunya\":120000, \"Islas Baleares\":200000, \"Illes Balears\":200000,\n    \"Canarias\":130000, \"Islas Canarias\":130000, \"Regi\\u00f3n de Murcia\":70000,\n    \"Comunidad de Madrid\":180000, \"Galicia\":80000, \"Pa\\u00eds Vasco\":150000, \"Euskadi\":150000,\n    \"Cantabria\":110000, \"Asturias\":90000, \"Principado de Asturias\":90000, \"Arag\\u00f3n\":90000,\n    \"Castilla y Le\\u00f3n\":80000, \"Castilla-La Mancha\":70000, \"Extremadura\":60000,\n    \"Navarra\":110000, \"Comunidad Foral de Navarra\":110000, \"La Rioja\":90000\n  };\n  function locMinBudget(){\n    var loc = state.answers.location;\n    if(!loc) return null;\n    var city = cityName(loc);\n    if(CITY_MIN[city] != null) return CITY_MIN[city];\n    var m = String(loc).match(\/\\(([^)]+)\\)\/);\n    if(m && REGION_MIN[m[1].trim()] != null) return REGION_MIN[m[1].trim()];\n    return null;\n  }\n  function budgetReaction(v){\n    if(!v) return null;\n    var hasCity = !!state.answers.location;\n    var place = hasCity ? locWithPrep(cityName(state.answers.location)) : \"\";\n    var min = locMinBudget();\n    if(min != null){\n      if(v < min){\n        var msg = \"Boliger \"+place+\" rundt \"+fmt(v)+\" er sjeldne (regn med minst \"+fmt(min)+\"). Det g\u00e5r ofte an \u00e5 utvide s\u00f8ket til nabobyer, og vi ser etter den beste muligheten for deg.\";\n        return { emoji:\"\\ud83e\\udded\", warn:true, msg:msg };\n      }\n      if(v < min*1.4)  return { emoji:\"\\ud83d\\udc4d\",  msg:\"Et realistisk budsjett \"+place+\": her finnes reelle muligheter for \u00e5 finne noe flott.\" };\n      if(v < min*2.5)  return { emoji:\"\\u2600\\ufe0f\", msg:\"God margin \"+place+\", vi kan sikte mot noe helt spesielt.\" };\n      return { emoji:\"\\u2728\", msg:\"Ol\\u00e9! Med dette budsjettet \"+place+\" st\u00e5r toppsegmentet \u00e5pent for deg.\" };\n    }\n    var step = STEPS[stepIndexById(\"budget\")];\n    if(step && step.reactRanges){\n      for(var i=0;i<step.reactRanges.length;i++) if(v<=step.reactRanges[i].max) return step.reactRanges[i];\n    }\n    return null;\n  }\n\n  function cityName(v){ return String(v||\"\").split(\"(\")[0].trim(); }\n  function locWithPrep(place){\n    var p=String(place||\"\").trim(); if(!p) return \"\";\n    if( p===\"Balearene\" || p===\"Kanari\u00f8yene\") return \"p\u00e5 \"+p;\n    if(p.indexOf(\"Costa \")===0) return \"p\u00e5 \"+p;\n    return \"i \"+p;\n  }\n  function prefersReducedMotion(){ return !!(window.matchMedia && window.matchMedia(\"(prefers-reduced-motion:reduce)\").matches); }\n  function setReaction(step, value){ state.reaction = reactionFor(step, value) || null; }\n   var QUIZ_OK = [\"Helt riktig.\",\"Riktig, bra!\",\"Riktig, du har blikk for dette.\",\"Nettopp, godt svart.\",\"Ja! Du kan dette allerede.\"];\n  var QUIZ_KO = [\"Det er den vanligste fellen, og heldigvis akkurat det vi sikrer.\",\"Nesten! Og det er nettopp der vi kommer inn.\",\"Ikke helt, men slapp av, vi tar oss av dette for deg.\",\"Vanlig feil: det er nettopp derfor vi finnes.\",\"N\u00e6re p\u00e5, men det er akkurat slike detaljer vi tar oss av.\"];\n  function pickVaried(pool, key){ if(pool.length<=1) return pool[0]; var last=state[key], i; do{ i=Math.floor(Math.random()*pool.length); } while(i===last); state[key]=i; return pool[i]; }\n  function showReaction(step, value, instant){ setReaction(step, value); renderBadge(true, instant); }\n  function heroCapFor(step){\n    if(step.id===\"contact\"){\n      if(isRisksPath()) return \"Ol\u00e9! Du ser det klart, og det er nettopp derfor vi finnes.\";\n      if(state.answers.location) return \"Siste steg: vi tar snart kontakt om prosjektet ditt \"+locWithPrep(cityName(state.answers.location))+\".\";\n    }\n    return step.heroCap||\"\";\n  }\n  function twChars(msg){ var out=\"\"; for(var i=0;i<msg.length;i++){ var ch=msg.charAt(i); out += '<span class=\"ole-tw\">'+(ch===\" \"?\" \":esc(ch))+'<\/span>'; } return out; }\n  function startTyping(b, r){\n    var q = String.fromCharCode(8220);\n    var emoji = r.emoji ? '<span class=\"ole-emoji ole-emoji-live\">'+ r.emoji +'<\/span>' : '';\n    b.className = \"ole-hero-msg reacted typing\";\n    b.innerHTML = '<span class=\"ole-q-mark\">'+q+'<\/span><span class=\"ole-hero-cap\">'+ twChars(r.msg) +'<\/span>'+ emoji + '<span class=\"ole-typing\"><span><\/span><span><\/span><span><\/span><\/span>';\n    b._typingT = setTimeout(function(){\n      b._typingT=null; b.classList.remove(\"typing\"); b.classList.add(\"writing\");\n      var spans=b.querySelectorAll(\".ole-tw\"), emo=b.querySelector(\".ole-emoji-live\"), i=0;\n      (function tick(){ if(i<spans.length){ spans[i].style.opacity=\"1\"; i++; b._twT=setTimeout(tick,15); } else { b._twT=null; if(emo) emo.style.opacity=\"1\"; b.classList.add(\"done\"); } })();\n    }, 520);\n  }\n  function renderBadge(animate, instant){\n    var b=document.getElementById(\"ole-badge\"); if(!b) return;\n    if(b._typingT){ clearTimeout(b._typingT); b._typingT=null; }\n    if(b._twT){ clearTimeout(b._twT); b._twT=null; }\n    b.style.minHeight=\"\";\n    var step=STEPS[state.i], r=state.reaction;\n    if(!r){ b.className=\"ole-hero-msg\"; b.innerHTML='<span class=\"ole-hero-cap\">'+esc(heroCapFor(step))+'<\/span>'; return; }\n    if(animate && !instant && !prefersReducedMotion()){ startTyping(b, r); }\n    else {\n      b.className=\"ole-hero-msg reacted\";\n      b.innerHTML='<span class=\"ole-q-mark\">'+String.fromCharCode(8220)+'<\/span><span class=\"ole-hero-cap\">'+esc(r.msg)+'<\/span>'+(r.emoji?'<span class=\"ole-emoji\">'+r.emoji+'<\/span>':'');\n      if(animate){ void b.offsetWidth; b.classList.add(\"bump\"); setTimeout(function(){ b.classList.remove(\"bump\"); },420); }\n    }\n  }\n\n  \/* =========================================================\n     5) STRUCTURE\n     ========================================================= *\/\n  root.innerHTML =\n    '<div class=\"ole-card\">'+\n      '<div class=\"ole-head\">'+\n        '<div class=\"ole-head-top\">'+\n          '<span class=\"ole-eyebrow\" id=\"ole-eyebrow\"><\/span>'+\n           '<button type=\"button\" class=\"ole-close\" id=\"ole-close\" aria-label=\"Lukk skjemaet\"><i data-lucide=\"x\"><\/i><\/button>'+\n        '<\/div>'+\n        '<div class=\"ole-progress-wrap\">'+\n          '<div class=\"ole-track\"><div class=\"ole-bar\" id=\"ole-bar\"><span class=\"ole-bar-shine\"><\/span><span class=\"ole-sun\"><\/span><\/div><\/div>'+\n          '<span class=\"ole-count\" id=\"ole-count\"><\/span>'+\n        '<\/div>'+\n      '<\/div>'+\n      '<div class=\"ole-body\" id=\"ole-body\"><\/div>'+\n      '<div class=\"ole-foot\" id=\"ole-foot\"><\/div>'+\n      '<div class=\"ole-confirm\" id=\"ole-confirm\">'+\n        '<div class=\"ole-confirm-sheet\">'+\n          '<div class=\"ole-confirm-ico\"><i data-lucide=\"log-out\"><\/i><\/div>'+\n            '<h4>Forlate skjemaet?<\/h4>'+\n          '<p>Svarene dine blir ikke lagret. Du er bare noen f\u00e5 steg unna din plass i den spanske solen.<\/p>'+\n          '<div class=\"ole-confirm-actions\">'+\n            '<button type=\"button\" class=\"ole-confirm-stay\" id=\"ole-stay\">Fortsett<\/button>'+\n            '<button type=\"button\" class=\"ole-confirm-quit\" id=\"ole-quit\">Forlat likevel<\/button>'+\n          '<\/div>'+\n        '<\/div>'+\n      '<\/div>'+\n      '<input class=\"ole-hp\" type=\"text\" name=\"Hypot_field\" id=\"ole-hp\" tabindex=\"-1\" autocomplete=\"off\" aria-hidden=\"true\">'+\n    '<\/div>';\n\n  var bodyEl=document.getElementById(\"ole-body\"), barEl=document.getElementById(\"ole-bar\"),\n      countEl=document.getElementById(\"ole-count\"), eyebrowEl=document.getElementById(\"ole-eyebrow\"),\n      footEl=document.getElementById(\"ole-foot\");\n  bodyEl.addEventListener(\"input\", saveSoon);\n  bodyEl.addEventListener(\"change\", saveSoon);\n  bodyEl.addEventListener(\"click\", saveSoon);\n\n  var confirmEl=document.getElementById(\"ole-confirm\");\n  document.getElementById(\"ole-close\").onclick=function(){ if(hasAnswers()){ confirmEl.classList.add(\"show\"); } else { quit(); } };\n  document.getElementById(\"ole-stay\").onclick=function(){ confirmEl.classList.remove(\"show\"); };\n  document.getElementById(\"ole-quit\").onclick=quit;\n  confirmEl.addEventListener(\"click\",function(e){ if(e.target===confirmEl) confirmEl.classList.remove(\"show\"); });\n  function quit(){ clearState(); if(CLOSE_URL){ window.location.href=CLOSE_URL; } else if(window.history && window.history.length>1){ window.history.back(); } else { confirmEl.classList.remove(\"show\"); } }\n\n  \/* =========================================================\n     6) RENDER\n     ========================================================= *\/\n  function stepNumber(){ var seq=ORDER.filter(function(id){ return !isEdu(id) || isRisksPath(); }); return { pos: seq.indexOf(STEPS[state.i].id)+1, total: seq.length }; }\n\n  function render(animClass){\n    var step=STEPS[state.i], n=stepNumber();\n    if(step.type===\"teach\" || step.type===\"callback\") state.reaction=null;\n    var rem=n.total-n.pos;\n    if(step.type===\"contact\") countEl.textContent=\"Siste steg\";\n    else if(rem===1) countEl.textContent=\"Ett steg igjen!\";\n    else if(rem===2) countEl.textContent=\"2 sp\u00f8rsm\u00e5l igjen!\";\n    else countEl.textContent=\"Steg \"+n.pos+\" \/ \"+n.total;\n    barEl.style.width=Math.round((n.pos\/n.total)*100)+\"%\";\n    eyebrowEl.className=\"ole-eyebrow ebIn\";\n    eyebrowEl.innerHTML=(step.ebIco?'<span class=\"ole-ico ole-eb-ico\"><i data-lucide=\"'+step.ebIco+'\"><\/i><\/span>':'')+esc(step.eyebrow||\"\");\n\n    var wrap=document.createElement(\"div\");\n    wrap.className=\"ole-step \"+(animClass||\"in-right\");\n    wrap.innerHTML=stepHTML(step);\n    bodyEl.innerHTML=\"\"; bodyEl.appendChild(wrap);\n\n    renderFoot(step); wireStep(step, wrap); wireFoot(step); applyCascade(wrap);\n    bodyEl.scrollTop=0; renderBadge(true); refreshIcons(); clearFx(wrap); lockInput(); saveState();\n  }\n\n  function lockNow(){ bodyEl.style.pointerEvents=\"none\"; footEl.style.pointerEvents=\"none\"; }\n  function lockInput(){ lockNow(); setTimeout(function(){ bodyEl.style.pointerEvents=\"\"; footEl.style.pointerEvents=\"\"; state.busy=false; }, 450); }\n  function applyCascade(wrap){\n    if(prefersReducedMotion()) return;\n    var sel=\".ole-q, .ole-teach-body, .ole-quiz-ask, .ole-quiz-opt, .ole-opt, .ole-value-card, .ole-closing, .ole-field, .ole-recap, .ole-info-bonus, .ole-cb-label, .ole-cb-rdv\";\n    var els=[].slice.call(wrap.querySelectorAll(sel));\n    for(var i=0;i<els.length;i++){ els[i].classList.add(\"ole-rise\"); els[i].style.animationDelay=(0.03+Math.min(i,8)*0.05)+\"s\"; }\n  }\n  function clearFx(wrap){\n    setTimeout(function(){\n      wrap.classList.remove(\"in-right\",\"in-left\"); eyebrowEl.classList.remove(\"ebIn\");\n      var fx=wrap.querySelectorAll(\".fx\"); for(var i=0;i<fx.length;i++) fx[i].classList.remove(\"fx\");\n      var rs=wrap.querySelectorAll(\".ole-rise\"); for(var j=0;j<rs.length;j++){ rs[j].classList.remove(\"ole-rise\"); rs[j].style.animationDelay=\"\"; }\n    }, 1000);\n  }\n  function heroHTML(step){ if(!SHOW_HERO) return \"\"; return '<div class=\"ole-hero\"><div class=\"ole-hero-ico ole-ico fx\"><i data-lucide=\"'+(step.heroIco||\"sun\")+'\"><\/i><\/div><div class=\"ole-hero-msg\" id=\"ole-badge\"><\/div><\/div>'; }\n\n  function stepHTML(step){\n    var h=(step.id===\"timing\")?posHTML():\"\";\n    h+=heroHTML(step);\n    h += '<div class=\"ole-q\">'+esc(step.q)+(step.required?' <span class=\"req\">*<\/span>':'')+'<\/div>';\n    if(step.sub) h += '<div class=\"ole-sub\">'+esc(step.sub)+'<\/div>';\n\n    if(step.type===\"single\" || step.type===\"multi\"){\n      h += '<div class=\"ole-options\">';\n      step.options.forEach(function(opt){\n        var label=(typeof opt===\"object\")?opt.label:opt;\n        var icon=(typeof opt===\"object\"&&opt.ic)?opt.ic:\"circle\";\n        var tone=(typeof opt===\"object\"&&opt.tone)?(\" tone-\"+opt.tone):\"\";\n        var sel=isSelected(step,label)?\" sel\":\"\";\n        h += '<button type=\"button\" class=\"ole-opt'+tone+sel+'\" data-type=\"'+step.type+'\" data-val=\"'+esc(label)+'\"><span class=\"ole-opt-ico ole-ico\"><i data-lucide=\"'+icon+'\"><\/i><\/span><span class=\"ole-opt-label\">'+esc(label)+'<\/span><span class=\"ole-mark\"><\/span><\/button>';\n      });\n      h += '<\/div>';\n    }\n    else if(step.type===\"budget\"){\n      var bv=state.answers.budget?nf.format(state.answers.budget):\"\";\n       h += '<div class=\"ole-field has-ico\"><span class=\"ole-field-ico ole-ico\"><i data-lucide=\"euro\"><\/i><\/span><input class=\"ole-input\" id=\"ole-budget\" inputmode=\"numeric\" autocomplete=\"off\" placeholder=\"'+esc(step.placeholder)+'\" value=\"'+esc(bv)+'\"><\/div>';\n      h += '<div class=\"ole-errmsg\" id=\"err-budget\"><\/div>';\n      h += '<div class=\"ole-pills\">';\n      step.pills.forEach(function(v){ h += '<button type=\"button\" class=\"ole-pill'+(state.answers.budget===v?\" sel\":\"\")+'\" data-budget=\"'+v+'\">'+fmt(v)+'<\/button>'; });\n      h += '<\/div>';\n    }\n    else if(step.type===\"location\"){\n      var lv=state.answers.location||\"\";\n      h += '<div class=\"ole-field has-ico\"><span class=\"ole-field-ico ole-ico\"><i data-lucide=\"search\"><\/i><\/span><input class=\"ole-input\" id=\"ole-loc\" autocomplete=\"off\" placeholder=\"'+esc(step.placeholder)+'\" value=\"'+esc(lv)+'\"><\/div>';\n      h += '<div class=\"ole-pills loc-pills\">';\n      step.cities.forEach(function(c){ h += '<button type=\"button\" class=\"ole-pill'+(state.answers.location===c?\" sel\":\"\")+'\" data-loc=\"'+esc(c)+'\">'+esc(c)+'<\/button>'; });\n      h += '<\/div><div class=\"ole-pills sep loc-pills\">';\n      step.regions.forEach(function(r){ h += '<button type=\"button\" class=\"ole-pill region'+(state.answers.location===r?\" sel\":\"\")+'\" data-loc=\"'+esc(r)+'\"><span class=\"ole-pill-ico ole-ico\"><i data-lucide=\"waves\"><\/i><\/span>'+esc(r)+'<\/button>'; });\n      h += '<\/div>';\n    }\n    else if(step.type===\"teach\"){\n      var showQuiz = step.quiz && (RISKS_FORMAT===\"quiz\" || (RISKS_FORMAT===\"mix\" && step.quizMix));\n      if(showQuiz){\n        h += '<div class=\"ole-quiz\"><div class=\"ole-quiz-ask\">'+esc(step.quiz.ask)+'<\/div><div class=\"ole-quiz-opts\">';\n        step.quiz.options.forEach(function(o,idx){ h += '<button type=\"button\" class=\"ole-quiz-opt\" data-correct=\"'+(o.correct?\"1\":\"0\")+'\" data-idx=\"'+idx+'\"><span class=\"ole-quiz-mark\"><\/span><span class=\"ole-quiz-lbl\">'+esc(o.label)+'<\/span><\/button>'; });\n        h += '<\/div><div class=\"ole-quiz-reveal\" id=\"ole-quiz-reveal\"><div class=\"ole-quiz-reveal-ico ole-ico\"><i data-lucide=\"lightbulb\"><\/i><\/div><div class=\"ole-quiz-reveal-txt\">'+esc(step.quiz.reveal)+'<\/div><\/div><\/div>';\n      } else if(step.body){ h += '<div class=\"ole-teach-body\">'+esc(step.body)+'<\/div>'; }\n      if(step.valueRecap){\n        var vr=step.valueRecap; h += '<div class=\"ole-value\">';\n        if(vr.saves && vr.saves.length){ h += '<div class=\"ole-value-card gain\"><div class=\"ole-value-title\"><span class=\"ole-ico\"><i data-lucide=\"piggy-bank\"><\/i><\/span>Hva vi sparer deg for<\/div>'; vr.saves.forEach(function(it){ h += '<div class=\"ole-value-item\"><span class=\"ole-value-ico ole-ico\"><i data-lucide=\"'+it.ic+'\"><\/i><\/span><span>'+esc(it.t)+'<\/span><\/div>'; }); h += '<\/div>'; }\n        if(vr.avoids && vr.avoids.length){ h += '<div class=\"ole-value-card avoid\"><div class=\"ole-value-title\"><span class=\"ole-ico\"><i data-lucide=\"shield-check\"><\/i><\/span>Fellene vi holder deg unna<\/div>'; vr.avoids.forEach(function(it){ h += '<div class=\"ole-value-item\"><span class=\"ole-value-ico ole-ico\"><i data-lucide=\"'+it.ic+'\"><\/i><\/span><span>'+esc(it.t)+'<\/span><\/div>'; }); h += '<\/div>'; }\n        h += '<\/div>';\n      }\n      if(step.closing) h += '<div class=\"ole-closing\"><div class=\"ole-closing-ico ole-ico\"><i data-lucide=\"badge-check\"><\/i><\/div><div><div class=\"ole-closing-t\">'+esc(step.closing.t)+'<\/div><div class=\"ole-closing-d\">'+esc(step.closing.d)+'<\/div><\/div><\/div>';\n    }\n    else if(step.type===\"callback\"){\n      cbInitZone();\n      var zNow=cbZoneShort(); var isOther=!cbIsUsZone();\n      h += '<div class=\"ole-cb-fields'+(state.answers.cb_rdv?\" hidden\":\"\")+'\" id=\"ole-cb-fields\">';\n        h += '<div class=\"ole-cb-label\"><span class=\"ole-ico\"><i data-lucide=\"globe\"><\/i><\/span>Din tidssone<\/div>';\n      h += '<div class=\"ole-pills ole-cb-zones\" id=\"ole-cb-zones\">';\n      US_ZONES.forEach(function(z){ h += '<button type=\"button\" class=\"ole-pill'+(!isOther && state.answers.cb_tz===z.tz?\" sel\":\"\")+'\" data-cbzone=\"'+z.l+'\" data-cbtz=\"'+z.tz+'\">'+esc(z.l)+'<\/button>'; });\n      h += '<button type=\"button\" class=\"ole-pill'+(isOther?\" sel\":\"\")+'\" data-cbother=\"1\"><span class=\"ole-pill-ico ole-ico\"><i data-lucide=\"globe-2\"><\/i><\/span>Annet land<\/button>';\n      h += '<\/div>';\n      h += '<select class=\"ole-cb-select'+(isOther?\" show\":\"\")+'\" id=\"ole-cb-select\" aria-label=\"Velg tidssone\"><option value=\"\">Velg land \/ tidssone \u2026<\/option>';\n      WORLD_ZONES.forEach(function(z){ h += '<option value=\"'+esc(z.tz)+'\" data-s=\"'+esc(z.s)+'\"'+(isOther && state.answers.cb_tz===z.tz?\" selected\":\"\")+'>'+esc(z.l)+'<\/option>'; });\n      h += '<\/select>';\n      h += '<div class=\"ole-cb-label sep\"><span class=\"ole-ico\"><i data-lucide=\"calendar\"><\/i><\/span>Dag<\/div>';\n      h += '<div class=\"ole-pills ole-cb-days\" id=\"ole-cb-days\">';\n      step.days.forEach(function(d){ var sel=(Array.isArray(state.answers.cb_days)&&state.answers.cb_days.indexOf(d.label)>-1)?\" sel\":\"\"; h += '<button type=\"button\" class=\"ole-pill'+sel+'\" data-cbday=\"'+esc(d.label)+'\" data-dow=\"'+d.dow+'\">'+esc(  CB_DAY_NO[d.label]||d.label)+'<\/button>'; });\n      h += '<button type=\"button\" class=\"ole-pill'+(state.answers.cb_days_indif?\" sel\":\"\")+'\" data-cbday-indif=\"1\">Hvilken som helst dag<\/button>';\n      h += '<\/div>';\n      h += '<div class=\"ole-cb-label sep\"><span class=\"ole-ico\"><i data-lucide=\"clock\"><\/i><\/span>Tidsrom<\/div>';\n      h += '<div class=\"ole-cb-hint\" id=\"ole-cb-hint\">Vist i din lokale tid ('+esc(zNow)+'). Vi ringer bare i kontortiden v\u00e5r i Spania, s\u00e5 disse tidsrommene passer allerede med n\u00e5r vi kan n\u00e5 deg.<\/div>';\n      h += '<div class=\"ole-pills ole-cb-slots\" id=\"ole-cb-slots\">'+cbSlotsHTML()+'<\/div>';\n      h += '<div class=\"ole-cb-empty\" id=\"ole-cb-empty\" style=\"'+(cbHasSlots( )?\"display:none\":\"\")+'\">Med tidsforskjellen mellom Spania og der du bor er det sv\u00e6rt f\u00e5 tidsrom for samtaler denne dagen. Velg <strong>\\u00ABN\u00e5r som helst\\u00BB<\/strong>, s\u00e5 finner vi det beste tidspunktet, eller bestill en samtale for \u00e5 sikre et tidspunkt.<\/div>';\n      h += '<div class=\"ole-cb-precise'+(state.answers.cb_precise?\" show\":\"\")+'\" id=\"ole-cb-precise\"><div class=\"ole-cb-precise-inner\"><div class=\"ole-cb-mini\">Hvilket klokkeslett passer best?<\/div><div class=\"ole-pills ole-cb-hours\" id=\"ole-cb-hours\">'+cbHoursHTML()+'<\/div><div class=\"ole-cb-precise-note'+(state.answers.cb_precise&&state.answers.cb_hour!=null?\" show\":\"\")+'\" id=\"ole-cb-precise-note\"><span class=\"ole-cb-precise-note-ico ole-ico\"><i data-lucide=\"info\"><\/i><\/span><div class=\"ole-cb-precise-note-body\"><span id=\"ole-cb-precise-note-txt\">'+esc(cbPreciseMsg())+'<\/span><button type=\"button\" class=\"ole-cb-precise-rdv\" id=\"ole-cb-precise-rdv\"><span class=\"ole-ico\"><i data-lucide=\"calendar-check\"><\/i><\/span>Bestill en samtale<\/button><\/div><\/div><\/div><\/div>';\n      h += '<div class=\"ole-cb-office\"><span class=\"ole-ico\"><i data-lucide=\"info\"><\/i><\/span><span>Vi holder til i Spania og ringer i v\u00e5r lokale kontortid (kl. 9 til 19 CET, mandag til fredag). Vi gj\u00f8r v\u00e5rt beste for \u00e5 n\u00e5 deg i tidsrommet du har valgt.<\/span><\/div>';\n      h += '<\/div>';\n      h += '<button type=\"button\" class=\"ole-cb-rdv'+(state.answers.cb_rdv?\" on\":\"\")+'\" id=\"ole-cb-rdv\" aria-pressed=\"'+(  state.answers.cb_rdv?\"true\":\"false\")+'\"><span class=\"ole-cb-rdv-mark\"><\/span><span class=\"ole-cb-rdv-ico ole-ico\"><i data-lucide=\"calendar-check\"><\/i><\/span><span class=\"ole-cb-rdv-txt\">Jeg vil heller bestille en samtale selv<\/span><\/button>';\n      h += '<div class=\"ole-cb-rdv-note'+(state.answers.cb_rdv?\" show\":\"\")+'\" id=\"ole-cb-rdv-note\"><span class=\"ole-cb-rdv-note-ico ole-ico\"><i data-lucide=\"info\"><\/i><\/span><span>N\u00e5r skjemaet er sendt, kommer du til bookingsiden v\u00e5r for \u00e5 velge et tidspunkt direkte med en r\u00e5dgiver.<\/span><\/div>';\n    }\n    else if(step.type===\"contact\"){\n      var a=state.answers;\n      h += recapHTML();\n      h += proofHTML();\n      h += '<form class=\"ole-cform\" autocomplete=\"on\" onsubmit=\"return false;\">'+\n           '<div class=\"ole-grid2\">'+ field(\"firstname\",\"Fornavn\",\"text\",a.firstname,\"Kari\",\"given-name\")+ field(\"lastname\",\"Etternavn\",\"text\",a.lastname,\"Nordmann\",\"family-name\")+ '<\/div>'+\n           field(\"email\",\"E-post\",\"email\",a.email,\"kari.nordmann@epost.no\",\"email\")+\n           '<div class=\"ole-suggest\" id=\"sugg-email\" aria-live=\"polite\"><\/div>'+\n           '<div class=\"ole-phone-msg\" id=\"ole-phone-msg\"><\/div>'+\n           field(\"phone\",  \"Telefon\",\"tel\",a.phone,\"412 34 567\",\"tel\")+\n           '<div class=\"ole-consent\"><span class=\"ole-ico\"><i data-lucide=\"shield-check\"><\/i><\/span><span>'+esc(step.consent)+' <a class=\"ole-consent-link\" href=\"'+esc(PRIVACY_URL)+'\" target=\"_blank\" rel=\"noopener noreferrer\">Personvernerkl\u00e6ring<\/a>. <span style=\"color:var(--blue)\">*<\/span><\/span><\/div>'+\n           '<\/form>';\n    }\n    return h;\n  }\n\n  var PROOF_LINES = [\n     'Du f\u00e5r hjelp av et <strong>engelsktalende team<\/strong>, fra s\u00f8k til signering.',\n    'Vi er dine <strong>\u00f8yne og \u00f8rer<\/strong> p\u00e5 stedet i Spania.',\n    'Vi ordner papirarbeidet (<strong>NIE, notar, bank<\/strong>), s\u00e5 du slipper.',\n    'Det beste tidspunktet \u00e5 starte var i g\u00e5r. Det nest beste er <strong>n\u00e5<\/strong>.',\n    'Din plass i den spanske solen kan v\u00e6re <strong>n\u00e6rmere enn du tror<\/strong>.'\n  ];\n  function proofHTML(){ return '<div class=\"ole-proof\"><span class=\"ole-proof-ico ole-ico\"><i data-lucide=\"sparkles\"><\/i><\/span><span class=\"ole-proof-rot\" id=\"ole-proof-rot\"><\/span><\/div>'; }\n  function initProof(wrap){\n    var el=wrap.querySelector(\"#ole-proof-rot\"); if(!el) return; var i=0;\n    if(state._proofIv){ clearInterval(state._proofIv); }\n    el.innerHTML='<span class=\"ole-proof-line\">'+PROOF_LINES[0]+'<\/span>';\n    state._proofIv=setInterval(function(){ el.classList.add(\"out\"); setTimeout(function(){ i=(i+1)%PROOF_LINES.length; el.innerHTML='<span class=\"ole-proof-line\">'+PROOF_LINES[i]+'<\/span>'; el.classList.remove(\"out\"); },450); },5200);\n  }\n\n  function field(id,label,type,val,ph,ac){\n    var im=(type===\"email\")?'inputmode=\"email\" ':(type===\"tel\")?'inputmode=\"tel\" ':'';\n    var extra=(type===\"email\")?'autocapitalize=\"off\" autocorrect=\"off\" spellcheck=\"false\" ':(type===\"text\")?'autocapitalize=\"words\" ':'';\n    return '<div class=\"ole-field\"><label class=\"ole-label\" for=\"ole-'+id+'\">'+esc(label)+' <span class=\"req\">*<\/span><\/label><input class=\"ole-input\" id=\"ole-'+id+'\" name=\"'+id+'\" type=\"'+type+'\" autocomplete=\"'+(ac||\"on\")+'\" '+im+extra+'value=\"'+esc(val||\"\")+'\" placeholder=\"'+esc(ph)+'\"><div class=\"ole-errmsg\" id=\"err-'+id+'\"><\/div><\/div>';\n  }\n\n  function renderFoot(step){\n    var html=\"\", primary=\"\";\n    if(step.type===\"contact\"){\n      var ctaCity=state.answers.location?cityName(state.answers.location):\"\";\n      var ctaLabel=ctaCity?(  \"Start s\u00f8ket mitt \"+locWithPrep(ctaCity)):\"Send foresp\u00f8rselen\";\n      primary='<button type=\"button\" class=\"ole-next sun\" id=\"ole-next\"><span class=\"ole-spin\" id=\"ole-spin\"><\/span><span id=\"ole-next-label\">'+esc(ctaLabel)+'<\/span> <i data-lucide=\"check\"><\/i><\/button>';\n    } else if(step.type===\"teach\"){ primary='<button type=\"button\" class=\"ole-next\" id=\"ole-next\">'+esc( step.cta||\"Neste\")+' <i data-lucide=\"arrow-right\"><\/i><\/button>'; }\n    else if(step.type===\"multi\" || step.type===\"budget\" || step.type===\"location\" || step.type===\"callback\"){ primary='<button type=\"button\" class=\"ole-next\" id=\"ole-next\">Neste <i data-lucide=\"arrow-right\"><\/i><\/button>'; }\n    if(primary) html += primary;\n    if( step.type===\"contact\") html += '<div class=\"ole-trust\"><span><i data-lucide=\"lock\"><\/i> Uforpliktende<\/span><span><i data-lucide=\"clock\"><\/i> Svar innen 24 t<\/span><span><i data-lucide=\"message-circle\"><\/i> Engelsktalende team<\/span><\/div>';\n    if(step.type===\"teach\" && step.skip) html += '<button type=\"button\" class=\"ole-skip\" id=\"ole-skip\">Hopp over dette steget<\/button>';\n    if(state.history.length>0) html += '<button type=\"button\" class=\"ole-back\" id=\"ole-back\"><i data-lucide=\"chevron-left\"><\/i> Tilbake<\/button>';\n    footEl.innerHTML=html;\n  }\n\n  function isSelected(step,label){ var v=state.answers[step.id]; if(step.type===\"multi\") return Array.isArray(v)&&v.indexOf(label)>-1; return v===label; }\n\n  \/* =========================================================\n     7) INTERACTIONS\n     ========================================================= *\/\n  function wireFoot(step){\n    var back=footEl.querySelector(\"#ole-back\"); if(back) back.onclick=prev;\n    var next=footEl.querySelector(\"#ole-next\"); if(!next) return;\n    if(step.type===\"contact\") next.onclick=submit;\n    else if(step.type===\"teach\"){ next.onclick=function(){ nextStep(); }; var sk=footEl.querySelector(\"#ole-skip\"); if(sk) sk.onclick=skipToContact; }\n    else next.onclick=function(){ if(validate(step)) nextStep(); };\n  }\n\n  function wireStep(step, wrap){\n    var posT = wrap.querySelector(\"#ole-pos-toggle\");\n    if(posT) posT.onclick=function(){ var p=wrap.querySelector(\"#ole-pos\"); if(p){ var open=p.classList.toggle(\"open\"); posT.setAttribute(\"aria-expanded\", open?\"true\":\"false\"); } refreshIcons(); };\n    if(step.type===\"single\" || step.type===\"multi\"){\n      wrap.querySelectorAll(\".ole-opt\").forEach(function(btn){\n        btn.onclick=function(){\n          var val=btn.getAttribute(\"data-val\");\n          if(step.type===\"multi\"){\n            var arr=state.answers[step.id]||[]; var k=arr.indexOf(val);\n            if(k>-1) arr.splice(k,1); else arr.push(val);\n            state.answers[step.id]=arr; btn.classList.toggle(\"sel\"); btn.classList.add(\"pulse\");\n            setTimeout(function(){btn.classList.remove(\"pulse\");},350); showReaction(step, arr);\n          } else {\n            wrap.querySelectorAll(\".ole-opt\").forEach(function(b){b.classList.remove(\"sel\");});\n            btn.classList.add(\"sel\",\"pulse\"); state.answers[step.id]=val; setReaction(step, val); lockAdvance();\n          }\n        };\n      });\n    }\n    else if(step.type===\"budget\"){\n      var inp=wrap.querySelector(\"#ole-budget\");\n      function applyBudget(el){\n        var raw=el.value, caret=el.selectionStart==null?raw.length:el.selectionStart;\n        var before=raw.slice(0,caret).replace(\/\\D\/g,\"\").length;\n        var d=raw.replace(\/[^\\d]\/g,\"\"); state.answers.budget=d?parseInt(d,10):null;\n        var f=d?nf.format(parseInt(d,10)):\"\"; el.value=f;\n        var pos=0,seen=0; while(pos<f.length && seen<before){ var c=f.charCodeAt(pos); if(c>=48&&c<=57) seen++; pos++; }\n        try{ el.setSelectionRange(pos,pos); }catch(e){}\n        wrap.querySelectorAll(\".ole-pill\").forEach(function(p){ p.classList.toggle(\"sel\", parseInt(p.dataset.budget,10)===state.answers.budget); });\n        showReaction(step, state.answers.budget, true); setErr(\"budget\",\"\");\n      }\n      inp.addEventListener(\"input\",function(){ applyBudget(inp); });\n      wrap.querySelectorAll(\".ole-pill\").forEach(function(p){ p.onclick=function(){ var v=parseInt(p.dataset.budget,10); state.answers.budget=v; inp.value=nf.format(v); wrap.querySelectorAll(\".ole-pill\").forEach(function(x){x.classList.toggle(\"sel\",x===p);}); setReaction(step, v); lockAdvance(); }; });\n    }\n    else if(step.type===\"location\"){\n      var loc=wrap.querySelector(\"#ole-loc\");\n      var pills=[].slice.call(wrap.querySelectorAll(\".ole-pill\"));\n      pills.forEach(function(p){ p.onclick=function(){ var v=p.getAttribute(\"data-loc\"); state.answers.location=v; loc.value=v; pills.forEach(function(x){x.classList.toggle(\"sel\",x===p);}); setReaction(step, v); lockAdvance(); }; });\n      loc.addEventListener(\"input\",function(){ state.answers.location=loc.value; showReaction(step, loc.value, true); var t=loc.value.toLowerCase().trim(); pills.forEach(function(p){ p.classList.toggle(\"sel\", p.getAttribute(\"data-loc\")===loc.value); p.classList.toggle(\"hidden\", t.length>0 && p.getAttribute(\"data-loc\").toLowerCase().indexOf(t)===-1); }); });\n      if(HS.googleMapsKey) loadGoogleMaps(HS.googleMapsKey, function(){ gMapsReady=true; initLocationAutocomplete(loc, pills, step); });\n    }\n    else if(step.type===\"contact\"){\n      [\"firstname\",\"lastname\",\"email\"].forEach(function(id){ var el=wrap.querySelector(\"#ole-\"+id); if(el) el.addEventListener(\"input\", function(){ if(id===\"email\"){ var lo=el.value.toLowerCase(); if(lo!==el.value){ var p=el.selectionStart; el.value=lo; try{ el.setSelectionRange(p,p); }catch(e){} } } state.answers[id]=el.value; }); });\n      var phEl=wrap.querySelector(\"#ole-phone\"); if(phEl) phEl.addEventListener(\"input\", function(){ state.answers.phone=phEl.value; });\n      var em=wrap.querySelector(\"#ole-email\"), sug=wrap.querySelector(\"#sugg-email\");\n      function clearSug(){ if(sug){ sug.innerHTML=\"\"; sug.classList.remove(\"show\"); } }\n      function checkSug(){ if(!em||!sug) return; var s=suggestEmail(em.value.trim()); if(s){  sug.innerHTML='Mente du <button type=\"button\" class=\"ole-suggest-link\" data-email=\"'+esc(s)+'\">'+esc(s)+'<\/button>?'; sug.classList.add(\"show\"); } else clearSug(); }\n      if(em){ em.addEventListener(\"blur\", checkSug); em.addEventListener(\"input\", clearSug); }\n      if(sug){ sug.addEventListener(\"click\", function(e){ var t=e.target; if(t&&t.classList&&t.classList.contains(\"ole-suggest-link\")){ em.value=t.getAttribute(\"data-email\"); state.answers.email=em.value; clearSug(); setErr(\"email\",\"\"); em.focus(); } }); }\n      initPhone(wrap); initProof(wrap);\n      var cbEdit=wrap.querySelector(\"#ole-recap-cb-edit\");\n      if(cbEdit){ var goEditCb=function(){ if(state.busy) return; var t=stepIndexById(\"callback\"); if(t<0||t===state.i) return; if(state.history.length && state.history[state.history.length-1]===t) transitionTo(state.history.pop(),-1); else transitionTo(t,-1); }; cbEdit.addEventListener(\"click\", goEditCb); cbEdit.addEventListener(\"keydown\", function(e){ if(e.key===\"Enter\"||e.key===\" \"){ e.preventDefault(); goEditCb(); } }); }\n      var cform=wrap.querySelector(\".ole-cform\"); if(cform) cform.addEventListener(\"keydown\", function(e){ if(e.key===\"Enter\"){ e.preventDefault(); submit(); } });\n      var noteEl=wrap.querySelector(\"#ole-recap-note\");\n      if(noteEl){ var noteTxt=noteEl.getAttribute(\"data-note\")||\"\"; if(noteTxt){ if(state._noteT) clearTimeout(state._noteT); if(state._noteTw) clearTimeout(state._noteTw); state._noteT=setTimeout(function(){ noteEl.classList.add(\"writing\"); var i=0; (function tick(){ noteEl.textContent=noteTxt.slice(0,i); if(i<noteTxt.length){ i++; state._noteTw=setTimeout(tick,30); } else { state._noteTw=null; noteEl.classList.remove(\"writing\"); } })(); },2000); } }\n    }\n    else if(step.type===\"callback\"){\n      var fieldsEl=wrap.querySelector(\"#ole-cb-fields\"), slotsEl=wrap.querySelector(\"#ole-cb-slots\"), noteEl=wrap.querySelector(\"#ole-cb-rdv-note\");\n      var rdvBtn=wrap.querySelector(\"#ole-cb-rdv\"), preciseEl=wrap.querySelector(\"#ole-cb-precise\"), hoursEl=wrap.querySelector(\"#ole-cb-hours\");\n      var pNoteEl=wrap.querySelector(\"#ole-cb-precise-note\"), pNoteTxt=wrap.querySelector(\"#ole-cb-precise-note-txt\"), pRdvBtn=wrap.querySelector(\"#ole-cb-precise-rdv\");\n      var hintEl=wrap.querySelector(\".ole-cb-hint\");\n      var selEl=wrap.querySelector(\"#ole-cb-select\");\n      var emptyEl=wrap.querySelector(\"#ole-cb-empty\");\n      cbInitZone();\n      function cbSyncEmpty(){ if(emptyEl) emptyEl.style.display = cbHasSlots()?\"none\":\"\"; }\n      function cbHint(){ if(  hintEl) hintEl.textContent=\"Vist i din lokale tid (\"+cbZoneShort()+\"). Vi ringer bare i kontortiden v\u00e5r i Spania, s\u00e5 disse tidsrommene passer allerede med n\u00e5r vi kan n\u00e5 deg.\"; }\n      function cbUpdate(){ state.reaction=cbReaction(); renderBadge(true); saveSoon(); }\n      function cbSetRdv(on){ state.answers.cb_rdv=on; if(rdvBtn){ rdvBtn.classList.toggle(\"on\",on); rdvBtn.setAttribute(\"aria-pressed\",on?\"true\":\"false\"); } if(fieldsEl) fieldsEl.classList.toggle(\"hidden\",on); if(noteEl) noteEl.classList.toggle(\"show\",on); cbUpdate(); }\n      function cbSyncPrecise(){ if(preciseEl) preciseEl.classList.toggle(\"show\", !!state.answers.cb_precise); if(pNoteEl) pNoteEl.classList.toggle(\"show\", !!(state.answers.cb_precise&&state.answers.cb_hour!=null)); if(pNoteTxt) pNoteTxt.textContent=cbPreciseMsg(); }\n      function cbWireHours(){ if(!hoursEl) return; hoursEl.querySelectorAll(\"[data-cbhour]\").forEach(function(btn){ btn.onclick=function(){ var v=parseInt(btn.getAttribute(\"data-cbhour\"),10), was=btn.classList.contains(\"sel\"); hoursEl.querySelectorAll(\"[data-cbhour]\").forEach(function(b){b.classList.remove(\"sel\");}); if(!was){ btn.classList.add(\"sel\"); state.answers.cb_hour=v; } else state.answers.cb_hour=null; cbSyncPrecise(); cbUpdate(); }; }); }\n      function cbRefreshHours(){ if(!hoursEl) return; var allowed=cbHours(); if(state.answers.cb_hour!=null && allowed.indexOf(state.answers.cb_hour)===-1) state.answers.cb_hour=null; hoursEl.innerHTML=cbHoursHTML(); cbWireHours(); refreshIcons(); }\n      function cbClearAny(){ state.answers.cb_any=false; var ab=slotsEl.querySelector(\"[data-cbany]\"); if(ab) ab.classList.remove(\"sel\"); }\n      function cbWireSlots(){\n        slotsEl.querySelectorAll(\"[data-cbslot]\").forEach(function(btn){ btn.onclick=function(){ var v=parseInt(btn.getAttribute(\"data-cbslot\"),10), was=btn.classList.contains(\"sel\"); slotsEl.querySelectorAll(\"[data-cbslot]\").forEach(function(b){b.classList.remove(\"sel\");}); state.answers.cb_precise=false; state.answers.cb_hour=null; cbClearAny(); var pp=slotsEl.querySelector(\"[data-cbprecise]\"); if(pp) pp.classList.remove(\"sel\"); if(!was){ btn.classList.add(\"sel\"); state.answers.cb_slot=v; } else state.answers.cb_slot=null; cbSyncPrecise(); cbUpdate(); }; });\n        var pBtn=slotsEl.querySelector(\"[data-cbprecise]\");\n        if(pBtn) pBtn.onclick=function(){ var on=!state.answers.cb_precise; state.answers.cb_precise=on; cbClearAny(); if(on){ state.answers.cb_slot=null; slotsEl.querySelectorAll(\"[data-cbslot]\").forEach(function(b){b.classList.remove(\"sel\");}); } else { state.answers.cb_hour=null; } pBtn.classList.toggle(\"sel\",on); cbRefreshHours(); cbSyncPrecise(); cbUpdate(); };\n        var anyBtn=slotsEl.querySelector(\"[data-cbany]\");\n        if(anyBtn) anyBtn.onclick=function(){ var on=!state.answers.cb_any; state.answers.cb_any=on; if(on){ state.answers.cb_slot=null; state.answers.cb_precise=false; state.answers.cb_hour=null; slotsEl.querySelectorAll(\"[data-cbslot]\").forEach(function(b){b.classList.remove(\"sel\");}); var pp=slotsEl.querySelector(\"[data-cbprecise]\"); if(pp) pp.classList.remove(\"sel\"); } anyBtn.classList.toggle(\"sel\",on); cbRefreshHours(); cbSyncPrecise(); cbUpdate(); };\n      }\n      function cbRefreshSlots(){ if(state.answers.cb_slot!=null){ var ok=cbCurrentSlots().some(function(s){return s.h===state.answers.cb_slot;}); if(!ok) state.answers.cb_slot=null; } slotsEl.innerHTML=cbSlotsHTML(); cbWireSlots(); cbRefreshHours(); cbSyncPrecise(); cbSyncEmpty(); refreshIcons(); }\n      function cbSetZone(tz, label){ state.answers.cb_tz=tz; state.answers.cb_zone=label||cbShortFromTz(tz); cbHint(); cbRefreshSlots(); cbUpdate(); }\n      \/\/ US zone pills\n      wrap.querySelectorAll(\"[data-cbzone]\").forEach(function(btn){ btn.onclick=function(){ wrap.querySelectorAll(\"[data-cbzone]\").forEach(function(b){ b.classList.remove(\"sel\"); }); btn.classList.add(\"sel\"); var ob=wrap.querySelector(\"[data-cbother]\"); if(ob) ob.classList.remove(\"sel\"); if(selEl){ selEl.classList.remove(\"show\"); selEl.value=\"\"; } cbSetZone(btn.getAttribute(\"data-cbtz\"), btn.getAttribute(\"data-cbzone\")); }; });\n      \/\/ \"Other country\" pill -> reveal world-zone select\n      var otherBtn=wrap.querySelector(\"[data-cbother]\");\n      if(otherBtn) otherBtn.onclick=function(){ wrap.querySelectorAll(\"[data-cbzone]\").forEach(function(b){ b.classList.remove(\"sel\"); }); otherBtn.classList.add(\"sel\"); if(selEl){ selEl.classList.add(\"show\"); try{ selEl.focus(); }catch(e){} } };\n      if(selEl) selEl.addEventListener(\"change\", function(){ var tz=selEl.value; if(!tz) return; var opt=selEl.options[selEl.selectedIndex]; var s=opt?opt.getAttribute(\"data-s\"):null; wrap.querySelectorAll(\"[data-cbzone]\").forEach(function(b){ b.classList.remove(\"sel\"); }); if(otherBtn) otherBtn.classList.add(\"sel\"); cbSetZone(tz, s); });\n      \/\/ Day pills (Saturday exclusive)\n      wrap.querySelectorAll(\"[data-cbday]\").forEach(function(btn){ btn.onclick=function(){ var label=btn.getAttribute(\"data-cbday\"); state.answers.cb_days_indif=false; var di=wrap.querySelector(\"[data-cbday-indif]\"); if(di) di.classList.remove(\"sel\"); var arr=state.answers.cb_days||[]; var wasSel=arr.indexOf(label)>-1; if(label===\"Sat\"){ arr=wasSel?[]:[\"Sat\"]; } else { arr=arr.filter(function(x){return x!==\"Sat\";}); var k=arr.indexOf(label); if(k>-1) arr.splice(k,1); else arr.push(label); } state.answers.cb_days=arr; wrap.querySelectorAll(\"[data-cbday]\").forEach(function(b){ b.classList.toggle(\"sel\", arr.indexOf(b.getAttribute(\"data-cbday\"))>-1); }); btn.classList.add(\"pulse\"); setTimeout(function(){btn.classList.remove(\"pulse\");},350); cbRefreshSlots(); cbUpdate(); }; });\n      var dind=wrap.querySelector(\"[data-cbday-indif]\");\n      if(dind) dind.onclick=function(){ var on=!dind.classList.contains(\"sel\"); state.answers.cb_days_indif=on; state.answers.cb_days=[]; wrap.querySelectorAll(\"[data-cbday]\").forEach(function(b){b.classList.remove(\"sel\");}); dind.classList.toggle(\"sel\",on); cbRefreshSlots(); cbUpdate(); };\n      cbWireSlots(); cbWireHours(); cbSyncPrecise(); cbSyncEmpty();\n      if(pRdvBtn) pRdvBtn.onclick=function(){ cbSetRdv(true); };\n      if(rdvBtn) rdvBtn.onclick=function(){ cbSetRdv(!state.answers.cb_rdv); };\n    }\n    if(step.type===\"teach\"){\n      var quiz=wrap.querySelector(\".ole-quiz\");\n      if(quiz){\n        var opts=[].slice.call(quiz.querySelectorAll(\".ole-quiz-opt\")); var reveal=quiz.querySelector(\"#ole-quiz-reveal\");\n        opts.forEach(function(b){ b.onclick=function(){ if(quiz.classList.contains(\"answered\")) return; quiz.classList.add(\"answered\"); var correct=b.getAttribute(\"data-correct\")===\"1\"; opts.forEach(function(x){ var isC=x.getAttribute(\"data-correct\")===\"1\"; if(isC){ x.classList.add(\"correct\"); } if(x===b && !correct){ x.classList.add(\"wrong\"); } x.classList.add(\"locked\"); }); if(reveal) reveal.classList.add(\"show\"); state.reaction=correct?{emoji:\"\\uD83D\\uDC4F\",msg:pickVaried(QUIZ_OK,\"_qok\")}:{emoji:\"\\uD83D\\uDE2C\",msg:pickVaried(QUIZ_KO,\"_qko\")}; renderBadge(true); refreshIcons(); }; });\n      }\n    }\n  }\n\n  function lockAdvance(){ if(state.locked) return; state.locked=true; setTimeout(function(){ state.locked=false; nextStep(); }, 340); }\n\n  \/* =========================================================\n     8) VALIDATION\n     ========================================================= *\/\n  function validate(step){\n    if(step.type===\"contact\") return validateContact();\n    if(!step.required) return true;\n    var v=state.answers[step.id];\n    if(step.type===\"multi\") return Array.isArray(v)&&v.length>0;\n    if(step.type===\"budget\"){ if(!v||v<=0){ setErr(\"budget\",\"Skriv inn budsjettet ditt for \u00e5 fortsette.\"); return false; } if(step.min&&v<step.min){ setErr(\"budget\",\"Vi jobber med prosjekter fra \"+fmt(step.min)+\" og oppover.\"); return false; } setErr(\"budget\",\"\"); return true; }\n    return !!v;\n  }\n  function validateContact(){\n    var ok=true;\n    [[\"firstname\",\"Skriv inn fornavnet ditt\"],[\"lastname\",\"Skriv inn etternavnet ditt\"]].forEach(function(f){ var el=document.getElementById(\"ole-\"+f[0]); var v=el.value.trim(); state.answers[f[0]]=v; setErr(f[0], v?\"\":f[1]); if(!v) ok=false; });\n    var ev=document.getElementById(\"ole-email\").value.trim(); state.answers.email=ev;\n    var emOk=\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$\/.test(ev); setErr(\"email\",   emOk?\"\":\"Skriv inn en gyldig e-postadresse\"); if(!emOk) ok=false;\n    var phoneEl=document.getElementById(\"ole-phone\");\n    if(itiPhone && window.intlTelInputUtils){ var phValid=itiPhone.isValidNumber(); state.answers.phone=phValid?itiPhone.getNumber():phoneEl.value.trim(); setErr(\"phone\",  phValid?\"\":\"Ugyldig nummer for valgt land\"); if(!phValid) ok=false; }\n    else { var pv=phoneEl.value.trim(); state.answers.phone=pv; var phOk=\/^[+0-9][0-9 ().-]{7,}$\/.test(pv); setErr(\"phone\", phOk?\"\":\"Skriv inn et gyldig telefonnummer\"); if(!phOk) ok=false; }\n    return ok;\n  }\n  function setErr(id,msg){ var inp=document.getElementById(\"ole-\"+id), err=document.getElementById(\"err-\"+id); if(!inp) return; inp.classList.toggle(\"err\",!!msg); if(err){ err.textContent=msg||\"\"; err.classList.toggle(\"show\",!!msg); } }\n\n  \/* =========================================================\n     9) NAVIGATION\n     ========================================================= *\/\n  function computeNext(){\n    var cur=STEPS[state.i];\n    if(cur.id===\"service\") return stepIndexById(isRisksPath() ? RISK_IDS[0] : \"contact\"); \n    var ei=RISK_IDS.indexOf(cur.id);\n    if(ei>-1) return ei<RISK_IDS.length-1 ? stepIndexById(RISK_IDS[ei+1]) : stepIndexById(\"contact\");\n     var n=state.i+1; while(STEPS[n] && isEdu(STEPS[n].id)) n++; return n;\n  }\n  function skipToContact(){ if(state.busy) return; state.history.push(state.i); transitionTo(stepIndexById(\"contact\"),1);  }\n  function nextStep(){ if(state.busy) return; var t=computeNext(); if(t>=STEPS.length) return; state.history.push(state.i); transitionTo(t,1); }\n  function prev(){ if(state.busy || !state.history.length) return; transitionTo(state.history.pop(),-1); }\n  function transitionTo(target,dir){ state.busy=true; lockNow(); scrollFormToTop(); var cur=bodyEl.querySelector(\".ole-step\"); cur.classList.remove(\"in-right\",\"in-left\"); cur.classList.add(dir>0?\"out-left\":\"out-right\"); setTimeout(function(){ state.i=target; render(dir>0?\"in-right\":\"in-left\"); }, 300); }\n  function scrollFormToTop(){ if(!SCROLL_TOTOP) return; try{ var reduce=window.matchMedia&&window.matchMedia(\"(prefers-reduced-motion:reduce)\").matches; window.scrollTo({ top:0, left:0, behavior:reduce?\"auto\":\"smooth\" }); }catch(e){ try{ window.scrollTo(0,0); }catch(_e){} } }\n\n  \/* =========================================================\n     10) HUBSPOT SUBMIT\n     ========================================================= *\/\n  function buildFields(){\n    var a=state.answers,f=HS.fields,out=[];\n    function enVal(v){ if(Array.isArray(v)) return v.map(enVal); return (v!=null && EN_VAL[v]) ? EN_VAL[v] : v; }\n    function push(name,val){ if(name&&val!=null&&val!==\"\") out.push({name:name,value:String(val)}); }\n    push(f.timing,enVal(a.timing));\n    push(f.worries, Array.isArray(a.worries)?enVal(a.worries).join(\";\"):enVal(a.worries));\n    push(f.budget,a.budget); push(f.location,a.location);\n    push(f.property,enVal(a.property)); push(f.motivation,enVal(a.motivation)); push(f.service,enVal(a.service));\n    push(f.cb_rdv, cbWantsRdv() ? \"Yes\" : \"\");\n    push(f.cb_clienttime, cbClientTimeStr());\n    if(false){\n        var z=cbZoneShort();\n      var cbDays = a.cb_days_indif ? \"Any day\" : (Array.isArray(a.cb_days) && a.cb_days.length ? a.cb_days.join(\";\") : \"\");\n      push(f.cb_days, cbDays);\n      var cbd=cbNearestDateObj();\n      if(a.cb_any){\n        push(f.cb_slot, \"Any time (\"+z+\")\");\n        var cbMsA = cbd ? cbSlotStartMs(cbd, cbAllowedHours()[0]!=null?cbAllowedHours()[0]:9) : null;\n        push(f.cb_date, cbMsA!=null ? String(cbMsA) : \"\");\n      } else if(a.cb_precise && a.cb_hour!=null){\n        push(f.cb_slot, fmt12(a.cb_hour)+\" \"+z+\" (exact time requested)\");\n        var cbMsP = cbd ? cbSlotStartMs(cbd, a.cb_hour) : null;\n        push(f.cb_date, cbMsP!=null ? String(cbMsP) : \"\");\n      } else if(a.cb_slot!=null){\n        push(f.cb_slot, cbSlotLabel(a.cb_slot)+\" \"+z);\n        var cbMs = cbd ? cbSlotStartMs(cbd, a.cb_slot) : null;\n        push(f.cb_date, cbMs!=null ? String(cbMs) : \"\");\n      }\n    }\n    var seL=(location.pathname.match(\/^\\\/(de|nl|it|sv|no)(\\\/|$)\/)||[])[1]||\"en\"; push(f.lang,seL); push(f.hslang,seL); try{ var ci=(typeof itiPhone!==\"undefined\"&&itiPhone&&itiPhone.getSelectedCountryData)?itiPhone.getSelectedCountryData():null; if(ci&&ci.iso2){ var iso=String(ci.iso2).toUpperCase(); var cn=iso; try{ if(window.Intl&&Intl.DisplayNames) cn=new Intl.DisplayNames([\"en\"],{type:\"region\"}).of(iso)||iso; }catch(e2){} push(f.vcountry,cn); } }catch(e){} push(f.firstname,a.firstname); push(f.lastname,a.lastname); push(f.email, a.email?String(a.email).trim().toLowerCase():a.email); push(f.phone,a.phone);\n    return out;\n  }\n  function submit(){\n    var step=STEPS[state.i];\n    if(!validateContact()) return;\n    var hp=document.getElementById(\"ole-hp\"); if(hp && hp.value){ finish(); return; }\n    if(Date.now()-startTime < 3000){ finish(); return; }\n    var btn=document.getElementById(\"ole-next\"), spin=document.getElementById(\"ole-spin\"), label=document.getElementById(\"ole-next-label\");\n    btn.disabled=true; if(spin) spin.style.display=\"inline-block\"; if(label) label.textContent=\"Sender \u2026\";\n    if(!HS.sendToHubSpot){ console.log(\"[SpainEasy] Payload ready:\", buildFields()); setTimeout(finish,800); return; }\n    var ctx={ pageUri:location.href, pageName:document.title };\n    var hutk=getCookie(\"hubspotutk\"); if(hutk) ctx.hutk=hutk;\n    var payload={ fields:buildFields(), context:ctx };\n    if(HS.subscriptionTypeId){ payload.legalConsentOptions={ legitimateInterest:{ value:true, subscriptionTypeId:HS.subscriptionTypeId, legalBasis:\"LEAD\", text:step.consent } }; }\n    (function(){ var hsUrl=\"https:\/\/api.hsforms.com\/submissions\/v3\/integration\/submit\/\"+HS.portalId+\"\/\"+HS.formGuid; function hsPost(p){ return fetch(hsUrl,{ method:\"POST\", headers:{\"Content-Type\":\"application\/json\"}, body:JSON.stringify(p) }).then(function(r){ if(!r.ok) return r.json().then(function(e){throw e;}); return r.json(); }); } var plain={ fields:payload.fields.filter(function(x){return x.name!==HS.fields.lang && x.name!==HS.fields.hslang && x.name!==HS.fields.vcountry;}), context:payload.context, legalConsentOptions:payload.legalConsentOptions }; return hsPost(payload).catch(function(){ return hsPost(plain); }); })()\n      .then(function(){ finish(); })\n      .catch(function(err){ console.error(\"[SpainEasy] HubSpot error:\", err); btn.disabled=false; if(spin) spin.style.display=\"none\"; if( label) label.textContent=\"Pr\u00f8v igjen\"; });\n  }\n  \/* GTM \/ Google Ads conversion \u2014 SpainEasy fires a DISTINCT event so US leads are NEVER\n     mixed with the French \"ole_lead_submit\". Rebuild the same Ads\/Meta\/TikTok\/GA4 tags in\n     the SpainEasy GTM container, triggered on Custom Event = \"spaineasy_lead_submit\". *\/\n  function pushEnhancedConversionEvent(cb){\n    window.dataLayer = window.dataLayer || [];\n    var a=state.answers;\n    var email=(a.email||\"\").trim().toLowerCase();\n    var phone=(a.phone||\"\").replace(\/\\s+\/g,\"\");\n    var first=(a.firstname||\"\").trim();\n    var last=(a.lastname||\"\").trim();\n    window.dataLayer.push({\n      event:\"spaineasy_lead_submit\",\n      brand:\"SpainEasy\",\n      lead_email:email, lead_phone:phone, first_name:first, last_name:last,\n      enhanced_conversion_data:{ email:email, phone_number:phone, first_name:first, last_name:last },\n      lead_form_name:\"spaineasy_property_search\",\n      lead_location:a.location||\"\", lead_budget:a.budget||\"\", lead_currency:\"EUR\",\n      eventCallback:function(){ if(cb) cb(); }, eventTimeout:1500\n    });\n  }\n  function buildRedirectUrl(){\n    var a=state.answers;\n    if(cbWantsRdv()){\n      var ru=RDV_URL, rq=[];\n      if(a.firstname){ rq.push(\"firstname=\"+encodeURIComponent(a.firstname)); rq.push(\"firstName=\"+encodeURIComponent(a.firstname)); }\n      if(a.lastname){ rq.push(\"lastname=\"+encodeURIComponent(a.lastname)); rq.push(\"lastName=\"+encodeURIComponent(a.lastname)); }\n      if(a.email){ rq.push(\"email=\"+encodeURIComponent(String(a.email).trim().toLowerCase())); }\n      if(a.phone){ rq.push(\"phone=\"+encodeURIComponent(a.phone)); }\n      if(rq.length) ru += (ru.indexOf(\"?\")>-1?\"&\":\"?\")+rq.join(\"&\");\n      return ru;\n    }\n    var u=HS.redirectUrl, q=[];\n    if(a.firstname) q.push(\"firstname=\"+encodeURIComponent(a.firstname));\n    if(a.location)  q.push(\"location=\"+encodeURIComponent(a.location));\n    if(q.length) u += (u.indexOf(\"?\")>-1?\"&\":\"?\")+q.join(\"&\");\n    return u;\n  }\n  function finish(){\n    var done=false;\n    var redirect=(cbWantsRdv() || HS.redirectUrl) ? buildRedirectUrl() : null;\n    function go(){\n      if(done) return; done=true; clearState();\n      if(redirect){ window.location.href=redirect; return; }\n      barEl.style.width=\"100%\"; footEl.innerHTML=\"\";\n        bodyEl.innerHTML='<div class=\"ole-success\"><div class=\"ole-check\"><svg viewBox=\"0 0 40 40\"><path d=\"M11 21 L17 27 L29 13\"\/><\/svg><\/div><h3>Alt klart, takk!<\/h3><p>Teamet v\u00e5rt ser p\u00e5 prosjektet ditt og tar kontakt veldig snart.<\/p><\/div>';\n    }\n    pushEnhancedConversionEvent(go);\n    setTimeout(go, 1800);\n  }\n\n  \/* =========================================================\n     11) GOOGLE PLACES (optional)\n     ========================================================= *\/\n  function loadGoogleMaps(key, cb){\n    if(window.google && google.maps && google.maps.places){ cb&&cb(); return; }\n    if(document.getElementById(\"ole-gmaps\")){ pollMaps(cb); return; }\n    var s=document.createElement(\"script\"); s.id=\"ole-gmaps\"; s.async=true;\n    s.src=\"https:\/\/maps.googleapis.com\/maps\/api\/js?key=\"+encodeURIComponent(key)+\"&libraries=places&loading=async\";\n    s.onload=function(){ pollMaps(cb); }; s.onerror=function(){ console.warn(\"[SpainEasy] Google Maps failed.\"); };\n    document.head.appendChild(s);\n  }\n  function pollMaps(cb){ var n=0,iv=setInterval(function(){ if(window.google&&google.maps&&google.maps.places){clearInterval(iv);cb&&cb();} else if(++n>40){clearInterval(iv);} },150); }\n  function initLocationAutocomplete(input, pills, step){\n    if(!input || input.dataset.acDone) return; input.dataset.acDone=\"1\";\n    try{\n      var ac=new google.maps.places.Autocomplete(input,{ componentRestrictions:{country:\"es\"}, types:[\"(cities)\"], fields:[\"address_components\",\"name\"] });\n      ac.addListener(\"place_changed\", function(){ var place=ac.getPlace(); if(!place||!place.address_components){ state.answers.location=input.value; return; } var city=place.name, region=\"\"; place.address_components.forEach(function(c){ if(c.types.indexOf(\"administrative_area_level_1\")>-1) region=c.long_name; }); var val=region?(city+\" (\"+region+\")\"):city; setTimeout(function(){ input.value=val; state.answers.location=val; },10); if(pills) pills.forEach(function(p){ p.classList.remove(\"sel\",\"hidden\"); }); setReaction(step, val); lockAdvance(); });\n    }catch(e){ console.warn(\"[SpainEasy] Google Places not initialized:\", e); }\n  }\n\n  \/* =========================================================\n     12) LUCIDE ICONS\n     ========================================================= *\/\n  function loadLucide(){ if(window.lucide){ refreshIcons(); return; } if(document.getElementById(\"ole-lucide\")) return; var s=document.createElement(\"script\"); s.id=\"ole-lucide\"; s.async=true; s.src=\"https:\/\/unpkg.com\/lucide@latest\/dist\/umd\/lucide.min.js\"; s.onload=refreshIcons; s.onerror=function(){ console.warn(\"[SpainEasy] Lucide failed.\"); }; document.head.appendChild(s); }\n\n  \/* =========================================================\n     12b) INTERNATIONAL PHONE (US default)\n     ========================================================= *\/\n  var itiPhone=null, lastPhoneIso=null, phoneBlurred=false;\n  function maybeBlurPhone(input){ try{ if(itiPhone && itiPhone.isValidNumber && itiPhone.isValidNumber()){ if(!phoneBlurred){ phoneBlurred=true; setTimeout(function(){ try{ input.blur(); }catch(e){} try{ var btn=document.getElementById(\"ole-next\"); if(btn){ var r=btn.getBoundingClientRect(); var vh=window.innerHeight||document.documentElement.clientHeight; var delta=r.bottom-vh+26; if(delta>4){ var reduce=window.matchMedia&&window.matchMedia(\"(prefers-reduced-motion:reduce)\").matches; window.scrollBy({top:delta,left:0,behavior:reduce?\"auto\":\"smooth\"}); } } }catch(e){} }, 160); } } else { phoneBlurred=false; } }catch(e){} }\n  var COUNTRY_MSG = {\n      no:{emoji:\"\\uD83C\\uDDF3\\uD83C\\uDDF4\",msg:\"Kj\u00f8per du fra Norge? Vi er dine \u00f8yne og \u00f8rer p\u00e5 stedet i Spania.\"},\n    us:{emoji:\"\\uD83C\\uDDFA\\uD83C\\uDDF8\",msg:\"Vi veileder deg p\u00e5 engelsk, i hvert steg p\u00e5 veien.\"},\n    ca:{emoji:\"\\uD83C\\uDDE8\\uD83C\\uDDE6\",msg:\"Kj\u00f8per du fra Canada? Vi er dine \u00f8yne og \u00f8rer p\u00e5 stedet i Spania.\"},\n    gb:{emoji:\"\\uD83C\\uDDEC\\uD83C\\uDDE7\",msg:\"Mange britiske kj\u00f8pere stoler p\u00e5 oss for et smidig kj\u00f8p i Spania, p\u00e5 engelsk.\"},\n    es:{emoji:\"\\uD83C\\uDDEA\\uD83C\\uDDF8\",msg:\"Allerede i Spania? Vi gj\u00f8r hvert steg enklere, p\u00e5 engelsk, rett ved din side.\"}\n  };\n  function showPhoneReaction(){ if(!itiPhone||!itiPhone.getSelectedCountryData) return; var input=document.getElementById(\"ole-phone\"); var el=document.getElementById(\"ole-phone-msg\"); var hasDigits=input&&input.value.replace(\/\\D\/g,\"\").length>0; if(!hasDigits){ if(el){ el.className=\"ole-phone-msg\"; el.innerHTML=\"\"; } lastPhoneIso=null; return; } var iso=(itiPhone.getSelectedCountryData()||{}).iso2; if(iso===lastPhoneIso) return; lastPhoneIso=iso; renderPhoneMsg(COUNTRY_MSG[iso]||null); }\n  function renderPhoneMsg(r){ var el=document.getElementById(\"ole-phone-msg\"); if(!el) return; if(!r){ el.className=\"ole-phone-msg\"; el.innerHTML=\"\"; return; } el.innerHTML='<span class=\"ole-q-mark\">'+String.fromCharCode(8220)+'<\/span><span class=\"ole-phone-cap\">'+esc(r.msg)+'<\/span>'+(r.emoji?'<span class=\"ole-emoji\">'+r.emoji+'<\/span>':''); el.className=\"ole-phone-msg show\"; void el.offsetWidth; el.classList.add(\"bumpp\"); setTimeout(function(){ el.classList.remove(\"bumpp\"); },430); }\n  function loadIntlTel(cb){ if(window.intlTelInput){ cb&&cb(); return; } if(document.getElementById(\"ole-iti-js\")){ var n=0,iv=setInterval(function(){ if(window.intlTelInput){clearInterval(iv);cb&&cb();} else if(++n>60){clearInterval(iv);} },150); return; } var css=document.createElement(\"link\"); css.rel=\"stylesheet\"; css.href=\"https:\/\/cdn.jsdelivr.net\/npm\/intl-tel-input@18.2.1\/build\/css\/intlTelInput.css\"; document.head.appendChild(css); var s=document.createElement(\"script\"); s.id=\"ole-iti-js\"; s.async=true; s.src=\"https:\/\/cdn.jsdelivr.net\/npm\/intl-tel-input@18.2.1\/build\/js\/intlTelInput.min.js\"; s.onload=function(){ cb&&cb(); }; s.onerror=function(){ console.warn(\"[SpainEasy] intl-tel-input not loaded (simple field fallback).\"); }; document.head.appendChild(s); }\n  var PHONE_TPL_CACHE={};\n  function phoneTemplate(iso){ if(!iso) return null; if(PHONE_TPL_CACHE[iso]!==undefined) return PHONE_TPL_CACHE[iso]; var tpl=null; try{ var U=window.intlTelInputUtils; if(U){ var ex=U.getExampleNumber(iso,false,U.numberType.MOBILE); var nat=ex?U.formatNumber(ex,iso,U.numberFormat.NATIONAL):\"\"; if(nat&&\/\\d\/.test(nat)) tpl=nat.replace(\/\\d\/g,\"D\"); } }catch(e){} PHONE_TPL_CACHE[iso]=tpl; return tpl; }\n  function applyPhoneTemplate(digits, tpl){ if(!tpl) return digits; var out=\"\",di=0; for(var i=0;i<tpl.length&&di<digits.length;i++){ out += (tpl.charAt(i)===\"D\")?digits.charAt(di++):tpl.charAt(i); } if(di<digits.length) out += digits.slice(di); return out; }\n  function formatPhoneLive(el){ if(!el||!itiPhone||!itiPhone.getSelectedCountryData) return; var iso=(itiPhone.getSelectedCountryData()||{}).iso2; var tpl=phoneTemplate(iso); if(!tpl) return; var raw=el.value, caret=(el.selectionStart==null)?raw.length:el.selectionStart; var before=raw.slice(0,caret).replace(\/\\D\/g,\"\").length; var digits=raw.replace(\/\\D\/g,\"\"); var exact=null; try{ if(itiPhone.isValidNumber&&itiPhone.isValidNumber()){ exact=window.intlTelInputUtils.formatNumber(itiPhone.getNumber(),iso,window.intlTelInputUtils.numberFormat.NATIONAL); } }catch(e){} var f=exact||applyPhoneTemplate(digits,tpl); if(f===raw) return; el.value=f; var pos=0,seen=0; while(pos<f.length&&seen<before){ var c=f.charCodeAt(pos); if(c>=48&&c<=57) seen++; pos++; } try{ el.setSelectionRange(pos,pos); }catch(e){} }\n  \/\/ Adapt the phone country to the visitor: browser locale -> timezone -> IP (with fallback).\n  var TZ_COUNTRY = { \"America\/New_York\":\"us\",\"America\/Detroit\":\"us\",\"America\/Chicago\":\"us\",\"America\/Denver\":\"us\",\"America\/Phoenix\":\"us\",\"America\/Los_Angeles\":\"us\",\"America\/Anchorage\":\"us\",\"Pacific\/Honolulu\":\"us\",\"America\/Toronto\":\"ca\",\"America\/Vancouver\":\"ca\",\"America\/Edmonton\":\"ca\",\"America\/Mexico_City\":\"mx\",\"America\/Sao_Paulo\":\"br\",\"America\/Argentina\/Buenos_Aires\":\"ar\",\"Europe\/London\":\"gb\",\"Europe\/Dublin\":\"ie\",\"Europe\/Paris\":\"fr\",\"Europe\/Madrid\":\"es\",\"Europe\/Berlin\":\"de\",  \"Europe\/Oslo\":\"no\",\"Europe\/Stockholm\":\"se\",\"Europe\/Copenhagen\":\"dk\",\"Europe\/Helsinki\":\"fi\",\"Europe\/Lisbon\":\"pt\",\"Europe\/Athens\":\"gr\",\"Europe\/Istanbul\":\"tr\",\"Asia\/Dubai\":\"ae\",\"Asia\/Kolkata\":\"in\",\"Asia\/Singapore\":\"sg\",\"Asia\/Hong_Kong\":\"hk\",\"Asia\/Tokyo\":\"jp\",\"Australia\/Sydney\":\"au\",\"Australia\/Perth\":\"au\",\"Pacific\/Auckland\":\"nz\",\"Africa\/Johannesburg\":\"za\",\"Africa\/Casablanca\":\"ma\",\"Asia\/Jerusalem\":\"il\" };\n  function guessCountryBrowser(){\n    try{ var langs=navigator.languages||[navigator.language||\"\"]; for(var i=0;i<langs.length;i++){ var m=String(langs[i]||\"\").match(\/-([A-Za-z]{2})$\/); if(m) return m[1].toLowerCase(); } }catch(e){}\n    try{ var tz=Intl.DateTimeFormat().resolvedOptions().timeZone||\"\"; if(TZ_COUNTRY[tz]) return TZ_COUNTRY[tz]; }catch(e){}\n    return \"no\";\n  }\n  function geoLookup(cb){\n    var done=false; function fin(c){ if(done) return; done=true; cb((c||\"no\").toLowerCase()); }\n    var t=setTimeout(function(){ fin(guessCountryBrowser()); }, 1300);\n    try{ fetch(\"https:\/\/ipapi.co\/json\/\").then(function(r){ return r.json(); }).then(function(d){ clearTimeout(t); fin((d&&d.country_code?String(d.country_code):\"\")||guessCountryBrowser()); }).catch(function(){ clearTimeout(t); fin(guessCountryBrowser()); }); }\n    catch(e){ clearTimeout(t); fin(guessCountryBrowser()); }\n  }\n  function initPhone(wrap){ var input=(wrap||document).querySelector(\"#ole-phone\"); if(!input||input.dataset.itiDone) return; loadIntlTel(function(){ if(!window.intlTelInput||input.dataset.itiDone) return; input.dataset.itiDone=\"1\"; try{ itiPhone=window.intlTelInput(input,{ initialCountry:\"auto\", geoIpLookup:geoLookup,  preferredCountries:[\"no\",\"se\",\"dk\",\"es\",\"gb\"], separateDialCode:true, autoPlaceholder:\"aggressive\", dropdownContainer:document.body, utilsScript:\"https:\/\/cdn.jsdelivr.net\/npm\/intl-tel-input@18.2.1\/build\/js\/utils.js\" }); lastPhoneIso=null; phoneBlurred=false; input.addEventListener(\"input\",function(){ setErr(\"phone\",\"\"); formatPhoneLive(input); showPhoneReaction(); maybeBlurPhone(input); }); input.addEventListener(\"countrychange\",function(){ setErr(\"phone\",\"\"); formatPhoneLive(input); showPhoneReaction(); }); }catch(e){ console.warn(\"[SpainEasy] international phone not initialized:\", e); itiPhone=null; } }); }\n\n  \/* =========================================================\n     13) BOOT\n     ========================================================= *\/\n  loadLucide(); loadIntlTel();\n  if(HS.googleMapsKey) loadGoogleMaps(HS.googleMapsKey, function(){ gMapsReady=true; });\n  loadState();\n  function oleSlug(s){ return String(s||\"\").toLowerCase().normalize(\"NFD\").replace(\/[\\u0300-\\u036f]\/g,\"\").replace(\/[^a-z0-9]+\/g,\"-\").replace(\/^-+|-+$\/g,\"\"); }\n  var LIEU_ALIAS={ \"valence\":\"Valencia\",\"barcelone\":\"Barcelona\", \"seville\":\"Sevilla\",\"sevilla\":\"Sevilla\",\"costa-del-sol\":\"Costa del Sol\",\"costa-blanca\":\"Costa Blanca\",\"costa-brava\":\"Costa Brava\",\"andalusia\":\"Andaluc\u00eda\",\"andalousie\":\"Andaluc\u00eda\",\"mallorca\":\"Palma de Mallorca\",\"majorca\":\"Palma de Mallorca\" };\n  (function prefillFromUrl(){ var p; try{ p=new URLSearchParams(window.location.search); }catch(e){ return; } var lieu=p.get(\"location\")||p.get(\"lieu\"); if(!lieu) return; var slug=oleSlug(lieu), loc=STEPS[stepIndexById(\"location\")], label=null; if(LIEU_ALIAS[slug]) label=LIEU_ALIAS[slug]; if(!label && loc){ var all=(loc.cities||[]).concat(loc.regions||[]); for(var i=0;i<all.length;i++){ if(oleSlug(all[i])===slug){ label=all[i]; break; } } } if(!label){ label=slug.split(\"-\").map(function(w){ return w?w.charAt(0).toUpperCase()+w.slice(1):w; }).join(\" \"); } state.answers.location=label; })();\n  render(\"in-right\");\n})();\n<\/script><\/div><\/div><\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Boligs\u00f8k i Spania<\/p>\n","protected":false},"author":1,"featured_media":46949,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"100-width.php","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-45470","page","type-page","status-publish","has-post-thumbnail","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Kj\u00f8pe bolig i Spania: start boligs\u00f8ket ditt | SpainEasy<\/title>\n<meta name=\"description\" content=\"Skal du kj\u00f8pe bolig i Spania? Svar p\u00e5 noen korte sp\u00f8rsm\u00e5l, s\u00e5 finner kj\u00f8peragentene v\u00e5re boligen som passer deg og forhandler prisen. Uforpliktende.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/spaineasy.com\/no\/boligsok\/\" \/>\n<meta property=\"og:locale\" content=\"nb_NO\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kj\u00f8pe bolig i Spania: start boligs\u00f8ket ditt | SpainEasy\" \/>\n<meta property=\"og:description\" content=\"Skal du kj\u00f8pe bolig i Spania? Svar p\u00e5 noen korte sp\u00f8rsm\u00e5l, s\u00e5 finner kj\u00f8peragentene v\u00e5re boligen som passer deg og forhandler prisen. Uforpliktende.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/spaineasy.com\/no\/boligsok\/\" \/>\n<meta property=\"og:site_name\" content=\"SpainEasy\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/SpainEasyEstate\" \/>\n<meta property=\"article:modified_time\" content=\"2026-11-03T14:35:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/spaineasy.com\/wp-content\/uploads\/2023\/08\/Maison-en-Espagne-avec-piscine-a-linterieur.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Ansl. lesetid\" \/>\n\t<meta name=\"twitter:data1\" content=\"21 minutter\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/spaineasy.com\\\/no\\\/boligsok\\\/\",\"url\":\"https:\\\/\\\/spaineasy.com\\\/no\\\/boligsok\\\/\",\"name\":\"Kj\u00f8pe bolig i Spania: start boligs\u00f8ket ditt | SpainEasy\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/spaineasy.com\\\/no\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/spaineasy.com\\\/no\\\/boligsok\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/spaineasy.com\\\/no\\\/boligsok\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/spaineasy.com\\\/wp-content\\\/uploads\\\/2023\\\/08\\\/Maison-en-Espagne-avec-piscine-a-linterieur.jpg\",\"datePublished\":\"2022-06-16T15:14:22+00:00\",\"dateModified\":\"2026-11-03T14:35:54+00:00\",\"description\":\"Skal du kj\u00f8pe bolig i Spania? Svar p\u00e5 noen korte sp\u00f8rsm\u00e5l, s\u00e5 finner kj\u00f8peragentene v\u00e5re boligen som passer deg og forhandler prisen. Uforpliktende.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/spaineasy.com\\\/no\\\/boligsok\\\/#breadcrumb\"},\"inLanguage\":\"nb-NO\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/spaineasy.com\\\/no\\\/boligsok\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"nb-NO\",\"@id\":\"https:\\\/\\\/spaineasy.com\\\/no\\\/boligsok\\\/#primaryimage\",\"url\":\"https:\\\/\\\/spaineasy.com\\\/wp-content\\\/uploads\\\/2023\\\/08\\\/Maison-en-Espagne-avec-piscine-a-linterieur.jpg\",\"contentUrl\":\"https:\\\/\\\/spaineasy.com\\\/wp-content\\\/uploads\\\/2023\\\/08\\\/Maison-en-Espagne-avec-piscine-a-linterieur.jpg\",\"width\":1200,\"height\":630,\"caption\":\"Maison luxueuse en Espagne avec piscine \u00e0 l'int\u00e9rieur\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/spaineasy.com\\\/no\\\/boligsok\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/spaineasy.com\\\/no\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Boligs\u00f8k\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/spaineasy.com\\\/no\\\/#website\",\"url\":\"https:\\\/\\\/spaineasy.com\\\/no\\\/\",\"name\":\"SpainEasy\",\"description\":\"Din uavhengige kj\u00f8psagent for bolig i Spania.\",\"publisher\":{\"@id\":\"https:\\\/\\\/spaineasy.com\\\/no\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/spaineasy.com\\\/no\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nb-NO\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/spaineasy.com\\\/no\\\/#organization\",\"name\":\"SpainEasy\",\"url\":\"https:\\\/\\\/spaineasy.com\\\/no\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nb-NO\",\"@id\":\"https:\\\/\\\/spaineasy.com\\\/no\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/spaineasy.com\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/spaineasy192.png\",\"contentUrl\":\"https:\\\/\\\/spaineasy.com\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/spaineasy192.png\",\"width\":192,\"height\":192,\"caption\":\"SpainEasy\"},\"image\":{\"@id\":\"https:\\\/\\\/spaineasy.com\\\/no\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/SpainEasyEstate\",\"https:\\\/\\\/www.youtube.com\\\/watch?v=mq5f8eHO6l8\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Kj\u00f8pe bolig i Spania: start boligs\u00f8ket ditt | SpainEasy","description":"Skal du kj\u00f8pe bolig i Spania? Svar p\u00e5 noen korte sp\u00f8rsm\u00e5l, s\u00e5 finner kj\u00f8peragentene v\u00e5re boligen som passer deg og forhandler prisen. Uforpliktende.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/spaineasy.com\/no\/boligsok\/","og_locale":"nb_NO","og_type":"article","og_title":"Kj\u00f8pe bolig i Spania: start boligs\u00f8ket ditt | SpainEasy","og_description":"Skal du kj\u00f8pe bolig i Spania? Svar p\u00e5 noen korte sp\u00f8rsm\u00e5l, s\u00e5 finner kj\u00f8peragentene v\u00e5re boligen som passer deg og forhandler prisen. Uforpliktende.","og_url":"https:\/\/spaineasy.com\/no\/boligsok\/","og_site_name":"SpainEasy","article_publisher":"https:\/\/www.facebook.com\/SpainEasyEstate","article_modified_time":"2026-11-03T14:35:54+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/spaineasy.com\/wp-content\/uploads\/2023\/08\/Maison-en-Espagne-avec-piscine-a-linterieur.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Ansl. lesetid":"21 minutter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/spaineasy.com\/no\/boligsok\/","url":"https:\/\/spaineasy.com\/no\/boligsok\/","name":"Kj\u00f8pe bolig i Spania: start boligs\u00f8ket ditt | SpainEasy","isPartOf":{"@id":"https:\/\/spaineasy.com\/no\/#website"},"primaryImageOfPage":{"@id":"https:\/\/spaineasy.com\/no\/boligsok\/#primaryimage"},"image":{"@id":"https:\/\/spaineasy.com\/no\/boligsok\/#primaryimage"},"thumbnailUrl":"https:\/\/spaineasy.com\/wp-content\/uploads\/2023\/08\/Maison-en-Espagne-avec-piscine-a-linterieur.jpg","datePublished":"2022-06-16T15:14:22+00:00","dateModified":"2026-11-03T14:35:54+00:00","description":"Skal du kj\u00f8pe bolig i Spania? Svar p\u00e5 noen korte sp\u00f8rsm\u00e5l, s\u00e5 finner kj\u00f8peragentene v\u00e5re boligen som passer deg og forhandler prisen. Uforpliktende.","breadcrumb":{"@id":"https:\/\/spaineasy.com\/no\/boligsok\/#breadcrumb"},"inLanguage":"nb-NO","potentialAction":[{"@type":"ReadAction","target":["https:\/\/spaineasy.com\/no\/boligsok\/"]}]},{"@type":"ImageObject","inLanguage":"nb-NO","@id":"https:\/\/spaineasy.com\/no\/boligsok\/#primaryimage","url":"https:\/\/spaineasy.com\/wp-content\/uploads\/2023\/08\/Maison-en-Espagne-avec-piscine-a-linterieur.jpg","contentUrl":"https:\/\/spaineasy.com\/wp-content\/uploads\/2023\/08\/Maison-en-Espagne-avec-piscine-a-linterieur.jpg","width":1200,"height":630,"caption":"Maison luxueuse en Espagne avec piscine \u00e0 l'int\u00e9rieur"},{"@type":"BreadcrumbList","@id":"https:\/\/spaineasy.com\/no\/boligsok\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/spaineasy.com\/no\/"},{"@type":"ListItem","position":2,"name":"Boligs\u00f8k"}]},{"@type":"WebSite","@id":"https:\/\/spaineasy.com\/no\/#website","url":"https:\/\/spaineasy.com\/no\/","name":"SpainEasy","description":"Din uavhengige kj\u00f8psagent for bolig i Spania.","publisher":{"@id":"https:\/\/spaineasy.com\/no\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/spaineasy.com\/no\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nb-NO"},{"@type":"Organization","@id":"https:\/\/spaineasy.com\/no\/#organization","name":"SpainEasy","url":"https:\/\/spaineasy.com\/no\/","logo":{"@type":"ImageObject","inLanguage":"nb-NO","@id":"https:\/\/spaineasy.com\/no\/#\/schema\/logo\/image\/","url":"https:\/\/spaineasy.com\/wp-content\/uploads\/2024\/03\/spaineasy192.png","contentUrl":"https:\/\/spaineasy.com\/wp-content\/uploads\/2024\/03\/spaineasy192.png","width":192,"height":192,"caption":"SpainEasy"},"image":{"@id":"https:\/\/spaineasy.com\/no\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/SpainEasyEstate","https:\/\/www.youtube.com\/watch?v=mq5f8eHO6l8"]}]}},"_links":{"self":[{"href":"https:\/\/spaineasy.com\/no\/wp-json\/wp\/v2\/pages\/45470","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spaineasy.com\/no\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/spaineasy.com\/no\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/spaineasy.com\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spaineasy.com\/no\/wp-json\/wp\/v2\/comments?post=45470"}],"version-history":[{"count":23,"href":"https:\/\/spaineasy.com\/no\/wp-json\/wp\/v2\/pages\/45470\/revisions"}],"predecessor-version":[{"id":51309,"href":"https:\/\/spaineasy.com\/no\/wp-json\/wp\/v2\/pages\/45470\/revisions\/51309"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/spaineasy.com\/no\/wp-json\/wp\/v2\/media\/46949"}],"wp:attachment":[{"href":"https:\/\/spaineasy.com\/no\/wp-json\/wp\/v2\/media?parent=45470"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}