{"id":45390,"date":"2022-06-16T15:14:22","date_gmt":"2022-06-16T15:14:22","guid":{"rendered":"https:\/\/spaineasy.com\/property-search\/"},"modified":"2026-11-03T14:38:45","modified_gmt":"2026-11-03T14:38:45","slug":"bostadssokande","status":"publish","type":"page","link":"https:\/\/spaineasy.com\/sv\/bostadssokande\/","title":{"rendered":"Bostadss\u00f6kande"},"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\">Bostadss\u00f6kning i Spanien<\/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\/sv\/tack\/\", \/\/ 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\/sv\/\";\n  var RDV_URL = \"https:\/\/spaineasy.com\/sv\/boka-ett-samtal\/\"; \/\/ booking page, used if \"I'd rather book a call\"\n   var PRIVACY_URL = \"https:\/\/spaineasy.com\/sv\/anvandarvillkor-och-integritetspolicy\/\";\n  var SCROLL_TOTOP = true;\n  var SCROLL_OFFSET = 24;\n\n  \/* =========================================================\n     2) STEPS  (Swedish)\n     ========================================================= *\/\n  var STEPS = [\n    { id:\"timing\", type:\"single\", required:true, ebIco:\"award\", heroIco:\"calendar-clock\",\n      heroCap:\"Varje projekt har sitt eget tempo. Vi f\u00f6ljer ditt.\",\n       eyebrow:\"Expertis p\u00e5 k\u00f6parens sida\",\n        q:\"N\u00e4r vill du b\u00f6rja ditt s\u00f6kande?\",\n       options:[\n        {label:\"S\u00e5 snart som m\u00f6jligt\", ic:\"zap\"},\n        {label:\"Inom de n\u00e4rmaste 6 m\u00e5naderna\", ic:\"calendar-days\"},\n        {label:\"Inom 12 m\u00e5nader\", ic:\"sprout\"},\n           {label:\"Det beror p\u00e5 n\u00e5got som p\u00e5g\u00e5r (f\u00f6rs\u00e4ljning av bostad, sparande\u2026)\", ic:\"git-branch\"},\n         {label:\"Jag tittar bara runt just nu\", ic:\"lightbulb\"}\n      ],\n      react:{\n        \"S\u00e5 snart som m\u00f6jligt\":{emoji:\"\\u2600\\uFE0F\",msg:\"Ol\u00e9! Vi kan s\u00e4tta ig\u00e5ng direkt.\"},\n         \"Inom de n\u00e4rmaste 6 m\u00e5naderna\":{emoji:\"\\uD83D\\uDDD3\\uFE0F\",msg:\"Perfekt tid att f\u00f6rbereda sig i lugn och ro.\"},\n             \"Inom 12 m\u00e5nader\":{emoji:\"\\uD83C\\uDF31\",msg:\"Gott om tid att hitta precis r\u00e4tt bostad.\"},\n            \"Det beror p\u00e5 n\u00e5got som p\u00e5g\u00e5r (f\u00f6rs\u00e4ljning av bostad, sparande\u2026)\":{emoji:\"\\uD83E\\uDD1D\",msg:\"Vi f\u00f6ljer ditt tempo, utan press.\"},\n         \"Jag tittar bara runt just nu\":{emoji:\"\\uD83D\\uDCA1\",msg:\"Utforska i lugn och ro, vi finns h\u00e4r n\u00e4r du \u00e4r redo.\"}\n      }},\n\n    { id:\"worries\", type:\"multi\", required:true, ebIco:\"shield-check\", heroIco:\"shield-check\",\n      heroCap:\"Det du oroar dig f\u00f6r \u00e4r precis det vi tar hand om.\",\n       eyebrow:\"Ett k\u00f6pombud som bara arbetar f\u00f6r dig\",\n        q:\"Vad oroar dig mest?\", sub:\"V\u00e4lj allt som st\u00e4mmer\",\n       options:[\n        {label:\"Juridiken och pappersarbetet (NIE, notarie)\", ic:\"file-text\"},\n            {label:\"Spr\u00e5kbarri\u00e4ren (spanska)\", ic:\"languages\"},\n         {label:\"Om bostaden \u00e4r i gott skick\", ic:\"search-check\"},\n         {label:\"Avst\u00e5ndet (att flyga fram och tillbaka hemifr\u00e5n)\", ic:\"plane\"},\n         {label:\"Den spanska k\u00f6pprocessen (mindre kontroll \u00e4n hemma)\", ic:\"scale\"},\n          {label:\"\u00d6verf\u00f6ringar, valuta och skatter\", ic:\"banknote\"},\n          {label:\"Inte tillr\u00e4ckligt med tid\", ic:\"clock\"}\n       ],\n      optMsg:{\n        \"Juridiken och pappersarbetet (NIE, notarie)\":{emoji:\"\\uD83D\\uDDC2\\uFE0F\",msg:\"Pappersarbetet med NIE, notarie och bank sk\u00f6ter vi fr\u00e5n b\u00f6rjan till slut, s\u00e5 att du slipper.\"},\n                \"Spr\u00e5kbarri\u00e4ren (spanska)\":{emoji:\"\\uD83D\\uDDE3\\uFE0F\",msg:\"Spr\u00e5kbarri\u00e4r? Vi \u00f6vers\u00e4tter och f\u00f6rhandlar p\u00e5 spanska \u00e5t dig och f\u00f6rklarar allt p\u00e5 enkel engelska.\"},\n           \"Om bostaden \u00e4r i gott skick\":{emoji:\"\\uD83D\\uDD0D\",msg:\"Vi granskar och kontrollerar allt p\u00e5 plats innan du binder dig.\"},\n         \"Avst\u00e5ndet (att flyga fram och tillbaka hemifr\u00e5n)\":{emoji:\"\\u2708\\uFE0F\",msg:\"Vi \u00e4r dina \u00f6gon och \u00f6ron i Spanien, s\u00e5 du sparar m\u00e5nga resor.\"},\n           \"Den spanska k\u00f6pprocessen (mindre kontroll \u00e4n hemma)\":{emoji:\"\\u2696\\uFE0F\",msg:\"Vi g\u00f6r v\u00e5r egen juridiska granskning ut\u00f6ver notariens, inget slinker igenom.\"},\n          \"\u00d6verf\u00f6ringar, valuta och skatter\":{emoji:\"\\uD83D\\uDCB1\",msg:\"Vi s\u00e4tter dig i kontakt med valuta- och skatteexperter som kan internationella \u00f6verf\u00f6ringar till Spanien.\"},\n           \"Inte tillr\u00e4ckligt med tid\":{emoji:\"\\u23F3\",msg:\"Vi g\u00f6r grovjobbet, du har sista ordet.\"}\n       },\n      multiMsg:{\n        \"2\":{emoji:\"\\uD83D\\uDEE1\\uFE0F\",msg:\"Tv\u00e5 verkliga farh\u00e5gor, och det \u00e4r precis dem vi s\u00e4krar \u00e5t dig fr\u00e5n b\u00f6rjan till slut.\"},\n          \"3\":{emoji:\"\\uD83D\\uDEE1\\uFE0F\",msg:\"Tre befogade farh\u00e5gor. Goda nyheter: att t\u00e4cka dem alla \u00e4r v\u00e5r k\u00e4rnuppgift.\"},\n        \"4\":{emoji:\"\\uD83D\\uDCAA\",msg:\"M\u00e5nga fr\u00e5gor \u00e4r normalt n\u00e4r man k\u00f6per utomlands. Det \u00e4r precis d\u00e4rf\u00f6r SpainEasy finns.\"},\n         \"5\":{emoji:\"\\uD83D\\uDCAA\",msg:\"Du ser n\u00e4stan alla fallgropar, och du har r\u00e4tt. Vi oskadligg\u00f6r dem en efter en.\"},\n        \"6\":{emoji:\"\\uD83E\\uDD1D\",msg:\"Du ser helheten. Vi tar hand om var och en av dem \u00e5t dig.\"},\n         \"7\":{emoji:\"\\uD83E\\uDD1D\",msg:\"Du ser helheten. Vi tar hand om var och en av dem \u00e5t dig.\"}\n       },\n      reactAny:{emoji:\"\\uD83D\\uDEE1\\uFE0F\",msg:\"Allt detta \u00e4r v\u00e5rt jobb att hantera, vi tar hand om alltihop.\"}},\n \n    { id:\"location\", type:\"location\", required:true, ebIco:\"map\", heroIco:\"map-pin\",\n      heroCap:\"Hela Spanien, fr\u00e5n kust till kust: vi letar \u00f6verallt \u00e5t dig.\",\n        eyebrow:\"Vi t\u00e4cker hela Spanien\",\n       q:\"Var i Spanien letar du?\", placeholder:\"t.ex. 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\",\"Andalusien\",\"Balearerna\",\"Kanarie\u00f6arna\",\"Katalonien\"]},\n  \n    { id:\"budget\", type:\"budget\", required:true, ebIco:\"handshake\", heroIco:\"wallet\",\n      heroCap:\"Vi f\u00f6rhandlar alltid i ditt intresse, ofta f\u00f6r l\u00e5ngt mer \u00e4n v\u00e5rt arvode.\",\n       eyebrow:\"Vi f\u00f6rhandlar alltid i ditt intresse\",\n        q:\"Vilken \u00e4r din budget?\", placeholder:\"t.ex. 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 blir det tr\u00e4ngre, men vi hittar \u00e4nd\u00e5 p\u00e4rlor i r\u00e4tt regioner.\"},\n          {max:299999,  emoji:\"\\uD83D\\uDD0D\",msg:\"Det finns verkliga m\u00f6jligheter att uppt\u00e4cka i den h\u00e4r prisklassen.\"},\n          {max:499999,  emoji:\"\\u2600\\uFE0F\",msg:\"En perfekt niv\u00e5 f\u00f6r en plats i den spanska solen.\"},\n          {max:999999,  emoji:\"\\uD83C\\uDFE1\",msg:\"Tillr\u00e4ckligt f\u00f6r att sikta p\u00e5 n\u00e5got riktigt speciellt.\"},\n        {max:999999999,emoji:\"\\u2728\",msg:\"Ol\u00e9! Spaniens exklusiva segment st\u00e5r \u00f6ppet f\u00f6r dig.\"}\n      ]},\n\n    { id:\"property\", type:\"single\", required:true, ebIco:\"key-round\", heroIco:\"home\",\n      heroCap:\"Vi letar efter bostaden som passar dig, inte en som vi r\u00e5kar ha till salu.\",\n        eyebrow:\"Annorlunda \u00e4n en m\u00e4klare som s\u00e4ljer sina egna objekt\",\n      q:\"Vilken typ av bostad letar du efter?\",\n      options:[\n        {label:\"L\u00e4genhet\", ic:\"building-2\"},\n          {label:\"Hus\", ic:\"home\"},\n          {label:\"Hus med tr\u00e4dg\u00e5rd eller pool\", ic:\"trees\"},\n        {label:\"Lyxbostad\", ic:\"gem\"},\n        {label:\"Annat\", ic:\"search\"}\n      ],\n      react:{\n        \"L\u00e4genhet\":{emoji:\"\\uD83C\\uDF07\",msg:\"Enkelt, ljust och l\u00e4ttsk\u00f6tt, en spansk klassiker.\"},\n           \"Hus\":{emoji:\"\\uD83C\\uDFE0\",msg:\"Utrymme och solsken helt f\u00f6r dig sj\u00e4lv.\"},\n          \"Hus med tr\u00e4dg\u00e5rd eller pool\":{emoji:\"\\uD83C\\uDF3F\",msg:\"Terrass, tr\u00e4dg\u00e5rd, pool: dr\u00f6mmen.\"},\n           \"Lyxbostad\":{emoji:\"\\u2728\",msg:\"Det exklusiva segmentet, vi vet exakt var vi ska leta.\"},\n          \"Annat\":{emoji:\"\\uD83D\\uDD0E\",msg:\"Ber\u00e4tta allt, s\u00e5 hittar vi det som passar.\"}\n       }},\n\n    { id:\"motivation\", type:\"single\", required:true, ebIco:\"compass\", heroIco:\"compass\",\n      heroCap:\"Permanent bostad, semesterbostad eller pension: ditt m\u00e5l styr v\u00e5rt s\u00f6kande.\",\n        eyebrow:\"St\u00f6d i hela Spanien\",\n        q:\"Vad \u00e4r din fr\u00e4msta anledning att k\u00f6pa i Spanien?\",\n        options:[\n        {label:\"Flytt \/ permanent bostad\", ic:\"sun\"},\n            {label:\"Semesterbostad \/ fritidshus\", ic:\"umbrella\"},\n         {label:\"Pension\", ic:\"palmtree\"},\n        {label:\"Uthyrningsinvestering\", ic:\"trending-up\"},\n          {label:\"Annat\", ic:\"handshake\"}\n      ],\n      react:{\n        \"Flytt \/ permanent bostad\":{emoji:\"\\u2600\\uFE0F\",msg:\"Ett helt nytt liv i solen b\u00f6rjar.\"},\n          \"Semesterbostad \/ fritidshus\":{emoji:\"\\uD83C\\uDFD6\\uFE0F\",msg:\"Din egen bit av Medelhavet att fly till.\"},\n         \"Pension\":{emoji:\"\\uD83C\\uDF34\",msg:\"Sol, lugnare morgnar och l\u00e4gre levnadskostnader, v\u00e4lf\u00f6rtj\u00e4nt.\"},\n          \"Uthyrningsinvestering\":{emoji:\"\\uD83D\\uDCC8\",msg:\"Den spanska hyresmarknaden \u00e4r stark och v\u00e4xande.\"},\n          \"Annat\":{emoji:\"\\uD83E\\uDD1D\",msg:\"Vad ditt m\u00e5l \u00e4n \u00e4r anpassar vi s\u00f6kandet efter det.\"}\n        }},\n\n    { id:\"service\", type:\"single\", variant:\"yesno\", required:true, ebIco:\"headset\", heroIco:\"concierge-bell\",\n      heroCap:\"Vi kan sk\u00f6ta allt p\u00e5 plats \u00e5t dig: visningar, pappersarbete, f\u00f6rhandling.\",\n       eyebrow:\"Se vad k\u00f6pare s\u00e4ger om oss\",\n      q:\"Vill du att vi sk\u00f6ter hela processen p\u00e5 plats \u00e5t dig?\",\n      options:[\n        {label:\"Ja, det skulle spara mig massor av tid\", tone:\"pos\", ic:\"thumbs-up\"},\n         {label:\"Nej, jag sk\u00f6ter det hellre sj\u00e4lv\", tone:\"neg\", ic:\"hand\"}\n      ],\n      react:{ \"Ja, det skulle spara mig massor av tid\":{emoji:\"\\uD83D\\uDE4C\",msg:\"Ol\u00e9! Vi tar hand om allt \u00e5t dig.\"} }},\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 att g\u00f6ra det sj\u00e4lv, men l\u00e5t oss se vad det verkligen inneb\u00e4r.\",\n      eyebrow:\"Punkt 1: de dolda kostnaderna\",\n        q:\"Att k\u00f6pa p\u00e5 egen hand kostar mer \u00e4n man tror, redan innan du skriver under.\",\n        quiz:{ ask:\"Hur m\u00e5nga resor tur och retur till Spanien b\u00f6r ett par r\u00e4kna med f\u00f6r visningar och tilltr\u00e4de?\",\n          options:[{label:\"Bara en\"},{label:\"Tv\u00e5\"},{label:\"Minst tre\",correct:true}],\n             reveal:\"Oftast 3 resor tur och retur (2 visningsresor och tilltr\u00e4det), flera hotelln\u00e4tter och lediga dagar fr\u00e5n jobbet, plus en advokat som granskar dokumenten och en tolk, som kr\u00e4vs hos notarien. Notan v\u00e4xer snabbt.\" },\n       body:\"Innan sj\u00e4lva bostadspriset: cirka 3 resor tur och retur (visningar och tilltr\u00e4de), hotelln\u00e4tter, lediga dagar, en advokat som granskar dokumenten och en tolk som kr\u00e4vs hos notarien. Kostnader som m\u00e5nga gl\u00f6mmer att r\u00e4kna med.\" },\n  \n    { id:\"edu_notaire\", type:\"teach\", skip:true, quizMix:true, ebIco:\"scale\", heroIco:\"landmark\",\n      heroCap:\"En spansk notarie g\u00f6r inte samma kontroller som du kanske \u00e4r van vid hemma.\",\n       eyebrow:\"Punkt 2: juridisk trygghet\",\n       q:\"Notarien kontrollerar inte det du kanske tror.\",\n       quiz:{ ask:\"Sant eller falskt: en enkel administrativ f\u00f6rsening (NIE som inte utf\u00e4rdas i tid) kan kosta dig pengar.\",\n          options:[{label:\"Falskt, man kan alltid boka om\"},{label:\"Sant, och det kan bli dyrt\",correct:true}],\n          reveal:\"Sant. Utan ditt NIE i tid skjuts tilltr\u00e4det upp, och du kan f\u00f6rlora handpenningen, vanligen 10 % av priset. Dessutom kontrollerar notarien varken skulder och inteckningar eller om bostaden \u00e4r lagligt byggd.\" },\n         body:\"Notarien bestyrker k\u00f6pebrevet men kontrollerar varken skulder och inteckningar eller bostadens r\u00e4ttsliga status. V\u00e4rre: ett NIE som inte utf\u00e4rdas i tid kan skjuta upp tilltr\u00e4det och kosta dig handpenningen, cirka 10 % av priset.\" },\n  \n    { id:\"edu_objectivite\", type:\"teach\", skip:true, ebIco:\"compass\", heroIco:\"user-check\",\n      heroCap:\"P\u00e5 egen hand st\u00e5r du sj\u00e4lv f\u00f6r advokaten, tolken och all research.\",\n         eyebrow:\"Punkt 3: vem arbetar f\u00f6r dig?\",\n       q:\"P\u00e5 egen hand vilar allt p\u00e5 dig.\",\n       quiz:{ ask:\"Om du k\u00f6per p\u00e5 egen hand, vem kontrollerar bostaden och f\u00f6rsvarar DINA intressen?\",\n        options:[{label:\"M\u00e4klaren som visar bostaden\"},{label:\"Notarien\"},{label:\"Du sj\u00e4lv, plus experterna du anlitar\",correct:true}],\n            reveal:\"Du sj\u00e4lv. En m\u00e4klare f\u00f6retr\u00e4der s\u00e4ljarens bostad, det \u00e4r inte dess jobb att g\u00f6ra kontroller, och vissa pressar dig att skriva under snabbt. P\u00e5 egen hand m\u00e5ste du anlita advokat och tolk och g\u00f6ra all research sj\u00e4lv. SpainEasy st\u00e5r p\u00e5 din sida.\" },\n       body:\"P\u00e5 egen hand anlitar du advokat och tolk och g\u00f6r all research sj\u00e4lv, mot m\u00e4klare som f\u00f6retr\u00e4der s\u00e4ljarens bostad (kontroller \u00e4r inte deras jobb, och vissa pressar dig att skriva under snabbt). SpainEasy st\u00e5r p\u00e5 din sida: vi letar, kontrollerar, \u00f6vers\u00e4tter och f\u00f6rhandlar i ditt intresse.\" },\n \n    { id:\"edu_valeur\", type:\"teach\", skip:true, ebIco:\"piggy-bank\", heroIco:\"piggy-bank\",\n      heroCap:\"\\\"Det \u00e4r s\u00e4kert dyrt\\\"\u2026 h\u00e4r \u00e4r exakt vad du f\u00e5r.\",\n        eyebrow:\"Punkt 4: den verkliga kalkylen\",\n       q:\"\\\"Er tj\u00e4nst \u00e4r s\u00e4kert dyr\u2026\\\"\",\n        body:\"L\u00e5t oss vara konkreta. S\u00e5 h\u00e4r mycket sparar v\u00e5rt st\u00f6d dig, och h\u00e4r \u00e4r f\u00e4llorna det skyddar dig fr\u00e5n.\",\n       valueRecap:{\n        saves:[\n          {ic:\"plane\", t:\"On\u00f6diga resor: vi g\u00f6r visningarna \u00e5t dig\"},\n          {ic:\"clock\", t:\"Veckor av letande och pappersarbete\"},\n          {ic:\"languages\", t:\"Advokat och tolk samordnas \u00e5t dig, p\u00e5 engelska\"},\n            {ic:\"badge-percent\", t:\"Vi k\u00e4mpar f\u00f6r att ge dig b\u00e4sta pris (exempel p\u00e5 v\u00e5r webbplats)\"}\n          ],\n        avoids:[\n          {ic:\"scale\", t:\"Dolda skulder eller en olagligt byggd bostad som ingen kontrollerar\"},\n           {ic:\"alarm-clock\", t:\"Ett f\u00f6rsenat NIE som kostar dig handpenningen p\u00e5 10 %\"},\n              {ic:\"search-check\", t:\"En bostad som inte uppfyller kraven eller ett dolt fel\"},\n          {ic:\"trending-up\", t:\"Att betala f\u00f6r mycket f\u00f6r att ingen f\u00f6rhandlade\"}\n         ]\n      },\n      closing:{ t:\"Du k\u00f6per snabbare, tryggare och ofta billigare.\", d:\"Vi sk\u00f6ter \u00e4garbytet f\u00f6r vatten och el; resten (skatt f\u00f6r icke-residenta, IBI, digitalt certifikat, f\u00f6rs\u00e4kring\u2026) \u00e4r valfritt, med samma engelsktalande team.\" } },\n     \n               { id:\"contact\", type:\"contact\", required:true, ebIco:\"badge-check\", heroIco:\"phone-call\",\n      heroCap:\"Sista steget: vi h\u00f6r av oss snart, helt utan f\u00f6rpliktelser.\",\n       eyebrow:\"Sista steget\",\n      q:\"Bara dina uppgifter, s\u00e5 att vi snabbt kan \u00e5terkomma till dig.\",\n        consent:\"Genom att skicka formul\u00e4ret godk\u00e4nner du att dela dina uppgifter s\u00e5 att v\u00e5rt team kan kontakta dig om ditt projekt.\"}\n   ];\n\n  \/\/ Swedish label -> original English value sent to HubSpot (keeps CRM picklists intact)\n  var EN_VAL = {\"S\u00e5 snart som m\u00f6jligt\": \"As soon as possible\", \"Inom de n\u00e4rmaste 6 m\u00e5naderna\": \"Within the next 6 months\", \"Inom 12 m\u00e5nader\": \"Within 12 months\", \"Det beror p\u00e5 n\u00e5got som p\u00e5g\u00e5r (f\u00f6rs\u00e4ljning av bostad, sparande\u2026)\": \"It depends on something in progress (selling a home, saving up\u2026)\", \"Jag tittar bara runt just nu\": \"Just exploring for now\", \"Juridiken och pappersarbetet (NIE, notarie)\": \"The legal & paperwork (NIE, notary)\", \"Spr\u00e5kbarri\u00e4ren (spanska)\": \"The language barrier (Spanish)\", \"Om bostaden \u00e4r i gott skick\": \"Whether the property is sound\", \"Avst\u00e5ndet (att flyga fram och tillbaka hemifr\u00e5n)\": \"The distance (flying back & forth from the U.S.)\", \"Den spanska k\u00f6pprocessen (mindre kontroll \u00e4n hemma)\": \"The Spanish closing process (less verification than in the U.S.)\", \"\u00d6verf\u00f6ringar, valuta och skatter\": \"Moving money, currency & taxes\", \"Inte tillr\u00e4ckligt med tid\": \"Not enough time\", \"L\u00e4genhet\": \"Apartment \/ condo\", \"Hus\": \"House\", \"Hus med tr\u00e4dg\u00e5rd eller pool\": \"House with yard or pool\", \"Lyxbostad\": \"Luxury property\", \"Annat\": \"Other\", \"Flytt \/ permanent bostad\": \"Relocating \/ primary home\", \"Semesterbostad \/ fritidshus\": \"Vacation \/ second home\", \"Pension\": \"Retirement\", \"Uthyrningsinvestering\": \"Rental investment\", \"Ja, det skulle spara mig massor av tid\": \"Yes \u2014 that would save me so much time\", \"Nej, jag sk\u00f6ter det hellre sj\u00e4lv\": \"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:\"Sverige (CET)\", tz:\"Europe\/Stockholm\"},\n     {l:\"Spanien (CET)\", tz:\"Europe\/Madrid\"},\n       {l:\"Storbritannien (UK)\", tz:\"Europe\/London\"},\n      {l:\"Finland (EET)\", tz:\"Europe\/Helsinki\"}\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:\"Kanada, Toronto (ET)\", s:\"ET\", tz:\"America\/Toronto\"},\n    {l:\"Kanada, Vancouver (PT)\", s:\"PT\", tz:\"America\/Vancouver\"},\n    {l:\"Mexiko, Mexico City\", s:\"CST\", tz:\"America\/Mexico_City\"},\n    {l:\"Brasilien, S\u00e3o Paulo\", s:\"BRT\", tz:\"America\/Sao_Paulo\"},\n    {l:\"Argentina, Buenos Aires\", s:\"ART\", tz:\"America\/Argentina\/Buenos_Aires\"},\n    {l:\"Storbritannien \/ Irland, London\", s:\"UK-tid\", tz:\"Europe\/London\"},\n      {l:\"Portugal, Lissabon\", s:\"WET\", tz:\"Europe\/Lisbon\"},\n     {l:\"Frankrike \/ Spanien, Paris\", s:\"CET\", tz:\"Europe\/Paris\"},\n     {l:\"Centraleuropa, Berlin\", s:\"CET\", tz:\"Europe\/Berlin\"},\n     {l:\"Grekland \/ \u00d6steuropa, Aten\", s:\"EET\", tz:\"Europe\/Athens\"},\n      {l:\"Turkiet, Istanbul\", s:\"TRT\", tz:\"Europe\/Istanbul\"},\n      {l:\"Marocko, Casablanca\", s:\"lokal tid\", tz:\"Africa\/Casablanca\"},\n     {l:\"Sydafrika, Johannesburg\", s:\"SAST\", tz:\"Africa\/Johannesburg\"},\n    {l:\"F\u00f6renade Arabemiraten, Dubai\", s:\"GST\", tz:\"Asia\/Dubai\"},\n      {l:\"Israel, Tel Aviv\", s:\"lokal tid\", tz:\"Asia\/Jerusalem\"},\n     {l:\"Indien, 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:\"Australien, Perth\", s:\"AWST\", tz:\"Australia\/Perth\"},\n      {l:\"Australien, Sydney\", s:\"AEST\", tz:\"Australia\/Sydney\"},\n      {l:\"Nya Zeeland, 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\/Stockholm\"; }\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_DAY_SV = {\"Mon\":\"m\u00e5n\",\"Tue\":\"tis\",\"Wed\":\"ons\",\"Thu\":\"tors\",\"Fri\":\"fre\",\"Sat\":\"l\u00f6r\"};\n  var CB_DOWS = {\"Mon\":1,\"Tue\":2,\"Wed\":3,\"Thu\":4,\"Fri\":5,\"Sat\":6};\n  var CB_DAY_FULL = {\"Mon\":\"m\u00e5ndag\",\"Tue\":\"tisdag\",\"Wed\":\"onsdag\",\"Thu\":\"torsdag\",\"Fri\":\"fredag\",\"Sat\":\"l\u00f6rdag\"};\n       var CB_MONTHS = [\"jan.\",\"feb.\",\"mars\",\"apr.\",\"maj\",\"juni\",\"juli\",\"aug.\",\"sep.\",\"okt.\",\"nov.\",\"dec.\"];\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)+\" till \"+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)+\" till \"+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>Exakt tid<\/button>';\n     html += '<button type=\"button\" class=\"ole-pill'+(state.answers.cb_any?\" sel\":\"\")+'\" data-cbany=\"1\">N\u00e4r 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 g\u00f6r v\u00e5rt b\u00e4sta f\u00f6r att ringa dig runt \"+fmt12(h)+\" \"+cbZoneShort()+\". Vi sitter i Spanien och kan inte lova exakt minut; boka ett samtal om du vill ha en fast tid.\";\n   }\n  function cbReaction(){\n    var a=state.answers, z=cbZoneShort();\n    if(cbWantsRdv()) return {emoji:\"\\uD83D\\uDCC5\",msg:\"Perfekt, du v\u00e4ljer din m\u00f6testid direkt efter formul\u00e4ret.\"};\n      if(a.cb_any) return {emoji:\"\\uD83D\\uDC4D\",msg:\"Toppen, vi hittar b\u00e4sta tillf\u00e4llet att n\u00e5 dig under v\u00e5ra spanska kontorstider.\"};\n    var dObj=cbNearestDateObj(); var dTxt=dObj?cbDateLong(dObj):\"\";\n    if(a.cb_precise && a.cb_hour!=null) return {emoji:\"\\uD83D\\uDC4D\",msg:\"Noterat, vi g\u00f6r v\u00e5rt b\u00e4sta f\u00f6r att ringa \"+(dTxt?dTxt+\" \":\"\")+\"runt \"+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:\"Toppen, vi siktar p\u00e5 att ringa dig \"+dTxt+\", \"+sTxt+\" \"+z+\".\"};\n      if(dTxt) return {emoji:\"\\uD83D\\uDC4D\",msg:\"Toppen, vi siktar p\u00e5 att ringa dig \"+dTxt+\".\"};\n      if(sTxt) return {emoji:\"\\uD83D\\uDC4D\",msg:\"Toppen, vi siktar p\u00e5 att ringa dig \"+sTxt+\" \"+z+\".\"};\n      if(a.cb_days_indif) return {emoji:\"\\uD83D\\uDC4D\",msg:\"Uppfattat, 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 bokar ett samtal direkt efter\u00e5t\";\n     if(a.cb_any){ var dA=cbNearestDateObj(); var dAt=dA?cbDateLong(dA):\"\"; return dAt ? (\"Samtal \"+dAt+\", n\u00e4r som helst\") : \"Samtal n\u00e4r som helst\"; }\n     var dObj=cbNearestDateObj(); var dTxt=dObj?cbDateLong(dObj):\"\";\n    if(a.cb_precise && a.cb_hour!=null) return \"Samtal \"+(dTxt?dTxt+\", \":\"\")+\"runt \"+fmt12(a.cb_hour)+\" \"+z;\n       var sTxt = a.cb_slot!=null ? cbSlotLabel(a.cb_slot) : \"\";\n    if(dTxt && sTxt) return \"Samtal \"+dTxt+\", \"+sTxt+\" \"+z;\n     if(dTxt) return \"Samtal \"+dTxt;\n     if(sTxt) return \"Samtal \"+sTxt+\" \"+z;\n     if(a.cb_days_indif) return \"Samtal s\u00e5 snart som m\u00f6jligt\";\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\":\"med sitt slott Santa B\u00e1rbara och sina str\u00e4nder\",\n     \"Barcelona\":\"med Gaud\u00ed, Sagrada Fam\u00edlia och Las Ramblas\",\n       \"Benidorm\":\"med sin skyline och sina livliga str\u00e4nder\",\n       \"C\u00e1diz\":\"en av Europas \u00e4ldsta st\u00e4der\",\n      \"Estepona\":\"med sin blomsterprydda gamla stad\",\n      \"Fuengirola\":\"med sin avslappnade strandpromenad\",\n    \"Girona\":\"med sina medeltida gr\u00e4nder\",\n    \"Granada\":\"med Alhambra och Sierra Nevada\",\n    \"Ibiza\":\"turkosa vikar och \u00f6liv\",\n      \"Madrid\":\"med Prado, Retiroparken och storstadspuls\",\n    \"M\u00e1laga\":\"Picassos hemstad\",\n      \"Marbella\":\"med glamouren i Puerto Ban\u00fas\",\n      \"Mijas\":\"med sin vitkalkade charm p\u00e5 bergssluttningen\",\n    \"Nerja\":\"med den ber\u00f6mda Balc\u00f3n de Europa\",\n    \"Palma de Mallorca\":\"med sin katedral och baleariska stil\",\n      \"Sevilla\":\"flamenco, Giralda och gr\u00f6nskande innerg\u00e5rdar\",\n     \"Sitges\":\"med sin elegans vid havet n\u00e4ra Barcelona\",\n    \"Tarragona\":\"med sin romerska amfiteater vid havet\",\n      \"Torrevieja\":\"med sina rosa saltlaguner och sin sol\",\n     \"Valencia\":\"paella och Konstens och vetenskapens stad\",\n      \"Costa del Sol\":\"\u00f6ver 300 soldagar om \u00e5ret\",\n      \"Costa Blanca\":\"vykortsstr\u00e4nder \u00e5ret runt\",\n    \"Costa Brava\":\"vilda vikar och karakt\u00e4r\",\n      \"Costa Dorada\":\"gyllene sand och romerskt arv\",\n        \"Andalusien\":\"flamenco, tapas och det goda livet\",\n        \"Balearerna\":\"ljus och turkost vatten\",\n      \"Kanarie\u00f6arna\":\"evig v\u00e5r\",\n    \"Katalonien\":\"hav, berg och katalansk stil\"\n  };\n  var CITY_NOTE = {\n    \"Alicante\":\"Costa Blancas juvel\",\"Barcelona\":\"Gaud\u00eds stad\",\"Benidorm\":\"Spaniens lilla Manhattan\",\n       \"C\u00e1diz\":\"Europas \u00e4ldsta stad\",\"Estepona\":\"Costa del Sols tr\u00e4dg\u00e5rd\",\"Fuengirola\":\"enkelt liv vid havet\",\n        \"Girona\":\"en katalansk medeltida p\u00e4rla\",\"Granada\":\"Alhambras stad\",\"Ibiza\":\"turkost \u00f6liv\",\"Madrid\":\"Spaniens hj\u00e4rta\",\n          \"M\u00e1laga\":\"Picassos f\u00f6delsestad\",\"Marbella\":\"Costa del Sols glamour\",\"Mijas\":\"en vitkalkad bergsby\",\n       \"Nerja\":\"Europas balkong\",\"Palma de Mallorca\":\"Balearernas juvel\",\"Sevilla\":\"flamencons huvudstad\",\n      \"Sitges\":\"elegans vid havet\",\"Tarragona\":\"romerskt arv vid havet\",\"Torrevieja\":\"rosa laguner och saltsl\u00e4tter\",\n       \"Valencia\":\"paellans hemstad\",\"Costa del Sol\":\"\u00f6ver 300 soldagar om \u00e5ret\",\"Costa Blanca\":\"sol \u00e5ret runt\",\n       \"Costa Brava\":\"vilda vikar\",\"Costa Dorada\":\"gyllene sand och romerska ruiner\",\"Andalusien\":\"flamenco och gott liv\",\n           \"Balearerna\":\"turkost vatten\",\"Kanarie\u00f6arna\":\"evig v\u00e5r\",\"Katalonien\":\"hav och katalansk karakt\u00e4r\"\n      };\n  var REGION_NOTE = {\n    \"Andaluc\u00eda\":\"andalusisk sol och flamenco\",\"Comunidad Valenciana\":\"Valenciakustens sol\",\"Comunitat Valenciana\":\"Valenciakustens sol\",\n    \"Catalu\u00f1a\":\"hav och katalansk karakt\u00e4r\",\"Catalunya\":\"hav och katalansk karakt\u00e4r\",\"Islas Baleares\":\"Balearernas turkosa vatten\",\"Illes Balears\":\"Balearernas turkosa vatten\",\n        \"Canarias\":\"Kanarie\u00f6arnas eviga v\u00e5r\",\"Islas Canarias\":\"Kanarie\u00f6arnas eviga v\u00e5r\",\"Regi\u00f3n de Murcia\":\"milda Costa C\u00e1lida\",\"Comunidad de Madrid\":\"Spaniens hj\u00e4rta\",\n            \"Galicia\":\"Galiciens kust och natur\",\"Pa\u00eds Vasco\":\"baskiskt hav och k\u00f6k\",\"Andalusien\":\"andalusisk sol och flamenco\"\n    };\n  var LOC_PILL = {\n    \"Alicante\":{emoji:\"\\uD83C\\uDF0A\",msg:\"Alicante: turkost hav och en livlig gamla stad.\"},\n      \"Barcelona\":{emoji:\"\\u2728\",msg:\"Barcelona: storstaden som aldrig sover.\"},\n    \"Benidorm\":{emoji:\"\\uD83C\\uDFD9\\uFE0F\",msg:\"Benidorm: skyline, str\u00e4nder och liv \u00e5ret runt.\"},\n      \"C\u00e1diz\":{emoji:\"\\uD83C\\uDF0A\",msg:\"C\u00e1diz: en av Europas \u00e4ldsta st\u00e4der, vid Atlanten.\"},\n     \"Estepona\":{emoji:\"\\uD83C\\uDF3A\",msg:\"Estepona: Costa del Sols blomsterprydda p\u00e4rla.\"},\n       \"Fuengirola\":{emoji:\"\\uD83C\\uDFD6\\uFE0F\",msg:\"Fuengirola: avslappnat, soligt, med f\u00f6tterna i vattnet.\"},\n     \"Girona\":{emoji:\"\\uD83C\\uDFF0\",msg:\"Girona: medeltida gr\u00e4nder och katalanskt lugn.\"},\n      \"Granada\":{emoji:\"\\uD83C\\uDFD4\\uFE0F\",msg:\"Granada: Alhambra med Sierra Nevada i bakgrunden.\"},\n       \"Ibiza\":{emoji:\"\\uD83C\\uDFDD\\uFE0F\",msg:\"Ibiza: turkosa vikar och \u00f6liv.\"},\n      \"Madrid\":{emoji:\"\\u2728\",msg:\"Madrid: Spaniens pulserande hj\u00e4rta.\"},\n      \"M\u00e1laga\":{emoji:\"\\u2600\\uFE0F\",msg:\"M\u00e1laga: Picassos f\u00f6delsestad, solig och levande.\"},\n    \"Marbella\":{emoji:\"\\uD83C\\uDF34\",msg:\"Marbella: all glamour p\u00e5 Costa del Sol.\"},\n     \"Mijas\":{emoji:\"\\uD83E\\uDD0D\",msg:\"Mijas: vitkalkad charm ovanf\u00f6r kusten.\"},\n      \"Nerja\":{emoji:\"\\uD83C\\uDF05\",msg:\"Nerja: Europas balkong \u00f6ver Medelhavet.\"},\n      \"Palma de Mallorca\":{emoji:\"\\uD83C\\uDFDD\\uFE0F\",msg:\"Palma de Mallorca: elegans p\u00e5 Balearerna.\"},\n     \"Sevilla\":{emoji:\"\\uD83D\\uDC83\",msg:\"Sevilla: flamenco, innerg\u00e5rdar och andalusiskt liv.\"},\n      \"Sitges\":{emoji:\"\\uD83C\\uDF0A\",msg:\"Sitges: elegans vid havet strax s\u00f6der om Barcelona.\"},\n    \"Tarragona\":{emoji:\"\\uD83C\\uDFDB\\uFE0F\",msg:\"Tarragona: romerskt arv vid Medelhavet.\"},\n    \"Torrevieja\":{emoji:\"\\uD83C\\uDF38\",msg:\"Torrevieja: rosa laguner och n\u00e4stan st\u00e4ndig sol.\"},\n    \"Valencia\":{emoji:\"\\uD83E\\uDD58\",msg:\"Valencia: paella, str\u00e4nder och modern stil.\"},\n      \"Costa del Sol\":{emoji:\"\\u2600\\uFE0F\",msg:\"Costa del Sol: \u00f6ver 300 soldagar om \u00e5ret.\"},\n       \"Costa Blanca\":{emoji:\"\\uD83C\\uDFD6\\uFE0F\",msg:\"Costa Blanca: vykortsstr\u00e4nder \u00e5ret runt.\"},\n     \"Costa Brava\":{emoji:\"\\uD83C\\uDF0A\",msg:\"Costa Brava: vilda vikar och karakt\u00e4r.\"},\n       \"Costa Dorada\":{emoji:\"\\uD83C\\uDFDB\\uFE0F\",msg:\"Costa Dorada: gyllene sand och romerskt arv.\"},\n         \"Andalusien\":{emoji:\"\\uD83D\\uDC83\",msg:\"Andalusien: sol, hav och levnadskonst.\"},\n       \"Balearerna\":{emoji:\"\\uD83C\\uDFDD\\uFE0F\",msg:\"Balearerna: en bit av Medelhavets paradis.\"},\n     \"Kanarie\u00f6arna\":{emoji:\"\\uD83C\\uDF34\",msg:\"Kanarie\u00f6arna: evig v\u00e5r, \u00e5ret runt.\"},\n      \"Katalonien\":{emoji:\"\\uD83C\\uDF0A\",msg:\"Katalonien: vilda vikar, kultur och 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: \u00f6ver 300 soldagar om \u00e5ret.\"},\n       {match:[\"seville\",\"sevilla\",\"cadiz\",\"c\u00e1diz\",\"granada\",\"almeria\",\"almer\u00eda\",\"andaluc\"],emoji:\"\\uD83D\\uDC83\",msg:\"Andalusien: sol, hav och levnadskonst.\"},\n     {match:[\"alicante\",\"benidorm\",\"calpe\",\"denia\",\"javea\",\"j\u00e1vea\",\"torrevieja\",\"costa blanca\"],emoji:\"\\uD83C\\uDFD6\\uFE0F\",msg:\"Costa Blanca: vykortsstr\u00e4nder \u00e5ret runt.\"},\n     {match:[\"valencia\",\"valence\"],emoji:\"\\uD83E\\uDD58\",msg:\"Valencia: paella, str\u00e4nder och enkelt liv.\"},\n      {match:[\"murcia\",\"costa calida\",\"costa c\u00e1lida\"],emoji:\"\\uD83C\\uDF05\",msg:\"Costa C\u00e1lida: Spaniens mildaste hav.\"},\n      {match:[\"barcelona\",\"girona\",\"sitges\",\"lloret\",\"roses\",\"tarragona\",\"costa brava\",\"costa dorada\",\"catal\"],emoji:\"\\uD83C\\uDF0A\",msg:\"Katalonien: vilda vikar, kultur och god smak.\"},\n      {match:[\"palma\",\"mallorca\",\"baleares\",\"balearic\",\"ibiza\",\"menorca\"],emoji:\"\\uD83C\\uDFDD\\uFE0F\",msg:\"Balearerna: en bit av Medelhavets paradis.\"},\n     {match:[\"canar\",\"tenerife\",\"las palmas\",\"fuerteventura\",\"lanzarote\"],emoji:\"\\uD83C\\uDF34\",msg:\"Kanarie\u00f6arna: evig v\u00e5r, \u00e5ret runt.\"},\n     {match:[\"madrid\"],emoji:\"\\u2728\",msg:\"Madrid: Spaniens pulserande hj\u00e4rta.\"}\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(\"sv-SE\");\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|nej)\/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=\"\u00c4ndra tid f\u00f6r samtal\"><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>\u00c4ndra<\/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>Ditt projekt<\/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!==\"Annat\" && 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 : \"\")+\". Vilket fint projekt!\" };\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 \u00e4r ett k\u00f6pombud, inte en m\u00e4klare.<\/strong>'+\n        '<span>Vi letar, kontrollerar och f\u00f6rhandlar \u00e5t dig, enbart i ditt intresse.<\/span><\/div>'+\n        '<\/div>'+\n      '<button type=\"button\" class=\"ole-pos-toggle\" id=\"ole-pos-toggle\" aria-expanded=\"false\">Hur fungerar 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 letar<\/div><div class=\"ole-pos-step-d\">Vi sp\u00e5rar upp bostaden som passar dig, var som helst i Spanien.<\/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 kontrollerar<\/div><div class=\"ole-pos-step-d\">R\u00e4ttslig status, skulder, verkligt skick: vi kontrollerar allt innan du binder dig.<\/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 f\u00f6rhandlar<\/div><div class=\"ole-pos-step-d\">Vi f\u00f6rsvarar din budget f\u00f6r att f\u00e5 b\u00e4sta pris, enbart i ditt intresse.<\/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 = \"Bost\u00e4der \"+place+\" runt \"+fmt(v)+\" \u00e4r s\u00e4llsynta (r\u00e4kna med minst \"+fmt(min)+\"). Att bredda s\u00f6kandet till n\u00e4rliggande orter g\u00e5r dock ofta bra, vi letar efter b\u00e4sta m\u00f6jligheten \u00e5t dig.\";\n             return { emoji:\"\\ud83e\\udded\", warn:true, msg:msg };\n      }\n      if(v < min*1.4)  return { emoji:\"\\ud83d\\udc4d\", msg:\"En realistisk budget \"+place+\": det finns verkliga chanser att hitta n\u00e5got fint.\" };\n         if(v < min*2.5)  return { emoji:\"\\u2600\\ufe0f\", msg:\"Bra marginal \"+place+\", vi kan sikta p\u00e5 n\u00e5got riktigt speciellt.\" };\n        return { emoji:\"\\u2728\", msg:\"Ol\\u00e9! Med den h\u00e4r budgeten \"+place+\" st\u00e5r det exklusiva segmentet \u00f6ppet f\u00f6r dig.\" };\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===\"Balearerna\" || p===\"Kanarie\u00f6arna\") 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 r\u00e4tt, precis s\u00e5.\",\"R\u00e4tt, snyggt!\",\"R\u00e4tt, du har \u00f6ga f\u00f6r det h\u00e4r.\",\"Exakt, bra spelat.\",\"Ja! Du kan verkligen det h\u00e4r.\"];\n     var QUIZ_KO = [\"Det \u00e4r den vanligaste f\u00e4llan, som tur \u00e4r \u00e4r det precis den vi s\u00e4krar.\",\"N\u00e4stan! Och det \u00e4r precis d\u00e4r vi kliver in.\",\"Inte riktigt, men ta det lugnt, vi sk\u00f6ter det \u00e5t dig.\",\"Vanligt misstag: det \u00e4r precis d\u00e4rf\u00f6r vi finns.\",\"N\u00e4ra, men det \u00e4r just den sortens detaljer vi tar hand om \u00e5t dig.\"];\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 tydligt, och det \u00e4r precis d\u00e4rf\u00f6r vi finns.\";\n      if(state.answers.location) return \"Sista steget: vi h\u00f6r snart av oss om ditt projekt \"+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=\"St\u00e4ng formul\u00e4ret\"><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>L\u00e4mna formul\u00e4ret?<\/h4>'+\n            '<p>Dina svar sparas inte. Du \u00e4r bara n\u00e5gra steg fr\u00e5n din plats i den spanska solen.<\/p>'+\n          '<div class=\"ole-confirm-actions\">'+\n            '<button type=\"button\" class=\"ole-confirm-stay\" id=\"ole-stay\">Forts\u00e4tt<\/button>'+\n             '<button type=\"button\" class=\"ole-confirm-quit\" id=\"ole-quit\">L\u00e4mna \u00e4nd\u00e5<\/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=\"Sista steget\";\n    else if(rem===1) countEl.textContent=\"Ett steg kvar!\";\n     else if(rem===2) countEl.textContent=\"2 fr\u00e5gor kvar!\";\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>Det h\u00e4r sparar vi \u00e5t dig<\/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>F\u00e4llorna vi skyddar dig fr\u00e5n<\/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 tidszon<\/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>Annat land<\/button>';\n      h += '<\/div>';\n      h += '<select class=\"ole-cb-select'+(isOther?\" show\":\"\")+'\" id=\"ole-cb-select\" aria-label=\"V\u00e4lj din tidszon\"><option value=\"\">V\u00e4lj land \/ tidszon\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_SV[d.label]||d.label)+'<\/button>'; });\n       h += '<button type=\"button\" class=\"ole-pill'+(state.answers.cb_days_indif?\" sel\":\"\")+'\" data-cbday-indif=\"1\">Vilken dag som helst<\/button>';\n        h += '<\/div>';\n      h += '<div class=\"ole-cb-label sep\"><span class=\"ole-ico\"><i data-lucide=\"clock\"><\/i><\/span>Tidsf\u00f6nster<\/div>';\n        h += '<div class=\"ole-cb-hint\" id=\"ole-cb-hint\">Visas i din lokala tid ('+esc(zNow)+'). Vi ringer bara under v\u00e5ra spanska kontorstider, s\u00e5 de h\u00e4r tidsf\u00f6nstren motsvarar redan n\u00e4r vi kan n\u00e5 dig.<\/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 tidsskillnaden mellan Spanien och d\u00e4r du bor \u00e4r tidsf\u00f6nstren f\u00f6r samtal den h\u00e4r dagen mycket begr\u00e4nsade. V\u00e4lj <strong>\\u201DN\u00e4r som helst\\u201D<\/strong> s\u00e5 hittar vi b\u00e4sta tillf\u00e4llet, eller boka ett samtal f\u00f6r att l\u00e5sa en tid.<\/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\">Vilken tid passar b\u00e4st?<\/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>Boka ett samtal<\/button><\/div><\/div><\/div><\/div>';\n        h += '<div class=\"ole-cb-office\"><span class=\"ole-ico\"><i data-lucide=\"info\"><\/i><\/span><span>Vi sitter i Spanien och ringer under v\u00e5ra lokala kontorstider (09:00 till 19:00 CET, m\u00e5ndag till fredag). Vi g\u00f6r v\u00e5rt b\u00e4sta f\u00f6r att n\u00e5 dig i det tidsf\u00f6nster du har valt.<\/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\">Jag bokar hellre ett samtal sj\u00e4lv<\/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>I slutet av formul\u00e4ret kommer du till v\u00e5r bokningssida d\u00e4r du sj\u00e4lv v\u00e4ljer en tid med en r\u00e5dgivare.<\/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\",\"F\u00f6rnamn\",\"text\",a.firstname,\"Anna\",\"given-name\")+ field(\"lastname\",\"Efternamn\",\"text\",a.lastname,\"Andersson\",\"family-name\")+ '<\/div>'+\n               field(\"email\",\"E-post\",\"email\",a.email,\"anna.andersson@email.com\",\"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,\"070-123 45 67\",\"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\">Integritetspolicy<\/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 st\u00f6d av ett <strong>engelsktalande team<\/strong>, fr\u00e5n s\u00f6kandet till undertecknandet.',\n    'Vi \u00e4r dina <strong>\u00f6gon och \u00f6ron<\/strong> p\u00e5 plats i Spanien.',\n        'Vi sk\u00f6ter pappersarbetet med <strong>NIE, notarie och bank<\/strong>, s\u00e5 att du slipper.',\n        'B\u00e4sta tiden att b\u00f6rja var i g\u00e5r. N\u00e4st b\u00e4sta \u00e4r <strong>nu<\/strong>.',\n       'Din plats i den spanska solen kan vara <strong>n\u00e4rmare \u00e4n 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?(\"Starta mitt s\u00f6kande \"+locWithPrep(ctaCity)):\"Skicka min f\u00f6rfr\u00e5gan\";\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||\"N\u00e4sta\")+' <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\">N\u00e4sta <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> Utan f\u00f6rpliktelser<\/span><span><i data-lucide=\"clock\"><\/i> Svar inom 24 h<\/span><span><i data-lucide=\"message-circle\"><\/i> Engelsktalande team<\/span><\/div>';\n        if(step.type===\"teach\" && step.skip) html += '<button type=\"button\" class=\"ole-skip\" id=\"ole-skip\">Hoppa \u00f6ver det h\u00e4r steget<\/button>';\n      if(state.history.length>0) html += '<button type=\"button\" class=\"ole-back\" id=\"ole-back\"><i data-lucide=\"chevron-left\"><\/i> Tillbaka<\/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='Menade 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=\"Visas i din lokala tid (\"+cbZoneShort()+\"). Vi ringer bara under v\u00e5ra spanska kontorstider, s\u00e5 de h\u00e4r tidsf\u00f6nstren motsvarar redan n\u00e4r vi kan n\u00e5 dig.\"; }\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\",\"Ange din budget f\u00f6r att forts\u00e4tta.\"); return false; } if(step.min&&v<step.min){ setErr(\"budget\",\"Vi arbetar med projekt fr\u00e5n \"+fmt(step.min)+\" och upp\u00e5t.\"); return false; } setErr(\"budget\",\"\"); return true; }\n           return !!v;\n  }\n  function validateContact(){\n    var ok=true;\n    [[\"firstname\",\"Ange ditt f\u00f6rnamn\"],[\"lastname\",\"Ange ditt efternamn\"]].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?\"\":\"Ange en giltig e-postadress\"); 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?\"\":\"Ogiltigt nummer f\u00f6r valt 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?\"\":\"Ange ett giltigt 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=\"Skickar\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=\"F\u00f6rs\u00f6k igen\"; });\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>Klart, tack!<\/h3><p>V\u00e5rt team g\u00e5r igenom ditt projekt och h\u00f6r av sig mycket 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    se:{emoji:\"\\uD83C\\uDDF8\\uD83C\\uDDEA\",msg:\"K\u00f6per du fr\u00e5n Sverige? Vi \u00e4r dina \u00f6gon och \u00f6ron p\u00e5 plats i Spanien.\"},\n    us:{emoji:\"\\uD83C\\uDDFA\\uD83C\\uDDF8\",msg:\"Vi guidar dig p\u00e5 engelska, i varje steg p\u00e5 v\u00e4gen.\"},\n      ca:{emoji:\"\\uD83C\\uDDE8\\uD83C\\uDDE6\",msg:\"K\u00f6per du fr\u00e5n Kanada? Vi \u00e4r dina \u00f6gon och \u00f6ron p\u00e5 plats i Spanien.\"},\n      gb:{emoji:\"\\uD83C\\uDDEC\\uD83C\\uDDE7\",msg:\"M\u00e5nga brittiska k\u00f6pare litar p\u00e5 oss f\u00f6r ett smidigt k\u00f6p i Spanien, p\u00e5 engelska.\"},\n    es:{emoji:\"\\uD83C\\uDDEA\\uD83C\\uDDF8\",msg:\"Redan i Spanien? Vi g\u00f6r varje steg enklare, p\u00e5 engelska, vid din sida.\"}\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\/Stockholm\":\"se\",\"Europe\/Oslo\":\"no\",\"Europe\/Helsinki\":\"fi\",\"Europe\/Copenhagen\":\"dk\",\"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 \"se\";\n  }\n  function geoLookup(cb){\n    var done=false; function fin(c){ if(done) return; done=true; cb((c||\"se\").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:[\"se\",\"no\",\"fi\",\"dk\",\"es\"], 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\":\"Andalusien\",\"andalousie\":\"Andalusien\",\"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>Bostadss\u00f6kning i Spanien<\/p>\n","protected":false},"author":1,"featured_media":46950,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"100-width.php","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-45390","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>Starta ditt bostadss\u00f6kande i Spanien | SpainEasy<\/title>\n<meta name=\"description\" content=\"Ber\u00e4tta om ditt projekt p\u00e5 2 minuter: budget, ort och typ av bostad. V\u00e5rt k\u00f6pombud letar, kontrollerar och f\u00f6rhandlar \u00e5t dig i hela Spanien.\" \/>\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\/sv\/bostadssokande\/\" \/>\n<meta property=\"og:locale\" content=\"sv_SE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Starta ditt bostadss\u00f6kande i Spanien | SpainEasy\" \/>\n<meta property=\"og:description\" content=\"Ber\u00e4tta om ditt projekt p\u00e5 2 minuter: budget, ort och typ av bostad. V\u00e5rt k\u00f6pombud letar, kontrollerar och f\u00f6rhandlar \u00e5t dig i hela Spanien.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/spaineasy.com\/sv\/bostadssokande\/\" \/>\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:38:45+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=\"Ber\u00e4knad l\u00e4stid\" \/>\n\t<meta name=\"twitter:data1\" content=\"21 minuter\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/spaineasy.com\\\/sv\\\/bostadssokande\\\/\",\"url\":\"https:\\\/\\\/spaineasy.com\\\/sv\\\/bostadssokande\\\/\",\"name\":\"Starta ditt bostadss\u00f6kande i Spanien | SpainEasy\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/spaineasy.com\\\/sv\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/spaineasy.com\\\/sv\\\/bostadssokande\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/spaineasy.com\\\/sv\\\/bostadssokande\\\/#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:38:45+00:00\",\"description\":\"Ber\u00e4tta om ditt projekt p\u00e5 2 minuter: budget, ort och typ av bostad. V\u00e5rt k\u00f6pombud letar, kontrollerar och f\u00f6rhandlar \u00e5t dig i hela Spanien.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/spaineasy.com\\\/sv\\\/bostadssokande\\\/#breadcrumb\"},\"inLanguage\":\"sv-SE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/spaineasy.com\\\/sv\\\/bostadssokande\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"sv-SE\",\"@id\":\"https:\\\/\\\/spaineasy.com\\\/sv\\\/bostadssokande\\\/#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\\\/sv\\\/bostadssokande\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/spaineasy.com\\\/sv\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bostadss\u00f6kande\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/spaineasy.com\\\/sv\\\/#website\",\"url\":\"https:\\\/\\\/spaineasy.com\\\/sv\\\/\",\"name\":\"SpainEasy\",\"description\":\"Din oberoende k\u00f6paragent f\u00f6r bost\u00e4der i Spanien.\",\"publisher\":{\"@id\":\"https:\\\/\\\/spaineasy.com\\\/sv\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/spaineasy.com\\\/sv\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"sv-SE\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/spaineasy.com\\\/sv\\\/#organization\",\"name\":\"SpainEasy\",\"url\":\"https:\\\/\\\/spaineasy.com\\\/sv\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"sv-SE\",\"@id\":\"https:\\\/\\\/spaineasy.com\\\/sv\\\/#\\\/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\\\/sv\\\/#\\\/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":"Starta ditt bostadss\u00f6kande i Spanien | SpainEasy","description":"Ber\u00e4tta om ditt projekt p\u00e5 2 minuter: budget, ort och typ av bostad. V\u00e5rt k\u00f6pombud letar, kontrollerar och f\u00f6rhandlar \u00e5t dig i hela Spanien.","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\/sv\/bostadssokande\/","og_locale":"sv_SE","og_type":"article","og_title":"Starta ditt bostadss\u00f6kande i Spanien | SpainEasy","og_description":"Ber\u00e4tta om ditt projekt p\u00e5 2 minuter: budget, ort och typ av bostad. V\u00e5rt k\u00f6pombud letar, kontrollerar och f\u00f6rhandlar \u00e5t dig i hela Spanien.","og_url":"https:\/\/spaineasy.com\/sv\/bostadssokande\/","og_site_name":"SpainEasy","article_publisher":"https:\/\/www.facebook.com\/SpainEasyEstate","article_modified_time":"2026-11-03T14:38:45+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":{"Ber\u00e4knad l\u00e4stid":"21 minuter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/spaineasy.com\/sv\/bostadssokande\/","url":"https:\/\/spaineasy.com\/sv\/bostadssokande\/","name":"Starta ditt bostadss\u00f6kande i Spanien | SpainEasy","isPartOf":{"@id":"https:\/\/spaineasy.com\/sv\/#website"},"primaryImageOfPage":{"@id":"https:\/\/spaineasy.com\/sv\/bostadssokande\/#primaryimage"},"image":{"@id":"https:\/\/spaineasy.com\/sv\/bostadssokande\/#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:38:45+00:00","description":"Ber\u00e4tta om ditt projekt p\u00e5 2 minuter: budget, ort och typ av bostad. V\u00e5rt k\u00f6pombud letar, kontrollerar och f\u00f6rhandlar \u00e5t dig i hela Spanien.","breadcrumb":{"@id":"https:\/\/spaineasy.com\/sv\/bostadssokande\/#breadcrumb"},"inLanguage":"sv-SE","potentialAction":[{"@type":"ReadAction","target":["https:\/\/spaineasy.com\/sv\/bostadssokande\/"]}]},{"@type":"ImageObject","inLanguage":"sv-SE","@id":"https:\/\/spaineasy.com\/sv\/bostadssokande\/#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\/sv\/bostadssokande\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/spaineasy.com\/sv\/"},{"@type":"ListItem","position":2,"name":"Bostadss\u00f6kande"}]},{"@type":"WebSite","@id":"https:\/\/spaineasy.com\/sv\/#website","url":"https:\/\/spaineasy.com\/sv\/","name":"SpainEasy","description":"Din oberoende k\u00f6paragent f\u00f6r bost\u00e4der i Spanien.","publisher":{"@id":"https:\/\/spaineasy.com\/sv\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/spaineasy.com\/sv\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"sv-SE"},{"@type":"Organization","@id":"https:\/\/spaineasy.com\/sv\/#organization","name":"SpainEasy","url":"https:\/\/spaineasy.com\/sv\/","logo":{"@type":"ImageObject","inLanguage":"sv-SE","@id":"https:\/\/spaineasy.com\/sv\/#\/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\/sv\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/SpainEasyEstate","https:\/\/www.youtube.com\/watch?v=mq5f8eHO6l8"]}]}},"_links":{"self":[{"href":"https:\/\/spaineasy.com\/sv\/wp-json\/wp\/v2\/pages\/45390","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spaineasy.com\/sv\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/spaineasy.com\/sv\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/spaineasy.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spaineasy.com\/sv\/wp-json\/wp\/v2\/comments?post=45390"}],"version-history":[{"count":24,"href":"https:\/\/spaineasy.com\/sv\/wp-json\/wp\/v2\/pages\/45390\/revisions"}],"predecessor-version":[{"id":51310,"href":"https:\/\/spaineasy.com\/sv\/wp-json\/wp\/v2\/pages\/45390\/revisions\/51310"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/spaineasy.com\/sv\/wp-json\/wp\/v2\/media\/46950"}],"wp:attachment":[{"href":"https:\/\/spaineasy.com\/sv\/wp-json\/wp\/v2\/media?parent=45390"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}