WG_SideBar = {

    new_player_click: function(player_fullname, click){
        /* TODO: handle new_click_count < current_click_count correctly
        aka, solve back-button issue*/
        var player_nick = WG_SideBar._shorten_guest(player_fullname);
        var player_id = "player_"+player_fullname;
        var player_listing = $("#"+player_id);
        if (parseInt(click) == -1){
            click = "No win";
        }
        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");
                $("#player-content-me").append(tmpl);
            } else {
                if (player_nick.indexOf("Guest") === 0) {
                    $("#player-content-guest").append(tmpl);
                } else {
                    $("#player-content-registered").append(tmpl);
                }
            }
        }
    },

    _resort_winners:function(winner_nick, incoming_place){
        /*Get all current winners (including new winner, which has already been
        added to DOM at this point) from '#player-content-winners', sort, and re-apply to DOM*/
        var winners = $("#player-content-winners .player");
        var current_winners = []; // [[player_nick, place], ...]
        $.each(winners, function(idx, item){
            var elem = $(item);
            var id = elem.attr("id");
            var place = parseInt(elem.find(".player-win-place").text().replace("#", ""));
            var is_new_winner = id.indexOf(winner_nick) > 0;
            if ((incoming_place <= place) && !is_new_winner){
                place += 1;
            }
            current_winners.push([elem.attr("id"), place]);
        });
        var me = $("#player-content-me .player");
        var my_id = me.attr("id") ? me.attr("id"):"";
        var im_new_winner = my_id.indexOf(winner_nick) > 0;
        if (me.find(".player-win-place").text() != "" && !im_new_winner){
            var my_win_place_elem = me.find(".player-win-place");
            var my_place = parseInt(my_win_place_elem.text().replace("#", ""));
            if (incoming_place <= my_place){
               my_place += 1;
               my_win_place_elem.text("#"+my_place);
            }
        }
        /* TODO: respect who won first if results are equal */
        current_winners.sort(function(a, b) {
            var compA = a[1], compB = b[1]; 
            return (compA < compB) ? -1 : (compA > compB) ? 1 : 0;
         })

        $.each(current_winners, function(idx, item){
            var player_listing = $("#" + item[0]), place = item[1];
            $("#player-content-winners").append(player_listing);
            player_listing.find(".player-win-place").text("#"+place);
        });
    },

    new_player_win: function(player_fullname, place, do_sort){
        var player_nick = WG_SideBar._shorten_guest(player_fullname);
        var player_id = "player_"+player_fullname;
        var player_listing = $("#"+player_id);
        if (place <= 3) {
            player_listing.addClass("player-win-"+place);
        } else {
            player_listing.addClass("player-win-n");
        }
        if (player_nick != NICK){
            $("#player-content-winners").append(player_listing);
        }
        var player_win = player_listing.children(".player-win");
        player_win.show().css("display", "block").find("span").text("#"+place);
        if (do_sort) WG_SideBar._resort_winners(player_nick, place);
        //if (player_nick == NICK) $("#claimwin").show();
    },

    new_chat: function(player_fullname, timestamp, text){
        var player_nick = WG_SideBar._shorten_guest(player_fullname);
        var ts = WG_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(WG_SideBar._pre(text));
        var chat_stream = $("#chat-content");
        chat_stream.append(tmpl);
        chat_stream.scrollTop(99999);
    },

    _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+"?game_type="+GAME_TYPE+"&game_uuid="+WG_GameState.game_uuid+"&ts="+(new Date()).getTime();
    $("#dynamic_content").append($("<iframe>").attr("id","wiki").attr("src", isource)); 
    $.ajax({
        type:"GET",
        cache:false,
        data:{"type":"current", "game_type":GAME_TYPE},
	    url:'/gamedata', 
	    success: function(data) {
            $.each(data.clicks, function(k, v){
                WG_SideBar.new_player_click(k, v);
            });
            $.each(data.wins, function(k, v){
                WG_SideBar.new_player_win(k, v[2], false);
            });
            $("#players").show();
        }
    });
};

