/*
From: pkuo@gcn.net.tw
Date: Fri, 22 Feb 2002 16:28:11 +0800
Subject: 電線桿.c for Palm(using PocketC)

Dear Dan,

How are you?
I am Patrick Kuo, live near G7270 EE27. Base on
your program, I porting it to Palm(need PocketC),
if you like, you may put this on your web site.

I would like to thank you for your finding, this
always give me help & funs when traveling(not
overseas, maybe we should suggest other country to
do so :-).

Best Regards,
Patrick Kuo.
*/
// 電線桿.c
/* 版權所有 Copyright 2001 Dan Jacobson 積丹尼

   本程式是自由軟體，您可以遵照自由軟體基金會 (Free Software
Foundation) 出版的 GNU 通用公共許可証條款 (GNU General Public License)
第二版來修改和重新發佈這一程式，或者自由選擇使用任何更新的版本。
*/
#define DEBUG 0
#define TAIWAN_MERIDIAN 250000
#define TAIWAN_MAX_WEST (TAIWAN_MERIDIAN - 80000 * 2)
#define EQUATOR 0
#define TAIWAN_MAX_NORTH (EQUATOR + 50000 * 56) //2800000 [maybe i don't need to be so fussy]
#define PENGHU_MAX_WEST 275000 //2003.10.31 jidanni: 251000 is wrong
#define PENGHU_MAX_NORTH 2664000
#define JINMEN_MAX_WEST 552700
#define JINMEN_MAX_SOUTH 2675800
int digit(char a)
{
  switch (a)
    {
  case 'A': return(0);
  case 'B': return(1);
  case 'C': return(2);
  case 'D': return(3);
  case 'E': return(4);
  case 'F': return(5);
  case 'G': return(6);
  case 'H': return(7);
 }
}
int west_edge (char letter)

{
  switch (letter)
    {
    default:
      puts("80000m  * 50000m area letter problem");
      return(0);
    case 'J':case 'P':case 'M':
      return TAIWAN_MERIDIAN - 80000 * 2;
    case 'A':case 'D':case 'G':case 'K':case 'N':case 'Q':case 'T':case 'V':
      return TAIWAN_MERIDIAN - 80000 * 1;
    case 'B':case 'E':case 'H':case 'L':case 'O':case 'R':case 'U':case 'W':
      return TAIWAN_MERIDIAN - 80000 * 0;
    case 'C':case 'F':
      return TAIWAN_MERIDIAN - 80000 * -1;
    case 'X': case 'Y':
      return PENGHU_MAX_WEST;
    case 'Z':			/* tricky, cant give both Z's, give
				   basic one and have calling function deal with it.*/
      return JINMEN_MAX_WEST;
    }
}

//return the south y vaule of 80000m  * 50000m area of LETTER.
int south_edge (char letter)

{
  switch (letter)
    {
    default:
        default:
      puts("80000m  * 50000m area letter problem");
      return(0);
    case 'A':case 'B':case 'C':
      return EQUATOR + 50000 * 55;
    case 'D':case 'E':case 'F':
      return EQUATOR + 50000 * 54;
    case 'G':case 'H':
      return EQUATOR + 50000 * 53;
    case 'J':case 'K':case 'L':
      return EQUATOR + 50000 * 52;
    case 'M':case 'N':case 'O':
      return EQUATOR + 50000 * 51;
    case 'P':case 'Q':case 'R':
      return EQUATOR + 50000 * 50;
    case 'T':case 'U':
      return EQUATOR + 50000 * 49;
    case 'V':case 'W':
      return EQUATOR + 50000 * 48;
    case 'X':
      return PENGHU_MAX_NORTH - 50000 * 1;
    case 'Y':
      return PENGHU_MAX_NORTH - 50000 * 2;
    case 'Z':
      return JINMEN_MAX_SOUTH;
    }
}


int main(){

  string pole_str;
  int x,y,len,deg_n,deg_e,min_n,min_e,sec_n,sec_e;
  float N,E;
  pole_str=gets("電線桿的座標,如 G7767 ED1233");

  x=west_edge(substr(pole_str,0,1))+
   (int)substr(pole_str,1,2)*800+
   digit(substr(pole_str,6,1))*100+
   (int)substr(pole_str,8,1)*10;

  y=south_edge(substr(pole_str,0,1))+
   (int)substr(pole_str,3,2)*500+
   digit(substr(pole_str,7,1))*100+
   (int)substr(pole_str,9,1)*10;

  len=strlen(pole_str);
  if(len>11)
    { x=x+(int)substr(pole_str,10,1);
      y=y+(int)substr(pole_str,11,1);
    }

  N=24.0+((float) y-2655032.3)/110754.8256;
  E=(float) 121.0 +((float) x-250000.0)/101745.445;
  deg_n=(int) N;
  deg_e=(int) E;
  N=N-(float)deg_n;
  E=E-(float)deg_e;
  N=N*60.0;
  E=E*60.0;
  min_n=(int) N;
  min_e=(int) E;
  N=N-(float)min_n;
  E=E-(float)min_e;
  N=N*60.0;
  E=E*60.0;
  sec_n=(int) N;
  sec_e=(int) E;

 alert("TM座標\n	X=" +x+ "\n	Y="+y+"\n經緯座標\n	北緯"+deg_n+"度"+min_n+"分"+sec_n+"秒"+"\n"+"	東經"+deg_e+"度"+min_e+"分"+sec_e+"秒");
}
