(function(){ var API = window.AG2IMPULSA2_CHAT_API || window.LOGITECH_CHAT_API || ""; if(!API){ console.error("AG2IMPULSA2_CHAT_API no definido"); return; } var KEY = window.AG2IMPULSA2_CHAT_API_KEY || window.LOGITECH_CHAT_API_KEY || ""; function norm(v){ v = String(v||"").toLowerCase().replace(/[\s_-]+/g,""); if(["c170","ag2c170","circular170","sipla"].indexOf(v)>=0) return "c170"; if(["catalog","all","home",""].indexOf(v)>=0) return "catalog"; return String(v||"").toLowerCase(); } function urlCampaign(){ try { var q = new URLSearchParams(location.search).get("agente") || ""; return norm(q); } catch(e) { return "catalog"; } } function copyFor(mode){ if(mode==="c170") return { title:"Circular 170 · SIPLA · demo", hello:"Hola, vi que llegas por Circular 170 / SIPLA (ag2c170). ¿La vinculación de asociados te está quedando en Excel o en carpetas? Te cuento cómo arma el expediente y agendamos demo.", ph:"¿Cuántas vinculaciones al mes? Quiero demo de ag2c170", wa:"Hola%20Impulsa2%2C%20vengo%20de%20https%3A%2F%2Fimpulsa2.com.co%2F%3Fagente%3Dc170%20y%20quiero%20demo%20de%20Circular%20170.", send:"c170" }; var focus = { ag2liberacion:"ag2Liberación (guías HBL/HAWB)", ag2asistencia:"ag2Asistencia", agentecotizador:"AgenteCotizador", agri2share:"agri2share", chatbot:"el chatbot de rastreo", rpa:"RPA logístico", los:"el LOS", medida:"un agente a la medida" }; if(focus[mode]) return { title:"Agentes logísticos · "+focus[mode], hello:"Hola, soy ag2Impulsa2. Vi que te interesa "+focus[mode]+". Te cuento ese y, si quieres, también los demás (Circular 170, liberación, cotizador, asistencia). ¿Demo o consultoría?", ph:"Quiero demo o consultoría de "+focus[mode], wa:"Hola%20Impulsa2%2C%20vengo%20de%20la%20web%20y%20quiero%20info%20de%20"+encodeURIComponent(focus[mode])+".", send:mode }; return { title:"Agentes logísticos · catálogo", hello:"Hola, soy ag2Impulsa2. En esta página te ayudo con todo el catálogo: Circular 170, liberación de guías, cotizador, asistencia, chatbot, RPA o un agente a la medida. ¿Cuál te duele hoy?", ph:"¿Qué hacen? Quiero demo de liberación / cotizador / c170…", wa:"Hola%20Impulsa2%2C%20vengo%20de%20la%20web%20y%20quiero%20conocer%20los%20agentes.", send:"catalog" }; } function sidKey(mode){ return mode==="c170" ? "ag2i_sid_c170" : "ag2i_sid_catalog"; } var MODE = urlCampaign() || "catalog"; if(MODE==="") MODE="catalog"; var sid = null; try { sid = localStorage.getItem(sidKey(MODE)) || null; } catch(e) {} var css = "#ag2i-chat-root{font-family:Roboto,system-ui,sans-serif;position:fixed;right:18px;bottom:18px;z-index:99999;}"+ "#ag2i-chat-btn{border:none;border-radius:999px;padding:12px 16px;background:#1b2a47;color:#fff;font-weight:700;cursor:pointer;box-shadow:0 8px 24px rgba(27,42,71,.4);}"+ "#ag2i-chat-panel{display:none;position:absolute;right:0;bottom:54px;width:min(92vw,380px);max-height:74vh;background:#fff;border:1px solid #e5e7eb;border-radius:14px;box-shadow:0 16px 40px rgba(0,0,0,.14);padding:12px;}"+ "#ag2i-chat-log{height:280px;overflow:auto;font-size:14px;line-height:1.45;color:#111827;}"+ "#ag2i-chat-log div{margin-bottom:8px;white-space:pre-wrap;}"+ "#ag2i-chat-wa{display:block;margin-top:8px;font-size:13px;font-weight:700;color:#128C7E;text-decoration:none;}"; var s=document.createElement("style"); s.textContent=css; document.head.appendChild(s); function el(t,a,c){ var e=document.createElement(t); if(a) Object.keys(a).forEach(function(k){ e.setAttribute(k,a[k]); }); if(c) e.appendChild(document.createTextNode(c)); return e; } var root = el("div",{id:"ag2i-chat-root"}); var btn = el("button",{type:"button",id:"ag2i-chat-btn","aria-label":"Abrir chat ag2Impulsa2"},"ag2Impulsa2"); var panel = el("div",{id:"ag2i-chat-panel"}); var title = el("div",{style:"font-weight:700;margin-bottom:8px;color:#1b2a47"},""); var log = el("div",{id:"ag2i-chat-log"}); var row = el("div",{style:"display:flex;gap:6px;margin-top:8px"}); var inp = el("input",{type:"text",placeholder:"",style:"flex:1;padding:8px;border:1px solid #d1d5db;border-radius:8px;font-size:14px"}); var send = el("button",{type:"button",style:"padding:8px 12px;border-radius:8px;border:none;background:#f39c12;color:#1b2a47;font-weight:700;cursor:pointer"},"Enviar"); var wa = el("a",{id:"ag2i-chat-wa",href:"#",target:"_blank",rel:"noopener"},"Continuar por WhatsApp → +57 310 5740462"); row.appendChild(inp); row.appendChild(send); panel.appendChild(title); panel.appendChild(log); panel.appendChild(row); panel.appendChild(wa); root.appendChild(btn); root.appendChild(panel); document.body.appendChild(root); function applyMode(mode, resetHello){ MODE = norm(mode) || "catalog"; var c = copyFor(MODE); title.textContent = c.title; inp.setAttribute("placeholder", c.ph); wa.setAttribute("href", "https://wa.me/573105740462?text="+c.wa); try { sid = localStorage.getItem(sidKey(MODE)) || null; } catch(e) { sid = null; } if(resetHello){ log.innerHTML = ""; append("assistant", c.hello); } } function append(role, text){ var d=el("div"); d.textContent=(role==="user"?"Tú: ":"ag2Impulsa2: ")+text; log.appendChild(d); log.scrollTop=log.scrollHeight; } applyMode(MODE, true); btn.onclick=function(){ if(urlCampaign()!=="c170" && MODE==="c170") applyMode("catalog", true); panel.style.display = panel.style.display==="none"||!panel.style.display?"block":"none"; }; async function post(){ var t=inp.value.trim(); if(!t) return; inp.value=""; append("user",t); var headers={"Content-Type":"application/json"}; if(KEY) headers["X-Api-Key"]=KEY; var payload = copyFor(MODE); var r=await fetch(API,{method:"POST",headers:headers,body:JSON.stringify({message:t,session_id:sid,agente:payload.send})}); var j=await r.json().catch(function(){ return null; }); if(!r.ok || !j){ append("assistant","No pudimos conectar. Escríbenos al WhatsApp +57 310 5740462."); return; } sid=j.session_id; try { localStorage.setItem(sidKey(MODE), sid); } catch(e) {} append("assistant",j.reply); } send.onclick=post; inp.addEventListener("keydown",function(e){ if(e.key==="Enter") post(); }); window.ag2Impulsa2OpenChat = function(opts){ var next = (opts && opts.agente) ? norm(opts.agente) : (urlCampaign() || "catalog"); if(next !== MODE) applyMode(next, true); panel.style.display="block"; }; })();