//LLtoGrid

fabs(float x)
{
  if (x < 0)
    x = -x;
  return x;
}

abs(int x)
{
  if (x < 0)
    x = -x;
  return x;
}

/*------------------------------------------------------------*/
LatLontoGrid(float LocLat, float LocLon)
{
  /*converts lat & long to grid square*/
  int c,i;
  char cgrid[7];
  float g4, R, M, L4;
  string str;

  LocLon = -LocLon;
  
  g4 = 180 - LocLon;
  c = (int)(g4 / 20);
  cgrid[0] = (char)(c + 65);

  R = fabs(LocLon / 20);
  R = (int)((R-(int)R)*20);
  c = (int)(R / 2);
  if (LocLon >= 0)
    c = abs(c - 9);
  cgrid[2] = (char)(c + 48);

  M = fabs(LocLon * 60.0) / 120.0;
  M = (int)((M - (int)M)*120);
  c = (int)(M / 5.0);
  if (LocLon >= 0)
    c = abs(c - 23);
  cgrid[4] = (char)(c + 'a');

  L4 = LocLat + 90.0;
  c = (int)(L4 / 10.0);
  cgrid[1] = (char)(c + 65);

  R = fabs(LocLat / 10.0);
  R = (int)((R - (int)R)*10.0);
  c = (int)R;
  if (LocLat < 0)
    c = abs(c - 9);
  cgrid[3] = (char)(c + 48);

  M = fabs(LocLat * 60.0) / 60.0;
  M = (int)((M - (int)M)*60.0);
  c = (int)(M / 2.5);
  if (LocLat < 0)
    c = abs(c - 23);
  cgrid[5] = (char)(c + 'a');

  cgrid[6] = '\000';

  str = cgrid[0];
  for (i = 1; i <= 6; i++)
     str = str + cgrid[i];
     
  return str;
}

GetLat()
{
   float lat;
   int lm,ls;
   char sign;
   string st;
      
   lat = gets("Latitude Degrees:");
   lm = gets("Latitude Minutes:");
   ls = gets("latitude Seconds:");
   lat = lat + (float)((lm * 60.0) + ls) / 3600.0;
   st = gets("N or S ?:");
   st = strupr(st);
   sign = strleft(st,1);
   if (sign == 'S')
      lat = -lat;

   clearg();
   text(0,45,"Latitude= " + (abs((int)lat)) + "d " + lm + "m " + ls + "s " + sign); 

   return lat;
}

GetLon()
{
   float lon;
   int lm,ls;
   char sign;
   string st;
   
   lon = gets("Longitude Degrees:");
   lm = gets("Longitude Minutes:");
   ls = gets("longitude Seconds:");
   lon = lon + (float)((lm * 60.0) + ls) / 3600.0;
   st = gets("E or W ?:");
   st = strupr(st);
   sign = strleft(st,1);
   if (sign == 'W')
      lon = -lon;

   text(0,60,"Longitude= " + (abs((int)lon)) + "d " + lm + "m " + ls + "s " + sign); 

   return lon;
}

main()
{
   string grid;
   float lat, lon;

   graph_on();
   clearg();
   
   title("Lat & Lon to Grid Square");

   textattr(2,1,0);

   text(135,0,"v0.1");
   text(0,35,"LatLon to Grid"); 
   text(0,50,"by W1GHZ and KB1VC 1999 ");
   text(0,65,"from BD.PAS by W9IP&N1BWT");

   lat = 0.0;
   while (lat < 90.1)
     {
     lat = GetLat();
     lon = GetLon();
   
     grid = LatLontoGrid(lat, lon);

     text(0,20,"Grid Square is " + strleft(grid,4) + strlwr(substr(grid,4,2))) ;
     }
}
