/**********************************************************************
* /js/component/user-dictionary.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
***********************************************************************/

//* クラスの名前の定義
var UserDictionary = Class.create();

var DataTable = Class.create();
var DataCell = Class.create();
var DataHeadCell = Class.create();
var InputWordField = Class.create();
var TermInfo = Class.create();
var SelectLanguage = Class.create();
var CreateDictionary = Class.create();

var DICTIONARY_EDIT_PATH = './php/ajax/composite-translation-services/dictionary-edit.php';
var DOMAIN_SPECIFIC_TRANSLATE_PATH = './php/ajax/composite-translation-services/domain-specific-translate.php';
var LOAD_SUPPORTED_LANGUAGES_PATH = './php/ajax/composite-translation-services/load-supported-languages.php';

var ID_HEADER_USER_DICTIONARY_HEAD_CELL = 'user-dictionary-head-cell';
var ID_DICTIONARY_SELECTOR = 'user-dictionary-list';
var ID_DICTIONARY_DATA_TABLE = 'user-dictionary-table';
var ID_DICTIONARY_HEAD = 'user-dictionary-head';
var ID_DICTIONARY_BODY = 'user-dictionary-body';
var ID_DICTIONARY_MESSAGE_AREA = 'user-dictionary-message-area';

var isIE = (document.documentElement.getAttribute("style") == document.documentElement.style);
var selectedRowNumber = -1;
var rowSelected = false;
var inputWordField = null;
var selectLanguage = null;
var createDictionary = null;

