var rebot = (function(){ var version = "1.10"; var appid = "cde5967d3a764ee18abd6887f165c625"; var is_sent_init = false; var keyPressMode = 1; var textAreaHeight; var isRtchat = 0; var socket; var logs = []; var headerText = "Unifrom1チャットボット"; var characterImage = "https://s3-ap-northeast-1.amazonaws.com/goq-rebot-line-resized/1166/b5487a1c439e44dc9938b7fe460820eb.png/origin"; var windowElement; var windowToggled; var header; var body; var footer; var padding; var rowSize; var chat_window_tmpl = (function() {/*
*/}).toString().match(/\/\*([\s\S]*)\*\//)[1].replace(/\n|\r/g, ""); var chat_msg_l_tmpl = (function() {/*
  • User Avatar
    @2

    @1

  • */}).toString().match(/\/\*([\s\S]*)\*\//)[1].replace(/\n|\r/g, ""); var chat_msg_r_tmpl = (function() {/*
  • User Avatar

    @1

  • */}).toString().match(/\/\*([\s\S]*)\*\//)[1].replace(/\n|\r/g, ""); var chat_msg_c_tmpl = (function() {/*

    @1

    */}).toString().match(/\/\*([\s\S]*)\*\//)[1].replace(/\n|\r/g, ""); var chat_msg_b_tmpl = (function() {/*
    */}).toString().match(/\/\*([\s\S]*)\*\//)[1].replace(/\n|\r/g, ""); var chat_msg_b_tmpl_wrap = (function() {/*
    @1
    */}).toString().match(/\/\*([\s\S]*)\*\//)[1].replace(/\n|\r/g, ""); var chat_reply_wrap = (function() {/*
  • @1
  • */}).toString().match(/\/\*([\s\S]*)\*\//)[1].replace(/\n|\r/g, ""); var chat_loading_tmpl = (function() {/*
    */}).toString().match(/\/\*([\s\S]*)\*\//)[1].replace(/\n|\r/g, ""); var chat_msg_f_tmpl = (function() {/*
  • @1
  • */}).toString().match(/\/\*([\s\S]*)\*\//)[1].replace(/\n|\r/g, ""); var chat_msg_f_names = []; var btnCharLen = 11; var maxConvNum = 30; var s = '899650aaaaa541eea7ff1d205ee33a8e'; function htmlToElement(html) { var template = document.createElement('template'); template.innerHTML = html; if(template.content) { // return template.content.firstChild; return template.content; } else{ return template.firstElementChild; } } function sendMessage(msg, skip_msg){ if(!skip_msg) { writeMessage(htmlToElement(chat_msg_r_tmpl.replace(/@1/g, msg.replace(/\r?\n/g, '
    ')))); scroll(1); } if(isRtchat){ sendWsMessage(msg); } else { xhr = new XMLHttpRequest(); xhr.onreadystatechange = httpStateChange; xhr.onerror = httpError; xhr.ontimeout = httpError; xhr.open('POST', 'https://ai.goqsystem.com/api/web'); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send(createParam(msg)) } } function getFormData(form){ var formData={}; var formElements = form.elements; for (var i = 0; i < formElements.length; i++) if (formElements[i].type != 'button') formData[formElements[i].name]=formElements[i].value; return JSON.stringify(formData); } function httpStateChange(){ switch(xhr.readyState){ case 4: // リクエスト成功 if((200 <= xhr.status && xhr.status < 300) || (xhr.status == 304)) { var json = JSON.parse(xhr.responseText); s = json.s; var responses = json.response; var cnt = 0; message_process(); // Transition to rtchat mode if(checkRtchat(json)){ // if(true){ isRtchat = true; openWs(); } else { isRtchat = false; } function message_process(){ var timer = Math.random() * 400 + 300; if(cnt == 0){ cnt++; timer = Math.random() * 800 + 600; writeLoading(); } else { var res = responses[0]; var match = res.match(/^##form:(.+)##/); if(match && match.length >= 2){ writeMessage(htmlToElement(chat_msg_f_tmpl.replace('@1', res.replace(match[0], '')).replace(/@2/g, match[1]))); chat_msg_f_names.push(match[1]); } else{ writeMessage(htmlToElement(chat_msg_l_tmpl.replace(/@1/g, res).replace(/@2/g, headerText).replace(/@3/g, characterImage))); } responses.shift(); cnt = 0 } if(responses.length == 0){ menu_process(json); rebot.onCompleteWriteMessage(JSON.parse(xhr.responseText)); return; } setTimeout(function(){ message_process(); }, timer); } } break; } } function menu_process(json){ var menu_count = 0; if(json.reply.length > 0){ var l = []; for (var i = 0; i < json.reply.length; i++) { if(json.reply[i] == "[no menu]") continue; l.push(chat_msg_c_tmpl.replace(/@1/g, get_reply_val(json.reply[i], 0)).replace(/@2/g, get_reply_val(json.reply[i], 1))); } writeMessage(htmlToElement(chat_reply_wrap.replace(/@1/g, l.join('')))); menu_count = l.length; } else { var elm = chat_msg_c_tmpl.replace(/@1/g, "メニューに戻る").replace(/@2/g, "メニューに戻る").replace(/@3/g, "col-12"); if(chat_msg_f_names.length == 0){ menu_count++; writeMessage(htmlToElement(chat_reply_wrap.replace(/@1/g, elm))); } } scroll(2 + menu_count); } // type 0: display value, 1: send value function get_reply_val(reply, type){ var s_reply = reply.split('::'); if(type == 1 && s_reply.length > 1){ return s_reply[1]; } else { return s_reply[0]; } } function httpError(){ var msg = "大変申し訳ございませんが、ただいまご利用頂けません。
    お時間おいて再度お試しください。"; writeMessage(chat_msg_c_tmpl.replace(/@1/g, msg)); } function createParam(msg){ var params = []; params.push("appid=" + appid); params.push("content=" + encodeURIComponent(msg)); params.push("mode=web"); params.push("s=" + s); return params.join('&'); } function writeLoading(){ writeMessage(htmlToElement(chat_msg_l_tmpl.replace(/@1/g, chat_loading_tmpl).replace(/@2/g, headerText).replace(/@3/g, characterImage))); scroll(1); } function deleteReplyOptions(){ var elem = document.getElementById('chat-message'); var reply_wrap = document.getElementsByClassName("reply-options"); if(reply_wrap.length > 0){ while(reply_wrap.length > 0){ elem.removeChild(reply_wrap[0]); } } } function deleteSubmitForms(){ do{ var formName = chat_msg_f_names.shift(); if(formName != undefined) deleteSubmitForm(formName); }while(formName != undefined); } function deleteSubmitForm(formName){ var forms = document.getElementsByName(formName) for(var i = 0; i < forms.length; i++){ var removeElem = forms[i].parentElement; var parentElem = removeElem.parentElement; parentElem.removeChild(removeElem); } } function writeMessage(chat_message){ var elem = document.getElementById('chat-message'); // delete loader if there's any loader = elem.getElementsByClassName('chat-loader'); if(loader.length > 0){ var parent = loader[0].parentNode.parentNode; parent.parentNode.removeChild(parent); } elem.appendChild(chat_message); if(elem.childElementCount > maxConvNum){ elem.removeChild(elem.children[0]); } scroll(1); } function writeButton(btn){ deleteReplyOptions(); var elem = document.getElementsByClassName('chat-footer')[0]; elem.appendChild(btn); } function scroll(type){ var targets = document.getElementsByClassName("chat-message-body"); if(targets.length - type >= 0){ var target = targets[targets.length - type]; var chatHeader = document.getElementsByClassName("chat-header")[0]; var chatBody = document.getElementsByClassName("chat-body")[0]; // chat_body.scrollTop = target.offsetTop - chat_header.offsetHeight; //smoothScr.step = (target.offsetTop - chatHeader.offsetHeight - chatBody.scrollTop) / 15.0; smoothScr.stopShow(); smoothScr.anim(target, chatBody, chatHeader); } } function resizeTextArea(evt){ // Resize Text Area if(evt.target.scrollHeight >= evt.target.offsetHeight){ if(evt.target.scrollHeight < 2 * textAreaHeight){ evt.target.style.height = evt.target.scrollHeight + "px"; } else { evt.target.style.height = 2 * textAreaHeight + "px"; } }else{ var height; for (var i = 0; i <= 10; i++){ height = Number(evt.target.style.height.split("px")[0]); evt.target.style.height = height - textAreaHeight + "px"; if(evt.target.scrollHeight > evt.target.offsetHeight){ if(evt.target.scrollHeight > textAreaHeight){ evt.target.style.height = evt.target.scrollHeight + "px"; } else { evt.target.style.height = textAreaHeight + "px"; } break; } } } } function startsWith(str, word){ return str.lastIndexOf(word, 0) === 0; } function openWs(){ var prtcl = "https:" == document.location.protocol ? "wss" : "ws"; var host = "//ai.goqsystem.com"; if(startsWith(host, "http")){ socket = new WebSocket("//ai.goqsystem.com/chat/enduser/".replace(/https?/g, prtcl) + appid + "/" + s ); } else { socket = new WebSocket(prtcl + "://ai.goqsystem.com/chat/enduser/" + appid + "/" + s ); } socket.onmessage = onWsMessage; socket.onopen = onWsOpen; socket.onclose = onWsClose; } function onWsMessage(e){ var msg = JSON.parse(e.data); if(msg.disconnect){ isRtchat = false; menu_process({reply:['メニューへ戻る']}) socket.close(); } else { var img = msg.sender_image ? msg.sender_image : characterImage; writeMessage(htmlToElement(chat_msg_l_tmpl.replace(/@1/g, msg.text.replace(/\r?\n/g, '
    ')).replace(/@2/g, msg.sender).replace(/@3/g, img))); scroll(1); } } function onWsOpen(){ //console.log('Opened'); } function onWsClose(){ //try to reconnect if(isRtchat){ openWs(); } } function sendWsMessage(message){ if(!message){ return false; } if(socket && socket.readyState == WebSocket.OPEN){ socket.send(message); return true; } else { openWs(); return false; } } function checkRtchat(json){ for(var state in json.state){ if(json.state[state].rtchat == 1) return true; } return false; } function validateFormFields(form) { var result = typeof document.createElement('input').checkValidity == 'function'; if (result) { for (var i = 0; i < form.elements.length; i++) { var element = form.elements[i]; if (!element.checkValidity() && (!element.validationMessage || element.validationMessage === null || element.validationMessage === '')) { return false; } } } return result; } function getCookie( name ) { var result = null; var cookieName = name + '='; var allcookies = document.cookie; var position = allcookies.indexOf( cookieName ); if( position != -1 ) { var startIndex = position + cookieName.length; var endIndex = allcookies.indexOf( ';', startIndex ); if( endIndex == -1 ) { endIndex = allcookies.length; } result = decodeURIComponent( allcookies.substring( startIndex, endIndex ) ); } return result; } function setBadge(){ if(toggleStatus == 1 && unread_ids.length > 0){ var badge = document.getElementById('synalio-chat-window-notice-badge'); badge.innerHTML = unread_ids.length; badge.style.display = 'block'; } } function checkUrl(s) { if (s !== undefined && s != null){ var httpPrefix = 'http://'; var httpsPrefix = 'https://'; if((s.length > httpPrefix.length && s.substr(0 ,httpPrefix.length) == httpPrefix) || (s.length > httpsPrefix.length && s.substr(0, httpsPrefix.length) == httpsPrefix)){ return true; } } return false; } smoothScr = { iterr : 20, // set timeout miliseconds ..decreased with 1ms for each iteration tm : null, //timeout local variable step : null, lastScrollTop: null, stopShow: function() { clearTimeout(this.tm); // stopp the timeout this.iterr = 30; // reset milisec iterator to original value }, anim : function (target, chatBody, chatHeader) // the main func { var step = (target.offsetTop - chatHeader.offsetHeight - chatBody.scrollTop) / 5.0; chatBody.scrollTop += step; if(this.iterr > 1) this.iterr -= 1; else this.itter = 0; if(this.lastScrollTop != chatBody.scrollTop && step > 1 && chatBody.scrollTop < target.offsetTop - chatHeader.offsetHeight){ this.lastScrollTop = chatBody.scrollTop; this.tm = window.setTimeout(function() { smoothScr.anim(target, chatBody, chatHeader); }, this.iterr); } else { this.stopShow(); } } }; return { onLoadEvent: function(){ var style = document.createElement("link"); style.setAttribute("style", "text/css"); style.setAttribute("rel", "stylesheet"); document.getElementsByTagName('head')[0].appendChild(style); style = document.createElement("link"); style.setAttribute("style", "text/css"); style.setAttribute("rel", "stylesheet"); style.setAttribute("href", "//ai.goqsystem.com/api/chatcss/cde5967d3a764ee18abd6887f165c625?v=" + version); document.getElementsByTagName('head')[0].appendChild(style); style = document.createElement("link"); style.setAttribute("style", "text/css"); style.setAttribute("rel", "stylesheet"); style.setAttribute("href", "//maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css"); document.getElementsByTagName('head')[0].appendChild(style); var chat_window = htmlToElement(chat_window_tmpl); document.body.appendChild(chat_window); windowElement = document.getElementsByClassName("chat-window")[0]; windowToggled = document.getElementsByClassName("chat-window-toggled")[0]; header = document.getElementsByClassName("chat-header")[0]; body = document.getElementsByClassName("chat-body")[0]; footer = document.getElementsByClassName("chat-footer")[0]; windowElement.style.height = "550px"; windowElement.style.right = "15px"; windowToggled.style.right = "15px"; var ta = document.getElementById("chat-text-input"); ta.addEventListener("input", resizeTextArea); // Open Websocket if in rtchat if(isRtchat){ s = '899650aaaaa541eea7ff1d205ee33a8e'; openWs(); } // Continue from session if(logs.length > 0){ is_sent_init = true; var is_open = getCookie('window'); if(is_open === 'on'){ rebot.toggle(0); } logs.forEach(function(log){ var msg = log.text; var match = msg.match(/^##form:(.+)##/); var isForm = false; if(match && match.length >= 2){ isForm = true; } if(!isForm){ msg = log.text.replace(/\r?\n/g, '
    '); } if(log.type === 'end_user'){ writeMessage(htmlToElement(chat_msg_r_tmpl.replace(/@1/g, msg))); } else if (log.type === 'bot'){ if(isForm){ writeMessage(htmlToElement(chat_msg_f_tmpl.replace(/@1/g, msg.replace(match[0], '')).replace(/@2/g, match[1]))); chat_msg_f_names.push(match[1]); } else{ writeMessage(htmlToElement(chat_msg_l_tmpl.replace(/@1/g, msg).replace(/@2/g, headerText).replace(/@3/g, characterImage))); } } else if (log.type === 'admin_user'){ var nm = log.sender ? log.sender : headerText; var img = log.sender_image ? log.sender_image : characterImage; writeMessage(htmlToElement(chat_msg_l_tmpl.replace(/@1/g, msg).replace(/@2/g, nm).replace(/@3/g, img))); } }); var log = logs[logs.length - 1]; if((log.type === 'bot' || log.type === 'admin_user') && log.reply){ menu_process(log); } setTimeout(function(){ rebot.resize(windowElement.offsetHeight); scroll(1); }, 300); } else { } }, onKeyPressed: function(e){ var mode = -1; if (e.keyCode == 13 && (e.shiftKey || e.metaKey || e.ctrlKey)){ mode = keyPressMode == 1 ? 1 : 0; } else if (e.keyCode == 13) { mode = keyPressMode == 1 ? 0 : 1; } if (mode == 0){ var chat_input = document.getElementById("chat-text-input"); if (chat_input.value){ var msg = chat_input.value; sendMessage(msg); chat_input.value = ""; deleteReplyOptions(); deleteSubmitForms(); } e.target.style.height = textAreaHeight + 'px'; e.preventDefault(); } else if (mode == 1) { var chat_input = document.getElementById("chat-text-input"); chat_input.value += "\n"; resizeTextArea(e); e.preventDefault() } }, onPressLink: function(e){ sendMessage(e.getAttribute('data-val')); deleteReplyOptions(); deleteSubmitForms(); }, toggle: function(e){ var class_name = "chat-window-toggled" if(e == 1){ var chat_window = document.getElementsByClassName("chat-window")[0]; chat_window.style.display = "none"; var chat_window_toggled = document.getElementsByClassName(class_name)[0]; chat_window_toggled.className = class_name; document.cookie = 'window=off;max-age=1800'; } else { var chat_window = document.getElementsByClassName("chat-window")[0]; chat_window.style.display = "block"; var chat_window_toggled = document.getElementsByClassName(class_name)[0]; chat_window_toggled.className = class_name + " hidden"; rebot.resize(windowElement.offsetHeight); if(!is_sent_init){ is_sent_init = true; sendMessage("メニュー", true); deleteSubmitForms(); } if(!textAreaHeight){ var ta = document.getElementById("chat-text-input"); textAreaHeight = ta.offsetHeight; } document.cookie = 'window=on;max-age=1800'; } }, onPressButton: function(){ var chat_input = document.getElementById("chat-text-input"); if (chat_input.value){ var msg = chat_input.value; sendMessage(msg); deleteSubmitForms(); chat_input.value = ""; deleteReplyOptions(); var ta = document.getElementById("chat-text-input"); ta.style.height = textAreaHeight + 'px'; rebot.resize(windowElement.offsetHeight); } }, onHomeButton: function(){ sendMessage('メニューへ戻る'); deleteSubmitForms(); deleteReplyOptions(); var ta = document.getElementById("chat-text-input"); ta.style.height = textAreaHeight + 'px'; rebot.resize(windowElement.offsetHeight); }, onPressCheckbox: function(){ var chat_send_type = document.getElementById("chat-send-type-checkbox"); var chat_input = document.getElementById("chat-text-input") if(chat_send_type.checked){ keyPressMode = 1; chat_input.placeholder = chat_input.placeholder.replace("Shift + Enter", "Enter"); } else { keyPressMode = 0; chat_input.placeholder = chat_input.placeholder.replace("Enter", "Shift + Enter"); } }, onCompleteWriteMessage: function(responses){ }, resize: function resize(chatWindowHeight){ body.style.height = (chatWindowHeight - header.offsetHeight - footer.offsetHeight) + "px"; }, onFormChanged: function(form){ if (!form || form.nodeName !== "FORM") { return; } var i, j, q = [], checkboxDict = {}, selectboxDict = {}, radioDict = {}; for (i = form.elements.length - 1; i >= 0; i = i - 1) { if (form.elements[i].name === "") { continue; } if(form.elements[i].nodeName == 'INPUT'){ var input_type = form.elements[i].getAttribute('type'); if(input_type == 'checkbox'){ if(!(form.elements[i].name in checkboxDict)){ checkboxDict[form.elements[i].name] = []; } if (form.elements[i].checked) { checkboxDict[form.elements[i].name].push(form.elements[i].value); } } else if(input_type == 'radio'){ if(!(form.elements[i].name in radioDict)){ radioDict[form.elements[i].name] = ''; } if (form.elements[i].checked) { radioDict[form.elements[i].name] = form.elements[i].value; } } else{ q.push(form.elements[i].name + "=" + form.elements[i].value); } } else if(form.elements[i].nodeName == 'TEXTAREA'){ q.push(form.elements[i].name + "=" + form.elements[i].value); } else if(form.elements[i].nodeName == 'SELECT'){ if (form.elements[i].type == 'select-one') { q.push(form.elements[i].name + "=" + form.elements[i].value); } else if (form.elements[i].type == 'select-multiple'){ if(!(form.elements[i].name in selectboxDict)){ selectboxDict[form.elements[i].name] = []; } for (j = form.elements[i].options.length - 1; j >= 0; j = j - 1) { if (form.elements[i].options[j].selected) { selectboxDict[form.elements[i].name].push(form.elements[i].value); } } } } else if(form.elements[i].nodeName == 'BUTTON'){ var input_type = form.elements[i].getAttribute('type'); if (input_type == 'button') { q.push(form.elements[i].name + "=" + form.elements[i].value); } } } for(var checkboxName in checkboxDict){ q.push("checkbox_" + checkboxName + "=" + JSON.stringify(checkboxDict[checkboxName])); } for(var selectboxName in selectboxDict){ q.push("selectbox_" + selectboxName + "=" + JSON.stringify(selectboxDict[selectboxName])); } for(var radioName in radioDict){ q.push(radioName + "=" + radioDict[radioName]); } var data = q.join("&"); document.getElementById(form.getAttribute('name') + '-form-data').value = data; }, onSubmitForm: function(submitComponent){ var formName = submitComponent.getAttribute("form-name"); var form = document.getElementById(formName); if(!form || !form.checkValidity()){ return validateFormFields(form) } var formDataId = submitComponent.getAttribute("form-data-id"); var formData = document.getElementById(formDataId).value; if(!formData || formData === ''){ rebot.onFormChanged(form); formData = document.getElementById(formDataId).value; } if(formData){ var msg = '##form:' + formName + '##' + formData; sendMessage(msg, true); deleteSubmitForms(); } return false; }, }; })(); // Load Chat window if(document.readyState == 'complete'){ rebot.onLoadEvent(); } else { window.addEventListener('load', rebot.onLoadEvent, true); }