#define	STRICT
#include	<windows.h>
#include	<windowsx.h>
#include	<tchar.h>
#include	<math.h>
#include	"kctrl.h"
#include	"search.h"

DWORD		g_dwList[ MAX ] ;
DWORD		g_dwNumList = 0 ;
CHAR		g_szResult[ 96 ][ 81 ] ;
DWORD		g_dwNumResult = 0 ;

typedef struct {
	LPCSTR	k ;		/* ＭＡ名 */
	LPCSTR	n ;		/* 読み */
	int		x ;
	int		y ;
	long	s ;		/* 市外局番 */
	int		m ;		/* 地域会社　千位：パーソナル・ポケット　百位：アステル・電力系 */
} ma ;

typedef struct {
	LPCSTR	n1 ;
	LPCSTR	n2 ;
} rin ;

typedef struct {
	double	h1 ;
	double	h2 ;
	double	h3 ;
	int		f ;
} ryo ;

#include	"ma.h"
#include	"tel.h"

void
strcat_num( LPSTR str, DWORD num )
{
	CHAR	digits[ 10 ], *ptr = digits ;

	str += strlen( str ) ;
	if ( num ) {
		while ( num ) {
			*ptr++ = '0' + (CHAR) (num % 10) ;
			num /= 10 ;
		}
	} else {
		*ptr++ = '0' ;
	}
	while ( ptr -- != digits ) {
		*str++ = *ptr ;
	}
	*str = 0 ;
}

void
strcat_float( LPSTR str, double lnum )
{
	DWORD	num = (DWORD) (lnum * 10 + 0.5) ;

	str += strlen( str ) ;
	*str++ = (num >= 1000) ? '0' + (CHAR) ((num / 1000) % 10) : ' ' ;
	*str++ = (num >= 100)  ? '0' + (CHAR) ((num / 100)  % 10) : ' ' ;
	*str++ = '0' + (CHAR) ((num / 10)   % 10) ;
	*str++ = '.' ;
	*str++ = '0' + (CHAR) (num % 10) ;
	*str++ = ' ' ;
	*str = 0 ;
}

void
strcat_dword( LPSTR str, DWORD num )
{
	str += strlen( str ) ;
	*str++ = (num >= 10000) ? '0' + (CHAR) ((num / 10000) % 10) : ' ' ;
	*str++ = (num >= 1000)  ? '0' + (CHAR) ((num / 1000)  % 10) : ' ' ;
	*str++ = (num >= 100)   ? '0' + (CHAR) ((num / 100)   % 10) : ' ' ;
	*str++ = (num >= 10)    ? '0' + (CHAR) ((num / 10)    % 10) : ' ' ;
	*str++ = '0' + (CHAR) (num % 10) ;
	*str++ = ' ' ;
	*str = 0 ;
}

/* 文字列を指定された長さにそろえる */
void
stralign( LPSTR str, DWORD len )
{
	DWORD	orglen = strlen( str ) ;

	if ( orglen >= len ) {
		str[ len ] = 0 ;
		return ;
	}
	str += orglen ;
	len -= orglen ;
	do {
		*str++ = ' ' ;
	} while ( -- len ) ;
	*str = 0 ;
}

//------------------------------------------
/*ＭＡ指定関数*/
//------------------------------------------
int
getma( LPCTSTR str )
{
	DWORD	len, cursel, q, i ;
	CHAR	sjis[ 128 ], tmpbuf[ 10 ] ;

	unicode2sjis( str, (LPBYTE) sjis, sizeof sjis ) ;
	len = strlen( sjis ) ;
	cursel = 0 ;
	g_dwNumList = 0 ;
	/* 漢字に該当するエントリを探す */
	for ( q = 0 ; q < MAX ; q ++ ) {
		/* 漢字で指定？ */
		if ( !strncmp( d[q].k, sjis, len ) && strcmp( d[q].k, d[q-1].k ) ) {
			if( strcmp( d[q].k, d[q].n ) ) {
				g_dwList[ g_dwNumList ++ ] = q ;
				if ( !strcmp( d[q].k, sjis ) ) {
					cursel = g_dwNumList - 1 ;
				}
			}
		} else if ( !strncmp( d[q].n, sjis, len ) && strcmp( d[q].k, d[q-1].k ) ) {
			/*読み方で指定？*/
			g_dwList[ g_dwNumList ++ ] = q ;
			if ( !strcmp( sjis, d[q].n ) ) {
				cursel = g_dwNumList ;
			}
		} else {
			/*市外局番で指定？*/
			strcpy( tmpbuf, "0" ) ;
			strcat_num( tmpbuf, d[q].s ) ;
			if ( !strncmp( tmpbuf, sjis, len ) ) {
				for ( i = 0 ; i < g_dwNumList ; i ++ ) {
					if ( !strcmp( d[ g_dwList[ i ] ].k, d[ q ].k ) ) {
						break ;
					}
				}
				if ( i >= g_dwNumList ) {
					g_dwList[ g_dwNumList ++ ] = q ;
				}
				if ( !strcmp( tmpbuf, sjis ) ) {
					cursel = g_dwNumList - 1 ;
				}
			}
		}
	}
	return cursel ;
}

int
getma_ss( LPCTSTR str )
{
	DWORD	len, cursel, q, i ;
	CHAR	sjis[ 128 ], tmpbuf[ 10 ] ;

	unicode2sjis( str, (LPBYTE) sjis, sizeof sjis ) ;
	len = strlen( sjis ) ;
	cursel = 0 ;
	g_dwNumList = 0 ;

	for ( q = 0 ; q < MAX ; q ++ ) {
		strcpy( tmpbuf, "0" ) ;
		strcat_num( tmpbuf, d[q].s ) ;
		if ( !strcmp( tmpbuf, sjis ) ) {
			for ( i = 0 ; i < g_dwNumList ; i ++ ) {
				if ( !strcmp( d[ g_dwList[ i ] ].k, d[ q ].k ) ) {
					break ;
				}
			}
			if ( i >= g_dwNumList ) {
				g_dwList[ g_dwNumList ++ ] = q ;
			}
			cursel = g_dwNumList - 1 ;
		}
	}
	return cursel ;
}

