Legal Document Generator

_________________________

${data.borrowerName}

` } }, init() { this.cacheDom(); this.render(); this.bindEvents(); }, cacheDom() { this.dom = { navList: document.getElementById('nav-list'), contentArea: document.getElementById('content-area'), prevBtn: document.getElementById('prev-btn'), nextBtn: document.getElementById('next-btn'), }; }, bindEvents() { this.dom.nextBtn.addEventListener('click', this.nextStep.bind(this)); this.dom.prevBtn.addEventListener('click', this.prevStep.bind(this)); }, collectData() { const inputs = this.dom.contentArea.querySelectorAll('input, textarea, select'); inputs.forEach(input => { this.formData[input.id] = input.value; }); }, render() { this.dom.contentArea.innerHTML = ''; if (!this.documentType) { this.renderDocSelection(); } else { this.renderNav(); this.renderStepContent(); } this.updateButtons(); }, renderDocSelection() { this.dom.navList.innerHTML = ``; let selectionHTML = `

Choose a Document Type

`; for (const key in this.templates) { selectionHTML += ` `; } selectionHTML += `
`; this.dom.contentArea.innerHTML = selectionHTML; }, renderNav() { const steps = this.templates[this.documentType].steps; this.dom.navList.innerHTML = steps.map((step, index) => ` `).join(''); }, renderStepContent() { const step = this.templates[this.documentType].steps[this.currentStep]; let contentHTML = `

${step.title}

`; switch (`${this.documentType}-${step.id}`) { case 'ceaseAndDesist-sender': contentHTML += `
`; break; case 'ceaseAndDesist-recipient': contentHTML += `
`; break; case 'ceaseAndDesist-infringement': contentHTML += `
`; break; case 'promissoryNote-parties': contentHTML += `
`; break; case 'promissoryNote-terms': contentHTML += `
`; break; case 'ceaseAndDesist-preview': case 'promissoryNote-preview': contentHTML += `
`; document.getElementById('navigation-buttons').style.display = 'none'; // Hide nav buttons on preview break; } this.dom.contentArea.innerHTML = contentHTML; // Re-populate form data for current step for (const key in this.formData) { const el = document.getElementById(key); if (el) el.value = this.formData[key]; } // Re-bind PDF button if it exists const pdfBtn = document.getElementById('download-pdf-btn'); if (pdfBtn) pdfBtn.addEventListener('click', this.generatePdf.bind(this)); }, updateButtons() { this.dom.prevBtn.classList.toggle('hidden', this.currentStep === 0 && this.documentType === null); this.dom.nextBtn.textContent = (this.documentType && this.currentStep === this.templates[this.documentType].steps.length - 2) ? 'Generate Preview' : 'Next'; }, nextStep() { if (!this.documentType) { const selected = document.querySelector('input[name="docType"]:checked'); if (selected) { this.documentType = selected.value; this.loadSampleData(); this.render(); } else { alert('Please select a document type.'); } return; } this.collectData(); const totalSteps = this.templates[this.documentType].steps.length; if (this.currentStep < totalSteps - 1) { this.currentStep++; document.getElementById('navigation-buttons').style.display = 'flex'; this.render(); } }, prevStep() { this.collectData(); if (this.currentStep > 0) { this.currentStep--; document.getElementById('navigation-buttons').style.display = 'flex'; this.render(); } else { this.documentType = null; this.formData = {}; this.render(); } }, loadSampleData() { if (this.documentType === 'ceaseAndDesist') { this.formData = { senderName: 'John Doe', senderAddress: '123 Main St, Anytown, USA 12345', recipientName: 'Jane Smith', recipientAddress: '456 Oak Ave, Otherville, USA 54321', infringementType: 'Trademark Infringement', infringementDate: '2025-08-15', infringementDescription: 'The unauthorized use of our registered trademark "InnovateLogo" on your website and marketing materials.' }; } }, generatePdf() { const { jsPDF } = window.jspdf; const pdf = new jsPDF({ unit: 'pt', format: 'a4' }); const preview = document.getElementById('preview-area'); const text = preview.innerText; pdf.setFont('times', 'normal'); pdf.setFontSize(12); const margin = 72; // 1 inch const pageWidth = pdf.internal.pageSize.getWidth(); const textLines = pdf.splitTextToSize(text, pageWidth - (2 * margin)); pdf.text(textLines, margin, margin); pdf.save(`${this.templates[this.documentType].name.replace(/\s+/g, '-')}.pdf`); } }; app.init(); });
Scroll to Top