function Topic(data) {
    data = ("" + data).split("<");
    var name = data[0];
    var size = data[1];
    this.getSize = function() { return size; };
    this.getName = function() { return name; };
}

function TopicList() {
    var items = new Array();
    var flag = false;
    this.setFlag = function() { flag = true; };

    this.printList = function() {
        var list = document.getElementById("list");
        list.innerHTML = "<b>Topics<\/b><br \/>";
        for (var i = 0; i < items.length; i++) {
            list.innerHTML += "<a href=\"topic.jsp?channel=" + items[i].getName() +
            "&amp;nick=" + nick + "&amp;color=" + color + "\">" +
            abbrev(items[i].getName()) + "<\/a> " + "(" + items[i].getSize() + ")<br \/>";
        }
        list.innerHTML += "<a href=\"topics.jsp?sort=size&nick=" + nick + "\">more...<\/a><br \/>";
    };

    this.update = function(data) {
        if (data.indexOf("<<") !== -1) {
            items = new Array();
            data = ("" + data).split("<<");
            for (var i = 0; i < data.length; i++) {
                add(new Topic(data[i]));
            }
        }
        else {
            dealWith(data);
        }
        this.printList();
        if (flag === true) {
            var element = document.getElementById("topTopic");
            var topTopic = getTopTopic();
            element.innerHTML = topTopic;
            element.href = "topic.jsp?channel=" + topTopic + "&nick=" + nick + "&color=" + color;
            flag = false;
        }
    };

    function dealWith(data) {
        var topic = new Topic(data);
        for (var i = 0; i < items.length; i++) {
            if (topic.getName() === items[i].getName()) {
                if (topic.getSize() > items[i].getSize()) {
                    this.title = "Someone joined " + topic.getName();
                    items[i] = topic;
                    climb(i);
                }
                else {
                    this.title = "Someone left " + topic.getName();
                    if (topic.getSize() === 0) {
                        remove(i);
                    }
                    else {
                        items[i] = topic;
                        fall(i);
                    }
                }
                return;
            }
        }
        add(topic);
        climb(items.length - 1);
        setTitle("New topic: " + topic.getName());
    }

    function getTopTopic() {
        if (items.length === 0) {
            return "Linden Casinos";
        }
        else {
            return items[0].getName();
        }
    }

    function climb(index) {
        for (var i = index - 1; i > 0; i--) {
            if (topicList[i].getSize() > topicList[i - 1].getSize()) {
                var temp = topicList[i];
                topicList[i] = topicList[i - 1];
                topicList[i - 1] = temp;
            }
        }
    }

    function fall(index) {
        for (var i = topicList.length - 1; i > index + 1; i--) {
            if (topicList[i].getSize() > topicList[i - 1].getSize()) {
                var temp = topicList[i];
                topicList[i] = topicList[i - 1];
                topicList[i - 1] = temp;
            }
        }
    }

    function remove(index) {
        for (var i = index; i < items.length; i++) {
            if (i === items.length - 1) {
                items.pop();
            }
            else {
                items[i] = items[i + 1];
            }
        }
    }

    function add(item) { items[items.length] = item; }
}