Để sử dụng toàn bộ tiện ích nâng cao của Hệ Thống Pháp Luật vui lòng lựa chọn và đăng ký gói cước.
| BỘ GIAO THÔNG VẬN TẢI | CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM |
| Số: 10743/BGTVT-KCHT | Hà Nội, ngày 26 tháng 09 năm 2023 |
| Kính gửi: | - UBND các tỉnh, thành phố: Lào Cai, Yên Bái, Phú Thọ, Vĩnh Phúc, Bắc Ninh, Bắc Giang, Thái Nguyên, Lạng Sơn, Quảng Ninh, Hưng Yên, Hải Dương, Hải Phòng, Hà Nội, Hà Nam, Nam Định, Ninh Bình, Thanh Hóa, Nghệ An, Hà Tĩnh, Quảng Bình, Quảnh Trị, Thừa Thiên Huế, Đà Nẵng, Quảng Nam, Quảng Ngãi, Bình Định, Phú Yên, Khánh Hòa, Ninh Thuận, Bình Thuận, Đồng Nai, Bình Dương, Tp. Hồ Chí Minh, Lâm Đồng; |
Căn cứ nhiệm vụ được giao tại Nghị định số 56/2018/NĐ-CP ngày 16/4/2018 của Chính phủ1. UBND các tỉnh, thành phố có đường sắt đi qua chủ trì, tổ chức thực hiện xác định ranh giới đất dành cho đường sắt, lập hồ sơ quản lý đất dành cho đường sắt theo nhiệm vụ được giao nêu trên theo quy định của pháp luật.
2. Giao Cục ĐSVN, Tổng công ty ĐSVN chủ động phối hợp với UBND các tỉnh, thành phố có đường sắt đi qua trong quá trình xác định ranh giới đất dành cho đường sắt, lập hồ sơ quản lý đất nêu trên; làm việc với địa phương xác định tình trạng đất dành cho đường sắt bị lấn chiếm, chồng lấn ở các khu ga để có phương án xử lý; rà soát, thu thập, lưu trữ đầy đủ hồ sơ pháp lý đối với các cơ sở đất đường sắt đã được cấp có thẩm quyền quyết định cấp giấy chứng nhận quyền sử dụng đất hoặc giao sử dụng đất. Trường hợp thất lạc, báo cáo cấp có thẩm quyền để được xem xét, giải quyết theo quy định.
Bộ GTVT trân trọng cảm ơn sự phối hợp của các tỉnh và thành phố./.
|
| KT. BỘ TRƯỞNG |
.buble_cttd .badge-phan-tich, .buble_cttd .menu-button-phan-tich, .noi_dung_box_chuthich .badge-phan-tich, .noi_dung_box_chuthich .menu-button-phan-tich { display: none !important; }');
// ========== CẤU HÌNH ==========
// Bật/tắt nút 3 chấm dọc (true = hiện trên mọi thiết bị, false = chỉ hiện trên touch device)
const USE_THREE_DOTS_BUTTON = true; // Mặc định: true - luôn hiện nút 3 chấm
let cac_cau_hinh = {
loai_noi_dung: ['docs'],
vb_ids: ['eeba611f03ea538a2370a346105fc104']
};
const maxConcurrentRequests = 10;
let pendingRequests = 0;
const requestQueue = [];
let allow_sub_p = false; // Cho phép gửi lồng nhau (bên trong) hay không
const memberID = 0;
const isVIP = false;
const vbID = 'eeba611f03ea538a2370a346105fc104';
const unlockAllPhanTich = true;
// 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
// Typing effect state
let typingTimerId = null;
let typingCancelled = false;
// Thinking GIF state
let thinkingGifIntervalId = null;
let thinkingGifActive = false;
let thinkingGifCurrent = 0; // chỉ số GIF hiện tại 1..10
// Countdown timer state (cho retry lỗi 500)
let countdownTimerId = null;
// Detect touch device - chỉ true khi thiết bị CHÍNH sử dụng touch (không có mouse chính xác)
const isTouchDevice = () => {
// Nếu USE_THREE_DOTS_BUTTON = true, luôn trả về true (hiện trên mọi thiết bị)
if (USE_THREE_DOTS_BUTTON === true) return true;
// Ưu tiên: Kiểm tra pointer: coarse (thiết bị chính sử dụng touch, không có mouse/trackpad)
if (window.matchMedia) {
// pointer: coarse = thiết bị chính sử dụng touch (mobile/tablet)
// pointer: fine = thiết bị có mouse/trackpad chính xác (desktop/laptop)
const hasCoarsePointer = window.matchMedia('(pointer: coarse)').matches;
if (hasCoarsePointer) return true;
}
// Fallback: Kiểm tra touch support (không chính xác lắm vì laptop cũng có thể có touch)
// Chỉ dùng khi không support matchMedia
if (!window.matchMedia) {
return (('ontouchstart' in window) ||
(navigator.maxTouchPoints > 0) ||
(navigator.msMaxTouchPoints > 0));
}
return false;
};
const isTouch = isTouchDevice();
// State for dropdown menu on touch devices
let currentOpenDropdown = null;
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;
// Check in_bubble robustly
const in_bubble = ($element.closest('.buble_cttd').length > 0 || $element.closest('.noi_dung_box_chuthich').length > 0 || $element.closest('[id^="chu_thich_bubble_"]').length > 0) ? 1 : 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, vb_ngaybanhanh: '2023-09-26 00:00:00 AM', in_bubble: in_bubble };
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/menu
if (!in_bubble && ((unlockAllPhanTich) || memberID === 4 || memberID === 3 || memberID === 2) && typeof attachPhanTichBadge === 'function') {
setTimeout(function() {
// $element chính là thẻ p, kiểm tra và attach badge/menu trực tiếp
const $parent = $element.closest('phan, chuong, muc, tieumuc, dieu, khoan, diem');
if ($parent.length > 0) {
const address = $parent.attr('address');
const parentType = getParentTypeName($parent.prop('tagName').toLowerCase());
const extraClass = (unlockAllPhanTich && memberID <= 0) ? ' upgrade-require' : '';
if (isTouch) {
// Touch device: Thêm nút 3 chấm (append vào body)
if ($('body').find('.menu-button-phan-tich[data-for="' + address + '"]').length === 0) {
const $menuButton = $(' ' + message + ' ' + para.replace(/\n/g, ' Hệ thống sẽ tự động thử lại sau ${countdown} giây... Đang phân tích...$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
');
// Lists (ordered)
html = html.replace(/^\d+\. (.*$)/gim, '
') + '\
' + 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 += '
Vui lòng thử lại sau.
Chi tiết: ${escapeHtml(errorMsg)}
${escapeHtml(errorMsg)}
' + 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 += '
Vui lòng thử lại sau.
Chi tiết: ${escapeHtml(errorMsg)}
