{"version":3,"file":"track-configurator.js","names":["breakpoint","mediaQuery","width","height","resize","resizeTimeout"],"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/general.js","../../resources/modern-javascript/track-configurator/summary.js","../../resources/modern-javascript/entrypoint/track-configurator.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","import Dialog from 'dialog';\n\nconst 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        Dialog.close();\n    }\n}\n","export const resetPageScroll = () => {\n    window.scrollTo(0, 0);\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 Dialog from 'dialog';\n\nimport { 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        Dialog.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"],"mappings":"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"}