package org.smerty.jham;

/**
 * Location class with methods allowing conversion to and from Maidenhead
 * locator (grid squares) based off of
 * "Conversion Between Geodetic and Grid Locator Systems" by Edmund T. Tyson,
 * N5JTY in QST January 1989, pp. 29-30, 43
 *
 * @author Paul Picazo <ppicazo@gmail.com>
 *
 */
public class Location {

  private double latitude;
  private double longitude;

  /** No argument constructor
   *
   */
  public Location() {
  }

  /**
   * @param latitude
   * @param longitude
   */
  public Location(double latitude, double longitude) {
    this.latitude = latitude;
    this.longitude = longitude;
  }

  /**
   * @param maidenhead
   */
  public Location(String maidenhead) {
    this.latitude = extractLat(maidenhead);
    this.longitude = extractLon(maidenhead);
  }

  /**
   * @return maidenhead locator string
   */
  public String toMaidenhead() {
    return toMaidenhead(this.latitude, this.longitude);
  }

  /**
   * @param latitude
   * @param longitude
   * @return maidenhead locator string
   */
  public static String toMaidenhead(double latitude, double longitude) {

    longitude += 180;
    longitude /= 2;
    char lon_first = (char) ('A' + (Math.floor(longitude / 10)));
    char lon_second = (char) ('0' + Math.floor(longitude % 10));
    char lon_third = (char) ('A' + Math.floor((longitude % 1) * 24));

    latitude += 90;
    char lat_first = (char) ('A' + (Math.floor(latitude / 10)));
    char lat_second = (char) ('0' + Math.floor(latitude % 10));
    char lat_third = (char) ('A' + Math.floor((latitude % 1) * 24));

    StringBuilder sb = new StringBuilder();
    sb.append(lon_first);
    sb.append(lat_first);
    sb.append(lon_second);
    sb.append(lat_second);
    sb.append(("" + lon_third).toLowerCase());
    sb.append(("" + lat_third).toLowerCase());

    return sb.toString();
  }

  /**
   * @param maidenhead
   * @return latitude
   */
  public static double extractLat(String maidenhead) {
    maidenhead = maidenhead.toUpperCase();
    double latitude = -90 + 10 * (maidenhead.charAt(1) - 'A') + 1 * (maidenhead.charAt(3) - '0') + 2.5 / 60 * (maidenhead.charAt(5) - 'A') + 2.5 / 60 / 2;
    return latitude;
  }

  /**
   * @param maidenhead
   * @return longitude
   */
  public static double extractLon(String maidenhead) {
    maidenhead = maidenhead.toUpperCase();
    double longitude = -180 + 20 * (maidenhead.charAt(0) - 'A') + 2 * (maidenhead.charAt(2) - '0') + 5.0 / 60 * (maidenhead.charAt(4) - 'A') + 5.0 / 60 / 2;
    return longitude;
  }

  /**
   * @return latitude
   */
  public double getLatitude() {
    return latitude;
  }

  /**
   * @return longitude
   */
  public double getLongitude() {
    return longitude;
  }

  /**
   * @param latitude
   */
  public void setLatitude(double latitude) {
    this.latitude = latitude;
  }

  /**
   * @param longitude
   */
  public void setLongitude(double longitude) {
    this.longitude = longitude;
  }
}

@@ -533,16 +533,22 @@
 ocation(
+final 
 double l
@@ -547,32 +547,38 @@
 double latitude,
+ final
  double longitud
@@ -702,16 +702,22 @@
 ocation(
+final 
 String m
@@ -872,24 +872,30 @@
 ing%0A   */%0A  
+final 
 public Strin
@@ -1104,16 +1104,22 @@
 denhead(
+final 
 double l
@@ -1125,17 +1125,25 @@
 latitude
-,
+In, final
  double 
@@ -1147,24 +1147,26 @@
 le longitude
+In
 ) %7B%0A%0A    lon
@@ -1158,24 +1158,31 @@
 eIn) %7B%0A%0A    
+double 
 longitude +=
@@ -1179,18 +1179,31 @@
 ngitude 
-+
 =
+ longitudeIn +
  180;%0A  
@@ -1426,16 +1426,23 @@
 );%0A%0A    
+double 
 latitude
@@ -1446,10 +1446,22 @@
 ude 
-+
 =
+ latitudeIn +
  90;
@@ -2027,16 +2027,22 @@
 ractLat(
+final 
 String m
@@ -2046,32 +2046,34 @@
 g maidenhead
+In
 ) %7B%0A    
 maidenhead =
@@ -2052,32 +2052,39 @@
 enheadIn) %7B%0A    
+String 
 maidenhead = mai
@@ -2082,32 +2082,34 @@
 ead = maidenhead
+In
 .toUpperCase();%0A
@@ -2381,16 +2381,22 @@
 ractLon(
+final 
 String m
@@ -2404,24 +2404,26 @@
 idenhead
+In
 ) %7B%0A    
 maidenhe
@@ -2414,16 +2414,23 @@
 ) %7B%0A    
+String 
 maidenhe
@@ -2444,16 +2444,18 @@
 idenhead
+In
 .toUpper
@@ -2674,32 +2674,38 @@
 atitude%0A   */%0A  
+final 
 public double ge
@@ -2777,24 +2777,30 @@
 ude%0A   */%0A  
+final 
 public doubl
@@ -2872,32 +2872,38 @@
 atitude%0A   */%0A  
+final 
 public void setL
@@ -2906,24 +2906,30 @@
 setLatitude(
+final 
 double latit
@@ -3002,24 +3002,30 @@
 ude%0A   */%0A  
+final 
 public void 
@@ -3037,16 +3037,22 @@
 ngitude(
+final 
 double l

Make appropriate parameters and methods final.