function startGame() {
	missileSpeed = .01;
	levelNum = 0;
	score = 0;
	addScore(0);
	levelNum = 0;
	gameover = false;
	showDialog("First wave approaching.");
}

function startLevel() {
	levelNum++;
	showLevel();
	numBombs = levelNum*10+10;
	numMissiles = levelNum*10+20;
	bombSpeed = 0+levelNum*.001+.004;
	missiles = new Array();
	bombs = new Array();
	addBomb();
	missileInt = setInterval(this.moveMissiles, 100);
	bombInt = setInterval(this.addBomb, 3000);
	showMissiles();
}

function clickCanvas(e) {
	if (numMissiles < 1) return;
	var x = e.x-document.getElementById("gameframe").offsetLeft;
	var y = e.y-document.getElementById("gameframe").offsetTop;
	var d = Math.sqrt(Math.pow(160-x,2)+Math.pow(240-y,2));
    missiles.push({startX: 160, startY: 240, endX: x, endY: y, progress: 0.0, col: "#CCC", speed: 10.0/d, mode: "launch", type: "missile", r: 0, x: 0, y: 0});
	numMissiles--;
	showMissiles();
}

function addBomb() {
	bombs.push({startX: Math.random()*320, startY: 0, endX: Math.random()*320, endY: 250, progress: 0.0, speed: bombSpeed, col: "#F99", mode: "launch", type: "bomb", r: 0, x: 0, y: 0});
	numBombs--;
	if (numBombs == 0) {
		clearInterval(bombInt);
	}
}

function moveMissiles() {
	for(var i=missiles.length-1;i>=0;i--) {
		if (moveMissile(missiles[i])) {
			missiles.splice(i,1);
		}
	}
	for(var i=bombs.length-1;i>=0;i--) {
		if (moveMissile(bombs[i])) {
			bombs.splice(i,1);
		}
	}
	checkCollisions();
	if (checkEndLevel()) {
		clearInterval(missileInt);
		showDialog("Get ready for next wave.");
	}
}

function moveMissile(m) {
	var oldx = m.startX*(1-m.progress) + m.endX*m.progress;
	var oldy = m.startY*(1-m.progress) + m.endY*m.progress;

	if (m.progress < 1.0) {
		m.progress += m.speed;
		if (m.progress > 1.0) m.progress = 1.0;
		var newx = m.startX*(1-m.progress) + m.endX*m.progress;
		var newy = m.startY*(1-m.progress) + m.endY*m.progress;
		m.x = newx;
		m.y = newy;
		
		drawLine(oldx,oldy,newx,newy,m.col,1);
		m.r = 0;
		
		if (m.type == "bomb") {
			checkHitCity(m.endX);
		}
		
	} else if (m.progress < 2.0) {
		m.progress += .05;
		if (m.mode == "launch") {
			m.mode = "explode";
			clearLine(m.startX,m.startY,m.endX,m.endY);
			//drawLine(m.startX,m.startY,m.endX,m.endY,"rgba(0,0,0,255)",2);
		}
		if (m.mode == "hit") {
			m.mode = "endanger";
			clearLine(m.startX,m.startY,m.endX,m.endY);
			//drawLine(m.startX,m.startY,m.endX,m.endY,"rgba(0,0,0,255)",2);
		}
		
		var r = (m.progress-1.0)*20.0;
		drawCircle(m.endX, m.endY, r, m.col);
		m.r = r;
		
	} else if (m.progress < 3.0) {
		m.progress += .1;

		//drawCircle(m.endX, m.endY, m.r+.5, "rgba(0,0,0,255)");
		canvas2.clearRect(m.endX-m.r-1, m.endY-m.r-1, m.r*2+2, m.r*2+2);
		var r = (3.0-m.progress)*20.0;
		drawCircle(m.endX, m.endY, r, m.col);
		m.r = r;
		
	} else {
		m.r = 0;
		return true;
	}
	return false;
}

function checkCollisions() {
	for(var i=missiles.length-1;i>=0;i--) {
		if (missiles[i].r > 0) {
			for(var j=bombs.length-1;j>=0;j--) {
				if (bombs[j].mode == "launch") {
					if (Math.sqrt(Math.pow(bombs[j].x-missiles[i].x,2)+Math.pow(bombs[j].y-missiles[i].y,2)) < missiles[i].r) {
						bombs[j].endX = bombs[j].x;
						bombs[j].endY = bombs[j].y;
						bombs[j].progress = 1.0;
						bombs[j].mode = "hit";
						addScore(100);
					}
				}
			}
		}
	}
	for(var i=bombs.length-1;i>=0;i--) {
		if ((bombs[i].r > 0) && (bombs[i].mode == "endanger")) {
			for(var j=bombs.length-1;j>=0;j--) {
				if (bombs[j].mode == "launch") {
					if (Math.sqrt(Math.pow(bombs[j].x-bombs[i].x,2)+Math.pow(bombs[j].y-bombs[i].y,2)) < bombs[i].r) {
						bombs[j].endX = bombs[j].x;
						bombs[j].endY = bombs[j].y;
						bombs[j].progress = 1.0;
						bombs[j].mode = "hit";
					}
				}
			}
		}
	}
}

