var userDefaultLanguage = ((navigator.language) ? navigator.language : navigator.userLanguage).split("-")[0];

var chat = new Chat();
function Chat() {
    this.enabled = true;
    this.updateFrequency = 1000;
    this.translate = false;
    this.targetLanguage = userDefaultLanguage.split("-")[0];
    this.authenticated = false;
    this.blockedStatus = 1;
    this.visible = true;
    this.pendingUpdateRequest = false;
    this.pendingSendRequest = false;
    this.username = "";
    this.usernameOld = "";
    this.userSessionID = null;
    this.totalUnread = 0;
    this.lobbyConversation = new Object();
    this.lobbyUnread = 0;
    this.pmConversations = new Object();
    this.pmUnread = new Object();
    this.lastUpdate = "";
    this.dateTimeServerOffset = "";
    this.activeTab = null;
}

function addToDebugger(message) {
    var now = new Date();
    $("<p><strong>" + now.toLocaleTimeString() + ": </strong>" + message + "</p>").prependTo("#debugger");
}

var gTranslate = null;
if (chat.translate)
{
	try {
		google.load("language", "1");
		google.setOnLoadCallback(googleTranslateInitialized);
	}
	catch (e) {
		addToDebugger("Chat - Google Translate Error - Error Loading - " + e.description);
		pageTracker._trackEvent('Chat', 'Google Translate Error - Error Loading', chat.username + " - " + e.description);
	}
}

function googleTranslateInitialized() {
    try
    {
        gTranslate = google;
        updateTranslations();
        for (lang in google.language.Languages) {
            if (google.language.Languages[lang] != "") {
                $('#Select_LanguagePreference').
              append($("<option></option>").
              attr("value", google.language.Languages[lang]).
              text(lang));
            }
        }
        $('#Select_LanguagePreference').val(chat.targetLanguage);
        $('#Select_LanguagePreference').change(languagePreference_ChangeHandler);

        $('#Checkbox_Translate').attr("checked", chat.translate ? "checked" : "");

        $('#Checkbox_Translate').click(translate_ChangeHandler);
    }
    catch (e) {
        addToDebugger("Chat - Google Translate Error - Error Initializing - " + e.description);
        pageTracker._trackEvent('Chat', 'Google Translate Error - Error Initializing', chat.username + " - " + e.description);
    }
}

function languagePreference_ChangeHandler(e) {
    chat.targetLanguage = $(this).val();
    setCookie("targetLanguage", chat.targetLanguage); //Store in cookie for next time user visits
    updateTranslations();
}
function translate_ChangeHandler(e) {
	chat.translate = $(this).is(":checked");
    setCookie("translate", chat.translate ? "true" : "false"); //Store in cookie for next time user visits
    updateTranslations();
}
function updateTranslations() {
    try
    {
        for (evntID in chat.lobbyConversation) {
            googleTranslateLobbyEvent(evntID);
        }
        for (username in chat.pmConversations) {
            for (evntID2 in chat.pmConversations[username]) {
                googleTranslatePMEvent(username, evntID2);
            }
        }
    } catch (e) {
        addToDebugger("Chat - Google Translate Error - Error Translating - " + e.description);
        pageTracker._trackEvent('Chat', 'Google Translate Error - Error Translating', chat.username + " - " + e.description);
    }
}
function googleTranslateLobbyEvent(evntID) {
    if (chat.translate && chat.targetLanguage != "") {
        try {
            gTranslate.language.translate(chat.lobbyConversation[evntID].messageInSourceLanguage, "", chat.targetLanguage,
            function (result) {
                if (result.detectedSourceLanguage != chat.targetLanguage && result.translation != chat.lobbyConversation[evntID].messageInSourceLanguage) {
                    chat.lobbyConversation[evntID].message = "in " + convertLanguageName(result.detectedSourceLanguage) + " -> " + result.translation;
                    updateChatMessagesDisplay();
                }
                else {
                    chat.lobbyConversation[evntID].message = chat.lobbyConversation[evntID].messageInSourceLanguage;
                    updateChatMessagesDisplay();
                }
            }
            );
        } catch (e) {
            addToDebugger("Chat - Google Translate Error - Error Translating - " + e.description);
            pageTracker._trackEvent('Chat', 'Google Translate Error - Error Translating', chat.username + " - " + e.description);
        }
    }
    else {
        chat.lobbyConversation[evntID].message = chat.lobbyConversation[evntID].messageInSourceLanguage;
        updateChatMessagesDisplay();
    }
}
function googleTranslatePMEvent(username, evntID) {
    if (chat.translate && chat.targetLanguage != "") {
        try {
            gTranslate.language.translate(chat.pmConversations[username][evntID].messageInSourceLanguage, "", chat.targetLanguage,
            function (result) {
                if (result.detectedSourceLanguage != chat.targetLanguage && result.translation != chat.pmConversations[username][evntID].messageInSourceLanguage) {
                    chat.pmConversations[username][evntID].message = "in " + convertLanguageName(result.detectedSourceLanguage) + " -> " + result.translation;
                    updateChatMessagesDisplay();
                }
                else {
                    chat.pmConversations[username][evntID].message = chat.pmConversations[username][evntID].messageInSourceLanguage;
                    updateChatMessagesDisplay();
                }
            }
            );
        } catch (e) {
            addToDebugger("Chat - Google Translate Error - Error Translating - Private Message - " + e.description);
            pageTracker._trackEvent('Chat', 'Google Translate Error - Error Translating - Private Messsage', chat.username + " - " + e.description);
        }
    }
    else {
        chat.pmConversations[username][evntID].message = chat.pmConversations[username][evntID].messageInSourceLanguage;
        updateChatMessagesDisplay();
    }
}


