/**
 * Mextractr利用API
 * @author Masashi Sato(masashi@metadata.co.jp)
 */

metal.MextractType = function(id, innerType){
	this.type = innerType;
	this.label = id;
	this.id = id; //現行はこれを利用する。本来は別の値を定義するべき。
}

metal.MextractType.prototype.create = function(){
	var obj = new Object();
	obj.type = this;
	return obj;
}


metal.Mextractr = function(){
}

//JS中で利用する一般的なID文字列
metal.Mextractr.WHEN = 'WHEN';
metal.Mextractr.WHERE = 'WHERE';
metal.Mextractr.WHO = 'WHO';
metal.Mextractr.WHOS = 'WHOS'; //TODO：将来的には消すこと
metal.Mextractr.WHAT = 'WHAT';

//ここで扱う型を定義する
metal.Mextractr.TypeArray = 
[
	new metal.MextractType(metal.Mextractr.WHEN, 'datetime'),
	new metal.MextractType(metal.Mextractr.WHERE, 'address'),
	new metal.MextractType(metal.Mextractr.WHO, 'name'),
	new metal.MextractType(metal.Mextractr.WHOS, 'org_name'),
	new metal.MextractType(metal.Mextractr.WHERE, 'facility'),
	new metal.MextractType(metal.Mextractr.WHAT, 'event')
];

//キー文字列から引けるようにハッシュを作成
metal.Mextractr.Types = {};
for(var i = 0; i < metal.Mextractr.TypeArray.length; ++i){
	var t = metal.Mextractr.TypeArray[i];
	metal.Mextractr.Types[t.id] = t;
}

//内部型から引けるようにハッシュを作成
metal.Mextractr.InnerType2Type = {};
for(var i = 0; i < metal.Mextractr.TypeArray.length; ++i){
	var t = metal.Mextractr.TypeArray[i];
	metal.Mextractr.InnerType2Type[t.type] = t;
}

/**
 * typeに対応したMextractTypeを取得する
 * @param {Object} type 型文字列[name, org_name]
 */
metal.Mextractr.typeForName = function(type){
	
	if (type == 'entity') {
		return metal.Mextractr.WHAT;
	}

	var res = metal.Mextractr.InnerType2Type[type];
	if(res == undefined){
		throw new Error("Type(" + type + ")に対応した型が見つかりません");
	}
	return res;
};

/**
 * IDに対応したMextractTypeを取得する
 * @param {Object} id ID文字列[WHO, WHEN]
 */
metal.Mextractr.typeForId = function(id){

	var res = metal.Mextractr.Types[id];
	if(res == undefined){
		throw new Error("Id(" + id + ")に対応した型が見つかりません");
	}
	return res;
};