LPCSTR
getname( DWORD index )
{
	return d[ index ].k ;
}

//------------------------------------------
/*距離計算関数*/
//------------------------------------------
double
hypot2( double x, double y )
{
	return sqrt( x*x + y*y ) * 2 ;
}

//-------------------------------------------------------------------------
/*20km以上隣接・離島特例チェック関数（３番目の引数：1=隣接、0=離島特例）*/
//-------------------------------------------------------------------------
int
chkrinsetsu( LPCSTR a, LPCSTR b, int p )
{
	int		q ;

	if ( p != 0 ) {
		for ( q = 0 ; q < RMAX ; q ++ ) {
			if ( !strcmp( a, rinsetsu[q].n1 ) && !strcmp( b, rinsetsu[q].n2 ) ) {
				return 1 ;
			}
			if ( !strcmp( a, rinsetsu[q].n2 ) && !strcmp( b, rinsetsu[q].n1 ) ) {
				return 1 ;
			}
		}
	} else {
		for ( q = 0 ; q < RTMAX ; q ++ ) {
			if ( !strcmp( a, rito[q].n1 ) && !strcmp( b, rito[q].n2 ) ) {
				return 1 ;
			}
			if ( !strcmp( a, rito[q].n2 ) && !strcmp( b, rito[q].n1 ) ) {
				return 1 ;
			}
		}
	}
	return 0 ;
}

//-------------------------------------------------------------------------
//20km以内非隣接チェック関数（３番目の引数：ダミー）
//-------------------------------------------------------------------------
int
xchkrinsetsu( LPCSTR a, LPCSTR b, int p )
{
	int		q ;

	for ( q = 0 ; q < XMAX ; q ++ ) {
		if ( !strcmp( a, xrinsetsu[q].n1 ) && !strcmp( b, xrinsetsu[q].n2 ) ) {
			return 1 ;
		}
		if ( !strcmp( a, xrinsetsu[q].n2 ) && !strcmp( b, xrinsetsu[q].n1 ) ) {
			return 1 ;
		}
	}
	return 0 ;
}

//------------------------------------------
// xxx秒の料金表示用文字を返す
//------------------------------------------
char *
GetMinutePrice( int n, double table1, double table2, double table3, long time, int mode, int add )
{
	static char	rebuf[ 30 ] ;
	double		x, table[ 3 ] ;
	int			pri[ 3 ], price, i ;

	// 値初期化
	*rebuf = 0 ;
	table[0] = table1 ;
	table[1] = table2 ;
	table[2] = table3 ;

	// KDDの場合
	if ( mode == 3 ) {
		pri[0] = (int) (((time - 1) / 6 + 1) * (kddf[n].h1 * 10) + 5.01) / 10 ;
		pri[1] = (int) (((time - 1) / 6 + 1) * (kddf[n].h2 * 10) + 5.01) / 10 ;
		pri[2] = (int) (((time - 1) / 6 + 1) * (kddf[n].h3 * 10) + 5.01) / 10 ;
		strcat_dword( rebuf, pri[0] ) ;
		strcat_dword( rebuf, pri[1] ) ;
		strcat_dword( rebuf, pri[2] ) ;
		return rebuf ;
	}

	// 通常は10円単位。東京電話は9円か7.2円
	switch ( mode ) {
	case 0:
		x = 10 ;
		break;
	case 1:
		x = 9 ;
		break ;
	case 2:
		if ( time > 120 ) {
			x = 7.2 ;
		} else {
			x = 9 ;
		}
		break ;
	}

	// 10円または9(7.2)円単位にして文字列化
	for ( i = 0 ; i < 3 ; i ++ ) {
		price = (int) ((time - 1 + table[i] + 0.501) / table[i]) ;
		price = (int) ((double) price * x) ;
		switch ( mode ) {
		case 0:
			price = (int) ((double) price / 10 + 0.9) * 10 ;
			break ;
		case 1:
			price = (int) ((double) price / 9 + 0.8) * 9 ;
			break ;
		case 2:
			break ;
		}
		price += add ;
		strcat_dword( rebuf, price ) ;
	}
	return rebuf ;
}

