var long_rad, lat_rad;
var x_l, x_m, x_r, y_l, y_m, y_r;
var letters = "ABCDEFGHIJKLMNOPQRSTUVWX";
var radius = 6378.16;

function degminsec2loc(form3_bez)
{
    d=Math.abs(form3_bez.long_deg.value);
    m=Math.abs(form3_bez.long_min.value);
    s=Math.abs(form3_bez.long_sec.value);
    if(m>60 || s>60) x=999;
    else x=d+m/60+s/3600;

    d=Math.abs(form3_bez.lat_deg.value);
    m=Math.abs(form3_bez.lat_min.value);
    s=Math.abs(form3_bez.lat_sec.value);
    if(m>60 || s>60) y=99;
    else y=d+m/60+s/3600;

    if(deg2loc(x, y, form3_bez.longradio[0].checked, form3_bez.latradio[1].checked ) )
	form3_bez.locator.value = x_l+y_l+x_m+y_m+x_r+y_r;
    else document.locform3.reset();
}

function loc2degminsec(form3_bez) // locator to long+lat, Deg+Min+Sec
{
    if(!loc2deg(form3_bez.locator.value.toUpperCase()))
    {
	document.locform3.reset();
	return;
    }
    form3_bez.longradio[0].checked = long_rad;
    form3_bez.longradio[1].checked = !long_rad;
    form3_bez.latradio[1].checked = lat_rad;
    form3_bez.latradio[0].checked = !lat_rad;

    deg=Math.floor(Math.abs(x));
    min=60*(Math.abs(x)-deg);
    sec=Math.floor(60*(min-Math.floor(min)));
    min=Math.floor(min);
    form3_bez.long_deg.value = deg;
    form3_bez.long_min.value = min;
    form3_bez.long_sec.value = sec;

    deg=Math.floor(Math.abs(y));
    min=60*(Math.abs(y)-deg);
    sec=Math.floor(60*(min-Math.floor(min)));
    min=Math.floor(min);
    form3_bez.lat_deg.value = deg;
    form3_bez.lat_min.value = min;
    form3_bez.lat_sec.value = sec;
}

function degmin2loc(form2_bez) // long+lat, Deg+Min.min to locator
{
    d=Math.abs(form2_bez.long_deg.value);
    m=Math.abs(form2_bez.long_min.value);
    if(m>60) x=999;
    else x=d+m/60;

    d=Math.abs(form2_bez.lat_deg.value);
    m=Math.abs(form2_bez.lat_min.value);
    if(m>60) y=99;
    else y=d+m/60;

    if(deg2loc(x, y, form2_bez.longradio[0].checked, form2_bez.latradio[1].checked ) )
	form2_bez.locator.value = x_l+y_l+x_m+y_m+x_r+y_r;
    else document.locform2.reset();
}

function loc2degmin(form2_bez) // locator to long+lat, Deg+Min.min
{
    if(!loc2deg(form2_bez.locator.value.toUpperCase()))
    {
	document.locform2.reset();
	return;
    }
    form2_bez.longradio[0].checked = long_rad;
    form2_bez.longradio[1].checked = !long_rad;
    form2_bez.latradio[1].checked = lat_rad;
    form2_bez.latradio[0].checked = !lat_rad;

    deg=Math.floor(Math.abs(x));
    min=Math.round(1000*60*(Math.abs(x)-deg))/1000;
    form2_bez.long_deg.value = deg;
    form2_bez.long_min.value = min;

    deg=Math.floor(Math.abs(y));
    min=Math.round(1000*60*(Math.abs(y)-deg))/1000;
    form2_bez.lat_deg.value = deg;
    form2_bez.lat_min.value = min;
}

function lola2loc(form1_bez) // long+lat to locator
{
    if(deg2loc( Math.abs(form1_bez.longitude.value),
                Math.abs(form1_bez.latitude.value),
                form1_bez.longradio[0].checked,
                form1_bez.latradio[1].checked ) )

	form1_bez.locator.value = x_l+y_l+x_m+y_m+x_r+y_r;
    else document.locform1.reset();
}

function loc2lola(form1_bez) // locator to long+lat
{
    
    if(!loc2deg(form1_bez.locator.value.toUpperCase()))
    {
	document.locform1.reset();
	return;
    }
    form1_bez.longradio[0].checked = long_rad;
    form1_bez.longradio[1].checked = !long_rad;
    form1_bez.latradio[1].checked = lat_rad;
    form1_bez.latradio[0].checked = !lat_rad;
    form1_bez.longitude.value = Math.abs(Math.ceil(x*1000)/1000);
    form1_bez.latitude.value = Math.abs(Math.round(y*1000)/1000);
}

function loc2deg(loc) // locator to degrees
{
   var ff;

   if(loc.length == 4)
   {
	loc +="MM";
	ff = false;
   }
   else ff = true;

   if(loc.length != 6)
   {
	alert("The locator must have\n4 chars i.e. JN68 or jn59\nor 6 chars i.e. JN68RN or jn59eg");
	return(false);
   }
   x_l = letters.indexOf(loc.charAt(0));   // Laenge berechnen
   x_m = parseInt(loc.charAt(2));
   x_r = letters.indexOf(loc.charAt(4));
   y_l = letters.indexOf(loc.charAt(1));   // Breite berechnen
   y_m = parseInt(loc.charAt(3));
   y_r = letters.indexOf(loc.charAt(5));

   if(x_l<0 || x_l>17 || y_l<0 || y_l>17 || isNaN(x_m) || isNaN(y_m) || x_r<0 || x_r>23 || y_r<0 || y_r>23)
   {
	alert("The locator must be\nin the range of\nAA00AA .... RR99XX");
	return(false); 
   }
   x = x_l*10 + x_m + x_r/24;
   if(ff) x = x + 1/48;
   x *= 2;
   x -= 180;

   if(x < 0)   // western hemisphere? 
       long_rad = true;
   else
       long_rad = false;

   y = y_l*10 + y_m + y_r/24;
   if(ff) y = y + 1/48;
   y -= 90;

   if(y < 0)   // down under?
       lat_rad = true;
   else
       lat_rad = false;

   return(true);
}

