/*************************************************************************
*	フィルタ機能用
*************************************************************************/

/*************************************************************************
*	ID置換用
*************************************************************************/


int		_nif_open_amac()
{
	char	tmp[256];

	if ( _nif_amac == NULL )
	{
		if ( (_nif_amac = AMAC_allocWork(0)) == NULL )
			return (ERR);

		/* 自動登録				*/
		sprintf( tmp,"%s%s", AplGetStartPath(), "nifty_id.tbl" );
		AMAC_load( _nif_amac, tmp );

		/* ユーザー登録			*/
		sprintf( tmp,"%s%s", AplGetStartPath(), "nifty_id.lst" );
		AMAC_load( _nif_amac, tmp );
	}
	return (NORMAL);
}

/*************************************************************************
*	ID置換用メニュー
*************************************************************************/

int		_nif_setAmac( char *ntm, int x, int y )
{
	int		ret;
	char	*obj;
	char	*mnu;

	char	*dlg;
	char	*s, id[8+4], handle[8+4];

	char	*fdl;
	char	*fn;

	static char	*_LOAD_TITLE = "LOAD ID TABLE DATA for NIFTY-Serve";
	static char	*_SAVE_TITLE = "SAVE ID TABLE DATA for NIFTY-Serve";

	_nif_open_amac();

	do
	{
		obj = MNU_alloc(3);
		MNU_setObj(obj, 0, MNU_NOR, 'I', "Set ID & handle name", NULL, 1, NULL, NULL );
		MNU_setObj(obj, 1, MNU_NOR, 'L', "Load ID table data"  , NULL, 2, NULL, NULL );
		MNU_setObj(obj, 2, MNU_NOR, 'S', "Save ID table data"  , NULL, 3, NULL, NULL );

		mnu = MNU_open( x, y, MNUATT_EXIT, obj, "ID REGISTRATION MENU" );
		ret = MNU_start ( mnu );
		MNU_close(mnu);
		MNU_free(obj);

		switch ( ret )
		{
			case 1:
				id[0] = '\0';
				dlg = DLG_getsOpen( DLGPOS_MOS_SET_HOME, DLGPOS_MOS_SET_HOME, 320,
				    "" );
				DLG_getsSetTitle( dlg, "ID" );
				ret = DLG_getsStart( dlg, 8, id );
				id[8] = '\0';
				DLG_getsClose(dlg);
				if ( ret <= 0 )
				{	ret = TRUE;
					break;
				}

				if ( (s = AMAC_getName( _nif_amac, id )) == NULL )
					handle[0] = '\0';
				else
				{	/* 既に登録されている	*/
					strncpy( handle, s, 8 );
					handle[8] = '\0';
				}
				dlg = DLG_getsOpen( DLGPOS_MOS_SET_HOME, DLGPOS_MOS_SET_HOME, 320,
				    "ID:%s", id );
				DLG_getsSetTitle( dlg, "HANDLE" );
				ret = DLG_getsStart( dlg, 8, handle );
				handle[8] = '\0';
				DLG_getsClose(dlg);
				if ( ret < 0 )
				{	ret = TRUE;
					break;
				}
				AMAC_setKey( _nif_amac, id, handle );
				ret = 1;
				break;

			case 2:		/* load	*/
				if ( (fdl = FDL_open(0)) == NULL )
					return (ERR);
				FDL_set_title( fdl, _LOAD_TITLE );
				FDL_set_wildcard( fdl, "*.tbl");
				ret = FDL_start(fdl);
				fn  = FDL_get_filename(fdl);
				if ( ret == NORMAL && strlen(fn) > 0 )
				{
					dlg = DLG_msgOpen( DLGPOS_CENTER_OF_SCN,DLGPOS_CENTER_OF_SCN,
					    6*60,12*6, C_MBLACK,C_DLGBASE, COLMIX(C_INFO,C_GRAY),
					    _LOAD_TITLE );
					DLG_msgSetConfig( dlg, 4, 6, 12 );
					DLG_msgClear( dlg, -1 );
					DLG_msgPrintf(dlg,"\r\n" );
					DLG_msgPrintf(dlg,"FILE NAME : %s\r\n", fn );
					if ( AMAC_load( _nif_amac, fn ) != NORMAL )
						DLG_msgPrintf(dlg,"@ LOAD ERROR!!r\n" );
					else
						DLG_msgPrintf(dlg,"Ok!!\r\n", fn );
					MNU_wait(3);
					DLG_msgClose(dlg);
				}
				FDL_close(fdl);
				ret = 1;
				break;

			case 3:		/* save	*/
				if ( (fdl = FDL_open(0)) == NULL )
					return (ERR);
				FDL_set_title( fdl, _SAVE_TITLE );
				FDL_set_wildcard( fdl, "*.tbl");
				ret = FDL_start(fdl);
				fn  = FDL_get_filename(fdl);
				if ( ret == NORMAL && strlen(fn) > 0 )
				{
					dlg = DLG_msgOpen( DLGPOS_CENTER_OF_SCN,DLGPOS_CENTER_OF_SCN,
					    6*60,12*6, C_MBLACK,C_DLGBASE, COLMIX(C_INFO,C_GRAY),
					    _SAVE_TITLE );
					DLG_msgSetConfig( dlg, 4, 6, 12 );
					DLG_msgClear( dlg, -1 );
					DLG_msgPrintf(dlg,"\r\n" );
					DLG_msgPrintf(dlg,"FILE NAME : %s\r\n", fn );
					if ( AMAC_save( _nif_amac, fn, "NIFTY-Serve ID table" ) != NORMAL )
						DLG_msgPrintf(dlg,"@ SAVE ERROR!!r\n" );
					else
						DLG_msgPrintf(dlg,"Ok!!\r\n", fn );
					MNU_wait(3);
					DLG_msgClose(dlg);
				}
				FDL_close(fdl);
				ret = 1;
				break;

			default:
				ret = 0;
				break;
		}
	} while ( ret );

	return (NORMAL);
}

