/**
 * MextractrテーブルAPI
 * [依存]jQuery
 * @author Masashi Sato(masashi@metadata.co.jp)
 */
/* USAGE

<script type="text/javascript" src="/javascripts/jquery.js"></script>
<script type="text/javascript" src="/javascripts/metal/mextracted_table.js"></script>

<script type="text/javascript"><!--

var json = '[{"type":"org_name","content":"*参院外交防衛委員会"},{"type":"datetime","content":"11日午前","startTime":"2008-11-11"}]';
var targetTable = '#mextractedTable';

var mextractedTable = new metal.MextractedTable();
mextractedTable.target = targetTable;
$(function(){
	mextractedTable.parseJson(json);
});
//-->
</script>
 
*/

//テーブルのビューのデフォルトレイアウタ
metal.MextractedTableLayouter = function(){
}

metal.MextractedTableLayouter.prototype.layout = function(mextractedList, target){
	this.target = target;
	
	var len = mextractedList.length;
	if(len == 0){
		$('#main').html("抽出できる言葉がありませんでした");
		return;
	}
	
    for (i = 0; i < len; ++i) {
		mextracted = mextractedList[i];
		if(mextracted.type == 'event'){
	        this.constructWhat(mextracted, i);
		}
		if(mextracted.type == 'org_name'){
	        this.constructWhos(mextracted, i);
		}
		if(mextracted.type == 'name'){
	        this.constructWho(mextracted, i);
		}
		if(mextracted.type == 'address'){
	        this.constructWhere(mextracted, i);
		}
		if(mextracted.type == 'facility'){
	        this.constructWhere(mextracted, i);
		}
		if(mextracted.type == 'datetime'){
	        this.constructWhen(mextracted, i);
		}
    }
}

//private


metal.MextractedTableLayouter.prototype.constructWho =  function(mextracted, index){

    var content = '<span onMouseOver="metal.MextractedTable.selectMe(this)">'
		 + mextracted.content + '<span>';
    var check = this.createCheckBox(index);
    
    this.constructRow(['人名', content, check]);
}

metal.MextractedTableLayouter.prototype.constructWhos =  function(mextracted, index){

    var content = '<span onMouseOver="metal.MextractedTable.selectMe(this)">'
		 + mextracted.content + '<span>';
    var check = this.createCheckBox(index);
    
    this.constructRow(['組織名', content, check]);
}

metal.MextractedTableLayouter.prototype.constructWhen =  function(mextracted, index){
	var startTime = mextracted.startTime;
	var content = '';
	if(startTime != null){
	    var time = startTime.replace(/\-/g, ',');
	    content = '<span onclick="selectWhen(' + time + ')" onMouseOver="metal.MextractedTable.selectMe(this)">'
			 + mextracted.content + '<span>';

	    var check = this.createCheckBox(index);
	    this.constructRow(['日時', content, check]);
	}
	else{
		//TODO:startTimeがなくとも表示できるように今後考える。
		//onMouseOver="metal.MextractedTable.selectMe(this)"
		//content = '<span>' + mextracted.content + '<span>';
	}
}

metal.MextractedTableLayouter.prototype.constructWhere =  function(mextracetd, index){
	var valueString = mextracetd.content;
	var content = '<span onclick="selectWhere(\''+ mextracted.std +'\')" onMouseOver="metal.MextractedTable.selectMe(this)">' + valueString + '</span>';
	this.constructRow(['場所', content, this.createCheckBox(index)]);
}

metal.MextractedTableLayouter.prototype.constructWhat =  function(mextracted, index){
	var content = '<span onMouseOver="metal.MextractedTable.selectMe(this)">'
		 + mextracted.content + '</span>';
	this.constructRow(['出来事', content, this.createCheckBox(index)]);
}



metal.MextractedTableLayouter.prototype.constructRow =  function(row){
    var html = '<tr><td>' + row[0] + '</td><td>' + row[1] + '</td><td>' + row[2] + '</td></tr>';
    $(html).appendTo(this.target);
}

metal.MextractedTableLayouter.prototype.createCheckBox =  function(index){
	return '<input type="checkbox" name="mextracted[' + index + ']">';
}


////////////////////////////
//テーブルの本体
metal.MextractedTable = function(){
 	//properties
	this.target; //作成されるテーブルのID
	
	this.mextractedList; //オブジェクト表現のリスト
	
	//TODO: 作成されるテーブルのレイアウタを設定させるようにすること。
	this.layouter = new metal.MextractedTableLayouter();
}

// for util
metal.MextractedTable.selectMe = function(self){
    var r = document.body.createTextRange();
    r.moveToElementText(self);
    r.select();
}


/**
 * リスト形式のJsonをパースしてテーブルに追加する
 * @param {Object} json
 */
metal.MextractedTable.prototype.parseJson = function(json){
	var mextractedList = eval('(' + json + ')');
	this.addList(mextractedList);
}

/**
 * リストで渡されたオブジェクトをテーブルに追加する
 * @param {Object} mextractedList
 */
metal.MextractedTable.prototype.addList = function(mextractedList){
	
	this.mextractedList = mextractedList;
	this.layouter.layout(mextractedList, this.target);
}


