﻿function Start()
{
    window.onresize = ResetPositions; // set base event override
    document.body.oncontextmenu = DefaultContextMenuStrip; // set base event override

    emoticons = new Array();

    for (i = 0; i < 48; i++) // load emoticons
    {
        emote = new Image();
        emote.src = "emotes/" + i + ".png";
        emoticons.push(emote);
    }

    room_list = new Array();
    udp_list = udp_list.split("\x01\x02\x03");
    udp_list.pop();

	

    if (udp_list.length > 0)
    {
        for (i = 0; i < udp_list.length; i++)
        {
            chanobj = new ChannelObject();
            temp = udp_list[i].replace(/\0/g, "").split("\x01");


            if (temp.length == 6)
            {
                chanobj.populate(temp[0], temp[1], temp[2], temp[3],
                    parseInt(parseFloat(temp[4])), parseInt(parseFloat(temp[5])));

                if (chanobj.users > 255) // filter out rooms with obvious fake user count
                    continue;

                chanobj.drawTopic();
                chanobj.language = chanobj.languageCode2String();
                room_list.push(chanobj);
            }
        }
    }

    if (room_list.length == 0)
    {
        alert("error extracting rooms!");
        return;
    }

    query = ExtractSearchQueryString();

    if (query == null)
        query = new String();
    else
        document.getElementById("textBox1").value = query.trim();

    PopulateList();
    DrawChannelList();
}

function SetToFade(enabled)
{
    document.getElementById("search_area").className = enabled ? "control_box_faded" : "control_box";
    document.getElementById("upper_boundary").className = enabled ? "column_headers_faded" : "column_headers";
    document.getElementById("main").className = enabled ? "main_faded" : "main";
    document.getElementById("instruction_area").className = enabled ? "instructions_faded" : "instructions";
    document.getElementById("list_info").className = enabled ? "list_info_faded" : "list_info";
    hashlink_showing = enabled;
}

function HashCheck(obj, col)
{
    if (!hashlink_showing)
        obj.style.backgroundColor = col;
}

function DefaultContextMenuStrip() { return false; }

function ResetPositions()
{
    if (hashlink_showing)
    {
        _o = document.getElementById("upper_boundary");

        if (_o != null)
        {
            x_start = AreaStartPositionX(_o) + 15;
            y_start = AreaStartPositionY(_o) + 50;
            _o = document.getElementById("hashlink_export_container");

            if (_o != null)
            {
                _o.style.left = x_start + "px";
                _o.style.top = y_start + "px";
                _o.style.visibility = "visible";
            }
        }
    }
}

function ExtractSearchQueryString()
{
    _tmp = window.location.href;
    _tmp = _tmp.split("?");

    if (_tmp.length < 2)
        return null;

    _tmp = _tmp[1].split("&");

    for (x = 0; x < _tmp.length; x++)
        if (_tmp[x].length > 7)
            if (_tmp[x].substr(0, 7) == "search=")
                return decodeURIComponent(_tmp[x].substr(7).replace(/\x2b/g, " "));

    return null;
}

function PopulateList()
{
    if (query == "") // send entire list
    {
        current_list = room_list;
    }
    else // list search
    {
        current_list = new Array();

        for (i = 0; i < room_list.length; i++)
            if (room_list[i].name.toUpperCase().indexOf(query.toUpperCase()) > -1 ||
              room_list[i].rawtopic.toUpperCase().indexOf(query.toUpperCase()) > -1)
                current_list.push(room_list[i]);
    }
}

function OnKeyPressed(e)
{
    if (window.event)
        keycode = window.event.keyCode;
    else
        if (e)
            keycode = e.which;
        else
            return true;

    if (keycode == 13)
    {
        OnSearchRequested();
        return false;
    }

    return true;
}

