﻿// Data: Maio de 2007
// Programador: ERICK ALMEIDA (ephillipe@gmail.com)
// Objetivo: Sistema de atendimento online.
//
function getChatWin() {
    var oChatWin = null;
    if (window.IsAChatWin == true)
        oChatWin = window;
    if ((oChatWin == null) && (window.top.IsAChatWin == true))
        oChatWin = window.top;
    if (oChatWin == null) {
        var i = 0;
        for (i = 0; i <= window.top.frames.length; i++)
            if (window.top.frames[i])
            if (window.top.frames[i].IsAChatWin == true) {
            oChatWin = window.top.frames[i];
            break
        }
    }
    return oChatWin;
}

function getChatObject() {
    var chatWin = getChatWin();
    if (chatWin != null) {
        var oChat = chatWin.oChat;
        if (oChat == null) {
            chatWin.oChat = {};
            oChat = chatWin.oChat;
            oChat.SessionID = '';
            oChat.UserCode = '';
            oChat.LoginInProcess = false;
            oChat.ChatInProcess = false;
            oChat.WaitingAgent = false;
            oChat.readMessageTickCount = 0;
            oChat.readStateTickCount = 0;
            oChat.LastMessageTime = 0;
            oChat.myInfo = new LiveCHAT.Services.ChatUser();
            oChat.defaultService = null;
            oChat.timeoutMessages = null;
            oChat.timeoutSessionState = null;
            oChat.messageArray = new Array();
            oChat.tickController = new Array();
            oChat.traceActive = false;
            oChat.chatEditor = null;
            oChat.finishSessionInitiated = false;
            oChat.playSounds = true;
            oChat.Connected = true;
            oChat.TimerInterval = 2000;
            oChat.waitMessageString = '';
            oChat.Consts = {};
            oChat.Consts.waitingOperatorWindowName = "WindowWaitingOperator";
            oChat.Consts.wndSecaoFinalizada = "WindowSecaoFinalizada";
            oChat.Consts.wndUnableNetworkRequest = "WindowUnableNetworkRequest";
        }
        return oChat;
    }
    else {
        alert('Chat WIN não encotrado!')
        return null;
    }
}

function getService(useDefault) {
    var _service;
    if (useDefault == true) {
        var chatObject = getChatObject();
        if (chatObject.defaultService == null)
            chatObject.defaultService = new LiveCHAT.Services.SessionController();
        _service = chatObject.defaultService;
    }
    else _service = new LiveCHAT.Services.SessionController();
    // Assign default values to the generated proxy.
    _service.set_timeout(300000);
    _service.set_defaultUserContext("Defaultcontext");
    _service.set_defaultSucceededCallback(SucceededCallback);
    _service.set_defaultFailedCallback(FailedCallback);
    return _service;
};

function getMessage() {
    var oMessage = {};
    oMessage.MessageType = '';
    oMessage.MessageText = '';
    oMessage.Sender = new LiveCHAT.Services.ChatUser();
    oMessage.To = new LiveCHAT.Services.ChatUser();
    oMessage.IsAdmim = false;
    oMessage.IsOperator = false;
    oMessage.Whisper = false;
    oMessage.Message = new LiveCHAT.Services.ChatMessage();
    return oMessage;
}

function InicializarSistema() {
    getChatObject().LoginInProcess = true;
    var oWnd = openWindow('login', 'Entrada.aspx', 400, 300);
}

// Gets the session state value.
function GetSessionValue(key) {
    //         +Page Method    +Key +Callback          +Callback       +userContext
    PageMethods.GetSessionValue(key, SucceededCallback, FailedCallback, key);
}

// Sets the session state value.
function SetSessionValue(key, value) {
    //         +Page Method    +Key +Callback          +Callback       +userContext
    PageMethods.SetSessionValue(key, value, SucceededCallback, FailedCallback, key);
}

// Remove the session key.
function RemoveSession(key) {
    //         +Page Method    +Key +Callback          +Callback       +userContext
    PageMethods.RemoveSession(key, SucceededCallback, FailedCallback, key);
}

function checkTime(i) {
    if (i < 10)
    { i = "0" + i }
    return i
}

function GetLastMessageTime() {
    var LastMessageTime = getChatObject().LastMessageTime;
    if (!LastMessageTime)
        LastMessageTime = 0;
    return LastMessageTime;
}

function RestartTickCount(tickname) {
    getChatObject().tickController[tickname] = 0;
}

function GetTickCount(tickname) {
    var tickNumber = getChatObject().tickController[tickname];
    if (tickNumber == null)
        tickNumber = -1;
    return tickNumber;
}

