#include <stdio.h>
#include <ctype.h>
#include <memory.h>
#include <dos.h>
#include <string.h>
#include <math.h>
#include <malloc.h>

#define DEG_RAD 0.01745329251				/* converts degrees to radians */
#define DEG_KM 0.009009						/* converts degrees to km */
#define MAX_NUM 1000
#define PAUSE printf("HIT ANY KEY TO CONTINUE.\n");getch()
#define SCREEN_WIDTH 160
#define EQLIST 0x410
#define MEMSIZ 0x413
#define NAME_SIZE 100
#define S_SIZE 40
#define F_SIZE 20
#define T_SIZE 15
#define NUMLIST 7
#define MAX_BUFF 32768
#define NUMDAT 50
#define NUM_MAP_FILES 31

#define BLACK 0
#define BACKGROUND 241
#define D_GREY 242 
#define M_GREY 243
#define L_GREY 244
#define WHITE 245
#define RED 246
#define ORANGE 247
#define YELLOW 248
#define GREEN 249
#define CYAN 250
#define BLUE 251
#define MAGENTA 252
#define BROWN 253
#define D_CYAN 254
#define D_BLUE 255

extern int LastN;
int Rxc,Ryc,Repeat;
int LastMap=0;
char MapName[20];
struct   Color 
{ 
	unsigned char  r, g, b; 
};
extern struct Color lut[256];
extern char VideoType;
float Lat0,Lon0,LatN,LonX,Deg_Pix,CosLat,PixSize,DelLat,DelLon;
float MFll[5],DelParm[5]={0.0,10.0,10.0,10.0,30.0};
int Bxc,Byc,Bxs,Bys,Hits;
struct map_input
{
	char name[100];
	float max,min;
	int color;
};
struct help
{
	int lines;
	char *text[4];
}Help[6]=
{
	{3,
		"'Enter' to move DOWN",
		"'Backspace' to move UP",
		"'Esc' to EXIT   'C' to count hits"
	},
	{4,
		"box shows Lat/Lon range; arrows to move box",
		"'+' faster,'-' slower,(s)maller or (l)arger",
		"(S)horter,(H)igher,(N)arrower or (W)ider",
		"(Z)oom, (R)eset,"
	},
	{3,
		"<-- --> to position",
		"up/down arrow to change",
		"+ = faster  - = slower"
	},
	{4,
		"<-- --> to position",
		"up/down arrow to change",
		"+ = faster  - = slower"
	},
	{3,
		"arrows to position",
		"'*' to select",
		"",
		"RED is ON"
	},
	{3,
		"<-- --> to position",
		"'*' to select",
		"",
		"RED is ON"
	}
};
struct hdr_hdr
{
	float maxlat,minlat,maxlon,minlon;
	float maxwd,minwd,maxid,minid,maxih,minih;
	long freq[33];
	long mintime,maxtime;
	long numfiles;
}Hhdr;
struct short_hdr
{
	char name[12];
	float lat,lon;								/* degrees */
	float w_depth,i_depth,i_height;		/* meters */
	float ob_freq;								/* obs/hr */
	long start,stop;							/* 85012 = 1985, j-day 12 */
	unsigned char parm[10];
}Shdr;
FILE *FpHdr;
struct data_type
{
	int num_name;
	char *name[6];
};
extern struct data_type DType[NUMDAT];
struct month
{
	char name[12],id3[4],id2[3];
	int days[2];
}d[13]=
{
	{"error","xxx","xx",0,0},
	{"January","Jan","JA",31,31},		{"February","Feb","FB",28,29},
	{"March","Mar","MR",31,31},		{"April","Apr","AP",30,30},
	{"May","May","MY",31,31},			{"June","Jun","JN",30,30},
	{"July","Jul","JL",31,31},			{"August","Aug","AG",31,31},
	{"September","Sep","SP",30,30},	{"October","Oct","OC",31,31},
	{"November","Nov","NV",30,30},	{"December","Dec","DC",31,31}
};
int day_tab[2][13]=
{
	{ 0,31,28,31,30,31,30,31,31,30,31,30,31},
	{ 0,31,29,31,30,31,30,31,31,30,31,30,31},
};
extern int Font[128][25];
extern int ScreenXs,ScreenYs;
int Monitor;
struct equipment
{
	int printers; 		/* number present */
	int sprinter;		/* serial printer installed?  0=no  1=yes */
	int game;			/* game adapter installed? */
	int sports;			/* number of serial ports */
	int dma;				/* DMA chip installed? */
	int drives;			/* number of disk drives */
	int video;			/* video mode 1=40 color 2=80 color 3=80 B/W */
	int disk;			/* any disk drives? */
	int memory;			/* memory size in Kbytes */
}Eq;
extern int Red,Green,Orange,Yellow,Green,Cyan,Blue,Magenta;
extern int Black,White,L_Grey,M_Grey,D_Grey,Center;
extern char GF_String[MAX_NUM][S_SIZE];
extern unsigned char Mbuff[MAX_BUFF],Buffer[4096];
unsigned char BBuff[4096];
struct variable
{
	int row,col;
	float value;
	char *format;
};
struct text
{
	int row,col;
	char *txt;
};
unsigned char Parm[2][25];
unsigned char Freq[25];
int Fq[17]={-1,0,1,-1,2,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,4};
struct list
{
	int type,row,lines;
	int numtext;
	struct text txt[5];
	int numvar;
	struct variable var[4];
}List[NUMLIST]=
{
	{
		1,1,4,
		5,
			 1, 1,"Location",
			 2,13,"Max Lat",
			 4,13,"Min Lat",
			 3,23,"Max Lon",
			 3, 2,"Min Lon",
		4,
			 2,21,  90.0000,"%10.4f",
			 4,21, -90.0000,"%10.4f",
			 3,31, 180.0000,"%10.4f",
			 3,10,-180.0000,"%10.4f"
	},
	{
		2,6,2,
		5,
			 6, 1,"Water Depth",
			 7,23,"Max",
			 7,34, "m",
			 7, 9,"Min",
			 7,20,"m",
		2,
			 7,13,        0,"%5.0f",
			 7,27,    99999,"%5.0f",
			 0, 0,   0.0000,"%",
			 0, 0,   0.0000,"%"
	},
	{
		2,9,2,
		5,
			 9, 1,"Instrument Depth",
			10,23,"Max",
			10,34, "m",
			10, 9,"Min",
			10,20,"m",
		2,
			10,13,        0,"%5.0f",
			10,27,    99999,"%5.0f",
			 0, 0,   0.0000,"%",
			 0, 0,   0.0000,"%"
	},
	{
		2,12,2,
		5,
			12, 1,"Instrument Height" ,
			13,23,"Max",
			13,34, "m",
			13, 9,"Min",
			13,20,"m",
		2,
			13,13,        0,"%5.0f",
			13,27,    99999,"%5.0f",
			 0, 0,   0.0000,"%",
			 0, 0,   0.0000,"%"
	},
	{
		3,15,2,
		3,
			15, 1,"Date" ,
			16, 9,"Start",
			16,26,"Stop",
			16, 1,"Any",
			16, 1,"All",
		3,
			16, 1,        1,"%d",
			16,15,    82001,"%9.0f",
			16,31,    88310,"%9.0f",
			 0, 0,   0.0000,"%"
	},
	{
		4,18,3,
		1,
			18, 1,"Parameter (must contain all chosen)" ,
			19,10,"tTCSLAuvuvdsRRvBmpppttnni",
			20,10,"iibBeDTLTEdTtTehtwwwTpRds",
			 0, 0," ",
			 0, 0," ",
		2,
			 0, 0,   0.0000,"%",
			 0, 0,   0.0000,"%",
			 0, 0,   0.0000,"%",
			 0, 0,   0.0000,"%"
	},
	{
		5,22,2,
		1,
			22, 1,"Observations Per Hour (must be one of chosen)" ,
			23,10,"   1   2   4   8  16 Any",
			 0, 0," ",
			 0, 0," ",
			 0, 0," ",
		1,
			 0, 0,   0.0000,"%",
			 0, 0,   0.0000,"%",
			 0, 0,   0.0000,"%",
			 0, 0,   0.0000,"%"
	}
};
unsigned char Bit[8]={1,2,4,8,16,32,64,128};

