/**********************************************************************
* /js/component/kawasaki-parallel-text-log.js
* Copyright (C) 2007-2008 Kyoto University
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* 
* This library 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.  See the GNU
* Lesser General Public License for more details.
* 
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-
* 1301  USA
***********************************************************************/
/**
 * require util/language.js
 * require util/utilities.js
 */

var KawasakiParallelTextLog = Class.create();
var ParallelTextLogArea = Class.create();
var ParallelTextSearchArea = Class.create();

//* YUI datatable用 の大域変数
//* 選択されたテーブルの行の情報を取得
var selectedRow = null;

var LANGUAGES = ['ja','ko','zh','es'];
var RESULT_LIMIT_NUMBER = 50;

KawasakiParallelTextLog.prototype = {
	initialize: function(id, eraseButtonId, logAreaId, sourceLanguageMenuId, targetLanguageMenuId, textInputId, searchButtonId, postButtonId, resultAreaId, logMessageArea){
		this.id = id;
		this.element = $(this.id);
		this.eraseButtonElement = $(eraseButtonId);
		this.logArea = new ParallelTextLogArea(logAreaId);
		this.searchArea = new ParallelTextSearchArea(this.logArea,sourceLanguageMenuId, targetLanguageMenuId, textInputId, searchButtonId, postButtonId, resultAreaId, logMessageArea);
		this.setEvent();
	},
	
	eraseLog: function(){
		this.logArea.eraseLog();
	},
	
	getSearchButtonElement: function(){
		return this.getSearchArea().getSearchButtonElement();
	},
	
	getTextInputElement: function(){
		return this.getSearchArea().getTextInputElement();
	},
	
	getSearchArea: function(){
		return this.searchArea;
	},
	
	searchParallelTexts: function(treeChildren, serviceInformation){
		this.searchArea.searchParallelTexts(treeChildren, serviceInformation);
	},
	
	clearResultArea: function(){
		this.searchArea.clearResultArea();
	},
	
	setEvent: function(){
		this.eraseButtonElement.observe('click',this.doEraseLog.bindAsEventListener(0,this));
	},
	
	doEraseLog: function(e){
		$A(arguments)[1].eraseLog();
	}
}

ParallelTextLogArea.prototype = {
	initialize: function(id){
		this.id = id;
		this.postedLog = [];
		this.element = $(this.id);
	},
	
	eraseLog: function(){
		this.showSystemMessage(true);
		var replaceElement = document.createElement('div');
		replaceElement.id = this.getElement().firstDescendant().next(0).id;
		replaceElement.className = 'yui-skin-sam';
		this.getElement().firstDescendant().next(0).replace(replaceElement);
		this.postedLog = [];
	},
	
	showSystemMessage: function(isSet){
		if(isSet) this.getElement().firstDescendant().show();
		else this.getElement().firstDescendant().hide();
	},
	
	addLog: function(){
		if(selectedRow == null) return;
		this.postedLog.unshift(selectedRow);
	},
	
	getElement: function(){
		return this.element;
	},
	
	showLogsAsTable: function(sourceLanguage,targetLanguage){
		if(this.postedLog.size() == 0) return;
		var searchArea = this;
		var searchLogs = this.postedLog;
		this.showSystemMessage(false);
		var dataTableId = this.getElement().firstDescendant().next(0).id;
	    YAHOO.example.RowSelection = new function() {
			var dataContainer = {
				"searchLogs" : searchLogs
			}
			
	        var myColumnDefs = [
	            {key:sourceLanguage,label:Language.getMultilingualLanguageNameByTag(sourceLanguage,'ja'), sortable:true},
	            {key:targetLanguage,label:Language.getMultilingualLanguageNameByTag(targetLanguage,'ja'), sortable:true}
	        ];
	
	        this.myDataSource = new YAHOO.util.DataSource(dataContainer);
	        this.myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
	        this.myDataSource.responseSchema = {
	            resultsList: ["searchLogs"],
	            fields: LANGUAGES
	        };
	
	        this.singleSelectDataTable = new YAHOO.widget.DataTable(dataTableId,
	                myColumnDefs, this.myDataSource, {
	                    selectionMode:"single"
	                });
	
	        //* Subscribe to events for row selection
	        this.singleSelectDataTable.subscribe("rowMouseoverEvent", this.singleSelectDataTable.onEventHighlightRow);
	        this.singleSelectDataTable.subscribe("rowMouseoutEvent", this.singleSelectDataTable.onEventUnhighlightRow);
	        this.singleSelectDataTable.subscribe("rowClickEvent", this.singleSelectDataTable.onEventSelectRow);
	
			//*$(dataTableId).style.display="block";
			selectedRow = null;
	    };
	}
}