function checkHitCity(x) {
	var citiesLeft = 0;
	for(var i=0;i<6;i++) {
		if (document.getElementById("dome"+i).style.visibility != "hidden") {
			dx = parseInt(document.getElementById("dome"+i).style.left);
			if (Math.abs(dx+10 - x) < 10) {
				document.getElementById("dome"+i).style.visibility = "hidden";
			}
			citiesLeft++;
		}
	}
	if (citiesLeft == 0) {
		clearInterval(bombInt);
		clearInterval(missileInt);
		gameover = true;
		showDialog("All cities lost. Game Over");
	}
}


function checkEndLevel() {
	if (bombs.length == 0) {
		if (numBombs == 0) {
			clearInterval(bombInt);
			clearInterval(missileInt);
			return true;
		}
	}
	return false;
}
	
function drawLine(x1,y1,x2,y2,c,w) {
	canvas2.beginPath();
	canvas2.strokeStyle = c;
	canvas2.lineWidth = w;
	canvas2.moveTo(x1,y1);
	canvas2.lineTo(x2,y2);
	canvas2.stroke();
	canvas2.closePath();
}

function drawCircle(x,y,r,c) {
	if (r < 0) return;
	canvas2.beginPath();
	canvas2.fillStyle = c;
	canvas2.arc(x, y, r, 0, .01, 1);
	canvas2.fill();
	canvas2.closePath();
}		
    
function clearLine(x1,y1,x2,y2) {
	var d = Math.sqrt(Math.pow(x1-x2,2)+Math.pow(y1-y2,2));
	for(var i=0;i<d;i++) {
		var p = i/d;
		var x = x1*(1.0-p)+x2*p;
		var y = y1*(1.0-p)+y2*p;
		canvas2.clearRect(x-1,y-1,2,2);
	}
}

function addScore(n) {
	score += n;
	document.getElementById("score").innerHTML = 'SCORE: '+score;
}

function showLevel() {
	document.getElementById("level").innerHTML = 'LEVEL: '+levelNum;
}

function showMissiles() {
	document.getElementById("missiles").innerHTML = 'MISSILES: '+numMissiles;
}

function showDialog(text) {
	if (!gameover) {
		document.getElementById("dialog").innerHTML = text+"<BR><BR><A HREF='#' onClick='clickDialog();return false'>CONTINIUE</A>";
	} else {
		document.getElementById("dialog").innerHTML = text+"<BR><BR><A HREF='#' onClick='window.location.reload();return false'>PLAY AGAIN</A>";
	}
	document.getElementById("dialog").style.visibility = "visible";
}

function clickDialog() {
	document.getElementById("dialog").style.visibility = "hidden";
	startLevel();
}
document.write("<DIV ID=game STYLE='position: relative; top: 0; left: 0; width: 320px; height: 260px; margin: 0; padding: 0; background: url(MissileCommand/images/sky.jpg);'>");

document.write("<div id=ground STYLE='position: absolute; top: 237; left: 0; width: 320px; height: 23px; background: url(MissileCommand/images/ground.gif);'></div>");

document.write("<div id=base STYLE='position: absolute; top: 238; left: 152; width: 15px; height: 12px; background: url(MissileCommand/images/base.gif);'></div>");

for(var i=0;i<6;i++) {
	document.write("<div id=dome"+i+" STYLE='position: absolute; top: 246; left: "+(26+50*i)+"; width: 20px; height: 6px; background: url(MissileCommand/images/dome.gif);'></div>");
}

document.write("<DIV ID=score STYLE='position: absolute; top: 0; left: 160; width: 156px; text-align: right; font-family: Helvetica; color: white; font-size: 10px; font-weight: bold; '>SCORE: 0</DIV>");

document.write("<DIV ID=level STYLE='position: absolute; top: 0; left: 4; width: 100px; text-align: left; font-family: Helvetica; color: white; font-size: 10px; font-weight: bold; '>LEVEL: 1</DIV>");

document.write("<DIV ID=missiles STYLE='position: absolute; top: 0; left: 100; width: 120px; text-align: center; font-family: Helvetica; color: white; font-size: 10px; font-weight: bold; '>MISSILES: --</DIV>");

document.write("<canvas id=MyCanvas width='320' height='260'  style='position:absolute; left:0px; top:0px; margin:0; padding: 0; z-index:0' onClick='clickCanvas(event);return false;'/></canvas>");

document.write("<DIV ID=dialog STYLE='position: absolute; top: 50; left: 40; width: 220px; height: 100px; padding: 10px; text-align: center; font-family: Helvetica; color: black; font-size: 14px; font-weight: bold; background-color: #ccc; border: 1px solid black; visibility: hidden;'></DIV>");

document.write("<br clear=all></div>");

canvas = document.getElementById("MyCanvas");
canvas2 = canvas.getContext("2d");

startGame();

