window.onresize = function()
{
	setTimeout(mesureCanvas, 0);
}

var canvasWidth, canvasHeight, canvasLeft, canvasRight, canvasTop, canvasBottom;
var dragInfo = null;
var characters = new Array();
var gravityTimer;

function mesureCanvas(canvas)
{
	if (!canvas)
		canvas = document.getElementById("canvas");
	var offset = offsetAbsolute(canvas);
	if (canvasLeft && canvasLeft != offset.left)
	{
		var d = offset.left - canvasLeft;
		for (var i = 0; i < characters.length; i++)
			characters[i].style.left = characters[i].offsetLeft + d;
	}
	canvasLeft = offset.left;
	canvasRight = offset.right;
	canvasTop = offset.top;
	canvasBottom = offset.bottom;
	canvasWidth = canvas.offsetWidth;
	canvasHeight = canvas.offsetHeight;
}

function init(autoLanguage)
{
	if (autoLanguage != -1)
	{
		var link = document.getElementById("lang" + autoLanguage);
		if (link) link.onclick();
	}
	var canvas = document.getElementById("canvas");
	mesureCanvas(canvas);
	var character;
	var count = canvas.childNodes.length;
	characters.length = 0;
	for (var i = 0; i < count; i++)
	{
		character = canvas.childNodes[i];
		character.charIndex = i;
		var pos = offsetAbsolute(character);
		character.xx = character.px = pos.left;
		character.yy = character.py = pos.top;
		character.vx = 10 + i;
		character.vy = Math.sqrt(i + 1) * -5;
		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";
		gravity(i);
	}
	var body = document.body;
	AttachEvent(body, "mousemove", dragging);
	AttachEvent(body, "mouseup", drop);
	AttachEvent(body, "dragstart", PreventDefault);
	AttachEvent(body, "contextmenu", PreventDefault);
}

function startDrag(evt)
{
	if (!evt && event) evt = event;
	var element = evt.currentTarget || evt.srcElement;
	if (element.timerID) clearInterval(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;
		dragged.px = dragged.offsetLeft;
		dragged.py = dragged.offsetTop;
		var x = evt.clientX - dragInfo.x;
		var y = evt.clientY - dragInfo.y;
		if (x >= canvasLeft && x <= canvasLeft + canvasWidth - dragged.offsetWidth)
			dragged.style.left = x + "px";
		else if (x < canvasLeft)
			dragged.style.left = canvasLeft + "px";
		else if (x > canvasLeft + canvasWidth - dragged.offsetWidth)
			dragged.style.left = canvasLeft + canvasWidth - dragged.offsetWidth + "px";
		if (y >= canvasTop && y <= canvasTop + canvasHeight - dragged.offsetHeight)
			dragged.style.top = y + "px";
		else if (y < canvasTop)
			dragged.style.top = canvasTop + "px";
		else if (y > canvasTop + canvasHeight - dragged.offsetHeight)
			dragged.style.top = canvasTop + canvasHeight - dragged.offsetHeight + "px";
	}
}

function drop()
{
	if (!dragInfo) return;
	var character = dragInfo.character;
	dragInfo = null;
	character.xx = character.offsetLeft;
	character.yy = character.offsetTop;
	character.vx = (character.xx - character.px) * 0.5;
	character.vy = (character.yy - character.py) * 0.5;
	gravity(character.charIndex);
	DetachEvent(document.body, "selectstart", PreventDefault);
}

function gravity(index)
{
	var character = characters[index];
	if (Math.floor(character.yy) + character.offsetHeight == canvasBottom && Math.abs(character.vx) < 0.1 && Math.abs(character.vy) < 0.1)
		return;
	if (character.yy < canvasBottom)
		character.vy += 1;
	if (character.yy + character.offsetHeight + 1 > canvasBottom)
		character.vx = character.vx * 0.96;
	character.xx += character.vx;
	character.yy += character.vy;
	if (character.yy + character.offsetHeight > canvasBottom)
	{
		character.yy = canvasBottom - character.offsetHeight;
		character.vy = Math.abs(character.vy) * -0.88;
	}
	else if (character.yy < canvasTop)
	{
		character.yy = canvasTop;
		character.vy = Math.abs(character.vy) * 1.1;
	}
	if (character.xx + character.offsetWidth > canvasRight)
	{
		character.xx = canvasRight - character.offsetWidth;
		character.vx = Math.abs(character.vx) * -0.94;
	}
	else if (character.xx < canvasLeft)
	{
		character.xx = canvasLeft;
		character.vx = Math.abs(character.vx) * 0.94;
	}
	character.style.left = Math.floor(character.xx) + "px";
	character.style.top = Math.floor(character.yy) + "px";
	character.timerID = setTimeout("gravity(" + index + ");", 30);
}
