/*
	©Copyright 2006 - BEZUMIE.COM, All rights reserved
*/
var fish = null;
var fishw = 20;
var fishh = 20;
var fishleft = '#ff0000';
var fishright = '#ff0000';
var fishx = 0;
var fishy = 0;
var fishsx = 0;
var fishsy = 0;
var maxspeed = 4;
var fishacc = 0.4;
var fishlook = 1;
var fishhealth = 0;
var fishhealthdec = 0.5;
var fishsizes = new Array();

var food = null;
var foodspeed = 1;
var foodx = 0;
var foody = 0;
var foodw = 20;
var foodh = 20;

var resist = 0.2;

var arena = null;
var arenaw = 800;
var arenah = 500;

var running = false;
var terminate = false;

var speed = 40;

var lives = 3;

var inloop = false;

var left = false;
var right = false;
var up = false;
var down = false;

var health = null;

var fishes = new Array();
var enemysizes = new Array();
var bubbles = new Array();
var bubblespeed = -0.7;

var scorer = 0;

var mx = -1;
var my = -1;
var changed = 0;

function rand(n) {
	return Math.round(Math.random() * n);
}

function eat(n) {
	if (fishhealth < 0) {
		fishhealth = 0;
		health.style.background = "#ffa0a0";
	}
	scorer += n;
	updateScore();
	if (fishw == 20)
		fishhealth += n * 8;
	else
		fishhealth += n * 5;
	if (fishhealth >= (fishw * 10)) {
		bigger();
	}
}

function newbubble() {
	var tmp = new Object;
	if (fishlook == 1)
		tmp.x = fishx;
	else
		tmp.x = fishw - 10;
	tmp.y = fishy;
	tmp.el = document.createElement("div");
	tmp.el.className = 'bubble';
	arena.appendChild(tmp.el);
	tmp.el.style.left = tmp.x + 'px';
	tmp.el.style.top = tmp.y + 'px';
	bubbles.push(tmp);
}

function delbubbles() {
	n = bubbles.length;
	for (i = 0; i < n; i ++) {
		tmp = arena.removeChild(bubbles[i].el);
		//delete tmp;
		tmp = bubbles[i];
		//delete tmp;
	}
	bubbles.length = 0;
}

function newfish() {
	var tmp = new Object;
	var n = rand(9);
	tmp.w = 10 + 10 * rand(n);
	tmp.h = enemysizes[tmp.w];
	tmp.sx = 6 - (tmp.w - 10) * 4/90;
	var myel = document.createElement("div");
	myel.className = 'enemy';
	arena.appendChild(myel);
	tmp.el = myel;
	if (rand(1) == 0) {
		tmp.x = 0;
		changebck(myel, "enemy" + (rand(2) + 1) + "-" + tmp.w + "x" + tmp.h + "-right.png");
	} else {
		tmp.x = arenaw - tmp.w;
		tmp.sx = -tmp.sx;
		changebck(myel, "enemy" + (rand(2) + 1) + "-" + tmp.w + "x" + tmp.h + "-left.png")
	}
	tmp.y = rand(arenah - tmp.h);
	myel.style.width = tmp.w + 'px';
	myel.style.height = tmp.h + 'px';
	myel.style.left = tmp.x + 'px';
	myel.style.top = tmp.y + 'px';
	
	fishes.push(tmp);
}

function delfishes() {
	n = fishes.length;
	for (i = 0; i < n; i ++) {
		tmp = arena.removeChild(fishes[i].el);
		//delete tmp;
		tmp = fishes[i];
		//delete tmp;
	}
	fishes.length = 0;
}

function reset() {
	if (arena == null) {
		arena = document.getElementById('arena');
	}
	if (fish == null) {
		fish = document.createElement("div");
		fish.className = 'fish';
		arena.appendChild(fish);
	}
	if (health == null) {
		health = document.getElementById('health');
	}
	fishx = (arenaw - fishw) / 2;
	fishy = 0;
	fish.style.left = Math.round(fishx) + 'px';
	fish.style.top = Math.round(fishy) + 'px';
	fishsx = 0;
	fishsy = 8;
	
	running = false;
	terminate = false;
	
	fishhealth = 0;
	
	updateScore();
	updatehlth();
	delfishes();
	
	showMessage(startLbl, hitEnterLbl);
}

