`; document.body.appendChild(notification); setTimeout(() => notification.classList.add('show'), 100); setTimeout(() => { notification.classList.remove('show'); setTimeout(() => notification.remove(), 300); }, 3000); } function showConfirmDialog(title, message, onConfirm) { if (confirm(`${title}\n${message}`)) { onConfirm(); } } // Modal Functions function openModal(content, afterOpenCallback) { const modal = document.getElementById('ec-modal'); const modalContent = document.getElementById('ec-modal-inner'); modalContent.innerHTML = ''; modalContent.appendChild(content); modal.classList.add('active'); // Close modal when clicking outside modal.addEventListener('click', modalClickOutside); // Initialize tooltips tippy('[data-tippy-content]', { theme: 'light', placement: 'top', }); // Call the callback after the content is in the DOM if (afterOpenCallback) { afterOpenCallback(); } } function closeModal() { const modal = document.getElementById('ec-modal'); modal.classList.remove('active'); modal.removeEventListener('click', modalClickOutside); } function modalClickOutside(e) { const modal = document.getElementById('ec-modal'); if (e.target === modal) { closeModal(); } } // Tab Management function switchTab(tabId) { // Update active tab document.querySelectorAll('.ec-tab').forEach(tab => { tab.classList.toggle('active', tab.dataset.tab === tabId); }); // Show active section document.querySelectorAll('.ec-section').forEach(section => { section.classList.toggle('active', section.id === `${tabId}-section`); }); // Update state state.activeTab = tabId; // Render content if (tabId === 'assets') { renderAssets(); } else if (tabId === 'heirs') { renderHeirs(); } else if (tabId === 'planning') { renderPlanning(); } } // Global render function function renderAll() { renderAssets(); renderHeirs(); renderPlanning(); } // Asset Management Functions function openAssetForm(assetId = null) { const template = document.getElementById('asset-form-template'); const formContent = template.content.cloneNode(true); // Open modal and attach event listeners after content is in the DOM openModal(formContent, () => { const form = document.getElementById('asset-form'); // Populate categories const categoriesGrid = form.querySelector('.ec-categories-grid'); categoriesGrid.innerHTML = Object.entries(assetCategories).map(([category, data]) => `
`).join(''); // Add event listeners to category cards categoriesGrid.querySelectorAll('.ec-category-card').forEach(card => { card.addEventListener('click', () => { const category = card.querySelector('.ec-category-name').textContent; selectCategory(category, form); }); }); // Event listeners form.addEventListener('submit', (e) => submitAsset(e, assetId, form)); form.querySelector('#cancel-asset-btn').addEventListener('click', closeModal); // If editing an existing asset, populate the form if (assetId) { const asset = state.assets.find(a => a.id === assetId); if (asset) { populateAssetForm(form, asset); } } }); } function selectCategory(category, form) { const cards = form.querySelectorAll('.ec-category-card'); cards.forEach(card => { const isSelected = card.querySelector('.ec-category-name').textContent === category; card.classList.toggle('selected', isSelected); }); const detailsSection = form.querySelector('#asset-details'); detailsSection.style.display = 'block'; const subCategorySelect = form.querySelector('select[name="subCategory"]'); populateSubCategories(subCategorySelect, category, form); // Reset sub-category and type selects subCategorySelect.value = ''; const typeSelect = form.querySelector('select[name="type"]'); typeSelect.innerHTML = '
בחר סוג נכס '; } function populateSubCategories(select, category, form) { const subCategories = assetCategories[category].subCategories; select.innerHTML = `
בחר תת קטגוריה ${Object.keys(subCategories).map(sub => `
${sub} ` ).join('')} `; select.addEventListener('change', (e) => { const typeSelect = form.querySelector('select[name="type"]'); populateAssetTypes(typeSelect, category, e.target.value); }); } function populateAssetTypes(select, category, subCategory) { const types = assetCategories[category].subCategories[subCategory] || []; select.innerHTML = `
בחר סוג נכס ${types.map(type => `
${type} ` ).join('')} `; } function submitAsset(event, assetId = null, form) { event.preventDefault(); const formData = new FormData(event.target); const selectedCategoryCard = form.querySelector('.ec-category-card.selected .ec-category-name'); if (!selectedCategoryCard) { showNotification('יש לבחור קטגוריה', 'error'); return; } const selectedCategory = selectedCategoryCard.textContent; const assetData = { id: assetId || Date.now(), category: selectedCategory, subCategory: formData.get('subCategory'), type: formData.get('type'), location: formData.get('location'), value: Number(formData.get('value')), notes: formData.get('notes'), lastUpdated: new Date().toISOString() }; if (!assetData.subCategory || !assetData.type || !assetData.location || !assetData.value) { showNotification('יש למלא את כל השדות הנדרשים', 'error'); return; } if (assetId) { state.assets = state.assets.map(asset => asset.id === assetId ? { ...asset, ...assetData } : asset ); showNotification('הנכס עודכן בהצלחה', 'success'); } else { state.assets.push(assetData); showNotification('הנכס נוסף בהצלחה', 'success'); } saveData(); renderAssets(); closeModal(); } function populateAssetForm(form, asset) { // Select the category const categoryCards = form.querySelectorAll('.ec-category-card'); categoryCards.forEach(card => { const categoryName = card.querySelector('.ec-category-name').textContent; if (categoryName === asset.category) { card.classList.add('selected'); } }); // Show details section const detailsSection = form.querySelector('#asset-details'); detailsSection.style.display = 'block'; // Populate subcategories const subCategorySelect = form.querySelector('select[name="subCategory"]'); populateSubCategories(subCategorySelect, asset.category, form); subCategorySelect.value = asset.subCategory; // Populate types const typeSelect = form.querySelector('select[name="type"]'); populateAssetTypes(typeSelect, asset.category, asset.subCategory); typeSelect.value = asset.type; // Populate other fields form.querySelector('input[name="location"]').value = asset.location; form.querySelector('input[name="value"]').value = asset.value; form.querySelector('textarea[name="notes"]').value = asset.notes || ''; // Update submit button text form.querySelector('.ec-button.primary').textContent = 'עדכן נכס'; } function deleteAsset(assetId) { showConfirmDialog( 'האם אתה בטוח שברצונך למחוק נכס זה?', 'פעולה זו אינה ניתנת לביטול', () => { state.assets = state.assets.filter(asset => asset.id !== assetId); delete state.distributions[assetId]; saveData(); renderAssets(); renderPlanning(); showNotification('הנכס נמחק בהצלחה', 'success'); } ); } function renderAssets() { const assetsList = document.getElementById('assets-list'); if (state.assets.length === 0) { assetsList.innerHTML = `
📦
אין נכסים עדיין התחל להוסיף נכסים כדי לתכנן את העיזבון שלך
➕ הוסף נכס ראשון `; // Add event listener to the "add first asset" button document.getElementById('add-first-asset-btn').addEventListener('click', () => openAssetForm()); return; } const totalValue = state.assets.reduce((sum, asset) => sum + asset.value, 0); assetsList.innerHTML = `
סך שווי הנכסים
${formatCurrency(totalValue)}
מספר נכסים
${state.assets.length}
${state.assets.map(asset => ` `).join('')}
סוג הנכס קטגוריה מיקום שווי עדכון אחרון פעולות ${assetCategories[asset.category].icon} ${asset.type}
${asset.category}
${asset.subCategory}
${asset.location} ${formatCurrency(asset.value)} ${formatDate(asset.lastUpdated)}
✏️ 🗑️
`; // Add event listeners to action buttons assetsList.querySelectorAll('.ec-action-btn.edit').forEach(button => { button.addEventListener('click', () => { const assetId = parseInt(button.dataset.id); openAssetForm(assetId); }); }); assetsList.querySelectorAll('.ec-action-btn.delete').forEach(button => { button.addEventListener('click', () => { const assetId = parseInt(button.dataset.id); deleteAsset(assetId); }); }); } // Heir Management Functions function openHeirForm(heirId = null) { const template = document.getElementById('heir-form-template'); const formContent = template.content.cloneNode(true); // Open modal and attach event listeners after content is in the DOM openModal(formContent, () => { const form = document.getElementById('heir-form'); // Populate relationship types const relationshipTypeSelect = form.querySelector('select[name="relationshipType"]'); relationshipTypeSelect.innerHTML = `
בחר סוג קרבה ${Object.keys(heirTypes).map(type => `
${type} `).join('')} `; // Event listeners relationshipTypeSelect.addEventListener('change', (e) => { populateRelationshipDegrees(form.querySelector('select[name="relationshipDegree"]'), e.target.value, form); }); form.addEventListener('submit', (e) => submitHeir(e, heirId, form)); form.querySelector('#cancel-heir-btn').addEventListener('click', closeModal); // If editing an existing heir, populate the form if (heirId) { const heir = state.heirs.find(h => h.id === heirId); if (heir) { populateHeirForm(form, heir); } } }); } function populateRelationshipDegrees(select, type, form) { select.innerHTML = `
בחר דרגת קרבה ${Object.keys(heirTypes[type]).map(degree => `
${degree} `).join('')} `; select.addEventListener('change', (e) => { populateHeirTypes(form.querySelector('select[name="type"]'), type, e.target.value); }); } function populateHeirTypes(select, type, degree) { const types = heirTypes[type][degree] || []; select.innerHTML = `
בחר סוג יורש ${types.map(t => `
${t} `).join('')} `; } function submitHeir(event, heirId = null, form) { event.preventDefault(); const formData = new FormData(event.target); const heirData = { id: heirId || Date.now(), relationshipType: formData.get('relationshipType'), relationshipDegree: formData.get('relationshipDegree'), type: formData.get('type'), firstName: formData.get('firstName'), lastName: formData.get('lastName'), idNumber: formData.get('idNumber'), location: formData.get('location'), minAge: formData.get('minAge') ? Number(formData.get('minAge')) : null, specialConditions: formData.get('specialConditions'), lastUpdated: new Date().toISOString() }; if (!heirData.relationshipType || !heirData.relationshipDegree || !heirData.type) { showNotification('יש למלא את כל השדות הנדרשים', 'error'); return; } if (heirId) { state.heirs = state.heirs.map(heir => heir.id === heirId ? { ...heir, ...heirData } : heir ); showNotification('היורש עודכן בהצלחה', 'success'); } else { state.heirs.push(heirData); showNotification('היורש נוסף בהצלחה', 'success'); } saveData(); renderHeirs(); closeModal(); } function populateHeirForm(form, heir) { // Populate relationship type const relationshipTypeSelect = form.querySelector('select[name="relationshipType"]'); relationshipTypeSelect.value = heir.relationshipType; // Populate relationship degrees const relationshipDegreeSelect = form.querySelector('select[name="relationshipDegree"]'); populateRelationshipDegrees(relationshipDegreeSelect, heir.relationshipType, form); relationshipDegreeSelect.value = heir.relationshipDegree; // Populate heir types const typeSelect = form.querySelector('select[name="type"]'); populateHeirTypes(typeSelect, heir.relationshipType, heir.relationshipDegree); typeSelect.value = heir.type; // Populate other fields form.querySelector('input[name="firstName"]').value = heir.firstName; form.querySelector('input[name="lastName"]').value = heir.lastName; form.querySelector('input[name="idNumber"]').value = heir.idNumber; form.querySelector('input[name="location"]').value = heir.location; form.querySelector('input[name="minAge"]').value = heir.minAge || ''; form.querySelector('textarea[name="specialConditions"]').value = heir.specialConditions || ''; // Update submit button text form.querySelector('.ec-button.primary').textContent = 'עדכן יורש'; } function deleteHeir(heirId) { showConfirmDialog( 'האם אתה בטוח שברצונך למחוק יורש זה?', 'פעולה זו אינה ניתנת לביטול', () => { state.heirs = state.heirs.filter(heir => heir.id !== heirId); // Remove heir from distributions for (let assetId in state.distributions) { if (state.distributions.hasOwnProperty(assetId)) { delete state.distributions[assetId].shares[heirId]; } } saveData(); renderHeirs(); renderPlanning(); showNotification('היורש נמחק בהצלחה', 'success'); } ); } function renderHeirs() { const heirsList = document.getElementById('heirs-list'); if (state.heirs.length === 0) { heirsList.innerHTML = `
👥
אין יורשים עדיין התחל להוסיף יורשים כדי לתכנן את חלוקת העיזבון
➕ הוסף יורש ראשון `; // Add event listener to the "add first heir" button document.getElementById('add-first-heir-btn').addEventListener('click', () => openHeirForm()); return; } heirsList.innerHTML = `
${state.heirs.map(heir => ` `).join('')}
שם היורש סוג קרבה תעודת זהות מיקום תנאים מיוחדים פעולות 👤 ${heir.firstName} ${heir.lastName}
${heir.relationshipType}
${heir.type}
${heir.idNumber} ${heir.location} ${heir.minAge ? ` גיל מינימום: ${heir.minAge} ` : ''} ${heir.specialConditions ? ` תנאים מיוחדים ` : ''}
✏️ 🗑️
`; // Add event listeners to action buttons heirsList.querySelectorAll('.ec-action-btn.edit').forEach(button => { button.addEventListener('click', () => { const heirId = parseInt(button.dataset.id); openHeirForm(heirId); }); }); heirsList.querySelectorAll('.ec-action-btn.delete').forEach(button => { button.addEventListener('click', () => { const heirId = parseInt(button.dataset.id); deleteHeir(heirId); }); }); } // Distribution Planning Functions function renderPlanning() { const planningContent = document.getElementById('planning-content'); if (state.assets.length === 0 || state.heirs.length === 0) { planningContent.innerHTML = `
⚠️
לא ניתן להתחיל בתכנון החלוקה ${state.assets.length === 0 ? 'יש להוסיף נכסים תחילה' : ''} ${state.assets.length === 0 && state.heirs.length === 0 ? ' ו' : ''} ${state.heirs.length === 0 ? 'יש להוסיף יורשים תחילה' : ''}
`; return; } planningContent.innerHTML = `
${state.assets.map(asset => ` `).join('')}
נכס שווי חלוקה פעולות ${asset.type} ${formatCurrency(asset.value)} ${renderDistributionSummary(asset.id)} ⚖️ ערוך חלוקה
`; // Add event listeners to distribution buttons planningContent.querySelectorAll('.ec-button.small').forEach(button => { button.addEventListener('click', () => { const assetId = parseInt(button.dataset.id); openDistributionForm(assetId); }); }); } function renderDistributionSummary(assetId) { const distribution = state.distributions[assetId]; if (!distribution) { return 'לא הוגדרה חלוקה'; } if (distribution.distributionType === 'equal') { return 'חלוקה שווה בין כל היורשים'; } else { const shares = Object.entries(distribution.shares).map(([heirId, share]) => { const heir = state.heirs.find(h => h.id == heirId); return `${heir.firstName} ${heir.lastName}: ${share}%`; }); return shares.join(', '); } } function openDistributionForm(assetId) { const asset = state.assets.find(a => a.id == assetId); const template = document.getElementById('distribution-form-template'); const formContent = template.content.cloneNode(true); // Open modal and attach event listeners after content is in the DOM openModal(formContent, () => { const form = document.getElementById('distribution-form'); form.querySelector('#asset-name').textContent = `${asset.type} (${asset.location})`; // Populate distribution type const distributionTypeSelect = form.querySelector('select[name="distributionType"]'); const customDistributionDiv = form.querySelector('#custom-distribution'); distributionTypeSelect.addEventListener('change', (e) => { if (e.target.value === 'custom') { customDistributionDiv.style.display = 'block'; } else { customDistributionDiv.style.display = 'none'; } }); // If distribution exists, populate data const distribution = state.distributions[assetId]; if (distribution) { distributionTypeSelect.value = distribution.distributionType; if (distribution.distributionType === 'custom') { customDistributionDiv.style.display = 'block'; } } // Populate heirs for custom distribution const heirsFields = state.heirs.map(heir => `
`).join(''); customDistributionDiv.innerHTML = heirsFields; // Event listeners form.addEventListener('submit', (e) => submitDistribution(e, assetId, form)); form.querySelector('#cancel-distribution-btn').addEventListener('click', closeModal); }); } function submitDistribution(event, assetId, form) { event.preventDefault(); const formData = new FormData(event.target); const distributionType = formData.get('distributionType'); let distribution = { distributionType: distributionType, shares: {} }; if (distributionType === 'equal') { const equalShare = (100 / state.heirs.length).toFixed(2); state.heirs.forEach(heir => { distribution.shares[heir.id] = parseFloat(equalShare); }); } else { let totalShare = 0; state.heirs.forEach(heir => { const share = parseFloat(formData.get(`heir-${heir.id}`)) || 0; distribution.shares[heir.id] = share; totalShare += share; }); if (totalShare !== 100) { showNotification('סך החלוקה צריך להיות 100%', 'error'); return; } } state.distributions[assetId] = distribution; saveData(); renderPlanning(); closeModal(); showNotification('החלוקה נשמרה בהצלחה', 'success'); } // Initialize document.addEventListener('DOMContentLoaded', () => { // Add tab click listeners document.querySelectorAll('.ec-tab').forEach(tab => { tab.addEventListener('click', () => switchTab(tab.dataset.tab)); }); // Add asset button listener document.getElementById('add-asset-btn').addEventListener('click', () => openAssetForm()); // Add heir button listener document.getElementById('add-heir-btn').addEventListener('click', () => openHeirForm()); // Add close modal listener document.querySelector('.ec-modal-close').addEventListener('click', closeModal); // Add print button listener document.getElementById('print-plan-btn').addEventListener('click', () => window.print()); // Add export and import buttons listeners document.getElementById('export-data-btn').addEventListener('click', exportData); document.getElementById('import-data-btn').addEventListener('click', importData); // Add export to Word button listener document.getElementById('export-word-btn').addEventListener('click', exportToWord); // Load saved data loadSavedData(); // Render initial tab switchTab(state.activeTab || 'assets'); });