/*
        new file select
                      1993.6.27 v1.0
                      1994.8.28 v1.1 file size & date add
                      copyright Y.Ouchi
*/
#include	<stdio.h>
#include	<string.h>
#include	<stdlib.h>
#include	<sys/extender.h>
#include	<time.h>
#include	<jctype.h>
#include	<ctype.h>
#include	"egb.h"
#include	"mos.h"
#include	"bb.h"

	/* external variable */
extern	char	egbwork[];
extern	char	moswork[];
extern	int		dos_exflag;

	/* OΦιΎ */
extern	void	linedsp(int, int, char *);
extern	void	linedspv(int, int, char *, int, unsigned int, unsigned int);
extern	void	linedspvl(int,int,char *,int,int,unsigned int,unsigned int);
extern	void	box(int, int, int, int, int, int);
extern	void	line(int, int, int, int, int);
extern	int		panelread(int, struct panel *, int);
extern	void	panelinit(int, struct panel *, char **, int );
extern	int		crfindb(int, char *, int *, int *);
extern	int		crfindl(int, char *, int *, int *);

	/* Φvg^CvιΎ */
		void	init_disp(void);
		int		fileheaddsp(char *);
		void	fileheadclr(void);
		void	filenameset(char *, char *);
		void	first_proc(void);
		void	flist_set(char *);
		void	path_set(void);
		void	last_path_get(char *);

	/* common variable */
	char	*outchar[12]={"Jan","Feb","Mar","Apr","May","Jun",
						  "Jul","Aug","Sep","Oct","Dec","Nov"};
					/* display charactor */
	char	*dispchar[13]={"01","02","03","04","05","06",
						   "07","08","09","10","11","12","ff"};
	char	wild[8]={"*.*"};

	/* static variable */
	static	char	files[256][15];
	static	char	files_dsp[256][130];
	static	int		fdisp;
	static	int		fdispx=0,fdispy=400;
	static	int		px=120,py=50;
	static	int		file_no=0;
	static	int		disp_start_no=0;
	static	int		first_exflag=1;
	static	struct	panel	n_menu[3];
	static	char	*drivename[16]={"`","a","c","d","e","f","g","h",
									"i","j","k","l","m","n","o","p"};
	static	char	driveflag[16]={0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
								   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};

	struct	file_list{
				char	cdrive[4];
				char	cdir[128];
				char	path[128];
				char	fname[15];
				char	files[256][15];
				char	files_dsp[256][130];
			};

	static	struct	file_list	f_list;



