#pragma ident "@(#) wsubform.c 3.0.3 2010.04.01,12:19"
/*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*
  名称
      wsubform.c
      
  概要
	画面情報ファイルを読みとり、グリッド及びテキストボックスを生成する。
	作成する関数は以下の３つの関数です。
	日本語等のマルチバイト文字は2バイト使用文字のみに対応。
	UTF-8　等の2バイト以上の文字を使用することは出来ません。

	sf_wsubform() グリッド作成
	sf_panels()   パネルボックス作成
	sf_textbox()  テキストボックス作成
      
  構文
	この関数は定義ファイルを読み取りグリッドを作成します。
	int sf_wsubform(int no, int xcol,int rows,int fx ,int fy, char *f);
	int no		ウインドウ番号
	int xcol	画面の最大幅
	int rows	画面の最大行
	int fx		ウインドウの開始Ｘ軸位置
	int fy		ウインドウの開始Ｙ軸位置
	char *f		サブフォーム定義ファイル名
	返り値：フォームウインドウの幅(xcol)

	この関数はグリッド内でキー入力を受付けキーの種類により処理を分岐します。
	int sf_grid(int no,int maxtext,int xcol);
	int no		ウインドウ番号
	int maxtext	配置されたテキストの最大数
	int xcol		画面の最大幅
	返り値：F1からF12のファンクションキーとESCキーの代替値(200(ESC) 201(F1) - 211(F11) & 299(F12))
	処理の分岐は以下になります。
	KEY_IC(Insert-Key):入力モードの切替え（jnvwngetstr()の入力モード）
	↓　キー or Enter:カーソルダウン
	↑　キー：カーソルアップ
	→　キー：カーソルを右へ
	←　キー：カーソルを左へ
	TABキー：グリッドを右にスライドし、列の最後で行を下にスライドする。最後のセルを過ぎると
	　　　　最初のセルに戻りグリッド内をふたたびスライドする。
	! 〜 | の文字は KTERM 使用時のために予約されている。
	その他のキー：入力に使用する。
	日本語入力は2バイト文字のみが可能。その他のマルチバイト文字には対応していない。


	この関数は定義ファイルを読み取り複数のラベルと複数のテキストボックスを作成します。
	int sf_textbox(int no, int fx, int fy, char *f);
	int no		ウインドウ番号
	int fx		ウインドウの開始Ｘ軸位置
	int fy		ウインドウの開始Ｙ軸位置
	char *f		サブフォーム定義ファイル名
	返り値：テキストボックスの数

	この関数はテキストボックス内でキー入力を受付けキーの種類により処理を分岐します。
	int sf_formtext(int no,int maxtext, int xcol);
	int no		ウインドウ番号
	int maxtext	配置されたテキストの最大数
	int xcol		画面の最大幅
	返り値：F1からF12のファンクションキーとESCキーの代替値(100(ESC) 101(F1) - 111(F11) & 199(F12))

	この関数は定義ファイルを読み取りひとつのパネルの上に複数のラベルと複数のテキストボックスとを作成します。
	int sf_panels(int no, int xcol,int rows,int fy, char *f);
	int no		ウインドウ番号
	int xcol		画面の最大幅
	int rows		画面の最大行
	int fx		ウインドウの開始Ｘ軸位置
	int fy		ウインドウの開始Ｙ軸位置
	char *f		サブフォーム定義ファイル名
	返り値：テキストボックスの数

	この関数は定義ファイルを読み取りひとつのパネルの上に複数のラベルと複数のテキストボックスとを作成します。
	int sf_paneltext(int no, int maxpaneltext, int xcol);
	int no		ウインドウ番号
	int maxpaneltext	配置されたテキストの最大数
	int xcol		画面の最大幅
	返り値：F1からF12のファンクションキーとESCキーの代替値(300(ESC) 301(F1) - 311(F11) & 399(F12))

	この関数はセルの属性を調査します。
	int sf_status(int no, int type, char opt);
	int no		ウインドウ番号
	int type	テキストボックス＝１、グリッド＝２，パネルテキスト＝３
	int opt		w,yx,y,X,n,l,c,a,A,f,s
	w	ウインドウが存在するかどうか無い場合は−１を返す。
	y	フォームウインドウ上のセルのＹ軸
	x	フォームウインドウ上のセルのＸ軸
	Y	セルの行番号
	X	セルのカラム番号（０〜）
	n	セルの番号（０〜）
	l	セルの長さ
	c	セルのカラム番号（１〜）
	a	セルのアライメント
	A	セルのアクション
	f	セルのフィールドタイプ
	s	セルのスキップ
	D	DBgrid()のみ利用可能。DBのレコードを格納するsplitDBbuff[index][]のindex番号を取り出す。
	返り値：各オプションの値

	この関数は複数のテキストボックスでのカーソル移動位置指定を行います。
	int sf_tlocate(int no, int col);
	int no		ウインドウ番号
	int col		カラム番号
	返り値：成功は0、失敗は-1

	この関数はグリッド内でのカーソル移動位置指定を行います。
	int sf_glocate(int no, int col, char line);
	int no		ウインドウ番号
	int col		カラム番号
	int line		行番号
	返り値：成功は0、失敗は-1

	void sf_tbegin();
	テキスト入力を始める場合必ず必要。テキストのリングポインタの最初の位置に移動する。

	void sf_tprev();
	テキスト入力時現在位置より後ろにポインタを進める。

	void sf_tnext();
	テキスト入力時現在位置より前にポインタを進める。

	この関数はテキストボックスへ文字を書き込みます。
	int sf_tput(int no, int col, char *s);
	int no		ウインドウ番号
	int col		現在のカラム番号
	char *s		テキストボックスセルに書き込む文字列
	返り値：成功は0、失敗は-1

	この関数はグリッドセルへ文字を書き込みます。
	int sf_gput(int no, int col, int line, char *s);
	int no		ウインドウ番号
	int col		カラム番号
	int line		行番号
	char *s		グリッドセルに書き込む文字列
	返り値：成功は0、失敗は-1

	この関数はテキストボックスから文字列を取り出します。
	int sf_tget(int no, int col,char *s);
	int no		ウインドウ番号
	int col		現在のカラム番号
	char *s		テキストボックスセルから読み込んだ文字列
	返り値：成功は0、失敗は-1
	※ sf_tget()はテキストの連鎖ポインタを操作している。
	  ポインタの位置は指定位置と現在位置とのオフセットで判断している。

	この関数はグリッドセルから文字列を取り出します。
	int sf_gget(int no, int col, int line,char *s);
	int no		ウインドウ番号
	int col		カラム番号
	int line		行番号
	char *s		グリッドセルから読み込んだ文字列
	返り値：成功は0、失敗は-1

	この関数はテキストボックス内の文字列を右寄せ、左寄せ、センター寄せします。
	int sf_tcep(int no, int col, int align, char *s);
	int no		ウインドウ番号
	int col		カラム番号
	int align		１：右詰　２：左詰　３：センター
	char *s		テキストボックスセルに書き込む文字列文字列
	返り値：成功は0、失敗は-1

	この関数はグリッドセル内の文字列を右寄せ、左寄せ、センター寄せします。
	int sf_gcep(int no, int col, int line, int align, char *s);
	int no		ウインドウ番号
	int col		カラム番号
	int line		行番号
	int align		１：右詰　２：左詰　３：センター
	char *s		グリッドセルに書き込む文字列文字列
	返り値：成功は0、失敗は-1

	この関数はテキストボックス内の数字列に3桁ごとにカンマをふります。
	int sf_tvarprint(int no, int col, char *s);
	int no		ウインドウ番号
	int col		現在のカラム番号
	char *s		テキストボックスセルから読み込んだ文字列
	返り値：成功は0、失敗は-1

	この関数はグリッドセル内の数字列に3桁ごとにカンマをふります。
	int sf_gvarprint(int no, int col, int line, char *s);
	int no		ウインドウ番号
	int col		カラム番号
	int line		行番号
	char *s		グリッドセルから読み込んだ文字列
	返り値：成功は0、失敗は-1

	※以下はDBに対応した関数です。col と line の位置が逆になっていることに注意してください。
	※DBに関連した関数は特殊な処理をしています。
	  特にwsubform.h に定義されている splitDBbuff[][] は ase エディタで定義された定義ファイルの情報を利用します。

	int sf_DBgrid(int no,int maxtext,int xcol,int startline,nt DBcount,int maxcol);
	int no		ウインドウ番号
	int maxtext	配置されたテキストの最大数
	int xcol		画面の最大幅
	int startline	DB行の表示初期行
	int DBcount		読み込んだDBの最大行
	int maxcol		読み込んだDBの最大項目数
	返り値：F1からF12のファンクションキーとESCキーの代替値(200(ESC) 201(F1) - 211(F11) & 299(F12))

	void sf_initgridcell(int no);
	int no		ウインドウ番号
	全てのグリッドセルをスペースで初期化します。

	int sf_getstartline(int no);
	int no		ウインドウ番号
	返り値：成功は0、失敗は-1
	ＤＢグリッドの表示初期行を返します。

	void sf_wrefreshcell(int no,int line,int col);
	int no		ウインドウ番号
	int line		行番号
	int col		カラム番号
	指定したウインドウのセルを再表示します。

	void sf_wrefreshform(int no);
	int no		ウインドウ番号
	指定したウインドウを再表示します。

	void sf_startcell(int no);
	int no		ウインドウ番号
	セルのポジションを０で初期化します。

	void sf_to_text(int in,char *out)
	int in		int の数値
	char *out	数値を文字に変換したバッファ
	DBの各行をsplitDBbuff[][]に格納するために数値を文字列(テキスト)化します。

	long sf_to_numeric(char *in);
	char *in	数値を文字に変換したバッファ
	整数字の文字列を数値にして返す。
	splitDBbuff[][]の各行をDBに格納するために数字の場合は数値(long int)に変換します。

	int sf_to_integer(char *in);
	char *in	数字の文字列
	整数字の文字列を数値にして返す。
	splitDBbuff[][]の各行をDBに格納するために数字の場合は数値(int)に変換します。

	int sf_to_double(char *in);
	小数点数字の文字列を小数点を含む数値にして返します。

	void sf_freeDB(int no, int DBcount, int maxcol);
	int no		ウインドウ番号
	int DBcount	データベーステーブル行の現在の行数
	int maxcol	データベーステーブル行の最大項目数
	テーブルのカラム項目と行が割り当てられたsplitDBbuff[][]をメモリから開放します。

	int sf_textboxfree(int maxtext);
	int maxtext	データベーステーブル列の最大項目数

	int sf_ggetDB(int no, int line, int col, int startline,char *s);
	int no		ウインドウ番号
	int line	DBグリッドの行番号
	int col		DBグリッドのカラム番号
	int startline	グリッドの１行目に読み込むDBの行番号
	char *s		DBから読み込んだ文字列
	返り値：成功は0、失敗は-1
	グリッドセルと同じ位置にあるデータベース行とカラムの情報を読み取ります。

	int sf_gputDB(int no, int line, int col, int startline,char *s);
	int no		ウインドウ番号
	int line	DBグリッドの行番号
	int col		DBグリッドのカラム番号
	int startline	グリッドの１行目に書き込むDBの行番号
	char *s		DBに書き込む文字列
	返り値：成功は0、失敗は-1
	グリッドセルと同じ位置にあるデータベーステーブル行カラムに情報を書き込みます。

	int sf_tgetDB(int no, int col, char *s);
	int no		ウインドウ番号
	int col		テキストボックスのカラム番号
	char *s		テキストボックスから読み込んだ文字列
	返り値：成功は0、失敗は-1
	テキストボックスセルと同じ位置にあるデータベーステーブル行とカラムの情報を読み取ります。

	int sf_tputDB(int no, int col, char *s);
	int no		ウインドウ番号
	int col		テキストボックスのカラム番号
	char *s		DBに書き込む文字列
	返り値：成功は0、失敗は-1
	テキストボックスセルと同じ位置にあるデータベーステーブル行カラムに情報を書き込みます。

	int sf_tgetDBall(int no);
	int no		ウインドウ番号
	※テキストボックスをDBテキストボックス化する。

	void sf_assgetDB(int no,int line,int col, char *buff, int size);
	int no		ウインドウ番号
	int line	行番号
	int col		カラム番号
	char *buff	DBから読み込んだ文字列
	int size	ecpg で定義された内部配列のサイズ
	ECPGソースの内部で定義された配列をsf_DBgrid()で扱えるようsplitDBbuff[][]に展開します。
	同時に初期化も行います。
	FETCHされたDB行を扱うための関数です。DBからの読み取り専用の関数です。

	void sf_assputDB(int no,int col, char *buff, int size);
	int no		ウインドウ番号
	int col		カラム番号
	char *buff	DBに書き込む文字列
	int size	ecpg で定義された内部配列のサイズ
	テキストボックス用配列splitDBbuff[]に展開されたデータ(char*)をECPGで扱えるように元に戻すための準備をします。
	同時に初期化も行います。
	特にINSERT,UPDATEでDBへの書き込みを行う場合に使用します。


	以下の2つの関数は定義ファイルを使用しないで直接テキストボックスやグリッドを
	作成する機能を持ちます。

	この関数は定義ファイルを使用しないでテキストボックスを作成します。
	aseのエディター画面からコマンドでＣ言語のソースファイルを生成し、
	その中身部分を定義ファイル呼出部分と置き換えて利用します。
	int MakeTextBox(int no,int fx,int fy,int xcol,int xrow,int *label_no,char **label_text,int *label_x,int *label_y,int *label_length,int *textbox_no,int *textbox_x,int *textbox_y,int *textbox_length,int *align,int *action,int *field,int *skipstep, int m)

	int no	ウインドウ番号	
	int fx	ウインドウＸ軸開始位置
	int fy	ウインドウＹ軸開始位置
	int xcol	ウインドウ横幅
	int xrow	ウインドウ高さ
	int *label_no	ラベル番号
	char **label_text	ラベル内文字列(ラベルテキストの配列へのポインタ)
	int *label_x	ラベルＸ軸開始位置
	int *label_y	ラベルＹ軸開始位置
	int *label_length	ラベルの長さ
	int *textbox_no		テキストボックス番号
	int *textbox_x	テキストボックスＸ軸開始位置
	int *textbox_y	テキストボックスＹ軸開始位置
	int *textbox_length	テキストボックスの長さ
	int *align	テキストボックス内の文字の位置属性(1.右 2.左 3.センター)
	int *action	テキストボックスの編集属性(0.編集可 1.編集不可)
	int *field	テキストボックスの属性
		TEXT.1 NUMERIC.2 BOOL.3 CURRENCY.4 DATE.5 SINGLE.6 DOUBLE.7 BYTE.8
	int *skipstep 	テキストボックス移動属性(0.SKIP 1.STEP)
	int m	テキストボックスの数

	この関数は定義ファイルを使用しないでグリッドを作成します。
	aseのエディター画面からコマンドでＣ言語のソースファイルを生成し、
	その中身部分を定義ファイル呼出部分と置き換えて利用します。
	int MakeWsubForm(int no, int xcol,int rows,int fx ,int fy,int grid_sx,int grid_sy,int grid_ex,int grid_ey,int *length,int *align,int *action,int *field,int *skipstep,char **grid_titles,int m)

	int no		ウインドウ番号
	int xcol	ウインドウ横幅
	int rows	ウインドウ高さ
	int fx 		ウインドウＸ軸開始位置
	int fy		ウインドウＹ軸開始位置
	int grid_sx		グリッドＸ軸開始位置
	int grid_sy		グリッドＹ軸開始位置
	int grid_ex		グリッドＸ軸終端位置
	int grid_ey		グリッドＹ軸終端位置
	int *length		グリッド各縦列の幅
	int *align		グリッド各縦列の文字の位置属性(1.右 2.左 3.センター)
	int *action		グリッド各縦列の編集属性(0.編集可 1.編集不可)
	int *field		グリッド各縦列の属性
		TEXT.1 NUMERIC.2 BOOL.3 CURRENCY.4 DATE.5 SINGLE.6 DOUBLE.7 BYTE.8
	int *skipstep		グリッド各縦列の移動属性(0.SKIP 1.STEP)
	char **grid_titles		グリッド各縦列内の文字列(テキストの配列へのポインタ)
	int m			グリッドの行数


  説明

      
  多言語化対応
      

  診断
      

  例
      添付の sample.c を参照

  参照
	ncurses
      
  バグ
      
      
  著者
	
	Shigeki Ono. 2001/01/15
      
  標準準拠
      


  作者後書


*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*/

#include "wsubform.h"

static char label[MAX_POS][MAX_LEN];	//For label strings
static int Labelpos[MAX_POS][4];	//For label positionos
static int Textpos[MAX_POS][4];		//For Textbox positionos
static char tmpbuff1[MAX_TMP];		//Tempolary buffer no 1
static char tmpbuff2[MAX_TMP];		//Tempolary buffer no 2

int wmode;				//For input key mode
WINDOW *emi;				//Emidiate window used (wmode)
char gridtitles[MAX_POS][MAX_LEN];	//For grid title

typedef struct stat Dir;		//for definition of curses display file
Dir dirptr;
Dir  *fileptr = &dirptr;

TextBox	Begin, Ending;			//Dummy hedder for Textbox links
TextBox	 *begin = &Begin;		
TextBox	 *ending = &Ending;
TextBox	 *tp = &Begin;

char tmp[256];

