TOUR DU LỊCH

HAY TOUR Mỗi hành trình, một câu chuyện hay
Hành trìnhTrải nghiệmĐiểm đếnChi phíLiên hệTƯ VẤN HÀNH TRÌNH
Hành trìnhTrải nghiệmĐiểm đếnChi phíLiên hệ
Hành trình 16 ngày
Từ thảo nguyên Hô Luân Bối Nhĩ
đến hồ Baikal huyền thoại
Kết hợp tuyến đường sắt xuyên Siberia
20+
năm kinh nghiệm
Thời lượng
16 ngày / 15 đêm
Khởi hành
24/08 – 08/09/2026
Lộ trình chính
Hô Luân Bối Nhĩ → Baikal
Ẩm thực
Ăn 3 bữa / ngày
Bản đồ hành trình
Đường bộ Đường tàu Lượt về
+ − Vừa tuyến
Hồ sơ hành trình
Mức vận động
Vừa phải
Nhịp hành trình
Vừa phải, thong thả
Di chuyển dài nhất
Tàu đêm ~ 9–10 giờ
Khí hậu
8 – 20°C
Tiêu chuẩn lưu trú
4★ địa phương
Nhóm dự kiến
Đoàn nhỏ, HDV theo tuyến
01
Nghi thức "Rượu xuống ngựa" truyền thống của người du mục, đại tiệc sườn cừu nướng tảng bên đống lửa.
02
Cung đường sắt bám sát mép nước hồ Baikal, một trong những tuyến đường sắt được đánh giá đẹp nhất Bắc Á.
03
Trung tâm tâm linh của người Buryat, khám phá bằng xe địa hình UAZ qua vách đá cẩm thạch trắng.
04
Toàn cảnh hồ Baikal từ hệ thống cáp treo, ghé thăm hải cẩu Nerpa nước ngọt quý hiếm.
Mở tất cả
Những điều thú vị trong hành trình
Chi phí hành trình / khách
139.000.000₫Phụ phí phòng đơn 32.000.000₫
Khởi hành 24/08 – 08/09/2026 · gồm vé máy bay quốc tế
Vé máy bay
Visa Nga
KS 4★
Tàu Trans-Sib
Ăn 3 bữa
HDV suốt tuyến
Chi tiết bao gồm / không bao gồm, chính sách thanh toán
| Đặt cọc dịch vụ | 35% tổng giá trị tour |
| Trước khởi hành 45 ngày | 85% tổng giá trị tour |
| Trước khởi hành 15 ngày | 100% tổng giá trị tour |
| Hủy sau khi đặt cọc & đăng ký | Mất cọc |
| Hủy trước khởi hành 45 ngày | 35% giá trị tour |
| Hủy trước khởi hành 15 ngày | 85% giá trị tour |
| Hủy / không có mặt ngày khởi hành | 100% giá trị tour |
Các mốc ngày tính theo ngày làm việc, không gồm Thứ Bảy, Chủ Nhật. Tour bị hủy do sự cố khách quan sẽ được hoàn chi phí tương ứng dịch vụ chưa sử dụng.
Tư vấn hành trình
Sẵn sàng cho hành trình Siberia cùng HAY TOUR?
0913 070 836
Gửi lịch trình qua Zalo
Gửi ngay để chia sẻ cùng người thân
Tư vấn hành trình
Ms. Bảo Huyên — kd11@haytour.com.vn
HAY TOUR — Công ty TNHH TMDV Du Lịch HAY TOUR
432–434 Nguyễn Đình Chiểu, P.Bàn Cờ, Q.3, TP.HCM
haytour.com.vn · kd11@haytour.com.vn
0913 070 836 / 0911 999 317
/* ============ DATA ============ */ const DRV = (id, size = 'w1400') => `https://drive.google.com/thumbnail?id=${id}&sz=${size}`; const itinerary = [ {n:'01', d:'Thứ Hai, 24/08', title:'TP.HCM – Khởi hành', meals:'Ăn tối trên máy bay', stay:'Nghỉ đêm trên máy bay', img:null, p:['Quý khách có mặt tại sân bay, Ga đi Quốc tế Sân bay Tân Sơn Nhất. Hướng dẫn viên HAY TOUR đón và làm thủ tục khởi hành lúc 23:20 đi Hô Luân Bối Nhĩ (Hulunbuir).']}, {n:'02', d:'Thứ Ba, 25/08', title:'Đến với Hô Luân Bối Nhĩ', meals:'Ăn tối', stay:'Nghỉ đêm tại Hải Lạp Nhĩ', img:DRV('1ailsFAekOeQKPpsaK68-_B3RE79NQiNz'), p:['Đến Hulunbuir, xe đưa đoàn nhận phòng, nghỉ ngơi chuẩn bị cho hành trình sắp đến.']}, {n:'03', d:'Thứ Tư, 26/08', title:'Hồ Luân Bối Nhĩ – Hắc Sơn Đầu', meals:'Ăn 3 bữa', stay:'Nghỉ đêm tại Hắc Sơn Đầu', img:DRV('1ailsFAekOeQKPpsaK68-_B3RE79NQiNz'), p:[ 'Sau bữa sáng, xe đưa đoàn qua thảo nguyên bất tận của Hồ Luân Bối Nhĩ, đến với Hắc Sơn Đầu — một trong những vùng đồng cỏ nguyên sơ rộng lớn nhất thế giới, nơi những đàn ngựa thong dong gặm cỏ dưới bầu trời xanh không giới hạn. Ghé thăm bộ tộc du mục còn giữ nguyên lối sống nghìn năm, dự nghi thức "Rượu xuống ngựa", lễ đón khách quý truyền thống với chén rượu sữa ngựa dâng trên khay gỗ chạm khắc.', 'Buổi trưa, Quý khách thưởng thức bữa ăn trong lều Mông Cổ (Ger), món ăn mang hơi ấm thảo nguyên, chế biến theo cách người Buryat và Mông Cổ đã làm suốt bao đời.', 'Khoác trang phục thảo nguyên, Quý khách có 2 giờ thong dong cưỡi ngựa (linh hoạt theo sức khỏe cá nhân), ngắm hoàng hôn nhuộm vàng Hắc Sơn Đầu. Bữa tối là Đại tiệc cừu nướng vàng ruộm, quây quần bên đống lửa giữa cái se lạnh của màn đêm thảo nguyên.' ]}, {n:'04', d:'Thứ Năm, 27/08', title:'Hồ Luân Bối Nhĩ → Mãn Châu Lý', meals:'Ăn 3 bữa', stay:'Nghỉ đêm tại Mãn Châu Lý', img:DRV('1zSeHDn6yqpwDfDRERvcIenOin1IxwGOl'), note:{t:'Bạn có biết? — Mãn Châu Lý, nơi ba dòng văn hóa giao thoa', c:'Là thành phố biên giới tiếp giáp cả Nga và Mông Cổ, Mãn Châu Lý sở hữu dòng chảy văn hóa độc nhất: biển hiệu ba thứ tiếng (Trung – Nga – Mông Cổ), những tòa nhà mái vòm củ hành đặc trưng xứ Bạch Dương bên nét sinh hoạt phóng khoáng của người bản địa.'}, p:[ 'Tạm biệt thảo nguyên, xe đưa đoàn dọc vùng đất ngập nước xuyên biên giới Trung – Nga, một bên là dòng sông uốn lượn, một bên là cảnh sắc hoang sơ, yên bình của vùng biên viễn.', 'Đến Mãn Châu Lý, thành phố biên giới nơi kiến trúc Nga ngập tràn trên đất Trung Quốc. Khám phá Quảng trường Matryoshka với tượng búp bê Nga cao 30m bao quanh bởi hơn 200 búp bê nhỏ, Bảo tàng Nghệ thuật và những ngôi nhà mái vòm hành dát vàng lấp lánh.', 'Bữa tối khép lại ngày dài khám phá bằng món Lẩu Nội Mông trứ danh, những lát thịt tươi thái mỏng nhúng vào nước dùng thanh ngọt, nghi ngút khói.' ]}, {n:'05', d:'Thứ Sáu, 28/08', title:'Khám phá Mãn Châu Lý', meals:'Ăn 3 bữa', stay:'Nghỉ đêm tại Mãn Châu Lý', img:DRV('1i05D4cO2DUbCVWMu-m1Hf9aqBpErHu6F'), p:[ 'Sau bữa sáng, Quý khách tham quan Khu Du lịch Quốc môn, nơi ba quốc gia Trung – Nga – Mông Cổ hội tụ. Chụp ảnh tại cột mốc biên giới lịch sử Trung–Nga, phóng tầm mắt ngắm tuyến đường sắt liên vận Trans-Siberia và thị trấn Zabaikalsk phía bên kia đường biên.', 'Xe đưa đoàn đến Hồ Hô Luân — hồ nước ngọt lớn bậc nhất phương Bắc Trung Quốc, vùng sinh thái đa dạng với hàng trăm loài chim di cư.', 'Tự do dạo Phố đi bộ Trung–Nga (Phố Ngũ Đạo), biển hiệu song ngữ Nga–Hoa, quầy hàng đặc sản, quán bia kiểu Nga xen giữa mái đình phong cách Trung Hoa — đúng biệt danh "Tiểu Las Vegas" vùng biên giới.' ]}, {n:'06', d:'Thứ Bảy, 29/08', title:'Mãn Châu Lý – Chita', meals:'Ăn 3 bữa', stay:'Nghỉ đêm tại Chita', img:null, p:[ 'Buổi sáng, đoàn ra cửa khẩu đường bộ qua Mãn Châu Lý. Hướng dẫn viên hỗ trợ làm thủ tục xuất cảnh Trung Quốc và nhập cảnh vào vùng Transbaikal (Nga) qua cửa khẩu Zabaikalsk.', 'Xe lăn bánh trên tuyến đường xuyên Siberia hướng về thủ phủ Chita, ngắm những cánh rừng Taiga bạt ngàn phương Bắc, sắc thu vàng và thảm hoa Siberia khoe sắc dọc sườn đồi.', 'Đến Chita — thủ phủ vùng Transbaikal, thành phố từng là nơi lưu đày những người Decembrists nổi dậy thế kỷ 19.' ]}, {n:'07', d:'Chủ Nhật, 30/08', title:'Chita — Tàu đêm Ulan-Ude', meals:'Ăn 3 bữa', stay:'Nghỉ đêm trên tàu xuyên Siberia', img:DRV('1kC9Jxc9M8WPpJkyCvDj8uqTwx_2cYhIY'), p:[ 'Sau bữa sáng, đoàn tham quan thành phố Chita, ghé Khu suối khoáng thiên nhiên Molokovka giữa rừng nguyên sinh, kết hợp Công viên Bảo tàng Quân sự. Bữa trưa mang phong vị ẩm thực Nga – Âu.', 'Xe đưa đoàn chinh phục đỉnh Đồi Hươu, điểm cao lý tưởng thu trọn toàn cảnh Chita cổ kính. Buổi chiều dạo Quảng trường Lenin trước khi lên chặng tàu đêm hướng Ulan-Ude.', 'Khoang tàu riêng tư, sạch sẽ — linh hồn của hành trình xuyên Siberia: tiếng bánh tàu nghiền trên đường ray, chén trà nóng từ samovar, bóng tối vô tận của rừng Taiga ngoài khung cửa kính.' ]}, {n:'08', d:'Thứ Hai, 31/08', title:'Khám phá Ulan-Ude', meals:'Ăn 3 bữa', stay:'Nghỉ đêm tại Ulan-Ude', img:DRV('1YlaUmDK6w7JaQT1Sskzw7VdnjpHCN-cw'), note:{t:'Bạn có biết? — Thủ phủ Phật giáo của nước Nga', c:'Ivolginsky Datsan là trung tâm Phật giáo lớn và quan trọng nhất nước Nga, nơi lưu giữ nhục thân bất hoại của Đại sư Dashi-Dorzho Itigelov — nhập định năm 1927, thi thể không phân hủy suốt gần 100 năm, khoa học hiện đại vẫn chưa lý giải được.'}, p:[ 'Đến ga Ulan-Ude — thủ phủ Cộng hòa Buryatia, nơi văn hóa Mông Cổ và Phật giáo Tây Tạng tồn tại ngay trên đất Nga. Tham quan Quảng trường Xô Viết với tượng đầu Lenin lớn nhất thế giới.', 'Bữa trưa với món bánh đặc trưng địa phương. Sau đó, ghé thăm Ivolginsky Datsan, nơi những mái vàng chùa Tây Tạng nổi lên trên thảo nguyên xanh, chiêm bái nhục thân Đại sư Itigelov.' ]}, {n:'09', d:'Thứ Ba, 01/09', title:'Ulan-Ude → Hồ Baikal → Irkutsk', meals:'Ăn 3 bữa', stay:'Nghỉ đêm tại Irkutsk', img:DRV('13kWiy5Wv0HbH7rEuMQIMQhQ2rj7K0_Ix'), note:{t:'Bạn có biết? — Hồ Baikal, hồ nước ngọt sâu nhất thế giới', c:'Mặt hồ xanh thẳm sâu tới 1.600m, đổi màu từ xanh ngọc sang xanh sapphire theo từng góc nhìn — nơi lưu giữ khoảng 1/5 lượng nước ngọt không đóng băng của toàn thế giới.'}, p:[ 'Sau bữa sáng, Quý khách lên chặng tàu Kupe hướng Irkutsk — đoạn đường sắt được mệnh danh đẹp nhất thế giới. Tàu chạy bám sát mép nước hồ Baikal suốt nhiều giờ, rừng hoa hồng tím rực dọc bờ, vách đá dựng đứng ăn xuống hồ như bức tranh thủy mặc.', 'Bữa trưa tại toa hàng ăn (Dining Car), phần không thể thiếu của văn hóa tàu Nga, nhìn hồ Baikal lướt qua cửa sổ trong khi ăn.', 'Buổi chiều, đoàn đến Irkutsk, "Paris của Siberia" — dạo bước Khu phố gỗ cổ 130 Kvartal, những ngôi nhà gỗ Siberia phục dựng với khung cửa chạm khắc tinh xảo.' ]}, {n:'10', d:'Thứ Tư, 02/09', title:'Irkutsk → Đảo Olkhon', meals:'Ăn 3 bữa', stay:'Nghỉ đêm tại Đảo Olkhon', img:null, p:[ 'Sau bữa sáng, xe đưa đoàn vượt 250km xuyên thung lũng và thảo nguyên Siberia nở đầy hoa dại mùa hè — cúc dại vàng, hoa chuông tím, hoa oải hương Siberia trải dài tận chân trời.', 'Xe lăn bánh xuống bến phà, vượt eo nước Maloe More sang đảo Olkhon. Đặt chân lên đảo, xe địa hình UAZ của Nga đưa đoàn vào làng Khuzhir ven bờ.', 'Bữa tối với món cá đặc hữu chỉ có trong hồ Baikal, thịt trắng ngần thơm mùi khói gỗ — đặc sản không thể thiếu của Olkhon.' ]}, {n:'11', d:'Thứ Năm, 03/09', title:'Mũi Burkhan & Shaman Rock', meals:'Ăn 3 bữa', stay:'Nghỉ đêm tại Đảo Olkhon', img:DRV('13kWiy5Wv0HbH7rEuMQIMQhQ2rj7K0_Ix'), note:{t:'Bạn có biết? — Shaman Rock, linh địa thiêng liêng', c:'Tọa lạc tại Mũi Burkhan, Shaman Rock là trung tâm tâm linh của người Buryat và một trong những điểm chiêm ngưỡng hồ Baikal đẹp nhất, với 13 cột cầu nguyện ngũ sắc tung bay trước gió.'}, p:[ 'Xe địa hình UAZ đưa đoàn khám phá tuyến Nam đảo Olkhon, qua những vách đá cẩm thạch trắng lấp lánh và thảm hoa dại mọc sát mép nước. Bữa trưa dã ngoại giữa không gian lộng gió của đảo thiêng.', 'Buổi chiều, đoàn đi bộ tham quan Mũi Burkhan, nơi tọa lạc Shaman Rock, cảm nhận không gian bình yên đầy năng lượng, ngắm mặt nước lướt từ sắc xanh ngọc sang xanh sapphire huyền ảo.', 'Bữa tối với thực đơn sườn cừu (hoặc sườn bò) nướng tảng thơm lừng, nhâm nhi trà thảo mộc đặc trưng vùng Siberia.' ]}, {n:'12', d:'Thứ Sáu, 04/09', title:'Mũi Khoboy — cực bắc đảo Olkhon', meals:'Ăn 3 bữa', stay:'Nghỉ đêm tại Đảo Olkhon', img:null, p:[ 'Sau bữa sáng, đoàn tham quan Mũi Khoboy — điểm cực bắc của đảo, nơi những vách đá cẩm thạch đứng thẳng cao vút giữa màu xanh bất tận. Trong điều kiện thời tiết tốt, có thể nhìn thấy cả hai bờ hồ Baikal từ đây.', 'Bữa trưa dã ngoại giữa thiên nhiên hoang sơ. Buổi chiều tự do tại bãi Saraiskiy — bãi cát mịn dài nhất đảo, nước hồ trong đến thấy đáy, mua đồ lưu niệm thủ công tại làng Khuzhir.' ]}, {n:'13', d:'Thứ Bảy, 05/09', title:'Olkhon → Irkutsk', meals:'Ăn 3 bữa', stay:'Nghỉ đêm tại Irkutsk', img:null, p:[ 'Sau bữa sáng, xe đưa đoàn ra bến phà, rời đảo Olkhon và băng qua eo biển trở lại đất liền. Bữa trưa tại nhà hàng địa phương, khám phá ẩm thực người Buryat bản địa với các món bánh truyền thống.', 'Trở về Irkutsk — sau những ngày dài khám phá thiên nhiên hoang sơ, đây là thời gian lý tưởng để nghỉ ngơi. Quý khách tự do dạo bước công viên thành phố, lãng mạn bên bờ sông Angara hiền hòa.' ]}, {n:'14', d:'Chủ Nhật, 06/09', title:'Irkutsk – Listvyanka – Irkutsk', meals:'Ăn 3 bữa', stay:'Nghỉ đêm tại Irkutsk', img:'https://drive.google.com/thumbnail?id=1z2KrYM-6jAdTQqmFHwt7c-8vvmH5qo7Y&sz=w1200', note:{t:'Bạn có biết? — Hải cẩu Nerpa, loài đặc hữu của Baikal', c:'Nerpa là loài hải cẩu nước ngọt duy nhất trên thế giới, chỉ sinh sống trong môi trường nước ngọt của hồ Baikal — cực kỳ quý hiếm với đôi mắt tròn xoe đáng yêu.'}, p:[ 'Khởi hành đi Listvyanka — ngôi làng cổ nép mình bên bờ hồ Baikal. Ghé chợ cá nhộn nhịp, thưởng thức món cá Omul hun khói nóng hổi ngay tại lò gỗ sồi.', 'Tham quan Bảo tàng Hồ Baikal, tìm hiểu hệ sinh thái "Biển hồ" và ngắm những chú hải cẩu Nerpa mắt tròn xoe, loài hải cẩu nước ngọt duy nhất trên thế giới.', 'Trải nghiệm cáp treo lên đài quan sát Chersky Rock, thu trọn toàn cảnh hồ Baikal và điểm khởi nguồn sông Angara từ trên cao. Bữa tối ấm cúng, tận hưởng đêm cuối thư thái tại thành phố cổ kính.' ]}, {n:'15', d:'Thứ Hai, 07/09', title:'Irkutsk → Bắc Kinh (quá cảnh)', meals:'Ăn 3 bữa', stay:'Nghỉ đêm trên máy bay / quá cảnh', img:null, p:[ 'Quý khách dùng bữa sáng tại khách sạn và làm thủ tục trả phòng. Xe đưa đoàn tham quan Nhà thờ Chánh tòa Kazan — biểu tượng kiến trúc lộng lẫy, uy nghiêm với sắc đỏ hồng đặc trưng như bước ra từ tranh vẽ.', 'Sau bữa trưa, xe đưa đoàn về khu vực trung tâm tự do nghỉ ngơi, mua sắm đặc sản làm quà (chocolate Alenka, búp bê Matryoshka, trà thảo mộc...). Đoàn ra sân bay quốc tế Irkutsk làm thủ tục đáp chuyến bay về Việt Nam.' ]}, {n:'16', d:'Thứ Ba, 08/09', title:'Hạ cánh TP.HCM / Hà Nội', meals:'Ăn sáng trên máy bay', stay:'Kết thúc hành trình', img:null, p:['Đoàn về đến Việt Nam, kết thúc chuyến đi đầy kỷ niệm khó quên.']}, ]; const hayNotes = [ {n:'01', total:'06', place:'Hồ Baikal', sub:'Hồ nước ngọt sâu nhất thế giới', desc:'Mặt hồ xanh thẳm sâu tới 1.600m, đổi màu từ xanh ngọc sang xanh sapphire theo từng góc nhìn — lưu giữ khoảng 1/5 lượng nước ngọt không đóng băng của toàn thế giới.', img:DRV('13kWiy5Wv0HbH7rEuMQIMQhQ2rj7K0_Ix')}, {n:'02', total:'06', place:'Mãn Châu Lý', sub:'Nơi ba dòng văn hóa giao thoa', desc:'Thành phố biên giới Trung–Nga–Mông Cổ với biển hiệu ba thứ tiếng, mái vòm củ hành xứ Bạch Dương xen giữa nét sinh hoạt bản địa phóng khoáng.', img:DRV('1zSeHDn6yqpwDfDRERvcIenOin1IxwGOl')}, {n:'03', total:'06', place:'Ulan-Ude', sub:'Thủ phủ Phật giáo của nước Nga', desc:'Ivolginsky Datsan — trung tâm Phật giáo lớn nhất Nga, nơi lưu giữ nhục thân bất hoại của Đại sư Itigelov, nhập định từ năm 1927.', img:DRV('1YlaUmDK6w7JaQT1Sskzw7VdnjpHCN-cw')}, {n:'04', total:'06', place:'Đảo Olkhon', sub:'Trung tâm tâm linh của người Buryat', desc:'Shaman Rock tại Mũi Burkhan — linh địa thiêng liêng với 13 cột cầu nguyện ngũ sắc, một trong những điểm chiêm ngưỡng hồ Baikal đẹp nhất.', img:DRV('13kWiy5Wv0HbH7rEuMQIMQhQ2rj7K0_Ix')}, {n:'05', total:'06', place:'Hải cẩu Nerpa', sub:'Loài hải cẩu nước ngọt đặc hữu', desc:'Nerpa là loài hải cẩu nước ngọt duy nhất trên thế giới, chỉ sinh sống trong môi trường nước ngọt của hồ Baikal, cực kỳ quý hiếm.', img:'https://drive.google.com/thumbnail?id=1z2KrYM-6jAdTQqmFHwt7c-8vvmH5qo7Y&sz=w1200'}, {n:'06', total:'06', place:'Tuyến Trans-Siberian', sub:'Cung đường sắt huyền thoại của thế giới', desc:'Đoạn đường sắt bám sát mép nước hồ Baikal được mệnh danh đẹp nhất Bắc Á, với khoang tàu Kupe riêng tư và toa hàng ăn mang đậm văn hóa Nga.', img:DRV('12PL6qtfb9Jdsq96fNfxgl0NJVzWBbf3r')}, ]; /* ============ RENDER ITINERARY ============ */ const timelineEl = document.getElementById('timeline'); const VISIBLE_INITIAL = 5; function dayRowHTML(day){ const noteHTML = day.note ? `<div class="note"><b>${day.note.t}</b>${day.note.c}</div>` : ''; const paras = day.p.map(t=>`<p>${t}</p>`).join(''); return ` <div class="day-row"> <button class="day-trigger" aria-expanded="false"> <div class="day-num"><span class="lbl">Ngày</span><span class="n">${day.n}</span></div> <div class="day-main"> <div class="title">${day.title}</div> <div class="meta"><span>${day.d}</span><span>${day.meals}</span></div> </div> <svg class="chevron" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M6 9l6 6 6-6"/></svg> </button> <div class="day-panel"> <div class="day-panel-inner"> ${day.img ? `<img src="${day.img}" alt="${day.title}" loading="lazy">` : ''} ${noteHTML} ${paras} <div class="stay">${day.stay}</div> </div> </div> </div>`; } function renderTimeline(showAll){ const list = showAll ? itinerary : itinerary.slice(0, VISIBLE_INITIAL); timelineEl.innerHTML = list.map(dayRowHTML).join(''); timelineEl.querySelectorAll('.day-trigger').forEach(btn=>{ btn.addEventListener('click', ()=>{ const row = btn.closest('.day-row'); const isOpen = row.classList.contains('open'); timelineEl.querySelectorAll('.day-row.open').forEach(r=>{ r.classList.remove('open'); r.querySelector('.day-trigger').setAttribute('aria-expanded','false'); }); if(!isOpen){ row.classList.add('open'); btn.setAttribute('aria-expanded','true'); } }); }); } renderTimeline(false); let showingAll = false; const seeFullBtn = document.getElementById('seeFullToggle'); seeFullBtn.addEventListener('click', (e)=>{ e.preventDefault(); showingAll = !showingAll; renderTimeline(showingAll); seeFullBtn.innerHTML = showingAll ? 'Thu gọn lịch trình <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M19 12H5"/></svg>' : 'Xem đầy đủ lịch trình 16 ngày <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M5 12h14M12 5l7 7-7 7"/></svg>'; }); /* ============ HAY NOTE CAROUSEL ============ */ const hnTrack = document.getElementById('hnTrack'); const hnDots = document.getElementById('hnDots'); hnTrack.innerHTML = hayNotes.map(s=>` <div class="hn-slide"> <div class="text"> <div class="count">${s.n} / ${s.total}</div> <div class="place">${s.place}</div> <div class="sub">${s.sub}</div> <div class="desc">${s.desc}</div> </div> <div class="photo"><img src="${s.img}" alt="${s.place}" loading="lazy"></div> </div> `).join(''); hnDots.innerHTML = hayNotes.map((_,i)=>`<span class="${i===0?'on':''}"></span>`).join(''); let hnIndex = 0, hnTimer; function goToSlide(i){ hnIndex = (i + hayNotes.length) % hayNotes.length; hnTrack.style.transform = `translateX(-${hnIndex*100}%)`; hnDots.querySelectorAll('span').forEach((d,idx)=>d.classList.toggle('on', idx===hnIndex)); } function startAutoplay(){ clearInterval(hnTimer); hnTimer = setInterval(()=>goToSlide(hnIndex+1), 6000); } document.getElementById('hnPrev').addEventListener('click', ()=>{ goToSlide(hnIndex-1); startAutoplay(); }); document.getElementById('hnNext').addEventListener('click', ()=>{ goToSlide(hnIndex+1); startAutoplay(); }); hnDots.addEventListener('click', (e)=>{ if(e.target.tagName==='SPAN'){ goToSlide([...hnDots.children].indexOf(e.target)); startAutoplay(); } }); const haynoteEl = document.querySelector('.haynote'); haynoteEl.addEventListener('mouseenter', ()=>clearInterval(hnTimer)); haynoteEl.addEventListener('mouseleave', startAutoplay); startAutoplay(); let touchStartX = null; const slideWrap = document.querySelector('.hn-slide-wrap'); slideWrap.addEventListener('touchstart', e=>{ touchStartX = e.touches[0].clientX; }, {passive:true}); slideWrap.addEventListener('touchend', e=>{ if(touchStartX===null) return; const diff = e.changedTouches[0].clientX - touchStartX; if(Math.abs(diff) > 40){ diff > 0 ? goToSlide(hnIndex-1) : goToSlide(hnIndex+1); startAutoplay(); } touchStartX = null; }); /* ============ NAV SCROLL / MOBILE ============ */ const nav = document.getElementById('siteNav'); window.addEventListener('scroll', ()=>{ nav.classList.toggle('scrolled', window.scrollY > 8); }); const hamburgerBtn = document.getElementById('hamburgerBtn'); const mobilePanel = document.getElementById('mobilePanel'); hamburgerBtn.addEventListener('click', ()=>{ const open = mobilePanel.classList.toggle('open'); hamburgerBtn.setAttribute('aria-expanded', open); }); mobilePanel.querySelectorAll('a').forEach(a=>a.addEventListener('click', ()=>{ mobilePanel.classList.remove('open'); hamburgerBtn.setAttribute('aria-expanded','false'); })); document.getElementById('ctaScroll').addEventListener('click', ()=>document.getElementById('contact').scrollIntoView({behavior:'smooth'})); document.getElementById('ctaScroll2').addEventListener('click', ()=>document.getElementById('contact').scrollIntoView({behavior:'smooth'})); /* ============ PRICE DETAILS TOGGLE ============ */ const detailsToggle = document.getElementById('detailsToggle'); const detailsBody = document.getElementById('detailsBody'); detailsToggle.addEventListener('click', ()=>{ const open = detailsBody.classList.toggle('open'); detailsToggle.classList.toggle('open', open); }); /* ============ EXPAND / COLLAPSE ALL ITINERARY ============ */ const expandAllBtn = document.getElementById('expandAllBtn'); function setAllItineraryRows(open){ document.querySelectorAll('.day-row').forEach(row => { row.classList.toggle('open', open); const trigger = row.querySelector('.day-trigger'); if (trigger) trigger.setAttribute('aria-expanded', open ? 'true' : 'false'); }); if (expandAllBtn){ expandAllBtn.dataset.expanded = open ? 'true' : 'false'; expandAllBtn.setAttribute('aria-expanded', open ? 'true' : 'false'); const label = expandAllBtn.querySelector('span'); if (label) label.textContent = open ? 'Thu gọn tất cả' : 'Mở tất cả'; } } if (expandAllBtn){ expandAllBtn.addEventListener('click', () => { const shouldOpen = expandAllBtn.dataset.expanded !== 'true'; setAllItineraryRows(shouldOpen); }); } /* Keep the global toggle label in sync when users open/close individual days */ document.addEventListener('click', (e) => { const trigger = e.target.closest('.day-trigger'); if (!trigger || !expandAllBtn) return; requestAnimationFrame(() => { const rows = [...document.querySelectorAll('.day-row')]; const allOpen = rows.length > 0 && rows.every(r => r.classList.contains('open')); expandAllBtn.dataset.expanded = allOpen ? 'true' : 'false'; expandAllBtn.setAttribute('aria-expanded', allOpen ? 'true' : 'false'); const label = expandAllBtn.querySelector('span'); if (label) label.textContent = allOpen ? 'Thu gọn tất cả' : 'Mở tất cả'; }); }); (function(){ function initHayTourRouteMap(){ const el=document.getElementById('routeMap'); if(!el||typeof L==='undefined') return; const stops=[ {id:'hulunbuir',name:'Hồ Luân Bối Nhĩ',meta:'Ngày 2 · 1 đêm',lat:49.220287,lng:119.754410,start:true,offset:[18,18]}, {id:'heishantou',name:'Hắc Sơn Đầu',meta:'Ngày 3 · 1 đêm',lat:50.213890,lng:119.504340,offset:[18,-34]}, {id:'manzhouli',name:'Mãn Châu Lý',meta:'Ngày 4–5 · 2 đêm',lat:49.597841,lng:117.378529,offset:[-104,18]}, {id:'chita',name:'Chita',meta:'Ngày 6 · 1 đêm',lat:52.043110,lng:113.491710,offset:[-40,-40]}, {id:'ulanude',name:'Ulan-Ude',meta:'Ngày 8 · 1 đêm',lat:51.826480,lng:107.599790,offset:[-62,18]}, {id:'irkutsk',name:'Irkutsk',meta:'Ngày 9, 13–14 · 3 đêm',lat:52.295660,lng:104.290760,offset:[-74,18]}, {id:'olkhon',name:'Olkhon',meta:'Ngày 10–12 · 3 đêm',lat:53.207941,lng:107.495013,offset:[18,-34]} ]; const segments=[['hulunbuir','heishantou','road'],['heishantou','manzhouli','road'],['manzhouli','chita','road'],['chita','ulanude','train'],['ulanude','irkutsk','train'],['irkutsk','olkhon','road'],['olkhon','irkutsk','return']]; const byId=Object.fromEntries(stops.map(s=>[s.id,s])); const map=L.map(el,{zoomControl:false,attributionControl:true,scrollWheelZoom:false,doubleClickZoom:true,dragging:true,keyboard:true,zoomSnap:.25}); L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer/tile/{z}/{y}/{x}',{maxZoom:16,crossOrigin:true,attribution:'Tiles © Esri'}).addTo(map); L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/Elevation/World_Hillshade/MapServer/tile/{z}/{y}/{x}',{maxZoom:16,crossOrigin:true,opacity:.18}).addTo(map); function fitRoute(animate=false){const bounds=L.latLngBounds(stops.map(s=>[s.lat,s.lng]));map.fitBounds(bounds,{paddingTopLeft:[60,45],paddingBottomRight:[60,45],animate,maxZoom:5.6})} function curvePoints(a,b,bend=.1){const p1=map.latLngToLayerPoint([a.lat,a.lng]),p2=map.latLngToLayerPoint([b.lat,b.lng]);const mx=(p1.x+p2.x)/2,my=(p1.y+p2.y)/2,dx=p2.x-p1.x,dy=p2.y-p1.y,control=L.point(mx-dy*bend,my+dx*bend),result=[];for(let i=0;i<=28;i++){const t=i/28,q=1-t,p=L.point(q*q*p1.x+2*q*t*control.x+t*t*p2.x,q*q*p1.y+2*q*t*control.y+t*t*p2.y);result.push(map.layerPointToLatLng(p))}return result} const routeLayer=L.layerGroup().addTo(map); function drawRoutes(){routeLayer.clearLayers();segments.forEach(([from,to,mode],i)=>{const a=byId[from],b=byId[to],bend=mode==='return'?-.18:(i%2?-.04:.055),pts=curvePoints(a,b,bend);L.polyline(pts,{color:mode==='road'?'#7CD100':'#123E2A',weight:mode==='return'?3.5:4,dashArray:mode==='return'?'8 8':null,opacity:mode==='return'?.58:.95,interactive:false}).addTo(routeLayer)})} function markerHTML(s){return `<div class="hay-map-marker-wrap"><div class="hay-map-marker ${s.start?'start':''}"></div><div class="hay-map-label" style="transform:translate(${s.offset[0]}px,${s.offset[1]}px)">${s.name}<small>${s.meta}</small></div></div>`} stops.forEach(s=>L.marker([s.lat,s.lng],{keyboard:false,icon:L.divIcon({className:'',html:markerHTML(s),iconSize:[24,24],iconAnchor:[12,12]})}).addTo(map)); map.whenReady(()=>{fitRoute(false);drawRoutes();setTimeout(()=>map.invalidateSize(),150)}); map.on('zoomend moveend',drawRoutes); document.getElementById('routeZoomIn')?.addEventListener('click',()=>map.zoomIn(.5)); document.getElementById('routeZoomOut')?.addEventListener('click',()=>map.zoomOut(.5)); document.getElementById('routeFit')?.addEventListener('click',()=>fitRoute(true)); el.addEventListener('mouseenter',()=>map.scrollWheelZoom.enable()); el.addEventListener('mouseleave',()=>map.scrollWheelZoom.disable()); window.addEventListener('resize',()=>{clearTimeout(window.__hayRouteResize);window.__hayRouteResize=setTimeout(()=>{map.invalidateSize();fitRoute(false)},160)}); } if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',initHayTourRouteMap);else initHayTourRouteMap(); })();
Giá chỉ:
Giá gốc:
Mã tour: