var xhr; var outputArea; var inputComand; var bubleId = 0; var reqId = 0; const bubbleTypes = {"message": "message", "sended": "sended", "received": "received", "error": "error"}; function main() { xhr = new XMLHttpRequest(); outputArea = document.getElementById('outputArea'); inputComand = document.getElementById('inputComand'); // add keyboard listener window.addEventListener('keyup', function (e) { (e.key === 'Enter') && send(inputComand.value); }); // add button action listeners document.querySelector('#sendButton').addEventListener('click', send); document.querySelector('#clearButton').addEventListener('click', clearChat); addChatBuble("EMPECEMOS", "message"); } function makeSendHandler(chatBubble) { xhr.onload = function (e) { let response = xhr.responseText; chatBubble.getElementsByClassName('statusIcon')[0].className = 'statusIcon statusChecked'; if (response.length < 1) { send(); return; } else { addChatBuble(xhr.responseText, bubbleTypes.received); } }; xhr.onerror = function (e) { chatBubble.getElementsByClassName('statusIcon')[0].className = 'statusIcon statusError'; addChatBuble(e.type + "", bubbleTypes.error); }; } function send(inputComandText) { inputComandText || (inputComandText = inputComand.value); inputComand.value = ""; let chatBubble; // predict next's if (inputComandText.length === 0) { sendRequest("n 200"); return; } // delete all bubbles if (inputComandText.includes("cls")) { clearChat(); return; } // send input context chatBubble = addChatBuble(inputComandText, bubbleTypes.sended); makeSendHandler(chatBubble); sendRequest(inputComandText); } function sendRequest(requestComandText) { reqId = new Date().getTime(); xhr.open("GET", document.location.origin + "?cmd=\"" + requestComandText + "\"&reqId=" + reqId); xhr.send(); } function addChatBuble(message, type) { let chatBubble; let messageBox; let controlBox; let deleteBtn; let statusIcon; type = (type || bubbleTypes.sended); // initializes chatBubble DOM elements chatBubble = document.createElement('div'); chatBubble.className = "chatBubble " + bubbleTypes[type]; chatBubble.id = "bubble" + bubleId++; messageBox = document.createElement('spam'); messageBox.innerText = message; messageBox.className = "messageBox"; controlBox = document.createElement('spam'); controlBox.className = 'controlBox'; // make chatbuble control DOM elements deleteBtn = document.createElement('spam'); deleteBtn.className = "deleteButton"; deleteBtn.onclick = function () { outputArea.removeChild(chatBubble); }; controlBox.appendChild(deleteBtn); if (type === bubbleTypes.sended) { // add message status icon statusIcon = document.createElement('spam'); statusIcon.className = 'statusIcon statusSended'; controlBox.appendChild(statusIcon); } // make chatBubble DOM chatBubble.appendChild(messageBox); chatBubble.appendChild(controlBox); outputArea.appendChild(chatBubble); // slide to lats bubble document.location = "#" + chatBubble.id; inputComand.focus(); return chatBubble; } function clearChat() { outputArea.innerHTML = ""; sendRequest("cls"); addChatBuble("EMPECEMOS\n DE NUEVO", "message"); }