ParallelTextSearchArea.prototype = {
	initialize: function(logArea, sourceLanguageMenuId, targetLanguageMenuId, textInputId, searchButtonId, postButtonId, resultAreaId, logMessageArea){
		this.logArea = logArea;
		this.sourceLanguageMenuElement = $(sourceLanguageMenuId);
		this.targetLanguageMenuElement = $(targetLanguageMenuId);
		this.textInputElement = $(textInputId);
		this.isTextInputAlreadyFocused = false;
		this.searchButtonElement = $(searchButtonId);
		this.postButtonElement = $(postButtonId);
		this.resultAreaElement = $(resultAreaId);
		this.logMessageAreaElement = $(logMessageArea);
		this.searchResult = [];
		this.postedLog = [];
		this.setEvent();
	},
	
	getTextInputElement: function(){
		return this.textInputElement;
	},
	
	getTextFromTextInput: function(){
		return this.getTextInputElement().value;
	},
	
	getResultAreaElement: function(){
		return this.resultAreaElement;
	},
	
	getLogAreaElement: function(){
		return this.logMessageAreaElement;
	},
	
	getSourceLanguage: function(){
		return this.sourceLanguageMenuElement.value;
	},
	
	getTargetLanguage: function(){
		return this.targetLanguageMenuElement.value;
	},
	
	getSearchButtonElement: function(){
		return this.searchButtonElement;
	},
	
	isEmptyTextInput: function(){
		return this.textInputElement.value == '';
	},
	
	searchParallelTexts: function(treeChildren, serviceInformation){
			
	    var categories = [];
	    for (var i = 0; i < treeChildren.length; ++i) {
	        categories = categories.concat(treeChildren[i].getPropertyOfChecked('categoryName'));
	    }
		if (categories.length == 0) {
			this.showMessage("<br/>左側の「カテゴリの選択」から、カテゴリを一つ以上選択してください．<br/><br/>");
			return;
		}
		this.showSearching(true);
		
		var callobj = {
			inputtext: "",
			from: this.getSourceLanguage(),
			method: "",
			limitCount: RESULT_LIMIT_NUMBER
		};
		
		if(this.isTextInputAlreadyFocused && !this.isEmptyTextInput()){
			callobj.inputtext = this.getTextFromTextInput();
			callobj.method = "partial";
		} else {
			callobj.inputtext = ".*";
			callobj.method = "regex";
		}
		
		//mod start kawauchi 20090909
//		全ての翻訳先言語から翻訳元言語だけを取り除く
		var toNum = 0;
//		for (var n = 0; n < LANGUAGES.length; n++) {
//			callobj["to"+toNum] = LANGUAGES[n];
//			toNum++;
//		}
		var n=$("source-language").selectedIndex;
		var replaceLanguage = $("source-language").options[n].value;
		for(var i=0;i<LANGUAGES.length;i++){
			if(LANGUAGES[i]!=replaceLanguage){
				callobj["to"+toNum]=LANGUAGES[i];
				toNum++;
			}
		}
		//mod end kawauchi 20090909
		
		callobj["toNum"]= toNum;
		var idNum = 0;
		for (var i = 0; i < treeChildren.length; i++) {
			if (treeChildren[i].getPropertyOfChecked('categoryName').length != 0) {
				callobj["id" + idNum] = treeChildren[i]['dictionaryId'];
				idNum++;
			}
		}
		callobj["idNum"]= idNum;
		//* カテゴリ情報を格納
		var categoriesNum = 0;
		for (var i = 0; i < categories.length; i++) {
			callobj["cat"+categoriesNum] = categories[i];
			categoriesNum++;
		}
		callobj["catNum"]= categoriesNum;
		var hash = $H(callobj);
		var formText = hash.toQueryString();
		var searchArea = this;
		new Ajax.Request('php/ajax/kawasaki-parallel/search.php', {
			method: 'post',
			parameters: formText,
			searchArea: searchArea,
			onSuccess: function(httpObj){
				searchArea.makeResultArea(httpObj.responseJSON);
				//* ライセンス情報 
				serviceInformation.update(httpObj.responseJSON.contents.profile);
				
			},
			onFailure: function(){
				this.showMessage('検索に失敗しました．');
			},
			onComplete: function(){
				this.showSearching(false);
			}
		});
	},
	
	makeResultArea: function(resultObj){
		var checker = new StatusProcessor(resultObj);
		var searchArea = this;
		checker.warning = function(){
			if(this.message.include('Too Many Results')) 
				searchArea.showMessage('検索結果が'+RESULT_LIMIT_NUMBER+'件をこえたので、省略されました．条件をしぼってください．（合計 '+this.contents.resultCount+'件）');
			if (this.isLimitationWarning()) {
				alert(this.message);
				if(this.contents.resultCount < RESULT_LIMIT_NUMBER){
					return this.ok();
				} else {
					searchArea.showMessage('検索結果が'+RESULT_LIMIT_NUMBER+'件をこえたので、省略されました．条件をしぼってください．（合計 '+this.contents.resultCount+'件）');
				}
			}
			return true;
		}
		checker.ok = function(){
			searchArea.showMessage('検索結果:合計'+this.contents.resultCount+'件');
			return true;
		}
		checker.error = function(){
			alert(this.message);
			searchArea.showMessage('検索に失敗しました．');
			return false;
		}
		if(!checker.check()) return;
		this.searchResult = [];
		resultObj = resultObj.contents;
		//*まず、返り値からlangsの言語の対訳テーブルを作成する
		for(var i=0; i < resultObj.result.length; i++){
			var aResult = new Array();
			//* 元言語での用例を格納
			aResult[resultObj.result[i].sourceLanguage]
				= resultObj.result[i].sourceText;
			
			for(var lan=0; lan < resultObj.result[i].targetTexts.length; lan++){	
				aResult[resultObj.result[i].targetTexts[lan].targetLanguage]
					= resultObj.result[i].targetTexts[lan].targetText;
			}
			
			this.searchResult[i] = aResult;
		}
		
		this.showResultArea();
	},
	
	showResultArea: function(){
		if (this.searchResult.size() == 0) {
			var replaceElement = document.createElement('div');
			replaceElement.id = this.getResultAreaElement().firstDescendant().id;
			replaceElement.className = 'yui-skin-sam';
			this.getResultAreaElement().firstDescendant().replace(replaceElement);
			return;
		}
		var searchArea = this;
		var searchResult = this.searchResult;
		var dataTableId = this.getResultAreaElement().firstDescendant().id;
		YAHOO.example.RowSelection = new function() {
			//*var Event = YAHOO.util.Event;
			
			var dataContainer = {
				"searchResult" : searchResult
			}
			
	        var myColumnDefs = [
	            {key:searchArea.getSourceLanguage(),label:Language.getMultilingualLanguageNameByTag(searchArea.getSourceLanguage(),'ja'), sortable:true},
	            {key:searchArea.getTargetLanguage(),label:Language.getMultilingualLanguageNameByTag(searchArea.getTargetLanguage(),'ja'), sortable:true}
	        ];
	
	        this.myDataSource = new YAHOO.util.DataSource(dataContainer);
	        this.myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
	        this.myDataSource.responseSchema = {
	            resultsList: ["searchResult"],
	            fields: LANGUAGES
	        };
	
	        this.singleSelectDataTable = new YAHOO.widget.DataTable(dataTableId,
				myColumnDefs, this.myDataSource, {
					selectionMode:"single"
				});
	
	        //* Subscribe to events for row selection
	        this.singleSelectDataTable.subscribe("rowMouseoverEvent", this.singleSelectDataTable.onEventHighlightRow);
	        this.singleSelectDataTable.subscribe("rowMouseoutEvent", this.singleSelectDataTable.onEventUnhighlightRow);
	        this.singleSelectDataTable.subscribe("rowClickEvent", this.singleSelectDataTable.onEventSelectRow);

			this.singleSelectDataTable.addListener("dblclick",KawasakiParallelTextLog.Event.dblclickResultTableRow);
	    };
	},
	
	postLog: function(){
		this.logArea.addLog();
		this.logArea.showLogsAsTable(this.getSourceLanguage(),this.getTargetLanguage());
	},
	
	showMessage: function(message){
		this.logMessageAreaElement.innerHTML = message;
	},
	
	showSearching: function(isSearching){
		if(isSearching) this.logMessageAreaElement.innerHTML = "<img src='img/extention_fujimiparallel/ajax-loader.gif'/ alt='検索中' align='middle'>用語を検索中です．<br/><br/>";
		else this.logMessageAreaElement.innerHTML = "";
	},
	
	onLoad: function(){
		this.getTextInputElement().value = '何も入力しないと、カテゴリ内の全ての用例を検索します．';
		this.getTextInputElement().setStyle({'color':'#777'});
	},
	
	onFocusTextInput: function(){
		if(this.isTextInputAlreadyFocused) return;
		this.getTextInputElement().value = '';
		this.getTextInputElement().setStyle({'color':'#000'});
		this.isTextInputAlreadyFocused = true;
	},
	
	setEvent: function(){
		
//		add start kawauchi 20090909
//		翻訳元言語を変更した時、翻訳先言語一覧から翻訳元言語の選択肢を消す
		this.sourceLanguageMenuElement.observe('change',this.deleteTheOption.bindAsEventListener(this));
//		add end kawauchi 20090909

		this.sourceLanguageMenuElement.observe('change',this.doShowResultArea.bindAsEventListener(0,this));
		this.sourceLanguageMenuElement.observe('change',this.doPostLog.bindAsEventListener(0,this));
		this.targetLanguageMenuElement.observe('change',this.doShowResultArea.bindAsEventListener(0,this));
		this.targetLanguageMenuElement.observe('change',this.doPostLog.bindAsEventListener(0,this));
		this.postButtonElement.observe('click',this.doPostLog.bindAsEventListener(0,this));
	},
//	add start kawauchi 20090909
//	選択先言語の選択肢を消す関数。ＩＥ対策にselect要素自体を作り変えている
	deleteTheOption: function(evt){
		var langs=new Array("<option value='ja'>日本語</option>",
							"<option value='zh'>中国語</option>",
							"<option value='ko'>韓国語</option>",
							"<option value='es'>スペイン語</option>"
							);
		var index=$("source-language").selectedIndex;
		var tmpTarget="";
		for(var i=0;i<langs.length;i++){
			if(i!=index){
				tmpTarget=tmpTarget+langs[i];
			}
		}
		tmpTarget="<select id='target-language' style='width: 90px;'>"+tmpTarget+"</select>";
		$("target-container").innerHTML=tmpTarget;
		var targetObj=$("target-language");
		
//		一度select要素を消し、もう一度作り直しているので、イベントハンドラを設定し直す
		this.targetLanguageMenuElement=targetObj;
		this.targetLanguageMenuElement.observe('change',this.doShowResultArea.bindAsEventListener(0,this));
		this.targetLanguageMenuElement.observe('change',this.doPostLog.bindAsEventListener(0,this));
		
		//IE対策。検索後にメニューを切り替えても不具合が起きない様、イベントを強制発生させている
		if(window.ActiveXObject){
			targetObj.fireEvent("onchange");
		}
		
	},
//	add end kawauchi 20090909

	doShowResultArea: function(e){
		$A(arguments)[1].showResultArea();
	},
	
	doPostLog: function(e){
		$A(arguments)[1].postLog();
	}
}

KawasakiParallelTextLog.Event = {
	load: function(kawasakiParallelTextLog){
		kawasakiParallelTextLog.getSearchArea().onLoad();
	},
	
	onFocusTextInput: function(event, kawasakiParallelTextLog){
		kawasakiParallelTextLog.getSearchArea().onFocusTextInput();
	},
	
	//* YUIのテーブルのCall Back利用
	//* 大域変数のkawasakiParallelTextLogを用いる
	dblclickResultTableRow: function(event){
		kawasakiParallelTextLog.getSearchArea().postLog();
	}
}