function OnSearchRequested()
{
    if (menu_showing)
        HideMenu();

    target = document.getElementById("textBox1");

    if (target != null)
    {
        target.value = target.value.trim();
        target.focus();

        if (target.value != query)
        {
            query = target.value;
            selected_index = -1;
            PopulateList();
            DrawChannelList();
        }
    }
}

function OnButtonHover(obj)
{
    if (!hashlink_showing)
    {
        obj.style.color = "#FF0000";
        obj.style.borderColor = "#FF0000";
    }
}

function OnButtonDown(obj)
{
    if (!hashlink_showing)
    {
        obj.style.color = "#00FF00";
        obj.style.borderColor = "#00FF00";
    }
}

function OnButtonUp(obj)
{
    if (!hashlink_showing)
    {
        obj.style.color = "#000000";
        obj.style.borderColor = "#000000";
    }
}

function OnButton2Hover(obj)
{
    obj.style.color = "#FF0000";
    obj.style.borderColor = "#FF0000";
}

function OnButton2Down(obj)
{
    obj.style.color = "#00FF00";
    obj.style.borderColor = "#00FF00";
}

function OnButton2Up(obj)
{
    obj.style.color = "#000000";
    obj.style.borderColor = "#000000";
}

function OnChannelOpening()
{
    chanobj = current_list[selected_index];

    if (chanobj != null)
        location.href = chanobj.hashlink;
}

function FocusCheck()
{
    if (hashlink_showing)
    {
        _o = document.getElementById("hashlink_export_container");

        if (_o != null)
            _o.focus();
    }
}

function HideMenuCheck(event)
{
    if (menu_showing)
    {
        x_start = 0;
        x_end = 0;
        y_start = 0;
        y_end = 0;
        _o = document.getElementById("upper_boundary");

        if (_o != null)
        {
            x_start += AreaStartPositionX(_o);
            x_end = (x_start + 800);
            y_start += AreaStartPositionY(_o);
            y_end = (y_start + 416);
            _p = GetMousePosition(event);

            if (_p != null)
            {
                if ((_p[0] < x_start || _p[0] > x_end) ||
                  (_p[1] < y_start || _p[1] > y_end))
                    HideMenu();
            }
        }
    }
}

function AreaStartPositionX(obj)
{
    tmp = 0;

    if (obj.offsetParent)
    {
        while (true)
        {
            tmp += obj.offsetLeft;

            if (!obj.offsetParent)
                break;

            obj = obj.offsetParent;
        }
    }
    else
    {
        if (obj.x != null)
            tmp += obj.x;
    }

    return tmp;
}

function AreaStartPositionY(obj)
{
    tmp = 0;

    if (obj.offsetParent)
    {
        while (true)
        {
            tmp += obj.offsetTop;

            if (!obj.offsetParent)
                break;

            obj = obj.offsetParent;
        }
    }
    else
    {
        if (obj.y != null)
            tmp += obj.y;
    }

    return tmp;
}

function HideMenu()
{
    target = document.getElementById("contextmenu");

    if (target != null)
    {
        target.style.visibility = "hidden";
        menu_showing = false;
    }
}

function OnChannelItemClicked(obj, event)
{
    if (menu_showing)
        HideMenu();

    if (hashlink_showing)
        return;

    _button = 0;

    if (event.which != null)
        _button = event.which;
    else
        _button = event.button;

    _id = parseInt(parseFloat(obj.id));

    if (current_list[_id] != null)
    {
        SetChannelItemBackgroundColor(false);
        selected_index = _id;
        SetChannelItemBackgroundColor(true);
    }

    if (_button > 1)
    {
        _pos = GetMousePosition(event);
        target = document.getElementById("contextmenu");

        if (target != null && selected_index > -1)
        {
            target.style.left = _pos[0] + "px";
            target.style.top = _pos[1] + "px";
            target.style.visibility = "visible";
            menu_showing = true;
        }
    }
}

