function speed() {
 var as,ad,adr,gs,gd,gdr,ws,wd,wdr,ax,ay,gx,gy,wx,wy,dr;
 as=parseFloat(document.all.as.value);
 ad=parseFloat(document.all.ad.value);
 adr=ad*Math.PI/180.;
 gs=parseFloat(document.all.gs.value);
 gd=parseFloat(document.all.gd.value);
 gdr=gd*Math.PI/180.;
 ws=parseFloat(document.all.ws.value);
 wd=parseFloat(document.all.wd.value);
 wdr=wd*Math.PI/180.;
 ax=as*Math.cos(adr);
 ay=as*Math.sin(adr);
 gx=gs*Math.cos(gdr);
 gy=gs*Math.sin(gdr);
 wx=-ws*Math.cos(wdr);
 wy=-ws*Math.sin(wdr);

 if (document.all.sp_choice0.checked) {dr=ws*Math.sin(wdr-gdr)/as;ad=Math.asin(dr);gs=as*Math.cos(ad)-ws*Math.cos(wdr-gdr);
         adr=gdr+ad;ad=Math.round(adr*180/Math.PI);if (ad<=0) ad=ad+360; if (gs>0) {document.all.gs.value=gs;} else {document.all.gs.value="No solution";};document.all.ad.value=ad;}
 else if (document.all.sp_choice1.checked) {ax=gx-wx;ay=gy-wy;as=Math.sqrt(ax*ax+ay*ay);adr=Math.atan2(ay,ax);
         ad=Math.round(adr*180/Math.PI);if (ad<=0) ad=ad+360; document.all.as.value=as;document.all.ad.value=ad;}
 else if (document.all.sp_choice2.checked) {gx=ax+wx;gy=ay+wy;gs=Math.sqrt(gx*gx+gy*gy);gdr=Math.atan2(gy,gx);
         gd=Math.round(gdr*180/Math.PI);if (gd<=0) gd=gd+360; document.all.gs.value=gs;document.all.gd.value=gd;}
 else {wx=gx-ax;wy=gy-ay;ws=Math.sqrt(wx*wx+wy*wy);wd=Math.round(Math.atan2(-wy,-wx)*180/Math.PI);
         if (wd<=0) wd=wd+360; document.all.ws.value=ws;document.all.wd.value=wd;}
 dr=ad-gd;if (dr>180) dr=dr-360;if (dr<-180) dr=dr+360;
 if (isFinite(dr)) {document.all.speedout.innerText = "(drift " + dr.toString( ) + " degrees)";}
      else {document.all.speedout.innerText = "";}
}

function horizon() {
 var ra;
 var h,b,d,dm,ju;

 ra=20000./Math.PI;
 h=parseFloat(document.all.height.value);
 ju=parseInt(document.all.hunit.value);
 if (ju==2) h=h*0.3048;
 b=Math.sqrt(h/(h+1000*ra)/2);
 d=ra*2*Math.asin(b);
 if (isFinite(d)) {
   dm=Math.round(d*54)/100.;
   d=Math.round(d*100)/100.;
   document.all.hor.innerText = "Then the horizon is at a distance of " + d.toString( ) + " km, or at " + dm.toString( ) + " nautical miles";}
 else {document.all.hor.innerText = "";}
}
