const styleSheet = document.createElement('style'); styleSheet.innerText = ` .sdk--container { position: fixed; bottom: 42px; right: 42px; width: 64px; height: 64px; z-index: 9999; color: white; border-radius: 50%; font-family: 'Noto Sans', Roboto, Arial, sans-serif; } .sdk--container.sdk--has-external-link { display: flex; justify-content: space-between; align-items: center; } .sdk--container.sdk--expanded .sdk--bot-container { border-left: 2px solid #000; } .sdk--bot-container { order: 1; width: 60%; flex-grow: 1; display: flex; flex-direction: column; height: 100%; } .sdk--external-link-container { width: 40%; height: 100%; background-color: #FFF; } .sdk--external-link-container iframe { width: 100%; height: 100%; } .sdk--container.sdk--expanded { height: 90%; width: 60%; min-width: 500px; bottom: 5px; right: 5px; border-radius: 0; border-top-left-radius: 20px; background-color: #2C77C5; color: white; box-shadow: -1px -1px 4px 1px #000000, 1px -1px 4px 1px #000000; overflow: hidden; } .sdk--a-expand-collapse { background: url('https://sadik.ai/static/logo-64.png'); width: 64px; height: 64px; background-size: contain; background-repeat: no-repeat; background-position: center; display: inline-block; } .sdk--container.sdk--expanded .sdk--a-expand-collapse, .sdk--container.sdk--expanded .sdk--a-close { width: 30px; height: 24px; float: right; } .sdk--container.sdk--expanded .sdk--a-expand-collapse { background: #2C77C5 url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='24' viewBox='0 -960 960 960' width='24'%3E%3Cpath fill='white' d='m136-80-56-56 264-264H160v-80h320v320h-80v-184L136-80Zm344-400v-320h80v184l264-264 56 56-264 264h184v80H480Z'/%3E%3C/svg%3E") no-repeat; } .sdk--container.sdk--expanded .sdk--a-close { background: #2C77C5 url("data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%2024%2024%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20fill%3D%22none%22%20stroke%3D%22%23ffffff%22%3E%3Cg%20id%3D%22SVGRepo_bgCarrier%22%20stroke-width%3D%220%22%3E%3C%2Fg%3E%3Cg%20id%3D%22SVGRepo_tracerCarrier%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3C%2Fg%3E%3Cg%20id%3D%22SVGRepo_iconCarrier%22%3E%20%3Cg%20stroke%3D%22%23ffffff%22%20stroke-width%3D%222%22%3E%20%3Cpath%20d%3D%22M21%2012C21%2016.9706%2016.9706%2021%2012%2021C7.02944%2021%203%2016.9706%203%2012C3%207.02944%207.02944%203%2012%203C16.9706%203%2021%207.02944%2021%2012Z%22%3E%3C%2Fpath%3E%20%3Cpath%20stroke-linecap%3D%22round%22%20d%3D%22M9%2015L15%209M15%2015L9%209%22%3E%3C%2Fpath%3E%20%3C%2Fg%3E%20%3C%2Fg%3E%3C%2Fsvg%3E") no-repeat; } .sdk--header { font-size: 16px; text-align: center; margin: 10px 5px; order: 1; } .sdk--header span { display: inline-block; } .sdk--container.sdk--collapsed .sdk--main, .sdk--container.sdk--collapsed .sdk--external-link-container { display: none !important; } .sdk--main { width: 100%; margin: 0; display: flex; flex-direction: column-reverse; height: calc(100% - 73px); overflow-x: hidden; background-color: #fff; order: 2; flex-grow: 1; } .sdk--disclaimer { font-size: 10px; display: block; padding: 7px; order: 3; } .sdk--disclaimer a { color: white; font-weight: bold; } .hidden { display: none !important; } .pdf-logo { width: 24px; margin-bottom: -7px; margin-left: 5px; } `; document.head.appendChild(styleSheet); var links = document.getElementsByTagName('a'); var shouldBuildExternalLinkIframe = false; var sdkExternalLinkContainer = document.createElement('div'); const sdkContainer = document.createElement('div'); sdkContainer.className = 'sdk--container sdk--collapsed'; const sdkHeader = document.createElement('h1'); sdkHeader.className = 'sdk--header'; const sdkExpandCollapse = document.createElement('a'); sdkExpandCollapse.href = '#'; const sdkClose = document.createElement('a'); sdkClose.href = '#'; const sdkHeaderSpan = document.createElement('span'); const sdkDisclaimer = document.createElement('small'); sdkDisclaimer.className = 'sdk--disclaimer'; sdkDisclaimer.innerHTML = 'This is an AI-bot created at sadik.ai and may provide inaccurate information, user discretion required.'; var sdkExternalIframe = document.createElement('iframe'); const sdkMainIframe = document.createElement('iframe'); let sdkIframeBotBuilt = false; function attachPDFSadikIcon() { for (let link of links) { if (link.href.includes('.pdf') && !link.href.includes('embed-bot-')) { if (!link.dataset.haveIcon) { link.dataset.haveIcon = true; var a = document.createElement('a'); a.href = `https://sadik.ai/chat-embed-R7uBKqTefl6L2hYJXpuM?message=${link.href}&visibility=true&allow_close=true`; a.target = '_blank'; a.dataset.haveIcon = true; var img = document.createElement('img'); img.src = 'https://sadik.ai/static/logo-red-48.png'; img.classList.add('pdf-logo'); a.appendChild(img); link.after(a); } } } } attachPDFSadikIcon(); for (let link of links) { if (link.href.includes('sadik.ai') || link.href.includes('localhost:8082')) { link.rel = 'noopener noreferrer'; shouldBuildExternalLinkIframe = true; link.addEventListener('click', e => { e.preventDefault(); sdkContainer.classList.remove('sdk--collapsed'); sdkContainer.classList.add('sdk--expanded'); sdkContainer.classList.remove('hidden'); var lastIndex = link.href.indexOf('&') > -1 ? link.href.indexOf('&') : link.href.length; var externalLink = link.href.indexOf('message=') > -1 ? link.href.substring(link.href.indexOf('message='), lastIndex) : false; var sdkSource = link.href.indexOf('/chat-embed-') > -1 ? link.href : link.href.replace('/chat-', '/chat-embed-'); sdkSource = sdkSource.indexOf('/bot-embed-') > -1 ? sdkSource : sdkSource.replace('/bot-', '/embed-bot-'); sdkMainIframe.setAttribute('src', ''); buildIframe(sdkMainIframe, sdkSource); if (externalLink) { sdkExternalLinkContainer.classList.remove('hidden'); sdkExternalIframe.src = decodeURIComponent(externalLink.replace('message=', '')); } sdkIframeBotBuilt = true; }); } } if (shouldBuildExternalLinkIframe) { sdkExternalLinkContainer.className = 'sdk--external-link-container'; sdkContainer.classList.add('sdk--has-external-link'); sdkExternalIframe.name = 'externalLinkIframe'; sdkExternalLinkContainer.appendChild(sdkExternalIframe); sdkExternalLinkContainer.classList.add('hidden'); sdkContainer.appendChild(sdkExternalLinkContainer); } const sdkBotContainer = document.createElement('div'); sdkBotContainer.className = 'sdk--bot-container'; sdkExpandCollapse.addEventListener('click', e => { e.preventDefault(); if (!sdkIframeBotBuilt) { buildIframe(sdkMainIframe, null); sdkIframeBotBuilt = true; } sdkHeaderSpan.textContent = sdkContainer.classList.contains('sdk--expanded') ? '' : 'PDF Boss'; sdkContainer.classList.toggle('sdk--expanded'); sdkContainer.classList.toggle('sdk--collapsed'); return false; }); const sdkAllowClose = `false`; if (boolFromString(sdkAllowClose)) { sdkClose.className = 'sdk--a-close'; sdkHeader.appendChild(sdkClose); sdkClose.addEventListener('click', e => { e.preventDefault(); sdkContainer.classList.add('hidden'); return false; }); } sdkBotContainer.appendChild(sdkDisclaimer); sdkHeader.appendChild(sdkHeaderSpan); sdkExpandCollapse.className = 'sdk--a-expand-collapse'; sdkHeader.appendChild(sdkExpandCollapse); sdkBotContainer.appendChild(sdkHeader); sdkContainer.appendChild(sdkBotContainer); const sdkVisibility = `true`; if (boolFromString(sdkVisibility) || sdkVisibility == null || sdkVisibility == undefined) { document.body.appendChild(sdkContainer); } function boolFromString(str) { if (str === 'true') { return true; } else if (str === 'false') { return false; } return false; } function buildIframe(sdkMain, src) { sdkMain.title = 'PDF Boss'; sdkMain.name = 'botIframe'; if (src) { sdkMain.src = src; } else { sdkMain.src = 'https://sadik.ai/chat-embed-R7uBKqTefl6L2hYJXpuM'; } sdkMain.allow = 'microphone'; sdkMain.frameBorder = 'none'; sdkMain.className = 'sdk--main'; sdkHeaderSpan.textContent = 'PDF Boss'; document.getElementsByClassName('sdk--bot-container')[0].appendChild(sdkMain); } const originalOpen = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function(method, url, async, user, password) { const self = this; const originalSend = self.send; self.send = function(data) { originalSend.call(self, data); self.addEventListener('load', function() { if (self.status >= 200 && self.status < 300) { attachPDFSadikIcon(); } }); }; originalOpen.call(self, method, url, async, user, password); }; // Intercept fetch API requests const originalFetch = window.fetch; window.fetch = function(url, options) { return originalFetch(url, options).then(response => { if (response.ok) { attachPDFSadikIcon(); } return response; }); };