int tmouse_vertical_range(){};
int tmouse_horizontal_range(){};
int tmouse_information(){};
int tmouse_show_cursor(){};
int tmouse_move_cursor(){};
int tmouse_hide_cursor(){};
FILE *p_open(char *name,char *format);


/***********************************************************************
**
**
**
**
************************************************************************/

int set_range()

{
	int i,j,k,n=-1,m;
	int xc=ScreenXs/2,yc=0,xs=ScreenXs/2,ys=ScreenYs;
	int hxc=0,hyc=ScreenYs-(17*7+3),hxs=xs,hys=17*7+3,hys2=17*4+3;
	char ans,ans2,string[100];
	int back1,text1,box1,var1,high1;
	int back2,text2,box2,var2,high2;
	int back3,text3,box3,var3,high3;
	int numhit,totnum;
	long jday,yr,date;
	float dellat,dellon;
	FILE *fplim;	/* current limits */
	unsigned char *buffer;
	
	LastN=0;
	set_video_on();
	set_lut('D');
	SetVideoMode(0);
	back1=D_Grey;text1=L_Grey;box1=M_Grey;var1=Black;high1=Red;
	back2=M_Grey;text2=Black;box2=L_Grey;var2=Black;high2=Red;
	back3=Black;text3=White;box3=Black;var3=L_Grey;high3=Red;
	reset_range();
	set_video_on();
	set_lut('D');
	paint_box(0,D_Grey,Buffer,xc,yc,xs,ys);
	paint_box(0,D_Grey,Buffer,hxc,hyc,hxs,hys);
	plot_help(0,hxc+3,hyc+3+17*4,WHITE);
		
	load_limits(MapName);
	for(i=0;i<NUMLIST;i++)
	{
		plot_text(i,back1,text1,xc,yc,xs);
		for(j=0;j<List[i].numvar;j++)
			plot_value(i,j,n,box1,var1,xc,yc,high1);
	}
	i=0;
	plot_text(i,back2,text2,xc,yc,xs);
	for(j=0;j<List[i].numvar;j++)
		plot_value(i,j,n,box2,var2,xc,yc,high2);
	paint_box(0,D_Grey,Buffer,hxc,hyc,hxs,hys2);
	plot_map(MapName,0,0,hxs,hyc);
	plot_help(List[i].type,hxc+8,hyc+3,L_GREY);
	plot_box();
	do
	{
		ans=getch();
		if(ans==8||ans==13)
		{
			n=-1;
			plot_text(i,back1,text1,xc,yc,xs);
			for(j=0;j<List[i].numvar;j++)
				plot_value(i,j,n,box1,var1,xc,yc,Red);
			if(ans==13) /* Enter */
				i+=1;
			if(ans==8)		/* Backspace */
				i-=1;
			if(i==NUMLIST)
				i=0;
			if(i<0)
				i=NUMLIST-1;
			plot_text(i,back2,text2,xc,yc,xs);
			for(j=0;j<List[i].numvar;j++)
				plot_value(i,j,n,box2,var2,xc,yc,high2);
			j=n=0;
			if(i==1||i==2||i==3||i==4||i==5||i==6)
				plot_value(i,j,n,box3,var3,xc,yc,high3);
			paint_box(0,D_Grey,Buffer,hxc,hyc,hxs,hys2);
			plot_help(List[i].type,hxc+8,hyc+3,L_GREY);
		}
		if(ans==0)
		{
			ans2=getch();
			if(ans2==24)	/* Alt o */
				output_screen(0,0,ScreenXs,ScreenYs);
			if(ans2==31)	/* Alt s */
			{
				buffer=(unsigned char *)malloc(4700);
				if(buffer!=NULL)
				{
					for(k=0;k<4;k++)
						MFll[k]=0.0;
					get_string(string,buffer,
						"Give","File Name",0,0,100,47,1,1,Font,WHITE);
					for(k=0;k<strlen(string);k++)
						if(string[k]=='.')
							string[k]='\0';
					for(k=0;k<strlen(string);k++)
						if(string[k]==' ')
							string[k]='_';
					strcpy(MapName,string);
					strcat(string,".lim");
					fplim=p_open(string,"wt");
					fprintf(fplim,"%s\n",string);
					fprintf(fplim,"Lat/Lon\n");
					for(k=0;k<4;k++)
						fprintf(fplim,List[0].var[k].format,List[0].var[k].value);
					fprintf(fplim,"\n");
					fprintf(fplim,"water_depth\n");
					for(k=0;k<2;k++)
						fprintf(fplim,List[1].var[k].format,List[1].var[k].value);
					fprintf(fplim,"\n");
					fprintf(fplim,"inst_depth\n");
					for(k=0;k<2;k++)
						fprintf(fplim,List[2].var[k].format,List[2].var[k].value);
					fprintf(fplim,"\n");
					fprintf(fplim,"inst_height\n");
					for(k=0;k<2;k++)
						fprintf(fplim,List[3].var[k].format,List[3].var[k].value);
					fprintf(fplim,"\n");
					fprintf(fplim,"any/all      start         stop\n");
					for(k=0;k<3;k++)
					{
						fprintf(fplim,"    ");
						fprintf(fplim,List[4].var[k].format,List[4].var[k].value);
					}
					fprintf(fplim,"\n");
					fprintf(fplim,"Parameters\n");
					for(j=0;j<2;j++)
					{
						for(k=0;k<25;k++)
							fprintf(fplim," %c",List[5].txt[j+1].txt[k]);
						fprintf(fplim,"\n");
						for(k=0;k<25;k++)
							fprintf(fplim,"%2d",Parm[j][k]);
						fprintf(fplim,"\n");
					}
					fprintf(fplim,"  1  2  4  8 16 Any Observations/hr\n");
					for(k=0;k<6;k++)
						fprintf(fplim,"%3d",Freq[k]);
					fprintf(fplim,"\n");
					plot_map(MapName,0,0,hxs,hyc);
				}
				fclose(fplim);
				free(buffer);
			}
			if(i==0)
			{
				dellat=List[0].var[0].value-List[0].var[1].value;
				dellon=List[0].var[2].value-List[0].var[3].value;
				unplot_box();
				if(ans2==71||ans2==72||ans2==73)
				{
					List[0].var[0].value+=DelLat;
					List[0].var[1].value+=DelLat;
				}
				if(ans2==79||ans2==80||ans2==81)
				{
					List[0].var[0].value-=DelLat;
					List[0].var[1].value-=DelLat;
				}
				if(ans2==71||ans2==75||ans2==79)
				{
					List[0].var[3].value-=DelLon;
					List[0].var[2].value-=DelLon;
				}
				if(ans2==73||ans2==77||ans2==81)
				{
					List[0].var[3].value+=DelLon;
					List[0].var[2].value+=DelLon;
				}
				if(List[0].var[0].value>Lat0)
				{
					List[0].var[0].value=Lat0;
					List[0].var[1].value=Lat0-dellat;
				}
				if(List[0].var[1].value<LatN)
				{
					List[0].var[0].value=LatN+dellat;
					List[0].var[1].value=LatN;
				}
				if(List[0].var[2].value>LonX)
				{
					List[0].var[2].value=LonX;
					List[0].var[3].value=LonX-dellon;
				}
				if(List[0].var[3].value<Lon0)
				{
					List[0].var[2].value=Lon0+dellon;
					List[0].var[3].value=Lon0;
				}
				for(j=0;j<List[i].numvar;j++)
					plot_value(i,j,n,box2,var2,xc,yc,high2);
				plot_box();
			}
			if((i==1||i==2||i==3)&&(ans2==72||ans2==80))	/*	up/down arrow */
			{
				if(ans2==72)
					List[i].var[j].value+=DelParm[i];
				if(ans2==80)
					List[i].var[j].value-=DelParm[i];
				if(List[i].var[0].value>List[i].var[1].value)
					List[i].var[0].value=List[i].var[1].value=
						(List[i].var[0].value+List[i].var[1].value)/2.0;
				plot_value(i,j,n,box3,var3,xc,yc,high3);
			}
			if(i==4&&(ans2==72||ans2==80))	/*	date: up/down arrow */
			{
				if(j>0)
				{
					date=List[i].var[j].value;
					yr=date/1000;
					jday=date%1000;
					if(ans2==72)
						jday+=DelParm[i];
					if(ans2==80)
						jday-=DelParm[i];
					while(jday>365)
					{
						yr+=1;
						jday-=365;
					}
					while(jday<1)
					{
						yr-=1;
						jday+=365;
					}
					date=yr*1000+jday;
					List[i].var[j].value=date;
					if(List[i].var[0].value>List[i].var[1].value)
					{
						m=2;
						if(j==2)
							m=1;
						List[i].var[j].value=List[i].var[m].value;
					}
				}
				else
				{
					if(List[i].var[j].value==1.0)
						List[i].var[j].value=0.0;
					else
						List[i].var[j].value=1.0;
				}
				plot_value(i,j,n,box3,var3,xc,yc,high3);
			}
			if((i==1||i==2||i==3||i==4)&&(ans2==75||ans2==77))	/*	<--  --> */
			{
				plot_value(i,j,n,box2,var2,xc,yc,high2);
				if(ans2==75)
					j-=1;
				if(ans2==77)
					j+=1;
				if(j<0)
					j=List[i].numvar-1;
				if(j>=List[i].numvar)
					j=0;
				plot_value(i,j,n,box3,var3,xc,yc,high3);
			}
			if(i==5&&(ans2==75||ans2==77))	/*	<--  --> */
			{
				plot_value(i,j,n,box2,var2,xc,yc,high2);
				if(ans2==75)
					n-=1;
				if(ans2==77)
					n+=1;
				if(n<0)
					n=24;
				if(n>24)
					n=0;
				plot_value(i,j,n,box3,var3,xc,yc,high3);
			}
			if(i==6&&(ans2==75||ans2==77))	/*	<--  --> */
			{
				plot_value(i,j,n,box2,var2,xc,yc,high2);
				if(ans2==75)
					n-=1;
				if(ans2==77)
					n+=1;
				if(n<0)
					n=5;
				if(n>5)
					n=0;
				plot_value(i,j,n,box3,var3,xc,yc,high3);
			}
			if(i==5&&(ans2==72||ans2==80))	/*	up  or down arrow */
			{
				plot_value(i,j,n,box2,var2,xc,yc,high2);
				if(ans2==72)
					j-=1;
				if(ans2==80)
					j+=1;
				if(j<0)
					j=1;
				if(j>1)
					j=0;
				plot_value(i,j,n,box3,var3,xc,yc,high3);
			}
		}
		if(i==5&&ans=='*')
		{
			if(Parm[j][n]==0)
				Parm[j][n]=1;
			else
				Parm[j][n]=0;
			plot_value(i,j,n,box2,var2,xc,yc,high2);
			n+=1;
			if(n>24)
				n=0;
			plot_value(i,j,n,box3,var3,xc,yc,high3);
		}
		if(i==6&&ans=='*')
		{
			if(Freq[n]==0)
				Freq[n]=1;
			else
				Freq[n]=0;
			plot_value(i,j,n,box2,var2,xc,yc,high2);
			n+=1;
			if(n>5)
				n=0;
			plot_value(i,j,n,box3,var3,xc,yc,high3);
		}
		if(i==0&&ans=='Z')
		{
			plot_map(MapName,0,0,hxs,hyc);
			plot_box();
		}
		if(ans=='C')
		{
			FpHdr=p_open("current.hdr","rb");
			plot_cursors(BLACK);
			mark_cursors(&numhit,&totnum);
			plot_hits(numhit,totnum);
			fclose(FpHdr);
		}
		if(i==0&&ans=='R')
		{
			List[0].var[0].value=Hhdr.maxlat;
			List[0].var[1].value=Hhdr.minlat;
			List[0].var[2].value=Hhdr.maxlon;
			List[0].var[3].value=Hhdr.minlon;
			for(j=0;j<List[i].numvar;j++)
				plot_value(i,j,n,box2,var2,xc,yc,high2);
			plot_map(MapName,0,0,hxs,hyc);
			plot_box();
		}
		if(i!=0&&(ans=='+'||ans=='-'))
		{
			if(ans=='+')
				DelParm[i]*=2.0;
			if(ans=='-'&&DelParm[i]>=2.0)
				DelParm[i]/=2.0;
		}
		if(i==0&&(ans=='+'||ans=='-'))
		{
			if(ans=='+')
			{
				DelLat*=2.0;
				DelLon*=2.0;
			}
			if(ans=='-')
			{
				DelLat/=2.0;
				DelLon/=2.0;
			}
		}
		if(i==0&&(ans=='S'||ans=='H'||ans=='W'||ans=='N'||ans=='s'||ans=='l'))
		{
			unplot_box();
			if(ans=='s'||ans=='S')
			{
				List[0].var[0].value-=DelLat/2.0;
				List[0].var[1].value+=DelLat/2.0;
			}	
			if(ans=='H'||ans=='l')
			{
				List[0].var[0].value+=DelLat/2.0;
				List[0].var[1].value-=DelLat/2.0;
			}	
			if(ans=='N'||ans=='s')
			{
				List[0].var[2].value-=DelLon/2.0;
				List[0].var[3].value+=DelLon/2.0;
			}	
			if(ans=='W'||ans=='l')
			{
				List[0].var[2].value+=DelLon/2.0;
				List[0].var[3].value-=DelLon/2.0;
			}	
			while(List[0].var[0].value<List[0].var[1].value)
			{
				List[0].var[0].value+=DelLat/5.0;
				List[0].var[1].value-=DelLat/5.0;
			}
			if(List[0].var[0].value>Lat0)
				List[0].var[0].value=Lat0;
			if(List[0].var[1].value<LatN)
				List[0].var[1].value=LatN;
			if(List[0].var[2].value>LonX)
				List[0].var[2].value=LonX;
			if(List[0].var[3].value<Lon0)
				List[0].var[3].value=Lon0;
			for(j=0;j<List[i].numvar;j++)
				plot_value(i,j,n,box2,var2,xc,yc,high2);
			plot_box();
		}
	}while(ans!=27);
	n=-1;
	plot_text(i,back1,text1,xc,yc,xs);
	for(j=0;j<List[i].numvar;j++)
		plot_value(i,j,n,box1,var1,xc,yc,Red);
	SetVideoMode(0);
}


 /***********************************************************************
**
**
**
**
************************************************************************/