//*ユーザ辞書の大枠のクラス
Object.extend( UserDictionary, {
	startLoading : function( msg ) {
		var area = $(ID_DICTIONARY_MESSAGE_AREA);
		while ( area.firstChild ) area.removeChild( area.firstChild );
		if ( msg ) {
			area.innerHTML = msg;
		}
		var img = new Image();
		img.src = 'img/anime/ajax-loader3.gif';
		area.appendChild( img );
	},

	finishLoading : function( msg ) {
		var area = $(ID_DICTIONARY_MESSAGE_AREA);
		while ( area.firstChild ) area.removeChild( area.firstChild );
		if ( msg ) {
			area.innerHTML = msg;
		}
	}
} );
UserDictionary.prototype = {
	
	//*初期化する際に、辞書のリストと対応言語を取得
	initialize: function(){

		//* 各ボタンのクラスを生成する
		//*inputWordField = new InputWordField(dataTable);
		//*dataTable.setWordField(inputWordField);
		
		
		this.dataTable = new DataTable(new Array(), new Array(), "");
		this.displayedDictionaryName = "";
		
		this.rowSelected = false;
		
		//*ユーザ辞書リストを取得する
		this.dictionaryList = new Array();
		this.loadUserDictionaryList();
		
		//*言語リストを取得する
		this.languageList = new Array();
		this.loadLanguageList();
		
		inputWordField = new InputWordField(this.dataTable);
		this.dataTable.setWordField(inputWordField);
		
		selectLanguage = new SelectLanguage(this.dataTable);
		
		createDictionary = new CreateDictionary(this.dataTable);
		
		//* 辞書をロード・作成・削除
		Event.observe('load-user-dictionary', 'click', this.loadUserDictionary.bind(this));
		Event.observe('create-user-dictionary', 'click', this.openCreateDictionaryPane.bind(this));
		Event.observe('remove-user-dictionary', 'click', this.removeUserDictionary.bind(this));
		
		//* 辞書データの編集
		Event.observe('add-record', 'click', this.addRecord.bind(this));
		Event.observe('up-record', 'click', this.upRecord.bind(this));
		Event.observe('down-record', 'click', this.downRecord.bind(this));
		Event.observe('delete-record', 'click', this.deleteRecord.bind(this));
		Event.observe('add-language', 'click', this.openLanguagePanel.bind(this));
		
			//*クリックしたときは、行選択
		Event.observe($(ID_DICTIONARY_DATA_TABLE).down('tbody'), 'click', function(event) {
			var cells;
			if ( selectedRowNumber >= 0 ) {
				cells = $(ID_DICTIONARY_DATA_TABLE).down('tbody')
				.getElementsByTagName( 'tr' )[selectedRowNumber]
				.getElementsByTagName( 'td' );
				for ( var i = cells.length - 1; i >= 0; i-- ) {
					Element.removeClassName( cells[i], 'selectedRow' );
				}
			}
			cells = Event.element( event ).up( 'tr ' ).getElementsByTagName( 'td' );
			for ( var i = cells.length - 1; i >= 0; i-- ) {
				Element.addClassName( cells[i], 'selectedRow' );
			}
			selectedRowNumber = parseInt( cells[0].id.split( '_' )[0] );

//*			var tableTds = $$('#' + ID_DICTIONARY_DATA_TABLE + ' tbody td');
//*			tableTds.each(function(e){e.removeClassName('selectedRow');});
//*			var elementArray = $(Event.element(event)).up('tr').childElements();
//*			elementArray.each(function(e){e.addClassName('selectedRow');
//*										  selectedRowNumber = e.id.split('_')[0];
//*										 });
			
			rowSelected = true;
			
		});
		
		//* ダブルクリックしたときは単語編集
		Event.observe($(ID_DICTIONARY_DATA_TABLE).down('tbody'), 'dblclick', function(event) {
			var element = $(Event.element(event));
			if ( element.tagName.toUpperCase() != 'TD' ) return;
			var tablePosition = element.id.split('_');
			inputWordField.show( element, parseInt( tablePosition[0] ), parseInt( tablePosition[1] ) );
		});

	},
	
	//*以下PHPとのやり取り（まとめてひとつのメソッドにするとわかりやすいかも）
	//*すべて非同期にする必要がある
	loadUserDictionaryList: function(){
		
		selectedRowNumber = -1;
		rowSelected = false;
		
		var userDictionary = this;
		UserDictionary.startLoading( 'Loading Dictionary List...' );
		new Ajax.Request(
			DICTIONARY_EDIT_PATH,
			{
				method		:'post',
				parameters	:'method=getDictionaryList',
				userDictionary: userDictionary,
				onSuccess	:function(httpObj){
					UserDictionary.finishLoading();
					var dictArray = eval("("+httpObj.responseText+")");
								
					var checker = new StatusProcessor(dictArray);
					checker.error = function(){
						if(this.response.contents == "Temporary User cannot use User Dictionary"){
							return false;
						} else {
							alert(this.response.message + ' : ' + this.response.contents);
							return false;
						}
					}
					if(!checker.check()) return;
					UserDictionary.finishLoading( 'Dictionary list was loaded. Please <span style="color:red">select</span> your dictionary and \'<span style="color:red">Load Dictionary</span>\'.' );
					userDictionary.setDictionaryList(dictArray.contents);
				},
				onFailure	:function(){
					UserDictionary.finishLoading();
					alert('Server Error.');
				},
				onComplete :function(){
				}
			}
		);
	},
	
	loadLanguageList: function(){
		
		var userDictionary = this;
		new Ajax.Request(
			'./php/ajax/composite-translation-services/load-supported-languages.php',
			{
				method		:'post',
				parameters	:'serviceCategory=composite-translation',
				userDictionary: userDictionary,
				onSuccess	:function(httpObj){
					var langArray = eval("("+httpObj.responseText+")");
					userDictionary.setLanguageList(langArray.contents);
				},
				onFailure	:function(){
					alert('Server Error.');
				},
				onComplete :function(){
				}
			}
		);
	},
	
	loadUserDictionary: function(){
		
		var selectedDict = $(ID_DICTIONARY_SELECTOR)[$(ID_DICTIONARY_SELECTOR).selectedIndex].value;
		
		if(selectedDict == 'default'){
			alert('Select a dictionary or create a new dictionary.');
			return;
		}
		this.displayedDictionaryName = selectedDict;
		
		var userDictionary = this;
		UserDictionary.startLoading( 'Loading dictionary...' );
		new Ajax.Request(
			DICTIONARY_EDIT_PATH,
			{
				method		:'post',
				parameters	:'method=getDictionaryData&dictionary=' 
								+ selectedDict,
				userDictionary: userDictionary,
				onSuccess	:function(httpObj){
					var dictData = eval("("+httpObj.responseText+")");
					var dictLangs = dictData.contents.languages;
					var dictData = dictData.contents.data;
					userDictionary.setNewDictionaryData(dictLangs, dictData, selectedDict);
					UserDictionary.finishLoading( 'Dictionary \'<span style="color:red;">' + selectedDict + '</span>\' was loaded.' );
				},
				onFailure	:function(){
					UserDictionary.finishLoading();
					alert('Server Error.');
				},
				onComplete :function(){
				}
			}
		);
	},
	
	addRecord: function(){
		if(this.displayedDictionaryName == '')return;
		var selectedDict = this.displayedDictionaryName;
		var userDictionary = this;
		UserDictionary.startLoading( 'Adding record...' );
		new Ajax.Request(
			DICTIONARY_EDIT_PATH,
			{
				method		:'post',
				parameters	:'method=addRecord&dictionary='
								+ selectedDict
								+ '&number=1',
				userDictionary: userDictionary,
				onSuccess	:function(httpObj){
					var response = eval("("+httpObj.responseText+")");
					//*ここで何らかの処理が必要そう
					var recordID = response.contents.termIds;
					var priority = response.contents.priorities;
					userDictionary.dataTable.addRecord(recordID, priority);
				},
				onFailure	:function(){
					alert('Server Error.');
				},
				onComplete :function(){
					UserDictionary.finishLoading();
				}
			}
		);
	},
	
	upRecord: function(){
		//*行が選択されていない場合、行が0の場合は何も起きない
		if(rowSelected === false || selectedRowNumber == 0) return;
		var selectedDict = this.displayedDictionaryName;
		var pForm = this.dataTable.makeSetPriorityForm('up');
		var userDictionary = this;
		UserDictionary.startLoading( 'Changing Record Order...' );
		new Ajax.Request(
			DICTIONARY_EDIT_PATH,
			{
				method		:'post',
				parameters	:'method=setPriority&dictionary='
								+ selectedDict
								+ '&' + pForm
								+ '&time=22222222',
				userDictionary: userDictionary,
				onSuccess	:function(httpObj){
					var response = eval("("+httpObj.responseText+")");
					//*ここで何らかの処理が必要そう
					var recordID = response.contents.termIds;
					var priority = response.contents.priorities;
					userDictionary.dataTable.setNewPriority('up', recordID, priority);
					UserDictionary.finishLoading( "Records in the dictionary are rearranged." );
				},
				onFailure	:function(){
					UserDictionary.finishLoading();
					alert('Server Error.');
				},
				onComplete :function(){
				}
			}
		);
		
		
	},
	
	downRecord: function(){
		
		
		//*行が選択されていない場合、行が0の場合は何も起きない
		if(rowSelected === false || selectedRowNumber == this.dataTable.cellsArray.length-1) return;
		var selectedDict = this.displayedDictionaryName;
		var pForm = this.dataTable.makeSetPriorityForm('down');
		
		var userDictionary = this;
		UserDictionary.startLoading( 'Moving Record Order...' );
		new Ajax.Request(
			DICTIONARY_EDIT_PATH,
			{
				method		:'post',
				parameters	:'method=setPriority&dictionary='
								+ selectedDict
								+ '&' + pForm
								+ '&time=22222222',
				userDictionary: userDictionary,
				onSuccess	:function(httpObj){
					var response = eval("("+httpObj.responseText+")");
					//*ここで何らかの処理が必要そう
					var recordID = response.contents.termIds;
					var priority = response.contents.priorities;
					userDictionary.dataTable.setNewPriority('down', recordID, priority);
					UserDictionary.finishLoading( "Records in the dictionary are rearranged." );
				},
				onFailure	:function(){
					UserDictionary.finishLoading();
					alert('Server Error.');
				},
				onComplete :function(){
				}
			}
		);
	},
	
	deleteRecord: function(){
		
		//*行が選択されていない場合、行が0の場合は何も起きない
		if(rowSelected === false) return;
		var selectedDict = this.displayedDictionaryName;
		var rForm = this.dataTable.makeRemoveTermsForm();
		var userDictionary = this;
		UserDictionary.startLoading( 'Deleting record...' );
		new Ajax.Request(
			DICTIONARY_EDIT_PATH,
			{
				method		:'post',
				parameters	:'method=removeRecord&dictionary='
								+ selectedDict
								+ '&' + rForm
								+ '&time=22222222',
				userDictionary: userDictionary,
				onSuccess	:function(httpObj){
					var response = eval("("+httpObj.responseText+")");
					//*ここで何らかの処理が必要そう
					var recordID = userDictionary.dataTable.cellsArray[selectedRowNumber][0].getTermId();
					
					userDictionary.dataTable.deleteRecord(recordID);
				},
				onFailure	:function(){
					alert('Server Error.');
				},
				onComplete :function(){
					UserDictionary.finishLoading();
				}
			}
		);
		
	},
	
	removeUserDictionary: function(){
		
		if(this.displayedDictionaryName == '')return;
		//*　本当に削除するかの念押しが必要
		if(!window.confirm("Are you sure you want to delete this dictionary (" + this.displayedDictionaryName + ") ?"))return;
		
		var userDictionary = this;
		UserDictionary.startLoading( 'Deleting dictionary \'' + this.displayedDictionaryName.escapeHTML() + '\'...' );
		new Ajax.Request(
			DICTIONARY_EDIT_PATH,
			{
				method		:'post',
				parameters	:'method=removeDictionary&dictionary='
								+ this.displayedDictionaryName
								+ '&time=2222222222',
				userDictionary: userDictionary,
				onSuccess	:function(httpObj){
					var response = eval("("+httpObj.responseText+")");
					//*エラー処理が必要
					//alert(response.contents);
					var list = userDictionary.displayedDictionaryName;
					//*alert(list);
					for(var i=0; i< userDictionary.dictionaryList.length; i++){
						if(userDictionary.dictionaryList[i] == list){
							userDictionary.dictionaryList.splice(i,1);
						}
						
					}
					userDictionary.displayedDictionaryName = "";
					userDictionary.displayDictionaryList();
					userDictionary.dataTable.destroy();
					UserDictionary.finishLoading( 'Dictionary \'<span style="color:red;">' + list + '</span>\' was deleted.' );
				},
				onFailure	:function(){
					alert('Server Error.');
				},
				onComplete :function(){
					UserDictionary.finishLoading();
				}
			}
		);
		
	},
	
	setPriority: function(id,priority){
		
		//* idとpriorityは配列　例：id[]=XX&id[]=YY
		var selectedDict = this.displayedDictionaryName;
		var userDictionary = this;
		UserDictionary.startLoading( 'Setting Priority...' );
		new Ajax.Request(
			DICTIONARY_EDIT_PATH,
			{
				method		:'post',
				parameters	:'method=addLanguage&dictionary='
								+ selectedDict
								+ '&' + id + '&' + priority,
				userDictionary: userDictionary,
				onSuccess	:function(httpObj){
					
				},
				onFailure	:function(){
					alert('Server Error.');
				},
				onComplete :function(){
					UserDictionary.finishLoading();
				}
			}
		);
		
	},
	
	setLanguageList: function(languageArray){
		
		//*var responseHash = eval("("+response+")");
		this.languageList = languageArray;
		
	},
	
	setDictionaryList: function(dictionaryArray){
		this.dictionaryList = dictionaryArray;
		this.displayDictionaryList("user-dictionary-list");
	},
	
	displayDictionaryList: function(){
		
		$(ID_DICTIONARY_SELECTOR).innerHTML = '';
		
		var dictDefault = document.createElement("option");
		dictDefault.value = "default";
		dictDefault.innerHTML = "Select Dictionary";
		$(ID_DICTIONARY_SELECTOR).appendChild(dictDefault);
		
		for(var i=0; i<this.dictionaryList.length; i++){
			var dict = document.createElement("option");
			dict.value = this.dictionaryList[i];
			dict.innerHTML = this.dictionaryList[i];
			$(ID_DICTIONARY_SELECTOR).appendChild(dict);
		}
		
	},
	
	setNewDictionaryData: function(newLangs, newData, dictName){
		
		//*以前のデータを消してから←どうやってfreeするのかわからない
		this.dataTable = new DataTable(newLangs, newData, dictName);
		
		//* inputWordFieldを追加
		inputWordField = new InputWordField(this.dataTable);
		this.dataTable.setWordField(inputWordField);
		
		selectLanguage = new SelectLanguage(this.dataTable);
	},
	
	openLanguagePanel: function(){
		
		if(this.displayedDictionaryName == '')return;
		
		//* かなり無理やり
		var langList = new Array();
		for(var i=0; i<this.languageList.length; i++){
			
			for(var s=0; s<this.dataTable.tableHeadArray.length; s++){
				
				if(this.languageList[i] == this.dataTable.tableHeadArray[s].getCode()){
					break;
				}else if(s == this.dataTable.tableHeadArray.length-1){
					langList.push(this.languageList[i]);
				}
				
			}
			
		}
		
		var element = $('add-language');
		var cellPosition = element.cumulativeOffset();
		var bodyPosition = $$('body')[0].cumulativeOffset();
		selectLanguage.showPane(langList,cellPosition[0]-bodyPosition[0]-30,cellPosition[1]-bodyPosition[1]-0+20);
		
	},
	
	openCreateDictionaryPane: function(){
		
		var element = $('create-user-dictionary');
		var cellPosition = element.cumulativeOffset();
		var bodyPosition = $$('body')[0].cumulativeOffset();
		
		createDictionary.showPane(this.languageList,cellPosition[0]-bodyPosition[0]-30,cellPosition[1]-bodyPosition[1]-0+20);
		
	}
};

