function mergeJSON(obj1, obj2) { const merged = { ...obj1, ...obj2 }; return merged; } function findValue(partialKey, jsonObj) { for (let key in jsonObj) { if (key.includes(partialKey)) { return jsonObj[key]; } } return null; } const updateVisibility = (arrEl, displayValue) => { arrEl.forEach(el => { el.style.display = displayValue; }); }; function findKeyMatchingString(inputString, jsonObj) { for (let key in jsonObj) { if (key.includes(inputString)) { return key; } } return null; } // ---- PROMOTION REMOVED ---- // var showPromotion = (...) => { ... } // deleted const showPrice = (arg) => { const tpParentEl = []; tpEl.forEach(tp => { tpParentEl.push(tp.parentElement); }); if (arg) { updateVisibility(tpParentEl, ''); updateText('Total Upfront Cost', totalTextEl); } else { updateVisibility(tpParentEl, 'none'); updateText('Total Upfront Cost', totalTextEl); } }; const updateUserForm = (fieldsJson, attr) => { const form = document.querySelector(`[${attr}]`); if (!!form.querySelector('[added-text]')) form.querySelector('[added-text]').remove(); if (!!form.querySelector('[added-email]')) form.querySelector('[added-email]').remove(); const mMonthPrice = fieldsJson['monthlyDisplay'] || fieldsJson['monthly-rate']; const mName = fieldsJson.customerName; const mEmail = fieldsJson.customerEmail; const mNumber = fieldsJson.phone; const mSpace = fieldsJson.neededSpace; const mStorage = fieldsJson.timeToStore; let message; if (attr === 'dlr-form') { const mAddress = fieldsJson.address; const mDeliveryPrice = fieldsJson['delivery-rate']; const mReDeliveryPrice = fieldsJson['redelivery-rate']; const mService = fieldsJson.serviceYouAreAfter; const mServicePrice = fieldsJson['service-price']; message = `Name: ${mName} Email: ${mEmail} Mobile Number: ${mNumber} Address: ${mAddress} Space Required: ${mSpace} Storage Duration: ${mStorage} Service: ${mService} Delivery Type: To Door Per Megabox Price: ${mMonthPrice} Delivery Price: $${mDeliveryPrice} per box Re Delivery Price: $${mReDeliveryPrice} per box Service Price: $${mServicePrice} Admin Fee: $${adminFee} Total Upfront Cost: $${fieldsJson['total-price']}`; } else { message = `Name: ${mName} Email: ${mEmail} Mobile Number: ${mNumber} Space Required: ${mSpace} Storage Duration: ${mStorage} Delivery Type: Self Move Per Megabox Price: ${mMonthPrice} Admin Fee: $${adminFee} Total Upfront Cost: $${fieldsJson['total-price']}`; } console.log(message); const quoteTextArea = document.createElement('textarea'); quoteTextArea.setAttribute('disabled', 'true'); quoteTextArea.setAttribute('name', 'Quote Data'); quoteTextArea.setAttribute('added-text', 'true'); quoteTextArea.style.height = '300px'; quoteTextArea.style.resize = 'vertical'; quoteTextArea.innerHTML = message; form.appendChild(quoteTextArea); const emailField = document.createElement('input'); emailField.setAttribute('disabled', 'true'); emailField.setAttribute('name', 'Customeremail'); emailField.setAttribute('added-email', 'true'); emailField.value = mEmail; form.appendChild(emailField); }; const updateText = (textToWrite, arrEl) => { if (textToWrite === 0) textToWrite = 'Free'; arrEl.forEach(el => { el.innerHTML = textToWrite; }); }; function findValuesByForm(nameToFind, jsonArray) { for (let i = 0; i < jsonArray.length; i++) { if (jsonArray[i].name === nameToFind) { return jsonArray[i].values; } } return null; } function getMonths(storeIndex, isDeliveryForm) { let numOfMonths; if (isDeliveryForm) { numOfMonths = storeIndex === 0 ? 1 : (storeIndex === 1 ? 3 : 6); } else { numOfMonths = storeIndex === 0 ? 1 : 6; } return numOfMonths; } let selectedDeliveryType; $('.section-form-action .radio-btn.is--space').on('click', function(){ selectedDeliveryType = $(this).index(); }); // UI element selectors (unchanged; promo elements exist but are unused) const tpEl = document.querySelectorAll('[tp]'); const paceEl = document.querySelectorAll('[pace]'); const dlEl = document.querySelectorAll('[dl]'); const rdlEl = document.querySelectorAll('[rdl]'); const zoneEl = document.querySelectorAll('[zone]'); const mrEl = document.querySelectorAll('[mr]'); const zoneFeeEl = document.querySelectorAll('[zone-fee]'); const monthsEl = document.querySelectorAll('[nm]'); const zoneCodeEl = document.querySelectorAll('[zone-code]'); const servicePriceEl = document.querySelectorAll('[sp]'); const serviceNameEl = document.querySelectorAll('[snm]'); const serviceDialogue = document.querySelectorAll('[service-dialogue]'); const totalTextEl = document.querySelectorAll('[tt]'); // Promotion-related nodes kept for compatibility but not used const promotionTextEl = document.querySelectorAll('[promotion]'); const promotionPriceEl = document.querySelectorAll('[p-price]'); const singularPpriceEl = document.querySelectorAll('[singular-p-price]'); const promotionAdditionalText = document.querySelectorAll('[promotion-additional]'); const promotionGreenTextEl = document.querySelectorAll('[promotion-green-text]'); const servicePriceRow = document.querySelectorAll('[service-price-row]'); const deliveryPriceRow = document.querySelectorAll('[delivery-rate-row]'); const noteBlock = document.querySelectorAll('[note-block]'); const noteText = document.querySelectorAll('[note]'); const adminFee = 30; // ---- SINGLE FLAT STORAGE PRICE: $132/MO ---- const boxPrices = [ { "monthly-rate": 132, "delivery-rates": [{ "delivery-rate": 200, "redelivery-rate": 200 }, { "delivery-rate": 200, "redelivery-rate": 200 }, { "delivery-rate": 200, "redelivery-rate": 200 }] }, { "monthly-rate": 132, "delivery-rates": [{ "delivery-rate": 400, "redelivery-rate": 400 }, { "delivery-rate": 400, "redelivery-rate": 400 }, { "delivery-rate": 400, "redelivery-rate": 400 }] }, { "monthly-rate": 132, "delivery-rates": [{ "delivery-rate": 600, "redelivery-rate": 600 }, { "delivery-rate": 600, "redelivery-rate": 600 }, { "delivery-rate": 600, "redelivery-rate": 600 }] }, { "monthly-rate": 132, "delivery-rates": [{ "delivery-rate": 800, "redelivery-rate": 800 }, { "delivery-rate": 800, "redelivery-rate": 800 }, { "delivery-rate": 800, "redelivery-rate": 800 }] } ]; const zonePrices = [ { "zone": 1, "kmStartRange": 0, "kmEndRange": 5, "charge": 0 }, { "zone": 2, "kmStartRange": 5.1, "kmEndRange": 10, "charge": 50 }, { "zone": 3, "kmStartRange": 10.1, "kmEndRange": 15, "charge": 75 }, { "zone": 4, "kmStartRange": 15.1, "kmEndRange": 20, "charge": 100 }, { "zone": 5, "kmStartRange": 20.1, "kmEndRange": 50, "charge": 125 } ]; let newValuesObj; // service pricing unchanged const servicePrices = [149, 199, 299, 200]; function getRadioInputValues(inputName, formName) { const form = document.querySelector(`[name=${formName}]`); const radioInputs = form.querySelectorAll(`input[type="radio"][name="${inputName}"]`); const values = []; radioInputs.forEach((input) => values.push(input.value)); return values; } function zoneAndPrice(postcodeCode) { const postcodeZone = postcodeZones.find((zoneData) => zoneData.code === parseInt(postcodeCode)); if (!postcodeZone) return "Postcode code not found in the postcodeZones array."; const zoneNumber = postcodeZone.zone; const priceData = zonePrices.find((zoneData) => zoneData.zone === zoneNumber); if (!priceData) return "Zone number not found in the zonePrices array."; return { 'price': priceData.charge, 'zone': zoneNumber }; } // ---- UPDATED: no promo, always $132 per box per month ---- function handleToDoorCost(service, neededSpace, timeToStore, postcode, valuesObj, formName) { const codePriceZone = zoneAndPrice(postcode); const spaceInputName = findKeyMatchingString('pace', valuesObj); const spaces = getRadioInputValues(spaceInputName, formName); const storeTimeInputName = findKeyMatchingString('tore', valuesObj); const storeTimes = getRadioInputValues(storeTimeInputName, formName); const serviceInputName = findKeyMatchingString('ervice', valuesObj); const services = getRadioInputValues(serviceInputName, formName); let servicePrice = 0; const spaceIndex = spaces.indexOf(neededSpace); const numberOfMegaboxes = parseInt(neededSpace); const storeIndex = storeTimes.indexOf(timeToStore); const serviceIndex = services.indexOf(service); if (spaceIndex >= 0 && storeIndex >= 0) { const ratePerBox = boxPrices[spaceIndex]["monthly-rate"]; // 132 const originalRate = ratePerBox; if (selectedDeliveryType === 1) { // Deliver to Door: no service fee; flat delivery per box const deliveryRate = 200; const redeliveryRate = 200; const totalPrice = (ratePerBox * numberOfMegaboxes) + adminFee + (deliveryRate * numberOfMegaboxes); return { "monthly-rate": ratePerBox, "original-rate": originalRate, "months": 1, "total-price": totalPrice, "delivery-rate": deliveryRate, "redelivery-rate": redeliveryRate, "service-price": 0, "store-index": storeIndex, "admin-fee": adminFee, "zone-fee": 0 }; } else { // Moving Assistance: base service fee only, flat storage rate if (serviceIndex >= 0) { servicePrice = servicePrices[serviceIndex]; } const totalPrice = (ratePerBox * numberOfMegaboxes) + adminFee + servicePrice; return { "monthly-rate": ratePerBox, "original-rate": originalRate, "months": 1, "total-price": totalPrice, "delivery-rate": 0, "redelivery-rate": 0, "service-price": servicePrice, "store-index": storeIndex, "admin-fee": adminFee, "zone-fee": 0 }; } } else { return false; } } // ---- UPDATED: no promo, always $132 per box per month ---- function handleSelfDeliveryCost(neededSpace, timeToStore, valuesObj, formName) { const spaceInputName = findKeyMatchingString('pace', valuesObj); const spaces = getRadioInputValues(spaceInputName, formName); const storeTimeInputName = findKeyMatchingString('tore', valuesObj); const storeTimes = getRadioInputValues(storeTimeInputName, formName); const spaceIndex = spaces.indexOf(neededSpace); const numberOfMegaboxes = parseInt(neededSpace); const storeIndex = storeTimes.indexOf(timeToStore); const ratePerBox = boxPrices[spaceIndex]["monthly-rate"]; // 132 const originalRate = ratePerBox; const totalPrice = (ratePerBox * numberOfMegaboxes) + adminFee; return { "monthly-rate": ratePerBox, "original-rate": originalRate, "months": 1, "total-price": totalPrice, "store-index": storeIndex, "admin-fee": adminFee, "zone-fee": 0 }; } const updatePrice = (formName) => { let jsonDataToSend = {}; const valuesObj = findValuesByForm(formName, savedFormDatas); newValuesObj = valuesObj; const postcode = findValue('code', valuesObj); const neededSpace = findValue('pace', valuesObj); const timeToStore = findValue('tore', valuesObj); const serviceYouAreAfter = findValue('ervice', valuesObj); jsonDataToSend.neededSpace = neededSpace; jsonDataToSend.timeToStore = timeToStore; jsonDataToSend.phone = findValue('hone', valuesObj); jsonDataToSend.customerName = findValue('ame', valuesObj) + ' ' + findValue('ast-', valuesObj); jsonDataToSend.customerEmail = findValue('mail', valuesObj); jsonDataToSend['date'] = findValue(''); let selectedStoreIndex = 0; if (!!postcode) { const priceData = handleToDoorCost(serviceYouAreAfter, neededSpace, timeToStore, postcode, valuesObj, formName); jsonDataToSend.postcode = postcode; jsonDataToSend.serviceYouAreAfter = serviceYouAreAfter; jsonDataToSend.address = findValue('ddress', valuesObj); jsonDataToSend = mergeJSON(jsonDataToSend, priceData); // Flat monthly display (no promo/standard text) const monthlyDisplay = '$' + priceData["monthly-rate"] + ' per megabox per month'; jsonDataToSend["monthlyDisplay"] = monthlyDisplay; updateUserForm(jsonDataToSend, 'dlr-form'); updateText(monthlyDisplay, mrEl); const deliveryRate = (priceData["delivery-rate"] > 0) ? '$' + priceData["delivery-rate"] + ' per megabox' : 0; const redeliveryRate = (priceData["redelivery-rate"] > 0) ? "$" + priceData["redelivery-rate"] + ' per megabox' : 0; updateText(deliveryRate, dlEl); updateText(redeliveryRate, rdlEl); updateText(priceData["months"], monthsEl); updateText(neededSpace, paceEl); updateText(priceData["total-price"], tpEl); updateText(serviceYouAreAfter, serviceNameEl); const serviceRate = (priceData['service-price'] > 0) ? "$" + priceData['service-price'] : 0; updateText(serviceRate, servicePriceEl); selectedStoreIndex = priceData['store-index']; } else { const priceData = handleSelfDeliveryCost(neededSpace, timeToStore, valuesObj, formName); jsonDataToSend = mergeJSON(jsonDataToSend, priceData); const monthlyDisplay = '$' + priceData["monthly-rate"] + ' per megabox per month'; jsonDataToSend["monthlyDisplay"] = monthlyDisplay; updateUserForm(jsonDataToSend, 'self-form'); updateText(monthlyDisplay, mrEl); updateText(priceData["months"], monthsEl); updateText(neededSpace, paceEl); updateText(priceData["total-price"], tpEl); selectedStoreIndex = priceData['store-index']; } // rows based on delivery type: if (!!postcode) { if (selectedDeliveryType === 1) { updateVisibility(servicePriceRow, 'none'); updateVisibility(deliveryPriceRow, ''); } else { updateVisibility(deliveryPriceRow, 'none'); updateVisibility(servicePriceRow, ''); } } // Hide any legacy promo UI if present updateVisibility(promotionTextEl, 'none'); updateVisibility(promotionAdditionalText, 'none'); updateText('', promotionGreenTextEl); showPrice(true); }; // ---- form state (unchanged) ---- let savedFormDatas = []; const allFormsToSave = Array.from(document.querySelectorAll('[save-forms]')); function updateSavedData(formName, values) { const existingFormIndex = savedFormDatas.findIndex(item => item.name === formName); if (existingFormIndex !== -1) { savedFormDatas[existingFormIndex].values = { ...savedFormDatas[existingFormIndex].values, ...values }; } updatePrice(formName); } allFormsToSave.forEach(formToSave => { const formName = formToSave.getAttribute('name'); let formInSavedDatas = false; const savedData = {}; savedData.name = formName; function updateFormInputValues() { const formInputValues = {}; const inputs = formToSave.elements; for (let i = 0; i < inputs.length; i++) { const input = inputs[i]; const inputName = input.name; if (input.type === 'radio') { if (input.checked) formInputValues[inputName] = input.value; } else if (input.type === 'checkbox') { formInputValues[inputName] = input.checked; } else { formInputValues[inputName] = input.value; } } if (!formInSavedDatas) { formInSavedDatas = true; savedData.values = formInputValues; savedFormDatas.push(savedData); } else { savedData.values = formInputValues; updateSavedData(formName, savedData); } } function handleInputChange() { updateFormInputValues(); } formToSave.addEventListener('change', handleInputChange); updateFormInputValues(); });