/*
* Xenon07
*
* TODO:
* .) Schuesse
* .) Level
* .) ...
*/




/**
*  Objekte             ------------------------------------------------------------------
*/

//Config - enthaelt Configurationswerte für das Spiel
var Config = {
	GameSpeed:			70,	//~50
	StartPositionX: 	280,	//Startposition des Raumschiffs
	StartPositionY: 	300,
	minPositionX: 		0,		//minimale und maximale x- & y-Positionen
	maxPositionX: 		600,
	minPositionY: 		0,	
	maxPositionY:			400,
	moveByStep:				10,		//Schrittweite bei der Bewegung
	moveSchussY:			20,
	RaumschiffSchussCounter:5,	//bestimmt die Häufigkeit der Schüsse des Raumschiffs
	RaumschiffStopCounter:20,	//Bestimmt, wie lange es dauert bis sich das Raumschiff wieder Bewegt
	FeindStepY:				5,
	PunkteProKill:		100,
	GrafikFeinde:			['feind.png', 'feind.png', 'feind.png'],
	GrafikRaumschiff:	'raumschiff.gif',
	
	maxHighscoreItems: 10
}

//Game, enthaelt Werte und Funktionen fuer das aktuelle Spiel.
var Game = {
	Status:		'play', //andere Stati: paused, gameover,...?
	Leben:		3,
	Punkte:		0,
	Level:		1,
	Highscore: 	null,
	Raumschiff: null,
	Feinde: null,
	GameloopInterval: null,
	
	//setzt die Werte fuer ein neues Spiel (zurueck).
	newGame: function(){
		
		this.Raumschiff = new Fighter('Raumschiff', Config.StartPositionX, Config.StartPositionY);
		// x = Math.floor(Math.random()*40)*10;
		this.Feinde = [new Fighter('Feind1', Math.floor(Math.random()*40)*10, 0),
			new Fighter('Feind2', Math.floor(Math.random()*40)*10, -150),
			new Fighter('Feind3', Math.floor(Math.random()*40)*10, -300)];
		this.Leben = 3;
		this.Punkte = 0;
		this.Level = 1;
		$('leben').innerHTML = this.Leben + ' Leben';
		$('level').innerHTML = 'Level ' + 1; 
		this.loadHighscore();
	},
	
	//Startet das Spiel bzw. nimmt es wieder auf.
	Play: function (){
		document.onkeydown = EventHandler.Game;
		fadeOut('canvas_menu', 0.1);
		selfisch = this;
		this.GameloopInterval = window.setInterval('selfisch.GameLoop();', Config.GameSpeed);
	},
	
	//Pausiert das Spiel
	Pause: function (){
		selfisch = this;
		window.clearInterval(selfisch.GameloopInterval);
		document.onkeydown = EventHandler.Menue;
		fadeIn('canvas_menu');
	},
	
	Stop: function (){
		window.clearInterval(selfisch.GameloopInterval);
		document.onkeyup = EventHandler.GameUp;
		document.onkeydown = EventHandler.Menue;
		fadeIn('canvas_menu');
		if(this.Status == 'gameover'){
			Game.Raumschiff.element.src = Config.GrafikRaumschiff;
			setTimeout('Game.endGame();', 500);
		}else{
			this.Pause();
		}
	},
	
	//Bewegt die Feinde und Schuesse
	GameLoop: function() {	
		
		//Levelswitcher
		if(this.Level == 1 && this.Punkte >= 1000){
			this.setLevel(2);
		}else if(this.Level == 2 && this.Punkte >= 3000){
			this.setLevel(3);
		}else if(this.Level == 3 && this.Punkte >= 5000){
			this.setLevel(4);
			Config.RaumschiffSchussCounter--;
		}else if(this.Level == 4 && this.Punkte >= 10000){
			this.setLevel(5);
		}else if(this.Level == 5 && this.Punkte >= 15000){
			this.setLevel(6);
		}else if(this.Level == 6 && this.Punkte >= 25000){
			this.setLevel(7);
			Config.RaumschiffSchussCounter--;
		}else if(this.Level == 7 && this.Punkte >= 30000){
			this.setLevel(8);
		}else if(this.Level == 8 && this.Punkte >= 40000){
			this.setLevel(9);
			Config.RaumschiffSchussCounter--;
		}else if(this.Level == 9 && this.Punkte >= 50000){
			this.setLevel(10);
		}
		
		//Begrenzung der Schuesse
		if(this.Raumschiff.SchussCounter > 0){
			this.Raumschiff.SchussCounter--;
		}
		//Wenn Raumschiff zuvor getroffen wurde
		if(this.Raumschiff.stopCounter > 0){
			this.Raumschiff.stopCounter--;
			if(this.Raumschiff.stopCounter == 0){
				Game.Raumschiff.element.src = Config.GrafikRaumschiff;
			}
		}
		Game.Raumschiff.MoveSchuesse(-Config.moveSchussY);
		
		for(i = 0; i < 3; i++){
			//Falls Feind getroffen wurde
			if (this.Feinde[i].stopCounter > 0) {
				this.Feinde[i].stopCounter--;
				
				// Feind zurücksetzen
				if (this.Feinde[i].stopCounter == 0) {
					x = Math.random()*60;
					x = Math.floor(x);
					this.Feinde[i].moveBy(-this.Feinde[i].x,-this.Feinde[i].y-40);
					this.Feinde[i].moveBy(x*10,0);									
					this.Feinde[i].element.src = Config.GrafikFeinde[i];						
				}
				continue;				
			}
			
			//Neue Position der Feinde berechnen
			if(this.Feinde[i].y >= 400){	//Feind zuruecksetzen
				x = Math.random()*60;
				x = Math.floor(x);
				this.Feinde[i].moveBy(-this.Feinde[i].x,-440);
				this.Feinde[i].moveBy(x*10,0);
				this.Punkte -= 5*Config.PunkteProKill;
			} else {	//Feind berechnen
				x = Math.random();
				if(x < 0.2){
					if(this.Feinde[i].x > 10){
						x = -5;
					}
				}else if(x > 0.8){
					if(this.Feinde[i].x < 600){
						x = 5;
					}
				}else{
					x = 0;
				}
				this.Feinde[i].moveBy(x,Config.FeindStepY);
			}
			//Kollision Raumschiff-Feinde
			if (this.Feinde[i].collision(this.Raumschiff.x, this.Raumschiff.y )) {
				if(this.Raumschiff.stopCounter == 0){
					this.Feinde[i].element.src = 'explosion.gif';
					this.Feinde[i].stopCounter = 5;
					this.Raumschiff.element.src = 'explosion.gif';
					this.Raumschiff.stopCounter = Config.RaumschiffStopCounter;
					this.Leben--;
					if(this.Leben == 0){
						this.Status	= 'gameover';
						this.Feinde[i].element.src = Config.GrafikFeinde[i];
						this.Stop();
					}
					$('leben').innerHTML = this.Leben + ' Leben';
				}
			}
			//Kollision Feinde-Schuesse
			for(cs = 0; cs < this.Raumschiff.SchussList.length; cs++){
				//Schusskollision
				cleft = $(this.Raumschiff.SchussList[cs]).style.left.slice(0,-2);
				ctop = $(this.Raumschiff.SchussList[cs]).style.top.slice(0,-2);
				if (this.Feinde[i].collision(cleft, ctop)) {
					this.Feinde[i].element.src = 'explosion.gif';
					this.Feinde[i].stopCounter = 5;
					this.Raumschiff.delSchuss(cs);
					this.Punkte += Config.PunkteProKill;
				}
			}			
		}
		$('punkte').innerHTML = Game.Punkte + " Punkte";
	},
	
	loadHighscore: function(){
		this.Highscore = new Array();
		for(i = 0; i < Config.maxHighscoreItems; i++){
			this.Highscore[i] = new Array();
			this.Highscore[i][0] = 'empty';
			this.Highscore[i][1] = 0;
		}
		
		CookieArray = document.cookie.split(';');
		cnt = 0;
		i = 0;
		for(i = 0; i < CookieArray.length; i++){
			s = CookieArray[i];
			if(s.substring(0,1) == " "){
				s = s.substring(1, s.length)
			}
			if(s.substring(0,1) == 'S'){
				a = s.split('=')[1].split('$');
				this.Highscore[cnt][0] = a[0];
				this.Highscore[cnt][1] = a[1];
				cnt++;	
			}
		}
		this.showHighscore();
	},
		
	showHighscore: function(){
		s = '<table width="100%">';
		s += '<tr><td>Name</td><td>Punkte</td></tr>';
		for(i = 0; i < Config.maxHighscoreItems; i++){
			s += '<tr  class="highscoretable">';
			s += '<td class="highscoretable">' + (i+1) + ". " + this.Highscore[i][0] + '</td><td class="highscoretable">' + this.Highscore[i][1] + '</td>';
			s += '</tr>';
		}
		s += '</table>';
		$('highscore').innerHTML = s;
	},
	
	saveHighscore: function(name, punkte){
		a = new Array();
		a[0] = name;
		a[1] = punkte;
		
		for(i = 0; i < this.Highscore.length; i++){
			if(this.Highscore[i][1] <= a[1]){
			help = this.Highscore[i];
			this.Highscore[i] = a;
			a = help;
			}
		}
		d = new Date();
		d.setTime(d.getTime() + (100 * 24 * 60 * 60 * 1000));
		expires = d.toGMTString();
		for(i = 0; i < this.Highscore.length; i++){
			document.cookie = "S" + i + "=" + this.Highscore[i][0] + "$" + this.Highscore[i][1] + "; expires=" + expires;
		}
		this.showHighscore();
	},
	
	endGame: function(){
		name = prompt("Bitte Name angeben");
		if(name != ""){
			this.saveHighscore(name, this.Punkte);
			fadeIn('canvas_high');
		}
		this.newGame();
	},
	
	setLevel: function(num){
			selfisch = this;
			window.clearInterval(selfisch.GameloopInterval);
			this.Level = num;
			Config.GameSpeed -= Math.ceil(Config.GameSpeed / 8);
			$('level').innerHTML = 'Level ' + num; 
			this.GameloopInterval = window.setInterval('selfisch.GameLoop();', Config.GameSpeed);
			$('canvas_level').innerHTML = '<h1>Level ' + num + '</h1>';
			$('canvas_level').style.display = "block";
			$('canvas_level').style.opacity = 1;
			fadeOut('canvas_level', 0.01);
		}
}