$(document).ready(initChat); //Initialize the panels
var chatUpdateInterval;
var heartBeatTimer;
function heartbeat_Handler() {
    pageTracker._trackEvent('HeartBeat', (chat.username == "" ? "Unknown" : chat.username));
    addToDebugger("Heart Beat: " + (chat.username == "" ? "Unknown" : chat.username));
}
function initChat() {
    $("#debuggerWrapper").hide();
    $("#debugger").corner("5px");
    $("#debugger").hide();
    $("#showHideDebugger").text("[Show Debugger]");
    $("#showHideDebugger").click(function (e) {
        if ($("#debugger").is(":visible")) {
            $("#showHideDebugger").text("[Show Debugger]");
            $("#debugger").hide();
        } else {
            $("#showHideDebugger").text("[Hide Debugger]");
            $("#debugger").show();
        }
    });
    try {
        $(".dashboard .chat .tab").live("click", chatTabClickHandler);
        $(".chat .conversationWrapper").bind("resize", chatConversationResizeHandler);

        $(".chat .message textarea").text("Type and press ENTER to chat...");
        $(".chat .message textarea").addClass("emptymessage");
        $(".chat .message textarea").focus(function () {
            if ($(this).hasClass("emptymessage")) {
                $(this).text("");
                $(this).removeClass("emptymessage");
            }
        });
        $(".chat .message textarea").blur(function () {
            if (this.value == "") {
                $(this).addClass("emptymessage");
                $(this).text("Type and press ENTER to chat...");
            }
        });
        $(".submitUsername a").mouseup(changeUsername);

        //Set up the modal window
        if (jQuery.support.opacity) {
            $("#setUsername").corner("top");
        }
        $("#editUsername").click(editUsernameHandler);

        chatUpdateInterval = setInterval(updateChat, chat.updateFrequency);

        $(".chat .message textarea").keyup(sendMessage);
        $("#usernameInput").keypress(function (e) {
            if (e.keyCode == 13) {
                e.preventDefault();
                changeUsername();
            }
        }
	    );

        $(".chat .users div").live("mouseover", function (e) {
            $(this).addClass("over");
        }
	    );
        $(".chat .users div").live("mouseout", function (e) {
            $(this).removeClass("over");
        }
	    );
        $("#setUsername .close").live("click", function (e) {
            hideModalWindow("#setUsername"); //Hide the modal window
        }
	    );
        $("#logoff").live("click", function (e) {
            Sys.Services.AuthenticationService.logout();
        }
	    );

        chat.username = getCookie("username");

        chat.activeTab = $(".chat .chatLobbyTab");

        if (getCookie("translate")) {
            chat.translate = getCookie("translate") == "true" ? true : false;
        }
        if (getCookie("targetLanguage")) {
            chat.targetLanguage = getCookie("targetLanguage");
        }

        updateUsernameDisplay();
        addToDebugger("Chat Initialized");
    } catch (e) {
        addToDebugger("Chat - Error Initializing - " + e.description);
        pageTracker._trackEvent('Chat', 'Error Initializing', chat.username + " - " + e.description);
    }

    heartBeatTimer = setInterval(heartbeat_Handler, 30 * 1000); //Send heartbeat to analytics ever 30 seconds.
    heartbeat_Handler();
}
function showChat() {
    //Scroll chat conversations to the bottom
    $(".chat .conversation").scrollTop($(".chat .conversation .inner").outerHeight(true));

    chat.visible = chat.enabled;
    
    if (!chat.enabled) {
        //Disable chat
        $("#chat").hide();
        $("#chatOffline").show();
    }
    else if (chat.visible) {
        $("#chat").show();
        $("#chatOffline").hide();
    }
}
function editUsernameHandler() {
    if (chat.blockedStatus == 2) {
        handleBlockedUser();
    }
    else
    {
        $("#usernameError").text(""); //Clear out error

        $("html").css("overflow", "hidden");
        $("#modalMask").width($(document).width());
        $("#modalMask").height($(document).height());

        $("#modalMask").fadeIn(1);
        $("#modalMask").fadeTo(1, 0);
        $("#modalMask").fadeTo("slow", 0.2);

        var username = $(".chat .message .username");

        $("#setUsername").css('top', username.offset().top - $("#setUsername").outerHeight() + username.outerHeight());
        $("#setUsername").css('left', username.offset().left);
        $("#setUsername").css('width', username.outerWidth());
        $("#setUsername .submitUsername").css('width', username.width());

        $("#setUsername").addClass("shadow");

        $("#setUsername").show("drop", { direction: "down" }, "slow", function (e) { $("#usernameInput").focus(); });
    }
}
function chatConversationResizeHandler() {
    var wrapper = $(".chat .conversationWrapper");
    var conversation = $(".chat .conversationWrapper .conversation");
    var message = $(".chat .conversationWrapper .message");
    var messageTextArea = $(".chat .conversationWrapper .message textarea");
    var username = $(".chat .conversationWrapper .message .username");

    conversation.width(wrapper.width());
    message.width(wrapper.width());

    var diff = messageTextArea.outerWidth(true) - messageTextArea.width();
    messageTextArea.width(message.width() - diff - username.outerWidth(true));
    messageTextArea.height(message.height() - diff);
    username.height(message.height());
    username.css("line-height", username.height() + "px");
}
function chatTabClickHandler(e) //Handle clicking on a chat tab
{
    if (!$(this).attr("ignoreClick")) { //Should we ignore the click? (handles bug where click handler is fired for removed tab)
        chat.activeTab = $(this); //Store active tab

        var scrolledToBottom = $(".chat .conversation").scrollTop() >= ($(".chat .conversation .inner").outerHeight(true) - $(".chat .conversation").innerHeight());

        if ($(this).hasClass("chatLobbyTab")) //Is this the chat lobby tab?
        {
            //If so, show the chat users list
            $(".sbUsers").show();
            $(".usersWrapper").show();

            //Retrieve and display the conversation for the lobby
            $(".chat .conversation .inner").html(chatConvoToString());
            chatTabClickHandlerHelper();
        }
        else {
            //Otherwise hide the chat users list
            $(".sbUsers").hide();
            $(".usersWrapper").hide();

            //Retrieve and display the conversation for the currently selected IM thread
            var pmSN = $(this).attr("username");

            var chatConv = (chat.pmConversations[pmSN] != null) ? pmConvoToString(pmSN) : "";
            $(".chat .conversation .inner").html(chatConv);
            chatTabClickHandlerHelper();
        }

        //Scroll chat conversations to the bottom
        if (scrolledToBottom) {
            $(".chat .conversation").scrollTop($(".chat .conversation .inner").outerHeight(true));
        }
    }
}
function updateChatMessagesDisplay() {
    var activeTab = chat.activeTab;
    var scrolledToBottom = $(".chat .conversation").scrollTop() >= ($(".chat .conversation .inner").outerHeight(true) - $(".chat .conversation").innerHeight());

    if (activeTab.hasClass("chatLobbyTab")) //Is this the chat lobby tab?
    {
        //If so, show the chat users list
        $(".sbUsers").show();
        $(".usersWrapper").show();

        //Retrieve and display the conversation for the lobby
        $(".chat .conversation .inner").html(chatConvoToString());
        chatTabClickHandlerHelper();
    }
    else {
        //Otherwise hide the chat users list
        $(".sbUsers").hide();
        $(".usersWrapper").hide();

        //Retrieve and display the conversation for the currently selected IM thread
        var pmSN = activeTab.attr("username");

        var chatConv = (chat.pmConversations[pmSN] != null) ? pmConvoToString(pmSN) : "";
        $(".chat .conversation .inner").html(chatConv);
        chatTabClickHandlerHelper();
    }

    //Scroll chat conversations to the bottom
    if (scrolledToBottom) {
        $(".chat .conversation").scrollTop($(".chat .conversation .inner").outerHeight(true));
    }
}
function chatTabClickHandlerHelper() {
    layoutSplitterBarVs(); //Update the widths of the elements
}
function hideModalWindow(win) {
    $(win).hide("drop", { direction: "down" }, "slow");
    $("#modalMask").fadeOut("slow", function () { $("html").css("overflow", ""); });
}
function changeUsername() { //Handles submit from change username modal window
    try {
        var usernameNew = $('#usernameInput').val();
        if (usernameNew.replace(/ /g, "") != "" && (chat.username != usernameNew)) {
            chat.pendingUpdateRequest = true;
            var chatService = new YTBE.ChatApp.ChatService();
            chatService.Timeout = 100000;
            chatService.ChangeUsername("InternetCampus", chat.userSessionID, usernameNew, chat.username, changeUsernameSuccess, changeUsernameFailure);
        }
        else {
            hideModalWindow("#setUsername"); //Hide the modal window
        }
    } catch (e) {
        addToDebugger("Chat - Error Changing Username - " + e.description);
        pageTracker._trackEvent('Chat', 'Error Changing Username', chat.username + " - " + e.description);
    }
}
function changeUsernameSuccess(result) {
    switch (result) {
        case 1: //Success
            var usernameNew = $('#usernameInput').val();
            chat.username = usernameNew; //Save the new Screen Name
            setCookie("username", chat.username); //Store in cookie for next time user visits
            updateUsernameDisplay(); //Update username on screen
            hideModalWindow("#setUsername"); //Hide the modal window
            pageTracker._trackEvent('Chat', 'Username Update', chat.username + " - Changed Successfully");
            break;
        case 2: //Taken
            $("#usernameError").text("That username is taken. Please choose another.");
            pageTracker._trackEvent('Chat', 'Username Update', chat.username + " - Username Taken");
            break;
        case 3: //Invalid
            $("#usernameError").text("Invalid username. Please choose another.");
            pageTracker._trackEvent('Chat', 'Username Update', chat.username + " - Invalid Username");
            break;
    }
    chat.pendingUpdateRequest = false;
}
function changeUsernameFailure(result) {
    chat.pendingUpdateRequest = false;
    addToDebugger("Chat - Error Changing Username - Web Service - " + result.get_message());
    pageTracker._trackEvent('Chat', 'Error Changing Username - Web Service', chat.username + " - " + result.get_message());
}
function updateUsernameDisplay() {
    if (chat.username) {
        if ($('#usernameInput').val() != chat.username) {
            $('#usernameInput').val(chat.username);
        }
        $("div.username .un").text(chat.username);
        $("#editUsername").text("[change]");

        var message = $(".chat .conversationWrapper .message");
        var messageTextArea = $(".chat .conversationWrapper .message textarea");
        var username = $("div.username");
        var diff = messageTextArea.outerWidth(true) - messageTextArea.width();
        messageTextArea.width(message.width() - diff - username.outerWidth(true));
    }
}

