/*
 * *******************************************************************************************
 * "THE BEER-WARE LICENSE" (Revision 42.'321'):     (http://people.freebsd.org/~phk/)
 * Arjan321 wrote this page. You can do whatever you want with this stuff.
 * If we meet some day, and you think this page is worth it, you can buy me a beer in return
 * *******************************************************************************************
*/




/****************************************************
	Various global variables
*****************************************************/

// number of rolls in the animation
var rolls_max = 14;

// time one side of the dice shows
var roll_time = 150;


var timer = 0;
var current = 0;
var rolls = 0;

var num_throws = 0;
var sum_throws = 0;

var num_solutions = 0;

var solve_dilemma = false;

var posibilities = [
 [1,2,3,4,5,6], 	/* nothing thrown yet */
 [2,3,4,5], 		/* last throw was an 1 */
 [1,3,4,6], 		/* last throw was a 2 */
 [1,2,5,6], 		/* last throw was a 3 */
 [1,2,5,6], 		/* last throw was a 4 */
 [1,3,4,6], 		/* last throw was a 5 */
 [2,3,4,5]  		/* last throw was a 6 */
];

var positions = [
 [4,5,6], 		/* cell 0 */
 [], 		/* cell 1 */
 [2,3,4,5,6], 	/* cell 2 */
 [6], 		/* cell 3 */
 [1,3,5], 		/* cell 4 */
 [6], 		/* cell 5 */
 [2,3,4,5,6], 	/* cell 6 */
 [], 		/* cell 7 */
 [4,5,6] 		/* cell 8 */
];

var throws_needed = [0, 0, 1, 1, 2, 2, 1];

var assigned_solutions = [];

var pages =['dilemma', 'history', 'aboutus'];

var ctx = null;

var canvas_color = "black";
var canvas_size = 30;
var canvas_offset = 40;
var canvas_space = 10;

/****************************************************
	Init function
*****************************************************/

window.onload = function() {

	if (document.getElementById && document.getElementsByName) {

		showPage(location.hash.substring(1));

		var canvas = document.getElementById('canvas_dice');
	        if (canvas.getContext){
			ctx = canvas.getContext('2d');
			
			var table_dice = document.getElementById('table_dice');
			if (table_dice) {
				table_dice.style.display = "none";
			} 
			roll_time += 100;
			
		} else {
				document.getElementById('canvas_dice').style.display = "none";
		}


		parseQueryString();
		showDice(0);
		solutionsChanged();
		solutionsDisplay("none");
		
		if (num_solutions) {
			GoAtIt(true);
		}
		
	
	}

};

/****************************************************
	Some functions for general use
*****************************************************/

Array.prototype.find = function (s) {

	for(var i = 0; i < this.length; i++) {

		if (this[i] == s) {
			return true;
		}
	}
	return false;
};

function trim(str) {

	return str.replace(/^\s*|\s*$/g,"");

}

function randArray() {

	return ( Math.round( Math.random()) - 0.5 );

}

function htmlspecialchars(string) {

	string = string.replace("<","&lt;");
	string = string.replace(">","&gt;");

	return string;

}

/****************************************************
	Functions for solving a dilemma
*****************************************************/

function GoAtIt(dilemma) {

	solve_dilemma = dilemma;

	throwDice();
}

function solutionsChanged() {

	num_solutions = solutionsNumber();

	if (num_solutions) {
		document.getElementById('control_solve').disabled = false;
	} else {
		document.getElementById('control_solve').disabled = true;
	}


	document.getElementById('text_throws_needed').firstChild.data = throws_needed[ num_solutions ];

	solutionsAssignNumbers();

}

function solutionsAssignNumbers() {

	if (throws_needed[ num_solutions ] > 1) {
		return;
	}

	var numbers = [1, 2, 3, 4, 5, 6];

	numbers.sort( randArray );

	var solutions = document.getElementsByName('text_solution');

	var number_per_solution = numbers.length / num_solutions;

	var number;
	var assigned_numbers;

	for (var i = 0; i < solutions.length; i++) {

		assigned_numbers = [];

		if (solutions[ i ].value) {

			for (var j = 0; j < number_per_solution; j++) {

				number = numbers.pop();

				assigned_numbers.push( number );
				assigned_solutions[ number ] = i;
			}
		}

		document.getElementById(('text_assigned'+i)).firstChild.data = assigned_numbers.length ? assigned_numbers : 'None';


	}

}

function solutionsNumber() {

	var number = 0;
	var solutions = document.getElementsByName('text_solution');

	for (var i = 0; i < solutions.length; i++) {

		if (trim(solutions[ i ].value)) {
			number++;
		}

	}

	return number;

}

function solutionsDetermine(number) {

	if (num_solutions < 1 || !solve_dilemma) {
		return;
	}

	var solutions = document.getElementsByName('text_solution');

	var li_element, li_content;

	if (trim(document.getElementById('text_dilemma').value)) {

		li_element = document.createElement('li');
		li_content = document.createTextNode(htmlspecialchars(document.getElementById('text_dilemma').value));
		li_element.appendChild(li_content);

		document.getElementById('text_solved_dilemma').replaceChild(li_element, document.getElementById('text_solved_dilemma').getElementsByTagName('li')[0]);

		document.getElementById('text_dilemma_box').style.display = "";

	} else {
		document.getElementById('text_dilemma_box').style.display = "none";
	}

	li_element = document.createElement('li');
	li_content = document.createTextNode(htmlspecialchars(document.getElementsByName('text_solution')[ assigned_solutions[ number ] ].value));
	li_element.appendChild(li_content);

	document.getElementById('text_solved_with').replaceChild(li_element, document.getElementById('text_solved_with').getElementsByTagName('li')[0]);

	solutionsDisplay("");
	
}