char * filesel ( char *infile )
{
static	char	filename[128]={"p:/src/readme.doc"};
		char	flag,fflag;
		int		j;
		int		menu_res,cdriveno;
		char	motherdir[8]={".."};
		char	enqfile[128];
struct	_disk_space	ds;


	/* initial process */
	/*	file list initial data set	*/
	first_proc ( );
	flist_set (infile);

	/*	file name wild_card check	*/
	if (f_list.fname[0]!=0x00) {
		flag=0;
		j=0;
		while (f_list.fname[j]!=0x00){
			if (iskanji(f_list.fname[j])) j=j+2;
			else {
				if (f_list.fname[j]==0x2a || f_list.fname[j]==0x3f) flag=1;
				j=j+1;
			}
		}
		if (flag==0) {
			return (infile);
		}
	}

					/* initial display */
	init_disp ( );
	fileheadclr ( );

	EGB_writePage(egbwork,0);
	EGB_color(egbwork, 0, TEXT_COL);

	flag=1;
	do{
		path_set();

		enqfile[0]=0x00;
		strcpy(enqfile,f_list.path);

		strcat(enqfile,f_list.fname);

		if (file_no==0) filenameset (enqfile,f_list.path);

/*
		if (first_exflag==1 && infile[0]!=0x00 
					&& file_no==1 && files[0][0]!=0x3c){
			filename[0]=0x00;
			strcpy (filename,f_list.path);
			strcat (filename,&files[0][1]);
			fflag=0;
			flag=0;
		}
		else{
			fflag=1;
		}
*/
		fflag=1;


		box(px+16,py+16,px+53,py+53,BOTAN_COL,1);
		box(px+66,py+36,px+173,py+53,BOTAN_COL,1);
		EGB_color(egbwork, 0, NAME_COL);
		EGB_fontStyle(egbwork, 1);
		cdriveno=f_list.cdrive[0]-0x41;
		if (cdriveno>1) linedsp(px+28,py+42,drivename[cdriveno-1]);
		else linedsp(px+28,py+42,drivename[cdriveno]);
		EGB_fontStyle(egbwork, 0);

		last_path_get (enqfile);
		linedsp(px+67,py+52,enqfile);

		EGB_color(egbwork, 0, TEXT_COL);

		while ( fflag ){
			box(px+15,py+125,px+270,py+324,BACK_COL,1);
			EGB_color(egbwork, 0, TEXT_COL);
			for ( j=0;j<10;j++ ){
				if (disp_start_no+j>=file_no) break;
				linedspv(px+17,py+142+j*20,files_dsp[disp_start_no+j],
											0,TEXT_COL,BACK_COL);
			}
			while ( (menu_res = panelread (3, n_menu, 1)) >= 2000 );
			if ( menu_res<100 ){
				if (menu_res==0 || menu_res==1){
					cdriveno=menu_res;
					f_list.cdrive[0]=0x41+menu_res;
					_dos_select_disk(menu_res);
					getcwd(f_list.cdir,128);
					fflag=0;
					file_no=0;
					strcpy(f_list.fname,wild);
				}
				else{

					if (dos_exflag==0){
			/* drive ok flag check (when executed from T-OS) */
						if (driveflag[menu_res]==0x01){
							cdriveno=menu_res+1;
							f_list.cdrive[0]=0x42+menu_res;
							_dos_select_disk(menu_res+1);
							getcwd(f_list.cdir,128);
							fflag=0;
							file_no=0;
							strcpy(f_list.fname,wild);
						}
					}
					else{
			/* drive state check (when executed from ms-dos) */
						ds=_dos_get_disk_space(menu_res+2);
						if (ds.nsectors!=0xffff){
							cdriveno=menu_res+1;
							f_list.cdrive[0]=0x42+menu_res;
							_dos_select_disk(menu_res+1);
							getcwd(f_list.cdir,128);
							fflag=0;
							file_no=0;
							strcpy(f_list.fname,wild);
						}
					}
				}
				fileheadclr();
			}
			else{
				if (menu_res==200){
					if (disp_start_no+10<file_no){
						disp_start_no=disp_start_no+10;
					}
				}
				else{
					if ( menu_res==1200 ){
						if (disp_start_no-10>=0){
							disp_start_no=disp_start_no-10;
						}
					}
					else{
						if ( menu_res<200 ){
							j=disp_start_no+menu_res-100;
							if (j<file_no){
								if (files[j][0]==0x3c 
										&& files[j][strlen(files[j])-1]
										==0x3e){
									enqfile[0]=0x00;
									strcpy(enqfile,f_list.path);
									strcat(enqfile,&files[j][1]);
									enqfile[strlen(enqfile)-1]=0x00;
									chdir(enqfile);
									getcwd(f_list.cdir,128);
									fflag=0;
									file_no=0;
									strcpy(f_list.fname,wild);
									fileheadclr();
								}
								else{
									if(j==fdisp){
										filename[0]=0x00;
										strcat(filename,f_list.path);
										strcat(filename,&files[j][1]);
										fflag=0;
										flag=0;
									}
									else{
										if(fileheaddsp(&files[j][1])!=0)
																fdisp=j;
									}
								}
							}
						}
						else{
							if(menu_res==201){
								enqfile[0]=0x00;
								strcpy(enqfile,f_list.path);
								strcat(enqfile,motherdir);
								chdir(enqfile);
								getcwd(f_list.cdir,128);
								fflag=0;
								file_no=0;
								strcpy(f_list.fname,wild);
								fileheadclr();
							}
							else{
								filename[0]=0x00;
								fflag=0;
								flag=0;
							}
						}
					}
				}
			}
		}
	}while ( flag );

	MOS_disp( 0 );
	MOS_horizon( 0,639 );
	MOS_vertical( 0,479 );
	EGB_clearScreen(egbwork);
	EGB_color(egbwork, 0, TEXT_COL);
	EGB_color(egbwork, 1, BACK_COL);

	first_exflag=0;
	return(filename);

}

/*
		process for first execution
*/