function OnChannelItemDoubleClicked(obj)
{
    if (hashlink_showing)
        return;

    _id = parseInt(parseFloat(obj.id));

    if (current_list[_id] != null)
        OnChannelOpening();
}

function OnHashlinkExportRequested()
{
    HideMenu();
    SetToFade(true);
    _o = document.getElementById("upper_boundary");

    if (_o != null)
    {
        x_start = AreaStartPositionX(_o) + 15;
        y_start = AreaStartPositionY(_o) + 50;
        _o = document.getElementById("hashlink_export_container");

        if (_o != null)
        {
            _room = current_list[selected_index];

            if (_room != null)
            {
                _info = new String();
                _info += "Name: " + _room.name + "\r\n";
                _info += "Server: " + _room.version + "\r\n";
                _info += "Users: " + _room.users + "\r\n";
                _info += "Language: " + _room.language + "\r\n";
                _info += "Hashlink: " + _room.hashlink + "\r\n";
                _info += "Topic: " + _room.rawtopic;

                document.getElementById("textBox2").value = _info;

                _o.style.left = x_start + "px";
                _o.style.top = y_start + "px";
                _o.style.visibility = "visible";
            }
        }
    }
}

function CloseHashlinkWindow()
{
    _o = document.getElementById("hashlink_export_container");

    if (_o != null)
    {
        _o.style.visibility = "hidden";
        SetToFade(false);
    }
}

function OnRightClickJoinRoom()
{
    HideMenu();
    OnChannelOpening();
}

function SetChannelItemBackgroundColor(isSelected)
{
    target = document.getElementById(selected_index.toString());

    if (target != null)
    {
        for (cn = 0; cn < target.childNodes.length; cn++)
            target.childNodes[cn].className = isSelected ? "column_dark_blue" : ((selected_index % 2 > 0) ? "column_blue" : "column_white");
    }
}

function DrawChannelList()
{
    target = document.getElementById("main");
    str = "<table class=\"contents\">\r\n";
    isWhite = true;

    for (i = 0; i < current_list.length; i++)
    {
        str += "<tr onmouseup=\"OnChannelItemClicked(this, event)\" ondblclick=\"OnChannelItemDoubleClicked(this)\" id=\"" + i + "\">\r\n";
        str += "<td class=\"" + ((i % 2 > 0) ? "column_blue" : "column_white") + "\"><div class=\"name_column\">" + current_list[i].name + "</div></td>\r\n";
        str += "<td class=\"" + ((i % 2 > 0) ? "column_blue" : "column_white") + "\"><div class=\"middle_column\">" + current_list[i].version + "</div></td>\r\n";
        str += "<td class=\"" + ((i % 2 > 0) ? "column_blue" : "column_white") + "\"><div class=\"middle_column\">" + current_list[i].users + "</div></td>\r\n";
        str += "<td class=\"" + ((i % 2 > 0) ? "column_blue" : "column_white") + "\"><div class=\"language_column\">" + current_list[i].language + "</div></td>\r\n";
        str += "<td class=\"" + ((i % 2 > 0) ? "column_blue" : "column_white") + "\"><div class=\"topic_column\">" + current_list[i].topic + "</div></td>\r\n";
        str += "</tr>\r\n";

        isWhite = !isWhite;
    }

    str += "</table>";
    target.innerHTML = str;
    target = document.getElementById("list_info");
    target.innerHTML = "Showing " + current_list.length + " of " + room_list.length + " rooms";
}

function SortByName()
{
    if (hashlink_showing)
        return;

    document.getElementById("main").innerHTML = "";
    sort_ascending = !sort_ascending;
    room_list.sort(SortByNameComparer);
    PopulateList();
    DrawChannelList();
}

function SortByNameComparer(room1, room2)
{
    if (sort_ascending)
    {
        if (room1.name.toUpperCase() > room2.name.toUpperCase())
            return 1;

        if (room1.name.toUpperCase() < room2.name.toUpperCase())
            return -1;

        return 0;
    }
    else
    {
        if (room1.name.toUpperCase() < room2.name.toUpperCase())
            return 1;

        if (room1.name.toUpperCase() > room2.name.toUpperCase())
            return -1;

        return 0;
    }
}

