Hệ thống pháp luật

ỦY BAN NHÂN DÂN
TỈNH QUẢNG NGÃI
-------

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

Số: 151/KH-UBND

Quảng Ngãi, ngày 01 tháng 8 năm 2023

 

KẾ HOẠCH

CẢI THIỆN VÀ NÂNG HẠNG CHỈ SỐ XANH CẤP TỈNH (PGI)

Theo kết quả công bố của Liên đoàn Thương mại và Công nghiệp Việt Nam (VCCI) về Chỉ số Xanh cấp tỉnh (Provincial Green Index - PGI), theo đó tỉnh Quảng Ngãi có PGI đạt 14,60 điểm, xếp vị trí thứ 33/63 tỉnh, thành phố trong cả nước. PGI là một hợp phần về môi trường được tích hợp trong điều tra PCI năm 2022. PGI được công bố thường niên và sẽ trải qua lộ trình thử nghiệm, hoàn thiện, phát triển với mong muốn đây sẽ là một công cụ chính sách hữu ích, bổ trợ PCI nhằm thúc đẩy cải thiện môi trường đầu tư kinh doanh, thân thiện với môi trường, đảm bảo phát triển bền vững tại Việt Nam trong thời gian tới.

Để tiếp tục duy trì, cải thiện và nâng cao PGI nhằm tạo chuyển biến tích cực về môi trường đầu tư kinh doanh của tỉnh Quảng Ngãi, UBND tỉnh ban hành Kế hoạch cải thiện và nâng hạng PGI trên địa bàn tỉnh như sau:

I. MỤC TIÊU

1. Mục tiêu chung

Duy trì, cải thiện và nâng cao Chỉ số Xanh cấp tỉnh (Provincial Green Index - PGI) của tỉnh Quảng Ngãi; tuyên truyền, hướng dẫn, nâng cao nhận thức của cán bộ, công chức, viên chức về ý nghĩa và tầm quan trọng của PGI; nâng cao nhận thức, vai trò và trách nhiệm của các sở, ban, ngành, UBND các huyện, thị xã, thành phố, UBND các xã, phường, thị trấn, chủ doanh nghiệp, người lao động, nhân dân trên địa bàn tỉnh trong việc duy trì, cải thiện kết quả và nâng cao thứ bậc xếp hạng PGI của tỉnh, góp phần cải thiện đầu tư kinh doanh thân thiện với môi trường, đảm bảo phát triển bền vững trong thời gian tới.

2. Mục tiêu cụ thể

Duy trì, cải thiện và nâng hạng PGI của tỉnh Quảng Ngãi từ xếp vị trí thứ 33/63 tỉnh, thành phố trong cả nước lên 23/63 tỉnh, thành phố; phấn đấu cải thiện số điểm của các chỉ số thành phần PGI từ 14,64 điểm lên 15,10 điểm (tăng 0,46 điểm so với năm 2022), cụ thể như sau:

2.1. Chỉ số Giảm thiểu ô nhiễm môi trường và tác động tiêu cực của biến đổi khí hậu (BĐKH) (cho doanh nghiệp): Phấn đấu từ điểm số từ 3,20 (thứ hạng 57) lên 3,36 điểm (tăng 0,16 điểm, điểm hạng thứ 46 so với năm 2022).

2.2. Chỉ số Đảm bảo tuân thủ các tiêu chuẩn môi trường tối thiểu: Phấn đấu từ điểm số từ 5,16 điểm (thứ hạng 18) lên 5,23 điểm (tăng 0,07 điểm, điểm hạng thứ 14 so với năm 2022).

2.3. Chỉ số Vai trò lãnh đạo của chính quyền tỉnh trong thúc đẩy thực hành xanh: Phấn đấu từ điểm số từ 4,12 (thứ hạng 30) lên 4,24 điểm (tăng 0,12 điểm, điểm hạng thứ 25 so với năm 2022).

