{"id":41046,"date":"2026-09-17T14:11:34","date_gmt":"2026-09-17T12:11:34","guid":{"rendered":"https:\/\/www.rovensanext.com\/?page_id=41046"},"modified":"2026-09-30T17:29:12","modified_gmt":"2026-09-30T15:29:12","slug":"grower-survey","status":"publish","type":"page","link":"https:\/\/www.rovensanext.com\/en\/grower-survey\/","title":{"rendered":"Grower Survey"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"41046\" class=\"elementor elementor-41046\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9f066dc e-con-full e-flex e-con e-parent\" data-id=\"9f066dc\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-b7bf64b e-flex e-con-boxed e-con e-child\" data-id=\"b7bf64b\" 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-d4bc778 e-con-full e-flex e-con e-child\" data-id=\"d4bc778\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-64f1a89 elementor-widget elementor-widget-image\" data-id=\"64f1a89\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"470\" height=\"127\" src=\"https:\/\/www.rovensanext.com\/wp-content\/uploads\/2023\/04\/RovensaNextLogo.png\" class=\"attachment-large size-large wp-image-3461\" alt=\"\" srcset=\"https:\/\/www.rovensanext.com\/wp-content\/uploads\/2023\/04\/RovensaNextLogo.png 470w, https:\/\/www.rovensanext.com\/wp-content\/uploads\/2023\/04\/RovensaNextLogo-300x81.png 300w, https:\/\/www.rovensanext.com\/wp-content\/uploads\/2023\/04\/elementor\/thumbs\/RovensaNextLogo-q5fjy33byxhas64zjupwox9wt5bzfc5nk8ij2el54m.png 235w\" sizes=\"(max-width: 470px) 100vw, 470px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-bb4dd75 e-con-full e-flex e-con e-child\" data-id=\"bb4dd75\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-52c244d animated-fast elementor-invisible elementor-widget elementor-widget-heading\" data-id=\"52c244d\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeIn&quot;}\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/rovensanext.com\/en\/biosolutions-products\/\">Survey<\/a><\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-055417e animated-slow elementor-invisible elementor-widget elementor-widget-heading\" data-id=\"055417e\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:1000}\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Your opinion matters!<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-5e85ccd e-con-full e-flex e-con e-child\" data-id=\"5e85ccd\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-59caf49 e-con-full e-flex e-con e-child\" data-id=\"59caf49\" data-element_type=\"container\" data-e-type=\"container\" id=\"rn-survey-shell\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-347da6c elementor-widget elementor-widget-html\" data-id=\"347da6c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div id=\"rn-survey\" class=\"rn-s\" aria-live=\"polite\">\r\n  <noscript><p>Please enable JavaScript to complete this survey.<\/p><\/noscript>\r\n<\/div>\r\n\r\n<style>\r\n#rn-survey {\r\n  --rn-green: #006414; --rn-lime: #91DB00; --rn-muted: #57705E;\r\n  --rn-field: #F5F8F5; --rn-border: #C4DEC2; --rn-error: #AC251B;\r\n  box-sizing: border-box; width: 100%; max-width: 1340px; margin: 0 auto; padding: 24px 20px 28px;\r\n  background: #fff; color: var(--rn-green); font: 500 16px\/1.5 \"Montserrat\", Arial, sans-serif;\r\n  -webkit-font-smoothing: antialiased; text-align: left;\r\n}\r\n#rn-survey *, #rn-survey *::before, #rn-survey *::after { box-sizing: border-box; }\r\n#rn-survey [hidden] { display: none !important; }\r\n#rn-survey .rn-sr, #rn-survey .rn-hp {\r\n  position: absolute !important; width: 1px !important; height: 1px !important; margin: -1px !important;\r\n  padding: 0 !important; overflow: hidden !important; clip-path: inset(50%) !important; border: 0 !important; white-space: nowrap !important;\r\n}\r\n#rn-survey form { margin: 0; }\r\n#rn-survey fieldset { margin: 0; padding: 0; border: 0; min-width: 0; }\r\n\r\n\/* Progress *\/\r\n#rn-survey .rn-progress { margin: 0 0 30px; }\r\n#rn-survey .rn-progress-meta { display: flex; justify-content: space-between; gap: 12px; margin: 0 0 9px; font: 700 11px\/1.4 \"Montserrat\",Arial,sans-serif; color: var(--rn-muted); }\r\n#rn-survey .rn-progress-meta > span:last-child { flex-shrink: 0; white-space: nowrap; }\r\n#rn-survey .rn-progress-name { color: var(--rn-green); font-weight: 800; letter-spacing: .1em; text-transform: uppercase; }\r\n#rn-survey .rn-progress-bar { height: 3px; background: #C8D7CC; border-radius: 2px; overflow: hidden; }\r\n#rn-survey .rn-progress-bar > span { display: block; height: 3px; background: var(--rn-lime); transition: width .25s; }\r\n\r\n\/* Typography *\/\r\n#rn-survey h1, #rn-survey .rn-intro h2 {\r\n  margin: 0 0 14px; max-width: 760px; color: var(--rn-green);\r\n  font: 800 clamp(30px,10vw,30px)\/1.12 \"Montserrat\",Arial,sans-serif; letter-spacing: -.045em; outline: none;\r\n}\r\n#rn-survey .rn-label, #rn-survey .rn-summary h2 {\r\n  display: block; float: none; width: auto; margin: 0 0 9px; padding: 0;\r\n  color: var(--rn-green); font: 800 22px\/1.6 \"Montserrat\",Arial,sans-serif; letter-spacing: 0;\r\n}\r\n#rn-survey .rn-star { margin-left: 4px; color: var(--rn-lime); font: 800 26px\/1 \"Montserrat\",Arial,sans-serif; }\r\n#rn-survey :is(.rn-desc, .rn-page-lead) { margin: 0 0 16px; color: var(--rn-muted); font: 500 15px\/1.55 \"Montserrat\",Arial,sans-serif; }\r\n#rn-survey .rn-page-header { margin-bottom: 24px; }\r\n#rn-survey .rn-page-lead { max-width: 680px; margin: 0; }\r\n#rn-survey .rn-fields { display: grid; grid-template-columns: minmax(0,1fr); row-gap: 16px; }\r\n#rn-survey .rn-field { min-width: 0; margin: 0; }\r\n\r\n\/* Inputs *\/\r\n#rn-survey :is(.rn-input, .rn-country input) {\r\n  display: block; width: 100%; max-width: 100%; min-height: 58px; margin: 0; padding: 16px;\r\n  border: 1px solid var(--rn-border); border-radius: 2px; background: var(--rn-field);\r\n  color: var(--rn-green); font: 500 16px\/1.5 \"Montserrat\",Arial,sans-serif; box-shadow: none;\r\n}\r\n#rn-survey textarea.rn-input { min-height: 128px; resize: vertical; }\r\n#rn-survey :is(input,textarea)::placeholder { color: var(--rn-muted); opacity: 1; }\r\n#rn-survey select.rn-input { appearance: none; -webkit-appearance: none; padding-right: 54px; background: var(--rn-field) url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cpath d='m3 6 7 7 7-7' fill='none' stroke='%2391DB00' stroke-width='3'\/%3E%3C\/svg%3E\") no-repeat right 18px center \/ 20px 20px; }\r\n#rn-survey :is(input,select,textarea,button,a):focus-visible { outline: 3px solid var(--rn-lime); outline-offset: 3px; }\r\n#rn-survey .rn-country { position: relative; }\r\n#rn-survey .rn-country input { padding-right: 48px; }\r\n#rn-survey .rn-country::after { content: \"\"; position: absolute; right: 21px; top: 29px; width: 12px; height: 12px; border: solid var(--rn-lime); border-width: 0 3px 3px 0; transform: translateY(-75%) rotate(45deg); pointer-events: none; }\r\n#rn-survey .rn-country-list { position: absolute; z-index: 50; top: calc(100% + 4px); left: 0; right: 0; max-height: 260px; overflow-y: auto; overscroll-behavior: contain; padding: 4px; background: #fff; border: 1px solid var(--rn-border); border-radius: 2px; }\r\n#rn-survey .rn-country-option { padding: 12px; cursor: pointer; }\r\n#rn-survey .rn-country-option:is(:hover,[aria-selected=\"true\"]) { background: var(--rn-lime); }\r\n#rn-survey .rn-country-empty { padding: 12px; color: var(--rn-muted); }\r\n\r\n\/* Consent *\/\r\n#rn-survey .rn-consent { display: flex; align-items: flex-start; gap: 12px; }\r\n#rn-survey .rn-consent input { flex: 0 0 22px; width: 22px; height: 22px; margin: 2px 0 0; accent-color: var(--rn-green); }\r\n#rn-survey .rn-consent label { font: 500 14px\/1.6 \"Montserrat\",Arial,sans-serif; color: var(--rn-green); }\r\n#rn-survey .rn-consent a, #rn-survey .rn-legal a { color: inherit; text-decoration: underline; }\r\n#rn-survey .rn-consent:hover a, #rn-survey :is(.rn-consent,.rn-legal) a:is(:hover,:focus-visible) { color: var(--rn-lime); }\r\n#rn-survey .rn-legal { margin: 12px 0 0; color: var(--rn-muted); font-size: 12px; line-height: 1.5; }\r\n\r\n\/* Errors *\/\r\n#rn-survey :is(.rn-alert, .rn-msg) { padding: 14px 16px; margin: 0 0 16px; border: 1px solid var(--rn-error); border-radius: 2px; background: #FFF8F7; color: var(--rn-error); font-size: 14px; }\r\n#rn-survey .rn-msg { margin: 12px 0 0; }\r\n#rn-survey .rn-specific-group-error { margin: 0 0 16px; }\r\n#rn-survey .rn-invalid > .rn-label { color: var(--rn-error); }\r\n#rn-survey .rn-invalid :is(.rn-input, .rn-country input) { border-color: var(--rn-error); }\r\n\r\n\/* Choice cards: native inputs stay focusable, labels keep their association *\/\r\n#rn-survey .rn-grid { display: grid; grid-template-columns: minmax(0,1fr); gap: 12px; }\r\n#rn-survey .rn-choice { position: relative; min-width: 0; }\r\n#rn-survey .rn-choice > input {\r\n  position: absolute; z-index: 2; right: 16px; top: 16px; appearance: none; -webkit-appearance: none;\r\n  display: block; width: 23px; height: 23px; margin: 0; padding: 0;\r\n  border: 2px solid var(--rn-lime); border-radius: 7px; background: transparent; cursor: pointer;\r\n}\r\n#rn-survey .rn-choice > input:checked { background: var(--rn-green); border-color: var(--rn-green); }\r\n#rn-survey .rn-choice > input:checked::after { content: \"\"; position: absolute; width: 6px; height: 11px; left: 7px; top: 3px; border: solid #fff; border-width: 0 2px 2px 0; transform: rotate(45deg); }\r\n#rn-survey .rn-choice > label {\r\n  display: flex; flex-direction: column; width: 100%; min-height: 74px; height: 100%; margin: 0; padding: 16px 54px 16px 18px;\r\n  border-radius: 2px; background: var(--rn-green); color: #fff; font: 600 16px\/1.4 \"Montserrat\",Arial,sans-serif;\r\n  cursor: pointer; overflow-wrap: anywhere; transition: background-color .16s, color .16s;\r\n}\r\n#rn-survey .rn-choice > input:checked + label { background: var(--rn-lime); color: var(--rn-green); font-weight: 800; }\r\n#rn-survey .rn-choice:focus-within > label { outline: 3px solid var(--rn-lime); outline-offset: 3px; }\r\n#rn-survey .rn-choice-copy { display: block; margin-top: 8px; font-size: 13px; font-weight: 500; line-height: 1.45; }\r\n#rn-survey .rn-pest-category { display: block; margin-top: 6px; font-size: 12px; font-weight: 700; color: var(--rn-lime); text-transform: uppercase; line-height: 1.4; }\r\n#rn-survey .rn-choice > input:checked + label .rn-pest-category { color: var(--rn-green); }\r\n#rn-survey #rn-f3 .rn-choice > label { min-height: 116px; font-size: 20px; font-weight: 800; padding: 24px 56px 20px 24px; }\r\n#rn-survey #rn-f3 .rn-choice > input { top: 26px; }\r\n#rn-survey :is(#rn-f8,#rn-f22,#rn-f34,#rn-f39) .rn-choice > label { min-height: 80px; }\r\n#rn-survey .rn-specific .rn-choice > label { min-height: 82px; }\r\n\r\n\/* Navigation *\/\r\n#rn-survey .rn-nav { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 16px; margin: 28px 0 0; }\r\n#rn-survey .rn-btn {\r\n  min-height: 48px; margin: 0 0 0 auto; padding: 14px 22px; border: 0; border-radius: 2px; background: var(--rn-green); color: #fff;\r\n  font: 800 16px\/1.25 \"Montserrat\",Arial,sans-serif; text-decoration: none; cursor: pointer;\r\n}\r\n#rn-survey .rn-btn:hover { background: var(--rn-lime); color: var(--rn-green); }\r\n#rn-survey .rn-btn-link, #rn-survey .rn-btn-link:hover { margin: 0; padding-left: 0; padding-right: 0; background: transparent; color: var(--rn-green); }\r\n#rn-survey .rn-btn-link:hover { text-decoration: underline; }\r\n#rn-survey .rn-btn:disabled { cursor: wait; opacity: .7; }\r\n\r\n\/* Confirmation *\/\r\n#rn-survey .rn-summary-status { display: flex; justify-content: space-between; gap: 16px; font-size: 11px; font-weight: 800; letter-spacing: .1em; text-transform: uppercase; }\r\n#rn-survey .rn-summary-status span:last-child { color: var(--rn-muted); letter-spacing: 0; text-transform: none; }\r\n#rn-survey .rn-summary-progress { height: 3px; margin: 9px 0 30px; background: var(--rn-lime); }\r\n#rn-survey .rn-summary-lead { color: var(--rn-muted); margin: 0; }\r\n#rn-survey .rn-summary-header { display: grid; grid-template-columns: minmax(0,1fr); gap: 24px; align-items: start; }\r\n#rn-survey .rn-summary-next { padding: 24px; background: var(--rn-lime); border-radius: 2px; }\r\n#rn-survey .rn-summary-next p { margin: 0; }\r\n#rn-survey .rn-summary-section { margin-top: 32px; }\r\n#rn-survey .rn-summary-grid { display: grid; grid-template-columns: minmax(0,1fr); gap: 12px; margin: 16px 0 0; }\r\n#rn-survey .rn-summary-card { padding: 20px; background: var(--rn-field); min-width: 0; border-radius: 2px; }\r\n#rn-survey .rn-summary-card dt { margin: 0 0 8px; color: var(--rn-muted); font-size: 11px; font-weight: 800; letter-spacing: .06em; text-transform: uppercase; }\r\n#rn-survey .rn-summary-card dd { margin: 0; font-size: 16px; white-space: pre-wrap; overflow-wrap: anywhere; }\r\n#rn-survey .rn-summary-tags { display: flex; flex-wrap: wrap; gap: 10px; padding: 0; margin: 16px 0 0; list-style: none; }\r\n#rn-survey .rn-summary-tags li { max-width: 100%; padding: 12px 16px; background: var(--rn-green); color: #fff; font-size: 14px; font-weight: 600; border-radius: 2px; overflow-wrap: anywhere; }\r\n#rn-survey .rn-summary .rn-btn-link { margin-top: 24px; }\r\n\r\n@media (min-width: 700px) {\r\n  #rn-survey { padding: 38px 36px 42px; }\r\n  #rn-survey .rn-grid { grid-template-columns: repeat(2,minmax(0,1fr)); }\r\n  #rn-survey #rn-f3 .rn-choice:last-child { grid-column: 1 \/ -1; }\r\n  #rn-survey .rn-summary-grid { grid-template-columns: repeat(2,minmax(0,1fr)); }\r\n}\r\n@media (min-width: 900px) {\r\n  #rn-survey .rn-cols3 .rn-grid { grid-template-columns: repeat(3,minmax(0,1fr)); }\r\n  #rn-survey #rn-f34 .rn-grid { grid-template-columns: repeat(4,minmax(0,1fr)); }\r\n  #rn-survey #rn-f37 .rn-grid { grid-template-columns: repeat(3,minmax(0,1fr)); }\r\n  #rn-survey #rn-f39 .rn-grid { grid-template-columns: repeat(3,minmax(0,1fr)) !important; }\r\n  #rn-survey #rn-f3 .rn-choice:last-child { grid-column: auto; }\r\n  #rn-survey .rn-summary-header { grid-template-columns: repeat(2,minmax(0,1fr)); gap: 32px; }\r\n  #rn-survey .rn-summary-four { grid-template-columns: repeat(4,minmax(0,1fr)); }\r\n}\r\n@media (hover: hover) {\r\n  #rn-survey .rn-choice:hover > label { background: var(--rn-lime); color: var(--rn-green); }\r\n  #rn-survey .rn-choice:hover > input { border-color: var(--rn-green); }\r\n  #rn-survey .rn-choice:hover .rn-pest-category { color: var(--rn-green); }\r\n}\r\n@media (prefers-reduced-motion: reduce) { #rn-survey * { transition: none !important; } }\r\n\r\n@media (max-width: 699px) {\r\n  #rn-survey .rn-fields { row-gap: 24px; }\r\n  #rn-survey .rn-label, #rn-survey .rn-summary h2 {\r\n    padding: 8px 0 0 0;\r\n    font: 800 22px \/ 1.2 \"Montserrat\", Arial, sans-serif;\r\n  }\r\n  #rn-survey .rn-intro h2 {\r\n    font: 800 clamp(22px, 10vw, 22px) \/ 1.12 \"Montserrat\", Arial, sans-serif;\r\n  }\r\n  #rn-survey .rn-choice > label,\r\n  #rn-survey #rn-f3 .rn-choice > label,\r\n  #rn-survey :is(#rn-f8,#rn-f22,#rn-f34,#rn-f39) .rn-choice > label,\r\n  #rn-survey .rn-specific .rn-choice > label {\r\n    min-height: 58px; justify-content: center; text-align: left;\r\n    padding: 16px 54px 16px 16px;\r\n  }\r\n  #rn-survey .rn-choice > input,\r\n  #rn-survey #rn-f3 .rn-choice > input {\r\n    top: 50%; transform: translateY(-50%);\r\n  }\r\n}\r\n\r\n\/* Other - Specific Challenges \/ Relevant Areas: 3 columns on desktop. *\/\r\n@media (min-width: 900px) {\r\n  #rn-survey .rn-page[data-page=\"4\"] .rn-field:not(.rn-specific) > .rn-grid {\r\n    grid-template-columns: repeat(3, minmax(0, 1fr)) !important;\r\n  }\r\n}\r\n\r\n\r\n<\/style>\r\n\r\n\r\n\r\n<script>\r\n\/* Rovensa Next Survey 25: live schema, local navigation, existing REST submission. *\/\r\n(() => {\r\n  'use strict';\r\n  const root = document.getElementById('rn-survey');\r\n  if (!root || root.dataset.ready) return;\r\n  root.dataset.ready = '1';\r\n\r\n  const ENDPOINT = '\/wp-json\/rovensa\/v1\/survey';\r\n  const SITEKEY = '6LcZPdsmAAAAAGrFqlzPVwGqPZF8_aTpSrkPyA28';\r\n  const TTL = 30 * 60 * 1000;\r\n  const SCHEMA_ENDPOINT = ENDPOINT + '\/schema';\r\n  let schema, FIELDS = [], PAGES = 1, KEY = '', SUBMIT_LABEL = 'Submit';\r\n  const G = 'Grower', D = 'Distributor', O = 'Other';\r\n  const THREE_COLS = [3, 18, 20, 8, 30, 32, 33, 22, 34, 11, 12, 27, 28];\r\n\r\n  function checkSchema(data) {\r\n    if (data.protocol !== 1 || data.formId !== 25 || !Array.isArray(data.fields) ||\r\n        !data.fields.length || !Number.isInteger(data.pageCount) || data.pageCount < 1 ||\r\n        typeof data.version !== 'string') throw new Error('Invalid form definition.');\r\n    const ids = new Set(data.fields.map(f => String(f.id)));\r\n    if (ids.size !== data.fields.length) throw new Error('Duplicate field IDs.');\r\n    const supported = ['radio', 'checkbox', 'select', 'text', 'email', 'textarea', 'consent', 'html', 'section'];\r\n    for (const f of data.fields) {\r\n      if (!supported.includes(f.type) || f.page < 1 || f.page > data.pageCount || !Array.isArray(f.choices)) {\r\n        throw new Error('Unsupported field configuration.');\r\n      }\r\n      for (const [id, op] of f.show?.rules || []) {\r\n        if (!ids.has(String(id)) || !['is', 'isnot', 'contains', 'starts_with', 'ends_with', 'greater_than', 'less_than'].includes(op)) {\r\n          throw new Error('Unsupported field dependency.');\r\n        }\r\n      }\r\n    }\r\n    const visited = new Set(), active = new Set();\r\n    function visit(f) {\r\n      if (active.has(f.id)) throw new Error('Circular field dependency.');\r\n      if (visited.has(f.id)) return;\r\n      active.add(f.id);\r\n      for (const [id] of f.show?.rules || []) visit(data.fields.find(x => String(x.id) === String(id)));\r\n      active.delete(f.id); visited.add(f.id);\r\n    }\r\n    data.fields.forEach(visit);\r\n  }\r\n\r\n  async function fetchSchema() {\r\n    const controller = new AbortController();\r\n    const timer = setTimeout(() => controller.abort(), 15000);\r\n    try {\r\n      const response = await fetch(SCHEMA_ENDPOINT + '?v=' + Date.now(), {\r\n        cache: 'no-store', credentials: 'same-origin', signal: controller.signal\r\n      });\r\n      if (!response.ok) throw new Error('Form definition unavailable.');\r\n      const data = await response.json();\r\n      checkSchema(data);\r\n      return data;\r\n    } finally { clearTimeout(timer); }\r\n  }\r\n\r\n  function applySchema(data) {\r\n    schema = data;\r\n    PAGES = data.pageCount;\r\n    SUBMIT_LABEL = data.submitLabel || 'Submit';\r\n    KEY = 'rn-survey-25-sync-' + data.version;\r\n    FIELDS = data.fields.map(f => ({ ...f,\r\n      type: f.id === 5 && f.type === 'select' ? 'country' : f.type,\r\n      specific: [11, 12, 27, 28, 29].includes(f.id),\r\n      autocomplete: ({14: 'given-name', 25: 'family-name', 15: 'email', 16: 'organization'})[f.id],\r\n      legal: f.type === 'consent' ? f.desc : undefined,\r\n      srLabel: f.id === 3 && data.fields.some(intro => intro.type === 'html' && intro.page === f.page &&\r\n        !intro.show && [...new DOMParser().parseFromString(intro.html, 'text\/html').querySelectorAll('h1,h2,h3')]\r\n          .some(h => h.textContent.trim() === f.label.trim())),\r\n      \/\/ Extra visual copy is tied to stable values, never to option positions.\r\n      copy: f.choices.map(c => ({\r\n        Grower: 'I grow crops or manage a farm.',\r\n        Distributor: 'I sell, distribute or support agricultural products.',\r\n        Other: 'Advisor, researcher, raw-material producer, association, media, student or another profile.',\r\n        'mainly-biological-products': 'Biosolutions are central to my approach.',\r\n        'conventional-and-biological': 'I combine both approaches.',\r\n        'only-conventional-products': 'I am not currently using biological products.'\r\n      })[c.value] || '')\r\n    }));\r\n  }\r\n\r\n  function cleanValues(values, changed = false) {\r\n    const cleaned = {};\r\n    for (const f of FIELDS) {\r\n      if (['html', 'section'].includes(f.type)) continue;\r\n      let v = Array.isArray(values?.[f.id]) ? values[f.id].filter(x => typeof x === 'string') : [];\r\n      if (f.type === 'consent') v = changed ? [] : v.filter(x => x === '1');\r\n      else if (['radio', 'checkbox', 'select', 'country'].includes(f.type)) v = v.filter(x => f.choices.some(c => c.value === x));\r\n      if (f.type !== 'checkbox') v = v.slice(0, 1);\r\n      cleaned[f.id] = v;\r\n    }\r\n    return cleaned;\r\n  }\r\n\r\n  function defaultValues() {\r\n    const values = {};\r\n    for (const f of FIELDS) {\r\n      values[f.id] = f.type === 'consent' ? [] : f.choices.length\r\n        ? f.choices.filter(c => c.selected).map(c => c.value)\r\n        : f.defaultValue ? [f.defaultValue] : [];\r\n    }\r\n    return cleanValues(values);\r\n  }\r\n\r\n  \/\/ Definition printed in <head> by functions.php (instant render); REST is the fallback.\r\n  function inlineSchema() {\r\n    try {\r\n      const data = JSON.parse(document.getElementById('rn-survey-schema')?.textContent || 'null');\r\n      if (!data) return null;\r\n      checkSchema(data);\r\n      return data;\r\n    } catch (error) {\r\n      console.warn('Survey inline definition ignored:', error);\r\n      return null;\r\n    }\r\n  }\r\n\r\n  \/\/ Step 1 shown instantly while the live definition loads in the background.\r\n  \/\/ It is replaced by the Gravity Forms definition as soon as that arrives.\r\n  const PREVIEW = {\r\n    preview: true, formId: 25, protocol: 1, version: 'preview', pageCount: 5, submitLabel: 'Submit',\r\n    pageNames: ['Profile', 'Current situation', 'Context', 'Specific challenges \/ relevant areas', 'Contact details'],\r\n    pageButtons: Array.from({length: 5}, () => ({next: 'Next', back: 'Back'})),\r\n    fields: [\r\n      {id: 2, page: 1, type: 'html', req: false, label: 'Introduction', desc: '', placeholder: '', defaultValue: '', maxLength: 0, choices: [], show: null,\r\n       html: '<div class=\"rn-gf-intro\"><h2>Which profile describes you best?<\/h2><\/div>'},\r\n      {id: 3, page: 1, type: 'radio', req: true, label: 'Which profile describes you best?', desc: '', html: '', placeholder: '', defaultValue: '', maxLength: 0, show: null,\r\n       choices: [G, D, O].map(value => ({value, text: value, selected: false}))}\r\n    ]\r\n  };\r\n  let previewTouched = false, pendingNext = false;\r\n\r\n  function start(data, carried = null) {\r\n    applySchema(data);\r\n    state = {at: Date.now(), page: 1, values: defaultValues()};\r\n    if (carried) {\r\n      \/\/ Answers given on the preview step win over any older draft.\r\n      const kept = cleanValues(carried);\r\n      Object.keys(kept).forEach(id => { if (kept[id].length) state.values[id] = kept[id]; });\r\n    } else if (!data.preview) {\r\n      try {\r\n        const saved = JSON.parse(sessionStorage.getItem(KEY) || 'null');\r\n        if (saved && Date.now() - saved.at >= 0 && Date.now() - saved.at < TTL) {\r\n          state.values = cleanValues(saved.values);\r\n          state.page = Number.isInteger(saved.page) ? Math.max(1, Math.min(PAGES, saved.page)) : 1;\r\n        }\r\n      } catch (_) { \/* Storage is optional. *\/ }\r\n    }\r\n    renderForm();\r\n  }\r\n\r\n  async function initialise(fresh = false) {\r\n    const embedded = fresh ? null : inlineSchema();\r\n    previewTouched = pendingNext = false;\r\n    try {\r\n      if (embedded) return start(embedded);\r\n      if (fresh) root.replaceChildren(el('p', {role: 'status', text: 'Loading survey...'}));\r\n      else start(PREVIEW);\r\n      const data = await fetchSchema();\r\n      const focusedId = root.contains(document.activeElement) ? document.activeElement.id : '';\r\n      const goNext = pendingNext;\r\n      start(data, previewTouched ? state.values : null);\r\n      if (focusedId) document.getElementById(focusedId)?.focus({preventScroll: true});\r\n      if (goNext && validatePageSilently(1)) goTo(2);\r\n    } catch (error) {\r\n      console.error('Survey initialisation:', error);\r\n      const retry = el('button', {type: 'button', class: 'rn-btn', text: 'Retry'});\r\n      retry.addEventListener('click', () => initialise(true), {once: true});\r\n      root.replaceChildren(el('div', {class: 'rn-alert', role: 'alert', text: 'The survey could not be loaded. Please try again.'}), retry);\r\n    }\r\n  }\r\n\r\n  const byId = id => FIELDS.find(f => String(f.id) === String(id));\r\n  let state = {at: Date.now(), page: 1, values: {}};\r\n  const persist = () => { if (schema?.preview) return; state.at = Date.now(); try { sessionStorage.setItem(KEY, JSON.stringify(state)); } catch (_) {} };\r\n  const profile = () => (state.values[3] || [])[0] || '';\r\n  const visible = f => {\r\n    if (!f.show) return true;\r\n    const results = f.show.rules.map(([id, op, value]) => {\r\n      const source = byId(id);\r\n      const vals = source && visible(source) ? state.values[id] || [] : [];\r\n      const equal = value === '' ? !vals.length : vals.includes(value);\r\n      if (op === 'is') return equal;\r\n      if (op === 'isnot') return !equal;\r\n      if (op === 'contains') return vals.some(v => v.includes(value));\r\n      if (op === 'starts_with') return vals.some(v => v.startsWith(value));\r\n      if (op === 'ends_with') return vals.some(v => v.endsWith(value));\r\n      return vals.some(v => v.trim() !== '' && Number.isFinite(Number(v)) && Number.isFinite(Number(value)) &&\r\n        (op === 'greater_than' ? Number(v) > Number(value) : Number(v) < Number(value)));\r\n    });\r\n    const match = f.show.any ? results.some(Boolean) : results.every(Boolean);\r\n    return f.show.hide ? !match : match;\r\n  };\r\n\r\n  const ROUTES = {\r\n    Grower: [['Tell us about your growing context.', 'This helps us understand your crop profile and the main challenges you are currently facing.'],\r\n             ['How do you currently approach biosolutions?', 'This helps us understand your current approach and your relationship with Rovensa Next.'],\r\n             ['Which specific challenges are you currently facing?', 'Select all that apply. We\u2019ll only show the challenges related to the categories you selected earlier.']],\r\n    Distributor: [['Tell us about your distributor context.', 'This helps us understand the growers, crop markets and customer challenges you support.'],\r\n                  ['How do you support your customers?', 'This helps us identify the most relevant commercial and technical support.'],\r\n                  ['Which specific challenges are your customers currently facing?', 'Select all that apply. We\u2019ll only show the challenges related to the categories you selected earlier.']],\r\n    Other: [['Tell us about your organisation context.', 'This helps us understand your organisation and relationship with agriculture.'],\r\n            ['What would be most useful to you?', 'This helps us tailor the information we share next.'],\r\n            ['Which areas are most relevant to you?', 'Select all that apply. Choose the areas that are most relevant to you.']]\r\n  };\r\n  const CONTACT = ['Tell us how we can stay in touch.', 'Add your contact details so Rovensa Next can follow up when relevant.'];\r\n  const NEXT_COPY = 'When relevant, your information may be shared with the appropriate Rovensa Next team for local follow-up.';\r\n\r\n\r\n  const answers = id => {\r\n    const f = byId(id);\r\n    if (!f || !visible(f)) return [];\r\n    return (state.values[id] || []).map(v => f.choices.find(c => c.value === v)?.text || v).filter(Boolean);\r\n  };\r\n\r\n  \/* ---------- DOM helpers ---------- *\/\r\n  const el = (tag, attrs = {}, ...children) => {\r\n    const node = document.createElement(tag);\r\n    Object.entries(attrs).forEach(([k, v]) => {\r\n      if (v === false || v == null) return;\r\n      if (k === 'class') node.className = v;\r\n      else if (k === 'text') node.textContent = v;\r\n      else if (k === 'html') node.innerHTML = v; \/\/ HTML sanitised by WordPress in the schema endpoint\r\n      else node.setAttribute(k, v === true ? '' : v);\r\n    });\r\n    children.flat().forEach(c => c != null && node.append(c));\r\n    return node;\r\n  };\r\n  const star = () => el('span', { class: 'rn-star', 'aria-hidden': 'true', text: '*' });\r\n  const $$ = (sel, scope = root) => [...scope.querySelectorAll(sel)];\r\n\r\n  \/* ---------- Rendering ---------- *\/\r\n  function renderChoices(f) {\r\n    const type = f.type === 'radio' ? 'radio' : 'checkbox';\r\n    return el('div', { class: 'rn-grid' }, f.choices.map((c, i) => {\r\n      const id = `rn-c${f.id}-${i}`;\r\n      const label = el('label', { for: id });\r\n      const parts = f.id === 12 ? c.text.split(\/\\s+[\u2014\u2013]\\s+\/) : [c.text];\r\n      if (parts.length > 1) label.append(el('span', { text: parts.slice(1).join(' ') }), el('span', { class: 'rn-pest-category', text: parts[0] }));\r\n      else label.append(c.text);\r\n      if (f.copy?.[i]) label.append(el('span', { class: 'rn-choice-copy', text: f.copy[i] }));\r\n      return el('div', { class: 'rn-choice' },\r\n        el('input', { type, id, name: `f${f.id}`, value: c.value, 'data-field': f.id }), label);\r\n    }));\r\n  }\r\n\r\n  function renderCountry(f) {\r\n    const select = el('select', { name: `f${f.id}`, 'data-field': f.id, class: 'rn-sr', tabindex: '-1', 'aria-hidden': 'true' },\r\n      el('option', { value: '', text: 'Select your country \/ market' }), f.choices.map(c => el('option', { value: c.value, text: c.text })));\r\n    const input = el('input', { id: `rn-i${f.id}`, type: 'text', autocomplete: 'off', spellcheck: 'false', placeholder: 'Search country \/ market',\r\n      role: 'combobox', 'aria-autocomplete': 'list', 'aria-expanded': 'false', 'aria-controls': 'rn-country-list', 'aria-required': 'true' });\r\n    const list = el('div', { id: 'rn-country-list', class: 'rn-country-list', role: 'listbox', 'aria-label': 'Countries \/ markets', hidden: true });\r\n    const status = el('span', { class: 'rn-sr', role: 'status' });\r\n    const box = el('div', { class: 'rn-country' }, input, list, status, select);\r\n    const norm = s => s.normalize('NFD').replace(\/[\\u0300-\\u036f]\/g, '').toLowerCase();\r\n    let results = [], active = -1;\r\n    const sync = () => { input.value = f.choices.find(c => c.value === select.value)?.text || ''; };\r\n    const close = () => { list.hidden = true; input.setAttribute('aria-expanded', 'false'); input.removeAttribute('aria-activedescendant'); sync(); };\r\n    const highlight = i => {\r\n      active = i;\r\n      [...list.children].forEach((n, j) => n.setAttribute('aria-selected', String(j === i)));\r\n      const node = list.children[i];\r\n      if (node && results.length) { input.setAttribute('aria-activedescendant', node.id); node.scrollIntoView({ block: 'nearest' }); }\r\n    };\r\n    const commit = i => {\r\n      if (!results[i]) return;\r\n      select.value = results[i].value;\r\n      select.dispatchEvent(new Event('change', { bubbles: true }));\r\n      close();\r\n    };\r\n    const open = (q = '') => {\r\n      results = f.choices.filter(c => norm(c.text).includes(norm(q)));\r\n      active = -1;\r\n      list.replaceChildren(...(results.length ? results.map((c, i) => {\r\n        const opt = el('div', { id: `rn-co-${i}`, class: 'rn-country-option', role: 'option', 'aria-selected': 'false', text: c.text });\r\n        opt.addEventListener('mousedown', e => e.preventDefault());\r\n        opt.addEventListener('click', () => commit(i));\r\n        return opt;\r\n      }) : [el('div', { class: 'rn-country-empty', text: 'No matching countries.' })]));\r\n      status.textContent = `${results.length} matching countries.`;\r\n      list.hidden = false; input.setAttribute('aria-expanded', 'true');\r\n    };\r\n    input.addEventListener('focus', () => { open(); input.select(); });\r\n    input.addEventListener('click', () => { if (list.hidden) open(); });\r\n    input.addEventListener('input', () => open(input.value));\r\n    input.addEventListener('keydown', e => {\r\n      if (e.key === 'Tab') return close();\r\n      if (!['ArrowDown', 'ArrowUp', 'Enter', 'Escape'].includes(e.key)) return;\r\n      e.preventDefault();\r\n      if (e.key === 'Escape') return close();\r\n      if (e.key === 'Enter') return list.hidden ? open(input.value) : commit(active < 0 && results.length === 1 ? 0 : active);\r\n      if (list.hidden) open(input.value);\r\n      highlight(Math.max(0, Math.min(results.length - 1, active + (e.key === 'ArrowDown' ? 1 : -1))));\r\n    });\r\n    box.addEventListener('focusout', () => setTimeout(() => { if (!box.contains(document.activeElement)) close(); }, 0));\r\n    select.addEventListener('change', sync);\r\n    box.sync = sync;\r\n    return box;\r\n  }\r\n\r\n  function renderField(f) {\r\n    if (f.type === 'html' || f.type === 'section') {\r\n      return el('div', {id: `rn-f${f.id}`, class: 'rn-field rn-static' + (f.page === 1 ? ' rn-intro' : '')},\r\n        f.type === 'html' ? el('div', {html: f.html}) : el('h2', {text: f.label}),\r\n        f.desc ? el('div', {class: 'rn-desc', html: f.desc}) : null);\r\n    }\r\n    const invalidId = `rn-e${f.id}`;\r\n    const classes = ['rn-field', f.specific && 'rn-specific', THREE_COLS.includes(f.id) && 'rn-cols3'].filter(Boolean).join(' ');\r\n    if (f.type === 'radio' || f.type === 'checkbox') {\r\n      return el('fieldset', { id: `rn-f${f.id}`, class: classes, 'aria-describedby': invalidId },\r\n        el('legend', { class: f.srLabel ? 'rn-sr' : 'rn-label' }, el('span', { class: 'rn-label-text', text: f.label }), f.req ? star() : null),\r\n        f.desc ? el('div', { class: 'rn-desc', html: f.desc }) : null,\r\n        renderChoices(f), el('div', { id: invalidId, class: 'rn-msg', hidden: true }));\r\n    }\r\n    if (f.type === 'consent') {\r\n      const id = `rn-i${f.id}`;\r\n      return el('fieldset', { id: `rn-f${f.id}`, class: classes },\r\n        el('legend', { class: 'rn-sr', text: f.label }),\r\n        el('div', { class: 'rn-consent' },\r\n          el('input', { type: 'checkbox', id, name: `f${f.id}`, value: '1', 'data-field': f.id, 'aria-required': f.req ? 'true' : false, 'aria-describedby': invalidId }),\r\n          el('label', { for: id }, el('span', { html: f.html }), f.req ? star() : null)),\r\n        f.legal ? el('div', { class: 'rn-legal', html: f.legal }) : null,\r\n        el('div', { id: invalidId, class: 'rn-msg', hidden: true }));\r\n    }\r\n    const id = `rn-i${f.id}`;\r\n    let control;\r\n    if (f.type === 'country') control = renderCountry(f);\r\n    else if (f.type === 'select') control = el('select', { id, class: 'rn-input', name: `f${f.id}`, 'data-field': f.id, 'aria-required': f.req ? 'true' : false, 'aria-describedby': invalidId },\r\n      el('option', { value: '', text: f.placeholder }), f.choices.map(c => el('option', { value: c.value, text: c.text })));\r\n    else if (f.type === 'textarea') control = el('textarea', { id, class: 'rn-input', name: `f${f.id}`, 'data-field': f.id, placeholder: f.placeholder, maxlength: f.maxLength || null, rows: '5', 'aria-describedby': invalidId });\r\n    else control = el('input', { id, class: 'rn-input', type: f.type, name: `f${f.id}`, 'data-field': f.id, placeholder: f.placeholder,\r\n      autocomplete: f.autocomplete, maxlength: f.maxLength || null, 'aria-required': f.req ? 'true' : false, 'aria-describedby': invalidId });\r\n    return el('div', { id: `rn-f${f.id}`, class: classes },\r\n      el('label', { class: 'rn-label', for: id }, el('span', { class: 'rn-label-text', text: f.label }), f.req ? star() : null),\r\n      f.desc ? el('div', {class: 'rn-desc', html: f.desc}) : null,\r\n      control, el('div', { id: invalidId, class: 'rn-msg', hidden: true }));\r\n  }\r\n\r\n  let form, progressName, progressStep, progressBar, alertBox, pages = [];\r\n\r\n  function renderForm() {\r\n    progressName = el('span', { class: 'rn-progress-name' });\r\n    progressStep = el('span');\r\n    progressBar = el('span');\r\n    alertBox = el('div', { class: 'rn-alert', role: 'alert', hidden: true });\r\n    pages = [];\r\n    for (let p = 1; p <= PAGES; p++) {\r\n      const header = el('div', {class: 'rn-page-header'},\r\n        el('h1', {tabindex: '-1'}), el('p', {class: 'rn-page-lead'}));\r\n      const nav = el('div', { class: 'rn-nav' },\r\n        p > 1 ? el('button', { type: 'button', class: 'rn-btn rn-btn-link', 'data-go': p - 1, text: schema.pageButtons[p - 1]?.back || 'Back' }) : null,\r\n        p < PAGES ? el('button', { type: 'button', class: 'rn-btn', 'data-go': p + 1, text: schema.pageButtons[p - 1]?.next || 'Next' })\r\n                  : el('button', { type: 'submit', class: 'rn-btn rn-submit', text: SUBMIT_LABEL }));\r\n      pages.push(el('section', { class: 'rn-page', 'data-page': p, hidden: true }, header,\r\n        el('div', { class: 'rn-fields' },\r\n          p === 4 ? el('div', { id: 'rn-specific-challenge-error', class: 'rn-msg rn-specific-group-error', role: 'alert', hidden: true }) : null,\r\n          FIELDS.filter(f => f.page === p).map(renderField)), nav));\r\n    }\r\n    const honeypot = el('div', { class: 'rn-hp', 'aria-hidden': 'true' },\r\n      el('label', { for: 'rn-website', text: 'Website' }), el('input', { id: 'rn-website', name: 'website', type: 'text', tabindex: '-1', autocomplete: 'off' }));\r\n    form = el('form', { novalidate: true },\r\n      el('div', { class: 'rn-progress' }, el('p', { class: 'rn-progress-meta' }, progressName, progressStep),\r\n        el('div', { class: 'rn-progress-bar', 'aria-hidden': 'true' }, progressBar)),\r\n      alertBox, pages, honeypot);\r\n    root.replaceChildren(form);\r\n    restoreControls();\r\n    form.addEventListener('change', onChange);\r\n    form.addEventListener('input', onChange);\r\n    form.addEventListener('click', e => {\r\n      const btn = e.target.closest('[data-go]');\r\n      if (!btn) return;\r\n      const target = Number(btn.dataset.go);\r\n      if (target > state.page && !validatePage(state.page)) return;\r\n      \/\/ Preview step: wait quietly for the live definition, then continue automatically.\r\n      if (schema.preview) { pendingNext = true; btn.disabled = true; return; }\r\n      goTo(target);\r\n    });\r\n    form.addEventListener('submit', onSubmit);\r\n    \/\/ Restored drafts must not skip newly required or invalid earlier answers.\r\n    for (let p = 1; p < state.page; p++) {\r\n      if (!validatePageSilently(p)) { state.page = p; break; }\r\n    }\r\n    goTo(state.page, false);\r\n  }\r\n\r\n  function restoreControls() {\r\n    $$('[data-field]', form).forEach(input => {\r\n      const vals = state.values[input.dataset.field] || [];\r\n      if (input.type === 'radio' || input.type === 'checkbox') input.checked = vals.includes(input.value);\r\n      else input.value = vals[0] || '';\r\n    });\r\n    form.querySelector('.rn-country')?.sync();\r\n  }\r\n\r\n  function readField(id) {\r\n    const inputs = $$(`[data-field=\"${id}\"]`, form);\r\n    if (!inputs.length) return [];\r\n    if (inputs[0].type === 'radio' || inputs[0].type === 'checkbox') return inputs.filter(i => i.checked).map(i => i.value);\r\n    const v = inputs[0].value.trim();\r\n    return v ? [v] : [];\r\n  }\r\n\r\n  function onChange(e) {\r\n    const id = Number(e.target.dataset?.field);\r\n    if (!id) return;\r\n    if (schema.preview) previewTouched = true;\r\n    state.values[id] = readField(id);\r\n    clearError(id);\r\n    refresh();\r\n    const groupError = document.getElementById('rn-specific-challenge-error');\r\n    if (groupError && !missingSpecificChallengeField(4)) groupError.hidden = true;\r\n    persist();\r\n  }\r\n\r\n  function refresh() {\r\n    FIELDS.forEach(f => { document.getElementById(`rn-f${f.id}`).hidden = !visible(f); });\r\n    const route = ROUTES[profile()] || ROUTES.Grower;\r\n    const copy = [null, ...route, CONTACT];\r\n    pages.forEach((page, i) => {\r\n      const p = i + 1;\r\n      const hasHtmlHeading = FIELDS.some(f => f.page === p && ['html', 'section'].includes(f.type) && visible(f) &&\r\n        document.getElementById(`rn-f${f.id}`).querySelector('h1,h2,h3'));\r\n      const header = page.querySelector('.rn-page-header');\r\n      header.hidden = hasHtmlHeading;\r\n      header.querySelector('h1').textContent = PAGES === 5 && copy[i] ? copy[i][0] : schema.pageNames[i] || 'Survey';\r\n      header.querySelector('.rn-page-lead').textContent = PAGES === 5 && copy[i] ? copy[i][1] : '';\r\n    });\r\n    const name = schema.pageNames[state.page - 1] || 'Survey';\r\n    progressName.textContent = (state.page > 1 && profile() ? `${profile()} \u00b7 ` : '') + name;\r\n    progressStep.textContent = `Step ${state.page} of ${PAGES}`;\r\n    progressBar.style.width = `${(state.page \/ PAGES) * 100}%`;\r\n  }\r\n\r\n  function goTo(page, focus = true) {\r\n    state.page = Math.min(Math.max(1, page), PAGES);\r\n    pages.forEach((p, i) => { p.hidden = i + 1 !== state.page; });\r\n    alertBox.hidden = true;\r\n    refresh();\r\n    persist();\r\n    if (!focus) return;\r\n    if (root.getBoundingClientRect().top < 0) root.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n    const pageNode = pages[state.page - 1];\r\n    const heading = [...pageNode.querySelectorAll('h1,h2,h3')].find(h => !h.closest('[hidden]'));\r\n    if (heading) { heading.setAttribute('tabindex', '-1'); heading.focus({preventScroll: true}); }\r\n  }\r\n\r\n  \/* ---------- Validation ---------- *\/\r\n  function setError(id, message) {\r\n    const wrap = document.getElementById(`rn-f${id}`);\r\n    const msg = document.getElementById(`rn-e${id}`);\r\n    wrap.classList.add('rn-invalid');\r\n    msg.textContent = message; msg.hidden = false;\r\n    $$('[data-field], input[role=\"combobox\"]', wrap).forEach(i => i.setAttribute('aria-invalid', 'true'));\r\n  }\r\n  function clearError(id) {\r\n    const wrap = document.getElementById(`rn-f${id}`);\r\n    if (!wrap?.classList.contains('rn-invalid')) return;\r\n    wrap.classList.remove('rn-invalid');\r\n    document.getElementById(`rn-e${id}`).hidden = true;\r\n    $$('[aria-invalid]', wrap).forEach(i => i.removeAttribute('aria-invalid'));\r\n  }\r\n  const SPECIFIC_CHALLENGE_CATEGORIES = [\r\n    [11, 'Climate and Abiotic Stress'],\r\n    [12, 'Pest and Disease Pressure'],\r\n    [27, 'Soil degradation and nutrient inefficiency'],\r\n    [28, 'pressure-on-yields-quality-and-profitability'],\r\n    [29, 'inefficient-use-of-resources']\r\n  ];\r\n  function missingSpecificChallengeField(page) {\r\n    if (page !== 4 || !['Grower', 'Distributor'].includes(profile())) return null;\r\n    const selectedCategories = readField(20);\r\n    if (!selectedCategories.length) return null;\r\n    const shownCategories = SPECIFIC_CHALLENGE_CATEGORIES\r\n      .filter(([id, value]) => selectedCategories.includes(value) && byId(id) && visible(byId(id)));\r\n    if (shownCategories.some(([id]) => readField(id).length)) return null;\r\n    return shownCategories[0]?.[0] || null;\r\n  }\r\n  function validatePage(page) {\r\n    let first = null;\r\n    const groupError = document.getElementById('rn-specific-challenge-error');\r\n    if (page === 4 && groupError) groupError.hidden = true;\r\n    FIELDS.filter(f => f.page === page).forEach(f => {\r\n      clearError(f.id);\r\n      if (!visible(f) || ['html', 'section'].includes(f.type)) return;\r\n      const vals = readField(f.id);\r\n      let message = '';\r\n      if (f.maxLength && vals.some(v => v.length > f.maxLength)) message = `Please use no more than ${f.maxLength} characters.`;\r\n      else if (f.req && !vals.length) message = 'This field is required.';\r\n      else if (f.type === 'email' && vals.length && !\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$\/.test(vals[0])) message = 'Please enter a valid email address.';\r\n      if (message) { setError(f.id, message); first = first || f; }\r\n    });\r\n    if (!first) {\r\n      const missingId = missingSpecificChallengeField(page);\r\n      if (missingId) {\r\n        groupError.textContent = 'Please select at least one specific challenge across the categories shown.';\r\n        groupError.hidden = false;\r\n        first = byId(missingId);\r\n      }\r\n    }\r\n    if (first) {\r\n      const wrap = document.getElementById(`rn-f${first.id}`);\r\n      (groupError && !groupError.hidden ? groupError : wrap).scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n      (wrap.querySelector('input[role=\"combobox\"]') || wrap.querySelector('[data-field]'))?.focus({ preventScroll: true });\r\n    }\r\n    return !first;\r\n  }\r\n\r\n  \/* ---------- reCAPTCHA v3 (loaded lazily, on first interaction) ---------- *\/\r\n  let recaptcha;\r\n  const loadRecaptcha = () => recaptcha || (recaptcha = new Promise(resolve => {\r\n    const s = el('script', { src: `https:\/\/www.google.com\/recaptcha\/api.js?render=${SITEKEY}`, async: true });\r\n    s.onload = () => window.grecaptcha.ready(() => resolve(window.grecaptcha));\r\n    s.onerror = () => resolve(null);\r\n    document.head.append(s);\r\n  }));\r\n  root.addEventListener('pointerdown', loadRecaptcha, { once: true });\r\n  root.addEventListener('focusin', loadRecaptcha, { once: true });\r\n  const getToken = async () => {\r\n    try {\r\n      const g = await Promise.race([loadRecaptcha(), new Promise(r => setTimeout(() => r(null), 8000))]);\r\n      return g ? await g.execute(SITEKEY, { action: 'submit' }) : '';\r\n    } catch (_) { return ''; }\r\n  };\r\n\r\n  \/* ---------- Submission ---------- *\/\r\n  async function onSubmit(e) {\r\n    e.preventDefault();\r\n    if (form.querySelector('.rn-submit').disabled) return;\r\n    FIELDS.forEach(f => { if (!['html', 'section'].includes(f.type)) state.values[f.id] = readField(f.id); });\r\n    for (let p = 1; p <= PAGES; p++) {\r\n      if (!validatePageSilently(p)) { goTo(p); validatePage(p); return; }\r\n    }\r\n    const button = form.querySelector('.rn-submit');\r\n    button.disabled = true; button.textContent = 'Sending\u2026';\r\n    const payload = { schemaVersion: schema.version, answers: {}, website: form.querySelector('#rn-website').value, recaptcha: await getToken() };\r\n    FIELDS.forEach(f => { if (visible(f) && (state.values[f.id] || []).length) payload.answers[f.id] = state.values[f.id]; });\r\n    try {\r\n      const res = await fetch(ENDPOINT, { method: 'POST', headers: { 'Content-Type': 'application\/json' }, body: JSON.stringify(payload), credentials: 'same-origin' });\r\n      const data = await res.json().catch(() => ({}));\r\n      if (res.status === 409 && data.code === 'schema_changed') {\r\n        const oldValues = state.values;\r\n        const oldKey = KEY;\r\n        applySchema(await fetchSchema());\r\n        state = {at: Date.now(), page: 1, values: cleanValues(oldValues, true)};\r\n        try { sessionStorage.removeItem(oldKey); } catch (_) {}\r\n        renderForm();\r\n        alertBox.textContent = 'The survey has been updated. Please review your answers and confirm your consent again before submitting.';\r\n        alertBox.hidden = false;\r\n        return;\r\n      }\r\n      if (res.ok && data.ok) return renderSummary();\r\n      const errors = data.errors || {};\r\n      const ids = Object.keys(errors).map(Number).filter(id => byId(id));\r\n      if (ids.length) {\r\n        goTo(Math.min(...ids.map(id => byId(id).page)));\r\n        ids.forEach(id => setError(id, errors[id]));\r\n      }\r\n      alertBox.textContent = data.message || 'There was a problem with your submission. Please review the fields below.';\r\n      alertBox.hidden = false;\r\n      alertBox.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n    } catch (_) {\r\n      alertBox.textContent = 'We could not send your response. Please check your connection and try again.';\r\n      alertBox.hidden = false;\r\n    } finally {\r\n      button.disabled = false; button.textContent = SUBMIT_LABEL;\r\n    }\r\n  }\r\n  function validatePageSilently(page) {\r\n    const fieldsValid = FIELDS.filter(f => f.page === page && visible(f)).every(f => {\r\n      if (['html', 'section'].includes(f.type)) return true;\r\n      const vals = readField(f.id);\r\n      if (f.maxLength && vals.some(v => v.length > f.maxLength)) return false;\r\n      if (f.req && !vals.length) return false;\r\n      return !(f.type === 'email' && vals.length && !\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$\/.test(vals[0]));\r\n    });\r\n    return fieldsValid && !missingSpecificChallengeField(page);\r\n  }\r\n\r\n  \/* ---------- Confirmation ---------- *\/\r\n    function renderSummary() {\r\n      const route = profile();\r\n      const summary = el('div', { class: 'rn-summary' },\r\n        el('div', { class: 'rn-summary-status' }, el('span', { text: 'Survey complete' }), el('span', { text: 'Completed' })),\r\n        el('div', { class: 'rn-summary-progress' }),\r\n        el('div', { class: 'rn-summary-header' },\r\n          el('div', {}, el('h1', { tabindex: '-1', text: 'Thank you.' }), el('p', { class: 'rn-summary-lead', text: 'Your response has been submitted successfully.' })),\r\n          el('section', { class: 'rn-summary-next' }, el('h2', { text: 'What happens next?' }), el('p', { text: NEXT_COPY }))));\r\n      const section = heading => { const s = el('section', { class: 'rn-summary-section' }, el('h2', { text: heading })); summary.append(s); return s; };\r\n      const cards = (heading, ids, four) => {\r\n        const entries = ids.map(id => [byId(id), answers(id)]).filter(([, v]) => v.length);\r\n        if (entries.length) section(heading).append(el('dl', { class: `rn-summary-grid${four ? ' rn-summary-four' : ''}` },\r\n          entries.map(([f, v]) => el('div', { class: 'rn-summary-card' }, el('dt', { text: f.label }), el('dd', { text: v.join(', ') })))));\r\n      };\r\n      const tags = (heading, ids) => {\r\n        const items = ids.flatMap(answers);\r\n        if (items.length) section(heading).append(el('ul', { class: 'rn-summary-tags' }, items.map(t => el('li', { text: t }))));\r\n      };\r\n      for (let p = 1; p <= PAGES; p++) {\r\n        const fields = FIELDS.filter(f => f.page === p && !['html', 'section', 'consent'].includes(f.type));\r\n        cards(schema.pageNames[p - 1] || 'Your response', fields.map(f => f.id), p === PAGES);\r\n      }\r\n      const restart = el('button', { type: 'button', class: 'rn-btn rn-btn-link', text: 'Start a new response' });\r\n      restart.addEventListener('click', () => { initialise(); });\r\n      summary.append(restart);\r\n      try { sessionStorage.removeItem(KEY); } catch (_) {}\r\n      root.replaceChildren(summary);\r\n      root.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n      summary.querySelector('h1').focus({ preventScroll: true });\r\n    }\r\n\r\n  initialise();\r\n})();\r\n\r\n<\/script>\r\n\t\t\t\t<\/div>\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<\/div>\n\t\t<div class=\"elementor-element elementor-element-2a4bac7 e-flex e-con-boxed e-con e-parent\" data-id=\"2a4bac7\" 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-99e0706 e-con-full e-flex e-con e-child\" data-id=\"99e0706\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a4bf3cf elementor-nav-menu__align-start elementor-nav-menu--dropdown-none elementor-widget elementor-widget-nav-menu\" data-id=\"a4bf3cf\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;layout&quot;:&quot;horizontal&quot;,&quot;submenu_icon&quot;:{&quot;value&quot;:&quot;&lt;svg aria-hidden=\\&quot;true\\&quot; class=\\&quot;e-font-icon-svg e-fas-caret-down\\&quot; viewBox=\\&quot;0 0 320 512\\&quot; xmlns=\\&quot;http:\\\/\\\/www.w3.org\\\/2000\\\/svg\\&quot;&gt;&lt;path d=\\&quot;M31.3 192h257.3c17.8 0 26.7 21.5 14.1 34.1L174.1 354.8c-7.8 7.8-20.5 7.8-28.3 0L17.2 226.1C4.6 213.5 13.5 192 31.3 192z\\&quot;&gt;&lt;\\\/path&gt;&lt;\\\/svg&gt;&quot;,&quot;library&quot;:&quot;fa-solid&quot;}}\" data-widget_type=\"nav-menu.default\">\n\t\t\t\t\t\t\t\t<nav aria-label=\"Menu\" class=\"elementor-nav-menu--main elementor-nav-menu__container elementor-nav-menu--layout-horizontal e--pointer-none\">\n\t\t\t\t<ul id=\"menu-1-a4bf3cf\" class=\"elementor-nav-menu\"><li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-40377\"><a href=\"https:\/\/www.rovensanext.com\/en\/cookie-notice\/\" class=\"elementor-item\">Cookie Notice<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-39843\"><a href=\"https:\/\/www.rovensanext.com\/en\/data-protection-and-privacy\/\" class=\"elementor-item\">Data Protection and Privacy<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-39842\"><a href=\"https:\/\/www.rovensanext.com\/en\/code-of-conduct\/\" class=\"elementor-item\">Code of conduct<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-39844\"><a href=\"https:\/\/www.rovensanext.com\/en\/site-map\/\" class=\"elementor-item\">Site map<\/a><\/li>\n<\/ul>\t\t\t<\/nav>\n\t\t\t\t\t\t<nav class=\"elementor-nav-menu--dropdown elementor-nav-menu__container\" aria-hidden=\"true\">\n\t\t\t\t<ul id=\"menu-2-a4bf3cf\" class=\"elementor-nav-menu\"><li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-40377\"><a href=\"https:\/\/www.rovensanext.com\/en\/cookie-notice\/\" class=\"elementor-item\" tabindex=\"-1\">Cookie Notice<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-39843\"><a href=\"https:\/\/www.rovensanext.com\/en\/data-protection-and-privacy\/\" class=\"elementor-item\" tabindex=\"-1\">Data Protection and Privacy<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-39842\"><a href=\"https:\/\/www.rovensanext.com\/en\/code-of-conduct\/\" class=\"elementor-item\" tabindex=\"-1\">Code of conduct<\/a><\/li>\n<li class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-39844\"><a href=\"https:\/\/www.rovensanext.com\/en\/site-map\/\" class=\"elementor-item\" tabindex=\"-1\">Site map<\/a><\/li>\n<\/ul>\t\t\t<\/nav>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-1fffb5d e-flex e-con-boxed e-con e-child\" data-id=\"1fffb5d\" 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-fcc5448 elementor-widget elementor-widget-text-editor\" data-id=\"fcc5448\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Rovensa Next<sup>\u00a9<\/sup>. All rights reserved<\/p>\t\t\t\t\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\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Survey Your opinion matters! Please enable JavaScript to complete this survey. Rovensa Next\u00a9. All rights reserved<\/p>\n","protected":false},"author":2,"featured_media":41289,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-41046","page","type-page","status-publish","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Grower Survey | Rovensa Next Global<\/title>\n<meta name=\"description\" content=\"Your opinion matters! We\u2019d like to get to know you better so we can offer you bespoke biosolutions.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.rovensanext.com\/en\/grower-survey\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Grower Survey\" \/>\n<meta property=\"og:description\" content=\"Your opinion matters! We\u2019d like to get to know you better so we can offer you bespoke biosolutions.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.rovensanext.com\/en\/grower-survey\/\" \/>\n<meta property=\"og:site_name\" content=\"Rovensa Next Global\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/RovensaNext\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-30T15:29:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.rovensanext.com\/wp-content\/uploads\/2026\/09\/coverSurvey.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"675\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"Grower Survey\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.rovensanext.com\/wp-content\/uploads\/2026\/09\/coverSurvey.png\" \/>\n<meta name=\"twitter:site\" content=\"@RovensaNext\" \/>\n<meta name=\"twitter:label1\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"25 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.rovensanext.com\\\/en\\\/grower-survey\\\/\",\"url\":\"https:\\\/\\\/www.rovensanext.com\\\/en\\\/grower-survey\\\/\",\"name\":\"Grower Survey | Rovensa Next Global\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.rovensanext.com\\\/en\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.rovensanext.com\\\/en\\\/grower-survey\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.rovensanext.com\\\/en\\\/grower-survey\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.rovensanext.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/coverSurvey11.png\",\"datePublished\":\"2026-09-17T12:11:34+00:00\",\"dateModified\":\"2026-09-30T15:29:12+00:00\",\"description\":\"Your opinion matters! We\u2019d like to get to know you better so we can offer you bespoke biosolutions.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.rovensanext.com\\\/en\\\/grower-survey\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.rovensanext.com\\\/en\\\/grower-survey\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/www.rovensanext.com\\\/en\\\/grower-survey\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.rovensanext.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/coverSurvey11.png\",\"contentUrl\":\"https:\\\/\\\/www.rovensanext.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/coverSurvey11.png\",\"width\":1200,\"height\":1200},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.rovensanext.com\\\/en\\\/grower-survey\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.rovensanext.com\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Grower Survey\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.rovensanext.com\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/www.rovensanext.com\\\/en\\\/\",\"name\":\"Rovensa Next, the new pioneer in biosolutions for agriculture\",\"description\":\"A pioneer in biosolutions for sustainable agriculture.\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.rovensanext.com\\\/en\\\/#organization\"},\"alternateName\":\"Rovensa Next Global | Let's grow greener\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.rovensanext.com\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.rovensanext.com\\\/en\\\/#organization\",\"name\":\"Rovensa Next Global\",\"alternateName\":\"Rovensa Next Global\",\"url\":\"https:\\\/\\\/www.rovensanext.com\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/www.rovensanext.com\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.rovensanext.com\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/cropped-faviconGreenpng.png\",\"contentUrl\":\"https:\\\/\\\/www.rovensanext.com\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/cropped-faviconGreenpng.png\",\"width\":512,\"height\":512,\"caption\":\"Rovensa Next Global\"},\"image\":{\"@id\":\"https:\\\/\\\/www.rovensanext.com\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/RovensaNext\",\"https:\\\/\\\/x.com\\\/RovensaNext\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/rovensa-next\\\/about\\\/\",\"https:\\\/\\\/www.youtube.com\\\/@RovensaNext\",\"https:\\\/\\\/instagram.com\\\/rovensanext\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Grower Survey | Rovensa Next Global","description":"Your opinion matters! We\u2019d like to get to know you better so we can offer you bespoke biosolutions.","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:\/\/www.rovensanext.com\/en\/grower-survey\/","og_locale":"en_GB","og_type":"article","og_title":"Grower Survey","og_description":"Your opinion matters! We\u2019d like to get to know you better so we can offer you bespoke biosolutions.","og_url":"https:\/\/www.rovensanext.com\/en\/grower-survey\/","og_site_name":"Rovensa Next Global","article_publisher":"https:\/\/www.facebook.com\/RovensaNext","article_modified_time":"2026-09-30T15:29:12+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/www.rovensanext.com\/wp-content\/uploads\/2026\/09\/coverSurvey.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_title":"Grower Survey","twitter_image":"https:\/\/www.rovensanext.com\/wp-content\/uploads\/2026\/09\/coverSurvey.png","twitter_site":"@RovensaNext","twitter_misc":{"Estimated reading time":"25 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.rovensanext.com\/en\/grower-survey\/","url":"https:\/\/www.rovensanext.com\/en\/grower-survey\/","name":"Grower Survey | Rovensa Next Global","isPartOf":{"@id":"https:\/\/www.rovensanext.com\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.rovensanext.com\/en\/grower-survey\/#primaryimage"},"image":{"@id":"https:\/\/www.rovensanext.com\/en\/grower-survey\/#primaryimage"},"thumbnailUrl":"https:\/\/www.rovensanext.com\/wp-content\/uploads\/2026\/09\/coverSurvey11.png","datePublished":"2026-09-17T12:11:34+00:00","dateModified":"2026-09-30T15:29:12+00:00","description":"Your opinion matters! We\u2019d like to get to know you better so we can offer you bespoke biosolutions.","breadcrumb":{"@id":"https:\/\/www.rovensanext.com\/en\/grower-survey\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.rovensanext.com\/en\/grower-survey\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/www.rovensanext.com\/en\/grower-survey\/#primaryimage","url":"https:\/\/www.rovensanext.com\/wp-content\/uploads\/2026\/09\/coverSurvey11.png","contentUrl":"https:\/\/www.rovensanext.com\/wp-content\/uploads\/2026\/09\/coverSurvey11.png","width":1200,"height":1200},{"@type":"BreadcrumbList","@id":"https:\/\/www.rovensanext.com\/en\/grower-survey\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.rovensanext.com\/en\/"},{"@type":"ListItem","position":2,"name":"Grower Survey"}]},{"@type":"WebSite","@id":"https:\/\/www.rovensanext.com\/en\/#website","url":"https:\/\/www.rovensanext.com\/en\/","name":"Rovensa Next, the new pioneer in biosolutions for agriculture","description":"A pioneer in biosolutions for sustainable agriculture.","publisher":{"@id":"https:\/\/www.rovensanext.com\/en\/#organization"},"alternateName":"Rovensa Next Global | Let's grow greener","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.rovensanext.com\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https:\/\/www.rovensanext.com\/en\/#organization","name":"Rovensa Next Global","alternateName":"Rovensa Next Global","url":"https:\/\/www.rovensanext.com\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/www.rovensanext.com\/en\/#\/schema\/logo\/image\/","url":"https:\/\/www.rovensanext.com\/wp-content\/uploads\/2025\/09\/cropped-faviconGreenpng.png","contentUrl":"https:\/\/www.rovensanext.com\/wp-content\/uploads\/2025\/09\/cropped-faviconGreenpng.png","width":512,"height":512,"caption":"Rovensa Next Global"},"image":{"@id":"https:\/\/www.rovensanext.com\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/RovensaNext","https:\/\/x.com\/RovensaNext","https:\/\/www.linkedin.com\/company\/rovensa-next\/about\/","https:\/\/www.youtube.com\/@RovensaNext","https:\/\/instagram.com\/rovensanext"]}]}},"_links":{"self":[{"href":"https:\/\/www.rovensanext.com\/en\/wp-json\/wp\/v2\/pages\/41046","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rovensanext.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.rovensanext.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.rovensanext.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rovensanext.com\/en\/wp-json\/wp\/v2\/comments?post=41046"}],"version-history":[{"count":124,"href":"https:\/\/www.rovensanext.com\/en\/wp-json\/wp\/v2\/pages\/41046\/revisions"}],"predecessor-version":[{"id":41510,"href":"https:\/\/www.rovensanext.com\/en\/wp-json\/wp\/v2\/pages\/41046\/revisions\/41510"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.rovensanext.com\/en\/wp-json\/wp\/v2\/media\/41289"}],"wp:attachment":[{"href":"https:\/\/www.rovensanext.com\/en\/wp-json\/wp\/v2\/media?parent=41046"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rovensanext.com\/en\/wp-json\/wp\/v2\/categories?post=41046"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rovensanext.com\/en\/wp-json\/wp\/v2\/tags?post=41046"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}