/* QUICKGRA.DE! (c)2010 ROGER BRAUNSTEIN! ZOMG I CANS DIVIDE */

var numQuestions = -1;

function generateGradeTable() {
	$("#wrongcount").val("0");
	
	var htmlstr = '<table id="gradetable" cellpadding="0" cellspacing="0" border="0">';
	htmlstr += '<tr><td class="header"># Wrong</td><td class="header">Grade</td></tr>';
	for (var i = 1; i <= numQuestions; i++) {
		var htmlClass = (i % 2)?"odd":"even";
		htmlstr += '<tr class="' + htmlClass + '"><td>' + i + '</td><td>' + scoreToText((numQuestions-i)/numQuestions) + '</td></tr>';
	}
	htmlstr += "</table>";
	$("#tablediv").html(htmlstr);
}

function clearGradeTable() {
	$("#tablediv").html("");
}

function validateNum(str) {
	if (str.match(/[^\d\.]/)) return -1;
	var n = parseInt(str);
	return (isNaN(n) || n < 0)? -1 : n;
}

function scoreToText(pct) {
	var places = ($("#usedecimal:checked").val())?2:0;
	return (pct * 100).toFixed(places);
}

function updateGrade(numWrong) {
	if (numQuestions < 0 || numWrong < 0) return;
	var numRight = numQuestions - numWrong;
	var score = scoreToText(numRight/numQuestions);
	if (score < 0) $("#wrongcount").addClass("invalid"); else $("#wrongcount").removeClass("invalid");
	$("#scorediv").html(numRight + "/" + numQuestions + " = " + score + "%");
}

function incrementWrong() {
	var wrongcount = $("#wrongcount");
	var str = wrongcount.val();
	if (str.match(/^\s*$/)) str = "0";
	var n = validateNum(str);
	if (n != -1) {
		var numWrong = n+1;
		wrongcount.val(numWrong);
		wrongcount.change();
	}
}

function resetWrong() {
	$("#wrongcount").val("0").change();
}
	
$(document).ready(function(){
	$("#questioncount").bind("change keyup", function(){
		numQuestions = validateNum(this.value);
		if (numQuestions < 1) {
			$(this).addClass("invalid");
			$("#scorediv").html("...");
			clearGradeTable();
		} else {
			$(this).removeClass("invalid");
			generateGradeTable();
			$("#wrongcount").val("0").change();
		}
	});
	$("#wrongcount").bind("change keyup", function(){
		var numWrong = validateNum(this.value);
		if (numQuestions > -1 && numWrong > -1) {
			updateGrade(numWrong);
		} else {
			$("#scorediv").html("...");
		}
	});
	$("#clearbutton").click(function(){
		resetWrong();
		$("#wrongcount").select().focus();
	});
	$("#incrementbutton").bind("click", function(){
		incrementWrong();
	});
	$("#tabletoggle").click(function(){
		$("#tablediv").slideToggle();
	});
	$("#usedecimal").click(function(){
		$("#wrongcount").change();
		generateGradeTable();
	})
	$("#tablediv").hide();
	$("#reset").hide().click();
	$("#questioncount").focus();
	$(document).keyup(function(event){
		try {
			//don't catch key presses on text fields
			if (event.target.nodeName.toLowerCase() == "input" && event.target.type.toLowerCase() == "text") return;
		} catch (error) {}
		switch (event.keyCode) {
			case 82: //R key
				resetWrong(); break;
			case 87: //W key
				incrementWrong(); break;
		}
	});
	
	$("a.tut").hover(function() {
		var $target = $($(this).attr("href"));
		$("#highlightbox").show().animate({opacity: 1.0, height: $target.outerHeight(), width: $target.outerWidth(), top: $target.offset().top, left: $target.offset().left}, 200);
	}, function(){
		var $target = $($(this).attr("href"));
		$("#highlightbox").animate({opacity: 0}, 200, "linear", function(){$(this).hide();})
	});
	$("#highlightbox").hide();
	
	$("#questioncount").val("10").change();
});
