#!/bin/sh
# the next line restarts using wish \
exec wish "$0" "$@"

#
# Degree Minute Second Calculator
#
# Script to translate between various Latitude and Longitude formats.
#
# Tom Mayo N1MU - 9/24/99
#

proc Clear_Fields { } {
  global stuff
  set stuff(tdms_d) ""
  set stuff(tdms_m) ""
  set stuff(tdms_s) ""
  set stuff(gdms_d) ""
  set stuff(gdms_m) ""
  set stuff(gdms_s) ""
  set stuff(tdm_d) ""
  set stuff(tdm_m) ""
  set stuff(gdm_d) ""
  set stuff(gdm_m) ""
  set stuff(td_d) ""
  set stuff(gd_d) ""
  set stuff(grid) ""
}

proc To_grid { } {
  global stuff

  set mylon [ expr 90 + $stuff(td_d) ]
  set mylat [ expr 180 + $stuff(gd_d) ]

  set grid [ format "%c"    [ expr 65 + int( ( $mylat ) / 20 ) ] ]
  append grid [ format "%c" [ expr 65 + int( ( $mylon ) / 10 ) ] ]

  append grid [ format "%c" [ expr 48 + int( ( $mylat ) / 2 ) % 10 ] ]
  append grid [ format "%c" [ expr 48 + int( $mylon ) % 10 ] ]

  append grid [ format "%c" \
    [ expr 97 + ( int( $mylat ) % 2 ) * 12 + \
      int( ( $mylat - int( $mylat ) ) * 12 ) ] ]
  append grid [ format "%c" \
    [ expr 97 + int( ( $mylon - int( $mylon ) ) * 24 ) ] ]

  set stuff(grid) $grid
}

proc Do_grid { } {
  global stuff

  set temp [ string toupper $stuff(grid) ]

  if { [ scan $temp "%c%c%c%c%c%c" lon1 lat1 lon2 lat2 lon3 lat3 ] < 6 } {
    set lon3 109
    set lat3 109
  }

  set lat [ expr ($lat1 - 65.0) * 10.0 ]
  set lon [ expr ($lon1 - 65.0) * 20.0 ]

  set lat [ expr $lat + $lat2 - 48.0 ]
  set lon [ expr $lon + ($lon2 - 48.0) * 2.0 ]

  set lat [ expr $lat + 1.25 / 60.0 + \
    ($lat3 - 65.0) / 24.0 ]
  set lon [ expr $lon + 2.5 / 60.0 + \
    ($lon3 - 65.0 - 12.0 * (int($lon) % 2)) / 12.0 ]

  set lat [ expr $lat - 90.0 ]
  set lon [ expr $lon - 180.0 ]

  set stuff(td_d) $lat
  set stuff(gd_d) $lon

  Do_d 0
}

proc Do_dms { } {
  global stuff

  set stuff(tdm_d) $stuff(tdms_d)
  set stuff(tdm_m) [ expr $stuff(tdms_m) + $stuff(tdms_s) / 60.0 ]
  if { $stuff(tdms_d) < 0 } {
    set stuff(td_d) \
      [ expr $stuff(tdms_d) - ( $stuff(tdms_m) + $stuff(tdms_s) / 60.0 ) / 60.0 ]
  } else {
    set stuff(td_d) \
      [ expr $stuff(tdms_d) + ( $stuff(tdms_m) + $stuff(tdms_s) / 60.0 ) / 60.0 ]
  }

  set stuff(gdm_d) $stuff(gdms_d)
  set stuff(gdm_m) [ expr $stuff(gdms_m) + $stuff(gdms_s) / 60.0 ]
  if { $stuff(gdms_d) < 0 } {
    set stuff(gd_d) \
      [ expr $stuff(gdms_d) - ( $stuff(gdms_m) + $stuff(gdms_s) / 60.0 ) / 60.0 ]
  } else {
    set stuff(gd_d) \
      [ expr $stuff(gdms_d) + ( $stuff(gdms_m) + $stuff(gdms_s) / 60.0 ) / 60.0 ]
  }

  To_grid
}

