/g, '>').replace(/"/g, '"'); }
// Bỏ dấu tiếng Việt để tìm kiếm không phụ thuộc dấu ("so bao 175" vẫn ra "Số báo 175").
function norm(s) {
s = (s || '').toLowerCase();
if (s.normalize) { s = s.normalize('NFD').replace(/[\u0300-\u036f]/g, ''); }
return s.replace(/đ/g, 'd');
}
// Tiêu đề ấn phẩm dạng "ĐBND - Số báo 175 ngày 24/6/2026" hoặc "Số 264 ngày 20/09/2024".
function issueNo(t) {
var m = norm(t).match(/so\s*(?:bao\s*)?(\d{1,4})/);
return m ? ('Số ' + m[1]) : 'Ấn phẩm';
}
// Ngày dạng sổ đăng ký: đệm 0 để các cột ngày thẳng hàng khi bật font tabular-nums.
function pad2(n) { n = String(n); return n.length < 2 ? '0' + n : n; }
function dateText(it) { return pad2(it.d) + ' · ' + pad2(it.m) + ' · ' + it.y; }
function match(it) {
if (state.type !== 'all' && it.cat !== state.type) return false;
if (state.year && String(it.y) !== state.year) return false;
if (state.month && String(it.m) !== state.month) return false;
if (state.q) {
var q = norm(state.q);
if (it.n.indexOf(q) === -1 && String(it.id).indexOf(q) === -1) return false;
}
return true;
}
function cardHTML(it) {
var embed = it.embed || ('/embedpdf?filename=' + it.id + '.pdf');
return ''
+ ''
+ ''
+ ''
+ ''
+ '' + esc(issueNo(it.t)) + ''
+ '' + esc(it.t) + ''
+ '' + esc(it.dt) + ''
+ ''
+ 'Đọc';
}
function render() {
var anyResult = false, totalMatch = 0, html = '';
var groups = (state.type === 'all') ? TYPES : TYPES.filter(function (t) { return t.key === state.type; });
groups.forEach(function (t) {
// Dữ liệu vào đã theo thứ tự mới nhất trước, "Cũ nhất" chỉ cần đảo chiều.
var items = EP_DATA.filter(function (it) { return it.cat === t.key && match(it); });
if (state.sort === 'oldest') { items.reverse(); }
totalMatch += items.length;
if (items.length === 0) return;
anyResult = true;
var limit = shown[t.key] || PAGE;
var visible = items.slice(0, limit);
// Số lượng nằm trong chính thẻ h2 như một bổ ngữ của tên nhóm, không tách
// thành nhãn riêng đặt cạnh tiêu đề.
html += ''
+ '
'
+ '
' + t.label
+ '' + items.length + ' số
'
+ '
'
+ visible.map(cardHTML).join('')
+ '
';
if (items.length > limit) {
html += '';
}
html += '';
});
$sections.innerHTML = html;
$empty.hidden = anyResult;
document.getElementById('epTotal').textContent = totalMatch;
}
function resetAndRender() { TYPES.forEach(function (x) { shown[x.key] = PAGE; }); render(); }
var t;
document.getElementById('epSearch').addEventListener('input', function (e) {
clearTimeout(t); t = setTimeout(function () { state.q = e.target.value.trim(); resetAndRender(); }, 180);
});
document.getElementById('epYear').addEventListener('change', function (e) { state.year = e.target.value; resetAndRender(); });
document.getElementById('epMonth').addEventListener('change', function (e) { state.month = e.target.value; resetAndRender(); });
document.getElementById('epSort').addEventListener('change', function (e) { state.sort = e.target.value; render(); });
document.getElementById('epChips').addEventListener('click', function (e) {
var b = e.target.closest('.ep-chip'); if (!b) return;
this.querySelectorAll('.ep-chip').forEach(function (c) { c.classList.remove('is-active'); });
b.classList.add('is-active'); state.type = b.getAttribute('data-type'); resetAndRender();
});
$sections.addEventListener('click', function (e) {
var more = e.target.closest('[data-more]');
if (more) { e.preventDefault(); var k = more.getAttribute('data-more'); shown[k] = (shown[k] || PAGE) + PAGE; render(); }
});
function setView(v) {
state.view = v;
document.getElementById('epViewGrid').classList.toggle('is-active', v === 'grid');
document.getElementById('epViewList').classList.toggle('is-active', v === 'list');
render();
}
document.getElementById('epViewGrid').addEventListener('click', function () { setView('grid'); });
document.getElementById('epViewList').addEventListener('click', function () { setView('list'); });
// ----- Popup đọc ấn phẩm (nhúng /embedpdf) -----
var $modal = document.getElementById('epModal');
var $frame = document.getElementById('epModalFrame');
var $mTitle = document.getElementById('epModalTitle');
var $mOpen = document.getElementById('epModalOpen');
function openModal(embed, title, link) {
$frame.src = embed || '';
$mTitle.textContent = title || 'Ấn phẩm';
if ($mOpen) $mOpen.href = link || embed || '#';
$modal.classList.add('is-open');
$modal.setAttribute('aria-hidden', 'false');
document.body.classList.add('ep-modal-open');
}
function closeModal() {
$modal.classList.remove('is-open');
$modal.setAttribute('aria-hidden', 'true');
document.body.classList.remove('ep-modal-open');
$frame.src = 'about:blank';
}
document.addEventListener('click', function (e) {
var a = e.target.closest('.js-ep-open');
if (!a) return;
if (e.metaKey || e.ctrlKey || e.shiftKey || e.button === 1) return;
e.preventDefault();
openModal(a.getAttribute('data-embed'), a.getAttribute('data-title'), a.getAttribute('href'));
});
document.getElementById('epModalClose').addEventListener('click', closeModal);
$modal.addEventListener('click', function (e) { if (e.target === $modal) closeModal(); });
document.addEventListener('keydown', function (e) { if (e.key === 'Escape' && $modal.classList.contains('is-open')) closeModal(); });
render();
})();