
var main=document.createElement("DIV");
main.id = 'main';
main.style.height='480px';
main.style.width='640px';
main.style.background='transparent url(images/space.jpg) repeat-y';
main.style.border='1px solid black';
main.style.overflow='hidden';
main.style.position='relative';

document.documentElement.lastChild.appendChild(main);

main.height=480;
main.width=640;

var pause_img=document.createElement("IMG");
pause_img.name = 'pause_img';
pause_img.style.position='absolute';
pause_img.style.top='210px';
pause_img.style.left='150px';
pause_img.src="images/paused.gif";
pause_img.style.display='none';

document.documentElement.lastChild.appendChild(pause_img);


//Angles
angle_x = new Array;
angle_y = new Array;
for (var i=0; i< 360; i++) {
  angle_y[i] = Math.sin(i * Math.PI / 180);
  angle_x[i] = Math.cos(i * Math.PI / 180);
}
angle_x[360] = angle_x[0];
angle_y[360] = angle_y[0];



gamekey = new Array;

for (var i=0; i<255; i++) { 
gamekey[i] = new Object();
gamekey[i].isdown = false;
}

gamekey.left = 37;		//left
gamekey.up = 38;		//up
gamekey.right = 39;		//right
gamekey.down = 40;		//down
gamekey.fire = 32;		//space
gamekey.pause = 13;

var numweapons = 5;
var numAsteroids = 0;

game = new Object();
game.running = false;
game.paused = false;
game.thread = "";

bgs = false;

numImages = 0;


Sprites = new Array(13);

Sprites.folder = 'images/';
init_sprite('weapon', 'weapon.gif');
init_sprite('explosion', 'explosion.gif');
init_sprite('ship', 'ship.gif');
init_sprite('asteroid_0', 'asteroid_0.gif');
init_sprite('asteroid_1', 'asteroid_1.gif');
init_sprite('asteroid_2', 'asteroid_2.gif');

init_sprite('spacer', 'spacer.gif');
init_sprite('background', 'space.jpg');
init_sprite('credits_1', 'ray_ok.jpg');
init_sprite('credits_2', 'game_label.gif');
init_sprite('credits_3', 'ray_shooter.jpg');
init_sprite('fadein', 'fade_in.gif');
init_sprite('pause', 'paused.gif');


function init_sprite(sName, sUrl) {

Sprites[sName] = new Image;
Sprites[sName].src = Sprites.folder + sUrl;
Sprites[sName].onLoad = sprite_loaded();
}

function sprite_loaded() {

  numImages++;
  if (numImages == Sprites.length) bgs = true;

}

//The Ship

ship = new Object();
ship.id = 'ship';
ship.angle = 0;
ship.speed = 0;
ship.maxspeed = 10;
ship.accelerate = 1;
ship.justfired = false;
ship.alive = false;
ship.flicker = false;
ship.flickerstatus = true;
ship.clint = null;
ship.lives = 4;

ship.sprite = createSprite(ship, 0, 0, 64, 64, 'images/ship.gif', 20);
//show_sprite(ship.sprite);



//The Weapon

weapon = new Array();
for (var i=0; i<numweapons; i++) {
weapon[i] = new Object();
weapon[i].id = 'weapon[' + i + ']';
weapon[i].speed = 20;
weapon[i].angle = 0;
weapon[i].firing = false;
weapon[i].sprite = createSprite(weapon[i], 100, 100, 8, 8, 'images/weapon.gif', 1);

}

asteroid_sprite = new Array;
asteroid_sprite[0] = new Object();
asteroid_sprite[0].width = 256;
asteroid_sprite[0].height = 256;
asteroid_sprite[1] = new Object();
asteroid_sprite[1].width = 128;
asteroid_sprite[1].height = 128;
asteroid_sprite[2] = new Object();
asteroid_sprite[2].width = 64;
asteroid_sprite[2].height = 64;

