1(function ($) { 2 class MegaMenu { 3 constructor() { 4 this.IdMainNavMobile = $("#main-nav-mobile"); 5 this.ClassClose = $(".menu_close"); 6 this.iconClose = $(".menu_title"); 7 this.IdIcon = $("#hamburger-icon"); 8 this.ClassOverlay = $(".menu_overlay"); 9 } 10 11 init() { 12 $(this.IdIcon).click(() => { 13 this.openMenu(); 14 }); 15 this.closeMenu(this.ClassClose); 16 this.closeMenu(this.iconClose); 17 this.closeMenu(this.ClassOverlay); 18 } 19 20 openMenu() { 21 $(this.IdMainNavMobile).animate({ 22 left: "0%" 23 }, 300); 24 $("html").addClass("menu-open"); 25 $(this.ClassOverlay).addClass("hidden_menu"); 26 this.addIconMenu(); 27 this.clickTitleMenu(); 28 this.clickIconMenu(); 29 } 30 31 closeMenu(selector) { 32 $(selector).click(() => { 33 $(this.IdMainNavMobile).animate({ 34 left: "-100%" 35 }, 500); 36 console.log(this); 37 $(this.ClassOverlay).removeClass("hidden_menu"); 38 $(".menu-item-has-children .open-submenu").remove(); 39 }); 40 } 41 42 addIconMenu() { 43 $("ul.navigation-mobile ul.sub-menu, ul.navigation-mobile").each(function () { 44 $(this).parent(".menu-item-has-children").prepend('<span class="open-submenu"></span>') 45 }); 46 } 47 48 clickTitleMenu() { 49 $("ul.navigation-mobile .menu-item-has-children > a").on("click", function (l) { 50 l.stopPropagation(); 51 l.preventDefault(); 52 $(this).closest("li").toggleClass("active-menu-item"); 53 $(this).closest("li.active-menu-item > a").attr({ 54 href: 'javascript:void(0)' 55 }); 56 }); 57 } 58 59 clickIconMenu() { 60 $("ul.navigation-mobile .open-submenu").on("click", function (l) { 61 l.stopPropagation(); 62 l.preventDefault(); 63 $(this).closest("li").toggleClass("active-menu-item"); 64 }); 65 } 66 } 67 class PageUtils { 68 constructor() { 69 this.mobile = null; 70 } 71 72 init() { 73 this.checkMobile(); 74 this.bindEvents(); 75 } 76 77 checkMobile() { 78 if (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent)) { 79 this.mobile = true; 80 $("body").addClass("isMobile"); 81 } else { 82 this.mobile = false; 83 $("body").addClass("no-mobile"); 84 } 85 } 86 87 bindEvents() { 88 $('header [ht-trigger="hd-search"]').click(() => { 89 $('header').find('.hd-search, .hd-search .show-search, .hd-search .fa-transformation').toggleClass("is-active"); 90 }); 91 92 setTimeout(() => { 93 $('#backToTop').click(() => { 94 $('html, body').animate({ scrollTop: 0 }, 500); 95 }); 96 }, 500); 97 } 98 } 99 100 const megaMenu = new MegaMenu(); 101 const pageUtils = new PageUtils(); 102 103 pageUtils.init(); 104 megaMenu.init(); 105 106 107 $(document).ready(function () { 108 $('body').on('click', '[ht-trigger="c-modal-2"]', function () { 109 $('body').append('<div class="c-modal-2-backdrop show"></div>'); 110 $('body').addClass('c-modal-2-open'); 111 $target = $($(this).attr('ht-target')); 112 $target.css('display', 'block'); 113 $close = $(this).attr('ht-target-close'); 114 if ($close !== undefined) { 115 $($close).removeClass('show'); 116 $($close).removeAttr('style'); 117 $('body').find('.c-modal-2-backdrop:last').remove(); 118 } 119 setTimeout(function () { 120 $target.addClass('show'); 121 flktyResize('.carousel-custom-time'); 122 }, 200); 123 }); 124 $('body').on('click', '[ht-close="c-modal-2"]', function () { 125 var $close = $(this).attr('ht-target-close'); 126 var $reload = $(this).attr('ht-reload'); 127 if ($close) { 128 $($close).removeClass('show'); 129 $('body').find('.c-modal-2-backdrop:last').removeClass('show'); 130 setTimeout(function () { 131 $($close).removeAttr('style'); 132 $('body').find('.c-modal-2-backdrop:last').remove(); 133 }, 200); 134 } else { 135 $('.c-modal-2-backdrop').removeClass('show'); 136 $('.c-modal-2').removeClass('show'); 137 setTimeout(function () { 138 $('.c-modal-2').removeAttr('style'); 139 $('body').removeClass('c-modal-2-open'); 140 $('.c-modal-2-backdrop').remove(); 141 }, 200); 142 } 143 if ($reload === 'true') { 144 $redirect = ($(this).attr('ht-redirect') === 'false') ? '' : $(this).attr('ht-redirect'); 145 window.location.href = $redirect; 146 } 147 }); 148 });
149 150 /* END c-modal-2 */ 151 /* BEGIN c-select-single */ 152 $(document).ready(function () { 153 154 $('.c-select .c-radio').find('.c_tick').remove(); 155 $('body').on('click', '[ht-trigger="c-select"]', function () { 156 if ($(this).closest('#s-address-map').length) { 157 var $select = $(this).closest('.c-select'); 158 var isFocusedMap = $select.hasClass('is-focused'); 159 $('#s-address-map .c-select').removeClass('is-focused'); 160 $('.overlay-transparent[ht-close="c-select"]').remove(); 161 if (!isFocusedMap) { 162 $select.addClass('is-focused'); 163 } 164 return false; 165 } 166 167 var focused = $(this).parent().hasClass('is-focused'); 168 $('[ht-close="c-select"]').click(); 169 if (!focused) { 170 $(this).parent().addClass('is-focused'); 171 $('body').append('<div class="overlay-transparent" ht-close="c-select"></div>'); 172 } 173 }); 174 175 $('body').on('click', '.c-select .c-radio', function () { 176 var vl = $(this).find("input").val(); 177 if (!$(this).parent('.list-service').length) { 178 $("#s-address .s_content").addClass('none'); 179 $("#s-address .s_address").addClass('is-active'); 180 $("#s-address .s_address").find(vl).addClass('is-active'); 181 $("#s-address .s_address").find(vl).siblings().removeClass('is-active'); 182 } 183 var el_select = $(this).closest('.c-select'); 184 el_select.find('div.c_input').text($(this).find('span').text()); 185 el_select.find('div.c_input').removeClass('text--icon'); 186 el_select.find('.c-radio').removeClass('is-selected'); 187 $(this).addClass('is-selected'); 188 $('[ht-close="c-select"]').click(); 189 }); 190 $('body').on('click', function (event) { 191 if (!$(event.target).closest('#s-address-map .c-select').length) { 192 $('#s-address-map .c-select').removeClass('is-focused'); 193 } 194 }); 195 $('body').on('click', '[ht-close="c-select"]', function () { 196 $('.c-select').removeClass('is-focused'); 197 $('.overlay-transparent').remove(); 198 }); 199 // $('#s-time .s_day ul li, #s-time .s_time ul li').click(function() { 200 // $(this).toggleClass('is-active'); 201 // }); 202 }); 203 204})(jQuery); 205 206function setLocalStore(key, value, time = 1) { 207 let now = new Date() 208 const item = { 209 data: value, 210 expiry: now.getTime() + time * 7 * 24 * 60 * 60 * 1000, 211 } 212 localStorage.setItem(key, JSON.stringify(item)) 213} 214 215function getLocalStore(key) { 216 const itemStr = localStorage.getItem(key) 217 218 if (!itemStr) { 219 return null 220 } 221 const item = JSON.parse(itemStr) 222 const now = new Date() 223 if (now.getTime() > item.expiry) { 224 localStorage.removeItem(key) 225 return null 226 } 227 return item.data 228} 229 230function checkPhone(phone) { 231 return /^(84|0[3|5|7|8|9])+([0-9]{8})\b/.test(phone); 232} 233 234function checkName(text) { 235 return /^[a-zA-ZÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÄÄÄ¨Å¨Æ Ã Ã¡Ã¢Ã£Ã¨Ã©ÃªÃ¬ÃòóôõùúÄÄĩũơƯÄẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼá»á»á»áº¾Æ°Äạảấầẩẫáºáº¯áº±áº³áºµáº·áº¹áº»áº½á»á»á»áº¿á»á»á»á»á»á»á»á»á»á»á»á»á»á»á» ỢỤỦỨỪỠá»á»á»á»á»á»á»á»á»á»á»á»á»á»¡á»£á»¥á»§á»©á»«á»¬á»®á»°á»²á»´ÃỶỸá»á»¯á»±á»³á»µá»·á»¹\s\W|_]+$/g.test(text); 236} 237 238function switchTab(selector = '[data-role="tab"]', wrapperTabContent = '.tab-panel') { 239 const tabs = document.querySelectorAll(selector); 240 const tabContents = document.querySelectorAll(wrapperTabContent);
241 tabs.forEach((tab) => { 242 tab.addEventListener("click", () => { 243 const target = document.querySelector(tab.dataset.target); 244 tabContents.forEach((wrapperContent) => { 245 wrapperContent.classList.remove("is-active"); //xóa class is-active (ẩn) tất cả các tab content 246 }); 247 target.classList.add("is-active"); //hiá»n tab content ÄÆ°á»£c click 248 249 tabs.forEach((t) => { 250 t.classList.remove("is-active"); 251 }); 252 tab.classList.add("is-active"); 253 }); 254 }); 255} 256 257const flktyResize = (elem) => { 258 259 var flkty = new Flickity(elem, { 260 resize: true, 261 lazyLoad: 1, 262 autoPlay: true, 263 pageDots: false, 264 prevNextButtons: false, 265 contain: true 266 }); 267 268 setTimeout(function () { 269 flkty.resize() 270 }, 100); 271}; 272 273function switchTabFlkty(selector = '[data-flkty="tab"]', wrapperTabContent = '.tabContent') { 274 const tabs = document.querySelectorAll(selector); 275 const tabContents = document.querySelectorAll(wrapperTabContent); 276
277 tabs.forEach((tab) => { 278 tab.addEventListener("click", (event) => { 279 const target = document.querySelector(tab.dataset.target); 280 281 let tabn = event.target.closest('.tabAll'); 282 let tabContents = tabn.querySelectorAll('.tabContent'); 283 let resize = target.querySelector('.resize'); 284 285 tabContents.forEach((wrapperContent) => { 286 wrapperContent.classList.remove("active"); 287 }); 288 289 target.classList.add("active"); //hiá»n tab content ÄÆ°á»£c click 290 291 flktyResize(resize); 292 293 let tabLinks = tabn.querySelectorAll('.tabLinks'); 294 tabLinks.forEach((t) => { 295 t.classList.remove("active"); 296 }); 297 tab.classList.add("active"); // nav click 298 }); 299 }); 300} 301 302; (() => { 303 switchTab(); 304 switchTabFlkty(); 305})() 306 307document.addEventListener('DOMContentLoaded', function () { 308 var elems = document.querySelectorAll('.carousel-materialize'); 309 var instances = M.Carousel.init(elems, { 310 indicators: false, 311 padding: 0, 312 dist: -300, 313 }); 314}); 315const showVideoAutoplay = () => { 316 const box = document.querySelectorAll('.box-image'); 317 box.forEach((btn) => { 318 btn.addEventListener("click", function (event) { 319 event.preventDefault(); 320 let closest = event.target.closest('.box-image'); 321 let image = closest.querySelector('.video-image'); 322 let icon = closest.querySelector('.overlay-icon'); 323 let video = closest.querySelector('.video-iframe'); 324 icon.style.display = "none"; 325 video.style.display = "block"; 326 let data = video.getAttribute('data-video'); 327 328 image.innerHTML = `<iframe width="1000" height="520" src="https://www.youtube.com/embed/${data}?autoplay=1" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>`; 329 image.style.paddingTop = '0'; 330 }); 331 }); 332} 333jQuery(document).ready(function () { 334 var acc = document.getElementsByClassName("accordion"); 335 var i; 336 for (i = 0; i < acc.length; i++) { 337 acc[i].addEventListener("click", function () { 338 this.classList.toggle("active"); 339 var panel = this.nextElementSibling; 340 if (panel.style.maxHeight) { 341 panel.style.maxHeight = null; 342 } else { 343 panel.style.maxHeight = panel.scrollHeight + "px"; 344 } 345 }); 346 } 347}); 348 349window.addEventListener('load', () => { 350 let eleBackToTop = document.querySelector("#backToTop"); 351 window.addEventListener('scroll', () => { 352 const scroll = document.documentElement.scrollTop 353 if (scroll > 350) { 354 eleBackToTop.classList.add('active--btt') 355 } else { 356 eleBackToTop.classList.remove('active--btt') 357 } 358 }); 359}); 360 361const btnSearchMobile = document.querySelector(".btn-search-mobile"); 362const headerSearchMobile = document.querySelector(".header-search-mobile"); 363btnSearchMobile.addEventListener('click', () => { 364 365 headerSearchMobile.classList.toggle('active'); 366}) 367document.body.addEventListener('click', function(event) { 368 if (!headerSearchMobile.contains(event.target) && !btnSearchMobile.contains(event.target)) { 369 headerSearchMobile.classList.remove('active'); 370 } 371}) 372 373document.addEventListener('DOMContentLoaded', function () { 374 var flickityConfig = { 375 wrapAround: true, 376 contain: true, 377 autoPlay: 3500, 378 pageDots: true, 379 prevNextButtons: false, 380 groupCells: true, 381 draggable: true, 382 }; 383 if (isMobileDevice()) { 384 flickityConfig.cellAlign = 'left'; 385 flickityConfig.freeScroll = true; 386 } else { 387 flickityConfig.cellAlign = 'center'; 388 flickityConfig.freeScroll = false; 389 } 390 391 var carouselSlide = document.querySelector('.activity-list-slide'); 392 if (carouselSlide) { 393 var flkty = new Flickity(carouselSlide, flickityConfig); 394 flkty.on('change', function (index) { 395 changeSlideActivity(); 396 }); 397 } 398}); 399 400// Hà m kiá»m tra thiết bá» di Äá»ng 401function isMobileDevice() { 402 return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); 403} 404 405function changeSlideActivity() { 406 var slide = document.querySelector('.slide-layout-2.is-selected'); 407 var sectionActivity = document.querySelector('section#activity'); 408 409 if (!slide) { 410 sectionActivity.classList.remove('slide-layout-2'); 411 } else { 412 sectionActivity.classList.add('slide-layout-2'); 413 } 414} 415 416document.addEventListener("DOMContentLoaded", function() { 417 var iconEl = document.querySelector('.bm-icon.fas.fa-star'); 418 if (iconEl) { 419 // Bá» icon font 420 iconEl.classList.remove('fas', 'fa-star'); 421 422 // Thêm class tùy chá»nh 423 iconEl.classList.add('custom-image-icon'); 424 425 // Chèn ảnh 426 iconEl.innerHTML = '<img src="https://cdn.diemnhangroup.com/dentalinvietnam.com/2025/08/social-media_1.png" alt="icon">'; 427 } 428}); 429 430document.addEventListener("DOMContentLoaded", function () { 431 const hash = window.location.hash; 432 433 if (hash) { 434 // Và dụ: #nav-benh-vien-tham-my 435 const targetTab = document.querySelector(`a[href="${hash}"]`); 436 const targetPane = document.querySelector(hash); 437 438 if (targetTab && targetPane) { 439 // Bá» active mặc Äá»nh 440 document.querySelectorAll('.branch-functions__tabs .nav-link').forEach(tab => { 441 tab.classList.remove('active'); 442 tab.setAttribute('aria-selected', 'false'); 443 }); 444 445 document.querySelectorAll('.tab-pane').forEach(pane => { 446 pane.classList.remove('show', 'active'); 447 }); 448 449 // Active tab má»i 450 targetTab.classList.add('active'); 451 targetTab.setAttribute('aria-selected', 'true'); 452 453 targetPane.classList.add('show', 'active'); 454 455 // Scroll tá»i khu vá»±c tab (nếu muá»n) 456 const tabZone = document.querySelector('.branch-functions__tabs'); 457 if (tabZone) { 458 tabZone.scrollIntoView({ behavior: 'smooth', block: 'start' }); 459 } 460 } 461 } 462}); 463 464jQuery(function($){ 465 466 function filterStores() { 467 let selectedRegion = $('#filter-region').val(); 468 469 // tab-pane active 470 let activePane = $('.tab-pane.show.active, .tab-pane.active'); 471 472 if (!activePane.length) return; 473 474 let items = activePane.find('.store__item'); 475 476 // Không chá»n vùng â hiá»n full 477 if (selectedRegion === "") { 478 items.show(); 479 return; 480 } 481 482 // Lá»c theo vùng 483 items.each(function(){ 484 $(this).toggle($(this).data('region') === selectedRegion); 485 }); 486 } 487 488 // Khi chá»n vùng â lá»c 489 $('#filter-region').on('change', filterStores); 490 491 // Khi Äá»i tab â reset select + hiá»n full 492 $(document).on('click', '.nav-link', function(){ 493 $('#filter-region').val("").trigger('change'); 494 });
495 496}); 497 498 499(function () { 500 const regionSelect = document.querySelector('.branch-region-select'); 501 if (!regionSelect) return; 502 503 function resetFilter(tab) { 504 regionSelect.value = ''; 505 tab.querySelectorAll('.store__item, .branch-region-title') 506 .forEach(el => el.style.display = ''); 507 } 508 509 function filterByRegion() { 510 const regionId = regionSelect.value; 511 const activeTab = document.querySelector('.list-stores-map.active'); 512 if (!activeTab) return; 513 514 const items = activeTab.querySelectorAll('.store__item'); 515 const titles = activeTab.querySelectorAll('.branch-region-title'); 516 517 items.forEach(item => { 518 if (!regionId) { 519 item.style.display = ''; 520 return; 521 } 522 const regions = item.dataset.region ? item.dataset.region.split(',') : []; 523 item.style.display = regions.includes(regionId) ? '' : 'none'; 524 }); 525 526 titles.forEach(title => { 527 let next = title.nextElementSibling; 528 let hasVisible = false; 529 530 while (next && !next.classList.contains('branch-region-title')) { 531 if (next.classList.contains('store__item') && next.style.display !== 'none') { 532 hasVisible = true; 533 } 534 next = next.nextElementSibling; 535 } 536 title.style.display = hasVisible ? '' : 'none'; 537 }); 538 } 539 540 regionSelect.addEventListener('change', filterByRegion); 541 542 document.querySelectorAll('.branch-functions__tabs .nav-link').forEach(tab => { 543 tab.addEventListener('shown.bs.tab', () => { 544 const activeTab = document.querySelector('.list-stores-map.active'); 545 if (activeTab) resetFilter(activeTab); 546 }); 547 }); 548})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.