(function() {
initCustomSelects();
initFileInputs();
var config = JSON.parse(document.getElementById('edit-entry-config').textContent);
var editors = {};
var tabsContainer = document.getElementById('edit-tabs');
var addWrapper = document.getElementById('add-lang-wrapper');
var langDropdown = document.getElementById('lang-dropdown');
var form = document.getElementById('entry-form');
editors['main'] = new FancyMiku('#editor-main', {
height: '600px',
placeholder: config.placeholderMain
});
editors['main'].setContent(config.mainContent);
config.translations.forEach(function(t) {
var key = 'lang-' + t.id;
editors[key] = new FancyMiku('#editor-lang-' + t.id, {
height: '600px',
placeholder: config.placeholderTranslation
});
editors[key].setContent(t.content);
});
function switchTab(tabId) {
tabsContainer.querySelectorAll('.edit-tab').forEach(function(t) { t.classList.remove('active'); });
document.querySelectorAll('.edit-tab-content').forEach(function(c) { c.classList.remove('active'); });
var tabBtn = tabsContainer.querySelector('.edit-tab[data-tab="' + tabId + '"]');
var tabContent = document.getElementById('tab-' + tabId);
if (tabBtn) tabBtn.classList.add('active');
if (tabContent) tabContent.classList.add('active');
}
tabsContainer.addEventListener('click', function(e) {
var closeBtn = e.target.closest('.tab-close');
if (closeBtn) {
e.stopPropagation();
removeTranslationTab(closeBtn.closest('.edit-tab'));
return;
}
if (e.target.closest('#add-lang-btn')) {
updateLangDropdown();
langDropdown.classList.toggle('show');
return;
}
var dropdownItem = e.target.closest('.edit-lang-dropdown-item');
if (dropdownItem) {
addLanguageTab(dropdownItem.dataset.langCode, dropdownItem.dataset.langName);
return;
}
var tab = e.target.closest('.edit-tab[data-tab]');
if (tab) {
switchTab(tab.dataset.tab);
}
});
document.addEventListener('click', function(e) {
if (!e.target.closest('#add-lang-wrapper')) {
langDropdown.classList.remove('show');
}
});
function removeTranslationTab(tab) {
var tabId = tab.dataset.tab;
var content = document.getElementById('tab-' + tabId);
var prevTab = tab.previousElementSibling;
while (prevTab && !prevTab.dataset.tab) {
prevTab = prevTab.previousElementSibling;
}
var switchTo = prevTab ? prevTab.dataset.tab : 'main';
var deleteFlag = content ? content.querySelector('.delete-flag') : null;
if (deleteFlag) {
deleteFlag.disabled = false;
deleteFlag.value = 'true';
}
tab.remove();
if (content) content.remove();
if (editors[tabId]) delete editors[tabId];
switchTab(switchTo);
updateLangDropdown();
}
function addLanguageTab(code, name) {
var id = 'new_' + Date.now();
var tabBtn = document.createElement('button');
tabBtn.type = 'button';
tabBtn.className = 'edit-tab lang-tab';
tabBtn.dataset.tab = 'lang-' + id;
tabBtn.dataset.lang = code;
tabBtn.innerHTML = name + ' ×';
tabsContainer.insertBefore(tabBtn, addWrapper);
var tabContent = document.createElement('div');
tabContent.className = 'edit-tab-content';
tabContent.id = 'tab-lang-' + id;
tabContent.dataset.lang = code;
tabContent.innerHTML =
'' +
'
' +
'' +
'' +
'
' +
'';
form.insertBefore(tabContent, document.getElementById('tab-settings'));
editors['lang-' + id] = new FancyMiku('#editor-lang-' + id, {
height: '600px',
placeholder: config.placeholderTranslation
});
langDropdown.classList.remove('show');
switchTab('lang-' + id);
updateLangDropdown();
}
function getUsedLanguages() {
var used = new Set(['en']);
tabsContainer.querySelectorAll('.edit-tab.lang-tab').forEach(function(tab) {
if (tab.dataset.lang) used.add(tab.dataset.lang);
});
return used;
}
function updateLangDropdown() {
var used = getUsedLanguages();
langDropdown.querySelectorAll('.edit-lang-dropdown-item').forEach(function(item) {
item.style.display = used.has(item.dataset.langCode) ? 'none' : '';
});
}
form.addEventListener('submit', function(e) {
var mainContent = editors['main'].getContent();
document.getElementById('content-main').value = mainContent;
if (!mainContent || mainContent.trim() === '
' || mainContent.trim() === '') {
e.preventDefault();
alert(config.alertEmptyContent);
return false;
}
for (var key in editors) {
if (key === 'main') continue;
var hiddenInput = document.getElementById('content-' + key);
if (hiddenInput) {
hiddenInput.value = editors[key].getContent();
}
}
});
document.getElementById('delete-entry-btn').addEventListener('click', function() {
if (confirm(config.confirmDelete)) {
window.location.href = config.deleteUrl;
}
});
updateLangDropdown();
var addCharBtn = document.getElementById('add-character-btn');
var toggleQuickChar = document.getElementById('toggle-quick-character');
var quickCharForm = document.getElementById('quick-character-form');
var cancelQuickChar = document.getElementById('cancel-quick-character');
var charNameInput = document.getElementById('new-character-name');
var charRoleInput = document.getElementById('new-character-role');
var charBioInput = document.getElementById('new-character-bio');
var charPicker = document.getElementById('characters-picker');
if (toggleQuickChar && quickCharForm) {
toggleQuickChar.addEventListener('click', function() {
quickCharForm.classList.toggle('hidden');
});
if (cancelQuickChar) {
cancelQuickChar.addEventListener('click', function() {
quickCharForm.classList.add('hidden');
charNameInput.value = '';
if (charBioInput) charBioInput.value = '';
});
}
}
if (addCharBtn && charNameInput && charPicker) {
function addNewCharacter() {
var name = charNameInput.value.trim();
if (!name) return;
var role = charRoleInput ? charRoleInput.value : 'Supporting';
var bio = charBioInput ? charBioInput.value.trim() : '';
var label = document.createElement('label');
label.className = 'tag-pick';
label.innerHTML =
'' +
'' +
'' +
'' + name + ' (' + role + ')';
charPicker.appendChild(label);
charNameInput.value = '';
if (charBioInput) charBioInput.value = '';
quickCharForm.classList.add('hidden');
}
addCharBtn.addEventListener('click', addNewCharacter);
}
var toggleQuickTag = document.getElementById('toggle-quick-tag');
var quickTagForm = document.getElementById('quick-tag-form');
var cancelQuickTag = document.getElementById('cancel-quick-tag');
var addTagBtn = document.getElementById('add-tag-btn');
var tagNameInput = document.getElementById('new-tag-name');
var tagsPicker = document.getElementById('tags-picker');
if (toggleQuickTag && quickTagForm) {
toggleQuickTag.addEventListener('click', function() {
quickTagForm.classList.toggle('hidden');
});
if (cancelQuickTag) {
cancelQuickTag.addEventListener('click', function() {
quickTagForm.classList.add('hidden');
tagNameInput.value = '';
});
}
}
if (addTagBtn && tagNameInput && tagsPicker) {
function addNewTag() {
var name = tagNameInput.value.trim();
if (!name) return;
var nameLower = name.toLowerCase();
var existing = tagsPicker.querySelectorAll('.tag-pick');
for (var i = 0; i < existing.length; i++) {
var label = existing[i].querySelector('.tag-pick-label');
if (label && label.textContent.trim().toLowerCase() === nameLower) {
existing[i].querySelector('input[type="checkbox"]').checked = true;
tagNameInput.value = '';
quickTagForm.classList.add('hidden');
return;
}
}
var el = document.createElement('label');
el.className = 'tag-pick';
el.innerHTML =
'' +
'' + name + '';
tagsPicker.appendChild(el);
tagNameInput.value = '';
quickTagForm.classList.add('hidden');
}
addTagBtn.addEventListener('click', addNewTag);
tagNameInput.addEventListener('keydown', function(e) {
if (e.key === 'Enter') { e.preventDefault(); addNewTag(); }
});
}
})();