//The Asteroids
function Asteroid(id, type, x, y, speed, angle, rotatespeed) {

  if (type != 0 && type != 1 && type != 2) type = 0;

  if (type == 0) {
    width = 256;
    height = 256;

    this.colmap = new Array(7);
    this.colmap[0] = new setpoint(212,112);
    this.colmap[1] = new setpoint(252,95);
    this.colmap[2] = new setpoint(344,115);
    this.colmap[3] = new setpoint(27,116);
    this.colmap[4] = new setpoint(67,98);
    this.colmap[5] = new setpoint(142,110);
    this.colmap[6] = new setpoint(170,115);

    this.frames = 12;

  } else if (type == 1) {

    width = 128;
    height = 128;

    this.colmap = new Array(6);
    this.colmap[0] = new setpoint(241,68);
    this.colmap[1] = new setpoint(316,57);
    this.colmap[2] = new setpoint(1,61);
    this.colmap[3] = new setpoint(98,63);
    this.colmap[4] = new setpoint(133,68);
    this.colmap[5] = new setpoint(192,67);
    this.frames = 20;

  } else if (type == 2) {

    width = 64;
    height = 64;

    this.colmap = new Array(7);
    this.colmap[0] = new setpoint(192,30);
    this.colmap[1] = new setpoint(233,27);
    this.colmap[2] = new setpoint(278,25);
    this.colmap[3] = new setpoint(350,33);
    this.colmap[4] = new setpoint(54,27);
    this.colmap[5] = new setpoint(124,28);
    this.colmap[6] = new setpoint(159,31);

    this.frames = 12;

  }

  this.id = id;
  this.type = type;
  this.x = x;
  this.y = y;
  this.speed = speed;
  this.angle = angle;
  this.rotatespeed = rotatespeed;
  this.float_angle = angle;
  this.sprite = createSprite(this, x, y, width, height, 'images/asteroid_' + type + '.gif', this.frames);
  show_sprite(this.sprite);
  numAsteroids +=1;



}

 function destroy_asteroid(ast) {
   main.removeChild(asteroid[ast].sprite);
   numAsteroids--;
   asteroid[ast] = null;
   return null;
 }


asteroid = new Array;
asteroid[0] = new Asteroid('asteroid[0]', 0, 200, 100, 5, 10, 5);
asteroid[1] = new Asteroid('asteroid[0]', 0, 200, 200, 2, 90, 5);
asteroid[2] = new Asteroid('asteroid[0]', 0, 300, 300, 1, 120, 12);


function explode_ship() {

  set_explosion(ship.x + ship.width/2, ship.y + ship.height/2);
  ship.alive = false;
  hide_sprite(ship.sprite);
  ship.lives--;
  if (ship.lives>0) setTimeout('spawn_ship()', '5000');

}



//Create DIV

function createSprite(obj, x, y, height, width, sURL, frames) {

//  isArr = sID.indexOf('[');

//  if (isArr == -1) var sprite = window[sID];
//  else sprite = window[sID.substr(0, isArr)][sID.substr(isArr+1, 1)];


  var createDIV=document.createElement("DIV");

  createDIV.id = obj.id;
  createDIV.style.position='absolute';
  createDIV.style.backgroundImage='url(' + sURL + ')';

  createDIV.style.backgroundRepeat='no-repeat';
  createDIV.style.backgroundPosition='0px 0px';
  
  createDIV.style.left = x + "px";
  createDIV.style.top = y + "px";
  createDIV.style.height=height + "px";
  createDIV.style.width=width + "px";
  createDIV.style.display='none';
  createDIV.style.overflow='hidden';

  obj.height = height;
  obj.width = width;
  obj.x = x;
  obj.y = y;
  obj.frames = frames;
  main.appendChild(createDIV);
  
  var eImg=document.createElement("IMG");
  eImg.src='images/spacer.gif';
  eImg.height = height;
  eImg.width = width;
  createDIV.appendChild(eImg);

  return createDIV;

}



function game_start() {
	game.running = true;
	game.thread = window.setInterval("run_game()",30);
        spawn_ship();
//	show_sprite(ship.sprite);
	run_game();
}

function game_stop() {
	game.running = false;
	window.clearInterval(game.thread)
}