/************************************************************************/
/* NAME      :sf_tbegin()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
void sf_tbegin(void)
{
	tp = begin->next;
}

/************************************************************************/
/* NAME      :sf_tprev()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
int sf_tprev(void)
{
	if(tp->prev != (TextBox *)NULL)
	{
		tp = tp->prev;
		return(0);
	}
	else
	{
		return(-1);
	}
}

/************************************************************************/
/* NAME      :sf_to_integer()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
int sf_to_integer(char *in)
{
	int out;
	out = atoi(in);
	return(out);
}
/************************************************************************/
/* NAME      :sf_to_double()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
int sf_to_double(char *in)
{
	double out;
	out = atof(in);
	return(out);
}

/************************************************************************/
/* NAME      :sf_tgetDB()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
int sf_tgetDB(int no, int col, char *s)
{
	if(sf_tget(no,col,s) == -1)
	{
		return(-1);
	}
	else
	{
		sprintf(splitDBbuff[col],"%s",s);
		return(0);
	}
}

/************************************************************************/
/* NAME      :sf_tputDB()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
int sf_tputDB(int no, int col, char *s)
{
	sprintf(s,"%s",splitDBbuff[col]);
	if(sf_tput(no,col,s) == -1)
		return(-1);
	else
		return(0);
}

/************************************************************************/
/* NAME      :sf_tgetDBall()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
int sf_tgetDBall(int no)
{
	int t;
	char s[MAX_STR];

	sf_tbegin();
	for(t=0;tp->next != (TextBox *)NULL;t++)
	{
		splitDBbuff[t] = (char *)malloc((tp->len)+1);
		sf_tget(no,t,s);
		sprintf(splitDBbuff[t],"%s",s);
		sf_tnext();
	}
	splitDBbuff[t] = (char *)malloc((tp->len)+1);
	sf_tget(no,t,s);
	sprintf(splitDBbuff[t],"%s",s);
}

/************************************************************************/
/* NAME      :sf_assputDB()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
void sf_assputDB(int no,int col, char *buff, int size)
{
	switch(ft[no].cp[col][0].ftype)
	{
	case 1:	//TEXT or char or varchar TYPE
		memset(buff,'\0',sizeof(size));
		sprintf(buff,"%s",splitDBbuff[col]);
		free(splitDBbuff[col]);
		break;
	case 2:	//NUMERIC or integer TYPE
		memset(buff,'\0',sizeof(size));
		sprintf(buff,"%s",splitDBbuff[col]);
		free(splitDBbuff[col]);
		break;
	case 3:	//BOOL TYPE
		memset(buff,'\0',sizeof(buff));
		sprintf(buff,"%s",splitDBbuff[col]);
		free(splitDBbuff[col]);
		break;
	case 4:	//CURRENCY AND MOENY TYPE
		memset(buff,'\0',sizeof(buff));
		sprintf(buff,"%s",splitDBbuff[col]);
		free(splitDBbuff[col]);
		break;
	case 5:	//DATE TYPE
		memset(buff,'\0',sizeof(buff));
		sprintf(buff,"%-8s",splitDBbuff[col]);
		free(splitDBbuff[col]);
		break;
	case 6:	//SINGLE TYPE
		memset(buff,'\0',sizeof(buff));
		sprintf(buff,"%.4f",atof(splitDBbuff[col]));
		free(splitDBbuff[col]);
		break;
	case 7:	//DOUBLE TYPE
		memset(buff,'\0',sizeof(buff));
		sprintf(buff,"%.8f",atof(splitDBbuff[col]));
		free(splitDBbuff[col]);
		break;
	case 8:	//BYTE TYPE
		memset(buff,'\0',sizeof(buff));
		sprintf(buff,"%c",splitDBbuff[col][0]);
		free(splitDBbuff[col]);
		break;
	default:
		break;
	}
}
//-----------------------------------------------------------------2006-07-18
/************************************************************************/
/* NAME      :sf_initgridcell()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
void sf_initgridcell(int no)
{
	int i,j;
	char s[MAX_TMP];

	for(i=0;i<ft[no].lcol;i++)
	{
		for(j=0;j<(ft[no].ey-ft[no].sy)+1;j++)
		{
			sprintf(s," ");
			sf_gput(no,i,j,s);
		}
	}
}

/************************************************************************/
/* NAME      :sf_getstartline()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
int sf_getstartline(int no)
{
	int startline;
	startline = xt[no].dbstartline;
	return(startline);
}

/************************************************************************/
/* NAME      :sf_wrefreshcell()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
void sf_wrefreshcell(int no,int line,int col)
{
	wrefresh(ft[no].st[line][col].vs);
}

/************************************************************************/
/* NAME      :sf_wrefreshform()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
void sf_wrefreshform(int no)
{
	wrefresh(xt[no].form);
}

/************************************************************************/
/* NAME      :sf_startcell()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
void sf_startcell(int no)
{
	ft[0].pos[0].col = 0;
	ft[0].pos[0].line = 0;
	ft[0].st[0][0].col = 0;
	ft[0].st[0][0].line = 0;
}

/************************************************************************/
/* NAME      :sf_to_text()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
void sf_to_text(int in,char *out)
{
	sprintf(out,"%d",in);
}

/************************************************************************/
/* NAME      :sf_to_numeric()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
long sf_to_numeric(char *in)
{
	long out;
	out = atol(in);
	return(out);
}

/************************************************************************/
/* NAME      :sf_freeDB()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
void sf_freeDB(int no, int DBcount, int maxcol)
{
	int i,j;
	for(i=0;i<DBcount;i++)
	{
		for(j=0;j<maxcol;j++)
		{
			free(ft[no].splitDBbuff[i][j]);
		}
	}
}

/************************************************************************/
/* NAME      :sf_ggetDB()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
int sf_ggetDB(int no, int line, int col, int startline,char *s)
{
	sf_gget(no,col,line,s);
	sprintf(ft[no].splitDBbuff[line+startline][col],"%s",s);

}

/************************************************************************/
/* NAME      :sf_gputDB()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
int sf_gputDB(int no, int line, int col, int startline,char *s)
{
	sprintf(s,"%s",ft[no].splitDBbuff[line][col]);
	if(sf_gput(no,col,line-startline,s) == -1)
		return(-1);
	else
		return(0);
}

/************************************************************************/
/* NAME      :sf_assgetDB()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
void sf_assgetDB(int no,int line,int col, char *buff, int size)
{
	switch(ft[no].cp[col][0].ftype)
	{
	case 1:	//TEXT or char or varchar TYPE
		ft[no].splitDBbuff[line][col] = (char *)malloc(size);
		memset(ft[no].splitDBbuff[line][col],'\0',sizeof(buff));
		sprintf(ft[no].splitDBbuff[line][col],"%s", buff);
		break;
	case 2:	//NUMERIC or integer TYPE
		ft[no].splitDBbuff[line][col] = (char *)malloc(size);
		memset(ft[no].splitDBbuff[line][col],'\0',sizeof(buff));
		sprintf(ft[no].splitDBbuff[line][col],"%ld", atol(buff));
		break;
	case 3:	//BOOL TYPE
		ft[no].splitDBbuff[line][col] = (char *)malloc(size);
		memset(ft[no].splitDBbuff[line][col],'\0',sizeof(buff));
		sprintf(ft[no].splitDBbuff[line][col],"%d", atoi(buff));
		break;
	case 4:	//CURRENCY AND MOENY TYPE
		ft[no].splitDBbuff[line][col] = (char *)malloc(size);
		memset(ft[no].splitDBbuff[line][col],'\0',sizeof(buff));
		sprintf(ft[no].splitDBbuff[line][col],"%15ld", atol(buff));
		break;
	case 5:	//DATE TYPE
		ft[no].splitDBbuff[line][col] = (char *)malloc(size);
		memset(ft[no].splitDBbuff[line][col],'\0',sizeof(buff));
		sprintf(ft[no].splitDBbuff[line][col],"%-8s", buff);
		break;
	case 6:	//SINGLE TYPE
		ft[no].splitDBbuff[line][col] = (char *)malloc(size);
		memset(ft[no].splitDBbuff[line][col],'\0',sizeof(buff));
		sprintf(ft[no].splitDBbuff[line][col],"%.4f", atof(buff));
		break;
	case 7:	//DOUBLE TYPE
		ft[no].splitDBbuff[line][col] = (char *)malloc(size);
		memset(ft[no].splitDBbuff[line][col],'\0',sizeof(buff));
		sprintf(ft[no].splitDBbuff[line][col],"%.8f", atof(buff));
		break;
	case 8:	//BYTE TYPE
		ft[no].splitDBbuff[line][col] = (char *)malloc(size);
		memset(ft[no].splitDBbuff[line][col],'\0',sizeof(buff));
		sprintf(ft[no].splitDBbuff[line][col],"%c", buff[0]);
		break;
	default:
		break;
	}
}
//-----------------------------------------------------------------2006-07-16
/************************************************************************/
/* NAME      :sf_status()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
int sf_status(int no, int type, char opt)
{
	int ret;
	ret = 0;
	switch(type)
	{
	case 1:
		switch(opt)
		{
		case 'w':
			if(xt[no].form == (WINDOW *)NULL)
				ret = -1;
			else
				ret = no;
			break;
		case 'x':
			ret = ft[no].pos[xt[no].t_col].x;
			break;
		case 'y':
			ret = ft[no].pos[xt[no].t_col].y;
			break;
		case 'X':
			ret = ft[no].pos[xt[no].t_col].c;
			break;
		case 'n':
			ret = ft[no].pos[xt[no].t_col].n;
			break;
		case 'l':
			ret = ft[no].pos[xt[no].t_col].len;
			break;
		case 'c':
			ret = ft[no].pos[xt[no].t_col].c;
			break;
		case 'a':
			ret = ft[no].pos[xt[no].t_col].align;
			break;
		case 'A':
			ret = ft[no].pos[xt[no].t_col].action;
			break;
		case 'f':
			ret = ft[no].pos[xt[no].t_col].ftype;
			break;
		case 's':
			ret = ft[no].pos[xt[no].t_col].stype;
			break;
		default:
			break;
		}
		break;
	case 2:
		switch(opt)
		{
		case 'w':
			if(xt[no].form == (WINDOW *)NULL)
				ret = -1;
			else
				ret = no;
			break;
		case 'x':
			ret = ft[no].cp[xt[no].g_col][xt[no].g_line].x;
			break;
		case 'y':
			ret = ft[no].cp[xt[no].g_col][xt[no].g_line].y;
			break;
		case 'X':
			ret = ft[no].cp[xt[no].g_col][xt[no].g_line].c;
			break;
		case 'Y':
			ret = ft[no].cp[xt[no].g_col][xt[no].g_line].y;
			break;
		case 'n':
			ret = ft[no].cp[xt[no].g_col][xt[no].g_line].no;
			break;
		case 'l':
			ret = ft[no].cp[xt[no].g_col][xt[no].g_line].len;
			break;
		case 'c':
			ret = ft[no].cp[xt[no].g_col][xt[no].g_line].c;
			break;
		case 'a':
			ret = ft[no].cp[xt[no].g_col][xt[no].g_line].align;
			break;
		case 'A':
			ret = ft[no].cp[xt[no].g_col][xt[no].g_line].action;
			break;
		case 'f':
			ret = ft[no].cp[xt[no].g_col][xt[no].g_line].ftype;
			break;
		case 's':
			ret = xt[no].g_stype;
			break;
		case 'D':
			ret = xt[no].g_dbindex;
			break;
		default:
			break;
		}
		break;
	case 3:
		switch(opt)
		{
		case 'w':
			if(xt[no].form == (WINDOW *)NULL)
				ret = -1;
			else
				ret = no;
			break;
		case 'x':
			ret = ft[no].pos[xt[no].t_col].x;
			break;
		case 'y':
			ret = ft[no].pos[xt[no].t_col].y;
			break;
		case 'X':
			ret = ft[no].pos[xt[no].t_col].col;
			break;
		case 'n':
			ret = ft[no].pos[xt[no].t_col].n;
			break;
		case 'l':
			ret = ft[no].pos[xt[no].t_col].len;
			break;
		case 'c':
			ret = ft[no].pos[xt[no].t_col].c;
			break;
		case 'a':
			ret = ft[no].pos[xt[no].t_col].align;
			break;
		case 'A':
			ret = ft[no].pos[xt[no].t_col].action;
			break;
		case 'f':
			ret = ft[no].pos[xt[no].t_col].ftype;
			break;
		case 's':
			ret = ft[no].pos[xt[no].t_col].stype;
			break;
		default:
			break;
		}
		break;
	default:
		break;
	}
	return(ret);
}

/************************************************************************/
/* NAME      :sf_tlocate()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
int sf_tlocate(int no, int col)
{
	int ret;
	ret = 0;
	if(col > xt[no].maxtext)
		return(-1);
	xt[no].t_col = col-1;
	return(ret);
}

/************************************************************************/
/* NAME      :sf_glocate()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
int sf_glocate(int no, int col, char line)
{
	int ret;
	ret = 0;
	if(col > (ft[no].ex-ft[no].sx)+1 || line > (ft[no].ey-ft[no].sy)+1)
		return(-1);
	xt[no].g_col = col-1;
	xt[no].g_line = line-1;
	return(ret);
}

/************************************************************************/
/* NAME      :sf_tnext()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
int sf_tnext(void)
{
	if(tp->next != (TextBox *)NULL)
	{
		tp = tp->next;
		return(0);
	}
	else
	{
		return(-1);
	}
}

/************************************************************************/
/* NAME      :sf_tput()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
int sf_tput(int no, int col, char *s)
{
	int ret;
	char spacer[256];
	ret = 0;

	//2バイト文字以上は受け付けない UTF-8 = NO 2009.08.09
//	if(tp->len < strlen(s))
//		return(-1);
	if(tp->len > strlen(s))
	{
		memset(spacer,'\0',sizeof(spacer));
		memset(spacer,' ',tp->len-strlen(s));
		sprintf(tmpbuff2,"%s%s",s,spacer);
	}
	else
	{
		s[tp->len] = '\0';
		sprintf(tmpbuff2,"%s",s); 
	}
	switch(tp->align)
	{
	case 0:
		sprintf(tp->s,"%s",tmpbuff2);
		break;
	case 1:
		sprintf(tp->s,"%s",srcep(tmpbuff2));
		break;
	case 2:
		sprintf(tp->s,"%s",slcep(tmpbuff2));
		break;
	case 3:
		sprintf(tp->s,"%s",sccep(tmpbuff2));
		break;
	default:
		sprintf(tp->s,"%s",slcep(tmpbuff2));
		break;
	}
	mvwprintw(ft[no].pos[col].vs,0,1,"%s",tp->s);
	return(ret);
}

/************************************************************************/
/* NAME      :sf_gput()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
int sf_gput(int no, int col, int line, char *s)
{
	int ret;
	int len;
	char spacer[256];
	ret = 0;

	if(col > ft[no].lcol)
		return(-1);
	if(line > (ft[no].ey-ft[no].sy))
		return(-1);
	if(ft[no].cp[col][line].len > strlen(s))
	{
		memset(spacer,'\0',sizeof(spacer));
		memset(spacer,' ',ft[no].cp[col][line].len-strlen(s));
		sprintf(tmpbuff2,"%s%s",s,spacer);
	}
	else
	{
		s[ft[no].cp[col][line].len] = '\0';
		sprintf(tmpbuff2,"%s",s);
	}
	switch(ft[no].cp[col][line].align)
	{
	case 0:
		sprintf(ft[no].cp[col][line].s,"%s",tmpbuff2);
		break;
	case 1:
		sprintf(ft[no].cp[col][line].s,"%s",srcep(tmpbuff2));
		break;
	case 2:
		sprintf(ft[no].cp[col][line].s,"%s",slcep(tmpbuff2));
		break;
	case 3:
		sprintf(ft[no].cp[col][line].s,"%s",sccep(tmpbuff2));
		break;
	default:
		sprintf(ft[no].cp[col][line].s,"%s",slcep(tmpbuff2));
		break;
	}
	mvwprintw(ft[no].st[col][line].vs,0,1,"%s",ft[no].cp[col][line].s);
	wrefresh(ft[no].st[col][line].vs);
	return(ret);
}

/************************************************************************/
/* NAME      :sf_tcep()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
int sf_tcep(int no, int col, int align, char *s)
{
	int ret;
	int len;
	char spacer[256];
	ret = 0;

	memset(spacer,'\0',sizeof(spacer));
	memset(spacer,' ',tp->len-strlen(s));
	sprintf(tmpbuff2,"%s%s",s,spacer);
	switch(align)
	{
	case 1:
		sprintf(tp->s,"%s",srcep(tmpbuff2));
		mvwprintw(ft[no].pos[col].vs,0,1,"%s",tp->s);
		break;
	case 2:
		sprintf(tp->s,"%s",slcep(tmpbuff2));
		mvwprintw(ft[no].pos[col].vs,0,1,"%s",tp->s);
		break;
	case 3:
		sprintf(tp->s,"%s",sccep(tmpbuff2));
		mvwprintw(ft[no].pos[col].vs,0,1,"%s",tp->s);
		break;
	default:
		sprintf(tp->s,"%s",slcep(tmpbuff2));
		mvwprintw(ft[no].pos[col].vs,0,1,"%s",tp->s);
		break;
	}
	touchwin(xt[no].form);
	return(ret);
}

/************************************************************************/
/* NAME      :sf_gcep()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
int sf_gcep(int no, int col, int line, int align, char *s)
{
	int ret;
	int len;
	char spacer[256];
	ret = 0;

	//2バイト文字以上は受け付けない UTF-8 = NO 2009.08.09
	if(ft[no].cp[col][line].len < strlen(s))
		return(-1);
	if(col > ft[no].lcol)
		return(-1);
	if(line > (ft[no].ey-ft[no].sy))
		return(-1);

	memset(spacer,'\0',sizeof(spacer));
	memset(spacer,' ',ft[no].cp[col][line].len-strlen(s));
	sprintf(tmpbuff2,"%s%s",s,spacer);
	switch(align)
	{
	case 1:
		sprintf(ft[no].cp[col][line].s,"%s",srcep(tmpbuff2));
		mvwprintw(ft[no].st[col][line].vs,0,1,"%s",ft[no].cp[col][line].s);
		break;
	case 2:
		sprintf(ft[no].cp[col][line].s,"%s",slcep(tmpbuff2));
		mvwprintw(ft[no].st[col][line].vs,0,1,"%s",ft[no].cp[col][line].s);
		break;
	case 3:
		sprintf(ft[no].cp[col][line].s,"%s",sccep(tmpbuff2));
		mvwprintw(ft[no].st[col][line].vs,0,1,"%s",ft[no].cp[col][line].s);
		break;
	default:
		sprintf(ft[no].cp[col][line].s,"%s",slcep(tmpbuff2));
		mvwprintw(ft[no].st[col][line].vs,0,1,"%s",ft[no].cp[col][line].s);
		break;
	}
	touchwin(xt[no].form);
	wrefresh(ft[no].st[col][line].vs);
	return(ret);
}

/************************************************************************/
/* NAME      :sf_tvarprint()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
int sf_tvarprint(int no, int col, char *s)
{
	int ret;
	int len;
	char spacer[256];
	ret = 0;

	sprintf(tmpbuff2,"     %s",s);
	sprintf(tmpbuff1,"%s",varprint(tmpbuff2));
	if(tp->len > strlen(tmpbuff1))
	{
		memset(spacer,'\0',sizeof(spacer));
		memset(spacer,' ',tp->len-strlen(tmpbuff1));
		sprintf(tmpbuff2,"%s%s",spacer,tmpbuff1);
		sprintf(tp->s,"%s",tmpbuff2);
	}
	else
	{
		tmpbuff1[tp->len] = '\0';
		sprintf(tp->s,"%s",tmpbuff1);
	}
	mvwprintw(ft[no].pos[col].vs,0,1,"%s",tp->s);
	return(ret);
}

/************************************************************************/
/* NAME      :sf_gvarprint()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
int sf_gvarprint(int no, int col, int line, char *s)
{
	int ret;
	int len;
	char spacer[256];
	ret = 0;

	if(col > ft[no].lcol)
		return(-1);
	if(line > (ft[no].ey-ft[no].sy))
		return(-1);

	sprintf(tmpbuff2,"     %s",s);
	sprintf(tmpbuff1,"%s",varprint(tmpbuff2));
	if(ft[no].cp[col][line].len > strlen(tmpbuff1))
	{
		memset(spacer,'\0',sizeof(spacer));
		memset(spacer,' ',ft[no].cp[col][line].len-strlen(tmpbuff1));
		sprintf(tmpbuff2,"%s%s",spacer,tmpbuff1);
		sprintf(ft[no].cp[col][line].s,"%s",tmpbuff2);
	}
	else
	{
		tmpbuff1[ft[no].cp[col][line].len] = '\0';
		sprintf(ft[no].cp[col][line].s,"%s",tmpbuff1);
	}
	mvwprintw(ft[no].st[col][line].vs,0,1,"%s",ft[no].cp[col][line].s);
	wrefresh(ft[no].st[col][line].vs);
	return(ret);
}

/************************************************************************/
/* NAME      :sf_tget()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
int sf_tget(int no, int col, char *s)
{
	int i;
	int ret;
	char *p;
	int current_pos;
	int offset;

	ret = 0;
	if(col > xt[no].maxtext)
		return(-1);

	current_pos = tp->n;
	if(current_pos == col)
	{
		sprintf(s,"%s",tp->s);
		cutspace_right(s);
		return(0);
	}
	if(current_pos < col)
	{
		offset = col - current_pos;
		for(i=0;i<offset;i++)
		{
			if(tp->next != (TextBox *)NULL)
			{
				tp = tp->next;
			}
		}
		sprintf(s,"%s",tp->s);
		cutspace_right(s);
		for(i=0;i<offset;i++)
		{
			if(tp->prev != (TextBox *)NULL)
			{
				tp = tp->prev;
			}
		}
	}
	if(current_pos > col)
	{
		offset = current_pos - col;
		for(i=0;i<offset;i++)
		{
			if(tp->prev != (TextBox *)NULL)
			{
				tp = tp->prev;
			}
		}
		sprintf(s,"%s",tp->s);
		cutspace_right(s);
		for(i=0;i < offset;i++)
		{
			if(tp->next != (TextBox *)NULL)
			{
				tp = tp->next;
			}
		}
	}
	return(0);
}

/************************************************************************/
/* NAME      :sf_gget()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
int sf_gget(int no, int col, int line,char *s)
{
	int ret;
	char *p;

	ret = 0;
	if(col > ft[no].lcol)
		return(-1);
	if(line > (ft[no].ey-ft[no].sy))
		return(-1);

//2001.02.01
//	sprintf(s,"%s",ft[no].cp[xt[no].g_c][xt[no].g_y].s);
	sprintf(s,"%s",ft[no].cp[col][line].s);
	cutspace_right(s);
	return(0);
}

/************************************************************************/
/* NAME      :gridinput()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    : ０：処理成功、-1：処理失敗                           */
/************************************************************************/
/*
TEXT			1
NUMERIC			2
BOOL			3
CURRENCY		4
DATE			5
SINGLE			6
DOUBLE			7
BYTE			8
*/
static int gridinput(int no, int i, int j, int wmode)
{
	int ret;
	static char spacer[MAX_TMP];

	echo();
	if ((strlen(ft[no].cp[i][j].s)) == 0)
	{
		switch(ft[no].cp[i][j].ftype)
		{
		case TEXT:
			sprintf(spacer,"%s",(char *)cutspace_right(ft[no].cp[i][j].s));
			sprintf(ft[no].cp[i][j].s,"%s",spacer);
			memset(ft[no].cp[i][j].s,'\0',ft[no].cp[i][j].len);
			ret = jmvwgetnstr(ft[no].st[i][j].vs,0,1,ft[no].cp[i][j].s,ft[no].cp[i][j].len,wmode,TEXT);
			break;
		case NUMERIC:
			memset(ft[no].cp[i][j].s,' ',ft[no].cp[i][j].len);
			ret = jmvwgetnstr(ft[no].st[i][j].vs,0,1,ft[no].cp[i][j].s,ft[no].cp[i][j].len,wmode,NUMERIC);
			sprintf(tmpbuff1,"%ld",(unsigned long)atol(ft[no].cp[i][j].s));
			sprintf(ft[no].cp[i][j].s,"%s",tmpbuff1);
			memset(spacer,'\0',sizeof(spacer));
			memset(spacer,' ',(ft[no].cp[i][j].len-(strlen(ft[no].cp[i][j].s))));
			sprintf(tmpbuff1,"%s%s",ft[no].cp[i][j].s,spacer);
			sprintf(ft[no].cp[i][j].s,"%s",tmpbuff1);
			break;
		case CURRENCY:
			memset(ft[no].cp[i][j].s,' ',ft[no].cp[i][j].len);
			ret = jmvwgetnstr(ft[no].st[i][j].vs,0,1,ft[no].cp[i][j].s,ft[no].cp[i][j].len,wmode,CURRENCY);
			if(ft[no].cp[i][j].len < 14)
			{
				sprintf(tmpbuff1,"%ld",(unsigned long)atol(ft[no].cp[i][j].s));
				sprintf(ft[no].cp[i][j].s,"%s",tmpbuff1);
			}
			else
			{
				sprintf(tmpbuff1,"     %ld",(unsigned long)atol(ft[no].cp[i][j].s));
				sprintf(ft[no].cp[i][j].s,"%s",varprint(tmpbuff1));
			}
			memset(spacer,'\0',sizeof(spacer));
			memset(spacer,' ',(ft[no].cp[i][j].len-(strlen(ft[no].cp[i][j].s))));
			sprintf(tmpbuff1,"%s%s",ft[no].cp[i][j].s,spacer);
			sprintf(ft[no].cp[i][j].s,"%s",tmpbuff1);
			break;
		case DATE:
			sprintf(spacer,"%s",(char *)cutspace_right(ft[no].cp[i][j].s));
			sprintf(ft[no].cp[i][j].s,"%s",spacer);
			memset(ft[no].cp[i][j].s,'\0',ft[no].cp[i][j].len);
			ret = jmvwgetnstr(ft[no].st[i][j].vs,0,1,ft[no].cp[i][j].s,ft[no].cp[i][j].len,wmode,DATE);
			break;
		}
	}
	else
	{
		sprintf(tmpbuff2,"%s",ft[no].cp[i][j].s);
		switch(ft[no].cp[i][j].ftype)
		{
		case TEXT:
			if(!ifspace(ft[no].cp[i][j].len,ft[no].cp[i][j].s))
			{
				sprintf(spacer,"%s",(char *)cutspace_right(ft[no].cp[i][j].s));
				sprintf(ft[no].cp[i][j].s,"%s",spacer);
				ret = jmvwgetnstr(ft[no].st[i][j].vs,0,1,ft[no].cp[i][j].s,ft[no].cp[i][j].len,wmode,TEXT);
				memset(spacer,'\0',sizeof(spacer));
				memset(spacer,' ',(ft[no].cp[i][j].len-(strlen(ft[no].cp[i][j].s))));
				sprintf(tmpbuff1,"%s%s",ft[no].cp[i][j].s,spacer);
				sprintf(ft[no].cp[i][j].s,"%s",tmpbuff1);
			}
			else
			{
				sprintf(spacer,"%s",(char *)cutspace_right(ft[no].cp[i][j].s));
				sprintf(ft[no].cp[i][j].s,"%s",spacer);
				ret = jmvwgetnstr(ft[no].st[i][j].vs,0,1,ft[no].cp[i][j].s,ft[no].cp[i][j].len,wmode,TEXT);
				memset(spacer,'\0',sizeof(spacer));
				memset(spacer,' ',(ft[no].cp[i][j].len-(strlen(ft[no].cp[i][j].s))));
				sprintf(tmpbuff1,"%s%s",ft[no].cp[i][j].s,spacer);
				sprintf(ft[no].cp[i][j].s,"%s",tmpbuff1);
			}
			break;
		case NUMERIC:
			if(!ifspace(ft[no].cp[i][j].len,ft[no].cp[i][j].s))
			{
				memset(ft[no].cp[i][j].s,' ',ft[no].cp[i][j].len);
				ret = jmvwgetnstr(ft[no].st[i][j].vs,0,1,ft[no].cp[i][j].s,ft[no].cp[i][j].len,wmode,NUMERIC);
				sprintf(tmpbuff1,"%ld",(unsigned long)atol(ft[no].cp[i][j].s));
				sprintf(ft[no].cp[i][j].s,"%s",tmpbuff1);
				memset(spacer,'\0',sizeof(spacer));
				memset(spacer,' ',(ft[no].cp[i][j].len-(strlen(ft[no].cp[i][j].s))));
				sprintf(tmpbuff1,"%s%s",ft[no].cp[i][j].s,spacer);
				sprintf(ft[no].cp[i][j].s,"%s",tmpbuff1);
			}
			else
			{
				memset(ft[no].cp[i][j].s,' ',ft[no].cp[i][j].len);
				ret = jmvwgetnstr(ft[no].st[i][j].vs,0,1,ft[no].cp[i][j].s,ft[no].cp[i][j].len,wmode,NUMERIC);
				sprintf(tmpbuff1,"%ld",(unsigned long)atol(ft[no].cp[i][j].s));
				sprintf(ft[no].cp[i][j].s,"%s",tmpbuff1);
				memset(spacer,'\0',sizeof(spacer));
				memset(spacer,' ',(ft[no].cp[i][j].len-(strlen(ft[no].cp[i][j].s))));
				sprintf(tmpbuff1,"%s%s",ft[no].cp[i][j].s,spacer);
				sprintf(ft[no].cp[i][j].s,"%s",tmpbuff1);
			}
			break;
		case CURRENCY:
			if(!ifspace(ft[no].cp[i][j].len,ft[no].cp[i][j].s))
			{
				memset(ft[no].cp[i][j].s,' ',ft[no].cp[i][j].len);
				ret = jmvwgetnstr(ft[no].st[i][j].vs,0,1,ft[no].cp[i][j].s,ft[no].cp[i][j].len,wmode,CURRENCY);
				if(ft[no].cp[i][j].len < 14)
				{
					sprintf(tmpbuff1,"%ld",(unsigned long)atol(ft[no].cp[i][j].s));
					sprintf(ft[no].cp[i][j].s,"%s",tmpbuff1);
				}
				else
				{
					sprintf(tmpbuff1,"     %ld",(unsigned long)atol(ft[no].cp[i][j].s));
					sprintf(ft[no].cp[i][j].s,"%s",varprint(tmpbuff1));
				}
				memset(spacer,'\0',sizeof(spacer));
				memset(spacer,' ',(ft[no].cp[i][j].len-(strlen(ft[no].cp[i][j].s))));
				sprintf(tmpbuff1,"%s%s",ft[no].cp[i][j].s,spacer);
				sprintf(ft[no].cp[i][j].s,"%s",tmpbuff1);
			}
			else
			{
				memset(ft[no].cp[i][j].s,' ',ft[no].cp[i][j].len);
				ret = jmvwgetnstr(ft[no].st[i][j].vs,0,1,ft[no].cp[i][j].s,ft[no].cp[i][j].len,wmode,CURRENCY);
				if(ft[no].cp[i][j].len < 14)
				{
					sprintf(tmpbuff1,"%ld",(unsigned long)atol(ft[no].cp[i][j].s));
					sprintf(ft[no].cp[i][j].s,"%s",tmpbuff1);
				}
				else
				{
					sprintf(tmpbuff1,"     %ld",(unsigned long)atol(ft[no].cp[i][j].s));
					sprintf(ft[no].cp[i][j].s,"%s",varprint(tmpbuff1));
				}
				memset(spacer,'\0',sizeof(spacer));
				memset(spacer,' ',(ft[no].cp[i][j].len-(strlen(ft[no].cp[i][j].s))));
				sprintf(tmpbuff1,"%s%s",ft[no].cp[i][j].s,spacer);
				sprintf(ft[no].cp[i][j].s,"%s",tmpbuff1);
			}
			break;
		case DATE:
			if(!ifspace(ft[no].cp[i][j].len,ft[no].cp[i][j].s))
			{
				sprintf(spacer,"%s",(char *)cutspace_right(ft[no].cp[i][j].s));
				sprintf(ft[no].cp[i][j].s,"%s",spacer);
				memset(ft[no].cp[i][j].s,'\0',ft[no].cp[i][j].len);
				ret = jmvwgetnstr(ft[no].st[i][j].vs,0,1,ft[no].cp[i][j].s,ft[no].cp[i][j].len,wmode,DATE);
			}
			else
			{
				sprintf(spacer,"%s",(char *)cutspace_right(ft[no].cp[i][j].s));
				sprintf(ft[no].cp[i][j].s,"%s",spacer);

				sprintf(spacer,"%s",(char *)cutspace_right(ft[no].cp[i][j].s));
				sprintf(ft[no].cp[i][j].s,"%s",spacer);
				memset(ft[no].cp[i][j].s,'\0',ft[no].cp[i][j].len);
				ret = jmvwgetnstr(ft[no].st[i][j].vs,0,1,ft[no].cp[i][j].s,ft[no].cp[i][j].len,wmode,DATE);
			}
			break;
		}
	}
	wrefresh(ft[no].st[i][j].vs);
	touchwin(xt[no].form);
	if(ret == 0x1b)
	{
		if(strlen(ft[no].cp[i][j].s) < 1)
			return -1;
		strcpy(ft[no].cp[i][j].s,tmpbuff2);
		wrefresh(ft[no].st[i][j].vs);
		return -1;
	}
	switch(ft[no].cp[i][j].align)
	{
	case 1:
		sprintf(ft[no].cp[i][j].s,"%s",srcep(tmpbuff1));
		mvwprintw(ft[no].st[i][j].vs,0,1,"%s",ft[no].cp[i][j].s);
		touchwin(xt[no].form);
		break;
	case 2:
		sprintf(ft[no].cp[i][j].s,"%s",slcep(tmpbuff1));
		mvwprintw(ft[no].st[i][j].vs,0,1,"%s",ft[no].cp[i][j].s);
		touchwin(xt[no].form);
		break;
	case 3:
		sprintf(ft[no].cp[i][j].s,"%s",sccep(tmpbuff1));
		mvwprintw(ft[no].st[i][j].vs,0,1,"%s",ft[no].cp[i][j].s);
		touchwin(xt[no].form);
		break;
	default:
		sprintf(ft[no].cp[i][j].s,"%s",slcep(tmpbuff1));
		mvwprintw(ft[no].st[i][j].vs,0,1,"%s",ft[no].cp[i][j].s);
		touchwin(xt[no].form);
		break;
	}
	noecho();
	return(0);
}