int output_screen(xc,yc,xs,ys)

{
	int i,j,k;
	int num=1;
	FILE *fplbl,*fppal,*fpdat;
	char string[100],name[100];
	int exist=0;

	fcloseall();
	do
	{
		sprintf(name,"curimg%02d",num);
		num+=1;
		if(num>99)
		{
			fclose(fplbl);
			return(-1);
		}
		sprintf(string,"%s.lbl",name);
		fplbl=p_open(string,"rt");
		if(fplbl)
		{
			exist=1;
			fclose(fplbl);
		}
		else
			exist=0;
	}while(exist==1);
	sprintf(string,"%s.lbl",name);
	fplbl=p_open(string,"wt");
	if(!fplbl)
		return(-2);
	fprintf(fplbl,"FILE_TYPE                   = IMAGE\n");
	fprintf(fplbl,"IMAGE_LINES                 = %d\n",ys);
	fprintf(fplbl,"LINE_SAMPLES                = %d\n",xs);
	fprintf(fplbl,"SAMPLE_BITS                 = 8\n");
	fprintf(fplbl,"PALETTE_POINTER             = '%s.pal'\n",name);
	fprintf(fplbl,"PAL_POINTER                 = '%s.pal'\n",name);
	fprintf(fplbl,"IMAGE_POINTER               = '%s.dat'\n",name);
	fprintf(fplbl,"END\n");
	fclose(fplbl);

	sprintf(string,"%s.pal",name);
	fppal=p_open(string,"wt");
	if(!fppal)
		return(-2);
	for(i=0;i<256;i++)
		fprintf(fppal,"%3d %3d %3d %3d\n",i,lut[i].r,lut[i].g,lut[i].b);
	fclose(fppal);

	sprintf(string,"%s.dat",name);
	fpdat=p_open(string,"wb");
	if(!fpdat)
		return(-2);
	for(i=0;i<ys;i++)
	{
		getrow(0,xc,xc+xs-1,yc+i,Buffer);
		if(fwrite((char *)Buffer,sizeof(char),xs,fpdat)<xs)
		{
			fclose(fpdat);
			return(-3);
		}
	}
	fclose(fpdat);
	fcloseall();
}




