PageSourceSearch

https://www.hashtagtreinamentos.com/wp-content/themes/hashtag/dese…/assets/js/precheckout.js?ver=1790280271

js hashtagtreinamentos.com collected 2026-09-25 14:11:38 UTC 66,787 bytes, 1,795 lines download raw bytes

1function onlyDigits(v) {
2    return String(v || "").replace(/\D+/g, "");
3}
4
5function atribuirFuncoesBotao(botoes, tipoLink, pixBillet) {
6    botoes.forEach((botao) => {
7        botao.href = "javascript:void(0)";
8
9        botao.addEventListener("click", function () {
10            if (
11                parametroCurso === "com" &&
12                paramTipo &&
13                [
14                    "netflix-dados",
15                    "comunidade-programadores",
16                    "vit",
17                    "trial7",
18                    "aut",
19                    "fat",
20                ].includes(paramTipo)
21            ) {
22                definirLinkCheckout(
23                    dicLinksCheckout[parametroFonte][tipoLink][paramTipo],
24                    dicSrcPadrao,
25                    pixBillet,
26                );
27            } else if (window.ehCupom) {
28                const cupomHidePixEBoleto =
29                    parametroCupomNormalizado === "flow-2";
30                const cupomHidePixSemBoleto = [
31                    "castro",
32                    "flow-org",
33                    "fundador",
34                    "zico",
35                ].includes(parametroCupomNormalizado);
36                const pixBilletCupom =
37                    cupomHidePixEBoleto || cupomHidePixSemBoleto ? 1 : 0;
38                const billetCupom = cupomHidePixEBoleto
39                    ? 1
40                    : cupomHidePixSemBoleto
41                      ? ""
42                      : undefined;
43
44                definirLinkCheckout(
45                    dicLinksCheckout["lespera"]["cp"][
46                        parametroCupomNormalizado
47                    ],
48                    dicSrcPadrao,
49                    pixBilletCupom,
50                    billetCupom,
51                );
52            } else {
53                console.log({ tipoLink });
54                definirLinkCheckout(
55                    dicLinksCheckout[parametroFonte][tipoLink][parametroCurso],
56                    dicSrcPadrao,
57                    pixBillet,
58                );
59            }
60        });
61    });
62}
63
64function togglePopupAberto(spinner) {
65    if (popupContainerEl) {
66        popupContainerEl.classList.toggle("visivel");
67        popupContainerEl.removeAttribute("style");
68    } else {
69        bodyEl.classList.toggle("popup-aberto");
70    }
71
72    if (spinner) {
73        togglePopupSpinner();
74    }
75}
76
77function trocarConteudoPopup(conteudo, texto, togglePopup) {
78    let divConteudo =
79        formActive.parentElement.querySelector(".popup__conteudo");
80
81    if (conteudo == "trilha") {
82        formActive.style.display = "none";
83
84        divConteudo.removeAttribute("style");
85        divConteudo.innerText = texto;
86    } else {
87        divConteudo.style.display = "none";
88        formActive.removeAttribute("style");
89    }
90
91    if (togglePopup) {
92        togglePopupAberto(false);
93    }
94}
95
96function togglePopupSpinner() {
97    if (popupContainerEl) {
98        popupContainerEl
99            .querySelector(".caixa-popup")
100            .classList.add("carregando-spinner");
101        popupContainerEl
102            .querySelector(".fundo-spinner")
103            .classList.add("carregando-spinner");
104    } else {
105        bodyEl.classList.add("popup-aberto--spinner");
106    }
107}
108
109function marcarPrecheckoutHiaEnviado() {
110    if (parametroCurso !== "hia") return;
111
112    try {
113        sessionStorage.setItem("hashiaPrecheckoutEnviado", "1");
114    } catch (error) {}
115}
116
117function precheckoutHiaJaEnviado() {
118    if (parametroCurso !== "hia") return false;
119
120    try {
121        return sessionStorage.getItem("hashiaPrecheckoutEnviado") === "1";
122    } catch (error) {
123        return false;
124    }
125}
126
127function enviarFormulario() {
128    togglePopupSpinner();
129    marcarPrecheckoutHiaEnviado();
130    formActive.submit();
131}
132
133function limparCamposCheckoutHia() {
134    if (parametroCurso !== "hia") return;
135
136    checkoutHiaSelecionado = "";
137
138    [
139        linkTempIDProdutoForm,
140        linkTempIDOfertaForm,
141        linkTempSRCForm,
142        linkTempPixBilletForm,
143        linkTempPixForm,
144        linkTempBilletForm,
145    ].forEach((campo) => {
146        if (campo) {
147            campo.value = "";
148        }
149    });
150}
151
152function resetarEstadoCheckoutHia() {
153    if (parametroCurso !== "hia") return;
154
155    limparCamposCheckoutHia();
156    bodyEl.classList.remove("popup-aberto", "popup-aberto--spinner");
157    document.querySelector(".popup")?.setAttribute("aria-hidden", "true");
158    document
159        .querySelectorAll(".carregando-spinner")
160        .forEach((elemento) => elemento.classList.remove("carregando-spinner"));
161}
162
163function definirCheckoutHiaSelecionado(IDLinkTemp, srcForm) {
164    if (parametroCurso !== "hia" || !IDLinkTemp) return;
165
166    const checkoutUrl = new URL("https://pay.hotmart.com/" + IDLinkTemp[0]);
167    const srcCheckout = String(srcForm || "").trim();
168    const sckCheckout = String(
169        document.querySelector("[name='field[158]']")?.value || "",
170    ).trim();
171
172    checkoutUrl.searchParams.set("off", IDLinkTemp[1]);
173
174    if (linkTempPixForm?.value !== "") {
175        checkoutUrl.searchParams.set("hidePix", linkTempPixForm.value);
176    }
177
178    if (linkTempBilletForm?.value !== "") {
179        checkoutUrl.searchParams.set("hideBillet", linkTempBilletForm.value);
180    }
181
182    checkoutUrl.searchParams.set("checkoutMode", "10");
183
184    if (srcCheckout) {
185        checkoutUrl.searchParams.set("src", srcCheckout);
186    }
187
188    if (sckCheckout) {
189        checkoutUrl.searchParams.set("sck", sckCheckout);
190    }
191
192    checkoutHiaSelecionado = checkoutUrl.toString();
193}
194
195function redirecionarCheckoutHiaSeReenvio() {
196    if (
197        parametroCurso !== "hia" ||
198        !precheckoutHiaJaEnviado() ||
199        !checkoutHiaSelecionado
200    ) {
201        return false;
202    }
203
204    togglePopupSpinner();
205    window.location.href = checkoutHiaSelecionado;
206    return true;
207}
208
209function definirLinkCheckout(IDLinkTemp, srcForm, pixBillet, billet) {
210    limparCamposCheckoutHia();
211
212    if (
213        linkTempIDProdutoForm &&
214        linkTempIDOfertaForm &&
215        linkTempSRCForm &&
216        linkTempPixBilletForm
217    ) {
218        console.log(IDLinkTemp[0], IDLinkTemp[1], srcForm, pixBillet);
219        linkTempIDProdutoForm.value = IDLinkTemp[0];
220        linkTempIDOfertaForm.value = IDLinkTemp[1];
221        linkTempSRCForm.value = srcForm;
222
223        if (parametroCurso === "claude" && parametroFonte === "jornada") {
224            linkTempPixBilletForm.value = 1;
225            if (linkTempPixForm) {
226                linkTempPixForm.value = 1;
227            }
228            if (linkTempBilletForm) {
229                linkTempBilletForm.value = 1;
230            }
231        } else if (parametroTipo === "fat") {
232            // Campanha wfat: checkout com Pix e sem boleto. O formulario 15647
233            // usa os campos separados; o combinado legado fica vazio.
234            // Vem antes do ramo `com`+`aula` porque a pagina serve os dois ao mesmo
235            // tempo — o curso continua "com" e a fonte continua "aula".
236            linkTempPixBilletForm.value = "";
237            if (linkTempPixForm) {
238                linkTempPixForm.value = 0;
239            }
240            if (linkTempBilletForm) {
241                linkTempBilletForm.value = 1;
242            }
243        } else if (parametroCurso === "com" && parametroFonte === "aula") {
244            if (linkTempPixForm) {
245                linkTempPixForm.value = 0;
246            }
247            if (linkTempBilletForm) {
248                linkTempBilletForm.value = 1;
249            }
250        } else if (parametroCurso === "hia" && parametroFonte === "jornada") {
251            linkTempPixBilletForm.value = pixBillet;
252            if (linkTempPixForm) {
253                linkTempPixForm.value = 0;
254            }
255            if (linkTempBilletForm) {
256                linkTempBilletForm.value = 1;
257            }
258        } else if (typeof billet !== "undefined") {
259            linkTempPixBilletForm.value = pixBillet;
260            if (linkTempPixForm) {
261                linkTempPixForm.value = pixBillet;
262            }
263            if (linkTempBilletForm) {
264                linkTempBilletForm.value = billet;
265            }
266        } else {
267            linkTempPixBilletForm.value = pixBillet;
268        }
269
270        definirCheckoutHiaSelecionado(IDLinkTemp, srcForm);
271    }
272
273    trocarConteudoPopup("precheckout", "", false);
274
275    var formCompleto = true;
276    const camposIgnoradosFormCompleto = ["field[6]", "s"];
277
278    if (parametroCurso === "hia") {
279        camposIgnoradosFormCompleto.push("field[58]");
280    }
281
282    inputsForm.forEach(function (elInput) {
283        if (
284            elInput.value == "" &&
285            !camposIgnoradosFormCompleto.includes(elInput.getAttribute("name"))
286        ) {
287            formCompleto = false;
288        }
289    });
290
291    if (formCompleto) {
292        if (redirecionarCheckoutHiaSeReenvio()) return;
293
294        enviarFormulario();
295    } else {
296        togglePopupAberto(false);
297    }
298}
299
300function ajustesVideoVendas() {
301    let elemVideo = document.querySelector("#js-video");
302
303    if (elemVideo) {
304        if (
305            parametroFonte == "aula" ||
306            parametroFonte == "intensivao" ||
307            parametroFonte == "jornada" ||
308            parametroFonte == "up"
309        ) {
310            // Alterar o src do vídeo se existir na tabela
311
312            if (paramTipo) {
313                // if (paramTipo == "netflix-dados") {
314                //     elemVideo.src =
315                //         dicSRCVideo[parametroFonte]["netflix-dados"][0];
316                // } else if (paramTipo == "comunidade-programadores") {
317                //     elemVideo.src =
318                //         dicSRCVideo[parametroFonte][
319                //             "comunidade-programadores"
320                //         ][0];
321                // }
322                // if (paramTipo == "comunidade-programadores") {
323                //     elemVideo.src =
324                //         dicSRCVideo[parametroFonte][
325                //             "comunidade-programadores"
326                //         ][0];
327                // }
328            } else {
329                if (
330                    dicSRCVideo[parametroFonte] &&
331                    dicSRCVideo[parametroFonte][parametroCurso]
332                ) {
333                    if (dicSRCVideo[parametroFonte][parametroCurso][1]) {
334                        if (
335                            dicSRCVideo[parametroFonte][parametroCurso][1] ==
336                                "amazon" &&
337                            elemVideo.tagName == "iframe"
338                        ) {
339                            criarVideoYouTube(
340                                "js-video",
341                                dicSRCVideo[parametroFonte][parametroCurso][0],
342                            );
343                            return;
344                        }
345                    }
346
347                    elemVideo.src =
348                        dicSRCVideo[parametroFonte][parametroCurso][0];
349                }
350            }
351        }
352
353        if (parametroCurso == "excel") {
354            if (parametroFonte == "perpetuo" && parametroTipo == "vsl") {
355                var idOnboarding = new URLSearchParams(
356                    window.location.search,
357                ).get("video");
358                var dictCorrespondencia = {
359                    "0.0": "https://player.hashtagtreinamentos.com/embed/?v=3219d8f1-b5c5-4c73-9130-497afd8a87fd&availableSpeeds=1,1.25,1.5",
360                    1.1: "https://player.hashtagtreinamentos.com/embed/?v=fdab6a69-fc12-420b-be75-352615705453&availableSpeeds=1,1.25,1.5",
361                    2.1: "https://player.hashtagtreinamentos.com/embed/?v=43f24f84-cd7b-429d-9512-99265e2f1414&availableSpeeds=1,1.25,1.5",
362                    3.1: "https://player.hashtagtreinamentos.com/embed/?v=a7eceafc-cf1c-42db-bc52-c7c4aea578aa&availableSpeeds=1,1.25,1.5",
363                    4.1: "https://player.hashtagtreinamentos.com/embed/?v=7fa778ec-6eee-4962-9b8f-7d755caeb884&availableSpeeds=1,1.25,1.5",
364                    5.1: "https://player.hashtagtreinamentos.com/embed/?v=0038e43e-5f07-4709-a220-3580400496cc&availableSpeeds=1,1.25,1.5",
365                    6.1: "https://player.hashtagtreinamentos.com/embed/?v=ceabbf31-d864-448f-ac6e-2f2d548d6f5f&availableSpeeds=1,1.25,1.5",
366                    1.2: "https://player.hashtagtreinamentos.com/embed/?v=983d48f4-c1a0-4b61-be1e-148d75f9e81d&availableSpeeds=1,1.25,1.5",
367                    2.2: "https://player.hashtagtreinamentos.com/embed/?v=8a0c5111-e519-4ee3-95b3-35ac28086b73&availableSpeeds=1,1.25,1.5",
368                    3.2: "https://player.hashtagtreinamentos.com/embed/?v=3273f2f2-6d32-4bd3-8b3e-153fe129f2c6&availableSpeeds=1,1.25,1.5",
369                    4.2: "https://player.hashtagtreinamentos.com/embed/?v=321ebb3d-bf5d-4410-ac86-38a206e74f9e&availableSpeeds=1,1.25,1.5",
370                    5.2: "https://player.hashtagtreinamentos.com/embed/?v=7fcc5698-8ce3-4c7e-b5ec-8120dbaeda06&availableSpeeds=1,1.25,1.5",
371                    6.2: "https://player.hashtagtreinamentos.com/embed/?v=9464a43b-bea6-4507-84fa-7ba662323d9e&availableSpeeds=1,1.25,1.5",
372                    1.3: "https://player.hashtagtreinamentos.com/embed/?v=787bc8cf-2595-4bf1-8e99-d130857a34c8&availableSpeeds=1,1.25,1.5",
373                    2.3: "https://player.hashtagtreinamentos.com/embed/?v=e50c2da5-4552-49b1-99a9-5e57fad5eaa5&availableSpeeds=1,1.25,1.5",
374                    3.3: "https://player.hashtagtreinamentos.com/embed/?v=5a3ec0d7-840c-4d36-b226-20201bdae125&availableSpeeds=1,1.25,1.5",
375                    4.3: "https://player.hashtagtreinamentos.com/embed/?v=52177aab-990b-48af-a5ce-ab32e90cd9ea&availableSpeeds=1,1.25,1.5",
376                    5.3: "https://player.hashtagtreinamentos.com/embed/?v=41a329d8-9412-4743-beef-4b4f9c8244cc&availableSpeeds=1,1.25,1.5",
377                    6.3: "https://player.hashtagtreinamentos.com/embed/?v=e51e64d7-3e90-4790-ab76-20ae0c33c3a5&availableSpeeds=1,1.25,1.5",
378                };
379
380                // Ajustar atributos do vídeo para o panda
381                elemVideo.id = "panda-5c9e3909-45c3-4421-afff-b3d9cef7b867";
382                elemVideo.allow =
383                    "accelerometer;gyroscope;autoplay;encrypted-media;picture-in-picture";
384                elemVideo.allowFullscreen = true;
385                elemVideo.setAttribute("fetchpriority", "high");
386
387                // Editar vídeo conforme o ID de Onboarding
388                if (idOnboarding && dictCorrespondencia[idOnboarding]) {
389                    elemVideo.src = dictCorrespondencia[idOnboarding];
390                } else {
391                    elemVideo.src = dictCorrespondencia["0.0"];
392                }
393
394                // Carregar o JS do Panda
395                loadJS(
396                    "https://player.hashtagtreinamentos.com/api.v2.js",
397                    true,
398                    onPandaPlayerApiLoad,
399                );
400
401                function onPandaPlayerApiLoad() {
402                    const player = new PandaPlayer("panda-player", {
403                        onReady: () => {
404                            console.log(
405                                "Player is ready",
406                                player.getCurrentTime(),
407                            );
408
409                            player.onEvent(
410                                throttle(function ({ message }) {
411                                    if (message === "panda_timeupdate") {
412                                        console.log(
413                                            "Tempo atualizou",
414                                            player.getCurrentTime(),
415                                        );
416
417                                        // Passando dos 20 min
418                                        if (
419                                            player.getCurrentTime() > 1200 &&
420                                            !hasClass(
421                                                document.body,
422                                                "pgvex-liberada",
423                                            )
424                                        ) {
425                                            document.body.classList.add(
426                                                "pgvex-liberada",
427                                            );
428                                            document.body.classList.remove(
429                                                "pgvex-fechada",
430                                            );
431                                            loadJS(
432                                                "//code.jivosite.com/widget/mULhfvoict",
433                                            );
434                                        }
435                                    }
436                                }, 5000),
437                            );
438                        },
439                        onError: (event) => {
440                            console.log("Player onError", event);
441                        },
442                    });
443                }
444            } else if (parametroFonte == "jornada") {
445                elemVideo.id = "js-video";
446                elemVideo.style = "";
447                elemVideo.allow =
448                    "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share";
449                elemVideo.allowFullscreen = "";
450                elemVideo.removeAttribute("fetchpriority");
451                elemVideo.setAttribute(
452                    "referrerpolicy",
453                    "strict-origin-when-cross-origin",
454                );
455                elemVideo.setAttribute("frameborder", "0");
456            }
457        }
458    }
459}
460
461// Body e Formulário
462var bodyEl = document.body;
463var formActive = document.querySelector(".form");
464
465if (!formActive) {
466    formActive = document.querySelector("form");
467}
468
469var popupContainerEl = document.getElementById("fundo-popup");
470
471// Parâmetros de URL
472var parametrosURL = new URLSearchParams(window.location.search);
473var parametroSRC = parametrosURL.get("src");
474var parametroFonte = parametrosURL.get("fonte"); // Lista de Espera, Perpétuo...
475var parametroCurso = parametrosURL.get("curso"); // Excel, JavaScript...
476var parametroTipo = parametrosURL.get("tipo"); // Teste A, Teste B...
477var parametroCupom = parametrosURL.get("cupom");
478var parametroOrigem = parametrosURL.get("origem");
479
480var parametroCupomNormalizado = (parametroCupom || "").toLowerCase();
481
482const listaCupons = [
483    "redcast",
484    "sacani",
485    "flow",
486    "flow-org",
487    "flow-2",
488    "raiam",
489    "curry",
490    "curry-tr",
491    "peter",
492    "peter-tr",
493    "vilela",
494    "castro",
495    "fundador",
496    "zico",
497];
498
499window.ehCupom = listaCupons.includes(parametroCupomNormalizado);
500
501const mapaTitleCupom = {
502    sacani: "Comunidade Impressionadora da Hashtag Treinamentos Sacani",
503    flow: "Comunidade Impressionadora da Hashtag Treinamentos Flow",
504    "flow-org": "Comunidade Impressionadora da Hashtag Treinamentos Flow-5.5",
505    "flow-2": "Comunidade Impressionadora da Hashtag Treinamentos Flow",
506    raiam: "Comunidade Impressionadora da Hashtag Treinamentom Raiam",
507    redcast: "Comunidade Impressionadora da Hashtag Treinamentos Redcast",
508    peter: "Comunidade Impressionadora da Hashtag Treinamentos Peter-5.0",
509    "peter-tr": "Comunidade Impressionadora da Hashtag Treinamentos Peter-5.5",
510    curry: "Comunidade Impressionadora da Hashtag Treinamentos Curry-5.0",
511    "curry-tr": "Comunidade Impressionadora da Hashtag Treinamentos Curry-5.5",
512    vilela: "Comunidade Impressionadora da Hashtag Treinamentos Vilela",
513    castro: "Comunidade Impressionadora da Hashtag Treinamentos Castro",
514    fundador: "Comunidade Impressionadora da Hashtag Treinamentos Fundador",
515    zico: "Comunidade Impressionadora da Hashtag Treinamentos Zico",
516};
517
518if (
519    parametroCurso === "com" &&
520    window.ehCupom &&
521    mapaTitleCupom[parametroCupomNormalizado]
522) {
523    document.title = mapaTitleCupom[parametroCupomNormalizado];
524}
525
526// Campos do formulário
527let inputsForm = formActive.querySelectorAll("input");
528let fullnameForm = document.querySelector("#fullname");
529let emailForm = document.querySelector("#email");
530let linkTempIDProdutoForm = document.querySelector("[name='field[112]']");
531let linkTempIDOfertaForm = document.querySelector("[name='field[113]']");
532let linkTempSRCForm = document.querySelector("[name='field[114]']");
533let linkTempPixBilletForm = document.querySelector("[name='field[115]']");
534let linkTempPixForm = document.querySelector("[name='field[180]']");
535let linkTempBilletForm = document.querySelector("[name='field[181]']");
536let checkoutHiaSelecionado = "";
537
538if (parametroCurso === "hia") {
539    limparCamposCheckoutHia();
540
541    window.addEventListener("pageshow", (event) => {
542        if (event.persisted || bodyEl.classList.contains("popup-aberto--spinner")) {
543            resetarEstadoCheckoutHia();
544        }
545    });
546}
547
548// Botões Comunidade
549var elemsBotaoPadrao = document.querySelectorAll(
550    '[id*="botaoPopupPadrao"], [id*="botao-linkcomu-padrao"], .js-botaoPadrao',
551);
552var elemsBotaoPix = document.querySelectorAll(
553    '[id*="botaoPopupPix"], [id*="botao-linkcomu-pix"]',
554);
555var elemsBotaoRecorrente = document.querySelectorAll(
556    '[id*="botaoPopupRecorrente"], [id*="botao-linkcomu-limite"]',
557);
558
559// Botões Oferta
560var elemsBotaoOferta = document.querySelectorAll(".js-botaoOferta");
561
562// Botões Popup Trilha
563var elemsBotaoPopupTrilha = document.querySelectorAll(".js-botaoPopupTrilha");
564
565// Botões Avulso
566var elemsBotaoAvulsoPadrao = document.querySelectorAll(
567    '[id*="botaoPopupAvulsoPadrao"], [id*="botao-link-padrao"]',
568);
569var elemsBotaoAvulsoPix = document.querySelectorAll(
570    '[id*="botaoPopupAvulsoPix"], [id*="botao-link-pix"]',
571);
572var elemsBotaoAvulsoRecorrente = document.querySelectorAll(
573    '[id*="botaoPopupAvulsoRecorrente"], [id*="botao-link-limite"]',
574);
575
576// Botão Fechar Popup
577var elemsBotaoFechar = document.querySelectorAll('[id*="botaoPopupFechar"]');
578
579// Elementos que mudam conforme a fonte
580let elemsPrecoParcelado = document.querySelectorAll(".js-preco-parcelado");
581let elemsPrecoParceladoInt = document.querySelectorAll(
582    ".js-preco-parcelado-int",
583);
584let elemsPrecoParceladoDec = document.querySelectorAll(
585    ".js-preco-parcelado-dec",
586);
587let elemsPrecoAVista = document.querySelectorAll(".js-preco-avista");
588
589let elemPrecoDe = document.querySelectorAll(".js-preco-de");
590let elemContainerToggle = document.querySelectorAll(
591    "[class*=pgto__container-toggle]",
592);
593let elemPrecoFoco = document.querySelectorAll(
594    ".preco__caixa:not(.preco__caixa--semfoco)",
595);
596let elemPrecoSemFoco = document.querySelectorAll(".preco__caixa--semfoco");
597let elemBlocoToggle = document.querySelector(".bloco-toggle-pgvpy");
598let elemsBlocoPlano = document.querySelectorAll(".bloco-planos-pgvpy");
599
600let elemsQtdAulas = document.querySelectorAll(".js-qtd-aulas");
601let elemsQtdHoras = document.querySelectorAll(".js-qtd-horas");
602let elemsQtdCursosCom = document.querySelectorAll(".js-qtd-cursos-com");
603let elemsCursosCom = document.querySelectorAll(".js-cursos-com");
604let elemsDescricaoCursosCom = document.querySelectorAll(
605    ".js-descricao-cursos-com",
606);
607
608let dicQtdAulas = {
609    pa: "200 aulas",
610    vba: "400",
611    ppt: "120",
612    fe: "400",
613    js: "500",
614};
615let dicQtdHoras = {
616    pa: "20 horas",
617    vba: "87",
618    ppt: "27",
619    fe: "100",
620    js: "115",
621};
622
623let dicCursosCom = {
624    Excel: "para quem está buscando uma vaga no mercado (praticamente todas as vagas boas têm Excel como pré requisito - às vezes até como prova no processo seletivo) e também pra quem precisa usar o Excel no dia a dia na empresa e dominar tudo do básico ao avançado da principal ferramenta do Mercado de Trabalho.",
625    "Power BI":
626        "uma das melhores formas de você se destacar tanto em processos seletivos quanto na sua empresa com a ferramenta que atualmente é um dos maiores diferenciais no Mercado, pra aprender a criar Relatórios e Dashboards que impressionam dentro de qualquer empresa, além de entrar em vagas da área de Dados (Business Intelligence, por exemplo), que pagam bem acima da média.",
627    Python: "a linguagem de programação que mais cresce no mundo. Nesse programa você vai aprender a dominar o Python pra fazer automações incríveis, Desenvolver sites, construir análises com Ciência de Dados (uma das carreiras mais valorizadas no Mercado), trabalhar com Inteligência Artificial, e muito mais, mesmo que você nunca tenha programado na vida, pra surfar essa onda que na minha opinião é uma das maiores oportunidades de crescimento na carreira e ser o profissional que as empresas cada vez estão buscando mais.",
628    VBA: "vai te ajudar a automatizar praticamente qualquer tarefa repetitiva que você faça dentro do Excel (inclusive mandar e-mail, criar apresentação em PowerPoint automaticamente, gerar relatórios automáticos em PDF, etc).",
629    SQL: "a linguagem mais importante do mundo para quem trabalha com dados. Nesse programa você vai aprender tudo sobre como trabalhar com grande volume de dados, uma das habilidades mais importantes do mercado com o aumento do volume de informações. Você vai aprender como trabalhar com bancos de dados seja pra se destacar na sua empresa atual, pra conseguir um diferencial em processos seletivos ou até mesmo para entrar em áreas de dados - existe MUITA vaga promissora pra quem domina o SQL.",
630    PowerPoint:
631        "esse é um programa único, sem comparativo no mercado, onde vou te mostrar como realmente Dominar a Arte da Apresentação para ser reconhecido e receber as Melhores Oportunidades no Mercado de Trabalho. Você não vai aprender “apenas” a montar uma apresentação de impacto, mas também todas as técnicas de Persuasão, Linguagem Corporal, Como perder a timidez, e como IMPRESSIONAR em qualquer apresentação (formal ou informal).",
632    JavaScript:
633        "a linguagem de programação que manda quando o assunto é desenvolvimento WEB. Para você ter uma ideia, 98,3% de todos os sites no mundo utilizam JavaScript. Isso acontece, pois essa linguagem de programação é responsável por tornar os sites interativos e inteligentes, mas não para por aí. Além de ser utilizado na grande maioria dos sites, o JavaScript é muito popular por ser uma das poucas linguagens que permite o desenvolvedor trabalhar em todas as áreas do desenvolvimento, sendo elas: front-end (parte visual); backend (parte da inteligência que roda por trás); banco de dados (armazenamento de informações).",
634    "HTML & CSS":
635        "o HTML e CSS são as linguagens de programação utilizadas para criar e estilizar sites na WEB. Todo e qualquer site existente hoje na Internet utiliza essas duas linguagens em seus códigos. O HTML atua na parte da construção da estrutura do site, já o CSS atua na estilização das páginas. Então, enquanto o HTML monta o esqueleto da página, o CSS deixa a página bonita e visual. O HTML e o CSS atuam em conjunto para criar páginas bonitas e bem estruturadas.",
636    "Inteligência Artificial":
637        "aprenda como usar da melhor forma as principais tecnologias de Inteligência Artificial para se destacar no Mercado de Trabalho. São elas: ChatGPT, Gemini, Copilot, Midjourney, Dall-e, Bardeen, Gamma, 
637Copilot 365, Perplexity, Claude, Make AI, e muito mais!",
638    "Power Automate":
639        "aprenda a ferramenta da Microsoft focada em otimizar e automatizar todo e qualquer fluxo de trabalho. Impressione na sua empresa fazendo automações de tarefas e processos integrando esse programa com as principais ferramentas do Mercado de Trabalho",
640};
641let qtdCursosCom = Object.keys(dicCursosCom).length;
642let cursosCom = "";
643let descricaoCursosCom = "";
644
645var dicSRCVideo = {
646    aula: {
647        js: [
648            "https://webinarios-hashtag.s3.us-east-2.amazonaws.com/Live+de+Apresenta%C3%A7%C3%A3o+do+Programa+Full+Stack+Impressionador.mp4",
649            "amazon",
650        ],
651        sql: [
652            "https://webinarios-hashtag.s3.us-east-2.amazonaws.com/Live+de+Apresenta%C3%A7%C3%A3o+do+Programa+SQL+Impressionador.mp4",
653            "amazon",
654        ],
655        // com: [
656        //     "https://webinarios-hashtag.s3.us-east-2.amazonaws.com/live_da_comunidade_impressionadora+(1080p).mp4",
657        //     "amazon",
658        // ],
659        // `com`, `netflix-dados` e `comunidade-programadores` (as tres exclusivas da
660        // pg-comunidade-impressionadora.php) sairam daqui em 2026-09: o video do hero
661        // dessa pagina passou a ser decidido inteiro no PHP do template (uma fonte so).
662        // As duas ultimas ja estavam mortas antes disso — o unico ponto que as lia
663        // (`if (paramTipo) {...}` logo acima) estava comentado, e guardavam YouTube
664        // diferente do que a pagina realmente usa hoje (Panda, via a ternaria/PHP).
665        // Nenhuma outra pagina usa esses tres valores de curso, entao saíram sem
666        // afetar mais nada aqui.
667    },
668    jornada: { excel: ["https://youtube.com/embed/oo28Ki1ZZ8A", "yt"] },
669};
670
671var dicCodigosCurso = {
672    js: "js",
673    excel: "ex",
674    pa: "pa",
675    sql: "sql",
676    vba: "vba",
677    ppt: "ppt",
678    fe: "fe",
679    com: "ci",
680    /*
681     * 🔴 `fullstack` entrou em 24/08/2026 com a pgv do Full Stack. Sem esta linha o
682     * guard logo abaixo (`if (!dicCodigosCurso[parametroCurso]) parametroCurso =
683     * "com"`) troca o curso pela Comunidade EM SILENCIO, e quem clica na oferta do
684     * Full Stack cai no checkout errado sem uma linha de erro. O codigo "fs" e o
685     * mesmo que a LP usa — ele entra no `conversion`, entao inventar outro aqui
686     * partiria o relatorio em dois nomes para o mesmo produto.
687     */
688    fullstack: "fs",
689    "agentes-ia": "agentes-ia",
690    "no-code": "nc",
691    cc: "cc",
692    claude: "claude",
693    hia: "hia",
694    agia: "agia",
695};
696
697let dicHueModeBotaoForm = {
698    js: ["292", "dark"],
699    // A LP trata `fullstack` como alias de `js` na cor do botao do form; o valor e
700    // o mesmo de la. Esta leitura e guardada (`if (dicHueModeBotaoForm[...])`),
701    // entao a ausencia nao quebrava nada — so deixava o botao sem a hue da pagina.
702    fullstack: ["292", "dark"],
703    excel: ["159", "dark"],
704    pa: ["198", "dark"],
705    sql: ["193", "light"],
706    vba: ["193", "light"],
707    ppt: ["193", "light"],
708    fe: ["181", "dark"],
709    com: ["211", "dark"],
710    "agentes-ia": ["337", "dark"],
711    "no-code": ["284", "dark"],
712    cc: ["211", "dark"],
713    claude: ["15", "dark"],
714    hia: ["326", "dark"],
715    agia: ["12", "dark"],
716};
717
718var dicSrcPadrao = {
719    lespera: "les",
720    perpetuo: "vtsd_",
721    intensivao: "l",
722    aula: "w",
723    up: "up_",
724    afiliado: "af_",
725    email: "em_",
726    pat: "pat_",
727};
728
729// A base da Jornada e a do Intensivao; campanhas com SRC proprio sobrescrevem
730// este valor na resolucao abaixo.
731dicSrcPadrao["jornada"] = dicSrcPadrao["intensivao"];
732dicSrcPadrao["down"] = dicSrcPadrao["intensivao"];
733
734var dicIDForm = {
735    lespera: {
736        js: "6132",
737        excel: "5344",
738        sql: "5372",
739        vba: "5374",
740        ppt: "5376",
741        fe: "8211",
742        com: "7807",
743        // 10412 = o mesmo form que a LP usa para o Full Stack.
744        fullstack: "10412",
745        "agentes-ia": "13973",
746        "no-code": "14011",
747        claude: "14953",
748        /*
749         * 🔴 `pa` faltava aqui e a falta era invisivel: sem a chave, a fonte
750         * `lespera` da pgv de Power Automate caia no fallback e parava no 8173,
751         * que e `[WEBINAR]`. O `[ORGANICO] [POWER AUTOMATE]` (8231) existia
752         * parado desde 11/07/2024, na mesma lista 56.
753         *
754         * O comentario do registro chegava a AFIRMAR que 8173 era
755         * `dicIDForm.lespera.pa` — a chave nao existia. Afirmacao sobre chave de
756         * dicionario e o tipo de coisa que ninguem confere, porque parece
757         * conferida.
758         */
759        pa: "8231",
760    },
761    perpetuo: {
762        js: "6842",
763        excel: "5056",
764        sql: "5858",
765        vba: "5860",
766        ppt: "5862",
767        fe: "6882",
768        claude: "15429"
769    },
770    intensivao: {
771        js: "6690",
772        excel: "5976",
773        "agentes-ia": "13916",
774        hia: "15018",
775        claude: "15620",
776    },
777    up: {
778        js: "6128",
779        excel: "5978",
780        sql: "6110",
781        vba: "6112",
782        ppt: "6114",
783        fe: "8212",
784    },
785    aula: {
786        js: "7672",
787        pa: "8173",
788        sql: "8148",
789        fe: "7739",
790        com: "7837",
791        cc: parametroTipo === "lira" ? "15631" : "14468",
792        "no-code": "14609",
793        claude: "15289",
794        agia: "15358",
795    },
796    vpi: { com: "7809" },
797    afiliado: { com: "8307" },
798    email: {
799        com: "7807",
800    },
801    down: {
802        com: "12253",
803    },
804    pat: {
805        com: "12562",
806    },
807    cupom: {
808        redcast: {
809            com: "13164",
810        },
811        sacani: {
812            com: "13259",
813        },
814        flow: {
815            com: "13261",
816        },
817        "flow-2": {
818            com: "15598",
819        },
820        "flow-org": {
821            com: "14951",
822        },
823        raiam: {
824            com: "14007",
825        },
826        curry: {
827            com: "14255",
828        },
829        "curry-tr": {
830            com: "14462",
831        },
832        peter: {
833            com: "14271",
834        },
835        "peter-tr": {
836            com: "14275",
837        },
838        vilela: {
839            com: "14390",
840        },
841        castro: {
842            com: "14937",
843        },
844        fundador: {
845            com: "14939",
846        },
847        zico: {
848            com: "15097",
849        },
850    },
851    trial7: {
852        com: "13113",
853    },
854    aut: {
855        com: "14310",
856    },
857    fat: {
858        com: "15647",
859    },
860};
861
862var listaFormOrigem = {
863    com: {
864        cupom: {
865            sacani: {
866                igfb: "13802",
867                adv: "13804",
868            },
869        },
870    },
871};
872
873// Mesmo Pré Checkout para Jornada e Intensivão
874dicIDForm["jornada"] = dicIDForm["intensivao"];
875
876/*
877 * 🔴 `agia` e `agentes-ia` sao o MESMO curso com dois nomes.
878 *
879 * O `?curso=` que a pagina de Agentes de IA carimba e `agentes-ia`, e e assim
880 * que ela aparece em `lespera`. Em `aula` a chave ficou `agia` — e a diferenca
881 * nao da erro, da lead na lista errada: `dicIDForm["aula"]["agentes-ia"]` e
882 * undefined, o codigo cai no `dicIDForm["aula"]["com"]` e o lead de Agentes de
883 * IA entra na lista da COMUNIDADE (7837).
884 *
885 * Medido em producao em 21/08/2026: `/agentes-ia-impressionador?fonte=aula`
886 * postava para 7837, e `?fonte=aula` e uma fonte real, de link de aula.
887 */
888Object.keys(dicIDForm).forEach(function (fonte) {
889    var mapa = dicIDForm[fonte];
890    if (!mapa || typeof mapa !== "object") {
891        return;
892    }
893    if (mapa["agia"] && !mapa["agentes-ia"]) {
894        mapa["agentes-ia"] = mapa["agia"];
895    }
896    if (mapa["agentes-ia"] && !mapa["agia"]) {
897        mapa["agia"] = mapa["agentes-ia"];
898    }
899});
900
901var dicPrecosFonte = {
902    lespera: "124,75",
903    intensivao: "97,14",
904};
905
906var dicPrecosAVistaFonte = {
907    lespera: "1.497",
908    intensivao: "997",
909    jornada: "997",
910};
911
912// Perpétuo mesmo preço de lista de espera
913dicPrecosFonte["perpetuo"] = dicPrecosFonte["lespera"];
914
915// Upsell e Webinar mesmo preço de lançamento
916dicPrecosFonte["up"] = dicPrecosFonte["intensivao"];
917dicPrecosFonte["down"] = dicPrecosFonte["intensivao"];
918dicPrecosFonte["aula"] = dicPrecosFonte["intensivao"];
919dicPrecosFonte["jornada"] = dicPrecosFonte["intensivao"];
920dicPrecosFonte["afiliado"] = dicPrecosFonte["intensivao"];
921dicPrecosFonte["email"] = dicPrecosFonte["intensivao"];
922dicPrecosFonte["pat"] = dicPrecosFonte["lespera"];
923
924dicPrecosAVistaFonte["perpetuo"] = dicPrecosAVistaFonte["lespera"];
925dicPrecosAVistaFonte["up"] = dicPrecosAVistaFonte["intensivao"];
926dicPrecosAVistaFonte["down"] = dicPrecosAVistaFonte["intensivao"];
927dicPrecosAVistaFonte["aula"] = dicPrecosAVistaFonte["intensivao"];
928dicPrecosAVistaFonte["afiliado"] = dicPrecosAVistaFonte["intensivao"];
929dicPrecosAVistaFonte["email"] = dicPrecosAVistaFonte["intensivao"];
930dicPrecosAVistaFonte["pat"] = dicPrecosAVistaFonte["lespera"];
931
932// IDProduto, IDOferta
933var dicLinksCheckout = {
934    lespera: {
935        cp: {
936            js: ["L16941472G", "o466y1zw"],
937            excel: ["L16941472G", "evy4c5jw"],
938            sql: ["L16941472G", "l6qs1d9q"],
939            vba: ["L16941472G", "l6qs1d9q"],
940            com: ["C100129942R", "olio4n49"],
941            ppt: ["L16941472G", "jlk5p56u"],
942            fe: ["L16941472G", "uxbsd9ly"],
943            redcast: ["O104398157W", "ya1fqgo0"],
944            sacani: ["S103433364N", "fcw9o4ah"],
945            flow: ["B103434844X", "71v18vcj"],
946            "flow-org": ["G106019466C", "ljhb39x9"],
947            "flow-2": ["G106019466C", "nsr9r9gf"],
948            "agentes-ia": ["G102647570U", "32g9ttdx"],
949            raiam: ["F104376394C", "20z3rfgn"],
950            curry: ["W104887496N", "abf6v14i"],
951            "no-code": ["D102584061W", "xg57t0sd"],
952            peter: ["C104746124W", "21wijc8t"],
953            "peter-tr": ["F104877486G", "tlcxtxuw"],
954            vilela: ["C105109188C", "by8k5qbf"],
955            "curry-tr": ["L105465889C", "c1hrmod7"],
956            castro: ["C105955247C", "ejbd46sa"],
957            fundador: ["O105990845I", "lqhm0ttq"],
958            zico: ["L106100608Q", "950pjpn9"],
959            claude: ["R105987676E", "8uxvbi27"],
960            /*
961             * 🔴 Full Stack tem produto PROPRIO na Hotmart, e nao e o `L16941472G`
962             * dos outros cursos: `I100237169V?off=pgmtre14` abre "[P] Full Stack +
963             * Comunidade Impressionadora" (lido na Hotmart em 24/08/2026). As
964             * coordenadas vieram do precheckout inline da LP, que vende esta
965             * formacao hoje, e foram conferidas abrindo o checkout — nao deduzidas.
966             */
967            fullstack: ["I100237169V", "pgmtre14"],
968            /*
969             * 🔴 `pa` existia em `dicCodigosCurso`, em `dicIDForm.lespera` e em
970             * `dicHueModeBotaoForm`, e NAO existia aqui. O modo de falhar e pior que o
971             * do guard de curso desconhecido: `definirLinkCheckout` recebe `undefined`
972             * e morre em `IDLinkTemp[0]`, entao o popup coleta o lead e o botao de
973             * pagamento nao leva a lugar nenhum — sem uma linha em log.
974             *
975             * As coordenadas vieram do precheckout inline da LP que vende este curso
976             * hoje (`dlp/n8n/pg-inscricao.html`) e foram conferidas abrindo o checkout:
977             * `F100272256F?off=bhuq0cho` responde "[P] Power Automate + Comunidade
978             * Impressionadora" (lido na Hotmart em 26/08/2026).
979             */
980            pa: ["F100272256F", "bhuq0cho"],
981        },
982        cl: {
983            js: ["L16941472G", "7q1t1kri"],
984            excel: ["L16941472G", "8l5juetb"],
985            sql: ["L16941472G", "ajh1pi3z"],
986            vba: ["L16941472G", "ajh1pi3z"],
987            // O ramo recorrente do mesmo produto proprio (ver o comentario em `cp`).
988            fullstack: ["I100237169V", "j7rt4nc8"],
989            com: ["C100129942R", "h8r85kai"],
990            ppt: ["L16941472G", "57gawgd8"],
991            fe: ["L16941472G", "wid30kqp"],
992            // O ramo recorrente do mesmo produto (ver o comentario em `cp`).
993            pa: ["F100272256F", "16z11s1m"],
994        },
995        ap: {
996            js: ["X82392969H", "uncreodq"],
997            excel: ["V6008994R", "siu1b7e5"],
998            sql: ["Q57557503P", "voyqecd5"],
999            vba: ["B14959865K", "0mblo3v9"],
1000            ppt: ["F18811894U", "hlitsf7v"],
1001        },
1002        al: {
1003            js: ["E82396870B", "x4qtpyu5"],
1004            excel: ["V39120067A", "3gmjcbsi"],
1005            sql: ["R57560907X", "tqyv3g0f"],
1006            vba: ["T39166951K", "yb8krum7"],
1007            ppt: ["N39169236Y", "9r3iyzi4"],
1008        },
1009    },
1010
1011    up: {
1012        cp: {
1013            js: ["L16941472G", "0ut8zmvo"],
1014            excel: ["L16941472G", "fu9uivcl"],
1015            sql: ["L16941472G", "fu9uivcl"],
1016            vba: ["L16941472G", "fu9uivcl"],
1017            ppt: ["L16941472G", "fu9uivcl"],
1018        },
1019        cl: {
1020            js: ["L16941472G", "gbgo569m"],
1021            excel: ["L16941472G", "auytd52f"],
1022            sql: ["L16941472G", "auytd52f"],
1023            vba: ["L16941472G", "auytd52f"],
1024            ppt: ["L16941472G", "auytd52f"],
1025        },
1026        ap: {
1027            js: ["X82392969H", "6mi3451a"],
1028            excel: ["V6008994R", "h57kjitn"],
1029            sql: ["Q57557503P", "bc67cz0q"],
1030            vba: ["B14959865K", "ootxgwf2"],
1031            ppt: ["F18811894U", "dafuwesx"],
1032        },
1033        al: {
1034            js: ["E82396870B", "1sn5wpx4"],
1035            excel: ["V39120067A", "2izh008r"],
1036            sql: ["R57560907X", "hslic8st"],
1037            vba: ["T39166951K", "is87li4s"],
1038            ppt: ["N39169236Y", "vw7edcwf"],
1039        },
1040    },
1041
1042    aula: {
1043        cp: {
1044            js: ["A91410311H", "zvxm01v4"],
1045            pa: ["A91410311H", "8vjtclg8"],
1046            sql: ["A91410311H", "qrr2pqbp"],
1047            fe: ["A91410311H", "x78z4o0n"],
1048            com: ["A91410311H", "kho5z8of"],
1049            "netflix-dados": ["D100367357P", "9w90nykt"],
1050            "comunidade-programadores": ["L100464049K", "e4bukefo"],
1051            trial7: ["H103765760W", "drmqh8qu"],
1052            aut: ["F101626777A", "hbd6b0zm"],
1053            // tipo=fat (campanha wfat): mesma oferta do No Code, por tipo e nao por curso —
1054            // o `?curso=` da Comunidade continua "com".
1055            fat: ["H105430328B", "637tl9we"],
1056            cc:
1057                parametroTipo === "lira"
1058                    ? ["H107199321U", "axqw5jzi"]
1059                    : ["M105178307J", "0p5dset7"],
1060            "no-code": ["H105430328B", "637tl9we"],
1061            claude: ["D106201374U", "ucneg58z"],
1062            agia: ["H106655154T", "cc7iruch"],
1063        },
1064        cl: {
1065            js: ["A91410311H", "d4eakybv"],
1066            pa: ["A91410311H", "3tltkc36"],
1067            sql: ["A91410311H", "amwq10z6"],
1068            fe: ["A91410311H", "9ef79q52"],
1069            com: ["A91410311H", "u4diob8m"],
1070            "netflix-dados": ["D100367357P", "up26uze3"],
1071            "comunidade-programadores": ["L100464049K", "ztpp0owg"],
1072        },
1073    },
1074
1075    afiliado: {
1076        cp: {
1077            com: ["L16941472G", "pjxk6v22"],
1078        },
1079        cl: {
1080            com: ["L16941472G", "tn5px8v4"],
1081        },
1082    },
1083
1084    vpi: {
1085        cp: { com: ["L16941472G", "pjxk6v22"] },
1086        cl: { com: ["L16941472G", "tn5px8v4"] },
1087    },
1088
1089    intensivao: {
1090        cp: { js: ["L16941472G", "ob5jfv87"] },
1091        cl: { js: ["L16941472G", "gdsml483"] },
1092    },
1093
1094    jornada: {
1095        cp: {
1096            excel: ["L16941472G", "iqf27ssx"],
1097            "agentes-ia": ["J103696309G", "eodx7mq8"],
1098            claude: ["D107199198F", "xg7xip8x"],
1099            hia: ["B105069184M", "r6lwuvgg"],
1100        },
1101        cl: {
1102            excel: ["L16941472G", "dmf4vn6q"],
1103            // hia: ["B105069184M", "fhervvon"],
1104        },
1105    },
1106
1107    down: {
1108        cp: { vit: ["L16941472G", "pjxk6v22"] },
1109        cl: { vit: ["L16941472G", "3r1ngv3c"] },
1110    },
1111
1112    pat: {
1113        cp: {
1114            com: ["L102188797O", "wj7wbf62"],
1115        },
1116    },
1117};
1118
1119// Links do perpétuo são os mesmos da lista de espera
1120dicLinksCheckout["perpetuo"] = dicLinksCheckout["lespera"];
1121
1122// Links de E-mail são os mesmos da aula
1123dicLinksCheckout["email"] = dicLinksCheckout["aula"];
1124
1125// Links de webinar avulso são os mesmos de comunidade
1126dicLinksCheckout["aula"]["ap"] = dicLinksCheckout["aula"]["cp"];
1127dicLinksCheckout["aula"]["al"] = dicLinksCheckout["aula"]["cl"];
1128
1129// Links de lançamento avulso são os mesmos de comunidade
1130dicLinksCheckout["intensivao"]["ap"] = dicLinksCheckout["intensivao"]["cp"];
1131dicLinksCheckout["intensivao"]["al"] = dicLinksCheckout["intensivao"]["cl"];
1132
1133// Links de lançamento avulso são os mesmos de comunidade
1134dicLinksCheckout["jornada"]["ap"] = dicLinksCheckout["jornada"]["cp"];
1135dicLinksCheckout["jornada"]["al"] = dicLinksCheckout["jornada"]["cl"];
1136/*
1137 * So cursos alcançaveis neste motor. Curso desconhecido vira `com` antes da
1138 * consulta; declarar PBI, Python, IA ou CD aqui anunciaria cobertura impossível.
1139 */
1140dicIDForm["org-yt"] = {
1141    excel: "15550",
1142    ppt: "15552",
1143    vba: "15553",
1144    sql: "15554",
1145    fullstack: "15557",
1146    com: "15559",
1147};
1148
1149/*
1150 * PAGINAS DE NICHO (set/2026): a MESMA oferta do curso guarda-chuva, com formulario
1151 * PROPRIO no ActiveCampaign.
1152 *
1153 * A /curso-lovable vende o No Code e IA Impressionador. Ate 20/09/2026 ela levava
1154 * `curso_param` `no-code` e postava para o 14011, o pre-checkout do No Code: o lead
1155 * entrava no CRM como lead de No Code e ninguem separava depois quem veio pela pagina
1156 * de Lovable. Decisao do Diego (20/09/2026): cada pagina de nicho tem o seu form,
1157 * clonado do guarda-chuva por `scripts/venda/ac-clona-form.py --nicho` — mesma lista
1158 * (o produto e o mesmo), mesmos campos e checkout; muda so o nome, o cabecalho e as
1159 * tags (`PRECHECKOUT_LOVABLE`, `PRECHECKOUT_LOVABLE_ORGANICO`).
1160 *
1161 * A chave e o `curso_param` do registro da pgv. `de` e o guarda-chuva de que o nicho
1162 * HERDA tudo o que decide o produto — o codigo do curso (monta o `src`, entao a venda
1163 * continua contada como No Code: `lesnc-pgvendas`), os links de checkout de toda
1164 * fonte e o form de toda fonte que o guarda-chuva tenha. Por cima disso entra o form
1165 * proprio em `lespera` (o visitante que chegou por busca, que e o caso desta pagina)
1166 * e o `hue` do botao do popup, que repete o de `hashtag_curso_accent()` da pagina e
1167 * nao o do guarda-chuva (sem `hue`, herda o do guarda-chuva).
1168 *
1169 * O `src` especial de `aula` + `no-code` (`wfat`, logo abaixo) NAO e herdado de
1170 * proposito: e de campanha, e a pagina de nicho nao e a pagina da campanha.
1171 *
1172 * 🔴 Chave que falta aqui = pagina postando para a COMUNIDADE: `curso_param`
1173 * desconhecido cai em `com` no guard de `dicCodigosCurso`, e o markup certo e
1174 * reescrito com o 7807. O `valida-carimbo-curso.mjs` cobra que o form da pagina seja
1175 * o `form_ac_markup` do registro, em Chrome real — e o que acusa a falta.
1176 */
1177var NICHOS = {
1178    lovable: { de: "no-code", lespera: "15666", hue: ["340", "dark"] },
1179    // /curso-n8n vende o Agentes de IA e n8n; o 15672 e o clone do 13973 (20/09/2026)
1180    // e o 345 e a matiz do `accent` da pagina (o rosa da landing), nao o 337 do
1181    // guarda-chuva.
1182    n8n: { de: "agentes-ia", lespera: "15672", hue: ["345", "dark"] },
1183};
1184
1185Object.keys(NICHOS).forEach(function (nicho) {
1186    var base = NICHOS[nicho].de;
1187    dicCodigosCurso[nicho] = dicCodigosCurso[base];
1188    dicHueModeBotaoForm[nicho] = NICHOS[nicho].hue || dicHueModeBotaoForm[base];
1189    Object.keys(dicIDForm).forEach(function (fonte) {
1190        var mapa = dicIDForm[fonte];
1191        if (mapa && typeof mapa === "object" && mapa[base] && !mapa[nicho]) {
1192            mapa[nicho] = mapa[base];
1193        }
1194    });
1195    dicIDForm["lespera"][nicho] = NICHOS[nicho].lespera;
1196    Object.keys(dicLinksCheckout).forEach(function (fonte) {
1197        var tipos = dicLinksCheckout[fonte];
1198        if (!tipos || typeof tipos !== "object") {
1199            return;
1200        }
1201        Object.keys(tipos).forEach(function (tipo) {
1202            var mapa = tipos[tipo];
1203            if (mapa && typeof mapa === "object" && mapa[base] && !mapa[nicho]) {
1204                mapa[nicho] = mapa[base];
1205            }
1206        });
1207    });
1208    if (dicQtdAulas[base] && !dicQtdAulas[nicho]) {
1209        dicQtdAulas[nicho] = dicQtdAulas[base];
1210    }
1211    if (dicQtdHoras[base] && !dicQtdHoras[nicho]) {
1212        dicQtdHoras[nicho] = dicQtdHoras[base];
1213    }
1214});
1215
1216
1217/*
1218 * Sem `?fonte=` na URL, a fonte e `lespera` — o visitante que chegou por busca.
1219 *
1220 * 🔴 Ate 28/08/2026 havia aqui uma excecao que empurrava o curso `pa` para
1221 * `fonte=aula`, e ainda REESCREVIA a URL com `updateURLParam`. Ela existia por
1222 * uma razao que deixou de valer: `pa` nao tinha `lespera` em `dicIDForm`, entao
1223 * sem o empurrao o lead caia no fallback. Empurrar para `aula` era o palpite
1224 * menos ruim quando nao havia opcao organica.
1225 *
1226 * O efeito colateral era que a pgv organica de Power Automate — que carimba
1227 * `?curso=pa` e nao carimba fonte nenhuma — mandava TODO lead para o formulario
1228 * de WEBINAR (8173). Agora `dicIDForm.lespera.pa` e o
1229 * `[ORGANICO] [POWER AUTOMATE]` (8231), e a excecao nao tem mais o que resolver.
1230 *
1231 * Quem quiser a fonte `aula` continua pedindo por `?fonte=aula`, como todo mundo.
1232 */
1233/* `org-yt` reutiliza toda a experiencia de `lespera`; a origem lembrada muda
1234 * somente o formulario e o sufixo do `src`. */
1235var origemReferencia;
1236
1237if (!parametroFonte) {
1238    parametroFonte = "lespera";
1239} else if (parametroFonte === "org-yt") {
1240    parametroFonte = "lespera";
1241    origemReferencia = "org-yt";
1242} else if (!dicLinksCheckout[parametroFonte]) {
1243    dicLinksCheckout[parametroFonte] = dicLinksCheckout["lespera"];
1244}
1245
1246// Definindo curso se não tiver nenhum
1247if (!parametroCurso || !dicCodigosCurso[parametroCurso]) {
1248    parametroCurso = "com";
1249}
1250
1251const usaSrcLiraClaude =
1252    parametroFonte === "aula" &&
1253    parametroCurso === "cc" &&
1254    parametroTipo === "lira";
1255
1256// Atualizar SRC se tiver algum parâmetro na URL
1257if (parametroSRC) {
1258    dicSrcPadrao = parametroSRC;
1259} else {
1260    if (!dicSrcPadrao[parametroFonte]) {
1261        dicSrcPadrao[parametroFonte] = dicSrcPadrao["lespera"];
1262    }
1263
1264    if (usaSrcLiraClaude) {
1265        dicSrcPadrao = "wlcc";
1266    } else if (parametroTipo) {
1267        const objTipoSrc = {
1268            "netflix-dados": dicSrcPadrao[parametroFonte] + "nd-pgvendas",
1269            "comunidade-programadores":
1270                dicSrcPadrao[parametroFonte] + "dev-pgvendas",
1271            vit: "lvit-ds",
1272            trial7: "wci-trial",
1273            aut: "waut",
1274            fat: "wfat",
1275        };
1276
1277        dicSrcPadrao = objTipoSrc[parametroTipo];
1278
1279        // if (parametroTipo === "netflix-dados") {
1280        //     dicSrcPadrao = dicSrcPadrao[parametroFonte] + "nd" + "-pgvendas";
1281        // } else if (parametroTipo === "comunidade-programadores") {
1282        //     dicSrcPadrao = dicSrcPadrao[parametroFonte] + "dev" + "-pgvendas";
1283        // } else if (parametroTipo === "vit") {
1284        //     dicSrcPadrao = "lvit-ds";
1285        // }
1286    } else if (window.ehCupom) {
1287        const mapaSrcCupom = {
1288            redcast: "inf-redcast-live001",
1289            sacani: "inf-sacani",
1290            flow: "inf-flow",
1291            "flow-org": "inf-flow-org",
1292            "flow-2": "inf-flow-org-eleicao",
1293            raiam: "inf-raiam",
1294            curry: "inf-curry",
1295            "curry-tr": "inf-curry-traf",
1296            peter: "inf-peter-org",
1297            "peter-tr": "inf-peter-traf",
1298            vilela: "inf-vilela",
1299            castro: "inf-castro",
1300            fundador: "inf-fundador",
1301            zico: "inf-zico",
1302        };
1303
1304        if (window.ehCupom) {
1305            dicSrcPadrao = mapaSrcCupom[parametroCupomNormalizado];
1306        }
1307    } else {
1308        if (parametroFonte === "aula" && parametroCurso === "no-code") {
1309            dicSrcPadrao = "wfat";
1310        } else if (
1311            parametroFonte === "jornada" &&
1312            parametroCurso === "claude"
1313        ) {
1314            dicSrcPadrao = "lcld";
1315        } else if (
1316            parametroFonte === "jornada" &&
1317            parametroCurso === "agentes-ia"
1318        ) {
1319            dicSrcPadrao = "lnc-pgvendas";
1320        } else if (
1321            parametroCurso === "hia" &&
1322            dicSrcPadrao[parametroFonte] === "l"
1323        ) {
1324            dicSrcPadrao = "uphia";
1325        } else {
1326            dicSrcPadrao =
1327                dicSrcPadrao[parametroFonte] +
1328                dicCodigosCurso[parametroCurso] +
1329                "-pgvendas";
1330        }
1331    }
1332}
1333
1334/* Mantem o prefixo historico e acrescenta a origem; `&src=` explicito continua
1335 * soberano. Ex.: `lescom-pgvendas` vira `lescom-pgvendas-yt`. */
1336var MARCA_SRC_POR_ORIGEM = {
1337    "org-yt": "-yt",
1338};
1339
1340if (!parametroSRC && MARCA_SRC_POR_ORIGEM[origemReferencia]) {
1341    dicSrcPadrao += MARCA_SRC_POR_ORIGEM[origemReferencia];
1342}
1343
1344// Incluir o tipo da página no SRC, se existir
1345if (
1346    !usaSrcLiraClaude &&
1347    parametroTipo &&
1348    ![
1349        "netflix-dados",
1350        "comunidade-programadores",
1351        "vit",
1352        "trial7",
1353        "aut",
1354        "fat",
1355    ].includes(parametroTipo)
1356) {
1357    dicSrcPadrao += "_" + parametroTipo;
1358}
1359
1360// Adicionar o evento de clique nos botões de oferta
1361elemsBotaoOferta.forEach((botao) => {
1362    botao.href = "javascript:void(0)";
1363
1364    const funcaoBotao = () => {
1365        irAteElementoID("secao-oferta");
1366
1367        botao.href = "#secao-oferta";
1368
1369        botao.removeEventListener("click", funcaoBotao);
1370    };
1371
1372    botao.addEventListener("click", funcaoBotao);
1373});
1374
1375// Adicionar o evento de clique nos botões de Popup de Trilha
1376elemsBotaoPopupTrilha.forEach((botao) => {
1377    botao.addEventListener("click", () => {
1378        trocarConteudoPopup("trilha", botao.getAttribute("textotrilha"), true);
1379    });
1380});
1381
1382// Trocar IDs formulário de pré-checkout
1383var numFormActive = "";
1384
1385if (window.ehCupom) {
1386    const formOrigemSacani =
1387        listaFormOrigem?.com?.cupom?.sacani?.[parametroOrigem];
1388
1389    if (parametroCupomNormalizado === "sacani" && formOrigemSacani) {
1390        numFormActive = formOrigemSacani;
1391    } else {
1392        numFormActive =
1393            dicIDForm["cupom"][parametroCupomNormalizado][parametroCurso];
1394    }
1395} else if (parametroTipo && ["trial7", "aut", "fat"].includes(parametroTipo)) {
1396    numFormActive = dicIDForm[parametroTipo][parametroCurso];
1397} else {
1398    /*
1399     * 🔴 A CADEIA DE FALLBACK E O QUE DECIDE EM QUE LISTA O LEAD CAI.
1400     *
1401     * Ate 21/08/2026 ela tinha tres defeitos, e os tres terminavam na COMUNIDADE:
1402     *
1403     *   1. `dicIDForm[parametroFonte][parametroCurso]` com uma fonte que nao e
1404     *      chave do mapa estoura `TypeError` — `undefined[curso]`. O precheckout
1405     *      MORRE ali, e o que fica valendo e o formulario do markup. Medido em
1406     *      producao: `?fonte=xyz` (um typo no link de anuncio basta) deixava
1407     *      `/claude-impressionador`, `/no-code-impressionador` e
1408     *      `/agentes-ia-impressionador` postando para 7807, a lista da Comunidade.
1409     *   2. o segundo ramo caia em `dicIDForm[fonte]["com"]`: fonte conhecida e
1410     *      curso ausente daquela fonte mandava o lead do curso para a lista da
1411     *      Comunidade DAQUELA fonte. Foi assim que
1412     *      `/agentes-ia-impressionador?fonte=aula` postava para 7837.
1413     *   3. o terceiro ramo, sem fonte nenhuma, tambem caia na Comunidade.
1414     *
1415     * A regra agora e uma so: na duvida, a lista de espera DESTE curso. Cair na
1416     * lista de outro produto nao e degradar, e mandar o lead para a campanha
1417     * errada — e nao aparece em log nenhum, porque o form envia e a pessoa ve
1418     * "obrigado".
1419     *
1420     * E NAO ha ultimo degrau de proposito. Quando nada resolve para este curso, o
1421     * certo e nao reescrever nada: o formulario do MARKUP e o piso, e ele foi
1422     * corrigido nas seis paginas que usam este motor — todas traziam 7807, a
1423     * lista da Comunidade. E o unico jeito de servir o `cc` (Claude Code), que
1424     * so existe em `aula`: um degrau final para `lespera["com"]` SOBRESCREVERIA
1425     * o markup certo com o da Comunidade, que e o defeito de novo, ao contrario.
1426     *
1427     * A pagina da Comunidade continua certa sem esse degrau: `parametroCurso`
1428     * cai em `"com"` sozinho quando nao ha `?curso=` (ou ele e desconhecido), e
1429     * `lespera["com"]` resolve normalmente.
1430     */
1431    // Sem `var`: `numFormActive` ja e declarado no topo (`var` e de FUNCAO, nao de
1432    // bloco), e redeclarar aqui faz parecer que esta e outra variavel — que e
1433    // como um refactor introduz bug de escopo sem mudar comportamento nenhum.
1434    var mapaFonte = (parametroFonte && dicIDForm[parametroFonte]) || {};
1435    /* A origem volta somente neste degrau. Sem form proprio, `lespera` continua
1436     * sendo o fallback; nunca o ultimo formulario do mapa. */
1437    var mapaOrigem = (origemReferencia && dicIDForm[origemReferencia]) || {};
1438    numFormActive =
1439        mapaOrigem[parametroCurso] ||
1440        mapaFonte[parametroCurso] ||
1441        dicIDForm["lespera"][parametroCurso] ||
1442        "";
1443}
1444
1445if (
1446    numFormActive &&
1447    numFormActive != formActive.id.replace("_form_", "").replace("_", "")
1448) {
1449    document.querySelector("#" + formActive.id + "submit").id =
1450        "_form_" + numFormActive + "_submit";
1451    formActive.id = "_form_" + numFormActive + "_";
1452    document.querySelectorAll("[type=hidden]")[0].value = numFormActive;
1453    document.querySelectorAll("[type=hidden]")[1].value = numFormActive;
1454}
1455
1456// Ajustar cores do popup de pre-checkout
1457if (dicHueModeBotaoForm[parametroCurso]) {
1458    document.body.setAttribute(
1459        "style",
1460        `--hue-botao-form: ${dicHueModeBotaoForm[parametroCurso][0]}`,
1461    );
1462    document.body.setAttribute(dicHueModeBotaoForm[parametroCurso][1], "");
1463}
1464
1465// Adicionar o evento de clique nos botões padrões, de recorrência e no botão de fechar o popup e também zera os links para deixar apenas o clique no botão
1466
1467// Comunidade
1468if (parametroFonte === "pat") {
1469    atribuirFuncoesBotao(elemsBotaoPadrao, "cp", 0);
1470} else {
1471    atribuirFuncoesBotao(elemsBotaoPadrao, "cp", 1);
1472}
1473atribuirFuncoesBotao(elemsBotaoPix, "cp", 0);
1474atribuirFuncoesBotao(elemsBotaoRecorrente, "cl", 1);
1475
1476// Avulsos
1477atribuirFuncoesBotao(elemsBotaoAvulsoPadrao, "ap", 1);
1478atribuirFuncoesBotao(elemsBotaoAvulsoPix, "ap", 0);
1479atribuirFuncoesBotao(elemsBotaoAvulsoRecorrente, "al", 1);
1480
1481// Botão fechar popup precheckout
1482elemsBotaoFechar.forEach(function (elem) {
1483    elem.href = "#";
1484
1485    elem.addEventListener("click", function () {
1486        togglePopupAberto();
1487    });
1488});
1489
1490// Atualizar quantidade de Aulas e Horas do curso
1491if (dicQtdAulas[parametroCurso]) {
1492    elemsQtdAulas.forEach((elem) => {
1493        elem.innerText = dicQtdAulas[parametroCurso];
1494    });
1495}
1496
1497if (dicQtdHoras[parametroCurso]) {
1498    elemsQtdHoras.forEach((elem) => {
1499        elem.innerText = dicQtdHoras[parametroCurso];
1500    });
1501}
1502
1503// Criando a lista de cursos da comunidade
1504Object.keys(dicCursosCom).forEach((chave, i, lista) => {
1505    if (cursosCom) {
1506        if (i == lista.length - 1) {
1507            cursosCom += " e ";
1508        } else {
1509            cursosCom += ", ";
1510        }
1511    }
1512
1513    cursosCom += chave;
1514
1515    if (dicCursosCom[chave]) {
1516        if (descricaoCursosCom) {
1517            descricaoCursosCom += "<br><br>";
1518        }
1519
1520        descricaoCursosCom += `<strong>${chave}:</strong> ${dicCursosCom[chave]}`;
1521    }
1522});
1523
1524// Atualizar quantidade, cursos e descrição da Comunidade
1525elemsCursosCom.forEach((elem) => {
1526    elem.innerText = cursosCom;
1527});
1528
1529elemsQtdCursosCom.forEach((elem) => {
1530    elem.innerText = qtdCursosCom;
1531});
1532
1533elemsDescricaoCursosCom.forEach((elem) => {
1534    elem.innerHTML = descricaoCursosCom;
1535});
1536
1537let precoFinal;
1538
1539if (window.ehCupom) {
1540    precoFinal = dicPrecosFonte["aula"];
1541} else {
1542    precoFinal = dicPrecosFonte[parametroFonte];
1543}
1544
1545// Acertar Preços de acordo com a Página Carregada
1546elemsPrecoParcelado.forEach((elem) => {
1547    elem.innerText = "R$ " + precoFinal;
1548});
1549
1550elemsPrecoParceladoInt.forEach((elem) => {
1551    elem.innerText = precoFinal.substring(0, precoFinal.indexOf(","));
1552});
1553
1554elemsPrecoParceladoDec.forEach((elem) => {
1555    elem.innerText = precoFinal.substring(precoFinal.indexOf(",") + 1);
1556});
1557
1558if (elemsPrecoAVista.length > 0) {
1559    elemsPrecoAVista.forEach((elem) => {
1560        elem.innerText = dicPrecosAVistaFonte[parametroFonte];
1561    });
1562}
1563
1564if (
1565    parametroFonte == "aula" ||
1566    parametroFonte == "intensivao" ||
1567    parametroFonte == "jornada" ||
1568    parametroFonte == "up"
1569) {
1570    elemPrecoDe.forEach((precoDe) => {
1571        precoDe.innerHTML = '<span class="cortado">R$ 1.500</span> por 12x de';
1572    });
1573
1574    if (
1575        parametroFonte == "aula" ||
1576        parametroFonte == "intensivao" ||
1577        parametroFonte == "jornada"
1578    ) {
1579        // Ocultar o container de toggle
1580        elemContainerToggle.forEach((container) => {
1581            container.style.display = "none";
1582        });
1583
1584        // Ocultar caixa avulso
1585        elemPrecoSemFoco.forEach((elemPreco, i) => {
1586            elemPreco.style.display = "none";
1587
1588            if (i == 0) {
1589                elemPreco.parentElement.classList.remove(
1590                    "container--oferta-duplo",
1591                );
1592                elemPreco.parentElement.classList.add("container--oferta");
1593            }
1594        });
1595
1596        // Ocultar melhor opção na caixa padrão
1597        elemPrecoFoco.forEach((elemPreco) => {
1598            let melhorPreco = elemPreco.querySelector(
1599                '[class*="preco__melhoropcao"]',
1600            );
1601            melhorPreco.style.display = "none";
1602        });
1603
1604        // Ocultar opções de pagamento e caixa avulso na versão antiga da página de vendas
1605        if (elemBlocoToggle) {
1606            elemBlocoToggle.classList.add("oculto");
1607        }
1608
1609        elemsBlocoPlano.forEach((bloco) => {
1610            let elemBlocoNormal = bloco.querySelector(
1611                ".bloco-plano-pgvpy:not(.destaque-bloco-plano-pgvpy)",
1612            );
1613            let elemBlocoDestaque = bloco.querySelector(
1614                ".destaque-bloco-plano-pgvpy",
1615            );
1616
1617            bloco.classList.add("bloco-unico");
1618            elemBlocoDestaque.classList.add("bloco-unico");
1619            elemBlocoNormal.classList.add("oculto");
1620        });
1621    }
1622}
1623
1624// Ajustes na página se for Perpétuo de VSL de Excel
1625if (parametroCurso == "excel") {
1626    if (parametroFonte == "perpetuo" && parametroTipo == "vsl") {
1627        var elemSecaoVSL = document.querySelector("#secao-vsl");
1628
1629        // Ocultar seção pós-VSL e interações da página
1630        elemSecaoVSL.classList.add("secao-pgvex--ocultas");
1631        document.body.classList.add("pgvex-fechada");
1632    }
1633}
1634
1635// Ajustes no Vídeo de Vendas
1636ajustesVideoVendas();
1637
1638// Funções para validar o formulário
1639const isRequired = (value) => (value === "" ? false : true);
1640
1641const isEmailValid = (email) => {
1642    const re =
1643        /^(([^<>()\[\]\\.,;:\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,}))$/;
1644    return re.test(email);
1645};
1646
1647const showError = (input, message) => {
1648    const formField = input.parentElement;
1649
1650    input.setAttribute("aria-invalid", "true");
1651    formField.classList.remove("sucesso");
1652    formField.classList.add("erro");
1653
1654    const erro = formField.querySelector("small");
1655    erro.textContent = message;
1656};
1657
1658const showSuccess = (input) => {
1659    const formField = input.parentElement;
1660
1661    input.setAttribute("aria-invalid", "false");
1662    formField.classList.remove("erro");
1663    formField.classList.add("sucesso");
1664
1665    const error = formField.querySelector("small");
1666    error.textContent = "";
1667};
1668
1669const checkfullname = () => {
1670    let valid = false;
1671    const fullname = fullnameForm.value.trim();
1672
1673    if (!isRequired(fullname)) {
1674        showError(fullnameForm, "Seu nome não pode ser vazio.");
1675    } else {
1676        showSuccess(fullnameForm);
1677        valid = true;
1678    }
1679    return valid;
1680};
1681
1682const checkEmail = () => {
1683    let valid = false;
1684    const email = emailForm.value.trim();
1685
1686    if (!isRequired(email)) {
1687        showError(emailForm, "Seu e-mail não pode ser vazio.");
1688    } else if (!isEmailValid(email)) {
1689        showError(emailForm, "O e-mail digitado não é válido.");
1690    } else {
1691        showSuccess(emailForm);
1692        valid = true;
1693    }
1694    return valid;
1695};
1696
1697formActive.addEventListener(
1698    "input",
1699    debounce(function (e) {
1700        switch (e.target.id) {
1701            case "fullname":
1702                checkfullname();
1703                break;
1704            case "email":
1705                checkEmail();
1706                break;
1707        }
1708    }),
1709);
1710
1711formActive.addEventListener("submit", function (e) {
1712    e.preventDefault();
1713
1714    let isfullnameValid = checkfullname(),
1715        isEmailValid = checkEmail();
1716
1717    let isFormValid = isfullnameValid && isEmailValid;
1718
1719    if (isFormValid) {
1720        if (redirecionarCheckoutHiaSeReenvio()) return;
1721
1722        enviarFormulario();
1723    }
1724});
1725
1726// Script para preencher o formulário de pre-checkout com os parâmetros da URL
1727function editarValorCampoForm(elemsForm, valorForm) {
1728    elemsForm.forEach(function (element) {
1729        element.value = valorForm;
1730    });
1731}
1732
1733var elemsFormFullname = document.querySelectorAll("#fullname");
1734var elemsFormEmail = document.querySelectorAll("#email");
1735var elemsFormPhone = document.querySelectorAll("#phone");
1736var elemsFormDDD = document.querySelectorAll("[id='field[59]']");
1737var elemsFormCelular = document.querySelectorAll("[id='field[60]']");
1738
1739var parametrosURLCheckout = new URLSearchParams(window.location.search);
1740
1741var valorFirstname = parametrosURLCheckout.get("firstname") || (window.leadUrlParams || {}).firstname;
1742var valorFullname = parametrosURLCheckout.get("fullname") || (window.leadUrlParams || {}).fullname;
1743
1744// Incluir a lógica de window.leadEmail e window.leadPhone
1745var valorEmail = (parametrosURLCheckout.get("email") || (window.leadUrlParams || {}).email || "").trim();
1746if (!valorEmail) valorEmail = String(window.leadEmail || "").trim();
1747
1748// Base phone: URL > leadPhone
1749var phoneBase = onlyDigits((parametrosURLCheckout.get("phone") || (window.leadUrlParams || {}).phone || "").trim());
1750if (!phoneBase) phoneBase = onlyDigits(window.leadPhone);
1751
1752// Se vier com DDI 55 (e tiver tamanho suficiente), remove pra extrair DDD/celular corretamente
1753// (mantém só BR)
1754var phoneSemDdi = phoneBase;
1755if (phoneSemDdi.indexOf("55") === 0 && phoneSemDdi.length >= 12) {
1756    phoneSemDdi = phoneSemDdi.substring(2);
1757}
1758
1759// DDD e celular: URL >
1759 fallback do phoneSemDdi
1760var valorDDD = (parametrosURLCheckout.get("ddd") || (window.leadUrlParams || {}).ddd || "").trim();
1761if (!valorDDD)
1762    valorDDD = phoneSemDdi.length >= 10 ? phoneSemDdi.substring(0, 2) : "";
1763
1764var valorCelular = (parametrosURLCheckout.get("celular") || (window.leadUrlParams || {}).celular || "").trim();
1765if (!valorCelular)
1766    valorCelular = phoneSemDdi.length >= 10 ? phoneSemDdi.substring(2) : "";
1767
1768// Phone final: URL > leadPhone (já normalizado em dígitos)
1769var valorPhone = phoneBase;
1770
1771if (valorFullname) {
1772    editarValorCampoForm(elemsFormFullname, valorFullname);
1773} else if (valorFirstname) {
1774    editarValorCampoForm(elemsFormFullname, valorFirstname);
1775}
1776
1777if (valorEmail) {
1778    editarValorCampoForm(elemsFormEmail, valorEmail);
1779}
1780
1781if (elemsFormPhone.length > 0) {
1782    if (valorDDD && valorCelular) {
1783        editarValorCampoForm(elemsFormPhone, valorDDD + valorCelular);
1784    } else if (valorPhone) {
1785        editarValorCampoForm(elemsFormPhone, valorPhone);
1786    }
1787} else {
1788    if (valorDDD && valorCelular) {
1789        editarValorCampoForm(elemsFormDDD, valorDDD);
1790        editarValorCampoForm(elemsFormCelular, valorCelular);
1791    } else if (valorPhone) {
1792        editarValorCampoForm(elemsFormDDD, valorPhone.substring(0, 2));
1793        editarValorCampoForm(elemsFormCelular, valorPhone.substring(2));
1794    }
1795}

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.