/**
* Fighter
*/
//Konstruktor
function Fighter(_element, _x, _y){
	this.element = $(_element);	//Element
	this.x = _x;				//x-Position
	this.y = _y;				//y-Position
	this.element.style.top = this.y + 'px';		//Fighter positionieren
	this.element.style.left = this.x + 'px';
	this.stopCounter = 0;		//zaehlt die Schleifendurchlaeufe bis zum Wiedereinstieg
	this.SchussCounter = 0;		//beschraenkt die Anzahl der Schuesse
	this.SchussList = new Array();	//aktuell vorhandene Schuesse
}

//Berechnet Kollision des Fighters
Fighter.prototype.collision = function(dx,dy){
	if (((dx > (this.x - 40)) && (dx < (this.x + 40))) &&
			 		((dy > (this.y - 40)) && (dy < (this.y + 40)))) {
		return true;
	}else
		return false;
}

//Bewegt den Fighter
Fighter.prototype.moveBy = function(dx, dy){	
	if(this.stopCounter == 0){
		this.x += dx;
		this.y += dy; 
		this.element.style.top = this.y + 'px';
		this.element.style.left = this.x + 'px';
		
		if(this.element.id == 'Raumschiff'){
			$('pos').innerHTML = this.x + ', ' +this.y;
			if(this.x < 0){
				this.x = 0;
				this.element.style.left = '0px';
			}
			if(this.x > 600){
				this.x = 600;
				this.element.style.left = '600px';
			}
			if(this.y < 0){
				this.y = 0;
				this.element.style.top = '0px';
			}
			if(this.y > 400){
				this.y = 400;
				this.element.style.top = '400px';
			}
		}
	}
}

