(function (){
function el(tag, attrs, children){
var node=document.createElement(tag);
if(attrs){
Object.keys(attrs).forEach(function (k){
if(k==="class") node.className=attrs[k];
else if(k==="text") node.textContent=attrs[k];
else node.setAttribute(k, attrs[k]);
});
}
(children||[]).forEach(function (c){
if(typeof c==="string") node.appendChild(document.createTextNode(c));
else if(c) node.appendChild(c);
});
return node;
}
function safeText(v){
return String(v==null ? "":v);
}
function cleanPhone(v){
return safeText(v).replace(/[^\d]/g, "");
}
function deepGet(obj, path){
var cur=obj;
var parts=String(path||"").split(".");
for (var i=0; i < parts.length; i++){
if(!cur||typeof cur!=="object") return "";
cur=cur[parts[i]];
}
return cur==null ? "":cur;
}
function htmlToNode(html){
var t=document.createElement("template");
t.innerHTML=String(html||"").trim();
return t.content.firstElementChild||document.createElement("div");
}
function htmlToText(html){
if(html==null) return "";
var t=document.createElement("template");
t.innerHTML=String(html);
var lis=t.content ? t.content.querySelectorAll("li"):[];
if(lis&&lis.length){
var items=[];
for (var i=0; i < lis.length; i++){
var v=safeText(lis[i].textContent||"").replace(/\s+/g, " ").trim();
if(v) items.push(v);
}
return items.join(", ");
}
var out=(t.content&&t.content.textContent) ? t.content.textContent:"";
return safeText(out).replace(/\s+/g, " ").trim();
}
function applyBinds(rootNode, data){
var nodes=rootNode.querySelectorAll("[data-bind],[data-bind-text],[data-bind-href],[data-bind-href-wa],[data-bind-href-tel],[data-show-if]");
for (var i=0; i < nodes.length; i++){
var n=nodes[i];
var showIf=n.getAttribute("data-show-if");
if(showIf){
var vShow=deepGet(data, showIf);
if(!vShow) n.style.display="none";
}
var bindText=n.getAttribute("data-bind-text");
if(bindText) n.textContent=safeText(deepGet(data, bindText));
var bind=n.getAttribute("data-bind");
if(bind&&n.tagName==="IMG"){
var src=safeText(deepGet(data, bind));
if(src) n.setAttribute("src", src);
}else if(bind){
var bg=safeText(deepGet(data, bind));
if(bg) n.style.backgroundImage='url("' + bg.replace(/"/g, '\\"') + '")';
}
var bindHref=n.getAttribute("data-bind-href");
if(bindHref&&n.tagName==="A"){
var href=safeText(deepGet(data, bindHref));
if(href) n.setAttribute("href", href);
}
var bindWa=n.getAttribute("data-bind-href-wa");
if(bindWa){
var zap=safeText(deepGet(data, bindWa));
if(zap) n.setAttribute("href", formatWhatsUrl(zap));
}
var bindTel=n.getAttribute("data-bind-href-tel");
if(bindTel){
var tel=safeText(deepGet(data, bindTel));
if(tel) n.setAttribute("href", "tel:" + cleanPhone(tel));
}}
}
function firstImageFromSuite(s){
if(!s||typeof s!=="object") return "";
if(s.imagem) return safeText(s.imagem);
if(typeof s.imagens==="string") return safeText(s.imagens);
if(Array.isArray(s.imagens)&&s.imagens.length&&s.imagens[0]){
var i0=s.imagens[0];
if(typeof i0==="string") return safeText(i0);
if(i0&&typeof i0==="object"){
if(i0.image) return safeText(i0.image);
if(i0.imagem) return safeText(i0.imagem);
if(i0.url) return safeText(i0.url);
}}
return "";
}
function formatWhatsUrl(zap){
var n=cleanPhone(zap);
if(!n) return "";
if(n.indexOf("55")!==0) n="55" + n;
return "https://wa.me/" + n;
}
function faClass(kind){
if(kind==="pin") return "fa-thin fa-location-dot";
if(kind==="mail") return "fa-thin fa-envelope";
if(kind==="phone") return "fa-thin fa-phone";
if(kind==="whats") return "fa-thin fa-comment-dots";
if(kind==="chat") return "fa-thin fa-comments";
if(kind==="back") return "fa-thin fa-arrow-left";
return "fa-thin fa-circle";
}
function iconMarkup(kind){
return '<i class="bdm-fa ' + faClass(kind) + '" aria-hidden="true"></i>';
}
function findFirstQuestion(items){
for (var i=0; i < items.length; i++){
if(String(items[i].primeira||"").toUpperCase()==="S"&&items[i].tipo==="questao") return items[i];
}
for (var j=0; j < items.length; j++){
if(items[j].tipo==="questao") return items[j];
}
return null;
}
function findOptions(items, questionId){
var out=[];
for (var i=0; i < items.length; i++){
if(items[i].tipo==="opcao"&&String(items[i].parent)===String(questionId)) out.push(items[i]);
}
return out;
}
function findNextQuestion(items, optionId){
for (var i=0; i < items.length; i++){
if(items[i].tipo==="questao"&&String(items[i].parent)===String(optionId)) return items[i];
}
return null;
}
function boot(root){
if(!window.BDMChatPages) window.BDMChatPages={};
var container=document.getElementById("bdm-chat-container");
if(!container){
container=el("div", { id: "bdm-chat-container" });
document.body.appendChild(container);
}
var toggle=el("button", { class: "bdm-chat-toggle", type: "button", "aria-expanded": "false" }, ["Chat"]);
var panel=el("div", { class: "bdm-chat-panel", role: "dialog", "aria-label": "Motel Swing Chat" });
var header=el("div", { class: "bdm-chat-header" });
var headerEnd=el("div", { class: "bdm-chat-header-end" });
var titleWrap=el("div", { class: "bdm-chat-nav" });
var navHome=el("button", { class: "bdm-chat-navitem -icon", type: "button", "aria-label": "Home", title: "Home", "data-action": "openHome" });
navHome.innerHTML='<i class="bdm-fa fa-thin fa-house" aria-hidden="true"></i>';
var navRes=el("button", { class: "bdm-chat-navitem -icon", type: "button", "aria-label": "Minhas Reservas", title: "Minhas Reservas", "data-action": "openReservations" });
navRes.innerHTML='<i class="bdm-fa fa-thin fa-calendar-check" aria-hidden="true"></i>';
var navPontos=el("button", { class: "bdm-chat-navitem -icon", type: "button", "aria-label": "Meus Pontos de Fidelidade", title: "Meus Pontos de Fidelidade", "data-action": "openPontosFidelidade" });
navPontos.innerHTML='<i class="bdm-fa fa-thin fa-star" aria-hidden="true"></i>';
var navAcc=el("button", { class: "bdm-chat-navitem -icon", type: "button", "aria-label": "Minha Conta", title: "Minha Conta", "data-action": "openAccount" });
navAcc.innerHTML='<i class="bdm-fa fa-thin fa-user" aria-hidden="true"></i>';
var close=el("button", { class: "bdm-chat-close", type: "button", "aria-label": "Sair", title: "Sair" });
close.innerHTML='<i class="bdm-fa fa-thin fa-arrow-right-from-bracket" aria-hidden="true"></i>';
var closeMobile=el("button", {
class: "bdm-chat-close-mobile",
type: "button",
"aria-label": "Fechar",
title: "Fechar",
});
closeMobile.innerHTML='<i class="bdm-fa fa-thin fa-xmark" aria-hidden="true"></i>';
var body=el("div", { class: "bdm-chat-body" });
var state={ currentView: "home" };
var lastForm=null;
titleWrap.appendChild(navHome);
titleWrap.appendChild(navRes);
titleWrap.appendChild(navPontos);
titleWrap.appendChild(navAcc);
headerEnd.appendChild(close);
headerEnd.appendChild(closeMobile);
header.appendChild(titleWrap);
header.appendChild(headerEnd);
panel.appendChild(header);
panel.appendChild(body);
var noHeaderExit=el("button", {
class: "bdm-chat-noheader-exit",
type: "button",
"aria-label": "Fechar",
title: "Fechar",
});
noHeaderExit.innerHTML='<i class="bdm-fa fa-thin fa-xmark" aria-hidden="true"></i>';
panel.insertBefore(noHeaderExit, header);
noHeaderExit.addEventListener("click", function (){
setOpen(false);
});
function updateNoHeaderExit(){
var v=state.currentView;
var show =
container.classList.contains("bdm-no-header") &&
(v==="authLanding" ||
v==="authLogin" ||
v==="authRegister" ||
v==="authSubmitLogin" ||
v==="authSubmitRegister");
if(show) noHeaderExit.classList.add("bdm-chat-noheader-exit--on");
else noHeaderExit.classList.remove("bdm-chat-noheader-exit--on");
}
function renderBodyLoading(){
body.innerHTML="";
var wrap=el("div", {
class: "bdm-page-loading",
role: "status",
"aria-live": "polite",
"aria-busy": "true",
"aria-label": "Carregando conteúdo"
});
wrap.appendChild(el("i", { class: "bdm-fa fa-solid fa-circle-notch fa-spin", "aria-hidden": "true" }));
body.appendChild(wrap);
}
container.appendChild(toggle);
container.appendChild(panel);
function isMobilePanel(){
return window.matchMedia&&window.matchMedia("(max-width: 768px)").matches;
}
function setOpen(open){
if(open) panel.classList.add("is-open");
else panel.classList.remove("is-open");
toggle.setAttribute("aria-expanded", open ? "true":"false");
if(open){
document.documentElement.classList.add("bdm-chat-noscroll");
}else{
document.documentElement.classList.remove("bdm-chat-noscroll");
}}
function handleCloseClick(){
var pages=window.BDMChatPages||{};
if(state.currentView!=="home"){
navigate("home");
return;
}
if(pages.isLogged&&pages.isLogged()){
if(pages.logout) pages.logout();
navigate("authLanding");
}
setOpen(false);
}
toggle.addEventListener("click", function (){
setOpen(!panel.classList.contains("is-open"));
});
close.addEventListener("click", handleCloseClick);
closeMobile.addEventListener("click", function (){
setOpen(false);
});
window.addEventListener("resize", function (){
if(panel.classList.contains("is-open")){
document.documentElement.classList.add("bdm-chat-noscroll");
}else{
document.documentElement.classList.remove("bdm-chat-noscroll");
}});
navHome.addEventListener("click", function (ev){
ev.preventDefault();
navigate("home");
});
navRes.addEventListener("click", function (ev){
ev.preventDefault();
navigate("reservas");
});
navPontos.addEventListener("click", function (ev){
ev.preventDefault();
navigate("pontosFidelidade");
});
navAcc.addEventListener("click", function (ev){
ev.preventDefault();
navigate("conta");
});
renderBodyLoading();
var bootstrapUrl=(window.motelswingChat&&window.motelswingChat.restBootstrap)||"";
var motelUrl=(window.motelswingChat&&window.motelswingChat.restMotel)||"";
var suitesUrl=(window.motelswingChat&&window.motelswingChat.restSuites)||"";
var templateUrl=(window.motelswingChat&&window.motelswingChat.restTemplate)||"";
var loginUrl=(window.motelswingChat&&window.motelswingChat.restLogin)||"";
var cadastroUrl=(window.motelswingChat&&window.motelswingChat.restCadastro)||"";
var reservasUrl=(window.motelswingChat&&window.motelswingChat.restReservas)||"";
var pontosFidelidadeUrl=(window.motelswingChat&&window.motelswingChat.restPontosFidelidade)||"";
var pontosExtratoUrl=(window.motelswingChat&&window.motelswingChat.restPontosExtrato)||"";
var cupomAplicarUrl=(window.motelswingChat&&window.motelswingChat.restCupomAplicar)||"";
var userUpdateUrl=(window.motelswingChat&&window.motelswingChat.restUserUpdate)||"";
var suiteDetalhesUrl=(window.motelswingChat&&window.motelswingChat.restSuiteDetalhes)||"";
var suitePrecosUrl=(window.motelswingChat&&window.motelswingChat.restSuitePrecos)||"";
var intervalosFechamentoUrl=(window.motelswingChat&&window.motelswingChat.restIntervalosFechamento)||"";
var suiteTermosUrl=(window.motelswingChat&&window.motelswingChat.restSuiteTermos)||"";
var suiteTermosInterativaUrl=(window.motelswingChat&&window.motelswingChat.restSuiteTermosInterativa)||"";
var reservaSaveUrl=(window.motelswingChat&&window.motelswingChat.restReservaSave)||"";
var reservaCheckUrl=(window.motelswingChat&&window.motelswingChat.restReservaCheck)||"";
var reservaDetalheUrl=(window.motelswingChat&&window.motelswingChat.restReservaDetalhe)||"";
var pagamentoPreferenceUrl=(window.motelswingChat&&window.motelswingChat.restPagamentoPreference)||"";
var pagamentoSubmitUrl=(window.motelswingChat&&window.motelswingChat.restPagamentoSubmit)||"";
var pagamentoCheckUrl=(window.motelswingChat&&window.motelswingChat.restPagamentoCheck)||"";
if(!bootstrapUrl||!motelUrl||!suitesUrl||!templateUrl||!loginUrl||!cadastroUrl){
body.textContent="Configuração inválida do plugin.";
return;
}
var cachedMotelData=null;
var templateCache={};
var cache={ chatData: null };
function loadTemplate(name){
if(templateCache[name]) return Promise.resolve(templateCache[name]);
var url=templateUrl + "?name=" + encodeURIComponent(name);
return fetch(url, { credentials: "same-origin" })
.then(function (r){ return r.json(); })
.then(function (j){
templateCache[name]=(j&&j.html) ? j.html:"";
return templateCache[name];
});
}
function wireActions(scope){
var acts=scope.querySelectorAll("[data-action]");
for (var i=0; i < acts.length; i++){
(function (){
var elAct=acts[i];
var act=elAct.getAttribute("data-action");
if(!act) return;
if(elAct.tagName==="FORM"){
elAct.addEventListener("submit", function (ev){
ev.preventDefault();
lastForm=elAct;
if(act==="authSubmitLogin") navigate("authSubmitLogin");
if(act==="authSubmitRegister") navigate("authSubmitRegister");
});
}else{
elAct.addEventListener("click", function (){
if(act==="openChat") navigate("chat");
if(act==="openHome") navigate("home");
if(act==="openSuites") navigate("suites");
if(act==="openReservations") navigate("reservas");
if(act==="openPontosFidelidade") navigate("pontosFidelidade");
if(act==="openAccount") navigate("conta");
if(act==="authLogin") navigate("authLogin");
if(act==="authRegister") navigate("authRegister");
if(act==="reservarSuite"){
var pages=window.BDMChatPages||{};
var ctx=buildCtx();
if(pages.reservarSuite) pages.reservarSuite(ctx);
}
if(act==="togglePassword"){
var form=elAct.closest("form");
if(!form) return;
var input=form.querySelector('input[name="senha"]');
if(!input) return;
input.type=input.type==="password" ? "text":"password";
}});
}})();
}}
function buildCtx(){
return {
el: el,
safeText: safeText,
cleanPhone: cleanPhone,
deepGet: deepGet,
htmlToNode: htmlToNode,
htmlToText: htmlToText,
applyBinds: applyBinds,
firstImageFromSuite: firstImageFromSuite,
formatWhatsUrl: formatWhatsUrl,
iconMarkup: iconMarkup,
findFirstQuestion: findFirstQuestion,
findOptions: findOptions,
findNextQuestion: findNextQuestion,
loadTemplate: loadTemplate,
wireActions: wireActions,
body: body,
header: header,
state: state,
cache: cache,
urls: {
bootstrap: bootstrapUrl,
motel: motelUrl,
suites: suitesUrl,
suiteDetalhes: suiteDetalhesUrl,
suitePrecos: suitePrecosUrl,
intervalosFechamento: intervalosFechamentoUrl,
suiteTermos: suiteTermosUrl,
suiteTermosInterativa: suiteTermosInterativaUrl,
reservaSave: reservaSaveUrl,
reservaCheck: reservaCheckUrl,
reservaDetalhe: reservaDetalheUrl,
pagamentoPreference: pagamentoPreferenceUrl,
pagamentoSubmit: pagamentoSubmitUrl,
pagamentoCheck: pagamentoCheckUrl,
login: loginUrl,
cadastro: cadastroUrl,
reservas: reservasUrl,
pontosFidelidade: pontosFidelidadeUrl,
pontosExtrato: pontosExtratoUrl,
cupomAplicar: cupomAplicarUrl,
userUpdate: userUpdateUrl,
},
navigate: navigate,
setHeaderVisible: function (visible){
if(visible) container.classList.remove("bdm-no-header");
else container.classList.add("bdm-no-header");
updateNoHeaderExit();
},
showPageLoading: renderBodyLoading,
};}
function navigate(view){
state.currentView=view;
container.setAttribute("data-bdm-view", String(view||""));
var pages=window.BDMChatPages||{};
var ctx=buildCtx();
if(view!=="authSubmitLogin"&&view!=="authSubmitRegister"){
ctx.showPageLoading();
}
if(view==="authLanding"){
ctx.setHeaderVisible(false);
if(pages.authLanding) return pages.authLanding(ctx, cachedMotelData);
return;
}
if(view==="authLogin"){
ctx.setHeaderVisible(false);
if(pages.authLogin) return pages.authLogin(ctx, cachedMotelData);
return;
}
if(view==="authRegister"){
ctx.setHeaderVisible(false);
if(pages.authRegister) return pages.authRegister(ctx, cachedMotelData);
return;
}
if(view==="authSubmitLogin"){
ctx.setHeaderVisible(false);
if(pages.authSubmitLogin) return pages.authSubmitLogin(ctx, lastForm);
return;
}
if(view==="authSubmitRegister"){
ctx.setHeaderVisible(false);
if(pages.authSubmitRegister) return pages.authSubmitRegister(ctx, lastForm);
return;
}
if(view==="home"){
ctx.setHeaderVisible(true);
if(pages.home) return pages.home(ctx, cachedMotelData);
return;
}
if(view==="chat"){
ctx.setHeaderVisible(true);
if(pages.chat) return pages.chat(ctx);
return;
}
if(view==="suites"){
ctx.setHeaderVisible(true);
if(pages.suites) return pages.suites(ctx);
return;
}
if(view==="reservas"){
ctx.setHeaderVisible(true);
if(pages.reservas) return pages.reservas(ctx);
return;
}
if(view==="pontosFidelidade"){
ctx.setHeaderVisible(true);
if(pages.pontosFidelidade) return pages.pontosFidelidade(ctx);
return;
}
if(view==="conta"){
ctx.setHeaderVisible(true);
if(pages.conta) return pages.conta(ctx, cachedMotelData);
return;
}
if(view==="suiteDetalhes"){
ctx.setHeaderVisible(true);
if(pages.suiteDetalhes) return pages.suiteDetalhes(ctx);
return;
}
if(view==="reservaAguarde"){
ctx.setHeaderVisible(false);
if(pages.reservaAguarde) return pages.reservaAguarde(ctx);
return;
}
if(view==="reservaRecusada"){
ctx.setHeaderVisible(false);
if(pages.reservaRecusada) return pages.reservaRecusada(ctx);
return;
}
if(view==="reservaPagamento"){
ctx.setHeaderVisible(true);
if(pages.reservaPagamento) return pages.reservaPagamento(ctx);
return;
}
if(view==="reservaDetalhe"){
ctx.setHeaderVisible(true);
if(pages.reservaDetalhe) return pages.reservaDetalhe(ctx);
return;
}
updateNoHeaderExit();
}
fetch(motelUrl, { credentials: "same-origin" })
.then(function (r){ return r.json(); })
.then(function (motel){
if(motel&&motel.erro){
motel=applyPluginLogo({});
}else{
motel=applyPluginLogo(motel);
}
cachedMotelData=motel;
window.BDMChatMotelModel=motel;
window.BDMChatMotelIntegracao=readModelIntegracao(motel)||readFallbackIntegracao();
var pages=window.BDMChatPages||{};
if(pages.isLogged&&pages.isLogged()) navigate("home");
else navigate("authLanding");
})
.catch(function (){
window.BDMChatMotelIntegracao=readFallbackIntegracao();
navigate("authLanding");
});
}
function normalizeIntegracaoValue(value){
if(value==null) return "";
return String(value).trim().toUpperCase();
}
function readIntegracaoFromNode(node, depth){
if(!node||typeof node!=="object"||depth > 3) return "";
if(Array.isArray(node)){
for (var i=0; i < node.length; i++){
var arrValue=readIntegracaoFromNode(node[i], depth + 1);
if(arrValue) return arrValue;
}
return "";
}
var keys=Object.keys(node);
for (var k=0; k < keys.length; k++){
var key=keys[k];
if(!Object.prototype.hasOwnProperty.call(node, key)) continue;
var normalizedKey=String(key).trim().toLowerCase();
if(normalizedKey==="integracao" ||
normalizedKey==="integração" ||
normalizedKey==="integracao_api" ||
normalizedKey==="integracaopms"
){
return normalizeIntegracaoValue(node[key]);
}}
for (var j=0; j < keys.length; j++){
var child=node[keys[j]];
if(child&&typeof child==="object"){
var nestedValue=readIntegracaoFromNode(child, depth + 1);
if(nestedValue) return nestedValue;
}}
return "";
}
function readModelIntegracao(rawModel){
return readIntegracaoFromNode(rawModel, 0);
}
function readFallbackIntegracao(){
var localized =
window.motelswingChat&&typeof window.motelswingChat==="object"
? normalizeIntegracaoValue(window.motelswingChat.motelIntegracao)
: "";
if(localized) return localized;
return normalizeIntegracaoValue(window.BDMChatMotelIntegracao);
}
function applyPluginLogo(motel){
var chat=window.motelswingChat&&typeof window.motelswingChat==="object"
? window.motelswingChat
: {};
var logo=chat.pluginLogo ? String(chat.pluginLogo):"";
var google=chat.googleMapsUrl ? String(chat.googleMapsUrl):"";
var waze=chat.wazeUrl ? String(chat.wazeUrl):"";
var data=motel&&typeof motel==="object" ? motel:{};
if(logo&&!data.logo) data.logo=logo;
if(google&&!data.google) data.google=google;
if(waze&&!data.waze) data.waze=waze;
if(data.motel&&typeof data.motel==="object"){
if(logo&&!data.motel.logo) data.motel.logo=logo;
if(google&&!data.motel.google) data.motel.google=google;
if(waze&&!data.motel.waze) data.motel.waze=waze;
}
return data;
}
function suiteIsUnavailableToday(suite){
if(!suite||typeof suite!=="object") return false;
var modelIntegracao=readModelIntegracao(window.BDMChatMotelModel)||readFallbackIntegracao();
if(modelIntegracao==="N") return false;
if(readModelIntegracao(suite)==="N") return false;
function valueMeansUnavailable(v){
if(v===false) return true;
if(v===true) return false;
if(v===0||v==="0") return true;
if(typeof v==="string"){
var t=v.trim().toLowerCase();
if(t==="0"||t==="false"||t==="no"||t==="n"||t==="nao"||t==="não") return true;
if(t==="indisponivel"||t==="indisponível") return true;
}
if(typeof v==="number") return v===0;
var n=parseInt(v, 10);
return v!=null&&v!==""&&!isNaN(n)&&n===0;
}
if(Object.prototype.hasOwnProperty.call(suite, "disponibilidade")){
return valueMeansUnavailable(suite.disponibilidade);
}
if(Object.prototype.hasOwnProperty.call(suite, "disponivel")){
var d=suite.disponivel;
if(d===false||d===0||d==="0"||d==="N"||d==="n") return true;
if(d===true||d===1||d==="S"||d==="s"||d==="1") return false;
return valueMeansUnavailable(d);
}
if(Object.prototype.hasOwnProperty.call(suite, "disponível")){
return valueMeansUnavailable(suite["disponível"]);
}
if(Object.prototype.hasOwnProperty.call(suite, "indisponivel")||Object.prototype.hasOwnProperty.call(suite, "indisponível")){
var ind=suite.indisponivel!==undefined ? suite.indisponivel:suite["indisponível"];
return ind===true||ind===1||ind==="1"||String(ind).toLowerCase()==="true";
}
return false;
}
window.BDMChatReadIntegracaoFlag=readModelIntegracao;
window.BDMChatSuiteUnavailableToday=suiteIsUnavailableToday;
document.addEventListener("DOMContentLoaded", function (){
var root=document.getElementById("motelswing_reservas_root");
if(!root) return;
boot(root);
});
})();