function CheckTickCount(tickname) {
    var tickNumber = GetTickCount(tickname);
    var _continue = (tickNumber == 0);
    if (_continue == false) {
        logMessage(tickname + ' = ' + tickNumber);
        if (tickNumber >= 10) {
            tickNumber = -1;
        }
        getChatObject().tickController[tickname] = tickNumber;
    }
    getChatObject().tickController[tickname]++;
    return _continue;
}

function CheckSessionStart(sessionid) {
    var oChat = getChatObject();
    oChat.SessionID = sessionid;
    oChat.WaitingOperator = true;
    SetSessionValue('sessionid', sessionid);
    CheckSessionInfo(10);
}

function logMessage(msg, force) {
    var forcelog = force;
    if (forcelog == null) forcelog = false;
    if ((getChatObject().traceActive == true) || (forcelog == true)) {
        var oMessage = getMessage();
        oMessage.MessageType = 'SYSTEM';
        oMessage.MessageText = msg;
        oMessage.soundSupress = true;
        _InvokeChatEvent("MESSAGE", ["MESSAGE", "NEW", oMessage]);
    }
}

function InsertMessageInList(msg) {
    if (msg != null) {
        var arr = getChatObject().messageArray;
        arr[arr.length] = msg;
    }
}

function CheckMessageInList(msg) {
    var exists = false;
    if (msg != null) {
        var i;
        var arr = getChatObject().messageArray;
        for (i in arr)
            if (arr[i].messageID == msg.messageID) {
            exists = true;
            break
        }
    }
    return exists;
}

function ProcessMessage(msg, writeStamp, msgType) {
    if (msg != null) {
        if (!msgType)
            msgType = 'USER';
        if ((writeStamp != null) && (writeStamp == true))
            getChatObject().LastMessageTime = msg.timeStamp;
        if (CheckMessageInList(msg) == false) {
            var oMessage = getMessage();
            InsertMessageInList(msg);
            oMessage.MessageType = msgType;
            oMessage.MessageText = msg.message;
            oMessage.MessageHtml = msg.MessageHtml;
            oMessage.Sender = msg.Sender;
            oMessage.Message = msg;
            _InvokeChatEvent("MESSAGE", ["MESSAGE", "NEW", oMessage]);
            _InvokeChatEvent("USERS", ["USERS", "SET", msg.Sender]);
        }
    }
}

function ProcessMessageList(messageList) {
    var hasMessages = false;
    if (messageList != null) {
        var i = 0;
        var message;
        for (var item in messageList) {
            message = messageList[item];
            if (message.Sender.IsSystem == true)
                ProcessMessage(message, true, 'SYSTEM');
            else ProcessMessage(message, true);
            hasMessages = true;
            i++;
        }

    }
    getChatObject().readMessageTickCount = 0;
    return hasMessages;
}

function Disconnect(sessionID) {
    var sID = "";
    if (sessionID != null)
        sID = sessionID;
    else sID = getChatObject().SessionID;
    logMessage('Disconnect(' + sessionID + ')');
    if (sID != "") {
        var chatSession = getService();
        chatSession.FreeSession(sID);
    }
}

function GetSessionInfo_SucceededCallback_VerifySessionWaitPosition(waitingPosition) {
    if (waitingPosition != null) {
        var chatObject = getChatObject();
        if (chatObject.ChatInProcess == false) {
            var strPos = 'Posição na fila de espera: ' + waitingPosition;
            if (waitingPosition == 0)
                strPos = '<b>Você é o próximo a ser atendido<b>';
            var str = '<b>Aguardando atendimento pelo operador</b><br><br>' +
                      'Você logo será atendido.<br>' +
                      'Departamento: ' + chatObject.dptoName + '<br><br>' +
                      strPos;
            if (chatObject.waitMessageString != str) {
                chatObject.waitMessageString = str;
                UpdateStatusWindow(chatObject.Consts.waitingOperatorWindowName, str);
            }
        }
    }
}

function CheckSessionInfo(timerInterval) {
    var _tickname = 'CheckSessionInfo';
    var chatObject = getChatObject();
    if (CheckTickCount(_tickname) == true) {
        _InvokeChatEvent("STATUSPROGRESS", ["STATUSPROGRESS", "VISIBLE", "", null]);
        if (!chatObject.loginClosed) {
            chatObject.loginClosed = true;
            CloseStatusWindow('login');
        }
        var _chatService = getService(true);
        var _sessionID = chatObject.SessionID;
        var _lastMessageTime = GetLastMessageTime();
        _chatService.GetSessionInfo(_sessionID, _lastMessageTime);
    }
    else {
        var _tickCount = GetTickCount(_tickname);
        logMessage('CheckSessionInfo.TickCount(' + _tickCount + ')');
        if (_tickCount >= 3) {
            var _msgLog = 'Aguardando informações do servidor. ' + _tickCount + ' segundos... ';
            _InvokeChatEvent("STATUSPROGRESS", ["STATUSPROGRESS", "VISIBLE", _msgLog, null]);
        }
    }
    var _interval = chatObject.TimerInterval;
    if (timerInterval)
        _interval = timerInterval;
    clearTimeout(chatObject.timeoutSessionInfo);
    chatObject.timeoutSessionInfo = setTimeout('CheckSessionInfo()', _interval);
}

