`;
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 => `
${assetCategories[asset.category].icon}
${asset.type}
${asset.category}
${asset.subCategory}
${asset.location}
${formatCurrency(asset.value)}
${formatDate(asset.lastUpdated)}
✏️
🗑️
`).join('')}
`;
// 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 => `
👤
${heir.firstName} ${heir.lastName}
${heir.relationshipType}
${heir.type}
${heir.idNumber}
${heir.location}
${heir.minAge ? `
גיל מינימום: ${heir.minAge}
` : ''}
${heir.specialConditions ? `
תנאים מיוחדים
` : ''}
✏️
🗑️
`).join('')}
`;
// 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 => `
${asset.type}
${formatCurrency(asset.value)}
${renderDistributionSummary(asset.id)}
⚖️
ערוך חלוקה
`).join('')}
`;
// 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');
});