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() {/*
Unifrom1チャットボット
-
*/}).toString().match(/\/\*([\s\S]*)\*\//)[1].replace(/\n|\r/g, "");
var chat_msg_l_tmpl = (function() {/*
@2
@1
*/}).toString().match(/\/\*([\s\S]*)\*\//)[1].replace(/\n|\r/g, "");
var chat_msg_r_tmpl = (function() {/*
@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() {/*
*/}).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);
}