proc Do_dm { } {
  global stuff

  set stuff(tdms_d) $stuff(tdm_d)
  set stuff(tdms_m) [ expr int($stuff(tdm_m)) ]
  set stuff(tdms_s) [ expr ($stuff(tdm_m) - $stuff(tdms_m)) * 60 ]
  if { $stuff(tdm_d) < 0 } {
    set stuff(td_d) [ expr $stuff(tdm_d) - $stuff(tdm_m) / 60.0 ]
  } else {
    set stuff(td_d) [ expr $stuff(tdm_d) + $stuff(tdm_m) / 60.0 ]
  }

  set stuff(gdms_d) $stuff(gdm_d)
  set stuff(gdms_m) [ expr int($stuff(gdm_m)) ]
  set stuff(gdms_s) [ expr ($stuff(gdm_m) - $stuff(gdms_m)) * 60 ]
  if { $stuff(gdm_d) < 0 } {
    set stuff(gd_d) [ expr $stuff(gdm_d) - $stuff(gdm_m) / 60.0 ]
  } else {
    set stuff(gd_d) [ expr $stuff(gdm_d) + $stuff(gdm_m) / 60.0 ]
  }
  
  To_grid
}

proc Do_d { gridflag } {
  global stuff

  set stuff(tdm_d) [ expr int($stuff(td_d)) ]
  set stuff(tdm_m) [ expr abs(($stuff(td_d) - $stuff(tdm_d)) * 60) ]
  set stuff(tdms_d) $stuff(tdm_d)
  set stuff(tdms_m) [ expr int($stuff(tdm_m)) ]
  set stuff(tdms_s) [ expr ($stuff(tdm_m) - int($stuff(tdm_m)) ) * 60 ]

  set stuff(gdm_d) [ expr int($stuff(gd_d)) ]
  set stuff(gdm_m) [ expr abs(($stuff(gd_d) - $stuff(gdm_d)) * 60) ]
  set stuff(gdms_d) $stuff(gdm_d)
  set stuff(gdms_m) [ expr int($stuff(gdm_m)) ]
  set stuff(gdms_s) [ expr ($stuff(gdm_m) - int($stuff(gdm_m)) ) * 60 ]
  
  if { $gridflag == 1 } {
    To_grid
  }
}

frame .f0
button .f0.b_dms   -text "Commit" -command Do_dms
button .f0.b_dm    -text "Commit" -command Do_dm
button .f0.b_d     -text "Commit" -command { Do_d 1 }
button .f0.b_grid  -text "Commit" -command Do_grid
button .f0.b_clear -text "Clear"  -command Clear_Fields
button .f0.b_quit  -text "Quit"   -command exit

label .f0.l_tdms_d -text "Lat Deg d"
label .f0.l_tdms_m -text "Lat Min m"
label .f0.l_tdms_s -text "Lat Sec s.s"
label .f0.l_gdms_d -text "Lon Deg d"
label .f0.l_gdms_m -text "Lon Min m"
label .f0.l_gdms_s -text "Lon Sec s.s"
label .f0.l_tdm_d  -text "Lat Deg d"
label .f0.l_tdm_m  -text "Lat Min m.m"
label .f0.l_gdm_d  -text "Lon Deg d"
label .f0.l_gdm_m  -text "Lon Min m.m"
label .f0.l_td_d   -text "Lat Deg d.d"
label .f0.l_gd_d   -text "Lon Deg d.d"
label .f0.l_grid   -text "Grid"

entry .f0.e_tdms_d -textvariable stuff(tdms_d) -width 6
entry .f0.e_tdms_m -textvariable stuff(tdms_m) -width 6
entry .f0.e_tdms_s -textvariable stuff(tdms_s) -width 6
entry .f0.e_gdms_d -textvariable stuff(gdms_d) -width 6
entry .f0.e_gdms_m -textvariable stuff(gdms_m) -width 6
entry .f0.e_gdms_s -textvariable stuff(gdms_s) -width 6
entry .f0.e_tdm_d  -textvariable stuff(tdm_d) -width 6
entry .f0.e_tdm_m  -textvariable stuff(tdm_m) -width 6
entry .f0.e_gdm_d  -textvariable stuff(gdm_d) -width 6
entry .f0.e_gdm_m  -textvariable stuff(gdm_m) -width 6
entry .f0.e_td_d   -textvariable stuff(td_d) -width 6
entry .f0.e_gd_d   -textvariable stuff(gd_d) -width 6
entry .f0.e_grid   -textvariable stuff(grid) -width 6