function GetSessionInfo_SucceededCallback(sessionInfo) {
    var oChat = getChatObject();
    CloseStatusWindow(oChat.Consts.wndUnableNetworkRequest);
    RestartTickCount('CheckSessionInfo');
    if (sessionInfo != null) {
        switch (sessionInfo.SessionState) {
            case (0): // Aguardando atendimento
                {
                    var str = '<b>Aguardando atendimento pelo operador</b>';
                    if (oChat.ChatInProcess == true) {
                        str = '<b>Bem vindo, você foi atendido mas ocorreu um problema na comunicação.</b><br><br>' +
                              'Aguarde alguns instantes que estou reconfigurando sua seção de atendimento';
                    }
                    else {
                        oChat.readStateTickCount = 0;
                        oChat.ChatInProcess = false;
                        oChat.WaitingAgent = true;
                    }
                    ShowStatusWindow(oChat.Consts.waitingOperatorWindowName, str);
                    break;
                }
            case (1): // Em progresso
                {
                    oChat.ChatInProcess = true;
                    oChat.WaitingAgent = false;
                    CloseStatusWindow(oChat.Consts.waitingOperatorWindowName);
                    oChat.waitMessageString = "";
                    oChat.readStateTickCount = 0;
                    break;
                }
            case (10): // Encerrado
            case (11):
            case (12):
            case (13):
                {
                    CloseStatusWindow(oChat.Consts.waitingOperatorWindowName);
                    CloseStatusWindow(oChat.Consts.wndUnableNetworkRequest);

                    oChat.ChatInProcess = false;
                    oChat.WaitingAgent = false;
                    RemoveSession('sessionid');
                    clearTimeout(oChat.timeoutMessages);
                    clearTimeout(oChat.timeoutSessionState);
                    clearTimeout(oChat.timeoutSessionInfo);

                    var _scriptLink = '<script src="Js/lc.serviceclient.js" type="text/javascript"></script>';
                    _scriptLink += '<script src="Js/lc.events.js" type="text/javascript"></script>';
                    _scriptLink += '<script src="Js/lc.radutils.js" type="text/javascript"></script>';
                    _scriptLink += '<script src="Js/lc.supportclient.js" type="text/javascript"></script>';
                    _scriptLink += '<script src="Js/lc.chatui.js" type="text/javascript"></script>';
                    _scriptLink += '<script src="Js/lc.chatclient.js" type="text/javascript"></script>';
                    var _closeScript = 'function CloseChat(){var wnd = window.top;wnd.opener = false;top.close();}';
                    _closeScript = '<script type="text/javascript">' + _closeScript + '</script>';
                    var _redirScript = 'function RedirChat(){var oWnd = GetRadWindow(); oWnd.SetUrl("ChatWinEnd.aspx"); oWnd.Maximize();}';
                    _redirScript = '<script type="text/javascript">' + _redirScript + '</script>';
                    var str = '';
                    str += _scriptLink;
                    str += _closeScript;
                    str += _redirScript;
                    str += '<b>Seção finalizada</b><br><br>';
                    str += '<input id="btnFechar" type="button" value="Fechar sistema" onclick="CloseChat()" /><br><br>';
                    str += '<input id="btnFechar" type="button" value="Visualizar conversa" onclick="RedirChat()" />';

                    ShowStatusWindow(oChat.Consts.wndSecaoFinalizada, str);
                    break;
                }
            default:
                {
                    CheckSessionInfo();
                    CloseStatusWindow(oChat.Consts.waitingOperatorWindowName);
                    break;
                }
        }
        if (oChat.ChatInProcess == false)
            GetSessionInfo_SucceededCallback_VerifySessionWaitPosition(sessionInfo.WaintingPosition)
        else {
            ProcessMessageList(sessionInfo.NewMessages);
        }
    }
    else {
        CloseStatusWindow(oChat.Consts.waitingOperatorWindowName);
        oChat.ChatInProcess = false;
        oChat.WaitingAgent = false;
        RemoveSession('sessionid');
    }
}

