/* Minification failed. Returning unminified contents.
(1,19): run-time error CSS1031: Expected selector, found ';'
(1,19): run-time error CSS1025: Expected comma or open brace, found ';'
(3,16): run-time error CSS1031: Expected selector, found '='
(3,16): run-time error CSS1025: Expected comma or open brace, found '='
 */
var CTChatDialogVM;

CTChatDialogVM = {
    MsgTextAreaKo: ko.observable(),
    MsgSendEnabled: ko.observable(true),
    MsgListKo: ko.observableArray([]),
    ConversationDataKo: ko.observable({}),
    CTConversationId: ko.observable(null),
    isEmergencyEnabled: ko.observable(false),
    isEmergencyUsed: false,
    timer: null,
    secondsRemaining: ko.observable(600),
    timeRemainingFormatted: ko.observable('10:00'),
    configurationMinutes: 10,
    busyMessageSent: false,
    firstMessageSent: false,
    xClicked: false,
    practiceAnswered: false,

    GuestInfo: ko.observable(
    {
        DisplayName: ko.observable(''),
        FirstName: ko.observable(''),
        LastName: ko.observable(''),
        Email: ko.observable(''),
        Phone: ko.observable('')
    }),

    isChatStarted: ko.observable(false),
    isLoggedOut: ko.observable(false),
    currentUser: '',
    bindElement: null,

    btnStartConversation: function () {
        var self = this;

        var error = false;

        //Name
        var name = self.GuestInfo().DisplayName();

        $('#tbName').removeClass('error');
        if (name == null || name == '') {
            $('#tbName').addClass('error');
            error = true;
        }

        //Email
        var email = self.GuestInfo().Email();

        $('#tbEmail').removeClass('error');
        if (email != null && email != '' && !self.IsEmailValid(email)) {
            $('#tbEmail').addClass('error');
            error = true;
        }

        //Phone
        var phone = self.GuestInfo().Phone();

        $('#tbPhone').removeClass('error');
        if (phone != null && phone != '' && !self.IsPhoneValid(phone)) {
            $('#tbPhone').addClass('error');
            error = true;
        }

        if (error) {
            return;
        }

        self.StartOrResumeConversation(true);
        self.isChatStarted(true);
    },

    btnLogOutClick: function () {
        var self = this;

        self.xClicked = true;
        self.LogOutOpp("Conversation has been terminated by the patient.");
    },

    LogOutOpp: function (logOutMessage) {
        var self = this;

        self.isLoggedOut(true);

        self.SendMessage(logOutMessage, 110);
        clearInterval(CTChatDialogVM.timer);

        self.secondsRemaining(0);
        self.timeRemainingFormatted('00:00')
    },

    Init: function (bindElement) {
        var self = this;
        self.bindElement = bindElement;
        if (self.bindElement != null) {
            ko.applyBindings(CTChatDialogVM, self.bindElement);
        }
        if (document.cookie.indexOf('authCookiePatient') > -1) {
            self.StartOrResumeConversation(false);

        }
        if (self.timer == null) {
            self.timer = setInterval(function () { CTChatDialogVM.TimerTick() }, 5000);
        }
    },

    TimerTick: function () {
        var self = this;

        if (self.isChatStarted()) {
            self.secondsRemaining(self.secondsRemaining() - 5);
            var secVal = self.secondsRemaining();
            if (secVal <= 0) {
                self.LogOutOpp('Conversation has been terminated due to inactivity.');
            }

            self.timeRemainingFormatted(self.SecondsToMinutes(secVal));

            var secForBusy = (self.configurationMinutes - 5) * 60//When to trigger busy notification;

            if (!self.busyMessageSent && self.firstMessageSent && !self.practiceAnswered && secVal <= secForBusy) {
                self.busyMessageSent = true;
                self.SendMessage('Unfortunately we are currently busy. Please leave us your contact information and we will contact you later.', 22);
            }
        }
    },

    StartOrResumeConversation: function (updateData) {
        var self = this;
        var url = '/CTAnonEndpoint/StartOrResumeConversation';

        var data = { userInfo: null };
        if (updateData) {
            var data = { userInfo: ko.toJS(self.GuestInfo) };
        }

        $.ajax({
            type: "POST",
            url: url,
            data: data,
            success: function (data) {
                self.ConversationDataKo(data.currentConversation);
                self.GuestInfo(ko.mapping.fromJS(data.currentConversation.GuestInfo));
                self.currentUser = self.ConversationDataKo().CTCuId;
                self.MsgListKo(data.messages);
                self.CTConversationId(data.currentConversation.CTConversationId);

                self.ScrollTop();
                self.determineIfEmergencyUsed(data.messages);

                var minutesConfig = CTChatDialogVM.ConversationDataKo().TimeOutInMinutes;
                self.configurationMinutes = minutesConfig;
                self.secondsRemaining(self.configurationMinutes * 60);
                self.timeRemainingFormatted(self.SecondsToMinutes(self.configurationMinutes * 60));

                if (updateData == false) {
                    self.isChatStarted(false);
                }

                if (self.ConversationDataKo().GuestInfo.DisplayName != null) {
                    self.isChatStarted(true);
                }
            },
            error: function () {
            },
            dataType: 'JSON'
        });
    },

    determineIfEmergencyUsed: function (messages) {
        var self = this;
        for (var i = 0; i < messages.length; i++) {
            var msgItem = messages[i];

            if (msgItem.SystemType == 21) {
                self.isEmergencyUsed = true;
                self.isEmergencyEnabled(false);
                break;
            }
            if (msgItem.SystemType == 100 || msgItem.SystemType == 101) {
                var loutMsg = msgOb.SystemType == 100 ? 'Conversation has been terminated due to patient inactivity...' : 'Conversation has been terminated by the practice...';
                self.LogOutOpp(loutMsg);
                break;
            }
            if (msgItem.SystemType == 22) {
                self.busyMessageSent = true;
                break;
            }

            if (msgItem.SystemType == 0 && msgItem.Direction == 1) {
                self.practiceAnswered = true;
                break;
            }
        }
    },

    btnSendClick: function () {
        var self = this;
        var message = self.MsgTextAreaKo();
        self.SendMessage(message, 0);
        self.firstMessageSent = true;
    },

    RequestEmergency: function () {
        var self = this;
        self.SendMessage('Emergency request', 20); //20 - Emergency
        self.isEmergencyEnabled(false);
    },

    SendMessage: function (message, systemType) {
        var self = this;

        if (message.replace(/[ \t]/g, '') == '') {
            return;
        }

        self.MsgSendEnabled(false);

        var url = '/CTAnonEndpoint/SendCTMessage';
        var _displayName = CTChatDialogVM.ConversationDataKo().GuestInfo.DisplayName;
        var data = { messageBody: message, systemType: systemType, CTConversationId: self.CTConversationId(), displayName: _displayName };

        $.ajax({
            type: "POST",
            url: url,
            data: data,
            success: function () {
                self.MsgTextAreaKo('');
                self.MsgSendEnabled(true);

                if (self.isLoggedOut() && self.xClicked) {
                    window.close();
                }
            },
            error: function () {
            },
            dataType: 'JSON'
        });
    },

    ProcessSignalRMessage: function (dataMessage) {
        var self = this;
        var bodyJSON = dataMessage.MessageBody;
        var msgOb = JSON.parse(bodyJSON);
        self.MsgListKo.push(msgOb);
        self.ScrollTop();

        if (!self.isEmergencyUsed
            && (msgOb.SystemType == 5
            || msgOb.SystemType == 6
            || msgOb.SystemType == 7)
            ) {
            self.isEmergencyEnabled(true);
        }

        if (msgOb.SystemType == 21) {
            self.isEmergencyUsed = true;
            self.isEmergencyEnabled(false);
        }

        if (msgOb.SystemType == 100
        || msgOb.SystemType == 101) {
            var loutMsg = msgOb.SystemType == 100 ?
                'Conversation has been terminated due to patient inactivity.'
                : 'Conversation has been terminated by the practice.';
            self.LogOutOpp(loutMsg);
        }

        if (msgOb.SystemType != 22) {
            self.secondsRemaining(self.configurationMinutes * 60);
        }

        if (msgOb.SystemType == 0 && msgOb.Direction == 1) {
            self.practiceAnswered = true;
        }
    },

    ScrollTop: function () {
        if ($('#divMsgList').length > 0) {
            $("#divMsgList").animate({ scrollTop: $('#divMsgList')[0].scrollHeight }, 500);
        }
    },

    IsPhoneValid: function (phone) {
        var self = this;

        var numbersOnly = phone.replace(/[^0-9]/g, '');
        var lettersOnly = phone.replace(/[^a-zA-Z]/g, '');

        if (lettersOnly.length > 0) {
            return false;
        }

        if (numbersOnly.length < 1) {
            return false;
        }

        return true;
    },

    IsEmailValid: function (email) {
        var self = this;

        var regEx = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9._+-]{0,}[[a-zA-Z0-9]+\.[a-zA-Z]{1,}$/;
        return regEx.test(email);
    },

    SecondsToMinutes: function (inputSeconds) {
        inputSeconds = Number(inputSeconds);

        if (inputSeconds == 0) {
            return '00:00';
        }

        var minutes = Math.floor(inputSeconds / 60);
        var seconds = inputSeconds - minutes * 60;

        var minutesDispl = minutes < 10 ? '0' + minutes : minutes;
        var secondsDispl = seconds < 10 ? '0' + seconds : seconds;

        return minutesDispl + ':' + secondsDispl;
    }
}

$(document).ready(function () {
    var el = document.getElementById('operaDDSChatWrapper');

    CTChatDialogVM.Init(el);
});