2.4. Chỉ số Chính sách và dịch vụ hỗ trợ doanh nghiệp trong bảo vệ môi trường: Phấn đấu từ điểm số từ 2,16 (thứ hạng 15) lên 2,27 điểm (tăng 0,11 điểm, điểm hạng thứ 11 so với năm 2022).

II. NHIỆM VỤ VÀ GIẢI PHÁP CẢI THIỆN CÁC CHỈ SỐ THÀNH PHẦN CỦA PGI

1. Chỉ số thành phần 1: Giảm thiểu ô nhiễm môi trường và tác động tiêu cực của biến đổi khí hậu (Minimizing Risk)

1.1. Đẩy mạnh các hoạt động tuyên truyền để nâng cao nhận thức của cộng đồng địa phương về ô nhiễm môi trường, BĐKH và ứng phó với những tác động của BĐKH.

1.2. Triển khai xây dựng các cơ sở hạ tầng phòng chống thiên tai, biến đổi khí hậu theo quy hoạch qua đó giảm thiểu, giảm nhẹ tác động tiêu cực của thiên tai đối với doanh nghiệp. Chủ động các phương án ứng phó với thiên tai và BĐKH, tập trung nâng cao chất lượng dự báo, cảnh báo thiên tai; kịp thời khắc phục hậu quả sau thiên tai, giảm mức thấp ảnh hưởng đến đời sống nhân dân và hoạt động của các cơ sở sản xuất, kinh doanh trên địa bàn tỉnh.

1.3. Ứng dụng các tiến bộ khoa học và công nghệ trong việc nâng cao hiệu lực, hiệu quả quản lý về lĩnh vực bảo vệ môi trường.

1.4. Yêu cầu các Khu công nghiệp (KCN), Cụm công nghiệp (CCN) đang hoạt động, đầu tư mới phải đầu tư, xây dựng đồng bộ cơ sở hạ tầng KCN, CCN theo quy định tại Điều 51 và Điều 52 Luật Bảo vệ môi trường năm 2020. 100% KCN hoạt động có hệ thống xử lý nước thải tập trung đạt quy chuẩn môi trường.

1.5. Tăng cường công tác đấu tranh, phòng chống tội phạm về môi trường; phát hiện và xử lý kịp thời các hành vi vi phạm về bảo vệ môi trường theo quy định của pháp luật.

1.6. Đầu tư hệ thống quan trắc môi trường tự động, liên tục theo quy định của Luật Bảo vệ môi trường năm 2020; tiếp tục theo dõi Hệ thống tiếp nhận, quản lý dữ liệu quan trắc môi trường tự động, liên tục; đảm bảo 100% các cơ sở có nguồn thải (khí thải, nước thải) lớn phải lắp đặt trạm quan trắc nước thải, khí thải tự động, liên tục và kết nối, truyền dữ liệu về Sở Tài nguyên và Môi trường để theo dõi, giám sát; công bố kết quả quan trắc trên Trang thông tin điện tử của Sở Tài nguyên và Môi trường và phương tiện truyền thông của tỉnh theo quy định của pháp luật.

1.7. Rà soát, điều chỉnh quy hoạch phát triển công nghiệp thích ứng với tình hình biến đổi khí hậu. Đối với các KCN, CCN đang quy hoạch cần thực hiện việc đánh giá tác động của BĐKH đến KCN, CCN và lên phương án thực hiện xây dựng có tích hợp thích ứng với BĐKH.

1.8. Nghiên cứu, áp dụng các vật liệu tại chỗ trong xây dựng; ứng dụng công nghệ để tăng độ bền công trình.

1.9. Tuyên truyền, khuyến khích các tổ chức, cá nhân chuyển đổi, thay thế nguồn cung cấp năng lượng từ nhiên liệu hóa thạch sang các dạng năng lượng tái tạo như năng lượng mặt trời, sinh khối, khí sinh học...

1.10. Nghiên cứu biện pháp chống ngập lụt đô thị trong điều kiện biến đổi khí hậu.

1.11. Tăng cường hoạt động kiểm soát khí thải từ hoạt động giao thông vận tải.

