var debug = false;
var canvas, canvasWidth, canvasHeight, canvasLeft, canvasRight, canvasTop, canvasBottom;
var characters = new Array();
var dragInfo = null;
var syncTimerID;
var roomID;

function init()
{
	if (!window.navigator.cookieEnabled)
	{
		alert("Please enable your browser cookies and try again...");
		if (window.opener) window.close();
		return;
	}
	roomID = parseInt(document.getElementById("rooms").value);
	var character;
	canvas = document.getElementById("canvas");
	var offset = offsetAbsolute(canvas);
	canvasWidth = 780; //Math.round((canvas.offsetWidth - 2) / 10) * 10;
	canvasHeight = 480; //Math.round((canvas.offsetHeight - 2) / 10) * 10;
	canvasLeft = offset.left + 1;
	canvasRight = offset.right + 1;
	canvasTop = offset.top + 1;
	canvasBottom = offset.bottom + 1;
	var count = canvas.childNodes.length;
	for (var i = 0; i < count; i++)
	{
		character = canvas.childNodes[i];
		character.charIndex = i;
		var pos = offsetAbsolute(character);
		character.xx = character.ix = pos.left + 1;
		character.yy = character.iy = pos.top + 1;
		AttachEvent(character, "mousedown", startDrag);
		AttachEvent(character, "mousedown", PreventDefault);
		AttachEvent(character, "mouseup", drop);
		AttachEvent(character, "selectstart", PreventDefault);
		characters.push(character);
	}
	for (var i = 0; i < characters.length; i++)
	{
		character = characters[i];
		character.className = "character";
		character.style.left = character.xx + "px";
		character.style.top = character.yy + "px";
	}
	var body = document.body;
	AttachEvent(body, "mousemove", dragging);
	AttachEvent(body, "mouseup", drop);
	AttachEvent(body, "dragstart", PreventDefault);
	AttachEvent(body, "contextmenu", PreventDefault);
	sync(true);
	setTimeout(statistics, 1000);
}

function moveRoom()
{
	window.focus();
	roomID = parseInt(document.getElementById("rooms").value);
	sync(true);
	setTimeout(statistics, 2000);
}

function startDrag(evt)
{
	if (!evt && event) evt = event;
	var element = evt.currentTarget || evt.srcElement;
	if (element.timerID) clearTimeout(element.timerID);
	dragInfo = {character: element, x: evt.clientX - element.offsetLeft, y: evt.clientY - element.offsetTop};
	AttachEvent(document.body, "selectstart", PreventDefault);
}

function dragging(evt)
{
	if (!evt && event) evt = event;
	if (dragInfo)
	{
		var dragged = dragInfo.character;
		var x = evt.clientX - dragInfo.x;
		var y = evt.clientY - dragInfo.y;
		if (x >= canvasLeft && x <= canvasRight - dragged.offsetWidth)
			dragged.style.left = x + "px";
		else if (x < canvasLeft)
			dragged.style.left = canvasLeft + "px";
		else if (x > canvasRight - dragged.offsetWidth)
			dragged.style.left = (canvasRight - dragged.offsetWidth) + "px";
		if (y >= canvasTop && y <= canvasBottom - dragged.offsetHeight)
			dragged.style.top = y + "px";
		else if (y < canvasTop)
			dragged.style.top = canvasTop + "px";
		else if (y > canvasBottom - dragged.offsetHeight)
			dragged.style.top = (canvasBottom - dragged.offsetHeight) + "px";
	}
}

function drop()
{
	if (!dragInfo) return;
	var character = dragInfo.character;
	var a = character.charIndex;
	var b = (character.offsetLeft - canvasLeft) + ((character.offsetTop - canvasTop) * canvasWidth);
	var httpRequest = new XmlHttpRequest("p.aspx?a=" + a + "&b=" + b, syncCallback);
	httpRequest.send();
	dragInfo = null;
	DetachEvent(document.body, "selectstart", PreventDefault);
}

function sync(init)
{
	if (syncTimerID) clearTimeout(syncTimerID);
	if (init === true)
		for (var i = 0; i < characters.length; i++)
		{
			character = characters[i];
			if (character.timerID)
				clearTimeout(character.timerID);
			character.style.left = character.ix + "px";
			character.style.top = character.iy + "px";
		}
	var httpRequest = new XmlHttpRequest("p.aspx?" + (init === true ? "i" : "r") + "=" + roomID, syncCallback, init);
	httpRequest.send();
}

function syncCallback(response)
{
	if (response.status != 200)
	{
		if (debug) alert(response.text);
		return;
	}
	if (response.text)
	{
		var commands = eval(response.text);
		for (var i = 0; i < commands.length; i++)
		{
			var index = commands[i][0];
			var character = characters[index];
			if (!character) continue;
			if (dragInfo && dragInfo.character == character)
				continue;
			var pos = commands[i][1];
			var x = pos % canvasWidth + canvasLeft;
			var y = Math.floor(pos / canvasWidth) + canvasTop;
			if (response.userData === true)
			{
				character.xx = x;
				character.yy = y;
				character.style.left = character.xx;
				character.style.top = character.yy;
			}
			else
				moveInit(character, x, y);
		}
	}
	syncTimerID = setTimeout(sync, 1000);
}

function moveInit(character, x, y)
{
	if (character.timerID)
		clearTimeout(character.timerID);
	character.xx = character.offsetLeft;
	character.yy = character.offsetTop;
	if (character.xx == x && character.yy == y) return;
	var dx = x - character.xx;
	var dy = y - character.yy;
	var dxs = dx < 0 ? -1 : 1;
	var dys = dy < 0 ? -1 : 1;
	var D = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));
	var kx = Math.abs(dx / D);
	var ky = Math.abs(dy / D);
	var V = Math.pow(D / 2, 2) / 2; //V = D / 2;
	var ax = V * kx / D * dxs;
	var ay = V * ky / D * dys;
	var vx = Math.sqrt(Math.abs(dx) * 2 * Math.abs(ax)) * dxs;
	var vy = Math.sqrt(Math.abs(dy) * 2 * Math.abs(ay)) * dys;
	character.tf = Math.abs((Math.abs(vx) + Math.abs(vy)) / (Math.abs(ax) + Math.abs(ay)));
	character.ax = ax;
	character.ay = ay;
	character.vx = vx;
	character.vy = vy;
	character.timerID = setTimeout("move(" + character.charIndex + ", " + x + ", " + y + ", 0);", Math.random() * 800);
}

function move(index, x, y, t)
{
	var character = characters[index];
	if (t >= character.tf)
	{
		character.style.left = x + "px";
		character.style.top = y + "px";
		return;
	}
	var t2 = -0.5 * t * t;
	var dx = t2 * character.ax + character.vx * t;
	var dy = t2 * character.ay + character.vy * t;
	character.style.left = Math.ceil(character.xx + dx) + "px";
	character.style.top = Math.ceil(character.yy + dy) + "px";
	character.timerID = setTimeout("move(" + index + ", " + x + ", " + y + ", " + (t + 0.2) + ");", 50);
}

function statistics()
{
	var httpRequest = new XmlHttpRequest("p.aspx?r=" + roomID + "&c=1", statisticsCallback);
	httpRequest.send();
}

function statisticsCallback(response)
{
	document.getElementById("peopleCount").innerHTML = response.text;
	setTimeout(statistics, 60000);
}
