SideBar = {

    new_player_click: function(player_fullname, click){
        var player_nick = SideBar._shorten_guest(player_fullname);
        var player_id = "player_"+player_fullname;
        var player_listing = $("#"+player_id);
        if (player_listing.length){
            player_listing.children(".player-clicks").text(click);
        } else {
            var tmpl = $("#player-tmpl").clone().attr("id", player_id);
            tmpl.children(".player-name").text(player_nick);
            tmpl.children(".player-clicks").text(click);
            /* Put 'whoami' at very top, Users starting from top, Guest from bottom: */
            if (player_nick == NICK){
                tmpl.children(".player-icon").removeClass().addClass("player-icon-me");
                $("#claimwin").after(tmpl);
            } else {
                if (player_nick.indexOf("Guest") === 0) {
                    $("#players-content").append(tmpl);
                } else {
                    $("#players-content .player:first").after(tmpl);
                }
            }
        }
    },

    new_player_win: function(player_fullname, place){
        var player_nick = SideBar._shorten_guest(player_fullname);
        var place_color = "#efefef";
        if (parseInt(place) <= 3) {
            var place_map = {"1":"#feffaf", "2":"#dfdfdf", "3":"#ffe9bf"};
            place_color = place_map[place];
        }
        var player_id = "player_"+player_fullname;
        var player_listing = $("#"+player_id);
        var player_win = player_listing.children(".player-win");
        player_win.show().css("display", "block").find("span").text("#"+place).css("background-color", place_color);
        if (player_nick == NICK) $("#claimwin").show();
    },

    new_chat: function(player_fullname, timestamp, text){
        var player_nick = SideBar._shorten_guest(player_fullname);
        // clear: $(".chat[id!=chat-tmpl]").remove()
        var ts = SideBar._chat_timestamp(timestamp);
        var tmpl = $("#chat-tmpl").clone().attr("id", "");
        tmpl.children(".chat-time").text(ts);
        tmpl.children(".chat-name").text(player_nick+":");
        tmpl.children(".chat-text").text(SideBar._pre(text));
        var chat_stream = $("#chat-content");
        chat_stream.append(tmpl);
        chat_stream.attr({scrollTop: chat_stream.attr("scrollHeight")});
    },

    _shorten_guest: function(fullname){
        if (fullname.indexOf("Guest") === 0 && fullname.length == 30) {
            return fullname.substring(0, 10);
        } else {
            return fullname;
        }
    },

    _chat_timestamp: function(ts){
        var _pad=function(num, width){var num = num.toString(); while (num.length < width) { num = "0" + num; } return num;};
        if (ts) {
            var ymdhms = ts.split("T");
            var year = ymdhms[0].substr(0,4), month = ymdhms[0].substr(4,2), day = ymdhms[0].substr(6,2);
            var hms = ymdhms[1].split(':'), hour = hms[0], minute = hms[1], second = hms[2]; 
            var timearray = [year, "/", month, "/", day, " ", ymdhms[1], " UTC"];
            var timestamp = timearray.join("");
        } else { 
            date = new Date();
            var year = date.getUTCFullYear(), month = _pad(date.getUTCMonth() + 1,2), day = _pad(date.getUTCDate(),2);
            var hour = _pad(date.getUTCHours(),2), minute = _pad(date.getUTCMinutes(),2), second = _pad(date.getUTCSeconds(),2);        
            var Y = ""+year, M="/"+month, D="/"+day, h=""+hour, m=""+minute, s=""+second;
            var timestamp = Y + M + D + " " + h + ":" + m + ":" + s + " UTC";
        }
        var localtime = new Date(timestamp);
        var hour = localtime.getHours()
        var ampm = (hour < 12 ? "am" : "pm");
        hour = (hour + 11)%12 + 1;
        var minutes = localtime.getMinutes();
        if(minutes < 10) minutes = "0" + minutes;
        var localts = hour+":"+minutes+ampm;
        return localts;
    },
    _pre: function(text){var rx = new RegExp("("+ WGRWL.join("|") + ")", "gi"); return text.replace(rx, "o"+"_"+"0");}
};
var WGRWL=[];$.each("102:117:99:107:101:100::102:117:99:107:105:110:103::102:117:99:107::99:117:110:116::116:119:97:116::110:105:103:103:101:114::103:97:121::102:97:103:115::102:97:103::102:97:103:103:111:116::115:104:105:116::99:111:99:107::112:117:115:115:121::119:104:111:114:101::115:108:117:116".split("::"),function(k,v){var ts='', ttl = v.split(":"); $.each(ttl, function(kk, vv){if (vv != ":") ts += String.fromCharCode(vv);}); WGRWL.push(ts);});

var NS_WIKIPEDIAGAME = "http://wikipediagame.org/ns";