/*************************************************************************
*	フィルタ用関数	：	発言タイトルのピックアップ
*************************************************************************/

int			NifConf_flag = FALSE;
char	   *NifConf_reptn[20];

int		NiftyFilter_confTitle( char *ntm, char *buf )
{
	int				i, len;
	char			key[8+4], handle[20], *name;

	if ( NifConf_flag == FALSE )
	{
		_nif_open_amac();

		/* 検索パターンのコンパイル	*/

		/* 会議室一覧	------------------------------------------------*/
		NifConf_reptn[1] = RePtnAlloc("番号　発言 (未読) 　最新　　会議室名",0);
		NifConf_reptn[2] = RePtnAlloc(
		/*	" 1     658 (   0)   12/17   【7/ AV】フリートーク#5"	*/
			"..     ... (....)   ../..   .*",0);

		/* 会議室名	----------------------------------------------------*/
		/*   "- FORUM  MES( 1):title… -"	*/
		NifConf_reptn[11] = RePtnAlloc("- [A-Z].* MES(.[0-9]):.* -",0);

		/*------------------------------------------------------------------*/
		/* 通常会議室														*/

		NifConf_reptn[12] = RePtnAlloc(
		/*	 "999/999   ABC01234  Handle            title…"	*/
			"[0-9]../[0-9]..   ...[0-9]....  .* .*",0);
		NifConf_reptn[13] = RePtnAlloc(
		/*	"番号 ID       登録日      TO   CO   題名"		*/
			"番号 ID       登録日      TO   CO   題名",0);
		NifConf_reptn[14] = RePtnAlloc(
		/*	"   3 ABC01234 12/07 22:53       0   title…"		*/
			" ... ........ ../.. ..:.. ... ...   .*", 0);

		/*----------------------------------------------------------------------*/
		/* サイクリック型														*/
		NifConf_reptn[15] = RePtnAlloc(
		/*	"00000/00000 ABC01234  Handle           title…"	*/
			"[0-9]..../[0-9].... ........  .* .*", 0);

		NifConf_reptn[16] = RePtnAlloc(
		/*	"番号   ID       登録日      TO     CO 題名"		*/
			"番号   ID       登録日      TO     CO 題名",0);

		NifConf_reptn[17] = RePtnAlloc(
		/*	"   999 ABC01234 12/22 23:49 00111   1 title…"	*/
			" .[ 0-9]... ........ ../.. ..:.. ..... ... .*",0);

		NifConf_flag = TRUE;
	}

	if ( *buf == '-' )
	{
		if ( RePtnMatch( NifConf_reptn[11], buf) == 0 )
		{
			NTM_puts(ntm,"\r\n");
			NTM_puts(ntm,buf);
		}
	} else
	{
		if ( strlen(buf) < 18 )
			return (-1);
		if ( strncmp(buf,"番号",4) == 0 )
		{
			if ( RePtnMatch( NifConf_reptn[ 1], buf) == 0
			  || RePtnMatch( NifConf_reptn[13], buf) == 0 
			  || RePtnMatch( NifConf_reptn[16], buf) == 0 )
			{
				NTM_puts(ntm,"\r\n");
				NTM_puts(ntm,buf);
			}
		} else if ( strchr(buf,'/') )
		{
			if ( RePtnMatch( NifConf_reptn[ 2], buf) == 0 )
			{
				NTM_puts(ntm,buf);
			} else if ( RePtnMatch( NifConf_reptn[12], buf) == 0 )
			{	/*                        012345678901234567 */
				/*	 "999/999   ABC01234  Handle            title…"	*/
				strncpy( key,    &buf[10], 8 );	key[8] = '\0';
				if ( (name = AMAC_getName( _nif_amac, key )) == NULL )
				{	/* 登録	*/
					strncpy( handle, &buf[20],16);	handle[16] = '\0';
					for ( i = 15; i > 0; --i )
					{
						if ( handle[i] == ' ' )
							handle[i] = '\0';
						else
							break;
					}
					AMAC_setKey( _nif_amac, key, handle );
					_nifty_setid = 1;
				}
				NTM_puts(ntm,buf);
			} else if ( RePtnMatch( NifConf_reptn[15], buf) == 0 )
			{	/* サイクリック型ハンドル自動登録	*/
				/*	"00000/00000 ABC01234  Handle           title…"	*/
				strncpy( key, &buf[12], 8 );	key[8] = '\0';
				if ( (name = AMAC_getName( _nif_amac, key )) == NULL )
				{	/* 登録	*/
					strncpy( handle, &buf[22],16);	handle[16] = '\0';
					for ( i = 15; i > 0; --i )
					{
						if ( handle[i] == ' ' )
							handle[i] = '\0';
						else
							break;
					}
					AMAC_setKey( _nif_amac, key, handle );
					_nifty_setid = 1;
				}
				NTM_puts(ntm,buf);
			} else if ( RePtnMatch( NifConf_reptn[14], buf) == 0 )
			{
				/* "   3 ABC01234 12/07 22:53       0   title…"	*/
				strncpy( key, &buf[5], 8 );	key[8] = '\0';
				if ( (name = AMAC_getName( _nif_amac, key )) != NULL )
				{	/* IDが登録されている	*/
					if ( (len = strlen(name)) > 0 )
					{
						if ( len < 8 )
							len = 8;
						for ( i = 0; i < len; ++i )
						{	if ( *name )
							{	buf[5+i] = *name;
								++name;
							} else
								buf[5+i] = ' ';
						}
					}
				}
				NTM_puts(ntm,buf);
			} else if ( RePtnMatch( NifConf_reptn[17], buf) == 0 )
			{
				/* "   999 ABC01234 12/22 23:49 00111   1 title…"	*/
				strncpy( key, &buf[7], 8 );	key[8] = '\0';
				if ( (name = AMAC_getName( _nif_amac, key )) != NULL )
				{
					if ( (len = strlen(name)) > 0 )
					{
						if ( len < 8 )
							len = 8;
						for ( i = 0; i < len; ++i )
						{	if ( *name )
							{	buf[7+i] = *name;
								++name;
							} else
								buf[7+i] = ' ';
						}
					}
				}
				NTM_puts(ntm,buf);
			}
		}
	}
	return (0);
}