function delfish(i, n) {
	var tmp = arena.removeChild(fishes[i].el);
	//delete tmp;
	tmp = fishes[i];
	//delete tmp;
	if (n > 1)
		fishes[i] = fishes[n - 1];
	fishes.pop();
}

function checkcol() {
	var mouthw = Math.round(fishw / 2);
	var mouthx = fishx;
	if (fishlook != 1) mouthx = fishx + fishw - mouthw;
	var mouthh = fishh;
	var mouthy = fishy;
	
	if (food != null) {
		
		if ((mouthx < (foodx + foodw)) && (mouthy < (foody + foodh)) && (mouthx > (foodx - mouthw)) && (mouthy > (foody - mouthh))) {
			delfood();
			eat(20);
		}
	}
	
	var n = fishes.length;
	var i = 0;
	while (i < n) {
		tmp = fishes[i];
		fmw = Math.round(tmp.w / 2);
		fmx = tmp.x;
		if (tmp.sx > 0) fmx = tmp.x + tmp.w - fmw;
		fmy = tmp.y;
		fmh = tmp.h;
		
		if ((tmp.w < fishw) && (mouthx < (tmp.x + tmp.w)) && (mouthy < (tmp.y + tmp.h)) && (mouthx > (tmp.x - mouthw)) && (mouthy > (tmp.y - mouthh))) {
			eat(tmp.w);
			delfish(i, n);
			n--;
			i--;
		} else if ((tmp.w >= fishw) && (fishx < (fmx + fmw)) && (fishy < (fmy + fmh)) && (fishx > (fmx - fishw)) && (fishy > (fmy - fishh))) {
			lives --;
			return true;
		}
		i++;
	}
	return false;
}

function delbubble(i, n) {
	var tmp = arena.removeChild(bubbles[i].el);
	//delete tmp;
	tmp = bubbles[i];
	//delete tmp;
	if (n > 1)
		bubbles[i] = bubbles[n - 1];
	bubbles.pop();
}

function movebubbles() {
	var n = bubbles.length;
	i = 0;
	while (i < n) {
		tmp = bubbles[i];
		
		tmp.x += (rand(2) - 1) / 5;
		tmp.y += bubblespeed;
		
		if ((tmp.x < 0) || (tmp.x > (arenaw - 100)) || (tmp.y < 0)) {
			delbubble(i, n);
			n --;
			i --;
		} else {
			tmp.el.style.left = Math.round(tmp.x) + 'px';
			tmp.el.style.top = Math.round(tmp.y) + 'px';
		}
		i++;
	}
}

function movefishes() {
	var n = fishes.length;
	i = 0;
	while (i < n) {
		tmp = fishes[i];
		tmp.x += tmp.sx;
		if ((tmp.x < 0) || (tmp.x > (arenaw - tmp.w))) {
			delfish(i, n);
			n --;
			i --;
		} else {
			tmp.el.style.left = Math.round(tmp.x) + 'px';
		}
		i++;
	}
}

function movefish() {
	fishx += fishsx;
	fishy += fishsy;
	
	if (fishx < 100) {fishx = 100; fishsx = 0;}
	else if (fishx > (arenaw - fishw - 100)) {fishx = arenaw - fishw - 100; fishsx = 0;}
	if (fishy < 0) {fishy = 0; fishsy = 0;}
	else if (fishy > (arenah - fishh)) {fishy = arenah - fishh; fishsy = 0;}
	
	fish.style.left = Math.round(fishx) + 'px';
	fish.style.top = Math.round(fishy) + 'px';
}

function delfood() {
	if (food == null) return;
	arena.removeChild(food);
	//delete food;
	food = null;
}

