{"version":3,"file":"track-configurator.js","sources":["../../../resources/modern-javascript/track-configurator/overview.js","../../../resources/modern-javascript/track-configurator/dimensions.js","../../../resources/modern-javascript/track-configurator/spotlights.js","../../../resources/modern-javascript/track-configurator/save.js","../../../resources/modern-javascript/track-configurator/summary.js","../../../resources/modern-javascript/entrypoint/track-configurator.js","../../../resources/modern-javascript/track-configurator/general.js"],"sourcesContent":["import { clearBodyLocks, lock } from 'tua-body-scroll-lock';\n\nconst overview = document.querySelector('.track-configurator-overview');\nconst overviewTitle = document.querySelector('.track-configurator-overview__title');\nconst breakpoint = Astro.breakpoints.tablet;\nconst mediaQuery = window.matchMedia(`(${breakpoint.type}: ${breakpoint.size}px)`);\n\nexport const watchOverviewTitle = () => {\n    if (overview.open) {\n        clearBodyLocks();\n    } else {\n        lock(overview.querySelector('.track-configurator-overview__list'));\n    }\n}\n\nexport const initOverview = () => {\n    // Check the initial viewport\n    checkMediaQuery(mediaQuery.matches);\n\n    clearBodyLocks();\n\n    // Listen to viewport changes\n    mediaQuery.addEventListener('change', (e) => {\n        checkMediaQuery(e.matches);\n    });\n}\n\n// Check if we should show or hide the overview\nconst checkMediaQuery = (matches) => {\n    if (matches) {\n        hideOverview();\n    } else {\n        showOverview();\n        clearBodyLocks();\n    }\n\n}\n\n// Hide the overview\nconst hideOverview = () => {\n    if (overview.open) {\n        overview.removeAttribute('open');\n    }\n    overviewTitle.removeAttribute('inert');\n}\n\n// Show the overview\nconst showOverview = () => {\n    if (!overview.open) {\n        overview.setAttribute('open', true);\n    }\n    overviewTitle.setAttribute('inert', true);\n}\n","let widthInput;\nlet heightInput;\nlet curvedInput;\nlet width = 0;\nlet height = 0;\nlet curved = 'no';\nlet lastWidth = 0;\nlet lastHeight = 0;\nlet lastCurved = 'no';\nlet resize;\nlet resizing = false;\nlet diagramAspectRatio;\nconst axesLimit = 50;\nconst resizeTimeout = 100;\nconst resizingTimeout = 10;\n\nexport const updateTrackWidth = (value) => {\n    width = parseInt(value);\n\n    if (isNaN(width) || width != value || width === 0 || value === '') {\n        widthInput.value = lastWidth;\n        widthInput.dispatchEvent(new CustomEvent('change'));\n    } else {\n        lastWidth = width;\n        calculateAspectRatio();\n        updateTotalTrackLength();\n    }\n}\n\nexport const updateTrackHeight = (value) => {\n    height = parseInt(value);\n\n    if (isNaN(height) || height != value || height === 0 || value === '') {\n        heightInput.value = lastHeight;\n        heightInput.dispatchEvent(new CustomEvent('change'));\n    } else {\n        lastHeight = height;\n        calculateAspectRatio();\n        updateTotalTrackLength();\n    }\n}\n\nexport const updateCurvedCorners = (value) => {\n    curved = value;\n\n    lastCurved = curved;\n    updateTotalTrackLength();\n}\n\nexport const watchDimensions = () => {\n    widthInput = document.querySelector('[name=\"dimensions_width\"]');\n    heightInput = document.querySelector('[name=\"dimensions_height\"]');\n    curvedInput = document.querySelector('[name=\"dimensions_curved_corners\"]');\n    width = parseInt(widthInput?.value);\n    height = parseInt(heightInput?.value);\n    curved = curvedInput?.value;\n    lastWidth = width;\n    lastHeight = height;\n    lastCurved = curved;\n\n    calculateAspectRatio();\n    updateTotalTrackLength();\n}\n\nexport const watchDiagram = (aspectRatio) => {\n    if (aspectRatio) {\n        diagramAspectRatio = aspectRatio;\n    }\n    resizeDiagram(true);\n    window.addEventListener('resize', () => {\n        if (!resizing) {\n            resizing = true;\n            const preview = getPreview();\n\n            if (preview) {\n                preview.classList.add('track-configurator-preview--resizing');\n            }\n        }\n        clearTimeout(resize);\n        resize = setTimeout(resizeDiagram, resizeTimeout);\n    });\n}\n\nconst getPreview = () => {\n    return document.querySelector('.track-configurator-preview');\n}\n\nconst isLinearDiagram = () => {\n    const preview = getPreview();\n\n    return preview.classList.contains('track-configurator-preview--linear')\n}\n\nconst resizeDiagram = (doResize) => {\n    const preview = getPreview();\n\n    if (preview) {\n        const previewContainer = document.querySelector('.track-configurator-preview__container');\n        const root = document.querySelector(':root');\n        const aspectRatio = parseFloat(root.style.getPropertyValue('--track-configurator-canvas-aspect-ratio')) || diagramAspectRatio;\n        const gutter = parseInt(getComputedStyle(root).getPropertyValue('--track-configurator-preview-gutter'));\n\n        if (doResize) {\n            preview.classList.add('track-configurator-preview--resizing');\n        }\n\n        root.style.setProperty('--track-configurator-preview-container-width', 'unset');\n        root.style.setProperty('--track-configurator-preview-container-height', 'unset');\n\n        const oldW = previewContainer.clientWidth - (gutter * 4);\n        const oldH = oldW / aspectRatio;\n\n        const newW = preview.clientWidth - (gutter * 4);\n        const newH = (newW / aspectRatio) + (gutter * 2);\n\n        if (isLinearDiagram()) {\n            root.style.setProperty('--track-configurator-preview-container-width', '100%');\n        } else {\n            if (newH > preview.clientHeight) {\n                root.style.setProperty('--track-configurator-preview-container-height', '100%');\n            } else {\n                root.style.setProperty('--track-configurator-preview-container-width', '100%');\n            }\n        }\n\n        const canvas = document.querySelector('.track-configurator-canvas');\n\n        // This hack is needed for Safari\n        if (canvas) {\n            canvas.style.height = '50%';\n\n            setTimeout(() => {\n                canvas.style.height = null;\n            }, 10);\n        }\n\n        if (aspectRatio) {\n            if (canvas.offsetHeight < axesLimit && !isLinearDiagram()) {\n                previewContainer.dataset.hideAxes = true;\n            } else {\n                delete previewContainer.dataset.hideAxes;\n            }\n        }\n\n        setTimeout(() => {\n            preview.classList.remove('track-configurator-preview--resizing');\n            resizing = false;\n        }, resizingTimeout);\n    }\n}\n\nconst calculateAspectRatio = () => {\n    const root = document.querySelector(':root');\n\n    if (widthInput && heightInput) {\n        if (!isNaN(width) && !isNaN(height)) {\n            let aspectRatio = width / height;\n\n            const limit = {\n                landscape: 4,\n                portrait: 2,\n            }\n\n            if (aspectRatio > (limit.landscape / 1)) {\n                aspectRatio = limit.landscape / 1;\n            } else if (aspectRatio < (1 / limit.portrait)) {\n                aspectRatio = 1 / limit.portrait;\n            }\n\n            root.style.setProperty('--track-configurator-canvas-aspect-ratio', aspectRatio);\n        }\n    } else {\n        root.style.removeProperty('--track-configurator-canvas-aspect-ratio');\n    }\n    \n    resizeDiagram(true);\n}\n\nconst updateTotalTrackLength = () => {\n    const formData = new FormData();\n    formData.append('width', width);\n    formData.append('height', height);\n    formData.append('curved_corners', curved);\n\n    fetch(window.location.pathname + '/calculate-length', {\n        method: 'POST',\n        body: formData\n    }).then(function (response) {\n        return response.json()\n    }).then(function (data) {\n        const errorElement = document.getElementById('track-configurator-footer__error');\n        errorElement.innerHTML = '';\n        if (data.result !== true) {\n            errorElement.innerHTML = data.message;\n        }\n\n        const totalLengthElement = document.getElementById('track-configurator-dimensions__total-value');\n        if (\n            totalLengthElement &&\n            data.payload.total_length\n        ) {\n            totalLengthElement.innerHTML = `${data.payload.total_length}mm`;\n        }\n    });\n}\n\nexport const toggleCurvedCorners = () => {\n    const noInput = document.querySelector('#track_configurator_dimensions_curved_corners_no');\n    const yesInput = document.querySelector('#track_configurator_dimensions_curved_corners_yes');\n    \n    if (noInput && yesInput) {\n        if (yesInput.checked) {\n            noInput.checked = true;\n            yesInput.checked = false;\n            updateCurvedCorners('no');\n        } else {\n            noInput.checked = false;\n            yesInput.checked = true;\n            updateCurvedCorners('yes');\n        }\n        noInput.dispatchEvent(new CustomEvent('change'));\n        yesInput.dispatchEvent(new CustomEvent('change'));\n    }\n}\n","let resize;\nconst resizeTimeout = 100;\n\nconst breakpoint = Astro.breakpoints.tablet;\nconst mediaQuery = window.matchMedia(`(${breakpoint.type}: ${breakpoint.size}px)`);\n\nexport const checkSpotlights = () => {\n    const spotlight = document.querySelector('.track-configurator-spotlight');\n\n    if (spotlight) {\n        const selectedSpotlights = Array.from(document.querySelectorAll('.track-configurator-spotlight input')).filter(input => input.value > 0)\n        const spotlightMessage = document.querySelector('.track-configurator-footer__spotlights');\n        const spotlightCount = document.querySelector('.js-track-configurator-footer__spotlights-selected');\n        const nextButton = document.querySelector('button[name=\"configurator_action\"][value=\"next\"] span, button[name=\"configurator_action\"][value=\"save\"] span');\n        let unselectedText = globalTranslations.spotlights;\n        const selectedText = globalTranslations.next;\n        let count = 0;\n\n        if (mediaQuery.matches) {\n            unselectedText = globalTranslations.spotlightsMobile;\n        }\n\n        if (selectedSpotlights.length > 0) {\n            selectedSpotlights.forEach((input) => {\n                count += parseInt(input.value);\n            });\n            nextButton.classList.remove('track-configurator-footer__button-text');\n            nextButton.innerHTML = selectedText;\n        } else {\n            nextButton.classList.add('track-configurator-footer__button-text');\n            nextButton.innerHTML = unselectedText;\n        }\n\n        if (spotlightCount) {\n            const target = parseInt(spotlightCount.dataset.target);\n\n            if (count >= target) {\n                spotlightMessage.classList.add('track-configurator-footer__spotlights--hidden');\n            } else {\n                spotlightMessage.classList.remove('track-configurator-footer__spotlights--hidden');\n            }\n\n            spotlightCount.innerHTML = count;\n        }\n    }\n}\n\nexport const resetAllSpotlights = () => {\n    const quantityInput = document.querySelectorAll('.track-configurator-spotlight input');\n\n    quantityInput.forEach(el => {\n        el.value = 0;\n        el.dispatchEvent(new CustomEvent('change'));\n    });\n}\n\nexport const calculatePowerUsage = () => {\n    const selectedSpotlights = Array.from(document.querySelectorAll('.track-configurator-spotlight input')).filter(input => input.value > 0)\n    const formData = new FormData();\n    const color = document.querySelector('[name=\"color\"]')?.value;\n\n    selectedSpotlights.forEach(el => {\n        const spotName = 'spotlights[' + el.id + ']';\n        formData.append(spotName, el.value);\n    });\n\n    formData.append('color', color);\n\n    fetch(window.location.pathname + '/calculate-power', {\n        method: 'POST',\n        body: formData\n    }).then(function (response) {\n        return response.json()\n    }).then(function (data) {\n        const errorElement = document.getElementById('track-configurator-footer__error');\n        errorElement.innerHTML = '';\n        if (data.result !== true) {\n            errorElement.innerHTML = data.message;\n        }\n\n        // const totalLengthElement = document.getElementById('track-configurator-dimensions__total-value');\n        // if (\n        //     totalLengthElement &&\n        //     data.payload.total_length\n        // ) {\n        //     totalLengthElement.innerHTML = `${data.payload.total_length}mm`;\n        // }\n    });\n}\n\nexport const watchLayout = () => {\n    resizeProducts();\n    window.addEventListener('resize', () => {\n        clearTimeout(resize);\n        resize = setTimeout(resizeProducts, resizeTimeout);\n    });\n}\n\nexport const resizeProducts = () => {\n    const root = document.querySelector(':root');\n    root.style.setProperty('--track-configurator-spotlight-items-min-height', '0px');\n    let minHeight = 0;\n\n    document.querySelectorAll('.track-configurator-spotlight__items').forEach((el) => {\n        if (el.clientHeight > minHeight) {\n            minHeight = el.clientHeight;\n        }\n    });\n\n    root.style.setProperty('--track-configurator-spotlight-items-min-height', `${minHeight}px`);\n}\n\nexport const watchSpotlights = () => {\n    mediaQuery.addEventListener('change', (e) => {\n        checkSpotlights();\n    });\n}\n","const getSaveFields = () => {\n    const overlay = document.querySelector('.track-configurator-save');\n\n    return Array.from(overlay.querySelectorAll('input')).map((input) => {\n        if (input.name !== 'configuration_optin' || (input.name === 'configuration_optin' && input.checked)) {\n            return `<input type=\"hidden\" name=\"${input.name}\" value=\"${input.value}\" />`;\n        }\n    }).join('');\n}\n\nexport const saveTrackConfigurator = () => {\n    const nextButton = document.querySelector('button[name=\"configurator_action\"]');\n    const main = document.querySelector('.track-configurator-frame__main');\n    const form = nextButton.closest('form');\n\n    if (nextButton && main && form) {\n        // Allow the button to submit again\n        nextButton.type = 'submit';\n        // Add the fields to the main section\n        main.insertAdjacentHTML('afterbegin', getSaveFields());\n        // Submit the form\n        form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n        // Close the overlay\n        Overlay.close();\n    }\n}\n","let container;\nlet shape, width, height;\nlet connectorData = [];\nlet trackData = [];\nlet offsetValue = 0;\n\nconst getPercentageValue = (item, total, split, base) => {\n    let value = item / total * base;\n\n    if (split) {\n        return value / 2;\n    }\n\n    return value;\n}\n\nconst isVertical = (placement) => {\n    return ['right', 'left'].indexOf(placement) > -1;\n}\n\nconst setTrackStyle = (section, track) => {\n    const style = {\n        top: 0,\n        left: 0\n    };\n\n    if (section.placement === 'top') {\n        style.top = 0;\n    } else if (section.placement === 'right') {\n        style.left = '100%';\n    } else if (section.placement === 'bottom') {\n        style.top = '100%';\n    } else if (section.placement === 'left') {\n        style.left = 0;\n    } else if (section.placement === 'middle') {\n        style.top = '50%';\n    }\n\n    if (isVertical(section.placement)) {\n        let sectionHeight = height;\n        let base = 100;\n\n        if (shape === 's-shape') {\n            sectionHeight = sectionHeight / 2;\n            base = base / 2;\n        }\n\n        style.top = `${offsetValue + getPercentageValue(track.length, sectionHeight, true, base)}%`;\n        offsetValue += getPercentageValue(track.length, sectionHeight, false, base);\n    } else {\n        style.left = `${offsetValue + getPercentageValue(track.length, width, true, 100)}%`;\n        offsetValue += getPercentageValue(track.length, width, false, 100);\n    }\n\n    return style;\n}\n\nconst setConnectorStyle = (connector) => {\n    const style = {\n        top: 0,\n        left: 0\n    };\n\n    if (connector.placement.indexOf('top') > -1) {\n        style.top = 0;\n    }\n\n    if (connector.placement.indexOf('right') > -1) {\n        style.left = '100%';\n    }\n\n    if (connector.placement.indexOf('bottom') > -1) {\n        style.top = '100%';\n    }\n\n    if (connector.placement.indexOf('left') > -1) {\n        style.left = 0;\n    }\n\n    if (connector.placement.indexOf('middle') > -1) {\n        style.top = '50%';\n    }\n\n    return style;\n}\n\nconst createHtml = (ref, key, style) => {\n    return `<span class=\"track-configurator-canvas__reference track-configurator-canvas__reference--${key}\" style=\"top: ${style.top}; left: ${style.left};\">\n        ${ref}\n    </span>`;\n}\n\nconst createReferences = () => {\n    let html = '';\n\n    connectorData.forEach((connector) => {\n        html += createHtml(connector.ref, undefined, setConnectorStyle(connector));\n    });\n\n    trackData.forEach((section) => {\n        offsetValue = 0;\n\n        if (shape === 's-shape' && section.placement === 'right') {\n            offsetValue += 50;\n        }\n\n        section.track.forEach((track) => {\n            html += createHtml(track.ref, track.trackKey, setTrackStyle(section, track));\n        });\n    });\n\n    container.innerHTML += html;\n}\n\nexport const positionReferences = (data) => {\n    container = document.querySelector('.track-configurator-canvas__references');\n    shape = container.dataset.shape;\n    width = parseInt(container.dataset.width);\n    height = parseInt(container.dataset.height);\n\n    connectorData = data.corners;\n    trackData = data.track;\n\n    createReferences();\n}\n\nexport const updateSummary = () => {\n    const suspensionInput = document.querySelector('.track-configurator-suspension input');\n    const form = suspensionInput.closest('form');\n\n    if (form) {\n        window.Astro.TrackConfigurator.updatingSamePage = true;\n        form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n    }\n}\n","import { delegate } from '../util/delegate';\nimport { initOverview, watchOverviewTitle } from '../track-configurator/overview';\nimport { updateTrackHeight, updateTrackWidth, updateCurvedCorners, watchDimensions, watchDiagram, toggleCurvedCorners } from '../track-configurator/dimensions';\nimport { calculatePowerUsage, checkSpotlights, resetAllSpotlights, watchLayout, watchSpotlights } from '../track-configurator/spotlights';\nimport { saveTrackConfigurator } from '../track-configurator/save';\nimport { resetPageScroll } from '../track-configurator/general';\nimport { positionReferences, updateSummary } from '../track-configurator/summary';\n\nwindow.Astro.TrackConfigurator = window.Astro.TrackConfigurator || {};\nwindow.Astro.TrackConfigurator.initOverview = initOverview;\nwindow.Astro.TrackConfigurator.watchDimensions = watchDimensions;\nwindow.Astro.TrackConfigurator.watchDiagram = watchDiagram;\nwindow.Astro.TrackConfigurator.watchSpotlights = watchSpotlights;\nwindow.Astro.TrackConfigurator.checkSpotlights = checkSpotlights;\nwindow.Astro.TrackConfigurator.resetPageScroll = resetPageScroll;\nwindow.Astro.TrackConfigurator.positionReferences = positionReferences;\nwindow.Astro.TrackConfigurator.watchLayout = watchLayout;\n\ndelegate(document, 'click', '.track-configurator-header__link', (e) => {\n    if (!confirm('Are you sure you want to leave the track configurator and return to the homepage?')) {\n        e.preventDefault();\n    }\n});\n\ndelegate(document, 'click', '.track-configurator-overview__title', () => {\n    watchOverviewTitle();\n});\n\ndelegate(document, 'keypress', '.track-configurator-frame, .track-configurator-save', (e) => {\n    if (e.target.tagName === 'INPUT' && e.key === 'Enter') {\n        e.preventDefault();\n        e.target.blur();\n    }\n});\n\ndelegate(document, 'change', '[name=\"dimensions_width\"]', (e) => {\n    updateTrackWidth(e.target.value);\n});\n\ndelegate(document, 'change', '[name=\"dimensions_height\"]', (e) => {\n    updateTrackHeight(e.target.value);\n});\n\ndelegate(document, 'click', '.track-configurator-preview__switch button', (e) => {\n    toggleCurvedCorners();\n});\n\ndelegate(document, 'change', '.track-configurator-colour input', () => {\n    resetAllSpotlights();\n    checkSpotlights();\n});\n\ndelegate(document, 'change', '.track-configurator-spotlight input', () => {\n    calculatePowerUsage();\n    checkSpotlights();\n});\n\ndelegate(document, 'click', '.track-configurator-spotlight button', () => {\n    calculatePowerUsage();\n    checkSpotlights();\n});\n\ndelegate(document, 'click', '.track-configurator-footer button[name=\"configurator_action\"]', (e) => {\n    if (e.target.value === 'save') {\n        e.stopImmediatePropagation();\n        Overlay.render('#save-track', {\n            modifiers: ['sidebar', 'track-configurator']\n        });\n    }\n});\n\ndelegate(document, 'submit', '.track-configurator-save', (e) => {\n    e.preventDefault();\n    saveTrackConfigurator();\n});\n\ndelegate(document, 'change', '.track-configurator-suspension input', () => {\n    updateSummary();\n});\n\ndelegate(document, 'click', '.track-configurator-suspension button', () => {\n    updateSummary();\n});\n","export const resetPageScroll = () => {\n    window.scrollTo(0, 0);\n}\n"],"names":["overview","document","querySelector","overviewTitle","breakpoint","Astro","breakpoints","tablet","mediaQuery","window","matchMedia","type","size","checkMediaQuery","matches","hideOverview","showOverview","clearBodyLocks","open","removeAttribute","setAttribute","widthInput","heightInput","curvedInput","resize","diagramAspectRatio","width","height","curved","lastWidth","lastHeight","resizing","updateCurvedCorners","value","updateTotalTrackLength","getPreview","isLinearDiagram","classList","contains","resizeDiagram","doResize","preview","previewContainer","root","aspectRatio","parseFloat","style","getPropertyValue","gutter","parseInt","getComputedStyle","add","setProperty","clientWidth","newH","clientHeight","canvas","setTimeout","offsetHeight","dataset","hideAxes","remove","calculateAspectRatio","isNaN","limit","landscape","portrait","removeProperty","formData","FormData","append","fetch","location","pathname","method","body","then","response","json","data","errorElement","getElementById","innerHTML","result","message","totalLengthElement","payload","total_length","checkSpotlights","selectedSpotlights","Array","from","querySelectorAll","filter","input","spotlightMessage","spotlightCount","nextButton","unselectedText","globalTranslations","spotlights","selectedText","next","count","spotlightsMobile","length","forEach","target","calculatePowerUsage","_document$querySelect","color","el","spotName","id","resizeProducts","minHeight","saveTrackConfigurator","main","form","closest","insertAdjacentHTML","getSaveFields","overlay","map","name","checked","join","dispatchEvent","Event","bubbles","cancelable","Overlay","close","container","shape","connectorData","trackData","offsetValue","getPercentageValue","item","total","split","base","createHtml","ref","key","top","left","createReferences","html","connector","undefined","placement","indexOf","setConnectorStyle","section","track","trackKey","setTrackStyle","sectionHeight","updateSummary","TrackConfigurator","updatingSamePage","initOverview","addEventListener","e","watchDimensions","_widthInput","_heightInput","_curvedInput","watchDiagram","clearTimeout","watchSpotlights","resetPageScroll","scrollTo","positionReferences","corners","watchLayout","delegate","confirm","preventDefault","lock","tagName","blur","CustomEvent","toggleCurvedCorners","noInput","yesInput","stopImmediatePropagation","render","modifiers"],"mappings":"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"}