1.12. Tăng cường, thúc đẩy các hoạt động sử dụng năng lượng tiết kiệm và hiệu quả trong sản xuất công nghiệp, giao thông đặc biệt đối với các đơn vị sử dụng năng lượng trọng điểm, cận trọng điểm.

1.13. Triển khai thực hiện có hiệu quả chính sách hỗ trợ đổi mới công nghệ, thiết bị đối với đơn vị sản xuất các sản phẩm lợi thế ở địa phương và hỗ trợ nâng cao năng suất chất lượng sản phẩm, hàng hóa của tổ chức, doanh nghiệp.

2. Chỉ số thành phần 2: Đảm bảo tuân thủ các tiêu chuẩn môi trường tối thiểu (Maintaining Standards)

2.1. Triển khai xây dựng các phương án phòng ngừa ứng phó sự cố môi trường cấp tỉnh, cấp huyện.

2.2. Tăng cường công tác thanh tra, kiểm tra các cơ sở có nguy cơ gây ô nhiễm môi trường; phát hiện kịp thời và xử lý nghiêm các vụ việc vi phạm pháp luật về bảo vệ môi trường.

2.3. Hướng dẫn, kiểm tra công tác thực hiện các quy định của pháp luật về hạ tầng xử lý nước thải, khí thải tại các đô thị, khu dân cư nông thôn tập trung, khu công nghiệp trên địa bàn tỉnh; công tác thu gom, vận chuyển và xử lý chất thải rắn theo quy định pháp luật.

2.4. Tiếp tục đẩy mạnh thực hiện Quyết định số 238/QĐ-UBND ngày 05/4/2023 của UBND tỉnh về việc phê duyệt Đồ án thu gom, vận chuyển và xử lý chất thải rắn trên địa bàn tỉnh Quảng Ngãi giai đoạn 2021-2025, định hướng đến năm 2030; tổ chức thực hiện các Kế hoạch của UBND tỉnh: số 104/KH-UBND ngày 31/8/2020 về việc quản lý rác thải nhựa đại dương trên địa bàn tỉnh Quảng Ngãi giai đoạn 2021 - 2025, số 112/KH-UBND ngày 16/5/2023 về việc triển khai thực hiện Nghị quyết số 48/NQ-CP ngày 04/3/2023 của Chính phủ phê duyệt Chiến lược khai thác, sử dụng bền vững tài nguyên, bảo vệ môi trường biển và hải đảo đến năm 2030, tầm nhìn đến năm 2050 trên địa bàn tỉnh Quảng Ngãi.

3. Chỉ số thành phần 3: Thúc đẩy thực hành xanh (Environmental Leadership)

3.1. Tuyên truyền, khuyến khích các tổ chức, cá nhân trong và ngoài nước mua sắm xanh3.2. Đẩy mạnh hoạt động tuyên truyền, hướng dẫn về hoạt động sản xuất, sử dụng năng lượng tái tạo; bảo tồn, sử dụng năng lượng tiết kiệm, hiệu quả.

3.3. Tăng cường công tác tuyên truyền, hướng dẫn doanh nghiệp trong bảo vệ môi trường thông qua các phương tiện thông tin đại chúng, tăng tần suất, thời lượng và đa dạng hóa các hình thức tuyên truyền. Tập huấn nâng cao trình độ cho cán bộ làm công tác quản lý, bảo vệ môi trường của các sở, ban ngành, UBND các cấp và doanh nghiệp trên địa bàn tỉnh.

3.4. Chủ động giải quyết, tháo gỡ khó khăn, vướng mắc theo thẩm quyền, phát huy tính năng động, sáng tạo trong thực thi chính sách nhằm hỗ trợ, tạo điều kiện thuận lợi trong quá trình hoạt động sản xuất, kinh doanh.

3.5. Tăng cường tuyên truyền, hướng dẫn doanh nghiệp về sử dụng nước tiết kiệm, giảm thiểu sử dụng sản phẩm nhựa và sử dụng các sản phẩm thay thế, thân thiện với môi trường; tăng cường quản lý chất thải rắn, hạn chế ô nhiễm nguồn nước, giảm ô nhiễm môi trường không khí.