function SortByServer()
{
    if (hashlink_showing)
        return;

    document.getElementById("main").innerHTML = "";
    sort_ascending = !sort_ascending;
    room_list.sort(SortByServerComparer);
    PopulateList();
    DrawChannelList();
}

function SortByServerComparer(room1, room2)
{
    if (sort_ascending)
    {
        if (room1.version.toUpperCase() > room2.version.toUpperCase())
            return 1;

        if (room1.version.toUpperCase() < room2.version.toUpperCase())
            return -1;

        return 0;
    }
    else
    {
        if (room1.version.toUpperCase() < room2.version.toUpperCase())
            return 1;

        if (room1.version.toUpperCase() > room2.version.toUpperCase())
            return -1;

        return 0;
    }
}

function SortByUserCount()
{
    if (hashlink_showing)
        return;

    document.getElementById("main").innerHTML = "";
    sort_ascending = !sort_ascending;
    room_list.sort(SortByUserCountComparer);
    PopulateList();
    DrawChannelList();
}

function SortByUserCountComparer(room1, room2)
{
    if (sort_ascending)
    {
        if (room1.users > room2.users)
            return 1;

        if (room1.users < room2.users)
            return -1;

        return 0;
    }
    else
    {
        if (room1.users < room2.users)
            return 1;

        if (room1.users > room2.users)
            return -1;

        return 0;
    }
}

function SortByLanguage()
{
    if (hashlink_showing)
        return;

    document.getElementById("main").innerHTML = "";
    sort_ascending = !sort_ascending;
    room_list.sort(SortByLanguageComparer);
    PopulateList();
    DrawChannelList();
}

function SortByLanguageComparer(room1, room2)
{
    if (sort_ascending)
    {
        if (room1.language.toUpperCase() > room2.language.toUpperCase())
            return 1;

        if (room1.language.toUpperCase() < room2.language.toUpperCase())
            return -1;

        return 0;
    }
    else
    {
        if (room1.language.toUpperCase() < room2.language.toUpperCase())
            return 1;

        if (room1.language.toUpperCase() > room2.language.toUpperCase())
            return -1;

        return 0;
    }
}

function SortByTopic()
{
    if (hashlink_showing)
        return;

    document.getElementById("main").innerHTML = "";
    sort_ascending = !sort_ascending;
    room_list.sort(SortByTopicComparer);
    PopulateList();
    DrawChannelList();
}

function SortByTopicComparer(room1, room2)
{
    if (sort_ascending)
    {
        if (room1.rawtopic.toUpperCase() > room2.rawtopic.toUpperCase())
            return 1;

        if (room1.rawtopic.toUpperCase() < room2.rawtopic.toUpperCase())
            return -1;

        return 0;
    }
    else
    {
        if (room1.rawtopic.toUpperCase() < room2.rawtopic.toUpperCase())
            return 1;

        if (room1.rawtopic.toUpperCase() > room2.rawtopic.toUpperCase())
            return -1;

        return 0;
    }
}

String.prototype.trim = function()
{
    _trim = this;

    if (_trim.length == 0)
        return _trim;

    while (_trim.substr(0, 1) == " ")
        _trim = _trim.substr(1);

    if (_trim.length == 0)
        return _trim;

    while (_trim.substr(_trim.length - 1) == " ")
        _trim = _trim.substr(0, _trim.length - 1);

    return _trim;
}

function GetMousePosition(event)
{
    if (event.pageX != null)
        return new Array(event.pageX, event.pageY);

    if (event.clientX)
    {
        _x = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft;
        _y = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop;

        return new Array(event.clientX + _x, event.clientY + _y);
    }

    return null;
}
