import { fields, stateToPostalCode, specificNames, specificTwoLetters, postalCode, fieldToCellMap, fieldToCellMapOld, } from './constants.js'; import { judgeInfo } from './judgeInformation.js'; import { casePlaintiffInfo } from './casePlaintiffInfo.js'; import { caseOpposingCounselInfo, caseFilingAttorneyInfo, } from './opposingCounselInfo.js'; import { generateLink } from './linkGenerator.js'; function toOrdinal(n) { var s = ['th', 'st', 'nd', 'rd'], v = n % 100; return n + (s[(v - 20) % 10] || s[v] || s[0]); } let savedData = {}; function byId(id) { return document.getElementById(id); } function onClick(id, handler) { const el = byId(id); if (el) el.addEventListener('click', handler); } function onChange(id, handler) { const el = byId(id); if (el) el.addEventListener('change', handler); } function onInput(id, handler) { const el = byId(id); if (el) el.addEventListener('input', handler); } function onSubmit(id, handler) { const el = byId(id); if (el) el.addEventListener('submit', handler); } function getFirstByName(name) { const elements = document.getElementsByName(name); return elements && elements.length > 0 ? elements[0] : null; } function safeString(value) { return value == null ? '' : String(value); } function safeLastFour(value) { const str = safeString(value); return str ? str.slice(-4) : ''; } function parseMoney(value) { const parsed = parseFloat(safeString(value).replace(/,/g, '')); return isNaN(parsed) ? 0 : parsed; } window.addEventListener('load', () => { let inputs = document.getElementsByTagName('input'); for (let input of inputs) { if (savedData[input.id] && !savedData[input.id].includes('xlsx')) { input.value = savedData[input.id]; } input.addEventListener('input', function () { savedData[this.id] = this.value; }); } generateFields(0); }); function generateFields(numCollectors) { let container = byId('collectorsContainer'); if (!container) return; container.innerHTML = ''; for (let i = 1; i <= 30; i++) { let div = document.createElement('div'); div.id = 'collector' + i; div.style.display = i <= numCollectors ? 'block' : 'none'; div.innerHTML = `

Letter to Collector #${i}

`; let inputs = div.querySelectorAll('input'); inputs.forEach((input) => { if (savedData[input.id]) { input.value = savedData[input.id]; } input.addEventListener('input', function () { savedData[this.id] = this.value; localStorage.setItem('collectorData', JSON.stringify(savedData)); }); }); container.appendChild(div); } } window.generateFields = generateFields; const numCollectorsEl = byId('numCollectors'); if (numCollectorsEl) { numCollectorsEl.onchange = function () { const numCollectors = this.value; for (let i = 1; i <= 30; i++) { const div = byId('collector' + i); if (div) { div.style.display = i <= numCollectors ? 'block' : 'none'; } } }; } onClick('generateClientFolderLinkBtn', function () { let container = byId('clientFolderLinkContainer'); if (!container) return; const clientFirstName = safeString(byId('clientFirstName')?.value); const clientLastName = safeString(byId('clientLastName')?.value); const folderPath = `file:///D:/Bklistservinfo Dropbox/Ryan Callahan/clients/${clientLastName}, ${clientFirstName}`; container.innerHTML = `Open Client Folder`; }); onClick('generateCaseLinkBtn', function () { let container = byId('caseLinkContainer'); if (!container) return; const caseNumberInput = safeString(byId('caseNumber')?.value); const link = generateLink(caseNumberInput); if (link) { container.innerHTML = `Open Case`; } }); async function sendFormData(path, data, templateName) { data.templateName = templateName; const normalizedPaths = []; const seen = new Set(); const addPath = (p) => { if (!p || seen.has(p)) return; seen.add(p); normalizedPaths.push(p); }; addPath(path); if (path.startsWith('/')) { addPath(path.slice(1)); } else { addPath(`/${path}`); } let lastError = null; for (const candidate of normalizedPaths) { try { const response = await fetch(candidate, { method: 'POST', body: JSON.stringify(data), headers: { 'Content-Type': 'application/json', }, }); if (!response.ok) { lastError = new Error(`Request failed for ${candidate}: ${response.status}`); continue; } const contentDisposition = response.headers.get('Content-Disposition'); let filename = 'output.docx'; if (contentDisposition) { const filenameMatch = contentDisposition.match(/filename="(.+)"/); if (filenameMatch && filenameMatch.length === 2) { filename = filenameMatch[1]; } } const blob = await response.blob(); const downloadUrl = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = downloadUrl; a.download = filename; document.body.appendChild(a); a.click(); setTimeout(() => { document.body.removeChild(a); URL.revokeObjectURL(downloadUrl); }, 0); return; } catch (error) { lastError = error; } } console.error('sendFormData failed:', lastError); alert('Unable to reach the document generation route.'); } function getFormData() { let data = {}; fields.forEach((field) => { data[field] = byId(field) ? byId(field).value : null; }); data.today = dayjs().format('MMMM Do, YYYY'); data.currentDate = dayjs().format('YYYY-MM-DD'); data['currentDateMM-DD-YYYY'] = dayjs().format('MM-DD-YYYY'); if (data.dob) { if (/^\d{4}$/.test(data.dob)) { data.dob = data.dob; } else { data.dob = dayjs(data.dob).format('MM/DD/YYYY'); } } let installmentDate = dayjs(data.installmentDate); data.installmentDate0 = installmentDate.format('MM/DD/YYYY'); for (let i = 1; i < 10; i++) { installmentDate = installmentDate.add(1, 'month'); data[`installmentDate${i}`] = installmentDate.format('MM/DD/YYYY'); } if (data.caseAnswerDate) { const [datePart = '', timePart = ''] = data.caseAnswerDate.split(';'); const trimmedDatePart = datePart.trim(); const trimmedTimePart = timePart.trim(); data['caseAnswerDateYYYY-MM-DD'] = dayjs(trimmedDatePart, 'MM/DD/YYYY').format('YYYY-MM-DD'); data.caseAnswerDateTime = trimmedTimePart; data.caseAnswerDateOnly = trimmedDatePart; } let judgeLastName = safeString(data.caseDivisionJudge).split(' ').pop(); data.caseAppearanceInfo = judgeInfo[judgeLastName] ? `Division: ${judgeInfo[judgeLastName].division}; ${judgeInfo[judgeLastName].modality}` : 'Modality: In-person; Access Code: N/A; Phone # / Link: N/A'; data.caseDivisionLocation = judgeInfo[judgeLastName] && judgeInfo[judgeLastName].location ? judgeInfo[judgeLastName].location : ' '; let caseOpposingCounsel = safeString(getFirstByName('caseOpposingCounsel')?.value); data.caseOCAddressLine1 = caseOpposingCounselInfo[caseOpposingCounsel] ? caseOpposingCounselInfo[caseOpposingCounsel].caseOCAddressLine1 : 'Address Line 1 Not Found'; data.caseOCAddressLine2 = caseOpposingCounselInfo[caseOpposingCounsel] ? caseOpposingCounselInfo[caseOpposingCounsel].caseOCAddressLine2 : 'Address Line 2 Not Found'; data.caseOCPhone = caseOpposingCounselInfo[caseOpposingCounsel] ? caseOpposingCounselInfo[caseOpposingCounsel].caseOCPhone : '111-111-1111'; data.caseOCFax = caseOpposingCounselInfo[caseOpposingCounsel] ? caseOpposingCounselInfo[caseOpposingCounsel].caseOCFax : '111-111-1112'; data.caseOCEmail = caseOpposingCounselInfo[caseOpposingCounsel] ? caseOpposingCounselInfo[caseOpposingCounsel].caseOCEmail : 'email@domain.com'; data.paymentOptions1 = caseOpposingCounselInfo[caseOpposingCounsel] && caseOpposingCounselInfo[caseOpposingCounsel].paymentOptions1 ? caseOpposingCounselInfo[caseOpposingCounsel].paymentOptions1 : 'Payment Options Not Found'; data.paymentOptions2 = caseOpposingCounselInfo[caseOpposingCounsel] && caseOpposingCounselInfo[caseOpposingCounsel].paymentOptions2 ? caseOpposingCounselInfo[caseOpposingCounsel].paymentOptions2 : ' '; data.paymentOptions3 = caseOpposingCounselInfo[caseOpposingCounsel] && caseOpposingCounselInfo[caseOpposingCounsel].paymentOptions3 ? caseOpposingCounselInfo[caseOpposingCounsel].paymentOptions3 : ' '; data.paymentOptions4 = caseOpposingCounselInfo[caseOpposingCounsel] && caseOpposingCounselInfo[caseOpposingCounsel].paymentOptions4 ? caseOpposingCounselInfo[caseOpposingCounsel].paymentOptions4 : ' '; data.paymentOptions5 = caseOpposingCounselInfo[caseOpposingCounsel] && caseOpposingCounselInfo[caseOpposingCounsel].paymentOptions5 ? caseOpposingCounselInfo[caseOpposingCounsel].paymentOptions5 : ' '; const casePlaintiffEl = byId('casePlaintiff'); const casePlaintiffValue = safeString(casePlaintiffEl?.value); if (caseOpposingCounselInfo && caseOpposingCounselInfo[caseOpposingCounsel]) { if (caseOpposingCounselInfo[caseOpposingCounsel].settlementPayee === 'casePlaintiff') { data.settlementPayee = casePlaintiffValue; } else { data.settlementPayee = caseOpposingCounselInfo[caseOpposingCounsel].settlementPayee; } } else { data.settlementPayee = 'Payee not found'; } let caseFilingAttorney = safeString(getFirstByName('caseFilingAttorney')?.value); data.caseAttyFirstName = caseFilingAttorneyInfo[caseFilingAttorney] ? caseFilingAttorneyInfo[caseFilingAttorney].caseAttyFirstName : 'First Name Not Found'; data.caseAttyLastName = caseFilingAttorneyInfo[caseFilingAttorney] ? caseFilingAttorneyInfo[caseFilingAttorney].caseAttyLastName : 'Last Name Not Found'; data.caseAttyAddressLine1 = caseFilingAttorneyInfo[caseFilingAttorney] ? caseFilingAttorneyInfo[caseFilingAttorney].caseAttyAddressLine1 : 'Address Line 1 Not Found'; data.caseAttyAddressLine2 = caseFilingAttorneyInfo[caseFilingAttorney] ? caseFilingAttorneyInfo[caseFilingAttorney].caseAttyAddressLine2 : 'Address Line 2 Not Found'; data.caseAttyPhone = caseFilingAttorneyInfo[caseFilingAttorney] ? caseFilingAttorneyInfo[caseFilingAttorney].caseAttyPhone : '111-111-1111'; data.caseAttyFax = caseFilingAttorneyInfo[caseFilingAttorney] ? caseFilingAttorneyInfo[caseFilingAttorney].caseAttyFax : '111-111-1112'; data.caseAttyEmail = caseFilingAttorneyInfo[caseFilingAttorney] ? caseFilingAttorneyInfo[caseFilingAttorney].caseAttyEmail : 'email@domain.com'; data.caseAttybarMO = caseFilingAttorneyInfo[caseFilingAttorney] ? caseFilingAttorneyInfo[caseFilingAttorney].caseAttybarMO : '######'; function formatDateString(dateString) { let date = new Date(dateString); if (!isNaN(date)) { let day = date.getDate(); let dayOrdinal = toOrdinal(day); return `${date.toLocaleDateString('en-US', { month: 'long', })} ${dayOrdinal}, ${date.getFullYear()}`; } else { console.error('Invalid Date'); return 'Invalid Date'; } } data.caseDispositionDateString = formatDateString(data.caseDispositionDate); data.caseFilingDateString = formatDateString(data.caseFilingDate); data.caseAnswerDateString = formatDateString(data.caseAnswerDateOnly); data.caseAnswerFiledDateString = formatDateString(data.caseAnswerFiledDate); data.discoCosDateString = formatDateString(data.discoCosDate); data.discoResponseCosDateString = formatDateString(data.discoResponseCosDate); let caseSuitAmount = parseMoney(data.caseSuitAmount); let settlementAmount = parseMoney(data.settlementAmount); let waivedAmount = caseSuitAmount - settlementAmount; let settlementOfferPercentExpected = data.settlementOfferPercentExpected ? parseFloat(data.settlementOfferPercentExpected) : 0; let settlementOfferPercentCurrent = data.settlementOfferPercentCurrent ? parseFloat(data.settlementOfferPercentCurrent) : 0; let settlementOfferExpected = (caseSuitAmount * (settlementOfferPercentExpected / 100)).toFixed(2); data.settlementOfferExpected = settlementOfferExpected; let settlementOfferCurrent = (caseSuitAmount * (settlementOfferPercentCurrent / 100)).toFixed(2); data.settlementOfferCurrent = settlementOfferCurrent; let settlementOfferAmount = safeString(byId('settlementOfferAmount')?.value); let settlementOffer = parseMoney(settlementOfferAmount).toFixed(2); settlementOffer = parseFloat(settlementOffer).toLocaleString('en-US', { minimumFractionDigits: 2 }); data.settlementOffer = settlementOffer; data.waivedAmount = waivedAmount.toLocaleString('en-US', { style: 'currency', currency: 'USD', }); let settlementFirstPaymentDate = new Date(data.settlementFirstPaymentDate); data.settlementFirstPaymentDateString = settlementFirstPaymentDate.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric', }); let day = settlementFirstPaymentDate.getDate(); data.settlementFirstPaymentDayString = toOrdinal(day); let settlementInstallmentAmount = parseMoney(data.settlementInstallmentAmount); data.settlementInstallmentAmountString = isNaN(settlementInstallmentAmount) ? '' : settlementInstallmentAmount.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); if (!isNaN(settlementInstallmentAmount)) { const dollars = Math.floor(settlementInstallmentAmount); const cents = Math.round((settlementInstallmentAmount - dollars) * 100); const dollarsText = numberToWords.toWords(dollars); const centsText = numberToWords.toWords(cents); data.settlementInstallmentAmountWords = `${dollarsText.charAt(0).toUpperCase() + dollarsText.slice(1)} Dollar${dollars !== 1 ? 's' : ''} and ${centsText.charAt(0).toUpperCase() + centsText.slice(1)} Cent${cents !== 1 ? 's' : ''}`; } else { data.settlementInstallmentAmountWords = ''; } let settlementCheckDate = new Date(settlementFirstPaymentDate); settlementCheckDate.setDate(settlementFirstPaymentDate.getDate() - 10); data.settlementCheckDate = settlementCheckDate.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric', }); function adjustAndFormatDate(date) { let day = date.getDate(); let month = date.getMonth(); let year = date.getFullYear(); let lastDayOfMonth = new Date(year, month + 1, 0).getDate(); if (day > lastDayOfMonth) { day = lastDayOfMonth; } let adjustedDate = new Date(year, month, day); let formattedMonth = (adjustedDate.getMonth() + 1).toString().padStart(2, '0'); let formattedDay = adjustedDate.getDate().toString().padStart(2, '0'); let formattedYear = adjustedDate.getFullYear(); return `${formattedMonth}/${formattedDay}/${formattedYear}`; } data.settlementPaymentDate01 = settlementFirstPaymentDate.toLocaleDateString('en-US', { year: 'numeric', month: '2-digit', day: '2-digit', }); for (let i = 1; i < 60; i++) { let paymentDate = new Date(settlementFirstPaymentDate); paymentDate.setMonth(paymentDate.getMonth() + i); let lastDayOfMonth = new Date(paymentDate.getFullYear(), paymentDate.getMonth() + 1, 0).getDate(); if (settlementFirstPaymentDate.getDate() > lastDayOfMonth) { paymentDate.setDate(lastDayOfMonth); } let formattedDate = adjustAndFormatDate(paymentDate); data[`settlementPaymentDate${(i + 1).toString().padStart(2, '0')}`] = formattedDate; } for (let i = 1; i < 60; i++) { let paymentDateKey = `settlementPaymentDate${(i + 1).toString().padStart(2, '0')}`; let paymentDate = new Date(data[paymentDateKey]); if (paymentDate.getDate() !== settlementFirstPaymentDate.getDate()) { paymentDate.setMonth(paymentDate.getMonth() - 1); paymentDate.setDate(new Date(paymentDate.getFullYear(), paymentDate.getMonth() + 1, 0).getDate()); data[paymentDateKey] = adjustAndFormatDate(paymentDate); } } let settlementInstallmentNo = parseInt(data.settlementInstallmentNo, 10); let settlementInterestRate = parseFloat(data.settlementInterestRate) || 0.00000000000000000001; settlementAmount = parseMoney(data.settlementAmount); let settlementCaseCosts = parseMoney(data.settlementCaseCosts); let monthlyInterestRate = settlementInterestRate / 100 / 12; let settlementPaymentAmounts = []; let settlementRemainingBalances = []; let cumulativeInterest = 0; for (let i = 0; i < settlementInstallmentNo; i++) { let interestPayment = settlementAmount * monthlyInterestRate; let principalPayment = settlementInstallmentAmount - interestPayment; if (settlementAmount < principalPayment) { principalPayment = settlementAmount; settlementInstallmentAmount = principalPayment + interestPayment + settlementCaseCosts; } settlementAmount -= principalPayment; settlementPaymentAmounts.push(settlementInstallmentAmount.toFixed(2)); settlementRemainingBalances.push(settlementAmount.toFixed(2)); cumulativeInterest += interestPayment; if (settlementAmount <= 0) { break; } } if (settlementAmount > 0) { let finalInterestPayment = settlementAmount * monthlyInterestRate; let finalPayment = settlementAmount + finalInterestPayment + settlementCaseCosts; settlementPaymentAmounts.push(finalPayment.toFixed(2)); settlementRemainingBalances.push('0.00'); cumulativeInterest += finalInterestPayment; } for (let i = 0; i < 60; i++) { data[`settlementPaymentAmount${(i + 1).toString().padStart(2, '0')}`] = settlementPaymentAmounts[i] || '0.00'; data[`settlementRemaingBalance${(i + 1).toString().padStart(2, '0')}`] = settlementRemainingBalances[i] || '0.00'; } data.settlementTotalInterest = cumulativeInterest.toFixed(2); data.remainingAmount = parseFloat(settlementAmount.toFixed(2)).toLocaleString('en-US', { style: 'currency', currency: 'USD', }); data.SSNLastFour = safeLastFour(data.SSN); data.SSN2LastFour = safeLastFour(data.client2SSN); data.caseAccLastFour = safeLastFour(data.caseAccountNumber); data.debtCollector1AccLastFour = safeLastFour(data.debtCollector1Account); data.debtCollector2AccLastFour = safeLastFour(data.debtCollector2Account); data.debtCollector3AccLastFour = safeLastFour(data.debtCollector3Account); data.debtCollector4AccLastFour = safeLastFour(data.debtCollector4Account); data.debtCollector5AccLastFour = safeLastFour(data.debtCollector5Account); data.debtCollector6AccLastFour = safeLastFour(data.debtCollector6Account); data.debtCollector7AccLastFour = safeLastFour(data.debtCollector7Account); data.debtCollector8AccLastFour = safeLastFour(data.debtCollector8Account); data.debtCollector9AccLastFour = safeLastFour(data.debtCollector9Account); data.debtCollector10AccLastFour = safeLastFour(data.debtCollector10Account); data.debtCollector11AccLastFour = safeLastFour(data.debtCollector11Account); data.debtCollector12AccLastFour = safeLastFour(data.debtCollector12Account); data.debtCollector13AccLastFour = safeLastFour(data.debtCollector13Account); data.debtCollector14AccLastFour = safeLastFour(data.debtCollector14Account); data.debtCollector15AccLastFour = safeLastFour(data.debtCollector15Account); data.debtCollector16AccLastFour = safeLastFour(data.debtCollector16Account); data.debtCollector17AccLastFour = safeLastFour(data.debtCollector17Account); data.debtCollector18AccLastFour = safeLastFour(data.debtCollector18Account); data.debtCollector19AccLastFour = safeLastFour(data.debtCollector19Account); data.debtCollector20AccLastFour = safeLastFour(data.debtCollector20Account); data.debtCollector21AccLastFour = safeLastFour(data.debtCollector21Account); data.debtCollector22AccLastFour = safeLastFour(data.debtCollector22Account); data.debtCollector23AccLastFour = safeLastFour(data.debtCollector23Account); data.debtCollector24AccLastFour = safeLastFour(data.debtCollector24Account); data.debtCollector25AccLastFour = safeLastFour(data.debtCollector25Account); data.debtCollector26AccLastFour = safeLastFour(data.debtCollector26Account); data.debtCollector27AccLastFour = safeLastFour(data.debtCollector27Account); data.debtCollector28AccLastFour = safeLastFour(data.debtCollector28Account); data.debtCollector29AccLastFour = safeLastFour(data.debtCollector29Account); data.debtCollector30AccLastFour = safeLastFour(data.debtCollector30Account); data.casePlaintiffFileName = safeString(data.casePlaintiff).replace(/ /g, '-').replace(/[,.]/g, ''); return data; } let counselDataList = byId('counsel-list'); let counselNames = Object.keys(caseOpposingCounselInfo); if (counselDataList) { for (let name of counselNames) { let option = document.createElement('option'); option.value = name; counselDataList.appendChild(option); } } let filingAttorneyDataList = byId('attorney-list'); let filingAttorneyNames = Object.keys(caseFilingAttorneyInfo); if (filingAttorneyDataList) { for (let name of filingAttorneyNames) { let option = document.createElement('option'); option.value = name; filingAttorneyDataList.appendChild(option); } } let plaintiffDataList = byId('plaintiff-list'); let plaintiffNames = Object.keys(casePlaintiffInfo); if (plaintiffDataList) { for (let name of plaintiffNames) { let option = document.createElement('option'); option.value = name; plaintiffDataList.appendChild(option); } } let judgeDataList = byId('judge-list'); let judgeNames = Object.keys(judgeInfo); if (judgeDataList) { for (let name of judgeNames) { let option = document.createElement('option'); option.value = name; judgeDataList.appendChild(option); } } onInput('caseDivisionJudge', function () { let selectedJudge = this.value; if (judgeInfo[selectedJudge]) { if (byId('caseDivisionNumber')) byId('caseDivisionNumber').value = judgeInfo[selectedJudge].division; if (byId('caseDesignation')) byId('caseDesignation').value = judgeInfo[selectedJudge].designation; if (byId('caseCounty')) byId('caseCounty').value = judgeInfo[selectedJudge].county; if (byId('caseState')) byId('caseState').value = judgeInfo[selectedJudge].state; if (byId('caseDivisionDesignation')) byId('caseDivisionDesignation').value = judgeInfo[selectedJudge].divisionDesignation; } else { if (byId('caseDivisionNumber')) byId('caseDivisionNumber').value = ''; if (byId('caseDesignation')) byId('caseDesignation').value = ''; if (byId('caseCounty')) byId('caseCounty').value = ''; if (byId('caseState')) byId('caseState').value = ''; if (byId('caseDivisionDesignation')) byId('caseDivisionDesignation').value = ''; } }); onChange('excelFile', function (e) { readExcelFile(e); }); onChange('excelFileOld', function (e) { readExcelFileOld(e); }); function cellToRowCol(cell) { const col = cell.toUpperCase().charCodeAt(0) - 'A'.charCodeAt(0); const row = parseInt(cell.slice(1)) - 1; return [col, row]; } window.cellToRowCol = cellToRowCol; function readExcelFile(event) { let input = event.target; let reader = new FileReader(); reader.onload = function () { let data = new Uint8Array(reader.result); let workbook = XLSX.read(data, { type: 'array' }); let worksheet = workbook.Sheets[workbook.SheetNames[0]]; let jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 }); let formData = mapExcelDataToFormData(jsonData); populateForm(formData); }; if (input.files[0]) { reader.readAsArrayBuffer(input.files[0]); } } function mapExcelDataToFormData(data) { let formData = {}; for (let field in fieldToCellMap) { let cell = fieldToCellMap[field]; let rowIndex = parseInt(cell.substr(1)) - 1; let colIndex = cell.charCodeAt(0) - 65; formData[field] = data[rowIndex] && data[rowIndex][colIndex] !== undefined ? data[rowIndex][colIndex] : ''; } return formData; } function readExcelFileOld(event) { let input = event.target; let reader = new FileReader(); reader.onload = function () { let data = new Uint8Array(reader.result); let workbook = XLSX.read(data, { type: 'array' }); let worksheet = workbook.Sheets[workbook.SheetNames[0]]; let jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 }); let formData = mapExcelDataToFormDataOld(jsonData); populateForm(formData); }; if (input.files[0]) { reader.readAsArrayBuffer(input.files[0]); } } function mapExcelDataToFormDataOld(data) { let formData = {}; for (let field in fieldToCellMapOld) { let cell = fieldToCellMapOld[field]; let rowIndex = parseInt(cell.substr(1)) - 1; let colIndex = cell.charCodeAt(0) - 65; formData[field] = data[rowIndex] && data[rowIndex][colIndex] !== undefined ? data[rowIndex][colIndex] : ''; } return formData; } function populateForm(data) { for (let field in data) { let input = byId(field); if (input) { input.value = data[field]; savedData[input.id] = input.value; localStorage.setItem('collectorData', JSON.stringify(savedData)); } } if (data.clientLastName && data.clientFirstName) { document.title = `${data.clientLastName}, ${data.clientFirstName}`; } } function trimSpaces(input) { input.value = input.value.trim(); } window.trimSpaces = trimSpaces; function titleCase(input) { input.value = input.value.trimStart(); if (!input.getAttribute('data-corrected')) { input.value = input.value.trim().replace(/\b(\S+)\b/g, function (txt) { if (txt.length === 2) { const lowerCaseTxt = txt.toLowerCase(); if (postalCode.hasOwnProperty(lowerCaseTxt)) { return txt.toUpperCase(); } else if (specificTwoLetters.hasOwnProperty(lowerCaseTxt)) { return specificTwoLetters[lowerCaseTxt]; } else { return txt; } } if (specificNames.hasOwnProperty(txt.toLowerCase())) { return specificNames[txt.toLowerCase()]; } const mcMatch = txt.match(/^(mc)(.+)/i); if (mcMatch) { return 'Mc' + mcMatch[2].charAt(0).toUpperCase() + mcMatch[2].slice(1).toLowerCase(); } const macMatch = txt.match(/^(mac)(.+)/i); if (macMatch) { return 'Mac' + macMatch[2].charAt(0).toUpperCase() + macMatch[2].slice(1).toLowerCase(); } return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); }); input.setAttribute('data-corrected', true); } } window.titleCase = titleCase; function validateEmail(input) { const emailErrorElement = byId('emailError'); const trimmedValue = input.value.trim().toLowerCase(); if (trimmedValue !== '' && !input.getAttribute('data-corrected')) { var emailRegex = /^\S+@\S+\.\S+$/; if (!emailRegex.test(trimmedValue)) { if (emailErrorElement) emailErrorElement.textContent = 'Please enter a valid email address'; input.focus(); savedData[input.id] = trimmedValue; localStorage.setItem('collectorData', JSON.stringify(savedData)); return false; } else { if (emailErrorElement) emailErrorElement.textContent = ''; } input.setAttribute('data-corrected', 'true'); } else { if (emailErrorElement) emailErrorElement.textContent = ''; } input.value = trimmedValue; } window.validateEmail = validateEmail; function formatPhone(input, type) { const typeToErrorElement = type === 'home' ? 'homePhoneError' : 'cellPhoneError'; const phoneErrorElement = byId(typeToErrorElement); if (input.value.length > 0 && !input.getAttribute('data-corrected')) { let value = input.value.replace(/[^0-9]/g, ''); if (/^\d{10}$/.test(value)) { input.value = value.slice(0, 3) + '-' + value.slice(3, 6) + '-' + value.slice(6); if (phoneErrorElement) phoneErrorElement.textContent = ''; input.setAttribute('data-corrected', 'true'); } else { input.value = ''; if (phoneErrorElement) phoneErrorElement.textContent = 'Phone number must be 10 digits'; input.focus(); return false; } } savedData[input.id] = input.value; localStorage.setItem('collectorData', JSON.stringify(savedData)); return true; } window.formatPhone = formatPhone; function formatCurrency(input) { if (!input.getAttribute('data-corrected')) { let value = input.value.replace(/[^0-9.]/g, ''); value = parseFloat(value).toFixed(2); input.value = isNaN(value) ? '' : value; savedData[input.id] = input.value; localStorage.setItem('collectorData', JSON.stringify(savedData)); input.setAttribute('data-corrected', 'true'); } } window.formatCurrency = formatCurrency; function formatDateTime(input) { if (!input.getAttribute('data-corrected')) { let value = new Date(input.value); if (!isNaN(value.getTime())) { let formatted = value.toLocaleDateString(undefined, { day: '2-digit', month: '2-digit', year: 'numeric', }) + '; ' + value.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', hour12: true, }); input.value = formatted; } input.setAttribute('data-corrected', 'true'); } } window.formatDateTime = formatDateTime; function formatExpiration(input) { if (!input.getAttribute('data-corrected')) { let value = input.value.replace(/[^0-9]/g, ''); if (value.length === 4) { input.value = value.slice(0, 2) + '/' + value.slice(2); } input.setAttribute('data-corrected', 'true'); } } window.formatExpiration = formatExpiration; function formatSSN(input, type) { const typeToErrorElement = type === 'client' ? 'clientSSNError' : 'client2SSNError'; const ssnErrorElement = byId(typeToErrorElement); let lastFourDigits; let wholeSSN; if (input.value && !input.getAttribute('data-corrected')) { let value = input.value.replace(/[^0-9]/g, ''); if (value.length === 9) { lastFourDigits = value.slice(5); input.value = value.slice(0, 3) + '-' + value.slice(3, 5) + '-' + lastFourDigits; savedData[input.id] = input.value; localStorage.setItem('collectorData', JSON.stringify(savedData)); if (ssnErrorElement) ssnErrorElement.textContent = ''; } else { input.value = ''; if (ssnErrorElement) ssnErrorElement.textContent = 'SSN must be 9 digits'; input.focus(); return false; } } wholeSSN = input.value; return true; } window.formatSSN = formatSSN; function formatState(input) { const stateErrorElement = byId('homeStateError'); if (!input.getAttribute('data-corrected')) { const stateInput = input.value.trim().toUpperCase().replace(/\s+/g, ' '); const postalCode = stateToPostalCode[stateInput.toLowerCase()]; if (postalCode) { input.value = postalCode.toUpperCase(); if (stateErrorElement) stateErrorElement.textContent = ''; } else if (Object.values(stateToPostalCode).includes(stateInput)) { input.value = stateInput; if (stateErrorElement) stateErrorElement.textContent = ''; } else { if (stateErrorElement) stateErrorElement.textContent = 'Invalid state name or code'; input.focus(); return false; } savedData[input.id] = input.value; localStorage.setItem('collectorData', JSON.stringify(savedData)); } } window.formatState = formatState; function validateHomeZip(input) { let zip = input.value; let errorMessage = byId('zipError'); if (zip.indexOf('-') !== -1 && zip.split('-')[1].length < 4) { zip = zip.substring(0, 5); input.value = zip; } else if (zip.indexOf('-') === -1 && zip.length > 5) { zip = zip.substring(0, 5); input.value = zip; } if (zip !== '' && !/^\d{5}(-\d{4})?$/.test(zip)) { if (errorMessage) errorMessage.textContent = 'Format as 12345 or 12345-1234'; input.focus(); return false; } else { if (errorMessage) errorMessage.textContent = ''; return true; } } window.validateHomeZip = validateHomeZip; function formatCaseState(input) { const stateErrorElement = byId('caseStateError'); if (!input.getAttribute('data-corrected')) { const stateInput = input.value.trim().toUpperCase().replace(/\s+/g, ' '); const stateName = Object.keys(stateToPostalCode).find((key) => stateToPostalCode[key] === stateInput); if (stateName) { input.value = stateName.charAt(0).toUpperCase() + stateName.slice(1).toLowerCase(); if (stateErrorElement) stateErrorElement.textContent = ''; } else if (stateToPostalCode.hasOwnProperty(stateInput.toLowerCase())) { const fullStateName = Object.keys(stateToPostalCode).find((key) => stateToPostalCode[key] === stateInput); input.value = fullStateName.charAt(0).toUpperCase() + fullStateName.slice(1).toLowerCase(); if (stateErrorElement) stateErrorElement.textContent = ''; } else { if (stateErrorElement) stateErrorElement.textContent = 'Invalid state name or code'; input.focus(); return false; } savedData[input.id] = input.value; localStorage.setItem('collectorData', JSON.stringify(savedData)); } } window.formatCaseState = formatCaseState; onChange('excelFile', clearForm); onChange('excelFileOld', clearForm); onClick('clearForm', clearForm); function clearForm() { let forms = document.getElementsByName('clientDataForm'); if (forms.length > 0) { let form = forms[0]; form.reset(); } document.title = 'Client Intake Form'; localStorage.removeItem('clientTitle'); } function clearCaseInfo() { let caseFields = document.querySelectorAll('.case-info'); caseFields.forEach((field) => { field.value = ''; savedData[field.id] = ''; }); localStorage.setItem('collectorData', JSON.stringify(savedData)); } onClick('clearCaseInfo', clearCaseInfo); onClick('generateClientFolderBtn', function (event) { event.preventDefault(); const data = getFormData(); sendFormData('/generate-client-folder', data); }); onSubmit('generateClientDataFile', function (event) { event.preventDefault(); const data = getFormData(); sendFormData('/generate-excel', data, 'output.xlsx'); }); onClick('generatePaymentPlanBtn', function (event) { event.preventDefault(); const data = getFormData(); sendFormData('/generate-payment-plan', data, 'output.xlsx'); }); onClick('generateIcsBtn', function (event) { event.preventDefault(); const data = getFormData(); sendFormData('/generate-ics', data); }); onClick('generateDiscoIcsMOBtn', function (event) { event.preventDefault(); const data = getFormData(); sendFormData('/generate-MOdisco-ics', data); }); onClick('generateDiscoBtn', function (event) { generateDisco(event); }); onClick('generateDiscoIcsKSBtn', function (event) { event.preventDefault(); const data = getFormData(); sendFormData('/generate-KSdisco-ics', data); }); onClick('generateIcsBodyBtn', function (event) { event.preventDefault(); const data = getFormData(); sendFormData('/generate-ics-body', data); }); onClick('generateContactBtn', function (event) { event.preventDefault(); const data = getFormData(); sendFormData('/generate-vCard', data); }); onClick('generateRetainerBtn', function (event) { event.preventDefault(); const data = getFormData(); sendFormData('/generate-retainer', data); }); onClick('generatePleadingBtn', function () { generatePleading(); }); onClick('generateLetterBtn', function () { generateLetter(); }); onClick('generateEoABtn', function (event) { event.preventDefault(); const data = getFormData(); sendFormData('/generate-eoa', data); }); onClick('generateNotesBtn', function (event) { event.preventDefault(); const data = getFormData(); sendFormData('/generate-notes', data); }); onClick('generateSpreadsheetData', function (event) { event.preventDefault(); const data = getFormData(); sendFormData('/generate-spreadsheet', data); }); onClick('generateADsBtn', function (event) { event.preventDefault(); const data = getFormData(); sendFormData('/generate-ADs', data); }); onClick('generateCloseOutBtn', function (event) { event.preventDefault(); const data = getFormData(); sendFormData('/generate-closeout', data); }); onClick('generateServiceWaiverBtn', function (event) { event.preventDefault(); const data = getFormData(); sendFormData('/generate-waiver', data); }); onClick('generateDisputeLetterBtn', function (event) { event.preventDefault(); const data = getFormData(); sendFormData('/generate-Dispute-Letter', data); }); onClick('generateCannedEmailsBtn', function (event) { event.preventDefault(); const data = getFormData(); sendFormData('/generate-Canned-Emails', data); }); onClick('generateDisputeEnvelopeBtn', function (event) { event.preventDefault(); const data = getFormData(); sendFormData('/generate-Dispute-Envelope', data); }); onClick('generateDisputeCertBtn', function (event) { event.preventDefault(); const data = getFormData(); sendFormData('/generate-Dispute-Cert', data); }); onClick('generateReminderICSBtn', function (event) { event.preventDefault(); const data = getFormData(); sendFormData('/generate-reminder-ics', data); }); onClick('generateCreditAuthBtn', function (event) { event.preventDefault(); const data = getFormData(); sendFormData('/generate-credit-auth', data); }); onClick('generateCreditAuthNoPaymentBtn', function (event) { event.preventDefault(); const data = getFormData(); sendFormData('/generate-credit-auth-no-payment', data); }); function generatePleading() { var fileInput = byId('pleadingTemplateFile'); var file = fileInput?.files?.[0]; if (file) { var templateName = file.name.split('.').slice(0, -1).join('.'); var data = getFormData(); sendFormData('/generate-pleading', data, templateName); } else { alert('Please select a file before clicking Generate'); } } function generateLetter() { var fileInput = byId('letterTemplateFile'); var file = fileInput?.files?.[0]; if (file) { var templateName = file.name.split('.').slice(0, -1).join('.'); var data = getFormData(); sendFormData('/generate-letter', data, templateName); } else { alert('Please select a file before clicking Generate'); } } function generateDisco(event) { var fileInput = byId('discoTemplateFile'); var file = fileInput?.files?.[0]; if (file) { var templateName = file.name.split('.').slice(0, -1).join('.'); var data = getFormData(); sendFormData('/generate-disco', data, templateName); } else { alert('Please select a file before clicking Generate'); } }