// Определение ОС var OSName = 'Unknown'; if (navigator.appVersion.indexOf('Win') != -1) OSName = 'Windows'; if (navigator.appVersion.indexOf('Mac') != -1) OSName = 'MacOS'; if (navigator.appVersion.indexOf('X11') != -1) OSName = 'UNIX'; if (navigator.appVersion.indexOf('Linux') != -1) OSName = 'Linux'; console.log('Операционная система: ' + OSName); var someTime = new Date().getTime(); var messengerFrameReload = true; // Выполнение при загрузке var first = false; window.onload = function() { // Необходимо для того, чтобы при обновлении страницы загружался фрейм с текущим URL CRM var src = (localStorage['JustCRM_lastURL']) ? localStorage['JustCRM_lastURL'] : 'index.php'; var fragment = create(''); document.body.insertBefore(fragment, document.body.childNodes[0]); }; function loadChat() { var fragment = create(''); document.body.insertBefore(fragment, document.body.childNodes[1]); var fragment1 = create(''); document.body.insertBefore(fragment1, document.body.childNodes[2]); } function create(htmlStr) { var frag = document.createDocumentFragment(), temp = document.createElement('div'); temp.innerHTML = htmlStr; while (temp.firstChild) { frag.appendChild(temp.firstChild); } return frag; } // Операции с Websocket var socket; var timer; var forbidden = false; function socketConnect() { //socket = new WebSocket('wss://'+window.location.hostname+'/ws'); socket = new WebSocket('wss://crm1.sskindustry.ru/ws'); //socket = new WebSocket('ws://46.0.207.45/ws'); socket.onmessage = function(event) { // Ответ сервера //console.log(event.data); var serverEvent = {}; try { serverEvent = JSON.parse(event.data); } catch (err) {}; // Если авторизация отклонена, то удаляем таймер для попыток соединения if (serverEvent.wssstatus && serverEvent.wssstatus == '0') { clearTimeout(timer); forbidden = true; } // Если обнаружен дубликат сессии, то завершаем соединение if (serverEvent.wssstatus == '2') { console.log('Отключаем соединение.'); socket.close(); // Аннулируем авторизацию в CRM window.frames[0].deleteCookie('PHPSESSID'); window.location.reload(); } // Если это первый ответ сервера с id пользователя, присвоенный сервером, то отправляем серверу настройки с методами if (typeof serverEvent.first_responce_server != "undefined") { var firstResponceClient = '{"first_responce_client":"true", "id":"' + window.frames[0].id + '", "id_client":"' + window.frames[0].guid + '", "id_client_server":"' + serverEvent.id_client_server + '", "client_name":"", "ext_client":"' + window.frames[0].ext_phone + '", "incoming_call":"true", "incoming_task":"true"}'; console.log('Ответ серверу отправлен.'); try { socket.send(firstResponceClient); } catch (err) {}; } else { // Иначе это событие, которое надо обработать if (JSON.stringify(serverEvent) != '{}') { console.log('Получено событие.'); console.log(serverEvent); noty(serverEvent); } } }; socket.onopen = function() { console.log('Соединение установлено.'); socketStatus(socket.readyState); }; socket.onerror = function() { console.log('Ошибка соединения с сервером уведомлений!'); socketStatus(socket.readyState); }; socket.onclose = function() { console.log('Соединение закрыто.'); socketStatus(socket.readyState); delete socket; if (!forbidden) { if (window.frames[0].guid != '' && window.frames[0].system_type == '1') { timer = setTimeout(function() { console.log('Пробуем подключиться...'); socketConnect(); }, 5000); } } }; } function crmLoad() { if (typeof socket != 'undefined' && socket) socketStatus(socket.readyState); // Если GUID отсутствует, но есть соединение с сокетом, значит был произведен выход из CRM, необходим реконнект if ((window.frames[0].guid == '' && socket && socket.readyState == 1) || window.frames[0].system_type != '1' && typeof socket != 'undefined') { // Закрываем сокет socket.close(); location.reload(); } // Вызываем сокет, только если соединение отсутствует if (socket && socket.readyState == 1) { forbidden = false; return; } // Вызываем соединение если только имеется GUID if (window.frames[0].guid != '' && window.frames[0].system_type == '1') { console.log('Пользователь авторизован в JustCRM.'); delete socket; socketConnect(); } } function socketStatus(status) { var cls = (status == 1) ? 'green-b' : 'red-b'; var txt = (status == 1) ? 'Соединение установлено' : 'Нет соединения с сервером событий!'; try { var sts = window.frames[0].document.getElementById('link-status'); sts.className = cls; sts.parentElement.attributes[0].value = txt; } catch (err) {} } // Операции с Websocket - Конец // Отправка уведомлений function noty(content) { var f = window.frames[0]; // Cобытия PBX if (content.eventPbx) { switch (content.eventPbx) { case 'IncomingCall': if (content.clientId) { f.notifyMe('Входящий вызов!', 'Клиент: ' + content.clientName + '.\nНомер: ' + content.clientNumber, '{"success" : "true", "clientId":"' + content.clientId + '", "clientName":"' + content.clientName + '", "clientNumber":"' + content.clientNumber + '", "clientType":"' + content.clientType + '", "lidasType":"' + content.lidasType + '"}'); } else { f.notifyMe('Входящий вызов!', 'Клиент не идентифицирован.\nНомер: ' + content.clientNumber, '{"success" : "true", "clientId":"new", "clientNumber":"' + content.clientNumber + '"}'); } break; case 'BlindTransfer': case 'AttendedTransfer': if (content.clientId) { f.notifyMe('Переадресация вызова от: ' + content.userNumber, 'Клиент: ' + content.clientName + '.\nНомер: ' + content.clientNumber, '{"success" : "true", "clientId":"' + content.clientId + '", "clientName":"' + content.clientName + '", "clientNumber":"' + content.clientNumber + '", "clientType":"' + content.clientType + '", "lidasType":"' + content.lidasType + '"}'); } else { f.notifyMe('Переадресация вызова от: ' + content.userNumber, 'Клиент не идентифицирован.\nНомер: ' + content.clientNumber, '{"success" : "true", "clientId":"new", "clientNumber":"' + content.clientNumber + '"}'); } break; case 'DroppedCall': if (content.clientId) { f.notifyMe('Пропущенный вызов!', 'Клиент: ' + content.clientName + '.\nНомер: ' + content.clientNumber, '{"command" : "dropped_call", "clientName":"' + content.clientName + '", "clientNumber":"' + content.clientNumber + '", "clientType":"' + content.clientType + '", "lidasType":"' + content.lidasType + '"}'); } else { f.notifyMe('Пропущенный вызов!', 'Номер: ' + content.clientNumber, '{"command" : "dropped_call", "clientNumber":"' + content.clientNumber + '"}'); } break; } } // События CRM if (content.command) { switch (content.command) { case 'new_task': f.notifyMe('Для Вас новая задача!', 'Автор: ' + content.client_name + '\nНажмите, чтобы перейти к документу.', '{"command" : "new_task", "task_url":"' + content.task_url + '"}'); break; case 'new_task_api': f.notifyMe(content.subject, 'Нажмите, чтобы перейти к документу.', '{"command" : "new_task_api"}'); break; case 'new_eventslist_api': f.notifyMe(content.subject, content.text, '{"command" : "new_eventslist_api"}'); break; } } }