{"id":1426,"date":"2026-09-05T13:56:47","date_gmt":"2026-09-05T06:56:47","guid":{"rendered":"https:\/\/itcomm.co.id\/itcomm_wp\/?page_id=1426"},"modified":"2026-09-05T13:56:48","modified_gmt":"2026-09-05T06:56:48","slug":"customer-service","status":"publish","type":"page","link":"https:\/\/itcomm.co.id\/itcomm_wp\/?page_id=1426","title":{"rendered":"Customer Service"},"content":{"rendered":"        <div class=\"itcomm-webchat\" data-chat-url=\"https:\/\/itcomm.co.id\/itcomm_wp\/index.php?rest_route=\/itcomm\/v1\/chat\" data-status-base=\"https:\/\/itcomm.co.id\/itcomm_wp\/index.php\" data-status-url=\"https:\/\/itcomm.co.id\/itcomm_wp\/index.php?rest_route=\/itcomm\/v1\/agent-status\">\n            <div class=\"itcomm-webchat__header\">\n                <div>\n                    <div class=\"itcomm-webchat__title\">ITCOMM Customer Service<\/div>\n                    <div class=\"itcomm-webchat__subtitle\">Customer Service Agent<\/div>\n                <\/div>\n                <div class=\"itcomm-webchat__status itcomm-webchat__status--checking\" role=\"status\" aria-live=\"polite\"><span><\/span><b>Memeriksa...<\/b><\/div>\n            <\/div>\n\n            <div class=\"itcomm-webchat__messages\" aria-live=\"polite\">\n            <\/div>\n\n            <div class=\"itcomm-webchat__composer\">\n                <textarea class=\"itcomm-webchat__input\" rows=\"2\" maxlength=\"4000\"\n                    placeholder=\"Ketik pertanyaan Anda...\" aria-label=\"Pesan\"><\/textarea>\n                <button type=\"button\" class=\"itcomm-webchat__send\">Kirim<\/button>\n            <\/div>\n            <div class=\"itcomm-webchat__hint\">Enter untuk mengirim \u2022 Shift+Enter untuk baris baru<\/div>\n        <\/div>\n\n        <style>\n        .itcomm-webchat{max-width:760px;margin:20px auto;border:1px solid #d9dde3;border-radius:14px;overflow:hidden;background:#fff;box-shadow:0 8px 30px rgba(0,0,0,.08);font-family:Arial,sans-serif}\n        .itcomm-webchat__header{display:flex;justify-content:space-between;align-items:center;padding:16px 18px;border-bottom:1px solid #e6e9ed;background:#f7f8fa}\n        .itcomm-webchat__title{font-size:18px;font-weight:700}.itcomm-webchat__subtitle{font-size:12px;opacity:.65;margin-top:3px}\n        .itcomm-webchat__status{font-size:12px;display:flex;align-items:center;gap:5px;white-space:nowrap}\n        .itcomm-webchat__status span{display:inline-block;width:8px;height:8px;border-radius:50%;background:#999}\n        .itcomm-webchat__status b{font-weight:600}\n        .itcomm-webchat__status--online span{background:#2e9d57}\n        .itcomm-webchat__status--offline span{background:#d63638}\n        .itcomm-webchat__status--checking span{background:#dba617}\n        .itcomm-webchat__messages{height:440px;overflow-y:auto;padding:18px;background:#fafbfc}\n        .itcomm-webchat__bubble{max-width:82%;padding:11px 14px;border-radius:14px;margin:0 0 12px;line-height:1.5;white-space:pre-wrap;word-break:break-word}\n        .itcomm-webchat__bubble--bot{background:#fff;border:1px solid #e1e5ea;margin-right:auto}\n        .itcomm-webchat__bubble--user{background:#e9eef5;margin-left:auto}\n        .itcomm-webchat__bubble--system{background:#fff3cd;border:1px solid #ffe69c;margin-right:auto}\n        .itcomm-webchat__composer{display:flex;gap:10px;padding:14px;border-top:1px solid #e6e9ed}\n        .itcomm-webchat__input{flex:1;resize:none;border:1px solid #cfd5dc;border-radius:10px;padding:10px 12px;font:inherit;min-height:46px}\n        .itcomm-webchat__send{border:0;border-radius:10px;padding:0 18px;cursor:pointer;font-weight:700}\n        .itcomm-webchat__send:disabled{opacity:.5;cursor:not-allowed}\n        .itcomm-webchat__bubble p{margin:0 0 12px}.itcomm-webchat__bubble p:last-child{margin-bottom:0}\n        .itcomm-webchat__bubble h1,.itcomm-webchat__bubble h2,.itcomm-webchat__bubble h3,.itcomm-webchat__bubble h4{margin:4px 0 10px;line-height:1.3}\n        .itcomm-webchat__bubble h3{font-size:18px}.itcomm-webchat__bubble h4{font-size:16px}\n        .itcomm-webchat__bubble ul,.itcomm-webchat__bubble ol{margin:6px 0 12px;padding-left:22px}\n        .itcomm-webchat__bubble li{margin:4px 0}.itcomm-webchat__bubble hr{border:0;border-top:1px solid #ddd;margin:12px 0}\n        .itcomm-md-table-wrap{overflow-x:auto;margin:10px 0 14px}.itcomm-md-table{width:100%;border-collapse:collapse;font-size:14px}\n        .itcomm-md-table th,.itcomm-md-table td{border:1px solid #d9dde3;padding:7px 9px;text-align:left;vertical-align:top}\n        .itcomm-md-table th{font-weight:700;background:#f4f6f8}\n        .itcomm-webchat__bubble code{padding:2px 5px;border:1px solid #ddd;border-radius:4px;background:#f1f1f1;font-family:monospace}.itcomm-webchat__hint{font-size:11px;opacity:.55;padding:0 14px 12px}\n        @media(max-width:600px){.itcomm-webchat{margin:10px 0}.itcomm-webchat__messages{height:55vh}.itcomm-webchat__composer{align-items:stretch}.itcomm-webchat__send{padding:0 13px}}\n        <\/style>\n\n        <script>\n        (function(){\n            function init(root){\n                if (!root || root.dataset.initialized === '1') return;\n                root.dataset.initialized = '1';\n\n                const input = root.querySelector('.itcomm-webchat__input');\n                const send = root.querySelector('.itcomm-webchat__send');\n                const messages = root.querySelector('.itcomm-webchat__messages');\n                const chatUrl = root.dataset.chatUrl;\n                const statusBase = root.dataset.statusBase;\n                const statusUrl = root.dataset.statusUrl;\n                const statusEl = root.querySelector('.itcomm-webchat__status');\n                const statusText = statusEl ? statusEl.querySelector('b') : null;\n\n                let statusTimer = null;\n                let statusRequest = null;\n                let webchatVisible = false;\n                let pageVisible = !document.hidden;\n\n                \/*\n                 * Chat session is deliberately scoped to the browser tab.\n                 * sessionStorage survives page navigation\/reload in the same tab,\n                 * but is cleared when the tab\/window is closed.\n                 *\/\n                const SESSION_KEY = 'itcomm_openclaw_session_id';\n                const HISTORY_KEY = 'itcomm_openclaw_messages';\n                const PENDING_TASK_KEY = 'itcomm_openclaw_pending_task';\n\n                function storageGet(key){\n                    try { return sessionStorage.getItem(key); } catch (e) { return null; }\n                }\n\n                function storageSet(key, value){\n                    try { sessionStorage.setItem(key, value); return true; } catch (e) { return false; }\n                }\n\n                function storageRemove(key){\n                    try { sessionStorage.removeItem(key); } catch (e) {}\n                }\n\n                let sessionId = storageGet(SESSION_KEY);\n                if (!sessionId) {\n                    if (window.crypto && typeof crypto.randomUUID === 'function') {\n                        sessionId = crypto.randomUUID();\n                    } else {\n                        sessionId = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(\/[xy]\/g, function(c){\n                            const r = Math.random()*16|0, v = c === 'x' ? r : (r&0x3|0x8);\n                            return v.toString(16);\n                        });\n                    }\n                    storageSet(SESSION_KEY, sessionId);\n                }\n\n                let pendingTask = null;\n                try {\n                    const savedPending = storageGet(PENDING_TASK_KEY);\n                    pendingTask = savedPending ? JSON.parse(savedPending) : null;\n                } catch (e) {\n                    pendingTask = null;\n                }\n\n                function savePendingTask(taskId, taskSessionId){\n                    pendingTask = {task_id: taskId, session_id: taskSessionId};\n                    storageSet(PENDING_TASK_KEY, JSON.stringify(pendingTask));\n                }\n\n                function clearPendingTask(){\n                    pendingTask = null;\n                    storageRemove(PENDING_TASK_KEY);\n                }\n\n                function escapeHtml(text){\n                    const div = document.createElement('div');\n                    div.textContent = text == null ? '' : String(text);\n                    return div.innerHTML;\n                }\n\n                function renderInlineMarkdown(text){\n                    let html = escapeHtml(text);\n\n                    \/\/ Inline code first; protect its contents from other formatting.\n                    const codeParts = [];\n                    html = html.replace(\/`([^`\\n]+)`\/g, function(_, code){\n                        const key = '___ITCOMM_CODE_' + codeParts.length + '___';\n                        codeParts.push('<code>' + code + '<\/code>');\n                        return key;\n                    });\n\n                    html = html.replace(\/\\*\\*(.+?)\\*\\*\/gs, '<strong>$1<\/strong>');\n                    html = html.replace(\/__([^_]+?)__\/g, '<strong>$1<\/strong>');\n                    html = html.replace(\/(?<!\\*)\\*([^*\\n]+?)\\*(?!\\*)\/g, '<em>$1<\/em>');\n                    html = html.replace(\/(?<!_)_([^_\\n]+?)_(?!_)\/g, '<em>$1<\/em>');\n\n                    html = html.replace(\/___ITCOMM_CODE_(\\d+)___\/g, function(_, i){\n                        return codeParts[Number(i)];\n                    });\n\n                    return html;\n                }\n\n                function isTableSeparator(line){\n                    const cells = line.trim().replace(\/^\\|\/, '').replace(\/\\|$\/, '').split('|');\n                    return cells.length > 0 && cells.every(function(cell){\n                        return \/^\\s*:?-{3,}:?\\s*$\/.test(cell);\n                    });\n                }\n\n                function tableCells(line){\n                    return line.trim().replace(\/^\\|\/, '').replace(\/\\|$\/, '').split('|').map(function(cell){\n                        return cell.trim();\n                    });\n                }\n\n                function renderMarkdown(text){\n                    const source = String(text == null ? '' : text).replace(\/\\r\\n?\/g, '\\n');\n                    const lines = source.split('\\n');\n                    const blocks = [];\n                    let i = 0;\n\n                    while (i < lines.length) {\n                        const raw = lines[i];\n                        const line = raw.trim();\n\n                        if (line === '') {\n                            i++;\n                            continue;\n                        }\n\n                        \/\/ Markdown table: header + separator + data rows.\n                        if (line.includes('|') && i + 1 < lines.length && isTableSeparator(lines[i + 1])) {\n                            const headers = tableCells(line);\n                            const rows = [];\n                            i += 2;\n\n                            while (i < lines.length && lines[i].trim() !== '' && lines[i].includes('|')) {\n                                rows.push(tableCells(lines[i]));\n                                i++;\n                            }\n\n                            let table = '<div class=\"itcomm-md-table-wrap\"><table class=\"itcomm-md-table\"><thead><tr>';\n                            headers.forEach(function(cell){\n                                table += '<th>' + renderInlineMarkdown(cell) + '<\/th>';\n                            });\n                            table += '<\/tr><\/thead><tbody>';\n\n                            rows.forEach(function(row){\n                                table += '<tr>';\n                                headers.forEach(function(_, idx){\n                                    table += '<td>' + renderInlineMarkdown(row[idx] || '') + '<\/td>';\n                                });\n                                table += '<\/tr>';\n                            });\n\n                            table += '<\/tbody><\/table><\/div>';\n                            blocks.push(table);\n                            continue;\n                        }\n\n                        \/\/ Headings.\n                        const heading = line.match(\/^(#{1,6})\\s+(.+)$\/);\n                        if (heading) {\n                            const level = Math.min(6, heading[1].length);\n                            blocks.push('<h' + level + '>' + renderInlineMarkdown(heading[2]) + '<\/h' + level + '>');\n                            i++;\n                            continue;\n                        }\n\n                        \/\/ Unordered list.\n                        if (\/^[-*+]\\s+\/.test(line)) {\n                            const items = [];\n                            while (i < lines.length && \/^[-*+]\\s+\/.test(lines[i].trim())) {\n                                items.push(lines[i].trim().replace(\/^[-*+]\\s+\/, ''));\n                                i++;\n                            }\n                            blocks.push('<ul>' + items.map(function(item){\n                                return '<li>' + renderInlineMarkdown(item) + '<\/li>';\n                            }).join('') + '<\/ul>');\n                            continue;\n                        }\n\n                        \/\/ Ordered list.\n                        if (\/^\\d+\\.\\s+\/.test(line)) {\n                            const items = [];\n                            while (i < lines.length && \/^\\d+\\.\\s+\/.test(lines[i].trim())) {\n                                items.push(lines[i].trim().replace(\/^\\d+\\.\\s+\/, ''));\n                                i++;\n                            }\n                            blocks.push('<ol>' + items.map(function(item){\n                                return '<li>' + renderInlineMarkdown(item) + '<\/li>';\n                            }).join('') + '<\/ol>');\n                            continue;\n                        }\n\n                        \/\/ Horizontal rule.\n                        if (\/^([-*_])(?:\\s*\\1){2,}$\/.test(line)) {\n                            blocks.push('<hr>');\n                            i++;\n                            continue;\n                        }\n\n                        \/\/ Normal paragraph: collect consecutive non-special lines.\n                        const paragraph = [line];\n                        i++;\n                        while (i < lines.length) {\n                            const next = lines[i].trim();\n                            if (!next) break;\n                            if (\/^(#{1,6})\\s+\/.test(next) ||\n                                \/^[-*+]\\s+\/.test(next) ||\n                                \/^\\d+\\.\\s+\/.test(next) ||\n                                (next.includes('|') && i + 1 < lines.length && isTableSeparator(lines[i + 1])) ||\n                                \/^([-*_])(?:\\s*\\1){2,}$\/.test(next)) {\n                                break;\n                            }\n                            paragraph.push(next);\n                            i++;\n                        }\n\n                        blocks.push('<p>' + paragraph.map(renderInlineMarkdown).join('<br>') + '<\/p>');\n                    }\n\n                    return blocks.join('');\n                }\n\n                function setBubbleText(el, text){\n                    const rawText = text == null ? '' : String(text);\n                    el.dataset.itcommRawText = rawText;\n                    el.innerHTML = renderMarkdown(rawText);\n                }\n\n                function saveChatHistory(){\n                    const history = [];\n                    messages.querySelectorAll('.itcomm-webchat__bubble').forEach(function(el){\n                        const classes = Array.from(el.classList);\n                        let type = 'bot';\n                        if (classes.includes('itcomm-webchat__bubble--user')) type = 'user';\n                        else if (classes.includes('itcomm-webchat__bubble--system')) type = 'system';\n\n                        history.push({\n                            type: type,\n                            text: el.dataset.itcommRawText || el.textContent || ''\n                        });\n                    });\n\n                    storageSet(HISTORY_KEY, JSON.stringify(history));\n                }\n\n                function restoreChatHistory(){\n                    let history = null;\n                    try {\n                        const raw = storageGet(HISTORY_KEY);\n                        history = raw ? JSON.parse(raw) : null;\n                    } catch (e) {\n                        history = null;\n                    }\n\n                    if (!Array.isArray(history) || history.length === 0) {\n                        addBubble('Halo! Saya Customer Service ITCOMM. Ada yang bisa saya bantu?', 'bot');\n                        saveChatHistory();\n                        return;\n                    }\n\n                    messages.innerHTML = '';\n                    history.forEach(function(item){\n                        if (!item || typeof item.text !== 'string') return;\n                        const type = ['bot','user','system'].includes(item.type) ? item.type : 'bot';\n                        addBubble(item.text, type, false);\n                    });\n                    messages.scrollTop = messages.scrollHeight;\n                }\n\n                function addBubble(text, type, persist){\n                    const el = document.createElement('div');\n                    el.className = 'itcomm-webchat__bubble itcomm-webchat__bubble--' + type;\n                    setBubbleText(el, text);\n                    messages.appendChild(el);\n                    messages.scrollTop = messages.scrollHeight;\n                    if (persist !== false) saveChatHistory();\n                    return el;\n                }\n\n                restoreChatHistory();\n\n                let agentOnline = false;\n\n                function setBusy(busy){\n                    send.disabled = busy || !agentOnline;\n                    input.disabled = busy || !agentOnline;\n                }\n\n                function setAgentStatus(status, label){\n                    agentOnline = status === 'online';\n\n                    if (!statusEl || !statusText) return;\n\n                    statusEl.classList.remove(\n                        'itcomm-webchat__status--online',\n                        'itcomm-webchat__status--offline',\n                        'itcomm-webchat__status--checking'\n                    );\n                    statusEl.classList.add('itcomm-webchat__status--' + status);\n                    statusText.textContent = label;\n\n                    if (!agentOnline && !send.disabled) {\n                        send.disabled = true;\n                    }\n                    if (agentOnline && !input.disabled) {\n                        send.disabled = false;\n                    }\n\n                    if (status === 'offline') {\n                        input.placeholder = 'Agent sedang offline...';\n                    } else if (status === 'online') {\n                        input.placeholder = 'Ketik pertanyaan Anda...';\n                    }\n                }\n\n                async function checkAgentStatus(){\n                    if (!webchatVisible || !pageVisible || !statusUrl) return;\n                    if (statusRequest) return;\n\n                    const controller = new AbortController();\n                    const timeout = setTimeout(function(){ controller.abort(); }, 7000);\n                    statusRequest = fetch(statusUrl + '&_=' + Date.now(), {\n                        method: 'GET',\n                        headers: {'Accept':'application\/json', 'Cache-Control':'no-cache'},\n                        cache: 'no-store',\n                        signal: controller.signal\n                    }).then(async function(response){\n                        const data = await response.json();\n                        if (!response.ok || !data.ok) {\n                            throw new Error(data.error || ('HTTP ' + response.status));\n                        }\n                        if (data.status === 'online') {\n                            setAgentStatus('online', 'Online');\n                        } else {\n                            setAgentStatus('offline', 'Offline');\n                        }\n                    }).catch(function(){\n                        \/\/ If WordPress cannot reach its own status endpoint, treat the Agent as unavailable.\n                        setAgentStatus('offline', 'Offline');\n                    }).finally(function(){\n                        clearTimeout(timeout);\n                        statusRequest = null;\n                    });\n\n                    await statusRequest;\n                }\n\n                function startStatusChecks(){\n                    if (statusTimer || !webchatVisible || !pageVisible) return;\n\n                    setAgentStatus('checking', 'Memeriksa...');\n                    checkAgentStatus();\n\n                    statusTimer = setInterval(function(){\n                        if (!webchatVisible || !pageVisible) {\n                            stopStatusChecks();\n                            return;\n                        }\n                        checkAgentStatus();\n                    }, 30000);\n                }\n\n                function stopStatusChecks(){\n                    if (statusTimer) {\n                        clearInterval(statusTimer);\n                        statusTimer = null;\n                    }\n                }\n\n                function updateWebchatVisibility(){\n                    if (webchatVisible && pageVisible) {\n                        startStatusChecks();\n                    } else {\n                        stopStatusChecks();\n                    }\n                }\n\n                document.addEventListener('visibilitychange', function(){\n                    pageVisible = !document.hidden;\n                    updateWebchatVisibility();\n                });\n\n                if ('IntersectionObserver' in window) {\n                    const observer = new IntersectionObserver(function(entries){\n                        webchatVisible = entries.some(function(entry){\n                            return entry.isIntersecting && entry.intersectionRatio >= 0.1;\n                        });\n                        updateWebchatVisibility();\n                    }, {threshold:[0, 0.1]});\n                    observer.observe(root);\n                } else {\n                    webchatVisible = true;\n                    updateWebchatVisibility();\n                }\n\n                async function sendMessage(){\n                    const message = input.value.trim();\n                    if (!message || send.disabled || !agentOnline) return;\n\n                    addBubble(message, 'user');\n                    input.value = '';\n                    setBusy(true);\n                    const waiting = addBubble('Sedang memproses pertanyaan Anda...', 'bot');\n\n                    try {\n                        const response = await fetch(chatUrl, {\n                            method: 'POST',\n                            headers: {'Content-Type':'application\/json', 'Accept':'application\/json'},\n                            body: JSON.stringify({message: message, session_id: sessionId})\n                        });\n\n                        const data = await response.json();\n                        if (!response.ok || !data.ok) {\n                            if (response.status === 503 && data.error === 'agent_offline') {\n                                setAgentStatus('offline', 'Offline');\n                            }\n                            throw new Error(data.message || data.error || ('HTTP ' + response.status));\n                        }\n\n                        savePendingTask(data.task_id, data.session_id);\n                        await pollStatus(data.task_id, data.session_id, waiting);\n                    } catch (err) {\n                        setBubbleText(waiting, 'Maaf, terjadi kesalahan: ' + (err.message || 'permintaan gagal'));\n                        waiting.classList.add('itcomm-webchat__bubble--system');\n                        clearPendingTask();\n                        saveChatHistory();\n                        setBusy(false);\n                        input.focus();\n                    }\n                }\n\n                async function pollStatus(taskId, taskSessionId, waiting){\n                    const deadline = Date.now() + 180000;\n\n                    while (Date.now() < deadline) {\n                        await new Promise(r => setTimeout(r, 1500));\n\n                        const url = statusBase + '?rest_route=' + encodeURIComponent('\/' + 'itcomm\/v1\/chat-status\/' + taskId) +\n                            '&session_id=' + encodeURIComponent(taskSessionId);\n\n                        const response = await fetch(url, {\n                            method: 'GET',\n                            headers: {'Accept':'application\/json'}\n                        });\n                        const data = await response.json();\n\n                        if (!response.ok || !data.ok) {\n                            throw new Error(data.error || ('HTTP ' + response.status));\n                        }\n\n                        if (data.status === 'completed') {\n                            setBubbleText(waiting, data.response || 'Tidak ada jawaban.');\n                            clearPendingTask();\n                            saveChatHistory();\n                            setBusy(false);\n                            input.focus();\n                            return;\n                        }\n\n                        if (data.status === 'failed') {\n                            setBubbleText(waiting, 'Maaf, permintaan gagal diproses.');\n                            waiting.classList.add('itcomm-webchat__bubble--system');\n                            clearPendingTask();\n                            saveChatHistory();\n                            setBusy(false);\n                            input.focus();\n                            return;\n                        }\n                    }\n\n                    setBubbleText(waiting, 'Permintaan membutuhkan waktu terlalu lama. Silakan coba lagi.');\n                    waiting.classList.add('itcomm-webchat__bubble--system');\n                    clearPendingTask();\n                    saveChatHistory();\n                    setBusy(false);\n                    input.focus();\n                }\n\n                async function resumePendingTask(){\n                    if (!pendingTask || !pendingTask.task_id || !pendingTask.session_id) return;\n\n                    const bubbles = Array.from(messages.querySelectorAll('.itcomm-webchat__bubble'));\n                    let waiting = null;\n                    for (let i = bubbles.length - 1; i >= 0; i--) {\n                        if ((bubbles[i].dataset.itcommRawText || '') === 'Sedang memproses pertanyaan Anda...') {\n                            waiting = bubbles[i];\n                            break;\n                        }\n                    }\n\n                    if (!waiting) {\n                        waiting = addBubble('Sedang memproses pertanyaan Anda...', 'bot');\n                    }\n\n                    setBusy(true);\n                    try {\n                        await pollStatus(pendingTask.task_id, pendingTask.session_id, waiting);\n                    } catch (err) {\n                        setBubbleText(waiting, 'Maaf, terjadi kesalahan: ' + (err.message || 'permintaan gagal'));\n                        waiting.classList.add('itcomm-webchat__bubble--system');\n                        clearPendingTask();\n                        saveChatHistory();\n                        setBusy(false);\n                        input.focus();\n                    }\n                }\n\n                send.addEventListener('click', sendMessage);\n                input.addEventListener('keydown', function(e){\n                    \/\/ Enter sends the message; Shift+Enter inserts a new line.\n                    if (e.key === 'Enter' && !e.shiftKey && !e.isComposing) {\n                        e.preventDefault();\n                        sendMessage();\n                    }\n                });\n\n                \/\/ If navigation happened while the Agent was processing a question,\n                \/\/ continue polling the same task when the WebChat is opened again.\n                if (pendingTask) {\n                    resumePendingTask();\n                }\n            }\n\n            document.querySelectorAll('.itcomm-webchat').forEach(init);\n        })();\n        <\/script>\n        \n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1426","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/itcomm.co.id\/itcomm_wp\/index.php?rest_route=\/wp\/v2\/pages\/1426","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itcomm.co.id\/itcomm_wp\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/itcomm.co.id\/itcomm_wp\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/itcomm.co.id\/itcomm_wp\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/itcomm.co.id\/itcomm_wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1426"}],"version-history":[{"count":1,"href":"https:\/\/itcomm.co.id\/itcomm_wp\/index.php?rest_route=\/wp\/v2\/pages\/1426\/revisions"}],"predecessor-version":[{"id":1427,"href":"https:\/\/itcomm.co.id\/itcomm_wp\/index.php?rest_route=\/wp\/v2\/pages\/1426\/revisions\/1427"}],"wp:attachment":[{"href":"https:\/\/itcomm.co.id\/itcomm_wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1426"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}