﻿/*  ------------ FILE VERSION CONTROL --------------
    Latest time stamp should be placed on top
    
    26 Nov 2010: Fix for ZTrack 33519
*/
function ctlChat() 
{
    var This = this;
    var Container;
    //var connectingDiv;
    
    var closeWindowImg;
    
    var chatMessageListDiv;
    var messageListTable;

    // Tool bar buttons
    //var copyTranscriptToClipboardButton;
    var saveTranscriptButton;
    
    var leaveChatButton;
    // ----------------
    
    var sendMessageTextArea;
    var sendImg;
    
    var messageBarText;

    var chatRefreshWarning;
    
    var currentUserName;    
    var isCurrentUserTyping = false;
    var currentClearTypingFlagID = null;

    this.Init = function(cont) {
        Container = cont;
        This.Container = Container;

        if (CURRENT_QUEUE_NAME != null && CURRENT_QUEUE_NAME != '') {
            /*closeWindowImg = getChildById(Container, 'closeWindowImg');
            if (closeWindowImg != null)
            { 
            closeWindowImg.src = 'Images/close-window-blue-button-dark.png';
            closeWindowImg.title = 'Click to close the window';
            closeWindowImg.onclick = CloseWindow;
            }*/

            chatMessageListDiv = getChildById(Container, 'chatMessageListDiv');
            messageListTable = getChildById(Container, 'messageListTable');
            //messageListTable.cellPadding = '0';
            messageListTable.cellSpacing = '0';

            /*copyTranscriptToClipboardButton = getChildById(Container, 'copyTranscriptToClipboardButton');
            if (copyTranscriptToClipboardButton != null) 
            {
            copyTranscriptToClipboardButton.src = 'Images/Copy.png';
            copyTranscriptToClipboardButton.onclick = OnCopyTranscriptToClipBoard;
            copyTranscriptToClipboardButton.style.cursor = 'pointer';
            copyTranscriptToClipboardButton.title = 'Copy transcript to clipboard';
            }*/

            saveTranscriptButton = getChildById(Container, 'saveTranscriptButton');
            if (saveTranscriptButton != null) {
                saveTranscriptButton.src = 'Images/emailTranscriptDark.png';
                //saveTranscriptButton.onmouseover = OnSaveTranscriptImgMouseOver;
                //saveTranscriptButton.onmouseout = OnSaveTranscriptImgMouseOut;

                saveTranscriptButton.onclick = EmailChatTranscript;
                saveTranscriptButton.style.cursor = 'pointer';
                saveTranscriptButton.title = 'Email transcript';

            }

            leaveChatButton = getChildById(Container, 'leaveChatButton');
            if (leaveChatButton != null) {
                leaveChatButton.onclick = OnLeaveChat;
            }

            sendMessageTextArea = getChildById(Container, 'sendMessageTextArea');
            sendMessageTextArea.onkeypress = OnSendMessageKeyPress;
            sendImg = getChildById(Container, 'sendImg');
            sendImg.onclick = SendMessage;

            messageBarText = getChildById(Container, 'messageBarText');

            LoadQueueInfo();
            DisableControls();
            EnableLeaveChatButton();
            DisableSaveTranscript();
            EnableSendMessageTextArea();
            InternalAddChatMessageToList('', MSG("WC_WAIT"), true, false, false);

            chatRefreshWarning = getChildById(Container, 'chatRefreshWarning');
            chatRefreshWarning.innerHTML = MSG("WC_REFRESH");
        }
        else removeAllChildren(Container);
    };

    this.AddChatMessageToList = function(userName, message, isSystemMessage, isAgentMessage) {
        InternalAddChatMessageToList(userName, message, isSystemMessage, false, isAgentMessage);
    };

    this.AddChatURLMessageToList = function (userName, message, isAgentMessage) {
        InternalAddChatMessageToList(userName, message, false, true, isAgentMessage);
    };

    this.SetFooterText = function(text) {
        messageBarText.innerHTML = text;
    };

    this.SetConnected = function(agentName) {
        // enable all fields
        EnableControls();
        // set connected footer message
        InternalAddChatMessageToList('', MSG("WC_CONOK", {NAME:agentName}), true, false, false);
    };

    this.SetDisconnected = function() {
        InternalAddChatMessageToList('', MSG("WC_END"), true, false, false);
        DisableControls();
        EnableSaveTranscript();
        DisconnectApplication();
    };

    function LoadQueueInfo() 
    {
        // Check if the requested Queue is available at the moment
        var queues = GetOfficesArrayFromConfig();
        if (queues != null && queues.length > 0) 
        {
            var queueFound = false;
            for (idx = 0; idx < queues.length; idx++) 
            {
                if (CURRENT_QUEUE_NAME == queues[idx].GetKey()) 
                {
                    queueFound = true;
                    PostHttpResponse(ROOT + "Chat.asmx/GetChatQueueByAddress", "WebServiceLocation=" + queues[idx].GetValue() + "&queueAddress=" + queues[idx].GetKey(), LoadQueuesMenuResponse, LoadQueuesMenuError);
                    break;
                }
            }

            if (!queueFound)
            {
                Container.innerHTML = MSG("WC_QNF",{QUEUE_NAME:CURRENT_QUEUE_NAME});
            }
        }
        else alert(MSG("WC_ERR01"));
    }

    function LoadQueuesMenuResponse(json) 
    {
        if (json != null && json.Queue != null) 
        {
            if (json.Queue.length > 0) {
                var queueItem = json.Queue[0];
                CURRENT_WS = GetWebServiceLocation(queueItem.sADDRESS);
                CURRENT_QUEUE_ID = queueItem.sADDRESS;
                setTimeout(function() { EnableChatDetails(queueItem.IsQueueClosed); }, 1000);
            }
            else 
            {
                Container.innerHTML = MSG("WC_QND",{QUEUE_NAME:CURRENT_QUEUE_NAME});
            }
        }
        else
        {
            removeAllChildren(Container);
            Container.innerHTML = MSG("WC_NOCON");
        }
    }

    function LoadQueuesMenuError(err) 
    {
        Container.innerHTML = MSG(err);
    }
    
    function EnableChatDetails(isQueueClosed)
    {
        // expand the chat main page and calls the InitiateChat method afterwards
    
        //connectingDiv.style.display = 'none';
        //$('#chatMenuDetailsDiv').toggle(400);
        //var options = { to: {width: 280,height: 185} };
        $('#chatBodyDiv').show('fold', '', 'slow', function() { OnDetailsShowFinished(isQueueClosed); });
        //$('#chatMenuDetailsDiv').toggle(200);
    }

    function OnDetailsShowFinished(isQueueClosed) 
    {
        // Makes a new chat call
    
        PostHttpResponse(ROOT + "Chat.asmx/InitiateChat", "UserSessionID=" + "&Address=" + "&DestAddress=" + CURRENT_QUEUE_ID + 
        "&CallerId=" + CURRENT_USER_EMAIL + "&CallerName=" + CURRENT_USER_NAME + "&NameId=" + "&GreetingMessage=" + "&MessageFormat=3" + 
        "&MessageTransport=CHAT", OnChatInitiateResponse, OnChatInitiateError);
    }

    function OnChatInitiateResponse(json)
    { 
        if (json != null) 
        {
            CURRENT_PBX_REF = json.PBXReference;
            CURRENT_USER_SESSION = json.UserSessionID;
            //AddChatTrackerPushFilter(CURRENT_USER_SESSION, CURRENT_PBX_REF);
            
            // Start listening for server updates. (data pooling loop)
            CheckForUpdates();
        }
    }

    function OnChatInitiateError(err) 
    {
        AbortApplicationError(err);
    }

    function OnSendMessageKeyPress(e)
    {
        if (!e)
            e = window.event;
        
        //PM: disable enter key when there is no one to send the message to.
        if (sendImg.disabled) {
            chatPage.SetFooterText(MSG("WC_RPW"));
            if (e.keyCode == 13)
                return true;
        }

        if (sendMessageTextArea.value.length >= 1023)
        {
            alert(MSG("WC_TLIM"));
            e.returnValue = false;
            e.cancel = true;
            return false;
        }

        if (e.keyCode == 13) 
        {
            var spacesOnly = IsEmptyString(sendMessageTextArea.value);
            if (!spacesOnly)
                SendMessage();
                
            e.returnValue = false;
            e.cancel = true;
            //e.preventDefault(); 
            return false;
        }
        else
        {
            // send user is typing message
            if (sendMessageTextArea != null && isCurrentUserTyping == false && CURRENT_PBX_REF != 0)
            {
                isCurrentUserTyping = true;
                clearTimeout(currentClearTypingFlagID);
                currentClearTypingFlagID = setTimeout(ClearTypingIndicator,7000);
            
                PostHttpResponse(ROOT + "Chat.asmx/SendTypingIndication", "UserSessionID=" + CURRENT_USER_SESSION +
                "&ChatUserSessionID=" + CURRENT_USER_SESSION + "&CallerName=" + CURRENT_USER_NAME +
                "&PbxReference=" + CURRENT_PBX_REF, OnSendTypingIndicatorMessageResponse, OnSendTypingIndicatorMessageError);
            }
        }
    }

    function OnSendTypingIndicatorMessageResponse(json)
    {
    }

    function OnSendTypingIndicatorMessageError(err)
    {
        AbortApplicationError(err);
    }
    
    function OnSendMessageKeyUp(e)
    {
        if (!e)
            e = window.event;
            
        if (e.keyCode != 13) 
        {
            if (sendMessageTextArea != null && sendMessageTextArea.value == '')
            {
                // When user deletes the last character of the textarea  
                ClearTypingIndicator();
            }
        }
    }
    
    function ClearTypingIndicator()
    {
        if (CURRENT_PBX_REF != 0)
        {
            isCurrentUserTyping = false;
            PostHttpResponse(ROOT + "Chat.asmx/ClearTypingIndication", "UserSessionID=" + CURRENT_USER_SESSION +
                        "&ChatUserSessionID=" + CURRENT_USER_SESSION + "&CallerName=" + CURRENT_USER_NAME +
                        "&PbxReference=" + CURRENT_PBX_REF, OnClearTypingIndicatorMessageResponse, OnClearTypingIndicatorMessageError);
        }
    }
    
    function OnClearTypingIndicatorMessageResponse(json)
    {
    }
    
    function OnClearTypingIndicatorMessageError(err)
    {
        AbortApplicationError(err);
    }

    function SendMessage() {
        if (sendMessageTextArea != null && sendMessageTextArea.value != null && !sendImg.disabled) 
        {
            if (sendMessageTextArea.value != '' && sendMessageTextArea.value.length > 0 && sendMessageTextArea.value != '\r\n') 
            {
                var messageFormat = 3;
                /*if (IsUrl(sendMessageTextArea.value))
                    messageFormat = 2;*/

                var message = escape(sendMessageTextArea.value);
                
                isCurrentUserTyping = false;
                clearTimeout(currentClearTypingFlagID);
                
                PostHttpResponse(ROOT + "Chat.asmx/SendMessage", "UserSessionID=" + CURRENT_USER_SESSION +
                "&ChatUserSessionID=" + CURRENT_USER_SESSION + "&Address=" + "&NameId=" + "&CallerName=" + CURRENT_USER_NAME +
                "&PbxReference=" + CURRENT_PBX_REF + "&Message=" + message + "&MessageFormat=" + messageFormat, OnSendMessageResponse, OnSendMessageError);

                /* ZTrack 33519: fix for web chat user cannot see his own messages in the message window.*/
                InternalAddChatMessageToList(CURRENT_USER_NAME, sendMessageTextArea.value, false, IsUrl(sendMessageTextArea.value), false);
                /* ZTrack 33519: end*/
            }
            else
            {
                sendMessageTextArea.value = '';
                sendMessageTextArea.focus(); 
            }
        }
    }

    function OnSendMessageResponse(json) 
    {
        if (json != null && json.SentMessageDetails != null && json.SentMessageDetails.Status.toLowerCase() == 'success')
        {
            if (sendMessageTextArea != null) 
            {
                sendMessageTextArea.value = '';
                sendMessageTextArea.focus();
            }
        }
    }

    function OnSendMessageError(err) 
    { 
        AbortApplicationError(err);
    }
    
    function InternalAddChatMessageToList(userName, message, isSystemMessage, isURL, isAgentMessage) 
    {
        if (chatMessageListDiv != null && messageListTable != null) {

            if (isAgentMessage && userName == CURRENT_USER_NAME) {
                userName = userName + MSG("WC_AGENT");
            }

            isSystemMessage = isSystemMessage != null && isSystemMessage == true;

            var chatRow = messageListTable.insertRow(-1);
            if (userName == CURRENT_USER_NAME) {
                chatRow.className = 'myRowStyle';
            }
            else
                ClearFooterText();
                
            var chatCell = chatRow.insertCell(-1);

            var userNameText = document.createElement('span');
            var messageText = document.createElement('span');

            if (isSystemMessage == true) 
            {
                userNameText.className = 'systemUserNameMessageTextStyle';
                messageText.className = 'systemMessageTextStyle';
            }
            else 
            {
                userNameText.className = 'userNameMessageTextStyle';
                messageText.className = 'messageTextStyle';
            }

            if (userName != null && userName != '' && isSystemMessage == false)
            {
                if (userName != currentUserName)
                {
                    currentUserName = userName;                   
                    userNameText.innerHTML = userName + ": ";
                }
                else
                    userNameText.className = 'userNameMessageMargingTextStyle';
            }

            if (isURL)
            {
                var urlText = message
                if (urlText.indexOf('http', 0) != 0 && urlText.indexOf('https', 0) != 0 && urlText.indexOf('ftp', 0) != 0)
                    urlText = 'http://' + urlText;
                messageText.innerHTML = "<span class='systemMessageTextStyle'>(" + MSG("WC_URL") + ") </span>";
                messageText.innerHTML += "<a href='" + urlText + "' target='_blank'>" + message + "</a>";
            }
            else
            {
                messageText.innerHTML = message;
            }

            chatCell.appendChild(userNameText);
            chatCell.appendChild(messageText);
            
            // Add CurrentTime
            var timeChatCell = chatRow.insertCell(-1);
            timeChatCell.id = 'timeChatCell';
            timeChatCell.className = 'messageDateTimeStyle';
            var dateNow = new Date();
            var dateNowText = document.createElement('span');
            dateNowText.innerHTML = dateNow.toLocaleTimeString();
            timeChatCell.appendChild(dateNowText);
            // ---------------
                        
            chatMessageListDiv.scrollTop = chatMessageListDiv.scrollHeight;

            if (isURL)
            {
                if (userName != CURRENT_USER_NAME) //this opens up a new window if URL is passed by the web chat user which is not needed
                {
                    var confirmBox = confirm(MSG("WC_URLCONFIRM", {URL:message}));
                    if (confirmBox == true)
                    {
                        OpenNewURL(message);
                    }
                }
            }
        }
    }
  
    function ClearFooterText()
    {
        messageBarText.innerHTML = '';
    }

    function EnableControls()
    {
        if (sendMessageTextArea != null && sendImg != null)
        {
            EnableLeaveChatButton();
            EnableSendMessageTextArea();
            sendMessageTextArea.onkeypress = OnSendMessageKeyPress;
            sendMessageTextArea.onkeyup = OnSendMessageKeyUp;

            sendImg.src = 'Images/send-blue-button-dark.png';
            sendImg.style.cursor = 'pointer';
            sendImg.title = 'Send message';
            sendImg.onmouseover = OnSendImgMouseOver;
            sendImg.onmouseout = OnSendImgMouseOut;
            sendImg.disabled = false;

            sendMessageTextArea.focus();
        }
    }
    
    function DisableControls()
    {
        if (sendMessageTextArea != null && sendImg != null)
        {
            sendMessageTextArea.className = 'controlDisabled';
            sendMessageTextArea.readOnly = true;
            
            sendImg.src = 'Images/send-gray-button.png';
            sendImg.style.cursor = 'default';
            sendImg.title = '';
            sendImg.onmouseover = '';
            sendImg.onmouseout = '';
            sendImg.disabled = true;
        }
    }

    function EnableLeaveChatButton()
    {
        leaveChatButton.src = 'Images/endChat-red-button-light.png';
        leaveChatButton.style.cursor = 'pointer';
        leaveChatButton.title = 'Leave chat conversation';
        leaveChatButton.onmouseover = OnLeaveChatImgMouseOver;
        leaveChatButton.onmouseout = OnLeaveChatImgMouseOut;
        leaveChatButton.disabled = false;        
    }
    
    function DisableLeaveChatButton()
    {
        leaveChatButton.src = 'Images/endChat-gray-button.png';
        leaveChatButton.style.cursor = 'default';
        leaveChatButton.title = '';
        leaveChatButton.onmouseover = '';
        leaveChatButton.onmouseout = '';
        leaveChatButton.disabled = true;
    }

    function DisableSaveTranscript() {
        saveTranscriptButton.src = 'Images/emailTranscriptDark.png';
        saveTranscriptButton.style.cursor = 'default';
        saveTranscriptButton.title = 'Email a copy of the transcript once conversation has ended.';
        saveTranscriptButton.onmouseover = '';
        saveTranscriptButton.onmouseout = '';
        saveTranscriptButton.disabled = true;
    }

    function EnableSaveTranscript() {
        saveTranscriptButton.src = 'Images/emailTranscriptBlue.png';
        saveTranscriptButton.style.cursor = 'pointer';
        saveTranscriptButton.title = 'Email the transcript';
        saveTranscriptButton.onmouseover = OnSaveTranscriptImgMouseOver;;
        saveTranscriptButton.onmouseout = OnSaveTranscriptImgMouseOut;
        saveTranscriptButton.disabled = false;
    }


    
    function EnableSendMessageTextArea()
    {
        if (sendMessageTextArea != null)
        {
            sendMessageTextArea.className = 'controlEnabled';
            sendMessageTextArea.readOnly = false;
        }
    }
    
    function OnSendImgMouseOver()
    {
        sendImg.src = 'Images/send-blue-button-light.png';
    }
    function OnSendImgMouseOut()
    {
        sendImg.src = 'Images/send-blue-button-dark.png';
    }

    function OnLeaveChatImgMouseOver()
    {
        leaveChatButton.src = 'Images/endChat-red-button.png';
    }
    function OnLeaveChatImgMouseOut()
    {
        leaveChatButton.src = 'Images/endChat-red-button-light.png';
    }
    
    function OnSaveTranscriptImgMouseOver()
    {
        saveTranscriptButton.src = 'Images/emailTranscriptLight.png';
    }
    function OnSaveTranscriptImgMouseOut()
    {
        saveTranscriptButton.src = 'Images/emailTranscriptBlue.png';
    }

    function OnLeaveChat()
    {
        if (!leaveChatButton.disabled) {
            //PM: Stop further updates as we aren't interested anymore            
            DeleteDataPushFilter('SSFWebChatTracker');
                        
            PostHttpResponse(ROOT + "Chat.asmx/ExitChatSession", "UserSessionID=" + CURRENT_USER_SESSION + "&PbxReference=" + CURRENT_PBX_REF + "&Address=",
                         OnLeaveChatCallBack, OnLeaveChatError);
            DisableLeaveChatButton();
        }
        else
            return false;
    }
  
    function OnLeaveChatCallBack(json)
    {
        if (json != null && json.Result == "OK")
        {
            //ClearMessagesList();
            chatPage.SetDisconnected();     //PM: this calls DisconnectApplication() as well as sets end chat text.
            //$('#chatBodyDiv').hide('fold', '', 'slow', OnDetailsHideFinished);
        }
    }

    function DisconnectApplication() 
    {
        chatMessageListDiv.focus();
        ClearFooterText();
        DisableControls();
        DisableLeaveChatButton();
        EnableSaveTranscript();
        CURRENT_PBX_REF = 0;
        sendMessageTextArea.onkeypress = null;
        sendMessageTextArea.onkeyup = null;
        DeleteDataPushFilter('SSFWebChatTracker');
    }

    function OnLeaveChatError(err) 
    {
        AbortApplicationError(err);
    }
    
    function OnDetailsHideFinished()
    { 
    }
    
    function ClearMessagesList()
    {
        while (messageListTable.rows.length > 0) 
        {
            messageListTable.deleteRow(messageListTable.rows.length - 1);
        }
    }

    function OnCopyTranscriptToClipBoard() 
    {
        CopyToClipboard(GetChatTranscript());
    }

    function GetChatTranscript() 
    {
        CANCEL_BEFORE_UNLOAD = true;
        
        var chatText = '';
        for (index = 0; index < messageListTable.rows.length; index++) 
        {
            if (messageListTable.rows[index].cells.length == 2)
            {
                if (messageListTable.rows[index].cells[0].textContent && messageListTable.rows[index].cells[1].textContent)
                {
                    chatText += messageListTable.rows[index].cells[1].textContent + ' ' + messageListTable.rows[index].cells[0].textContent + '\r\n';
                }
                else
                {
                    chatText += messageListTable.rows[index].cells[1].innerText + ' ' + messageListTable.rows[index].cells[0].innerText + '\r\n';
                }
            }
        }
        return chatText;
    }

    function EmailChatTranscript() 
    {
        if (!saveTranscriptButton.disabled) {
            var chatText = GetChatTranscript();
            if (chatText != null && chatText != '') {
                PostHttpResponse(ROOT + "Chat.asmx/EmailTranscript", "UserSessionID=" + CURRENT_USER_SESSION +
            "&ToEmail=" + CURRENT_USER_EMAIL + "&Message=" + chatText, OnEmailChatTranscriptCallBack, OnEmailChatTranscriptError);
                DisableSaveTranscript();
            }
        }
        else
            return false; 
    }

    function OnEmailChatTranscriptCallBack(json) 
    {        
        if (json != null && json.EmailSuccessful != null)
        {
            if (json.EmailSuccessful == "0") 
            {
                DisableSaveTranscript();
                InternalAddChatMessageToList('', "Transcript was successfully emailed to: " + CURRENT_USER_EMAIL, true, false, false);
            }
            else
            {
                EnableSaveTranscript();
                InternalAddChatMessageToList('', "We are having technical issues with the email transcript feature. Please try again later.", true, false, false);
            }
        }
    }

    function OnEmailChatTranscriptError(err) 
    {
    }
}



