Hệ thống pháp luật

ỦY BAN NHÂN DÂN
TỈNH THỪA THIÊN HUẾ
-------

CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc lập - Tự do - Hạnh phúc
---------------

Số: 258/KH-UBND

Thừa Thiên Huế, ngày 19 tháng 7 năm 2023

 

KẾ HOẠCH

PHÒNG NGỪA, ĐẤU TRANH, NGĂN CHẶN HOẠT ĐỘNG VẬN CHUYỂN TRÁI PHÉP VŨ KHÍ, VẬT LIỆU NỔ, CÔNG CỤ HỖ TRỢ, MA TÚY, HÀNG CẤM QUA ĐƯỜNG HÀNG KHÔNG

Theo thông báo của Ban Chỉ đạo 138 Chính phủ, từ đầu năm 2023 đến nay, trên địa bàn toàn quốc, hoạt động vận chuyển trái phép vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm qua đường hàng không diễn biến phức tạpI. MỤC ĐÍCH, YÊU CẦU

1. Phát huy sức mạnh tổng hợp của cả hệ thống chính trị và toàn dân trong công tác phòng, chống tội phạm nói chung và phòng ngừa, đấu tranh, ngăn chặn hoạt động vận chuyển trái phép vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm qua đường hàng không nói riêng.

2. Triển khai đồng bộ các giải pháp phòng ngừa, đấu tranh, ngăn chặn hoạt động vận chuyển trái phép vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm qua đường hàng không; xác định rõ nhiệm vụ, phân công trách nhiệm cụ thể, bảo đảm sự phối hợp chặt chẽ giữa các lực lượng chức năng và các sở, ngành, địa phương có liên quan.

3. Tăng cường khai thác, ứng dụng các thành tựu khoa học kỹ thuật, chuyển đổi số, chuyển đổi trạng thái các mặt công tác từ “truyền thống” sang “hiện đại” vào công tác phòng ngừa, đấu tranh với tội phạm và phòng ngừa, đấu tranh, ngăn chặn hoạt động vận chuyển trái phép vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm qua đường hàng không.

II. NHIỆM VỤ VÀ PHÂN CÔNG THỰC HIỆN

1. Công an tỉnh chỉ đạo Công an các đơn vị, địa phương thực hiện xuyên suốt, toàn diện, hiệu quả các chuyên đề, kế hoạch của Bộ Công an liên quan đến hoạt động vận chuyển trái phép vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm qua đường hàng không, như: Kế hoạch số 105/KH-BCA ngày 13/3/2020 về tổng kiểm tra, mở đợt cao điểm vận động toàn dân giao nộp và đấu tranh với tội phạm, vi phạm pháp luật về vũ khí, vật liệu nổ, công cụ hỗ trợ; Kế hoạch số 599/KH-BCA ngày 07/12/2022 về tăng cường chống buôn lậu, gian lận thương mại và hàng giả, vận chuyển trái phép hàng hóa qua cảng hàng không quốc tế, các tuyến biên giới, vùng biển và địa bàn nội địa; Điện số 31 ngày 29/4/2023 triển khai Kết luận của Phó Thủ tướng Chính phủ Trần Lưu Quang và Chương trình công tác phòng, chống ma túy năm 2023 của Ủy ban Quốc gia phòng, chống AIDS, ma túy, mại dâm; Đề án Tổ chức và hoạt động của lực lượng An ninh trên không,… Tổ chức triển khai thực hiện đồng bộ, quyết liệt các kế hoạch, phương án đấu tranh phòng, chống ma túy, tội phạm, vi phạm pháp luật về vũ khí, vật liệu nổ, công cụ hỗ trợ, hàng cấm, các biện pháp bảo đảm an ninh, trật tự tại cửa khẩu đường hàng không. Xây dựng phương án đấu tranh phòng, chống tội phạm ma túy trên tuyến hàng không, bưu điện, chuyển phát nhanh; tổng kết 05 năm triển khai thực hiện Luật Quản lý, sử dụng vũ khí, vật liệu nổ và công cụ hỗ trợ. Chú trọng ứng dụng khoa học, công nghệ thông tin; kết nối, khai thác, ứng dụng cơ sở dữ liệu quốc gia về dân cư, căn cước công dân với các cơ sở dữ liệu chuyên ngành khác, phục vụ quản lý xã hội, quản lý nghiệp vụ và công tác phòng ngừa, đấu tranh, ngăn chặn hoạt động vận chuyển trái phép vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm qua đường hàng không. Phối hợp các Cục nghiệp vụ Bộ Công an đẩy mạnh hợp tác với lực lượng chức năng các nước có đường bay quốc tế đi, đến Thừa Thiên Huế để trao đổi, chia sẻ thông tin, kịp thời phát hiện, đấu tranh, ngăn chặn, xử lý các đối tượng vận chuyển trái phép vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm qua đường hàng không.