void	first_proc( )
{
	int		i;
	struct	_disk_space	ds;

	if (first_exflag == 0){
		return;
	}

	if (dos_exflag==0){
		/* all drive state check (when executed from T-OS) */
		for (i=4;i<17;i++){
			ds=_dos_get_disk_space(i);
			if (ds.nsectors==0xffff){
				drivename[i-2][0]=0x81;
				drivename[i-2][1]=0x7c;
				driveflag[i-2]=0x00;
			}
			else{
				driveflag[i-2]=0x01;
			}
		}
	}

		/* menu data set */
	/* no.1 drive select menu */
	n_menu[0].xpos=px+15;
	n_menu[0].ypos=py+65;
	n_menu[0].xsize=256;
	n_menu[0].ysize=40;
	n_menu[0].xbtnsize=32;
	n_menu[0].ybtnsize=20;
	n_menu[0].ful=1;
	n_menu[0].disp=1;
	n_menu[0].ini_digit=0;

	/* no.2 file select menu */
	n_menu[1].xpos=px+15;
	n_menu[1].ypos=py+125;
	n_menu[1].xsize=256;
	n_menu[1].ysize=200;
	n_menu[1].xbtnsize=256;
	n_menu[1].ybtnsize=20;
	n_menu[1].ful=0;
	n_menu[1].disp=1;
	n_menu[1].ini_digit=100;

	/* no.3 page up/down & upper dir select menu */
	n_menu[2].xpos=px+15;
	n_menu[2].ypos=py+105;
	n_menu[2].xsize=256;
	n_menu[2].ysize=20;
	n_menu[2].xbtnsize=128;
	n_menu[2].ybtnsize=20;
	n_menu[2].ful=0;
	n_menu[2].disp=1;
	n_menu[2].ini_digit=200;

}

/*
		initial panel display
*/

void	init_disp( )
{
	char	updirchar[21]={"ͺupper dir"};
	char	pagechar[21]={"page up/down"};

	EGB_writePage(egbwork,0);
	box(px,py,px+285,py+339,FILES_BACK_COL,1);

	box(px+15,py+15,px+54,py+54,BOTAN_COL,1);
	box(px+65,py+35,px+174,py+54,BOTAN_COL,1);
	line(px+15,py+15,px+54,py+15,SHADOW);
	line(px+15,py+15,px+15,py+54,SHADOW);
	line(px+15,py+54,px+54,py+54,HILIGHT);
	line(px+54,py+15,px+54,py+54,HILIGHT);

	line(px+65,py+35,px+174,py+35,SHADOW);
	line(px+65,py+35,px+65,py+54,SHADOW);
	line(px+65,py+54,px+174,py+54,HILIGHT);
	line(px+174,py+35,px+174,py+54,HILIGHT);

	box(px+15,py+105,px+270,py+124,BOTAN_COL,1);
	box(px+15,py+125,px+270,py+324,BACK_COL,1);

	EGB_color(egbwork, 0, TEXT_COL);
	linedsp(px+20,py+122,pagechar);
	linedsp(px+154,py+122,updirchar);

	panelinit(1,n_menu,drivename,1);

	MOS_horizon( px+15,px+270 );
	MOS_vertical( py+65,py+324 );
	MOS_setpos( px+50, py+135 );
	MOS_disp( 1 );
}

/*
		file head display
*/

int		fileheaddsp(char *fn)
{
	int		filesize;
	int		lineleng,nextp1,nextp2,nextp3;
	FILE	*inFp;
	char	txt[250];

	inFp=fopen(fn,"rb");
	if(inFp==NULL) return(0);
	filesize=fread(txt,1,240,inFp);
	fclose(inFp);
	if (filesize<=0) return(0);

	EGB_writePage(egbwork,0);
	box(fdispx,fdispy,fdispx+639,fdispy+51,BOTAN_COL,1);
	crfindl(filesize,txt,&lineleng,&nextp1);
	linedspvl(fdispx,fdispy+16,txt,lineleng,0,TEXT_COL,BOTAN_COL);
	if(nextp1>0){
		crfindl(filesize-lineleng,&txt[nextp1],&lineleng,&nextp2);
		linedspvl(fdispx,fdispy+33,&txt[nextp1],lineleng,
												0,TEXT_COL,BOTAN_COL);
		if(nextp2>0){
			crfindl(filesize-lineleng,&txt[nextp1+nextp2],&lineleng,&nextp3);
			linedspvl(fdispx,fdispy+50,&txt[nextp1+nextp2],lineleng,
													0,TEXT_COL,BOTAN_COL);
		}
		EGB_color(egbwork, 0, TEXT_COL);
		return(1);
	}
	else{
		EGB_color(egbwork, 0, TEXT_COL);
		return(0);
	}
}