//Loest einen Schuss aus
Fighter.prototype.Schuss = function(){
	if(this.SchussCounter != 0){
		return;
	}
	newImage = document.createElement("img");
	newImage.src = 'schuss.png';
	newImage.id = this.SchussList.length;
	newImage.style.position = 'absolute';
	newImage.style.left = this.x+"px";
	newImage.style.top = this.y+"px";			
	$('canvas').appendChild(newImage);
	this.SchussList.push(newImage.id);
	this.SchussCounter = Config.RaumschiffSchussCounter;
}

/*
* bewegt alle Schuesse des Fighters um dy
*/
Fighter.prototype.MoveSchuesse = function(dy){
	sdel = null;
	for(s = 0; s < this.SchussList.length; s++){
		sy = $(s).style.top.toString().slice(0,-2);
		newy = parseInt(sy) + dy;
		$(s).style.top = (newy)+'px';
		if(sy < 20){
			sdel = s;
		}
	}
	if(sdel != null){
		this.delSchuss(sdel);
	}
}

/*
* Loescht Schuss mit this.SchussList[sdel]
*/
Fighter.prototype.delSchuss = function(sdel){
	slength = this.SchussList.length;
	cnt = 0;
	for(j = 0; j < slength; j++){
		if(j == sdel){
			this.SchussList.splice(j,1);
			$('canvas').removeChild($(j));
			cnt++;	
			slength--;
		}
		if(this.SchussList.length > 0 && cnt <= this.SchussList.length) {
			$(cnt).id = '' + j;
			this.SchussList[j]= j;
			cnt++;
		}
	}
}

