ỦY BAN NHÂN DÂN 
    CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM 
       Số: 15/CT-UBND 
    Bình Dương, ngày 11 tháng 8 năm 2023 
     
  
 CHỈ THỊ 
 TĂNG CƯỜNG CẢI CÁCH THỦ TỤC HÀNH CHÍNH VÀ XỬ LÝ HIỆU QUẢ CÁC VƯỚNG MẮC LIÊN QUAN ĐẾN CẤP PHIẾU LÝ LỊCH TƯ PHÁP
 Thực hiện Chỉ thị số 23/CT-TTg ngày 09/7/2023 của Thủ tướng Chính phủ về việc đẩy mạnh cải cách thủ tục hành chính cấp Phiếu lý lịch tư pháp tạo điều kiện thuận lợi cho người dân, doanh nghiệp và Công văn số 1696/BTP- TTLLTPQG ngày 28/4/2023 của Bộ Tư pháp về việc phối hợp tăng cường hiệu quả công tác lý lịch tư pháp, Chủ tịch Ủy ban nhân dân tỉnh yêu cầu:
 1. Giám đốc, Thủ trưởng các sở, ban, ngành; Chủ tịch Ủy ban nhân dân cấp huyện, các cơ quan, đơn vị có liên quan tập trung chỉ đạo, tổ chức thực hiện có hiệu quả các nhiệm vụ, giải pháp sau: 
 - Tăng cường tuyên truyền, nâng cao nhận thức và trách nhiệm thực hiện đúng quy định tại khoản 2 và khoản 3 Điều 7 Luật Lý lịch tư pháp- Rà soát các quy định, thủ tục hành chính liên quan đến Phiếu lý lịch tư pháp thuộc ngành, lĩnh vực quản lý của mình để đề xuất cắt giảm yêu cầu nộp Phiếu lý lịch tư pháp không hợp lý trong thực hiện thủ tục hành chính. Chủ động thực hiện quyền yêu cầu cấp Phiếu lý lịch tư pháp theo quy định tại khoản 2, khoản 3 Điều 7 Luật Lý lịch tư pháp, không yêu cầu cán bộ, công chức, viên chức, người dân phải nộp Phiếu lý lịch tư pháp; có các giải pháp phù hợp, hiệu quả ngăn chặn tình trạng yêu cầu nộp Phiếu lý lịch tư pháp gây khó khăn, phát sinh chi phí; kịp thời phát hiện, ngăn chặn tình trạng yêu cầu cung cấp Phiếu lý lịch tư pháp không đúng quy định pháp luật gây khó khăn, phát sinh chi phí cho người dân. 
 2. Sở Tư pháp 
 - Căn cứ chức năng, nhiệm vụ được giao để tham mưu, đề xuất Ủy ban nhân dân tỉnh thực hiện các giải pháp thực hiện nghiêm, đồng bộ, hiệu quả công tác quản lý nhà nước về lý lịch tư pháp theo quy định của pháp luật.
 - Tham mưu Hội đồng phối hợp phổ biến, giáo dục pháp luật tỉnh triển khai các hoạt động tuyên truyền, phổ biến, hướng dẫn, vận động và khuyến khích người dân sử dụng dịch vụ công trực tuyến về cấp Phiếu lý lịch tư pháp và sử dụng dịch vụ bưu chính công ích theo Quyết định số 45/2016/QĐ-TTg ngày 19/10/2016 của Thủ tướng Chính phủ về việc tiếp nhận hồ sơ, trả kết quả giải quyết thủ tục hành chính qua dịch vụ bưu chính công ích.
 - Thực hiện chặt chẽ quy trình cấp Phiếu lý lịch tư pháp, giải quyết kịp thời yêu cầu cấp Phiếu lý lịch tư pháp của cá nhân, tổ chức trên địa bàn tỉnh. Tiếp tục chủ trì, phối hợp với Trung tâm lý lịch tư pháp Quốc gia, Bộ Tư pháp; Công an tỉnh, Tòa án nhân dân tỉnh, Viện Kiểm sát nhân dân tỉnh, Cục Thi hành án dân sự tỉnh, các cơ quan liên quan thực hiện có hiệu quả Thông tư liên tịch số 04/2012/TTLT-BTP-TANDTC-VKSNDTCBCA-BQP ngày 10/5/2012 của Bộ Tư pháp, Tòa án nhân dân tối cao, Viện Kiểm sát nhân dân tối cao, Bộ Công an, Bộ Quốc phòng hướng dẫn trình tự, thủ tục tra cứu, xác minh, trao đổi, cung cấp thông tin lý lịch tư pháp; Quyết định số 1118/QĐ-UBND ngày 16/5/2014 của UBND tỉnh về Quy chế phối hợp liên ngành trong công tác tra cứu, xác minh, trao đổi, cung cấp và rà soát thông tin lý lịch tư pháp trên địa bàn tỉnh Bình Dương, đặc biệt là các thông tin về án tích, tránh tình trạng kéo dài thời gian xác minh, gây bức xúc cho người dân. Xử lý, báo cáo kịp thời các khó khăn, vướng mắc trong công tác cấp Phiếu lý lịch tư pháp.
 - Tiếp tục tăng cường ứng dụng công nghệ thông tin trong tiếp nhận, giải quyết, trả kết quả thủ tục hành chính nhằm đảm bảo cung cấp dịch vụ công trực tuyến hiệu quả; tiếp tục phối hợp rà soát, đánh giá và hoàn thiện kịp thời quy trình thực hiện dịch vụ công trực tuyến về cấp Phiếu lý lịch tư pháp để tạo thuận lợi cho người dân, doanh nghiệp.
 - Tiếp tục tham mưu UBND tỉnh đảm bảo nhân lực, kinh phí, cơ sở vật chất, trang thiết bị phục vụ công tác lý lịch tư pháp; sử dụng, bố trí công chức có đủ trình độ về chuyên môn, nghiệp vụ để thực hiện thủ tục hành chính cấp Phiếu lý lịch tư pháp; phân công nhân sự một cửa tại Bộ phận Tiếp nhận và Trả kết quả của Sở Tư pháp tại Trung tâm Hành chính công tỉnh đúng quy định.
 3. Văn phòng Ủy ban nhân dân tỉnh (Trung tâm Hành chính công tỉnh) 
 - Tiếp tục bố trí, sắp xếp việc thực hiện tiếp nhận hồ sơ, trả kết quả của Sở Tư pháp tại Trung tâm Hành chính công tỉnh đáp ứng nhu cầu giải quyết thủ tục hành chính.
 - Tiếp tục bố trí các trang thiết bị phục vụ hoạt động tiếp nhận và trả kết quả giải quyết thủ tục hành chính của công chức, viên chức thực hiện nhiệm vụ tại Trung tâm Hành chính công tỉnh đầy đủ, đảm bảo yêu cầu giải quyết công việc nhanh chóng, thuận lợi cho người dân, doanh nghiệp; bố trí khu vực hướng dẫn, thực hiện dịch vụ công trực tuyến phù hợp yêu cầu nói chung và thực hiện dịch vụ công trực tuyến cấp Phiếu lý lịch tư pháp nói riêng.
 - Phối hợp truyền thông, tuyên truyền đến người dân việc đăng ký tài khoản định danh điện tử VNeID; hướng dẫn thực hiện dịch vụ công trực tuyến trên Cổng dịch vụ công quốc gia, Hệ thống thông tin giải quyết thủ tục hành chính của tỉnh; hướng dẫn người dân sử dụng các trang thiết bị công nghệ thông tin phục vụ thực hiện dịch vụ công trực tuyến.
 4. Sở Tài chính 
 Trên cơ sở dự toán kinh phí của Sở Tư pháp thực hiện các giải pháp tăng cường hiệu quả công tác lý lịch tư pháp và khả năng cân đối ngân sách, Sở Tài chính tham mưu Ủy ban nhân dân tỉnh bố trí kinh phí để thực hiện cho phù hợp.
 5. Sở Nội vụ 
 Chủ trì, phối hợp với Sở Tư pháp bố trí nhân lực, điều kiện làm việc đáp ứng yêu cầu của công tác lý lịch tư pháp bảo đảm theo quy định và phù hợp tình hình thực tiễn của địa phương.
 6. Sở Thông tin và Truyền thông 
 - Chỉ đạo các cơ quan thông tấn, báo chí, hệ thống thông tin cơ sở đẩy mạnh công tác thông tin, tuyên truyền, phổ biến, hướng dẫn, khuyến khích người dân sử dụng dịch vụ công trực tuyến về cấp Phiếu lý lịch tư pháp và sử dụng dịch vụ bưu chính công ích theo Quyết định số 45/2016/QĐ-TTg ngày 19/10/2016 của Thủ tướng Chính phủ về việc tiếp nhận hồ sơ, trả kết quả giải quyết thủ tục hành chính qua dịch vụ bưu chính công ích.
 - Đảm bảo cơ sở hạ tầng phục vụ cho việc kết nối, chia sẻ, cơ sở dữ liệu, số hóa hồ sơ thủ tục hành chính liên quan đến lý lịch tư pháp. Nâng cấp Hệ thống thông tin giải quyết thủ tục hành chính của tỉnh đáp ứng yêu cầu cung cấp dịch vụ công trực tuyến phục vụ người dân, doanh nghiệp trong công tác lý lịch tư pháp.
 - Chỉ đạo Bưu điện tỉnh phối hợp chặt chẽ với cơ quan cấp Phiếu lý lịch tư pháp để cung ứng dịch vụ tiếp nhận, trả kết quả giải quyết hồ sơ cấp Phiếu lý lịch tư pháp tại nhà khu người dân có nhu cầu.
 7. Công an tỉnh, Viện Kiểm sát nhân dân tỉnh, Tòa án nhân dân tỉnh, Cục Thi hành án dân sự tỉnh 
 Tiếp tục phối hợp thực hiện và chỉ đạo các đơn vị trực thuộc thực hiện tốt công tác phối hợp với Sở Tư pháp trong việc trao đổi, cung cấp thông tin lý lịch tư pháp và xác minh điều kiện đương nhiên xóa án tích theo quy định và Quyết định số 1118/QĐ-UBND ngày 16/5/2014 của UBND tỉnh về Quy chế phối hợp liên ngành trong công tác tra cứu, xác minh, trao đổi, cung cấp và rà soát thông tin lý lịch tư pháp trên địa bàn tỉnh Bình Dương.
 8.  Đề nghị Mặt trận Tổ quốc, các Đoàn thể chính trị - xã hội, các Hội tổ chức quán triệt, tuyên truyền vận động các đoàn viên, hội viên chấp hành tốt Chỉ thị số 23/CT-TTg ngày 09/7/2023 của Thủ tướng Chính phủ và quy định pháp luật có liên quan; hạn chế thấp nhất việc lạm dụng yêu cầu cung cấp Phiếu lý lịch tư pháp để gây khó khăn cho các tổ chức, cá nhân.
 Trên đây là Chỉ thị Tăng cường cải cách thủ tục hành chính và xử lý hiệu quả các vướng mắc liên quan đến cấp Phiếu lý lịch tư pháp; Giám đốc, Thủ trưởng các đơn vị, địa phương quán triệt và tổ chức triển khai thực hiện nghiêm túc. Giao Sở Tư pháp chủ trì, phối hợp với các đơn vị liên quan theo dõi, hướng dẫn và kiểm tra, đôn đốc việc thực hiện; định kỳ tổng hợp, báo cáo tình hình, kết quả thực hiện theo quy định./.
  
    KSTT 
    CHỦ TỊCH 
     
  
  
    lồng nhau (bên trong) hay không
    const memberID = 0;
    const vbID = '9fe2a1d6c52ce6240940dc8a0595dd64';
    
    // State management cho phân tích
    let isAnalyzing = false; // Có đang phân tích không
    let currentAnalyzingAddress = null; // Address đang được phân tích
    let currentAnalyzingElement = null; // Element đang được phân tích
    let currentAnalyzingBadge = null; // Badge của element đang phân tích
    let isPanelOpen = false; // Panel phân tích có đang mở không
    function isInViewportAndTabNoiDung(element) {
        const rect = element.getBoundingClientRect();
        const buffer = 1500; // Buffer to preload content below the viewport (approx. 50+ lines)
        const viewHeight = window.innerHeight || document.documentElement.clientHeight;
        const isInViewport = rect.top < viewHeight + buffer && rect.bottom >= 0;
        const isInTabNoiDung = $(element).closest('#tab_noi_dung_vb').length > 0;
        return isInViewport && isInTabNoiDung;
    }
    function getAddress(element) {
        const validTags = ['trichyeu', 'cancu', 'phan', 'chuong', 'muc', 'tieumuc', 'dieu', 'khoan', 'diem'];
        const $parent = $(element).closest(validTags.join(','));
        if (!$parent.length) {
            return null;
        }
        let addr = $parent.attr('address');
        if (!addr && $parent.prop('tagName').toLowerCase() === 'trichyeu') {
            addr = 'trichyeu';
            $parent.attr('address', addr);
        }
        return addr || null;
    }
    function processTnplClasses($element) {
        const tnplKeysInLine = new Set(); // key = slug hoặc text (thường là slug)
        $element.find('tnpl').each(function () {
            const $tnpl = $(this);
            const tnplSlug = ($tnpl.attr('slug') || '').trim().toLowerCase();
            const tnplKey = tnplSlug || $tnpl.text().trim().toLowerCase();
            // Đã xử lý trong cùng dòng => bỏ
            if (tnplKeysInLine.has(tnplKey)) {
                return;
            }
            tnplKeysInLine.add(tnplKey);
            let tnplExists = false;
            // Chỉ duyệt các tnpl đã được tô màu (class on)
            $('tnpl.on').each(function () {
                const $existingTnpl = $(this);
                const existingSlug = ($existingTnpl.attr('slug') || '').trim().toLowerCase();
                const existingKey = existingSlug || $existingTnpl.text().trim().toLowerCase();
                if (
                    existingKey === tnplKey &&
                    isInViewportAndTabNoiDung($existingTnpl[0])
                ) {
                    tnplExists = true;
                    return false; // break each
                }
            });
            if (!tnplExists) {
                $tnpl.addClass('on');
            }
        });
    }
    function processQueue() {
        while (pendingRequests < maxConcurrentRequests && requestQueue.length > 0) {
            const task = requestQueue.shift();
            pendingRequests++;
            task()
                .always(() => {
                    pendingRequests--;
                    processQueue();
                });
        }
    }
    function processVisibleParagraphs() {
        try {
        $('#tab_noi_dung_vb p:not([is-posted="1"])').each(function () {
            let $element = $(this);
            if (isInViewportAndTabNoiDung(this)) {
                $element.attr('is-posted', '1');
                $element.addClass('loading-content'); 
                let p_innerHTML = $element.html();
                let address = null;
                if (cac_cau_hinh.loai_noi_dung.includes('docs')) {
                    address = getAddress($element);
                }
                const isSubP = $element.parents('p').length > 0;
                if (isSubP && !allow_sub_p) {
                    $element.removeClass('loading-content');
                    return; // Không gửi nếu không cho phép
                }
                const postData = { p_content: p_innerHTML, cac_cau_hinh, address };
                if (isSubP && allow_sub_p) {
                    postData.sub_p = 1;
                }
                requestQueue.push(() =>
                    $.ajax({
                        url: '//tnpl' + (Math.floor(Math.random() * 10) + 1) + '.hethongphapluat.com/tien-ich/tim.tien.ich.php',
                        type: 'POST',
                        data: postData,
                        success: function(response) {
                            $element.html(response); 
                            processTnplClasses($element);
                            
                            // Đợi CTTD và các tiện ích load xong rồi mới attach badge
                            if (memberID === 4 && typeof attachPhanTichBadge === 'function') {
                                setTimeout(function() {
                                    // $element chính là thẻ p, kiểm tra và attach badge trực tiếp
                                    const $parent = $element.closest('phan, chuong, muc, tieumuc, dieu, khoan, diem');
                                    if ($parent.length > 0 && $parent.find('.badge-phan-tich[data-for="' + $parent.attr('address') + '"]').length === 0) {
                                        const address = $parent.attr('address');
                                        $element.attr('data-address', address);
                                        
                                        // Lấy tên loại thẻ cho tooltip
                                        const parentType = getParentTypeName($parent.prop('tagName').toLowerCase());
                                        // Append badge VÀO PARENT (dieu, khoan,...) thay vì vào  để tránh xung đột CTTD
                                        const $badge = $('Phân tích ');
                                        $parent.append($badge);
                                        
                                        // Thêm class để CSS set position: relative CHỈ cho element có badge
                                        $parent.addClass('has-phan-tich-badge');
                                    }
                                    // Xử lý các p con (nếu có sub-p)
                                    attachPhanTichBadge($element);
                                }, 300); // Đợi 300ms để CTTD render xong
                            }
                        },
                        complete: function() {
                            $element.removeClass('loading-content'); 
                        }
                    })
                );
                processQueue();
            }
        });
        } catch(e) {
        }
    }
    $(window).on('scroll resize', function () {
        processVisibleParagraphs();
    });
    
    processVisibleParagraphs();
    // Chức năng phân tích điều luật (chỉ cho member_id = 4)
    if (memberID === 4 || memberID === 3 || memberID === 2) {
        // Modal cảnh báo
        function showWarningModal(message) {
            // Tạo modal nếu chưa có
            if ($('#warningModal').length === 0) {
                const modalHTML = `
                    
                `;
                $('body').append(modalHTML);
            }
            
            $('#warningModalBody').html('' + message + '
');
            $('#warningModal').modal('show');
        }
        
        // Hàm lấy tên tiếng Việt của thẻ
        function getParentTypeName(tagName) {
            const typeNames = {
                'phan': 'Phần',
                'chuong': 'Chương',
                'muc': 'Mục',
                'tieumuc': 'Tiểu mục',
                'dieu': 'Điều',
                'khoan': 'Khoản',
                'diem': 'Điểm'
            };
            return typeNames[tagName] || 'Nội dung';
        }
        function attachPhanTichBadge($container) {
            const validTags = 'phan, chuong, muc, tieumuc, dieu, khoan, diem';
            
            $container.find('p').each(function() {
                const $p = $(this);
                const $parent = $p.closest(validTags);
                
                if ($parent.length > 0) {
                    const address = $parent.attr('address');
                    // Kiểm tra đã có badge cho parent này chưa
                    if ($parent.find('.badge-phan-tich[data-for="' + address + '"]').length === 0) {
                        // Lưu address vào data attribute
                        $p.attr('data-address', address);
                        
                        // Lấy tên loại thẻ cho tooltip
                        const parentType = getParentTypeName($parent.prop('tagName').toLowerCase());
                        // Append badge vào PARENT, không vào 
                        const $badge = $('Phân tích ');
                        $parent.append($badge);
                        
                        // Thêm class để CSS set position: relative CHỈ cho element có badge
                        $parent.addClass('has-phan-tich-badge');
                    }
                }
            });
        }
        
        // Helper: Escape HTML entities
        function escapeHtml(text) {
            const map = {
                '&': '&',
                '<': '<',
                '>': '>',
                '"': '"',
                "'": '''
            };
            return String(text).replace(/[&<>"']/g, function(m) { return map[m]; });
        }
        
        // Helper: Convert Markdown to HTML (đơn giản)
        function markdownToHtml(markdown) {
            if (!markdown) return '';
            
            let html = markdown;
            
            // Headers
            html = html.replace(/^### (.*$)/gim, '
$1 ');
            html = html.replace(/^## (.*$)/gim, '$1 ');
            html = html.replace(/^# (.*$)/gim, '$1 ');
            
            // Bold
            html = html.replace(/\*\*(.*?)\*\*/g, '$1 ');
            
            // Italic
            html = html.replace(/\*(.*?)\*/g, '$1 ');
            
            // Blockquote
            html = html.replace(/^> (.*$)/gim, '$1 ');
            html = html.replace(/^> (.*$)/gim, '$1 ');
            
            // Lists (unordered)
            html = html.replace(/^\- (.*$)/gim, '$1 ');
            html = html.replace(/(.*<\/li>)/s, '');
            
            // Lists (ordered)
            html = html.replace(/^\d+\. (.*$)/gim, ' $1 ');
            
            // Line breaks và paragraphs
            html = html.split('\n\n').map(para => {
                para = para.trim();
                if (para.startsWith('')) {
                    return para;
                }
                if (para) {
                    return '' + para.replace(/\n/g, '
';
                }
                return '';
            }).join('\n');
            
            // Clean up multiple line breaks
            html = html.replace(/\n{3,}/g, '\n\n');
            
            return html;
        }
        
        // Panel fixed position
        function closePhanTichPanel() {
            const $panel = $('#phanTichPanel');
            
            if ($panel.length) {
                $panel.removeClass('show');
                setTimeout(() => {
                    $panel.remove();
                }, 300);
            }
            
            // Reset highlight và badge khi đóng panel
            if (currentAnalyzingElement) {
                currentAnalyzingElement.removeClass('highlight-border-persistent');
            }
            if (currentAnalyzingBadge) {
                currentAnalyzingBadge.text('Phân tích').removeClass('analyzing');
                currentAnalyzingBadge.data('analyzing', false);
                currentAnalyzingBadge.data('hovering', false);
                currentAnalyzingBadge.css({display: 'none'}); // Ẩn badge khi đóng
            }
            
            // Reset tất cả các element khác (trong trường hợp có nhiều)
            $('#tab_noi_dung_vb .highlight-border-persistent').removeClass('highlight-border-persistent');
            $('#tab_noi_dung_vb .badge-phan-tich-container.analyzing').each(function() {
                $(this).text('Phân tích').removeClass('analyzing').data('analyzing', false);
            });
            
            // Check: có CTTD pointer đang mở không?
            const $visiblePointers = $('.pointer:visible');
            const hadCTTDOpen = $visiblePointers.length > 0;
            
            if (hadCTTDOpen) {
                // CÓ CTTD đang mở → giữ rightdocinfo ẩn
            } else {
                // KHÔNG có CTTD → SHOW lại rightdocinfo
                const $rightdocinfo = $('#rightdocinfo');
                if ($rightdocinfo.length > 0) {
                    $rightdocinfo.show();
                }
            }
            
            // Reset state
            isAnalyzing = false;
            currentAnalyzingAddress = null;
            currentAnalyzingElement = null;
            currentAnalyzingBadge = null;
            isPanelOpen = false; // Đánh dấu panel đã đóng
        }
        
        // Panel đã song song với rightdocinfo → không cần MutationObserver nữa
        // Resize event để update panel dimensions khi browser resize
        let resizeTimer;
        $(window).on('resize', function() {
            clearTimeout(resizeTimer);
            resizeTimer = setTimeout(function() {
                if (isPanelOpen && $('#phanTichPanel').length > 0) {
                    updatePanelDimensions();
                }
            }, 250); // Debounce 250ms
        });
        // Function để detect và áp dụng dimensions từ rightdocinfo
        function updatePanelDimensions() {
            const $panel = $('#phanTichPanel');
            const $rightdocinfo = $('#rightdocinfo');
            const $docRightCol = $('#doc-right-col');
            
            if ($panel.length === 0) return;
            
            // Ưu tiên: doc-right-col > rightdocinfo
            let $reference = $docRightCol.length > 0 ? $docRightCol : $rightdocinfo;
            
            // Nếu reference bị ẩn (display:none), tạm show để get dimensions
            let wasHidden = false;
            if ($reference.length > 0 && !$reference.is(':visible')) {
                wasHidden = true;
                $reference.css('visibility', 'hidden').show();
            }
            
            if ($reference.length > 0) {
                const refWidth = $reference.outerWidth();
                const refOffset = $reference.offset();
                
                if (refWidth && refOffset) {
                    // Tính vị trí right từ edge màn hình
                    const windowWidth = $(window).width();
                    const rightPosition = windowWidth - (refOffset.left + refWidth);
                    
                    $panel.css({
                        'width': refWidth + 'px',
                        'right': rightPosition + 'px'
                    });
                } else {
                }
                
                // Restore trạng thái hidden nếu cần
                if (wasHidden) {
                    $reference.hide().css('visibility', '');
                }
            }
        }
        function openPhanTichPanel(address, vbID) {
            // Kiểm tra nếu đang phân tích element khác
            if (isAnalyzing && currentAnalyzingAddress && currentAnalyzingAddress !== address) {
                const currentName = getElementDisplayName(currentAnalyzingAddress);
                showWarningModal('Vui lòng chờ phân tích ' + currentName + ' hoàn tất...');
                return;
            }
            
            // Nếu đang phân tích cùng element → không làm gì
            if (isAnalyzing && currentAnalyzingAddress === address) {
                return;
            }
            
            // Panel sẽ fixed position append vào body
            const $rightdocinfo = $('#rightdocinfo');
            
            // KHÔNG ẨN CTTD pointer - cho phép CTTD và panel cùng tồn tại
            
            // ẨN rightdocinfo để tiết kiệm không gian
            if ($rightdocinfo.length > 0) {
                $rightdocinfo.hide();
            }
            
            // XÓA highlight persistent của TẤT CẢ elements cũ trước
            $('#tab_noi_dung_vb .highlight-border-persistent').removeClass('highlight-border-persistent');
            
            // Tìm element đang được phân tích và badge của nó
            const $element = $('[address="' + address + '"]');
            const $badge = $element.find('.badge-phan-tich-container[data-for="' + address + '"]').first();
            
            // Set state
            isAnalyzing = true;
            currentAnalyzingAddress = address;
            currentAnalyzingElement = $element;
            currentAnalyzingBadge = $badge;
            
            // Thêm highlight persistent cho element MỚI này
            $element.addClass('highlight-border-persistent');
            
            // Thay đổi badge thành "Đang phân tích..." và giữ hiển thị
            if ($badge.length > 0) {
                $badge.text('Đang phân tích...').addClass('analyzing');
                // Giữ badge hiển thị và ở đúng vị trí
                $badge.data('analyzing', true);
                $badge.data('hovering', true); // Prevent auto-hide
                
                // Đảm bảo badge hiển thị ở đúng vị trí (vì dùng position: fixed)
                showPhanTichBadgeForParent($element);
            }
            // Tạo panel nếu chưa có - fixed position append vào body
            if ($('#phanTichPanel').length === 0) {
                const panelHTML = `
                    
                        
                        
                            
                                
                                    Đang phân tích... 
                                
                                Đang phân tích...
                             
                         
                     `;
                
                // Append vào body (fixed position không cần container cụ thể)
                $('body').append(panelHTML);
                
                // Detect width từ rightdocinfo và áp dụng cho panel
                updatePanelDimensions();
                
                // Trigger show và set flag
                setTimeout(() => {
                    $('#phanTichPanel').addClass('show');
                    isPanelOpen = true;
                }, 10);
            } else {
                $('#phanTichPanelBody').html(`
                    
                        
                            Đang phân tích... 
                        
                        Đang phân tích...
                     
                `);
                
                // Update dimensions khi re-open
                updatePanelDimensions();
                
                $('#phanTichPanel').addClass('show');
                isPanelOpen = true;
            }
            // Bind nút đóng và ESC
            $(document).off('click.closePhanTich').on('click.closePhanTich', '.close-phan-tich', function() {
                closePhanTichPanel();
            });
            $(document).off('keyup.closePhanTich').on('keyup.closePhanTich', function(e) {
                if (e.key === 'Escape') closePhanTichPanel();
            });
            
            // Bind nút refresh - phân tích lại
            $(document).off('click.refreshPhanTich').on('click.refreshPhanTich', '.btn-refresh-phan-tich', function(e) {
                e.preventDefault();
                e.stopPropagation();
                
                const $btn = $(this);
                const $icon = $btn.find('i');
                
                // Disable button và thêm animation
                $btn.prop('disabled', true);
                $icon.addClass('fa-spin');
                
                // Show loading trong panel
                $('#phanTichPanelBody').html(`
                    
                        
                            Đang phân tích lại... 
                        
                        Đang xóa cache và phân tích lại...
                     
                `);
                
                // Gọi API xóa cache trước
                deletePhanTichCache(address, vbID, function(deleteSuccess) {
                    if (deleteSuccess) {
                        // Sau khi xóa cache, gọi lại API phân tích
                        callPhanTichAPI(address, vbID, function() {
                            // Enable lại button
                            $btn.prop('disabled', false);
                            $icon.removeClass('fa-spin');
                        });
                    } else {
                        $('#phanTichPanelBody').html(`
                            
                                Lỗi!  Không thể xóa cache. Vui lòng thử lại.
                            
                        `);
                        $btn.prop('disabled', false);
                        $icon.removeClass('fa-spin');
                    }
                });
            });
            // Gọi API phân tích (dùng function helper)
            callPhanTichAPI(address, vbID);
        }
        
        // Helper: Gọi API phân tích (tách riêng để dùng lại)
        function callPhanTichAPI(address, vbID, callback) {
            const randomServer = Math.floor(Math.random() * 10) + 1;
            $.ajax({
                url: '//tnpl' + randomServer + '.hethongphapluat.com/tien-ich/phan.tich.dieu.luat.php',
                type: 'POST',
                contentType: 'application/json',
                timeout: 300000, // 5 phút
                data: JSON.stringify({
                    address: address,
                    vb_id: vbID
                }),
                success: function(response) {
                    // Reset badge về trạng thái bình thường (nhưng vẫn hiển thị)
                    if (currentAnalyzingBadge) {
                        currentAnalyzingBadge.text('Phân tích').removeClass('analyzing');
                        currentAnalyzingBadge.data('analyzing', false);
                    }
                    
                    // Reset state analyzing để có thể phân tích element khác
                    isAnalyzing = false;
                    
                    if (response.ok) {
                        // Render kết quả phân tích
                        let html = '';
                        html += '';
                        html += '
' + escapeHtml(response.ten_van_ban) + ' Số hiệu: ' + escapeHtml(response.so_hieu) + ' Điều khoản: ' + escapeHtml(response.address) + ' ';
                        if (response.from_cache) {
                            html += ' Cache ';
                        }
                        html += '  
';
                        html += '' + markdownToHtml(response.phan_tich) + '
';
                        if (response.usage) {
                            html += '';
                            html += 'Thống kê:  ';
                            html += 'Input tokens: ' + (response.usage.promptTokenCount || 0) + ', ';
                            html += 'Output tokens: ' + (response.usage.candidatesTokenCount || 0);
                            html += '
';
                        }
                        $('#phanTichPanelBody').html(html);
                    } else {
                        $('#phanTichPanelBody').html(`
                            
                                Lỗi!  ${escapeHtml(response.error || 'Không thể phân tích điều luật.')}Vui lòng thử lại sau. 
                            
                        `);
                    }
                    
                    if (callback) callback();
                },
                error: function(xhr, status, error) {
                    // Reset badge về trạng thái bình thường
                    if (currentAnalyzingBadge) {
                        currentAnalyzingBadge.text('Phân tích').removeClass('analyzing');
                        currentAnalyzingBadge.data('analyzing', false);
                    }
                    
                    // Reset state analyzing
                    isAnalyzing = false;
                    
                    let errorMsg = error;
                    if (xhr.responseJSON && xhr.responseJSON.error) {
                        errorMsg = xhr.responseJSON.error;
                    }
                    $('#phanTichPanelBody').html(`
                        
                            Lỗi!  Không thể kết nối đến server phân tích.Chi tiết: ${escapeHtml(errorMsg)} 
                        
                    `);
                    
                    if (callback) callback();
                }
            });
        }
        
        // Helper: Xóa cache phân tích
        function deletePhanTichCache(address, vbID, callback) {
            const randomServer = Math.floor(Math.random() * 10) + 1;
            $.ajax({
                url: '//tnpl' + randomServer + '.hethongphapluat.com/tien-ich/delete.phan.tich.cache.php',
                type: 'POST',
                contentType: 'application/json',
                timeout: 10000,
                data: JSON.stringify({
                    address: address,
                    vb_id: vbID
                }),
                success: function(response) {
                    if (callback) callback(response.ok || false);
                },
                error: function(xhr, status, error) {
                    if (callback) callback(false);
                }
            });
        }
        
        // Helper: Lấy tên hiển thị của element từ address
        function getElementDisplayName(address) {
            if (!address) return 'nội dung';
            
            const $element = $('[address="' + address + '"]');
            if ($element.length === 0) return address;
            
            // Parse address: vd "dieu_3_khoan_29" -> "Khoản 29 Điều 3"
            // Address format: lớn đến nhỏ (phan > chuong > muc > dieu > khoan > diem)
            const parts = address.split('_');
            const displayParts = [];
            
            for (let i = 0; i < parts.length; i += 2) {
                if (i + 1 < parts.length) {
                    const type = getParentTypeName(parts[i]);
                    const num = parts[i + 1];
                    displayParts.push(type + ' ' + num);
                }
            }
            
            // Reverse để hiển thị từ nhỏ đến lớn: "Khoản 29 Điều 3" (thay vì "Điều 3 Khoản 29")
            return displayParts.reverse().join(' ');
        }
        
        function openPhanTichModal(address, vbID) {
            // Tạo modal nếu chưa có
            if ($('#modalPhanTich').length === 0) {
                const modalHTML = `
                    
                        
                            
                                
                                
                                    
                                        
                                            Đang phân tích... 
                                        
                                        Đang phân tích...
                                     
                                 
                                
                             
                         
                     
                `;
                $('body').append(modalHTML);
            }
            
            // Reset và hiển thị modal với loading
            $('#modalPhanTichBody').html(`
                
                    
                        Đang phân tích... 
                    
                    Đang phân tích...
                 
            `);
            $('#modalPhanTich').modal('show');
            
            // AJAX request
            const randomServer = Math.floor(Math.random() * 10) + 1;
            $.ajax({
                url: '//tnpl' + randomServer + '.hethongphapluat.com/tien-ich/phan.tich.dieu.luat.php',
                type: 'POST',
                contentType: 'application/json',
                data: JSON.stringify({
                    address: address,
                    vb_id: vbID
                }),
                success: function(response) {
                    if (response.ok) {
                        // Render kết quả phân tích
                        let html = '';
                        
                        // Header thông tin văn bản
                        html += '';
                        html += '
' + escapeHtml(response.ten_van_ban) + ' Số hiệu: ' + escapeHtml(response.so_hieu) + ' Điều khoản: ' + escapeHtml(response.address) + ' ';
                        html += '';
                        
                        // Nội dung phân tích (Markdown -> HTML)
                        html += '';
                        html += markdownToHtml(response.phan_tich);
                        html += '
';
                        
                        // Thông tin usage (nếu có)
                        if (response.usage) {
                            html += '';
                            html += 'Thống kê:  ';
                            html += 'Input tokens: ' + (response.usage.promptTokenCount || 0) + ', ';
                            html += 'Output tokens: ' + (response.usage.candidatesTokenCount || 0);
                            html += '
';
                        }
                        
                        $('#modalPhanTichBody').html(html);
                    } else {
                        $('#modalPhanTichBody').html(`
                            
                                Lỗi!  ${escapeHtml(response.error || 'Không thể phân tích điều luật.')}Vui lòng thử lại sau. 
                            
                        `);
                    }
                },
                error: function(xhr, status, error) {
                    let errorMsg = error;
                    if (xhr.responseJSON && xhr.responseJSON.error) {
                        errorMsg = xhr.responseJSON.error;
                    }
                    $('#modalPhanTichBody').html(`
                        
                            Lỗi!  Không thể kết nối đến server phân tích.Chi tiết: ${escapeHtml(errorMsg)} 
                        
                    `);
                }
            });
        }
        
        // Helpers: show/hide badge cho parent element (dieu, khoan,...) với position: fixed
        function showPhanTichBadgeForParent($parent) {
            // Lấy badge CỦA CHÍNH parent này (match data-for với address của parent)
            const parentAddress = $parent.attr('address');
            const $badge = $parent.find('.badge-phan-tich-container[data-for="' + parentAddress + '"]').first();
            
            if ($badge.length === 0) {
                return;
            }
            
            // Ẩn TẤT CẢ các badge khác để tránh overlap
            $('.badge-phan-tich-container').not($badge).each(function() {
                const $otherBadge = $(this);
                // Chỉ ẩn badge KHÔNG đang analyzing
                if (!$otherBadge.data('analyzing')) {
                    $otherBadge.css({display: 'none'});
                }
            });
            
            // Show badge tạm để tính width
            $badge.css({display: 'inline-block', opacity: 0, visibility: 'hidden'});
            const badgeWidth = $badge.outerWidth();
            
            // Tính toán vị trí fixed dựa trên offset của parent
            const offset = $parent.offset();
            const scrollTop = $(window).scrollTop();
            const scrollLeft = $(window).scrollLeft();
            
            // Position badge top-right của parent và show
            $badge.css({
                display: 'inline-block',
                visibility: 'visible',
                opacity: 1,
                top: (offset.top - scrollTop) + 'px',
                left: (offset.left + $parent.outerWidth() - badgeWidth - scrollLeft - 5) + 'px' // -5px padding
            });
            
            $parent.addClass('highlight-border');
        }
        function hidePhanTichBadgeForParent($parent) {
            const $badge = $parent.find('.badge-phan-tich-container').first();
            if ($badge.length === 0) return;
            
            $badge.css({display: 'none', opacity: 0});
            $parent.removeClass('highlight-border');
        }
        // Biến lưu element đang hover
        let currentHoveredElement = null;
        let hoverDebounceTimer = null;
        // Dùng mousemove để track chính xác element nào đang được hover
        $(document).on('mousemove', '#tab_noi_dung_vb', function(e) {
            // Tìm element gần nhất (phan, chuong, muc, dieu, khoan, diem) tại vị trí chuột
            const $target = $(e.target).closest('phan, chuong, muc, tieumuc, dieu, khoan, diem');
            
            if ($target.length === 0) {
                // Không hover vào element nào
                return;
            }
            
            const address = $target.attr('address');
            
            // Nếu đang hover vào cùng element → skip
            if (currentHoveredElement && currentHoveredElement[0] === $target[0]) {
                return;
            }
            
            // Clear debounce timer cũ
            if (hoverDebounceTimer) {
                clearTimeout(hoverDebounceTimer);
            }
            
            // Debounce để tránh trigger quá nhiều
            hoverDebounceTimer = setTimeout(function() {
                // Element thay đổi
                
                // Set flag hovering cho element mới
                $target.data('hovering', true);
                
                // Cancel timeout nếu có
                const timeoutId = $target.data('hideTimeout');
                if (timeoutId) {
                    clearTimeout(timeoutId);
                }
                
                // Ẩn badge của TẤT CẢ elements khác
                $('#tab_noi_dung_vb phan, #tab_noi_dung_vb chuong, #tab_noi_dung_vb muc, #tab_noi_dung_vb tieumuc, #tab_noi_dung_vb dieu, #tab_noi_dung_vb khoan, #tab_noi_dung_vb diem')
                    .not($target)
                    .each(function() {
                        const $el = $(this);
                        // Chỉ xóa highlight-border, KHÔNG xóa highlight-border-persistent
                        $el.removeClass('highlight-border');
                        
                        // Ẩn badge nếu KHÔNG đang analyzing
                        const $badge = $el.find('.badge-phan-tich-container');
                        if ($badge.length && !$badge.data('analyzing')) {
                            $badge.css({display: 'none'});
                        }
                    });
                
                // Attach badge nếu chưa có
                if (address && $target.find('.badge-phan-tich-container[data-for="' + address + '"]').length === 0) {
                    const parentType = getParentTypeName($target.prop('tagName').toLowerCase());
                    const $badge = $('Phân tích ');
                    $target.append($badge);
                    $target.addClass('has-phan-tich-badge');
                }
                
                // Show badge cho element này
                if ($target.find('.badge-phan-tich-container').length > 0) {
                    showPhanTichBadgeForParent($target);
                }
                
                // Update current hovered element
                currentHoveredElement = $target;
            }, 50); // Debounce 50ms
        });
        
        // Event delegation cho hover ra khỏi #tab_noi_dung_vb
        $(document).on('mouseleave', '#tab_noi_dung_vb', function(e) {
            // Clear current hovered element
            currentHoveredElement = null;
            
            // Ẩn tất cả badge không đang analyzing sau một khoảng thời gian
            setTimeout(function() {
                if (currentHoveredElement === null) {
                    // Chỉ ẩn nếu thực sự không hover vào element nào
                    $('#tab_noi_dung_vb phan, #tab_noi_dung_vb chuong, #tab_noi_dung_vb muc, #tab_noi_dung_vb tieumuc, #tab_noi_dung_vb dieu, #tab_noi_dung_vb khoan, #tab_noi_dung_vb diem')
                        .each(function() {
                            const $el = $(this);
                            const $badge = $el.find('.badge-phan-tich-container');
                            if ($badge.length && !$badge.data('analyzing')) {
                                $badge.css({display: 'none'});
                            }
                        });
                }
            }, 300);
        });
        
        // Event delegation cho hover ra khỏi parent (giữ lại cho badge behavior)
        $(document).on('mouseleave', '#tab_noi_dung_vb phan, #tab_noi_dung_vb chuong, #tab_noi_dung_vb muc, #tab_noi_dung_vb tieumuc, #tab_noi_dung_vb dieu, #tab_noi_dung_vb khoan, #tab_noi_dung_vb diem', function(e) {
            const $parent = $(this);
            const parentAddress = $parent.attr('address');
            const $badge = $parent.find('.badge-phan-tich-container[data-for="' + parentAddress + '"]').first();
            
            // Set flag parent not hovering
            $parent.data('hovering', false);
            
            // Nếu badge đang analyzing thì KHÔNG ẩn, GIỮ hiển thị
            if ($badge.length > 0 && $badge.data('analyzing')) {
                return;
            }
            
            // Delay để có thời gian di chuột vào badge
            const timeoutId = setTimeout(() => {
                // Chỉ ẩn nếu cả parent và badge đều không hover và không analyzing
                if ($badge.length > 0 && !$parent.data('hovering') && !$badge.data('hovering') && !$badge.data('analyzing')) {
                    hidePhanTichBadgeForParent($parent);
                }
            }, 300); // Tăng lên 300ms
            
            $parent.data('hideTimeout', timeoutId);
        });
        
        // Hover vào badge → giữ hiển thị
        $(document).on('mouseenter', '.badge-phan-tich-container', function(e) {
            e.stopPropagation();
            const $badge = $(this);
            const $parent = $badge.parent();
            
            $badge.data('hovering', true);
            
            // Cancel timeout của parent
            const timeoutId = $parent.data('hideTimeout');
            if (timeoutId) {
                clearTimeout(timeoutId);
            }
        });
        
        // Hover ra khỏi badge → ẩn nếu không hover parent
        $(document).on('mouseleave', '.badge-phan-tich-container', function(e) {
            const $badge = $(this);
            $badge.data('hovering', false);
            const $parent = $badge.parent();
            
            // Nếu badge đang analyzing thì KHÔNG ẩn, GIỮ hiển thị
            if ($badge.data('analyzing') || $badge.hasClass('analyzing')) {
                return;
            }
            
            setTimeout(() => {
                // Chỉ ẩn nếu cả parent và badge đều không hover và không analyzing
                if (!$parent.data('hovering') && !$badge.data('hovering') && !$badge.data('analyzing') && !$badge.hasClass('analyzing')) {
                    hidePhanTichBadgeForParent($parent);
                }
            }, 300);
        });
        
        // Event delegation cho hover vào badge → hiện tooltip
        $(document).on('mouseenter', '.badge-phan-tich, .badge-phan-tich-container, .badge-phan-tich-fixed', function() {
            const $badge = $(this);
            const parentType = $badge.attr('data-parent-type') || 'Nội dung';
            
            if ($badge.find('.badge-tooltip').length === 0) {
                const $tooltip = $('Phân tích chi tiết nội dung ' + parentType + ' này ');
                $badge.append($tooltip);
                setTimeout(() => $tooltip.addClass('show'), 10);
            }
        });
        
        // Event delegation cho hover ra khỏi badge → ẩn tooltip
        $(document).on('mouseleave', '.badge-phan-tich, .badge-phan-tich-container, .badge-phan-tich-fixed', function() {
            const $tooltip = $(this).find('.badge-tooltip');
            if ($tooltip.length > 0) {
                $tooltip.removeClass('show');
                setTimeout(() => $tooltip.remove(), 300);
            }
        });
        
        // Event delegation cho click badge → mở panel
        $(document).on('click', '.badge-phan-tich, .badge-phan-tich-container, .badge-phan-tich-fixed', function(e) {
            e.preventDefault();
            e.stopPropagation();
            
            const $badge = $(this);
            
            // Nếu badge đang analyzing thì không cho click
            if ($badge.hasClass('analyzing') || $badge.data('analyzing')) {
                return;
            }
            
            // Lấy address từ data-for attribute
            const address = $badge.attr('data-for');
            
            if (address && vbID) {
                openPhanTichPanel(address, vbID);
            } else {
                showWarningModal('Không tìm thấy địa chỉ điều luật hoặc ID văn bản!');
            }
        });
        
        // Ẩn badge khi click vào CTTD
        $(document).on('click', 'cttd.chuthichtudong span, dctk span, dctd span', function(e) {
            // Ẩn TẤT CẢ badge KHÔNG đang analyzing
            $('.badge-phan-tich-container').each(function() {
                const $badge = $(this);
                if (!$badge.data('analyzing') && !$badge.hasClass('analyzing')) {
                    $badge.css({display: 'none'});
                }
            });
        });
        
        // Update badge position khi scroll hoặc resize (vì dùng position: fixed)
        function updateBadgePositions() {
            $('.badge-phan-tich-container:visible').each(function() {
                const $badge = $(this);
                const $parent = $badge.parent();
                
                // Cập nhật position nếu parent đang hover HOẶC badge đang analyzing
                if ($parent.length && ($parent.is(':hover') || $badge.data('analyzing'))) {
                    // Re-calculate position
                    const offset = $parent.offset();
                    const scrollTop = $(window).scrollTop();
                    const scrollLeft = $(window).scrollLeft();
                    const badgeWidth = $badge.outerWidth();
                    
                    $badge.css({
                        top: (offset.top - scrollTop) + 'px',
                        left: (offset.left + $parent.outerWidth() - badgeWidth - scrollLeft - 5) + 'px'
                    });
                }
            });
        }
        
        $(window).on('scroll', updateBadgePositions);
        $(window).on('resize', updateBadgePositions);
    }
});
            
            
         
  Tra cứu thuật ngữ với từ hoặc cụm từ đã chọn?
  
    × 
   
 
    
    
      
      
      
      
            Chỉ thị 15/CT-UBND năm 2023 về tăng cường cải cách thủ tục hành chính và xử lý hiệu quả các vướng mắc liên quan đến cấp phiếu lý lịch tư pháp do tỉnh Bình Dương ban hành