PageSourceSearch

https://vxceed.com/js/main.v2.js

js vxceed.com collected 2026-10-03 21:02:56 UTC 15,126 bytes, 453 lines download raw bytes

1(function () {
2  const el = document.getElementById("footer-placeholder");
3  if (!el) return;
4  const ready = el.children.length
5    ? Promise.resolve()
6    : fetch("/components/footer.html").then((r) => r.text()).then((html) => { el.innerHTML = html; });
7  ready
8    .then(() => {
9      const dateEl = document.getElementById("date");
10      if (dateEl) dateEl.textContent = new Date().getFullYear();
11    })
12    .catch((err) => console.error("Footer failed to load", err));
13})();
14
15(function () {
16  const el = document.getElementById("header-placeholder");
17  if (!el) return;
18  const ready = el.children.length
19    ? Promise.resolve()
20    : fetch("/components/header.html").then((r) => r.text()).then((html) => { el.innerHTML = html; });
21  ready.then(() => {
22
23    const cfg = window.HEADER_CONFIG || {};
24    const activeLink = cfg.activeLink || "";
25    const whiteHeader = cfg.whiteHeader || false;
26    const whiteLogo = cfg.whiteLogoOnLoad || false;
27
28    const header = document.getElementById("mainnavigationBar");
29    if (!header) return;
30
31    // --- WHITE HEADER BG ---
32    if (whiteHeader) {
33      header.classList.remove("bg-transparent");
34      header.classList.add("why-us-header");
35    }
36
37    // --- LOGO SWAP ---
38    const whiteLogoEl = document.querySelector(".white-logo");
39    const colorLogoEl = document.querySelector(".colored-logo");
40
41    if (whiteLogo && whiteLogoEl && colorLogoEl) {
42      const isScrolledOnLoad = window.scrollY > 10;
43      whiteLogoEl.style.display = isScrolledOnLoad ? "none" : "block";
44      colorLogoEl.style.display = isScrolledOnLoad ? "block" : "none";
45
46      window.addEventListener("scroll", function () {
47        const isScrolled = window.scrollY > 10;
48        whiteLogoEl.style.display = isScrolled ? "none" : "block";
49        colorLogoEl.style.display = isScrolled ? "block" : "none";
50      });
51    }
52    // --- ACTIVE LINK via data-menu ---
53    if (activeLink) {
54      document
55        .querySelectorAll(`.nav-list li[data-menu="${activeLink}"]`)
56        .forEach(function (li) {
57          const isMobile = li.closest(".mobile-menu") !== null;
58
59          // The clickable element — either <a> or <p> (for dropdowns)
60          const anchor = li.querySelector(":scope > a");
61          const dropdown = li.querySelector(":scope > p");
62          const target = anchor || dropdown;
63          if (!target) return;
64
65          target.classList.add("active");
66
67          // Desktop only: wrap in nav-gradient-border span
68          if (!isMobile) {
69            const span = document.createElement("span");
70            span.className = "nav-gradient-border";
71            li.insertBefore(span, target);
72            span.appendChild(target);
73          }
74        });
75    }
76
77    // --- MOBILE MENU ---
78    let btn = document.querySelector("button.mobile-menu-button"),
79      menu = document.querySelector(".mobile-menu"),
80      btnClose = document.querySelector(".navbar-toggle-close");
81
82    if (btn && menu) {
83      btn.addEventListener("click", () => {
84        menu.classList.remove("hidden");
85        menu.classList.add("open");
86      });
87    }
88    if (btnClose && menu) {
89      btnClose.addEventListener("click", () => {
90        menu.classList.add("hidden");
91        menu.classList.remove("open");
92      });
93    }
94
95    // --- STICKY NAV ---
96    function handleScroll() {
97      var e = window.pageYOffset,
98        t = document.getElementById("top-nav");
99
100      if (30 <= e) {
101        header.classList.add("nav-sticky", "header-nav-bg");
102        t &&
103          (t.classList.add("scale-y-0", "origin-top"),
104            t.classList.remove("scale-y-100"));
105      } else {
106        header.classList.remove("nav-sticky", "header-nav-bg");
107        t &&
108          (t.classList.remove("scale-y-0", "origin-top"),
109            t.classList.add("scale-y-100", "origin-top"));
110      }
111    }
112
113    // --- SUBMENU TOGGLE ---
114    document.querySelectorAll(".submenu-toggle").forEach((btn) => {
115      btn.addEventListener("click", function () {
116        const parent = this.closest(".menu-item");
117        if (parent) parent.classList.toggle("active");
118      });
119    });
120
121    window.addEventListener("scroll", handleScroll);
122    handleScroll();
123  });
124})();
125
126// ============================================================
127// YEAR
128// ============================================================
129// let date = new Date(),
130//   year = date.getFullYear();
131
132// if (document.getElementById("date")) {
133//   document.getElementById("date").innerHTML = year;
134// }
135
136// ============================================================
137// MARQUEE CLIENTS
138// ============================================================
139if (null != document.querySelector("#clients")) {
140  let e = document.documentElement,
141    t = getComputedStyle(e).getPropertyValue("--marquee-elements-displayed"),
142    n = document.querySelector(".marquee-content");
143  if (n) {
144    e.style.setProperty("--marquee-elements", n.children.length);
145    for (let i = 0; i < t; i++) n.appendChild(n.children[i].cloneNode(true));
146  }
147}
148
149// ============================================================
150// COUNTERS
151// ============================================================
152let section_counter = document.querySelector("#counter"),
153  counters = document.querySelectorAll(".counter");
154
155if (section_counter) {
156  let e = new IntersectionObserver(
157    (e, t) => {
158      var [e] = e;
159      e.isIntersecting &&
160        (counters.forEach((n, e) => {
161          n.innerHTML = "0";
162          let a = () => {
163            var e = +n.getAttribute("data-value"),
164              t = +n.innerHTML;
165            t < e
166              ? ((n.innerHTML = "" + Math.ceil(t + e / 5e3)), setTimeout(a, 1))
167              : (n.innerHTML = e);
168          };
169          (a(),
170            n.parentElement.style.animation
171              ? (n.parentElement.style.animation = "")
172              : (n.parentElement.style.animation = `slide-up 0.3s ease forwards ${e / counters.length + 1.5}s`));
173        }),
174          t.unobserve(section_counter));
175    },
176    { root: null, threshold: 1 },
177  );
178  e.observe(section_counter);
179}
180
181let trusted_counter = document.querySelector("#counter_trusted"),
182  trusted_counters = document.querySelectorAll(".counterTrusted");
183
184if (trusted_counter) {
185  let e = new IntersectionObserver(
186    (e, t) => {
187      var [e] = e;
188      e.isIntersecting &&
189        (trusted_counters.forEach((n, e) => {
190          n.innerHTML = "0";
191          let a = () => {
192            var e = +n.getAttribute("data-value"),
193              t = +n.innerHTML;
194            t < e
195              ? ((n.innerHTML = "" + Math.ceil(t + e / 5e3)), setTimeout(a, 1))
196              : (n.innerHTML = e);
197          };
198          (a(),
199            n.parentElement.style.animation
200              ? (n.parentElement.style.animation = "")
201              : (n.parentElement.style.animation = `slide-up 0.3s ease forwards ${e / trusted_counters.length + 1.5}s`));
202        }),
203          t.unobserve(trusted_counter));
204    },
205    { root: null, threshold: 1 },
206  );
207  e.observe(trusted_counter);
208}
209
210let company_bar = document.querySelector("#company_bar"),
211  companyBarItem = document.querySelectorAll(".companyBar");
212
213if (company_bar) {
214  let e = new IntersectionObserver(
215    (e, t) => {
216      var [e] = e;
217      e.isIntersecting &&
218        (companyBarItem.forEach((n, e) => {
219          n.innerHTML = "0";
220          let a = () => {
221            var e = +n.getAttribute("data-value"),
222              t = +n.innerHTML;
223            t < e
224              ? ((n.innerHTML = "" + Math.ceil(t + e / 5e3)), setTimeout(a, 1))
225              : (n.innerHTML = e);
226          };
227          (a(),
228            n.parentElement.style.animation
229              ? (n.parentElement.style.animation = "")
230              : (n.parentElement.style.animation = `slide-up 0.3s ease forwards ${e / companyBarItem.length + 1.5}s`));
231        }),
232          t.unobserve(company_bar));
233    },
234    { root: null, threshold: 1 },
235  );
236  e.observe(company_bar);
237}
238
239// ============================================================
240// FAQ ACCORDION
241// ============================================================
242document.querySelectorAll(".faq-header").forEach((n) => {
243  n.addEventListener("click", (e) => {
244    let t = n.nextElementSibling;
245    if (!t || n.classList.contains("collapsing")) return;
246    if (n.classList.contains("open")) {
247      ((t.classList = "faq-body collapsing"),
248        setTimeout(() => {
249          t.style.height = "0px";
250        }, 1),
251        setTimeout(() => {
252          ((t.classList = "faq-body close"), (t.style.height = ""));
253        }, 300));
254    } else {
255      t.style.display = "block";
256      let e = t.clientHeight;
257      (setTimeout(() => {
258        ((t.style.height = e + "px"), (t.style.display = ""));
259      }, 1),
260        (t.classList = "faq-body collapsing"),
261        setTimeout(() => {
262          t.classList = "faq-body close open";
263        }, 300));
264    }
265    n.classList.toggle("open");
266  });
267});
268
269// ============================================================
270// PRICING TOGGLE
271// ============================================================
272var checkBox = document.getElementById("priceCheck");
273function check() {
274  for (
275    var e = document.getElementsByClassName("price-month"),
276    t = document.getElementsByClassName("price-year"),
277    n = 0;
278    n < e.length;
279    n++
280  )
281    !1 === checkBox.checked
282      ? ((e[n].style.display = "block"), (t[n].style.display = "none"))
283      : !0 === checkBox.checked &&
284      ((e[n].style.display = "none"), (t[n].style.display = "block"));
285}
286if (checkBox) {
287  check();
288  checkBox.addEventListener("click", check);
289}
290
291// ============================================================
292// SWIPER
293// ============================================================
294let testimoial = document.querySelector("#testionial")
295  ? new Swiper("#testionial", {
296    loop: true,
297    spaceBetween: 45,
298    autoplay: { delay: 2500, disableOnInteraction: false },
299    pagination: { el: ".swiper-pagination", clickable: true },
300    breakpoints: {
301      640: { slidesPerView: 1, spaceBetween: 0 },
302      768: { slidesPerView: 2, spaceBetween: 45 },
303      1024: { slidesPerView: 3, spaceBetween: 45 },
304    },
305  })
306  : null;
307
308let bloglFeature = document.querySelector("#blog-feature")
309  ? new Swiper("#blog-feature", {
310    loop: true,
311    slidesPerView: 1,
312    spaceBetween: 45,
313    autoplay: { delay: 10000, disableOnInteraction: false },
314    pagination: { el: ".swiper-pagination", clickable: true },
315    speed: 800,
316    effect: "slide",
317  })
318  : null;
319
320// ============================================================
321// FAQ TABS
322// ============================================================
323let faqTabs = document.querySelectorAll("ul.faq-tabs > li");
324function myTabClicks(e) {
325  for (let e = 0; e < faqTabs.length; e++)
326    faqTabs[e].classList.remove("tabActive");
327  e.currentTarget.classList.add("tabActive");
328  e.preventDefault();
329  var t = document.querySelectorAll(".tab-pane");
330  for (let e = 0; e < t.length; e++) t[e].classList.remove("tabActive");
331  e = e.target.getAttribute("href");
332  if (document.querySelector(e))
333    document.querySelector(e).classList.add("tabActive");
334}
335for (let e = 0; e < faqTabs.length; e++)
336  faqTabs[e].addEventListener("click", myTabClicks);
337
338// ============================================================
339// FANCYBOX
340// ============================================================
341if (typeof Fancybox !== "undefined") {
342  Fancybox.bind("[data-fancybox]", {});
343}
344
345// ============================================================
346// GSAP MOTION PATH
347// ============================================================
348if (typeof gsap !== "undefined" && typeof MotionPathPlugin !== "undefined") {
349  gsap.registerPlugin(MotionPathPlugin);
350
351  const rectIds = [
352    "#rect",
353    "#rect-2",
354    "#rect-3",
355    "#rect-4",
356    "#rect-5",
357    "#rect-6",
358  ];
359  const pathIds = [
360    "#path",
361    "#path-2",
362    "#path-3",
363    "#path-4",
364    "#path-5",
365    "#path-6",
366  ];
367
368  const existingRects = rectIds.filter((id) => document.querySelector(id));
369  if (existingRects.length) {
370    gsap.set(existingRects.join(", "), { opacity: 1 });
371    existingRects.forEach((rectId, i) => {
372      const pathId = pathIds[i];
373      if (document.querySelector(pathId)) {
374        gsap.from(rectId, {
375          motionPath: {
376            path: pathId,
377            autoRotate: true,
378            align: pathId,
379            alignOrigin: [0.5, 0.5],
380          },
381          duration: 2,
382          ease: "none",
383          repeat: -1,
384          repeatDelay: 0,
385        });
386      }
387    });
388  }
389}
390
391// ============================================================
392// MODALS (page-level, outside header)
393// ============================================================
394let modal = document.getElementById("modal"),
395  modal2 = document.getElementById("modal2"),
396  modalOpenBtn2 = document.getElementById("open-btn-2"),
397  modalOpenBtn3 = document.getElementById("open-btn-3"),
398  modalOpenBtn4 = document.getElementById("open-btn-4"),
399  modalCloseBtn = document.getElementById("ok-btn"),
400  modalCloseBtn2 = document.getElementById("ok-btn2");
401
402if (modalOpenBtn2 && modal)
403  modalOpenBtn2.onclick = function () {
404    modal.style.display = "flex";
405  };
406if (modalOpenBtn3 && modal2)
407  modalOpenBtn3.onclick = function () {
408    modal2.style.display = "flex";
409  };
410if (modalOpenBtn4 && modal2)
411  modalOpenBtn4.onclick = function () {
412    modal2.style.display = "flex";
413  };
414if (modalCloseBtn && modal)
415  modalCloseBtn.onclick = function () {
416    modal.style.display = "none";
417  };
418if (modalCloseBtn2 && modal2)
419  modalCloseBtn2.onclick = function () {
420    modal2.style.display = "none";
421  };
422
423window.onclick = function (e) {
424  if (modal && e.target == modal) modal.style.display = "none";
425  if (modal2 && e.target == modal2) modal2.style.display = "none";
426};
427
428// ============================================================
429// AOS
430// ============================================================
431if (typeof AOS !== "undefined") {
432  AOS.init({
433    disable: function () {
434      return window.innerWidth < 768;
435    },
436  });
437}
438
439// ============================================================
440// PARALLAX SCENE
441// ============================================================
442if (null != document.querySelector("#scene")) {
443  let e = document.getElementById("scene");
444  function parallax(a) {
445    this.querySelectorAll(".parallax-effect").forEach((e) => {
446      var t = e.getAttribute("parallax-value"),
447        n = (e.offsetWidth - a.pageX * t) / 90,
448        t = (e.offsetWidth - a.pageY * t) / 90;
449      e.style.cssText = `transform: translateX(${n}px) translateY(${t}px); transition-duration: 0.1s;`;
450    });
451  }
452  e.addEventListener("mousemove", parallax);
453}

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.