PageSourceSearch

https://www.klenty.com/a-a5ece2ea/assets/js/demo-request.js

js klenty.com collected 2026-09-24 20:33:33 UTC 22,578 bytes, 655 lines download raw bytes

1$(document).ready(function () {
2  $(".cancelButton").click(function () {
3    // $(".k_navbar").addClass("animebanner");
4    $(".kai-banner").removeClass("d-flex");
5    $(".kai-banner").addClass("d-none");
6    // var floatingBanner = $(".kai-banner").height() + 24;
7    // $(".k_nav_mobile_container").css("top", `${floatingBanner + 60}px`);
8    // $(".k_navbar").css("transform", `translateY(-${floatingBanner}px)`);
9    document.querySelector(".k_navbar").style.top = 0 + "px";
10  });
11
12  var getUrl = window.location.href;
13  var arr = getUrl.split("/").filter((item) => item);
14  if (arr.length < 3) {
15    $(".kai-banner").css("display", "block");
16  }
17
18  if (new URL(window.location.href).searchParams.get("utm_source")) {
19    localStorage.setItem(
20      "utm_source",
21      new URL(window.location.href).searchParams.get("utm_source")
22    );
23  }
24  var gclidFromLocal = "";
25  if (new URL(window.location.href).searchParams.get("gclid")) {
26    gclidFromLocal = new URL(window.location.href).searchParams.get("gclid");
27    localStorage.setItem("gclidFromLocal", gclidFromLocal);
28  }
29
30  if (new URL(window.location.href).searchParams.get("utm_medium")) {
31    localStorage.setItem(
32      "utm_medium",
33      new URL(window.location.href).searchParams.get("utm_medium")
34    );
35  }
36
37  var utm_campaignFromLocal = "";
38  if (new URL(window.location.href).searchParams.get("utm_campaign")) {
39    var utm_campaignFromLocal = new URL(window.location.href).searchParams.get(
40      "utm_campaign"
41    );
42  }
43
44  var page_url = window.location.href;
45
46  var page_url = window.location.href;
47
48  let pageMap = {
49    "/": "home page",
50    "/agency-dashboard": "agency-dashboard",
51    "/agency-dashboard/": "agency-dashboard",
52    "/automation": "automation",
53    "/automation/": "automation",
54    "/calls-and-tasks": "calls-and-tasks",
55    "/calls-and-tasks/": "calls-and-tasks",
56    "/salesleadgen-case-study": "salesleadgen-case-study",
57    "/salesleadgen-case-study/": "salesleadgen-case-study",
58    "/cold-email-automation": "cold-email-automation",
59    "/cold-email-automation/": "cold-email-automation",
60    "/cold-email-software": "cold-email-software",
61    "/cold-email-software/": "cold-email-software",
62    "/customer-stories": "customer-stories",
63    "/customer-stories/": "customer-stories",
64    "/cadence-playbooks": "cadences-playbook",
65    "/cadence-playbooks/": "cadences-playbook",
66    "/email-deliverability": "email-deliverability",
67    "/email-deliverability/": "email-deliverability",
68    "/email-personalization": "email-personalization",
69    "/hubspot-integration": "hubspot-integration",
70    "/hubspot-integration/": "hubspot-integration",
71    "/lemlist-alternative": "lemlist-alternative",
72    "/lemlist-alternative/": "lemlist-alternative",
73    "/lp2/outreach-alternative": "lp2/outreach-alternative",
74    "/lp2/salesloft-alternative": "lp2/salesloft-alternative",
75    "/lp/cold-email-automation": "lp/cold-email-automation",
76    "/lp/lemlist-alternative": "lp/lemlist-alternative",
77    "/lp/mailshake-alternative": "lp/mailshake-alternative",
78    "/lp/mixmax-alternative": "lp/mixmax-alternative",
79    "/lp/outreach-alternative": "lp/outreach-alternative",
80    "/lp/persistiq-alternative": "lp/persistiq-alternative",
81    "/lp/prospectio-alternative": "lp/prospectio-alternative",
82    "/lp/reply-alternative": "lp/reply-alternative",
83    "/lp/salesloft-alternative": "lp/salesloft-alternative",
84    "/lp/woodpecker-alternative": "lp/woodpecker-alternative",
85    "/lp/xant-alternative": "lp/xant-alternative",
86    "/lp/yesware-alternative": "lp/yesware-alternative",
87    "/mailshake-alternative": "mailshake-alternative",
88    "/mixmax-alternative": "mixmax-alternative",
89    "/outreach-alternative": "outreach-alternative",
90    "/persistiq-alternative": "persistiq-alternative",
91    "/pipedrive-integration": "pipedrive-integration",
92    "/pipedrive-integration/": "pipedrive-integration",
93    "/price-comparison/": "price-comparison",
94    "/sales-engagement-platform/pricing/": "pricing",
95    "/sales-engagement-platform/pricing/": "pricing",
96    "/prospectio-alternative": "prospectio-alternative",
97    "/reports-and-dashboards": "reports-and-dashboards",
98    "/reports-and-dashboards/": "reports-and-dashboards",
99    "/reply-alternative": "reply-alternative",
100    "/salesforce-integration": "salesforce-integration",
101    "/salesforce-integration/": "salesforce-integration",
102    "/salesloftcomparison-ebook": "salesloftcomparison-ebook",
103    "/slack-app-integration": "slack-app-integration",
104    "/slack-app-integration/": "slack-app-integration",
105    "/woodpecker-alternative": "woodpecker-alternative",
106    "/xant-alternative": "xant-alternative",
107    "/yesware-alternative": "yesware-alternative",
108    "/zapier-integration": "zapier-integration",
109    "/zapier-integration/": "zapier-integration",
110    "/zoho-integration": "zoho-integration",
111    "/zoho-integration/": "zoho-integration",
112    "/email-sequence-software": "email-sequence-software",
113    "/lp/email-sequence-software": "lp/email-sequence-software",
114  };
115  pageName = pageMap[window.location.pathname]
116    ? pageMap[window.location.pathname]
117    : window.location.pathname;
118
119  // Which CTA opened the demo popup, reported to Slack on submit. The click and
120  // the submit are separate handlers, so the clicked button has to be remembered
121  // here. Every open of the popup goes through this handler, so the `|| ""`
122  // clears a previous value rather than leaving a stale one on an untagged CTA.
123  var demoPlace = "";
124
125  $(".showDemoRequest").click(function () {
126    demoPlace = $(this).data("place") || "";
127    // var subProducts = getUrl.split("/");
128    // if (
129    //   subProducts.includes("call-iq") ||
130    //   subProducts.includes("prospect-iq")
131    // ) {
132    //   $(".k-signup-wrapper").removeClass("ks-displayHide");
133    //   $("body").addClass("stop-scrolling");
134    //   clearData();
135    // } else {
136    //   $("#calendly").removeClass("d-none");
137    //   $(".klentycalendly-close").click(function () {
138    //     $("#calendly").addClass("d-none");
139    //   });
140    // }
141
142    $(".k-signup-wrapper").removeClass("ks-displayHide");
143    $("body").addClass("stop-scrolling");
144    clearData();
145  });
146
147  $(".ks-close").click(function () {
148    $(".k-signup-wrapper").addClass("ks-displayHide");
149    $("body").removeClass("stop-scrolling");
150  });
151
152  function clearData() {
153    $("#demo_message").removeClass("ks-display");
154    $("#demo_emailId").val("");
155  }
156  function isEmpty(value) {
157    return !value || value == "";
158  }
159
160  function shake() {
161    setTimeout(function () {
162      $("#demo_emailId").addClass("shake");
163    }, 100);
164
165    setTimeout(function () {
166      $("#demo_emailId").removeClass("shake");
167    }, 1000);
168  }
169
170  function shake2(id) {
171    setTimeout(function () {
172      $(id).addClass("shake");
173    }, 100);
174
175    setTimeout(function () {
176      $(id).removeClass("shake");
177    }, 1000);
178  }
179
180  function emailshake() {
181    setTimeout(function () {
182      $("#scheduleEmail").addClass("shake");
183    }, 100);
184
185    setTimeout(function () {
186      $("#scheduleEmail").removeClass("shake");
187    }, 2000);
188  }
189
190  $("#scheduleBookbutton").click(function () {
191    let scheduleEmail = $("#scheduleBookEmail").val();
192    var pattern =
193      /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
194    if (isEmpty(scheduleEmail)) {
195      $(".emailErrorMessage").removeClass("d-none");
196      emailshake();
197    } else if (!pattern.test(scheduleEmail)) {
198      $(".emailErrorMessage").removeClass("d-none");
199      emailshake();
200    } else {
201      $(".emailErrorMessage").addClass("d-none");
202
203      // Calendly Integration
204      $("#calendly").removeClass("d-none");
205      $(".klentycalendly-close").click(function () {
206        $("#calendly").addClass("d-none");
207      });
208
209      // Gist code
210      gist.identify(scheduleEmail, {
211        email: scheduleEmail,
212        subscription_type: "demo_request",
213        product_type: "SEP",
214      });
215
216      // factors
217
218      try {
219        factors.track("$form_submitted", { $email: scheduleEmail });
220      } catch (e) {
221        console.log("Factors not initialized", e);
222      }
223
224      /* bing ads */
225
226      window.uetq = window.uetq || [];
227      window.uetq.push("event", "demo_form", {
228        event_category: "demo",
229        event_label: "book_demo",
230        event_value: "100",
231      });
232
233      $("#scheduleBookEmail").val("");
234    }
235  });
236
237  function openSchedulingCalendar() {
238    clearData();
239
240    $(".klentycalendly-close").click(function () {
241      $("#calendly").addClass("d-none");
242      const element = document.getElementById("my-cal-inline");
243      element.replaceChildren();
244      $("body").removeClass("stop-scrolling");
245    });
246  }
247
248  async function getValidEmailResponse(email) {
249    const response = await fetch("/validateEmail", {
250      headers: {
251        "Content-Type": "application/json",
252      },
253      method: "POST",
254      body: JSON.stringify({ email }),
255    });
256    const data = await response.json();
257    return data;
258  }
259
260  $("#requestPricingSubmit").click(async function (e) {
261    // This button sits inside a form GTM tracks, so the browser's own
262    // submission would reach GTM before the checks below run. Cancel it here
263    // and dispatch the submit event only once every field is valid.
264    if (e) e.preventDefault();
265    const pricingForm = $(this).closest("form")[0];
266
267    let pageURL = window.location.href;
268    let parts = pageURL.split("/");
269
270    let email = $("#pricing_emailId").val();
271    let mobile = $("#pricing_mobile").val();
272
273    // let pattern =
274    //   /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
275
276    let pattern =
277      /^[a-zA-Z0-9.%+-]+@(?!gmail.com)(?!gmail.co)(?!yahoo.co)(?!yahoo.com)(?!hotmail.co)(?!hotmail.com)(?!yahoo.co.in)(?!aol.com)(?!live.com)(?!outlook.co)(?!outlook.com)[a-zA-Z0-9-]+.[a-zA-Z0-9-.]{2,61}$/;
278
279    if (isEmpty(email)) {
280      $("#pricing_message").addClass("ks-display");
281      shake2("#pricing_emailId");
282    } else if (!pattern.test(email)) {
283      $("#pricing_message").text("* Please enter a valid work email ID");
284      $("#pricing_message").addClass("ks-display");
285      shake2("#pricing_emailId");
286    } else if (!isEmpty(mobile) && !/^\d*$/.test(mobile)) {
287      $("#pricing_message").removeClass("ks-display");
288      $("#pricing_mobile_message").text("* Please enter a valid mobile number");
289      $("#pricing_mobile_message").addClass("ks-display");
290      shake2("#pricing_mobile");
291    } else {
292      $("#pricing_mobile_message").removeClass("ks-display");
293      fireFormSubmitEvent(pricingForm);
294
295      let responseEmailValid = null;
296      if (responseEmailValid === null) {
297        $("#validatingText2").removeClass("d-none");
298      }
299
300      var new_lead = {};
301
302      new_lead["Email"] = email;
303
304      $.ajax({
305        type: "post",
306        url: "/demoRequest",
307        data: {new_lead, page: window.location.href},
308        contentType: "application/x-www-form-urlencoded",
309      });
310
311      gist.identify(email, {
312        email: email,
313        subscription_type: "demo_request",
314        product_type: "Dial IQ",
315      });
316
317      $("#validatingText2").addClass("d-none");
318
319      clearData();
320      $(".k-signup-wrapper2").addClass("ks-displayHide");
321      $("body").removeClass("stop-scrolling");
322
323      $("#calendly").removeClass("d-none");
324      $(".klentycalendly-close").click(function () {
325        $("#calendly").addClass("d-none");
326      });
327
328      // factors
329      try {
330        factors.track("$form_submitted", { $email: email });
331      } catch (e) {
332        console.log("Factors not initialized", e);
333      }
334
335      /* bing ads */
336
337      window.uetq = window.uetq || [];
338      window.uetq.push("event", "demo_form", {
339        event_category: "demo",
340        event_label: "book_demo",
341        event_value: "100",
342      });
343    }
344  });
345
346  // The pricing form does its work in the click handler above; the submit event
347  // exists purely so GTM can count it. Cancel the navigation explicitly rather
348  // than relying on formEmailValid.js happening to be loaded on the page.
349  $("#requestPricingSubmit")
350    .closest("form")
351    .on("submit", function (e) {
352      e.preventDefault();
353    });
354
355  // Single source of truth for demo-email validation. Used both by the
356  // pre-submit check on the click/Enter and by the submit handler below, so the
357  // two can never disagree about whether an email is acceptable.
358  const DEMO_EMAIL_PATTERN =
359    /^[a-zA-Z0-9.%+-]+@(?!gmail.com)(?!gmail.co)(?!yahoo.co)(?!yahoo.com)(?!hotmail.co)(?!hotmail.com)(?!yahoo.co.in)(?!aol.com)(?!live.com)(?!outlook.co)(?!outlook.com)[a-zA-Z0-9-]+.[a-zA-Z0-9-.]{2,61}$/;
360
361  function isDemoEmailValid(email) {
362    return !isEmpty(email) && DEMO_EMAIL_PATTERN.test(email);
363  }
364
365  function showDemoEmailError(email) {
366    if (!isEmpty(email)) {
367      $("#demo_message").text("* Please enter a valid work email ID");
368    }
369    $("#demo_message").addClass("ks-display");
370    shake();
371  }
372
373  // Fires a real submit event so GTM's Form Submission trigger sees it. The
374  // bound handlers preventDefault, so nothing navigates. dispatchEvent is the
375  // fallback for Safari older than 16, which lacks requestSubmit.
376  function fireFormSubmitEvent(form) {
377    if (!form) return;
378    if (typeof form.requestSubmit === "function") {
379      form.requestSubmit();
380    } else {
381      form.dispatchEvent(
382        new Event("submit", { bubbles: true, cancelable: true })
383      );
384    }
385  }
386
387  const handleRequestDemoSubmit = async function (e) {
388    if (e) e.preventDefault();
389    let pageURL = window.location.href;
390    let parts = pageURL.split("/");
391
392    let email = $("#demo_emailId").val();
393
394    if (!isDemoEmailValid(email)) {
395      showDemoEmailError(email);
396    } else {
397      let responseEmailValid = null;
398      if (responseEmailValid === null) {
399        $("#validatingText").removeClass("d-none");
400      }
401
402      $("#demo_message").removeClass("ks-display");
403      var new_lead = {};
404
405      new_lead["Email"] = email;
406
407      $.ajax({
408        type: "post",
409        url: "/demoRequest",
410        data: {new_lead, page: window.location.href, place: demoPlace},
411        contentType: "application/x-www-form-urlencoded",
412      });
413
414      const productType = parts.includes("call-iq")? "Call IQ" : parts.includes("dial-iq")? "Dial IQ" : "SEP";
415
416      gist.identify(email, {
417        email: email,
418        subscription_type: "demo_request",
419        product_type: productType,
420      });
421
422      // pipedrive data sending
423      let productCategory = "Klenty SEP";
424      let label = 564;
425      if(productType === "Call IQ" || productType === "Dial IQ"){
426        productCategory = "Dialer"
427        label = 563;
428      }
429
430      $.ajax({
431        type: "post",
432        url: "/pipedrive",
433        data: {email, productCategory, label, pageUrl: window.location.origin + window.location.pathname },
434        contentType: "application/x-www-form-urlencoded",
435      });
436
437      $("#validatingText").addClass("d-none");
438      window.postMessage(
439        { type: "TRIGGER_KLENTY_CALENDAR", email: email },
440        "*"
441      );
442      $("#requestDemoSubmit").addClass("d-none");
443      $("#requestDemoSubmiting").removeClass("d-none");
444      openSchedulingCalendar();
445
446      // factors
447      try {
448        factors.track("$form_submitted", { $email: email });
449      } catch (e) {
450        console.log("Factors not initialized", e);
451      }
452
453      /* bing ads */
454
455      window.uetq = window.uetq || [];
456      window.uetq.push("event", "demo_form", {
457        event_category: "demo",
458        event_label: "book_demo",
459        event_value: "100",
460      });
461    }
462  };
463
464  // Validates before any submit event exists, then dispatches one only if the
465  // email is good. GTM's Form Submission trigger fires the instant a submit
466  // event reaches the document — i.e. before the handler above can reject the
467  // email — so without this every failed attempt counted as a conversion.
468  function attemptRequestDemoSubmit(e) {
469    if (e) e.preventDefault(); // stop the browser submitting on its own
470    var email = $("#demo_emailId").val();
471    if (!isDemoEmailValid(email)) {
472      showDemoEmailError(email);
473      return;
474    }
475    fireFormSubmitEvent($("#requestDemoSubmit").closest("form")[0]);
476  }
477
478  // Bind the demo submit to the enclosing form's native submit event (not the
479  // button's click). The native submit event still fires and bubbles, so GTM's
480  // Form Submission trigger catches it; preventDefault inside the handler only
481  // cancels the actual navigation/reload. Falls back to the button click on the
482  // few pages where the button isn't wrapped in a <form> (e.g. seasonal pages).
483  var $requestDemoForm = $("#requestDemoSubmit").closest("form");
484  if ($requestDemoForm.length) {
485    $requestDemoForm.on("submit", handleRequestDemoSubmit);
486
487    // Only on the GTM-tracked form. Everywhere else the button keeps today's
488    // behaviour untouched — several pages carry their own inline
489    // #requestDemoSubmit click handlers, and some render two buttons with that
490    // same id, so this deliberately changes nothing outside #newDemoForm.
491    if ($requestDemoForm.attr("id") === "newDemoForm") {
492      $("#requestDemoSubmit").on("click", attemptRequestDemoSubmit);
493      $("#demo_emailId").on("keydown", function (e) {
494        // Enter would otherwise submit the form straight past validation.
495        if (e.key === "Enter") attemptRequestDemoSubmit(e);
496      });
497    }
498  } else {
499    $("#requestDemoSubmit").on("click", handleRequestDemoSubmit);
500  }
501
502  $("#requestDemoSubmit2").click(async function () {
503    let email = $("#demo_emailId").val();
504    let firstname = $("#demo_firstname").val();
505    let lastname = $("#demo_lastname").val();
506    let company = $("#demo_company").val();
507    let phone = $("#demo_phone").val();
508
509    // let pattern =
510    //   /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
511
512    let pattern =
513      /^[a-zA-Z0-9.%+-]+@(?!gmail.com)(?!gmail.co)(?!yahoo.co)(?!yahoo.com)(?!hotmail.co)(?!hotmail.com)(?!yahoo.co.in)(?!aol.com)(?!live.com)(?!outlook.co)(?!outlook.com)[a-zA-Z0-9-]+.[a-zA-Z0-9-.]{2,61}$/;
514
515    if (isEmpty(email)) {
516      $("#demo_message").addClass("ks-display");
517      shake();
518    } else if (!pattern.test(email)) {
519      $("#demo_message").text("* Please enter a valid work email ID");
520      $("#demo_message").addClass("ks-display");
521      shake();
522    } else {
523      let responseEmailValid = null;
524      if (responseEmailValid === null) {
525        $("#validatingText").removeClass("d-none");
526      }
527
528      $("#demo_message").removeClass("ks-display");
529      var new_lead = {};
530
531      new_lead["Email"] = email;
532
533      $.ajax({
534        type: "post",
535        url: "/demoRequest",
536        data: {new_lead, page: window.location.href},
537        contentType: "application/x-www-form-urlencoded",
538      });
539
540      gist.identify(email, {
541        email: email,
542        subscription_type: "demo_request",
543        product_type: "Dial IQ",
544      });
545
546      // pipedrive data sending
547      $.ajax({
548        type: "post",
549        url: "/pipedrive",
550        data: {email, productCategory: "Dialer", label: 563, pageUrl: window.location.origin + window.location.pathname},
551        contentType: "application/x-www-form-urlencoded",
552      });
553
554      $("#validatingText").addClass("d-none");
555      window.postMessage(
556        { type: "TRIGGER_KLENTY_CALENDAR", email: email },
557        "*"
558      );
559      $("#requestDemoSubmit2").addClass("d-none");
560      $("#requestDemoSubmiting2").removeClass("d-none");
561      formSubmit();
562
563      // factors
564      try {
565        factors.track("$form_submitted", { $email: email });
566      } catch (e) {
567        console.log("Factors not initialized", e);
568      }
569
570      /* bing ads */
571
572      window.uetq = window.uetq || [];
573      window.uetq.push("event", "demo_form", {
574        event_category: "demo",
575        event_label: "book_demo",
576        event_value: "100",
577      });
578    }
579  });
580});
581
582$(document).ready(function () {
583  function takeatour() {
584    $(".btn-cross-takeatour").css("display", "block");
585    $(".takeatour-popup").css("display", "block");
586  }
587
588  setTimeout(function () {
589    $(".errorMessage").text("");
590  }, 0);
591
592  var emailId = localStorage.getItem("takeatour");
593
594  if (emailId == null) {
595    // $(".takeatour-popup").css("display", "block");
596    // $(".btn-cross-takeatour").css("display", "none");
597    // $(".takeatourForm").removeClass("d-none");
598    // $(".takeatourForm").css("z-index", "1001");
599
600    $(".takeatourForm").addClass("d-none");
601    takeatour();
602  } else {
603    $(".takeatourForm").addClass("d-none");
604    takeatour();
605  }
606
607  $(".ks-close-takeatour").click(function () {
608    $(".takeatourForm").addClass("d-none");
609    $(".takeatour-popup").css("display", "none");
610    // $("#tour_demo_email").value("");
611  });
612
613  var pattern =
614    /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
615  var workEmail = /^[a-zA-Z0-9.%+-]+@(?!gmail.com)(?!gmail.co)(?!yahoo.co)(?!yahoo.com)(?!hotmail.co)(?!hotmail.com)(?!yahoo.co.in)(?!aol.com)(?!live.com)(?!outlook.co)(?!outlook.com)[a-zA-Z0-9-]+.[a-zA-Z0-9-.]{2,61}$/;
616  $("#videoSubmit").prop("disabled", true);
617
618  var username = "";
619
620  $("#tour_demo_email").on("blur keyup change click", function () {
621    username = $("#tour_demo_email").val();
622
623    if (username && username != "" && pattern.test(username)) {
624      $(".errorMessage").text("");
625      if (workEmail.test(username)) {
626        $("#videoSubmit").prop("disabled", false);
627      } else {
628        $(".errorMessage").text("* Please use your work email to register");
629        $("#videoSubmit").prop("disabled", true);
630      }
631    } else {
632      $("#videoSubmit").prop("disabled", true);
633      $(".errorMessage").text("");
634    }
635  });
636
637  $(".errorMessage").text("");
638  $("#productTourDemo").submit(function (e) {
639    $(".takeatourForm").addClass("d-none");
640    $(".btn-cross-takeatour").css("display", "block");
641    $("#tour_demo_email").val("");
642    return false;
643  });
644
645  $(".product-tour").click(function () {
646    $(".btn-cross-tour").css("display", "block");
647    localStorage.setItem("takeatour", username);
648    takeatour();
649  });
650
651  $(".btn-cross-takeatour").click(function () {
652    $("body").removeClass("stop-scrolling");
653    $(".takeatour-popup").css("display", "none");
654  });
655});

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.