function checkcollisions(){
 var n, distx, disty;
 var halfw, halfh;
 for (n=0; n<obs.length; n++){
  distx = obs[n].x-x;
  disty = obs[n].y-y;
  if (obs[n].shape == circle){
   if (Math.sqrt((distx*distx)+(disty*disty)) < obs[n].radius+shipradius){
    setspantext('state','* COLLISION *');
    stop();
   }
  }
  else if (obs[n].shape == square){
   halfh = obs[n].height/2;
   halfw = obs[n].width/2;
   if ((Math.abs(distx) < halfw+shipradius) && (Math.abs(disty) < halfh+shipradius)){
    setspantext('state','* COLLISION *');
    stop();
   }
  }
 }
}


/********************* EXECUTE **********************/
function execute(){
 if (!running){
  setspancontent ('runbutton', '<a href="javascript:reset();">RESET</a>');
  appendspantext ('stepval', 'Stopped');
  if (!stepsdone)
   appendspantext ('stepval', ' '+rnd(durcount)+' sec into step '+(currentstep+1));
  else
   appendspantext ('stepval', ' '+rnd(durcount)+' sec after final step');
  var totaltime = 0;
  for (var c=0; c<=currentstep; c++)
   totaltime += rnd(steps[c].val[dur]);
  totaltime += rnd(durcount);
  appendspantext ('stepval', '...Total time: '+totaltime);
  return;
 }
 var currentthrust;
 var dist, distx, disty, gravang;
 var n;
 if (!stepsdone){
  ang = (ang + steps[currentstep].val[rotate]/10)%(Math.PI*2);
  currentthrust = steps[currentstep].val[thrust]/10;
  dx += currentthrust * Math.cos(ang);
  dy += currentthrust * Math.sin(ang);
 }
 ///////// GRAVITY:
 for (n=0; n<obs.length; n++){
  if (obs[n].shape == square)
   continue;
  distx = obs[n].x-x;
  disty = obs[n].y-y;
  dist = Math.sqrt((distx*distx)+(disty*disty));
  gravang = Math.asin(Math.abs(disty)/dist);
  if (disty < 0){
   gravang *= -1;
   if (distx < 0)
    gravang = gravang-Math.abs(2*(gravang+(Math.PI/2)));
  }
  else if (distx < 0)
   gravang = gravang+(2*((Math.PI/2)-gravang));
  currentthrust = (gravconstant*obs[n].mass) / (dist*dist);
  if (((obs[n].mass < 0) && (dist < 100)) || (obs[n].mass > 0)){
   gravdx += currentthrust * Math.cos(gravang);
   gravdy += currentthrust * Math.sin(gravang);
  }
 }

 var oldifvis = false;
 if ((x-shipradius)>0 && (x+shipradius)<arenaw && (y-shipradius)>0 && (y+shipradius)<arenah)
  oldifvis = true;

 x += dx + gravdx;
 y += dy + gravdy;

/*
 var ifvis;
 if ((x-shipradius)>0 && (x+shipradius)<arenaw && (y-shipradius)>0 && (y+shipradius)<arenah)
  ifvis = true;

 if (!ifvis)
  hide('ship');
 else
  show('ship'); 

 if ((y+10) > arenah){
//  setspantext('arrowdn',Math.round((y+shipradius)-arenah));
  setpos('arrowdn', x, arenah-5);
 } else {
  setposabs('arrowdn', 10, -10);
 }
*/

 placeship();
 placetarget();
 checkcollisions();
 durcount += 0.05;  
 if (!stepsdone){
  if (durcount >= steps[currentstep].val[dur]){	// current step done
   if (currentstep < steps.length-1){		// go to next step if there are more steps
    currentstep++;
    if (currentstep>0)
     document.all["step"+(currentstep-1)].style.background = "";
    document.all["step"+currentstep].style.background = highlightcolor;
    setspantext ('stepval', (currentstep+1)+"... ");
    durcount = 0;
   }
   else{							// no more steps
/*
    currentstep = 0;
    durcount = 0;
    document.all["step"+currentstep].style.background = highlightcolor;
*/
    stepsdone = true;
    appendspantext ('stepval', 'Done... ');

    document.all["step"+(steps.length-1)].style.background = "";
   }
  }
 }
 updateradar();
 setTimeout ('execute();', 10);
}

function go(){
 durcount = 0;
 currentstep = 0;
 document.all["step"+currentstep].style.backgroundColor = highlightcolor;
 stepsdone = false;
 setspantext ('stepval', "1... ");
 gravdx=0; gravdy=0;
 ang=0;
 reset();
 placeship();
 placetarget();
 setspantext('state','');
 if (!running){
  running = true;
  setspancontent ('runbutton', '<a href="javascript:stop();">STOP</a>');
  execute();
 }
 else{
  running = false;
  setTimeout ('running=true; execute();', 100);
 }
}

function stop(){
 running = false;
}

function reset(){
 stop();
 x = state.x;
 y = state.y;
 dx = state.dx;
 dy = state.dy;
 ang = state.ang;
 gravdx = 0;
 gravdy = 0;
 placeobjects();
 updateradar();
 setspancontent ('runbutton', '<a href="javascript:go();">RUN</a>');
}


