var req;
var g_lastLine = "[Entered room.]";
var g_nick = "";
var g_delay = 5000;
var g_fingerprint = "";
var g_chair_max = 9;
var g_avatar_max = 37;
var g_bubble_max = 9;
var g_avatar_choice = 0;
var g_baseUrl = "/chat/process.php5?";
var g_updateTimeout = -1;
var g_assertTimeout = -1;
var g_room_tag = "";

function init(room_tag)
{
    g_room_tag = room_tag;
    if (g_room_tag != '')
    {
        showLayer("loginscreen");
    }
}

function debug(s)
{
    var elm = document.getElementById("debug");
    if (elm)
    {
        elm.innerHTML = "Debug: " + s;
    }
}

function debugUrl(s)
{
    var elm = document.getElementById("debug");
    if (elm)
    {
        elm.innerHTML = "Debug: <a target=\"_blank\" href=\"" + s + "\">" + s + "</a>";
    }
}

function showLayer(s)
{
    var elm = document.getElementById(s);
    if (elm)
    {
        elm.style.display = "block";
    }
}

function hideLayer(s)
{
    var elm = document.getElementById(s);
    if (elm)
    {
        elm.style.display = "none";
    }
}

function changeAvatar()
{
    var elm = document.getElementById("avatarSelection");
    g_avatar_choice = elm.value;

    elm = document.getElementById("avatarchoice");
    elm.src = "/chat/avatar/" + g_avatar_choice + ".gif";
}

/*
function showNextAvatar()
{
    if (++g_avatar_choice > g_avatar_max)
    {
        g_avatar_choice = 1;
    }
    var elm = document.getElementById("avatarchoice");
    elm.src = "/chat/avatar/" + g_avatar_choice + ".gif";
}

function showLastAvatar()
{
    if (--g_avatar_choice < 1)
    {
        g_avatar_choice = g_avatar_max;
    }
    var elm = document.getElementById("avatarchoice");
    elm.src = "/chat/avatar/" + g_avatar_choice + ".gif";
}
*/

function tryExit()
{
    clearTimeout(g_updateTimeout);
    g_lastLine = "[Entered room.]";
    hideLayer("chatform");

    var url = g_baseUrl + "nick=" + escape(g_nick) + "&fingerprint=" + escape(g_fingerprint) + "&mode=exit&room_tag=" + escape(g_room_tag) + getCachePrevent();
    debugUrl(url);
    g_fingerprint = "";
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
    }
    else if (window.ActiveXObject) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
    }
    req.onreadystatechange = processExit;
    req.open("GET", url, true);
    req.send(null);
}

function tryEnter()
{
    if (g_avatar_choice >= 1)
    {
        var nick = "";
        var nick_elm = document.getElementById("nickchoice");
        nick = nick_elm.value;
        g_nick = nick;
        var url = g_baseUrl + "nick=" + escape(nick) + "&avatar=" + g_avatar_choice + "&mode=enter&room_tag=" + escape(g_room_tag) + getCachePrevent();
        hideLayer("loginscreen");
        debugUrl(url);
    
        if (window.XMLHttpRequest) {
            req = new XMLHttpRequest();
        }
        else if (window.ActiveXObject) {
            req = new ActiveXObject("Microsoft.XMLHTTP");
        }
        req.onreadystatechange = processEnter;
        req.open("GET", url, true);
        req.send(null);
    }
    else
    {
        alert("Please choose an avatar first.");
    }
}

function processEnter()
{
    if (req.readyState == 4)
    {
        if (req.status == 200)
        {
            isSuccess = false;

            var d = req.responseXML.getElementsByTagName("status");
            if (d.length > 0)
            {
                for (var n = 0; n < d.length; n++)
                {
                    if ( d[n].getAttribute("success") == 1 )
                    {
                        isSuccess = true;
                        g_fingerprint = d[n].firstChild.data;
                        // alert("You entered the chat bar.");
                        showLayer("chatform");
                    }
                    else
                    {
                        alert(d[n].firstChild.data);
                    }
                }
            }

            if (isSuccess)
            {
                setTimeout( "updateChat()", 100 );
            }
            else
            {
                setTimeout( "showLayer('loginscreen')", 100 );
            }
        }
        else
        {
            alert("Can't retrieve XML: " + req.statusText);
        }
    }
}

function processExit()
{
    if (req.readyState == 4)
    {
        if (req.status == 200)
        {
            isSuccess = false;

            var d = req.responseXML.getElementsByTagName("status");
            if (d.length > 0)
            {
                for (var n = 0; n < d.length; n++)
                {
                    if ( d[n].getAttribute("success") == 1 )
                    {
                        emptyChat();
                        // alert(d[n].firstChild.data);
                    }
                }
            }

            setTimeout( "showLayer('loginscreen')", 100 );
        }
        else
        {
            alert("Can't retrieve XML: " + req.statusText);
        }
    }
}

function ucfirst(s)
{
    return s.substr(0, 1).toUpperCase() + s.substr(1, s.length);
}

function emptyChat()
{
    var elm;

    for (i = 1; i <= g_chair_max; i++)
    {
        elm = document.getElementById("avatar" + i);
        elm.src = "/chat/avatar/0.gif";

        elm = document.getElementById("nick" + i);
        elm.innerHTML = "";
    }

    for (i = 1; i <= g_bubble_max; i++)
    {
        elm = document.getElementById("bubble" + i);
        elm.firstChild.data = "";
        elm.style.display = "none";
    }
    document.title = ucfirst(g_room_tag) + " Chat at Google Blogoscoped";
}


