New Thinking Report
Thinking differently is required now if we wish to survive.
My Life Organizer
My Life Organizer
Clear
Clear
Close
Save
Edit Category
Copy
Print
Category Name:
Details Preview (Clickable Links):
Edit Details:
Cancel
Save
Back to Top
'); 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(); mloRender(); }); 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 = '•'; dot.title = 'Edit category details'; 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(); clearTimeout(mloHoverTimer); mloOpenModal(index); }); var deleteBtn = document.createElement('div'); deleteBtn.className = 'mlo-delete-btn'; deleteBtn.innerHTML = '✖'; deleteBtn.title = 'Delete category'; 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; mloSaveData(); mloCloseModal(); mloRender(); } 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);