{"id":28971,"date":"2026-02-22T21:54:30","date_gmt":"2026-02-22T21:54:30","guid":{"rendered":"https:\/\/mosaicconnect.io\/?page_id=28971"},"modified":"2026-02-28T21:43:05","modified_gmt":"2026-02-28T21:43:05","slug":"chatbot","status":"publish","type":"page","link":"https:\/\/mosaicconnect.io\/de\/chatbot\/","title":{"rendered":"chatbot"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"28971\" class=\"elementor elementor-28971\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-e38fa10 elementor-section-height-min-height elementor-section-boxed elementor-section-height-default elementor-section-items-middle\" data-id=\"e38fa10\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c7d62a3\" data-id=\"c7d62a3\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ab9deb4 elementor-widget elementor-widget-shortcode\" data-id=\"ab9deb4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\t        <style>\r\n\t        #mc-chatbot-OVZvqAnSSf-box{--mc-bg:#f3f4f6;--mc-panel:#ffffff;--mc-line:#e5e7eb;--mc-text:#111827;--mc-muted:#6b7280;--mc-accent:#111827;--mc-radius:16px;--mc-bubble-radius:14px;position:relative;width:100%;min-height:78vh;background:var(--mc-bg);border:1px solid #e5e7eb;border-radius:var(--mc-radius);overflow:hidden;font-family:Arial,sans-serif}\r\n\t        #mc-chatbot-OVZvqAnSSf-shell{display:flex;flex-direction:column;height:78vh}\r\n\t        #mc-chatbot-OVZvqAnSSf-head{padding:14px 16px;border-bottom:1px solid var(--mc-line);background:#fff;display:flex;justify-content:space-between;align-items:center;gap:10px}\r\n\t        #mc-chatbot-OVZvqAnSSf-head.has-img{position:relative;background-size:cover;background-position:center}\r\n\t        #mc-chatbot-OVZvqAnSSf-head.has-img:before{content:'';position:absolute;inset:0;background:linear-gradient(90deg,rgba(17,24,39,.68),rgba(17,24,39,.18));}\r\n\t        #mc-chatbot-OVZvqAnSSf-head.has-img > *{position:relative;z-index:1}\r\n\t        #mc-chatbot-OVZvqAnSSf-head.has-img #mc-chatbot-OVZvqAnSSf-title{color:#fff}\r\n\t        #mc-chatbot-OVZvqAnSSf-head.has-img #mc-chatbot-OVZvqAnSSf-staff-badge{color:rgba(255,255,255,.88)}\r\n\t        #mc-chatbot-OVZvqAnSSf-title{font-size:14px;font-weight:700;color:var(--mc-text);display:flex;align-items:center;gap:10px;min-width:0}\r\n\t        #mc-chatbot-OVZvqAnSSf-title img{width:28px;height:28px;border-radius:8px;object-fit:contain}\r\n\t        #mc-chatbot-OVZvqAnSSf-staff-badge{font-size:12px;color:var(--mc-muted)}\r\n\t        #mc-chatbot-OVZvqAnSSf-center{flex:1;display:flex;flex-direction:column;min-height:0}\r\n\t        #mc-chatbot-OVZvqAnSSf-hero{flex:1;display:flex;align-items:center;justify-content:center;text-align:center;font-size:20px;font-weight:700;color:var(--mc-text);padding:18px 10px}\r\n        #mc-chatbot-OVZvqAnSSf-messages{flex:1;overflow:auto;padding:12px 0}\r\n        #mc-chatbot-OVZvqAnSSf-stream{max-width:860px;margin:0 auto;padding:0 12px}\r\n\t        .mc-chat-row{display:flex;margin-bottom:16px}\r\n\t        .mc-chat-row.mine{justify-content:flex-end}\r\n\t        .mc-chat-col{max-width:80%;min-width:0}\r\n\t        .mc-chat-bubble{max-width:100%;padding:12px 14px;border-radius:var(--mc-bubble-radius);border:1px solid var(--mc-line);background:#fff;color:var(--mc-text);white-space:pre-wrap;line-height:1.45;overflow-wrap:anywhere;word-break:break-word}\r\n\t        .mc-chat-row.mine .mc-chat-bubble{background:var(--mc-accent);color:#fff;border-color:var(--mc-accent)}\r\n\t        .mc-chat-meta{font-size:11px;color:var(--mc-muted);margin:0 2px 6px}\r\n\t        .mc-chat-status{font-size:11px;color:var(--mc-muted);margin:6px 2px 0}\r\n\t        .mc-chat-status.error{color:#b91c1c}\r\n\t        .mc-chat-status button{border:0;background:transparent;color:inherit;text-decoration:underline;cursor:pointer;padding:0;margin-left:6px;font-size:11px}\r\n\t        #mc-chatbot-OVZvqAnSSf-typing{max-width:960px;margin:0 auto;padding:0 16px 10px;color:var(--mc-muted);font-size:12px;min-height:22px}\r\n\t\t        #mc-chatbot-OVZvqAnSSf-composer{margin-top:auto;padding:10px 12px 12px;border-top:1px solid var(--mc-line);background:#fff}\r\n\t        #mc-chatbot-OVZvqAnSSf-input{border:0;border-radius:var(--mc-bubble-radius);padding:10px 6px;font-size:15px;width:100%;box-sizing:border-box;background:transparent;color:#111}\r\n\t        #mc-chatbot-OVZvqAnSSf-input::placeholder{color:#9ca3af}\r\n\t        #mc-chatbot-OVZvqAnSSf-bar{max-width:860px;margin:0 auto;display:flex;gap:8px;align-items:flex-end;padding:8px 10px;border:1px solid #d1d5db;border-radius:var(--mc-bubble-radius);background:#fff}\r\n        #mc-chatbot-OVZvqAnSSf-input-wrap{flex:1}\r\n        #mc-chatbot-OVZvqAnSSf-input{min-height:38px;max-height:120px;resize:none}\r\n        .mc-chat-btn{border:1px solid #d1d5db;background:#fff;border-radius:10px;padding:8px 10px;cursor:pointer;font-size:12px;color:#374151}\r\n        .mc-chat-btn.primary{background:var(--mc-accent);border-color:var(--mc-accent);color:#fff;font-weight:700}\r\n\t        #mc-chatbot-OVZvqAnSSf-box.is-home #mc-chatbot-OVZvqAnSSf-messages,#mc-chatbot-OVZvqAnSSf-box.is-home #mc-chatbot-OVZvqAnSSf-typing{display:none}\r\n\t        #mc-chatbot-OVZvqAnSSf-box:not(.is-home) #mc-chatbot-OVZvqAnSSf-hero{display:none}\r\n        @media (max-width: 768px){#mc-chatbot-OVZvqAnSSf-box{min-height:92vh;border-radius:0}#mc-chatbot-OVZvqAnSSf-shell{height:92vh}.mc-chat-col{max-width:92%}#mc-chatbot-OVZvqAnSSf-composer{padding:8px}#mc-chatbot-OVZvqAnSSf-bar{border-radius:12px;padding:7px}.mc-chat-btn{padding:7px 8px}}\r\n        <\/style>\r\n\r\n\t        \t        <div id=\"mc-chatbot-OVZvqAnSSf-box\" class=\"is-home\" data-language=\"de\" style=\"\">\n\t            <div id=\"mc-chatbot-OVZvqAnSSf-shell\" style=\"\">\r\n\t\t                <div id=\"mc-chatbot-OVZvqAnSSf-head\" class=\"\" style=\"\">\r\n\t\t                    <span id=\"mc-chatbot-OVZvqAnSSf-title\">\r\n\t\t                        \t\t                        <span style=\"white-space:nowrap;overflow:hidden;text-overflow:ellipsis;\">Support-Chat<\/span>\n\t\t                    <\/span>\r\n\t\t                    <span style=\"display:flex;align-items:center;gap:8px;\">\r\n\t\t                        <span id=\"mc-chatbot-OVZvqAnSSf-staff-badge\"><\/span>\r\n\t\t                        <button id=\"mc-chatbot-OVZvqAnSSf-new\" class=\"mc-chat-btn\" type=\"button\">Neuer Chat<\/button>\n\t\t                        \t\t                    <\/span>\r\n\t\t                <\/div>\r\n\t                <div id=\"mc-chatbot-OVZvqAnSSf-center\">\r\n\t                    <div id=\"mc-chatbot-OVZvqAnSSf-messages\">\r\n\t                        <div id=\"mc-chatbot-OVZvqAnSSf-stream\"><\/div>\r\n\t                    <\/div>\r\n\t                    <div id=\"mc-chatbot-OVZvqAnSSf-typing\"><\/div>\r\n\t                    <div id=\"mc-chatbot-OVZvqAnSSf-hero\">Hallo. Wie k\u00f6nnen wir dir heute helfen?<\/div>\r\n\t\r\n\t                    <div id=\"mc-chatbot-OVZvqAnSSf-composer\">\r\n\t                        <div id=\"mc-chatbot-OVZvqAnSSf-bar\">\r\n\t                            <div id=\"mc-chatbot-OVZvqAnSSf-input-wrap\">\r\n\t                                <textarea id=\"mc-chatbot-OVZvqAnSSf-input\" placeholder=\"Nachricht eingeben\"><\/textarea>\n\t                            <\/div>\n                            <button id=\"mc-chatbot-OVZvqAnSSf-send\" class=\"mc-chat-btn primary\" type=\"button\">Senden<\/button>\n                        <\/div>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n\t        <script>\r\n\t        (function($){\r\n\t            const instance = \"mc-chatbot-OVZvqAnSSf\";\r\n\t            const ajaxUrl = \"https:\\\/\\\/mosaicconnect.io\\\/wp-admin\\\/admin-ajax.php\";\r\n\t            let nonce = \"b9e676ef19\";\n\t            const welcome = \"Hallo. Wie k\\u00f6nnen wir dir heute helfen?\";\n                const copy = {\"title\":\"Support-Chat\",\"new_chat\":\"Neuer Chat\",\"open_chat\":\"Chat \u00f6ffnen\",\"close_chat\":\"Chat schlie\u00dfen\",\"launcher\":\"Chat\",\"placeholder\":\"Nachricht eingeben\",\"send\":\"Senden\",\"sending\":\"Wird gesendet...\",\"failed\":\"Senden fehlgeschlagen\",\"retry\":\"Erneut versuchen\",\"you\":\"Du\",\"assistant\":\"Assistent\",\"support_agent\":\"Support-Mitarbeiter\",\"agent\":\"Mitarbeiter: \",\"support\":\"Support\",\"typing\":\" schreibt...\"};\n\t            const storageKey = 'mc_hr_chat_session_token';\r\n\t            let sessionToken = localStorage.getItem(storageKey) || '';\r\n\t            let lastMessageId = 0;\r\n\t            let typingTimer = null;\r\n\t            let pending = [];\r\n\t            let pollTimer = null;\r\n\r\n            function playIncomingSound() {\r\n                try {\r\n                    const Ctx = window.AudioContext || window.webkitAudioContext;\r\n                    if (!Ctx) return;\r\n                    const ctx = new Ctx();\r\n                    const osc = ctx.createOscillator();\r\n                    const gain = ctx.createGain();\r\n                    osc.type = 'sine';\r\n                    osc.frequency.value = 660;\r\n                    gain.gain.value = 0.03;\r\n                    osc.connect(gain);\r\n                    gain.connect(ctx.destination);\r\n                    osc.start();\r\n                    setTimeout(function(){ osc.stop(); ctx.close(); }, 130);\r\n                } catch (e) {}\r\n            }\r\n\r\n\t            function escapeHtml(str) {\r\n\t                return String(str || '').replace(\/[&<>\"']\/g, function(m){\r\n\t                    return ({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#039;'})[m];\r\n\t                });\r\n\t            }\r\n\r\n\t            function refreshNonce() {\r\n\t                return $.post(ajaxUrl, {action: 'mc_chatbot_get_nonce'}).then(function(resp){\r\n\t                    if (resp && resp.success && resp.data && resp.data.nonce) {\r\n\t                        nonce = String(resp.data.nonce || '');\r\n\t                        return nonce;\r\n\t                    }\r\n\t                    throw new Error('nonce');\r\n\t                });\r\n\t            }\r\n\r\n\t            function isInvalidNonceResp(resp, xhr) {\r\n\t                if (xhr && xhr.status === 403) return true;\r\n\t                const msg = resp && resp.data && resp.data.message ? String(resp.data.message) : '';\r\n\t                return msg.toLowerCase().indexOf('nonce') !== -1;\r\n\t            }\r\n\r\n\t            function nowTimeString() {\r\n\t                const d = new Date();\r\n\t                return d.toLocaleTimeString([], {hour: '2-digit', minute: '2-digit'});\r\n\t            }\r\n\r\n\t            function formatTime(dt) {\r\n\t                if (!dt) return '';\r\n\t                const d = new Date(dt.replace(' ', 'T'));\r\n\t                if (isNaN(d.getTime())) return dt;\r\n\t                return d.toLocaleTimeString([], {hour: '2-digit', minute: '2-digit'});\r\n\t            }\r\n\r\n\t            function renderPendingMessage(item) {\r\n\t                const textHtml = escapeHtml(item.text || '');\r\n\t                const status = item.status === 'error'\r\n\t                    ? ('<div class=\"mc-chat-status error\">' + escapeHtml(item.error || copy.failed) + '<button type=\"button\" data-retry=\"'+escapeHtml(item.id)+'\">'+escapeHtml(copy.retry)+'<\/button><\/div>')\n\t                    : ('<div class=\"mc-chat-status\">'+escapeHtml(copy.sending)+'<\/div>');\n\t                return '<div class=\"mc-chat-row mine\" data-pending=\"' + escapeHtml(item.id) + '\">' +\n\t                    '<div class=\"mc-chat-col\">' +\n\t                    '<div class=\"mc-chat-meta\">' + escapeHtml(copy.you) + ' \u2022 ' + escapeHtml(item.time || '') + '<\/div>' +\n\t                    '<div class=\"mc-chat-bubble\">' + (textHtml || '<span style=\"opacity:.75;\">\u2026<\/span>') + '<\/div>' +\r\n\t                    status +\r\n\t                    '<\/div><\/div>';\r\n\t            }\r\n\r\n\t            function renderMessage(item) {\r\n\t                const who = item.sender_type || 'bot';\r\n\t                const mine = who === 'visitor';\r\n\t                const sender = who === 'staff' ? (item.sender_name || copy.support_agent) : (who === 'bot' ? copy.assistant : copy.you);\n\t                const text = String(item.message || '');\r\n\t                const textHtml = escapeHtml(text);\r\n\t                const cls = mine ? 'mc-chat-row mine' : 'mc-chat-row';\r\n\t                return '<div class=\"'+cls+'\">' +\r\n\t                    '<div class=\"mc-chat-col\">' +\r\n\t                    '<div class=\"mc-chat-meta\">' + escapeHtml(sender) + ' \u2022 ' + escapeHtml(formatTime(item.created_at || '')) + '<\/div>' +\r\n\t                    '<div class=\"mc-chat-bubble\">' + (textHtml || '<span style=\"opacity:.75;\">\u2026<\/span>') + '<\/div>' +\r\n\t                    '<\/div><\/div>';\r\n\t            }\r\n\r\n            function setHomeState(isHome) {\r\n                $('#'+instance+'-box').toggleClass('is-home', !!isHome);\r\n            }\r\n\r\n            function updatePresence(presence) {\r\n                const badge = $('#'+instance+'-staff-badge');\r\n                if (!presence || !presence.assigned_name) {\r\n                    badge.text('');\r\n                } else {\r\n                    badge.text(copy.agent + presence.assigned_name);\n                }\n\n                const typingText = (presence && presence.staff_typing) ? ((presence.assigned_name || copy.support) + copy.typing) : '';\n                $('#'+instance+'-typing').text(typingText);\r\n            }\r\n\r\n\t            function renderAll(messages, presence) {\r\n\t                const box = $('#'+instance+'-stream');\r\n\t                box.html('');\r\n\t                lastMessageId = 0;\r\n\t                if (!messages.length) {\r\n\t                    setHomeState(true);\r\n\t                } else {\r\n\t                    setHomeState(false);\r\n\t                    messages.forEach(function(m){\r\n\t                        box.append(renderMessage(m));\r\n\t                        const mid = parseInt(m.id || 0, 10);\r\n\t                        if (mid > lastMessageId) lastMessageId = mid;\r\n\t                    });\r\n\t                }\r\n\t                if (pending.length) {\r\n\t                    setHomeState(false);\r\n\t                    pending.forEach(function(p){ box.append(renderPendingMessage(p)); });\r\n\t                }\r\n\t                updatePresence(presence);\r\n\t                $('#'+instance+'-messages').scrollTop($('#'+instance+'-messages')[0].scrollHeight);\r\n\t            }\r\n\r\n            function appendNew(messages) {\r\n                if (!messages.length) return;\r\n                setHomeState(false);\r\n                const box = $('#'+instance+'-stream');\r\n                messages.forEach(function(m){\r\n                    const mid = parseInt(m.id || 0, 10);\r\n                    if (mid <= lastMessageId) return; \/\/ Prevent duplicating messages\r\n                    \r\n                    const isIncoming = (m.sender_type !== 'visitor');\r\n                    box.append(renderMessage(m));\r\n                    lastMessageId = mid;\r\n                    if (isIncoming) playIncomingSound();\r\n                });\r\n                $('#'+instance+'-messages').scrollTop($('#'+instance+'-messages')[0].scrollHeight);\r\n            }\r\n\r\n\t            function setTyping(on) {\r\n\t                if (!sessionToken) return;\r\n\t                $.post(ajaxUrl, {\r\n\t                    action: 'mc_chatbot_set_typing',\r\n\t                    nonce: nonce,\r\n\t                    session_token: sessionToken,\r\n\t                    typing: on ? 1 : 0\r\n\t                });\r\n\t            }\r\n\r\n\t            function doSendText(text, pendingItem, allowNonceRefresh) {\r\n\t                const formData = new FormData();\r\n\t                formData.append('action', 'mc_chatbot_send_message');\r\n\t                formData.append('nonce', nonce);\r\n\t                formData.append('session_token', sessionToken);\r\n\t                formData.append('source_url', window.location.href);\r\n\t                formData.append('message', text);\r\n\r\n\t                return $.ajax({\r\n\t                    url: ajaxUrl,\r\n\t                    type: 'POST',\r\n\t                    data: formData,\r\n\t                    processData: false,\r\n\t                    contentType: false\r\n\t                }).then(function(resp){\r\n\t                    if (isInvalidNonceResp(resp, null) && allowNonceRefresh) {\r\n\t                        return refreshNonce().then(function(){ return doSendText(text, pendingItem, false); });\r\n\t                    }\r\n\t                    return resp;\r\n\t                }, function(xhr){\r\n\t                    if (allowNonceRefresh && xhr && xhr.status === 403) {\r\n\t                        return refreshNonce().then(function(){ return doSendText(text, pendingItem, false); });\r\n\t                    }\r\n\t                    throw xhr;\r\n\t                });\r\n\t            }\r\n\r\n\t            function sendMessage() {\r\n\t                const $input = $('#'+instance+'-input');\r\n\t                const $send = $('#'+instance+'-send');\r\n\t                const text = ($input.val() || '').trim();\r\n\t                if (!text) return;\r\n\r\n\t                setTyping(false);\r\n\t                $send.prop('disabled', true).text(copy.sending);\n\t                $input.val('');\r\n\r\n\t                const tmpId = 'tmp_' + String(Date.now()) + '_' + String(Math.random()).slice(2, 8);\r\n\t                const pendingItem = {id: tmpId, text: text, status: 'sending', error: '', time: nowTimeString()};\r\n\t                pending.push(pendingItem);\r\n\t                setHomeState(false);\r\n\t                $('#'+instance+'-stream').append(renderPendingMessage(pendingItem));\r\n\t                $('#'+instance+'-messages').scrollTop($('#'+instance+'-messages')[0].scrollHeight);\r\n\r\n\t                doSendText(text, pendingItem, true).then(function(resp){\r\n\t                    if (!resp || !resp.success || !resp.data) {\r\n\t                        pendingItem.status = 'error';\r\n\t                        pendingItem.error = (resp && resp.data && resp.data.message) ? String(resp.data.message) : 'Message failed';\r\n\t                        $('#'+instance+'-stream').find('[data-pending=\"'+tmpId+'\"]').replaceWith(renderPendingMessage(pendingItem));\r\n\t                        return;\r\n\t                    }\r\n\t                    sessionToken = resp.data.session_token || sessionToken;\r\n\t                    if (sessionToken) localStorage.setItem(storageKey, sessionToken);\r\n\t                    pending = pending.filter(function(p){ return p.id !== tmpId; });\r\n\t                    renderAll(resp.data.messages || [], resp.data.presence || {});\r\n\t                }).fail(function(){\r\n\t                    pendingItem.status = 'error';\r\n\t                    pendingItem.error = 'Network\/Forbidden error';\r\n\t                    $('#'+instance+'-stream').find('[data-pending=\"'+tmpId+'\"]').replaceWith(renderPendingMessage(pendingItem));\r\n\t                }).always(function(){\r\n\t                    $send.prop('disabled', false).text(copy.send);\n\t                });\r\n\t            }\r\n\r\n\t            function retryPending(id) {\r\n\t                id = String(id || '');\r\n\t                if (!id) return;\r\n\t                const item = pending.find(function(p){ return p.id === id; });\r\n\t                if (!item) return;\r\n\t                item.status = 'sending';\r\n\t                item.error = '';\r\n\t                $('#'+instance+'-stream').find('[data-pending=\"'+id+'\"]').replaceWith(renderPendingMessage(item));\r\n\t                $('#'+instance+'-messages').scrollTop($('#'+instance+'-messages')[0].scrollHeight);\r\n\r\n\t                doSendText(item.text || '', item, true).then(function(resp){\r\n\t                    if (!resp || !resp.success || !resp.data) {\r\n\t                        item.status = 'error';\r\n\t                        item.error = (resp && resp.data && resp.data.message) ? String(resp.data.message) : 'Message failed';\r\n\t                        $('#'+instance+'-stream').find('[data-pending=\"'+id+'\"]').replaceWith(renderPendingMessage(item));\r\n\t                        return;\r\n\t                    }\r\n\t                    sessionToken = resp.data.session_token || sessionToken;\r\n\t                    if (sessionToken) localStorage.setItem(storageKey, sessionToken);\r\n\t                    pending = pending.filter(function(p){ return p.id !== id; });\r\n\t                    renderAll(resp.data.messages || [], resp.data.presence || {});\r\n\t                }).fail(function(){\r\n\t                    item.status = 'error';\r\n\t                    item.error = 'Network\/Forbidden error';\r\n\t                    $('#'+instance+'-stream').find('[data-pending=\"'+id+'\"]').replaceWith(renderPendingMessage(item));\r\n\t                });\r\n\t            }\r\n\r\n\t            function startNewConversation() {\r\n\t                try { localStorage.removeItem(storageKey); } catch (e) {}\r\n\t                sessionToken = '';\r\n\t                lastMessageId = 0;\r\n\t                pending = [];\r\n\t                $('#'+instance+'-input').val('');\r\n\t                renderAll([], {});\r\n\t            }\r\n\r\n\t            function pollMessages() {\r\n\t                if (!sessionToken) return;\r\n\t                $.post(ajaxUrl, {\r\n\t                    action: 'mc_chatbot_get_messages',\r\n\t                    nonce: nonce,\r\n\t                    session_token: sessionToken,\r\n\t                    after_id: lastMessageId\r\n\t                }).done(function(resp){\r\n\t                    if (!resp || !resp.success || !resp.data) return;\r\n\t                    appendNew(resp.data.messages || []);\r\n\t                    updatePresence(resp.data.presence || {});\r\n\t                }).fail(function(xhr){\r\n\t                    if (xhr && xhr.status === 403) {\r\n\t                        refreshNonce().then(function(){\r\n\t                            $.post(ajaxUrl, {\r\n\t                                action: 'mc_chatbot_get_messages',\r\n\t                                nonce: nonce,\r\n\t                                session_token: sessionToken,\r\n\t                                after_id: lastMessageId\r\n\t                            }).done(function(resp2){\r\n\t                                if (!resp2 || !resp2.success || !resp2.data) return;\r\n\t                                appendNew(resp2.data.messages || []);\r\n\t                                updatePresence(resp2.data.presence || {});\r\n\t                            });\r\n\t                        });\r\n\t                    }\r\n\t                });\r\n\t            }\r\n\r\n\t            $('#'+instance+'-send').on('click', sendMessage);\r\n\t            $('#'+instance+'-new').on('click', startNewConversation);\r\n\t            $('#'+instance+'-close').on('click', function(){\r\n\t                var box = document.getElementById(instance + '-box');\r\n\t                if (!box) return;\r\n\t                var wrap = box.closest('[data-mc-chatbot-wrap]');\r\n\t                if (wrap) wrap.classList.remove('is-open');\r\n\t                try { localStorage.setItem('mc_hr_chat_widget_open', '0'); } catch (e) {}\r\n\t            });\r\n\t            $('#'+instance+'-input').on('keydown', function(e){\r\n\t                if (e.which === 13 && !e.shiftKey) {\r\n\t                    e.preventDefault();\r\n\t                    sendMessage();\r\n\t                }\r\n\t            }).on('input', function(){\r\n\t                setTyping(true);\r\n\t                if (typingTimer) clearTimeout(typingTimer);\r\n\t                typingTimer = setTimeout(function(){ setTyping(false); }, 1200);\r\n\t            });\r\n\t            $('#'+instance+'-stream').on('click', 'button[data-retry]', function(){\r\n\t                retryPending($(this).data('retry'));\r\n\t            });\r\n\r\n\t            renderAll([], {});\r\n\t            if (sessionToken) {\r\n\t                $.post(ajaxUrl, {\r\n\t                    action: 'mc_chatbot_get_messages',\r\n\t                    nonce: nonce,\r\n\t                    session_token: sessionToken\r\n\t                }).done(function(resp){\r\n\t                    if (!resp || !resp.success || !resp.data) return;\r\n\t                    renderAll(resp.data.messages || [], resp.data.presence || {});\r\n\t                }).fail(function(xhr){\r\n\t                    if (xhr && xhr.status === 403) {\r\n\t                        refreshNonce().then(function(){\r\n\t                            $.post(ajaxUrl, {\r\n\t                                action: 'mc_chatbot_get_messages',\r\n\t                                nonce: nonce,\r\n\t                                session_token: sessionToken\r\n\t                            }).done(function(resp2){\r\n\t                                if (!resp2 || !resp2.success || !resp2.data) return;\r\n\t                                renderAll(resp2.data.messages || [], resp2.data.presence || {});\r\n\t                            });\r\n\t                        });\r\n\t                    }\r\n\t                });\r\n\t            }\r\n\r\n\t            function startPolling() {\r\n\t                if (pollTimer) return;\r\n\t                pollTimer = setInterval(pollMessages, 5000);\r\n\t            }\r\n\r\n\t            function stopPolling() {\r\n\t                if (!pollTimer) return;\r\n\t                clearInterval(pollTimer);\r\n\t                pollTimer = null;\r\n\t            }\r\n\r\n\t            document.addEventListener('visibilitychange', function(){\r\n\t                if (document.hidden) stopPolling(); else startPolling();\r\n\t            });\r\n\t            startPolling();\r\n\t        })(jQuery);\r\n\t        <\/script>\r\n        <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_joinchat":[],"footnotes":""},"class_list":["post-28971","page","type-page","status-publish","hentry"],"_hostinger_reach_plugin_has_subscription_block":false,"_hostinger_reach_plugin_is_elementor":false,"_links":{"self":[{"href":"https:\/\/mosaicconnect.io\/de\/wp-json\/wp\/v2\/pages\/28971","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mosaicconnect.io\/de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mosaicconnect.io\/de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mosaicconnect.io\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mosaicconnect.io\/de\/wp-json\/wp\/v2\/comments?post=28971"}],"version-history":[{"count":6,"href":"https:\/\/mosaicconnect.io\/de\/wp-json\/wp\/v2\/pages\/28971\/revisions"}],"predecessor-version":[{"id":29000,"href":"https:\/\/mosaicconnect.io\/de\/wp-json\/wp\/v2\/pages\/28971\/revisions\/29000"}],"wp:attachment":[{"href":"https:\/\/mosaicconnect.io\/de\/wp-json\/wp\/v2\/media?parent=28971"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}