/*(c) by Netz-Etage*/

/*
==================================================
Variabeln
==================================================
*/

// ### Intervalle und Timer ###
var interval; 		// allg. Intervall für die Flugberechnung
var fadeInterval ;	// Interval für das Ausfaden des Elementes
var controlInterval =  window.setInterval("control()",50); // Intervall für die Ränderkontrolle
var timerO;			// Ruhetimer für nächsten Flug

// ### Libellen Parameter ###
var objectWidth = 90;
var objectHeigth = 105;

// ### Startposition der Libelle ### 
var startX = document.getElementById('start').offsetWidth - objectWidth-10; 
var startY = 100; 

// ### Relative Position der Libelle ###  
var x = 0;  
var y = 0;

// ### Reale Position der Libelle ### 
var strX = startX;
var strY = startY;

// ### Temporärer Enpunkt beim direkten Flug ### 
var endPointX;
var endPointY;

// ### Flugrichtung ###  
var xDirect = 1;
var yDirect = 1;

// ### Geschwindigkeiten und Zeiten ### 
var speed=30;			// GrundAnimationsgeschwindigkeit
var fadeSpeed = 20;		// Ausbkendgeschwindigkeit
var interValTime = 50;	// FPS 50 = 20 Bilder in der Sekunde (Angabe in milisekunden)
var sleepTime = 1500;	// Pause zwischen den Fluganimationen

// ### Verschiedene Variablen ### 
var xMultiplier= 0;				// Steigung 
var bogen = 0;					// Weite des Parablenfluges
var verschieben = 1;			// Vershiebung der parabel auf der X-Achse
var direction = -1;				// Flugrichtung für die parabel
var curAlpha = 0;				// aktueller Alpha-Wert
var fadeOutActive = false;		// Flag fürs letzte ausfaden
var controlIsActive = false;	// Flag damit die NAimation nicht beim laden der Seite sofort beendet wird		
var marginLeft = 150;			// linker Abstand ab dem die Libelle zu sehen ist
var marginTop = 15;				// oberer Abstand ab dem die Libelle zu sehen ist
var showOutput = false;			// Debugoutput

// ### Array für die Flugeinstellungen  ### 
var count = 3;					// Anzahl der Flüge
var currentFly = 0;				// Aktuelle Flugnummer
var flyAry = new Array(count);	// beinhaltet die Flugdaten


init();

/*
==================================================
init
initialisiert den Flug
==================================================
*/
function init()
{
	window.clearInterval(interval);
	controlIsActive = true;

	gotoPosition(startX,startY);
	
	for( var y = 0; y< count;y++)
	{
		flyAry[y] = new Array();
	}
	
	flyAry[0][0] = "direkt";// flugtyp
	flyAry[0][1] = 250; // x von der mitte 
	flyAry[0][2] = 230; // y
	flyAry[0][3] = 1000;  // timeOutTime
	flyAry[1][0] = "direkt";
	flyAry[1][1] = 100;
	flyAry[1][2] = 50;
	flyAry[1][3] = sleepTime;
	flyAry[2][0] = "parable";
	flyAry[2][1] = -0.035; 			// Parabelweite
	flyAry[2][2] = 1.01;		// X-Achsen verschiebung
	flyAry[2][3] = sleepTime;
	
	fadeInterval = setInterval ("fadeIn ('libelle')", interValTime);
	next();
}

/*
==================================================
flyParable
berechnet die nächste Flugkoordinate bei einer Parable
==================================================
*/
function flyParable(endX)
{
	x++;	    
	y = bogen*(x*x)+(parseInt(verschieben)*x);
	
	strY = startY+(y*speed);	
	strX = startX + ((x)*direction*speed);
	
	gotoPosition(strX,strY);
	
	if(strX<endX)
	{
		next();
	}
}

/*
==================================================
setStartPos
setzt die Startposition für die Berechnung zurück
==================================================
*/
function setStartPos()
{
	x = 0;
	y = 0;
	startX = strX;
	startY = strY;
}

/*
==================================================
flyDirekt
berechnet die nächste Flugkoordinate beim direkten Flug
==================================================
*/
function flyDirekt()
{
	if(showOutput)
		document.getElementById("differenz").innerHTML = "x: " + x + " y: " +y  ;
	x= (x+xDirect);

	y = x*xMultiplier*yDirect*xDirect;
	
	strX = startX +(x*speed) ;
	strY= startY +(y*speed) ;
	
	
	gotoPosition(strX,strY);
	
	if(xDirect == 1)
	{
		if(strX >= endPointX)
		{
			 next();
		}
	}
	else
	{
		if(strX <= endPointX)
		{
			 next();
		}
	}
}