char	*_niftyFilter_reptn_rtc = NULL;

/*************************************************************************
*	フィルタ用関数	：	リアルタイム会議室
*************************************************************************/

int		NiftyFilter_rtc( char *ntm, char *buf )
{
	if ( _niftyFilter_reptn_rtc == NULL )
	{	_niftyFilter_reptn_rtc
		     = RePtnAlloc("([0-9],.*).*",0);
	}
	if ( *buf == '(' )
	{	if ( RePtnMatch( _niftyFilter_reptn_rtc, buf) == 0 )
			NTM_puts(ntm,buf);
	}
}

int		_nif_set_rtcFilter( char *ntm )
{
	char	*dlg;
	int		ret, ch;
	char	tmp[16], ptn[128];

	tmp[0] = '\0';
	dlg = DLG_getsOpen( DLGPOS_MOS_SET_HOME, DLGPOS_MOS_SET_HOME, 320,
	                    "表示するチャンネルを指定してください。\n    （指定のない場合はすべて）    ");
	DLG_getsSetTitle( dlg, "RTC FILTER" );
	ret = DLG_getsStart( dlg, 15, tmp );
	DLG_getsClose(dlg);
	if ( ret >= 0 )
	{
		if ( ret == 0 )
			strcpy( ptn, "([0-9]*,.*)");
		else
		{
			if ( (ch = atoi(tmp)) < 1 )
				return (ERR);
			sprintf( ptn, "(%d,.*)", ch );
		}
		if ( _niftyFilter_reptn_rtc )
			RePtnFree(_niftyFilter_reptn_rtc);
		_niftyFilter_reptn_rtc  = RePtnAlloc(ptn,0);
		_ntm_setFilterFunc( ntm, "NiftyFilter_rtc");
		return (NORMAL);
	} else
		return (ERR);
}