function solutionsDisplay(display) {

	document.getElementById('dilemma_solution').style.display = display;
	
	if (display) {
		document.getElementById('control_solve').focus();
	} else {
		document.getElementById('control_thnx').focus();
	}
}

/****************************************************
	Functions to throw a dice
*****************************************************/

function throwDice() {

	if (timer) {
		return;
	}

	solutionsDisplay("none");


	if (document.getElementById('control_fancy').checked) {

		current = Math.floor(Math.random() * 6) + 1;

		showDice(current);
		updateStats(current);

		solutionsDetermine(current);

	} else {

		document.getElementById('control_throw').disabled = true;

		current = rolls = 0;

		timer = window.setInterval(rollDice, roll_time);
	}

}

function rollDice() {

	if (rolls < rolls_max) {

		if (rolls%2) {

			current = posibilities[ current ][ Math.floor(Math.random() * posibilities[ current ].length) ];

			showDice(current);

		} else {
			showDice(0);
		}

		rolls++;

	} else {
		window.clearInterval(timer);
		timer = 0;

		updateStats(current);

		solutionsDetermine(current);

		document.getElementById('control_throw').disabled = false;

	}

}

function showDice(number) {

	var i;

	if (!ctx) {

		for (i = 0; i < 9; i++) {
	
			if (!positions[ i ].find(number)) {
				document.getElementById('cell' + i ).style.visibility = "hidden";
			} else {
				document.getElementById('cell' + i ).style.visibility = "visible";
			}
	
		}
	} else {
	
		var counter = 0;
		
		ctx.clearRect(0,0,240,240);
		
		for (i = 0; i < 3; i++) {
			for (var j = 0; j < 3; j++) {
			
				if (positions[ counter ].find(number)) {
					ctx.beginPath();
					ctx.arc(canvas_offset + j*2*(canvas_size+canvas_space),canvas_offset+i*2*(canvas_size+canvas_space),canvas_size,0, 2*Math.PI, false);
					ctx.fill();
				}
	
				counter++;
			
			}
		}
	
	}
	

}

/****************************************************
	Functions to update some of the statistics
*****************************************************/

function updateStats(number) {

	clearTable();
	updateThrows();
	updateAverage(number);
	addRow(number);

}

function updateThrows() {

	num_throws++;

	document.getElementById('text_num_throws').firstChild.data = num_throws;

}

function updateAverage(number) {

	sum_throws += number;

	document.getElementById('text_average').firstChild.data = Math.round( (sum_throws / num_throws) * 10) / 10;


}

/****************************************************
	Functions to update the history
*****************************************************/

function clearTable() {

	if (!num_throws) {
		var tbody = document.getElementById('throw_history');
		tbody.removeChild(tbody.getElementsByTagName('tr')[0]);
	}

}

function addRow(number) {

	var tbody = document.getElementById('throw_history');

	var trow = document.createElement('tr');
	var tdate1 = document.createElement('td');
	var tdate2 = document.createElement('td');


	var tdate1_content = document.createTextNode(num_throws);
	var tdate2_content = document.createTextNode(number);

	tdate1.appendChild(tdate1_content);
	tdate2.appendChild(tdate2_content);

	trow.appendChild(tdate1);
	trow.appendChild(tdate2);

	tbody.insertBefore(trow, tbody.firstChild);

}

/****************************************************
	Functions to enable page navigation
*****************************************************/

function showPage(page) {

	if (!pages.find(page)) {
		page = pages[0];
	}


	document.getElementById('history').style.display = "none";
	document.getElementById('aboutus').style.display = "none";
	document.getElementById('dilemma').style.display = "none";

	document.getElementById(page).style.display = "";

	document.getElementById('menu_history').className = "link linkInActive";
	document.getElementById('menu_aboutus').className = "link linkInActive";
	document.getElementById('menu_dilemma').className = "link linkInActive";

	document.getElementById('menu_' + page).className = "link linkActive";

}

function parseQueryString() {

	var queryString = location.search.substring(1,location.search.length);

	if (!queryString) {
		return;
	}

	queryString = queryString.replace(/\+/g, ' ');
	var args = queryString.split('&');
	
	var solutions = document.getElementsByName('text_solution');
	
	for (var i = 0; i < args.length; i++) {
		var pair = args[i].split('=');

		if (pair.length != 2) {
			continue;
		}

		switch (pair[0]) {
		
			case 'd':
				document.getElementById('text_dilemma').value = unescape(pair[1]);
			break;
			
			// Regular expression of some kind?
			case 's1':
				solutions[0].value = unescape(pair[1]);
			break;
			
			case 's2':
				solutions[1].value = unescape(pair[1]);
			break;
			
			case 's3':
				solutions[2].value = unescape(pair[1]);
			break;
			
			default:
			break;
		}
		
	}

}