/***********************************************************************
**
**
**
**
************************************************************************/

int plot_box()

{
	int xc,yc,x2,y2;

	Bxc=xc=(List[0].var[3].value-Lon0)*Deg_Pix*CosLat;
	Byc=yc=(Lat0-List[0].var[0].value)*Deg_Pix;
	x2=(List[0].var[2].value-Lon0)*Deg_Pix*CosLat;
	y2=(Lat0-List[0].var[1].value)*Deg_Pix;
	Bxs=x2-xc+1;
	Bys=y2-yc+1;

	tbox_val(0,Bxc,Byc,Bxs,Bys,BBuff,WHITE,WHITE,0);
}

/***********************************************************************
**
**
**
**
************************************************************************/

int unplot_box()

{
	int xc,yc,x2,y2;

	Bxc=xc=(List[0].var[3].value-Lon0)*Deg_Pix*CosLat;
	Byc=yc=(Lat0-List[0].var[0].value)*Deg_Pix;
	x2=(List[0].var[2].value-Lon0)*Deg_Pix*CosLat;
	y2=(Lat0-List[0].var[1].value)*Deg_Pix;
	Bxs=x2-xc+1;
	Bys=y2-yc+1;

	unbox(0,Bxc,Byc,Bxs,Bys,BBuff);
}