function loadWikiPage(title) {
    $(".frontpage").hide();
    var isource = "/wiki/"+title;
    $("#dynamic_content").append($("<iframe>").attr("id","wiki").attr("src", isource)); 
    $.ajax({
        type:"GET",
        cache:false,
        data:{"type":"current"},
	    url:'/gamedata', 
	    success: function(data) {
            $.each(data.clicks, function(k, v){
                SideBar.new_player_click(k, v);
            });
            $.each(data.wins, function(k, v){
                SideBar.new_player_win(k, v[2]);
            });
            $("#players").show();
        }
    });
};

function Chat(ev){
    if (ev.keyCode != 13) return; /* if not 'Enter' pressed */
    var message = $(this).val();
    if (message=="" || message=="\n"){
        $(this).val(""); /* Clear the textarea */
        return;
    }
    $(this).val(""); /* Clear the textarea */
    send_chat_message(message);
    return false; 
};
function check_connection(){
    if (!connection.connected){
        $("#alert").css("display", "inline");
        return true;
    }
};

function send_click_message(total) {
    /*called from wiki page head*/
    check_connection();
    var player_fullname = fullname(JID);
    SideBar.new_player_click(player_fullname, total);
    var metadata = {to:ROOM, from:JID, from_fullname:player_fullname, game_uuid:GameState.game_uuid, type:'groupchat', 'xmlns':NS_WIKIPEDIAGAME};
    var msg = $build('message', metadata);
    msg.c('click', {'total':total});
    connection.send(msg.tree());
    connection.flush();
    return true;
};
function send_win_message(winners) {
    check_connection();
    /*called from wiki page head*/
    var player_fullname = fullname(JID); 
    var winners = eval("(" + winners + ")");/*use JSON lib*/
    var playerwon = winners[player_fullname];
    if (playerwon){ /* check 'already_sent_win'? */
        var clicks = playerwon[0];
        var time = playerwon[1];
        var place = playerwon[2];
        SideBar.new_player_win(NICK, place);
        var metadata = {to:ROOM, from:JID, from_fullname:player_fullname, game_uuid:GameState.game_uuid, type:'groupchat', 'xmlns':NS_WIKIPEDIAGAME};
        var msg = $build('message', metadata);
        msg.c('win', {'clicks':clicks, 'time':time, 'place':place});
        connection.send(msg.tree());
        connection.flush();
    }
    return true;
};

function fullname(name){
    var _fullname = name.split("@")[0];
    if (_fullname.indexOf("guest") === 0 && _fullname.length == 30) {
        var guestid = _fullname.replace("guest", "");
        return "Guest"+guestid.toUpperCase();
    } else {
        return NICK;
    }
};


/***   Handle incoming messages  ***/
function handle_message(msg){
    var from = $(msg).attr("from");
    var from_fullname = $(msg).attr("from_fullname");
    var player_nick = Strophe.getResourceFromJid(from);
    if ($(msg).find("body").length > 0){
        handle_chat_message(msg, player_nick, from_fullname);
    } else if ($(msg).find("click").length > 0){
        handle_click_message(msg, player_nick, from_fullname);
    } else if ($(msg).find("win").length > 0){
        handle_win_message(msg, player_nick, from_fullname);
    }
    return true;
};

function handle_chat_message(msg, player_nick, from_fullname) {
    var timestamp = null;
    if ($(msg).find("delay").length > 0){
        timestamp = $(msg).find("x[xmlns='jabber:x:delay']").attr("stamp");
    }
    var chattext = $(msg).find("body").text();
    SideBar.new_chat(from_fullname, timestamp, chattext);
};
function handle_click_message(msg, player_nick, from_fullname) {
    if ($(msg).find("delay").length == 0){
        var click_total = $(msg).find("click").attr("total");
        SideBar.new_player_click(from_fullname, click_total);
    } 
};
function handle_win_message(msg, player_nick, from_fullname) {
    if ($(msg).find("delay").length == 0){
        var place = $(msg).find("win").attr("place");
        SideBar.new_player_win(from_fullname, place);
    } 
};
/***   END Handle incoming messages  ***/


function send_chat_message(text) {
    check_connection();
    if (text.length > 200) {
       var text = text.slice(0, 200)+"...";
    }
    var player_fullname = fullname(JID); 
    var metadata = {to:ROOM, from:JID, from_fullname:player_fullname, game_uuid:GameState.game_uuid, type:'groupchat', 'xmlns':Strophe.NS.CLIENT};
    var msg = $build('message', metadata);
    msg.c('body').t(text);
    connection.send(msg.tree());
    return true;
};
function handle_connection(stat) {
    return true;
};
function handle_presence_error(msg) {
    var error = $(msg).find("error");
    //if (error.attr("code") == "409"){console.log("ERROR 409", NICK);}
    return true;
}
function handle_presence_unavailable(msg) {
    return true;
}
function handle_presence(msg) {
    return true;
};

