/********
* dojo, and therefore js.io, can not currently
* grab resources cross-port
js.io.require('js.io.tools.ui.tablesort');
js.io.require('js.io.tools.ui.stripper');
js.io.require('js.io.tools.io.jsonreader');
* we have to use rafina.js instead
********/

ENTER_KEY = 13;
DELIM = ":";

function WordRace() {
    var self = this;
    var conn = null;
    var sorter = null;
    var reader = null;
    var stripper = null;

    var parse_event = function(data) {
        switch(data[0]) {
            case "SCORE": score(data[1]); break;
            case "WORD": WORD.innerHTML = data[1]; break;
            case "ALERT": notification(data[1]); break;
            case "JOIN": join(data[1]); break;
            case "LEAVE": leave(data[1]); break;
            case "WELCOME": welcome(data[1]); break;
            case "SIGNEDIN": signedin(); break;
        }
    }

    var signedin = function() {
        ENTER_NAME.style.display = "none";
        SKIP.disabled = false;
        RESET.disabled = false;
        notification("game on!");
    }

    var score = function(data) {
        var player = document.getElementById("player_"+data[0]);
        player.childNodes[1].innerHTML = data[1];
        sorter.adjust(player);
    }

    var join = function(data) {
        var player = SCORE.insertRow(-1);
        player.id = "player_"+data[0];
        var n = player.insertCell(-1);
        n.innerHTML = data[0];
        var s = player.insertCell(-1);
        s.innerHTML = data[1];
        sorter.adjust(player);
    }

    var leave = function(data) {
        var player = document.getElementById("player_"+data);
        player.parentNode.removeChild(player);
    }

    var welcome = function(data) {
        WORD.innerHTML = data[0];
        for (var i = 0; i < data[1].length; i++) {
            join(data[1][i]);
        }
    }

    var notification = function(data) {
        var d = document.createElement('div');
        d.className = "snippet";
        d.innerHTML = data;
        ALERT.appendChild(d);
        if (ALERT.childNodes.length == 4) {
            ALERT.removeChild(ALERT.childNodes[0]);
        }
    }

    var guess = function(e) {
        e = e || window.event;
        var str = stripper.lower(TEXT.value);
        if (str.length > 2 && e.keyCode == ENTER_KEY) {
            conn.send(str.slice(0,7)+DELIM);
            TEXT.value = "";
        }
    }

    var connected = function(e) {
        notification("enter name");
        SKIP.disabled = true;
        RESET.disabled = true;
        INPUT.style.display = "block";
        TEXT.focus();
    }

    self.skip = function() {
        conn.send("!" + DELIM);
        TEXT.focus();
    }

    self.reset = function() {
        conn.send("?" + DELIM);
        TEXT.focus();
    }

    self.connect = function() {
        notification("connecting");
        document.onkeydown = guess;
        sorter = new Rafina.TableSort();
        sorter.set_column(1);
        reader = new Rafina.JSONReader();
        reader.set_cb(parse_event);
        stripper = new Rafina.Stripper();
        conn = new Orbited.TCPSocket();
        conn.onread = reader.read;
        conn.onopen = connected;
        conn.open("localhost",9999,false);
        window.onbeforeunload = function() {
            conn.reset();
        }
    }
}

function start_wordrace() {
    SCORE = document.getElementById('score');
    WORD = document.getElementById('word');
    ALERT = document.getElementById('alert');
    INPUT = document.getElementById('input');
    INPUT.style.display = "none";
    SKIP = document.getElementById('skip');
    RESET = document.getElementById('reset');
    TEXT = document.getElementById('text');
    ENTER_NAME = document.getElementById('enter_name');
    race = new WordRace();
    race.connect();
}
