{"version":3,"sources":["sofa-fit.js"],"names":["_typeof","o","Symbol","iterator","constructor","prototype","_toConsumableArray","r","_arrayWithoutHoles","_iterableToArray","_unsupportedIterableToArray","_nonIterableSpread","TypeError","a","_arrayLikeToArray","t","toString","call","slice","name","Array","from","test","isArray","length","e","n","_classCallCheck","_defineProperties","enumerable","configurable","writable","Object","defineProperty","_toPropertyKey","key","_createClass","i","_toPrimitive","toPrimitive","String","Number","SofaFit","this","sofaParts","measurements","doors","hallway","landing","hasLanding","noLanding","landingPadding","heightFactor","depthFactor","stepOrder","currentIndex","tooBig","userSelectedFrame","init","bind","handleAdvance","handleBack","handleLandingRadio","handleEditClick","evaluateAll","refreshResultsUI","handleFrameSubmit","setUpOverlay","value","_this","trigger","document","querySelector","addEventListener","Overlay","render","modifiers","callback","parseSofaParts","attachStepListeners","restoreInputsForCurrentStep","restoreLandingRadioState","restoreNoLandingDisable","initializeResultsPhaseIfReady","_Overlay$target","dimsEl","target","JSON","parse","dataset","dims","_unused","_this2","root","querySelectorAll","forEach","btn","removeEventListener","radio","frameForm","_Overlay$target2","popup","step","_this3","preventDefault","stepId","currentStepId","inputs","numericValues","allValid","inp","classList","remove","val","trim","num","isNaN","storeMeasurement","nextPopup","computeNextPopup","advanceIndex","markInvalid","order","idx","indexOf","concat","_this4","previousPopup","currentTarget","prevIndex","_this5","targetStep","id","count","add","values","width","height","depth","data","hasOwnProperty","selector","checked","disabled","insertSummaryTableValues","doorSpan","hallwaySpan","stairWidthSpan","stairsSpan","textContent","l","_this6","part","label","diffMap","res","evaluateDoorPart","evaluateSingleWidthPart","evaluateLandingPart","keys","door","h","w","d","smallest","Math","min","widthDiff","heightDiff","Infinity","other","effective","roundDiff","spaceWidth","sofaHeight","sofaWidth","sofaDepth","adjustedHeight","adjustedDepth","landingWidth","landingDepth","landingHeight","depthDiff","_Overlay$target3","_this7","resultsNodes","node","diffs","numericOver","flatMap","obj","filter","v","maxOver","max","apply","setRadioIconState","willFit","_Overlay$target4","icon","_this8","selected","sku","frameKey","AndrewMartin","customise","updateCombinationQty","replaceUrl","updateUrl","_unused2","formEl","formData","FormData","fetch","window","location","href","method","body","then","resp","text","html","_AndrewMartin$customi","refreshAfterAjax","close","catch","round","sofaFit"],"mappings":"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","file":"../../javascript/sofa-fit.js","sourcesContent":["/**\n *  - Collect user measurements for up to four spaces: doors, hallway, stair-width, landing.\n *  - Evaluate each modular sofa part independently with orientation-based fitting.\n *  - Allow skipping landing if user indicates no landing.\n *  - Provide per-part \"will fit\" or \"will not fit and is Xcm over\" messaging.\n */\n\nclass SofaFit {\n    constructor() {\n        // Sofa parts loaded from data-dims in results form\n        this.sofaParts = [];\n        // User measurements by step id\n        this.measurements = {\n            doors: null,\n            hallway: null,\n            'stair-width': null,\n            landing: null, // null => not measured; explicit null with noLanding true => skipped\n        };\n        // Landing state\n        this.hasLanding = null; // null=unset until user chooses\n        this.noLanding = false;\n\n        // Landing padding factors\n        this.landingPadding = { heightFactor: 1.09, depthFactor: 1.19 };\n\n        // Step order indexing (for summary & edit navigation)\n        this.stepOrder = ['doors', 'hallway', 'stair-width', 'stairs'];\n        this.currentIndex = 0;\n\n        // Fit results cache { label: { stepId: diffObj|true } }\n        this.tooBig = {};\n\n        // Track if a frame has already been selected (for replaceUrl behavior)\n        this.userSelectedFrame = false;\n\n        // Bind methods\n        this.init = this.init.bind(this);\n        this.handleAdvance = this.handleAdvance.bind(this);\n        this.handleBack = this.handleBack.bind(this);\n        this.handleLandingRadio = this.handleLandingRadio.bind(this);\n        this.handleEditClick = this.handleEditClick.bind(this);\n        this.evaluateAll = this.evaluateAll.bind(this);\n        this.refreshResultsUI = this.refreshResultsUI.bind(this);\n        this.handleFrameSubmit = this.handleFrameSubmit.bind(this);\n\n        // Trigger overlay\n        this.setUpOverlay();\n    }\n\n    /* ---------------- Overlay / Initialization ---------------- */\n\n    setUpOverlay() {\n        const trigger = document.querySelector('.js-open-sofa-fit');\n        if (!trigger) return;\n        trigger.addEventListener('click', () => {\n            Overlay.render('#doors', {\n                modifiers: ['sidebar', 'sofa-fit'],\n                callback: () => this.init(),\n            });\n        });\n    }\n\n    init() {\n        this.parseSofaParts();\n        this.attachStepListeners();\n        this.restoreInputsForCurrentStep();\n        this.restoreLandingRadioState();\n        this.restoreNoLandingDisable();\n        this.initializeResultsPhaseIfReady();\n    }\n\n    parseSofaParts() {\n        const dimsEl = Overlay.target?.querySelector('.js-get-dimensions');\n        if (!dimsEl) return;\n        try {\n            this.sofaParts = JSON.parse(dimsEl.dataset.dims || '[]');\n        } catch {\n            this.sofaParts = [];\n        }\n    }\n\n    attachStepListeners() {\n        const root = Overlay.target;\n        if (!root) return;\n\n        // Advance buttons\n        root.querySelectorAll('.js-submit-input').forEach((btn) => {\n            btn.removeEventListener('click', this.handleAdvance);\n            btn.addEventListener('click', this.handleAdvance);\n        });\n\n        // Back buttons\n        root.querySelectorAll('.js-back-button').forEach((btn) => {\n            btn.removeEventListener('click', this.handleBack);\n            btn.addEventListener('click', this.handleBack);\n        });\n\n        // Landing radios\n        root.querySelectorAll('.js-landing-radio').forEach((radio) => {\n            radio.removeEventListener('change', this.handleLandingRadio);\n            radio.addEventListener('change', this.handleLandingRadio);\n        });\n\n        // Edit dimension buttons (only on results)\n        root.querySelectorAll('.js-edit-dimensions').forEach((btn) => {\n            btn.removeEventListener('click', this.handleEditClick);\n            btn.addEventListener('click', this.handleEditClick);\n        });\n\n        // Sofa frame form submit (results)\n        const frameForm = root.querySelector('.js-radio-form');\n        if (frameForm) {\n            frameForm.removeEventListener('submit', this.handleFrameSubmit);\n            frameForm.addEventListener('submit', this.handleFrameSubmit);\n        }\n    }\n\n    currentStepId() {\n        const popup = Overlay.target?.querySelector('.pdp-popup');\n        return popup ? popup.dataset.step : null;\n    }\n\n    /* ---------------- Navigation Handlers ---------------- */\n\n    handleAdvance(e) {\n        e.preventDefault();\n        const stepId = this.currentStepId();\n        if (!stepId) return;\n\n        // Gather inputs\n        const inputs = Array.from(\n            Overlay.target.querySelectorAll('.pdp-popup input[type=\"text\"]'),\n        );\n        const numericValues = {};\n        let allValid = true;\n\n        inputs.forEach((inp) => {\n            inp.classList.remove('invalid');\n            const name = inp.name;\n            const val = inp.value.trim();\n            if (val === '') {\n                allValid = false;\n                return;\n            }\n            const num = Number(val);\n            if (isNaN(num)) {\n                allValid = false;\n            } else {\n                numericValues[name] = num;\n            }\n        });\n\n        // Stair-width requires landing yes/no selection\n        if (stepId === 'stair-width') {\n            if (this.hasLanding === null) {\n                allValid = false;\n            } else if (this.hasLanding === false) {\n                this.noLanding = true;\n                this.measurements.landing = null;\n            }\n        }\n\n        // Stairs step skipped if noLanding true\n        if (stepId === 'stairs' && this.noLanding) {\n            allValid = true;\n        }\n\n        if (!allValid) {\n            this.markInvalid(inputs);\n            return;\n        }\n\n        this.storeMeasurement(stepId, numericValues);\n        const nextPopup = this.computeNextPopup(stepId);\n\n        if (nextPopup === '#results') {\n            this.evaluateAll();\n        }\n\n        Overlay.render(nextPopup, {\n            modifiers: ['sidebar', 'sofa-fit'],\n            callback: () => {\n                this.advanceIndex(stepId);\n                this.init();\n            },\n        });\n    }\n\n    computeNextPopup(stepId) {\n        if (stepId === 'stair-width' && this.noLanding) {\n            return '#results';\n        }\n        const order = this.stepOrder;\n        const idx = order.indexOf(stepId);\n        if (idx === -1 || idx === order.length - 1) {\n            return '#results';\n        }\n        return `#${order[idx + 1]}`;\n    }\n\n    advanceIndex(stepId) {\n        const i = this.stepOrder.indexOf(stepId);\n        if (i >= 0 && i < this.stepOrder.length - 1) {\n            this.currentIndex = i + 1;\n        } else if (\n            stepId === 'stairs' ||\n            (stepId === 'stair-width' && this.noLanding)\n        ) {\n            this.currentIndex = this.stepOrder.length - 1;\n        }\n    }\n\n    handleBack(e) {\n        e.preventDefault();\n        const previousPopup = e.currentTarget.dataset.previousPopup;\n        if (!previousPopup) return;\n        const prevIndex = this.stepOrder.indexOf(previousPopup);\n        this.currentIndex = prevIndex >= 0 ? prevIndex : 0;\n        Overlay.render(`#${previousPopup}`, {\n            modifiers: ['sidebar', 'sofa-fit'],\n            callback: () => this.init(),\n        });\n    }\n\n    handleLandingRadio(e) {\n        this.hasLanding = e.currentTarget.value === 'yes';\n        if (!this.hasLanding) {\n            this.noLanding = true;\n            this.measurements.landing = null;\n        } else {\n            this.noLanding = false;\n        }\n    }\n\n    handleEditClick(e) {\n        e.preventDefault();\n        const targetStep = e.currentTarget.id;\n        const idx = Number(e.currentTarget.dataset.count);\n        if (!targetStep) return;\n        this.currentIndex = isNaN(idx) ? 0 : idx;\n        Overlay.render(`#${targetStep}`, {\n            modifiers: ['sidebar', 'sofa-fit'],\n            callback: () => {\n                this.tooBig = {};\n                this.init();\n            },\n        });\n    }\n\n    /* ---------------- Form / Measurement Helpers ---------------- */\n\n    markInvalid(inputs) {\n        inputs.forEach((inp) => inp.classList.add('invalid'));\n    }\n\n    storeMeasurement(stepId, values) {\n        if (stepId === 'doors') {\n            this.measurements.doors = {\n                width: values.width,\n                height: values.height,\n            };\n        } else if (stepId === 'hallway') {\n            this.measurements.hallway = { width: values.width };\n        } else if (stepId === 'stair-width') {\n            this.measurements['stair-width'] = { width: values.width };\n        } else if (stepId === 'stairs') {\n            if (!this.noLanding) {\n                this.measurements.landing = {\n                    width: values.width,\n                    depth: values.depth,\n                    height: values.height,\n                };\n            }\n        }\n    }\n\n    restoreInputsForCurrentStep() {\n        const stepId = this.currentStepId();\n        if (!stepId) return;\n        const data =\n            stepId === 'stairs'\n                ? this.measurements.landing\n                : this.measurements[stepId];\n        if (!data) return;\n        Array.from(\n            Overlay.target.querySelectorAll('input[type=\"text\"]'),\n        ).forEach((inp) => {\n            const name = inp.name;\n            if (Object.prototype.hasOwnProperty.call(data, name)) {\n                const val = data[name];\n                inp.value =\n                    typeof val === 'number' && !isNaN(val) ? String(val) : '';\n            }\n        });\n    }\n\n    restoreLandingRadioState() {\n        const stepId = this.currentStepId();\n        if (stepId !== 'stair-width') return;\n        if (this.hasLanding === null) return;\n        const selector = `input.js-landing-radio[value=\"${\n            this.hasLanding ? 'yes' : 'no'\n        }\"]`;\n        const radio = Overlay.target.querySelector(selector);\n        if (radio) radio.checked = true;\n    }\n\n    restoreNoLandingDisable() {\n        const stepId = this.currentStepId();\n        if (stepId !== 'stairs') return;\n        if (!this.noLanding) return;\n        Array.from(\n            Overlay.target.querySelectorAll('input[type=\"text\"]'),\n        ).forEach((inp) => {\n            inp.disabled = true;\n            inp.value = '';\n        });\n    }\n\n    initializeResultsPhaseIfReady() {\n        const resultsForm = Overlay.target.querySelector('.js-get-dimensions');\n        if (!resultsForm) return;\n        this.insertSummaryTableValues();\n        this.evaluateAll();\n        this.refreshResultsUI();\n    }\n\n    insertSummaryTableValues() {\n        const root = Overlay.target;\n        if (!root) return;\n        const doorSpan = root.querySelector('.js-wmsf-door');\n        const hallwaySpan = root.querySelector('.js-wmsf-hallway');\n        const stairWidthSpan = root.querySelector('.js-wmsf-stair-width');\n        const stairsSpan = root.querySelector('.js-wmsf-stairs');\n\n        if (doorSpan && this.measurements.doors) {\n            doorSpan.textContent = `${this.measurements.doors.width} (W) x ${this.measurements.doors.height} (H) cm`;\n        }\n        if (hallwaySpan && this.measurements.hallway) {\n            hallwaySpan.textContent = `${this.measurements.hallway.width} (W) cm`;\n        }\n        if (stairWidthSpan && this.measurements['stair-width']) {\n            stairWidthSpan.textContent = `${this.measurements['stair-width'].width} (W) cm`;\n        }\n        if (stairsSpan) {\n            if (this.noLanding) {\n                stairsSpan.textContent = `I don't have a landing`;\n            } else if (this.measurements.landing) {\n                const l = this.measurements.landing;\n                stairsSpan.textContent = `${l.width} (W) x ${l.depth} (D) x ${l.height} (H) cm`;\n            }\n        }\n    }\n\n    /* ---------------- Evaluation Core ---------------- */\n\n    evaluateAll() {\n        this.tooBig = {};\n        this.sofaParts.forEach((part) => {\n            const label = part.label;\n            const diffMap = {};\n\n            // Doors\n            if (this.measurements.doors) {\n                const res = this.evaluateDoorPart(\n                    part,\n                    this.measurements.doors,\n                );\n                if (res !== true) diffMap['doors'] = res;\n            }\n\n            // Hallway\n            if (this.measurements.hallway) {\n                const res = this.evaluateSingleWidthPart(\n                    part,\n                    this.measurements.hallway.width,\n                );\n                if (res !== true) diffMap['hallway'] = res;\n            }\n\n            // Stair width\n            if (this.measurements['stair-width']) {\n                const res = this.evaluateSingleWidthPart(\n                    part,\n                    this.measurements['stair-width'].width,\n                );\n                if (res !== true) diffMap['stair-width'] = res;\n            }\n\n            // Landing (if present)\n            if (!this.noLanding && this.measurements.landing) {\n                const res = this.evaluateLandingPart(\n                    part,\n                    this.measurements.landing,\n                );\n                if (res !== true) diffMap['stairs'] = res;\n            }\n\n            if (Object.keys(diffMap).length) {\n                this.tooBig[label] = diffMap;\n            }\n        });\n    }\n\n    /* ----------- Door (aperture two-dim orientation) ----------- */\n    evaluateDoorPart(part, door) {\n        const h = part.height || 0;\n        const w = part.width || 0;\n        const d = part.depth || 0;\n        const width = door.width || 0;\n        const height = door.height || 0;\n\n        // Orientations (pairs to test width vs height):\n        // 1: (h, w) or (h, d)\n        if (h <= width && (w <= height || d <= height)) return true;\n        // 2: (w, h) or (w, d)\n        if (w <= width && (h <= height || d <= height)) return true;\n        // 3: (d, h) or (d, w)\n        if (d <= width && (h <= height || w <= height)) return true;\n\n        // If it fails compute width / height diffs\n        const smallest = Math.min(h, w, d);\n        let widthDiff = smallest > width ? smallest - width : 0;\n\n        // Height diff: find orientation where width side fits but height side fails minimally\n        let heightDiff = Infinity;\n        if (h <= width) {\n            const other = Math.min(w, d);\n            if (other > height)\n                heightDiff = Math.min(heightDiff, other - height);\n        }\n        if (w <= width) {\n            const other = Math.min(h, d);\n            if (other > height)\n                heightDiff = Math.min(heightDiff, other - height);\n        }\n        if (d <= width) {\n            const other = Math.min(h, w);\n            if (other > height)\n                heightDiff = Math.min(heightDiff, other - height);\n        }\n        if (heightDiff === Infinity) heightDiff = 0;\n\n        const effective =\n            widthDiff > 0 ? widthDiff : heightDiff > 0 ? heightDiff : 0;\n        return { widthDiff: this.roundDiff(effective) };\n    }\n\n    /* ----------- Hallway & Stair Width (single width) ----------- */\n    evaluateSingleWidthPart(part, spaceWidth) {\n        const h = part.height || 0;\n        const w = part.width || 0;\n        const d = part.depth || 0;\n        const smallest = Math.min(h, w, d);\n        return smallest <= spaceWidth\n            ? true\n            : { widthDiff: this.roundDiff(smallest - spaceWidth) };\n    }\n\n    /* ----------- Landing (original 3 explicit orientations) ----------- */\n    evaluateLandingPart(part, landing) {\n        const sofaHeight = part.height || 0;\n        const sofaWidth = part.width || 0;\n        const sofaDepth = part.depth || 0;\n\n        const adjustedHeight = sofaHeight * this.landingPadding.heightFactor;\n        const adjustedDepth = sofaDepth * this.landingPadding.depthFactor;\n\n        const landingWidth = landing.width || 0;\n        const landingDepth = landing.depth || 0;\n        const landingHeight = landing.height || 0;\n\n        // Orientation 1:\n        // width -> landingWidth, depth (padded) -> landingDepth, height (padded) -> landingHeight\n        if (\n            sofaWidth <= landingWidth &&\n            adjustedDepth <= landingDepth &&\n            adjustedHeight <= landingHeight\n        ) {\n            return true;\n        }\n\n        // Orientation 2:\n        // height -> landingWidth, width -> landingDepth, depth (padded) -> landingHeight\n        if (\n            sofaHeight <= landingWidth &&\n            sofaWidth <= landingDepth &&\n            adjustedDepth <= landingHeight\n        ) {\n            return true;\n        }\n\n        // Orientation 3:\n        // depth -> landingWidth, height -> landingDepth, width -> landingHeight\n        if (\n            sofaDepth <= landingWidth &&\n            sofaHeight <= landingDepth &&\n            sofaWidth <= landingHeight\n        ) {\n            return true;\n        }\n\n        // Differences (only positive)\n        const widthDiff =\n            sofaWidth > landingWidth ? sofaWidth - landingWidth : 0;\n        const depthDiff =\n            adjustedDepth > landingDepth ? adjustedDepth - landingDepth : 0;\n        const heightDiff =\n            adjustedHeight > landingHeight ? adjustedHeight - landingHeight : 0;\n\n        return {\n            widthDiff: this.roundDiff(widthDiff),\n            depthDiff: this.roundDiff(depthDiff),\n            heightDiff: this.roundDiff(heightDiff),\n        };\n    }\n\n    /* ---------------- UI Results Rendering ---------------- */\n\n    refreshResultsUI() {\n        const resultsNodes =\n            Overlay.target?.querySelectorAll('.js-popup-results');\n        if (!resultsNodes) return;\n\n        resultsNodes.forEach((node) => {\n            const label = node.dataset.label;\n            const diffs = this.tooBig[label] || {};\n            const flatDiffs = Object.values(diffs).flatMap((obj) =>\n                Object.values(obj),\n            );\n            const numericOver = flatDiffs.filter(\n                (v) => typeof v === 'number' && v > 0,\n            );\n            const maxOver = numericOver.length ? Math.max(...numericOver) : 0;\n\n            if (maxOver > 0) {\n                node.textContent = `will not fit and is ${this.roundDiff(\n                    maxOver,\n                )}cm over`;\n                this.setRadioIconState(label, false);\n            } else {\n                node.textContent = 'will fit';\n                this.setRadioIconState(label, true);\n            }\n        });\n    }\n\n    setRadioIconState(label, willFit) {\n        const icon = Overlay.target?.querySelector(\n            `.js-popup-radio[data-label=\"${label}\"]`,\n        );\n        if (!icon) return;\n        icon.classList.remove(\n            'custom-radio__icon--tick',\n            'custom-radio__icon--cross',\n        );\n        icon.classList.add(\n            willFit ? 'custom-radio__icon--tick' : 'custom-radio__icon--cross',\n        );\n    }\n\n    /* ---------------- Frame Selection Submission ---------------- */\n\n    handleFrameSubmit(e) {\n        e.preventDefault();\n        const selected = Overlay.target.querySelector(\n            '.js-sofa-fit-frame:checked',\n        );\n        if (!selected) {\n            Overlay.close();\n            return;\n        }\n        const sku = selected.value;\n        const frameKey = `frames[${sku}]`;\n\n        try {\n            if (AndrewMartin?.customise) {\n                if (AndrewMartin.customise.updateCombinationQty) {\n                    AndrewMartin.customise.updateCombinationQty(sku, 1, true);\n                }\n                if (\n                    AndrewMartin.customise.replaceUrl &&\n                    this.userSelectedFrame\n                ) {\n                    AndrewMartin.customise.replaceUrl(frameKey, 1);\n                } else if (AndrewMartin.customise.updateUrl) {\n                    AndrewMartin.customise.updateUrl(frameKey, 1);\n                }\n            }\n        } catch {\n            // Ignore integration errors silently\n        }\n\n        const formEl = e.currentTarget;\n        const formData = new FormData(formEl);\n\n        fetch(window.location.href, {\n            method: 'POST',\n            body: formData,\n        })\n            .then((resp) => resp.text())\n            .then((html) => {\n                if (AndrewMartin?.customise?.refreshAfterAjax) {\n                    AndrewMartin.customise.refreshAfterAjax(html);\n                }\n                this.userSelectedFrame = true;\n                Overlay.close();\n            })\n            .catch(() => Overlay.close());\n    }\n\n    /* ---------------- Utility ---------------- */\n\n    roundDiff(num) {\n        // Always round to nearest integer for display clarity\n        return Math.round(num);\n    }\n}\n\n/* Global namespace init */\nvar AndrewMartin = window.AndrewMartin || {};\nAndrewMartin.sofaFit = new SofaFit();\n"],"sourceRoot":"../../../../resources/javascript"}