/*
==================================================
next
setzt ein TimeOut für den Start der nächsten Flugbahn
==================================================
*/
function next()
{
	window.clearInterval(interval);
	setStartPos();
	if(currentFly != count)
		timerO = setTimeout("nextFly()",flyAry[currentFly][3]);
}

/*
==================================================
nextFly
startet die nächste Flugbahn
==================================================
*/
function nextFly()
{
	if(flyAry[currentFly][0] == "direkt")
	{
		endPointX = document.getElementById('start').offsetWidth/2+flyAry[currentFly][1];
		endPointY = flyAry[currentFly][2];
		var xDiv =endPointX-startX;
		var yDiv =endPointY-startY;
		
	
		if(startY>=endPointY)
			yDirect = -1;
		else
			yDirect = 1;
			
		if(xDiv>=0)
			xDirect = 1;
		else
			xDirect = -1;	
	
		xMultiplier = Math.abs(yDiv/xDiv);
	
		interval = window.setInterval("flyDirekt()",interValTime);
	}
	else
	{
		bogen = flyAry[currentFly][1]; 
		verschieben = flyAry[currentFly][2];
		interval = window.setInterval("flyParable(0)",interValTime);
	}
	currentFly++;
}

/*
==================================================
gotoPosition
Bewegt das Element zu einer bestimmten Koordinate
==================================================
*/
function gotoPosition(posX,posY)
{
	posY= round(posY,1);
	posX= round(posX,1);

	document.getElementById("libelle").style.top = ''+posY+'px';
	document.getElementById("libelle").style.left = ''+posX+'px';
	if(showOutput)
		document.getElementById("position").innerHTML = "X: " + posX + " Y: " +posY ;
}

/*
==================================================
round
rudnet auf ganze Zahlen
==================================================
*/
function round(x, n) {
  if (n < 1 || n > 14) return false;
  var e = Math.pow(10, n);
  var k = (Math.round(x * e) / e).toString();
  if (k.indexOf('.') == -1) k += '.';
  k += e.toString().substring(1);
  k = k.substring(0, k.indexOf('.') + n+1);
  k = k.substring(0,k.length-2);
  return k;
}


/*
==================================================
control 
überprüft ob das Element den linken und 
oberen Rand erreicht und beendet die animation
==================================================
*/
function control()
{
	var styleTop = document.getElementById("libelle").style.top;
	var styleleft = document.getElementById("libelle").style.left;
	
	var top = parseInt(styleTop.substring(0,styleTop.length-2));
	var left = parseInt(styleleft.substring(0,styleleft.length-2));
	var width = window.innerWidth;
	var heigth = window.innerHeight;

	if(top <= 0 || left <= 0  )
		if(controlIsActive)
				window.clearInterval(interval);
	
	if(left <= marginLeft  || top <= marginTop)
	{
		if(fadeOutActive == false)
		{
			fadeOutActive = true;
			curAlpha = 60;
			fadeInterval = setInterval ("fadeOut ('libelle')", interValTime);
			window.clearInterval(controlInterval);
		}
	}	
}

/*
==================================================
fadeIn 
blendet ein Element aus
==================================================
*/
function fadeOut(id){
	var element = document.getElementById(id);

	if (curAlpha <= 0)
	{
		element.style.opacity = "0";
		element.style.display = "none";
		window.clearInterval(fadeInterval);
	}
	
	element.style.opacity = "."+curAlpha;
	element.style.filter = "alpha(opacity="+curAlpha+")";
	
	curAlpha = curAlpha-fadeSpeed;

}
/*
==================================================
fadeIn 
blendet ein Element ein
==================================================
*/
function fadeIn(id){
	var element = document.getElementById(id);
	
	element.style.opacity = "."+curAlpha;
	
	if (curAlpha >= 100)
	{
		element.style.opacity = "1";
		window.clearInterval(fadeInterval);
	}
	
	element.style.filter = "alpha(opacity="+curAlpha+")";

	curAlpha = curAlpha+fadeSpeed;
}
	