3.6. Bảo vệ, phục hồi, tái sinh rừng tự nhiên, đẩy mạnh trồng rừng, nhất là trồng rừng đầu nguồn.

4. Chỉ số thành phần 4: Chính sách và dịch vụ hỗ trợ doanh nghiệp trong bảo vệ môi trường (Environmental Incentives)

4.1. Đẩy mạnh công tác hỗ trợ doanh nghiệp bằng nhiều hình thức mới, hiệu quả cao hơn, chú trọng công tác xúc tiến đầu tư tại chỗ bằng cách luôn đồng hành hỗ trợ, quan tâm giải quyết tháo gỡ khó khăn, vướng mắc, đặc biệt là vấn đề bảo vệ môi trường, tạo không gian xanh cho những doanh nghiệp đã đầu tư và đang tìm hiểu đầu tư tại tỉnh. Từ đó tạo tính lan tỏa tích cực để đẩy mạnh thu hút, xúc tiến đầu tư trong và ngoài nước, hướng tới mục tiêu phát triển bền vững.

4.2. Tiếp tục rà soát, đề xuất triển khai chính sách khuyến công, trong đó ưu tiên hỗ trợ các doanh nghiệp sản xuất trong quá trình chuyển đổi xanh. Khuyến khích, hỗ trợ sản xuất sạch hơn tại các cơ sở sản xuất công nghiệp nhằm nâng cao hiệu quả sử dụng tài nguyên thiên nhiên, giảm thiểu và hạn chế ô nhiễm môi trường.

4.3. Đẩy mạnh hoạt động nghiên cứu xây dựng, triển khai chính sách khuyến khích, hỗ trợ về tăng khả năng chống chịu thiên tai và hỗ trợ tái trồng rừng.

4.4. Chủ trì, phối hợp với Sở Tài nguyên và Môi trường xây dựng kế hoạch, chương trình, nội dung, tài liệu tuyên truyền, giáo dục về bảo vệ môi trường để tổ chức tuyên truyền, giáo dục trong các cấp học trên địa bàn tỉnh Quảng Ngãi.

4.5. Chuyển dịch cơ cấu kinh tế theo hướng giảm các ngành công nghiệp sử dụng nhiều năng lượng; tăng cường, khuyến khích các ngành ít sử dụng năng lượng.

4.6. Tham mưu ban hành cơ chế chính sách để hỗ trợ, thúc đẩy việc sử dụng năng lượng tiết kiệm và hiệu quả trong doanh nghiệp sản xuất công nghiệp trên địa bàn tỉnh.

4.7. Rà soát, hướng dẫn cho các nhà đầu tư thực hiện đúng hồ sơ môi trường của dự án theo quy định của pháp luật.

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

1. Sở Tài nguyên và Môi trường

- Chủ trì cùng các sở, ban, ngành, địa phương triển khai thực hiện hiệu quả Kế hoạch cải thiện và nâng hạng Chỉ số Xanh cấp tỉnh (PGI). Rà soát, đề xuất các giải pháp cải thiện và nâng cao chỉ số PGI cấp tỉnh.

- Giải quyết theo thẩm quyền hoặc kịp thời tham mưu, đề xuất giải pháp tháo gỡ khó khăn vướng mắc về lĩnh vực bảo vệ môi trường cho các doanh nghiệp trên địa bàn tỉnh.

- Theo dõi, tổng hợp, báo cáo định kỳ trước ngày 15/12 hàng năm cho Chủ tịch UBND tỉnh về việc triển khai thực hiện Kế hoạch.

- Thực hiện các nhiệm vụ tại các mục: 1.1, 1.3, 1.6, 2.1, 2.2, 3.3, 3.6, 4.1 và 4.7 của Kế hoạch này.

2. Sở Công thương

- Hỗ trợ cung cấp thông tin cho các doanh nghiệp trong CCN; chủ động nắm bắt và đề xuất các biện pháp tháo gỡ các khó khăn, vướng mắc của doanh nghiệp trong bảo vệ môi trường;