/************************************************************************/
/* NAME      :grid()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                          */
/************************************************************************/
int sf_grid(int no,int maxtext,int xcol)
{
	static int ch;
	static int i,j,k,l,m,n;
	static int ret;
	static char spacer[MAX_TMP];

	static int c;
	i = xt[no].g_col;
	j = xt[no].g_line;

	if(ft[no].st[0][0].vs == (WINDOW *)NULL)
		return(-1);

	for(;ft[no].cp[i][j].stype == 0 && i < (ft[no].lcol-1);)
	{
		i++;
	}

	touchwin(xt[no].form);

	while(1)
	{
		if(!wmode)
			mvwprintw(emi,1,1,"上書");
		else
			mvwprintw(emi,1,1,"挿入");
		wrefresh(emi);

		if(ft[no].cp[i][j].stype == 1)
		{
			wattron(ft[no].st[i][j].vs, A_UNDERLINE | A_DIM | A_REVERSE | A_PROTECT);
			mvwprintw(ft[no].st[i][j].vs,0,1,"%s",ft[no].cp[i][j].s);
			wattroff(ft[no].st[i][j].vs, A_DIM | A_REVERSE | A_PROTECT);
			wrefresh(ft[no].st[i][j].vs);

//2010.03.07
#ifdef SHOWLOCATE
			mvwprintw(xt[no].form,0,(xcol) - 18,"[%3d %3d %3d %3d]",ft[no].cp[i][j].no,ft[no].cp[i][j].x,ft[no].cp[i][j].y,ft[no].cp[i][j].c);
#endif

			ch = wgetch(xt[no].form);
			mvwprintw(ft[no].st[i][j].vs,0,1,"%s",ft[no].cp[i][j].s);
			wrefresh(ft[no].st[i][j].vs);

			xt[no].g_col = i;
			xt[no].g_line = j;
			xt[no].g_no = ft[no].cp[i][j].no;
			xt[no].g_len = ft[no].cp[i][j].len;
			xt[no].g_c = ft[no].cp[i][j].c;
			xt[no].g_x = ft[no].cp[i][j].x;
			xt[no].g_y = ft[no].cp[i][j].y;
			xt[no].g_align = ft[no].cp[i][j].align;
			xt[no].g_action = ft[no].cp[i][j].action;
			xt[no].g_ftype = ft[no].cp[i][j].ftype;
			xt[no].g_stype = ft[no].cp[i][j].stype;
		}

		switch(ch)
		{
		case KEY_IC:
			if(!wmode)	
				wmode = 1;
			else
				wmode = 0;
			break;
#ifdef IN_BACKSPACE
		case KEY_BACKSPACE: case KEY_DC:
			wrefresh(ft[no].st[i][j].vs);
			ungetch(ch);
			if(gridinput(no,i,j,wmode) == -1)
				break;
			break;
#endif
		case 0x0d: case 0x0a:
			if(j < ((ft[no].ey-ft[no].sy) - 0))
			{
				j++;
			}
			break;
		case KEY_DOWN:
			if(j < ((ft[no].ey-ft[no].sy) - 0))
			{
				j++;
			}
			break;
		case KEY_UP:
			if(j > 0)
			{
				j--;
			}
			break;
		case KEY_RIGHT:
			if(i < ft[no].lcol-1)
			{
				i++;
				for(n=i,m=0;n < ft[no].lcol;n++)
					if (ft[no].cp[n][j].stype == 1)
						m++;
					if(m == 0)
						i--;
			}
			break;
		case KEY_LEFT:
			if(i > 0)
			{
				i--;
				for(n=i,m=0;n >= 0;n--)
					if (ft[no].cp[n][j].stype == 1)
						m++;
					if(m == 0)
						i++;
			}
			break;
		case '\t':
			if(i < ft[no].lcol-1)
			{
				i++;
			}
			else if (i >= ft[no].lcol-1)
			{
				if(j > (ft[no].ey-ft[no].sy)-1)
				{
					j=0;
					i=0;
					break;
				}
				j++;
				i=0;
			}
			break;

		case 0x1b:
			return(200);
			break;
#ifdef KTERM
		case '!':
#endif
		case KEY_F(1):
			return(201);
			break;
#ifdef KTERM
		case '\"':
#endif
		case KEY_F(2):
			return(202);
			break;
#ifdef KTERM
		case '#':
#endif
		case KEY_F(3):
			return(203);
			break;
#ifdef KTERM
		case '$': 
#endif
		case KEY_F(4):
			return(204);
			break;
#ifdef KTERM
		case '%': 
#endif
		case KEY_F(5):
			return(205);
			break;
#ifdef KTERM
		case '&': 
#endif
		case KEY_F(6):
			return(206);
			break;
#ifdef KTERM
		case '\'': 
#endif
		case KEY_F(7):
			return(207);
			break;
#ifdef KTERM
		case '(': 
#endif
		case KEY_F(8):
			return(208);
			break;
#ifdef KTERM
		case ')': 
#endif
		case KEY_F(9):
			return(209);
			break;
#ifdef KTERM
		case '~': 
#endif
		case KEY_F(10):
			return(210);
			break;
#ifdef KTERM
		case '=': 
#endif
		case KEY_F(11):
			return(211);
			break;
#ifdef KTERM
		case '^': 
#endif
		case KEY_F(12):
			return(299);
			break;

		default:
			switch(ft[no].cp[i][j].action)
			{
			case 0:
				ungetch(ch);
				if(ch == '\t')
					break;
				if(gridinput(no,i,j,wmode) == -1)
				{
					break;
				}
				break;
			case 1:
				break;
			}
			break;
		}
	}
}