//* @classDescription	ユーザ辞書のVisibleなテーブル

//* idが扱えるように変更しなければならない（優先度も）
DataTable.prototype = {
	//* コンストラクタ
	initialize: function(languages,data, name){
		
		this.dictName = name;
		this.tableHeadArray = new Array();		
		this.cellsArray = new Array();
		
		//*new Insertion.Bottom($(ID_DICTIONARY_DATA_TABLE).childElements()[0], '<tr><th id="userDictHeadCell_0" onselectstart="return false"><span class="resizeHandleWrapper"><span class="resizeHandle"></span></span></th></tr>');
		
		//*if(languages.length == 0)return;
		
		//* 言語部分の処理
		for(var i=0; i<languages.length; i++){
			
			this.tableHeadArray.push(new DataHeadCell(languages[i]));
		}
		this.displayDataTableHead();
		
		//* データ部分の処理
		for(var i=0; i<data.length; i++){
			var cells = new Array();
			cells.push(new TermInfo(data[i][1],data[i][0],false));
			for(var s=2; s<data[i].length; s++){
				cells.push(new DataCell(data[i][s]));
			}
			this.cellsArray.push(cells);
		}
		
		this.displayDataTableBody();


	},
	
	//* テーブルヘッダを表示
	displayDataTableHead: function(){
		
		var headTR = document.createElement('tr');
		
		for(var i=0; i<this.tableHeadArray.length; i++){
			var headTH = document.createElement('th');
			headTH.id = 'userDictHeadCell_' + i;
			headTH.innerHTML = this.tableHeadArray[i].getLanguage();
			headTR.appendChild(headTH);
		}
		var oldHeadTR = $(ID_DICTIONARY_HEAD).childNodes;
		if(oldHeadTR.length != 0)$(ID_DICTIONARY_HEAD).removeChild(oldHeadTR[0]);
		$(ID_DICTIONARY_HEAD).appendChild(headTR);
		
	},
	
	displayDataTableBody: function(){
		
		var oldBodyTR = $(ID_DICTIONARY_BODY).childNodes;
		var deleteRowNumber = oldBodyTR.length;
		for(var i=0; i<deleteRowNumber; i++){
			$(ID_DICTIONARY_BODY).removeChild(oldBodyTR[0]);
		}
		for(var i=0; i<this.cellsArray.length; i++){
			var bodyTR = document.createElement('tr');
			bodyTR.id = 'rowNumber_' + i;
			
			for(var s=1; s<this.cellsArray[i].length; s++){
				var bodyTD = document.createElement('td');
				bodyTD.id = i + "_" + s;
				if(i % 2 == 0){ //* 奇数列
					bodyTD.className = "color1";
				} else {
					bodyTD.className = "color2";
				}
				bodyTD.appendChild( document.createTextNode( this.cellsArray[i][s].getValue() ) );
				bodyTR.appendChild(bodyTD);
			}
			
			$(ID_DICTIONARY_BODY).appendChild(bodyTR);
		}
	},
	
	
	//* テーブルの先頭に行を追加
	addRecord: function(recordID, priority){
		var newRecord = new Array();
		newRecord[0] = new TermInfo(recordID[0], priority[0], false);
		
		for(var i=1; i<this.tableHeadArray.length+1;i++){
			newRecord[i] = new DataCell("");
		}
		
		for(var i=0; i<this.cellsArray.length; i++){
			this.cellsArray[i][0].setPriority(priority[i+1]);
		}
		
		this.cellsArray.unshift(newRecord);
		
		//* 無理やり表示
		this.displayDataTableBody();
		if(rowSelected != false){
			selectedRowNumber++;
			var elementArray = $('rowNumber_' + selectedRowNumber).childElements();
			elementArray.each(function(e){e.addClassName('selectedRow');});
		}

		UserDictionary.finishLoading( "Record is added to the dictionary." );
		
	},
	
	//* 言語を追加
	addLanguage: function(languages){
		for(var i=0; i<languages.length; i++){
			this.tableHeadArray.push(new DataHeadCell(languages[i]));
		}
		
		for(var i=0; i<this.cellsArray.length; i++){
			for(var s=0; s<languages.length; s++){
				this.cellsArray[i].push(new DataCell(""));
			}
		}
		
		//* 無理やり表示
		this.displayDataTableHead();
		this.displayDataTableBody();
		if(rowSelected != false){
			var elementArray = $('rowNumber_' + selectedRowNumber).childElements();
			elementArray.each(function(e){e.addClassName('selectedRow');});
		}
		
		if(languages.length == 1){
			UserDictionary.finishLoading( '\'<span style="color:red;">' + Language.getNameByTag(languages[0]) + '</span>\' was added to the dictionary.' );
		}else if(languages.length > 1){
			var langMessage = "";
			for(var i=0; i<languages.length; i++){
				langMessage += '\'<span style="color:red;">' + Language.getNameByTag(languages[i]) + '</span>\'';
				if(i < languages.length-2){
					langMessage += "&nbsp;,&nbsp;";
				}else if(i == languages.length-2){
					langMessage += "&nbsp;and&nbsp;";
				}
			}
			UserDictionary.finishLoading( langMessage + " were added to the dictionary." );
		}
		
	},
	
	makeSetPriorityForm: function(upOrDown){
		
		var termIDs = new Array();
		var priorities = new Array();
		
		termIDs.push(this.cellsArray[selectedRowNumber][0].getTermId());
		priorities.push(this.cellsArray[selectedRowNumber][0].getPriority());
		
		if(upOrDown == 'up'){
			termIDs.push(this.cellsArray[selectedRowNumber-1][0].getTermId());
			priorities.push(this.cellsArray[selectedRowNumber-1][0].getPriority());
		}else if(upOrDown == 'down'){
			termIDs.push(this.cellsArray[selectedRowNumber-0+1][0].getTermId());
			priorities.push(this.cellsArray[selectedRowNumber-0+1][0].getPriority());
		}
		
		var term = 'termIds[]=' + termIDs[0] + '&termIds[]=' + termIDs[1];
		var priority = 'priorities[]=' + priorities[1] + '&priorities[]=' + priorities[0];
		
		return term + '&' + priority;
		
		
	},
	
	setNewPriority: function(upOrDown, recordID, priority){
		
		if(upOrDown == 'up'){
			var temp = this.cellsArray[selectedRowNumber];
			var next = selectedRowNumber-1;
			this.cellsArray[selectedRowNumber] = this.cellsArray[next];
			this.cellsArray[next] = temp;
			
			//* ここで、新しいpriorityを代入する処理が必要
			
			for(var i=0; i<recordID.length; i++){
				
				for(var s=0; s<this.cellsArray.length; s++){
					
					if(recordID[i] == this.cellsArray[s][0].getTermId()){
						this.cellsArray[s][0].setPriority(priority[i]);
						break;
					}
					
				}
				
			}
			
			this.displayDataTableBody();
			selectedRowNumber--;
			var elementArray = $('rowNumber_' + selectedRowNumber).childElements();
			elementArray.each(function(e){e.addClassName('selectedRow');});
			
		}else if(upOrDown == 'down'){
			var temp = this.cellsArray[selectedRowNumber];
			var next = selectedRowNumber-0+1;
			this.cellsArray[selectedRowNumber] = this.cellsArray[next];
			this.cellsArray[next] = temp;
			
			//* ここで、新しいpriorityを代入する処理が必要
			
			for(var i=0; i<recordID.length; i++){
				
				for(var s=0; s<this.cellsArray.length; s++){
					
					if(recordID[i] == this.cellsArray[s][0].getTermId()){
						this.cellsArray[s][0].setPriority(priority[i]);
						break;
					}
					
				}
				
			}
			
			this.displayDataTableBody();
			selectedRowNumber++;
			var elementArray = $('rowNumber_' + selectedRowNumber).childElements();
			elementArray.each(function(e){e.addClassName('selectedRow');});
		}
		
	},
	
	makeRemoveTermsForm: function(){
		
		//* 後々に複数選択できるようにした場合のために配列にしている
		return 'termIds[]=' + this.cellsArray[selectedRowNumber][0].getTermId();
		
	},
	
	deleteRecord: function(recordID){
		
		if(this.cellsArray[selectedRowNumber][0].getTermId() != recordID)return;
		
		//*var tmpArrayFront = this.cellsArray.slice(0,selectedRowNumber);
		//*var tmpArrayRear = this.cellsArray.slice(selectedRowNumber-0+1);
		//*this.cellTableArray= tmpArrayFront.concat(tmpArrayRear);
		this.cellsArray.splice(selectedRowNumber,1);		
		this.displayDataTableBody();
		UserDictionary.finishLoading( "Record has been deleted." );
		
		selectedRowNumber = -1;
		rowSelected = false;
		
	},
	
	//* メッセージから対応言語の配列を取得する
	//* @param {Object} message
	getLanguageArrayFromMessage: function(hash){
		return hash.contents;
	},
	
	editTerm: function(row,col,value){
		
		//*alert(value+"    "+)
		
		if(value == this.cellsArray[row][col].getValue())return;
		
		var dictionary = this.dictName;
		var termID = this.cellsArray[row][0].getTermId();
		var language = this.tableHeadArray[col-1].getCode();
		var dT = this;
		UserDictionary.startLoading( 'Editting term...' );
		new Ajax.Request(
			DICTIONARY_EDIT_PATH,
			{
				method		:'post',
				parameters	:'method=editTerm&dictionary=' 
								+ dictionary
								+ '&termId=' + termID
								+ '&languages[]=' + language
								+ '&terms[]=' + value, 
				dT: dT,
				onSuccess	:function(httpObj){
					var dictData = eval("("+httpObj.responseText+")");
					dT.updateCell(row, col, value);
					UserDictionary.finishLoading( "The word list has been updated." );
					
					
				},
				onFailure	:function(){
					UserDictionary.finishLoading();
					alert('Server Error.');
				},
				onComplete :function(){
				}
			}
		);
		
	},
	
	destroy: function(){

		this.tableHeadArray = new Array();		
		this.cellsArray = new Array();
		
		var oldHeadTR = $(ID_DICTIONARY_HEAD).childNodes;
		if(oldHeadTR.length != 0)$(ID_DICTIONARY_HEAD).removeChild(oldHeadTR[0]);
		
		var oldBodyTR = $(ID_DICTIONARY_BODY).childNodes;
		var deleteRowNumber = oldBodyTR.length;
		for(var i=0; i<deleteRowNumber; i++){
			$(ID_DICTIONARY_BODY).removeChild(oldBodyTR[0]);
		}
	},
	
	//* IDを返す
	getId: function(){
		return this.id;
	},
	
	//* 操作する単語入力フィールドの指定
	//* @param {InputWordField} wordField
	setWordField: function(wordField){
		this.wordField = wordField;
	},
	
	//* 行の数を返す
	getNumberOfRow: function(){
		return this.numRow;
	},
	
	//* 列の数を返す
	getNumberOfCol: function(){
		return this.numCol;
	},
	
	//* 対応言語の配列を返す
	getSupportedLanguageArray: function(){
		//*var arr = new Array('en','ja','ko','zh','it','fr','de','es','pt');
		return this.supportedLanguageArray;
	},
	
	//* cellDataTableからrow行col列のセルを得る
	//* @param {Number} row
	//* @param {Number} col
	getCell: function(row,col){
		return this.cellsArray[row][col];
	},
	
	//* row行col列のセル値をvalueに更新
	//* @param {Number} row
	//* @param {Number} col
	//* @param {String} value
	updateCell: function(row,col,value){
		var cell = this.getCell(row,col);
		cell.setValue(value);
		$(row+'_'+col).innerHTML = cell.getValue();
	},
	
	//* テーブルの中身を返す
	getTableData: function(){
		
	},
	
	//* テーブルの高さを返す
	getHeight: function(){
		return $(this.id).down('tbody').getHeight();
	},
	
	//* テーブルの幅を返す
	getWidth: function(){
		return $(this.id).getWidth();
	}
	
};


