var phil_R = 20;
var table_R = 100;
var fork_R = 10;
var N = 0;
var timer;

function destruct() {
	var parent = $('room');
	var table = $('table')
	if (table) {
		for(var i = 0; i < N; i++) {
			var e = $('p-' + i)
			parent.removeChild(e);
			e = $('f-' + i)
			parent.removeChild(e);
		}	
		parent.removeChild(table);
	}
	parent.show();
}

function construct() {
	var parent = $('room');
	var philMaxR = phil_R * Math.sqrt(2);
	var table = new Element('img', {	id:'table', 	'class':'ptable', src:'images/erl-dpp/table.png'	});
	table.style.left = phil_R + philMaxR + 'px'
	table.style.top = phil_R + philMaxR + 'px'
	parent.appendChild(table);
	for(var i = 0; i < N; i++) {
// philosopher
		var elem = new Element('img', {id:('p-' + i), 'class':'person', src:'images/erl-dpp/phil-white.png'});
		var angle = 2 * Math.PI / N * i;
		var philLocR = table_R + philMaxR;
		var x = philLocR + philLocR * Math.sin(angle);
		var y = philLocR + philLocR * Math.cos(angle);
		elem.style.left = x + 'px'
		elem.style.top = y + 'px'
		parent.appendChild(elem);
// fork		
		elem = new Element('img', {id:('f-' + i), 'class':'fork', src:'images/erl-dpp/fork-green.png'});
		angle = angle - Math.PI / N;
		x = table_R + (table_R - fork_R - 5) * Math.sin(angle) - fork_R + phil_R + philMaxR;
		y = table_R + (table_R - fork_R - 5) * Math.cos(angle) - fork_R + phil_R + philMaxR;
		elem.style.left = x + 'px'
		elem.style.top = y + 'px'
		parent.appendChild(elem);
	}
}

function startErlangDpp() {
	timer = window.setInterval(requestJson, 1000);
	$('erlang-state').innerHTML = "Running..."
}

function stopErlangDpp() {
	window.clearInterval(timer);
	$('erlang-state').innerHTML = "Stopped."
}

function updatePhilosopers(states) {
	for(var i = 0; i < N; i++) {
		var state = states[i];
	// philosopher
		var elem = $('p-' + i)
		if (state == 'hungry') {
			elem.src = 'images/erl-dpp/phil-red.png';
		} else if (state == 'eating') {
			elem.src = 'images/erl-dpp/phil-green.png';
		} else if (state == 'thinking') {
			elem.src = 'images/erl-dpp/phil-white.png';
		}
	}
}

function updateForks(states) {
	for(var i = 0; i < N; i++) {
		var state = states[i];
	// fork
		var elem = $('f-' + i)
		var r = (i + 1) % N;
		var elemR = $('f-' + r)
		if (state == 'eating') {
			elem.src = 'images/erl-dpp/fork-green.png';
			elemR.src = 'images/erl-dpp/fork-green.png';
			i++
		} else {
			elem.src = 'images/erl-dpp/fork-white.png';
		}
	}
}

function requestJson() {
	var url = contextURL + 'erlDppJson.htm'
	new Ajax.Request(url, {
		method:'get',
		parameters: {ajax: 'y'},
		requestHeaders: {Accept: 'application/json'},
		onSuccess: function(transport) {
			try {
				var parent = $('room');
				var elemOffset = parent.viewportOffset();
				var vp = document.viewport.getDimensions();
				if ( elemOffset.top > vp.height || elemOffset.left > vp.width) {
//					alert("room element scroll x,y: " + elemOffset.left + "; " + elemOffset.top
//							+ "\n viewport: " + vp.width + "; " + vp.height);
					stopErlangDpp();
					return;
				}

				var json = transport.responseText.evalJSON(true);
				var table = $('table')
				if (json.length != N || !table) {
					destruct();
					N = json.length;
					construct();
				}
				updatePhilosopers(json.states);
				updateForks(json.states);
//				alert("json:\n" + json.length);
//				alert("json:\n" + json.states);
//				alert("json:\n" + json.states[2]);
			} catch (e) {
//				alert('Caught Exception: ' + e );
				stopErlangDpp();
			}
		},
		onFailure: function(){ 
			alert('There was a problem with the request ! ' + url);
			stopErlangDpp();
		}
	});
}