/***********************************************************************
**
**
**    
**
************************************************************************/

int load_limits(char *name)

{
	int i,j,k;
	FILE *fplim;
	char string[100];

	sprintf(string,"%s.lim",name);
	fplim=p_open(string,"rt");
	if(fplim)
	{
		fgets(string,100,fplim);
		fgets(string,100,fplim);
		for(k=0;k<4;k++)
			fscanf(fplim,"%f",&List[0].var[k].value);
		MFll[0]=List[0].var[1].value;
		MFll[1]=List[0].var[0].value;
		MFll[2]=List[0].var[3].value;
		MFll[3]=List[0].var[2].value;
		fgets(string,100,fplim);
		fgets(string,100,fplim);
		for(k=0;k<2;k++)
			fscanf(fplim,"%f",&List[1].var[k].value);
		fgets(string,100,fplim);
		fgets(string,100,fplim);
		for(k=0;k<2;k++)
			fscanf(fplim,"%f",&List[2].var[k].value);
		fgets(string,100,fplim);
		fgets(string,100,fplim);
		for(k=0;k<2;k++)
			fscanf(fplim,"%f",&List[3].var[k].value);
		fgets(string,100,fplim);
		fgets(string,100,fplim);
		fscanf(fplim,"%d",&List[4].var[0].value);
		for(k=1;k<3;k++)
			fscanf(fplim,"%f",&List[4].var[k].value);
		fgets(string,100,fplim);
		fgets(string,100,fplim);
		for(j=0;j<2;j++)
		{
			fgets(string,100,fplim);
			for(k=0;k<25;k++)
				fscanf(fplim,"%2d",&Parm[j][k]);
			fgets(string,100,fplim);
		}
		fgets(string,100,fplim);
		for(k=0;k<6;k++)
			fscanf(fplim,"%3d",&Freq[k]);
		fclose(fplim);
	}
}

/***********************************************************************
**
**
**    
**
************************************************************************/

int plot_map(name,xc,yc,xs,ys,iop)

char *name;
int xc,yc,xs,ys;

{
	int i,j,k;
	int sxs=ScreenXs,sys=ScreenYs,csize,ix,iy;
	float lat1,lat2,lon1,lon2,dlat,dlon,mll[4];
	float fxs=xs,fys=ys,size,dpx,dpy;
	int numhit,totnum,savemap=0,readmap=0;
	FILE *fpmap,*fpvec;
	char string[100];
	struct map_input mi;

	ScreenXs=xs;
	ScreenYs=ys;
	mll[1]=lat2=Lat0=List[0].var[0].value;
	mll[2]=lon1=Lon0=List[0].var[3].value;
	mll[0]=lat1=List[0].var[1].value;
	mll[3]=lon2=List[0].var[2].value;
	sprintf(string,"%s.%ccm",name,VideoType);
		/* map not same as saved map */
	if(MFll[0]==0.0&&MFll[1]==0.0&&MFll[2]==0.0&&MFll[3]==0.0) 
	{
		fpmap=p_open(string,"rb");
		if(!fpmap)		/* no map file exists */
		{
			fpmap=p_open(string,"wb");
			if(fpmap)
			{
				savemap=1;
				fwrite((char *)mll,sizeof(float),4,fpmap);
			}			
		}
		else		/* there is a map file */
		{
			fread((char *)MFll,sizeof(float),4,fpmap);
			if(MFll[0]==mll[0]&&MFll[1]==mll[1]&&MFll[2]==mll[2]&&MFll[3]==mll[3])
			{
				readmap=1;
				for(i=0;i<ys;i++)
				{
					fread((char *)Buffer,sizeof(char),xs,fpmap);
					plotrow(0,xc,xc+xs-1,yc+i,Buffer);
				}
			}
			else
				fclose(fpmap);
		}
	}
	else if(MFll[0]==mll[0]&&MFll[1]==mll[1]	
			&&MFll[2]==mll[2]&&MFll[3]==mll[3])	/* map same as saved map */
	{
		fpmap=p_open(string,"rb");
		if(fpmap)		/* map file exists */
		{
			fread((char *)MFll,sizeof(float),4,fpmap);
			readmap=1;
			for(i=0;i<ys;i++)
			{
				fread((char *)Buffer,sizeof(char),xs,fpmap);
				plotrow(0,xc,xc+xs-1,yc+i,Buffer);
			}
		}
		else
		{
			fpmap=p_open(string,"wb");
			if(fpmap)
			{
				savemap=1;
				fwrite((char *)mll,sizeof(float),4,fpmap);
			}			
		}
	}
	dlat=lat2-lat1;
	dlon=lon2-lon1;
	lat2=Lat0=List[0].var[0].value+dlat/4;
	lon1=Lon0=List[0].var[3].value-dlon/4;
	lat1=List[0].var[1].value-dlat/4;
	lon2=List[0].var[2].value+dlon/4;
	dlat=lat2-lat1;
	dlon=lon2-lon1;
	CosLat=cos((double)((lat1+lat2)/2.0*DEG_RAD));
	dpx=fxs/(CosLat*dlon);
	dpy=fys/dlat;
	if(dpx<dpy)
	{
		Deg_Pix=dpx;
		DelLat=dlon/10/CosLat;
		DelLon=dlon/10;
	}
	else
	{
		Deg_Pix=dpy;
		DelLat=dlat/10;
		DelLon=dlat/10*CosLat;
	}
	PixSize=1.0/(Deg_Pix*DEG_KM);
	Bxc=dlon/6.0*Deg_Pix*CosLat;
	Byc=dlat/6.0*Deg_Pix;
	Bxs=dlon*Deg_Pix*CosLat*2.0/3.0;;
	Bys=dlat*Deg_Pix*2.0/3.0;
	LonX=(fxs-1.0)/(Deg_Pix*CosLat)+Lon0;
	LatN=Lat0-(fys-1.0)/Deg_Pix;
	if(readmap==0)
	{
		paint_box(0,BACKGROUND,Buffer,xc,yc,xs,ys);
		fpvec=p_open("map.vec","rt");
		if(fpvec)
		{
			fgets(string,100,fpvec);
			fgets(string,100,fpvec);
			while(fgets(string,100,fpvec))
			{
				sscanf(string,"%s%f%f%d",&mi.name,&mi.max,&mi.min,&mi.color);
				if(mi.max>PixSize&&mi.min<=PixSize)
				{
					if(convert_bin(mi.name,mi.color)<-1)
						break;
				}
			}
			fclose(fpvec);
		}
	}
	if(savemap==1)
	{
		for(i=0;i<ys;i++)
		{
			getrow(0,xc,xc+xs-1,yc+i,Buffer);
			fwrite((char *)Buffer,sizeof(char),xs,fpmap);
		}
	}
	FpHdr=p_open("current.hdr","rb");
	fread((char *)&Hhdr,sizeof(struct hdr_hdr),1,FpHdr);
	while(fread((char *)&Shdr,sizeof(struct short_hdr),1,FpHdr)>0)
	{
		ix=(Shdr.lon-Lon0)*Deg_Pix*CosLat;
		iy=(Lat0-Shdr.lat)*Deg_Pix;
		csize=Shdr.i_depth/50+3;
		box(0,ix-csize,iy-csize,M_GREY,csize*2+1,csize*2+1);
	}
	rewind(FpHdr);
	plot_cursors(BLACK);
	mark_cursors(&numhit,&totnum);
	fclose(FpHdr);
	ScreenXs=sxs;
	ScreenYs=sys;
	plot_hits(numhit,totnum);
	if(savemap==1||readmap==1)
		fclose(fpmap);
}