/*
		file head display clear
*/

void	fileheadclr( )
{
	fdisp=-1;
	box(fdispx,fdispy,fdispx+639,fdispy+51,BACK_COL,1);
}

/*
		file name set (file name & size & date)
			in  in_f : input file or directory name
				nowpath : current directory
			out filename(common var)
*/
void	filenameset ( char *in_f, char *nowpath )
{
	char	buf[128];
	int		atrib,res;
	char	*work_char_ad;
	char	workfile[128];
	int		i,j;
	time_t	filetm_t;
	char	filetchar[30];
	char	monchar[5];
	char	sizechar[20];

				/* file names get */
	if (file_no!=0) return;
	file_no=0;
	disp_start_no=0;
	for (i=0;i<256;i++) files[i][0]=0x00;
	for (i=0;i<256;i++) files_dsp[i][0]=0x00;

	_dos_set_disk_transfer_area_address(buf);
	atrib=22;
	res=_dos_find_first(in_f,atrib);
	while (res==0){
		work_char_ad=buf+30;
		if (work_char_ad[0]!=0x2e){
			workfile[0]=0x00;
			strcat(workfile,nowpath);
			strcat(workfile,work_char_ad);
			if ((_get_file_mode(workfile) & 0x4000)==0x4000){

	/* directory charactor set ('<' '>' add and size blank) */
				files[file_no][0]=0x01;
				files[file_no][1]=0x00;
				strcat(files[file_no],work_char_ad);
				i=strlen(files[file_no]);
				files[file_no][i]=0x3e;
				files[file_no][i+1]=0x00;
				for (j=0;j<i+1;j++) files_dsp[file_no][j]=files[file_no][j];
				for (j=i+1;j<23;j++) files_dsp[file_no][j]=0x20;
				files_dsp[file_no][23]=0x00;
			}
			else{

	/* normal file charactor set (file name and size) */
				files[file_no][0]=0x20;
				files[file_no][1]=0x00;
				strcat(files[file_no],work_char_ad);
				i=strlen(files[file_no]);
				for (j=0;j<i;j++)  files_dsp[file_no][j]=files[file_no][j];
				for (j=i;j<23;j++) files_dsp[file_no][j]=0x20;
				files_dsp[file_no][23]=0x00;
				j=_get_file_size(work_char_ad);
				sprintf (sizechar,"%d",j);
				i=strlen(sizechar);
				for (j=0;j<i;j++) files_dsp[file_no][22-i+j]=sizechar[j];

		/* file time get (when normal file) if directory, can't get */
				filetm_t=_get_file_time(workfile);
				strncpy(filetchar,ctime(&filetm_t),24);
				for (i=0;i<3;i++) monchar[i]=filetchar[4+i];
				monchar[3]=0x00;
				for (i=0;i<12;i++) if (strcmp(monchar,outchar[i])==0) break;
				for (j=0;j<2;j++) monchar[j]=dispchar[i][j];
				files_dsp[file_no][23]=filetchar[22];
				files_dsp[file_no][24]=filetchar[23];
				files_dsp[file_no][25]=0x2f;
				files_dsp[file_no][26]=monchar[0];
				files_dsp[file_no][27]=monchar[1];
				files_dsp[file_no][28]=0x2f;
				files_dsp[file_no][29]=filetchar[8];
				files_dsp[file_no][30]=filetchar[9];
				files_dsp[file_no][31]=0x00;
			}
			file_no++;
		}
		res=_dos_find_next( )  ;
	}

	qsort(files[0],file_no,15,(int *)strcmp);
	qsort(files_dsp[0],file_no,130,(int *)strcmp);

	for (i=0;i<file_no;i++) if (files[i][0]==0x01) files[i][0]=0x3c;
	for (i=0;i<file_no;i++) if (files_dsp[i][0]==0x01) files_dsp[i][0]=0x3c;

	return;
}

/*
		file list head set (drive, directory, wild etc)
*/

