﻿// Data: Maio de 2007
// Programador: ERICK ALMEIDA (ephillipe@gmail.com)
// Objetivo: Sistema de atendimento online.
// 
// Revisões:
// Data     Histórico
//------    ------------
// Nov/2007 Tentando corrigir problema de perda de conexão com o servidor. Algumas vezes, a interface para de se
//          comunicar com o servidor, causando a desconexão remota da seção. - ERICK@DSN
//
//
//
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 = 0;
            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.chatStateSession = -1;
            oChat.Connected = true;
            oChat.TimerInterval = 1000;
            oChat.waitMessageString = "";
            oChat.Consts = {};
            oChat.Consts.waitingOperatorWindowName = "waitingOperatorWindow";
            oChat.Consts.wndSecaoFinalizada = "SecaoFinalizadaWindowName";
        }
        return oChat;
    }
    else
    {
        alert('Chat WIN não encotrado!')
        return null;
    }
}

function getService(useDefault)
{
    var _service;
    if (useDefault == true)
    {
        if (getChatObject().defaultService == null)
            getChatObject().defaultService = new LiveCHAT.Services.SessionController();
        _service = getChatObject().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()
{
    CheckSessionInfo(100);    
}

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 Disconnect(sessionID)
{    
    logMessage('Disconnect('+sessionID+')');
    var sID = 0;
    if (sessionID != null)
      sID = sessionID;
    else sID = getChatObject().SessionID;      
    var chatSession = getService();
    chatSession.FreeSession(sID);    
}

function GetSessionState_SucceededCallback(sessionState)
{    
    logMessage('GetSessionState_SucceededCallback('+sessionState+')');
    if (sessionState != null) {
        getChatObject().chatStateSession = sessionState;
        switch (sessionState) {
            case (0): // Aguardando atendimento
                {
                    ShowStatusWindow(getChatObject().Consts.waitingOperatorWindowName, '<b>Aguardando atendimento pelo operador</b>');
                    getChatObject().readStateTickCount = 0;
                    getChatObject().ChatInProcess = false;
                    getChatObject().waitingAgent = true;
                    break;
                }
            case (1): // Em progresso
                {
                    if (getChatObject().ChatInProcess == false) {
                        getChatObject().ChatInProcess = true;
                        getChatObject().waitingAgent = false;
                        var str = '<b>Bem vindo, você foi atendido</b><br><br>' +
                              'Aguarde alguns instantes que estou configurando sua seção de atendimento';
                        UpdateStatusWindow(getChatObject().Consts.waitingOperatorWindowName, str);
                        CloseStatusWindow(getChatObject().Consts.waitingOperatorWindowName);
                    }
                    getChatObject().waitMessageString = "";
                    getChatObject().readStateTickCount = 0;
                    break;
                }
            case (10): // Encerrado
            case (11):
            case (12):
            case (13):
                {
                    getChatObject().ChatInProcess = false;
                    getChatObject().waitingAgent = false;
                    RemoveSession('sessionid');
                    clearTimeout(getChatObject().timeoutMessages);
                    clearTimeout(getChatObject().timeoutSessionState);
                    clearTimeout(getChatObject().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(getChatObject().Consts.wndSecaoFinalizada, str);
                    break;
                }
            default:
                {
                    CheckSessionInfo();
                    break;
                }
        }
    }
    else {
        getChatObject().ChatInProcess = false;
        getChatObject().waitingAgent = false;
        RemoveSession('sessionid');
    }
}

function VerifySessionWaitPosition(waitingPosition)
{    
    if (waitingPosition != null)
    {
        if (getChatObject().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: '+getChatObject().dptoName+'<br><br>'+
                      strPos;
            if (getChatObject().waitMessageString != str)
            {
                getChatObject().waitMessageString = str;
                UpdateStatusWindow(getChatObject().Consts.waitingOperatorWindowName, str);
            }
        }
    }
}

function CheckSessionInfo(timerInterval)
{    
    var _tickname = 'CheckSessionInfo';
    if (CheckTickCount(_tickname) == true)
    {        
        _InvokeChatEvent("STATUSPROGRESS",["STATUSPROGRESS","VISIBLE","",null]);
        if (!getChatObject().loginClosed)
        {
            getChatObject().loginClosed = true;
            CloseStatusWindow('login');    
        }
        var _chatService = getService(true);
        var _sessionID = getChatObject().SessionID;
        var _lastMessageTime = GetLastMessageTime();
        _chatService.GetSessionInfo(_sessionID, _lastMessageTime);        
    }
    else
    {
        var _tickCount = GetTickCount(_tickname);
        logMessage('CheckSessionInfo.TickCount('+_tickCount+')');
        if (_tickCount >= 2)
        {
            var _msgLog = 'Aguardando informações do servidor. '+_tickCount+' segundos... ';
            _InvokeChatEvent("STATUSPROGRESS",["STATUSPROGRESS","VISIBLE",_msgLog,null]);
        }
    }
    var _interval = getChatObject().TimerInterval;
    if (timerInterval)
        _interval = timerInterval;
    clearTimeout(getChatObject().timeoutSessionInfo);
    getChatObject().timeoutSessionInfo = setTimeout('CheckSessionInfo()', _interval);
}

function GetSessionInfo_SucceededCallback(sessionInfo)
{    
    RestartTickCount('CheckSessionInfo');
    if (sessionInfo != null)
    {        
        GetSessionState_SucceededCallback(sessionInfo.SessionState);
        if (getChatObject().ChatInProcess == false)
            VerifySessionWaitPosition(sessionInfo.WaintingPosition)
        else
        {
            ProcessMessageList(sessionInfo.NewMessages);
        }
    }
}

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;
}

// This is the callback function that processes  the complex type returned by the Web service.
function SucceededCallback(result, userContext, methodName)
{     
    logMessage('Ajax.'+methodName+'("'+userContext+'") -> ');            
    
    getChatObject().Connected = true;
    CloseStatusWindow('unableNetworkRequest');
    
    switch(methodName)
    {        
        case ('SendMessageFast'):
        {
            result.Sender.DisplayName = getChatObject().myInfo.DisplayName;
            ProcessMessage(result);
            break;
        }        
        case ('SendMessage'):
        case ('GetSessionInfo'):
            GetSessionInfo_SucceededCallback(result);
            break;
        case ('GetSessionValue'):
        {      
            switch(userContext)
            {
                case ('sessionid'):
                {                    
                    if ((result == null) & (getChatObject().LoginInProcess == false))
                    {
                        getChatObject().LoginInProcess = true;                        
                        var _showEntrada = function()
	                        {
	                            var oWnd = openWindow('login', 'Entrada.aspx', 400, 300);
	                            oWnd.center();
                                oWnd.set_Modal(true);
	                        };
	                    window.setTimeout(_showEntrada, 500);                        
                    }
                    if (result)
                    {
                        getChatObject().SessionID = result;
                        getChatObject().LoginInProcess = false;                        
                        CheckSessionInfo();
                    }
                    break;
                }         
                default:
                {
                    var str = 'Ajax.'+methodName+'("'+userContext+'") -> ' + result;                    
                    _InvokeChatEvent("ALERT",["ALERT","SHOW",str]);
                    break;
                }   
            }                  
            break;
        }
        case ('SetSessionValue'):
        {      
            switch(userContext)
            {
                case ('sessionid'):
                {                    
                    getChatObject().SessionID = result;                        
                    break;
                }         
                default:
                {
                    var str = 'Ajax.'+methodName+'("'+userContext+'") -> ' + result;                    
                    _InvokeChatEvent("ALERT",["ALERT","SHOW",str]);
                    break;
                }   
            }                  
            break;
        }
        case ('FreeSession'):
        {            
            getChatObject().ChatInProcess = false;
            getChatObject().waitingAgent = false;
            clearTimeout(getChatObject().timeoutMessages);
            clearTimeout(getChatObject().timeoutSessionState);                        
            logMessage('Seção encerrada: '+getChatObject().SessionID, true);
            ShowStatusWindow(getChatObject().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();
 
    // Quando dá algum erro, limpo o objeto do WebService para que um novo seja criado quando necessário.
    getChatObject().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>';
                                
                getChatObject().Connected = false;
                ShowStatusWindow('unableNetworkRequest', _str);
                _InvokeChatEvent("STATUSPROGRESS",["STATUSPROGRESS","VISIBLE","A conexão com o servidor foi interrompida...",null]);
            }
            else
            {
                getChatObject().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();