(function() {
const scripts = document.getElementsByTagName('script');
let userType = 'guest';
let token = '6964641e89fcc';
let back_php = 'https://chat.rezpect.xyz/chat/chat_handler.php?prj=hs&lang=ru&user=guest&token=';
const MANAGER_RESPONSE_TIMEOUT = 2 * 60 * 1000;
let lastManagerResponseTime = null;
let isChatLocked = false;
let lastUserMessageTime = null;
const styles = `
#chat-button {
position: fixed;
bottom: 20px;
right: 20px;
width: 60px;
height: 60px;
background: #007bff;
border: none;
border-radius: 50%;
color: white;
font-size: 24px;
cursor: pointer;
z-index: 9999;
box-shadow: 0 2px 10px rgba(0,0,0,0.2);
}
#chat-window {
display: none;
position: fixed;
bottom: 90px;
right: 20px;
width: 350px;
height: 400px;
background: white;
border: 1px solid #ccc;
border-radius: 10px;
z-index: 9999;
box-shadow: 0 5px 15px rgba(0,0,0,0.3);
}
#chat-header {
background: #007bff;
color: white;
padding: 15px;
border-radius: 10px 10px 0 0;
font-weight: bold;
}
#chat-messages {
height: 280px;
padding: 10px;
overflow-y: auto;
border-bottom: 1px solid #eee;
}
#chat-input-area {
display: flex;
padding: 10px;
}
#chat-input {
flex: 1;
border: 1px solid #ccc;
padding: 8px;
border-radius: 5px;
outline: none;
}
#chat-send {
margin-left: 5px;
padding: 8px 15px;
background: #007bff;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
}
.message {
color: black;
margin-bottom: 10px;
padding: 8px;
border-radius: 5px;
white-space: pre-wrap;
}
.user-message, .guest-message {
background: #e3f2fd;
text-align: right;
}
.manager-message {
background: #f5f5f5;
}
.typing-message {
background: #f0f8ff;
color: #666;
font-style: italic;
}
.offline-message {
background: #ffebee;
color: #c62828;
text-align: center;
font-weight: bold;
padding: 15px;
margin: 10px;
border-radius: 5px;
border: 1px solid #ffcdd2;
}
.chat-input-disabled {
background-color: #f5f5f5;
cursor: not-allowed;
opacity: 0.6;
}
`;
if (!getCookie('chat_token')) {
document.cookie = "chat_token=" + token;
} else {
token = getCookie('chat_token');
}
const styleSheet = document.createElement('style');
styleSheet.textContent = styles;
document.head.appendChild(styleSheet);
const chatButton = document.createElement('button');
chatButton.id = 'chat-button';
chatButton.innerHTML = 'π¬';
const chatWindow = document.createElement('div');
chatWindow.id = 'chat-window';
chatWindow.innerHTML = `
`;
document.body.appendChild(chatButton);
document.body.appendChild(chatWindow);
const messagesDiv = document.getElementById('chat-messages');
const inputField = document.getElementById('chat-input');
const sendButton = document.getElementById('chat-send');
let lastMessageCount = 0;
let waitingForResponse = false;
let typingTimeout = null;
let typingElement = null;
let typingDots = 0;
let typingInterval = null;
function lockChat() {
if (isChatLocked) return;
isChatLocked = true;
const offlineMessage = document.createElement('div');
offlineMessage.className = 'offline-message';
offlineMessage.textContent = 'ΠΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ Π½Π΅ Π² ΡΠ΅ΡΠΈ :( ΠΠ±ΡΠ°ΡΠΈΡΠ΅ΡΡ Π² "ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ" Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΏΡΠ°Π²ΠΊΠΈ';
messagesDiv.appendChild(offlineMessage);
inputField.disabled = true;
inputField.classList.add('chat-input-disabled');
inputField.placeholder = 'Π§Π°Ρ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ - ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ Π½Π΅ Π² ΡΠ΅ΡΠΈ';
sendButton.disabled = true;
sendButton.style.backgroundColor = '#cccccc';
sendButton.style.cursor = 'not-allowed';
hideTyping();
clearInterval(loadMessagesInterval);
}
function unlockChat() {
if (!isChatLocked) return;
isChatLocked = false;
const offlineMessage = messagesDiv.querySelector('.offline-message');
if (offlineMessage) {
offlineMessage.remove();
}
inputField.disabled = false;
inputField.classList.remove('chat-input-disabled');
inputField.placeholder = 'ΠΠ²Π΅Π΄ΠΈΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅...';
sendButton.disabled = false;
sendButton.style.backgroundColor = '#007bff';
sendButton.style.cursor = 'pointer';
startMessagePolling();
}
function checkManagerTimeout() {
if (!lastUserMessageTime || isChatLocked) return;
const currentTime = Date.now();
const timeSinceLastUserMessage = currentTime - lastUserMessageTime;
if (timeSinceLastUserMessage > MANAGER_RESPONSE_TIMEOUT && waitingForResponse) {
if (!lastManagerResponseTime || lastManagerResponseTime < lastUserMessageTime) {
lockChat();
}
}
}
function addMessage(text, type) {
const messageDiv = document.createElement('div');
messageDiv.className = `message ${type}-message`;
messageDiv.textContent = text;
messagesDiv.appendChild(messageDiv);
messagesDiv.scrollTop = messagesDiv.scrollHeight;
if (type === 'manager') {
lastManagerResponseTime = Date.now();
if (isChatLocked) {
unlockChat();
}
lastUserMessageTime = null;
}
return messageDiv;
}
function showTyping() {
if (typingElement) return;
typingElement = addMessage('ΠΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΠΏΠ΅ΡΠ°ΡΠ°Π΅Ρ', 'typing');
typingDots = 0;
typingInterval = setInterval(() => {
typingDots = (typingDots + 1) % 4;
typingElement.textContent = 'ΠΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΠΏΠ΅ΡΠ°ΡΠ°Π΅Ρ' + '.'.repeat(typingDots);
}, 500);
}
function hideTyping() {
if (typingElement) {
typingElement.remove();
typingElement = null;
}
if (typingInterval) {
clearInterval(typingInterval);
typingInterval = null;
}
if (typingTimeout) {
clearTimeout(typingTimeout);
typingTimeout = null;
}
waitingForResponse = false;
}
function parseMessages(data) {
const messages = [];
const lines = data.split('\n');
let currentMessage = null;
let hasManagerMessage = false;
for (let line of lines) {
if (line.startsWith('user:(guest) ')) {
if (currentMessage) messages.push(currentMessage);
currentMessage = { type: 'guest', text: line.substring(12) };
} else if (line.startsWith('user: ')) {
if (currentMessage) messages.push(currentMessage);
currentMessage = { type: 'user', text: line.substring(6) };
} else if (line.startsWith('manager: ')) {
if (currentMessage) messages.push(currentMessage);
currentMessage = { type: 'manager', text: line.substring(9) };
hasManagerMessage = true;
} else if (currentMessage && line.trim()) {
currentMessage.text += '\n' + line;
}
}
if (currentMessage) messages.push(currentMessage);
if (hasManagerMessage) {
lastManagerResponseTime = Date.now();
}
return messages;
}
function loadMessages() {
if (isChatLocked) return;
const headers = new Headers();
headers.append('Content-Type', 'application/x-www-form-urlencoded');
fetch(back_php + token + '&action=load', {
method: 'GET',
headers: headers,
})
.then(response => response.text())
.then(data => {
const messages = parseMessages(data);
if (messages.length !== lastMessageCount) {
const hadManagerResponse = messages.length > lastMessageCount &&
messages[messages.length - 1].type === 'manager';
if (hadManagerResponse && waitingForResponse) {
hideTyping();
lastUserMessageTime = null;
}
messagesDiv.innerHTML = '';
messages.forEach(msg => {
addMessage(msg.text, msg.type);
});
lastMessageCount = messages.length;
}
})
.catch(error => {
console.error('ΠΡΠΈΠ±ΠΊΠ° Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ:', error);
});
}
function sendMessage() {
if (isChatLocked) return;
const headers = new Headers();
headers.append('Content-Type', 'application/x-www-form-urlencoded');
const message = inputField.value.trim();
if (!message) return;
inputField.value = '';
waitingForResponse = true;
lastUserMessageTime = Date.now();
typingTimeout = setTimeout(() => {
if (waitingForResponse) {
showTyping();
}
}, 2000);
fetch(back_php + token, {
method: 'POST',
headers: headers,
body: 'message=' + encodeURIComponent(message) + '&user_type=' + encodeURIComponent(userType)
})
.then(response => response.text())
.then(data => {
loadMessages();
})
.catch(error => {
console.error('ΠΡΠΈΠ±ΠΊΠ° ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ:', error);
hideTyping();
});
}
function getCookie(name) {
const nameEQ = name + "=";
const ca = document.cookie.split(';');
for (let i = 0; i < ca.length; i++) {
let c = ca[i];
while (c.charAt(0) === ' ') {
c = c.substring(1, c.length);
}
if (c.indexOf(nameEQ) === 0) {
return c.substring(nameEQ.length, c.length);
}
}
return null;
}
let checkTimeoutInterval = null;
let loadMessagesInterval = null;
function startTimeoutChecking() {
if (checkTimeoutInterval) clearInterval(checkTimeoutInterval);
checkTimeoutInterval = setInterval(checkManagerTimeout, 10000);
}
function startMessagePolling() {
if (loadMessagesInterval) clearInterval(loadMessagesInterval);
loadMessagesInterval = setInterval(function() {
if (chatWindow.style.display === 'block' && !isChatLocked) {
loadMessages();
}
}, 5000);
}
chatButton.addEventListener('click', function() {
if (chatWindow.style.display === 'none' || chatWindow.style.display === '') {
chatWindow.style.display = 'block';
loadMessages();
} else {
chatWindow.style.display = 'none';
}
});
sendButton.addEventListener('click', sendMessage);
inputField.addEventListener('keypress', function(e) {
if (e.key === 'Enter') {
sendMessage();
}
});
document.addEventListener('click', function(e) {
if (!chatWindow.contains(e.target) && e.target !== chatButton) {
chatWindow.style.display = 'none';
}
});
startTimeoutChecking();
startMessagePolling();
})();