#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <fmgraph.h>
#include <mouse.h>
#include <console.h>
#include <string.h>
#include <jstring.h>
#include "font5.h"
#include "jukugo5.h"
#include <time.h>
#define SX 110
#define EX 627
#define SY_kadai 62
#define EY_kadai 92
#define SY_kaisetsu 126
#define BOX_up 374
#define BOX_down 394

int MOJI_kakushi( char *kadai, char *kadai_kakushi);
int MOJI_kensaku(int kadai_max, char *kadai, char *kaisetsu);

char 	kadai_kakushi[260];
char 	kensaku[21];
int 	kenno, kenflag,kadaino;
char	temp[81];	

void mos_operate(int kadai_max, char *kadai, char *kaisetsu)
{
	char	status,count;
	int		mos_x, mos_y,i;
	int 	fontno,kakushi=0;

	MOS_init();
	MOS_horizon(5,634);
	MOS_vertical(BOX_up,BOX_down);
	MOS_set_cursor(600,390);
	MOS_cursor(MOS_ON);
	
	fontno=MINN24;

	for(;;){
		MOS_on_status( 0, &status, &count, &mos_x, &mos_y );
		if( status==MOS_LEFT && mos_y >=BOX_up && mos_y <=BOX_down){
			if( mos_x >=30 && mos_x <=110 )	break;			/* 終了box */
			if( mos_x >=130 && mos_x <=210 ){				/* 隠し字box */
				GDS_bordercolor(8);
				GDS_paintcolor(9);
				GDS_box(30+100,BOX_up,110+100,BOX_down);
				if(kakushi==0){
					MOJI_write(kakushia ,sizeof(kakushia), 16, 2, 3, 140, 376);
					kakushi=1;
				} else {
					MOJI_write(kakushin ,sizeof(kakushin), 16, 2, 3, 140, 376);
					kakushi=0;
				}
				MOS_wait(300);
			}
			if( mos_x >=230 && mos_x <=310 ){			/* フォント変更box */
				GDS_bordercolor(8);
				GDS_paintcolor(9);
				GDS_box(30+100*2,BOX_up,110+100*2,BOX_down);
 				if(fontno==MINN24){
					MOJI_write(kyoukasho ,sizeof(kyoukasho),16,2,3, 240, 376);
					fontno=KYOU24;
				} else {
					MOJI_write(minchou ,sizeof(minchou), 16, 2, 3, 246, 376);
					fontno=MINN24;
				}
				GDS_bordercolor(14);
				GDS_paintcolor(14);
				for(i=0; i<=7; i++) 
					GDS_box(SX,SY_kaisetsu+30*i,EX,SY_kaisetsu+23+30*i);
				kaisetsu_kakidashi(fontno, kaisetsu);	
			}
			if( mos_x >=330 && mos_x <=410 ){				/* 検索box */
				kadaino=MOJI_kensaku(kadai_max, kadai, kaisetsu);
				itoa(kadaino,temp,10);
				GDS_partclear(0,485,1,529,19);
				GDS_string(485,19,0,temp);
				GDS_bordercolor(14);
				GDS_paintcolor(14);
				GDS_box(SX,SY_kadai,EX,EY_kadai);
				for(i=0; i<=7; i++) 
					GDS_box(SX,SY_kaisetsu+30*i,EX,SY_kaisetsu+23+30*i);
				if(kakushi==1) {
					MOJI_kakushi(kadai, kadai_kakushi);
					kadai_kakidashi(fontno, kadai_kakushi);
				} else 	kadai_kakidashi(fontno, kadai);
			}
			if( mos_x >=430 && mos_x <=510 ){				/* 解説box */
				GDS_bordercolor(14);
				GDS_paintcolor(14);
				GDS_box(SX,SY_kadai,EX,EY_kadai);
				kadai_kakidashi(fontno, kadai);	
				kaisetsu_kakidashi(fontno,kaisetsu);
				MOS_wait(50);
			}
			if( mos_x >=530 && mos_x <=610 ){				/* 次候補box */
				GDS_bordercolor(14);
				GDS_paintcolor(14);
				GDS_box(SX,SY_kadai,EX,EY_kadai);
				for(i=0; i<=7; i++) 
					GDS_box(SX,SY_kaisetsu+30*i,EX,SY_kaisetsu+23+30*i);
				kadaino=file_read( kadai_max, kadai, kaisetsu);
				itoa(kadaino,temp,10);
				GDS_partclear(0,485,1,529,19);
				GDS_string(485,19,0,temp);
				if(kakushi==1) {
					MOJI_kakushi(kadai, kadai_kakushi);
					kadai_kakidashi(fontno, kadai_kakushi);
				} else 	kadai_kakidashi(fontno, kadai);
			}
		}
	}
	MOS_end();
}

