/**
 * @author jared
 */
var fitts = {};

fitts.WINDOW_WIDTH = 800;
fitts.WINDOW_HEIGHT = 200;
fitts.MIN_WIDTH = 5;
fitts.MAX_WIDTH = 100; // fitts.WINDOW_WIDTH / 2;
fitts.MIN_HEIGHT = 5;
fitts.MAX_HEIGHT = fitts.WINDOW_HEIGHT;
fitts.CLICKS_PER_TEST = 10;

fitts.initialize = function initialize(){
	fitts.counter_value = 0;
	fitts.start_time = new Date();
	
	$('start').onclick = fitts.start;
	
	fitts.introduction = $('introduction');
	fitts.input_device = $('input_device');
	
	fitts.target_1 = $('target_1');
	fitts.target_2 = $('target_2');
	fitts.background = $('background');	
	
	fitts.curtain = $('curtain');
	fitts.message_text = $('message_text');
	fitts.save_notice = $('save_notice');
	$('continue').onmousedown = fitts.hide_curtain;
	fitts.num_tests_taken = $('num_tests_taken');

	fitts.counter = $('counter');
	fitts.clicks_per_test =$('clicks_per_test');
	fitts.clicks_per_test.innerHTML = fitts.CLICKS_PER_TEST;
	fitts.instructions = $('instructions');
	fitts.instructions_text = $('instructions_text');
	fitts.difficulty = $('difficulty');

	//fits.calculate_defaults();
	//window.resizeTo(fitts.WINDOW_WIDTH, fitts.WINDOW_HEIGHT);	
	fitts.target.attach(fitts.target_1, fitts.target_2);
	fitts.target.attach(fitts.target_2, fitts.target_1);
	fitts.resize_targets();

	fitts.statsUpdater = new Ajax.PeriodicalUpdater('num_tests_taken', 'count.php', {
			method: 'get', 
			frequency: 3, 
			decay: 2
		}
	);
}

fitts.start = function start(){
	fitts.input_device.value = $('start_input_device').value;
	fitts.introduction.style.display = "none";
	fitts.background.style.display = "block";
	fitts.instructions.style.display = "block";
}

fitts.resize_targets = function resize_targets(){
	var rand_1 = Math.random();
	var rand_2 = Math.random();
	var rand_3 = Math.random();

	//console.log([rand_1, rand_2, rand_3]);

	fitts.target_width = (rand_1 * (fitts.MAX_WIDTH - fitts.MIN_WIDTH)) + fitts.MIN_WIDTH;
	
	target_outer_margin = rand_2 * ((fitts.WINDOW_WIDTH / 2) - fitts.target_width);
	fitts.target_distance = fitts.WINDOW_WIDTH - (2 * target_outer_margin) - fitts.target_width;
 
	fitts.target_height = (rand_3 * (fitts.MAX_HEIGHT - fitts.MIN_HEIGHT) + fitts.MIN_HEIGHT);
	var target_top = (fitts.WINDOW_HEIGHT - fitts.target_height) / 2;

	fitts.set_style(fitts.target_1, 'width', fitts.target_width);
	fitts.set_style(fitts.target_2, 'width', fitts.target_width);
	fitts.set_style(fitts.target_1, 'left', target_outer_margin);
	fitts.set_style(fitts.target_2, 'right', target_outer_margin);

	fitts.target_2.make_active();
	
	fitts.instructions_text.innerHTML = "Click the red square to start";		
	fitts.difficulty.innerHTML = Math.round(fitts.calculate_difficulty() * 10) / 10;
}

fitts.calculate_difficulty = function calculate_difficulty(){
	var A = fitts.target_distance;
	var W = fitts.target_width;
	function log2(n){
		return Math.log(n)/Math.log(2);
	}
	return log2((A / W) + 1);
}

fitts.calculate_defaults = function calculate_defaults(){
	fitts.WINDOW_WIDTH = 700;
	fitts.WINDOW_HEIGHT = 400;
	fitts.MIN_WIDTH = 20;
	fitts.MAX_WIDTH = fitts.WINDOW_WIDTH / 2;
	fitts.MIN_HEIGHT = 20;
	fitts.MAX_HEIGHT = fitts.WINDOW_HEIGHT / 2;
}

fitts.set_style = function set_style(elem, prop, val){
	elem.style[prop] = val + 'px';
}

fitts.record_click = function record_click(){
	if (fitts.counter_value == 0){
		fitts.start_time = new Date();
		fitts.instructions_text.innerHTML = "Keep clicking the red square";
	}
	fitts.counter_value += 1;
	fitts.counter.innerHTML = fitts.counter_value;	

	if(fitts.counter_value >= fitts.CLICKS_PER_TEST){
		fitts.counter_value = 0;
		fitts.total_time = (new Date() - fitts.start_time) / 1000;
		
		// Send off a request to record the result.
		fitts.save_result();

		fitts.instructions_text.innerHTML = "Finished";						
		fitts.show_curtain('You took: ' + fitts.total_time + ' seconds.');
		fitts.resize_targets();
	}

	fitts.counter.innerHTML = fitts.counter_value;	
}

fitts.show_curtain = function show_curtain(message){
	fitts.background.style.display = "none";
	fitts.instructions.style.display = "none";
	fitts.message_text.innerHTML = message;
	fitts.curtain.style.display = "block";
}

fitts.hide_curtain = function hide_curtain(){
	fitts.curtain.style.display = "none";
	fitts.background.style.display = "block";
	fitts.instructions.style.display = "block";
}

fitts.save_result = function save_result(){
	pars = {
		width: fitts.target_width,
		distance: fitts.target_distance,
		time: fitts.total_time,
		num_clicks: fitts.CLICKS_PER_TEST,
		device_id: fitts.input_device.value
	}
	
	pars_string = "";
	
	for (var k in pars){
		pars_string += k + "=" + pars[k] + "&";
	}
	
	//console.log('pars_string: ' + pars_string);
	
	fitts.save_notice.innerHTML = "Saving...";
	
	
	new Ajax.Request("result.php", {
			method: "post",
			parameters: pars_string,
			onSuccess: function(transport){
				fitts.num_tests_taken.innerHTML = (transport.responseText || fitts.num_tests_taken.innerHTML);
				fitts.save_notice.innerHTML = "Saved.";
			},
			onFailure: function(){
				fitts.save_notice.innerHTML = "Could not save.";
			}
		}		
	);
}

fitts.target = {};

fitts.target.attach = function attach(elem, sibling){
	elem.sibling = sibling;
	elem.onclick = fitts.target.onclick;
	elem.onmousedown = fitts.target.onmousedown;
	elem.make_active = fitts.target.make_active;
	elem.make_inactive = fitts.target.make_inactive;
	elem.active = false;
}

fitts.target.onmousedown = function onmousedown(e){
	return false;
}

fitts.target.onclick = function onclick(e){
	e = e || window.event;
	if (this.is_active){
		fitts.record_click();
		this.sibling.make_active();
	}	
}

fitts.target.make_active = function make_active(){
	this.is_active = true;
	document.body.className = this.id;
	this.sibling.make_inactive();
}

fitts.target.make_inactive = function make_inactive(){
	this.is_active = false;
}