/**
*  Spielsteuerung      ------------------------------------------------------------------
*/
var EventHandler = new Handler();

function Handler(){
	this.IntervalIDUp=		null;
	this.IntervalIDDown=	null;
	this.IntervalIDLeft=	null;
	this.IntervalIDRight=null;
}

//Tastenbelegung waehrend dem Spiel
Handler.prototype.Game= function(Ereignis) {
		//Broser-Weiche
		if (!Ereignis)
		    Ereignis = window.event;
		if (Ereignis.which) {
		    Tastencode = Ereignis.which;
		} else if (Ereignis.keyCode) {
	    	Tastencode = Ereignis.keyCode;
	  	}
		//Events
		if(Game.Raumschiff.stopCounter >0){
			return;
		}
		thiss = this;
		if(Tastencode == 37){					//Pfeil-nach-links
			window.clearInterval(thiss.IntervalIDLeft);
			this.IntervalIDLeft = window.setInterval('Game.Raumschiff.moveBy(-4,0);', 1);
		} else if(Tastencode == 38){	//Pfeil-nach-oben
			window.clearInterval(thiss.IntervalIDUp);
			this.IntervalIDUp = window.setInterval('Game.Raumschiff.moveBy(0,-4);', 1);
		} else if(Tastencode == 39){	//Pfeil-nach-rechts
			window.clearInterval(thiss.IntervalIDRight);
			this.IntervalIDRight = window.setInterval('Game.Raumschiff.moveBy(4,0);', 1);
		} else if(Tastencode == 40){	//Pfeil-nach-unten
			window.clearInterval(thiss.IntervalIDDown);
			this.IntervalIDDown = window.setInterval('Game.Raumschiff.moveBy(0,4);', 1);
		} else if(Tastencode == 32){	//Space-Taste -> Schuss
			//$('scheiss').innerHTML = Game.Raumschiff.SchussCounter;
				Game.Raumschiff.Schuss();
		} else if(Tastencode == 27){	//esc-Taste
			Game.Pause();
		}
}

Handler.prototype.GameUp= function (Ereignis) {
	  //Broser-Weiche
		if (!Ereignis)
	    	Ereignis = window.event;
	  	if (Ereignis.which) {
	    	Tastencode = Ereignis.which;
	  	} else if (Ereignis.keyCode) {
	    	Tastencode = Ereignis.keyCode;
	  	}
		//Events
		thiss = this;
		if(Tastencode == 37){					//Pfeil-nach-links
			window.clearInterval(thiss.IntervalIDLeft);
		} else if(Tastencode == 38){	//Pfeil-nach-oben
			window.clearInterval(thiss.IntervalIDUp);
		} else if(Tastencode == 39){	//Pfeil-nach-rechts
			window.clearInterval(thiss.IntervalIDRight);
		} else if(Tastencode == 40){	//Pfeil-nach-unten
			window.clearInterval(thiss.IntervalIDDown);
		} else if(Tastencode == 27){	//esc-Taste
			Game.Pause();
		}
}

	//Brauchma des?????????????????????????????????????
Handler.prototype.Menue= function (Ereignis) {
		//Browser-Weiche
	  if (!Ereignis)
	    Ereignis = window.event;
	  if (Ereignis.which) {
	    Tastencode = Ereignis.which;
	  } else if (Ereignis.keyCode) {
	    Tastencode = Ereignis.keyCode;
	  }
}

//(Hilfs-)Funktionen  ------------------------------------------------------------------

//Wrapper für document.getElementById
function $(id){
  return document.getElementById(id);
}

//Element ausblenden
function fadeOut(elementID, speed){
  var Element = $(elementID);
	if(Element.style.opacity > 0){
		if(Element.style.opacity <= speed){
			Element.style.opacity = 0;
			Element.style.display = 'none';
			return;
		}
		Element.style.opacity -= speed;
		var funk = 'fadeOut("'+ elementID + '", ' + speed + ')';
		setTimeout(funk, 1);
	} else{ return false;}
}

//Element eionblenden
function fadeIn(elementID){
  var Element = $(elementID);
	if(Element.style.display == 'none'){
		Element.style.display = 'block';
	}
	opact = parseFloat(Element.style.opacity);
	if(Element.style.opacity < 1){
		opact += 0.1;
		Element.style.opacity = opact;
		setTimeout('fadeIn("'+ elementID + '")', 1);
		return true;
	}
}