int file_read( int kadai_max, char *kadai, char *kaisetsu)
{
	int		i,j,len,numb;

	numb=( rand() % kadai_max );					/* 課題番号の決定 */

	strcpy(kadai, data_file[kadai_gyo[numb]] );		/* 課題文の読み込み */

	if( data_file[kadai_gyo[numb]+1][0]!='*' ) 		/* 解説文の読み込み */
		strcpy(kaisetsu, data_file[kadai_gyo[numb]+1]);
	for(i=2; i<=4; i++){							
		if( data_file[kadai_gyo[numb]+i][0]!='*' ) 
			strcat( kaisetsu, data_file[kadai_gyo[numb]+i]);
		else break;
	}

	len=strlen(kadai);								/* 課題文の整理 */
	if(len > 40 ) len=40;
	j=0;
	for(i=1; i<len; i++){
		if( kadai[i]!='\n' && kadai[i]!='\t') {
			kadai[j]=kadai[i];
			j++;
		}
	}
	kadai[j]='\0';

	len=strlen(kaisetsu);							/* 解説文の整理 */
	if(len > 320 ) len=320;
	j=0;
	for(i=0; i<len; i++){
		if( kaisetsu[i]!='\n' && kaisetsu[i]!='\t') {
			kaisetsu[j]=kaisetsu[i];
			j++;
		}
	}
	kaisetsu[j]='\0';
	return( numb+1 );
}

void kadai_kakidashi(int fontno, char *kadai)
{
	put_24multifont( 0,MINN24, kadai, 15, SX, SY_kadai);
}

void kaisetsu_kakidashi(int fontno, char *kaisetsu)
{
	int		i,j,k,len,m;
	char	str[8][41]={ '\0' };

	len=strlen(kaisetsu);
	k=len/40;

	/*	m=1;	*/
	if( nthctype( kaisetsu,41 )==CT_KJ2 ) {
		strncpy( str[0], kaisetsu, 42);
		i=j=42;
	} else { 
		strncpy( str[0], kaisetsu, 41);
		i=j=41;
	}
	put_24multifont( 0,fontno, str[0], 15, SX, SY_kaisetsu);

	for(m=2; m<=k; m++){
		if( nthctype( kaisetsu,42*m-1 )==CT_KJ2 ) {
			for(i=j; i<42*m; i++) str[m-1][i-j]=kaisetsu[i];
			j=42*m;
		} else { 
			for(i=j; i<42*m-1; i++) str[m-1][i-j]=kaisetsu[i];
			j=42*m-1;
		}
		put_24multifont( 0,fontno, str[m-1], 15, SX, SY_kaisetsu+30*(m-1));
	}
	
	if( j<len ) {
		for(i=j; i<len; i++) str[m][i-j]=kaisetsu[i];
		put_24multifont( 0,fontno, str[m], 15, SX, SY_kaisetsu+30*(m-1));
	}
}

int MOJI_kakushi( char *kadai, char *kadai_kakushi)
{
	int	len,k;
	
	len=strlen(kadai);
	strcpy(kadai_kakushi,kadai);

	for(;;){
		k=(rand() % len);
		if( nthctype(kadai,k)==CT_KJ1 && nthctype(kadai,k+1)==CT_KJ2){
			kadai_kakushi[k]=0x81;
			kadai_kakushi[k+1]=0xa0;
			break;
		}
	}
	return 0;
}

int MOJI_kensaku(int kadai_max, char *kadai, char *kaisetsu)
{
	int	i,j,k,len,numb;

	GDS_setdrawpage(1);
	GDS_setdisplaypage(1);
	GDS_bordercolor(15);
	GDS_paintcolor(14);
	GDS_box(16*9,190,16*20,210);
	put_24multifont( 1,GOTH24, "検索文字",15, 160, 155);
	GDS_string(160+24*4, 173,1,"を入力してください。");

	CON_cls();
	CON_systemgyo(SYSGYO_ON);
	CON_cursorswitch(0);
	CON_setcursorposition(20,13);
	MOS_cursor(MOS_OFF);

	if( kenno ==0 ) {				/* 検索する課題番号==0 とは最初の検索 */
		gets(kensaku);
	}
	else {							/* 2回目以降の検索*/
		CON_cls();
		CON_setcursorposition(20,13);
		printf("\x1b[32m %*s",strlen(kensaku),kensaku);
		getch();
	}
	
	for(i=kenno; i<kadai_max; ){
		if( data_file[kadai_gyo[i]][0]=='*' ){
			i++;
			if( jstrstr(data_file[kadai_gyo[i]], kensaku) !=NULL ) {
				kenno=i;

				j=0;						/* 課題の取得 */
				len=strlen(data_file[kadai_gyo[i]]);
				for(k=1; k<len; k++){
					if( data_file[kadai_gyo[i]][k]!='\n' 
							&& data_file[kadai_gyo[i]][k]!='\t') {
						kadai[j]=data_file[kadai_gyo[i]][k];
						j++;
					}
				}
				kadai[j]='\0';
	
				if( data_file[kadai_gyo[i]+1][0]!='*' ){	/* 解説の取得 */
				 	strcpy( kaisetsu, data_file[kadai_gyo[i]+1]);
				}
				for(k=2; k<=4; k++){
					if( data_file[kadai_gyo[i]+k][0]!='*' ){
					 	strcat( kaisetsu, data_file[kadai_gyo[i]+k]);
					}
					else break;
				}
				len=strlen(kaisetsu);				
				j=0;
				for(k=0; k<len; k++){
					if( kaisetsu[k]!='\n' && kaisetsu[k]!='\t') {
						kaisetsu[j]=kaisetsu[k];
						j++;
					}
				}
				kaisetsu[j]='\0';

				break;
			}
		}
	}
	numb=kenno;

	if( i>=kadai_max )  {
		kenno=0;
		kensaku[0]='\0';
	}	

	GDS_cls();
	GDS_setdrawpage(0);
	GDS_setdisplaypage(0);
	CON_cls();
	CON_systemgyo(SYSGYO_OFF);
	CON_cursorswitch(1);
	MOS_cursor(MOS_ON);

	return ( numb );
}