//Chat functions:
function sendMessage(e) {
    try {
        var keycode = e.which || e.keyCode;
        if (keycode == 13) {
            if (!chat.enabled) {
                var message = $(".chat .message textarea");
                message.val("");
                return; //Exit
            }
            if (chat.blockedStatus == 2) {
                handleBlockedUser();
            }
            else {
                var conversation = $(".chat .message .conversation");
                var message = $(".chat .message textarea");
                message.val(message.val().replace(/[\r\n]+$/, ""));
                if (chat.username != "") {
                    if (message.val().replace(/\s+$/, "") != "") {
                        chat.pendingSendRequest = true;

                        var activeTab = chat.activeTab;
                        if (activeTab.hasClass("chatLobbyTab")) {
                            pageTracker._trackEvent('Chat', 'Lobby Message Sent');
                            YTBE.ChatApp.ChatService.AddMessage("InternetCampus", chat.userSessionID, chat.username, message.val(), addMessageSuccess, addMessageFailure);
                        }
                        else {
                            pageTracker._trackEvent('Chat', 'Private Message Sent');
                            YTBE.ChatApp.ChatService.AddPrivateMessage("InternetCampus", chat.userSessionID, chat.username, message.val(), activeTab.attr("username"), addMessageSuccess, addMessageFailure);
                        }

                        message.val("");
                        $(".chat .conversation").scrollTop($(".chat .conversation .inner").outerHeight(true));
                    }
                } else {
                    editUsernameHandler();
                }
            }
        }
    } catch (e) {
        addToDebugger("Chat - Error Sending Message - " + e.description);
        pageTracker._trackEvent('Chat', 'Error Sending Message', chat.username + " - " + e.description);
    }
}
function addMessageSuccess(result) {
    if (result == 1) {
        chat.pendingSendRequest = false;
    } else {
        handleBlockedUser();
        chat.blockedStatus = result;
    }
}
function addMessageFailure(result) {
    chat.pendingSendRequest = false;
    addToDebugger("Chat - Error Sending Message - Web Service - " + result.get_message());
    pageTracker._trackEvent('Chat', 'Error Sending Message - Web Service', chat.username + " - " + result.get_message());
}