void	flist_set(char *fname)
{
	int		i,j;
	char	work_c[128];
	short	cdriveno;
	short	dir_no;
	short	dir_head_pos;
	short	dir_pos[64];


	if (first_exflag==0) return;

		/* current drive & current directory get */
	cdriveno=_dos_get_default_disk_number();
	f_list.cdrive[0]=0x41+cdriveno;
	f_list.cdrive[1]=0x3a;
	f_list.cdrive[2]=0x00;
	getcwd(f_list.cdir,128);
	f_list.fname[0]=0x00;

		/* input file name analize */
	if (fname[0]!=0x00){
		dir_no=0;
		i=0;
		while (i<strlen(fname)){
			if (iskanji(fname[i])) i=i+2;
			else{
				j=fname[i];
				fname[i]=(char)toupper(j);
				if (fname[i]==0x5c) fname[i]=0x2f;
				if (fname[i]==0x2f){
					dir_pos[dir_no]=i;
					dir_no++;
				}
				i=i+1;
			}
		}
		if (fname[1]==0x3a){
					/* input file name contains drive name */
			if (fname[0]>=0x41 && fname[0]<=0x51){
				f_list.cdrive[0]=fname[0];
				cdriveno=fname[0]-0x41;
				_dos_select_disk(cdriveno);
				getcwd(f_list.cdir,128);
			}
			dir_head_pos=2;
		}
		else{
			dir_head_pos=0;
		}

		if (dir_no!=0){
			if (dir_head_pos==dir_pos[0]){
					/* start by root dir */
				if (dir_no==1){
					f_list.cdir[0]=0x2f;
					f_list.cdir[1]=0x00;
				}
				else{
					f_list.cdir[0]=0x00;
					strncpy (f_list.cdir,&fname[dir_head_pos],
								dir_pos[dir_no-1]-dir_head_pos);
				}
			}
			else{
					/* not start by root dir */
				j=strlen(f_list.cdir);
				if (f_list.cdir[j-1]!=0x2f){
					f_list.cdir[j]=0x2f;
					f_list.cdir[j+1]=0x00;
				}
				strncat (f_list.cdir,&fname[dir_head_pos],
								dir_pos[dir_no-1]-dir_head_pos);
			}

			strcpy (f_list.fname,&fname[dir_pos[dir_no-1]+1]);
		}
		else{
			strcpy (f_list.fname,&fname[dir_head_pos]);
		}

		f_list.path[0]=0x00;
		strcat (f_list.path,f_list.cdrive);
		strcat (f_list.path,f_list.cdir);
		chdir (f_list.path);

		j=strlen(f_list.path);
		if (f_list.path[j-1]!=0x2f){
			f_list.path[j]=0x2f;
			f_list.path[j+1]=0x00;
		}
		strcpy (work_c,f_list.path);
		strcat (work_c,f_list.fname);
		i=_get_file_mode(work_c);
		if (i>=0){
			if ((i & 0x4000)==0x4000){
				chdir (work_c);
				j=strlen(f_list.cdir);
				if (f_list.cdir[j-1]!=0x2f){
					f_list.cdir[j]=0x2f;
					f_list.cdir[j+1]=0x00;
				}
				strcat (f_list.cdir,f_list.fname);
				f_list.fname[0]=0x00;
			}
		}
	}
	if (f_list.fname[0]==0x00) strcpy(f_list.fname,wild);
	return;
}

/*
		last path name get
*/
void	last_path_get ( char *dir )
{
	int		i;
	short	dir_pos;

	if (strlen(f_list.cdir)==1){
		strcpy (dir,f_list.cdir);
		return;
	}

	dir_pos=-1;
	i=0;
	while (i<strlen(dir)){
		if (iskanji(f_list.cdir[i])) i=i+2;
		else{
			if (f_list.cdir[i]==0x2f) dir_pos=i;
			i=i+1;
		}
	}
	if (dir_pos==-1){
		dir[0]=0x2f;
		dir[1]=0x00;
	}
	else{
		dir[0]=0x00;
		strcpy (dir,&f_list.cdir[dir_pos+1]);
	}
	return;
}

/*
		path charactors set to f_list.path
*/
void	path_set (void)
{
	int		i;

	f_list.path[0]=0x00;
	strcat(f_list.path,f_list.cdrive);
	strcat(f_list.path,f_list.cdir);
	i=strlen(f_list.path);
	if (f_list.path[i-1]!=0x2f){
		f_list.path[i]=0x2f;
		f_list.path[i+1]=0x00;
	}

	while (i<strlen(f_list.path)){
		if (iskanji(f_list.path[i])) i=i+2;
		else{
			if (f_list.path[i]==0x2f) f_list.path[i]=0x5c;
			i=i+1;
		}
	}
	return;
}