function collision(object1, object2) {

  x = object1.x + object1.width/2;
  y = object1.y + object1.height/2;
  width = object2.width - (object2.width *.2);
  height = object2.height - (object2.height *.2);
  if ((x <= object2.x + object2.width && x >= object2.x) && (y <= object2.y + object2.height && y >= object2.y)) return true;
  else return false;

}

function checkweapons() {

  for (var i=0; i<numweapons; i++) {
    if (!weapon[i].firing) return weapon[i];
  }
return false;

}

function fire_weapon() {

ship.justfired = true;
weaponID = checkweapons();
if (!weaponID) return false;
weaponID.x = ship.x + ship.width/2;
weaponID.y = ship.y + ship.height/2;
weaponID.angle = ship.angle;

weaponID.sprite.style.top = Math.floor(weaponID.y) + "px";
weaponID.sprite.style.left = Math.floor(weaponID.x) + "px";

show_sprite(weaponID.sprite);
weaponID.firing = true;
return true;

}



function run_game() {
  if (game.running) {

    update_ship();
    update_weapons();
    update_asteroids();
    //window.status=numAsteroids;



  }
}



function rotate_object(obj, degs) {

degs = checkangle(degs);
obj.angle = degs;

var tempvar = Math.round(degs/(360/(obj.frames))) * -obj.width;

if (tempvar <= obj.frames*obj.width*-1) tempvar = 0;

window.status = ship.angle;
obj.sprite.style.backgroundPosition = tempvar + "px 0px";

}


function next_asteroid() {
  var next = 0;
  while(asteroid[next] != null) next++;
  return next;   
}


function explode_asteroid(ast) {

width = asteroid[ast].width;
height = asteroid[ast].height;
type = asteroid[ast].type;
x = asteroid[ast].x + asteroid[ast].width/2;
y = asteroid[ast].y + asteroid[ast].height/2;
angle = asteroid[ast].angle;
speed = asteroid[ast].speed;
rspeed = asteroid[ast].rotatespeed;

destroy_asteroid(ast);

set_explosion(x, y);

if (type == 0) {
next = next_asteroid();
asteroid[next] = new Asteroid('asteroid[' + next + ']', 1, x-asteroid_sprite[1].width/2, y-asteroid_sprite[1].height/2, speed, checkangle(angle+90), Math.round(Math.random()*20));
next = next_asteroid();
asteroid[next] = new Asteroid('asteroid[' + next + ']', 1, x-asteroid_sprite[1].width/2, y-asteroid_sprite[1].height/2, speed, checkangle(angle-90), Math.round(Math.random()*20));
}
else if (type == 1) {
next = next_asteroid();
asteroid[next] = new Asteroid('asteroid[' + next + ']', 2, x-asteroid_sprite[2].width/2, y-asteroid_sprite[2].height/2, speed, checkangle(angle+90), Math.round(Math.random()*20));
next = next_asteroid();
asteroid[next] = new Asteroid('asteroid[' + next + ']', 2, x-asteroid_sprite[2].width/2, y-asteroid_sprite[2].height/2, speed, checkangle(angle-90), Math.round(Math.random()*20));
next = next_asteroid();
asteroid[next] = new Asteroid('asteroid[' + next + ']', 2, x-asteroid_sprite[2].width/2, y-asteroid_sprite[2].height/2, speed, checkangle(angle), Math.round(Math.random()*20));
next = next_asteroid();
asteroid[next] = new Asteroid('asteroid[' + next + ']', 2, x-asteroid_sprite[2].width/2, y-asteroid_sprite[2].height/2, speed, checkangle(angle+180), Math.round(Math.random()*20));
}
    


}


function set_explosion(x, y) {


  var eImg=document.createElement("IMG");
  eImg.src='images/explosion.gif';
  eImg.style.position = 'absolute';
  eImg.style.left = (x - eImg.width/2) + 'px';
  eImg.style.top = (y - eImg.height/2) + 'px';
  main.appendChild(eImg);
  eImg.id = "exploder" + Math.random();
  sett = "remove_explosion('" + eImg.id + "');";
  setTimeout(sett, '1200');

}

function remove_explosion(ID) {
main.removeChild(document.getElementById(ID));
}