//* @classDescription	ユーザ辞書のTermに関する情報を保持
//* 一行に対してひとつのTermInfoを割り当て、
//* 更新する際に参考にする。
//* 今回はchangeは必要ない
TermInfo.prototype = {
	//* コンストラクタ
	//* 新しい行が生成された際はIdはまず-1を代入
	initialize: function(Id, priority,change){
		this.termId = Id;
		this.termPriority = priority;
		this.changed = change;
	},
	
	//* termIdを得る
	getTermId: function(){
		return this.termId;
	},
	
	//* termIdを設定する
	setTermId: function(Id){
		this.termId = Id;
	},
	
	//* termPriorityを設定する
	getPriority: function(priority){
		return this.termPriority;
	},
	
	//* termPriorityを設定する
	setPriority: function(priority){
		this.termPriority = priority;
	},
	
	//* changedを得る
	getChanged: function(){
		return this.changed;
	},
	//* changedをtrueにする
	setChangedTrue: function(){
		this.changed = true;
	},
	
	//* changedをfalseにする
	setChangedFalse: function(){
		this.changed = false;
	}

};

//* @classDescription	テーブルの中の各セル
DataCell.prototype = {
	//* コンストラクタ
	initialize: function(value){
		if(value == null || value == 'undefined'){
			this.value = '';
		} else {
			this.value = value;
		}
	},
	
	//* メソッド
	//* セルの値を設定
	//* @param {String} value
	setValue: function(value){
		this.value = value;
	},
	
	//* セルの値を返す
	getValue: function(){
		return this.value;
	},
	
	//* セルの値をnum文字に省略して返す
	//* @param {Number} num
	getLabel: function(num){
		
	}
};

