﻿// chat handler for chat request page
function chatHandler(requestorId, chatId, displayName, updateInterval, serviceUrl, requestTimeout, ajaxPanelId) {
    var i = this;

    // fields
    var _requestorId, _chatId, _displayName, _updateInterval, _serviceUrl, _lastTyping, _ajaxPanelId, _cancelRequestStatus = false, _cancelRequestTimeout = false, _requestTimeout = 0, _requestCounter = 0;

    // request objects
    var _rTyping, _rSendChat, _rEndChat, _rSendEmail, _rSendSms, _rGetChat, _rStatus;

    // constants
    var _serviceMethodSetTyping = "/SetRequestorTyping", _serviceMethodTyping = "/GetUserTyping", _serviceMethodSendMessage = "/SendRequestorChatMessage", _serviceMethodEndChat = "/EndRequestorChat", _serviceMethodSendEmail = "/SendRequestEmail", _serviceMethodSendSms = "/SendRequestSms", _serviceMethodSendMSms = "/SendMessageSms", _serviceMethodSendMEmail = "/SendMessageEmail", _serviceMethodChatCheck = "/CheckForRequestorChatMessages", _serviceMethodRequest = "/CheckRequestStatus", _statusOk = 200, _stateComplete = 4;

    // initialize our fields from passed-in values
    function initVars(requestorId, chatId, displayName, updateInterval, serviceUrl, requestTimeout, ajaxPanelId) {
        _requestorId = requestorId;
        _chatId = chatId;
        _displayName = displayName;
        _updateInterval = updateInterval;
        _serviceUrl = serviceUrl;
        _requestTimeout = requestTimeout;
        _lastTyping = new Date();
        _ajaxPanelId = ajaxPanelId;
    };

    // updates our chat history div with incoming chat text
    function updateChatHistory(chatText) {
        var historyDiv = document.getElementById('divChatHistory');
        if (historyDiv) {
            var text = historyDiv.innerHTML;
            text += chatText;
            historyDiv.innerHTML = text;
            historyDiv.scrollTop = historyDiv.scrollHeight;
        }
        var textBox = document.getElementById('txtChatText');
        if (textBox) {
            textBox.focus();
        }
    };

    // web service callback handler for typing message
    function onReadyStateChangeTyping() {
        if (_rTyping.readyState == _stateComplete && _rTyping.status == _statusOk) {
            var message = "";
            var response = eval("(" + _rTyping.responseText + ")");
            if (response.d) {
                message = _displayName + " is typing";
            }
            var divTyping = document.getElementById("divTyping");
            if (divTyping) {
                divTyping.innerHTML = message;
            }
        }
    };

    // callback handler for getChatMessages
    function onReadyStateChangeChat() {
        if (_rGetChat.readyState == _stateComplete && _rGetChat.status == _statusOk) {
            var response = eval("(" + _rGetChat.responseText + ")");
            if (response.d.length > 0) {
                updateChatHistory(response.d);
            }
        }
    };

    // cross browser compatible HTTP request object
    function getHttpRequestObject() {
        var request = false;
        if (typeof XMLHttpRequest != "undefined") {
            request = new XMLHttpRequest();
        } else if (typeof ActiveXObject != "undefined") {
            try {
                request = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (err) {
                try {
                    request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (err2) { }
            }
        } return request;
    };

    // call web service to check if other user is currently typing
    function getTypingState() {
        setTimeout(getTypingState, _updateInterval);
        // div only visible during chat
        var divTyping = document.getElementById("divTyping");
        if (divTyping) {
            var url = _serviceUrl + _serviceMethodTyping;
            var parameters = '{"chatId":"' + _chatId + '"}';
            _rTyping = getHttpRequestObject();
            if (_rTyping) {
                _rTyping.onreadystatechange = onReadyStateChangeTyping;
                _rTyping.open("POST", url, true);
                _rTyping.setRequestHeader('Content-Type', 'application/json');
                _rTyping.send(parameters);
            }
        }
    };

    // trims ends of passed string
    function trim(stringToTrim) {
        return stringToTrim.replace(/^\s+|\s+$/g, "");
    };

    // HTML escapes passed string to prevent formatting issues
    function escapeHTML(str) {
        var div = document.createElement('div');
        var text = document.createTextNode(str);
        div.appendChild(text);
        return div.innerHTML;
    };

    // calls web service to send chat message
    i.sendMessage = function() {
        var textBox = document.getElementById("txtChatText");
        if (textBox) {
            var chatText = trim(textBox.value);
            textBox.value = "";
            if (chatText.length > 0) {
                _rSendChat = getHttpRequestObject();
                if (_rSendChat) {
                    var url = _serviceUrl + _serviceMethodSendMessage;
                    var parameters = '{"requestorUid":"' + _requestorId + '", "chatId":"' + _chatId + '", "chatText":"' + chatText + '"}';
                    _rSendChat.open("POST", url, true);
                    _rSendChat.setRequestHeader('Content-Type', 'application/json');
                    _rSendChat.send(parameters);
                }
                chatText = "<div class='chatTextSent'><b>Me: </b>" + escapeHTML(chatText) + "</div>";
                updateChatHistory(chatText);
            }
        }
    };

    // calls web service to get any new chat messages
    function getChatMessages() {
        setTimeout(getChatMessages, _updateInterval);
        var url = _serviceUrl + _serviceMethodChatCheck;
        var parameters = '{"requestorUid":"' + _requestorId + '", "chatId":"' + _chatId + '", "userName":"' + _displayName + '"}';
        _rGetChat = getHttpRequestObject();
        if (_rGetChat) {
            _rGetChat.onreadystatechange = onReadyStateChangeChat;
            _rGetChat.open("POST", url, true);
            _rGetChat.setRequestHeader('Content-Type', 'application/json');
            _rGetChat.send(parameters);
        }
    };

    // ajax update with status back to server
    function updateStatus(status) {
        var ajaxPanel = $find(_ajaxPanelId);
        ajaxPanel.ajaxRequest(status);
    };

    // callback function for request status check
    function onReadyStateChangeStatus() {
        if (_rStatus.readyState == _stateComplete && _rStatus.status == _statusOk) {
            var response = eval("(" + _rStatus.responseText + ")");
            if (response.d.length > 0) {
                // Pending
                // Accepted,
                // DeclinedByUser,
                switch (response.d) {
                    case "Accepted":
                        // turn off status checker
                        i.cancelCheckRequestStatus();
                        // turn off request timeout checker
                        i.cancelCheckRequestTimeout();
                        // trigger server update on ajax panel
                        updateStatus(response.d);
                        break;
                    case "Pending":
                        break;
                    case "DeclinedByUser":
                        break;
                    default:
                        break;
                }
            }
        }
    };

    // calls web service to check the status of a pending chat request
    function checkRequestStatus() {
        if (_cancelRequestStatus) {
            // flag cancels timer
            _cancelRequestStatus = false;
        }
        else {
            setTimeout(checkRequestStatus, _updateInterval);
            var url = _serviceUrl + _serviceMethodRequest;
            var parameters = '{"chatId":"' + _chatId + '"}';
            _rStatus = getHttpRequestObject();
            if (_rStatus) {
                _rStatus.onreadystatechange = onReadyStateChangeStatus;
                _rStatus.open("POST", url, true);
                _rStatus.setRequestHeader('Content-Type', 'application/json');
                _rStatus.send(parameters);
            }
        }
    };

    // request timeout countdown timer
    function checkRequestTimeout() {
        if (_cancelRequestTimeout) {
            // flag cancels timer
            _cancelRequestTimeout = false;
            _requestCounter = 0;
        }
        else {
            _requestCounter++;
            if (_requestCounter >= _requestTimeout) {
                _requestCounter = 0;
                updateStatus("TimedOut");
            }
            else {
                setTimeout(checkRequestTimeout, 1000);
                var timeLeft = _requestTimeout - _requestCounter;
                var divCounter = document.getElementById("divRequestCounter");
                if (divCounter) {
                    divCounter.innerHTML = timeLeft.toString();
                }
            }
        }
    };

    // call web service to update ChatConferneceAtendee.tTyping field
    function sendTypingMessage() {
        var send = okToSendTypingMessage();
        if (send) {
            var url=_serviceUrl+_serviceMethodSetTyping;
            var parameters = '{"chatId":"' + _chatId + '", "requestorId":"' + _requestorId + '"}';
            var requestSend = getHttpRequestObject();
            if (requestSend) {
                requestSend.open("POST", url, true);
                requestSend.setRequestHeader('Content-Type', 'application/json');
                requestSend.send(parameters);
            }
        }
    };

    // check to see if the specified interval has passed
    // to throttle the transmission of typing messages
    function okToSendTypingMessage() {
        var now = new Date();
        now.setSeconds(now.getSeconds() - _updateInterval/1000);
        if (now > _lastTyping) {
            lastTyping = new Date();
            return true;
        }
        return false;
    };

    // keypress handler on txtChatText
    i.sendMessageOnEnter=function(e) {
        if(window.event) {
            e=window.event;
            key=e.keyCode;
        }
        else {
            key=e.which;
        }
        if(key==13) {
            e.cancelBubble=true;
            e.returnValue=false;
            i.sendMessage();
            return false;
        }
        else {
            sendTypingMessage();
        }
    };

    // calls web service to end the current chat
    i.endChat=function() {
        var url=_serviceUrl+_serviceMethodEndChat;
        var parameters='{"userUid":"'+_requestorId+'", "chatId":"'+_chatId+'"}';
        _rEndChat=getHttpRequestObject();
        if(_rEndChat) {
            _rEndChat.open("POST",url,true);
            _rEndChat.setRequestHeader('Content-Type','application/json');
            _rEndChat.send(parameters);
        }
    };

    // send async email requesting chat
    i.sendRequestEmail=function(chatGuid,userName,emailAddress,keywords,requestorId,mobileNotifications,requestorName,requestorQuestion) {
        var url=_serviceUrl+_serviceMethodSendEmail;
        var parameters='{"chatGuid":"'+chatGuid+'", "userName":"'+userName+'", "emailAddress":"'+emailAddress+'", "keywords":"'+keywords+'", "requestorId":"'+requestorId+'", "mobileNotifications":"'+mobileNotifications+'", "requestorName":"'+requestorName+'", "requestorQuestion":"'+requestorQuestion+'"}';
        _rSendEmail=getHttpRequestObject();
        if(_rSendEmail) {
            _rSendEmail.open("POST",url,true);
            _rSendEmail.setRequestHeader('Content-Type','application/json');
            _rSendEmail.send(parameters);
        }
    };

    // send async sms requesting chat
    i.sendRequestSms=function(chatGuid,emailAddress,keywords,requestorId) {
        var url=_serviceUrl+_serviceMethodSendSms;
        var parameters='{"chatGuid":"'+chatGuid+'", "emailAddress":"'+emailAddress+'", "keywords":"'+keywords+'", "requestorId":"'+requestorId+'"}';
        _rSendSms=getHttpRequestObject();
        if(_rSendSms) {
            _rSendSms.open("POST",url,true);
            _rSendSms.setRequestHeader('Content-Type','application/json');
            _rSendSms.send(parameters);
        }
    };

    // send async sms email for left message
    i.sendMessageSms=function(toEmail,keywords,name,email,phone,message) {
        var url=_serviceUrl+_serviceMethodSendMSms;
        var parameters='{"toEmail":"'+toEmail+'", "keywords":"'+keywords+'", "name":"'+name+'", "email":"'+email+'", "phone":"'+phone+'", "message":"'+message+'"}';
        _rSendSms=getHttpRequestObject();
        if(_rSendSms) {
            _rSendSms.open("POST",url,true);
            _rSendSms.setRequestHeader('Content-Type','application/json');
            _rSendSms.send(parameters);
        }
    };

    // send async email for left message
    i.sendMessageEmail=function(toName,toEmail,fromName,fromPhone,fromEmail,fromMessage,sourceLink) {
        var url=_serviceUrl+_serviceMethodSendMEmail;
        var parameters='{"toName":"'+toName+'", "toEmail":"'+toEmail+'", "fromName":"'+fromName+'", "fromPhone":"'+fromPhone+'", "fromEmail":"'+fromEmail+'", "fromMessage":"'+fromMessage+'", "sourceLink":"'+sourceLink+'"}';
        _rSendEmail=getHttpRequestObject();
        if(_rSendEmail) {
            _rSendEmail.open("POST",url,true);
            _rSendEmail.setRequestHeader('Content-Type','application/json');
            _rSendEmail.send(parameters);
        }
    };

    // cancels checkRequestStatus function timer by setting flag
    i.cancelCheckRequestStatus=function() {
        _cancelRequestStatus=true;
        _cancelRequestTimeout=true;
    };

    // cancels checkRequestTimeout function timer by setting flag
    i.cancelCheckRequestTimeout=function() {
        _cancelRequestTimeout=true;
    };

    // start chat processing
    i.startChat = function(chatText) {
        updateChatHistory(chatText);
        getChatMessages();
        getTypingState();
        var textBox = document.getElementById('txtChatText');
        if (textBox) {
            textBox.focus();
        }
    };

    // start request processing
    i.startRequest=function() {
        checkRequestStatus();
        checkRequestTimeout();
    };

    // starts request timeout timer
    i.startRequestTimeout=function() {
        checkRequestTimeout();
    };

    // constructor method
    i.constructor=function() {
        //debugger;
        initVars(requestorId,chatId,displayName,updateInterval,serviceUrl,requestTimeout,ajaxPanelId);
    };

    i.constructor();
}

// end existing chat
function endChat() {
    if(typeof gChatHandler!="undefined") {
        gChatHandler.endChat();
    }
}
