{
  "version": 3,
  "sources": ["/cdn/shop/t/4/assets/nora-termite.js?nc=3759"],
  "sourcesContent": ["/*\n * NORA PRO termite treatment engine (Termite Barrier Calculator).\n * Pure maths for the calculator page. No DOM, no network.\n * Used by:\n *   - the page UI (built into the theme asset assets/nora-termite.js by tools/termite-calc/build.mjs)\n *   - the tests (tools/termite-calc/test-engine.mjs) and the page copy (tools/termite-calc/build-copy.mjs)\n *\n * A job is made of parts: a trench, rodding under concrete, a soil surface, holes drilled through a slab, or foam.\n * Each part takes the volume rate from the visitor's own label (L per m3 of soil, L per metre, L per hole or L per m2)\n * and gives the litres of mixed termiticide. The job adds the parts up, works out the product from the label's mix\n * rate, and splits the mix into tank fills.\n * It never supplies a rate. Every rate field starts empty and the visitor types the figure from their label.\n * Figures are rounded up, so the calculator never shows less than the maths gives.\n */\n(function (root, factory) {\n  if (typeof module === 'object' && module.exports) module.exports = factory();\n  else root.NoraTermite = factory();\n})(typeof self !== 'undefined' ? self : this, function () {\n  'use strict';\n\n  var TYPES = {\n    trench: { name: 'Trench and treat', zone: 'Vertical zone', code: 't' },\n    rod: { name: 'Rodding under concrete', zone: 'Vertical zone', code: 'r' },\n    soil: { name: 'Spray the soil surface', zone: 'Horizontal zone', code: 's' },\n    slab: { name: 'Drill and inject through a slab', zone: 'Horizontal zone', code: 'b' },\n    foam: { name: 'Foam', zone: 'Voids and foam', code: 'f' },\n  };\n  var ORDER = ['trench', 'rod', 'soil', 'slab', 'foam'];\n  var MAX_PARTS = 12;\n\n  // How a label can give the volume for each kind of part.\n  var UNITS = { trench: ['m3', 'lm'], rod: ['m3', 'lm', 'hole'], soil: ['m2'], slab: ['m2', 'hole'] };\n  var UNIT_TEXT = { m3: 'L per m\u00B3 of soil', lm: 'L per metre', hole: 'L per hole', m2: 'L per m\u00B2' };\n  var UNIT_SHORT = { m3: 'L per m\u00B3', lm: 'L per metre', hole: 'L per hole', m2: 'L per m\u00B2' };\n\n  // Inputs the calculator accepts. Anything outside is refused with a message.\n  var LIM = {\n    len: 5000, w: [10, 1000], d: [10, 3000], s: [50, 1000], area: 100000, vl: 1000, vh: 100, vd: [1, 3000],\n    rate: { m3: 1000, lm: 200, hole: 50, m2: 100 }, ratio: 100, agent: 100, amount: 100000, per: 100000, tank: [0.5, 10000],\n  };\n\n  // What the three current labels we read say (Termidor Residual, Altriset, Biflex AquaMax; see SOURCES.md).\n  // Used only for the check notes. The calculator never fills these in.\n  var LABELS = {\n    m3: [70, 200], // lowest reduced water volume (70 L per m3) to rodding under concrete (200 L per m3)\n    m2: [2, 10], // lowest water volume any of them allows (2 L per m2) to injecting through a slab (10 L per m2)\n    m2Common: 3, // Termidor Residual and Altriset: not below 3 L per m2\n    width: 150, // vertical zone at least 150 mm wide\n    spacing: [200, 300], // widest hole spacing: 200 mm (Termidor Residual), 300 mm (Altriset, Biflex AquaMax)\n    lm: [5, 10], // litres per metre in the label tables (Biflex AquaMax 5 and 10; Altriset rodding 10)\n    hole: 3, // most per hole in the rodding tables (Altriset 300 mm)\n    slab: [5, 10], // through a slab: the 5 L per m2 soil rate, increased up to 10 L per m2\n    mix: [1, 20], // mL of product per litre of mix: the labels we read use 2.5 (Altriset) to 10 (Termidor, reduced water)\n  };\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  function num(x) {\n    if (typeof x === 'number') return x;\n    if (x === null || x === undefined) 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  // A unit typed after the number is fine when it is the unit the box already shows: \"30 m\", \"150mm\", \"5 L per m\u00B2\".\n  var RATE_UNITS = { m3: 'm\u00B3|m3|cubic met(re|er)s?|m\u00B3 of soil|m3 of soil', lm: 'm|lm|metres?|meters?|lin(ear)? ?m(etres?)?', hole: 'holes?', m2: 'm\u00B2|m2|sq ?m|square met(re|er)s?' };\n  function unitRe(key, unit) {\n    switch (key) {\n      case 'len': case 'vl': case 'vh': return /\\s*(m|metres?|meters?)$/i;\n      case 'w': case 'd': case 's': case 'vd': return /\\s*(mm|millimet(re|er)s?)$/i;\n      case 'area': return new RegExp('\\\\s*(' + RATE_UNITS.m2 + ')$', 'i');\n      case 'rate': case 'frate': return new RegExp('\\\\s*l(itres?)?(\\\\s*(\\\\/|per|a|each)\\\\s*(' + RATE_UNITS[unit || 'm2'] + '))?$', 'i');\n      case 'agent': return /\\s*ml(\\s*(\\/|per|a|each)\\s*l(itres?)?( of mix)?)?$/i;\n      case 'ml': return /\\s*ml$/i;\n      case 'L': case 'per': case 'tank': return /\\s*l(itres?)?$/i;\n      default: return null;\n    }\n  }\n  function stripUnit(x, key, unit) {\n    if (x === null || x === undefined || typeof x === 'number') return x;\n    var s = String(x).trim();\n    var re = unitRe(key, unit);\n    return re ? s.replace(re, '') : s;\n  }\n  // An expansion ratio can be typed as 15 or 15:1.\n  function ratioNum(x) {\n    var s = String(x === null || x === undefined ? '' : x).trim().replace(/\\s+/g, '');\n    var m = s.match(/^(.*?):1$/);\n    return num(m ? m[1] : 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  // ---------- Formatting (Australian English, metric). Figures are rounded up. ----------\n\n  function up(x, dp) { var f = Math.pow(10, dp); return Math.ceil(x * f - 1e-6) / f; }\n  function group(s) {\n    var parts = s.split('.');\n    parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n    return parts.join('.');\n  }\n  function trim(s) { return s.indexOf('.') > -1 ? s.replace(/0+$/, '').replace(/\\.$/, '') : s; }\n  // A number the visitor typed, shown back as typed (no rounding up): 42, 0.15, 1,200, 0.0001.\n  function fmtNum(x, dp) {\n    if (!fin(x)) return '';\n    var s = trim(x.toFixed(dp === undefined ? 4 : dp));\n    return group(s === '-0' ? '0' : s);\n  }\n  // Litres worked out: 3 decimals under 1 L, 2 under 100 L, then 1.\n  function litresDp(x) { return x >= 100 ? 1 : x >= 1 ? 2 : 3; }\n  // Litres as shown: rounded up to the places fmtL shows. Parts, totals and fills are worked from these,\n  // so the figures on the card multiply and add up.\n  function upL(x) { return fin(x) ? up(x, litresDp(x)) : x; }\n  function fmtL(x) {\n    if (!fin(x)) return '';\n    var dp = litresDp(x);\n    return group(trim(up(x, dp).toFixed(dp))) + ' L';\n  }\n  // Product in mL: one decimal under 100 mL, whole mL from 100 mL, and the same amount in litres alongside from 1,000 mL.\n  function fmtMl(x) {\n    if (!fin(x)) return '';\n    if (x >= 1000) { var m = up(x, 0); return group(m.toFixed(0)) + ' mL (' + group(trim((m / 1000).toFixed(3))) + ' L)'; }\n    if (x >= 100) return up(x, 0).toFixed(0) + ' mL';\n    return trim(up(x, 1).toFixed(1)) + ' mL';\n  }\n  function fmtCount(n) { return fin(n) ? group(String(Math.round(n))) : ''; }\n  function plural(n, one, many) { return fmtCount(n) + ' ' + (n === 1 ? one : many); }\n  function fmtRatio(r) { return fmtNum(r, 2) + ':1'; }\n\n  // ---------- One part of the job ----------\n\n  // Reads a field. Returns the number, or an error object.\n  function fieldNum(x, key, unit) { return key === 'ratio' ? ratioNum(x) : num(stripUnit(x, key, unit)); }\n  function need(p, key, label, opts) {\n    var v = fieldNum(p[key], key, p.unit);\n    var ex = opts.ex ? ', for example ' + opts.ex : '';\n    if (blank(p[key])) return { field: key, error: 'Enter ' + label + ex + '.' };\n    if (!fin(v)) return { field: key, error: (/[^\\d\\s.,+\\-\\u2212]/.test(String(p[key])) ? 'Type ' + label + ' as a number only' : 'Enter ' + label + ' as a number') + ex + '.' };\n    var lo = opts.min === undefined ? 0 : opts.min;\n    var hi = opts.max;\n    if (opts.min === undefined ? v <= 0 : v < lo) return { field: key, error: opts.low || ('Enter ' + label + ' above ' + fmtNum(lo) + '.') };\n    if (v > hi) return { field: key, error: opts.high || ('Enter ' + label + ' up to ' + fmtNum(hi) + (opts.unit ? ' ' + opts.unit : '') + '.') };\n    return v;\n  }\n  function isErr(v) { return typeof v === 'object' && v !== null; }\n\n  // The fields each kind of part reads, in the order they show on the page.\n  function fields(p) {\n    switch (p.type) {\n      case 'trench': return p.unit === 'lm' ? ['len', 'rate'] : ['len', 'w', 'd', 'rate'];\n      case 'rod': return p.unit === 'm3' || !p.unit ? ['len', 's', 'w', 'd', 'rate'] : ['len', 's', 'rate'];\n      case 'soil': return ['area', 'rate'];\n      case 'slab': return ['area', 's', 'rate'];\n      case 'foam': return p.how === 'area' ? ['area', 'rate', 'ratio', 'agent'] : ['vl', 'vh', 'vd', 'ratio', 'farea', 'agent'];\n      default: return [];\n    }\n  }\n  var OPTIONAL = { agent: 1, farea: 1 };\n\n  function rateLimit(unit) { return LIM.rate[unit]; }\n\n  // p: { type, unit, len, w, d, s, area, rate, how, vl, vh, vd, ratio, agent, frate }\n  // Returns { ok: true, type, litres, ... } or { ok: false, empty: true } (nothing typed yet) or { ok: false, field, error }.\n  function part(p) {\n    if (!p || !TYPES[p.type]) return { ok: false, error: 'Unknown part.' };\n    var type = p.type;\n    var unit = type === 'foam' ? null : (UNITS[type].indexOf(p.unit) > -1 ? p.unit : UNITS[type][0]);\n    var q = {};\n    Object.keys(p).forEach(function (k) { q[k] = p[k]; });\n    q.unit = unit;\n    // The foam part's optional label rate for the area is typed into frate; farea is just its place in the list.\n    var list = fields(q);\n    var typed = list.some(function (k) { return k === 'farea' ? !blank(q.frate) : !blank(q[k]); });\n    if (!typed) return { ok: false, empty: true, type: type };\n\n    var r = { ok: true, type: type, unit: unit, notes: [] };\n    var v;\n    var rl = unit ? rateLimit(unit) : 0;\n    var rateLabel = unit ? 'the rate from your label in ' + UNIT_TEXT[unit] : '';\n\n    var RATE_EX = { m3: '100', lm: '5', hole: '2', m2: '5' };\n    var spacing = { min: LIM.s[0], max: LIM.s[1], unit: 'mm', ex: '200', low: 'Enter a hole spacing from ' + LIM.s[0] + ' to ' + fmtNum(LIM.s[1]) + ' mm.' };\n    if (type === 'trench' || type === 'rod') {\n      v = need(q, 'len', type === 'trench' ? 'the length of trench in metres' : 'the length to rod in metres', { max: LIM.len, unit: 'm', ex: '30' }); if (isErr(v)) return fail(v); r.len = v;\n      if (type === 'rod') { v = need(q, 's', 'the hole spacing in mm', spacing); if (isErr(v)) return fail(v); r.s = v; }\n      if (unit === 'm3') {\n        v = need(q, 'w', 'the width of the treated zone in mm', { min: LIM.w[0], max: LIM.w[1], unit: 'mm', ex: '150', low: 'Enter a width from ' + LIM.w[0] + ' to ' + fmtNum(LIM.w[1]) + ' mm.' }); if (isErr(v)) return fail(v); r.w = v;\n        v = need(q, 'd', 'the depth of the treated zone in mm', { min: LIM.d[0], max: LIM.d[1], unit: 'mm', ex: '350', low: 'Enter a depth from ' + LIM.d[0] + ' to ' + fmtNum(LIM.d[1]) + ' mm.' }); if (isErr(v)) return fail(v); r.d = v;\n      }\n      v = need(q, 'rate', rateLabel, { max: rl, unit: UNIT_SHORT[unit], ex: RATE_EX[unit] }); if (isErr(v)) return fail(v); r.rate = v;\n      if (type === 'trench') {\n        if (unit === 'm3') { r.perM = (r.w / 1000) * (r.d / 1000) * r.rate; r.soil = r.len * (r.w / 1000) * (r.d / 1000); }\n        else r.perM = r.rate;\n        r.litres = r.len * r.perM;\n      } else {\n        r.holes = Math.max(1, Math.ceil((r.len * 1000) / r.s - 1e-9));\n        if (unit === 'm3') { r.perHole = (r.w / 1000) * (r.d / 1000) * (r.s / 1000) * r.rate; r.soil = r.holes * (r.w / 1000) * (r.d / 1000) * (r.s / 1000); }\n        else if (unit === 'lm') r.perHole = r.rate * (r.s / 1000);\n        else r.perHole = r.rate;\n        r.perM = r.perHole * 1000 / r.s;\n        // Worked from the litres per hole as shown, so holes times the shown figure is never more than the part's litres.\n        r.litres = r.holes * upL(r.perHole);\n      }\n    } else if (type === 'soil' || type === 'slab') {\n      v = need(q, 'area', 'the area in m\u00B2', { max: LIM.area, unit: 'm\u00B2', ex: '12' }); if (isErr(v)) return fail(v); r.area = v;\n      if (type === 'slab') { v = need(q, 's', 'the hole spacing in mm', spacing); if (isErr(v)) return fail(v); r.s = v; }\n      v = need(q, 'rate', rateLabel, { max: rl, unit: UNIT_SHORT[unit], ex: type === 'slab' && unit === 'm2' ? '10' : RATE_EX[unit] }); if (isErr(v)) return fail(v); r.rate = v;\n      if (type === 'soil') { r.perM2 = r.rate; r.litres = r.area * r.rate; }\n      else {\n        var cell = Math.pow(r.s / 1000, 2);\n        r.exactHoles = r.area / cell;\n        r.holes = Math.max(1, Math.ceil(r.exactHoles - 1e-9));\n        r.perHole = unit === 'hole' ? r.rate : r.rate * cell;\n        r.perM2 = r.perHole / cell;\n        r.litres = r.holes * upL(r.perHole);\n      }\n    } else {\n      var ratio = function (ex) { return { min: 1, max: LIM.ratio, ex: ex + ' for ' + ex + ':1', low: 'An expansion ratio is 1:1 or more. Enter ' + ex + ' for ' + ex + ':1.', high: 'Enter an expansion ratio up to ' + LIM.ratio + ' (type ' + ex + ' for ' + ex + ':1).' }; };\n      r.how = q.how === 'area' ? 'area' : 'void';\n      if (r.how === 'void') {\n        v = need(q, 'vl', 'the length of the void in metres', { max: LIM.vl, unit: 'm', ex: '2' }); if (isErr(v)) return fail(v); r.vl = v;\n        v = need(q, 'vh', 'the height or width of the void in metres', { max: LIM.vh, unit: 'm', ex: '1.5' }); if (isErr(v)) return fail(v); r.vh = v;\n        v = need(q, 'vd', 'the depth of the void in mm', { min: LIM.vd[0], max: LIM.vd[1], unit: 'mm', ex: '40', low: 'Enter a depth from ' + LIM.vd[0] + ' to ' + fmtNum(LIM.vd[1]) + ' mm.' }); if (isErr(v)) return fail(v); r.vd = v;\n        v = need(q, 'ratio', 'the foam expansion ratio', ratio('15')); if (isErr(v)) return fail(v); r.ratio = v;\n        if (!blank(q.frate)) {\n          v = need(q, 'frate', 'the label rate for the area in L per m\u00B2', { max: LIM.rate.m2, unit: 'L per m\u00B2', ex: '10' }); if (isErr(v)) return fail(v); r.frate = v;\n        }\n        // m x m x mm is litres. The mix and any extra liquid are rounded up as shown, and the part is their sum.\n        r.foam = r.vl * r.vh * r.vd;\n        r.liquidInFoam = upL(r.foam / r.ratio);\n        r.litres = r.liquidInFoam;\n        if (r.frate !== undefined) {\n          r.area = r.vl * r.vh;\n          r.needed = r.area * r.frate;\n          if (r.needed > r.liquidInFoam * (1 + 1e-9)) { r.extra = upL(r.needed - r.liquidInFoam); r.litres = r.liquidInFoam + r.extra; }\n        }\n      } else {\n        v = need(q, 'area', 'the area in m\u00B2', { max: LIM.area, unit: 'm\u00B2', ex: '3' }); if (isErr(v)) return fail(v); r.area = v;\n        v = need(q, 'rate', 'the label rate in L of mix per m\u00B2', { max: LIM.rate.m2, unit: 'L per m\u00B2', ex: '5' }); if (isErr(v)) return fail(v); r.rate = v;\n        v = need(q, 'ratio', 'the foam expansion ratio', ratio('10')); if (isErr(v)) return fail(v); r.ratio = v;\n        r.litres = upL(r.area * r.rate);\n        r.liquidInFoam = r.litres;\n        r.foam = r.litres * r.ratio;\n      }\n      if (!blank(q.agent)) {\n        v = need(q, 'agent', 'the foaming agent in mL per litre of mix', { max: LIM.agent, unit: 'mL per L', ex: '15' }); if (isErr(v)) return fail(v); r.agent = v;\n        r.agentMl = r.liquidInFoam * r.agent;\n      }\n    }\n    // The part's litres as shown on the card, so the parts add up to the total.\n    r.litres = upL(r.litres);\n    // \"2,500\" is read as two thousand five hundred. Someone who uses a comma for the decimal point may have meant 2.5.\n    ['len', 'vl', 'vh', 'area'].some(function (k) {\n      var raw = String(stripUnit(q[k], k) || '');\n      if (r[k] === undefined || !/^\\d{1,3}(,\\d{3})+(\\.\\d+)?$/.test(raw)) return false;\n      var u = k === 'area' ? 'm\u00B2' : 'm';\n      r.notes.push({ level: 'warn', id: 'comma', text: 'You typed ' + raw + ', which reads as ' + fmtNum(r[k]) + ' ' + u + '. If you meant ' + fmtNum(num(raw.replace(',', '.'))) + ' ' + u + ', type a full stop, not a comma.' });\n      return true;\n    });\n    addNotes(r);\n    return r;\n  }\n  function fail(e) { return { ok: false, field: e.field, error: e.error }; }\n\n  // Checks against what the labels we read say. A note never changes a figure.\n  function addNotes(r) {\n    var n = r.notes;\n    var push = function (level, id, text) { n.push({ level: level, id: id, text: text }); };\n    var notMl = ' Check you have entered litres of mixed spray, not mL of product.';\n    if ((r.type === 'trench' || r.type === 'rod') && r.unit === 'm3') {\n      if (r.w < LABELS.width) push('warn', 'narrow', fmtNum(r.w) + ' mm is narrower than the ' + LABELS.width + ' mm the labels we read ask for as the least width of a vertical zone.');\n      if (r.rate > 250) push('warn', 'rate-high', fmtNum(r.rate) + ' L per m\u00B3 is more than the ' + LABELS.m3[0] + ' to ' + LABELS.m3[1] + ' L per m\u00B3 of soil the labels we read use.' + notMl);\n      else if (r.rate > LABELS.m3[1]) push('note', 'rate-above', fmtNum(r.rate) + ' L per m\u00B3 is more than the ' + LABELS.m3[1] + ' L per m\u00B3 the labels we read use under concrete. Check the rate on your label.');\n      else if (r.rate < LABELS.m3[0]) push('warn', 'rate-low', fmtNum(r.rate) + ' L per m\u00B3 is less than ' + LABELS.m3[0] + ' L per m\u00B3, the lowest volume any label we read allows for a vertical zone. Check the rate on your label.');\n    }\n    if ((r.type === 'trench' || r.type === 'rod') && r.unit === 'lm') {\n      var lm = LABELS.lm[0] + ' to ' + LABELS.lm[1] + ' L per metre';\n      if (r.rate > 25) push('warn', 'rate-high', fmtNum(r.rate) + ' L per metre is more than the labels we read use (' + lm + ').' + notMl);\n      else if (r.rate > LABELS.lm[1]) push('note', 'rate-above', fmtNum(r.rate) + ' L per metre is more than the ' + lm + ' the labels we read use. Check the rate on your label.');\n      else if (r.rate < LABELS.lm[0]) push('warn', 'rate-low', fmtNum(r.rate) + ' L per metre is less than the ' + lm + ' the labels we read use.' + (r.type === 'rod' ? ' If your label gives litres per hole, choose L per hole and enter that figure.' : ' Check the rate on your label.'));\n    }\n    if (r.type === 'rod' || r.type === 'slab') {\n      if (r.unit === 'hole' && r.perHole > 5) push('warn', 'rate-high', fmtNum(r.perHole) + ' L per hole is more than the labels we read use (up to ' + LABELS.hole + ' L per hole).' + notMl);\n      else if (r.unit === 'hole' && r.perHole > LABELS.hole) push('note', 'rate-above', fmtNum(r.perHole) + ' L per hole is more than the labels we read use (up to ' + LABELS.hole + ' L per hole). Check the rate on your label.');\n      if (r.s > LABELS.spacing[1]) push('warn', 'spacing-wide', 'Holes ' + fmtNum(r.s) + ' mm apart are wider than any label we read allows (' + LABELS.spacing[1] + ' mm at most). Check your label.');\n      else if (r.s > LABELS.spacing[0]) push('note', 'spacing', 'Some labels set ' + LABELS.spacing[0] + ' mm as the widest hole spacing. Check yours.');\n    }\n    if (r.type === 'soil') {\n      if (r.rate > 12) push('warn', 'rate-high', fmtNum(r.rate) + ' L per m\u00B2 is more than the labels we read use (5 L per m\u00B2 on soil).' + notMl);\n      else if (r.rate < LABELS.m2[0]) push('warn', 'rate-low', fmtNum(r.rate) + ' L per m\u00B2 is below ' + LABELS.m2[0] + ' L per m\u00B2, the lowest water volume any label we read allows. Check the rate on your label.');\n      else if (r.rate < LABELS.m2Common) push('note', 'rate-3', 'Some labels say not to use water volumes below ' + LABELS.m2Common + ' L per m\u00B2. Check yours.');\n    }\n    if (r.type === 'slab' && r.unit === 'm2') {\n      // A figure per hole typed into the L per m\u00B2 box gives far too little mix, so a low rate is a warning.\n      if (r.rate > 15) push('warn', 'rate-high', fmtNum(r.rate) + ' L per m\u00B2 is more than the labels we read use (up to ' + LABELS.slab[1] + ' L per m\u00B2 through a slab).' + notMl);\n      else if (r.rate < LABELS.slab[0]) push('warn', 'slab-low', fmtNum(r.rate) + ' L per m\u00B2 is less than the labels we read use through a slab (' + LABELS.slab[0] + ' to ' + LABELS.slab[1] + ' L per m\u00B2). If your label gives litres per hole, choose L per hole and enter that figure.');\n      if (r.rate >= LABELS.slab[0]) push('note', 'per-hole', 'Some labels list a volume per hole for each spacing that is more than this works out to. If yours does, choose L per hole and enter the label\u2019s figure.');\n    }\n    if (r.type === 'slab' && r.holes > r.exactHoles + 0.05) push('note', 'holes-up', 'Holes are rounded up to whole holes: ' + fmtNum(r.area, 2) + ' m\u00B2 at ' + fmtNum(r.s) + ' mm is ' + fmtNum(r.exactHoles, 1) + ' holes, so this part uses ' + fmtCount(r.holes) + '. A small area gets a little more than the label\u2019s holes per m\u00B2.');\n    if (r.type === 'foam') {\n      if (r.extra !== undefined) push('warn', 'foam-short', 'The foam carries ' + fmtL(r.liquidInFoam) + ' of mix, less than the ' + fmtL(r.needed) + ' your label rate needs for ' + fmtNum(r.area, 2) + ' m\u00B2. Labels say to apply extra liquid to make up the rest: ' + fmtL(r.extra) + '. The total for this part includes it.');\n      else if (r.frate !== undefined) push('note', 'foam-ok', 'The foam carries enough mix for your label rate over ' + fmtNum(r.area, 2) + ' m\u00B2 (' + fmtL(r.needed) + ').');\n      push('note', 'foam-alone', 'Labels say foam is not a stand alone treatment: follow it with a continuous soil treatment as per AS 3660.2.');\n    }\n  }\n\n  // ---------- The whole job ----------\n\n  // in: { parts: [part inputs], mix: { amount, unit: 'mL' | 'L', per }, tank }\n  function readMix(m) {\n    m = m || {};\n    if (blank(m.amount) && blank(m.per)) return null;\n    var unit = m.unit === 'L' ? 'L' : 'mL';\n    var a = num(stripUnit(m.amount, unit === 'L' ? 'L' : 'ml'));\n    var per = num(stripUnit(m.per, 'per'));\n    var only = function (x, what) { return /[^\\d\\s.,+\\-\u2212]/.test(String(x)) ? 'Type the ' + what + ' as a number only.' : 'Enter the ' + what + ' as a number above 0.'; };\n    if (blank(m.amount)) return { ok: false, field: 'amount', error: 'Enter the amount of product in the label\u2019s mix rate.' };\n    if (!fin(a) || a <= 0) return { ok: false, field: 'amount', error: only(m.amount, 'amount of product') };\n    if (blank(m.per)) return { ok: false, field: 'per', error: 'Enter the litres of water in the label\u2019s mix rate.' };\n    if (!fin(per) || per <= 0) return { ok: false, field: 'per', error: only(m.per, 'litres of water') };\n    if (per > LIM.per) return { ok: false, field: 'per', error: 'Enter up to ' + fmtNum(LIM.per) + ' L of water.' };\n    var ml = unit === 'L' ? a * 1000 : a;\n    // Either box can be the slip, so both are marked.\n    if (ml / 1000 >= per) return { ok: false, field: 'amount', fields: ['amount', 'per'], error: 'That is as much product as water. Check the amount and the litres of water against the mix rate on your label.' };\n    if (ml > LIM.amount) return { ok: false, field: 'amount', error: 'Enter up to ' + fmtNum(LIM.amount) + ' mL of product.' };\n    var out = { ok: true, amount: a, unit: unit, per: per, mlPerL: ml / per, notes: [] };\n    // A mix far outside what termiticide labels use is most often the amount and the water swapped, or mL typed for L.\n    if (out.mlPerL < LABELS.mix[0] || out.mlPerL > LABELS.mix[1]) {\n      out.notes.push({ level: 'warn', id: 'mix-odd', text: 'That is ' + fmtPerL(out.mlPerL) + ' mL of product in each litre of mix. The labels we read use about 2.5 to 10 mL in each litre (250 mL to 1 L in 100 L). Check the amount of product, its unit and the litres of water against your label.' });\n    }\n    return out;\n  }\n  function readTank(t) {\n    if (blank(t)) return null;\n    var v = num(stripUnit(t, 'tank'));\n    if (!fin(v)) return { ok: false, field: 'tank', error: /[^\\d\\s.,+\\-\u2212]/.test(String(t)) ? 'Type the tank size in litres as a number only, for example 100.' : 'Enter the tank size in litres as a number.' };\n    if (v < LIM.tank[0] || v > LIM.tank[1]) return { ok: false, field: 'tank', error: 'Enter a tank size from ' + fmtNum(LIM.tank[0]) + ' to ' + fmtNum(LIM.tank[1]) + ' L.' };\n    return { ok: true, size: v };\n  }\n  // mL of product in each litre, readable at a glance and never 0 (TB-R2): 0.004, 2.5, 3.75, 12.5, 267.\n  function fmtPerL(x) {\n    if (!fin(x)) return '';\n    if (x > 0 && x < 0.001) return 'less than 0.001';\n    return fmtNum(x, x < 10 ? 3 : x < 100 ? 1 : 0);\n  }\n  // The mix in plain words: \"4 mL in each litre of mix\".\n  function mixPerLitre(m) { return fmtPerL(m.mlPerL) + ' mL in each litre of mix'; }\n\n  function job(input) {\n    input = input || {};\n    var parts = (input.parts || []).slice(0, MAX_PARTS).map(part);\n    var done = parts.filter(function (r) { return r.ok; });\n    var waiting = [];\n    parts.forEach(function (r, i) { if (!r.ok && !r.empty) waiting.push(i); });\n    var mix = readMix(input.mix);\n    var tank = readTank(input.tank);\n    var out = { ok: done.length > 0, parts: parts, count: done.length, waiting: waiting, mix: mix, tank: tank };\n    // Each part is already rounded up as shown, so the shown parts add up to the shown total.\n    out.litres = upL(done.reduce(function (a, r) { return a + r.litres; }, 0));\n    out.foam = done.reduce(function (a, r) { return a + (r.foam || 0); }, 0);\n    out.agentMl = done.reduce(function (a, r) { return a + (r.agentMl || 0); }, 0);\n    out.hasFoam = done.some(function (r) { return r.type === 'foam'; });\n    out.hasAgent = done.some(function (r) { return r.agentMl !== undefined; });\n    if (mix && mix.ok) {\n      out.productMl = out.litres * mix.mlPerL;\n      done.forEach(function (r) {\n        r.productMl = r.litres * mix.mlPerL;\n        // Product per unit of the label's rate, to check against a label that gives the rate as product (for example mL per m3 of soil).\n        if (r.unit === 'm3') r.productPer = { ml: r.rate * mix.mlPerL, per: 'm\u00B3 of soil' };\n        else if (r.unit === 'm2' || r.type === 'soil') r.productPer = { ml: r.perM2 * mix.mlPerL, per: 'm\u00B2' };\n        else if (r.type === 'foam' && r.how === 'area') r.productPer = { ml: r.rate * mix.mlPerL, per: 'm\u00B2' };\n        else if (r.unit === 'lm') r.productPer = { ml: r.perM * mix.mlPerL, per: 'metre' };\n        else if (r.unit === 'hole') r.productPer = { ml: r.perHole * mix.mlPerL, per: 'hole' };\n      });\n    }\n    if (tank && tank.ok && out.ok) {\n      var full = Math.floor(out.litres / tank.size + 1e-9);\n      var last = out.litres - full * tank.size;\n      if (last < 1e-9) last = 0;\n      out.fills = { size: tank.size, fills: full + (last > 0 ? 1 : 0), full: full, last: last };\n      if (mix && mix.ok) { out.fills.perFull = tank.size * mix.mlPerL; out.fills.lastMl = last * mix.mlPerL; }\n    }\n    return out;\n  }\n\n  // ---------- Words ----------\n\n  // The inputs of a part in plain words, for the summary.\n  function describe(r) {\n    var t = TYPES[r.type].name;\n    var holes = r.s !== undefined ? ', holes ' + fmtNum(r.s) + ' mm apart' : '';\n    switch (r.type) {\n      case 'trench':\n      case 'rod':\n        return t + ', ' + fmtNum(r.len, 2) + ' m' + holes + (r.unit === 'm3' ? ', ' + fmtNum(r.w) + ' mm wide by ' + fmtNum(r.d) + ' mm deep' : '') + ' at ' + fmtNum(r.rate) + ' ' + UNIT_SHORT[r.unit];\n      case 'soil':\n      case 'slab':\n        return t + ', ' + fmtNum(r.area, 2) + ' m\u00B2' + holes + ' at ' + fmtNum(r.rate) + ' ' + UNIT_SHORT[r.unit];\n      default:\n        if (r.how === 'area') return 'Foam over an area, ' + fmtNum(r.area, 2) + ' m\u00B2 at ' + fmtNum(r.rate) + ' L per m\u00B2, ' + fmtRatio(r.ratio);\n        return 'Foam into a void, ' + fmtNum(r.vl, 2) + ' m by ' + fmtNum(r.vh, 2) + ' m by ' + fmtNum(r.vd) + ' mm deep at ' + fmtRatio(r.ratio) + (r.frate !== undefined ? ', label rate ' + fmtNum(r.frate) + ' L per m\u00B2' : '');\n    }\n  }\n  // What the part works out to, in plain words.\n  function outcome(r) {\n    var bits = [];\n    if (r.type === 'trench') { if (r.unit === 'm3') bits.push(fmtL(r.perM) + ' per metre'); bits.push(fmtL(r.litres) + ' of mix'); }\n    else if (r.type === 'rod' || r.type === 'slab') {\n      bits.push(plural(r.holes, 'hole', 'holes'));\n      if (r.unit !== 'hole') bits.push(fmtL(r.perHole) + ' per hole');\n      bits.push(fmtL(r.litres) + ' of mix');\n    } else if (r.type === 'soil') bits.push(fmtL(r.litres) + ' of mix');\n    else {\n      if (r.how === 'void') {\n        bits.push(fmtL(r.foam) + ' of foam from ' + fmtL(r.liquidInFoam) + ' of mix');\n        if (r.extra !== undefined) bits.push('plus ' + fmtL(r.extra) + ' as liquid, ' + fmtL(r.litres) + ' in all');\n      } else bits.push(fmtL(r.litres) + ' of mix makes ' + fmtL(r.foam) + ' of foam');\n      if (r.agentMl !== undefined) bits.push(fmtMl(r.agentMl) + ' of foaming agent');\n    }\n    if (r.productMl !== undefined) bits.push(fmtMl(r.productMl) + ' of product');\n    return bits.join(', ');\n  }\n\n  function mixText(m) { return fmtNum(m.amount) + ' ' + m.unit + ' in ' + fmtNum(m.per) + ' L of water'; }\n\n  function fillsText(j) {\n    var f = j.fills;\n    if (!f) return '';\n    var size = fmtNum(f.size, 2) + ' L tank';\n    var withP = function (ml) { return ml !== undefined ? ' with ' + fmtMl(ml) + ' of product' : ''; };\n    if (f.fills === 1) return size + ': one fill of ' + fmtL(j.litres) + withP(f.lastMl !== undefined && f.last > 0 ? f.lastMl : f.perFull) + '.';\n    if (f.last === 0) return size + ': ' + fmtCount(f.full) + ' full fills' + withP(f.perFull).replace(' with ', ', each with ') + '.';\n    return size + ': ' + fmtCount(f.fills) + ' fills, ' + plural(f.full, 'full fill', 'full fills') + withP(f.perFull) + (f.full > 1 ? ' each' : '') + ' and a last fill of ' + fmtL(f.last) + withP(f.lastMl) + '.';\n  }\n\n  // \"part 4\", \"parts 1 and 3\", \"parts 1, 3, 6, 8 and 9\" (indexes from 0).\n  function listParts(idx) {\n    var n = idx.map(function (i) { return String(i + 1); });\n    if (n.length === 1) return 'part ' + n[0];\n    return 'parts ' + n.slice(0, -1).join(', ') + ' and ' + n[n.length - 1];\n  }\n  function pad(n) { return (n < 10 ? '0' : '') + n; }\n  function fmtDate(d) { return d instanceof Date && !isNaN(d.getTime()) ? pad(d.getDate()) + '/' + pad(d.getMonth() + 1) + '/' + d.getFullYear() : ''; }\n\n  // The job as plain text, to paste into a job record or certificate of installation.\n  // opts: { when: Date, product: 'name typed by the visitor', source: 'page address' }\n  function summary(j, opts) {\n    opts = opts || {};\n    if (!j || !j.ok) return '';\n    var lines = [];\n    var date = fmtDate(opts.when);\n    lines.push('Termite treatment volumes' + (date ? ', ' + date : ''));\n    var prod = cleanName(opts.product);\n    if (prod) lines.push('Product: ' + prod + (j.mix && j.mix.ok ? ', ' + mixText(j.mix) : ''));\n    else if (j.mix && j.mix.ok) lines.push('Mix: ' + mixText(j.mix));\n    var n = 0;\n    j.parts.forEach(function (r) { if (r.ok) { n += 1; lines.push(n + '. ' + describe(r) + ': ' + outcome(r)); } });\n    var total = 'Total: ' + fmtL(j.litres) + ' of mix';\n    if (j.productMl !== undefined) total += ' with ' + fmtMl(j.productMl) + ' of product';\n    if (j.hasFoam && j.foam > 0) total += '. Foam: ' + fmtL(j.foam);\n    if (j.hasAgent) total += ', with ' + fmtMl(j.agentMl) + ' of foaming agent';\n    lines.push(total + '.');\n    if (j.fills) lines.push(fillsText(j));\n    if (j.waiting.length) lines.push('Not included: ' + listParts(j.waiting) + ' (not finished).');\n    lines.push('Check every figure against the product label. ' + (opts.source ? 'Worked out at ' + opts.source : ''));\n    return lines.join('\\n').replace(/\\s+$/, '');\n  }\n\n  // A product name the visitor typed: letters, numbers, spaces and simple punctuation only.\n  function cleanName(s) {\n    if (blank(s)) return '';\n    return String(s).replace(/[^A-Za-z0-9 .()&+'\\/%]/g, ' ').replace(/\\s+/g, ' ').trim().slice(0, 40);\n  }\n\n  // ---------- Share links ----------\n\n  // #termite&m=600_mL_100&tk=100&pn=Name&p=t_m3_42_100_150_350~r_m3_6_200_200_150_350\n  var ORDERS = {\n    trench: ['unit', 'len', 'rate', 'w', 'd'],\n    rod: ['unit', 'len', 's', 'rate', 'w', 'd'],\n    soil: ['area', 'rate'],\n    slab: ['unit', 'area', 's', 'rate'],\n    foam: ['how', 'vl', 'vh', 'vd', 'ratio', 'frate', 'area', 'rate', 'agent'],\n  };\n  function cleanVal(v, key, unit) {\n    var s = String(v === null || v === undefined ? '' : v).trim();\n    var n = key ? fieldNum(s, key, unit) : num(s);\n    if (s === '' || !fin(n)) n = ratioNum(s);\n    if (s === '' || !fin(n)) return '';\n    return String(n).slice(0, 10);\n  }\n  function encode(state) {\n    var bits = ['termite'];\n    var m = state.mix || {};\n    if (!blank(m.amount) || !blank(m.per)) bits.push('m=' + [cleanVal(m.amount, m.unit === 'L' ? 'L' : 'ml'), m.unit === 'L' ? 'L' : 'mL', cleanVal(m.per, 'per')].join('_'));\n    if (!blank(state.tank) && cleanVal(state.tank, 'tank')) bits.push('tk=' + cleanVal(state.tank, 'tank'));\n    var pn = cleanName(state.product);\n    if (pn) bits.push('pn=' + encodeURIComponent(pn));\n    var ps = (state.parts || []).slice(0, MAX_PARTS).filter(function (p) { return TYPES[p.type]; }).map(function (p) {\n      var unit = UNITS[p.type] ? (UNITS[p.type].indexOf(p.unit) > -1 ? p.unit : UNITS[p.type][0]) : null;\n      return [TYPES[p.type].code].concat(ORDERS[p.type].map(function (k) {\n        if (k === 'unit') return unit;\n        if (k === 'how') return p.how === 'area' ? 'a' : 'v';\n        return cleanVal(p[k], k, unit);\n      })).join('_');\n    });\n    if (ps.length) bits.push('p=' + ps.join('~'));\n    return '#' + bits.join('&');\n  }\n  function decode(hash) {\n    var h = String(hash || '');\n    if (h.indexOf('#termite') !== 0) return null;\n    var q = {};\n    h.slice(1).split('&').forEach(function (kv) {\n      var i = kv.indexOf('=');\n      if (i < 0) return;\n      var val = kv.slice(i + 1);\n      try { val = decodeURIComponent(val); } catch (e) { val = ''; }\n      q[kv.slice(0, i)] = val;\n    });\n    var state = { parts: [], mix: {}, tank: '', product: '' };\n    if (q.m) {\n      var mm = q.m.split('_');\n      state.mix = { amount: cleanVal(mm[0]), unit: mm[1] === 'L' ? 'L' : 'mL', per: cleanVal(mm[2]) };\n    }\n    if (q.tk) state.tank = cleanVal(q.tk);\n    if (q.pn) state.product = cleanName(q.pn);\n    if (q.p) {\n      q.p.split('~').slice(0, 50).forEach(function (s) {\n        var a = s.split('_');\n        var type = null;\n        ORDER.forEach(function (t) { if (TYPES[t].code === a[0]) type = t; });\n        if (!type || state.parts.length >= MAX_PARTS) return;\n        var p = { type: type };\n        ORDERS[type].forEach(function (k, i) {\n          var v = a[i + 1];\n          if (k === 'unit') p.unit = UNITS[type].indexOf(v) > -1 ? v : UNITS[type][0];\n          else if (k === 'how') p.how = v === 'a' ? 'area' : 'void';\n          else p[k] = cleanVal(v);\n        });\n        state.parts.push(p);\n      });\n    }\n    return state;\n  }\n\n  // ---------- Tables for the page copy ----------\n\n  // Holes per m2 and litres per hole when drilling a slab at a rate per m2.\n  function slabTable(rate, spacings) {\n    return spacings.map(function (s) { var cell = Math.pow(s / 1000, 2); return { s: s, perM2: 1 / cell, perHole: rate * cell }; });\n  }\n  // Litres per hole when rodding a vertical zone of width w and depth d (mm) at rate (L per m3).\n  function rodTable(w, d, rate, spacings) {\n    return spacings.map(function (s) { return { s: s, perHole: (w / 1000) * (d / 1000) * (s / 1000) * rate, perM: (w / 1000) * (d / 1000) * rate }; });\n  }\n  // Finished foam per m2 for a liquid rate (L per m2) at each expansion ratio.\n  function foamTable(rates, ratios) {\n    return rates.map(function (r) { return { rate: r, foam: ratios.map(function (x) { return r * x; }) }; });\n  }\n\n  return {\n    TYPES: TYPES, ORDER: ORDER, UNITS: UNITS, UNIT_TEXT: UNIT_TEXT, UNIT_SHORT: UNIT_SHORT, LIM: LIM, LABELS: LABELS, MAX_PARTS: MAX_PARTS,\n    num: num, ratioNum: ratioNum, part: part, job: job, fields: fields, describe: describe, outcome: outcome, summary: summary,\n    mixText: mixText, mixPerLitre: mixPerLitre, listParts: listParts, fillsText: fillsText, cleanName: cleanName, encode: encode, decode: decode, fieldNum: fieldNum,\n    slabTable: slabTable, rodTable: rodTable, foamTable: foamTable,\n    up: up, upL: upL, fmtNum: fmtNum, fmtL: fmtL, fmtMl: fmtMl, fmtCount: fmtCount, fmtRatio: fmtRatio, fmtDate: fmtDate,\n  };\n});\n\n/*\n * NORA PRO Termite Barrier Calculator (page UI).\n * Built into assets/nora-termite.js after termite-engine.js by tools/termite-calc/build.mjs.\n * The maths lives in termite-engine.js. No network call: the visitor types the job and the rates from their label.\n */\n(function () {\n  'use strict';\n  var root = document.getElementById('nora-termite');\n  if (!root || typeof NoraTermite === 'undefined') return;\n  var T = NoraTermite;\n  var quoteBase = root.getAttribute('data-quote-url') || '/pages/request-a-quote';\n  var SOURCE = 'norapro.com.au/pages/termite-barrier-calculator';\n\n  function $(sel) { return root.querySelector(sel); }\n  function $$(sel, from) { return Array.prototype.slice.call((from || 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 byId(id) { return document.getElementById(id); }\n  // Keeps a number on the same line as its unit: 400 mL, 5.25 L, 150 mm, 4 m\u00B2.\n  function nb(s) { return String(s).replace(/(\\d) (mL|L|mm|m\\u00b2|m\\u00b3|m)(?![A-Za-z])/g, '$1\\u00a0$2'); }\n  function escNb(s) { return esc(nb(s)); }\n  function val(id) { var x = byId(id); return x ? x.value : ''; }\n  function setVal(id, v) { var x = byId(id); if (x && v !== undefined && v !== null) x.value = v; }\n\n  var state = { parts: [], seq: 0, used: false, toolUse: false, lastSig: '', timer: null, linkTimer: null, touched: {}, last: null, headerH: 0, errs: [], cleared: {}, removed: null, removedAt: 0, undoTimer: null, edited: false };\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: 'termite', 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  // The kinds of part in the job. With a worked out job, only the finished parts count.\n  function kinds(j) {\n    var seen = [];\n    state.parts.forEach(function (p, i) { if ((!j || (j.parts[i] && j.parts[i].ok)) && seen.indexOf(p.type) < 0) seen.push(p.type); });\n    return seen.join('+');\n  }\n  // guide_tool_use fires on the first edit, also when the job came from a share link.\n  function firstUse(type) {\n    state.used = true;\n    state.edited = true;\n    if (state.toolUse) return;\n    state.toolUse = true;\n    track('guide_tool_use', { guide_kind: type || kinds() });\n  }\n\n  // ---------------------------------------------------------------- the parts of the job\n\n  var UNIT_LABEL = { m3: 'L per m\u00B3 of soil', lm: 'L per metre', hole: 'L per hole', m2: 'L per m\u00B2' };\n  var RATE_UNIT = { m3: 'L per m\u00B3', lm: 'L per metre', hole: 'L per hole', m2: 'L per m\u00B2' };\n  var HINTS = {\n    trench: 'The labels we read ask for a vertical zone at least 150 mm wide, down to at least 50 mm below the top of the footing (80 mm on some labels).',\n    rod: 'Labels say to rod only where you cannot trench and treat the backfill, such as under a path or slab edge.',\n    soil: 'Length times width. A strip 300 mm wide along 20 m of wall is 6 m\u00B2.',\n    slab: 'The labels we read drill holes 150 to 300 mm apart, and no more than 150 mm from walls, cracks and joints.',\n    foamvoid: 'For a wall cavity: the length, the height and the cavity depth. For a gap under a slab: the length, the width and the depth of the gap. Add the label rate for the area if the foam must carry it.',\n    foamarea: 'The labels\u2019 foam tables: litres of mix per m\u00B2 times the expansion ratio gives the foam per m\u00B2.',\n  };\n\n  // The rate boxes take a full row, so their longer units always sit on one line beside the box.\n  var WIDE = { rate: 1, frate: 1, agent: 1 };\n  function input(pid, k, label, unit, opts) {\n    opts = opts || {};\n    var id = pid + '-' + k;\n    return '<div class=\"tc-field' + (opts.wide || WIDE[k] ? ' tc-field--wide' : '') + '\"' + (opts.show ? ' ' + opts.show : '') + '>' +\n      '<label class=\"tc-label\" for=\"' + id + '\">' + esc(label) + (opts.opt ? ' <span class=\"tc-opt\">(optional)</span>' : '') + '</label>' +\n      '<div class=\"tc-inwrap\"><input class=\"tc-in\" id=\"' + id + '\" data-k=\"' + k + '\" type=\"text\" inputmode=\"decimal\" enterkeyhint=\"next\" autocomplete=\"off\">' +\n      '<span class=\"tc-unit\"' + (k === 'rate' ? ' data-rate-unit' : '') + '>' + esc(unit) + '</span></div></div>';\n  }\n  function select(pid, k, label, options) {\n    var id = pid + '-' + k;\n    return '<div class=\"tc-field tc-field--wide\"><label class=\"tc-label\" for=\"' + id + '\">' + esc(label) + '</label>' +\n      '<select class=\"tc-sel\" id=\"' + id + '\" data-k=\"' + k + '\">' + options.map(function (o) { return '<option value=\"' + o[0] + '\">' + esc(o[1]) + '</option>'; }).join('') + '</select></div>';\n  }\n  function unitSelect(pid, type) {\n    return select(pid, 'unit', 'Your label gives the rate in', T.UNITS[type].map(function (u) { return [u, u === 'lm' && type === 'trench' ? 'L per metre of trench' : UNIT_LABEL[u]]; }));\n  }\n\n  function partHtml(p) {\n    var id = p.id;\n    var t = T.TYPES[p.type];\n    var body = '';\n    var m3 = 'data-unit=\"m3\"';\n    if (p.type === 'trench') {\n      body = unitSelect(id, 'trench') + input(id, 'len', 'Length of trench', 'm') + input(id, 'w', 'Width', 'mm', { show: m3 }) +\n        input(id, 'd', 'Depth', 'mm', { show: m3 }) + input(id, 'rate', 'Rate on your label', RATE_UNIT.m3);\n    } else if (p.type === 'rod') {\n      body = unitSelect(id, 'rod') + input(id, 'len', 'Length to rod', 'm') + input(id, 's', 'Hole spacing', 'mm') +\n        input(id, 'w', 'Width of the zone', 'mm', { show: m3 }) + input(id, 'd', 'Depth of the zone', 'mm', { show: m3 }) +\n        input(id, 'rate', 'Rate on your label', RATE_UNIT.m3);\n    } else if (p.type === 'soil') {\n      body = input(id, 'area', 'Area', 'm\u00B2') + input(id, 'rate', 'Rate on your label', RATE_UNIT.m2);\n    } else if (p.type === 'slab') {\n      body = unitSelect(id, 'slab') + input(id, 'area', 'Area of slab', 'm\u00B2') + input(id, 's', 'Hole spacing', 'mm') +\n        input(id, 'rate', 'Rate on your label', RATE_UNIT.m2);\n    } else {\n      var v = 'data-how=\"void\"';\n      var a = 'data-how=\"area\"';\n      body = select(id, 'how', 'What are you working out?', [['void', 'Foam to fill a void or cavity'], ['area', 'Foam for a label rate over an area']]) +\n        input(id, 'vl', 'Length', 'm', { show: v }) + input(id, 'vh', 'Height or width', 'm', { show: v }) +\n        input(id, 'vd', 'Depth', 'mm', { show: v }) + input(id, 'area', 'Area', 'm\u00B2', { show: a }) +\n        input(id, 'rate', 'Rate of mix on your label', RATE_UNIT.m2, { show: a }) +\n        input(id, 'ratio', 'Expansion ratio', ':1') +\n        input(id, 'frate', 'Label rate for the area', RATE_UNIT.m2, { show: v, opt: true }) +\n        input(id, 'agent', 'Foaming agent per litre of mix', 'mL', { opt: true });\n    }\n    var hint = p.type === 'foam' ? '<p class=\"tc-hint\" data-how=\"void\">' + esc(HINTS.foamvoid) + '</p><p class=\"tc-hint\" data-how=\"area\">' + esc(HINTS.foamarea) + '</p>' : '<p class=\"tc-hint\">' + esc(HINTS[p.type]) + '</p>';\n    return '<div class=\"tc-part\" id=\"' + id + '\" data-type=\"' + p.type + '\" role=\"group\" aria-labelledby=\"' + id + '-h\">' +\n      '<div class=\"tc-part__top\"><p class=\"tc-part__h\" id=\"' + id + '-h\"><small>Part <span data-n></span>, ' + esc(t.zone) + '</small>' + esc(t.name) + '</p>' +\n      '<button type=\"button\" class=\"tc-part__x\" data-tc-remove=\"' + id + '\" aria-label=\"Remove part ' + '\">Remove</button></div>' +\n      '<div class=\"tc-fields\">' + body + '</div>' + hint +\n      '<p class=\"tc-part__out tc-part__out--wait\" id=\"' + id + '-out\"></p>' +\n      '<ul class=\"tc-notes tc-part__notes\" id=\"' + id + '-notes\" hidden></ul>' +\n      '</div>';\n  }\n\n  // Values carried over from the last part of the same kind (the visitor's own figures, never a supplied rate).\n  var CARRY = ['unit', 'how', 'w', 'd', 's', 'rate', 'ratio', 'agent', 'vh', 'vd', 'frate'];\n\n  function addPart(type, values, quiet, at) {\n    if (!T.TYPES[type] || state.parts.length >= T.MAX_PARTS) return null;\n    state.seq += 1;\n    var p = { id: 'tc-p' + state.seq, type: type };\n    var prev = null;\n    state.parts.forEach(function (x) { if (x.type === type) prev = x; });\n    var wrap = document.createElement('div');\n    wrap.innerHTML = partHtml(p);\n    var before = at !== undefined && state.parts[at] ? byId(state.parts[at].id) : null;\n    $('#tc-parts').insertBefore(wrap.firstChild, before);\n    if (before) state.parts.splice(at, 0, p); else state.parts.push(p);\n    if (values) Object.keys(values).forEach(function (k) { if (k !== 'type') setVal(p.id + '-' + k, values[k]); });\n    else if (prev) CARRY.forEach(function (k) { var v = val(prev.id + '-' + k); if (v !== '') setVal(p.id + '-' + k, v); });\n    showFields(p);\n    numberParts();\n    if (!quiet) {\n      var first = $$('#' + p.id + ' .tc-in').filter(visible)[0];\n      if (first) first.focus();\n    }\n    return p;\n  }\n  // A double tap would land the second tap on the next part's Remove button as it moves up, so a second remove\n  // straight after the first is ignored, focus goes to the next part's heading (not a button), and Undo puts it back.\n  function removePart(id) {\n    if (Date.now() - state.removedAt < 800) return false;\n    var i = -1;\n    state.parts.forEach(function (p, j) { if (p.id === id) i = j; });\n    if (i < 0) return false;\n    var gone = state.parts[i];\n    state.removed = { at: i, type: gone.type, values: readPart(gone) };\n    state.removedAt = Date.now();\n    state.parts.splice(i, 1);\n    var el = byId(id);\n    if (el) el.parentNode.removeChild(el);\n    Object.keys(state.touched).forEach(function (k) { if (k.indexOf(id + '-') === 0) delete state.touched[k]; });\n    numberParts();\n    var next = state.parts[i] || state.parts[i - 1];\n    var target = next ? byId(next.id + '-h') : $('#tc-add-h');\n    if (target) { target.setAttribute('tabindex', '-1'); target.focus(); }\n    showUndo('Part ' + (i + 1) + ', ' + T.TYPES[gone.type].name.toLowerCase() + ', removed.');\n    return true;\n  }\n  function showUndo(text) {\n    var box = $('#tc-undo');\n    if (!box) return;\n    $('#tc-undo-txt').textContent = text;\n    box.hidden = false;\n    clearTimeout(state.undoTimer);\n    state.undoTimer = setTimeout(hideUndo, 15000);\n  }\n  function hideUndo() { var box = $('#tc-undo'); if (box) box.hidden = true; state.removed = null; }\n  function undo() {\n    var r = state.removed;\n    if (!r) return;\n    hideUndo();\n    var p = addPart(r.type, r.values, true, Math.min(r.at, state.parts.length));\n    if (p) { showFields(p); var h = byId(p.id + '-h'); if (h) { h.setAttribute('tabindex', '-1'); h.focus(); } }\n  }\n  function numberParts() {\n    state.parts.forEach(function (p, i) {\n      var el = byId(p.id);\n      $$('[data-n]', el).forEach(function (n) { n.textContent = String(i + 1); });\n      var x = el.querySelector('.tc-part__x');\n      if (x) x.setAttribute('aria-label', 'Remove part ' + (i + 1) + ', ' + T.TYPES[p.type].name);\n    });\n    // At the limit the add buttons stay in the Tab order, look switched off and say why.\n    var full = state.parts.length >= T.MAX_PARTS;\n    $$('[data-tc-add]').forEach(function (b) { if (full) b.setAttribute('aria-disabled', 'true'); else b.removeAttribute('aria-disabled'); });\n    var msg = $('#tc-add-full');\n    if (msg) msg.hidden = !full;\n  }\n  function visible(x) { return x.offsetParent !== null; }\n  // Shows only the boxes the chosen rate unit or foam method needs.\n  function showFields(p) {\n    var el = byId(p.id);\n    var unit = val(p.id + '-unit');\n    var how = val(p.id + '-how') || 'void';\n    $$('[data-unit]', el).forEach(function (f) { f.hidden = unit !== f.getAttribute('data-unit'); });\n    $$('[data-how]', el).forEach(function (f) { f.hidden = how !== f.getAttribute('data-how'); });\n    var ru = el.querySelector('[data-k=\"rate\"] + [data-rate-unit]');\n    if (ru && unit) ru.textContent = RATE_UNIT[unit];\n  }\n\n  function readPart(p) {\n    var o = { type: p.type };\n    $$('#' + p.id + ' [data-k]').forEach(function (x) { o[x.getAttribute('data-k')] = x.value; });\n    return o;\n  }\n  function readState() {\n    return {\n      parts: state.parts.map(readPart),\n      mix: { amount: val('tc-amount'), unit: val('tc-munit'), per: val('tc-per') },\n      tank: val('tc-tank'),\n      product: val('tc-product'),\n    };\n  }\n\n  // ---------------------------------------------------------------- view\n\n  // A field is marked only once it has a value that cannot work, or after the visitor has left it empty.\n  // A marked box points at the words that explain it (aria-describedby), which sit just under it.\n  function mark(id, msgId, where, error) {\n    var el = byId(id);\n    if (!el || !visible(el)) return false;\n    if (el.value.trim() === '' && !state.touched[id]) return false;\n    el.setAttribute('aria-invalid', 'true');\n    el.setAttribute('aria-describedby', msgId);\n    if (!state.errs.some(function (x) { return x.where === where; })) state.errs.push({ where: where, error: error });\n    return true;\n  }\n  function markFields(j) {\n    $$('.tc-in[aria-invalid]').forEach(function (x) { x.removeAttribute('aria-invalid'); x.removeAttribute('aria-describedby'); });\n    state.errs = [];\n    j.parts.forEach(function (r, i) { if (!r.ok && r.field) mark(state.parts[i].id + '-' + r.field, state.parts[i].id + '-out', 'part ' + (i + 1), r.error); });\n    var mixBad = false;\n    if (j.mix && !j.mix.ok) (j.mix.fields || [j.mix.field]).forEach(function (f) { if (mark(f === 'per' ? 'tc-per' : 'tc-amount', 'tc-mix-out', 'the mix rate', j.mix.error)) mixBad = true; });\n    var tankBad = j.tank && !j.tank.ok && mark('tc-tank', 'tc-tank-out', 'the tank size', j.tank.error);\n    lineOut('tc-mix-out', mixBad ? [{ level: 'err', text: j.mix.error }] : (j.mix && j.mix.ok ? j.mix.notes : []));\n    lineOut('tc-tank-out', tankBad ? [{ level: 'err', text: j.tank.error }] : []);\n  }\n  // The line under the mix row or the tank box: an error, or a check note.\n  function lineOut(id, list) {\n    var el = byId(id);\n    if (!el) return;\n    el.hidden = !list.length;\n    el.className = 'tc-line' + (list[0] && list[0].level === 'err' ? ' tc-part__out--err' : '');\n    el.innerHTML = list.map(function (n) { return n.level === 'warn' ? '<b>Check:</b> ' + escNb(n.text) : escNb(n.text); }).join(' ');\n  }\n  function noteHtml(n, prefix) { return '<li class=\"tc-n--' + n.level + '\">' + (n.level === 'warn' ? '<b>Check:</b> ' : '') + escNb((prefix || '') + n.text) + '</li>'; }\n\n  function litresHtml(text) { return escNb(text).replace(/([\\d,.]+\\u00a0L of mix)/, '<b>$1</b>'); }\n\n  function partOut(p, r) {\n    var out = byId(p.id + '-out');\n    var notes = byId(p.id + '-notes');\n    if (!out) return;\n    var cls = 'tc-part__out';\n    var html;\n    if (r.ok) html = litresHtml(T.outcome(r));\n    else if (r.empty) { cls += ' tc-part__out--wait'; html = 'Fill in the boxes to work out this part.'; }\n    else {\n      var id = p.id + '-' + r.field;\n      var el = byId(id);\n      var bad = el && (el.value.trim() !== '' || state.touched[id]);\n      cls += bad ? ' tc-part__out--err' : ' tc-part__out--wait';\n      if (r.field === 'rate' && state.cleared[p.id] && el && el.value.trim() === '') {\n        cls = 'tc-part__out tc-part__out--err';\n        html = 'You changed the unit, so type the rate from your label again, in ' + esc(UNIT_LABEL[val(p.id + '-unit')] || '') + '.';\n      } else html = bad ? esc(r.error) : 'Next, ' + esc(r.error.charAt(0).toLowerCase() + r.error.slice(1));\n    }\n    out.className = cls;\n    out.innerHTML = html;\n    var list = r.ok ? r.notes : [];\n    notes.hidden = !list.length;\n    notes.innerHTML = list.map(function (n) { return noteHtml(n); }).join('');\n  }\n\n  function render() {\n    var st = readState();\n    var j = T.job(st);\n    markFields(j);\n    j.parts.forEach(function (r, i) { partOut(state.parts[i], r); });\n    var out = $('#tc-result');\n    if (!j.ok) {\n      var msg = !state.parts.length ? 'Add a part of the job to start: a trench, rodding, a soil surface, holes through a slab or foam.'\n        : j.waiting.length ? 'Finish part ' + (j.waiting[0] + 1) + ' to see the litres of mix.'\n          : 'Fill in each part of the job with the rate from your label. The total litres of mix, the product and the tank fills show here.';\n      out.innerHTML = '<div class=\"tc-card tc-card--wait\" tabindex=\"-1\"><p class=\"tc-wait\">' + esc(msg) + '</p></div>';\n      state.last = null;\n      quoteLink(null);\n      peek();\n      schedule(j);\n      saveLink();\n      return;\n    }\n    var when = new Date();\n    var text = T.summary(j, { when: when, product: st.product, source: SOURCE });\n    var eq = [];\n    if (j.fills) eq.push(['Tank fills', T.fillsText(j).replace(/^[^:]+: /, '').replace(/\\.$/, ''), 'wide']);\n    if (j.hasFoam) eq.push(['Foam', T.fmtL(j.foam)]);\n    if (j.hasAgent) eq.push(['Foaming agent', T.fmtMl(j.agentMl)]);\n    if (j.fills === undefined && j.tank && !j.tank.ok) eq.push(['Tank fills', j.tank.error, 'wide']);\n    var product = j.productMl !== undefined\n      ? '<p class=\"tc-product\">' + escNb(T.fmtMl(j.productMl)) + ' of product <span class=\"tc-opt\">at ' + escNb(T.mixText(j.mix)) + ', ' + escNb(T.mixPerLitre(j.mix)) + '</span></p>'\n      : '<p class=\"tc-product tc-product--ask\">' + esc(j.mix && !j.mix.ok ? j.mix.error : 'Add the mix rate from your label to get the amount of product.') + '</p>';\n    // Each part: its name and litres, then the detail without repeating the litres of mix.\n    var lines = j.parts.map(function (r) {\n      if (!r.ok) return '';\n      var detail = r.type === 'foam' ? T.outcome(r) : T.outcome(r).split(', ').filter(function (b) { return !/ L of mix$/.test(b); }).join(', ');\n      return '<li><b>' + esc(T.TYPES[r.type].name) + '</b> ' + escNb(T.fmtL(r.litres)) + (detail ? '<span>' + escNb(detail) + '</span>' : '') + '</li>';\n    }).join('');\n    var warns = [];\n    j.parts.forEach(function (r, i) {\n      if (r.ok) r.notes.forEach(function (x) { if (x.level === 'warn') warns.push({ level: 'warn', text: 'Part ' + (i + 1) + ': ' + x.text }); });\n    });\n    if (j.mix && j.mix.ok) j.mix.notes.forEach(function (x) { warns.push({ level: 'warn', text: 'Mix: ' + x.text }); });\n    j.waiting.forEach(function (i) { warns.push({ level: 'wait', text: 'Part ' + (i + 1) + ' is not finished, so it is not in the total.' }); });\n    var html = '<div class=\"tc-card\" tabindex=\"-1\" aria-labelledby=\"tc-answer\">' +\n      '<p class=\"tc-eyebrow\">Total for the job</p>' +\n      '<p class=\"tc-total tc-answer\" id=\"tc-answer\">' + esc(T.fmtL(j.litres).replace(/ L$/, '')) + '<small>L of mix</small></p>' +\n      product +\n      (eq.length ? '<dl class=\"tc-eq\">' + eq.map(function (p) { return '<div' + (p[2] ? ' class=\"tc-eq__wide\"' : '') + '><dt>' + esc(p[0]) + '</dt><dd>' + escNb(p[1]) + '</dd></div>'; }).join('') + '</dl>' : '') +\n      '<ol class=\"tc-lines\" aria-label=\"Litres for each part\">' + lines + '</ol>' +\n      (warns.length ? '<ul class=\"tc-notes\">' + warns.map(function (x) { return x.level === 'wait' ? '<li class=\"tc-n--warn\">' + escNb(x.text) + '</li>' : noteHtml(x); }).join('') + '</ul>' : '') +\n      '<p class=\"tc-label-wins\"><b>The label always wins.</b> Use the rates, mixing and application directions on your product label and the AS 3660 series. Each figure is rounded up on its own, so none is less than the label rate needs, but they may not add up exactly to the total.</p>' +\n      '<div class=\"tc-record\"><p class=\"tc-record__h\">Job summary</p>' +\n      '<details><summary>Show the job summary</summary><p class=\"tc-summary\" id=\"tc-summary\">' + text.split('\\n').map(function (l) { return '<span>' + esc(l) + '</span>'; }).join('\\n') + '</p></details>' +\n      '<div class=\"tc-actions\"><button type=\"button\" class=\"tc-btn\" data-tc-copy>Copy job summary</button>' +\n      '<button type=\"button\" class=\"tc-act\" data-tc-link>Copy link</button>' +\n      '<button type=\"button\" class=\"tc-act\" data-tc-print>Print</button>' +\n      '<span class=\"tc-copied\" role=\"status\" aria-live=\"polite\"></span></div></div>' +\n      '</div>';\n    // Keep the summary open if the visitor opened it.\n    var wasOpen = !!(out.querySelector('.tc-record details[open]'));\n    out.innerHTML = html;\n    if (wasOpen) out.querySelector('.tc-record details').open = true;\n    state.last = { j: j, text: text };\n    quoteLink(j, st);\n    stickyTop();\n    peek();\n    schedule(j);\n    saveLink();\n  }\n\n  function quoteLink(j, st) {\n    var q = $('[data-tc-quote]');\n    if (!q) return;\n    if (!j) { q.setAttribute('href', quoteBase); return; }\n    var names = [];\n    j.parts.forEach(function (r) { if (r.ok && names.indexOf(T.TYPES[r.type].name.toLowerCase()) < 0) names.push(T.TYPES[r.type].name.toLowerCase()); });\n    var note = 'From the NORA PRO termite calculator: ' + T.fmtL(j.litres) + ' of mix (' + names.join(', ') + ')' + (j.hasFoam ? ', ' + T.fmtL(j.foam) + ' of foam' : '') + '.';\n    var chem = T.cleanName(st.product) || 'Termiticide';\n    q.setAttribute('href', quoteBase + '?chemical=' + encodeURIComponent(chem) + '&note=' + encodeURIComponent(note));\n  }\n\n  // ---------------------------------------------------------------- answer bar\n\n  // Shown whenever the tool is on screen but its total 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 = $('#tc-answer');\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 (Show the job summary, Copy, Copy link,\n  // Print): it stays hidden until they move clear.\n  function coversActions(bar) {\n    var a = $('#tc-result .tc-record');\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    var top = vh - bottom - bar.offsetHeight;\n    var left = vw - right - bar.offsetWidth;\n    return r.height > 0 && r.bottom > top && r.top < vh - bottom && r.right > left;\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 = $('#tc-peek');\n    if (!bar) return;\n    var L = state.last;\n    var show = !!L && toolInView() && !answerInView() && !typingOnShortScreen();\n    if (L) {\n      var f = L.j.fills;\n      // On narrow screens only the total shows (the rest is in .tc-peek__more).\n      setHtml($('#tc-peek-txt'), 'Total <b>' + esc(T.fmtL(L.j.litres)) + '</b><span class=\"tc-peek__more\"> of mix' +\n        (L.j.productMl !== undefined ? ', ' + esc(T.fmtMl(L.j.productMl).replace(/ \\(.*\\)$/, '')) + ' of product' : '') +\n        (f ? ', ' + esc(f.fills === 1 ? 'one tank fill' : T.fmtCount(f.fills) + ' tank fills') : '') + '</span>' +\n        (state.errs.length ? '<span class=\"tc-peek__err\">Check ' + esc(state.errs[0].where) + '</span>' : '') +\n        '<span class=\"tc-status\">. Show the full answer.</span>');\n    }\n    if (show && coversActions(bar)) show = false;\n    bar.setAttribute('data-show', show ? '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 = $('#tc-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    // 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 buttons stay in reach (the answer box shows the total 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 = $('#tc-result');\n      var vh = window.innerHeight || document.documentElement.clientHeight;\n      var top = state.headerH + 20;\n      // A card taller than the screen sticks by its bottom, clear of the corner answer box (about 64 px plus its 24 px gap).\n      if (res) top = Math.min(top, vh - res.getBoundingClientRect().height - 104);\n      root.style.setProperty('--tc-top', Math.round(top) + 'px');\n    } catch (e) { /* the CSS default is used */ }\n  }\n\n  // Count a result once the visitor stops typing, not on every key. Screen readers hear the result, or the box to check.\n  function schedule(j) {\n    if (!state.used) return;\n    clearTimeout(state.timer);\n    state.timer = setTimeout(function () {\n      var sig = JSON.stringify(readState());\n      if (sig === state.lastSig) return;\n      state.lastSig = sig;\n      var s = $('#tc-status');\n      if (state.errs.length) {\n        var e = state.errs[0];\n        if (s) s.textContent = 'Check ' + e.where + ': ' + e.error;\n        return;\n      }\n      if (!j.ok) { if (s) s.textContent = ''; return; }\n      track('guide_result_shown', { guide_kind: kinds(j) });\n      if (s) s.textContent = 'Result updated: ' + T.fmtL(j.litres) + ' of mix' + (j.productMl !== undefined ? ', ' + T.fmtMl(j.productMl) + ' of product' : '') + '.';\n    }, 1200);\n  }\n  // The job goes into the address as it changes, so a reload, Back or a phone that reloads the tab brings it back.\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 + T.encode(readState())); } catch (e) { /* ignore */ }\n    }, 400);\n  }\n\n  // ---------------------------------------------------------------- copy, link and print\n\n  function copyText(text, msg) {\n    var flag = $('.tc-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  function shareUrl() {\n    var h = T.encode(readState());\n    try { history.replaceState(null, '', location.pathname + location.search + h); } catch (e) { /* ignore */ }\n    return location.origin + location.pathname + location.search + h;\n  }\n  // The job summary sits in a <details>; browsers do not print the inside of a closed one, so it is opened for the print.\n  function printCard() {\n    var html = document.documentElement;\n    var det = $('#tc-result .tc-record details');\n    var wasOpen = det ? det.open : true;\n    if (det) det.open = true;\n    html.classList.add('nora-print-tc');\n    var done = function () { html.classList.remove('nora-print-tc'); window.removeEventListener('afterprint', done); var d = $('#tc-result .tc-record details'); if (d && !wasOpen) d.open = false; };\n    window.addEventListener('afterprint', done);\n    try { window.print(); } catch (e) { /* ignore */ }\n    // window.print() blocks until the dialog closes in most browsers; afterprint covers the rest.\n    setTimeout(function () { if (html.classList.contains('nora-print-tc')) done(); }, 1000);\n  }\n\n  // #termite&m=600_mL_100&tk=100&pn=Name&p=t_m3_42_100_150_350~... opens that job.\n  function restore() {\n    var st = T.decode(location.hash);\n    if (!st) return false;\n    if (st.mix) { setVal('tc-amount', st.mix.amount); setVal('tc-munit', st.mix.unit); setVal('tc-per', st.mix.per); }\n    setVal('tc-tank', st.tank);\n    setVal('tc-product', st.product);\n    st.parts.forEach(function (p) { addPart(p.type, p, true); });\n    if (!state.parts.length) addPart('trench', null, true);\n    return true;\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-tc-add')) {\n      if (t.getAttribute('aria-disabled') === 'true') { var full = $('#tc-add-full'); if (full) { full.hidden = false; full.textContent = full.textContent; } return; }\n      var type = t.getAttribute('data-tc-add'); firstUse(type); hideUndo(); addPart(type); render(); return;\n    }\n    if (t.hasAttribute('data-tc-remove')) { state.edited = true; if (removePart(t.getAttribute('data-tc-remove'))) render(); return; }\n    if (t.hasAttribute('data-tc-undo')) { undo(); render(); return; }\n    var L = state.last;\n    if (t.hasAttribute('data-tc-copy')) {\n      if (!L) return;\n      copyText(L.text, 'Copied. Paste it into your job record.');\n      track('guide_share', { guide_kind: kinds(), guide_via: 'copy_summary' });\n      return;\n    }\n    if (t.hasAttribute('data-tc-link')) {\n      copyText(shareUrl(), 'Link copied.');\n      track('guide_share', { guide_kind: kinds(), guide_via: 'copy_link' });\n      return;\n    }\n    if (t.hasAttribute('data-tc-print')) {\n      track('guide_share', { guide_kind: kinds(), guide_via: 'print' });\n      printCard();\n      return;\n    }\n    if (t.id === 'tc-peek') {\n      // The top of the card, clear of the site header that slides back in on the way up. On desktop the card is\n      // sticky, so the place to go is the top of its column, where the card starts (as on the Delta T Calculator).\n      var card = $('#tc-result .tc-card');\n      if (card) {\n        var smooth = !(window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches);\n        var wide = window.matchMedia && window.matchMedia('(min-width: 990px)').matches;\n        var from = wide ? $('.tc-side') : card;\n        var top = from.getBoundingClientRect().top + window.pageYOffset - (state.headerH || 0) - 16;\n        try { window.scrollTo({ top: Math.max(0, top), behavior: smooth ? 'smooth' : 'auto' }); } catch (err) { window.scrollTo(0, Math.max(0, top)); }\n        try { card.focus({ preventScroll: true }); } catch (err) { /* ignore */ }\n      }\n      return;\n    }\n    if (t.hasAttribute('data-tc-quote')) track('guide_quote_click', { guide_kind: kinds() });\n  });\n\n  root.addEventListener('focusout', function (e) {\n    // Only mark the fields here. Redrawing the card on blur would swap a button under a tap that started it.\n    if (e.target.id && e.target.classList.contains('tc-in')) { state.touched[e.target.id] = true; var j = T.job(readState()); markFields(j); j.parts.forEach(function (r, i) { partOut(state.parts[i], r); }); }\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    var t = e.target;\n    if (!(t.classList && t.classList.contains('tc-in') && t.getAttribute('inputmode') === 'decimal')) return;\n    selectAll(t);\n    selectOnUp = t;\n    t.setAttribute('data-tc-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-tc-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('tc-in')) return;\n    e.preventDefault();\n    var boxes = $$('.tc-form .tc-in').filter(visible);\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  root.addEventListener('input', function (e) {\n    if (!e.target.classList || !e.target.classList.contains('tc-in')) return;\n    var part = e.target.closest('.tc-part');\n    if (part && e.target.getAttribute('data-k') === 'rate') delete state.cleared[part.id];\n    firstUse(part ? part.getAttribute('data-type') : 'mix');\n    render();\n  });\n  root.addEventListener('change', function (e) {\n    if (e.target.tagName !== 'SELECT') return;\n    var part = e.target.closest('.tc-part');\n    if (part) { state.parts.forEach(function (p) { if (p.id === part.id) showFields(p); }); }\n    // A new unit makes the old rate wrong (2 L per hole is not 2 L per metre), so the rate box is cleared and the part says why.\n    if (part && e.target.getAttribute('data-k') === 'unit') {\n      var rate = byId(part.id + '-rate');\n      if (rate && rate.value.trim() !== '') { rate.value = ''; state.cleared[part.id] = true; }\n    }\n    firstUse(part ? part.getAttribute('data-type') : 'mix');\n    render();\n  });\n  // Opening or closing the job summary changes the card's height.\n  root.addEventListener('toggle', function () { stickyTop(); peek(); }, true);\n  // The answer bar hides while a box is being typed in on a short screen (keyboard up), and comes back after.\n  root.addEventListener('focusin', function () { peek(); });\n  root.addEventListener('focusout', function () { setTimeout(peek, 0); });\n  if (window.visualViewport) window.visualViewport.addEventListener('resize', function () { peek(); });\n  var form = $('#tc-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  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('#termite&') === 0) location.reload(); });\n  if (!restored) addPart('trench', null, true);\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 job 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: kinds(state.last.j), guide_restored: 1 });\n  }\n})();\n"],
  "mappings": "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",
  "names": []
}