//------------------------------------------
/*料金表示関数*/
//------------------------------------------
void
ryokin( long time, int s, int sn, int a, int b )
{
	int		q ;
	CHAR	strbuf[ 256 ], strbuf2[ 256 ] ;

	strcpy( g_szResult[ g_dwNumResult ++ ], "" ) ;

	strcpy( strbuf, "料金表(特に注記がない限り" ) ;
	if ( time == 0 ) {
		strcat( strbuf, "10円で話せる秒数,外税です)" ) ;
	} else {
		strcat_num( strbuf, time ) ;
		strcat( strbuf, "秒間の通話における料金,外税です)" ) ;
	}
	strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;

	strcpy( g_szResult[ g_dwNumResult ++ ], g_szNames[ NAME_TITLE1 ] ) ;
	strcpy( g_szResult[ g_dwNumResult ++ ], g_szNames[ NAME_TITLE2 ] ) ;

	/* ＮＴＴ料金表示 */
	for ( q = 0 ; ; q ++ ) {
		if ( (nttf[q].f == -1) || (nttf[q].f >= sn) ) {
			strcpy( strbuf, g_szNames[ NAME_NTT ] ) ;
			stralign( strbuf, g_dwAlignCol ) ;
			if ( time == 0 ) {
				strcat_float( strbuf, nttf[q].h1 ) ;
				strcat_float( strbuf, nttf[q].h2 ) ;
				strcat_float( strbuf, nttf[q].h3 ) ;
			} else {
				strcat( strbuf, GetMinutePrice( q, nttf[q].h1, nttf[q].h2, nttf[q].h3, time, 0, 0 ) ) ;
			}
			break ;
		}
	}
	/* 離島特例チェック。離島特例の場合には、特例適用されないディジタルの料金も表示 */
	*strbuf2 = 0 ;
	if ( sn != s ) {
		strcat( strbuf, g_szNames[ NAME_TUWA ] ) ;
		for ( q = 0 ; ; q ++ ) {
			if ( (nttf[q].f == -1) || (nttf[q].f >= s) ) {
				strcpy( strbuf2, g_szNames[ NAME_NTT ] ) ;
				stralign( strbuf2, g_dwAlignCol ) ;
				if ( time == 0 ) {
					strcat_float( strbuf2, nttf[q].h1 ) ;
					strcat_float( strbuf2, nttf[q].h2 ) ;
					strcat_float( strbuf2, nttf[q].h3 ) ;
				} else {
					strcat( strbuf2, GetMinutePrice( q, nttf[q].h1, nttf[q].h2, nttf[q].h3, time, 0, 0 ) ) ;
				}
				strcat( strbuf2, g_szNames[ NAME_DIGITAL ] ) ;
				break ;
			}
		}
	}
	strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
	if ( *strbuf2 ) {
		strcpy( g_szResult[ g_dwNumResult ++ ], strbuf2 ) ;
	}

	/* 日本テレコム料金表示（離島特例あり） */
	for ( q = 0 ; ; q ++ ) {
		if ( (jtf[q].f == -1) || (jtf[q].f >= sn) ) {
			strcpy( strbuf, g_szNames[ NAME_TELECOM ] ) ;
			stralign( strbuf, g_dwAlignCol ) ;
			if ( time == 0 ) {
				strcat_float( strbuf, jtf[q].h1 ) ;
				strcat_float( strbuf, jtf[q].h2 ) ;
				strcat_float( strbuf, jtf[q].h3 ) ;
			} else {
				strcat( strbuf, GetMinutePrice( q, jtf[q].h1, jtf[q].h2, jtf[q].h3, time, 0, 0 ) ) ;
			}
			strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
			break ;
		}
	}

	/* ＤＤＩ料金表示（離島特例あり） */
	for ( q = 0 ; ; q ++ ) {
		if ( (ddif[q].f == -1) || (ddif[q].f >= sn) ) {
			strcpy( strbuf, g_szNames[ NAME_DDI ] ) ;
			stralign( strbuf, g_dwAlignCol ) ;
			if ( time == 0 ) {
				strcat_float( strbuf, ddif[q].h1 ) ;
				strcat_float( strbuf, ddif[q].h2 ) ;
				strcat_float( strbuf, ddif[q].h3 ) ;
			} else {
				strcat( strbuf, GetMinutePrice( q, ddif[q].h1, ddif[q].h2, ddif[q].h3, time, 0, 0 ) ) ;
			}
			strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
			break ;
		}
	}

	/* テレウェイ料金表示（離島特例あり） */
	for ( q = 0 ; ; q ++ ) {
		if ( (twjf[q].f == -1) || (twjf[q].f >= sn) ) {
			strcpy( strbuf, g_szNames[ NAME_TELEWAY ] ) ;
			stralign( strbuf, g_dwAlignCol ) ;
			if ( time == 0 ) {
				strcat_float( strbuf, twjf[q].h1 ) ;
				strcat_float( strbuf, twjf[q].h2 ) ;
				strcat_float( strbuf, twjf[q].h3 ) ;
			} else {
				strcat( strbuf, GetMinutePrice( q, twjf[q].h1, twjf[q].h2, twjf[q].h3, time, 0, 0 ) ) ;
			}
			strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
			break ;
		}
	}

	/* 発信地の地域の電力系会社を算出 */
	q = (int) ((a % 1000) / 100) ;
	/* 発信地が東京電力エリアの場合だけ東京電話料金を表示 */
	if ( q == 3 ) {
		for ( q = 0 ; ; q ++ ) {
			if ( (ttnetf[q].f == -1) || (ttnetf[q].f >= sn) ) {
				strcpy( strbuf, g_szNames[ NAME_TTNET ] ) ;
				stralign( strbuf, g_dwAlignCol ) ;
				if ( time == 0 ) {
					strcat_float( strbuf, ttnetf[q].h1 ) ;
					strcat_float( strbuf, ttnetf[q].h2 ) ;
					strcat_float( strbuf, ttnetf[q].h3 ) ;
					/* 隣接〜20km料金帯であったら単位課金7.2円、それ以外で9円と表示 */
					if ( ttnetf[q].f == 20 ) {
						strcat( strbuf, "(7.2円で話せる秒数但し1課金単位通話は9円)" ) ;
					} else {
						strcat( strbuf, "(9円で話せる秒数)" ) ;
					}
				} else if ( ttnetf[q].f == 20 ) {
					strcat( strbuf, GetMinutePrice( q, ttnetf[q].h1, ttnetf[q].h2, ttnetf[q].h3, time, 2, 0 ) ) ;
				} else {
					strcat( strbuf, GetMinutePrice( q, ttnetf[q].h1, ttnetf[q].h2, ttnetf[q].h3, time, 1, 0 ) ) ;
				}
				strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
				break ;
			}
		}
	}

	/* ＫＤＤ料金表示（沖縄絡みの場合のみ離島特例あり） */
	/* まず発信地・着信地が沖縄かどうかをチェック */
	if ( ((int) ((a % 1000) / 100) == 0) || ((int) ((b % 1000) / 100) == 0) ) {
		for ( q = 0 ; ; q ++ ) {
			if ( (kddf[q].f == -1) || (kddf[q].f >= sn ) ) {
				strcpy( strbuf, g_szNames[ NAME_KDD ] ) ;
				stralign( strbuf, g_dwAlignCol ) ;
				if ( time == 0 ) {
					strcat_float( strbuf, kddf[q].h1 ) ;
					strcat_float( strbuf, kddf[q].h2 ) ;
					strcat_float( strbuf, kddf[q].h3 ) ;
					strcat( strbuf, "(6秒間の料金)" ) ;
				} else {
					strcat( strbuf, GetMinutePrice( q, kddf[q].h1, kddf[q].h2, kddf[q].h3, time, 3, 0 ) ) ;
				}
				break ;
			}
		}
	} else {
		for ( q = 0 ; ; q ++ ) {
			if((kddf[q].f==-1)||(kddf[q].f>=s)) {
				strcpy( strbuf, g_szNames[ NAME_KDD ] ) ;
				stralign( strbuf, g_dwAlignCol ) ;
				if ( time == 0 ) {
					strcat_float( strbuf, kddf[q].h1 ) ;
					strcat_float( strbuf, kddf[q].h2 ) ;
					strcat_float( strbuf, kddf[q].h3 ) ;
					strcat( strbuf, "(6秒間の料金)" ) ;
				} else {
					strcat( strbuf, GetMinutePrice( q, kddf[q].h1, kddf[q].h2, kddf[q].h3, time, 3, 0 ) ) ;
				}
				break ;
			}
		}
	}
	strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
	strcpy( g_szResult[ g_dwNumResult ++ ], "" ) ;

	/* パーソナル料金表示 */
	for ( q = 0 ; ; q ++ ) {
		if ( (nttpf[q].f == -1) || (nttpf[q].f >= sn ) ) {
			strcpy( strbuf, g_szNames[ NAME_NTTP ] ) ;
			strcat( strbuf, nttp[(int) (a / 1000)] ) ;
			stralign( strbuf, g_dwAlignCol ) ;
			if ( time == 0 ) {
				strcat_float( strbuf, nttpf[q].h1 ) ;
				strcat_float( strbuf, nttpf[q].h2 ) ;
				strcat_float( strbuf, nttpf[q].h3 ) ;
				strcat( strbuf, "(PHS・接続料10円" ) ;
			} else {
				strcat( strbuf, GetMinutePrice( q, nttpf[q].h1, nttpf[q].h2, nttpf[q].h3, time, 0, 10 ) ) ;
				strcat( strbuf, "(PHS" ) ;
			}
			break ;
		}
	}
	/* 着信地の地域のアステル算出 */
	q = (int) ((b % 1000) / 100) ;
	/* 着信地が独自網アステルの場合、接続料が割高になるのを警告 */
	if ( (q == 1 || q == 2 || q == 4 || q == 5 || q == 8) && time == 0 ) {
		strcat( strbuf, g_szNames[ NAME_ASTEL ] ) ;
		strcat( strbuf, astel[q] ) ;
		strcat( strbuf, "へは30円)" ) ;
	} else if ( (q == 1 || q == 2 || q == 4 || q == 5 || q == 8) && time != 0 ) {
		strcat( strbuf, g_szNames[ NAME_ASTEL ] ) ;
		strcat( strbuf, astel[q] ) ;
		strcat( strbuf, "へは20円増し)" ) ;
	} else {
		strcat( strbuf, ")") ;
	}
	strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;

	/* ポケット料金表示 */
	for ( q = 0 ; ; q ++ ) {
		if ( (ddipf[q].f == -1) || (ddipf[q].f >= sn) ) {
			strcpy( strbuf2, ddip[(int) (a / 1000)] ) ;
			strcat( strbuf2, g_szNames[ NAME_DDIP ] ) ;
			stralign( strbuf2, g_dwAlignCol ) ;
			strcpy( strbuf, strbuf2 ) ;
			if ( time == 0 ) {
				strcat_float( strbuf, ddipf[q].h1 ) ;
				strcat_float( strbuf, ddipf[q].h2 ) ;
				strcat_float( strbuf, ddipf[q].h3 ) ;
				strcat( strbuf, "(PHS・接続料10円" ) ;
			} else {
				strcat( strbuf, GetMinutePrice( q, ddipf[q].h1, ddipf[q].h2, ddipf[q].h3, time, 0, 10 ) ) ;
				strcat( strbuf, "(PHS" ) ;
			}
			break ;
		}
	}
	/* 着信地の地域のアステル算出 */
	q = (int) ((b % 1000) / 100) ;
	/* 着信地が独自網アステルの場合、接続料が割高になるのを警告 */
	if ( (q == 1 || q == 2 || q == 4 || q == 5 || q == 8) && time == 0 ) {
		strcat( strbuf, g_szNames[ NAME_ASTEL ] ) ;
		strcat( strbuf, astel[q] ) ;
		strcat( strbuf, "へは30円)" ) ;
	} else if ( (q == 1 || q == 2 || q == 4 || q == 5 || q == 8) && time != 0 ) {
		strcat( strbuf, "・" ) ;
		strcat( strbuf, g_szNames[ NAME_ASTEL ] ) ;
		strcat( strbuf, astel[q] ) ;
		strcat( strbuf, "へは20円増し)" ) ;
	} else {
		strcat( strbuf, ")" ) ;
	}
	strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;

	/* 依存網アステル料金表示 */
	for ( q = 0 ; ; q ++ ) {
		if ( (astel1f[q].f == -1) || (astel1f[q].f >= sn ) ) {
			strcpy( strbuf, g_szNames[ NAME_ASTEL ] ) ;
			strcat( strbuf, astel[(int) ((a % 1000) / 100)] ) ;
			stralign( strbuf, g_dwAlignCol ) ;
			if ( time == 0 ) {
				strcat_float( strbuf, astel1f[q].h1 ) ;
				strcat_float( strbuf, astel1f[q].h2 ) ;
				strcat_float( strbuf, astel1f[q].h3 ) ;
				strcat( strbuf, "(PHS・接続料10円・依存網)" ) ;
			} else {
				strcat( strbuf, GetMinutePrice( q, astel1f[q].h1, astel1f[q].h2, astel1f[q].h3, time, 0, 10 ) ) ;
				strcat( strbuf, "(PHS・依存網)" ) ;
			}
			strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
			break ;
		}
	}

	/* 発信地の地域のアステルを算出 */
	q = (int) ((a % 1000) / 100) ;
	/* 発信地・着信地とも同一アステルエリアで、かつ独自網の場合だけ独自網アステル料金表示 */
	if ( ((q == 1) || (q == 2) || (q == 4) || (q == 8)) && (q == (int) ((b % 1000) / 100)) ) {
		switch ( q ) {
		case 1:		astel2f = astel21f ;	break ;
		case 2:		astel2f = astel22f ;	break ;
		case 4:		astel2f = astel24f ;	break ;
		case 5:		astel2f = astel25f ;	break ;
		case 8:		astel2f = astel28f ;	break ;
		}
		if ( (time > 0 && time <= 10) && (((int) ((a % 1000) / 100)) != 4) ) {
			strcpy( strbuf, g_szNames[ NAME_ASTEL ] ) ;
			strcat( strbuf, astel[(int) ((a % 1000) / 100)] ) ;
			stralign( strbuf, g_dwAlignCol ) ;
			strcat_dword( strbuf, 10 ) ;
			strcat_dword( strbuf, 10 ) ;
			strcat_dword( strbuf, 10 ) ;
			strcat( strbuf, "(PHS・独自網)" ) ;
			strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
		} else {
			for ( q = 0 ; ; q ++ ) {
				if ( (astel2f[q].f == -1) || (astel2f[q].f >= sn) ) {
					strcpy( strbuf, g_szNames[ NAME_ASTEL ] ) ;
					strcat( strbuf, astel[(int) ((a % 1000) / 100)] ) ;
					stralign( strbuf, g_dwAlignCol ) ;
					if ( time == 0 ) {
						strcat_float( strbuf, astel2f[q].h1 ) ;
						strcat_float( strbuf, astel2f[q].h2 ) ;
						strcat_float( strbuf, astel2f[q].h3 ) ;
						strcat( strbuf, "(PHS・接続料10円・独自網)" ) ;
					} else {
						strcat( strbuf, GetMinutePrice( q, astel2f[q].h1, astel2f[q].h2, astel2f[q].h3, time, 0, 10 ) ) ;
						strcat( strbuf, "(PHS・独自網)" ) ;
					}
					strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
					break ;
				}
			}
		}
	}

	/* ＮＴＴ公衆電話料金表示 */
	for ( q = 0 ; ; q ++ ) {
		if ( (nttb[q].f == -1) || (nttb[q].f >= sn) ) {
			strcpy( strbuf, g_szNames[ NAME_NTTEX ] ) ;
			stralign( strbuf, g_dwAlignCol ) ;
			if ( time == 0 ) {
				strcat_float( strbuf, nttb[q].h1 ) ;
				strcat_float( strbuf, nttb[q].h2 ) ;
				strcat_float( strbuf, nttb[q].h3 ) ;
			} else {
				strcat( strbuf, GetMinutePrice( q, nttb[q].h1, nttb[q].h2, nttb[q].h3, time, 0, 0 ) ) ;
			}
			strcat( strbuf, "(内税" ) ;
			break ;
		}
	}
	/* 離島特例チェック。離島特例の場合には、特例適用されないディジタルの料金も表示 */
	if ( sn != s ) {
		strcat( strbuf, "・通話)" ) ;
		strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
		for ( q = 0 ; ; q ++ ) {
			if ( (nttb[q].f == -1) || (nttb[q].f >= s) ) {
				strcpy( strbuf, g_szNames[ NAME_NTTEX ] ) ;
				stralign( strbuf, g_dwAlignCol ) ;
				if ( time == 0 ) {
					strcat_float( strbuf, nttb[q].h1 ) ;
					strcat_float( strbuf, nttb[q].h2 ) ;
					strcat_float( strbuf, nttb[q].h3 ) ;
				} else {
					strcat( strbuf, GetMinutePrice( q, nttb[q].h1, nttb[q].h2, nttb[q].h3, time, 0, 0 ) ) ;
				}
				strcat( strbuf, "(内税・ディジタル)" ) ;
				strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
				break ;
			}
		}
	} else {
		strcat( strbuf, ")" ) ;
		strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
	}

	/* えきでんくん料金表示（離島特例あり） */
	for ( q = 0 ; ; q ++ ) {
		if ( (jtb[q].f == -1) || (jtb[q].f >= sn) ) {
			strcpy( strbuf, g_szNames[ NAME_EKIDEN ] ) ;
			stralign( strbuf, g_dwAlignCol ) ;
			if ( time == 0 ) {
				strcat_float( strbuf, jtb[q].h1 ) ;
				strcat_float( strbuf, jtb[q].h2 ) ;
				strcat_float( strbuf, jtb[q].h3 ) ;
			} else {
				strcat( strbuf, GetMinutePrice( q, jtb[q].h1, jtb[q].h2, jtb[q].h3, time, 0, 0 ) ) ;
			}
			strcat( strbuf, "(内税)" ) ;
			strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
			break;
		}
	}

	/* 0070公衆電話料金表示（離島特例あり） */
	for ( q = 0 ; ; q ++ ) {
		if ( (twjb[q].f == -1) || (twjb[q].f >= sn) ) {
			strcpy( strbuf, g_szNames[ NAME_0070EX ] ) ;
			stralign( strbuf, g_dwAlignCol ) ;
			if ( time == 0 ) {
				strcat_float( strbuf, twjb[q].h1 ) ;
				strcat_float( strbuf, twjb[q].h2 ) ;
				strcat_float( strbuf, twjb[q].h3 ) ;
			} else {
				strcat( strbuf, GetMinutePrice( q, twjb[q].h1, twjb[q].h2, twjb[q].h3, time, 0, 0 ) ) ;
			}
			strcat( strbuf, "(内税)" ) ;
			strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
			break;
		}
	}

	/*ＫＤＤ公衆電話料金表示（沖縄絡みの場合のみ離島特例あり）*/
	/*まず発信地・着信地が沖縄かどうかをチェック*/
	if ( ( (int) ((a % 1000) / 100) == 0) || ((int) ((b % 1000) / 100) == 0) ) {
		for ( q = 0 ; ; q ++ ) {
			if ( (kddb[q].f == -1) || (kddb[q].f >= sn) ) {
				strcpy( strbuf, g_szNames[ NAME_KDDEX ] ) ;
				stralign( strbuf, g_dwAlignCol ) ;
				if ( time == 0 ) {
					strcat_float( strbuf, kddb[q].h1 ) ;
					strcat_float( strbuf, kddb[q].h2 ) ;
					strcat_float( strbuf, kddb[q].h3 ) ;
				} else {
					strcat( strbuf, GetMinutePrice( q, kddb[q].h1, kddb[q].h2, kddb[q].h3, time, 0, 0 ) ) ;
				}
				strcat( strbuf, "(内税)" ) ;
				strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
				break;
			}
		}
	} else {
		for ( q = 0 ; ; q ++ ) {
			if ( (kddb[q].f == -1) || (kddb[q].f >= s ) ) {
				strcpy( strbuf, g_szNames[ NAME_KDDEX ] ) ;
				stralign( strbuf, g_dwAlignCol ) ;
				if ( time == 0 ) {
					strcat_float( strbuf, kddb[q].h1 ) ;
					strcat_float( strbuf, kddb[q].h2 ) ;
					strcat_float( strbuf, kddb[q].h3 ) ;
				} else {
					strcat( strbuf, GetMinutePrice( q, kddb[q].h1, kddb[q].h2, kddb[q].h3, time, 0, 0 ) ) ;
				}
				strcat( strbuf, "(内税)" ) ;
				strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
				break;
			}
		}
	}

	/*ＮＴＴ公衆電話→ＰＨＳ料金表示*/
	for ( q = 0 ; ; q ++ ) {
		if ( (phsb[q].f == -1) || (phsb[q].f >= sn) ) {
			strcpy( strbuf, g_szNames[ NAME_EX2PHS ] ) ;
			stralign( strbuf, g_dwAlignCol ) ;
			if ( time == 0 ) {
				strcat_float( strbuf, phsb[q].h1 ) ;
				strcat_float( strbuf, phsb[q].h2 ) ;
				strcat_float( strbuf, phsb[q].h3 ) ;
			} else {
				strcat( strbuf, GetMinutePrice( q, phsb[q].h1, phsb[q].h2, phsb[q].h3, time, 0, 0 ) ) ;
			}
			strcat( strbuf, "(内税)" ) ;
			strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
			break;
		}
	}
	strcpy( g_szResult[ g_dwNumResult ++ ], "" ) ;

	strcpy( strbuf, "＊" ) ;
	strcat( strbuf, g_szNames[ NAME_NTTP ] ) ;
	strcat( strbuf, nttp[(int)(a / 1000)] ) ;
	if ( ((int) ((a % 1000) / 100) ) == 4 ) {
		strcat( strbuf, "から依存網ＰＨＳへの通話は10秒まで10円です" ) ;
	} else {
		strcat( strbuf, "・アステル" ) ;
		strcat( strbuf, astel[(int)((a % 1000) / 100)] ) ;
		strcat( strbuf, "からＰＨＳへの通話は10秒まで10円です。" ) ;
	}
	strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;

	strcpy( strbuf, "＊" ) ;
	strcat( strbuf, ddip[(int)(a / 1000)] ) ;
	strcat( strbuf, g_szNames[ NAME_DDIP ] ) ;
	strcat( strbuf, "からＮＴＴ一般加入・依存網ＰＨＳへの通話は10秒まで10円です。" ) ;
	strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
}

