// Определение ОС
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;
        }
    }
}