// This is the callback function that processes  the complex type returned by the Web service.
function SucceededCallback(result, userContext, methodName) {
    logMessage('Ajax.' + methodName + '("' + userContext + '") -> ');
    var oChat = getChatObject();
    oChat.Connected = true;
    CloseStatusWindow(oChat.Consts.wndUnableNetworkRequest);
    switch (methodName) {
        case ('SendMessageFast'):
            {
                result.Sender.DisplayName = oChat.myInfo.DisplayName;
                ProcessMessage(result);
                break;
            }
        case ('SendMessage'):
        case ('GetSessionInfo'):
            GetSessionInfo_SucceededCallback(result);
            break;
        case ('GetSessionValue'):
            {
                switch (userContext) {
                    case ('sessionid'):
                        {
                            if ((result == null) & (oChat.LoginInProcess == false)) {
                                oChat.LoginInProcess = true;
                                var _showEntrada = function() {
                                    var oWnd = openWindow('login', 'Entrada.aspx', 400, 300);
                                    oWnd.center();
                                    oWnd.set_Modal(true);
                                };
                                window.setTimeout(_showEntrada, 10);
                            }
                            if (result) {
                                oChat.SessionID = result;
                                oChat.LoginInProcess = false;
                                CheckSessionInfo();
                            }
                            break;
                        }
                    default:
                        {
                            var str = 'Ajax.' + methodName + '("' + userContext + '") -> ' + result;
                            _InvokeChatEvent("ALERT", ["ALERT", "SHOW", str]);
                            break;
                        }
                }
                break;
            }
        case ('SetSessionValue'):
            {
                switch (userContext) {
                    case ('sessionid'):
                        {
                            oChat.SessionID = result;
                            break;
                        }
                    default:
                        {
                            var str = 'Ajax.' + methodName + '("' + userContext + '") -> ' + result;
                            _InvokeChatEvent("ALERT", ["ALERT", "SHOW", str]);
                            break;
                        }
                }
                break;
            }
        case ('FreeSession'):
            {
                oChat.ChatInProcess = false;
                oChat.WaitingAgent = false;
                clearTimeout(oChat.timeoutMessages);
                clearTimeout(oChat.timeoutSessionState);
                logMessage('Seção encerrada: ' + oChat.SessionID, true);
                ShowStatusWindow(oChat.Consts.wndSecaoFinalizada, '<b>Seção finalizada</b>');
                break;
            }
        case ('RemoveSession'):
            {
                logMessage('Seção removida da memória: ' + result);
                break;
            }
        default:
            {
                logMessage('Switch(Ajax.' + methodName + '("' + userContext + '")) -> case default', true);
                break;
            }
    }
}

// Callback function invoked on failure of the Web service methods.
function FailedCallback(error, userContext, methodName) {
    var stackTrace = error.get_stackTrace();
    var message = error.get_message();
    var statusCode = error.get_statusCode();
    var exceptionType = error.get_exceptionType();
    var timedout = error.get_timedOut();
    var oChat = getChatObject();

    // Quando dá algum erro, limpo o objeto do WebService para que um novo seja criado quando necessário.
    oChat.defaultService = null;

    switch (methodName) {
        case ('GetNewMessage'):
        case ('GetNewMessages'):
        case ('GetSessionInfo'):
            {
                if (timedout == false) {
                    // Unable to complete network request to host: chat.alterdata.com.br
                    var _str = '<b>A conexão com o servidor foi interrompida...</b><br>';
                    _str += 'Assim que a conexão for reestabelecida, o LiveCHAT habilitará suas funções...';
                    _str += '<br><br> Mensagem original de erro:';
                    _str += '<font face="arial" color="red" size="1">';
                    _str += '<br><br>' + message;
                    _str += '<br><br>Caminho: ' + stackTrace;
                    _str += '</font>';

                    oChat.Connected = false;
                    ShowStatusWindow(oChat.Consts.wndUnableNetworkRequest, _str);
                    _InvokeChatEvent("STATUSPROGRESS", ["STATUSPROGRESS", "VISIBLE", "A conexão com o servidor foi interrompida...", null]);
                }
                else {
                    oChat.readMessageTickCount = 0;
                    RestartTickCount('CheckSessionInfo');
                }
                break;
            }
        default:
            {
                // Display the error.    
                var RsltElem =
                "Stack Trace: " + stackTrace + "<br/>" +
                "Service Error: " + message + "<br/>" +
                "Status Code: " + statusCode + "<br/>" +
                "Exception Type: " + exceptionType + "<br/>" +
                "Timedout: " + timedout;

                if (error !== null) {
                    logMessage(RsltElem);
                }
            }
    }
}


if (typeof (Sys) !== "undefined") Sys.Application.notifyScriptLoaded();
