var arxiv   = new Array();
var snarxiv = new Array();
var gameid;
var testmode;
var correct;
var guesses;

function getUrlParameters() {
    var map = {};
    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
	map[key] = value;
    });
    return map; 
}

function randint(n) {
    return Math.floor(Math.random() * n);
}

function makeid() {
    var id = "";
    var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    for( var i = 0; i < 12; i++ )
        id += chars.charAt(randint(chars.length));
    return id;
}

function parse(xml) {
    akeys = ['title', 'author', 'id', 'date', 'main_subject', 'comments', 'subjects', 'shown', 'guesses', 'correct_guesses', 'link'];
    skeys = ['title', 'author', 'id', 'date', 'comments']
    $(xml).find('arxiv').each(function () {
	for (i=0; i<akeys.length; i++) {
	    arxiv[akeys[i]] = $(this).find(akeys[i]).text();
	}
    });
    $(xml).find('snarxiv').each(function () {
	for (i=0; i<skeys.length; i++) {
	    snarxiv[skeys[i]] = $(this).find(skeys[i]).text();
	}
    });

    var c = randint(2);
    arxiv['class'] = ".corner-" + c;
    snarxiv['class'] = ".corner-" + (1-c);
    var question = '<span class="question">Is this one real?</span>';
    $("#ring div").removeClass("right");
    $("#ring div").removeClass("wrong");
    $("#ring " + arxiv['class'] + " a").html(arxiv['title']+question);
    $("#ring " + snarxiv['class'] + " a").html(snarxiv['title']+question);
    $("#ring " + arxiv['class'] + " a").click(right);
    $("#ring " + snarxiv['class'] + " a").click(wrong);
}

function right() {
    $(this).parent().parent().addClass("right");
    updateboard(1);
}
function wrong() {
    $(this).parent().parent().addClass("wrong");
    updateboard(0);
}

function updateboard(n) {
    $("#previous-rounds").prepend($("#ring").html());
    $("#ring a").html("");
    $("#ring " + arxiv['class'] + " a").unbind('click');
    $("#ring " + snarxiv['class'] + " a").unbind('click');

    var a = "#previous-rounds li:first-child " + arxiv["class"];
    var s = "#previous-rounds li:first-child " + snarxiv["class"];
    var c = parseInt(arxiv['correct_guesses']) + n;
    var g = parseInt(arxiv['guesses']) + 1;
    var p = ((100 * (g-c)) / g).toFixed(0);

    $(a + " a").attr("href", arxiv['link']);
    $(a).prepend('<p class="id"><a href="' + arxiv['link'] + '">' + arxiv['id'] + '</a> <time>(' + arxiv['date'] + ')</time></p>');
    $(a).append('<h2>' + arxiv['author'] + '</h2>');
    var comments = ""
    if (arxiv['comments']) 
	comments += 'Comments: ' + arxiv['comments'];
    if (arxiv['subjects'])
	comments += (comments ? '; ' : '') + 'Subjects: ' + arxiv['subjects'];
    if (comments)
	$(a).append('<p class="comments">' + comments + '</p>');
    $(a).append('<p class="stats"><i>'+(g-c)+'</i> out of <i>'+g+'</i> people <i>(' + p + '%)</i> think this is from the snarXiv</p>');
    
    $(s).prepend('<p class="id"><a href="http://snarxiv.org">sn' + snarxiv['id'] + '</a> <time>(' + snarxiv['date'] + ')</time></p>');
    $(s).append('<h2>' + snarxiv['author'] + '</h2>');
    $(s).append('<p class="comments">Comments: ' + snarxiv['comments'] + '</p>');

    newround(arxiv['id'], n);
}

function init() {
    gameid = makeid();
    correct = 0;
    guesses = 0;
    testmode = 0;
    if(getUrlParameters()['testmode'])
	testmode = 1;

    $("form").submit(function() {
	if($("#name").val() != "Your Name") {
	    args = "?name="+encodeURIComponent($("#name").val())+"&gameid="+gameid;
	    $.ajax({
		url: "/py/players.py" + args,
		success: function() {
		    $("form").addClass("done");
		    $("input[type='submit']").val("owns this Game")
		}});
	}
    });
}

function updatescore(n) {
    correct += n;
    guesses += 1;
    p = ((100 * correct) / guesses).toFixed(0);
    $("#correct").html(correct);
    $("#guesses").html(guesses);
    $("#percentage").html(p);
    $("#feedback").html(getfeedback(p, n));
} 

function getfeedback(p, n) {
    p = parseInt(p);
    if (p < 10 && n == 0)
	return 'Guess harder';
    else if (p < 20 && !randint(10) && n == 0)
	return 'Not even wrong';
    else if (p < 20)
	return 'Crackpot';
    else if (p == 25)
	return 'Nice round number';
    else if (p < 30)
	return 'LHC doomsayer';
    else if (p < 40 && n == 0)
	return 'Try using AdS/CFT';
    else if (p < 40)
	return 'Worse than a monkey';
    else if (p < 43)
	return '9th year grad student';
    else if (p < 50)
	return 'Worse than a monkey';
    else if (p == 50)
	return 'As good as a monkey';
    else if (p < 60)
	return 'Better than a monkey';
    else if (p < 70)
	return 'Undergraduate';
    else if (p < 75)
	return 'Physics major';
    else if (p < 80 && n == 0)
	return 'Failed your orals';
    else if (p < 80)
	return '1st year grad student';
    else if (p < 85)
	return '2nd year grad student';
    else if (p < 90)
	return 'Post doc.';
    else if (p < 95)
	return 'Junior Fellow';
    else if (p < 98)
	return 'Assistant professor';
    else if (p < 100)
	return 'Tenured professor';
    else if (!randint(7))
	return 'Ed, is that you?';
    else if (guesses == 1)
	return 'Good start';
    else
	return 'Nobel Prize winner';
}

function newround(id, n) {
    args = '';
    if (id) {
	updatescore(n);
	if (!testmode)
	    args = '?gameid='+gameid+'&id='+id+'&n='+n;
    }

    jQuery.ajax({
	url: "/py/fight.py" + args,
	dataType: "xml",
	success: parse
    });
}

// when the DOM is ready
jQuery(document).ready(function($){
    init();
    newround("", 0);
});