2. Bộ Chỉ huy Bộ đội Biên phòng tỉnh tiếp tục thực hiện hiệu quả Kế hoạch số 4045/KH-BQP ngày 11/10/2021 của Bộ Quốc phòng về thực hiện Chương trình phòng, chống ma túy giai đoạn 2021 - 2025; Kế hoạch số 1246/KH-BQP ngày 27/4/2022 về tăng cường công tác phòng, chống tội phạm, vi phạm pháp luật về vũ khí, vật liệu nổ, công cụ hỗ trợ trong Quân đội. Chỉ đạo các lực lượng chức năng phối hợp chặt chẽ với lực lượng Công an, Hải quan,… trong phòng ngừa, đấu tranh, ngăn chặn có hiệu quả hoạt động vận chuyển trái phép vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm qua đường hàng không và phối hợp với các sở, ngành, địa phương bảo đảm an ninh hàng không theo thẩm quyền.

3. Cục Hải quan đẩy mạnh thực hiện văn bản số 92/BTC ngày 05/12/2022 của Bộ Tài chính về tăng cường công tác chống buôn lậu, gian lận thương mại, vận chuyển trái phép hàng hóa qua cảng hàng không quốc tế. Chỉ đạo lực lượng Hải quan thực hiện nghiêm túc, hiệu quả Kế hoạch phòng, chống và kiểm soát ma túy giai đoạn 2021-2025; Quy trình phát hiện, ngăn chặn, xử lý vụ việc mua bán, vận chuyển trái phép chất ma túy; tăng cường kiểm tra, giám sát, kiểm soát hàng hóa xuất nhập khẩu, hành lý (xách tay, ký gửi…) để kịp thời phát hiện, xử lý hành vi vận chuyển trái phép vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm qua đường hàng không và các loại hàng hóa không có hoá đơn, chứng từ, không rõ nguồn gốc xuất xứ như: thực phẩm, mỹ phẩm, đồ uống, thuốc lá điện tử từ nước ngoài vào Việt Nam để chủ động phòng ngừa các hoạt động ma túy “núp bóng”; triển khai hiệu quả các giải pháp đấu tranh với hoạt động vận chuyển trái phép hàng hóa qua cảng hàng không theo thẩm quyền. Trường hợp phát hiện hành vi có dấu hiệu tội phạm liên quan đến những vấn đề trên, phối hợp chặt chẽ với lực lượng Công an để đấu tranh làm rõ, truy xét tận gốc, trước khi tuyên truyền công khai.

4. Cảng hàng không quốc tế Phú Bài phối hợp Công an tỉnh và các sở, ngành, địa phương thực hiện nghiêm túc Chỉ thị số 06/CT-TTg ngày 24/02/2023 của Thủ tướng Chính phủ về nâng cao năng lực công tác bảo đảm an ninh, an toàn hàng không trong tình hình mới. Triển khai quyết liệt Kế hoạch tăng cường công tác chống buôn lậu, gian lận thương mại, vận chuyển trái phép hàng hóa qua cảng hàng không quốc tế (theo Quyết định số 1611/QĐ-BGTVT ngày 08/12/2022). Phối hợp với các đơn vị có chức năng quản lý nhà nước về hàng không, các đơn vị kinh doanh khai thác vận tải và dịch vụ tại cảng hàng không tăng cường kiểm tra, giám sát, thực hiện đúng quy trình, quy định đối với hoạt động vận chuyển hàng hóa qua các tuyến hàng không; thực hiện các biện pháp bảo đảm an ninh, an toàn hàng không dân dụng tại Cảng hàng không; thường xuyên cập nhật, thông báo phương thức, thủ đoạn lợi dụng đường không để vận chuyển, mua bán trái phép vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm để cảnh giác, kịp thời phát hiện các dấu hiệu, biểu hiện nghi vấn, phối hợp các cơ quan chức năng xác minh, làm rõ; thông báo kịp thời cho lực lượng Công an trong trường hợp phát hiện vi phạm vận chuyển trái phép vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm qua đường hàng không để xử lý theo thẩm quyền.