function moveobjects() {
	if (left) move(1);
	if (right) move(3);
	if (up) move(2);
	if (down) move(4);
	if ((mx >= 0) && (my >= 0)) {
		var tx = fishx;
		if (fishlook != 1) tx = fishx + fishw;
		if ((tx > (mx + 5))&&((changed == 0) || (fishlook == 1))) {
			changed = 15;
			move(1);
			if (fishlook != 1) lookat(1);
		} else if ((tx < (mx - 5))&&((changed == 0) || (fishlook == 2))) {
			changed = 15;
			move(3);
			if (fishlook != 2) lookat(2);
		}
		if (fishy > my) move(2);
		else if (fishy < my) move(4);
		
		if (changed > 0) changed--;
	}
	movefish();
	movefishes();
	movebubbles();
	
	if (food != null) {
		foody = foody + foodspeed;
		if (foody > (arenah - foodh)) {
			delfood();
		} else {
			food.style.top = foody + 'px';
		}		
	}
	
	var dirx = 0;
	var diry = 0;
	if (fishsx > 0) dirx = 1;
	else if (fishsx < 0) dirx = 2;
	if (fishsy > 0) diry = 1;
	else if (fishsy < 0) diry = 2;
	
	if (dirx != 0) {
		if (dirx == 1) {
			fishsx -= resist;
			if (fishsx < 0) fishsx = 0;
		} else {
			fishsx += resist;
			if (fishsx > 0) fishsx = 0;
		}
	}
	if (diry != 0) {
		if (diry == 1) {
			fishsy -= resist;
			if (fishsy < 0) fishsy = 0;
		} else {
			fishsy += resist;
			if (fishsy > 0) fishsy = 0;
		}
	}
}

function hideMessage() {
	var msg = document.getElementById('message');
	msg.style.display = 'none';
}

function showMessage(s1, s2) {
	var msg = document.getElementById('message');
	msg.innerHTML = '<span class="big">' + s1 + '</span><br><span class="small">' + s2 + '</span>';
	msg.style.display = 'block';
}

function updateScore() {
	var score = document.getElementById('score');
	score.innerHTML = livesLbl + ': ' + lives + ', ' + scoreLbl + ': ' + scorer;
}

function newgame() {
	lives = 3;
	reset();
	fishw = 20;
	fishh = 17;
	fishlook = 1;
	maxspeed = 4;
	fishacc = 0.4;
	updatefish();
	delfood();
	delbubbles();
	fishsizes[20] = 17;
	fishsizes[25] = 21;
	fishsizes[30] = 25;
	fishsizes[35] = 30;
	fishsizes[40] = 34;
	fishsizes[45] = 38;
	fishsizes[50] = 42;
	fishsizes[55] = 46;
	fishsizes[60] = 50;
	fishsizes[65] = 55;
	fishsizes[70] = 59;
	fishsizes[75] = 63;
	fishsizes[80] = 67;
	fishsizes[85] = 72;
	fishsizes[90] = 76;
	fishsizes[95] = 80;
	enemysizes[10] = 7;
	enemysizes[20] = 14;
	enemysizes[30] = 21;
	enemysizes[40] = 28;
	enemysizes[50] = 35;
	enemysizes[60] = 42;
	enemysizes[70] = 49;
	enemysizes[80] = 56;
	enemysizes[90] = 62;
	enemysizes[100] = 69;
	scorer = 0;
}

function checkGameState() {
	var res = false
	if (lives <= 0) {
		terminate = true;
		updateScore();
		showMessage(gameOverLbl + ' ' + scoreLbl + ': ' + scorer, '<a href="javascript:newgame();">' + newGameLbl + '</a>');
		return true;
	}
	if (fishw == 95) {
		terminate = true;
		updateScore();
		showMessage(congratulationLbl + '<br />' + scoreLbl + ': ' + scorer, '<a href="javascript:newgame();">' + newGameLbl + '</a>');
		return true;
	}
	if (res) reset();
	return false;
}

function updatefish() {
	fishleft = "fish"+fishw+"x"+fishh+"-left.png";
	fishright = "fish"+fishw+"x"+fishh+"-right.png";
	fish.style.width = fishw + 'px';
	fish.style.height = fishh + 'px';
	lookat(fishlook);
}

function updatehlth() {
	if (fishhealth > 0) {
		var max = fishw * 10;
		var min = 0;
	} else {
		var max = 0;
		var min = -200;
	}
	
	var w = (fishhealth - min) / (max - min) * 100;
	health.style.width = Math.round(w) + 'px';
}

