1let snapContainer, 2 openIcon, 3 hiddenMenu, 4 coll, 5 sectionEles, 6 fixButtons, 7 bottomButtonsList, 8 footerSection, 9 selectRequest, 10 selectExpertise, 11 selectInterest, 12 contactBtn, 13 closeFormBtn, 14 responseFailContact, 15 responseSuccessContact, 16 form, 17 multiSelectValue = "", 18 selectElementList = [], 19 downLoadFormContainer, 20 downLoadForm, 21 closedownLoadBtn, 22 downLoadFormBtn, 23 cudaSpanList, 24 selectCudaElement, 25 responseFailDownload, 26 downloadResponse, 27 copyBtn, 28 textareaScript, 29 userPopover, 30 userAvatar, 31 userMenu, 32 signInBtn, 33 signOutBtn, 34 userTab, 35 signInTab, 36 isUserLogin = !1, 37 subscribeWebinarBtn, 38 webinarForm, 39 closeWebinarFormBtn, 40 webinarRequestType, 41 webinarFirstName, 42 webinarLastName, 43 webinarEmail, 44 webinarCompany, 45 webinarCheckBox, 46 webinarSubmitBtn, 47 webinarResponseFail, 48 webinarResponseSuccess, 49 webinarSpinnerForm, 50 webinarSelectRequest, 51 emailValidateMessage, 52 phoneNumberValidateMessage, 53 togglePhoneBtn, 54 dropdownPhone, 55 countryListUl, 56 phoneTextCode, 57 phoneCodeInput, 58 phoneNumberInput, 59 filterYearWebinar, 60 webinarItems; 61const publicKeyApi = 62 "auPauEDcraMPGj90plOhmPGxQjs3Gzi8A8dOIEoWHQ2xS9PBFLPrQMyZI2FLegDS", 63 scrollSpeed = 1e3, 64 heightBreakPoint = 713, 65 widthBreakPoint = 769, 66 mdBreakPoint = 768, 67 dropdownSelector = ".bio-select-dropdown", 68 inActiveIconSelector = ".bio-request-icon-inactive", 69 activeIconSelector = ".bio-request-icon-active", 70 selectInputSelector = ".bio-select-input", 71 activeDownloadFormClass = "border-main-midnight text-main-midnight", 72 openSelectState = { OpenSelectRequest: !1 }; 73let lastScrollTopInit, 74 pageIndex = 0, 75 isScrollFinished = !0; 76const INVALID_EMAIL_SUFFIX = [ 77 "163.com", 78 "126.com", 79 "qq.com", 80 "outlook.com", 81 "gmail.com", 82 "hotmail.com", 83 "foxmail.com", 84]; 85function InitVariable() { 86 (snapContainer = document.getElementById("snap_container")) && 87 (lastScrollTopInit = snapContainer.scrollTop), 88 (openIcon = document.getElementById("toggle-menu")), 89 (hiddenMenu = document.getElementById("hidden-menu")), 90 (coll = document.getElementsByClassName("collapsible")), 91 (fixButtons = document.getElementById("fix_buttons")), 92 (sectionEles = document.querySelectorAll("section")), 93 (bottomButtonsList = document.querySelectorAll(".bottom-buttons")), 94 (footerSection = document.getElementById("footer-section")), 95 (selectRequest = document.querySelector("#bio-request-click")), 96 (contactForm = document.querySelector("#contact_form")), 97 (contactFormV2 = document.querySelector("#contact_form_v2")), 98 (contactDatbaseForm = document.querySelector("#contact_database_form")), 99 (platformSubmenu = document.querySelector("#sub-menu-platforms")), 100 (accordionsQA = document.querySelectorAll(".accordion-qa-item")), 101 (contactBtn = document.querySelectorAll(".contact-btn")), 102 (togglePhoneBtn = document.getElementById("dropdown-phone-button")), 103 (dropdownPhone = document.getElementById("dropdown-phone")), 104 (countryListUl = document.getElementById("country-list")), 105 (phoneTextCode = document.getElementById("phone-text-code")), 106 (phoneCodeInput = document.getElementById("phone-code")), 107 (phoneNumberInput = document.querySelector('input[name="phone_number"]')), 108 (spinnerContact = document.querySelector("div#spinner_contact")), 109 (closeFormBtn = document.querySelector("#close_form")), 110 (responseFailContact = document.querySelector("div#response_fail_contact")), 111 (responseSuccessContact = document.querySelector( 112 "div#response_success_contact" 113 )), 114 (emailValidateMessage = document.querySelector("#email-validate-message")), 115 (phoneNumberValidateMessage = document.querySelector( 116 "#phone-number-validate-message" 117 )), 118 (contactFormFields = document.querySelector("div#contact_form_fields")), 119 (contactSubmitSuccessMessage = document.querySelector( 120 "div#contact_submit_sucess_message" 121 )), 122 (filterYearWebinar = document.querySelectorAll(".filter-year-webinar")), 123 (webinarItems = document.querySelectorAll(".webinar-item")), 124 (downLoadFormContainer = document.querySelector( 125 "div#download_form_container" 126 )), 127 (downLoadForm = document.querySelector("form#download_form")), 128 (closedownLoadBtn = document.querySelector("img#close_download")), 129 (downLoadFormBtn = document.querySelectorAll(".open-download")), 130 (cudaSpanList = document.querySelectorAll("div#select_cuda span")), 131 (selectCudaElement = document.querySelectorAll("select#cuda")), 132 (spinnerDownload = document.querySelector("div#spinner_download")), 133 (responseFailDownload = document.querySelector( 134 "div#response_fail_download" 135 )), 136 (downloadResponse = document.querySelector("div#download_alpha_result")), 137 (textareaScript = document.querySelector("textarea#download_script")), 138 (copyBtn = document.querySelector("img#download_copy")), 139 (userPopover = document.querySelector("#user-popover")), 140 (userAvatar = document.querySelector("#user-popover #avatar")), 141 (userMenu = document.querySelector("#user-popover #menu")), 142 (signInBtn = document.querySelector("#sign-in-btn")), 143 (signOutBtn = document.querySelector("#sign-out-btn")), 144 (userTab = document.querySelector("#user-tab")), 145 (signInTab = document.querySelector("#sign-in-tab")), 146 (subscribeWebinarBtn = document.querySelector("#subscribe-webinar-btn")), 147 (webinarForm = document.querySelector("#webinar_form")), 148 (closeWebinarFormBtn = document.querySelector("#close_webinar_form")), 149 (webinarRequestType = document.querySelector( 150 "#webinar_form #request_type" 151 )), 152 (webinarFirstName = document.querySelector("#webinar_form #first_name")), 153 (webinarLastName = document.querySelector("#webinar_form #last_name")), 154 (webinarEmail = document.querySelector("#webinar_form #email")), 155 (webinarCompany = document.querySelector("#webinar_form #company")), 156 (webinarCheckBox = document.querySelector("#webinar_form #checkbox")), 157 (webinarSubmitBtn = document.querySelector("#webinar_form button")), 158 (webinarSpinnerForm = document.querySelector( 159 "#webinar_form div#spinner_contact" 160 )), 161 (webinarResponseFail = document.querySelector( 162 "#webinar_form div#response_fail_contact" 163 )), 164 (webinarResponseSuccess = document.querySelector( 165 "#webinar_form div#response_success_contact" 166 )), 167 (webinarSelectRequest = document.querySelector("#webinar-select-request")), 168 selectRequest && 169 (selectElementList = [ 170 { element: selectRequest, field: "OpenSelectRequest" }, 171 ]), 172 document.querySelectorAll(".service-tab").forEach((e) => { 173 e.addEventListener("click", () => { 174 handleOnSelectServicesTab(e.getAttribute("data-tab")); 175 }); 176 }), 177 handleOnSelectServicesTab(serviceTab), 178 webinarSelectRequest && 179 selectElementList.push({ 180 element: webinarSelectRequest, 181 field: "WebinarSelectRequest", 182 }); 183} 184function loadJSON(e) { 185 var t = new XMLHttpRequest(); 186 return t.open("GET", e, !1), t.send(null), JSON.parse(t.responseText); 187} 188function loadConutryList(e) { 189 e.forEach((e) => { 190 let t = document.createElement("li"); 191 (t.innerHTML = ` 192 <button type="button" 193 data-code=${e.code} 194 data-country-name=${e.country_name} 195 class="inline-flex w-full px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left" 196 role="menuitem">
197 <span class="inline-flex items-center"> 198 ${mapPhoneCode(e)} 199 </span> 200 </button> 201 `), 202 countryListUl.appendChild(t); 203 }); 204} 205function AddEventListener() { 206 try { 207 if (coll) 208 for (let e = 0; e < coll.length; e++) 209 coll[e].addEventListener("click", handleCollapseMobileMenu); 210 if ( 211 (snapContainer && 212 (console.log("Snap container"), 213 snapContainer.addEventListener( 214 "scroll", 215 (e) => { 216 window.innerHeight >= 713 && 217 window.innerWidth >= 769 && 218 HandleWindowScroll(e); 219 }, 220 !1 221 )), 222 selectElementList.length > 0 && 223 window.addEventListener("click", (e) => { 224 handleClickOutsideSelect(e); 225 }), 226 downLoadFormBtn) 227 ) 228 for (let t = 0; t < downLoadFormBtn.length; t++) 229 downLoadFormBtn[t].addEventListener("click", () => { 230 HandleOpenDownload(!0); 231 }); 232 if (contactForm) { 233 let n = loadJSON("/static/assets/data/country.json"); 234 n && loadConutryList(n), 235 countryListUl && 236 countryListUl.addEventListener("click", function (e) { 237 if (e.target.closest("button")) { 238 let t = e.target.closest("button"), 239 n = t.getAttribute("data-code"), 240 o = t.getAttribute("data-country-name"); 241 phoneCodeInput && 242 (phoneCodeInput.value = mapPhoneCode({ 243 code: n, 244 country_name: o, 245 })), 246 phoneTextCode && (phoneTextCode.value = n); 247 let a = document.querySelector('input[name="phone_number"]'); 248 a && a.focus(), 249 togglePhoneBtn && handleCloseCountryList(), 250 resetCountryListForm(); 251 } 252 }), 253 contactForm.addEventListener("submit", (e) => HandleSubmitContact(e)); 254 } 255 if (contactFormV2) { 256 contactFormV2.addEventListener("submit", (e) => 257 HandleSubmitContactV2(e) 258 ); 259 } 260 if ( 261 (contactDatbaseForm && 262 contactDatbaseForm.addEventListener("submit", (e) => 263 HandleSubmitContactDatabase(e) 264 ), 265 accordionsQA && 266 accordionsQA.forEach((e) => { 267 let t = e.querySelector("button"), 268 n = e.querySelector(".answer"), 269 o = e.querySelector("img"); 270 e.classList.contains("default-open") && 271 ((n.style.height = n.scrollHeight + "px"), 272 o.classList.add("rotate-45")), 273 t.addEventListener("click", () => { 274 let e = o.classList.contains("rotate-45"); 275 e 276 ? ((n.style.height = "0px"), o.classList.remove("rotate-45")) 277 : ((n.style.height = n.scrollHeight + "px"), 278 o.classList.add("rotate-45")); 279 }); 280 }), 281 contactBtn) 282 ) 283 for (let a = 0; a < contactBtn.length; a++) 284 contactBtn[a].addEventListener("click", () => { 285 handleOpenContactForm(!0); 286 }); 287 if ( 288 (closedownLoadBtn && 289 closedownLoadBtn.addEventListener("click", () => { 290 HandleOpenDownload(!1); 291 }), 292 closeFormBtn && 293 closeFormBtn.addEventListener("click", () => { 294 handleOpenContactForm(!1); 295 }), 296 togglePhoneBtn && 297 phoneCodeInput && 298 togglePhoneBtn.addEventListener("click", () => { 299 phoneCodeInput.focus(), handleOpenCountryList(); 300 }), 301 phoneCodeInput && 302 (phoneCodeInput.addEventListener("focus", () => { 303 handleOpenCountryList(); 304 }), 305 phoneCodeInput.addEventListener( 306 "input", 307 debounce(filterCountries, 200) 308 ), 309 phoneCodeInput.addEventListener("blur", () => { 310 setTimeout(() => { 311 document.activeElement.closest("#country-list") || 312 handleCloseCountryList(); 313 }, 100); 314 })), 315 cudaSpanList) 316 ) 317 for (let l = 0; l < cudaSpanList.length; l++) 318 cudaSpanList[l].addEventListener("click", (e) => { 319 HandleChooseType(e); 320 }); 321 if ( 322 (downLoadForm && 323 downLoadForm.addEventListener("submit", (e) => HandleSubmitDownload(e)), 324 copyBtn && copyBtn.addEventListener("click", (e) => CopyScript(e)), 325 openIcon && 326 openIcon.addEventListener("click", () => { 327 handleOpenMenu(); 328 }), 329 selectRequest && 330 (selectRequest 331 .querySelector("#bio-select-request-container") 332 .addEventListener("click", function () { 333 try { 334 let e = selectRequest.querySelector(dropdownSelector), 335 t = selectRequest.querySelector(inActiveIconSelector), 336 n = selectRequest.querySelector(activeIconSelector); 337 handleSelectMethodToggle(e, n, t, "OpenSelectRequest"); 338 } catch (o) { 339 console.log(o); 340 } 341 }), 342 selectRequest.querySelectorAll("input[type=radio]").forEach((e) => { 343 e.addEventListener("change", (e) => { 344 handleSelectDropdownOption(selectRequest, e.target.value); 345 }); 346 })), 347 filterYearWebinar && 348 filterYearWebinar.forEach((e) => { 349 e.addEventListener("click", () => { 350 let t = document.querySelectorAll(".filter-year-selected"); 351 t[0] && t[0].classList.remove("filter-year-selected");
352 let n = e.dataset.filterYear; 353 e.classList.add("filter-year-selected"); 354 for (let o = 0; o < webinarItems?.length; o++) { 355 let a = webinarItems[o], 356 l = a.dataset.year; 357 if ("all" === n) { 358 a.classList.remove("hidden"); 359 continue; 360 } 361 n !== l 362 ? a.classList.add("hidden") 363 : a.classList.remove("hidden"); 364 } 365 }); 366 }), 367 webinarSelectRequest && 368 (webinarSelectRequest 369 .querySelector("#bio-select-request-container") 370 .addEventListener("click", function () { 371 console.log("click webinar select request"); 372 try { 373 let e = webinarSelectRequest.querySelector(dropdownSelector), 374 t = webinarSelectRequest.querySelector(inActiveIconSelector), 375 n = webinarSelectRequest.querySelector(activeIconSelector); 376 handleSelectMethodToggle(e, n, t, "WebinarSelectRequest"); 377 } catch (o) { 378 console.log(o); 379 } 380 }), 381 webinarSelectRequest 382 .querySelectorAll("input[type=radio]") 383 .forEach((e) => { 384 e.addEventListener("change", (e) => { 385 handleSelectDropdownOption(webinarSelectRequest, e.target.value); 386 }); 387 })), 388 contactBtn) 389 ) 390 for (let i = 0; i < contactBtn.length; i++) 391 contactBtn[i].addEventListener("click", () => { 392 handleOpenContactForm(!0); 393 }); 394 subscribeWebinarBtn && 395 subscribeWebinarBtn.addEventListener("click", function () { 396 handleOpenWebinarForm(!0); 397 }), 398 webinarForm && 399 (handleValidateWebinarForm(), 400 webinarForm.addEventListener("submit", function (e) { 401 HandleSubmitWebinarForm(e); 402 })), 403 closeWebinarFormBtn && 404 closeWebinarFormBtn.addEventListener("click", () => { 405 handleOpenWebinarForm(!1); 406 }), 407 UserPopoverEventListener(); 408 } catch (r) { 409 console.log(r); 410 } 411} 412function AddSectionObserver() { 413 try { 414 let e = [], 415 t = { root: null, threshold: [0.8] }; 416 for (let n = 0; n < sectionEles.length; n++) 417 (e[n] = new IntersectionObserver(intersectionCallback, t)), 418 e[n].observe(sectionEles[n]); 419 } catch (o) { 420 console.log(o); 421 } 422} 423function debounce(e, t, n) { 424 let o = null, 425 a = !1; 426 return function () { 427 try { 428 let n = detectScrollDirection(), 429 l = $("#snap_container"); 430 if (!a) { 431 var i; 432 let r = this, 433 s = [].slice.call(arguments); 434 s.push(n), 435 (i = function () { 436 e.apply(r, s); 437 }), 438 $("body").scroll(() => console.log("document scroll")), 439 l.css("overflow-y", "hidden"), 440 i(), 441 (a = !0); 442 } 443 null == o && 444 (console.log("setting timeout"), 445 (o = setTimeout(() => { 446 console.log("running timeout"), 447 (a = !1), 448 clearTimeout(o), 449 (o = null), 450 l.css("overflow-y", "auto"); 451 }, 1.5 * t))); 452 } catch (c) { 453 console.log(c); 454 } 455 }; 456} 457const detectScrollDirection = (function () { 458 let e, 459 t, 460 n = lastScrollTopInit || 0; 461 return function (o) { 462 try { 463 return ( 464 (t = snapContainer.scrollTop) >= n ? (e = !0) : t < n && (e = !1), 465 (n = t <= 0 ? 0 : t), 466 e 467 ); 468 } catch (a) { 469 console.log(a); 470 } 471 }; 472})(); 473function moveTo(e, t = 1e3) { 474 try { 475 let n = $("#snap_container"), 476 o = $(n[0].children[e > 0 ? e : 0]), 477 a = o.position().top, 478 l = a + n.scrollTop(); 479 console.log("moving to: " + l), n.animate({ scrollTop: l }, t); 480 } catch (i) { 481 console.log(i); 482 } 483} 484const HandleWindowScroll = debounce(function (e, ...t) { 485 console.log("Scroll", t[0]); 486 try { 487 t[0] ? moveTo(pageIndex + 1) : moveTo(pageIndex - 1); 488 } catch (n) { 489 console.log(n); 490 } 491 }, 1e3), 492 intersectionCallback = function (e) { 493 try { 494 e.forEach((e) => { 495 let t = e.intersectionRatio; 496 if (t > 0.7) { 497 let n = e.target.getAttribute("data-anchor"); 498 pageIndex = Number(n); 499 } 500 }); 501 } catch (t) { 502 console.log(t); 503 } 504 }; 505function handleOpenMenu() { 506 try { 507 "none" == hiddenMenu.style.display 508 ? ((hiddenMenu.style.display = "flex"), 509 (openIcon.querySelector("img#open_icon").style.display = "none"), 510 (openIcon.querySelector("img#close_icon").style.display = "inline")) 511 : ((hiddenMenu.style.display = "none"), 512 (openIcon.querySelector("img#open_icon").style.display = "inline"), 513 (openIcon.querySelector("img#close_icon").style.display = "none")); 514 } catch (e) { 515 console.log(e); 516 } 517} 518function handleCollapseMobileMenu() { 519 try { 520 this.classList.toggle("active"); 521 let e = this.nextElementSibling, 522 t = this.querySelectorAll("img"); 523 t.forEach((e) => { 524 e.classList.toggle("hidden"); 525 }), 526 e.style.maxHeight 527 ? (e.style.maxHeight = null) 528 : (e.style.maxHeight = e.scrollHeight + "px"); 529 } catch (n) { 530 console.log(n); 531 } 532} 533function debounce(e, t) { 534 let n; 535 return function (...o) { 536 clearTimeout(n), (n = setTimeout(() => e.apply(this, o), t)); 537 }; 538} 539function filterCountries() { 540 let e = phoneCodeInput.value.trim().toLowerCase(); 541 countryItems = document.querySelectorAll("#country-list li"); 542 let t = !1;
543 countryItems.forEach((n) => { 544 let o = n.querySelector("button"), 545 a = o?.textContent.toLowerCase() || ""; 546 a.includes(e) 547 ? ((t = !0), n.classList.remove("hidden")) 548 : n.classList.add("hidden"); 549 }); 550 let n = document.getElementById("search-empty"); 551 if (t) 552 countryListUl?.classList?.remove("hidden"), n?.classList?.add("hidden"); 553 else if (n) 554 countryListUl?.classList?.add("hidden"), n?.classList?.remove("hidden"); 555 else { 556 let o = document.createElement("div"); 557 (o.innerHTML = ` 558 <div id="search-empty" class="flex justify-center w-full py-2"> 559 <span class="text-sm">No select</span> 560 </div> 561 `), 562 dropdownPhone.appendChild(o), 563 countryListUl?.classList?.add("hidden"); 564 } 565} 566function handleOpenCountryList() { 567 dropdownPhone.style.height = "auto"; 568 let e = dropdownPhone.scrollHeight + "px"; 569 (dropdownPhone.style.maxHeight = e), 570 dropdownPhone.classList.remove("opacity-0", "pointer-events-none"), 571 dropdownPhone.classList.add("opacity-100"); 572} 573function handleCloseCountryList() { 574 (dropdownPhone.style.height = "0px"), 575 dropdownPhone.classList.add("opacity-0", "pointer-events-none"), 576 dropdownPhone.classList.remove("opacity-100"); 577} 578function handleOpenContactForm(e, t) { 579 try { 580 e 581 ? ((contactForm.style.display = "flex"), t && setInitFormValue(t)) 582 : ((contactForm.style.display = "none"), clearContactForm()); 583 } catch (n) { 584 console.log(n); 585 } 586} 587function toggleSelectUI(e, t, n, o) { 588 try { 589 o 590 ? ((e.style.display = "flex"), 591 (t.style.display = "block"), 592 (n.style.display = "none")) 593 : ((e.style.display = "none"), 594 (t.style.display = "none"), 595 (n.style.display = "block")); 596 } catch (a) { 597 console.log(a); 598 } 599} 600function handleSelectMethodToggle(e, t, n, o) { 601 try { 602 (openSelectState[o] = !openSelectState[o]), 603 openSelectState[o] 604 ? toggleSelectUI(e, t, n, !0) 605 : toggleSelectUI(e, t, n, !1); 606 } catch (a) { 607 console.log(a); 608 } 609} 610function handleClickOutsideSelect(e) { 611 try { 612 selectElementList.forEach((t) => { 613 let { element: n, field: o } = t; 614 if (!n?.contains(e.target)) { 615 let a = n.querySelector(dropdownSelector), 616 l = n.querySelector(inActiveIconSelector), 617 i = n.querySelector(activeIconSelector); 618 toggleSelectUI(a, i, l, !1), (openSelectState[o] = !1); 619 } 620 }); 621 } catch (t) { 622 console.log(t); 623 } 624} 625function handleCloseAlSelect() { 626 try { 627 selectElementList.forEach((e) => { 628 let { element: t, field: n } = e, 629 o = t.querySelector(dropdownSelector), 630 a = t.querySelector(inActiveIconSelector), 631 l = t.querySelector(activeIconSelector); 632 toggleSelectUI(o, l, a, !1), (openSelectState[n] = !1); 633 }); 634 } catch (e) { 635 console.log(e); 636 } 637} 638function handleSelectDropdownOption(e, t, n) { 639 try { 640 let o = e.querySelector(selectInputSelector), 641 a = o.querySelector("input"); 642 if (n) { 643 if (t.checked) multiSelectValue = multiSelectValue + t.value + ", "; 644 else { 645 let l = t.value + ", "; 646 multiSelectValue = multiSelectValue.replace(l, ""); 647 } 648 (o.innerHTML = multiSelectValue), a && (a.innerHTML = multiSelectValue); 649 } else (o.innerHTML = t), handleCloseAlSelect(), a && (a.value = t); 650 } catch (i) { 651 console.log(i); 652 } 653} 654function setInitFormValue(e) { 655 try { 656 let t = document.querySelector( 657 `input[name="request_type"][value="${e.requestVal}"]` 658 ); 659 t && (t.checked = !0), 660 (selectRequest.querySelector(selectInputSelector).innerHTML = 661 e.requestVal), 662 (document.querySelector('textarea[name="note"]').value = e.noteVal); 663 } catch (n) { 664 console.log(n); 665 } 666} 667function HandleOpenDownload(e) { 668 try { 669 e 670 ? (downLoadFormContainer.style.display = "flex") 671 : (downLoadFormContainer.style.display = "none"); 672 } catch (t) { 673 console.log(t); 674 } 675} 676const UpdateUISelected = () => { 677 cudaSpanList.forEach((e) => { 678 e.classList.remove("border-main-midnight", "text-main-midnight"), 679 e.getAttribute("data-cuda") === selectCudaElement.value && 680 e.classList.add("border-main-midnight", "text-main-midnight"); 681 }); 682 }, 683 HandleChooseType = (e) => { 684 try { 685 (selectCudaElement.value = e.target.getAttribute("data-cuda")), 686 UpdateUISelected(); 687 } catch (t) { 688 console.log(t); 689 } 690 }, 691 clearContactForm = () => { 692 let e = document.querySelector('input[name="email"]'), 693 t = document.querySelector('input[name="first_name"]'), 694 n = document.querySelector('input[name="last_name"]'), 695 o = document.querySelector('input[name="company"]'), 696 a = document.querySelector('input[name="phone_number"]'), 697 l = document.querySelector('textarea[name="note"]'), 698 i = document.querySelector('input[name="request_type"]'), 699 r = selectRequest.querySelector(selectInputSelector), 700 s = document.getElementById("data"), 701 c = document.getElementById("information"), 702 d = document.getElementById("representative"); 703 e && (e.value = ""), 704 t && (t.value = ""), 705 n && (n.value = ""), 706 o && (o.value = ""), 707 a && (a.value = ""), 708 l && (l.value = ""), 709 i && (i.value = ""),
710 responseFailContact && (responseFailContact.innerHTML = ""), 711 r && (r.innerHTML = ""), 712 s && (s.checked = !1), 713 c && (c.checked = !1), 714 d && (d.checked = !1), 715 phoneCodeInput && (phoneCodeInput.value = ""), 716 dropdownPhone && handleCloseCountryList(), 717 phoneCodeInput && (phoneCodeInput.required = !1), 718 a && (a.required = !1), 719 resetCountryListForm(); 720 }, 721 resetCountryListForm = () => { 722 countryItems = document.querySelectorAll("#country-list li"); 723 let e = document.getElementById("search-empty"); 724 countryItems.forEach((e) => { 725 e.classList.remove("hidden"); 726 }), 727 e && e.classList.add("hidden"); 728 }, 729 HandleSubmitContact = async (e) => { 730 try { 731 if ((e.preventDefault(), contactForm)) { 732 let t = new FormData(e.target), 733 n = t.get("email"), 734 o = t.get("phone_number"), 735 a = phoneTextCode?.value; 736 if (n && !isValidEmail(n)) { 737 emailValidateMessage.classList.remove("hidden"); 738 return; 739 } 740 if (o && !a) { 741 phoneCodeInput.required = !0; 742 return; 743 } 744 if (!o && a) { 745 phoneNumberInput.required = !0; 746 return; 747 } 748 if (o && ((o = a + o), !isValidPhone(o))) { 749 phoneNumberValidateMessage.classList.remove("hidden"); 750 return; 751 } 752 (responseFailContact.style.display = "none"), 753 (responseSuccessContact.style.display = "none"), 754 (responseFailContact.innerHTML = ""), 755 (responseSuccessContact.innerHTML = ""), 756 (spinnerContact.style.display = "flex"), 757 emailValidateMessage.classList.add("hidden"), 758 phoneNumberValidateMessage.classList.add("hidden"); 759 let l = {}; 760 for (let i of t.entries()) l[i[0]] = i[1]; 761 (l = { ...l, phone_number: o?.toString(), app_id: "homepage" }), 762 console.log("multipart/form-data", l); 763 let r = JSON.stringify(l), 764 s = window.location.origin + "/wapi/contact/add", 765 c = await fetch(s, { 766 method: "POST", 767 mode: "cors", 768 headers: { 769 "Content-Type": "application/json", 770 Authorization: publicKeyApi, 771 }, 772 body: r, 773 }); 774 if ( 775 ((spinnerContact.style.display = "none"), 776 (responseFailContact.style.display = "flex"), 777 200 === c.status) 778 ) { 779 let d = await c.json(); 780 if (0 === d.status) { 781 (responseSuccessContact.style.display = "flex"), 782 (responseSuccessContact.innerHTML = 783 "Your request is successful sent"), 784 setTimeout(() => { 785 handleOpenContactForm(!1), 786 (responseSuccessContact.innerHTML = ""); 787 }, 1500), 788 clearContactForm(); 789 return; 790 } 791 } 792 (responseFailContact.style.display = "flex"), 793 (responseFailContact.innerHTML = 794 "Something went wrong, Please try again"); 795 } 796 } catch (u) { 797 console.log(u.message); 798 } 799 }, 800 isValidEmail = (e) => INVALID_EMAIL_SUFFIX.every((t) => !e.endsWith(t)), 801 isValidPhone = (e) => { 802 let t = /^\+?[0-9\s\-().]{7,20}$/; 803 return t.test(e); 804 }; 805function mapPhoneCode(e) { 806 let { code: t, country_name: n } = e; 807 return `(${(t = t.includes("-") ? t : `+${t}`)}) ${n}`; 808} 809const HandleSubmitDownload = (e) => { 810 try { 811 if ( 812 (e.preventDefault(), 813 (responseFailDownload.style.display = "none"), 814 (responseFailDownload.innerHTML = ""), 815 (spinnerDownload.style.display = "flex"), 816 downLoadForm) 817 ) { 818 let t = new FormData(e.target), 819 n = {}; 820 for (let o of t.entries()) n[o[0]] = o[1]; 821 (n.os = "linux"), (n = JSON.stringify(n)); 822 let a = new XMLHttpRequest(), 823 l = "https://alpha.bioturing.com/install"; 824 a.open("POST", l, !0), 825 a.setRequestHeader("Content-type", "application/json"), 826 (a.onreadystatechange = function () { 827 if (4 == a.readyState && 200 == a.status) { 828 let e = JSON.parse(a.responseText); 829 (spinnerDownload.style.display = "none"), 830 console.log("spinnerDownload", e), 831 (downloadResponse.style.display = "flex"), 832 e?.script 833 ? (textareaScript.value = e.script) 834 : (textareaScript.value = 835 "Something went wrong, Please try again"); 836 } else 837 4 == a.readyState && 838 200 !== a.status && 839 ((spinnerDownload.style.display = "none"), 840 (responseFailDownload.style.display = "block"), 841 (responseFailDownload.innerHTML = 842 "Something went wrong, Please try again")); 843 }), 844 a.send(n); 845 } 846 } catch (i) { 847 console.log(i.message); 848 } 849 }, 850 HandleSubmitWebinarForm = async (e) => { 851 try { 852 e.preventDefault(); 853 let t = !webinarSubmitBtn.classList.contains("btn-disabled"); 854 if (!t) return; 855 if ( 856 ((webinarResponseFail.style.display = "none"), 857 (webinarResponseFail.innerHTML = ""), 858 (webinarResponseSuccess.style.display = "none"), 859 (webinarResponseSuccess.innerHTML = ""), 860 (webinarSpinnerForm.style.display = "flex"), 861 webinarForm) 862 ) { 863 let n = new FormData(e.target), 864 o = {}; 865 for (let a of n.entries()) o[a[0]] = a[1]; 866 (o = { ...o, app_id: "homepage" }), 867 console.log("multipart/form-data", o); 868 let l = JSON.stringify({ email: o.email }), 869 i = JSON.stringify(o), 870 r = window.location.origin + "/wapi/contact/add", 871 s = window.location.origin + "/wapi/subscribe/add", 872 c = await fetch(r, { 873 method: "POST", 874 mode: "cors", 875 headers: { 876 "Content-Type": "application/json", 877 Authorization: publicKeyApi, 878 }, 879 body: i, 880 }), 881 d = await fetch(s, { 882 method: "POST", 883 mode: "cors", 884 headers: { 885 "Content-Type": "application/json", 886 Authorization: publicKeyApi, 887 }, 888 body: l, 889 }); 890 if ( 891 ((webinarSpinnerForm.style.display = "none"), 892 (webinarResponseFail.style.display = "flex"), 893 200 === c.status && 200 === d.status) 894 ) { 895 let u = await c.json(), 896 p = await d.json(); 897 if (0 === u.status && 0 === p.status) { 898 (webinarResponseSuccess.style.display = "flex"), 899 (webinarResponseSuccess.innerHTML = 900 "Your request is successful sent"), 901 setTimeout(() => { 902 (webinarResponseSuccess.style.display = "none"), 903 (webinarResponseSuccess.innerHTML = ""), 904 handleOpenWebinarForm(!1); 905 }, 1500); 906 return; 907 } 908 } 909 (webinarResponseFail.style.display = "flex"), 910 (webinarResponseFail.innerHTML = 911 "Something went wrong, Please try again"), 912 setTimeout(() => { 913 (webinarResponseFail.style.display = "none"), 914 (webinarResponseFail.innerHTML = ""), 915 handleOpenWebinarForm(!1); 916 }, 1500); 917 } 918 } catch (y) { 919 console.log(y.message); 920 } 921 }; 922function handleOpenWebinarForm(e, t) { 923 try { 924 e 925 ? ((webinarForm.style.display = "flex"), 926 setInitWebinarFormValue({ requestVal: "When AI meets Biology" })) 927 : (webinarForm.style.display = "none"); 928 } catch (n) { 929 console.log(n); 930 } 931} 932function handleValidateWebinarForm() { 933 let e = [ 934 webinarFirstName, 935 webinarLastName, 936 webinarEmail, 937 webinarCompany, 938 webinarCheckBox, 939 ]; 940 e?.some((e) => !e) || 941 e?.forEach((e) => { 942 "checkbox" === e.id 943 ? e.addEventListener("click", function (e) { 944 handleActiveWebinarFormBtn(); 945 }) 946 : e.addEventListener("keyup", (e) => { 947 handleActiveWebinarFormBtn(); 948 }); 949 }); 950} 951function setInitWebinarFormValue(e) { 952 try { 953 if (!webinarSelectRequest) return; 954 webinarSelectRequest.querySelector( 955 `input[name="request_type"][value="${e.requestVal}"]` 956 ).checked = !0; 957 let t = webinarSelectRequest.querySelector(".bio-select-input"); 958 t.innerHTML = e.requestVal;
959 } catch (n) { 960 console.log(n); 961 } 962} 963const handleActiveWebinarFormBtn = () => { 964 if (!webinarSubmitBtn) return; 965 let e = webinarSelectRequest.querySelector(".bio-select-input").innerHTML, 966 t = webinarFirstName.value, 967 n = webinarLastName.value, 968 o = webinarEmail.value, 969 a = webinarCompany.value, 970 l = webinarCheckBox.checked; 971 webinarSubmitBtn.classList.contains("btn-disabled"), 972 e && t && n && o && a && l 973 ? webinarSubmitBtn.classList.remove("btn-disabled") 974 : webinarSubmitBtn.classList.add("btn-disabled"); 975 }, 976 CopyScript = () => { 977 try { 978 textareaScript.select(), 979 textareaScript.setSelectionRange(0, 99999), 980 navigator.clipboard.writeText(textareaScript.value); 981 } catch (e) { 982 console.log(e); 983 } 984 }, 985 UserPopoverEventListener = () => { 986 userPopover && 987 userAvatar && 988 userMenu && 989 signOutBtn && 990 (document.addEventListener("click", function (e) { 991 let t = e?.target?.getAttribute("id"), 992 n = userMenu?.classList?.contains("block"); 993 "menu" !== t && 994 n && 995 (userMenu.classList.add("hidden"), 996 userMenu.classList.remove("block")); 997 }), 998 userPopover.addEventListener("click", function (e) { 999 e?.stopPropagation(); 1000 let t = userMenu?.classList?.contains("block"); 1001 t 1002 ? (userMenu.classList.add("hidden"), 1003 userMenu.classList.remove("block")) 1004 : (userMenu.classList.remove("hidden"), 1005 userMenu.classList.add("block")); 1006 }), 1007 $(".sign-out-btn").click(function (e) { 1008 e?.stopPropagation(), 1009 $.ajax({ 1010 type: "GET", 1011 url: "/wapi/logout", 1012 crossDomain: !0, 1013 processData: !1, 1014 contentType: !1, 1015 headers: { 1016 "Access-Control-Allow-Origin": "*", 1017 Authorization: 1018 "uW0/hz/C0BHN0p+3+rV3r3OW7xndrRDqdJ7Mz8F7SgIYZLlCNJdlCDn618StAdGGUosjVODhB/bW2RwAkDzwjA==", 1019 }, 1020 success: function (e) { 1021 window.location.href = "/"; 1022 }, 1023 }); 1024 })); 1025 }, 1026 generateAvatar = (e) => { 1027 let t = e?.split(" "); 1028 return t?.length > 1 1029 ? (t[0][0] + t[1][0])?.toUpperCase() 1030 : t?.[0]?.substring(0, 2)?.toUpperCase(); 1031 }, 1032 Sliding = () => { 1033 let e = document.getElementsByClassName("wb-slide"), 1034 t = document.querySelectorAll("#slide-control .dot"); 1035 (e = [...e].sort((e, t) => { 1036 e.dataset.order, t.dataset.order; 1037 })), 1038 (t = [...t]); 1039 let n = e?.length; 1040 t.forEach((o, a) => { 1041 o.addEventListener("click", function () { 1042 console.log("index", a), 1043 (ActiveSlide = a), 1044 (e[a].style.display = "table"), 1045 (e[n - 1 - a].style.display = "none"), 1046 o.classList.add("dot-active"), 1047 t[n - 1 - a].classList.remove("dot-active"); 1048 }); 1049 }), 1050 e[ActiveSlide].classList.remove("animate-slideIn"), 1051 e[ActiveSlide].classList.add("animate-slideOut"), 1052 (e[ActiveSlide].style.translateX = 2e3 * (n - 1)), 1053 (e[ActiveSlide].dataset.order = n), 1054 e[n - 1 - ActiveSlide].classList.remove("animate-slideOut"), 1055 e[n - 1 - ActiveSlide].classList.add("animate-slideIn"), 1056 t[ActiveSlide].classList.remove("dot-active"), 1057 t[n - 1 - ActiveSlide].classList.add("dot-active"), 1058 ++ActiveSlide > n - 1 && (ActiveSlide = 0), 1059 console.log("slides", e); 1060 }, 1061 WebinarSlideControl = () => { 1062 new Swiper("#webinar", { 1063 loop: !0, 1064 pagination: { el: ".swiper-pagination", clickable: !0 }, 1065 navigation: { 1066 nextEl: ".swiper-button-next", 1067 prevEl: ".swiper-button-prev", 1068 }, 1069 autoplay: { delay: 5e3, disableOnInteraction: !1 }, 1070 }); 1071 }, 1072 TestimonialSlideControl = () => { 1073 document.querySelectorAll(".swiper-slide"); 1074 var e = document.querySelector(":root"); 1075 function t() { 1076 e.style.setProperty( 1077 "--standard-container-width", 1078 $(".max-w-standard").width() + "px" 1079 ), 1080 e.style.setProperty( 1081 "--scrollbar-width", 1082 window.innerWidth - document.documentElement.clientWidth + "px" 1083 ); 1084 } 1085 t(), 1086 window.addEventListener("resize", t), 1087 new Swiper("#testimonial", { 1088 loop: !0, 1089 slidesPerView: "auto", 1090 navigation: { 1091 nextEl: "button[data-testimonial-next-btn]", 1092 prevEl: "button[data-testimonial-prev-btn]", 1093 }, 1094 mousewheel: { enabled: !0, forceToAxis: !0, invert: !1 },
1095 initialSlide: 0, 1096 cssMode: !1, 1097 }); 1098 }; 1099window.addEventListener("DOMContentLoaded", () => { 1100 try { 1101 InitVariable(), 1102 AddEventListener(), 1103 AddSectionObserver(), 1104 WebinarSlideControl(), 1105 TestimonialSlideControl(); 1106 } catch (e) { 1107 console.log(e); 1108 } 1109}), 1110 $(document).ready(function () { 1111 try { 1112 let e = $("section").length, 1113 t = window.innerWidth >= 768; 1114 t && 1115 window.isMobile && 1116 $("#pagepiling").pagepiling({ 1117 menu: null, 1118 scrollingSpeed: 100, 1119 afterLoad: function (t, n) { 1120 e === n ? $("#fix_buttons").fadeOut() : $("#fix_buttons").fadeIn(); 1121 }, 1122 }); 1123 } catch (n) {} 1124 }); 1125const HandleSubmitContactV2 = async (e) => { 1126 try { 1127 if ((e.preventDefault(), contactFormV2)) { 1128 let t = new FormData(e.target), 1129 n = t.get("email"), 1130 o = t.get("phone_number"), 1131 l = t.get("platform_bbrowserx"), 1132 i = t.get("platform_talk2data"), 1133 r = t.get("platform_spatialx"), 1134 s = t.get("platform_smartbulk"), 1135 c = t.get("platform_biostudio"), 1136 d = joinPlatforms(l, i, r, s, c), 1137 u = t.get("tech_platform_bulk_sequencing"), 1138 p = t.get("tech_platform_single_cell_omics"), 1139 y = t.get("tech_platform_spatial_omics"), 1140 m = joinTechnologyPlatforms(u, p, y); 1141 if (n && !isValidEmail(n)) { 1142 emailValidateMessage.classList.remove("hidden"); 1143 return; 1144 } 1145 if (o && !isValidPhone(o)) { 1146 phoneNumberValidateMessage.classList.remove("hidden"); 1147 return; 1148 } 1149 1150 (responseFailContact.style.display = "none"), 1151 (responseSuccessContact.style.display = "none"), 1152 (responseFailContact.innerHTML = ""), 1153 (responseSuccessContact.innerHTML = ""), 1154 (spinnerContact.style.display = "flex"), 1155 emailValidateMessage.classList.add("hidden"), 1156 phoneNumberValidateMessage.classList.add("hidden"); 1157 let h = {}; 1158 for (let b of t.entries()) h[b[0]] = b[1]; 1159 let S = { 1160 ...h, 1161 phone_number: o?.toString(), 1162 platform: d, 1163 technology_platform: m, 1164 app_id: "homepage", 1165 }, 1166 g = JSON.stringify(S), 1167 f = window.location.origin + "/wapi/contact/add", 1168 w = await fetch(f, { 1169 method: "POST", 1170 mode: "cors", 1171 headers: { 1172 "Content-Type": "application/json", 1173 Authorization: publicKeyApi, 1174 }, 1175 body: g, 1176 }); 1177 if ( 1178 ((spinnerContact.style.display = "none"), 1179 (contactFormFields.style.display = "none"), 1180 (contactSubmitSuccessMessage.style.display = "flex"), 1181 200 === w.status) 1182 ) { 1183 let L = await w.json(); 1184 if (0 === L.status) { 1185 (contactSubmitSuccessMessage.style.display = "flex"), 1186 window.scrollTo({ top: 20, behavior: "smooth" }); 1187 return; 1188 } 1189 } 1190 (responseFailContact.style.display = "flex"), 1191 (responseFailContact.innerHTML = 1192 "Something went wrong, Please try again"); 1193 } 1194 } catch (v) { 1195 console.log(v.message); 1196 } 1197 }, 1198 HandleSubmitContactDatabase = async (e) => { 1199 try { 1200 if ((e.preventDefault(), contactDatbaseForm)) { 1201 let t = new FormData(e.target); 1202 console.log("formData: ", t); 1203 let n = t.get("email"); 1204 if (n && !isValidEmail(n)) { 1205 emailValidateMessage.classList.remove("hidden"); 1206 return; 1207 } 1208 (responseFailContact.style.display = "none"), 1209 (responseSuccessContact.style.display = "none"), 1210 (responseFailContact.innerHTML = ""), 1211 (responseSuccessContact.innerHTML = ""), 1212 (spinnerContact.style.display = "flex"), 1213 emailValidateMessage.classList.add("hidden"); 1214 let o = {}; 1215 for (let a of t.entries()) o[a[0]] = a[1]; 1216 let l = { 1217 ...o, 1218 request_type: "Contact from Database landing page", 1219 app_id: "Database landing page", 1220 }, 1221 i = JSON.stringify(l), 1222 r = window.location.origin + "/wapi/contact/add", 1223 s = await fetch(r, { 1224 method: "POST", 1225 mode: "cors", 1226 headers: { 1227 "Content-Type": "application/json", 1228 Authorization: publicKeyApi, 1229 }, 1230 body: i, 1231 }); 1232 if ( 1233 ((spinnerContact.style.display = "none"), 1234 (contactFormFields.style.display = "none"), 1235 (contactSubmitSuccessMessage.style.display = "flex"), 1236 200 === s.status) 1237 ) { 1238 let c = await s.json(); 1239 if (0 === c.status) { 1240 (contactSubmitSuccessMessage.style.display = "flex"), 1241 window.scrollTo({ top: 20, behavior: "smooth" }); 1242 return; 1243 } 1244 } 1245 (responseFailContact.style.display = "flex"),
1246 (responseFailContact.innerHTML = 1247 "Something went wrong, Please try again"); 1248 } 1249 } catch (d) { 1250 console.log(d.message); 1251 } 1252 }; 1253function joinPlatforms(e, t, n, o, a) { 1254 return [e, a, o, n, t].filter((e) => null != e).join(", "); 1255} 1256function joinTechnologyPlatforms(e, t, n) { 1257 return [e, t, n].filter((e) => null != e).join(", "); 1258} 1259function handleOnSelectPlatform(e) { 1260 let t = new URL(window.location.href); 1261 t.searchParams.set("current_tab", e), (window.location.href = t.toString()); 1262} 1263let serviceTab = "Spatial-Annotation"; 1264function handleOnSelectServicesTab(e) { 1265 (serviceTab = e), 1266 document.querySelectorAll(".service-tab").forEach((e) => { 1267 e.getAttribute("data-tab") === serviceTab 1268 ? (e.classList.add("!text-[#0c2340]"), 1269 e.nextElementSibling.classList.add("scale-x-100")) 1270 : (e.classList.remove("!text-[#0c2340]"), 1271 e.nextElementSibling.classList.remove("scale-x-100")); 1272 }), 1273 document.querySelectorAll(".service-content").forEach((e) => { 1274 e.getAttribute("data-tab") === serviceTab 1275 ? e.classList.remove("hidden") 1276 : e.classList.add("hidden"); 1277 }); 1278} 1279function convertDOItoURL(e) { 1280 if ("string" != typeof e) return null; 1281 let t = e.trim(), 1282 n = "doi:"; 1283 if (t.toLowerCase().startsWith(n)) { 1284 let o = t.slice(n.length).trim(); 1285 return o ? `https://www.doi.org/${o}` : null; 1286 } 1287 return e; 1288} 1289document.querySelectorAll(".doi-link").forEach((e) => { 1290 e.addEventListener("click", function () { 1291 let t = e.getAttribute("data-doi"), 1292 n = convertDOItoURL(t); 1293 n && window.open(n, "_blank"); 1294 }); 1295});
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.