function handleBlockedUser() {
    alert("You have been banned from the chat!");
    $("#chat .conversationWrapper .conversation .inner").hide();
    $("#chat .usersWrapper .users div").hide();
    clearInterval(chatUpdateInterval);
}
function updateChat() {
    if (!chat.pendingUpdateRequest && chat.enabled) {
        try
        {
            chat.pendingUpdateRequest = true;
            var chatService = new YTBE.ChatApp.ChatService();
            chatService.Timeout = 100000;
            chatService.GetChatUpdates("InternetCampus", chat.userSessionID, chat.username, chat.lastUpdate, chatUpdateSuccess, chatUpdateFailure);
        }
        catch (e)
        {
            chat.pendingUpdateRequest = false;
        }
    }
    else {
        //addToDebugger("Chat - Update Already In Progress");
    }
}
function activateLinks(message) {
    try {
        var hyperlinkRegEx = /(((http|https):\/\/)?([A-Z0-9-]+\.)?[A-Z0-9-]+\.(com|edu|biz|org|net|info|us|tv|mobi|name|ws|cc|mil|jobs|museum|gd)(\/[\w\d:#@%;$()~_?\+-=\.&]+)*\/?)/gi;
        var emailRegEx = /([A-Z0-9._%+-]+@([A-Z0-9-]+\.)?[A-Z0-9-]+\.(com|edu|biz|org|net|info|us|tv|mobi|name|ws|cc|mil|jobs|museum|gd))/gi;
        message = message.replace(emailRegEx, "<a href=\"mailto:$1\">$1</a>");
        message = message.replace(hyperlinkRegEx, "<a href=\"http://$1\" target=\"_blank\">$1</a>").replace(/(http:\/\/)((http|https):\/\/)/gi, "$2");

        var emailFix = /@<a href="http:\/\/[A-Za-z0-9-\.]+" target="_blank">([A-Za-z0-9-\.]+)<\/a>/gi;
        message = message.replace(emailFix, "@$1");
    } catch (e) {
        addToDebugger("Chat - Error Activating Links - " + e.description);
        pageTracker._trackEvent('Chat', 'Error Activating Links', chat.username + " - " + e.description);
    }
    return message;
}
function convertLanguageName(key) {
    for (var l in gTranslate.language.Languages) {
        if (gTranslate.language.Languages[l] == key) return l;
    }
    return "";
}
function chatUpdateSuccess(result) {
    chat.pendingUpdateRequest = true;
    if (result != null) { //Did we get a result from the web service call?
        if (result.BlockedStatus == 2) { //Is current user blocked from the chat?
            handleBlockedUser();
            chat.blockedStatus = result.BlockedStatus;
        }
        else
        {
            if (result.UserSessionID != null) {
                chat.userSessionID = result.UserSessionID;
            }

            try {
                if (result.GuestUsername != null && !result.Authenticated) {
                    chat.username = result.GuestUsername;
                    setCookie("username", chat.username); //Store in cookie for next time user visits
                    updateUsernameDisplay();
                    editUsernameHandler(); //Prompt the guest to choose their username
                }
            } catch (e) {
                addToDebugger("Chat - Error Processing Update - Guest Username - " + e.description);
                pageTracker._trackEvent('Chat', 'Error Processing Update - Guest Username', chat.username + " - " + e.description);
            }

            try {
                if (result.Authenticated && !chat.authenticated) {
                    chat.authenticated = true;
                    chat.username = result.AuthenticatedUsername;
                    $("#debuggerWrapper").show(); //Show debugger option
                    $("#editUsername").hide();
                    $("#logoff").show();
                    $(".chat .users div").live("dblclick", usernameDoubleClickHandler); //Attach double click handler
                    updateUsernameDisplay();
                }
                else if (!chat.authenticated) {
                    $("#logoff").hide();
                    //$("#debuggerWrapper").show(); //Show debugger option
                }
            } catch (e) {
                addToDebugger("Chat - Error Processing Update - Authenticated User - " + e.description);
                pageTracker._trackEvent('Chat', 'Error Processing Update - Authenticated User', chat.username + " - " + e.description);
            }

            var firstLoad = (chat.lastUpdate == ""); //If lastUpdate is blank, this is the first pass through this function

            var origLastUpdate = chat.lastUpdate;
            chat.lastUpdate = result.LastUpdate; //Store the last time a chat update was performed. This helps us get ONLY new events on subsequent passes.

            var serverDateTime = new Date(Date.parse(result.DateTimeServer));
            var clientDateTime = new Date();
            serverDateTime.setHours(serverDateTime.getHours() - 4);
            serverDateTime.setSeconds(0);
            clientDateTime.setSeconds(0);
            chat.dateTimeServerOffset = clientDateTime - serverDateTime; //Calculate the difference between server's time and user's time

            var conversation = $(".chat .conversation .inner table"); //Get the chat conversation
            var users = $(".chat .usersWrapper .users"); //Get the users list DIV
            var count = $(".chat .usersWrapper .count"); //Get the users list count DIV

            var events = result.Events; //Get the events list
            if (events != null) { //If events list not null
                for (var i = 0; i < events.length; i++) { //Iterate
                    var eventTimeStamp = new Date(events[i].TimeStamp.getTime() + chat.dateTimeServerOffset).format("h:mm:ss tt"); //Convert the event time stamp to the user's local time
                    var evntID = events[i].EventID;
                    switch (events[i].EventType) {
                        case 0: //Message
                            try {
                                var messageToUser = false;
                                if (chat.username != "") {
                                    var messageToUserExp = new RegExp("@" + chat.username, "gi");
                                    if (events[i].Message.match(messageToUserExp)) {
                                        messageToUser = true;
                                        if (!firstLoad) {
                                            chat.totalUnread++;
                                            chat.lobbyUnread++;
                                        }
                                    }
                                }

                                var msg = activateLinks(events[i].Message);
                                chat.lobbyConversation[evntID] = new Object();
                                chat.lobbyConversation[evntID].prefix = "<tr><td class=\"username\">" + events[i].Username + ":</td>" + "<td" + (messageToUser ? " class=\"messageToUser\"" : "") + " id=\"chatEvent_" + evntID + "\">";
                                chat.lobbyConversation[evntID].message = msg;
                                chat.lobbyConversation[evntID].messageInSourceLanguage = msg;
                                chat.lobbyConversation[evntID].suffix = "</td></tr>";

                                googleTranslateLobbyEvent(evntID);
                            } catch (e) {
                                addToDebugger("Chat - Error Processing Update - Lobby Message - " + e.description);
                                pageTracker._trackEvent('Chat', 'Error Processing Update - Lobby Message', chat.username + " - " + e.description);
                            }
                            break;
                        case 1: //Private Message
                            try {
                                if (events[i].Username2 == chat.username) { //Handle message for current user
                                    createPMTabIfNotExist(events[i].Username);
                                    if (!firstLoad) {
                                        chat.totalUnread++;
                                        chat.pmUnread[events[i].Username] = (chat.pmUnread[events[i].Username] == null) ? 1 : (chat.pmUnread[events[i].Username] + 1);
                                    }
                                    privateMessageAdd(events[i].Username, evntID, "<tr><td class=\"username\">" + events[i].Username + ":</td>" + "<td id=\"chatEvent_" + evntID + "\">", activateLinks(events[i].Message), "</td></tr>");

                                    googleTranslatePMEvent(events[i].Username, evntID);
                                }
                                else if (events[i].Username == chat.username) //Handle message FROM current user
                                {
                                    createPMTabIfNotExist(events[i].Username2);
                                    privateMessageAdd(events[i].Username2, evntID, "<tr><td class=\"username\">" + events[i].Username + ":</td>" + "<td id=\"chatEvent_" + evntID + "\">", activateLinks(events[i].Message), "</td></tr>");

                                    googleTranslatePMEvent(events[i].Username2, evntID);
                                }
                            } catch (e) {
                                addToDebugger("Chat - Error Processing Update - Private Message - " + e.description);
                                pageTracker._trackEvent('Chat', 'Error Processing Update - Private Message', chat.username + " - " + e.description);
                            }
                            break;
                        case 2: //Signed On
                            try {
                                if (!firstLoad) {
                                    var newlySignedOnUser = events[i].Username;
                                    if ($(".chat .usersWrapper .users div[username='" + newlySignedOnUser + "']").length == 0) {
                                        //Add user to users list
                                        if (users.children().length == 0) {
                                            if (chat.authenticated) {
                                                users.append("<div username='" + newlySignedOnUser + "' title='IP: " + events[i].UserIPAddress + " Session: " + events[i].UserSessionID + "'>" + newlySignedOnUser + "</div>");
                                            }
                                            else {
                                                users.append("<div username='" + newlySignedOnUser + "'>" + newlySignedOnUser + "</div>");
                                            }
                                        }
                                        else {
                                            var added = false;
                                            $(".chat .usersWrapper .users div").each(function (e) {
                                                if ($(this).attr("username").replace(/\s/g, "").toLowerCase() > newlySignedOnUser.replace(/\s/g, "").toLowerCase() && !added) {
                                                    if (chat.authenticated) {
                                                        $(this).before("<div username='" + newlySignedOnUser + "' title='IP: " + events[i].UserIPAddress + " Session: " + events[i].UserSessionID + "'>" + newlySignedOnUser + "</div>");
                                                    }
                                                    else {
                                                        $(this).before("<div username='" + newlySignedOnUser + "'>" + newlySignedOnUser + "</div>");
                                                    }
                                                    added = true;
                                                    return;
                                                }
                                            });
                                            if (!added) {
                                                if (chat.authenticated) {
                                                    users.append("<div username='" + newlySignedOnUser + "' title='IP: " + events[i].UserIPAddress + " Session: " + events[i].UserSessionID + "'>" + newlySignedOnUser + "</div>");
                                                }
                                                else {
                                                    users.append("<div username='" + newlySignedOnUser + "'>" + newlySignedOnUser + "</div>");
                                                }
                                            }
                                        }
                                    }

                                    var userPMTabFound = $(".chat .tabs div.tab[username='" + events[i].Username + "']").length > 0;
                                    if (userPMTabFound) {
                                        //privateMessageAdd(events[i].Username, "<tr><td colspan='2' class='userStatus'>" + eventTimeStamp + ": '" + events[i].Username + "' signed on! Welcome!</td></tr>");
                                    }
                                    //chat.lobbyConversation += "<tr><td colspan='2' class='userStatus'>" + eventTimeStamp + ": '" + events[i].Username + "' signed on! Welcome!</td></tr>";
                                }
                            } catch (e) {
                                addToDebugger("Chat - Error Processing Update - Signed On - " + e.description);
                                pageTracker._trackEvent('Chat', 'Error Processing Update - Signed On', chat.username + " - " + e.description);
                            }
                            break;
                        case 3: //Signed Off
                            try {
                                if (!firstLoad) {
                                    $(".chat .usersWrapper .users div[username='" + events[i].Username + "']").remove();

                                    var userPMTabFound = $(".chat .tabs div.tab[username='" + events[i].Username + "']").length > 0;
                                    if (userPMTabFound) {
                                        //privateMessageAdd(events[i].Username, "<tr><td colspan='2' class='userStatus'>" + eventTimeStamp + ": '" + events[i].Username + "' signed off! Goodbye!</td></tr>");
                                    }
                                }
                                //chat.lobbyConversation += "<tr><td colspan='2' class='userStatus'>" + eventTimeStamp + ": '" + events[i].Username + "' signed off! Goodbye!</td></tr>";
                            } catch (e) {
                                addToDebugger("Chat - Error Processing Update - Signed Off - " + e.description);
                                pageTracker._trackEvent('Chat', 'Error Processing Update - Signed Off', chat.username + " - " + e.description);
                            }
                            break;
                        case 4: //Username Changed
                            try {
                                if (!firstLoad) {
                                    var userInList = $(".chat .usersWrapper .users div[username='" + events[i].Username2 + "']").remove(); //Remove old username

                                    var newlyChangedUsername = events[i].Username;

                                    if ($(".chat .usersWrapper .users div[username='" + newlyChangedUsername + "']").length == 0) {
                                        //Add user to users list with new username
                                        if (users.children().length == 0) {
                                            if (chat.authenticated) {
                                                users.append("<div username='" + newlyChangedUsername + "' title='IP: " + events[i].UserIPAddress + " Session: " + events[i].UserSessionID + "'>" + newlyChangedUsername + "</div>");
                                            }
                                            else {
                                                users.append("<div username='" + newlyChangedUsername + "'>" + newlyChangedUsername + "</div>");
                                            }
                                        }
                                        else {
                                            var added = false;
                                            $(".chat .usersWrapper .users div").each(function (e) {
                                                if ($(this).attr("username").replace(/\s/g, "").toLowerCase() > newlyChangedUsername.replace(/\s/g, "").toLowerCase() && !added) {
                                                    if (chat.authenticated) {
                                                        $(this).before("<div username='" + newlyChangedUsername + "' title='IP: " + events[i].UserIPAddress + " Session: " + events[i].UserSessionID + "'>" + newlyChangedUsername + "</div>");
                                                    }
                                                    else {
                                                        $(this).before("<div username='" + newlyChangedUsername + "'>" + newlyChangedUsername + "</div>");
                                                    }
                                                    added = true;
                                                    return;
                                                }
                                            });
                                            if (!added) {
                                                if (chat.authenticated) {
                                                    users.append("<div username='" + newlyChangedUsername + "' title='IP: " + events[i].UserIPAddress + " Session: " + events[i].UserSessionID + "'>" + newlyChangedUsername + "</div>");
                                                }
                                                else {
                                                    users.append("<div username='" + newlyChangedUsername + "'>" + newlyChangedUsername + "</div>");
                                                }
                                            }
                                        }
                                    }

                                    var userPMTab = $(".chat .tabs div.tab[username='" + events[i].Username2 + "']");
                                    userPMTab.attr("username", events[i].Username);
                                    userPMTab.children(".text").text(events[i].Username);

                                    //Move old conversations from the user to an object referenced under the new username
                                    chat.pmConversations[events[i].Username] = chat.pmConversations[events[i].Username2];
                                    chat.pmConversations[events[i].Username2] = null;

                                    if (userPMTab.length > 0) { //If we currently have a tab open for this user, add a new status message indicating that the user changed usernames
                                        //privateMessageAdd(events[i].Username, "<tr><td colspan='2' class='userStatus'>" + eventTimeStamp + ": '" + events[i].Username2 + "' changed username to '" + events[i].Username + "'</td></tr>");
                                    }
                                }
                                //chat.lobbyConversation += "<tr><td colspan='2' class='userStatus'>" + eventTimeStamp + ": '" + events[i].Username2 + "' changed username to '" + events[i].Username + "'</td></tr>";
                            } catch (e) {
                                addToDebugger("Chat - Error Processing Update - Changed Username - " + e.description);
                                pageTracker._trackEvent('Chat', 'Error Processing Update - Changed Username', chat.username + " - " + e.description);
                            }
                            break;
                    }
                }
            }
        }

        try {
            var activeUsers = result.ActiveUsers; //Get the full list of active users. This gets retrieved during the update request since lastUpdate was null
            if (activeUsers != null) { //Active users list is not null?
                activeUsers = activeUsers.sort();
                $(".chat .usersWrapper .users div").remove(); //Remove all users from the list and start over
                for (var i = 0; i < activeUsers.length; i++) { //Iterate list
                    if (chat.authenticated) {
                        users.append("<div username='" + activeUsers[i].Username + "' title='IP: " + activeUsers[i].UserIPAddress + " Session: " + activeUsers[i].UserSessionID + "'>" + activeUsers[i].Username + "</div>");
                    }
                    else {
                        users.append("<div username='" + activeUsers[i].Username + "'>" + activeUsers[i].Username + "</div>"); //Add to list of online users
                    }
                }
            }
            else if (chat.username != "") //Handle timing glitch where current user may not see themselves in the user list
            {
                var thisUserInList = $(".chat .usersWrapper .users div[username='" + chat.username + "']");
                if (thisUserInList.length == 0) {
                    users.append("<div username='" + chat.username + "'>" + chat.username + "</div>"); //Add to list of online users
                }
            }

            count.html("Users Online (" + users.children().length + ")"); //Update users online count

            if (events != null) {
                updateChatMessagesDisplay();
            }
        } catch (e) {
            addToDebugger("Chat - Error Processing Update - Active Users - " + e.description);
            pageTracker._trackEvent('Chat', 'Error Processing Update - Active Users', chat.username + " - " + e.description);
        }
    }
    updateUnreadCounts();
    chat.pendingUpdateRequest = false; //Set pending request to false (request is complete)
}
function chatConvoToString() {
    var returnStr = "";
    for (evntID in chat.lobbyConversation) {
        returnStr += chat.lobbyConversation[evntID].prefix + chat.lobbyConversation[evntID].message + chat.lobbyConversation[evntID].suffix;
    }
    return returnStr;
}
function pmConvoToString(username) {
    var returnStr = "";
    for (evntID in chat.pmConversations[username]) {
        returnStr += chat.pmConversations[username][evntID].prefix + chat.pmConversations[username][evntID].message + chat.pmConversations[username][evntID].suffix;
    }
    return returnStr;
}
function updateUnreadCounts() {
    //Get the active tab
    var activeTab = chat.activeTab;

    try {
        if (chat.visible && !isWindowMinimized()) {
            //Update message counts
            if (activeTab.hasClass("chatLobbyTab")) //Is this the chat lobby tab?
            {
                chat.totalUnread -= chat.lobbyUnread;
                chat.lobbyUnread = 0;
            }
            else {
                var pmUN = activeTab.attr("username");
                if (chat.pmUnread[pmUN] != null) {
                    chat.totalUnread -= chat.pmUnread[pmUN];
                    chat.pmUnread[pmUN] = 0;
                }
            }
        }

        if (chat.totalUnread > 0) {
            $("#dashboardUnread").show();
            if (chat.totalUnread > 1) {
                $("#dashboardUnread").text(chat.totalUnread + "- New Messages");
                document.title = "" + chat.totalUnread + "- New Messages - Liquid Church Online";
            }
            else {
                $("#dashboardUnread").text(chat.totalUnread + "- New Message");
                document.title = "" + chat.totalUnread + "- New Message - Liquid Church Online";
            }
        } else {
            $("#dashboardUnread").hide();
            document.title = "Liquid Church Online";
        }
        if (chat.lobbyUnread > 0) {
            $("#lobbyUnread").show();
            $("#lobbyUnread").text(chat.lobbyUnread);
        } else {
            $("#lobbyUnread").hide();
        }
    } catch (e) {
        addToDebugger("Chat - Error Updating Unread Counts - " + e.description);
        pageTracker._trackEvent('Chat', 'Error Updating Unread Counts', chat.username + " - " + e.description);
    }
    try {
        $(".chat .tab").each(function () {
            if (!$(this).hasClass("chatLobbyTab")) //Don't process chat lobby as that's processed above
            {
                var cUN = $(this).attr("username");
                var cUnread = $(this).find(".unreadMessages");
                cUnread.hide();
                if (chat.pmUnread[cUN] != null) {
                    if (chat.pmUnread[cUN] > 0) {
                        cUnread.show();
                        if (cUnread.text() != chat.pmUnread[cUN]) {
                            cUnread.text(chat.pmUnread[cUN]);
                        }
                    }
                }
            }
        });
    } catch (e) {
        addToDebugger("Chat - Error Updating Unread Counts - Private Messages - " + e.description);
        pageTracker._trackEvent('Chat', 'Error Updating Unread Counts - Private Messages', chat.username + " - " + e.description);    
    }
}
function isWindowMinimized() {
    return ((window.screenLeft && window.screenLeft == -32000) || (window.screenX && window.screenX == -32000));
}

function privateMessageAdd(username, eventID, prefix, message, suffix) {
    try {
        if (!chat.pmConversations[username]) {
            chat.pmConversations[username] = new Object();
        }
        if (!chat.pmConversations[username][eventID]) {
            chat.pmConversations[username][eventID] = new Object();
        }
        chat.pmConversations[username][eventID].prefix = prefix;
        chat.pmConversations[username][eventID].message = message;
        chat.pmConversations[username][eventID].messageInSourceLanguage = message;
        chat.pmConversations[username][eventID].suffix = suffix;
    } catch (e) {
        addToDebugger("Chat - Error Adding Private Message - " + e.description);
        pageTracker._trackEvent('Chat', 'Error Adding Private Message', chat.username + " - " + e.description);
    }
}
function usernameDoubleClickHandler(e) {
    var usernameTo = $(this).attr("username"); //Get the username double clicked
    if (usernameTo != chat.username && chat.username != null) { //Make sure the user selected is not the current user
        createPMTabIfNotExist(usernameTo);
        $(".chat .tabs div.tab[username='" + usernameTo + "']").click();
    }
}
function createPMTabIfNotExist(username) {
    var tabFound = $(".chat .tabs div.tab[username='" + username + "']").length > 0;
    if (!tabFound) {
        $(".chat .tabs .clear").before("<div class=\"tab\" username='" + username + "'><div class=\"text\">" + username + " <span class=\"unreadMessages\"></span></div><a class=\"close\">X</a></div>");
    }
}
function chatUpdateFailure(result) {
    chat.pendingUpdateRequest = false;
    try {
        addToDebugger("Chat - Error Updating - Web Service - " + result.get_message());
        pageTracker._trackEvent('Chat', 'Error Updating - Web Service', chat.username + " - " + result.get_message());
    }
    catch (e) { }
}
