My Life Organizer
My Life Organizer
Loading cloud data...
');
printWindow.document.close();
printWindow.focus();
setTimeout(function() {
try {
printWindow.print();
} catch (e) {}
}, 300);
}
function mloCopyModalContent() {
var text = document.getElementById('mlo-modal-textarea').value;
mloCopyContent(text);
}
function mloPrintModalContent() {
var title = document.getElementById('mlo-category-name-input').value;
var htmlContent = document.getElementById('mlo-modal-preview').innerHTML;
mloPrintContent(title, htmlContent);
}
function mloRender() {
clearTimeout(mloRenderTimer);
var container = document.getElementById('mlo-list-container');
var statsDiv = document.getElementById('mlo-search-stats');
var titleQuery = document.getElementById('mlo-search-title').value.toLowerCase().trim();
var contentQuery = document.getElementById('mlo-search-content').value.toLowerCase().trim();
var filteredData = mloGetFilteredCategories(titleQuery, contentQuery);
var totalOccurrences = 0;
container.innerHTML = '';
var fragment = document.createDocumentFragment();
for (var i = 0; i < filteredData.length; i++) {
(function(itemData) {
var index = itemData.originalIndex;
var cat = itemData.category;
totalOccurrences += mloGetOccurrences(cat.title, titleQuery);
totalOccurrences += mloGetOccurrences(cat.content, contentQuery);
var item = document.createElement('div');
item.className = 'mlo-category-item';
item.draggable = true;
item.addEventListener('dragstart', function(e) {
mloDraggedIndex = index;
e.dataTransfer.effectAllowed = 'move';
});
item.addEventListener('dragover', function(e) {
e.preventDefault();
e.dataTransfer.dropEffect = 'move';
});
item.addEventListener('drop', function(e) {
e.preventDefault();
if (mloDraggedIndex === null || mloDraggedIndex === index) return;
var draggedItem = mloCategories.splice(mloDraggedIndex, 1)[0];
var insertIndex = index;
if (mloDraggedIndex < index) {
insertIndex = index - 1;
}
mloCategories.splice(insertIndex, 0, draggedItem);
mloDraggedIndex = null;
mloSaveData();
});
item.addEventListener('dragend', function() {
mloDraggedIndex = null;
});
var handle = document.createElement('div');
handle.className = 'mlo-drag-handle';
handle.innerHTML = '⋮';
var title = document.createElement('div');
title.className = 'mlo-category-title';
title.innerHTML = mloProcessText(cat.title, titleQuery, false);
if (contentQuery && cat.content.toLowerCase().indexOf(contentQuery) !== -1) {
var snippet = document.createElement('div');
snippet.style.fontSize = '12px';
snippet.style.color = '#777';
snippet.style.marginTop = '4px';
snippet.style.lineHeight = '1.4';
var lowerContent = cat.content.toLowerCase();
var matchIndex = lowerContent.indexOf(contentQuery);
var start = Math.max(0, matchIndex - 40);
var end = Math.min(cat.content.length, matchIndex + contentQuery.length + 40);
var snippetText = cat.content.substring(start, end);
if (start > 0) snippetText = "..." + snippetText;
if (end < cat.content.length) snippetText = snippetText + "...";
snippet.innerHTML = mloProcessText(snippetText, contentQuery, false);
title.appendChild(snippet);
}
var dot = document.createElement('div');
dot.className = 'mlo-info-dot';
dot.innerHTML = '•';
if (mloHasContent(cat.content)) {
dot.style.color = '#28a745';
}
dot.addEventListener('mouseenter', function() {
clearTimeout(mloHoverTimer);
mloHoverTimer = setTimeout(function() {
mloHoverIndex = index;
var currentCat = mloCategories[index];
document.getElementById('mlo-hover-title-input').value = currentCat.title;
document.getElementById('mlo-hover-textarea').value = currentCat.content;
document.getElementById('mlo-hover-popup').style.display = 'block';
}, 150);
});
dot.addEventListener('mouseleave', function() {
clearTimeout(mloHoverTimer);
});
dot.addEventListener('click', function(e) {
e.stopPropagation();
mloOpenModal(index);
});
var deleteBtn = document.createElement('div');
deleteBtn.className = 'mlo-delete-btn';
deleteBtn.innerHTML = '✖';
deleteBtn.addEventListener('click', function(e) {
e.stopPropagation();
mloDeleteCategory(index);
});
item.appendChild(handle);
item.appendChild(title);
item.appendChild(dot);
item.appendChild(deleteBtn);
fragment.appendChild(item);
})(filteredData[i]);
}
container.appendChild(fragment);
if (titleQuery || contentQuery) {
statsDiv.innerText = "Total search occurrences found: " + totalOccurrences;
} else {
statsDiv.innerText = "";
}
}
function mloUpdatePreview() {
var content = document.getElementById('mlo-modal-textarea').value;
var contentQuery = document.getElementById('mlo-search-content').value.toLowerCase().trim();
var safeContent = mloEscapeHTML(content);
var linkedContent = mloLinkify(safeContent);
document.getElementById('mlo-modal-preview').innerHTML = mloHighlightHTMLText(linkedContent, contentQuery);
}
function mloOpenModal(index) {
document.getElementById('mlo-hover-popup').style.display = 'none';
mloEditingIndex = index;
var cat = mloCategories[index];
document.getElementById('mlo-category-name-input').value = cat.title;
document.getElementById('mlo-modal-textarea').value = cat.content;
mloUpdatePreview();
document.getElementById('mlo-modal').style.display = 'block';
document.getElementById('mlo-modal').setAttribute('aria-hidden', 'false');
}
function mloCloseModal() {
document.getElementById('mlo-modal').style.display = 'none';
document.getElementById('mlo-modal').setAttribute('aria-hidden', 'true');
mloEditingIndex = null;
}
function mloSaveContent() {
if (mloEditingIndex === null) return;
var newTitle = document.getElementById('mlo-category-name-input').value.trim();
var newContent = document.getElementById('mlo-modal-textarea').value;
mloCategories[mloEditingIndex].title = newTitle || "Untitled";
mloCategories[mloEditingIndex].content = newContent;
mloCloseModal();
mloSaveData();
}
function mloHandleScroll() {
var btn = document.getElementById('mlo-back-to-top');
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
btn.style.display = 'block';
} else {
btn.style.display = 'none';
}
}
function mloScrollToTop() {
window.scrollTo({ top: 0, behavior: 'smooth' });
}
window.addEventListener('load', mloInit);