/************************************************************************/
/* NAME      :scroll_disp()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                          */
/************************************************************************/
static void scroll_disp(int no,int startline,int DBcount,int maxcol)
{
	int i,j;
	static char s[MAX_STR];

	for(i=0;i<DBcount-startline;i++)
	{
		for(j=0;j<maxcol;j++)
		{
			sprintf(s,"%s",ft[no].splitDBbuff[i+startline][j]);
			sf_gput(no,j,i,s);
			wrefresh(ft[no].st[j][j].vs);
		}
	}
	wrefresh(xt[no].form);
}

/************************************************************************/
/* NAME      :DBgrid()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                          */
/************************************************************************/
int sf_DBgrid(int no,int maxtext,int xcol,int startline,int DBcount,int maxcol)
{
	static int ch;
	static int i,j,k,l,m,n;
	static int ret;
	static char spacer[MAX_TMP];
	static char s[MAX_STR];

	static int c;
	static int x,y;
	static int ii,jj;

	ii = jj = 0;
	x = 0;
	y = xt[no].g_dbindex;

	i = xt[no].g_col;
	j = xt[no].g_line;

	if(ft[no].st[0][0].vs == (WINDOW *)NULL)
		return(-1);

	for(;ft[no].cp[i][j].stype == 0 && i < (ft[no].lcol-1);)
	{
		i++;
	}

	touchwin(xt[no].form);

	while(1)
	{
		if(!wmode)
			mvwprintw(emi,1,1,"上書");
		else
			mvwprintw(emi,1,1,"挿入");
		wrefresh(emi);

		if(ft[no].cp[i][j].stype == 1)
		{
			xt[no].dbstartcol = i;
			if(y < ((ft[no].ey-ft[no].sy) - 0) && y < DBcount-1)
			{
				if(j > 0  && j <= ft[no].ey-ft[no].sy)
					xt[no].dbstartline = y -j;
				if(j == 0)
					xt[no].dbstartline = y;
			} else if(DBcount > ((ft[no].ey-ft[no].sy) - 0))
			{
				if(j > 0  && j <= ft[no].ey-ft[no].sy)
					xt[no].dbstartline = y -j;
				if(j == 0)
					xt[no].dbstartline = y;
			}
			wattron(ft[no].st[i][j].vs, A_UNDERLINE | A_DIM | A_REVERSE | A_PROTECT);
			mvwprintw(ft[no].st[i][j].vs,0,1,"%s",ft[no].cp[i][j].s);
			wattroff(ft[no].st[i][j].vs, A_DIM | A_REVERSE | A_PROTECT);
			wrefresh(ft[no].st[i][j].vs);

//2010.03.07
#ifdef SHOWLOCATE
			mvwprintw(xt[no].form,0,(xcol)-30,"[%3d %3d %3d %3d %5d/%6d]",
					ft[no].cp[i][j].no,ft[no].cp[i][j].x,ft[no].cp[i][j].y,ft[no].cp[i][j].c,y+1,DBcount);
#endif

			ch = wgetch(xt[no].form);
			mvwprintw(ft[no].st[i][j].vs,0,1,"%s",ft[no].cp[i][j].s);
			wrefresh(ft[no].st[i][j].vs);

			xt[no].g_col = i;
			xt[no].g_line = j;
			xt[no].g_no = ft[no].cp[i][j].no;
			xt[no].g_len = ft[no].cp[i][j].len;
			xt[no].g_c = ft[no].cp[i][j].c;
			xt[no].g_x = ft[no].cp[i][j].x;
			xt[no].g_y = ft[no].cp[i][j].y;
			xt[no].g_align = ft[no].cp[i][j].align;
			xt[no].g_action = ft[no].cp[i][j].action;
			xt[no].g_ftype = ft[no].cp[i][j].ftype;
			xt[no].g_stype = ft[no].cp[i][j].stype;
			xt[no].g_dbindex = y;
		}

		switch(ch)
		{
		case KEY_IC:
			if(!wmode)	
				wmode = 1;
			else
				wmode = 0;
			break;
#ifdef IN_BACKSPACE
		case KEY_BACKSPACE: case KEY_DC:
			wrefresh(ft[no].st[i][j].vs);
			ungetch(ch);
			if(gridinput(no,i,j,wmode) == -1)
				break;
			break;
#endif
#ifdef NODBGRID
		case 0x0d: case 0x0a:
			if(j < ((ft[no].ey-ft[no].sy) - 0))
			{
				j++;
			}
			break;
#endif
		case KEY_DOWN:
				if(j < ((ft[no].ey-ft[no].sy) + 0) && j < DBcount-1)
				{
					j++;
					y++;
				}
				else if (DBcount - 1 > y)
				{
					y++;
					scroll_disp(no,y-(ft[no].ey-ft[no].sy),DBcount,maxcol);
				}
			break;
		case KEY_UP:
			if(j > 0  && j <= ft[no].ey-ft[no].sy)
			{
				j--;
				y--;
			}
			else
			{
				if(j == 0 && y > 0)
				{
					y--;
					scroll_disp(no,y,DBcount,maxcol);
				} else if(y > ft[no].ey-ft[no].sy )
				{
					y--;
					scroll_disp(no,y-(ft[no].ey-ft[no].sy),DBcount,maxcol);
				}
			}
			break;
		case KEY_NPAGE:
			if(DBcount <= ft[no].ey-ft[no].sy)
				break;
			for(ii=0;ii<ft[no].ey-ft[no].sy;ii++)
			{
				if(j < ((ft[no].ey-ft[no].sy) + 0) && j < DBcount-1)
				{
					j++;
					y++;
				}
				else if (DBcount - 1 > y)
				{
					y++;
				}
			}
			scroll_disp(no,y-((ft[no].ey-ft[no].sy)),DBcount,maxcol);
			break;
		case KEY_PPAGE:
			for(ii=0;ii<ft[no].ey-ft[no].sy;ii++)
			{
				if(j > 0  && j <= ft[no].ey-ft[no].sy)
				{
					j--;
					y--;
				}
				else
				{
					if(j == 0 && y > 0)
					{
						y--;
					} else if(y > ft[no].ey-ft[no].sy )
					{
						y--;
					}
				}
			}
			scroll_disp(no,y,DBcount,maxcol);
			break;
		case KEY_RIGHT:
			if(i < ft[no].lcol-1)
			{
				i++;
				for(n=i,m=0;n < ft[no].lcol;n++)
					if (ft[no].cp[n][j].stype == 1)
						m++;
					if(m == 0)
						i--;
			}
			break;
		case KEY_LEFT:
			if(i > 0)
			{
				i--;
				for(n=i,m=0;n >= 0;n--)
					if (ft[no].cp[n][j].stype == 1)
						m++;
					if(m == 0)
						i++;
			}
			break;
		case '\t':
			if(i < ft[no].lcol-1)
			{
				i++;
			} else if(i >= ft[no].lcol-1)
			{
				j++;
				y++;
				i=0;
				if(j > (ft[no].ey-ft[no].sy) + 0)
				{
					y = (y - (ft[no].ey-ft[no].sy) - 1);
					j = 0;
				}
			}
			if(j > (DBcount-1) && j < ft[no].ey-ft[no].sy)
			{
				y = (y - (ft[no].ey-ft[no].sy) - 1);
				j = 0;
				i = 0;
				y = 0;
			}
			break;

		case 0x1b:
			return(200);
			break;
#ifdef KTERM
		case '!':
#endif
		case KEY_F(1): case '!':
			return(201);
			break;
#ifdef KTERM
		case '\"':
#endif
		case KEY_F(2): case '\"':
			return(202);
			break;
#ifdef KTERM
		case '#':
#endif
		case KEY_F(3): case '#':
			return(203);
			break;
#ifdef KTERM
		case '$': 
#endif
		case KEY_F(4): case '$':
			return(204);
			break;
#ifdef KTERM
		case '%': 
#endif
		case KEY_F(5): case '%':
			return(205);
			break;
#ifdef KTERM
		case '&': 
#endif
		case KEY_F(6): case '&':
			return(206);
			break;
#ifdef KTERM
		case '\'': 
#endif
		case KEY_F(7): case '\'':
			return(207);
			break;
#ifdef KTERM
		case '(': 
#endif
		case KEY_F(8): case '(':
			return(208);
			break;
#ifdef KTERM
		case ')': 
#endif
		case KEY_F(9): case ')':
			return(209);
			break;
#ifdef KTERM
		case '~': 
#endif
		case KEY_F(10): case '~':
			return(210);
			break;
#ifdef KTERM
		case '=': 
#endif
		case KEY_F(11): case '=':
			return(211);
			break;
#ifdef KTERM
		case '^': 
#endif
		case KEY_F(12): case '^':
			return(299);
			break;

		default:
			switch(ft[no].cp[i][j].action)
			{
			case 0:
				ungetch(ch);
				if(ch == '\t')
					break;
				if(gridinput(no,i,j,wmode) == -1)
				{
					break;
				}
				break;
			case 1:
				break;
			}
			break;
		}
	}
}

/************************************************************************/
/* NAME      :textboxfree()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                        */
/************************************************************************/
int sf_textboxfree(int maxtext)
{
	int i;
	tp = begin->next;
	free(tp->s);
	free(tp);
	for(i=0;i<maxtext;i++)
	{
		if(tp->next != (TextBox *)NULL)
		{
			tp = tp->next;
			free(tp->s);
			free(tp);
		}
	}
}