function show_last_game_result(game_uuid, timetype){
    var data = {"game_type":GAME_TYPE}
    if (game_uuid != null){
        data["game_uuid"] = game_uuid;
    } 
    $(".loading-last-game-results").show();
    //XXX $("#last-game-results p").remove();
    data["leaders"] = true;
    $.ajax({type:"GET", cache:false, data:data, url:'/stats/last', 
	    success: function(data) {
            $(".loading-last-game-results").hide();
            $("#leaderboard li.all-link").remove();
            if (timetype == "today"){
                if (data.today_leaders){
                    $("#day-leaders li.leader").remove();
                    var elem = $("#day-leaders");
                    $.each(data.today_leaders, function(idx, vals){
                        elem.append($("<li>").addClass("leader").html("<strong>"+vals[0]+"</strong> "+vals[1]+"<span>pts</span>"));
                    });
                }
            }

            if (timetype == "week"){
                if (data.week_leaders){
                    $("#week-leaders li.leader").remove();
                    var elem = $("#week-leaders");
                    $.each(data.week_leaders, function(idx, vals){
                        elem.append($("<li>").addClass("leader").html("<strong>"+vals[0]+"</strong> "+vals[1]+"<span>pts</span>"));
                    });
                }
            }
          
          $("#leaderboard").show();
          $("#game-status, #other-games").css("height", "85%");
        }
    });
}