/***********************************************************************
**
**
**
**
************************************************************************/

int plot_cursors(val)

{
	int i,j,k,f,h;
	unsigned char uval;
	int ix,iy;
	int num=0,hit=0;
	int good;

	rewind(FpHdr);
	fread((char *)&Hhdr,sizeof(struct hdr_hdr),1,FpHdr);
	while(fread((char *)&Shdr,sizeof(struct short_hdr),1,FpHdr)>0)
	{
		ix=(Shdr.lon-Lon0)*Deg_Pix*CosLat;
		iy=(Lat0-Shdr.lat)*Deg_Pix;
		cursor(0,ix,iy,val,3);
	}
}

/***********************************************************************
**
**
**
**
************************************************************************/

int mark_cursors(numhit,totnum)

int *numhit,*totnum;

{
	int i,j,k,f,h;
	unsigned char uval;
	int ix,iy;
	int num=0,hit=0;
	int good;

	rewind(FpHdr);
	fread((char *)&Hhdr,sizeof(struct hdr_hdr),1,FpHdr);
	while(fread((char *)&Shdr,sizeof(struct short_hdr),1,FpHdr)>0)
	{
		num+=1;
		good=1;
		ix=(Shdr.lon-Lon0)*Deg_Pix*CosLat;
		iy=(Lat0-Shdr.lat)*Deg_Pix;
		if(
				Shdr.lat>List[0].var[0].value||
				Shdr.lat<List[0].var[1].value||
				Shdr.lon>List[0].var[2].value||
				Shdr.lon<List[0].var[3].value||
				Shdr.w_depth<List[1].var[0].value||
				Shdr.w_depth>List[1].var[1].value||
				Shdr.i_depth<List[2].var[0].value||
				Shdr.i_depth>List[2].var[1].value||
				Shdr.i_height<List[3].var[0].value||
				Shdr.i_height>List[3].var[1].value
			)
			good=0;
		if(
				List[4].var[0].value==0.0&&						/* Any */
				(
					Shdr.stop<(long)List[4].var[1].value||		/* min */
					Shdr.start>(long)List[4].var[2].value		/* max */
				)
			)
			good=0;
		if(
				List[4].var[0].value==1.0&&						/* All */
				(
					Shdr.stop<(long)List[4].var[2].value||		/* max */
					Shdr.start>(long)List[4].var[1].value		/* min */
				)
			)
			good=0;
		for(i=0;i<NUMDAT;i++)
		{
			uval=1;
			if(Parm[i/25][i%25]==1&&(Shdr.parm[i/8]&(uval<<(i%8)))==0)
			{
				good=0;
				break;
			}
		}
		if(Freq[5]==0)
			for(i=0;i<5;i++)
			{
				f=Shdr.ob_freq;
				h=Fq[f];
				if(Freq[h]==0)
					good=0;
			}
		if(good==1)
		{
			cursor(0,ix,iy,WHITE,3);
			sprintf(GF_String[hit],"%s cur %2.0f %ld %ld%7.0f%4d",
				Shdr.name,Shdr.ob_freq,Shdr.start,Shdr.stop,Shdr.i_depth,hit+1);
			hit+=1;
		}
	}
	Hits=*numhit=hit;
	*totnum=num;
}


/***********************************************************************
**
**
**
**
************************************************************************/

int plot_hits(numhit,totnum)

int numhit,totnum;

