/**********************************************************************
 
	Copyright (C) 2003 Hirohisa MORI <joshua@nichibun.ac.jp>
 
	This program is free software; you can redistribute it 
	and/or modify it under the terms of the GLOBALBASE 
	Library General Public License (G-LGPL) as published by 

	http://www.globalbase.org/
 
	This program is distributed in the hope that it will be 
	useful, but WITHOUT ANY WARRANTY; without even the 
	implied warranty of MERCHANTABILITY or FITNESS FOR A 
	PARTICULAR PURPOSE.

**********************************************************************/

#include "kibandata.h"
#include "arc_data.h"
#include "poly_data.h"
#include "attr_data.h"

typedef struct map_node{
	int nCol;
	int nRow;
	ARC_DATA *pArcData;
	POLY_DATA *pPolyData;
	ATTR_DATA *pAttrData;
	char szMapName[8];
} MAP_NODE;

typedef struct map_matrix{
	int nColSize;
	int nRowSize;
	int DataType;
	MAP_NODE **maps;
} MAP_MATRIX;

typedef struct bunrui_file_name_set{
	char szFileNames[3][MAX_PATH];
	int nDataTypes[3];
} BUNRUI_FILE_NAME_SET;


#define FJA_TO_PREV 1
#define FJA_TO_NEXT 2
typedef struct arc_id_record_ptr_list{
	struct arc_id_record_ptr_list *pNext;
	struct arc_id_record_ptr_list *pPrev;
	ARC_ID_RECORD *pRecord;
	MAP_NODE *pMap;
}ARC_ID_RECORD_PTR_LIST;


/* マトリクスを作成する */
MAP_MATRIX *MMCreate(const char *szZuyouFileName, int DataFileType, KIBAN2SVG_PROCESSING_INFO_DATA *pInfo);
/* マトリクスに含まれるポリゴンを連結して返す */
int JoinPolyInMatrix(MAP_MATRIX *pMatrix, POLY_DATA **ppPolyJoined, ATTR_DATA **ppAttrJoined);

/* マトリクスに含まれるアークをすべて結合して返す */
int JoinArcsInMatrix(MAP_MATRIX *pMatrix, ARC_DATA **ppArcJoined, ATTR_DATA **ppAttrJoined);


/*
指定した図葉を基点に、図葉に含まるアークすべての結合できるアークを検索して、結合後データをpArcJoinedに格納する。*/
int JoinArcsInMap(ARC_DATA *pArcJoined, ATTR_DATA *pAttrJoined, MAP_MATRIX *pMatrix, int nCol, int nRow, int *nNewID, VC_HASH_TABLE *pIDConv);

/* マトリクスに含まれる結合されるアークのリストを返す */
void FindJoinArcsInMatrix(MAP_MATRIX *pMatrix, V_LIST **JoinArcsList);
/* 指定した図葉を基点に、図葉に含まるアークすべての結合できるアークを検索して、結果をJoinArcsListに格納 */
void FindJoinArcsInMap(MAP_MATRIX *pMatrix, int nCol, int nRow, V_LIST **JoinArcsList);
/* 指定した点を基点に、結合できるアークを次々と検索し、検索結果をpJoinArcListに格納する */
void FindJoinArcs(ARC_ID_RECORD_PTR_LIST *pJoinArcList,  
				  GB_POINT *ptFrom, GB_POINT *ptFrom2, char *szCode, MAP_MATRIX *pMapMatrix, int nCol, int nRow, int Direction, int nRefferCol, int nRefferRow);

/* マトリクスに含まれるすべてのアークのＩＤを一意なものに変換 */
void UniqeArcIDInMatrix(MAP_MATRIX *pMatrix);
/* 先頭文字がszFilterのＩＤを持ったレコードに削除フラグを立てる */
void RemoveArcFromMatrixById(MAP_MATRIX *pMatrix, char *szFilter);
/* マトリクスに含まれるアークをすべてＳＶＧに出力 */
void ArcData2SVGInMatrix(FILE *fp, MAP_MATRIX *pMatrix, char *szColor);
/* マトリクスに含まれるすべての属性情報をＸＭＬに出力 */
void AttrData2XMLInMatrix(FILE *fp, MAP_MATRIX *pMatrix);
int ReadMapsFromMapName(MAP_MATRIX *pMatrix, 
					  int nOrignCol,
					  int nOriginRow,
					  const char *szDataRootPath,
					  const char *szMapName,
					  int DataFileType);
int SetMapMatrixCount(MAP_MATRIX *pMatrix, int nColSize, int nRowSize, int nColOffset, int nRowOffset);
void free_map_matrix(MAP_MATRIX *pMatrix);
typedef struct join_arc_candidate{
	ARC_ID_RECORD *pRecord;
	int HitPos;
#define JAC_HIT_BEGIN 1
#define JAC_HIT_END   2
}JOIN_ARC_CANDIDATE;

