var beadsLength = 500; // длина цепочки шариков в пикселях
var beadsOffset = 50; // смещение цепочки шариков в пикселях от начала координат
var ballCount = 0; // количество шариков
var ballsData = new Array(); // массив с координатами, в которых находятся шарики
var needCoords = new Array(); // массив с координатами, к которых должны находиться шарики
var originalCoords = new Array(); // массив с начальными координатами шариков на нитке
var needShowText = true; // необходимо показать текст, как только шарики займут свои места
var radiusSum = 0;
var mouseX = 0;
var mouseY = 0;
var movingBalls;
var amp = 0;
var mouseDistance = 500;
var opacityTime = 2500;

// проявляет текст на странице
function showText()
{
	$(".text").animate({
		opacity: 'toggle'
	}, "slow");
}

// проявляет шарики на странице
function showBalls()
{
	if ( $(".balls div:0").css("display") != "block" )
		$(".balls div").animate({
			opacity: 'toggle'
		}, opacityTime);
}

// устанавливает координаты шарика в массиве (номер шарика, x-координата центра, y-координата центра)
function setBallPosition(i, x, y)
{
	ballsData[i][1] = x;
	ballsData[i][2] = y;
}

// выставляет шарики в соответствии с координатами из массива ballsData
function applyBallsCoords()
{
	for ( i = 1; i <= ballCount; i++ ) {
		$(".ball-" + i).css("left", Math.round(ballsData[i][1] - $(".ball-" + i).width() / 2));
		$(".ball-" + i).css("top",  Math.round(ballsData[i][2] - $(".ball-" + i).height() / 2));
	}
}

// двигает шарики к необходимым координатам
function moveBalls()
{
	var ice = true;
	var pseudoIce = true;
	
	for ( i = 1; i <= ballCount; i++ ) {
		if ( ice )
			if ( ( Math.abs(needCoords[i] - ballsData[i][1]) > 0.5 ) ||
				 ( Math.abs(needCoords[i] - ballsData[i][2]) > 0.5 ))
				ice = false;
		if ( needShowText && pseudoIce )
			if ( ( Math.abs(needCoords[i] - ballsData[i][1]) > 10 ) ||
				 ( Math.abs(needCoords[i] - ballsData[i][2]) > 10 ))
				pseudoIce = false;
		ballsData[i][1] += (needCoords[i] - ballsData[i][1]) / 5;
		ballsData[i][2] += (needCoords[i] - ballsData[i][2]) / 5;
	}
	
	applyBallsCoords();
	
	if ( pseudoIce && needShowText ) {
		showText();
		needShowText = false;
	}
	
	if ( ice ) {
		clearInterval(movingBalls);
		pullBall( Math.PI / 3 );
		// подгоняем вертикальный размер рабочей области
		var h = beadsLength + beadsOffset + 15;
		if ( $( ".empty-line" ).height() < h )
			$( ".empty-line" ).height( h );
	}
}

function balanceBalls()
{
	var currentCoord = 0;
	for ( i = 1; i <= ballCount; i++ ) {
		var d = beadsLength * (ballsData[i][0] / radiusSum);
		originalCoords[i] = needCoords[i] = currentCoord + (d / 2);
		needCoords[i] += beadsOffset;
		currentCoord += d;
	}
}

// дергает i-й шарик с запасом энергии d
function pullBall( d )
{
	for ( i = 1; i <= ballCount; i++ )
		setBallPosition( i, beadsOffset + originalCoords[i] + Math.sin(d + i * Math.PI / 6) * amp, beadsOffset + originalCoords[i] - Math.sin(d + i * Math.PI / 6) * amp );
	applyBallsCoords();
	d += 0.1;
	if ( amp < 2 ) amp += 0.1;
	setTimeout("pullBall(" + d + " )", 10);
}

$(document).ready(function(){
	
	// подгоняем вертикальный размер рабочей области

	$( ".empty-line" ).height( document.body.clientHeight );
	
	// определяем кол-во шариков

	while ( $(".ball-" + (ballCount + 1)).length > 0 )
		ballCount++;
	
	// описываем массивы с координатами для шариков
	
	for ( i = 1; i <= ballCount; i++ ) {

		ballsData[i] = new Array();
		radiusSum += ballsData[i][0] = Math.round($(".ball-" + i).width() / 2); // радиус
		ballsData[i][1] = 0;
		ballsData[i][2] = 0;
		
		needCoords[i] = new Array();
		needCoords[i] = 0; // x-координата, она же y-координата
	}

	// раскидываем шарики по экрану случайным образом
	
	for ( i = 1; i <= ballCount; i++ )
		setBallPosition(i, Math.random() * 700, Math.random() * 500);
	
	applyBallsCoords();
		
	showBalls();
	
	balanceBalls();		

	setTimeout('movingBalls = setInterval("moveBalls()", 10)', opacityTime);

	$( ".layout" ).mousemove(function(e){
		var x = e.clientX;
		var y = e.clientY;
		var p = ( x + y ) / 2;
		var c = Math.max( Math.pow( ( mouseDistance - Math.abs( x - y ) ) / mouseDistance, 2 ), 0 );
			
		balanceBalls();
		for ( var i = 1; i <= ballCount; i++ ) {
			var delta = originalCoords[i] - p;
			var prc = Math.min( 2 * Math.abs(delta) / beadsLength, 1 );
			var k  = Math.max( 1 + c * Math.pow(1 - prc, 3) * 1 * ( 1 - Math.pow( prc, (1 + c*2) ) ), 1 );
			originalCoords[i] = p + delta * k;
			if ( originalCoords[i] < 0 )
				originalCoords[i] = 0;
			if ( originalCoords[i] > beadsLength )
				originalCoords[i] = beadsLength;
		}
	});

});