function update_asteroids() {


  for (var i=0; i<asteroid.length; i++) {

    if (asteroid[i] != null) {
      asteroid[i].x += angle_x[asteroid[i].float_angle] * asteroid[i].speed;
      asteroid[i].y += angle_y[asteroid[i].float_angle] * asteroid[i].speed;


      if (asteroid[i].x > main.width) asteroid[i].x = 0-asteroid[i].width; else if (asteroid[i].x + asteroid[i].width < 0) asteroid[i].x = main.width;
      if (asteroid[i].y > main.height) asteroid[i].y = 0-asteroid[i].height; else if (asteroid[i].y + asteroid[i].height < 0) asteroid[i].y = main.height;
      rotate_object(asteroid[i], asteroid[i].angle + asteroid[i].rotatespeed);
      //window.status = asteroid[i].angle;

      asteroid[i].sprite.style.top = Math.floor(asteroid[i].y) + "px";
      asteroid[i].sprite.style.left = Math.floor(asteroid[i].x) + "px";
      if (inobj(asteroid[i], ship.x + ship.width/2, ship.y + ship.height/2) && ship.alive && !ship.flicker) explode_ship();
       

    }
  }
}


function spawn_ship() {

rotate_object(ship, 270);
ship.x = main.width/2 - ship.width/2;
ship.y = main.height/2 - ship.height/2;
ship.speed = 0;
ship.alive = true;

 ship.sprite.style.top = Math.floor(ship.y) + "px";
 ship.sprite.style.left = Math.floor(ship.x) + "px";

show_sprite(ship.sprite);
flicker_ship(2500);

}

function flicker_ship(ms) {

  ship.flicker = true;
  ship.clint = setInterval('flicker()', '75');
  setTimeout('clearInterval(ship.clint); ship.flicker = false; show_sprite(ship.sprite);', ms);

}

function flicker() {
//alert('test');
ship.flickerstatus = ! ship.flickerstatus;
if (ship.flickerstatus == true) show_sprite(ship.sprite); else hide_sprite(ship.sprite);

}


function update_ship() {

if (ship.alive) {



 if (gamekey[gamekey.left].isdown) rotate_object(ship, ship.angle - 18);
 if (gamekey[gamekey.right].isdown) rotate_object(ship, ship.angle + 18);
 if (gamekey[gamekey.up].isdown && ship.speed <= ship.maxspeed) ship.speed += ship.accelerate;
 if (gamekey[gamekey.down].isdown && ship.speed >= ship.maxspeed*-1) ship.speed -= ship.accelerate;
 if (gamekey[gamekey.fire].isdown && !ship.justfired) fire_weapon(); //alert(document.documentElement.innerHTML);
 
 ship.x += angle_x[ship.angle] * ship.speed;
 ship.y += angle_y[ship.angle] * ship.speed;

//rotate_object(ship, ship.angle + 1);

 if (ship.x > main.width) ship.x = 0-ship.width; else if (ship.x + ship.width < 0) ship.x = main.width;
 if (ship.y > main.height) ship.y = 0-ship.height; else if (ship.y + ship.height < 0) ship.y = main.height;

 ship.sprite.style.top = Math.floor(ship.y) + "px";
 ship.sprite.style.left = Math.floor(ship.x) + "px";
}


}

function stop_weapon(wepID) {
 weapon[wepID].firing = false;
 hide_sprite(weapon[wepID].sprite);
}


function update_weapons() {
  for (var i=0; i<numweapons; i++) {
    if (weapon[i].firing) {
      weapon[i].x += angle_x[weapon[i].angle] * weapon[i].speed;
      weapon[i].y += angle_y[weapon[i].angle] * weapon[i].speed;
      weapon[i].sprite.style.top = Math.floor(weapon[i].y) + "px";
      weapon[i].sprite.style.left = Math.floor(weapon[i].x) + "px";
      if (weapon[i].x > main.width || weapon[i].y > main.height || weapon[i].x < 0 || weapon[i].y < 0) stop_weapon(i);
      for (var j=0; j<asteroid.length; j++) {
       if (asteroid[j] != null) {
        if (inobj(asteroid[j], weapon[i].x + weapon[i].width/2, weapon[i].y + weapon[i].height/2)) { 
          explode_asteroid(j);
          stop_weapon(i);
        }
         
       }
      }

    }

  }

}