//* @classDescription	テーブルの中の各セル
DataHeadCell.prototype = {
	//* コンストラクタ
	initialize: function(langCode){
		this.code = langCode;
		this.language = Language.getNameByTag(this.code);
	},
	
	getCode: function(){
		return this.code;
	},
	
	setCode: function(langCode){
		this.code = langCode;
		this.language = Language.getNameByTag(this.code);
	},
	
	getLanguage: function(){
		return this.language;
	},
	
	setLanguage: function(langName){
		this.language = langName;
	}

};

//* @classDescription	セルをクリックしたときに現れるダイアログ
InputWordField.prototype = {
	//* コンストラクタ
	initialize: function(table){
		this.table = table;
		this.row = null;
		this.col = null;
		this.oldValue = '';

		var input = document.createElement( 'input' );
		input.type = 'text';
		Event.observe( input, 'blur', this.cancel.bind( this ) );
		Event.observe( input, 'keypress', this.onkeypress.bindAsEventListener( this ) );
		this.input = input;
	},
	
	//* メソッド
	//* ダイアログの表示
	//* @param {Number} width
	//* @param {Number} height
	//* @param {Number} row
	//* @param {Number} col
	show : function( element, row, col ) {
		var value = this.table.getCell( row, col ).getValue();
		this.oldValue = value
		this.row = row;
		this.col = col;
		this.input.value = value;
		while ( element.firstChild ) element.removeChild( element.firstChild );
		element.appendChild( this.input );
		Field.activate(this.input);
	},
	
	//* ダイアログの非表示
	hide: function(){
		var td = this.input.parentNode;
		this.input.parentNode.removeChild( this.input );
		td.appendChild( document.createTextNode( this.input.value ) );
	},

	cancel: function() {
		this.input.value = this.oldValue;
		this.hide();
	},
	
	//* データを送信
	submit: function(){
		this.hide();
		if ( this.input.value != this.oldValue ) {
			var value = this.input.value;
			this.table.editTerm(this.row,this.col,value);
		}
	},

	onkeypress : function(event) {
		switch ( event.keyCode ) {
		case Event.KEY_RETURN:
			this.submit();
			break;
		case Event.KEY_ESC:
			this.cancel();
			break;
		}
	}
};

