PageSourceSearch

https://bioturing.com/static/assets/js/script-v2.js?t=0xa44880

js bioturing.com collected 2026-10-02 11:16:35 UTC 43,628 bytes, 1,295 lines download raw bytes

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.