{
  "version": 3,
  "sources": ["/cdn/shop/t/4/assets/nora-spray.js?nc=17418"],
  "sourcesContent": ["/*\n * NORA PRO spray window engine (Delta T).\n * Pure maths for the Delta T Calculator page. No DOM, no network.\n * Used by:\n *   - the page UI (built into the theme asset assets/nora-spray.js by tools/spray-window/build.mjs)\n *   - the tests (tools/spray-window/test-engine.mjs) and the page copy and chart (tools/spray-window/build-copy.mjs)\n *\n * Delta T is the dry bulb temperature minus the wet bulb temperature, in degrees C.\n * The wet bulb comes from air temperature and relative humidity with the psychrometric equation, solved by\n * bisection, at sea level pressure (1013.25 hPa) or at the pressure for a height the visitor gives (standard\n * atmosphere). Saturation vapour pressure over water is Buck (1996).\n * It never supplies a product's wind band or rate. The visitor types the wind band from their own label.\n */\n(function (root, factory) {\n  if (typeof module === 'object' && module.exports) module.exports = factory();\n  else root.NoraSpray = factory();\n})(typeof self !== 'undefined' ? self : this, function () {\n  'use strict';\n\n  var P = 1013.25; // hPa, standard sea level pressure\n\n  // Delta T bands with their sources. The page copy cites the same documents.\n  // A value is put in a band after rounding to one decimal place, so the colour always matches the number shown.\n  // Bureau of Meteorology: \"Delta T should ideally be between 2 and 8, and not greater than 10\" (Delta T page), and the\n  // Nufarm chart in its leaflet Weather for Pesticide Spraying shades below 2 and 8 to 10 marginal, above 10 unsuitable.\n  var BANDS = [\n    { id: 'low', max: 2, label: 'Below 2', src: 'BoM leaflet chart: marginal' },\n    { id: 'good', max: 8, label: '2 to 8', src: 'BoM: ideally between 2 and 8' },\n    { id: 'marginal', max: 10, label: 'Above 8, up to 10', src: 'BoM leaflet chart: marginal' },\n    { id: 'high', max: Infinity, label: 'Above 10', src: 'BoM: not greater than 10' },\n  ];\n\n  // Signs of a surface temperature inversion that the visitor can tick (GRDC fact sheet on inversions, as listed in\n  // Nufarm's 2,4-D spray drift instructions; the time window is the 2,4-D label wording).\n  var SIGNS = [\n    { id: 'dew', label: 'Dew or frost on the ground or plants' },\n    { id: 'mist', label: 'Mist or fog' },\n    { id: 'smoke', label: 'Smoke or dust hanging in a layer or drifting sideways' },\n    { id: 'calm', label: 'Wind staying below 11 km/h in the evening or overnight' },\n    { id: 'time', label: 'Within 2 hours of sunset or sunrise, or at night, with a clear sky' },\n  ];\n\n  // Compass points for the wind direction (the direction the wind blows from).\n  var DIRS = ['N', 'NNE', 'NE', 'ENE', 'E', 'ESE', 'SE', 'SSE', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW'];\n\n  // Reads what people type: \"1,000\" is a thousand, but \"1,5\" or \"22,4\" (a comma as the decimal point) is 1.5 or 22.4.\n  // A space between digits (\"2 5\") is a slip, not 25, so it is refused (DT-07).\n  function num(x) {\n    if (typeof x === 'number') return x;\n    if (x === null || x === undefined) return NaN;\n    if (/\\d\\s+[\\d.,]|[\\d.,]\\s+\\d/.test(String(x).trim())) return NaN;\n    var s = String(x).trim().replace(/\\s+/g, '').replace(/\u2212/g, '-');\n    if (/^[-+]?\\d+,\\d{1,2}$/.test(s)) s = s.replace(',', '.');\n    s = s.replace(/,/g, '');\n    if (!/^[-+]?(\\d+\\.?\\d*|\\.\\d+)$/.test(s)) return NaN;\n    return parseFloat(s);\n  }\n  function fin(x) { return typeof x === 'number' && isFinite(x); }\n  function blank(x) { return x === undefined || x === null || String(x).trim() === ''; }\n\n  // A unit typed after the number is fine when it is the unit the box already shows: \"25 \u00B0C\", \"25\u00B0\", \"50%\", \"10 km/h\" (ALL-06).\n  var UNIT_RE = {\n    c: /\\s*(\u00B0\\s*c?|\u00BA\\s*c?|c|deg(rees?)?( c)?)$/i,\n    pct: /\\s*(%|per ?cent)$/i,\n    kmh: /\\s*(km\\/h|kmh|kph|km per hour|kilomet(re|er)s per hour)$/i,\n    m: /\\s*(m|metres?|meters?)$/i,\n  };\n  function fieldNum(x, unit) {\n    if (typeof x === 'number' || x === null || x === undefined) return num(x);\n    var s = String(x).trim();\n    return num(UNIT_RE[unit] ? s.replace(UNIT_RE[unit], '') : s);\n  }\n  // Letters or symbols left after the number, so the message asks for the number only.\n  function notNumber(x) { return !blank(x) && /[^\\d\\s.,+\\-\\u2212]/.test(String(x)); }\n\n  // ---------- Psychrometrics ----------\n\n  // Saturation vapour pressure over water, hPa (Buck 1996). Good to about 0.05% from -40 to 50 degrees C.\n  function esat(t) {\n    return 6.1121 * Math.exp((18.678 - t / 234.5) * (t / (257.14 + t)));\n  }\n\n  // Psychrometer coefficient per degree C (thermodynamic wet bulb, ventilated).\n  function coef(tw) { return 0.00066 * (1 + 0.00115 * tw); }\n\n  // Air pressure (hPa) at a height above sea level in metres (international standard atmosphere).\n  function pressureAt(h) { return P * Math.pow(1 - 2.25577e-5 * h, 5.25588); }\n\n  // Vapour pressure (hPa) of air at temperature t with wet bulb tw, at air pressure p (sea level when left out).\n  function vapourFromWet(t, tw, p) { return esat(tw) - coef(tw) * (p || P) * (t - tw); }\n\n  // Wet bulb from temperature and relative humidity. Bisection on the psychrometric equation.\n  function wetBulb(t, rh, p) {\n    var e = (rh / 100) * esat(t);\n    var lo = t - 80;\n    var hi = t;\n    for (var i = 0; i < 80; i += 1) {\n      var mid = (lo + hi) / 2;\n      if (vapourFromWet(t, mid, p) > e) hi = mid; else lo = mid;\n    }\n    return (lo + hi) / 2;\n  }\n\n  // Relative humidity (per cent) from dry and wet bulb readings.\n  function rhFromWet(t, tw, p) { return (vapourFromWet(t, tw, p) / esat(t)) * 100; }\n\n  // Dew point (degrees C) from vapour pressure, inverting Buck by bisection.\n  function dewPoint(t, rh) {\n    var e = (rh / 100) * esat(t);\n    var lo = -80;\n    var hi = t;\n    for (var i = 0; i < 80; i += 1) {\n      var mid = (lo + hi) / 2;\n      if (esat(mid) > e) hi = mid; else lo = mid;\n    }\n    return (lo + hi) / 2;\n  }\n\n  // ---------- Reading the weather ----------\n\n  var TMIN = -10;\n  var TMAX = 50;\n\n  // The weather as data:\n  //   { kind: 'rh',   t, rh }      air temperature (degrees C) and relative humidity (per cent)\n  //   { kind: 'bulb', dry, wet }   dry bulb and wet bulb thermometer readings (degrees C)\n  // Returns { ok, t, rh, tw, dt, dewPoint } or { ok: false, error, field }.\n  var HMAX = 2500;\n\n  function weather(w) {\n    if (!w || !w.kind) return { ok: false, error: 'Choose how you have the weather.' };\n    var t;\n    var rh;\n    var tw;\n    // Optional height above sea level, in metres. Blank means sea level, like the published charts.\n    var elev = 0;\n    if (w.elev !== undefined && w.elev !== null && String(w.elev).trim() !== '') {\n      elev = fieldNum(w.elev, 'm');\n      if (!fin(elev) || elev < 0 || elev > HMAX) return { ok: false, field: 'elev', error: 'Enter the height above sea level in metres, from 0 to ' + HMAX.toLocaleString('en-AU') + ', or leave it blank for sea level.' };\n    }\n    var p = pressureAt(elev);\n    if (w.kind === 'rh') {\n      t = fieldNum(w.t, 'c');\n      rh = fieldNum(w.rh, 'pct');\n      if (!fin(t)) return { ok: false, field: 't', error: notNumber(w.t) || /\\d\\s+\\d/.test(String(w.t)) ? 'Type the air temperature as a number only, for example 25.' : 'Enter the air temperature in degrees C.' };\n      if (t < TMIN || t > TMAX) return { ok: false, field: 't', error: 'Enter an air temperature from ' + TMIN + ' to ' + TMAX + ' degrees C.' };\n      if (!fin(rh)) return { ok: false, field: 'rh', error: notNumber(w.rh) || /\\d\\s+\\d/.test(String(w.rh)) ? 'Type the humidity as a number only, for example 50.' : 'Enter the relative humidity in per cent.' };\n      if (rh <= 0 || rh > 100) return { ok: false, field: 'rh', error: 'Enter a relative humidity above 0 and up to 100%.' };\n      tw = wetBulb(t, rh, p);\n    } else if (w.kind === 'bulb') {\n      t = fieldNum(w.dry, 'c');\n      tw = fieldNum(w.wet, 'c');\n      if (!fin(t)) return { ok: false, field: 'dry', error: notNumber(w.dry) || /\\d\\s+\\d/.test(String(w.dry)) ? 'Type the dry bulb reading as a number only, for example 20.' : 'Enter the dry bulb reading in degrees C.' };\n      if (t < TMIN || t > TMAX) return { ok: false, field: 'dry', error: 'Enter a dry bulb reading from ' + TMIN + ' to ' + TMAX + ' degrees C.' };\n      if (!fin(tw)) return { ok: false, field: 'wet', error: notNumber(w.wet) || /\\d\\s+\\d/.test(String(w.wet)) ? 'Type the wet bulb reading as a number only, for example 15.' : 'Enter the wet bulb reading in degrees C.' };\n      if (tw > t) return { ok: false, field: 'wet', error: 'The wet bulb cannot read higher than the dry bulb. Check the readings.' };\n      rh = rhFromWet(t, tw, p);\n      if (!(rh > 0)) return { ok: false, field: 'wet', error: 'The wet bulb is too low for the dry bulb reading. Check the wick is wet and read it again.' };\n    } else {\n      return { ok: false, error: 'Unknown weather input.' };\n    }\n    return { ok: true, kind: w.kind, t: t, rh: rh, tw: tw, dt: t - tw, dewPoint: dewPoint(t, rh), elev: elev, p: p };\n  }\n\n  // Delta T rounded to one decimal place, as shown everywhere.\n  function round1(x) { return Math.round(x * 10 + 1e-9) / 10; }\n\n  function band(dt) {\n    var d = round1(dt);\n    if (d < 2) return BANDS[0];\n    if (d <= 8) return BANDS[1];\n    if (d <= 10) return BANDS[2];\n    return BANDS[3];\n  }\n\n  // ---------- The spray check ----------\n\n  var HOT = 28; // degrees C, BoM leaflet Weather for Pesticide Spraying\n  var NEAR = 0.5; // Delta T within this of 2, 8 or 10 gets a note\n\n  var CALM = 3; // km/h. Many labels say not to spray below 3 km/h; calm air often comes with an inversion (DT-11).\n\n  // in: { dt, wind, windMin, windMax, signs: [ids], t, rh, p, kind } (t, rh, p and kind are optional: air temperature,\n  // relative humidity, air pressure and 'rh' or 'bulb', for the temperature advice and the close to the limit note)\n  // Returns { verdict: 'go' | 'caution' | 'nogo' | 'todo', reasons: [{ level, id, text }], band, wind: {...}, inversion }.\n  // A missing wind speed or label band is not a weather caution: it is a 'todo' reason, and when nothing else is\n  // wrong the verdict is 'todo', \"Not checked yet\" (DT-05). Every reason is plain words for the result card.\n  // The label always wins, so a no go never becomes a go.\n  function assess(input) {\n    var reasons = [];\n    var dt = input.dt;\n    var b = band(dt);\n    var d = fmtDt(dt);\n    var signs = (input.signs || []).filter(function (s) { return SIGNS.some(function (x) { return x.id === s; }); });\n\n    if (b.id === 'good') reasons.push({ level: 'go', id: 'dt-good', text: 'Delta T ' + d + ' is in the 2 to 8 range that suits most spraying.' });\n    else if (b.id === 'marginal') reasons.push({ level: 'caution', id: 'dt-marginal', text: 'Delta T ' + d + ' is above 8. Droplets evaporate faster, so small ones shrink and can drift before they land. Use a coarser spray and more water if the label allows.' });\n    else if (b.id === 'high') reasons.push({ level: 'nogo', id: 'dt-high', text: 'Delta T ' + d + ' is above 10. The Bureau of Meteorology advises not greater than 10: fine droplets dry out and drift before they reach the target. Wait for cooler, more humid conditions.' });\n    else reasons.push({ level: 'caution', id: 'dt-low', text: 'Delta T ' + d + ' is below 2. Droplets stay in the air longer, and these conditions often come with an inversion.' + (signs.length ? '' : ' Check for the signs of one.') });\n\n    // Inversion. Labels say do not spray during a surface temperature inversion.\n    var inversion = 'none';\n    if (signs.length && b.id === 'low') {\n      inversion = 'likely';\n      reasons.push({ level: 'nogo', id: 'inv-likely', text: 'Likely inversion: Delta T is below 2 and you can see the signs. Do not spray during an inversion. Wait until the air has warmed and a steady breeze has held for a while.' });\n    } else if (signs.length) {\n      inversion = 'possible';\n      reasons.push({ level: 'caution', id: 'inv-possible', text: 'You can see signs of an inversion. Do not spray if an inversion has formed. Check again before you start.' });\n    }\n\n    // Wind against the label's band.\n    // A label with only a top limit (\"below 15 km/h\") leaves the bottom of the band blank, which is read as 0.\n    var wind = fieldNum(input.wind, 'kmh');\n    var wmax = fieldNum(input.windMax, 'kmh');\n    var wmin = blank(input.windMin) && fin(wmax) ? 0 : fieldNum(input.windMin, 'kmh');\n    var hasWind = fin(wind) && wind >= 0;\n    var hasBand = fin(wmin) && fin(wmax) && wmin >= 0 && wmax > wmin;\n    var w = { status: 'none', speed: hasWind ? wind : null, min: hasBand ? wmin : null, max: hasBand ? wmax : null };\n    var badBand = fin(wmin) && fin(wmax) && !hasBand;\n    if (!hasWind) {\n      w.status = 'missing';\n      reasons.push({ level: 'todo', id: 'wind-missing', text: hasBand ? 'Add the wind speed to finish the check against your label.' : 'Add the wind speed and your label\u2019s wind band to finish the check.' });\n    } else if (!hasBand) {\n      w.status = 'noband';\n      reasons.push({ level: 'todo', id: 'wind-noband', text: badBand ? 'Wind ' + fmtKmh(wind) + '. The top of the wind band must be higher than the bottom. Check the label.' : 'Wind ' + fmtKmh(wind) + '. Add the wind band from your product label to finish the check. Labels set their own limits.' });\n    } else if (wind < wmin) {\n      w.status = 'low';\n      reasons.push({ level: 'nogo', id: 'wind-low', text: 'Wind ' + fmtKmh(wind) + ' is below your label\u2019s ' + fmtKmh(wmin) + ' minimum. Still air can mean an inversion, and spray can travel a long way. Wait for a steady breeze.' });\n    } else if (wind > wmax) {\n      w.status = 'high';\n      reasons.push({ level: 'nogo', id: 'wind-high', text: 'Wind ' + fmtKmh(wind) + ' is above your label\u2019s ' + fmtKmh(wmax) + ' maximum. Wait for the wind to drop.' });\n    } else {\n      w.status = 'ok';\n      reasons.push({ level: 'go', id: 'wind-ok', text: 'Wind ' + fmtKmh(wind) + ' is inside your label\u2019s ' + (blank(input.windMin) ? 'limit of ' + fmtKmh(wmax) : fmtNum(wmin, 1) + ' to ' + fmtKmh(wmax) + ' band') + '.' });\n    }\n    if (hasWind && wind < CALM && w.status !== 'low') {\n      reasons.push({ level: 'caution', id: 'wind-calm', text: 'Calm air: under ' + CALM + ' km/h, spray can hang and travel a long way, and calm air often comes with an inversion. Many labels say not to spray below ' + CALM + ' km/h. Check for the signs before you start.' });\n    }\n    if (badBand) w.bandError = 'The top of the wind band must be higher than the bottom.';\n\n    // Air temperature (when given). Bureau of Meteorology leaflet: \"Avoid spraying in temperatures above 28 \u00B0C\".\n    var t = num(input.t);\n    if (fin(t) && round1(t) > HOT) {\n      reasons.push({ level: 'caution', id: 'temp-hot', text: 'Air temperature ' + fmtC(t) + ' is above ' + HOT + ' \\u00b0C. The Bureau of Meteorology\\u2019s spraying leaflet says to avoid spraying above ' + HOT + ' \\u00b0C, and some labels set 30 \\u00b0C. Check your label.' });\n    }\n    if (fin(t) && t < 0) {\n      reasons.push({ level: 'note', id: 'temp-freezing', text: 'Below 0 \\u00b0C the wet bulb may be ice, so Delta T can be out by about 0.1 to 0.2.' });\n    }\n\n    // Close to a limit: a humidity reading a little out can move Delta T across it (meters are rated to 2 to 3%).\n    var near = null;\n    [2, 8, 10].forEach(function (lim) { if (near === null && Math.abs(round1(dt) - lim) <= NEAR) near = lim; });\n    if (near !== null) {\n      var rh = num(input.rh);\n      var shift = '';\n      if (input.kind === 'bulb') {\n        // Thermometers, not a humidity sensor (DT-15): the smallest wet bulb error that moves Delta T into the next band\n        // (DT-R1). The bands change between 1.9 and 2.0, 8.0 and 8.1, and 10.0 and 10.1 (see band()). A wet bulb that\n        // reads too high hides a higher Delta T; one that reads too low hides a lower one.\n        var lo = near === 2 ? 1.9 : near;\n        var hi = Math.round((lo + 0.1) * 10) / 10;\n        var dd = round1(dt);\n        var up = dd <= lo;\n        var gap = Math.round((up ? hi - dd : dd - lo) * 10) / 10;\n        reasons.push({ level: 'note', id: 'near-limit', text: 'Delta T ' + d + ' is close to the ' + near + ' limit. A wet bulb that reads ' + fmtNum(gap, 1) + ' \\u00b0C too ' + (up ? 'high' : 'low') + ' would move it across. Read the wet bulb again once it has stopped falling.' });\n      } else {\n        if (fin(t) && fin(rh) && rh > 2.5) {\n          var p = num(input.p);\n          var moved = (t - wetBulb(t, rh - 2, fin(p) ? p : P)) - dt;\n          if (moved >= 0.05) shift = ' Here, 2% less humidity adds about ' + fmtNum(moved, 1) + ' to Delta T.';\n        }\n        reasons.push({ level: 'note', id: 'near-limit', text: 'Delta T ' + d + ' is close to the ' + near + ' limit. Humidity sensors are rated to within 2 to 3%, which can move Delta T across it.' + shift + ' Check again before you start.' });\n      }\n    }\n\n    var verdict = 'go';\n    reasons.forEach(function (r) {\n      if (r.level === 'nogo') verdict = 'nogo';\n      else if (r.level === 'caution' && verdict !== 'nogo') verdict = 'caution';\n      else if (r.level === 'todo' && verdict === 'go') verdict = 'todo';\n    });\n    // No go first, then caution, then what is still to add, then go, then notes, so the reason that matters most is read first.\n    var rank = { nogo: 0, caution: 1, todo: 2, go: 3, note: 4 };\n    reasons.sort(function (a, b2) { return rank[a.level] - rank[b2.level]; });\n    return { verdict: verdict, reasons: reasons, band: b, wind: w, inversion: inversion, signs: signs };\n  }\n\n  var VERDICTS = {\n    go: { label: 'Go', text: 'Conditions suit spraying' },\n    caution: { label: 'Caution', text: 'Spray with care, or wait' },\n    nogo: { label: 'No go', text: 'Do not spray now' },\n    todo: { label: 'Not checked yet', text: 'Add the wind and your label\u2019s band to finish the check' },\n  };\n\n  // ---------- Chart ----------\n\n  // Delta T for each temperature (rows) and relative humidity (columns).\n  function chart(temps, rhs) {\n    return temps.map(function (t) {\n      return { t: t, cells: rhs.map(function (rh) { var dt = t - wetBulb(t, rh); return { rh: rh, dt: dt, band: band(dt).id }; }) };\n    });\n  }\n\n  // ---------- Formatting (Australian English, metric) ----------\n\n  function trim(x, d) {\n    var s = x.toFixed(d);\n    if (s.indexOf('.') > -1) s = s.replace(/0+$/, '').replace(/\\.$/, '');\n    return s === '-0' ? '0' : s;\n  }\n  function fmtNum(x, d) { return fin(x) ? trim(x, d === undefined ? 1 : d) : ''; }\n  // Delta T always shows one decimal place: 4.0, 8.1, 12.6.\n  function fmtDt(dt) { if (!fin(dt)) return ''; var r = round1(dt); return (r === 0 ? 0 : r).toFixed(1); }\n  function fmtC(t) { if (!fin(t)) return ''; var r = round1(t); return (r === 0 ? 0 : r).toFixed(1) + ' \u00B0C'; }\n  function fmtRh(rh) { return fin(rh) ? Math.round(rh) + '%' : ''; }\n  function fmtKmh(k) { return fin(k) ? trim(k, 1) + ' km/h' : ''; }\n\n  function pad(n) { return (n < 10 ? '0' : '') + n; }\n  // 17/10/2026 7:45 am\n  function fmtWhen(d) {\n    if (!(d instanceof Date) || isNaN(d.getTime())) return '';\n    var h = d.getHours();\n    var ap = h < 12 ? 'am' : 'pm';\n    var h12 = h % 12 === 0 ? 12 : h % 12;\n    return pad(d.getDate()) + '/' + pad(d.getMonth() + 1) + '/' + d.getFullYear() + ' ' + h12 + ':' + pad(d.getMinutes()) + ' ' + ap;\n  }\n\n  // One line for the spray record: the weather fields state record rules ask for, plus what changed the answer:\n  // the height above sea level and any inversion signs ticked (DT-09).\n  // in: { when: Date, w: weather() result, wind, dir, signs: [ids] }\n  function recordLine(input) {\n    var w = input.w;\n    if (!w || !w.ok) return '';\n    var parts = [];\n    var when = fmtWhen(input.when);\n    if (when) parts.push(when);\n    if (w.kind === 'bulb') parts.push('dry bulb ' + fmtC(w.t), 'wet bulb ' + fmtC(w.tw), 'RH ' + fmtRh(w.rh));\n    else parts.push('temperature ' + fmtC(w.t), 'RH ' + fmtRh(w.rh));\n    parts.push('Delta T ' + fmtDt(w.dt) + (w.elev > 0 ? ' at ' + fmtNum(w.elev, 0).replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',') + ' m' : ''));\n    var wind = fieldNum(input.wind, 'kmh');\n    var dir = DIRS.indexOf(input.dir) > -1 || input.dir === 'variable' ? input.dir : '';\n    if (fin(wind) && wind >= 0) parts.push('wind ' + fmtKmh(wind) + (dir ? (dir === 'variable' ? ', variable' : ' from the ' + dir) : ''));\n    else if (dir) parts.push('wind from the ' + dir);\n    var signs = (input.signs || []).filter(function (s) { return SIGNS.some(function (x) { return x.id === s; }); });\n    if (signs.length) parts.push('signs: ' + signs.join(' and '));\n    return parts.join(', ');\n  }\n\n  return {\n    P: P, BANDS: BANDS, SIGNS: SIGNS, DIRS: DIRS, VERDICTS: VERDICTS, TMIN: TMIN, TMAX: TMAX, HMAX: HMAX,\n    num: num, fieldNum: fieldNum, CALM: CALM, esat: esat, pressureAt: pressureAt, wetBulb: wetBulb, rhFromWet: rhFromWet, dewPoint: dewPoint,\n    weather: weather, band: band, round1: round1, assess: assess, chart: chart, recordLine: recordLine,\n    fmtNum: fmtNum, fmtDt: fmtDt, fmtC: fmtC, fmtRh: fmtRh, fmtKmh: fmtKmh, fmtWhen: fmtWhen,\n  };\n});\n\n/*\n * NORA PRO Spray Window Planner (page UI for the Delta T Calculator).\n * Built into assets/nora-spray.js after spray-engine.js by tools/spray-window/build.mjs.\n * The maths lives in spray-engine.js. No key and no network call: the visitor types their own readings.\n */\n(function () {\n  'use strict';\n  var root = document.getElementById('nora-spray');\n  if (!root || typeof NoraSpray === 'undefined') return;\n  var S = NoraSpray;\n\n  function $(sel) { return root.querySelector(sel); }\n  function $$(sel) { return Array.prototype.slice.call(root.querySelectorAll(sel)); }\n  // Writes the answer bar's text only when it changes. Rewriting it on every focus change replaced the element under\n  // the pointer between mouse down and mouse up, so the browser dropped the click (ALL-R1).\n  function setHtml(el, h) { if (el && el.__h !== h) { el.innerHTML = h; el.__h = h; } }\n  function esc(s) {\n    return String(s == null ? '' : s).replace(/[&<>\"']/g, function (c) {\n      return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c];\n    });\n  }\n  function val(id) { var x = $('#' + id); return x ? x.value : ''; }\n  function setVal(id, v) { var x = $('#' + id); if (x) x.value = v; }\n\n  var state = {\n    mode: 'rh', used: false, toolUse: false, edited: false, lastSig: '', timer: null, linkTimer: null, typed: {}, errs: [], last: null,\n    // The date and time box follows the readings until the visitor types a time of their own (DT-01).\n    timeAuto: true,\n  };\n  var STALE_MIN = 15;\n  var BAND_KEY = 'nora-spray-band';\n\n  // ---------------------------------------------------------------- analytics (same GTM tag as the guide)\n\n  // GTM merges each push into one data model, so guide_via and guide_restored are sent on every event (empty when\n  // they do not apply) and a later event never carries the value from an earlier one.\n  function track(event, params) {\n    try {\n      var payload = { event: event, guide_mode: 'spray', guide_via: undefined, guide_restored: undefined };\n      Object.keys(params || {}).forEach(function (k) { if (params[k] !== undefined && params[k] !== null && params[k] !== '') payload[k] = params[k]; });\n      window.dataLayer = window.dataLayer || [];\n      window.dataLayer.push(payload);\n    } catch (e) { /* never break the tool for analytics */ }\n  }\n  // guide_tool_use fires on the first edit, also when the readings came from a share link.\n  function firstUse() {\n    state.used = true;\n    state.edited = true;\n    if (state.toolUse) return;\n    state.toolUse = true;\n    track('guide_tool_use', { guide_kind: state.mode });\n  }\n\n  // ---------------------------------------------------------------- reading the form\n\n  function currentWeather() {\n    if (state.mode === 'bulb') return { kind: 'bulb', dry: val('ns-dry'), wet: val('ns-wet'), elev: val('ns-elev') };\n    return { kind: 'rh', t: val('ns-t'), rh: val('ns-rh'), elev: val('ns-elev') };\n  }\n  function signs() {\n    return $$('input[name=\"ns-sign\"]:checked').map(function (x) { return x.value; });\n  }\n  function when() {\n    var v = val('ns-when');\n    if (!v) return null;\n    var d = new Date(v);\n    return isNaN(d.getTime()) ? null : d;\n  }\n  function pad(n) { return (n < 10 ? '0' : '') + n; }\n  function localStamp(d) {\n    return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate()) + 'T' + pad(d.getHours()) + ':' + pad(d.getMinutes());\n  }\n\n  var FIELD_IDS = { t: 'ns-t', rh: 'ns-rh', dry: 'ns-dry', wet: 'ns-wet', elev: 'ns-elev' };\n\n  // A box is marked only once it holds something that cannot work, or after the visitor has typed in it and emptied it;\n  // an empty box the visitor only passed through stays grey (DT-17). The words that explain it sit just under the box\n  // (aria-describedby), and the status line and the answer bar say them too (ALL-01).\n  function markFields(w) {\n    $$('.ns-in[aria-invalid]').forEach(function (x) { x.removeAttribute('aria-invalid'); x.removeAttribute('aria-describedby'); });\n    $$('.ns-err[data-ns-for]').forEach(function (p) { p.hidden = true; p.textContent = ''; });\n    state.errs = [];\n    var mark = function (id, msg) {\n      var el = $('#' + id);\n      if (!el || el.offsetParent === null) return;\n      if (el.value.trim() === '' && !state.typed[id]) return;\n      el.setAttribute('aria-invalid', 'true');\n      var line = $('#' + id + '-err') || $('#ns-band-err');\n      if (line) {\n        el.setAttribute('aria-describedby', line.id);\n        if (line.hidden) { line.hidden = false; line.textContent = msg; }\n      }\n      state.errs.push({ id: id, error: msg });\n    };\n    if (!w.ok && w.field) mark(FIELD_IDS[w.field], w.error);\n    var number = function (id) { var v = val(id).trim(); return v === '' || (isFinite(S.fieldNum(v, 'kmh')) && S.fieldNum(v, 'kmh') >= 0); };\n    if (!number('ns-wind')) mark('ns-wind', 'Type the wind speed as a number only, for example 10.');\n    var lo = S.fieldNum(val('ns-wmin'), 'kmh');\n    var hi = S.fieldNum(val('ns-wmax'), 'kmh');\n    var err = $('#ns-band-err');\n    var badNum = !number('ns-wmin') || !number('ns-wmax');\n    var bad = isFinite(lo) && isFinite(hi) && hi <= lo;\n    if (err) { err.hidden = true; err.textContent = ''; }\n    if (!number('ns-wmin')) mark('ns-wmin', 'Type the bottom of the wind band as a number only, for example 3.');\n    if (!number('ns-wmax')) mark('ns-wmax', 'Type the top of the wind band as a number only, for example 15.');\n    if (bad && !badNum) mark('ns-wmax', 'The top of the wind band must be higher than the bottom. Check the label.');\n    // The band message shows whenever the band is upside down, typed or from a link.\n    if (bad && err && err.hidden) { err.hidden = false; err.textContent = 'The top of the wind band must be higher than the bottom. Check the label.'; }\n  }\n\n  // ---------------------------------------------------------------- view\n\n  var SCALE = 14;\n  function gauge(dt) {\n    var seg = function (cls, from, to) { return '<i class=\"' + cls + '\" style=\"width:' + ((to - from) / SCALE * 100).toFixed(3) + '%\"></i>'; };\n    var at = Math.max(0, Math.min(S.round1(dt), SCALE)) / SCALE * 100;\n    return '<div class=\"ns-gauge\" aria-hidden=\"true\">' + seg('ns-g-low', 0, 2) + seg('ns-g-good', 2, 8) + seg('ns-g-marg', 8, 10) + seg('ns-g-high', 10, SCALE) +\n      '<span class=\"ns-gauge__m\" style=\"left:' + at.toFixed(2) + '%\"></span></div>' +\n      '<div class=\"ns-scale\" aria-hidden=\"true\">' + [0, 2, 8, 10, SCALE].map(function (v) {\n        return '<span style=\"left:' + (v / SCALE * 100).toFixed(3) + '%\">' + v + (v === SCALE ? '+' : '') + '</span>';\n      }).join('') + '</div>';\n  }\n\n  function windText(a) {\n    var dir = val('ns-dir');\n    if (a.wind.speed === null) return dir ? (dir === 'variable' ? 'Variable' : 'From the ' + dir) : 'Not entered';\n    return S.fmtKmh(a.wind.speed) + (dir ? (dir === 'variable' ? ', variable' : ' from the ' + dir) : '');\n  }\n\n  // A time typed by the visitor that is well before now: the record may be for an old reading (DT-01).\n  function staleTime() {\n    var d = when();\n    return !state.timeAuto && d && (Date.now() - d.getTime()) > STALE_MIN * 60000;\n  }\n\n  function render() {\n    var out = $('#ns-result');\n    var w = S.weather(currentWeather());\n    markFields(w);\n    if (!w.ok) {\n      var empty = state.mode === 'bulb' ? (val('ns-dry').trim() === '' && val('ns-wet').trim() === '') : (val('ns-t').trim() === '' && val('ns-rh').trim() === '');\n      var msg = empty ? (state.mode === 'bulb' ? 'Enter your dry and wet bulb readings to get Delta T.' : 'Enter the air temperature and humidity where you are spraying to get Delta T.') : w.error;\n      out.innerHTML = '<div class=\"ns-card ns-card--wait\" tabindex=\"-1\"><p class=\"ns-wait\">' + esc(msg) + '</p></div>';\n      state.last = null;\n      peek();\n      schedule(w, null);\n      saveLink();\n      return;\n    }\n    var a = S.assess({ dt: w.dt, wind: val('ns-wind'), windMin: val('ns-wmin'), windMax: val('ns-wmax'), signs: signs(), t: w.t, rh: w.rh, p: w.p, kind: w.kind });\n    var v = S.VERDICTS[a.verdict];\n    var line = S.recordLine({ when: when(), w: w, wind: val('ns-wind'), dir: val('ns-dir'), signs: a.signs });\n    var eq = [\n      ['Wet bulb', S.fmtC(w.tw)],\n      [state.mode === 'bulb' ? 'Humidity, worked out' : 'Humidity', S.fmtRh(w.rh)],\n      ['Dew point', S.fmtC(w.dewPoint)],\n      ['Wind', windText(a)],\n    ];\n    var stale = staleTime() ? '<p class=\"ns-hint ns-stale\"><b>Check:</b> this time is more than ' + STALE_MIN + ' minutes old. If the reading is new, <button type=\"button\" class=\"ns-inline\" data-ns-now>use the time now</button>.</p>' : '';\n    var html = '<div class=\"ns-card ns-card--' + a.verdict + '\" tabindex=\"-1\" aria-labelledby=\"ns-answer\">' +\n      '<div class=\"ns-head\"><div><p class=\"ns-eyebrow\">Delta T</p>' +\n      '<p class=\"ns-dt ns-answer\" id=\"ns-answer\">' + esc(S.fmtDt(w.dt)) + '<small>&deg;C</small><span class=\"ns-status\">, ' + esc(v.label + ': ' + v.text) + '</span></p></div>' +\n      '<p class=\"ns-verdict ns-verdict--' + a.verdict + '\"><b>' + esc(v.label) + '</b><span>' + esc(v.text) + '</span></p></div>' +\n      gauge(w.dt) +\n      '<ul class=\"ns-reasons\">' + a.reasons.map(function (r) { return '<li class=\"ns-r--' + r.level + '\">' + esc(r.text) + '</li>'; }).join('') + '</ul>' +\n      '<dl class=\"ns-eq\">' + eq.map(function (p) { return '<div><dt>' + esc(p[0]) + '</dt><dd>' + esc(p[1]) + '</dd></div>'; }).join('') + '</dl>' +\n      (w.elev > 0 ? '<p class=\"ns-hint ns-elev-note\">Worked out for ' + esc(S.fmtNum(w.elev, 0)) + ' m above sea level (air pressure about ' + esc(S.fmtNum(w.p, 0)) + ' hPa).</p>' : '') +\n      '<p class=\"ns-label-wins\"><b>The label always wins.</b> Follow its directions on wind, droplet size, buffer zones and inversions, even when this check says go.</p>' +\n      '<div class=\"ns-record\"><p class=\"ns-record__h\">For your spray record</p>' +\n      '<p class=\"ns-record__line\" id=\"ns-record-line\">' + esc(line).replace(/ (\u00B0C|km\\/h)/g, '&nbsp;$1') + '</p>' + stale +\n      '<div class=\"ns-actions\"><button type=\"button\" class=\"ns-btn\" data-ns-copy>Copy for spray record</button>' +\n      '<button type=\"button\" class=\"ns-act\" data-ns-link>Copy link</button>' +\n      '<button type=\"button\" class=\"ns-act\" data-ns-printcard>Print</button>' +\n      '<span class=\"ns-copied\" role=\"status\" aria-live=\"polite\"></span></div></div>' +\n      '</div>';\n    out.innerHTML = html;\n    state.last = { w: w, a: a, line: line };\n    stickyTop();\n    peek();\n    schedule(w, a);\n    saveLink();\n  }\n\n  // ---------------------------------------------------------------- answer bar\n\n  // Shown whenever the tool is on screen but its Delta T line is not (under the site header, or below the fold).\n  // Phones and tablets get a bar along the bottom; desktop gets a small box in the corner.\n  // Where the site header ends right now: 0 once it has slid away on scroll (ALL-R2). The height alone counted a\n  // hidden header, so an answer at the top of the screen was taken as covered.\n  function headerBottom() {\n    var b = 0;\n    try {\n      document.querySelectorAll('.shopify-section-header-sticky, sticky-header, .section-header').forEach(function (el) {\n        var cs = getComputedStyle(el);\n        if (cs.position === 'sticky' || cs.position === 'fixed') b = Math.max(b, el.getBoundingClientRect().bottom);\n      });\n    } catch (e) { b = state.headerH || 0; }\n    return Math.max(0, Math.min(b, 160));\n  }\n  function answerInView() {\n    var a = $('#ns-answer') || $('#ns-result .ns-card');\n    if (!a) return true;\n    var r = a.getBoundingClientRect();\n    var vh = window.innerHeight || document.documentElement.clientHeight;\n    // The phone bar covers the bottom 76 px; the desktop corner box covers only a corner, checked in peek().\n    var wide = window.matchMedia && window.matchMedia('(min-width: 990px)').matches;\n    // At the top, at least half the line must show below the header, so the amounts are readable (ALL-R2).\n    return (r.top + r.bottom) / 2 > headerBottom() && r.top < vh - (wide ? 24 : 76);\n  }\n  function toolInView() {\n    var r = root.getBoundingClientRect();\n    var vh = window.innerHeight || document.documentElement.clientHeight;\n    return r.bottom > 80 && r.top < vh - 80;\n  }\n  // The bar (phones) or corner box (desktop) would sit on the card's buttons: it stays hidden until they move clear (ALL-04).\n  function coversActions(bar) {\n    var a = $('#ns-result .ns-actions');\n    if (!a) return false;\n    var r = a.getBoundingClientRect();\n    var vh = window.innerHeight || document.documentElement.clientHeight;\n    var vw = document.documentElement.clientWidth || window.innerWidth;\n    var cs = getComputedStyle(bar);\n    var bottom = parseFloat(cs.bottom) || 0;\n    var right = parseFloat(cs.right) || 0;\n    return r.height > 0 && r.bottom > vh - bottom - bar.offsetHeight && r.top < vh - bottom && r.right > vw - right - bar.offsetWidth;\n  }\n  // Typing in a box on a short screen (the phone keyboard is up): the bar would cover the box.\n  function typingOnShortScreen() {\n    var a = document.activeElement;\n    if (!a || !root.contains(a) || !/^(INPUT|SELECT)$/.test(a.tagName)) return false;\n    var h = window.visualViewport ? window.visualViewport.height : window.innerHeight;\n    return h < 450;\n  }\n  function peek() {\n    var bar = $('#ns-peek');\n    if (!bar) return;\n    var L = state.last;\n    var err = state.errs.length ? state.errs[0] : null;\n    var show = (!!L || !!err) && toolInView() && !answerInView() && !typingOnShortScreen();\n    if (L) {\n      var v = S.VERDICTS[L.a.verdict];\n      setHtml($('#ns-peek-txt'), 'Delta T <b>' + esc(S.fmtDt(L.w.dt)) + '</b> <span class=\"ns-peek__v ns-peek__v--' + L.a.verdict + '\">' + esc(v.label) + '</span>' +\n        (err ? '<span class=\"ns-peek__err\">Check: ' + esc(err.error) + '</span>' : '') +\n        '<span class=\"ns-status\">. Show the full answer.</span>');\n    } else if (err) {\n      setHtml($('#ns-peek-txt'), '<span class=\"ns-peek__err\">Check: ' + esc(err.error) + '</span><span class=\"ns-status\">. Go to the box.</span>');\n    }\n    if (show && coversActions(bar)) show = false;\n    bar.setAttribute('data-show', show ? '1' : '0');\n    bar.setAttribute('data-err', !L && err ? '1' : '0');\n    bar.tabIndex = show ? 0 : -1;\n    var wide = window.matchMedia && window.matchMedia('(min-width: 990px)').matches;\n    try { document.documentElement.style.scrollPaddingBottom = show && !wide ? '84px' : ''; } catch (e) { /* ignore */ }\n  }\n  function watchPeek() {\n    var bar = $('#ns-peek');\n    if (!bar) return;\n    bar.hidden = false;\n    var ticking = false;\n    var onMove = function () {\n      if (ticking) return;\n      ticking = true;\n      (window.requestAnimationFrame || setTimeout)(function () { ticking = false; peek(); });\n    };\n    window.addEventListener('scroll', onMove, { passive: true });\n    window.addEventListener('resize', onMove);\n    if (window.visualViewport) window.visualViewport.addEventListener('resize', onMove);\n    // The page settles after load and once the fonts arrive, so the bar is checked again then (ALL-R2).\n    window.addEventListener('load', onMove);\n    try { if (document.fonts && document.fonts.ready) document.fonts.ready.then(onMove); } catch (e) { /* ignore */ }\n    peek();\n  }\n\n  // Desktop: the answer card stays in view just under the site's sticky header. A card taller than the screen\n  // sticks by its bottom instead, so the Copy button stays in reach (the answer box shows Delta T meanwhile).\n  function stickyTop() {\n    try {\n      var h = 0;\n      document.querySelectorAll('.shopify-section-header-sticky, sticky-header, .section-header').forEach(function (el) {\n        var cs = getComputedStyle(el);\n        if (cs.position === 'sticky' || cs.position === 'fixed') h = Math.max(h, el.getBoundingClientRect().height);\n      });\n      state.headerH = Math.round(Math.min(h, 160));\n      var res = $('#ns-result');\n      var vh = window.innerHeight || document.documentElement.clientHeight;\n      var top = state.headerH + 20;\n      if (res) top = Math.min(top, vh - res.getBoundingClientRect().height - 16);\n      root.style.setProperty('--ns-top', Math.round(top) + 'px');\n    } catch (e) { /* the CSS default is used */ }\n  }\n\n  // The answer box scrolls to the top of the card, clear of the site header that slides back in on the way up (DT-03).\n  // On desktop the card is sticky, so the place to go is the top of its column, where the card starts.\n  function showCard() {\n    var card = $('#ns-result .ns-card');\n    if (!card) return;\n    var wide = window.matchMedia && window.matchMedia('(min-width: 990px)').matches;\n    var from = wide ? $('.ns-side') : card;\n    var top = from.getBoundingClientRect().top + window.pageYOffset - (state.headerH || 0) - 16;\n    var smooth = !(window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches);\n    try { window.scrollTo({ top: Math.max(0, top), behavior: smooth ? 'smooth' : 'auto' }); } catch (e) { window.scrollTo(0, Math.max(0, top)); }\n    try { card.focus({ preventScroll: true }); } catch (err) { /* ignore */ }\n  }\n  function goToFirstError() {\n    var e = state.errs[0];\n    var el = e ? $('#' + e.id) : null;\n    if (!el) return;\n    el.scrollIntoView({ block: 'center' });\n    try { el.focus({ preventScroll: true }); } catch (err) { el.focus(); }\n  }\n\n  // Count a result once the visitor stops typing, not on every key. Screen readers hear the result, or the box to\n  // check instead of the old result (ALL-01).\n  function schedule(w, a) {\n    if (!state.used) return;\n    clearTimeout(state.timer);\n    state.timer = setTimeout(function () {\n      var sig = JSON.stringify([state.mode, currentWeather(), val('ns-wind'), val('ns-wmin'), val('ns-wmax'), signs()]);\n      if (sig === state.lastSig) return;\n      state.lastSig = sig;\n      var s = $('#ns-status');\n      if (state.errs.length) { if (s) s.textContent = 'Check: ' + state.errs[0].error; return; }\n      if (!a) { if (s) s.textContent = ''; return; }\n      track('guide_result_shown', { guide_kind: state.mode, guide_rating: a.verdict });\n      if (s) s.textContent = 'Result updated: Delta T ' + S.fmtDt(w.dt) + ', ' + S.VERDICTS[a.verdict].label + '.';\n    }, 1200);\n  }\n\n  // ---------------------------------------------------------------- copy, link and print\n\n  function copyText(text, msg) {\n    var flag = $('.ns-copied');\n    var done = function () { if (flag) { flag.textContent = msg; setTimeout(function () { flag.textContent = ''; }, 2500); } };\n    try {\n      if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(text).then(done, function () { fallback(text); done(); }); return; }\n    } catch (e) { /* fall through */ }\n    fallback(text);\n    done();\n  }\n  function fallback(text) {\n    var t = document.createElement('textarea');\n    t.value = text; t.setAttribute('readonly', ''); t.style.position = 'absolute'; t.style.left = '-9999px';\n    document.body.appendChild(t); t.select();\n    try { document.execCommand('copy'); } catch (e) { /* ignore */ }\n    document.body.removeChild(t);\n  }\n\n  // #spray&k=rh&t=25&rh=50&h=600&w=10&d=SE&lo=3&hi=15&s=dew.mist&at=2026-10-18T07:55 (DT-04). The reading time\n  // goes in the link, so the record from a link keeps the time of the reading.\n  function linkHash() {\n    var p = ['spray', 'k=' + state.mode];\n    var add = function (k, id) { var v = val(id).trim(); if (v !== '') p.push(k + '=' + encodeURIComponent(v)); };\n    if (state.mode === 'bulb') { add('dry', 'ns-dry'); add('wet', 'ns-wet'); } else { add('t', 'ns-t'); add('rh', 'ns-rh'); }\n    add('h', 'ns-elev'); add('w', 'ns-wind'); add('d', 'ns-dir'); add('lo', 'ns-wmin'); add('hi', 'ns-wmax');\n    var sg = signs();\n    if (sg.length) p.push('s=' + sg.join('.'));\n    if (val('ns-when')) p.push('at=' + encodeURIComponent(val('ns-when')));\n    return '#' + p.join('&');\n  }\n  function shareUrl() {\n    var h = linkHash();\n    try { history.replaceState(history.state, '', location.pathname + location.search + h); } catch (e) { /* ignore */ }\n    return location.origin + location.pathname + location.search + h;\n  }\n  // The readings go into the address as they change, so a reload, Back or a phone that reloads the tab brings them\n  // back. The label's wind band is also kept in this browser for the next visit (ALL-02).\n  function saveLink() {\n    if (!state.edited) return;\n    clearTimeout(state.linkTimer);\n    state.linkTimer = setTimeout(function () {\n      try { history.replaceState(history.state, '', location.pathname + location.search + linkHash()); } catch (e) { /* ignore */ }\n      try {\n        var lo = val('ns-wmin').trim();\n        var hi = val('ns-wmax').trim();\n        if (hi !== '' && isFinite(S.fieldNum(hi, 'kmh'))) window.localStorage.setItem(BAND_KEY, JSON.stringify({ lo: lo, hi: hi }));\n      } catch (e) { /* storage blocked: nothing kept */ }\n    }, 400);\n  }\n  function rememberedBand() {\n    try {\n      var b = JSON.parse(window.localStorage.getItem(BAND_KEY) || 'null');\n      if (!b || typeof b !== 'object') return null;\n      var lo = clean(b.lo);\n      var hi = clean(b.hi);\n      return hi ? { lo: lo, hi: hi } : null;\n    } catch (e) { return null; }\n  }\n\n  // A value from a link or storage is used only if it is a plain number (one dot or comma, a leading minus).\n  // Anything else leaves its box empty, so a mangled link never becomes a confident answer (DT-06).\n  function clean(v) {\n    var s = String(v == null ? '' : v).trim().replace(/\u2212/g, '-');\n    return /^-?\\d{1,5}([.,]\\d{1,3})?$/.test(s) ? s : '';\n  }\n  function restore() {\n    var h = location.hash;\n    if (h.indexOf('#spray') !== 0) return false;\n    var p = {};\n    h.slice(1).split('&').forEach(function (kv) { var b = kv.split('='); if (b[1] !== undefined) { try { p[b[0]] = decodeURIComponent(b[1]); } catch (e) { /* ignore */ } } });\n    if (p.k === 'bulb' || p.k === 'rh') setMode(p.k, true);\n    if (p.t) setVal('ns-t', clean(p.t));\n    if (p.rh) setVal('ns-rh', clean(p.rh));\n    if (p.dry) setVal('ns-dry', clean(p.dry));\n    if (p.wet) setVal('ns-wet', clean(p.wet));\n    if (p.h) setVal('ns-elev', clean(p.h));\n    if (p.w) setVal('ns-wind', clean(p.w));\n    if (p.lo) setVal('ns-wmin', clean(p.lo));\n    if (p.hi) setVal('ns-wmax', clean(p.hi));\n    if (p.d && (S.DIRS.indexOf(p.d) > -1 || p.d === 'variable')) setVal('ns-dir', p.d);\n    if (p.s) {\n      var want = p.s.split('.');\n      $$('input[name=\"ns-sign\"]').forEach(function (x) { x.checked = want.indexOf(x.value) > -1; });\n    }\n    if (p.at && /^\\d{4}-\\d\\d-\\d\\dT\\d\\d:\\d\\d$/.test(p.at)) { setVal('ns-when', p.at); state.timeAuto = false; }\n    return true;\n  }\n\n  // The chart is in the page copy (#delta-t-chart). Printing shows only the chart and its key.\n  function printWith(cls, via) {\n    var html = document.documentElement;\n    html.classList.add(cls);\n    var done = function () { html.classList.remove(cls); window.removeEventListener('afterprint', done); };\n    window.addEventListener('afterprint', done);\n    track('guide_share', { guide_kind: state.mode, guide_via: via });\n    try { window.print(); } catch (e) { /* ignore */ }\n    setTimeout(function () { if (html.classList.contains(cls)) done(); }, 1000);\n  }\n\n  // ---------------------------------------------------------------- mode\n\n  function setMode(mode, quiet) {\n    state.mode = mode;\n    $$('[data-ns-mode]').forEach(function (b) { b.setAttribute('aria-pressed', b.getAttribute('data-ns-mode') === mode ? 'true' : 'false'); });\n    $$('[data-ns-panel]').forEach(function (p) { p.hidden = p.getAttribute('data-ns-panel') !== mode; });\n    root.setAttribute('data-mode', mode);\n    if (!quiet) { firstUse(); readingChanged(); render(); }\n  }\n\n  function setNow() { setVal('ns-when', localStamp(new Date())); }\n  // A new reading takes the time now, unless the visitor typed a time of their own (DT-01).\n  function readingChanged() { if (state.timeAuto) setNow(); }\n\n  // A minus figure for frosty mornings: the phone number pad has no minus key on iPhones (DT-02).\n  function toggleMinus(id) {\n    var el = $('#' + id);\n    if (!el) return;\n    var v = el.value.trim();\n    if (v === '' || v === '-') {\n      el.value = v === '-' ? '' : '-';\n      el.focus();\n      try { el.setSelectionRange(el.value.length, el.value.length); } catch (e) { /* ignore */ }\n    } else el.value = /^[-\u2212]/.test(v) ? v.replace(/^[-\u2212]\\s*/, '') : '-' + v;\n    state.typed[id] = true;\n    syncMinus();\n    firstUse();\n    readingChanged();\n    render();\n  }\n  function syncMinus() {\n    $$('[data-ns-neg]').forEach(function (b) { b.setAttribute('aria-pressed', /^\\s*[-\u2212]/.test(val(b.getAttribute('data-ns-neg'))) ? 'true' : 'false'); });\n  }\n\n  // ---------------------------------------------------------------- events\n\n  root.addEventListener('click', function (e) {\n    var t = e.target.closest ? e.target.closest('button, a') : null;\n    if (!t || !root.contains(t)) return;\n    if (t.hasAttribute('data-ns-mode')) { setMode(t.getAttribute('data-ns-mode')); return; }\n    if (t.hasAttribute('data-ns-now')) { setNow(); state.timeAuto = true; firstUse(); render(); return; }\n    if (t.hasAttribute('data-ns-neg')) { toggleMinus(t.getAttribute('data-ns-neg')); return; }\n    if (t.hasAttribute('data-ns-copy')) {\n      var L = state.last;\n      if (!L) return;\n      copyText(L.line, 'Copied. Paste it into your spray record.');\n      track('guide_share', { guide_kind: state.mode, guide_via: 'copy_record', guide_rating: L.a.verdict });\n      return;\n    }\n    if (t.hasAttribute('data-ns-link')) {\n      copyText(shareUrl(), 'Link copied.');\n      track('guide_share', { guide_kind: state.mode, guide_via: 'copy_link', guide_rating: state.last ? state.last.a.verdict : undefined });\n      return;\n    }\n    if (t.hasAttribute('data-ns-printcard')) { printWith('nora-print-ns', 'print'); return; }\n    if (t.id === 'ns-peek') {\n      if (!state.last && state.errs.length) goToFirstError();\n      else showCard();\n      return;\n    }\n    if (t.hasAttribute('data-ns-quote')) {\n      track('guide_quote_click', { guide_kind: state.mode, guide_rating: state.last ? state.last.a.verdict : undefined });\n    }\n  });\n  // Print links can sit anywhere on the page, including the chart in the page copy.\n  document.addEventListener('click', function (e) {\n    var t = e.target.closest ? e.target.closest('[data-ns-print], a.nora-print-link') : null;\n    if (!t || !document.getElementById('delta-t-chart')) return;\n    e.preventDefault();\n    printWith('nora-print-dt', 'print_chart');\n  });\n\n  root.addEventListener('focusout', function (e) {\n    // Only mark the fields here. Redrawing the card on blur would swap the Copy button under a tap that started it.\n    if (e.target.id && e.target.classList.contains('ns-in')) markFields(S.weather(currentWeather()));\n    setTimeout(peek, 0);\n  });\n  // Tapping or tabbing into a number box selects its value, so typing replaces it.\n  // The click that focused the box would clear the selection on release, so that one release is cancelled.\n  var selectOnUp = null;\n  function selectAll(t) { try { t.setSelectionRange(0, t.value.length); } catch (err) { try { t.select(); } catch (e2) { /* ignore */ } } }\n  root.addEventListener('focusin', function (e) {\n    peek();\n    var t = e.target;\n    if (!(t.classList && t.classList.contains('ns-in') && t.getAttribute('inputmode') === 'decimal')) return;\n    // A lone minus from the Below 0 button stays, with the cursor after it, ready for the number.\n    if (t.value === '-') return;\n    selectAll(t);\n    selectOnUp = t;\n    t.setAttribute('data-ns-focus-value', t.value);\n    setTimeout(function () { if (selectOnUp === t) selectOnUp = null; }, 600);\n  });\n  ['mouseup', 'touchend'].forEach(function (type) {\n    root.addEventListener(type, function (e) {\n      if (selectOnUp && e.target === selectOnUp) {\n        var t = selectOnUp;\n        selectOnUp = null;\n        if (type === 'mouseup') e.preventDefault();\n        setTimeout(function () { if (document.activeElement === t && t.value === t.getAttribute('data-ns-focus-value')) selectAll(t); }, 0);\n      }\n    });\n  });\n  // Enter moves to the next box, and closes the phone keyboard after the last one.\n  root.addEventListener('keydown', function (e) {\n    if (e.key !== 'Enter' || !e.target.classList || !e.target.classList.contains('ns-in')) return;\n    e.preventDefault();\n    var boxes = $$('.ns-form .ns-in[inputmode=\"decimal\"]').filter(function (x) { return x.offsetParent !== null; });\n    var i = boxes.indexOf(e.target);\n    if (i > -1 && i < boxes.length - 1) boxes[i + 1].focus();\n    else e.target.blur();\n  });\n\n  // Readings: the weather boxes, the wind and its direction, and the signs. The label's band is not a reading.\n  var READINGS = { 'ns-t': 1, 'ns-rh': 1, 'ns-dry': 1, 'ns-wet': 1, 'ns-elev': 1, 'ns-wind': 1, 'ns-dir': 1 };\n  root.addEventListener('input', function (e) {\n    if (!e.target.id && e.target.name !== 'ns-sign') return;\n    if (e.target.id === 'ns-when') return;\n    if (e.target.id) state.typed[e.target.id] = true;\n    if (e.target.id === 'ns-wmin' || e.target.id === 'ns-wmax') { var note = $('#ns-band-note'); if (note) note.hidden = true; }\n    firstUse();\n    if (READINGS[e.target.id] || e.target.name === 'ns-sign') readingChanged();\n    syncMinus();\n    render();\n  });\n  root.addEventListener('change', function (e) {\n    // A time typed by the visitor stays as typed; the record warns if it is old.\n    if (e.target.id === 'ns-when') { state.timeAuto = false; firstUse(); render(); return; }\n    if (e.target.tagName === 'SELECT' || e.target.name === 'ns-sign') { firstUse(); if (READINGS[e.target.id] || e.target.name === 'ns-sign') readingChanged(); render(); }\n  });\n  var form = $('#ns-form');\n  if (form) form.addEventListener('submit', function (e) { e.preventDefault(); if (document.activeElement && document.activeElement.blur) document.activeElement.blur(); render(); });\n\n  // ---------------------------------------------------------------- start\n\n  // One message line under each box, for the words that explain a red box (ALL-01). The band has its own line.\n  $$('.ns-field .ns-inwrap, .ns-elevrow .ns-inwrap').forEach(function (wrap) {\n    var input = wrap.querySelector('.ns-in');\n    if (!input) return;\n    var p = document.createElement('p');\n    p.className = 'ns-err';\n    p.id = input.id + '-err';\n    p.setAttribute('data-ns-for', input.id);\n    p.hidden = true;\n    wrap.parentNode.insertBefore(p, wrap.nextSibling);\n  });\n  var bandErr = $('#ns-band-err');\n  if (bandErr) bandErr.setAttribute('data-ns-for', 'ns-wmax');\n  setNow();\n  var restored = restore();\n  // A share link opened in a tab already on this page changes only the part after #, so the browser does not load the\n  // page again and the old figures stayed. Load it again, so the new link is read like any other (ALL-R3). The tool\n  // writes its own link with replaceState, which does not fire hashchange.\n  window.addEventListener('hashchange', function () { if (location.hash.indexOf('#spray&') === 0) location.reload(); });\n  if (!restored) {\n    setMode('rh', true);\n    var band = rememberedBand();\n    if (band) { setVal('ns-wmin', band.lo); setVal('ns-wmax', band.hi); var note = $('#ns-band-note'); if (note) note.hidden = false; }\n  }\n  syncMinus();\n  render();\n  stickyTop();\n  window.addEventListener('resize', stickyTop);\n  watchPeek();\n  root.setAttribute('data-ready', '1');\n  // A reload or Back also restores the readings from the address; only a link opened fresh counts as restored.\n  var nav = '';\n  try { nav = (performance.getEntriesByType('navigation')[0] || {}).type || ''; } catch (e) { /* ignore */ }\n  if (restored && state.last) {\n    state.used = true;\n    state.edited = true;\n    if (nav !== 'reload' && nav !== 'back_forward') track('guide_result_shown', { guide_kind: state.mode, guide_rating: state.last.a.verdict, guide_restored: 1 });\n  }\n})();\n"],
  "mappings": "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",
  "names": ["note"]
}
