#include "wsubformHTML.h"	//サブフォーム専用ヘッダファイルをインクルードする。
#include "fcgi_stdio.h"	//FastCGI用ヘッダファイルをインクルードする。

extern char gridtitles[MAX_POS][MAX_LEN];	//wsubformHTMLが利用するgridのタイトル。

extern TextBox	 *begin;	//textboxで使用する連鎖ポインタの開始位置
extern TextBox	 *tp;	//textboxで使用する連鎖ポインタ

typedef struct stat Dir;	//ファイル操作用
static Dir dirptr;
static Dir  *fptr = &dirptr;

char tmp[MAX_STR];
char COMMANDNAME[256];	//実行するCGI自身の名前
//autono[][]の最初の配列[0]にはjohoIDの数値が入り、次の配列[1]に配列番号が入る
int autono[10000][2];
int autoindex;

static int sqlcode = 0;	//PostgreSQLの返すコード

int DBcount[MAX_FORM];	//wsubformHTMLで利用するDBの現在の最大行数
extern char KEY[256][MAX_STR];	//INSERTとUPDATEが使用する更新項目
static char prefecture[47][15] = {"北海道","青森県","岩手県","秋田県","山形県","宮城県","福島県","茨城県","栃木県","群馬県","埼玉県","千葉県","東京都","神奈川県","新潟県","富山県","石川県","福井県","山梨県","長野県","岐阜県","静岡県","愛知県","三重県","滋賀県","京都府","大阪府","兵庫県","奈良県","和歌山県","鳥取県","島根県","岡山県","広島県","山口県","徳島県","香川県","愛媛県","高知県","福岡県","佐賀県","長崎県","熊本県","大分県","宮崎県","鹿児島県","沖縄県"};