//* @classDescription	ローカルファイルからデータを読み込むボタン
SelectLanguage.prototype = {
	//* コンストラクタ
	initialize: function(tbl){
		
		if($('add-language-selector-pane'))$('add-language-selector-pane').remove();
		var ss = document.createElement("div");
		ss.id = 'add-language-selector-pane';
		ss.className = 'input-box';
		this.paneID = 'add-language-selector-pane';
		new Insertion.Bottom($$('body')[0],ss);
		this.table = tbl;
		this.selectedLangs = new Array();
		this.hidePane();
	},
	
	//* データの読み込み
	showPane: function(languages, x,y){
		$(this.paneID).setStyle({
			position : 'absolute' ,
			left : x+'px' ,
			top : y+'px' 
		});
		$(this.paneID).innerHTML = '';
		var title = '<div class="title">Add Language</div>';
		var chk = 'Select languages<br />';
		for(var i=0; i<languages.length; i++){
			chk = chk + '<input type="checkbox" value="'+ languages[i] +'" />' + Language.getNameByTag(languages[i]) +'<br />'
		}
		var alert = '<div id="add-language-selector-pane-alert" class="alert"></div>';
		var ok = '<br /><input id="add-language-selector-ok-button" name="ok" type="button" onclick="selectLanguage.submit();" class="button-blue" value="OK" />';
		var cancel = '<input id="add-language-selector-cancel-button" type="button" onclick="selectLanguage.hidePane();" name="Cancel" value="Cancel" class="button-gray" />';
		
		$(this.paneID).innerHTML = title +  chk + alert + ok + cancel;
		$(this.paneID).show();
	},
	
	submit: function(){
		
		this.selectedLangs = new Array();
		var chks = $$('#add-language-selector-pane input');
		chks.each((function(e){
			if(e.checked == true)this.selectedLangs.push(e.value);
			
		}).bind(this));
		var lform = '';
		var number = 0;
		for(var i=0; i<this.selectedLangs.length; i++){
			lform = lform + '&languages[]=' + this.selectedLangs[i];
			number++;
		}
		
		if(number == 0){
			$('add-language-selector-pane-alert').innerHTML = 'Languages need to be selected.';
			return;
		}
		var selectedDict = userDictionary.displayedDictionaryName;
		
		$(this.paneID).hide();
		UserDictionary.startLoading( 'Adding language...' );
		new Ajax.Request(
			DICTIONARY_EDIT_PATH,
			{
				userDictionary: userDictionary,
				method		:'post',
				parameters	:'method=addLanguage&dictionary='
								+ selectedDict
								+lform,  
				
				onSuccess	:function(httpObj){
					var response = eval("("+httpObj.responseText+")");
					if(response.status == "ERROR"){
						alert(response.message + ' : ' + response.contents);
						return;
					}
					var addLangNames = response.contents;
					userDictionary.dataTable.addLanguage(addLangNames);
				},
				onFailure	:function(){
					alert('Server Error.');
				},
				onComplete :function(){
				}
			}
		);
		
	},
	
	hidePane: function(){
		$(this.paneID).hide();
	}
};