{
	char string[20];

	paint_box(0,D_GREY,Buffer,ScreenXs/2+7,0,35,14);
	sprintf(string,"%4d",numhit);
	plot_font_h(YELLOW,ScreenXs/2+11,2,string,2,Font);
	paint_box(0,D_GREY,Buffer,ScreenXs/2+189,0,35,14);
	sprintf(string,"%4d",totnum);
	plot_font_h(ORANGE,ScreenXs/2+193,2,string,2,Font);
	plot_font_h(GREEN,ScreenXs/2+49,2,"meet criteria out of",2,Font);
}


/***********************************************************************
**
**
**
***********************************************************************/

int convert_bin(region,val)

char *region;
int val;

{
	int i,j,k;
	double x,y,xo,yo;
	int ix,iy,ixo=-1,iyo=-1;
	double dx,dy,dist;
	int secnum,numpt,numsec;
	FILE *fp,*fphdr;
	float latlon[2],mll[4],mnln,mxln,mnlt,mxlt;
	char string[40];
	int doit,numplot=0;
	int first_seg=-1,last_seg=-1;
	long offset;

	strcpy(string,region);
	strcat(string,".bin");
	fp=p_open(string,"rb");
	if(!fp)return(-1);
	strcpy(string,region);
	strcat(string,".hdr");
	fphdr=p_open(string,"rb");
	if(!fphdr)
		return(-1);
	fread((char *)&numsec,sizeof(int),1,fphdr);
	fread((char *)&numsec,sizeof(int),1,fp);
	for(j=0;j<numsec;j++)
	{
		fread((char *)&offset,sizeof(long),1,fphdr);
		fread((char *)mll,sizeof(float),4,fphdr);
		doit=1;
		mnln=mll[0];mxln=mll[1];mnlt=mll[2];mxlt=mll[3];
		if(mnln>LonX||mnlt>Lat0||mxln<Lon0||mxlt<LatN)
			doit=0;
		if(doit==1)
		{
			numplot+=1;
			fseek(fp,offset,SEEK_SET);
			fread((char *)&numpt,sizeof(int),1,fp);
			fread((char *)mll,sizeof(float),4,fp);
			for(i=0;i<numpt;i++)
			{
				if(kbhit()>0)
				{
					val=getch();
					if(val==27)
						return(-2);
				}
				fread((char *)latlon,sizeof(float),2,fp);
				ix=(latlon[1]-Lon0)*Deg_Pix*CosLat;
				iy=(Lat0-latlon[0])*Deg_Pix;
				if(i>0)
					plotln(3,ix,iy,ixo,iyo,val);
				ixo=ix;
				iyo=iy;
			}
		}
	}
	fclose(fp);
	fclose(fphdr);
	return(numplot);
}


/***********************************************************************
**
**
**
**
************************************************************************/

int plot_help(i,xc,yc,val)

int i,xc,yc,val;

{
	int k;

	for(k=0;k<Help[i].lines;k++)
		plot_font_h(val,xc,yc+k*17,Help[i].text[k],2,Font);
}



/***********************************************************************
**
**
**
**
************************************************************************/

int reset_range()

{
	int i,j,k;
	int val;
	char string[100];

	FpHdr=p_open("current.hdr","rb");
	fread((char *)&Hhdr,sizeof(struct hdr_hdr),1,FpHdr);
	List[0].var[0].value=Hhdr.maxlat;
	List[0].var[1].value=Hhdr.minlat;
	List[0].var[2].value=Hhdr.maxlon;
	List[0].var[3].value=Hhdr.minlon;
	List[1].var[0].value=Hhdr.minwd;
	List[1].var[1].value=Hhdr.maxwd;
	List[2].var[0].value=Hhdr.minid;
	List[2].var[1].value=Hhdr.maxid;
	List[3].var[0].value=Hhdr.minih;
	List[3].var[1].value=Hhdr.maxih;
	List[4].var[0].value=0.0;
	List[4].var[1].value=Hhdr.mintime;
	List[4].var[2].value=Hhdr.maxtime;
	Parm[0][1]=Parm[0][6]=Parm[0][7]=Freq[0]=1;
	fclose(FpHdr);
	val=get_file_name("*.lim",string,LastMap);
	if(val>=0)
	{
		LastMap=val;
		for(k=0;k<strlen(string);k++)
			if(string[k]=='.')
				string[k]='\0';
		strcpy(MapName,string);
	}
	else
		strcpy(MapName,"all_stns");
}



/************************************************************************
**
**
**
**
************************************************************************/

int plot_text(i,back,text,xc,yc,xs)

int i,back,text,xc,yc,xs;

{
	int j;

	paint_box(0,back,Buffer,xc,
		List[i].row*17-4,xs,List[i].lines*17+4);
	for(j=0;j<List[i].numtext;j++)
		plot_font_h(text,
			xc+2+List[i].txt[j].col*7,yc+List[i].txt[j].row*17,
			List[i].txt[j].txt,2,Font);
}

/***********************************************************************
**
**
**
**
************************************************************************/

int plot_value(i,j,n,back,text,xc,yc,high)

int i,j,n,back,text,xc,yc;