/*************************************************************************
*	フィルタ用関数	：	データライブラリ
*************************************************************************/

int		NiftyFilter_dataLibrary( char *ntm, char *buf )
{
	int				i, len, sub;
	char		   *center;
	char		   *s, *t, fn[16], downFn[128];
	char			key[8+4], *name;
	static int		flag = 0;
	static char	   *reptn_1 = NULL;
	static char	   *reptn_2 = NULL;
	static char	   *reptn_3 = NULL;
	static int		headerLevel = 0;

	if ( flag == 0 )
	{
		_nif_open_amac();

		/*					 "番号  ID       登録日付 バイト  参照   データ名"		*/
		reptn_1 = RePtnAlloc("番号  ID       登録日付 バイト  参照   データ名",0);
		/*					 "  48  ABC01234 93/01/01   99999  999 B FILENAME.SUB"	*/
		reptn_2 = RePtnAlloc("..... ........ ../../.. ....... .... . .*",1);
		reptn_3 = RePtnAlloc("処理 (.*)",0);
		flag = 1;
	}

	len = strlen(buf);
	if ( len > 42 && RePtnMatch( reptn_1, buf) == 0 )
	{	NTM_puts(ntm,"\r\n");
		NTM_puts(ntm,buf);
		headerLevel = 0;
	} else if ( len > 40 && RePtnMatch( reptn_2, buf) == 0 )
	{
		/*	"  48  ABC01234 93/01/01   99999  999 B FILENAME.SUB"	*/
		strncpy( key, &buf[6], 8 );	key[8] = '\0';
		if ( (name = AMAC_getName( _nif_amac, key )) != NULL )
		{
			if ( (len = strlen(name)) > 0 )
			{
				if ( len < 8 )
					len = 8;
				for ( i = 0; i < len; ++i )
				{	if ( *name )
					{	buf[6+i] = *name;
						++name;
					} else
						buf[6+i] = ' ';
				}
			}
		}
		NTM_puts(ntm,buf);
		headerLevel = 0;
	} else if ( len > 10 && strncmp( buf, "データ名：", 10) == 0 )
	{	/* ダウンロードファイル名設定	*/
		NTM_puts( ntm, "\r\n" );
		NTM_puts( ntm, buf );
		headerLevel = 1;

		s = &buf[10];
		if ( isspace(*s) )
			return (0);
		t = fn;
		len = 0;
		sub = 0;
		while ( len < 13 )
		{
			if ( *s == '\0' || isspace(*s) )
			{	*t = '\0';
				break;
			} else if ( *s == '.' )
				sub = 1;
			*t = *s;
			++t;
			++s;
			++len;
		}
		if ( len > 12 )
			return (0);
		if ( sub == 0 && len < 8 && *s )
		{
			while( isspace(*s) )
				++s;
			if ( *s == '.' )
			{	/* 拡張子	*/
				while ( len < 13 )
				{	if ( *s == '\0' || isspace(*s) )
					{	*t = '\0';
						break;
					}
					*t = *s;
					++s;
					++t;
					++len;
				}
				if ( len > 12 )
					return (0);
			}
		}
		if ( (center = NtmGetCenterPtr(ntm)) != NULL )
		{	/* センター名の指定あり	*/
			s = NtmCenterGetDownDir(center);
			if ( s && *s )
				sprintf( downFn, "%s/%s", s, fn );
		} else
			strcpy( downFn, fn );
		NTM_setCmdStr( ntm, downFn );
	} else if ( headerLevel > 0 )
	{
		if ( headerLevel < 7 )
		{
			if ( strncmp( &buf[8], "：",2) == 0 )
			{	NTM_puts( ntm, buf );
				++headerLevel;
			}
		} else
		{	if ( RePtnMatch( reptn_3, buf) == 0 )
			{	headerLevel = 0;
			} else
				NTM_puts( ntm, buf );
		}
	}
	return (NORMAL);
}