5. Sở Công Thương chỉ đạo lực lượng chức năng thực hiện có hiệu quả công tác chống buôn lậu, gian lận thương mại, vận chuyển trái phép hàng hóa qua cảng hàng không quốc tế; kiểm tra, kiểm soát thị trường, kiểm soát tiền chất công nghiệp; kiểm tra, kiểm soát việc chấp hành pháp luật trong thương mại điện tử; phối hợp với các lực lượng chức năng (Công an, Hải quan…) đấu tranh với hoạt động vận chuyển trái phép vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm qua đường hàng không theo thẩm quyền. Tập trung rà soát, ngăn chặn hoạt động rao bán vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm trên các trang thương mại điện tử. Đẩy mạnh việc ứng dụng tài khoản định danh điện tử để xác thực cá nhân tham gia hoạt động thương mại điện tử liên quan đến hoạt động vận chuyển trái phép vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm qua đường hàng không, góp phần phục vụ công tác phòng ngừa, đấu tranh.

6. Sở Thông tin và Truyền thông đẩy mạnh thực hiện Đề án tăng cường hiệu quả công tác phòng ngừa, chống vi phạm pháp luật và tội phạm trên mạng Internet giai đoạn 2021-2025, định hướng đến năm 2030. Chỉ đạo, định hướng các cơ quan báo chí, hệ thống thông tin cơ sở, doanh nghiệp viễn thông tăng cường tuyên truyền về công tác phòng ngừa, đấu tranh với hoạt động vận chuyển trái phép vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm qua đường hàng không. Chỉ đạo các đơn vị chức năng phối hợp chặt chẽ với lực lượng Công an trong xác thực các tài khoản trên mạng xã hội, chuẩn hoá thông tin thuê bao (SIM điện thoại) với Cơ sở dữ liệu quốc gia về dân cư và công tác bảo đảm an ninh thông tin, đấu tranh phòng, chống tội phạm, vi phạm pháp luật nói chung và phòng ngừa, ngăn chặn hoạt động mua bán vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm trên không gian mạng nói riêng. Nghiên cứu tham mưu đề xuất sửa đổi, bổ sung Luật Bưu chính theo hướng quy định rõ trách nhiệm của doanh nghiệp bưu chính và người sử dụng dịch vụ bưu chính trong quá trình nhận, gửi hàng hóa nhằm phòng ngừa hành vi lợi dụng dịch vụ bưu chính để vận chuyển trái phép vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm.

7. Sở Ngoại giao phối hợp các cơ quan đại diện Việt Nam ở nước ngoài nắm tình hình công dân Việt Nam ở nước ngoài và kịp thời thông tin về tình hình tội phạm xuyên quốc gia; đẩy mạnh tuyên truyền nâng cao ý thức chấp hành pháp luật của cộng đồng người Việt Nam ở nước ngoài, vận động người dân tích cực tham gia tố giác tội phạm, vi phạm pháp luật liên quan đến vận chuyển trái phép vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm qua đường hàng không.

8. Sở Tư pháp tăng cường công tác phổ biến, giáo dục pháp luật về phòng, chống tội phạm ma túy, tội phạm, vi phạm pháp luật về vũ khí, vật liệu nổ, công cụ hỗ trợ, hàng cấm. Phối hợp Công an tỉnh và các sở, ngành, địa phương liên quan rà soát, tham mưu đề xuất xây dựng, hoàn thiện hệ thống pháp luật liên quan đến phòng, chống hoạt động vận chuyển trái phép vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm qua đường hàng không.