void
calc_main( long time, int a, int b )
{
	int		s, sn ;
	CHAR	strbuf[ 256 ] ;

	g_dwNumResult = 0 ;
	/* s:実際の距離、sn:離島特例を適用したときの距離。0:同一、1:隣接、2〜:区域外 */
	s = (int) hypot2( d[a].x - d[b].x, d[a].y - d[b].y ) ;
	if ( chkrinsetsu( d[a].k, d[b].k, 1) == 1 ) {
		/* 20km以上隣接を検索し、隣接としてチェック */
		s = 1 ;
	} else if ( (s > 0) && (s <= 20) && (xchkrinsetsu( d[a].k, d[b].k, 1 ) == 0) ) {
		/* 20km以内隣接を隣接としてチェック */
		s = 1 ;
	}
	sn = s ;
	/* 離島特例をチェック */
	if ( chkrinsetsu( d[a].k, d[b].k, 0 ) == 1 ) {
		sn = 1 ;
	}
	/* 沖縄→沖縄以外の離島特例処理（大根占→通話先で計算） */
	if ( ((int) (( d[a].m % 1000 ) / 100 ) == 0) && ((int) (( d[b].m % 1000 ) / 100 ) != 0) ) {
		sn = (int) hypot2( d[b].x - 206, d[b].y - 129 ) ;
	}
	/* 沖縄以外→沖縄の離島特例処理（→大根占で計算） */
	if ( ((int) (( d[b].m % 1000 ) / 100 ) == 0) && ((int) (( d[a].m % 1000 ) / 100 ) != 0) ) {
		sn = (int) hypot2( d[a].x - 206, d[a].y - 129 ) ;
	}
	/* 沖縄→沖縄の離島特例処理（隣接料金なので20km扱いに） */
	if ( ((int) (( d[b].m % 1000 ) / 100 ) == 0) && ((int) (( d[a].m % 1000 ) / 100 ) == 0) && (s > 0)
		&& (!(( strcmp( d[a].k, "那覇" ) == 0 && strcmp( d[b].k, "名護" ) == 0) || ( strcmp( d[b].k, "那覇" ) == 0 && strcmp( d[a].k, "名護" ) == 0 ) ) ) ) {
		sn = 1 ;
	}
	/* 沖縄←→大根占は隣接料金 */
	if ( (sn == 0) && (s > 0) ) {
		sn = 1 ;
	}
	/* 特例計算した方が距離が長くなる場合は特例計算しない */
	if ( sn > s ) {
		sn = s ;
	}
	/* 距離の計算ここまで */

	/* 表示部分 */
	strcpy( strbuf, d[a].k ) ;
	strcat( strbuf, "→" ) ;
	strcat( strbuf, d[b].k ) ;
	if ( s > 1 ) {
		/* 区域外の場合 */
		strcat( strbuf, "は区域外(" ) ;
		strcat_num( strbuf, s ) ;
		strcat( strbuf, "km)です" ) ;
		/* 区域外、20km以内の場合はエリアプラス適用可と表示 */
		if ( s <= 20 ) {
			strcat( strbuf, "※エリアプラス適用可" ) ;
		}
		strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
	} else if ( s == 1 ) {
		/* 隣接の場合 */
		strcat( strbuf, "は隣接区域内です" ) ;
		strcat( strbuf, "※エリアプラス適用可" ) ;
		strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
	} else if ( s == 0 ) {
		/* 区域内の場合 */
		strcat( strbuf, "は同一区域内です。" ) ;
		strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
	}
	/* 離島特例が絡んだ場合 */
	if ( (sn < s) && (sn > 1) ) {
		/* 沖縄←→本土の離島特例 */
		strcpy( strbuf, "ただし離島特例で区域外(" ) ;
		strcat_num( strbuf, sn ) ;
		strcat( strbuf, "km)で計算します" ) ;
		if ( sn <= 20 ) {
			/* 区域外、20km以内の場合はエリアプラス適用可と表示 */
			strcat( strbuf, "※エリアプラス適用可" ) ;
		}
		strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
	} else if ( (sn < s) && (sn == 1) ) {
		/* その他の離島特例 */
		strcpy( strbuf, "ただし離島特例で隣接区域で計算します。※エリアプラス適用可" ) ;
		strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
	}
	ryokin( time, s, sn, d[a].m, d[b].m ) ;
}

