{"id":13712,"date":"2023-11-15T18:10:29","date_gmt":"2023-11-15T16:10:29","guid":{"rendered":"https:\/\/sensolar.ch\/our-sales-outlets\/"},"modified":"2026-03-17T11:27:39","modified_gmt":"2026-03-17T09:27:39","slug":"our-sales-outlets","status":"publish","type":"page","link":"https:\/\/sensolar.ch\/en\/our-sales-outlets\/","title":{"rendered":"STORES"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"13712\" class=\"elementor elementor-13712 elementor-4472\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1ce1314 e-flex e-con-boxed e-con e-parent\" data-id=\"1ce1314\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-287da7c e-flex e-con-boxed e-con e-child\" data-id=\"287da7c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a685bed elementor-widget elementor-widget-heading\" data-id=\"a685bed\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Our sales outlets<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-502ad89 e-flex e-con-boxed e-con e-parent\" data-id=\"502ad89\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-8175b3a e-flex e-con-boxed e-con e-child\" data-id=\"8175b3a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1581a20 elementor-widget elementor-widget-html\" data-id=\"1581a20\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div id=\"map_container\">\n    <div id=\"map\"><\/div>\n<\/div>\n\n<style>\n    #map_container { min-height:400px; }\n    #map { position: absolute; top: 0; bottom: 0; width: 100%; }\n    .mapboxgl-popup {\n  max-width: 200px;\n}\n\n.mapboxgl-popup-content {\n  text-align: center;\n  font-family: 'Open Sans', sans-serif;\n}\n.marker {\n    background-image:url('\/wp-content\/uploads\/2023\/11\/iconfinder_map-marker_299087.png');\n    background-size:cover;\n    width:20px;\n    height:20px;\n    cursor: pointer;\n}\n<\/style>\n    <script type=\"text\/javascript\" src=\"https:\/\/api.mapbox.com\/mapbox-gl-js\/v2.1.1\/mapbox-gl.js\"><\/script>\n    <script type=\"text\/javascript\" src=\"https:\/\/unpkg.com\/es6-promise@4.2.4\/dist\/es6-promise.auto.min.js\"><\/script>\n    <script type=\"text\/javascript\" src=\"https:\/\/unpkg.com\/@mapbox\/mapbox-sdk\/umd\/mapbox-sdk.min.js\"><\/script>\n   <link rel=\"stylesheet\" href=\"https:\/\/api.mapbox.com\/mapbox-gl-js\/v2.1.1\/mapbox-gl.css\">\n    \n    \n    <script src=\"https:\/\/api.mapbox.com\/mapbox-gl-js\/plugins\/mapbox-gl-geocoder\/v4.7.0\/mapbox-gl-geocoder.min.js\"><\/script>\n<link rel=\"stylesheet\" href=\"https:\/\/api.mapbox.com\/mapbox-gl-js\/plugins\/mapbox-gl-geocoder\/v4.7.0\/mapbox-gl-geocoder.css\" type=\"text\/css\">\n<!--\n<script type=\"text\/javascript\" src=\"\/wp-content\/uploads\/map.js\"><\/script>\n-->\n<script>\n\n\n(() => {\n  \/\/ ====== CONFIG ======\n  const MAPBOX_TOKEN =\n    \"pk.eyJ1IjoicGVkY2hlbmtvcCIsImEiOiJja21kbGZ5dWUybWxwMm9udzJwMTE0bG1sIn0.pfaEz0FQE87OprBAhKGwqQ\";\n\n  \/\/ Published-to-web CSV URL (your link)\n  const CSV_URL =\n    \"https:\/\/docs.google.com\/spreadsheets\/d\/e\/2PACX-1vRMgYP7cNUXvSGl86XCNS1m_GoJxGlq1OjvzkEU9YcS97H0sLAjp8PplM3pERh4UB_9nFXyLmBrNVwM\/pub?output=csv\";\n\n  \/\/ Map defaults (from your attached file)\n  const MAP_CONTAINER_ID = \"map\";\n  const MAP_STYLE = \"mapbox:\/\/styles\/mapbox\/streets-v11\";\n  const MAP_ZOOM = 7.3;\n  const MAP_CENTER = [8.529301, 46.88783]; \/\/ [lng, lat]\n\n  \/\/ ====== MAP INIT (same as old file) ======\n  mapboxgl.accessToken = MAPBOX_TOKEN;\n\n  \/\/ not used later, but kept from original file:\n  \/\/ eslint-disable-next-line no-unused-vars\n  const mapboxClient = mapboxSdk({ accessToken: mapboxgl.accessToken });\n\n  const map = new mapboxgl.Map({\n    container: MAP_CONTAINER_ID,\n    style: MAP_STYLE,\n    zoom: MAP_ZOOM,\n    center: MAP_CENTER,\n  });\n\n  map.addControl(\n    new MapboxGeocoder({\n      accessToken: mapboxgl.accessToken,\n      placeholder: \"Stadt\",\n      countries: \"ch\",\n      mapboxgl: mapboxgl,\n    })\n  );\n\n  map.addControl(\n    new mapboxgl.NavigationControl({\n      showCompass: false,\n    })\n  );\n\n  \/\/ ====== CSV PARSER (handles quoted commas + CRLF) ======\n  function parseCSV(text) {\n    text = String(text || \"\").replace(\/\\r\/g, \"\").trim();\n    if (!text) return [];\n\n    const rows = [];\n    let row = [];\n    let field = \"\";\n    let inQuotes = false;\n\n    for (let i = 0; i < text.length; i++) {\n      const c = text[i];\n      const next = text[i + 1];\n\n      \/\/ escaped quote \"\"\n      if (c === '\"' && inQuotes && next === '\"') {\n        field += '\"';\n        i++;\n        continue;\n      }\n\n      \/\/ toggle quotes\n      if (c === '\"') {\n        inQuotes = !inQuotes;\n        continue;\n      }\n\n      \/\/ field separator\n      if (c === \",\" && !inQuotes) {\n        row.push(field);\n        field = \"\";\n        continue;\n      }\n\n      \/\/ row separator\n      if (c === \"\\n\" && !inQuotes) {\n        row.push(field);\n        rows.push(row);\n        row = [];\n        field = \"\";\n        continue;\n      }\n\n      field += c;\n    }\n\n    \/\/ last field\n    row.push(field);\n    rows.push(row);\n\n    const headers = (rows.shift() || []).map((h) => String(h).trim());\n\n    return rows\n      .filter((r) => r.some((v) => String(v).trim() !== \"\"))\n      .map((r) => {\n        const obj = {};\n        headers.forEach((h, idx) => {\n          obj[h] = (r[idx] ?? \"\").toString().trim();\n        });\n        return obj;\n      });\n  }\n\n  \/\/ ====== CONVERT SHEET ROWS -> old objects structure ======\n  function rowsToObjects(rows) {\n    return rows\n      .map((r) => {\n        const lat = Number(r.lat);\n        const lng = Number(r.lng);\n\n        return {\n          center: { lat, lng }, \/\/ \u2705 old structure\n          text: r.text || \"\",\n          place_name: r.place_name || \"\",\n        };\n      })\n      .filter(\n        (p) =>\n          p.place_name &&\n          Number.isFinite(p.center.lat) &&\n          Number.isFinite(p.center.lng)\n      );\n  }\n\n  \/\/ ====== RENDER MARKERS (same as old file) ======\n  function renderObjects(objects) {\n    for (let k = 0; k < objects.length; k++) {\n      const marker = objects[k];\n\n      const el = document.createElement(\"div\");\n      el.className = \"marker\";\n\n      new mapboxgl.Marker(el)\n        .setLngLat(marker.center) \/\/ Mapbox accepts {lng,lat}\n        .setPopup(\n          new mapboxgl.Popup({ offset: 25 }).setHTML(\n            \"<strong>\" +\n              escapeHtml(marker.place_name) +\n              \"<\/strong><p>\" +\n              escapeHtml(marker.text) +\n              \"<\/p>\"\n          )\n        )\n        .addTo(map);\n    }\n  }\n\n  \/\/ small safety (prevents broken HTML in popup)\n  function escapeHtml(s) {\n    return String(s || \"\")\n      .replace(\/&\/g, \"&amp;\")\n      .replace(\/<\/g, \"&lt;\")\n      .replace(\/>\/g, \"&gt;\")\n      .replace(\/\"\/g, \"&quot;\")\n      .replace(\/'\/g, \"&#039;\");\n  }\n\n  \/\/ ====== LOAD FROM SHEET AFTER MAP IS READY ======\n  map.on(\"load\", () => {\n    fetch(CSV_URL, { cache: \"no-store\" })\n      .then((r) => {\n        if (!r.ok) throw new Error(\"CSV fetch failed: \" + r.status);\n        return r.text();\n      })\n      .then((csvText) => {\n        const rows = parseCSV(csvText);\n        const objects = rowsToObjects(rows);\n\n        \/\/ for debugging\n        console.log(\"points of sale rows:\", rows.length);\n        console.log(\"points of sale objects:\", objects.length);\n\n        renderObjects(objects);\n      })\n      .catch((err) => {\n        console.error(\"Points of sale load error:\", err);\n      });\n  });\n})();\n<\/script>\n    \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-8993729 e-flex e-con-boxed e-con e-parent\" data-id=\"8993729\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-0ec225e e-flex e-con-boxed e-con e-child\" data-id=\"0ec225e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-fba0821 elementor-widget elementor-widget-text-editor\" data-id=\"fba0821\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-sourcepos=\"1:1-1:67\"><strong>Sensolar: Your one-stop store for sun shading and insect screens<\/strong><\/p>\n<p data-sourcepos=\"3:1-3:49\">Protect yourself from harmful UV rays and annoying insects with Sensolar&#8217;s comprehensive range of sunscreens and insect repellents. Our products are specially developed to provide long-lasting protection even under the most demanding conditions.<\/p>\n<p data-sourcepos=\"5:1-5:41\"><strong>Find a Sensolar dealer near you<\/strong><\/p>\n<p data-sourcepos=\"7:1-7:35\">Use our interactive map to find a Sensolar dealer near you. Simply enter your address or zip code and our map will show you all the nearest locations.<\/p>\n<p data-sourcepos=\"11:1-11:202\">When it comes to sun protection and insect repellents, Sensolar is a name you can trust. Our products are dermatologically tested and clinically proven to provide effective protection.<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-dbcaaec e-flex e-con-boxed e-con e-parent\" data-id=\"dbcaaec\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Our sales outlets Sensolar: Your one-stop store for sun shading and insect screens Protect yourself from harmful UV rays and annoying insects with Sensolar&#8217;s comprehensive range of sunscreens and insect repellents. Our products are specially developed to provide long-lasting protection even under the most demanding conditions. Find a Sensolar dealer near you Use our interactive [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-13712","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>STORES - Sensolar New<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/sensolar.ch\/en\/our-sales-outlets\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"STORES - Sensolar New\" \/>\n<meta property=\"og:description\" content=\"Our sales outlets Sensolar: Your one-stop store for sun shading and insect screens Protect yourself from harmful UV rays and annoying insects with Sensolar&#8217;s comprehensive range of sunscreens and insect repellents. Our products are specially developed to provide long-lasting protection even under the most demanding conditions. Find a Sensolar dealer near you Use our interactive [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/sensolar.ch\/en\/our-sales-outlets\/\" \/>\n<meta property=\"og:site_name\" content=\"Sensolar New\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/sensolar.ch\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-17T09:27:39+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/sensolar.ch\\\/en\\\/our-sales-outlets\\\/\",\"url\":\"https:\\\/\\\/sensolar.ch\\\/en\\\/our-sales-outlets\\\/\",\"name\":\"STORES - Sensolar New\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sensolar.ch\\\/en\\\/#website\"},\"datePublished\":\"2023-11-15T16:10:29+00:00\",\"dateModified\":\"2026-03-17T09:27:39+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/sensolar.ch\\\/en\\\/our-sales-outlets\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/sensolar.ch\\\/en\\\/our-sales-outlets\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/sensolar.ch\\\/en\\\/our-sales-outlets\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/sensolar.ch\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"STORES\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/sensolar.ch\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/sensolar.ch\\\/en\\\/\",\"name\":\"Sensolar Sonnenschutz & Insektenschutz\",\"description\":\"Sensolar New store\",\"publisher\":{\"@id\":\"https:\\\/\\\/sensolar.ch\\\/en\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/sensolar.ch\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/sensolar.ch\\\/en\\\/#organization\",\"name\":\"LifeForce GmbH\",\"url\":\"https:\\\/\\\/sensolar.ch\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/sensolar.ch\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/sensolar.ch\\\/wp-content\\\/uploads\\\/2023\\\/11\\\/logosensolar.png\",\"contentUrl\":\"https:\\\/\\\/sensolar.ch\\\/wp-content\\\/uploads\\\/2023\\\/11\\\/logosensolar.png\",\"width\":480,\"height\":153,\"caption\":\"LifeForce GmbH\"},\"image\":{\"@id\":\"https:\\\/\\\/sensolar.ch\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/sensolar.ch\\\/\",\"https:\\\/\\\/www.instagram.com\\\/sensolar.ch\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"STORES - Sensolar New","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:\/\/sensolar.ch\/en\/our-sales-outlets\/","og_locale":"en_US","og_type":"article","og_title":"STORES - Sensolar New","og_description":"Our sales outlets Sensolar: Your one-stop store for sun shading and insect screens Protect yourself from harmful UV rays and annoying insects with Sensolar&#8217;s comprehensive range of sunscreens and insect repellents. Our products are specially developed to provide long-lasting protection even under the most demanding conditions. Find a Sensolar dealer near you Use our interactive [&hellip;]","og_url":"https:\/\/sensolar.ch\/en\/our-sales-outlets\/","og_site_name":"Sensolar New","article_publisher":"https:\/\/www.facebook.com\/sensolar.ch\/","article_modified_time":"2026-03-17T09:27:39+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/sensolar.ch\/en\/our-sales-outlets\/","url":"https:\/\/sensolar.ch\/en\/our-sales-outlets\/","name":"STORES - Sensolar New","isPartOf":{"@id":"https:\/\/sensolar.ch\/en\/#website"},"datePublished":"2023-11-15T16:10:29+00:00","dateModified":"2026-03-17T09:27:39+00:00","breadcrumb":{"@id":"https:\/\/sensolar.ch\/en\/our-sales-outlets\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/sensolar.ch\/en\/our-sales-outlets\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/sensolar.ch\/en\/our-sales-outlets\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/sensolar.ch\/en\/"},{"@type":"ListItem","position":2,"name":"STORES"}]},{"@type":"WebSite","@id":"https:\/\/sensolar.ch\/en\/#website","url":"https:\/\/sensolar.ch\/en\/","name":"Sensolar Sonnenschutz & Insektenschutz","description":"Sensolar New store","publisher":{"@id":"https:\/\/sensolar.ch\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/sensolar.ch\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/sensolar.ch\/en\/#organization","name":"LifeForce GmbH","url":"https:\/\/sensolar.ch\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/sensolar.ch\/en\/#\/schema\/logo\/image\/","url":"https:\/\/sensolar.ch\/wp-content\/uploads\/2023\/11\/logosensolar.png","contentUrl":"https:\/\/sensolar.ch\/wp-content\/uploads\/2023\/11\/logosensolar.png","width":480,"height":153,"caption":"LifeForce GmbH"},"image":{"@id":"https:\/\/sensolar.ch\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/sensolar.ch\/","https:\/\/www.instagram.com\/sensolar.ch\/"]}]}},"_links":{"self":[{"href":"https:\/\/sensolar.ch\/en\/wp-json\/wp\/v2\/pages\/13712","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sensolar.ch\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/sensolar.ch\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/sensolar.ch\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sensolar.ch\/en\/wp-json\/wp\/v2\/comments?post=13712"}],"version-history":[{"count":5,"href":"https:\/\/sensolar.ch\/en\/wp-json\/wp\/v2\/pages\/13712\/revisions"}],"predecessor-version":[{"id":44343,"href":"https:\/\/sensolar.ch\/en\/wp-json\/wp\/v2\/pages\/13712\/revisions\/44343"}],"wp:attachment":[{"href":"https:\/\/sensolar.ch\/en\/wp-json\/wp\/v2\/media?parent=13712"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}