9. Đài Phát thanh và Truyền hình tỉnh tăng cường tuyên truyền về công tác phòng ngừa, đấu tranh, ngăn chặn hoạt động vận chuyển trái phép vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm qua đường hàng không, bảo đảm đa dạng về nội dung, phong phú về hình thức, góp phần nâng cao nhận thức của mọi tầng lớp Nhân dân và tạo sự lan toả trong xã hội.

10. Viện kiểm sát nhân dân tỉnh, Tòa án nhân dân tỉnh chỉ đạo Viện kiểm sát, Tòa án nhân dân các cấp phối hợp chặt chẽ với cơ quan điều tra, cơ quan được giao nhiệm vụ tiến hành một số hoạt động điều tra đẩy nhanh tiến độ điều tra, truy tố, xét xử các vụ án liên quan đến hoạt động vận chuyển trái phép vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm qua đường hàng không; lựa chọn một số vụ án điểm, dư luận xã hội quan tâm để kịp thời đưa ra xét xử, góp phần làm tốt công tác tuyên truyền, răn đe tội phạm và phòng ngừa chung.

11. Ủy ban Mặt trận Tổ quốc Việt Nam tỉnh và các tổ chức thành viên chỉ đạo tăng cường công tác tuyên truyền, vận động nhân dân, cán bộ, hội viên, đoàn viên, công nhân lao động,… tích cực tham gia phòng, chống hoạt động vận chuyển trái phép vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm qua đường hàng không và thực hiện nghiêm túc các quy định bảo đảm an ninh, an toàn hàng không, an ninh, trật tự tại cửa khẩu đường hàng không.

12. Ủy ban nhân dân các huyện, thị xã, thành phố Huế chỉ đạo các cơ quan, đơn vị chức năng:

- Đặc biệt coi trọng công tác phòng ngừa tội phạm. Đẩy mạnh công tác thông tin tuyên truyền bằng nhiều hình thức, đa dạng, phong phú, phản ánh khách quan, toàn diện công tác phòng, chống tội phạm ma túy, tội phạm, vi phạm pháp luật về vũ khí, vật liệu nổ, công cụ hỗ trợ, hàng cấm, công tác bảo đảm an ninh, an toàn hàng không,…

- Tăng cường hiệu lực quản lý nhà nước về an ninh, trật tự, an ninh mạng, bưu chính,… Tích cực phối hợp với các sở, ngành và các cơ quan, doanh nghiệp hoạt động trên lĩnh vực hàng không đóng tại địa bàn triển khai hiệu quả, đồng bộ các biện pháp bảo đảm an ninh hàng không; nghiên cứu xây dựng và tổ chức thực hiện tốt các cơ chế phối hợp trong bảo đảm an ninh trật tự, an ninh, an toàn hàng không, gắn với bảo đảm an toàn, an ninh trong cung ứng và sử dụng dịch vụ bưu chính.

- Chủ động nhận diện, đánh giá, dự báo tình hình; nâng cao chất lượng, hiệu quả công tác phòng ngừa nghiệp vụ, đảm bảo thực chất, trọng tâm, trọng điểm; tích cực tấn công trấn áp tội phạm ma túy, tội phạm, vi phạm pháp luật về vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm qua đường hàng không, tạo môi trường xã hội trật tự, kỷ cương, an toàn, lành mạnh; xây dựng và phát huy hiệu quả các Tổ công tác tuần tra, kiểm soát công khai, qua đó chủ động phát hiện, đấu tranh, ngăn chặn hiệu quả các loại tội phạm, vi phạm pháp luật hoạt động trên tuyến giao thông, góp phần phòng ngừa, ngăn chặn hoạt động vận chuyển trái phép vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm qua đường hàng không.

- Rà soát, đề xuất hoàn thiện cơ chế, chính sách, pháp luật nhằm bảo đảm chặt chẽ, không để các đối tượng lợi dụng hoạt động vận chuyển trái phép vũ khí, vật liệu nổ, công cụ hỗ trợ, ma túy, hàng cấm qua đường hàng không.