function bigger() {
	if (fishw <= 95) {
		fishw += 5;
		//fishh += 5;
		fishh = fishsizes[fishw];
		fishacc -= 0.01;
		maxspeed -= 0.05;
		fishhealth = 0;
		updatefish();
	}
}

function smaller() {
	if (fishw > 20) {
		fishw -= 5;
		//fishh -= 5;
		fishh = fishsizes[fishw];
		fishacc += 0.01;
		maxspeed += 0.05;
		fishhealth = fishw * 10;
		updatefish();
	} else {
		lives --;
		reset();
	}
}

function loop() {
	if (!running) return;
	if (terminate) return;
	if (!terminate) {
		if (!inloop)
			setTimeout("loop()", speed);
		else
			setTimeout("loop()", 10);
	}
	if (inloop) return;
	inloop = true;
	
	moveobjects();
	
	if ((food == null) && (rand(100) == 0)) {
		food = document.createElement("div");
		food.className = 'food';
		arena.appendChild(food);
		foodx = 100 + rand(arenaw - foodw - 200);
		foody = 0;
		food.style.left = foodx + 'px';
		food.style.top = foody + 'px';
	}
	
	if (fishes.length < 4) newfish();
	if (!checkcol()) {
		fishhealth -= fishhealthdec;
		if (fishhealth < 0) health.style.background = "#ff0000";
		if (fishhealth < -200) smaller();
		if ((bubbles.length < 10) && (rand(25) == 0)) newbubble();
		updatehlth();
		checkGameState();
	} else {
		if (!checkGameState()) reset();
	}
	inloop = false;
}

function run() {
	if (!running) {
		hideMessage();
		running = true;
		loop();
	}
}

function move(n) {
	switch(n) {
		case 1: { 
			fishsx -= fishacc;
			if (fishsx < -maxspeed) fishsx = -maxspeed;
			break;
		}
		case 2: { 
			fishsy -= fishacc;
			if (fishsy < -maxspeed) fishsy = -maxspeed;
			break;
		}
		case 3: { 
			fishsx += fishacc;
			if (fishsx > maxspeed) fishsx = maxspeed;
			break;
		}
		case 4: { 
			fishsy += fishacc;
			if (fishsy > maxspeed) fishsy = maxspeed;
			break;
		}
	}
}

function lookat(n) {
	if (n == 1) {
		changebck(fish, fishleft);
	} else {
		changebck(fish, fishright);
	}
	fishlook = n;
}

function onkey(event) {
	mx = -1;
	my = -1;
	switch (event.keyCode) {
		case 37:
			if (!left && running) {
				left = true;
				lookat(1);
			}
			break; //left
		case 38: if (!up && running) {up = true;}  break;//up
		case 39: 
			if (!right && running) {
				right = true;
				lookat(2);
			}
			break; //right
		case 40: if (!down && running) {down = true;} break; //down
		
		case 13: ;
		case 80: 
			if (!terminate) {
				if (running) {
					running = false;
					showMessage(pauseLbl, hitPauseLbl);
				}
				else {
					run();
				}
			}
			break;
	}
	
	if (event.preventDefault) event.preventDefault();
    else event.returnValue = false;
}

function changebck(el, src) {
	if (el.filters) {
		el.filters[0].src = src;
	} else {
		el.style.background = "url('" + src + "')";
	}
}

function stopkey(event) {
	switch (event.keyCode) {
		case 37: left = false; break; //left
		case 38: up = false; break; //up
		case 39: right = false; break; //right
		case 40: down = false; break; //down
	}
}

function mmove(event) {
	if (!running) return;
	if (up || down || left || right) return;
	
	
	var tx = -100;
	var ty = -100;
	if (event.pageX) tx = event.pageX;
	else if (event.x) tx = event.x;
	if (event.pageY) ty = event.pageY;
	else if (event.y) ty = event.y;
	if ((tx == -100) || (ty == -100)) return;
	
	mx = tx - 10;
	my = ty - 55;
	changed = 0;
}