function show_sprite(sprite) {
  sprite.style.display = 'inline';
}

function hide_sprite(sprite) {
  sprite.style.display = 'none';
}


function exists(objToTest) {
  if (null == objToTest) {
	return false;
  }
  if ("undefined" == typeof(objToTest) ) {
	return false;
  }
  return true;
}


function pause_game() {

  pause_img.style.display = 'inline';
  game.paused = true;
  for (var i=0; i<255; i++) gamekey[i].isdown = false;
  game.running = false;

}

function resume_game() {

  pause_img.style.display = 'none';
  game.paused = false;
  game.running = true;

}


function getkey(e) {

  if (!e) var e = window.event;
  if (e.type == 'keydown') {
    gamekey[e.keyCode].isdown = true;
    if (e.keyCode == gamekey.pause) {
      if (game.paused) resume_game(); else pause_game();
    }
//   if (e.keyCode == 32) explode_asteroid(0);

  }
  else if (e.type == 'keyup') gamekey[e.keyCode].isdown = false;
  if (!gamekey[gamekey.fire].isdown) ship.justfired = false;


}


function checkangle(degs) {

if (degs > 359) degs -= 360;
if (degs < 0) degs += 360;
return degs;

}


function setpoint(angle, length) {

 this.angle = angle;
 this.length = length;


}


/* inPoly()
Finds if a given point is within a polygon.

Based on Bob Stein's inpoly() function for C.
http://home.earthlink.net/~bobstein/inpoly/

Modified for JavaScript by Scott Andrew LePera.

Parameters:
poly: array containing x/y coordinate pairs that
  describe the vertices of the polygon. Format is
  indentical to that of HTML image maps, i.e. [x1,y1,x2,y2,...]
  
px: the x-coordinate of the target point.

py: the y-coordinate of the target point.

Return value:
true if the point is within the polygon, false if not.
*/





function inobj(obj,px,py)
{
     

//test = new Array();
px = Math.round(px);
var npoints = obj.colmap.length; // number of points in polygon
     
var xnew,ynew,xold,yold,x1,y1,x2,y2,i;
     
var inside=false;

     
if (npoints < 3) { // points don't describe a polygon
          
return false;
     }
     

xold = Math.round(obj.x + (obj.width/2) + (angle_x[checkangle(obj.colmap[npoints-1].angle + obj.angle)] * obj.colmap[npoints-1].length));
yold = Math.round(obj.y + (obj.height/2) + (angle_y[checkangle(obj.colmap[npoints-1].angle + obj.angle)] * obj.colmap[npoints-1].length));

for (i=0; i<npoints; i++) {
          

xnew = Math.round(obj.x + (obj.width/2) + (angle_x[checkangle(obj.colmap[i].angle + obj.angle)] * obj.colmap[i].length));
ynew = Math.round(obj.y + (obj.height/2) + (angle_y[checkangle(obj.colmap[i].angle + obj.angle)] * obj.colmap[i].length));

if (xnew > xold) {
               
x1=xold;
               
x2=xnew;
               
y1=yold;
               
y2=ynew;
          
}
          
else {
              
x1=xnew;
               
x2=xold;
               
y1=ynew;
               
y2=yold;
          
}
          
if ((xnew < px) == (px <= xold) && ((py-y1)*(x2-x1) < (y2-y1)*(px-x1))) {

inside=!inside;
          
}
          
xold=xnew;
          
yold=ynew;
     
//test[i] = new Object();
//test[i].sprite = createSprite(test[i], xold, yold, 8, 8, 'images/weapon.gif', 1);
//show_sprite(test[i].sprite);
}
     
//pause_game();
return inside;

}

function wait_til_loaded(runwhendone) {
    if (bgs==true) eval(runwhendone); else setTimeout("wait_til_loaded('" + runwhendone + "');", 100);
}



document.onkeydown = getkey;
document.onkeyup = getkey;
window.onblur = pause_game;
wait_til_loaded('game_start()');
