/home2/mshostin/hall-management.ms-hostingladz.com/public/web-assets/js/extra.js
function validateStep(stepId) {
let isValid = true;
const stepDiv = document.getElementById(stepId);
if (stepId === "step2") {
const errorMsg = stepDiv.querySelector(".vehicle-error");
if (errorMsg) errorMsg.style.display = "none";
}
if (stepId === "step2") {
const vehicleBlocks = stepDiv.querySelectorAll(".vehicle-block");
if (vehicleBlocks.length === 0) {
isValid = false;
const errorMsg = stepDiv.querySelector(".vehicle-error");
if (errorMsg) errorMsg.style.display = "block";
}
}
stepDiv.querySelectorAll("input[required], select[required], textarea[required]").forEach(el => {
if (!el.value.trim()) {
isValid = false;
el.classList.add("is-invalid");
} else {
el.classList.remove("is-invalid");
}
});
return isValid;
}
function showStep(stepId, currentStepId = null) {
if (currentStepId && !validateStep(currentStepId)) {
return;
}
document.querySelectorAll('.route_quote_info, .vehicle_quote_info, .basic_quote_info')
.forEach(div => div.style.display = "none");
document.getElementById(stepId).style.display = "block";
document.getElementById("calculatePriceFrom");
}
document.addEventListener('DOMContentLoaded', () => {
document.getElementById('step1_next')?.addEventListener('click', () => showStep('step2', 'step1'));
document.getElementById('step2_previous')?.addEventListener('click', () => showStep('step1'));
document.getElementById('step2_next')?.addEventListener('click', () => showStep('step3', 'step2'));
document.getElementById('step3_previous')?.addEventListener('click', () => showStep('step2'));
document.getElementById("calculatePriceFrom").addEventListener("submit", function (e) {
if (!validateStep("step3")) {
e.preventDefault();
}
});
});
$(document).ready(function () {
let vehicleIndex = 0;
function getVehicleFields(type, index) {
const yearField = `
<div class="col-md-4">
<label class="text-white">Year</label>
<select name="vehicles[${index}][year]" class="form-select year-select" required>
<option value="">-- Select Year --</option>
</select>
</div>
`;
const makeModelSelect = `
<div class="col-md-4">
<label class="text-white">Make</label>
<select name="vehicles[${index}][make]" class="form-select make-select" required>
<option value="">-- Select Make --</option>
${$('#make-options').html()}
</select>
</div>
<div class="col-md-4">
<label class="text-white">Model</label>
<select name="vehicles[${index}][model]" class="form-select model-select" required>
<option value="">-- Select Model --</option>
</select>
</div>
`;
const makeModelText = `
<div class="col-md-4">
<label class="text-white">Make</label>
<input type="text" name="vehicles[${index}][make]" class="form-control" placeholder="Enter Make" required>
</div>
<div class="col-md-4">
<label class="text-white">Model</label>
<input type="text" name="vehicles[${index}][model]" class="form-control" placeholder="Enter Model" required>
</div>
`;
const sizeFields = `
<div class="row mt-2">
<!-- Length -->
<div class="col-md-6">
<label class="text-white">Length</label>
<div class="input-container">
<input type="number" class="form-control px-2 border-0 py-0 feet-input"
name="vehicles[${index}][length_ft]"
placeholder="Feet" min="0" oninput="limitDigits(this, 3)" required>
<span class="separator">(Ft.)</span>
<input type="number" class="form-control px-2 border-0 py-0 inches-input"
name="vehicles[${index}][length_in]"
placeholder="Inches" min="0" max="11"
oninput="limitDigits(this, 2)" required>
<span class="separator">(In.)</span>
</div>
</div>
<!-- Width -->
<div class="col-md-6">
<label class="text-white">Width</label>
<div class="input-container">
<input type="number" class="form-control px-2 border-0 py-0 feet-input"
name="vehicles[${index}][width_ft]"
placeholder="Feet" min="0" oninput="limitDigits(this, 3)" required>
<span class="separator">(Ft.)</span>
<input type="number" class="form-control px-2 border-0 py-0 inches-input"
name="vehicles[${index}][width_in]"
placeholder="Inches" min="0" max="11"
oninput="limitDigits(this, 2)" required>
<span class="separator">(In.)</span>
</div>
</div>
</div>
<div class="row mt-2">
<!-- Height -->
<div class="col-md-6">
<label class="text-white">Height</label>
<div class="input-container">
<input type="number" class="form-control px-2 border-0 py-0 feet-input"
name="vehicles[${index}][height_ft]"
placeholder="Feet" min="0" oninput="limitDigits(this, 3)" required>
<span class="separator">(Ft.)</span>
<input type="number" class="form-control px-2 border-0 py-0 inches-input"
name="vehicles[${index}][height_in]"
placeholder="Inches" min="0" max="11"
oninput="limitDigits(this, 2)" required>
<span class="separator">(In.)</span>
</div>
</div>
<!-- Weight -->
<div class="col-md-4">
<label class="text-white">Weight</label>
<div class="input-container">
<input type="number" class="form-control px-2 border-0 py-0"
name="vehicles[${index}][weight]"
placeholder="Weight" min="0"
oninput="limitDigits(this, 6)" required>
<span class="separator">(Lbs.)</span>
</div>
</div>
</div>
`;
// Trailer type options based on vehicle type
let trailerOptions = `
<option value="Open Trailer">Open Trailer</option>
<option value="Enclosed Trailer">Enclosed Trailer</option>
`;
if (type === "RV-Transport") {
trailerOptions = `
<option value="Drive away">Drive away</option>
<option value="Tow away">Tow away</option>
<option value="Flatbed trailer">Flatbed trailer</option>
`;
} else if (type === "Heavy-Equipment" || type === "Boat-Transport") {
trailerOptions = `
<option value="Flatbed trailers">Flatbed trailers</option>
<option value="Drop Deck Trailers">Drop Deck Trailers</option>
<option value="Extendable trailers">Extendable trailers</option>
<option value="Lowboy Trailers">Lowboy Trailers</option>
<option value="RGN">RGN</option>
`;
}
const trailerAndCondition = `
<div class="row mt-2">
<div class="col-md-6">
<label class="text-white">Trailer Type</label>
<select class="form-control" name="vehicles[${index}][trailer_type]">
${trailerOptions}
</select>
</div>
<div class="col-md-6">
<label class="text-white">Condition</label>
<select class="form-control" name="vehicles[${index}][condition]">
<option value="Running">Running</option>
<option value="Non-Running">Non-Running</option>
</select>
</div>
</div>
`;
const imageUpload = `
<div class="input-form mt-4">
<input class="form-control image_input pt-0" name="images[${index}][]" type="file" accept="image/*" multiple onchange="previewImages(event, ${index})">
<div class="image-preview-container" id="imagePreviewContainer${index}"></div>
</div>
`;
let fields = `<div class="row mt-2">${yearField}`;
if (type === "Car") {
fields += makeModelSelect;
} else {
fields += makeModelText;
}
fields += `</div>`;
if (type === "Boat-Transport" || type === "Heavy-Equipment" || type === "RV-Transport") {
fields += sizeFields;
}
return fields + trailerAndCondition + imageUpload;
}
$("#tabSelector").change(function () {
const selected = $(this).val();
$("#firstVehicle").empty();
if (selected) {
vehicleIndex = 0;
$("#firstVehicle").html(`
<div class="vehicle-block vehicle-item main-vehicle" style=" margin-bottom:10px;">
<input type="hidden" name="vehicles[${vehicleIndex}][type]" value="${selected}">
<h4 class="text-white text-center text-decoration-underline">${selected.replace(/-/g, ' ')}</h4>
${getVehicleFields(selected, vehicleIndex)}
</div>
`);
generateYearOptions($("#firstVehicle .year-select"));
$("#addVehicleBtn").show();
} else {
$("#addVehicleBtn").hide();
}
});
$("#addVehicleBtn").click(function () {
const selected = $("#tabSelector").val();
if (!selected) return;
vehicleIndex++;
const vehicleHtml = `
<div class="vehicle-block vehicle-item extra-vehicle" style=" margin-bottom:10px; position:relative; display:none;">
<button type="button" class="deleteVehicleBtn" style="position:absolute; top:5px; right:5px; background:red; color:white; border:none; padding:5px 10px; cursor:pointer;"><i class="fas fa-trash"></i></button>
<input type="hidden" name="vehicles[${vehicleIndex}][type]" value="${selected}">
<h4 class="text-white text-center text-decoration-underline">${selected.replace(/-/g, ' ')}</h4>
${getVehicleFields(selected, vehicleIndex)}
</div>
`;
const $newBlock = $(vehicleHtml);
$("#additionalContent").append($newBlock);
$newBlock.slideDown(400);
generateYearOptions($newBlock.find(".year-select"));
});
$(document).on("change", ".year-select", function () {
const $parent = $(this).closest(".vehicle-block");
const year = $(this).val();
const $makeSelect = $parent.find(".make-select");
const $modelSelect = $parent.find(".model-select");
if (year) {
$.getJSON(`/get-makes/${year}`, function (data) {
data.forEach(make => {
$makeSelect.append(`<option value="${make}">${make}</option>`);
});
});
}
});
$(document).on("click", ".deleteVehicleBtn", function () {
$(this).closest(".extra-vehicle").slideUp(400, function () {
$(this).remove();
});
});
});
function previewImages(event, index) {
const container = document.getElementById(`imagePreviewContainer${index}`);
container.innerHTML = '';
Array.from(event.target.files).forEach(file => {
const reader = new FileReader();
reader.onload = function (e) {
const imgHTML = `
<div class="position-relative d-inline-block" style="width:80px;height:80px; margin:5px;">
<img src="${e.target.result}" class="img-thumbnail" style="width:100%;height:100%;object-fit:cover;">
</div>
`;
container.insertAdjacentHTML('beforeend', imgHTML);
}
reader.readAsDataURL(file);
});
}
function generateYearOptions($select) {
const currentYear = new Date().getFullYear();
for (let year = currentYear; year >= 1950; year--) {
$select.append(`<option value="${year}">${year}</option>`);
}
}
$(document).ready(function () {
$("#phone").inputmask({ "mask": "(999) 999-9999" });
$("form").on("submit", function (e) {
// let rawPhone = $("#phone").inputmask("unmaskedvalue");
let rawPhone = $("#phone").inputmask("unmaskedvalue") || "";
if (rawPhone.length !== 10) {
e.preventDefault();
}
});
});
document.querySelectorAll(".no_move").forEach(btn => {
btn.addEventListener("click", function (e) {
e.preventDefault();
e.stopPropagation();
this.blur();
console.log("Next button clicked");
});
});
// Allow only digits & limit max length
function limitDigits(element, maxDigits) {
if (element.value.length > maxDigits) {
element.value = element.value.slice(0, maxDigits);
}
}
$(document).ready(function () {
// General number-only check
$(document).on('input', 'input[type="number"]', function () {
this.value = this.value.replace(/[^0-9]/g, '');
});
// Limit Inches (example if you add inches field later)
$(document).on('input', '.inches-input', function () {
if (this.value > 11) {
this.value = 11;
} else if (this.value < 0) {
this.value = 0;
}
});
// Example for max length restriction
$(document).on('input', 'input[name*="[length]"], input[name*="[width]"], input[name*="[height]"]', function () {
limitDigits(this, 3); // max 3 digits
});
$(document).on('input', 'input[name*="[weight]"]', function () {
limitDigits(this, 6); // max 6 digits
});
});