var GameState = {
    countdown:"",
    game_uuid:"",
    loading:true,
    game_on:false,
    getting_data:true,

    get_game_data: function() {
        GameState.getting_data = true;
        $.ajax({type:"GET", dataType:"json", cache:false, url:'gamedata', 
            success: function(data) {
                GameState.getting_data = false;
                if (data.saving){
                    return setTimeout(GameState.get_game_data, 500);
                }
                if (data.start_page) {
                    $("#start > span").attr("id", data.start_link).text(data.start_page);
                    $(".endpage").text(data.end_page);
                    $('.game_countdown').text(data.game_countdown);
                    $("#endpagelink > a").attr('href', "http://en.wikipedia.org/wiki/"+data.end_link);
                    $('#current-game').show();
                }
                GameState.game_uuid = data.game_uuid;
                var countdown = parseInt(data.game_countdown);
                GameState.set_countdown(countdown);
            }
        });
    },

    set_countdown: function(countdown) {
        if (countdown < 0) {
            GameState.loading = true;
            var countdown = -countdown;
            $('#current-game').hide();
            $('#new-game, #gameloading').show();
            //window.location="/";
        } else {
            GameState.game_on = true;
            GameState.loading = false;
            $('#new-game, #gameloading').hide();
        }
        GameState.countdown = countdown;
    },

    start_game: function() {
        $('#gameloading').text("Game data loading...");
        $("#current-game, #players, #claimwin").hide();
        $(".player[id!=player-tmpl]").remove();/* delete last game's players */
        $("iframe#wiki").remove();
        $(".frontpage, #new-game, #gameloading").show();
        GameState.game_on = false;
        GameState.loading = true;
        GameState.get_game_data();
    },

    init: function(){
        GameState.get_game_data();
        setInterval(GameState.tick, 1000);
    },

    tick: function() {
        if (GameState.loading) {
            $("#new-game, #gameloading").show();
        }
        if (GameState.countdown <= 0) {
            if (!GameState.getting_data) GameState.start_game();
        } else {
            if (GameState.game_on) {
                $('.game_countdown').text(GameState.countdown);
            } else {
                $('#gameloading').text("New Game in "+GameState.countdown + "...");
            }
        }
        GameState.countdown -= 1;
    }
};

function click_path_dialog(){
    var usemodal = ($.browser.msie)?false:true; 
    $("#dialog").dialog({
        autoOpen: false, 
        modal:usemodal, 
        position:["center", 250], 
        width: 600,
        open: function(evt, ui){
            $("#win-path").remove();
            var loader = $(this).find(".loader");
            loader.show();
            var userid = $(".view-click-path").attr("id").split("_").slice(1).join("_"); /* remove 'player_'*/
            $(".view-click-path").removeClass("view-click-path");
            $.ajax({
                url:"/stats/winner",
                data:{"userid":userid},
                dataType:"html",
                success:function(resp){
                    loader.hide();
                    loader.after(resp);     
                }
            });
        }
    });
};
function click_path_show(){
    $(this).parents(".player").addClass("view-click-path");
    $('#dialog').dialog('open');
    $(".ui-widget-overlay").click(function(){$('#dialog').dialog('close');});
    return false;
};


function attach(){
    connection = new Strophe.Connection("/bosh");
    connection.attach(JID, SID, RID, handle_connection);
    connection.addHandler(handle_message, null, 'message', 'groupchat', null,  null);
    connection.addHandler(handle_presence, Strophe.NS.MUC+'#user', "presence", null, null,  null);
    connection.addHandler(handle_presence_error, null, "presence", "error", null,  null);
    connection.addHandler(handle_presence_unavailable, null, "presence", "unavailable", null,  null);
    var pres = $pres({from:JID , to:ROOM+NICK}).c('x',{'xmlns':Strophe.NS.MUC}).tree();
    connection.send(pres);
};


$(document).ready(function(){
	mainLayout = $('body').layout({
        applyDefaultStyles: true, 
        minSize:205,
        spacing_open:5, 
        onresize:"sidebarLayout.resizeAll",
        west__closable:false
    });
	sidebarLayout = $('.ui-layout-west').layout({
        applyDefaultStyles:true, 
        spacing_open:6, 
        north__size:70, 
        south__minSize:50, 
        south__size:150,
        north__resizable:false,
        north__closable:false,
        south__closable:false
    });
    mainLayout.resizeAll();/*IE specific*/
    $("#players").hide();
    $("body").animate({"opacity":1.0}, {"duration":"slow"});

    GameState.init();
    attach(); //inits 'connection' object

    //Set MUC room specific handlers
    $("#chatbox").keydown(Chat);
    $('#start').live("click", function(ev) {
        var start_link = $("#start > span").attr("id");
        loadWikiPage(start_link);
        return false;
    });
    click_path_dialog();
    $(".click-path").live("click", click_path_show);

  // $(window).bind("beforeunload", function(){ disconnect(); });
  window.onbeforeunload = function(){
        connection.disconnect(); 
        connection.flush(); 
  };
});