III. TỔ CHỨC THỰC HIỆN

1. Căn cứ Kế hoạch này, các sở, ban, ngành, đoàn thể cấp tỉnh; các cơ quan Trung ương đóng trên địa bàn; UBND các huyện, thị xã thành phố Huế xây dựng kế hoạch hoặc ban hành văn bản triển khai thực hiện với những nhiệm vụ, hoạt động cụ thể, đảm bảo mục tiêu, yêu cầu đề ra; gửi kế hoạch hoặc văn bản triển khai thực hiện về Công an tỉnh - Cơ quan Thường trực Ban Chỉ đạo 138 tỉnh (số 27 đường Trần Cao Vân, TP Huế; SĐT: 069.414.9315) trước ngày 30/7/2023 để tập hợp, theo dõi.

2. Giao Công an tỉnh - Cơ quan Thường trực Ban Chỉ đạo 138 tỉnh có trách nhiệm giúp UBND tỉnh theo dõi, đôn đốc và xây dựng kế hoạch nắm, kiểm tra việc triển khai, thực hiện của các sở, ban, ngành, cơ quan, tổ chức, và các địa phương; định kỳ sơ, tổng kết theo quy định./.

 

 

Nơi nhận:
- Ban Chỉ đạo 138 Trung ương (qua V01-BCA);
- Thường trực Tỉnh ủy;
- CT và các PCT UBND tỉnh;
- Các sở, ban, ngành, đoàn thể cấp tỉnh;
- Các cơ quan Trung ương đóng trên địa bàn tỉnh;
- Cảng hàng không quốc tế Phú Bài;
- UBND các huyện, TX và TP Huế;
- VPUB: CVP và PCVP UBND tỉnh;
- Lưu: VT, VPTT, TĐKT.

TM. ỦY BAN NHÂN DÂN
KT. CHỦ TỊCH
PHÓ CHỦ TỊCH




Nguyễn Thanh Bình

 