grid .f0.l_tdms_d .f0.l_tdms_m .f0.l_tdms_s .f0.l_gdms_d .f0.l_gdms_m .f0.l_gdms_s x
grid .f0.e_tdms_d .f0.e_tdms_m .f0.e_tdms_s .f0.e_gdms_d .f0.e_gdms_m .f0.e_gdms_s .f0.b_dms
grid .f0.l_tdm_d  .f0.l_tdm_m  x            .f0.l_gdm_d  .f0.l_gdm_m  x            x
grid .f0.e_tdm_d  .f0.e_tdm_m  x            .f0.e_gdm_d  .f0.e_gdm_m  x            .f0.b_dm
grid .f0.l_td_d   x            x            .f0.l_gd_d   x            x            x
grid .f0.e_td_d   x            x            .f0.e_gd_d   x            x            .f0.b_d
grid x            x            x            .f0.l_grid   x            x            x
grid x            x            x            .f0.e_grid   x            x            .f0.b_grid
grid x            x            x            .f0.b_clear  x            x            x
grid x            x            x            .f0.b_quit   x            x            x

grid .f0.l_tdms_d -padx 2 -pady 2 -sticky news
grid .f0.l_tdms_m -padx 2 -pady 2 -sticky news
grid .f0.l_tdms_s -padx 2 -pady 2 -sticky news
grid .f0.l_gdms_d -padx 2 -pady 2 -sticky news
grid .f0.l_gdms_m -padx 2 -pady 2 -sticky news
grid .f0.l_gdms_s -padx 2 -pady 2 -sticky news
grid .f0.e_tdms_d -padx 2 -pady 2 -sticky news
grid .f0.e_tdms_m -padx 2 -pady 2 -sticky news
grid .f0.e_tdms_s -padx 2 -pady 2 -sticky news
grid .f0.e_gdms_d -padx 2 -pady 2 -sticky news
grid .f0.e_gdms_m -padx 2 -pady 2 -sticky news
grid .f0.e_gdms_s -padx 2 -pady 2 -sticky news
grid .f0.b_dms    -padx 2 -pady 2 -sticky news

grid .f0.l_tdm_d -padx 2 -pady 2 -sticky news
grid .f0.l_tdm_m -padx 2 -pady 2 -sticky news
grid .f0.l_gdm_d -padx 2 -pady 2 -sticky news
grid .f0.l_gdm_m -padx 2 -pady 2 -sticky news
grid .f0.e_tdm_d -padx 2 -pady 2 -sticky news
grid .f0.e_tdm_m -padx 2 -pady 2 -sticky news
grid .f0.e_gdm_d -padx 2 -pady 2 -sticky news
grid .f0.e_gdm_m -padx 2 -pady 2 -sticky news
grid .f0.b_dm    -padx 2 -pady 2 -sticky news

grid .f0.l_td_d -padx 2 -pady 2 -sticky news
grid .f0.l_gd_d -padx 2 -pady 2 -sticky news
grid .f0.e_td_d -padx 2 -pady 2 -sticky news
grid .f0.e_gd_d -padx 2 -pady 2 -sticky news
grid .f0.b_d    -padx 2 -pady 2 -sticky news

grid .f0.l_grid -padx 2 -pady 2 -sticky news
grid .f0.e_grid -padx 2 -pady 2 -sticky news
grid .f0.b_grid -padx 2 -pady 2 -sticky news

grid .f0.b_clear -padx 2 -pady 2 -sticky news
grid .f0.b_quit  -padx 2 -pady 2 -sticky news

pack .f0