/************************************************************************/
/* NAME      :textbox()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :テキストボックスの数                           */
/************************************************************************/
int sf_textbox(int no, int fx, int fy, char *f)
{
	static FILE *fp;
	static WINDOW *vs;
	static TextBox *gp;
	static int ch;
	static int i,j,k,l,m,n;
	static int  c, x, y;
	static char p[MAX_STR];
	static int xcol;
	static int rows;
	static int ncol;
	static int maxcell;
	static int maxtext;
	static char *nl;
	static char def[MAX_DEF][MAX_STR];
	static char wt[MAX_DEF][MAX_STR];
	static int align[MAX_POS];
	static int action[MAX_POS];
	static int field[MAX_COL];
	static int skipstep[MAX_COL];
	static int a;
	static char spacer[MAX_TMP];

	static int label_no[MAX_POS];
	static int label_x[MAX_POS];
	static int label_y[MAX_POS];
	static int label_length[MAX_POS];
	static char label_text[MAX_POS][MAX_LEN];
	static int textbox_no[MAX_POS];
	static int textbox_x[MAX_POS];
	static int textbox_y[MAX_POS];
	static int textbox_length[MAX_POS];

	if ((fp = fopen(f,"r")) == NULL)
	{
		return(0);
	}

	i = 0;
	while((fgets(def[i],MAX_TMP ,fp)) != NULL)
	{
		if((nl = strchr(def[i],'\n')) != NULL)
		{
			*nl = '\0';
			i++;
		}
		if((nl = strchr(def[i],'#')) != NULL)
		{
			*nl = '\0';
			i++;
		}
	}

	ncol = 0;
	for(j=0;j<i;j++)
	{

		if((nl = strchr(def[j],'=')) != NULL)
		{
			for(l=0;def[j][l]!='=';l++)
			{
				p[l]=toupper(def[j][l]);
			}
			p[l]=toupper(def[j][l]);
			p[l+1] = '\0';
			if(compare(0,p,textboxprpty[0]) == 0)
			{
				strcpy(tmpbuff1,nl+1);
				xcol = atoi(tmpbuff1);
			}
			if(compare(1,p,textboxprpty[1]) == 1)
			{
				strcpy(tmpbuff1,nl+1);
				rows = atoi(tmpbuff1);
			}
			if(compare(2,p,textboxprpty[2]) == 2)
			{
				m = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						label_x[m] = atoi(tmpbuff2);
						m++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = tmpbuff1[k];
						n++;
						break;
					}
				}
			}
			if(compare(3,p,textboxprpty[3]) == 3)
			{
				m = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						label_y[m] = atoi(tmpbuff2);
						m++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = tmpbuff1[k];
						n++;
						break;
					}
				}
			}
			if(compare(4,p,textboxprpty[4]) == 4)
			{
				m = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						label_length[m] = atoi(tmpbuff2);
						m++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = tmpbuff1[k];
						n++;
						break;
					}
				}
			}
			if(compare(5,p,textboxprpty[5]) == 5)
			{
				m = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						sprintf(label_text[m],"%s",tmpbuff2);
						m++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = tmpbuff1[k];
						n++;
						break;
					}
				}
			}
			if(compare(6,p,textboxprpty[6]) == 6)
			{
				m = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						textbox_no[m] = atoi(tmpbuff2);
						m++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = tmpbuff1[k];
						n++;
						break;
					}
				}
			}
			if(compare(7,p,textboxprpty[7]) == 7)
			{
				m = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						textbox_x[m] = atoi(tmpbuff2);
						m++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = tmpbuff1[k];
						n++;
						break;
					}
				}
			}
			if(compare(8,p,textboxprpty[8]) == 8)
			{
				m = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						textbox_y[m] = atoi(tmpbuff2);
						m++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = tmpbuff1[k];
						n++;
						break;
					}
				}
			}
			if(compare(9,p,textboxprpty[9]) == 9)
			{
				m = 0;
				a = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						textbox_length[m] = atoi(tmpbuff2);
						m++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = tmpbuff1[k];
						n++;
						break;
					}
				}
			}
			if(compare(10,p,textboxprpty[10]) == 10)
			{
				a = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						if((strcmp(tmpbuff2,RIGHT)) == 0)
						{
							align[a] = 1;
						}
						if((strcmp(tmpbuff2,LEFT)) == 0)
						{
							align[a] = 2;
						}
						if((strcmp(tmpbuff2,CENTER)) == 0)
						{
							align[a] = 3;
						}
						a++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = toupper(tmpbuff1[k]);
						n++;
						break;
					}
				}
			}
			if(compare(11,p,textboxprpty[11]) == 11)
			{
				a = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						if((strcmp(tmpbuff2,ACT_EDIT)) == 0)
						{
							action[a] = 0;
						}
						if((strcmp(tmpbuff2,ACT_NONE)) == 0)
						{
							action[a] = 1;
						}
						a++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = toupper(tmpbuff1[k]);
						n++;
						break;
					}
				}
			}
/*
FLD_TEXT		"TEXT"		//Field types of text
FLD_NUMERIC		"NUMERIC"	//Field types of numeric used long integer
FLD_BOOL		"BOOL"		//Field types of boolean 0(False) or -1(True)
FLD_CURRENCY	"CURRENCY"	//Field types of curency (,)
FLD_DATE		"DATE"		//Field types of date (YYYY/MM/DD)
FLD_SINGLE		"SINGLE"	//Field types of floate (1000.00)
FLD_DOUBLE		"DOUBLE"	//Field types of double (1000.0000)
FLD_BYTE		"BYTE"		//Field types of byte ('a')
#define TEXT			1
#define NUMERIC			2
#define BOOL			3
#define CURRENCY		4
#define DATE			5
#define SINGLE			6
#define DOUBLE			7
#define BYTE			8
*/
			if(compare(12,p,textboxprpty[12]) == 12)
			{
				a = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						if((strcmp(tmpbuff2,FLD_TEXT)) == 0)
						{
							field[a] = TEXT;
						}
						if((strcmp(tmpbuff2,FLD_NUMERIC)) == 0)
						{
							field[a] = NUMERIC;
						}
						if((strcmp(tmpbuff2,FLD_BOOL)) == 0)
						{
							field[a] = BOOL;
						}
						if((strcmp(tmpbuff2,FLD_CURRENCY)) == 0)
						{
							field[a] = CURRENCY;
						}
						if((strcmp(tmpbuff2,FLD_DATE)) == 0)
						{
							field[a] = DATE;
						}
						if((strcmp(tmpbuff2,FLD_SINGLE)) == 0)
						{
							field[a] = SINGLE;
						}
						if((strcmp(tmpbuff2,FLD_DOUBLE)) == 0)
						{
							field[a] = DOUBLE;
						}
						if((strcmp(tmpbuff2,FLD_BYTE)) == 0)
						{
							field[a] = BYTE;
						}
						a++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = toupper(tmpbuff1[k]);
						n++;
						break;
					}
				}
			}
			if(compare(13,p,textboxprpty[13]) == 13)
			{
				a = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						if((strcmp(tmpbuff2,SKIP)) == 0)
						{
							skipstep[a] = 0;
						}
						if((strcmp(tmpbuff2,STEP)) == 0)
						{
							skipstep[a] = 1;
						}
						a++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = toupper(tmpbuff1[k]);
						n++;
						break;
					}
				}
			}
		}
	}
	fclose(fp);

	maxtext = m;

	if(maxtext == 0)
		return(0);

	xt[no].maxtext = maxtext;

	for(i=0;i<maxtext;i++)
	{
		Labelpos[i][0] = 0;
		Labelpos[i][1] = 0;
		Labelpos[i][2] = 0;
		Labelpos[i][3] = 0;
		Textpos[i][0] = 0;
		Textpos[i][1] = 0;
		Textpos[i][2] = 0;
		Textpos[i][3] = 0;
	}
	for(i=0;i<maxtext;i++)
	{
		Labelpos[i][0] = label_no[i];
		Labelpos[i][1] = label_x[i];
		Labelpos[i][2] = label_y[i];
		Labelpos[i][3] = label_length[i];
	}
	for(i=0;i<maxtext;i++)
	{
		Textpos[i][0] = textbox_no[i];
		Textpos[i][1] = textbox_x[i];
		Textpos[i][2] = textbox_y[i];
		Textpos[i][3] = textbox_length[i];
	}

	i = 0;
	k = 0;

	memset(tmpbuff1,'\0',sizeof(tmpbuff1));

	for(j=0;j<maxtext;j++)
	{
		ft[no].pos[i].vs = subwin(xt[no].form,1,Textpos[j][3]+2,fy+Textpos[j][2],fx+Textpos[j][1]);
		keypad(ft[no].pos[i].vs,TRUE);
		meta(ft[no].pos[i].vs, TRUE);
		if((gp = (TextBox *)calloc(1,sizeof(TextBox))) == (TextBox  *)NULL)
		{
			return -1;
		}
		if((gp->s = (char *)calloc(2,sizeof(tmpbuff1) + 1)) == (char  *)NULL)
		{
			return -1;
		}

		memset(tmpbuff1,'\0',sizeof(tmpbuff1));
		memset(tmpbuff1,' ',Textpos[j][3]);
		sprintf(gp->s,"%s",tmpbuff1);
		wrefresh(ft[no].pos[i].vs);

		gp->no = i;
		gp->n = i;
		gp->col = i;
		gp->no = Textpos[j][0];
		gp->x = Textpos[j][1];
		gp->y = Textpos[j][2];
		gp->c = i+1;
		gp->len = Textpos[j][3];
		gp->align = align[j];
		gp->action = action[j];
		gp->ftype = field[j];
		gp->stype = skipstep[j];

		ft[no].pos[i].col = i;
		ft[no].pos[i].n = i;
		ft[no].pos[i].c = i+1;
		ft[no].pos[i].len = Textpos[j][3];
		ft[no].pos[i].x = Textpos[j][1];
		ft[no].pos[i].y = Textpos[j][2];
		ft[no].pos[i].align = align[j];
		ft[no].pos[i].action = action[j];
		ft[no].pos[i].ftype = field[j];
		ft[no].pos[i].stype = skipstep[j];

		gp->prev = ending->prev;
		ending->prev = gp;

		gp->next = tp->next;
		tp->next = gp;

		tp = gp;
		i++;
	}

	i--;

	maxtext = i + 1;

	for(k=0;k<=maxtext;k++)
	{
		mvwprintw(xt[no].form,Labelpos[k][2],Labelpos[k][1],"%s",label_text[k]);
	}

	tp = begin->next;
	for(i=0;i<maxtext;i++)
	{
		mvwprintw(ft[no].pos[i].vs,0,0,"[");
		mvwprintw(ft[no].pos[i].vs,0,tp->len+1,"]");
		mvwprintw(ft[no].pos[i].vs,0,1,"%s",tp->s);
		wrefresh(ft[no].pos[i].vs);
		if(tp->next != (TextBox *)NULL)
		{
			mvwprintw(ft[no].pos[i].vs,0,1,"%s",tp->s);
			tp = tp->next;
		}
	}
	mvwprintw(ft[no].pos[i].vs,0,1,"?%s",tp->s);
	wrefresh(ft[no].pos[i].vs);

	return(maxtext);
}

/************************************************************************/
/* NAME      :textinput()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    : ０：処理成功、-1：処理失敗                           */
/************************************************************************/
/*
TEXT			1
NUMERIC			2
BOOL			3
CURRENCY		4
DATE			5
SINGLE			6
DOUBLE			7
BYTE			8
*/
static int textinput(int no, int i, int wmode)
{
	int ret;
	static char spacer[MAX_TMP];

	echo();
	memset(spacer,'\0',sizeof(spacer));
	if ((strlen(tp->s)) == 0)
	{
		switch(tp->ftype)
		{
		case TEXT:
			sprintf(spacer,"%s",(char *)cutspace(tp->s));
			sprintf(tp->s,"%s",spacer);
			memset(tp->s,'\0',tp->len);
			ret = jmvwgetnstr(ft[no].pos[i].vs,0,1,(char *)cutspace(tp->s),tp->len,wmode,TEXT);
			break;
		case NUMERIC:
			memset(tp->s,'\0',tp->len);
			sprintf(tmpbuff1,"%ld",(unsigned long)atol(tp->s));
			sprintf(tp->s,"%s",tmpbuff1);
			break;
		case CURRENCY:
			memset(tp->s,'\0',tp->len);
			if(tp->len < 14)
			{
				sprintf(tmpbuff1,"%ld",(unsigned long)atol(tp->s));
				sprintf(tp->s,"%s",tmpbuff1);
			}
			else
			{
				sprintf(tmpbuff1,"     %ld",(unsigned long)atol(tp->s));
				sprintf(tp->s,"%s",varprint(tmpbuff1));
			}
			break;
		}
	}
	else
	{
		sprintf(tmpbuff2,"%s",tp->s);
		switch(tp->ftype)
		{
		case TEXT:
			if(!ifspace(tp->len,tp->s))
			{
				sprintf(spacer,"%s",(char *)cutspace_right(tp->s));
				sprintf(tp->s,"%s",spacer);
				ret = jmvwgetnstr(ft[no].pos[i].vs,0,1,tp->s,tp->len,wmode,TEXT);
				memset(spacer,'\0',sizeof(spacer));
				memset(spacer,' ',(tp->len-(strlen(tp->s))));
				sprintf(tmpbuff1,"%s%s",tp->s,spacer);
				sprintf(tp->s,"%s",tmpbuff1);
			}
			else
			{
				sprintf(spacer,"%s",(char *)cutspace_right(tp->s));
				sprintf(tp->s,"%s",spacer);
				ret = jmvwgetnstr(ft[no].pos[i].vs,0,1,tp->s,tp->len,wmode,TEXT);
				memset(spacer,'\0',sizeof(spacer));
				memset(spacer,' ',(tp->len-(strlen(tp->s))));
				sprintf(tmpbuff1,"%s%s",tp->s,spacer);
				sprintf(tp->s,"%s",tmpbuff1);
			}
			break;
		case NUMERIC:
			memset(tp->s,' ',tp->len);
			if(!ifspace(tp->len,tp->s))
			{
				ret = jmvwgetnstr(ft[no].pos[i].vs,0,1,tp->s,tp->len,wmode,NUMERIC);
				sprintf(tmpbuff1,"%ld",(unsigned long)atol(tp->s));
				sprintf(tp->s,"%s",tmpbuff1);
				memset(spacer,'\0',sizeof(spacer));
				memset(spacer,' ',(tp->len-(strlen(tp->s))));
				sprintf(tmpbuff1,"%s%s",tp->s,spacer);
				sprintf(tp->s,"%s",tmpbuff1);
			}
			else
			{
				ret = jmvwgetnstr(ft[no].pos[i].vs,0,1,tp->s,tp->len,wmode,NUMERIC);
				sprintf(tmpbuff1,"%ld",(unsigned long)atol(tp->s));
				sprintf(tp->s,"%s",tmpbuff1);
				memset(spacer,'\0',sizeof(spacer));
				memset(spacer,' ',(tp->len-(strlen(tp->s))));
				sprintf(tmpbuff1,"%s%s",tp->s,spacer);
				sprintf(tp->s,"%s",tmpbuff1);
			}
			break;
		case CURRENCY:
			memset(tp->s,' ',tp->len);
			if(!ifspace(tp->len,tp->s))
			{
				ret = jmvwgetnstr(ft[no].pos[i].vs,0,1,tp->s,tp->len,wmode,CURRENCY);
				if(tp->len < 14)
				{
					sprintf(tmpbuff1,"%ld",(unsigned long)atol(tp->s));
					sprintf(tp->s,"%s",tmpbuff1);
				}
				else
				{
					sprintf(tmpbuff1,"     %ld",(unsigned long)atol(tp->s));
					sprintf(tp->s,"%s",varprint(tmpbuff1));
				}
				memset(spacer,'\0',sizeof(spacer));
				memset(spacer,' ',(tp->len-(strlen(tp->s))));
				sprintf(tmpbuff1,"%s%s",tp->s,spacer);
				sprintf(tp->s,"%s",tmpbuff1);
			}
			else
			{
				ret = jmvwgetnstr(ft[no].pos[i].vs,0,1,tp->s,tp->len,wmode,CURRENCY);
				if(tp->len < 14)
				{
					sprintf(tmpbuff1,"%ld",(unsigned long)atol(tp->s));
					sprintf(tp->s,"%s",tmpbuff1);
				}
				else
				{
					sprintf(tmpbuff1,"     %ld",(unsigned long)atol(tp->s));
					sprintf(tp->s,"%s",varprint(tmpbuff1));
				}
				memset(spacer,'\0',sizeof(spacer));
				memset(spacer,' ',(tp->len-(strlen(tp->s))));
				sprintf(tmpbuff1,"%s%s",tp->s,spacer);
				sprintf(tp->s,"%s",tmpbuff1);
			}
			break;
		}
	}
	wrefresh(ft[no].pos[i].vs);
	touchwin(xt[no].form);
	if(ret == 0x1b)
	{
		if(strlen(tp->s) < 1)
			return -1;
		strcpy(tp->s,tmpbuff2);
		wrefresh(ft[no].pos[i].vs);
		return -1;
	}
	switch(tp->align)
	{
	case 1:
		sprintf(tp->s,"%s",srcep(tmpbuff1));
		mvwprintw(ft[no].pos[i].vs,0,1,"%s",tp->s);
		touchwin(xt[no].form);
		break;
	case 2:
		sprintf(tp->s,"%s",slcep(tmpbuff1));
		mvwprintw(ft[no].pos[i].vs,0,1,"%s",tp->s);
		touchwin(xt[no].form);
		break;
	case 3:
		sprintf(tp->s,"%s",sccep(tmpbuff1));
		mvwprintw(ft[no].pos[i].vs,0,1,"%s",tp->s);
		touchwin(xt[no].form);
		break;
	default:
		sprintf(tp->s,"%s",slcep(tmpbuff1));
		mvwprintw(ft[no].pos[i].vs,0,1,"%s",tp->s);
		touchwin(xt[no].form);
		break;
	}
	noecho();
	return (0);
}