//* @classDescription	ローカルファイルからデータを読み込むボタン
CreateDictionary.prototype = {
	//* コンストラクタ
	initialize: function(tbl){
		if($('create-dictionary-pane'))$('create-dictionary-pane').remove();
		var cd = document.createElement("div");
		cd.id = 'create-dictionary-pane';
		cd.className = 'input-box';
		this.paneID = 'create-dictionary-pane';
		new Insertion.Bottom($$('body')[0],cd);
		this.table = tbl;
		this.selectedLangs = new Array();
		this.hidePane();
	},
	
	//* データの読み込み
	showPane: function(languages, x,y){
		$(this.paneID).setStyle({
			position : 'absolute' ,
			left : x+'px' ,
			top : y+'px' 
		});
		$(this.paneID).innerHTML = '';
		var title ='<div class="title">Create Dictionary</div>';
		var ipt = 'Input dictionary name<br /><input type="textbox" id="create-dictionary-dictionary-name" /><br /><div id="create-dictionary-pane-alert1" class="alert"></div>';
		var chk = 'Select languages<br /><center><table width="150px"><thead></thead><tbody>';
		for(var i=0; i<languages.length; i++){
			if(i%2 == 0)chk = chk + '<tr>';
			chk = chk + '<td width="75px"><input type="checkbox" value="'+ languages[i] +'" />' + Language.getNameByTag(languages[i]) +'</td>';
			if(i%2 == 1)chk = chk + '</tr>';
		}
		if(languages.length %2 == 1)chk = chk + '<td></td></tr>';
		chk = chk + '</tbody></table></center><div id="create-dictionary-pane-alert2" class="alert"></div>';
		var ok = '<br /><center><input id="create-dictionary-ok-button" name="ok" type="button" onclick="createDictionary.submit();" class="button-blue" value="OK" />';
		var cancel = '<input id="create-dictionary-cancel-button" type="button" onclick="createDictionary.hidePane();" name="Cancel" value="Cancel" class="button-gray" /></center>';
		
		$(this.paneID).innerHTML = title + ipt + chk + ok + cancel;
		$(this.paneID).show();
	},
	
	submit: function(){
		
		if($('create-dictionary-dictionary-name').value == ''){
			$('create-dictionary-pane-alert1').innerHTML = 'Dictionary name is missing.';
			return;
		}
		$('create-dictionary-pane-alert1').innerHTML = '';
		for(var i=0; i<userDictionary.dictionaryList.length; i++){
			if($('create-dictionary-dictionary-name').value == userDictionary.dictionaryList[i]){
				$('create-dictionary-pane-alert1').innerHTML = '"' + userDictionary.dictionaryList[i] + '"' + " already exists";
				//*alert(userDictionary.dictionaryList[i] + " already exists");
				return;
			}
		}
		
		this.selectedLangs = new Array();
		var chks = $$('#create-dictionary-pane input');
		chks.each((function(e){
			if(e.checked == true)this.selectedLangs.push(e.value);
			
		}).bind(this));
		var number = 0;
		var lform = '';
		for(var i=0; i<this.selectedLangs.length; i++){
			lform = lform + '&languages[]=' + this.selectedLangs[i];
			number = i+1;
		}
		
		if(number == 0){
			$('create-dictionary-pane-alert2').innerHTML = 'Languages need to be selected.';
			return;
		}
		
		$(this.paneID).hide();
		
		var newDictName = $('create-dictionary-dictionary-name').value;
		var selectedDict = userDictionary.displayedDictionaryName;
		UserDictionary.startLoading( 'Creating dictionary \'' + newDictName.escapeHTML() + '\'...' );
		new Ajax.Request(
			DICTIONARY_EDIT_PATH,
			{
				userDictionary: userDictionary,
				method		:'post',
				parameters	:'method=createDictionaryWithEmptyRecord&dictionary='
								+ newDictName
								+ lform
								+ '&number=3',
				
				onSuccess	:function(httpObj){
					var response = eval("("+httpObj.responseText+")");
					if(response.status == "ERROR"){
						UserDictionary.finishLoading();
						alert(response.message + ' : ' + response.contents);
						return;
					}
					
					userDictionary.dictionaryList.push(response.contents.dictionary);
					userDictionary.displayDictionaryList();
					
					
					var dSelector = $(ID_DICTIONARY_SELECTOR);
					for(var i=0; i<userDictionary.dictionaryList.length; i++){
						if(userDictionary.dictionaryList[i] == response.contents.dictionary){
							dSelector.selectedIndex = i+1;
							break;
						}
					}
					
					userDictionary.displayedDictionaryName = response.contents.dictionary;
					
					userDictionary.setNewDictionaryData(response.contents.languages, response.contents.data, response.contents.dictionary);
					UserDictionary.finishLoading( 'Dictionary \'<span style="color:red;">' + response.contents.dictionary + '</span>\' was created.' );
				},
				onFailure	:function(){
					UserDictionary.finishLoading();
					alert('Server Error.');
				},
				onComplete :function(){
				}
			}
		);
		
	},
	
	hidePane: function(){
		$(this.paneID).hide();
	}
};