lồng nhau (bên trong) hay không const memberID = 0; const vbID = '135488bcb644c8dff44ce273637a32d1'; // 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 console.log('Tiện ích loaded - memberID:', memberID, 'vbID:', vbID); 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) { console.error('Lỗi processVisibleParagraphs:', e); } } $(window).on('scroll resize', function () { processVisibleParagraphs(); }); console.log('Bắt đầu processVisibleParagraphs lần đầu...'); processVisibleParagraphs(); console.log('processVisibleParagraphs lần đầu hoàn thành'); // Chức năng phân tích điều luật (chỉ cho member_id = 4) if (memberID === 4) { // 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, '
      $1
    '); // 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 console.log('ℹ️ CTTD pointer is visible, keeping rightdocinfo hidden'); } else { // KHÔNG có CTTD → SHOW lại rightdocinfo const $rightdocinfo = $('#rightdocinfo'); if ($rightdocinfo.length > 0) { $rightdocinfo.show(); console.log('✅ Showing rightdocinfo back (no CTTD pointer)'); } } // Reset state isAnalyzing = false; currentAnalyzingAddress = null; currentAnalyzingElement = null; currentAnalyzingBadge = null; isPanelOpen = false; // Đánh dấu panel đã đóng console.log('✅ Panel closed, state reset, isPanelOpen = false'); } // Panel đã song song với rightdocinfo → không cần MutationObserver nữa console.log('✅ Panel running in standalone mode (parallel to rightdocinfo)'); // 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(); console.log('✅ Panel dimensions updated on window resize'); } }, 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' }); console.log('✅ Panel dimensions updated:', { width: refWidth + 'px', right: rightPosition + 'px', reference: $reference.attr('id') }); } else { console.warn('⚠️ Could not get dimensions from reference element'); } // Restore trạng thái hidden nếu cần if (wasHidden) { $reference.hide().css('visibility', ''); } } else { console.warn('⚠️ No reference element found for panel dimensions'); } } function openPhanTichPanel(address, vbID) { console.log('openPhanTichPanel called with address:', address); console.log('Current state - isAnalyzing:', isAnalyzing, 'currentAnalyzingAddress:', currentAnalyzingAddress); // Kiểm tra nếu đang phân tích element khác if (isAnalyzing && currentAnalyzingAddress && currentAnalyzingAddress !== address) { const currentName = getElementDisplayName(currentAnalyzingAddress); console.warn('Already analyzing:', currentAnalyzingAddress, 'Cannot analyze:', address); 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) { console.log('Already analyzing this element, ignoring duplicate request'); 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 console.log('Panel opening, CTTD pointer can stay visible'); // ẨN rightdocinfo để tiết kiệm không gian if ($rightdocinfo.length > 0) { $rightdocinfo.hide(); console.log('Hidden rightdocinfo to save space'); } // XÓA highlight persistent của TẤT CẢ elements cũ trước $('#tab_noi_dung_vb .highlight-border-persistent').removeClass('highlight-border-persistent'); console.log('Removed all previous 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; console.log('State set:', { isAnalyzing: isAnalyzing, currentAnalyzingAddress: currentAnalyzingAddress, elementFound: $element.length > 0, badgeFound: $badge.length > 0 }); // 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 console.log('Badge set to analyzing state'); // Đả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 = `
    Phân tích điều luật
    Đ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; console.log('✅ Panel opened (fixed position), 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; console.log('✅ Panel re-opened (fixed position), 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'); console.log('🔄 Refresh: Phân tích lại address:', address); // 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) { console.log('✅ Cache deleted, now re-analyzing...'); // 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 { console.error('❌ Failed to delete cache'); $('#phanTichPanelBody').html(` `); $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) { console.log('Analysis complete for:', address, 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); console.log('Badge reset to normal state'); } // Reset state analyzing để có thể phân tích element khác isAnalyzing = false; console.log('State reset: isAnalyzing = false, can analyze other elements now'); if (response.ok) { // Render kết quả phân tích let html = ''; html += '
    '; html += '
    ' + escapeHtml(response.ten_van_ban) + '
    '; if (response.so_hieu) { html += 'Số hiệu: ' + escapeHtml(response.so_hieu) + '
    '; } html += 'Đ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(` `); } if (callback) callback(); }, error: function(xhr, status, error) { console.error('Analysis error:', 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(` `); 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) { console.log('Delete cache response:', response); if (callback) callback(response.ok || false); }, error: function(xhr, status, error) { console.error('Delete cache error:', 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 = ` `; $('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) + '
    '; if (response.so_hieu) { html += 'Số hiệu: ' + escapeHtml(response.so_hieu) + '
    '; } html += 'Đ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(` `); } }, error: function(xhr, status, error) { let errorMsg = error; if (xhr.responseJSON && xhr.responseJSON.error) { errorMsg = xhr.responseJSON.error; } $('#modalPhanTichBody').html(` `); } }); } // 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) { console.warn('No badge found for parent:', parentAddress); 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 }); console.log('Showing badge for:', parentAddress, 'at position:', $badge.css('top'), $badge.css('left')); $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 console.log('Hover changed to:', address); // 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'); console.log('Creating badge for address:', address, 'parentType:', parentType); $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'}); } }); console.log('Mouse left tab_noi_dung_vb, hiding all badges'); } }, 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')) { console.log('Badge is analyzing, keep visible'); 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')) { console.log('Badge is analyzing on mouseleave, keep visible'); 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); console.log('Badge clicked! Element:', $badge[0]); console.log('Badge parent:', $badge.parent().prop('tagName'), $badge.parent().attr('address')); console.log('Badge data-for:', $badge.attr('data-for')); console.log('Badge data-parent-type:', $badge.attr('data-parent-type')); // Nếu badge đang analyzing thì không cho click if ($badge.hasClass('analyzing') || $badge.data('analyzing')) { console.log('Badge is analyzing, click ignored'); return; } // Lấy address từ data-for attribute const address = $badge.attr('data-for'); console.log('Will analyze address:', address, 'vbID:', vbID); if (address && vbID) { openPhanTichPanel(address, vbID); } else { console.error('Missing address or vbID', {address, vbID}); 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) { console.log('CTTD clicked'); // Ẩ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'}); console.log('Hiding badge:', $badge.attr('data-for')); } }); }); // 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); } });