{
	int k,m;
	int len,num;
	char string[100];
	long ljday;
	int yr,jday,mo,da;

	if(List[i].type==1||List[i].type==2)
	{
		sscanf(List[i].var[j].format+1,"%d",&len);
		len+=1;
		paint_box(0,back,Buffer,
			xc+List[i].var[j].col*7,yc+List[i].var[j].row*17-2,len*7,14);
		sprintf(string,List[i].var[j].format,List[i].var[j].value);
		plot_font_h(text,
			xc+2+List[i].var[j].col*7,yc+List[i].var[j].row*17,
			string,2,Font);
	}
	if(List[i].type==3)
	{
		if(j==0)
		{
			len=4;
			paint_box(0,back,Buffer,
				xc+List[i].var[j].col*7,yc+List[i].var[j].row*17-2,len*7,14);
			k=List[i].var[j].value+0.0001;
			plot_font_h(text,
				xc+2+List[i].var[j].col*7,yc+List[i].var[j].row*17,
				List[i].txt[3+k].txt,2,Font);
		}
		else
		{
			len=10;
			paint_box(0,back,Buffer,
				xc+List[i].var[j].col*7,yc+List[i].var[j].row*17-2,len*7,14);
			ljday=List[i].var[j].value+0.0001;
			jday=ljday%1000;
			yr  =ljday/1000;
			month_day(yr,jday,&mo,&da);
			sprintf(string,"%2d %s %2d",da,d[mo].id3,yr);
			plot_font_h(text,
				xc+2+List[i].var[j].col*7,yc+List[i].var[j].row*17,
				string,2,Font);
		}
	}
	if(List[i].type==4)
	{
		if(n<0)
		{
			len=26;
			paint_box(0,back,Buffer,
				xc+List[i].txt[j+1].col*7,yc+List[i].txt[j+1].row*17-2,len*7,14);
			plot_font_h(text,
				xc+2+List[i].txt[j+1].col*7,yc+List[i].txt[j+1].row*17,
				List[i].txt[j+1].txt,2,Font);
			for(k=0;k<25;k++)
			{
				if(Parm[j][k]>0)
				{
					string[0]=List[i].txt[j+1].txt[k];
					string[1]='\0';
					plot_font_h(high,
						xc+2+(List[i].txt[j+1].col+k)*7,yc+List[i].txt[j+1].row*17,
						string,2,Font);
				}
			}
		}
		else
		{
			paint_box(0,back,Buffer,
				xc+(List[i].txt[j+1].col+n)*7,
				yc+List[i].txt[j+1].row*17-2,7,14);
			string[0]=List[i].txt[j+1].txt[n];
			string[1]='\0';
			if(Parm[j][n]>0)
				plot_font_h(high,
					xc+2+(List[i].txt[j+1].col+n)*7,yc+List[i].txt[j+1].row*17,
					string,2,Font);
			else	
				plot_font_h(text,
					xc+2+(List[i].txt[j+1].col+n)*7,yc+List[i].txt[j+1].row*17,
					string,2,Font);
			m=j*25+n;
			paint_box(0,back,Buffer,
				xc+11*7,yc+List[i].row*17-2,25*7,16);
			if(Parm[j][n]>0)
				plot_font_h(high,
					xc+2+11*7,yc+List[i].row*17,
					DType[m].name[1],2,Font);
			else
				plot_font_h(text,
					xc+2+11*7,yc+List[i].row*17,
					DType[m].name[1],2,Font);
		}
	}
	if(List[i].type==5)
	{
		if(n<0)
		{
			len=24;
			paint_box(0,back,Buffer,
				xc+List[i].txt[j+1].col*7,yc+List[i].txt[j+1].row*17-2,len*7,14);
			plot_font_h(text,
				xc+2+List[i].txt[j+1].col*7,yc+List[i].txt[j+1].row*17,
				List[i].txt[j+1].txt,2,Font);
			for(k=0;k<6;k++)
			{
				if(Freq[k]>0)
				{
					strcpy(string,List[i].txt[j+1].txt+k*4);
					string[4]='\0';
					plot_font_h(high,
						xc+2+(List[i].txt[j+1].col+k*4)*7,yc+List[i].txt[j+1].row*17,
						string,2,Font);
				}
			}
		}
		else
		{
			paint_box(0,back,Buffer,
				xc+(List[i].txt[j+1].col+n*4)*7,
				yc+List[i].txt[j+1].row*17-2,28,16);
			strcpy(string,List[i].txt[j+1].txt+n*4);
			string[4]='\0';
			if(Freq[n]>0)
				plot_font_h(high,
					xc+2+(List[i].txt[j+1].col+n*4)*7,yc+List[i].txt[j+1].row*17,
					string,2,Font);
			else
				plot_font_h(text,
					xc+2+(List[i].txt[j+1].col+n*4)*7,yc+List[i].txt[j+1].row*17,
					string,2,Font);
		}
	}
}


/********************************************************************
**
**
**
********************************************************************* */

int month_day(year,yearday,pmonth,pday)

int year, yearday,*pmonth,*pday;

{
	int i,leap;

	*pmonth=*pday=0;
	if(yearday<1)return(-1); /* year day too low */
	leap=year%4==0&&year%100!=0||year%400==0;
	if(leap==0&&yearday>365)return(-1);	/* day to large */
	if(leap==1&&yearday>366)return(-1);
	for(i=1;yearday>day_tab[leap][i];i++)
		yearday-=day_tab[leap][i];
	*pmonth=i;
	*pday=yearday;
	return(0);
}

/********************************************************************
**
**
**
********************************************************************* */

int day_of_year(year,month,day)

int year,month,day;

{
	int i,leap;

	if(month<1||month>12)return(-1); /* invalid month */

	leap=year%4==0&&year%100!=0||year%400==0;

	if(day<1||day>day_tab[leap][month])return(-2);  /* invalid day */

	for(i=1;i<month;i++)
		day+=day_tab[leap][i];

	return(day);
}



/********************************************************************
**
**		returns:
**
**			-3 -- too many files of type given
**			-2 -- no such files
**			-1 -- no file chosen
**		  >=0 -- number of file chosen = n of String[n]
**
**
********************************************************************* */

int get_cur_name(file_id,file_name)

char *file_id,*file_name;

{
	int i,j,k;
	int num_files;
	int val=-2,start=LastN;
	char string[NAME_SIZE],file[F_SIZE],type[T_SIZE],directory[NAME_SIZE];
	int t=0,d=0,ls=-1;

	Monitor=check_equip(&Eq);

	for(i=0;i<strlen(file_id);i++)
		if(file_id[i]=='\\')
			ls=i;
	if(ls>0)
	{
		d=1;
		strcpy(directory,file_id);
		directory[ls+1]='\0';
	}
	else
		directory[0]='\0';

	num_files=Hits;
	if(num_files<0)
		return(num_files);
	else
	{
		ClearBox(40,79,0,0,112);
		sprintf(string,"file         ob start stop   depth  num");
		WriteStringAtxy(40,0,39,(char)112,string);
		val=scroll_list(40,1,40,21,GF_String,num_files,file_name,LastN);
		LastN=val;
		if(val>=0)
		{
			sscanf(file_name,"%s%s",file,type);
			if(file_name[9]!=' ')
				t=1;
			if(d==1)
			{
				strcpy(file_name,directory);
				strcat(file_name,file);
			}
			else
				strcpy(file_name,file);
			if(t==1)
			{
				strcat(file_name,".");
				strcat(file_name,type);
			}
			if(file_name[strlen(file_name)-1]=='.')
				file_name[strlen(file_name)-1]='\0';
		}	
	}
	return(val);
}

                                                                       