function last_game_winners(data){
    if (data.winners.length == 0) {
        $("#last-game-results .last-game-result:visible").remove();
        $("#last-game-results-no-winners").show();
    } else {
        var elem = $("#last-game-results");
        if (elem.hasClass(data.game_uuid)){
            elem.removeClass(data.game_uuid);
            return;
        }
        $("#last-game-results .last-game-result:visible").remove();
        elem.addClass(data.game_uuid);
        $("#last-game-results-no-winners").hide();
        $.each(data.winners, function(idx, vals){
            var player_id = vals[0], win_val = vals[1];
            var win_vals = data.winnersplaceclicks[player_id];
            var player_nick = WG_SideBar._shorten_guest(player_id);
            var place=win_vals[2], result=win_vals[1], total_clicks=win_vals[0], path=win_vals[3].join(" &rarr; ");
            var new_winner = $("#last-game-result-tmpl").clone().attr("id", "last-game-winner-"+place);
            new_winner.find(".result-place").text("#"+place).attr("id", "result-place-"+place);
            new_winner.find(".result-player").text(player_nick);
            new_winner.find(".result-clicks").text(total_clicks);
            new_winner.find(".result-time").text(result);
            new_winner.find(".result-path").css("display", "block").html(path);
            new_winner.show();
            elem.append(new_winner);
        });
    }
    $("#last_game_winners").trigger("click");
}


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*/
    /* TODO: handle 'back-button' clicks correctly*/
    check_connection();
    var player_fullname = fullname(JID);
    WG_SideBar.new_player_click(player_fullname, total);
    var metadata = {to:ROOM, from:JID, from_fullname:player_fullname, game_uuid:WG_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 already_won(){
    var player_fullname = fullname(JID); 
    var player_already_won = $("#player_"+player_fullname+" .player-win").is(":visible");
    return player_already_won;
}
function send_win_message(winners, start, end, win_path) { /*TODO: dont send all winners?*/
    check_connection();
    var player_fullname = fullname(JID); 
    /*called from wiki page head*/
    var winners = eval("(" + winners + ")");/*use JSON lib*/
    var win_path_and_times = eval("(" + win_path_and_times + ")");/*use JSON lib*/
    var playerwon = winners[player_fullname];
    if (playerwon){
        var clicks = playerwon[0];
        var time = playerwon[1];
        var place = playerwon[2];
        show_win_modal(place, clicks, start, end, win_path);
        WG_SideBar.new_player_win(NICK, place, false); //local alert that player has won.
        var metadata = {to:ROOM, from:JID, from_fullname:player_fullname, game_uuid:WG_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();
    WG_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");
        WG_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");
        WG_SideBar.new_player_win(from_fullname, place, true);
    } 
};
/***   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:WG_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 WG_GameState = {
    countdown:"",
    game_uuid:"",
    loading:true,
    game_on:false,
    getting_data:true,

    get_game_data: function() {
        WG_GameState.getting_data = true;
        $.ajax({type:"GET", dataType:"json", data:{"game_type":GAME_TYPE}, cache:false, url:'gamedata', 
            success: function(data) {
                WG_GameState.getting_data = false;
                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);
                    $("#endpagelink0 > a").attr('href', "http://en.wikipedia.org/wiki/"+data.end_link);
                    $("#endpagelink0 .endpage").html("<i>"+data.end_page +"</i> at wikipedia.org");
                    $("#endpagelink > a").attr('href', "http://en.wikipedia.org/wiki/"+data.end_link);
                    $('#current-game').show();
                    //setTimeout(function(){equalheights("#game-status", "#other-games")}, 500);
                    $("#game-status, #other-games").css("height", "85%");
                }
                last_game_winners(data.last_stats);
                WG_GameState.game_uuid = data.game_uuid;
                var countdown = parseInt(data.game_countdown);
                WG_GameState.set_countdown(countdown);
            }
        });
    },

    set_countdown: function(countdown) {
        if (countdown <= 0) {
            WG_GameState.loading = true;
            var countdown = -countdown + parseInt(Math.random()*3 + 2);
            $('#current-game').hide();
            $('#new-game, #gameloading, #mystats').show();
        } else {
            WG_GameState.game_on = true;
            WG_GameState.loading = false;
            $('#new-game, #gameloading').hide();
            $("#dynamic_content").attr("style", "");
            $("h1").parent("a").attr("href", "/");
        }
        WG_GameState.countdown = countdown;
    },

    start_game: function() {
        $('#gameloading').text("Creating New Game...");
        $("#current-game, #players, #claimwin").hide();
        $(".player[id!=player-tmpl]").remove();/* delete last game's players */
        $("iframe#wiki").remove();
        $(".frontpage, #new-game, #gameloading, #play_other_games, #mystats").show();
        $("h1").parent("a").attr("href", "/");
        WG_GameState.game_on = false;
        WG_GameState.loading = true;
        if (parseInt(Math.random()*5) > 3){
            WG_GameState.get_game_data();
        } else {
            var wait = parseInt(Math.random()*3+1);
            setTimeout(WG_GameState.get_game_data, wait);
        }
    },

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

    tick: function() {
        if (WG_GameState.loading) {
            $("#new-game, #gameloading").show();
        }
        if (WG_GameState.countdown <= -1) {
            if (!WG_GameState.getting_data) WG_GameState.start_game();
        } else {
            if (WG_GameState.game_on) {
                $('.game_countdown').text(WG_GameState.countdown);
                if (WG_GameState.countdown <= 10) {
                    $('#gameinfo .game_countdown').css("color", "#FE0000");
                    $('#gameinfo .time_remaining').css("color", "#FE0000");
                }
            } else {
                $('#gameloading').text("New Game in "+WG_GameState.countdown + "...");
            }
        }
        WG_GameState.countdown -= 1;
    }
};
function game_description_dialog(){
    var usemodal = ($.browser.msie)?false:true; 
    var game_type_pretty = $("#now_playing i").text();
    $("#game_description").dialog({
        title:"How to play Wiki Game type '"+game_type_pretty+"':", 
        autoOpen: false, 
        modal:usemodal, 
        position:["center", 250], 
        width: 600,
        open: function(evt, ui){
            return $("#game_description").text();
        }
    });
};
function game_description_show(){
    //$(this).parents(".player").addClass("view-click-path");
    $('#game_description').dialog('open');
    $(".ui-widget-overlay").click(function(){$('#game_description').dialog('close');});
    return false;
};