/*************************************************************************
*	フィルタ設定メニュー
*************************************************************************/

int		_NIFTY_filterMenu( char *ntm, int x, int y )
{
	int		ret;
	char	*obj;
	char	*mnu;

	obj = MNU_alloc(9);
	MNU_setObj(obj, 0, MNU_NOR, 'F', "Set filter pattern"   , NULL, 1, NULL, NULL );
	MNU_setObj(obj, 1, MNU_NOR, 'O', "Filter mode off"      , NULL, 2, NULL, NULL );
	MNU_setObj(obj, 2, MNU_NOR, 'T', "Filter test"          , NULL, 3, NULL, NULL );
	MNU_setObj(obj, 3, MNU_BLK,  0 , NULL                   , NULL, 0, NULL, NULL );
	MNU_setObj(obj, 4, MNU_NOR, '1', "Conferrence room"     , NULL, 4, NULL, NULL );
	MNU_setObj(obj, 5, MNU_NOR, '2', "Data library"         , NULL, 5, NULL, NULL );
	MNU_setObj(obj, 6, MNU_NOR, '3', "Real time conferrence", NULL, 6, NULL, NULL );
	MNU_setObj(obj, 7, MNU_BLK,  0 , NULL                   , NULL, 0, NULL, NULL );
	MNU_setObj(obj, 8, MNU_NOR, 'H', "Register Handle"      , NULL, 7, NULL, NULL );

	mnu = MNU_open( x, y, MNUATT_EXIT, obj, "FILTER MENU" );
	ret = MNU_start ( mnu );
	MNU_close(mnu);
	MNU_free(obj);
	switch ( ret )
	{
		case 1:
			_ntm_inputFilterPtn( ntm );
			break;
		case 2:	/* filter off */
			NtmSetFilterPtn ( ntm, "",0 );
			NtmSetFilterFunc( ntm, NULL );
			NtmFilterModeOff( ntm );
			break;
		case 3:
			_ntm_filterTest( ntm );
			break;
		case 4:
			_ntm_setFilterFunc( ntm, "NiftyFilter_confTitle");
			break;
		case 5:
			_ntm_setFilterFunc( ntm, "NiftyFilter_dataLibrary");
			break;
		case 6:	/* リアルタイム会議室	*/
			_nif_set_rtcFilter( ntm );
			break;
		case 7:	/* ハンドル登録	*/
			_nif_setAmac(ntm,x,y);
			break;
	}
	return (NORMAL);
}