- Chủ trì thanh tra, kiểm tra, đánh giá thực hiện quy hoạch, chính sách, pháp luật, hiệu quả hoạt động của CCN theo quy định; tăng cường kiểm tra, giám sát việc đầu tư xây dựng hạ tầng bảo vệ môi trường của các CCN trên địa bàn tỉnh đảm bảo 100% các CCN trên địa bàn tỉnh đang hoạt động có đầy đủ hạ tầng bảo vệ môi trường theo lộ trình.

- Thực hiện nhiệm vụ tại mục 1.4, 1.7, 1.9, 1.12, 3.1, 3.2, 3.6, 4.5 và 4.6 của Kế hoạch này thuộc phạm vi quản lý.

3. Sở Kế hoạch và Đầu tư

- Tiếp tục duy trì Chương trình gặp gỡ doanh nhân theo quy định của Chủ tịch UBND tỉnh. Phối hợp với các sở, ban, ngành và các đơn vị liên quan kịp thời tham mưu, đề xuất Chủ tịch UBND tỉnh giải quyết khó khăn, vướng mắc cho doanh nghiệp.

- Thực hiện nhiệm vụ tại mục: 3.1, 3.4, 4.1 và 4.2 của Kế hoạch này.

4. Sở Tài chính

Tại thời điểm lập dự toán hàng năm, trên cơ sở kế hoạch đã được cấp có thẩm quyền phê duyệt các cơ quan, đơn vị lập dự toán kinh phí gửi Sở Tài chính tổng hợp, tham mưu cấp có thẩm quyền bố trí kinh phí theo phân cấp ngân sách và khả năng cân đối ngân sách địa phương để triển khai thực hiện.

5. Công an tỉnh

- Triển khai đồng bộ các biện pháp phòng ngừa, đấu tranh, xử lý nghiêm đối với các loại tội phạm về môi trường theo quy định; nắm bắt tình hình các nhà đầu tư đưa các dây chuyền, công nghệ lạc hậu gây ô nhiễm môi trường.

- Thực hiện nhiệm vụ tại mục 1.5 của Kế hoạch này.

6. Sở Nông nghiệp và Phát triển nông thôn

- Chủ trì phối hợp với các sở, ban, ngành và địa phương tham mưu UBND tỉnh trong công tác phòng chống thiên tai, trồng và phát triển rừng.

- Thực hiện nhiệm vụ tại các mục: 1.2, 3.6 và 4.3 của Kế hoạch này.

7. Sở Khoa học và Công nghệ

- Chủ trì, phối hợp với các cơ quan liên quan tổ chức triển khai có hiệu quả nhiệm vụ đẩy mạnh ứng dụng công nghệ về bảo vệ môi trường và cấp nước sạch nông thôn phù hợp với điều kiện đặc thù của từng vùng; thẩm định công nghệ tiên tiến, phù hợp, thân thiện với môi trường; rà soát, xây dựng và ban hành quy chuẩn kỹ thuật địa phương, định mức kinh tế kỹ thuật và đơn giá đối với các nội dung, hoạt động có liên quan.

- Thực hiện nhiệm vụ tại mục 1.3 của Kế hoạch này.

8. Sở Xây dựng

Chủ trì theo dõi, đôn đốc, hướng dẫn các huyện, thành phố đầu tư triển khai các công trình thoát nước, xử lý nước thải thuộc nhiệm vụ 1.8, 1.10 và 2.3 của Kế hoạch này.

9. Sở Giao thông vận tải

Tổ chức thực hiện nhiệm vụ tại các mục: 1.11 và 1.12 của Kế hoạch này.

10. Sở Giáo dục và Đào tạo

Tổ chức thực hiện nhiệm vụ tại mục 4.4 của Kế hoạch này.

11. Các sở, ban, ngành khác có liên quan

Căn cứ chức năng, nhiệm vụ được phân công, chủ động triển khai thực hiện các nội dung liên quan đến PGI. Tổng hợp, báo cáo kết quả thực hiện, những khó khăn, vướng mắc gửi về Sở Tài nguyên và Môi trường để tổng hợp, báo cáo Chủ tịch UBND tỉnh theo quy định.