function tweet_popup(){
    var text = encodeURIComponent($(".twitter textarea").val());
    var url = 'http://twitter.com/intent/tweet?text='+text;
    var h = 300, w = 500;
    var pos_left = (screen.width/2)-(h/2);
    var pos_top = (screen.height/2)-(w/2);
    var popup = window.open(url,'The Wiki Game','toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+pos_top+', left='+pos_left);
    if (window.focus) {popup.focus()}
    return false;
}

function sound_switch(){
    if ($.cookie("sound") == 0) $(".soundswitch").attr("src", "/static/img/icon-music-off.png");
    $(".soundswitch").unbind("click").click(function(){
        if ($(this).attr("src").indexOf("off") > 0){
            $(".soundswitch").attr("src", "/static/img/icon-music-on.png");
            $.cookie("sound", "1", {expires:999999999});
        } else {
            $(".soundswitch").attr("src", "/static/img/icon-music-off.png");
            $.cookie("sound", "0", {expires:999999999});
        }
    });
}

function click_path_modal(){
    var player_id = $(this).parent().parent().attr("id").replace("player_", "");
    $("#click_path_modal").css("border", "none");
    var html = $("#click_path_modal_template").clone().html();
    $.colorbox({html:html, transition:"none", innerWidth:580, innerHeight:220, opacity:0.75});
    $("#cboxContent").css("background-image","url('/static/img/sea-bg-tiled.jpg')");
    $("#cboxClose").css("background-image", "url('/static/img/button-modal-close.png')");
    $("#colorbox").css("border", "3px solid rgba(58, 58, 58, 0.5)");
    $.ajax({url:"/stats/winner", type:"GET", data:{'game_type':GAME_TYPE, 'player_id':player_id, 'game_uuid':WG_GameState.game_uuid},
        success:function(resp){
            $("#click_path_modal .loading").hide();
            $("#click_path_modal").css("border", "1px solid #D8D8C9");
            $("#click_path_modal").html(resp);
        }
    });
}

function show_win_modal(win_num, click_count, start, end, win_path){
    if ($.cookie("sound") != 0 && !$.browser.msie) WINSOUND.play();
    switch (win_num){
        case 1: var win_place = "1<span class='nth'>ST</span>"; break;
        case 2: var win_place = "2<span class='nth'>ND</span>"; break;
        case 3: var win_place = "3<span class='nth'>RD</span>"; break;
        default: var win_place = win_num+"<span class='nth'>TH</span>";
    }
    if (win_num > 3) win_num = "n";
    var tweet_text = "I just won The Wiki Game! I connected Wikipedia articles '"+start+"' &rarr; '"+end+"' in "+click_count+" clicks at http://TheWikiGame.com!";
    var html = $("#win_modal_template").clone().html().replace(/_CLICK-COUNT_/g, click_count).replace(/_WIN-PATH_/g, win_path).replace(/_WIN-NUM_/g, win_num).replace(/_WIN-PLACE_/g, win_place).replace(/_TWEET-TEXT_/g, tweet_text);
    $.colorbox({html:html, transition:"none", innerWidth:685, innerHeight:320, opacity:0.75, 
        onClosed:function(){setTimeout(function(){$("#countdown").css("top", "-100px")}, 1000)},
        onCleanup:function(){$("#countdown").css("top", "-100px")},
        onOpen:function(){setTimeout(function(){$("#countdown").animate({top:"0"}, 1500)}, 1000);}
    });
    $("#win_modal .facebook").find("span").eq(1).remove(); //XXX hack to remove duplicate fb like buttons.
    sound_switch();
    $("#cboxContent").css("background-image","none").css("background-color","rgba(58, 58, 58, 0.5)");
    $("#cboxClose").css("background-image", "url('/static/img/button-modal-close-"+win_num+".png')");
    $("#colorbox").css("border", "3px solid rgba(58, 58, 58, 0.5)");
    $("#countdown").css("right", Math.floor($(window).width()/2.0 - $("#countdown").outerWidth()/2.0)+"px");
}


function invite_modal(){
    $("#invite-friends").click(function(){
        var tweet_text = "I'm playing The Wiki Game: 'Explore and Race through Wikipedia articles'! Come challenge me at http://TheWikiGame.com!";
        var html = $("#invite_modal_template").clone().html().replace(/_TWEET-TEXT_/g, tweet_text);
        $.colorbox({html:html, transition:"none", innerWidth:685, innerHeight:320, opacity:0.75});
        $("#invite_modal .facebook").find("span").eq(1).remove(); //XXX hack to remove duplicate fb like buttons.
        $("#cboxContent").css("background-image","none").css("background-color","rgba(58, 58, 58, 0.5)");
        $("#colorbox").css("border", "3px solid rgba(58, 58, 58, 0.5)");
        $("#cboxClose").css("background-image", "url('/static/img/button-modal-close-n.png')");
    });
}

function my_stats(){
    $("#mystats").live("click", function(){
      $("#last-game-results-no-winners").hide();
      if ($("#statscontainer").length > 0) return;
      $("#statscontainer").remove();
      $("#last_game_winners").trigger("click");
      var game_type_pretty = GAME_TYPE.replace(/-/g, " ");
      $("#my_stats_tab").html("My "+game_type_pretty+" stats <span class='close'>Close</span>").show();
      $(".stats_tab, .last-game-result").hide();
      $("#last-game-results").append("<p id='loading_stats' style='text-align:center;margin-top:40px'>Loading stats...</p>");
      $.ajax({type:"GET", url:'/stats/mine/won/'+GAME_TYPE, 
	    success: function(resp) {
            $("#last-game-results").append(resp);
            $("#loading_stats").remove();
        }
      });
    });
    $("#my_stats_tab .close").live("click", function(){
        $(".stats_tab, .last-game-result").not("#last-game-result-tmpl").show();
        $("#my_stats_tab").hide();
        $("#statscontainer").remove();
        $("#last_game_winners").trigger("click");
    });
}


function view_click_path(){
    var this_elem = $(this);
    var open = this_elem.hasClass("open");
    if (this_elem.hasClass("loading")) return;
    this_elem.addClass("loading");
    this_elem.toggleClass("open");
    var uuid = this_elem.attr("id");
    if (!open) {
        var loading = $("<div class='click_path'>").attr("id", "path"+uuid).text("Loading...");
        this_elem.parent().parent().find(".wongamestats").append(loading);
        $.ajax({
            url:"/stats/win_path", dataType:"json", data:{'uuid':uuid},
            success:function(resp){
                setTimeout(function(){this_elem.removeClass("loading")}, 400);
                $("#path"+uuid).empty().html(resp.win_path);
            }
        });
    } else {
        setTimeout(function(){this_elem.removeClass("loading")}, 400);
        $("#path"+uuid).remove();
    }
}


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 player_id = $(".view-click-path").attr("id").split("_").slice(1).join("_"); /* remove 'player_'*/
            $(".view-click-path").removeClass("view-click-path");
            $.ajax({
                url:"/stats/winner",
                data:{"player_id":player_id, "game_type":GAME_TYPE, "game_uuid":WG_GameState.game_uuid},
                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 equalheights(one, two){
    var maxheight = Math.max($(one).height(), $(two).height());
    $(one + ", "+two).height(maxheight);
}

function switch_stats_view(){
    $(".stats_tab").click(function(){
        $(".stats_tab").removeClass("stats_selected");
        $(this).addClass("stats_selected");
        var id = $(this).attr("id");
        switch(id){
            case "last_game_winners":
                $("#day-leaders, #week-leaders").hide();
                $("#last-game-results").show();
                $(".loading-last-game-results").text("Loading Last Game Winners...").show();
                $("#points").hide();
                break;
            case "today_leaderboard":
                $("#last-game-results, #week-leaders").hide();
                $("#leaderboard, #day-leaders").show();
                $(".loading-last-game-results").text("Loading Today's Leaderboard...").show();
                show_last_game_result(null, "today");
                $("#points").show();
                break;
            case "week_leaderboard":
                $("#last-game-results, #day-leaders").hide();
                $("#leaderboard, #week-leaders").show();
                $(".loading-last-game-results").text("Loading This Week's Leaderboard...").show();
                show_last_game_result(null, "week");
                $("#points").show();
                break;
            default:
                break;
        }
        $(".loading-last-game-results").hide();
    });
}


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);
};