int DBConnect(void)
{
	// DB接続用変数宣言です。DB名、ユーザ名、パスワードを設定してください。
	EXEC SQL BEGIN DECLARE SECTION;
		char dbname[12];
		char user[12];
		char passwd[12];
	EXEC SQL END DECLARE SECTION;

	strcpy(dbname,"apsch");
	strcpy(user,"cms");
	strcpy(passwd,"cms");

#ifdef DEBUG
	// ECPGデバッグ文出力
	ECPGdebug (0, stderr);
#endif

	// 接続
	memset (sqlca.sqlstate, '0', 5);
	EXEC SQL CONNECT TO :dbname AS dbConnection user :user USING :passwd;
	if (memcmp (sqlca.sqlstate, "00000", 5) != 0)
	{
		sprintf(tmp,"%s->CONNECT エラー。終了します。:%d - %s",COMMANDNAME,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
	//	logmsg(tmp);
		exit (EXIT_FAILURE);
	}
}

int Fetch_sampukiroku_all(int no)
{
	static char DBbuff[MAX_STR];
	int i = 0;
	char *qs;
	int qcount;

	DBConnect();

	memset (sqlca.sqlstate, '0', 5);

	EXEC SQL BEGIN DECLARE SECTION;
		int rec_count;
		char	 key[256][MAX_STR];
		int		johoID;		//NUMERIC
	EXEC SQL END DECLARE SECTION;

	sqlcode = 0;
	DBcount[no] = 0;

	rec_count = 0;

	// DBの行数を取得
	EXEC SQL 
	SELECT 
	COUNT(*)
	INTO :rec_count
	FROM	sampukiroku;

	// SELECTエラー 
	if(memcmp (sqlca.sqlstate, "00000", 5) != 0)
	{
		sprintf(tmp,"SELECT COUNTエラー:%d - %s",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
		//	logmsg(tmp);
		return(-1) ;
	}

	DBcount[no] = rec_count;

	EXEC SQL DECLARE sampukiroku_Fetch_all_CURSOR CURSOR FOR 
	SELECT 
	johoID
	FROM	sampukiroku
	ORDER BY johoID;

	// カーソルオープン
	EXEC SQL OPEN sampukiroku_Fetch_all_CURSOR;

	// CURSOR OPENエラー 
	if (memcmp (sqlca.sqlstate, "00000", 5) != 0)
	{
		sprintf(tmp,"CURSOR OPENエラー:%d - %s",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
	//	logmsg(tmp);
		return(-1);
	}

	//以下に続くjohoIDというのは仮のレコード項目なので正しい名前に変更して下さい。
	// johoID項目をautono[]にセットする
	for(i=0;i<DBcount[no];i++)
	{
		EXEC SQL FETCH sampukiroku_Fetch_all_CURSOR INTO
			:johoID;

		if(johoID == atoi(KEY[0]))
			autoindex = i;

		autono[i][0] = johoID;
		autono[i][1] = i;
	}
	// カーソルクローズ 
	EXEC SQL CLOSE sampukiroku_Fetch_all_CURSOR;

	DBcount[no] = rec_count;

	// 結果チェック
	if (sqlca.sqlcode == 0)
	{
		sprintf(tmp,"FETCH結果チェック:%d - %s",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
		//	logmsg(tmp);
	}
	// 切断
	sqlca.sqlcode = 0;
	EXEC SQL DISCONNECT dbConnection;
	return(0);
}

int Fetch_sampukiroku_Menu(int no, int line)
{
	static char DBbuff[MAX_STR];
	int i = 0;
	char *qs;
	int qcount;

	DBConnect();

	memset (sqlca.sqlstate, '0', 5);

	EXEC SQL BEGIN DECLARE SECTION;
		int rec_count;
		int rec_max;
		char	 key[256][MAX_STR];
		int	 ikey[256];
		int		No;		//NUMERIC
		char	seisansyaCD[8 + 1];	//TEXT
		char	hojo[36 + 1];	//TEXT
		char	youto[12 + 1];	//TEXT
		char	yakuzaimei[96 + 1];	//TEXT
		char	yakuzaikubun[1 + 1];	//TEXT
		int		nouyakusyubetu;		//NUMERIC
		char	kisyakubaisuu_shorikubun[30 + 1];	//TEXT
		char	sampuDATE[13 + 1];	//TEXT
		char	hinmoku_hinsyumei[96 + 1];	//TEXT
		char	syukakukaishiDATE[13 + 1];	//TEXT
		char	kisyakubaisuu[15 + 1];	//TEXT
		char	shiyounissu[30 + 1];	//TEXT
		char	shiyukaisuu[30 + 1];	//TEXT
		char	nendo[13 + 1];	//TEXT
		char	bikou[1024 + 1];	//TEXT
	EXEC SQL END DECLARE SECTION;

	sqlcode = 0;
	DBcount[no] = 0;

	rec_count = 0;

	// 検索するレコードの行数を取得
	EXEC SQL 
	SELECT 
	COUNT(*)
	INTO :rec_count
	FROM	sampukiroku
	WHERE seisansyaCD = :key[0];


	// SELECTエラー 
	if(memcmp (sqlca.sqlstate, "00000", 5) != 0)
	{
		sprintf(tmp,"%s->SELECT COUNTエラー:%d - %s",COMMANDNAME,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
	//	logmsg(tmp);
		return(-1) ;
	}

	if(rec_count == 0)
	{
		printf("Content-type: text/html; charset=utf-8\n\n");
		printf("<html lang=\"ja\">\n");
		printf("<head>\n");
		printf("<meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n"); 
		printf("<title>DB-ERROR</title>\n");
		printf("</head>\n");
		printf("<body bgcolor=\"#ffffff\">\n");
		printf("<br>\n");
		printf("<table border=0>\n");
		printf("<tr>\n");
		printf("みつかりませんでした。<br>\n");
		printf("<form name=\"error\" method=\"post\" action=\"/cgi-bin/yubin/yubin.fcgi\">\n");
		printf("<input accesskey=\"A\" tabindex=0 type=\"submit\" value=\"戻る\">\n");
		printf("</form>\n");
		printf("</tr>\n");
		printf("</body>\n");
		printf("</html>\n");
	}

	DBcount[no] = rec_count;

	// 以下の項目はユニークな項目を利用してインサート時の項目番号等を増加するために利用します
	// 利用する場合はコメントを外して下さい。
	// あるDB項目の最大数を取得
//	if(rec_count == 0)
//	{
//		sprintf(seisansyaCD,"%s",key[1]);
//		rec_max = 0;
//		DBcount[no] = 1;
//	}
//	else
//	{
//		EXEC SQL 
//		SELECT 
//		MAX(No)
//		INTO :rec_max
//		FROM	sampukiroku;

//	// SELECTエラー 
//		if(memcmp (sqlca.sqlstate, "00000", 5) != 0)
//		{
//			sprintf(tmp,"%s->SELECT MAX()エラー:%d - %s",COMMANDNAME,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
//		//	logmsg(tmp);
//			return(-1) ;
//		}
//	}

	EXEC SQL DECLARE sampukiroku_Menu_CURSOR CURSOR FOR 
	SELECT 
		No,
		coalesce(seisansyaCD,' ','0'),
		coalesce(hojo,' ','0'),
		coalesce(youto,' ','0'),
		coalesce(yakuzaimei,' ','0'),
		coalesce(yakuzaikubun,' ','0'),
		nouyakusyubetu,
		coalesce(kisyakubaisuu_shorikubun,' ','0'),
		coalesce(sampuDATE,' ','0'),
		coalesce(hinmoku_hinsyumei,' ','0'),
		coalesce(syukakukaishiDATE,' ','0'),
		coalesce(kisyakubaisuu,' ','0'),
		coalesce(shiyounissu,' ','0'),
		coalesce(shiyukaisuu,' ','0'),
		coalesce(nendo,' ','0'),
		coalesce(bikou,' ','0')
	FROM	sampukiroku
	WHERE seisansyaCD = :key[0]
	ORDER BY seisansyaCD;

	// カーソルオープン
	EXEC SQL OPEN sampukiroku_Menu_CURSOR;

	// CURSOR OPENエラー 
	if (memcmp (sqlca.sqlstate, "00000", 5) != 0)
	{
		sprintf(tmp,"%s->CURSOR OPENエラー:%d - %s",COMMANDNAME,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
	//	logmsg(tmp);
		return(-1);
	}

	for(i=0;i<DBcount[no];i++)
	{
		EXEC SQL FETCH sampukiroku_Menu_CURSOR INTO
			:No,
			:seisansyaCD,
			:hojo,
			:youto,
			:yakuzaimei,
			:yakuzaikubun,
			:nouyakusyubetu,
			:kisyakubaisuu_shorikubun,
			:sampuDATE,
			:hinmoku_hinsyumei,
			:syukakukaishiDATE,
			:kisyakubaisuu,
			:shiyounissu,
			:shiyukaisuu,
			:nendo,
			:bikou;

	// テーブル項目をsplitbDBbuff[][]にセットする
		sf_to_text(No,DBbuff);	//NUMERIC型(int)を文字に変換する。
		sf_assgetDB(no,i,0,DBbuff,5 + 1);
		sf_assgetDB(no,i,1,seisansyaCD,8 + 1);
		sf_assgetDB(no,i,2,hojo,36 + 1);
		sf_assgetDB(no,i,3,youto,12 + 1);
		sf_assgetDB(no,i,4,yakuzaimei,96 + 1);
		sf_assgetDB(no,i,5,yakuzaikubun,1 + 1);
		sf_to_text(nouyakusyubetu,DBbuff);	//NUMERIC型(int)を文字に変換する。
		sf_assgetDB(no,i,6,DBbuff,5 + 1);
		sf_assgetDB(no,i,7,kisyakubaisuu_shorikubun,30 + 1);
		sf_assgetDB(no,i,8,sampuDATE,13 + 1);
		sf_assgetDB(no,i,9,hinmoku_hinsyumei,96 + 1);
		sf_assgetDB(no,i,10,syukakukaishiDATE,13 + 1);
		sf_assgetDB(no,i,11,kisyakubaisuu,15 + 1);
		sf_assgetDB(no,i,12,shiyounissu,30 + 1);
		sf_assgetDB(no,i,13,shiyukaisuu,30 + 1);
		sf_assgetDB(no,i,14,nendo,13 + 1);
		sf_assgetDB(no,i,15,bikou,1024 + 1);

	}
	// カーソルクローズ 
	EXEC SQL CLOSE sampukiroku_Menu_CURSOR;

	DBcount[no] = rec_count;

	// 結果チェック
	if (sqlca.sqlcode == 0)
	{
		sprintf(tmp,"%s->FETCH結果チェック:%d - %s",COMMANDNAME,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
	//	logmsg(tmp);
	}
	// 切断
	sqlca.sqlcode = 0;
	EXEC SQL DISCONNECT dbConnection;
	return(0);
}

// DBから入出力(画面)ウインドウに書き込みます。
void sampukiroku_Menu_text_writeHTML(int no, int post, int line,int maxcol, char **db_titles)
{
	int i;
	char s[MAX_TMP];

	printf("Content-type: text/html; charset=utf-8\n\n");
	printf("<html lang=\"ja\">\n");
	printf("<head>\n");
	printf("<meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n"); 
	printf("<title>form Menu_text_writeHTML page</title>\n");
	printf("</head>\n");
	printf("<body bgcolor=\"#ffffff\">\n");
	printf("<br>\n");
	printf("<a href=\"http://codoo2hk.corede.net/index.html\" target=\"_parent\">[TOPへ]</a>\n");
	printf("<a href=\"#\" onClick=\"history.back(); return false;\">[前に戻る]</a>\n");
// この下に実行するCGIへのGETメソッドを記述してください。以下がサンプルです。
	//	printf("<form method=\"get\" action=\"/cgi-bin/otodoke_Fetch.fcgi?field=%s\">\n",KEY[0]);
	//	printf("<input tabindex=0 type=\"submit\" value=\"更新画面へ\"><br>\n");

	//送信はGETを使用します。
	printf("<form method=\"get\" action=\"/cgi-bin/sampukiroku.fcgi\">\n");
	printf("<select name=\"field0\" size=\"8\" maxlength=\"64\"><br>\n");
	for(i=0;i<DBcount[no];i++)
	{
		printf("<option value=\"%s\"> %s</option>\n",ft[no].splitDBbuff[i][1],ft[no].splitDBbuff[i][1]);
	}
	printf("</select>\n");
	printf("<input tabindex=1 type=\"submit\" name=\"field\" value=\"%s\">",KEY[1]);
	printf("</form>\n");
}

// FETCHした後にHTMLのテーブルにDBの行列を書き込みます。
int sampukiroku_Menu_grid_dispHTML(int no, int startline, int maxcol, int grid_ey, int grid_sy, int line)
{
	int i, j;
	char s[MAX_TMP];
	char hs[MAX_TMP];

	if((Fetch_sampukiroku_Menu(no,line)) == 0)
	{
		for(i=startline;i<DBcount[no];i++)
		{
			for(j=0;j<maxcol;j++)
			{
				sf_gputDBHTML(no,i,j,startline,s);
			}
		}

		return(0);
	}
	else
	{
		return(-1);
	}
}


int subformHTML(void)
{
	int i;
	char s[MAX_STR];

	int startline;

	int line;
	setlocale(LC_ALL,"");

//----------------------------------------------------------------------------------
//下ののハイフンのラインまでの以下の関数はDBと画面の設計を実際のフォームに適用します。
//これらの関数が無い場合は設計情報はDB設計以外は反映されません。

	static int xcol = 141;
	static int rows = 23;

//for label
	static int label_length[] = {0};
	static int label_no[] = {0};
	static int label_align[] = {0};
	static char *label_text[1][128] = {""};
	static int label_x[] = {0};
	static int label_y[] = {0};
//for textbox
	static int textbox_length[] = {5,8,36,13,96,2,5,32,13,96,13,15,32,32,13,138,0};
	static int textbox_no[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0};
	static int textbox_align[] = {1,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,0};
	static int textbox_action[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	static int textbox_skipstep[] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0};
	static int textbox_field[] = {2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,0};
	static int textbox_x[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	static int textbox_y[] = {5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,0};


//for grid
	static int cell_length[] = {5,3,3,3,3,3,5,3,3,3,3,3,3,3,8,15,0};
	static int cell_align[] = {1,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,0};
	static int cell_action[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	static int grid_field[] = {2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,0};
	static int grid_skipstep[] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0};
	char *grid_titles[17][128] = {"Grid_1","Grid_2","Grid_3","Grid_4","Grid_5","Grid_6","Grid_7","Grid_8","Grid_9","Grid_10","Grid_11","Grid_12","Grid_13","Grid_14","Grid_15","Grid_16",""};
	static char *db_titles[17][128] = {"No","seisansyaCD","hojo","youto","yakuzaimei","yakuzaikubun","nouyakusyubetu","kisyakubaisuu_shorikubun","sampuDATE","hinmoku_hinsyumei","syukakukaishiDATE","kisyakubaisuu","shiyounissu","shiyukaisuu","nendo","bikou",0};
	static int grid_sx = 0;
	static int grid_ex = 83;
	static int grid_sy = 3;
	static int grid_ey = 3;

	static int maxtext;
	static int no = 0;

	char **gt;
	char **lt;

	gt = (char **)&grid_titles;

	xcol = MakeWsubFormHTML(no,xcol,rows,0,2,grid_sx,grid_sy,grid_ex,grid_ey,cell_length,cell_align,cell_action,grid_field,grid_skipstep,gt,16);

	lt = (char **)&label_text;

//	以下の関数は<SELECT>でコンボボックスを作成する場合、一つのCGIで重複して利用出来ませんのでどちらかを削除してください。
	maxtext = MakeTextBoxHTML(no,0,2,xcol,rows,label_no,lt,label_x,label_y,label_length,textbox_no,textbox_x,textbox_y,textbox_length,textbox_align,textbox_action,textbox_field,textbox_skipstep, 16);

//----------------------------------------------------------------------------------

	for(i=0;i<MAX_POS;i++)
	{
		memset(gridtitles[i],'\0',MAX_LEN);
	}

	sf_startcell(0);

	startline = 0;	//初期行

	if(sampukiroku_Menu_grid_dispHTML(no,startline,maxtext,grid_sy,grid_ey,line) == -1)	//	*splitDBbuff[][]を表示する。
	{
		printf("grid_dispHTML():error\n");
	}

	//DBへのメニュー用フォームの作成（selectタグでコンボボックス連結時この行は削除して利用してください。）
	sampukiroku_Menu_text_writeHTML(no,0,i,maxtext,*db_titles);
}

int main(int argc, char *argv[])
{
	sprintf(COMMANDNAME,"%s",argv[0]);
	subformHTML();
}