//------------------------------------------
/*隣接〜20km一覧関数*/
//------------------------------------------
BOOL
areaplus( int a )
{
	int		b, l, s ;
	char	strbuf[256] = "" ;
	LPCSTR	n, n1, n2 ;

	if ( a < 0 ) {
		return FALSE ;
	}
	g_dwNumResult = 0 ;

	strcpy( g_szResult[ g_dwNumResult ++ ], "　　　隣接〜20km一覧" ) ;

	*strbuf = 0 ;
	/* 20km以内のＭＡを一覧 */
	for ( b = 0 ; b < MAX ; b ++ ) {
		s = (int) hypot2( d[a].x - d[b].x, d[a].y - d[b].y ) ;
		if ( s <= 20 && s ) {
			if ( strcmp( d[b].k, d[b-1].k ) ) {
				strcpy( strbuf, d[b].k ) ;
				stralign( strbuf, 10 ) ;
				strcat( strbuf, "(" ) ;
			} else {
				strcat( strbuf, "・" ) ;
			}
			strcat( strbuf, "0" ) ;
			strcat_num( strbuf, d[b].s ) ;
			if ( (b == MAX - 1) || strcmp( d[b].k, d[b+1].k ) ) {
				strcat( strbuf, ")" ) ;
				strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
			}
		}
	}

	/* 20km以上で隣接のＭＡを一覧 */
	for ( s = 0 ; s < RMAX ; s ++ ) {
		n1 = rinsetsu[s].n1 ;
		n2 = rinsetsu[s].n2 ;
		if ( !strcmp( d[a].k, n2 ) ) {
			n  = n2 ;
			n2 = n1 ;
			n1 = n ;
		}
		if ( !strcmp( d[a].k, n1 ) ) {
			strcpy( strbuf, n2 ) ;
			stralign( strbuf, 10 ) ;
			strcat( strbuf, "(" ) ;
			for ( b = 0 ; ; b ++ ) {
				if ( !strcmp( d[b].k, n2 ) ) {
					strcat( strbuf, "0" ) ;
					strcat_num( strbuf, d[b].s ) ;
					break ;
				}
			}
			while ( 1 ) {
				b ++ ;
				if ( b == MAX ) {
					strcat( strbuf, ")" ) ;
					strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
					break ;
				}
				if ( !strcmp( d[b].k, n2 ) ) {
					strcat( strbuf, "・0" ) ;
					strcat_num( strbuf, d[b].s ) ;
				} else {
					strcat( strbuf, ")" ) ;
					strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
					break ;
				}
			}
		}
	}

	/*離島特例ＭＡを一覧*/
	for ( s = 0, l = 0 ; s < RTMAX ; s ++ ) {
		n1 = rito[s].n1 ;
		n2 = rito[s].n2 ;
		if ( !strcmp( d[a].k, n2 ) ) {
			n  = n2 ;
			n2 = n1 ;
			n1 = n ;
		}
		if ( !strcmp( d[a].k, n1 ) ) {
			if ( !l ) {
				strcpy( g_szResult[ g_dwNumResult ++ ], "" ) ;
				strcpy( g_szResult[ g_dwNumResult ++ ], "　　　離島特例対象ＭＡ" ) ;
				l ++ ;
			}
			strcpy( strbuf, n2 ) ;
			stralign( strbuf, 10 ) ;
			strcat( strbuf, "(" ) ;
			for ( b = 0 ; ; b ++ ) {
				if ( !strcmp( d[b].k, n2 ) ) {
					strcat( strbuf, "0" ) ;
					strcat_num( strbuf, d[b].s ) ;
					break ;
				}
			}
			while ( 1 ) {
				b ++ ;
				if ( b == MAX ) {
					strcat( strbuf, ")" ) ;
					strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
					break ;
				}
				if ( !strcmp( d[b].k, n2 ) ) {
					strcat( strbuf, "・0" ) ;
					strcat_num( strbuf, d[b].s ) ;
				} else {
					strcat( strbuf, ")" ) ;
					strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
					break ;
				}
			}
		}
	}

	/* 発信元が大根占か沖縄のとき、沖縄・大根占の全ＭＡを表示 */
	if ( !strcmp( d[a].k, "大根占" ) || ((int) ((d[a].m % 1000) / 100) == 0) ) {
		if ( !l ) {
			strcpy( g_szResult[ g_dwNumResult ++ ], "　　　離島特例対象ＭＡ" ) ;
			l ++ ;
		}
		for ( b = 0 ; b < MAX ; b ++ ) {
			if ( (!strcmp(d[b].k, "大根占") || ((int) ((d[b].m % 1000) / 100) == 0)) && strcmp( d[a].k, d[b].k ) ) {
				if ( strcmp( d[b].k, d[b-1].k ) ) {
					strcpy( strbuf, d[b].k ) ;
					stralign( strbuf, 10 ) ;
					strcat( strbuf, "(" ) ;
				} else {
					strcat( strbuf, "・" ) ;
				}
				strcat( strbuf, "0" ) ;
				strcat_num( strbuf, d[b].s ) ;
				if ( b == MAX - 1 ) {
					strcat( strbuf, ")" ) ;
					strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
				} else if (strcmp(d[b].k,d[b+1].k)!=0) {
					strcat( strbuf, ")" ) ;
					strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
				}
			}
		}
	}

	/*発信元が沖縄のとき、大根占の隣接ＭＡを表示*/
	if ( (int) ((d[a].m % 1000) / 100) == 0 ) {
		for ( b = 0 ; b < MAX ; b ++ ) {
			s = (int) hypot2( 206-d[b].x, 129-d[b].y ) ;
			if ( (s <= 20) && s ) {
				if ( strcmp( d[b].k, d[b-1].k ) ) {
					strcpy( strbuf, d[b].k ) ;
					stralign( strbuf, 10 ) ;
					strcat( strbuf, "(" ) ;
				} else {
					strcat( strbuf, "・" ) ;
				}
				strcat( strbuf, "0" ) ;
				strcat_num( strbuf, d[b].s ) ;
				if ( b == MAX - 1 || strcmp( d[b].k, d[b+1].k ) ) {
					strcat( strbuf, ")" ) ;
					strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
				}
			}
		}
	}

	/*発信元が大根占の隣接区域のとき、沖縄のＭＡを表示*/
	s = (int) hypot2( 206-d[a].x, 129-d[a].y ) ;
	if ( s <= 20 && s ) {
		if ( !l ) {
			strcpy( g_szResult[ g_dwNumResult ++ ], "" ) ;
			strcpy( g_szResult[ g_dwNumResult ++ ], "　　　離島特例対象ＭＡ" ) ;
			l ++ ;
		}
		for ( b = 0 ; b < MAX ; b ++ ) {
			if ( (int) ((d[b].m % 1000) / 100) == 0 ) {
				if ( strcmp( d[b].k, d[b-1].k ) ) {
					strcpy( strbuf, d[b].k ) ;
					stralign( strbuf, 10 ) ;
					strcat( strbuf, "(" ) ;
				} else {
					strcat( strbuf, "・" ) ;
				}
				strcat( strbuf, "0" ) ;
				strcat_num( strbuf, d[b].s ) ;
				if ( b== MAX - 1 || strcmp( d[b].k, d[b+1].k ) ) {
					strcat( strbuf, ")" ) ;
					strcpy( g_szResult[ g_dwNumResult ++ ], strbuf ) ;
				}
			}
		}
	}

	return g_dwNumResult != 0 ;
}

void
set_view_mode( BOOL bNarrow )
{
	if ( bNarrow ) {
		g_szNames    = g_szNarrowNames ;
		g_dwAlignCol = g_dwNarrowAlignCol ;
	} else {
		g_szNames    = g_szWideNames ;
		g_dwAlignCol = g_dwWideAlignCol ;
	}
}