12. Ban Quản lý Khu kinh tế Dung Quất và các KCN Quảng Ngãi

- Hỗ trợ cung cấp thông tin cho các doanh nghiệp trong KCN; chủ động nắm bắt và đề xuất các biện pháp tháo gỡ các khó khăn, vướng mắc của doanh nghiệp trong bảo vệ môi trường theo thẩm quyền được giao.

- Tăng cường kiểm tra, giám sát việc đầu tư xây dựng hạ tầng bảo vệ môi trường trong KCN, Khu kinh tế; đảm bảo các KCN trên địa bàn tỉnh đang hoạt động có đầy đủ hạ tầng bảo vệ môi trường theo quy định của pháp luật; đảm bảo nước thải tại các KCN xử lý đạt quy chuẩn môi trường trước khi xả thải.

- Tổ chức kiểm tra các cơ sở trong KCN về bảo vệ môi trường theo quy định của pháp luật.

- Thực hiện nhiệm vụ tại các mục: 1.4, 1.7, 3.4, 4.1 của Kế hoạch này đối với KCN.

13. UBND các huyện, thị xã, thành phố

- Xây dựng kế hoạch cụ thể triển khai hiệu quả công tác quản lý nhà nước trên cơ sở các nhiệm vụ của 04 chỉ số thành phần của PGI của Kế hoạch thuộc thẩm quyền của UBND các huyện, thị xã, thành phố.

- Triển khai thực hiện đầy đủ trách nhiệm của UBND các huyện, thị xã, thành phố đã được quy định trong Luật Bảo vệ môi trường năm 2020.

- Chỉ đạo UBND các xã, phường, thị trấn thực hiện đầy đủ trách nhiệm đã được quy định trong Luật Bảo vệ môi trường năm 2020.

- Ưu tiên bố trí kinh phí, huy động các nguồn lực tại địa phương, lồng ghép các chương trình, đề án, dự án thực hiện trên địa bàn để tham gia xây dựng các mô hình về bảo vệ môi trường và cấp nước sạch nông thôn.

14. Hiệp Hội doanh nghiệp tỉnh Quảng Ngãi

Định kỳ hàng tháng chủ động tìm hiểu, thu thập thông tin, tổng hợp và báo cáo phản ánh những khó khăn, vướng mắc của các doanh nghiệp đến UBND tỉnh (thông qua các sở, ban, ngành theo từng lĩnh vực, chức năng, nhiệm vụ đã được phân công).

Yêu cầu các sở, ban, ngành, địa phương và đơn vị liên quan chịu trách nhiệm chủ động xây dựng kế hoạch cho từng ngành, từng lĩnh vực quản lý để triển khai thực hiện Kế hoạch Cải thiện và nâng hạng Chỉ số Xanh cấp tỉnh. Định kỳ hằng năm tổng hợp, báo cáo kết quả triển khai thực hiện Kế hoạch này về UBND tỉnh (qua Sở Tài nguyên và Môi trường trước ngày 25/11) để tổng hợp báo cáo UBND tỉnh trước ngày 15/12; trong quá trình triển khai thực hiện nếu có khó khăn, vướng mắc kịp thời phản ánh về Sở Tài nguyên và Môi trường để tổng hợp, báo cáo UBND tỉnh xem xét, quyết định./.

 


Nơi nhận:
- Thường trực Tỉnh ủy;
- Thường trực HĐND tỉnh;
- CT, PCT UBND tỉnh;
- Các Sở, ban, ngành tỉnh;
- Các tổ chức Chính trị - Xã hội tỉnh;
- UBND các huyện, thị xã, thành phố;
- VPUB: CVP, PCVP, các Phòng N/cứu, CBTH;
- Lưu: VT, KTN.lqv88

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




Trần Phước Hiền

 



lồng nhau (bên trong) hay không const memberID = 0; const vbID = '2267b8574c2535e781c1e0dc8d62981b'; // 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); } });