function deg2loc(x, y, lor, lar)
{
   if(isNaN(x) || isNaN(y))
   {
	alert("Numerical values\nwith decimal point only!\n");
	return(false);
   }
   if(x>180 || y>90)
   {
	alert("Latitude max. 90\nLongitude max. 180");
	return(false); 
   }
   if(x==180) x=179.9999999999999;
   if(y== 90) y= 89.99999999999999;

   if(lor)   // westliche Hemisphaere?
      x = -x;

   x += 180;
   x /= 2;
   x_l = letters.charAt(Math.floor(x/10));
   x_m = Math.floor(x%10);
   x_r = letters.charAt(Math.floor(24*(x%1)));

   if(lar)     // suedliche Gefilde?
      y = -y;

   y += 90;
   y_l = letters.charAt(Math.floor(y/10));
   y_m = Math.floor(y%10);
   y_r = letters.charAt(Math.floor(24*(y%1)));
   return(true);
}

function distance(form4_bez) // distance between two locators
{
    
    if(!loc2deg(form4_bez.loc_from.value.toUpperCase()))
    {
	document.locform4.reset();
	return;
    }
    xF = x;
    yF = y;

    if(!loc2deg(form4_bez.loc_to.value.toUpperCase()))
    {
	document.locform4.reset();
	return;
    }
    xT = x;
    yT = y;
    d = calcdist(xF, yF, xT, yT);
    form4_bez.is_dist.value = Math.round(d * radius);
    form4_bez.is_head_s.value = heading(xF, yF, xT, yT, d);
    form4_bez.is_head_d.value = heading(xT, yT, xF, yF, d);
}

function heading(x1, y1, x2, y2, d)
{
    if(Math.sin(deg2rad(x2) - deg2rad(x1)) < 0)
    {
	b = Math.acos((Math.sin(deg2rad(y2)) - Math.sin(deg2rad(y1)) * Math.cos(d)) / (Math.sin(d) * Math.cos(deg2rad(y1))));
    }
    else
    {
	w = (Math.sin(deg2rad(y2)) - Math.sin(deg2rad(y1)) * Math.cos(d)) / (Math.sin(d) * Math.cos(deg2rad(y1)));
	if(w > 1.0)
	{
	    w = 1.0;
	}
	if(w < -1.0)
	{
	    w = -1.0;
	}
	b = 2 * Math.PI - Math.acos(w);
    }
    return(Math.round(360.0 - (b * 180.0 / Math.PI)));
}

function calcdist(x1, y1, x2, y2)
{
  dist = Math.sin(deg2rad(y1)) * Math.sin(deg2rad(y2)) + Math.cos(deg2rad(y1)) * Math.cos(deg2rad(y2)) * Math.cos(deg2rad(x1 - x2));
  return(Math.acos(dist));
}

function deg2rad(deg)
{
    return(deg * Math.PI / 180.0);
}

function seldeg2loc(y, x)
{
   x += 180;
   x /= 2;
   y += 90;
   x_l = letters.charAt(Math.floor(x/10));
   x_m = Math.floor(x%10);
   x_r = letters.charAt(Math.floor(24*(x%1)));
   y_l = letters.charAt(Math.floor(y/10));
   y_m = Math.floor(y%10);
   y_r = letters.charAt(Math.floor(24*(y%1)));
   return(x_l+y_l+x_m+y_m+x_r+y_r);
}

function make_DX_selection()
{
    document.writeln("<option value=\"9999\">&nbsp;< select a DX or call area ></option>");
    for(i=0; i<s.length; i++)
    {
	document.writeln("<option value=\"" + i + "\">" + s[i][0] + " = " + s[i][1] + "</option>");
    }
}

function conv_DX_selection(i, sd, form4_bez)
{
    if(i == 9999) l = "";
    else l = seldeg2loc(s[i][2], s[i][3]);

    if(sd == 0)
    {
	form4_bez.loc_from.value = l;
	form4_bez.src_Rus.selectedIndex = 0;
    }
    if(sd == 1)
    {
	form4_bez.loc_to.value = l;
	form4_bez.dest_Rus.selectedIndex = 0;
    }
}

function make_Rus_selection()
{
    document.writeln("<option value=\"9999\">&nbsp;< select a Russian call area/oblast/city ></option>");
    for(i=0; i<r.length; i++)
    {
	document.writeln("<option value=\"" + i + "\">" + r[i][0] + " = " + r[i][1] + "</option>");
    }
}

function conv_Rus_selection(i, sd, form4_bez)
{
    if(i == 9999) l = "";
    else l=seldeg2loc(r[i][2], r[i][3]);

    if(sd == 0)
    {
	form4_bez.loc_from.value = l;
	form4_bez.src_DX.selectedIndex = 0;
    }
    if(sd == 1)
    {
	form4_bez.loc_to.value = l;
	form4_bez.dest_DX.selectedIndex = 0;
    }
}

function locator_changed(sd, form4_bez)
{
    if(sd == 0)
    {
	form4_bez.src_DX.selectedIndex = 0;
	form4_bez.src_Rus.selectedIndex = 0;
    }
    if(sd == 1)
    {
	form4_bez.dest_DX.selectedIndex = 0;
	form4_bez.dest_Rus.selectedIndex = 0;
    }
}