/************************************************************************/
/* NAME      :formtext()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    : ０：処理成功                          */
/************************************************************************/
int sf_formtext(int no, int maxtext, int xcol)
{
	int i,j,k,m,n;
	int ch;
	static char spacer[MAX_TMP];

	if(ft[no].pos[0].vs == (WINDOW *)NULL)
		return(-1);
	i = 0;
	j = 0;
	k = 0;

	tp = begin->next;
	for(;tp->stype == 0 && i < maxtext;)
	{
		i++;
		tp = tp->next;
	}
	for(j=tp->n;i < xt[no].t_col;)
	{
		i++;
		tp = tp->next;
	}
	if(tp->stype == 0)
	{
		for(;i>j;)
		{
			i--;
			tp = tp->prev;
		}
	}
	touchwin(xt[no].form);
	while(1)
	{
		if(!wmode)
			mvwprintw(emi,1,1,"上書");
		else
			mvwprintw(emi,1,1,"挿入");
		wrefresh(emi);
		if(tp->stype == 1)
		{
			wattron(ft[no].pos[i].vs, A_REVERSE);
			mvwprintw(ft[no].pos[i].vs,0,1,"%s",tp->s);
			wattroff(ft[no].pos[i].vs, A_REVERSE);
			wrefresh(ft[no].pos[i].vs);

//2010.03.07
#ifdef SHOWLOCATE
			mvwprintw(xt[no].form,0,xcol - 18,"[%3d %3d %3d %3d]",tp->col,tp->x,tp->y,tp->c);
#endif
			wrefresh(xt[no].form);
			ch = wgetch(ft[no].pos[i].vs);
			mvwprintw(ft[no].pos[i].vs,0,1,"%s",tp->s);
			wrefresh(ft[no].pos[i].vs);

			xt[no].t_col = i;
			xt[no].t_n = tp->n;
			xt[no].t_len = tp->len;
			xt[no].t_c = tp->c;
			xt[no].t_x = tp->x;
			xt[no].t_y = tp->y;
			xt[no].t_align = tp->align;
			xt[no].t_action = tp->action;
			xt[no].t_ftype = tp->ftype;
			xt[no].t_stype = tp->stype;

		}

		switch(ch)
		{
		case KEY_IC:
			if(!wmode)	
				wmode = 1;
			else
				wmode = 0;
			break;

#ifdef IN_BACKSPACE
		 case KEY_BACKSPACE: case KEY_DC:
			if(textinput(no,i,wmode) == -1)
				break;
			break;
#endif

		case '\t': case 0x0d: case 0x0a: case KEY_ENTER: case KEY_DOWN: case KEY_RIGHT:
			if(ft[no].pos[i+1].vs == (WINDOW *)NULL)
			{
				break;
			}
			if(i < maxtext)
			{
				if(tp->next != (TextBox *)NULL)
				{
					tp = tp->next;
					i++;
				}
			}
			break;
	
		case KEY_UP: case KEY_LEFT:
			if(i > 0)
			{
				if(tp->prev != (TextBox *)NULL)
				{
					tp = tp->prev;
					i--;
				}
				if(i == 0 && tp->stype == 0)
				{
					if(tp->next != (TextBox *)NULL)
					{
						tp = tp->next;
						i++;
					}
					break;
				}

				if(i == 0)
					break;

				for(n=i,m=0; n > 0;n--)
				{
					if(tp->stype == 1)
						m++;
					if(tp->prev != (TextBox *)NULL)
						tp = tp->prev;
				}
				for(;n<i;n++)
					if(tp->next != (TextBox *)NULL)
						tp = tp->next;
				if(m==0)
				{
					if(tp->next != (TextBox *)NULL)
					{
						tp = tp->next;
						i++;
					}
					break;
				}
			}
			break;

		case 0x1b:
			return(100);
			break;
#ifdef KTERM
		case '!':
#endif
		case KEY_F(1): case '!':
			return(101);
			break;
#ifdef KTERM
		case '\"': 
#endif
		case KEY_F(2): case '\"':
			return(102);
			break;
#ifdef KTERM
		case '#': 
#endif
		case KEY_F(3): case '#':
			return(103);
			break;
#ifdef KTERM
		case '$': 
#endif
		case KEY_F(4): case '$':
			return(104);
			break;
#ifdef KTERM
		case '%': 
#endif
		case KEY_F(5): case '%':
			return(105);
			break;
#ifdef KTERM
		case '&': 
#endif
		case KEY_F(6): case '&':
			return(106);
			break;
#ifdef KTERM
		case '\'': 
#endif
		case KEY_F(7): case '\'':
			return(107);
			break;
#ifdef KTERM
		case '(': 
#endif
		case KEY_F(8): case '(':
			return(108);
			break;
#ifdef KTERM
		case ')': 
#endif
		case KEY_F(9): case ')':
			return(109);
			break;
#ifdef KTERM
		case '~': 
#endif
		case KEY_F(10): case '~':
			return(110);
			break;
#ifdef KTERM
		case '=': 
#endif
		case KEY_F(11): case '=':
			return(111);
			break;
#ifdef KTERM
		case '^':
#endif
		case KEY_F(12): case '^':
			return(199);
			break;

		default:
			switch(tp->action)
			{
			case 0:
				ungetch(ch);
				if(textinput(no,i,wmode) == -1)
					break;
				break;
			case 1:
				break;
			}
			break;
		}
	}
}

/************************************************************************/
/* NAME      :panels()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :テキストボックスの数                           */
/************************************************************************/
int sf_panels(int no, int xcol,int rows,int fx, int fy, char *f)
{
	static FILE *fp;
	static WINDOW *vs;
	static TextBox *gp;
	static int ch;
	static int i,j,k,l,m,n;
	static int  c, x, y;
	static char p[MAX_POS];
	static int maxpanel;
	static int maxcell;
	static int maxpaneltext;
	static int alltext;
	static int maxlabel;
	static char *nl;
	static char def[MAX_DEF][MAX_STR];
	static char wt[MAX_DEF][MAX_STR];
	static int align[MAX_COL];
	static int action[MAX_POS];
	static int field[MAX_COL];
	static int skipstep[MAX_COL];
	static int a;
	static char spacer[MAX_TMP];

	static int panel_cols;
	static int panel_rows;
	static int panel_sx;
	static int panel_sy;
	static int panel_diff;
	static int panel_num;

	static int label_no[MAX_POS];
	static int label_x[MAX_POS];
	static int label_y[MAX_POS];
	static int label_length[MAX_POS];
	static char label_text[MAX_POS][MAX_STR];
	static int textbox_no[MAX_POS];
	static int textbox_x[MAX_POS];
	static int textbox_y[MAX_POS];
	static int textbox_length[MAX_POS];
	static int textbox_align[MAX_POS];

	for(i=0;i<MAX_TMP;i++)
	{
		memset(tmpbuff1,'\0',sizeof(tmpbuff1)) ;
		memset(tmpbuff2,'\0',sizeof(tmpbuff2)) ;
	}
	if ((fp = fopen(f,"r")) == NULL)
	{
		return(0);
	}

	i = 0;

	while((fgets(def[i],MAX_TMP ,fp)) != NULL)
	{
		if((nl = strchr(def[i],'\n')) != NULL)
		{
			*nl = '\0';
			i++;
		}
		if((nl = strchr(def[i],'#')) != NULL)
		{
			*nl = '\0';
			i++;
		}
	}

	for(j=0;j<i;j++)
	{

		if((nl = strchr(def[j],'=')) != NULL)
		{
			for(l=0;def[j][l]!='=';l++)
			{
				p[l]=toupper(def[j][l]);
			}
			p[l]=toupper(def[j][l]);
			p[l+1] = '\0';
			if(compare(0,p,panelprpty[0]) == 0)
			{
				strcpy(tmpbuff1,nl+1);
				panel_cols = atoi(tmpbuff1);
			}
			if(compare(1,p,panelprpty[1]) == 1)
			{
				strcpy(tmpbuff1,nl+1);
				panel_rows = atoi(tmpbuff1);
			}
			if(compare(2,p,panelprpty[2]) == 2)
			{
				strcpy(tmpbuff1,nl+1);
				panel_sx = atoi(tmpbuff1);
			}
			if(compare(3,p,panelprpty[3]) == 3)
			{
				strcpy(tmpbuff1,nl+1);
				panel_sy = atoi(tmpbuff1);
			}
			if(compare(4,p,panelprpty[4]) == 4)
			{
				strcpy(tmpbuff1,nl+1);
				panel_diff = atoi(tmpbuff1);
			}
			if(compare(5,p,panelprpty[5]) == 5)
			{
				strcpy(tmpbuff1,nl+1);
				panel_num = atoi(tmpbuff1);
			}
		}
	}
//-----------------
	for(j=0;j<i;j++)
	{

		if((nl = strchr(def[j],'=')) != NULL)
		{
			for(l=0;def[j][l]!='=';l++)
			{
				p[l]=toupper(def[j][l]);
			}
			p[l]=toupper(def[j][l]);
			p[l+1] = '\0';
			if(compare(0,p,textboxprpty[0]) == 0)
			{
				strcpy(tmpbuff1,nl+1);
				xcol = atoi(tmpbuff1);
			}
			if(compare(1,p,textboxprpty[1]) == 1)
			{
				strcpy(tmpbuff1,nl+1);
				rows = atoi(tmpbuff1);
			}
			if(compare(2,p,textboxprpty[2]) == 2)
			{
				m = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						label_x[m] = atoi(tmpbuff2);
						m++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = tmpbuff1[k];
						n++;
						break;
					}
				}
			}
			if(compare(3,p,textboxprpty[3]) == 3)
			{
				m = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						label_y[m] = atoi(tmpbuff2);
						m++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = tmpbuff1[k];
						n++;
						break;
					}
				}
			}
			if(compare(4,p,textboxprpty[4]) == 4)
			{
				m = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						label_length[m] = atoi(tmpbuff2);
						m++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = tmpbuff1[k];
						n++;
						break;
					}
				}
			}
			if(compare(5,p,textboxprpty[5]) == 5)
			{
				m = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						sprintf(label_text[m],"%s",tmpbuff2);
						m++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = tmpbuff1[k];
						n++;
						break;
					}
				}
			}
			if(compare(6,p,textboxprpty[6]) == 6)
			{
				m = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						textbox_no[m] = atoi(tmpbuff2);
						m++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = tmpbuff1[k];
						n++;
						break;
					}
				}
				maxlabel = m;
			}
			if(compare(7,p,textboxprpty[7]) == 7)
			{
				m = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						textbox_x[m] = atoi(tmpbuff2);
						m++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = tmpbuff1[k];
						n++;
						break;
					}
				}
			}
			if(compare(8,p,textboxprpty[8]) == 8)
			{
				m = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						textbox_y[m] = atoi(tmpbuff2);
						m++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = tmpbuff1[k];
						n++;
						break;
					}
				}
			}
			if(compare(9,p,textboxprpty[9]) == 9)
			{
				m = 0;
				a = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						textbox_length[m] = atoi(tmpbuff2);
						m++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = tmpbuff1[k];
						n++;
						break;
					}
				}
			}
			if(compare(10,p,textboxprpty[10]) == 10)
			{
				a = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						if((strcmp(tmpbuff2,RIGHT)) == 0)
						{
							align[a] = 1;
						}
						if((strcmp(tmpbuff2,LEFT)) == 0)
						{
							align[a] = 2;
						}
						if((strcmp(tmpbuff2,CENTER)) == 0)
						{
							align[a] = 3;
						}
						a++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = toupper(tmpbuff1[k]);
						n++;
						break;
					}
				}
			}
			if(compare(11,p,textboxprpty[11]) == 11)
			{
				a = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						if((strcmp(tmpbuff2,ACT_EDIT)) == 0)
						{
							action[a] = 0;
						}
						if((strcmp(tmpbuff2,ACT_NONE)) == 0)
						{
							action[a] = 1;
						}
						a++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = toupper(tmpbuff1[k]);
						n++;
						break;
					}
				}
			}
/*
FLD_TEXT		"TEXT"		//Field types of text
FLD_NUMERIC		"NUMERIC"	//Field types of numeric used long integer
FLD_BOOL		"BOOL"		//Field types of boolean 0(False) or -1(True)
FLD_CURRENCY	"CURRENCY"	//Field types of curency (,)
FLD_DATE		"DATE"		//Field types of date (YYYY/MM/DD)
FLD_SINGLE		"SINGLE"	//Field types of floate (1000.00)
FLD_DOUBLE		"DOUBLE"	//Field types of double (1000.0000)
FLD_BYTE		"BYTE"		//Field types of byte ('a')
#define TEXT			1
#define NUMERIC			2
#define BOOL			3
#define CURRENCY		4
#define DATE			5
#define SINGLE			6
#define DOUBLE			7
#define BYTE			8
*/
			if(compare(12,p,textboxprpty[12]) == 12)
			{
				a = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						if((strcmp(tmpbuff2,FLD_TEXT)) == 0)
						{
							field[a] = TEXT;
						}
						if((strcmp(tmpbuff2,FLD_NUMERIC)) == 0)
						{
							field[a] = NUMERIC;
						}
						if((strcmp(tmpbuff2,FLD_BOOL)) == 0)
						{
							field[a] = BOOL;
						}
						if((strcmp(tmpbuff2,FLD_CURRENCY)) == 0)
						{
							field[a] = CURRENCY;
						}
						if((strcmp(tmpbuff2,FLD_DATE)) == 0)
						{
							field[a] = DATE;
						}
						if((strcmp(tmpbuff2,FLD_SINGLE)) == 0)
						{
							field[a] = SINGLE;
						}
						if((strcmp(tmpbuff2,FLD_DOUBLE)) == 0)
						{
							field[a] = DOUBLE;
						}
						if((strcmp(tmpbuff2,FLD_BYTE)) == 0)
						{
							field[a] = BYTE;
						}
						a++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = toupper(tmpbuff1[k]);
						n++;
						break;
					}
				}
			}
			if(compare(13,p,textboxprpty[13]) == 13)
			{
				a = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						if((strcmp(tmpbuff2,SKIP)) == 0)
						{
							skipstep[a] = 0;
						}
						if((strcmp(tmpbuff2,STEP)) == 0)
						{
							skipstep[a] = 1;
						}
						a++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = toupper(tmpbuff1[k]);
						n++;
						break;
					}
				}
			}
		}
	}
	fclose(fp);
//----------------------------------------------------------

	if(xcol < panel_cols  || rows < panel_rows)
	{
		fprintf(stderr,"Over Lines or Cols FormWindow   %d Lines - %d Cols\n",panel_rows,panel_cols);
		exit(1);
	}

	maxpaneltext = m;
	xt[no].panel_num = panel_num;
	xt[no].maxlabel = maxlabel;

	if(xcol > COLS || rows > LINES)
	{
		xcol = COLS;
		rows = LINES;
	}

	for(i=0;i<maxpaneltext;i++)
	{
		Labelpos[i][0] = 0;
		Labelpos[i][1] = 0;
		Labelpos[i][2] = 0;
		Labelpos[i][3] = 0;
		Textpos[i][0] = 0;
		Textpos[i][1] = 0;
		Textpos[i][2] = 0;
		Textpos[i][3] = 0;
	}
	for(i=0;i<maxlabel;i++)
	{
		Labelpos[i][0] = label_no[i];
		Labelpos[i][1] = label_x[i];
		Labelpos[i][2] = label_y[i];
		Labelpos[i][3] = label_length[i];
	}
	for(i=0;i<maxpaneltext;i++)
	{
		Textpos[i][0] = textbox_no[i];
		Textpos[i][1] = textbox_x[i];
		Textpos[i][2] = textbox_y[i];
		Textpos[i][3] = textbox_length[i];
	}

	i = 0;
	j = 0;
	k = 0;
	l = panel_sy;

	memset(tmpbuff1,'\0',sizeof(tmpbuff1));
	wrefresh(xt[no].form);

	for(k=0;k<panel_num;k++)
	{
		ft[no].pt[k].sx = panel_sx;
		ft[no].pt[k].ex = panel_cols - 1;
		ft[no].pt[k].sy = panel_sy;
		ft[no].pt[k].ey = panel_rows - 1;
		ft[no].pt[k].width = panel_cols;
		ft[no].pt[k].height = panel_rows;
		ft[no].pt[k].panel = subwin(xt[no].form,panel_rows,panel_cols,fy+l,fx+panel_sx);
		keypad(ft[no].pt[k].panel,TRUE);
		meta(ft[no].pt[k].panel, TRUE);
		wattron(ft[no].pt[k].panel, A_UNDERLINE);
		memset(tmpbuff2,' ',(panel_cols-1)-2);
		mvwprintw(ft[no].pt[k].panel,0,1+1,"%s",tmpbuff2);
		wattroff(ft[no].pt[k].panel, A_UNDERLINE);
		wrefresh(ft[no].pt[k].panel);


		l = l + panel_diff;
		for(j=0;j<maxpaneltext;j++)
		{
			ft[no].pos[i].vs = derwin(ft[no].pt[k].panel,1,Textpos[j][3]+2,Textpos[j][2],Textpos[j][1]);
			keypad(ft[no].pos[i].vs,TRUE);
			meta(ft[no].pos[i].vs, TRUE);

			if((gp = (TextBox *)calloc(1,sizeof(TextBox))) == (TextBox  *)NULL)
			{
				return -1;
			}
			if((gp->s = (char *)calloc(2,sizeof(tmpbuff1) + 1)) == (char  *)NULL)
			{
				return -1;
			}
	
			memset(tmpbuff1,'\0',sizeof(tmpbuff1));
			memset(tmpbuff1,' ',Textpos[j][3]);
			sprintf(gp->s,"%s",tmpbuff1);
			wrefresh(ft[no].pos[i].vs);
	
			gp->no = i;
			gp->n = i;
			gp->col = i;
			gp->no = Textpos[j][0];
			gp->x = Textpos[j][1];
			gp->y = Textpos[j][2];
			gp->c = i+1;
			gp->len = Textpos[j][3];
			gp->align = align[j];
			gp->action = action[j];
			gp->ftype = field[j];
			gp->stype = skipstep[j];

			ft[no].pos[i].col = i;
			ft[no].pos[i].n = i;
			ft[no].pos[i].c = i+1;
			ft[no].pos[i].len = Textpos[j][3];
			ft[no].pos[i].x = Textpos[j][1];
			ft[no].pos[i].y = Textpos[j][2];
			ft[no].pos[i].align = align[j];
			ft[no].pos[i].action = action[j];
			ft[no].pos[i].ftype = field[j];
			ft[no].pos[i].stype = skipstep[j];

			mvwprintw(ft[no].pt[k].panel,Textpos[j][2],Textpos[j][1]+Textpos[j][3]+1,"|");
			mvwprintw(ft[no].pt[k].panel,Textpos[j][2],Textpos[j][1],"|");

			gp->prev = ending->prev;
			ending->prev = gp;
	
			gp->next = tp->next;
			tp->next = gp;
	
			tp = gp;

			i++;
		}
	}

	i--;

	alltext = i + 1;

	xt[no].alltext = alltext;

	wattron(xt[no].form, A_UNDERLINE);
	for(j=0;j<maxlabel;j++)
		mvwprintw(xt[no].form,Labelpos[j][2],panel_sx+Labelpos[j][1]+1,"%s",sccep(label_text[j]));
	wattroff(xt[no].form, A_UNDERLINE);

	tp = begin->next;
	for(i=0;i<alltext;i++)
	{
		wattron(ft[no].pos[i].vs, A_UNDERLINE);
		mvwprintw(ft[no].pos[i].vs,0,1,"%s",tp->s);
		wrefresh(ft[no].pos[i].vs);
		if(tp->next != (TextBox *)NULL)
		{
			tp = tp->next;
		}
	}
	return(alltext);
}