function saidSomething()
{
    if (g_lastLine == "")
    {
        var elm = document.getElementById("chatinput");
        g_lastLine = elm.value;
        if (g_lastLine != "")
        {
            clearTimeout(g_updateTimeout);
            g_updateTimeout = -1;
            elm.value = "";
            updateChat();
        }
    }

    return false;
}

function checkKeyLogin(e)
{
    var returnKey = 13;
    var characterCode = -1;

    if(e && e.which)
    {
        e = e;
        characterCode = e.which;
    }
    else
    {
        e = event;
        characterCode = e.keyCode;
    }

    if(characterCode == returnKey)
    {
        tryEnter();
    }
    return false;
}

function checkKey(e)
{
    var returnKey = 13;
    var characterCode = -1;

    if(e && e.which)
    {
        e = e;
        characterCode = e.which;
    }
    else
    {
        e = event;
        characterCode = e.keyCode;
    }

    if(characterCode == returnKey)
    {
        saidSomething();
    }
    return false;
}

function getCachePrevent()
{
    return "&rand=" + escape( Math.round( Math.random() * 10000 ) );
}

function updateChat()
{
    var url = g_baseUrl + "mode=update&nick=" + escape(g_nick) + "&line=" + escape(g_lastLine) + "&fingerprint=" + escape(g_fingerprint) + "&room_tag=" + escape(g_room_tag) + getCachePrevent();

    debugUrl(url);

    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
    }
    else if (window.ActiveXObject) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
    }
    req.onreadystatechange = processChat;
    req.open("GET", url, true);
    req.send(null);
}

function autolink(s)
{
    var regURL = new RegExp("(http|https|ftp)://([-/.a-zA-Z0-9_~#%$?&=:200-377()]+)", "gi");
    s = s.replace(regURL, "<a href='$1://$2' rel='nofollow' target='_blank'>$1://$2</a>");
    return s;
}

function doReplace(s, a, b)
{
    var regex = new RegExp(a, "g");
    s = s.replace(regex, b);
    return s;
}

function toXml(s)
{
    s = doReplace(s, "&", "&amp;");
    s = doReplace(s, "<", "&lt;");
    s = doReplace(s, ">", "&gt;");
    return s;
}

function processChat()
{
    if (req.readyState == 4)
    {
        if (req.status == 200)
        {
            var d = req.responseXML.getElementsByTagName("chatline");
            if (d.length > 0)
            {
                for (var n = 0; n < d.length; n++)
                {
                    var pos = d[n].getAttribute("position");
                    var bubbleN = d[n].getAttribute("bubble");
                    var bubble = document.getElementById("bubble" + bubbleN);
                    if (bubble)
                    {
                        if (pos == 0)
                        {
                            if (bubble.style.display != "none")
                            {
                                bubble.style.display = "none";
                            }
                        }
                        else
                        {
                            var said = d[n].firstChild.data;
                            said = toXml(said);
                            if (said == "[Entered room.]")
                            {
                                said = "<em>" + said + "</em>";
                            }
                            if (said.length < 35)
                            {
                                said = "&nbsp;<br/>" + said;
                            }
                            said = autolink(said);
                            var saidOldHtml = doReplace(said, "<br/>", "<br>");

                            var p_x = getPosX(pos) + "px";

                            if (bubble.style.left != p_x)
                            {
                                bubble.style.left = p_x;
                            }
                            if (bubble.innerHTML != said && bubble.innerHTML != saidOldHtml)
                            {
                                bubble.innerHTML = said;
                            }
                            if (bubble.style.display != "block")
                            {
                                bubble.style.display = "block";
                            }
                        }
                    }
                }
            }

            d = req.responseXML.getElementsByTagName("chair");
            var visitorCount = 0;

            if (d.length > 0)
            {
                for (var n = 0; n < d.length; n++)
                {
                    var pos = d[n].getAttribute("position");

                    var avatar = document.getElementById("avatar" + pos);
                    var sAvatar = "/chat/avatar/" + d[n].getAttribute("avatar") + ".gif";
                    if ( avatar.src.indexOf(sAvatar) == -1 ) {
                        avatar.src = sAvatar;
                    }

                    var nick = document.getElementById("nick" + pos);
                    var sNick = d[n].getAttribute("nick");
                    if (sNick != "")
                    {
                        visitorCount++;
                    }

                    if (nick.innerHTML != sNick)
                    {
                        nick.innerHTML = sNick;
                    }
                }
            }

            document.title = ucfirst(g_room_tag) + " Chat With " + visitorCount;

            g_lastLine = "";
            g_updateTimeout = setTimeout("updateChat()", g_delay);

            d = req.responseXML.getElementsByTagName("order");
            if (d.length > 0)
            {
                for (var n = 0; n < d.length; n++)
                {
                    switch ( d[n].getAttribute("action") )
                    {
                        case "exit":
                            clearTimeout(g_updateTimeout);
                            hideLayer("chatform");
                            emptyChat();
                            showLayer("loginscreen");
                            break;
                    }
                }
            }

        }
    }
}

function getPosX(pos)
{
    var x = 0;
    switch (pos + "")
    {
        case "1": x = -32; break;
        case "2": x = 62; break;
        case "3": x = 152; break;
        case "4": x = 252; break;
        case "5": x = 349; break;
        case "6": x = 450; break;
        case "7": x = 542; break;
        case "8": x = 645; break;
        case "9": x = 745; break;
    }
    return x;
}