/************************************************************************/
/* NAME      :panelinput()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    : ０：処理成功、-1：処理失敗                           */
/************************************************************************/
/*
TEXT			1
NUMERIC			2
BOOL			3
CURRENCY		4
DATE			5
SINGLE			6
DOUBLE			7
BYTE			8
VARIANT			9
*/
static int panelinput(int no, int i, int wmode)
{
	int ret;
	static char spacer[MAX_TMP];

	echo();
	memset(spacer,'\0',sizeof(spacer));
	if ((strlen(tp->s)) == 0)
	{
		switch(tp->ftype)
		{
		case TEXT:
			sprintf(spacer,"%s",(char *)cutspace_right(tp->s));
			sprintf(tp->s,"%s",spacer);
			memset(tp->s,'\0',tp->len);
			ret = jmvwgetnstr(ft[no].pos[i].vs,0,1,(char *)cutspace(tp->s),tp->len,wmode,TEXT);
			break;
		case NUMERIC:
			memset(tp->s,'\0',tp->len);
			ret = jmvwgetnstr(ft[no].pos[i].vs,0,1,tp->s,tp->len,wmode,NUMERIC);
			sprintf(tmpbuff1,"%ld",(unsigned long)atol(tp->s));
			sprintf(tp->s,"%s",tmpbuff1);
			break;
		case CURRENCY:
			memset(tp->s,'\0',tp->len);
			ret = jmvwgetnstr(ft[no].pos[i].vs,0,1,tp->s,tp->len,wmode,CURRENCY);
			if(tp->len < 14)
			{
				sprintf(tmpbuff1,"%ld",(unsigned long)atol(tp->s));
				sprintf(tp->s,"%s",tmpbuff1);
			}
			else
			{
				sprintf(tmpbuff1,"     %ld",(unsigned long)atol(tp->s));
				sprintf(tp->s,"%s",varprint(tmpbuff1));
			}
			break;
		}
	}
	else
	{
		sprintf(tmpbuff2,"%s",tp->s);
		switch(tp->ftype)
		{
		case TEXT:
			if(!ifspace(tp->len,tp->s))
			{
				sprintf(spacer,"%s",(char *)cutspace_right(tp->s));
				sprintf(tp->s,"%s",spacer);
				ret = jmvwgetnstr(ft[no].pos[i].vs,0,1,tp->s,tp->len,wmode,TEXT);
				memset(spacer,'\0',sizeof(spacer));
				memset(spacer,' ',(tp->len-(strlen(tp->s))));
				sprintf(tmpbuff1,"%s%s",tp->s,spacer);
				sprintf(tp->s,"%s",tmpbuff1);
			}
			else
			{
				sprintf(spacer,"%s",(char *)cutspace_right(tp->s));
				sprintf(tp->s,"%s",spacer);
				ret = jmvwgetnstr(ft[no].pos[i].vs,0,1,tp->s,tp->len,wmode,TEXT);
				memset(spacer,'\0',sizeof(spacer));
				memset(spacer,' ',(tp->len-(strlen(tp->s))));
				sprintf(tmpbuff1,"%s%s",tp->s,spacer);
				sprintf(tp->s,"%s",tmpbuff1);
			}
			break;
		case NUMERIC:
			memset(tp->s,' ',tp->len);
			if(!ifspace(tp->len,tp->s))
			{
				ret = jmvwgetnstr(ft[no].pos[i].vs,0,1,tp->s,tp->len,wmode,NUMERIC);
				sprintf(tmpbuff1,"%ld",(unsigned long)atol(tp->s));
				sprintf(tp->s,"%s",tmpbuff1);
				memset(spacer,'\0',sizeof(spacer));
				memset(spacer,' ',(tp->len-(strlen(tp->s))));
				sprintf(tmpbuff1,"%s%s",tp->s,spacer);
				sprintf(tp->s,"%s",tmpbuff1);
			}
			else
			{
				ret = jmvwgetnstr(ft[no].pos[i].vs,0,1,tp->s,tp->len,wmode,NUMERIC);
				sprintf(tmpbuff1,"%ld",(unsigned long)atol(tp->s));
				sprintf(tp->s,"%s",tmpbuff1);
				memset(spacer,'\0',sizeof(spacer));
				memset(spacer,' ',(tp->len-(strlen(tp->s))));
				sprintf(tmpbuff1,"%s%s",tp->s,spacer);
				sprintf(tp->s,"%s",tmpbuff1);
			}
			break;
		case CURRENCY:
			memset(tp->s,' ',tp->len);
			if(!ifspace(tp->len,tp->s))
			{
				ret = jmvwgetnstr(ft[no].pos[i].vs,0,1,tp->s,tp->len,wmode,CURRENCY);
				if(tp->len < 14)
				{
					sprintf(tmpbuff1,"%ld",(unsigned long)atol(tp->s));
					sprintf(tp->s,"%s",tmpbuff1);
				}
				else
				{
					sprintf(tmpbuff1,"     %ld",(unsigned long)atol(tp->s));
					sprintf(tp->s,"%s",varprint(tmpbuff1));
				}
				memset(spacer,'\0',sizeof(spacer));
				memset(spacer,' ',(tp->len-(strlen(tp->s))));
				sprintf(tmpbuff1,"%s%s",tp->s,spacer);
				sprintf(tp->s,"%s",tmpbuff1);
			}
			else
			{
				ret = jmvwgetnstr(ft[no].pos[i].vs,0,1,tp->s,tp->len,wmode,CURRENCY);
				if(tp->len < 14)
				{
					sprintf(tmpbuff1,"%ld",(unsigned long)atol(tp->s));
					sprintf(tp->s,"%s",tmpbuff1);
				}
				else
				{
					sprintf(tmpbuff1,"     %ld",(unsigned long)atol(tp->s));
					sprintf(tp->s,"%s",varprint(tmpbuff1));
				}
				memset(spacer,'\0',sizeof(spacer));
				memset(spacer,' ',(tp->len-(strlen(tp->s))));
				sprintf(tmpbuff1,"%s%s",tp->s,spacer);
				sprintf(tp->s,"%s",tmpbuff1);
			}
			break;
		}
	}
	wrefresh(ft[no].pos[i].vs);
	touchwin(xt[no].form);
	if(ret == 0x1b)
	{
		if(strlen(tp->s) < 1)
			return -1;
		strcpy(tp->s,tmpbuff2);
		wrefresh(ft[no].pos[i].vs);
		return -1;
	}
	switch(tp->align)
	{
	case 1:
		sprintf(tp->s,"%s",srcep(tmpbuff1));
		mvwprintw(ft[no].pos[i].vs,0,1,"%s",tp->s);
		touchwin(xt[no].form);
		break;
	case 2:
		sprintf(tp->s,"%s",slcep(tmpbuff1));
		mvwprintw(ft[no].pos[i].vs,0,1,"%s",tp->s);
		touchwin(xt[no].form);
		break;
	case 3:
		sprintf(tp->s,"%s",sccep(tmpbuff1));
		mvwprintw(ft[no].pos[i].vs,0,1,"%s",tp->s);
		touchwin(xt[no].form);
		break;
	default:
		sprintf(tp->s,"%s",slcep(tmpbuff1));
		mvwprintw(ft[no].pos[i].vs,0,1,"%s",tp->s);
		touchwin(xt[no].form);
		break;
	}
	noecho();
	return (0);
}

/************************************************************************/
/* NAME      :paneltext()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    : ０：処理成功                          */
/************************************************************************/
int sf_paneltext(int no, int maxpaneltext, int xcol)
{
	static int i,j,k,l,m,n;
	static int ch;
	static char spacer[MAX_TMP];
	static int ret;

	i = xt[no].t_col;
	j = xt[no].t_line;
	k = 0;
	l = 0;

	if(ft[no].pos[0].vs == (WINDOW *)NULL)
		return(-1);

	tp = begin->next;

	for(i=0;tp->stype == 0 && i < maxpaneltext;)
	{
		i++;
		tp = tp->next;
	}
	for(j=tp->n;i < xt[no].t_col;)
	{
		i++;
		tp = tp->next;
	}
	if(tp->stype == 0)
	{
		for(;i>j;)
		{
			i--;
			tp = tp->prev;
		}
	}

	touchwin(xt[no].form);

	while(1)
	{
		if(!wmode)
			mvwprintw(emi,1,1,"上書");
		else
			mvwprintw(emi,1,1,"挿入");
		wrefresh(emi);

		if(tp->stype == 1)
		{
			wattron(ft[no].pos[i].vs, A_UNDERLINE | A_DIM | A_REVERSE | A_PROTECT);
			mvwprintw(ft[no].pos[i].vs,0,1,"%s",tp->s);
			wattroff(ft[no].pos[i].vs, A_DIM | A_REVERSE | A_PROTECT);

//2010.03.07
#ifdef SHOWLOCATE
			mvwprintw(xt[no].form,0,xcol - 18,"[%3d %3d %3d %3d]",tp->col,tp->x,tp->y,tp->c);
#endif

			wrefresh(ft[no].pt[l].panel);
			wrefresh(ft[no].pos[i].vs);
			wrefresh(xt[no].form);

			ch = wgetch(ft[no].pos[i].vs);

			mvwprintw(ft[no].pos[i].vs,0,1,"%s",tp->s);
			wrefresh(ft[no].pos[i].vs);
			wrefresh(ft[no].pt[l].panel);
			wrefresh(xt[no].form);

			xt[no].t_col = i;
			xt[no].t_line = j+1;
			xt[no].t_n = tp->n;
			xt[no].t_len = tp->len;
			xt[no].t_c = tp->c;
			xt[no].t_x = tp->x;
			xt[no].t_y = tp->y;
			xt[no].t_align = tp->align;
			xt[no].t_action = tp->action;
			xt[no].t_ftype = tp->ftype;
			xt[no].t_stype = tp->stype;
		}

		switch(ch)
		{
		case KEY_IC:
			if(!wmode)	
				wmode = 1;
			else
				wmode = 0;
			break;

#ifdef IN_BACKSPACE
		case KEY_BACKSPACE: case KEY_DC:
			if(panelinput(no,i,wmode) == -1)
				break;
			break;
#endif

		case KEY_DOWN:
			if(l < xt[no].panel_num-1)
			{
				for(k=0;k<xt[no].maxlabel;k++)
				{
					if(tp->next != (TextBox *)NULL)
					{
						tp = tp->next;
						i++;
					}
				}
				l++;
			}
			break;
		case KEY_UP:
			if(l > 0)
			{
				l--;
				for(k=0;k<xt[no].maxlabel;k++)
				{
					if(tp->prev != (TextBox *)NULL)
					{
						tp = tp->prev;
						i--;
					}
				}
			}
			break;

		case 0x0d: case 0x0a:
		case '\t':
			if(ft[no].pos[i+1].vs == (WINDOW *)NULL)
			{
				tp = begin->next;
				i=0;
				l=0;
				break;
			}
			if(i < xt[no].alltext)
			{
				if(tp->next != (TextBox *)NULL)
				{
					tp = tp->next;
					i++;
				}
				if(tp->no == 0)
					l++;
			}
			break;

		case KEY_RIGHT:
			if(i > xt[no].alltext-2)
			{
				if(i == xt[no].alltext-2 && tp->next->stype == 1)
					goto skip;
				break;
			}
		skip:
			if(i < xt[no].alltext)
			{
				if(tp->next != (TextBox *)NULL)
				{
					tp = tp->next;
					i++;
				}
				if(tp->no == 0)
					l++;
			}
			break;

		case KEY_LEFT:
			if(i > 0)
			{
				if(tp->prev != (TextBox *)NULL)
				{
					tp = tp->prev;
					i--;
				}
				if(i == 0 && tp->stype == 0)
				{
					if(tp->next != (TextBox *)NULL)
					{
						tp = tp->next;
						i++;
					}
					break;
				}

				if(i == 0)
					break;

				for(n=i,m=0; n > 0;n--)
				{
					if(tp->stype == 1)
						m++;
					if(tp->prev != (TextBox *)NULL)
						tp = tp->prev;
				}
				for(;n<i;n++)
					if(tp->next != (TextBox *)NULL)
						tp = tp->next;
				if(m==0)
				{
					if(tp->next != (TextBox *)NULL)
					{
						tp = tp->next;
						i++;
					}
					break;
				}
				if(tp->no == 0)
					l--;
			}
			break;

		case 0x1b:
			return(300);
			break;
#ifdef KTERM
		case '!':
#endif
		case KEY_F(1):
			return(301);
			break;
#ifdef KTERM
		case '\"': 
#endif
		case KEY_F(2):
			return(302);
			break;
#ifdef KTERM
		case '#': 
#endif
		case KEY_F(3):
			return(303);
			break;
#ifdef KTERM
		case '$': 
#endif
		case KEY_F(4):
			return(304);
			break;
#ifdef KTERM
		case '%': 
#endif
		case KEY_F(5):
			return(305);
			break;
#ifdef KTERM
		case '&': 
#endif
		case KEY_F(6):
			return(306);
			break;
#ifdef KTERM
		case '\'': 
#endif
		case KEY_F(7):
			return(307);
			break;
#ifdef KTERM
		case '(': 
#endif
		case KEY_F(8):
			return(308);
			break;
#ifdef KTERM
		case ')': 
#endif
		case KEY_F(9):
			return(309);
			break;
#ifdef KTERM
		case '~': 
#endif
		case KEY_F(10):
			return(310);
			break;
#ifdef KTERM
		case '=': 
#endif
		case KEY_F(11):
			return(311);
			break;
#ifdef KTERM
		case '^':
#endif
		case KEY_F(12):
			return(399);
			break;

		default:
			switch(tp->action)
			{
			case 0:
				ch = ungetch(ch);
				if(ch == '\t')
					break;
				if(panelinput(no,i,wmode) == -1)
				{
					break;
				}
				break;
			case 1:
				break;
			}
			break;
		}
	}
}

/************************************************************************/
/* NAME      :wsubform()*/
/* FUNCTION  :*/ 
/*            */ 
/*            */ 
/*            */ 
/* RETURN    :                          */
/************************************************************************/
int sf_wsubform(int no, int xcol,int rows,int fx ,int fy, char *f)
{
	static FILE *fp;
	static WINDOW *vs;
	static char p[MAX_TMP];
	static int ch;
	static int i,j,k,l,m,n;
	static int c;
	static int maxcell;
	static int maxtext;
	static char *nl;
	static char def[MAX_DEF][MAX_STR];
	static char wt[MAX_DEF][MAX_STR];
	static int align[MAX_POS][MAX_COL];
	static int action[MAX_POS][MAX_COL];
	static int field[MAX_POS][MAX_COL];
	static int skipstep[MAX_POS][MAX_COL];
	static int a;
	static char spacer[MAX_TMP];
	static int length[MAX_COL];
	static int ncol,lcol;
	static int ret;

	static int grid_cols;
	static int grid_rows;
	static int grid_sx;
	static int grid_sy;
	static int grid_ex;
	static int grid_ey;
	static int grid_diff;
	static int grid_num;

	for(i=0;i<MAX_TMP;i++)
	{
		memset(tmpbuff1,'\0',sizeof(tmpbuff1)) ;
		memset(tmpbuff2,'\0',sizeof(tmpbuff2)) ;
	}
	if ((fp = fopen(f,"r")) == NULL)
	{
		return(0);
	}

	i = 0;

	while((fgets(def[i],MAX_TMP ,fp)) != NULL)
	{
		if((nl = strchr(def[i],'\n')) != NULL)
		{
			*nl = '\0';
			i++;
		}
		if((nl = strchr(def[i],'#')) != NULL)
		{
			*nl = '\0';
			i++;
		}
	}
	ncol = 0;
	for(j=0;j<i;j++)
	{

		if((nl = strchr(def[j],'=')) != NULL)
		{
			for(l=0;def[j][l]!='=';l++)
			{
				p[l]=toupper(def[j][l]);
			}
			p[l]=toupper(def[j][l]);
			p[l+1] = '\0';
			if(compare(0,p,gridprpty[0]) == 0)
			{
				strcpy(tmpbuff1,nl+1);
				xcol = atoi(tmpbuff1);
			}
			if(compare(1,p,gridprpty[1]) == 1)
			{
				strcpy(tmpbuff1,nl+1);
				rows = atoi(tmpbuff1);
			}
			if(compare(2,p,gridprpty[2]) == 2)
			{
				strcpy(tmpbuff1,nl+1);
				grid_sx = atoi(tmpbuff1);
			}
			if(compare(3,p,gridprpty[3]) == 3)
			{
				strcpy(tmpbuff1,nl+1);
				grid_sy = atoi(tmpbuff1);
			}
			if(compare(4,p,gridprpty[4]) == 4)
			{
				strcpy(tmpbuff1,nl+1);
				grid_ex = atoi(tmpbuff1);
			}
			if(compare(5,p,gridprpty[5]) == 5)
			{
				strcpy(tmpbuff1,nl+1);
				grid_ey = atoi(tmpbuff1);
			}
			if(compare(6,p,gridprpty[6]) == 6)
			{
				m = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						length[m] = atoi(tmpbuff2);
						ncol = ncol + length[m];
						m++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = tmpbuff1[k];
						n++;
						break;
					}
				}
			}
			if(compare(7,p,gridprpty[7]) == 7)
			{
				a = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						if((strcmp(tmpbuff2,RIGHT)) == 0)
						{
							align[0][a] = 1;
						}
						if((strcmp(tmpbuff2,LEFT)) == 0)
						{
							align[0][a] = 2;
						}
						if((strcmp(tmpbuff2,CENTER)) == 0)
						{
							align[0][a] = 3;
						}
						a++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = toupper(tmpbuff1[k]);
						n++;
						break;
					}
				}
			}
			if(compare(8,p,gridprpty[8]) == 8)
			{
				a = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						if((strcmp(tmpbuff2,ACT_EDIT)) == 0)
						{
							action[0][a] = 0;
						}
						if((strcmp(tmpbuff2,ACT_NONE)) == 0)
						{
							action[0][a] = 1;
						}
						a++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = toupper(tmpbuff1[k]);
						n++;
						break;
					}
				}
			}
			if(compare(9,p,gridprpty[9]) == 9)
			{
				a = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						sprintf(gridtitles[a],"%s",tmpbuff2);
						a++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = tmpbuff1[k];
						n++;
						break;
					}
				}
			}
			if(compare(10,p,gridprpty[10]) == 10)
			{
				a = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						if((strcmp(tmpbuff2,FLD_TEXT)) == 0)
						{
							field[0][a] = 1;
						}
						if((strcmp(tmpbuff2,FLD_NUMERIC)) == 0)
						{
							field[0][a] = 2;
						}
						if((strcmp(tmpbuff2,FLD_BOOL)) == 0)
						{
							field[0][a] = 3;
						}
						if((strcmp(tmpbuff2,FLD_CURRENCY)) == 0)
						{
							field[0][a] = 4;
						}
						if((strcmp(tmpbuff2,FLD_DATE)) == 0)
						{
							field[0][a] = 5;
						}
						if((strcmp(tmpbuff2,FLD_SINGLE)) == 0)
						{
							field[0][a] = 6;
						}
						if((strcmp(tmpbuff2,FLD_DOUBLE)) == 0)
						{
							field[0][a] = 7;
						}
						if((strcmp(tmpbuff2,FLD_BYTE)) == 0)
						{
							field[0][a] = 8;
						}
						a++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = toupper(tmpbuff1[k]);
						n++;
						break;
					}
				}
			}
			if(compare(11,p,gridprpty[11]) == 11)
			{
				a = 0;
				strcpy(tmpbuff1,nl+1);
				for(k=0,n=0;tmpbuff1[k] != '\0';k++)
				{
					switch(tmpbuff1[k])
					{
					case '\0':
						break;
					case ',':
						tmpbuff2[n] = '\0';
						if((strcmp(tmpbuff2,SKIP)) == 0)
						{
							skipstep[0][a] = 0;
						}
						if((strcmp(tmpbuff2,STEP)) == 0)
						{
							skipstep[0][a] = 1;
						}
						a++;
						n = 0;
						break;
					default:
						tmpbuff2[n] = toupper(tmpbuff1[k]);
						n++;
						break;
					}
				}
			}
		}
	}
	fclose(fp);

	if(fx + xcol > COLS  || fy + rows > LINES)
	{
		fprintf(stderr,"Over Lines or Cols FormWindow No:%d / %d Lines - %d Cols\n",no,grid_ey-grid_sy,grid_ex-grid_sx);
		exit(1);
	}

	emi = newwin(2,6,LINES-2,COLS-6);

	wmode = 1;

	lcol = m;

	ft[no].sx = grid_sx;
	ft[no].ex = grid_ex;
	ft[no].sy = grid_sy;
	ft[no].ey = grid_ey;
	ft[no].lcol = lcol;
	ft[no].width = xcol;
	ft[no].height = rows;
	xt[no].form = newwin(rows,xcol,fy,fx);
	keypad(xt[no].form,TRUE);
	meta(xt[no].form, TRUE);

	if(lcol == 0)
		return(0);

	i = 0;
	l = 0;

	for(k=0,c=0;k<(ncol+(m-1));k=(k+length[l-1]+1),c++)
	{
		for(j=0;j<(grid_ey-grid_sy)+1;j++)
		{
			ft[no].st[c][j].vs = subwin(xt[no].form,1,length[l]+2,fy+grid_sy+j,fx+(grid_sx+k+0));
			keypad(ft[no].st[c][j].vs,TRUE);
			meta(ft[no].st[c][j].vs, TRUE);
			wattron(ft[no].st[c][j].vs, A_UNDERLINE);
			ft[no].st[c][j].x = (k+1);
			ft[no].st[c][j].y = j+1;
			ft[no].cp[c][j].no = i;
			ft[no].cp[c][j].x = (k+1);
			ft[no].cp[c][j].len = length[l];
			ft[no].cp[c][j].y = j;
			ft[no].cp[c][j].c = l;
			ft[no].cp[c][j].align = align[0][c];
			ft[no].cp[c][j].action = action[0][c];
			ft[no].cp[c][j].ftype = field[0][c];
			ft[no].cp[c][j].stype = skipstep[0][c];
			memset(ft[no].cp[c][j].s,' ',length[l]);
			mvwprintw(ft[no].st[c][j].vs,0,1,"%s",ft[no].cp[c][j].s);
			mvwprintw(xt[no].form,j+grid_sy,grid_sx+k+0,"|");
			wrefresh(ft[no].st[c][j].vs);
			i++;
		}
		l++;
	}

#ifdef BOX
	box(xt[no].form,'.','.');
#endif

	for(j=0;j<(grid_ey - grid_sy)+1;j++)
	{
//2001.01.23
	//	mvwprintw(xt[no].form,j+grid_sy,grid_sx+ncol+lcol+1,"|");
		mvwprintw(xt[no].form,j+grid_sy,grid_sx+ncol+lcol+0,"|");
	}

	i--;

	maxcell = i;

 	l = 0;

	wattron(xt[no].form, A_UNDERLINE);
	memset(tmpbuff2,' ',(ncol+m)-1);
//	mvwprintw(xt[no].form,grid_sy-1,grid_sx+1+1,tmpbuff2);
//2001.01.23
	mvwprintw(xt[no].form,grid_sy-1,grid_sx+1+0,tmpbuff2);
	for(i=0,j=0;i < m;i++,j++)
	{
//2001.01.23
	//	mvwprintw(xt[no].form,grid_sy-1,grid_sx+j+1+1,gridtitles[i]);
		mvwprintw(xt[no].form,grid_sy-1,grid_sx+j+1+0,gridtitles[i]);
		j = j + length[i];
	}
	wattroff(xt[no].form, A_UNDERLINE);

	return(xcol);
}

int MakeTextBox(int no,int fx,int fy,int xcol,int xrow,int *label_no,char **label_text,int *label_x,int *label_y,int *label_length,int *textbox_no,int *textbox_x,int *textbox_y,int *textbox_length,int *align,int *action,int *field,int *skipstep, int m)
{
	static WINDOW *vs;
	static TextBox *gp;
	static int i,j,k;
	static char p[MAX_STR];
	static int maxtext;
	static int a;

	maxtext = m;

	if(maxtext == 0)
		return(0);

	xt[no].maxtext = maxtext;

	for(i=0;i<maxtext;i++)
	{
		Labelpos[i][0] = 0;
		Labelpos[i][1] = 0;
		Labelpos[i][2] = 0;
		Labelpos[i][3] = 0;
		Textpos[i][0] = 0;
		Textpos[i][1] = 0;
		Textpos[i][2] = 0;
		Textpos[i][3] = 0;
	}
	for(i=0;i<maxtext;i++)
	{
		Labelpos[i][0] = label_no[i];
		Labelpos[i][1] = label_x[i];
		Labelpos[i][2] = label_y[i];
		Labelpos[i][3] = label_length[i];
	}
	for(i=0;i<maxtext;i++)
	{
		Textpos[i][0] = textbox_no[i];
		Textpos[i][1] = textbox_x[i];
		Textpos[i][2] = textbox_y[i];
		Textpos[i][3] = textbox_length[i];
	}

	i = 0;
	k = 0;

	memset(tmpbuff1,'\0',sizeof(tmpbuff1));

	for(j=0;j<maxtext;j++)
	{
		ft[no].pos[i].vs = subwin(xt[no].form,1,Textpos[j][3]+2,fy+Textpos[j][2],fx+Textpos[j][1]);
		keypad(ft[no].pos[i].vs,TRUE);
		meta(ft[no].pos[i].vs, TRUE);
		if((gp = (TextBox *)calloc(1,sizeof(TextBox))) == (TextBox  *)NULL)
		{
			return -1;
		}
		if((gp->s = (char *)calloc(2,sizeof(tmpbuff1) + 1)) == (char  *)NULL)
		{
			return -1;
		}

		memset(tmpbuff1,'\0',sizeof(tmpbuff1));
		memset(tmpbuff1,' ',Textpos[j][3]);
		sprintf(gp->s,"%s",tmpbuff1);
		wrefresh(ft[no].pos[i].vs);

		gp->no = i;
		gp->n = i;
		gp->col = i;
		gp->no = Textpos[j][0];
		gp->x = Textpos[j][1];
		gp->y = Textpos[j][2];
		gp->c = i+1;
		gp->len = Textpos[j][3];
		gp->align = align[j];
		gp->action = action[j];
		gp->ftype = field[j];
		gp->stype = skipstep[j];

		ft[no].pos[i].col = i;
		ft[no].pos[i].n = i;
		ft[no].pos[i].c = i+1;
		ft[no].pos[i].len = Textpos[j][3];
		ft[no].pos[i].x = Textpos[j][1];
		ft[no].pos[i].y = Textpos[j][2];
		ft[no].pos[i].align = align[j];
		ft[no].pos[i].action = action[j];
		ft[no].pos[i].ftype = field[j];
		ft[no].pos[i].stype = skipstep[j];

		gp->prev = ending->prev;
		ending->prev = gp;

		gp->next = tp->next;
		tp->next = gp;

		tp = gp;
		i++;
	}

//2010.03.13
	maxtext = i;
	for(k=0;k<maxtext;k++)
	{
		mvwprintw(xt[no].form,Labelpos[k][2],Labelpos[k][1],"%s",*(label_text+k));
	}

	tp = begin->next;
	for(i=0;i<maxtext+1;i++)
	{
		mvwprintw(ft[no].pos[i].vs,0,0,"[");
		mvwprintw(ft[no].pos[i].vs,0,tp->len+1,"]");
		mvwprintw(ft[no].pos[i].vs,0,1,"%s",tp->s);
		wrefresh(ft[no].pos[i].vs);
		if(tp->next != (TextBox *)NULL)
		{
			mvwprintw(ft[no].pos[i].vs,0,1,"%s",tp->s);
			tp = tp->next;
		}
	}
	mvwprintw(ft[no].pos[i].vs,0,1,"?%s",tp->s);
	wrefresh(ft[no].pos[i].vs);

	return(maxtext);
}

int MakeWsubForm(int no, int xcol,int rows,int fx ,int fy,int grid_sx,int grid_sy,int grid_ex,int grid_ey,int *length,int *align,int *action,int *field,int *skipstep,char **grid_titles,int m)
{
	static FILE *fp;
	static WINDOW *vs;
	static char p[MAX_TMP];
	static int ch;
	static int i,j,k,l;
	static int c;
	static int maxcell;
	static int ncol,lcol;
	static int ret;

	for(i=0;i<MAX_TMP;i++)
	{
		memset(tmpbuff1,'\0',sizeof(tmpbuff1)) ;
		memset(tmpbuff2,'\0',sizeof(tmpbuff2)) ;
	}

	if(fx + xcol > COLS  || fy + rows > LINES)
	{
		fprintf(stderr,"Over Lines or Cols FormWindow No:%d / %d Lines - %d Cols\n",no,grid_ey-grid_sy,grid_ex-grid_sx);
		exit(1);
	}

	emi = newwin(2,6,LINES-2,COLS-6);

	wmode = 1;

	lcol = m;

	ft[no].sx = grid_sx;
	ft[no].ex = grid_ex;
	ft[no].sy = grid_sy;
	ft[no].ey = grid_ey;
	ft[no].lcol = lcol;
	ft[no].width = xcol;
	ft[no].height = rows;
	xt[no].form = newwin(rows,xcol,fy,fx);
	keypad(xt[no].form,TRUE);
	meta(xt[no].form, TRUE);

	if(lcol == 0)
		return(0);

	ncol = 0;
	for(i=0;i < lcol;i++)
		ncol = ncol + length[i];

	i = 0;
	l = 0;

	ncol = 0;
	for(i=0;i < lcol;i++)
		ncol = ncol + length[i];

	for(k=0,c=0;k<(ncol+(m-1));k=(k+length[l-1]+1),c++)
	{
		for(j=0;j<(grid_ey-grid_sy)+1;j++)
		{
			ft[no].st[c][j].vs = subwin(xt[no].form,1,length[l]+2,fy+grid_sy+j,fx+(grid_sx+k+0));
			keypad(ft[no].st[c][j].vs,TRUE);
			meta(ft[no].st[c][j].vs, TRUE);
			wattron(ft[no].st[c][j].vs, A_UNDERLINE);
			ft[no].st[c][j].x = (k+1);
			ft[no].st[c][j].y = j+1;
			ft[no].cp[c][j].no = i;
			ft[no].cp[c][j].x = (k+1);
			ft[no].cp[c][j].len = length[l];
			ft[no].cp[c][j].y = j;
			ft[no].cp[c][j].c = l;

			ft[no].cp[c][j].align = align[c];
			ft[no].cp[c][j].action = action[c];
			ft[no].cp[c][j].ftype = field[c];
			ft[no].cp[c][j].stype = skipstep[c];
			/*
			ft[no].cp[c][j].align = align[0][c];
			ft[no].cp[c][j].action = action[0][c];
			ft[no].cp[c][j].ftype = field[0][c];
			ft[no].cp[c][j].stype = skipstep[0][c];
			*/
			memset(ft[no].cp[c][j].s,' ',length[l]);
			mvwprintw(ft[no].st[c][j].vs,0,1,"%s",ft[no].cp[c][j].s);
			mvwprintw(xt[no].form,j+grid_sy,grid_sx+k+0,"|");
			wrefresh(ft[no].st[c][j].vs);
			i++;
		}
		l++;
	}

#ifdef BOX
	box(xt[no].form,'.','.');
#endif

	for(j=0;j<(grid_ey - grid_sy)+1;j++)
	{
//2001.01.23
	//	mvwprintw(xt[no].form,j+grid_sy,grid_sx+ncol+lcol+1,"|");
		mvwprintw(xt[no].form,j+grid_sy,grid_sx+ncol+lcol+0,"|");
	}

	i--;

	maxcell = i;

 	l = 0;

	wattron(xt[no].form, A_UNDERLINE);
	memset(tmpbuff2,' ',(ncol+m)-1);
//	mvwprintw(xt[no].form,grid_sy-1,grid_sx+1+1,tmpbuff2);
//2001.01.23
	mvwprintw(xt[no].form,grid_sy-1,grid_sx+1+0,tmpbuff2);
	for(i=0,j=0;i < m;i++,j++)
	{
//2001.01.23
	//	mvwprintw(xt[no].form,grid_sy-1,grid_sx+j+1+1,*(grid_titles+i));
		mvwprintw(xt[no].form,grid_sy-1,grid_sx+j+1+0,*(grid_titles+i));
		j = j + length[i];
	}
	wattroff(xt[no].form, A_UNDERLINE);

	return(xcol);
}

/*
int subform(void);
{
	int i,j,k;
	char f[128];
	int xcol,rows;
	int maxtext;

	strcpy(f,"_subform.def");

	initscr();

	xcol = COLS;
	rows = LINES;

	cbreak();
	noecho();
	keypad(stdscr, TRUE);
	meta(stdscr, TRUE);

	emi = newwin(2,12,LINES-2,COLS-12);

	if(stat(f,fileptr) != 0)
	{
		echo();
		endwin();
		printf("canot find %s\n",f);
		exit(0);
	}
	wmode = 1;
	xcol = wsubform(0,xcol,rows,1,2,f);
	maxtext = textbox(0,1,2,f);

	wrefresh(xt[0].form);
	for(i=0;i<MAX_POS;i++)
		memset(gridtitles[i],'\0',MAX_LEN);

	xcol = wsubform(2,xcol,rows,0,46,"_footer.def");
	wrefresh(xt[2].form);

	xcol = wsubform(1,xcol,rows,0,0,"_header.def");
	wrefresh(xt[1].form);

	if(maxtext > 0)
	{
		while(1)
		{
			formtext(0,maxtext, xcol);
			switch()
			{
			}
		}
	}
	else
	{
		while(1)
		{
			grid(0,maxtext,xcol);
		}
	}
}
*/

