/**********************************************************************
* /js/component/composite-translation.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/utilities.js
 */

var CompositeTranslation = Class.create();
var SourceLanguageMenu = Class.create();
var TranslatorSelectArea = Class.create();
var Translator = Class.create();
var CompositeTranslationPrimeContainer = Class.create();
var CompositeTranslationContainer = Class.create();
var CompositeTranslationContainerTextarea = Class.create();
var AutocompleteContainer = Class.create();

var CONTAINER_ID_HEADER = 'composite-translation-container-';
var TRANSLATOR_MENU_OUTER_SPAN_ID_HEADER = 'translator-menu-outer-';
var TRANSLATOR_MENU_ID_HEADER = 'translator-menu-';
var TRANSLATOR_TARGET_LANGUAGE_AREA_ID_HEADER = 'target-languages-';
var CONTAINER_SOURCE_LANGUAGE_RADIO_ID_HEADER = 'language-radio-button-';
var CONTAINER_TEXTAREA_OUTER_ID_HEADER = 'container-textarea-outer-';
var CONTAINER_TEXTAREA_INNER_ID_HEADER = 'container-textarea-inner-';
var CONTAINER_TEXTAREA_WRAPPER_ID_HEADER = 'container-textarea-wrapper-';
var AUTOCOMPLETE_CONTAINER_ID_HEADER = 'autocomplete-container-';
var TRANSLATION_BUTTON_ID_HEADER = 'translation-button-';

var PARALLEL_TEXT_RESOURCE_ID = '##parallel';
var NO_PARALLEL_TEXT_MESSAGE = "(NO PARALLEL TEXT)";

var CREATE_MODE = 'create-mode';
var REPLACE_MODE = 'replace-mode';

CompositeTranslation.prototype = {
	initialize: function(id,sourceLanguageMenuId,postButtonId,postAllButtonId, serviceInformation){
		this.id = id;
		this.element = $(id);
		this.translators = new Array();
		this.supportedLanguages = null;
		this.postButtonElement = $(postButtonId);
		this.postAllButtonElement = $(postAllButtonId);
		this.largeDictionaryId = "";
		this.compositeTranslationContainers = new Array(new CompositeTranslationPrimeContainer(sourceLanguageMenuId,this.translators,this, serviceInformation));
	},

	getPostButtonElement: function(){
		return this.postButtonElement;
	},

	getPostAllButtonElement: function(){
		return this.postAllButtonElement;
	},

	setLargeDictionaryId: function(id){
		this.largeDictionaryId = id;
	},

	setTranslators: function(response){
		var hashData = eval("("+response+")");
		var checker = new StatusProcessor(hashData,
			"Playground Error : Can't obtain information about translators.",
			"Playground Warning : Can't obtain information about all translators.");
		if(!checker.check()) return;
		hashData = hashData.contents;
		var langs = new Array();
		for(var i=0;i<hashData.size();i++){
			var path = hashData[i].path;
			var supportedLanguagePairArray = new Array();
			path.each(function(p){
				var pathArray = p.split('2');
				supportedLanguagePairArray.push(new Pair(pathArray[0],pathArray[1]));
				if (langs.indexOf(pathArray[0]) < 0) langs.push(pathArray[0]);
				if (langs.indexOf(pathArray[1]) < 0) langs.push(pathArray[1]);
			});
			this.translators.push(new Translator(hashData[i].name,hashData[i].id,hashData[i].url,supportedLanguagePairArray));
		}
		this.supportedLanguages = langs;
		this.getChildContainer(0).setSupportedLanguage(this.supportedLanguages);

		this.getChildContainer(0).setTranslators(this.translators);
		this.getChildContainer(0).drawTranslatorMenu();
	},

	getTranslator: function(resourceId){
		for(var i=0;i<this.translators.size();i++){
			if(this.translators[i].getResourceId() == resourceId){
				return this.translators[i];
			}
		}
	},

	addParallelText: function(languages){
		this.removeParallelText();
		var pairArray = new Array();
		for(var i=0;i<languages.size();i++){
			for(var j=0;j<languages.size();j++){
				if(i == j) continue;
				pairArray.push(new Pair(languages[i],languages[j]));
			}
		}
		this.translators.push(new Translator('Parallel Text',PARALLEL_TEXT_RESOURCE_ID,null,pairArray));
	},

	removeParallelText: function(){
		for(var i=0;i<this.translators.size();i++){
			if(this.translators[i].getResourceId() == PARALLEL_TEXT_RESOURCE_ID)
				this.translators = this.translators.without(this.translators[i]);
		}
	},

	getAllTranslators: function(){
		return this.translators;
	},

	setSupportedLanguage: function(response){
		var hashData = eval("("+response+")");
		var checker = new StatusProcessor(hashData,
			"Playground Error : Can't obtain information about supported languages.",
			"Playground Warning : Can't obtain information about all supported languages.");
		if(!checker.check()) return;
		this.supportedLanguages = hashData.contents;
		this.getChildContainer(0).setSupportedLanguage(this.supportedLanguages);
	},

	getElement: function(){
		return this.element;
	},

	getSourceLanguageMenuElement: function(){
		return this.getChildContainer(0).getSourceLanguageMenu().getElement();
	},

	getAllAutocompleteContainers: function(){
		var autocompleteContainerArray = new Array();
		autocompleteContainerArray.push(this.getChildContainer(0).autocompleteContainer);
		for(var i=1;i<this.sizeOfContainers();i++){
			var textareaArray = this.getChildContainer(i).textareaArray;
			for(var j=0;j<textareaArray.size();j++){
				if(textareaArray[j].isChanged()) autocompleteContainerArray.push(textareaArray[j].autocompleteContainer);
			}
		}
		return autocompleteContainerArray;
	},

	getAllTextareaContainers: function(){
		var returnArray = new Array();
		for(var i=1;i<this.sizeOfContainers();i++){
			returnArray = returnArray.concat(this.getChildContainer(i).textareaArray);
		}
		return returnArray;
	},

	//* ダミーのコンテナを作成する(用例対訳用)
	makeDummy: function(){
		var targetLanguages = this.getChildContainer(0).getSelectedTargetLanguages();
		if(targetLanguages.size() != 0){
			var responseObj = {
				status: "OK",
				message: "No Error",
				contents: {
					status: "OK",message: "No Error",contents:[]
				}
			};
			targetLanguages.each(function(l){
				responseObj.contents.contents.push({
					status: "OK",
					message: "No Error",
					contents: {
						targetLanguage: l,
						targetText: "(Dummy)"
					}
				});
			});
			this.createContainer(responseObj,1);
		}
	},

	//* 翻訳結果を得て新たなコンテナを生成
	//* 既に存在するコンテナの場合は再編集(replace)
	createContainer: function(response,number){
		if(Object.isString(response)){
			var responseHash = response.evalJSON();
		} else {
			var responseHash = response;
		}

		var checker = new StatusProcessor(responseHash);
		if(!checker.check()) return;

		var resultHash = responseHash['contents'];

		var checker = new StatusProcessor(resultHash);
		if(!checker.check()) return;

		resultHash = resultHash.contents;
		if(number == this.sizeOfContainers()){ //* CREATE
			this.addChildContainer(new CompositeTranslationContainer(number,this.translators,this.getChildContainer(number-1),this));
			this.getChildContainer(number-1).setNextSibling(this.getChildContainer(number));
			this.getChildContainer(number).draw(resultHash,CREATE_MODE);
		} else { //* REPLACE
			this.getChildContainer(number).draw(resultHash,REPLACE_MODE);
		}
	},

	//* n番目のコンテナの選択されているテキストエリアのテキストを返す
	getSelectedText: function(n){
		return this.getChildContainer(n).getTextOfSelectedTextarea();
	},

	//* n番目のコンテナの選択されている元言語を返す
	getSelectedSourceLanguage: function(n){
		return this.getChildContainer(n).getSelectedSourceLanguage();
	},

	setSelectedSourceLanguage: function(n,language){
		this.getChildContainer(n).setSelectedSourceLanguage(language);
	},

	//* n番目のコンテナの選択されている対象言語を返す
	getSelectedTargetLanguages: function(n){
		return this.getChildContainer(n).getSelectedTargetLanguages();
	},

	getWsdlUrlOfSelectedTranslator: function(n){
		for(var i=0;i<this.translators.size();i++){
			if(this.translators[i].getResourceId() == this.getChildContainer(n).getSelectedTranslatorId()){
				return this.translators[i].getWsdlUrl();
			}
		}
	},

	getIdOfSelectedTranslator: function(n){
		return this.getChildContainer(n).getSelectedTranslatorId();
	},

	getChildContainer: function(n){
		return this.compositeTranslationContainers[n];
	},

	lastContainer: function(){
		return this.getChildContainer(this.sizeOfContainers()-1);
	},

	addChildContainer: function(container){
		return this.compositeTranslationContainers.push(container);
	},

	removeChildContainer: function(n){
		this.compositeTranslationContainers = this.compositeTranslationContainers.without(this.getChildContainer(n));
	},

	//* n番目から連動させられる子要素の番号の末尾を得る
	//* Parallel Textは最初の翻訳がそれであるときのみ可能．他のパスは生成できない
	getTranslatlionPathEnd: function(n){
		if(n == this.sizeOfContainers()-1) return n;
		for(var i=n;i<this.sizeOfContainers()-1;i++){
			var selectedTargetLanguages = this.getSelectedTargetLanguages(i);
			var nextSelectedSourceLanguage = this.getSelectedSourceLanguage(i+1);
			if(selectedTargetLanguages.indexOf(nextSelectedSourceLanguage) == -1) return i;
			if(i != n && this.getIdOfSelectedTranslator(i) == PARALLEL_TEXT_RESOURCE_ID) return i;
		}
		return i;
	},

	// containerの数
	sizeOfContainers: function(n){
		return this.compositeTranslationContainers.size();
	},

	setTargetLanguage: function(){
		this.onChangeSourceLanguage(null,0);
	},

	//* 指定した番号以降の要素を削除
	trancateChildren: function(n){
		for(var i = this.sizeOfContainers()-1; n < i;i--){
			this.getChildContainer(i).destroy();
			this.removeChildContainer(i);
		}
		this.getChildContainer(n).setNextSibling(null);
	},

	translate: function(number,lastNumber,createMode){
		//* 更新モードで最後のコンテナに辿り着いたら繰り返し終了
		if (number > lastNumber || (!createMode && number == lastNumber)) {
			return;
		}

		if(this.getIdOfSelectedTranslator(number) != PARALLEL_TEXT_RESOURCE_ID){
			var callobj = {
				source: this.getSelectedText(number).replace(/\r\n/g," ").replace(/\n/ig," "),
				from: this.getSelectedSourceLanguage(number),
				dictionary: editDictionary.seriarizeDictionaryAsJSON(),
				largedictionary: this.largeDictionaryId,
				translator: this.getIdOfSelectedTranslator(number)
			};
			var languages = this.getSelectedTargetLanguages(number);
			for ( var i = 0; i < languages.length; i++ ) {
				callobj[ 'to['+i+']' ] = languages[i];
			}
			var hash = $H(callobj);
			var formText=hash.toQueryString();

			$("translating-" + number).innerHTML = '&nbsp;&nbsp;&nbsp;&nbsp;Now translating...&nbsp;&nbsp;&nbsp;&nbsp;<img src="./img/anime/ajax-loader8.gif" />';
			var compositServices = this;
			new Ajax.Request(
				//*'./php/ajax/composite-translation-services/translate.php',
				'./php/ajax/composite-translation-services/domain-specific-translate.php',
				{
					method		:'post',
					parameters:formText,
					compositServices: compositServices,
					onSuccess	:function(httpObj){
						compositServices.createContainer(httpObj.responseText,number+1);
						compositServices.translate(number+1,lastNumber,createMode);
						serviceInformation.update(httpObj.responseJSON.contents.profile);
					},
					onFailure	:function(){
						alert('Server Error.');
					},
					onComplete	:function(){
						$("translating-" + number).innerHTML = '';
					}
				}
			);
		} else { //* Parallel Text
			var responseObj = {status: "OK",message: "",
					contents: {status: "OK",message: "",contents: []}};
			var targetLanguages = this.getChildContainer(number).getSelectedTargetLanguages();
			var parallelTexts = this.getChildContainer(number).getParallelText();
			var isExist = false;
			for(var i=0;i<targetLanguages.size();i++){
				for(var j=0;j<parallelTexts.size();j++){
					if(targetLanguages[i] == parallelTexts[j].car()){
						responseObj.contents.contents[i] = {
							status: "OK",
							message: "",
							contents: {
								targetLanguage: parallelTexts[j].car(),
								targetText: parallelTexts[j].cdr()
							}
						};
						isExist = true;
						break;
					}
				}
				if(!isExist){
					responseObj.contents.status = "WARNING";
					responseObj.contents.message = "Language Grid Warning : A part of Translation Failed";
					responseObj.contents.contents[i] = {
						status: "WARNING",
						message: "",
						contents: {
							targetLanguage: targetLanguages[i],
							targetText: ""
						}
					};
				}
			}
			//*this.removeParallelText();
			this.createContainer(responseObj,number+1);
			this.translate(number+1,lastNumber,createMode);
		}
	},

	loadTranslators: function(){
		var compositeServices = this;
		new Ajax.Request(
			'./php/ajax/load-services.php',
			{
				method		:'post',
				parameters	:'serviceCategory=composite-translation',
				compositeServices: compositeServices,
				onSuccess	:function(httpObj){
					compositeServices.setTranslators(httpObj.responseText);
					compositeServices.setTargetLanguage();
				},
				onFailure	:function(){
					alert('Server Error.');
				},
				onComplete :function(){

				}
			}
		);
	},

	onClickTranslationButton: function(number){
		var translatorArea = this.getChildContainer(number).getTranslatorArea();
		if(translatorArea.getSelectedTargetLanguages().size() != 0){
			var text = this.getSelectedText(number);
			if(text != ""){
				var lastChildNumber =this.getTranslatlionPathEnd(number);
				this.trancateChildren(lastChildNumber);
				var createMode = false;
				if(lastChildNumber == number) createMode = true;
				this.translate(number,lastChildNumber,createMode);
			} else {
				alert('Input some texts in textarea.');
			}
		} else {
			alert('Select target languages.');
		}
	}
};

SourceLanguageMenu.prototype = {
	initialize: function(id,container){
		this.id = id;
		this.element = $(this.id);
		this.selectedLanguage = null;
		this.menuLanguages = new Array();
		this.container = container;
		this.setEvent();
	},

	setSelectedLanguage: function(language){
		this.selectedLanguage = language;
	},

	getSelectedLanguage: function(){
		return this.selectedLanguage;
	},

	getElement: function(){
		return this.element;
	},

	setMenuLanguages: function(languages){
		this.menuLanguages = languages;
		// kitajima add start 20090731
		this.menuLanguages.sort(function(a,b){
			if (Language.getNameByTag(a) > Language.getNameByTag(b)) {
				return 1;
			} else if (Language.getNameByTag(a) < Language.getNameByTag(b)) {
				return -1;
			} else {
				return 0;
			}
		});
		// kitajima add end 20090731
	},

	resetSelectedLanguage: function(){
		this.selectedLanguage = null;
	},

	resetMenuLanguage: function(){
		this.menuLanguages = new Array();
	},

	draw: function(){
		this.element.innerHTML = '';
		if (this.menuLanguages.size() == 0) {
			var opt = document.createElement('option');
			opt.innerHTML = '&nbsp;';
			this.element.appendChild(opt);
		}
		else {
			for (var n = 0; n < this.menuLanguages.size(); n++) {
				var opt = document.createElement('option');
				if (this.menuLanguages[n] == this.selectedLanguage) {
					opt.selected = "true";
				}
				opt.value = this.menuLanguages[n];
				opt.innerHTML = Language.getNameByTag(this.menuLanguages[n]);
				this.element.appendChild(opt);
			}
			if (!this.selectedLanguage) {
				this.element.firstChild.selected = "true";
				this.selectedLanguage = this.element.firstChild.value;
			}
		}
		this.container.textareaElement.setAttribute('dir', Language.getTextDirection(this.element.value));
	},

	setEvent: function(){
		this.element.observe('change',this.onChangeLanguage.bindAsEventListener(0,this.container));
	},

	onChangeLanguage: function(event){
		var container = $A(arguments)[1];
		container.setSelectedSourceLanguage(Event.element(event).value);
		//*container.getCompositeTranslation().removeParallelText();
		container.drawTranslatorMenu();
	}
};

TranslatorSelectArea.prototype = {
	initialize: function(number,translators,compositeTranslation){
		this.number = number;
		this.element = null;
		this.menuElement = null;
		this.targetLanguagesAreaElement = null;
		this.translationButtonElement = null;
		this.targetLanguages = null;
		this.translatorArray = translators;
		this.compositeTranslation = compositeTranslation;
		this.defaultTargetLanguages = new Array();
		this.defaultTranslatorId = null;

		if(this.number == 0) this.setEvent();
	},

	setTranslators: function(translators){
		this.translatorArray = translators;
	},

	setTargetLanguages: function(languages){
		this.targetLanguages = languages;
		// kitajima add start 20090731
		this.targetLanguages.sort(function(a,b){
			if (Language.getNameByTag(a) > Language.getNameByTag(b)) {
				return 1;
			} else if (Language.getNameByTag(a) < Language.getNameByTag(b)) {
				return -1;
			} else {
				return 0;
			}
		});
		// kitajima add end 20090731
	},

	setDefaultTargetLanguages: function(languages){
		this.defaultTargetLanguages = languages;
	},

	setDefaultTranslator: function(translatorId){
		this.defaultTranslatorId = translatorId;
	},

	getSelectedTargetLanguages: function(){
		var targetLanguages = new Array();
		var children = this.getTargetLanguageAreaElement().getElementsByTagName('input');
		for(var i=0;i<children.length;i++){
			if(children[i].nodeType == 1 && children[i].checked) targetLanguages.push(children[i].value);
		}
		return targetLanguages;
	},

	getSelectedTranslatorId: function(){
		return this.getMenuElement().value;
	},

	getDomElementArray: function(){
		var inputBy = document.createElement("span");
		if($(TRANSLATOR_MENU_OUTER_SPAN_ID_HEADER+this.number)) $(TRANSLATOR_MENU_OUTER_SPAN_ID_HEADER+this.number).remove();
		inputBy.id = TRANSLATOR_MENU_OUTER_SPAN_ID_HEADER+this.number;
		inputBy.className = "input-by";
		this.element = inputBy;


		var translateButton = null;
		if($(TRANSLATION_BUTTON_ID_HEADER+this.number)){
			translateButton = this.getTranslationButtonElement();
		} else {
			translateButton = document.createElement("input");
			translateButton.type = "button";
			translateButton.className = "button-blue translation-button";
			translateButton.id = TRANSLATION_BUTTON_ID_HEADER+this.number;
			// 2009-08-24 koyama modified start
//			translateButton.value = "Translation";
			translateButton.value = "Translate";
			// 2009-08-24 koyama modified end
			// 2009-09-25 koyama add start
			Event.observe(translateButton, 'click',
					this.onClickTranslationButton.bindAsEventListener(0,this.compositeTranslation,this.number));
			// 2009-09-25 koyama add end
		}
		inputBy.appendChild(translateButton);

		var translatorLogo = document.createElement("span");
		translatorLogo.innerHTML = "Translator:"
		inputBy.appendChild(translatorLogo);

		var selectTranslator = document.createElement("select");
		if($(TRANSLATOR_MENU_ID_HEADER+this.number)) $(TRANSLATOR_MENU_ID_HEADER+this.number).remove();
		selectTranslator.id = TRANSLATOR_MENU_ID_HEADER+this.number;
		selectTranslator.className = 'translator-selection';
		this.menuElement = selectTranslator;
		inputBy.appendChild(selectTranslator);

		var toSpan = document.createElement("span");
		toSpan.innerHTML = "To:";
		inputBy.appendChild(toSpan);

		var inputSpan = document.createElement("span");
		if($(TRANSLATOR_TARGET_LANGUAGE_AREA_ID_HEADER+this.number)) $(TRANSLATOR_TARGET_LANGUAGE_AREA_ID_HEADER+this.number).remove();
		inputSpan.id = TRANSLATOR_TARGET_LANGUAGE_AREA_ID_HEADER + this.number;
		this.targetLanguagesAreaElement = inputSpan;
		inputBy.appendChild(inputSpan);

		return inputBy;
	},

	getElement: function(){
		if(this.element == null) this.element = $(TRANSLATOR_MENU_OUTER_SPAN_ID_HEADER+this.number);
		return this.element;
	},

	getMenuElement: function(){
		if(this.menuElement == null)this.menuElement = $(TRANSLATOR_MENU_ID_HEADER+this.number);
		return this.menuElement;
	},

	getTargetLanguageAreaElement: function(){
		if(this.targetLanguagesAreaElement == null)this.targetLanguagesAreaElement = $(TRANSLATOR_TARGET_LANGUAGE_AREA_ID_HEADER+this.number);
		return this.targetLanguagesAreaElement;
	},

	getTranslationButtonElement: function(){
		if(this.translationButtonElement == null && this.translationButtonElement == undefined)this.translationButtonElement = $(TRANSLATION_BUTTON_ID_HEADER+this.number);
		return this.translationButtonElement;
	},

	drawTargetLanguages: function(){
		this.getTargetLanguageAreaElement().innerHTML = '';
		var innerHTML = '';
		var id;
		for(var n=0;n<this.targetLanguages.size();n++){
			//* なぜかインプットのタグが閉じないので、HTMLを直書き
			id = 'toLangs_' + this.number + '_' + n;
			innerHTML += '<label for="'+id+'" class="to-language"><input name="'+'toLangs_'+this.number+'" value="'+this.targetLanguages[n]+'" type="checkbox"'
			+(this.defaultTargetLanguages.indexOf(this.targetLanguages[n]) >= 0 ? ' checked="checked" ' : '')
			+' id="'+id+'"/>'
			+''
			+Language.getNameByTag(this.targetLanguages[n])
			+'</label>'
			+' '//* Important!!!
			;
		}
		this.getTargetLanguageAreaElement().innerHTML = innerHTML;
		this.defaultTargetLanguages = new Array();
	},

	drawTranslatorMenu: function(){
		var selectElement = this.getMenuElement();
		selectElement.innerHTML = '';
		if (this.translatorArray.size() == 0) {
			var opt = document.createElement('option');
			opt.innerHTML = '&nbsp;';
			selectElement.appendChild(opt);
		}
		else {
			var isDefault = false;
			for (var n = 0; n < this.translatorArray.size(); n++) {
				var opt = document.createElement('option');
				opt.value = this.translatorArray[n].getResourceId();
				opt.innerHTML = this.translatorArray[n].getName();
				if(opt.value == this.defaultTranslatorId) {
					opt.selected = 'selected';
					isDefault = true;
				}
				selectElement.appendChild(opt);
			}
			if(!isDefault) selectElement.firstChild.selected = "selected";
		}
		this.defaultTranslatorId = null;
	},

	setEvent: function(){
		this.getTranslationButtonElement().observe('click',
			this.onClickTranslationButton.bindAsEventListener(0,this.compositeTranslation,this.number));
		$(this.getMenuElement().id).observe('change',
			this.onChangeTranslatorMenu.bindAsEventListener(0,this.compositeTranslation,this,this.number));
	},

	onClickTranslationButton: function(e){
		$A(arguments)[1].onClickTranslationButton($A(arguments)[2]);
	},

	onChangeTranslatorMenu: function(e){
		var resourceId = Event.element(e).value;
		var compositeTranslation = $A(arguments)[1];
		var translatorSelectArea = $A(arguments)[2];
		var number = $A(arguments)[3];
		var translator = compositeTranslation.getTranslator(resourceId);
		translatorSelectArea.setDefaultTargetLanguages(translatorSelectArea.getSelectedTargetLanguages());
		translatorSelectArea.setTargetLanguages(translator.getTargetLanguages(compositeTranslation.getSelectedSourceLanguage(number)));
		translatorSelectArea.drawTargetLanguages();
	}
};

Translator.prototype = {
	initialize: function(name,resourceId,wsdlUrl,supportedPairLanguages){
		this.name = name;
		this.resourceId = resourceId;
		this.wsdlUrl = wsdlUrl;
		this.supportedLanguagePairArray = supportedPairLanguages;
	},

	isSupportedSourceLanguage: function(language){
		for(var i=0;i<this.supportedLanguagePairArray.size();i++){
			if(this.supportedLanguagePairArray[i].car() == language) return true;
		}
		return false;
	},

	getTargetLanguages: function(sourceLanguage){
		var languages = new Array();
		this.supportedLanguagePairArray.each(function(p){
			if(sourceLanguage == p.car()) languages.push(p.cdr());
		});
		return languages.uniq();
	},

	getResourceId: function(){
		return this.resourceId;
	},

	getWsdlUrl: function(){
		return this.wsdlUrl;
	},

	getName: function(){
		return this.name;
	},

	isParallelText: function(){
		return this.getResourceId() == PARALLEL_TEXT_RESOURCE_ID;
	}
};

CompositeTranslationPrimeContainer.prototype = {
	initialize: function(sourceLanguageMenuId,translators,compositeTranslation){
		this.attribute = 'prime';
		this.element = $(CONTAINER_ID_HEADER+0);
		this.textareaElement = $(CONTAINER_TEXTAREA_INNER_ID_HEADER+'0'+'-'+'0');
		this.translatorArea = new TranslatorSelectArea(0,translators,compositeTranslation);
		this.nextSibling = null;
		this.resultPairs = new Array();
		this.sourceLanguageMenu = new SourceLanguageMenu(sourceLanguageMenuId,this);
		this.compositeTranslation = compositeTranslation;
		this.autocompleteContainer = new AutocompleteContainer(0,0,this);

		this.setEvent();
	},

	getCompositeTranslation: function(){
		return this.compositeTranslation;
	},

	getSourceLanguageMenu: function(){
		return this.sourceLanguageMenu;
	},

	getTranslatorArea: function(){
		return this.translatorArea;
	},

	getTextOfSelectedTextarea: function(){
		return this.textareaElement.value;
	},

	getSelectedSourceLanguage: function(){
		return this.sourceLanguageMenu.getSelectedLanguage();
	},

	getSelectedTargetLanguages: function(){
		return this.getTranslatorArea().getSelectedTargetLanguages();
	},

	setSelectedSourceLanguage: function(language){
		this.sourceLanguageMenu.setSelectedLanguage(language);
		this.autocompleteContainer.setQueryLanguage();
		this.textareaElement.setAttribute('dir', Language.getTextDirection(language));
	},

	setParallelTextResults: function(resultPairs){
		this.resultPairs = resultPairs;
	},

	clearParallelTextResults: function(){
		this.resultPairs = new Array();
	},

	hasParallelTextResults: function(){
		if(this.resultPairs.size() != 0) return true;
		else return false;
	},

	getParallelText: function(){
		return this.resultPairs;
	},

	setNextSibling: function(container){
		this.nextSibling = container;
	},

	getSelectedTranslatorId: function(){
		return this.translatorArea.getSelectedTranslatorId();
	},

	setSupportedLanguage: function(supportedLanguage){
		this.sourceLanguageMenu.setMenuLanguages(supportedLanguage);
		this.sourceLanguageMenu.draw();
	},

	setTranslators: function(translators){
		this.translatorArea.setTranslators(translators);
	},

	getHashData: function(){
		return [{language: this.getSelectedSourceLanguage(),text: this.getTextOfSelectedTextarea()}];
	},

	drawTranslatorMenu: function(defaultTranslatorId){
		this.translatorArea.setDefaultTargetLanguages(this.translatorArea.getSelectedTargetLanguages());
		if(defaultTranslatorId == null){
			this.translatorArea.setDefaultTranslator(this.translatorArea.getSelectedTranslatorId());
		}else {
			this.translatorArea.setDefaultTranslator(defaultTranslatorId);
		}

		var availableTranslators = new Array();
		var translators = this.getCompositeTranslation().getAllTranslators();
		for(var i=0;i<translators.size();i++){
			if(translators[i].isSupportedSourceLanguage(this.getSelectedSourceLanguage()))
				if(!translators[i].isParallelText() || (translators[i].isParallelText() && this.hasParallelTextResults()))
				availableTranslators.push(translators[i]);
		}
		this.translatorArea.setTranslators(availableTranslators);
		this.translatorArea.drawTranslatorMenu();

		var selectedTranslator = null;
		for(var i=0;i<availableTranslators.size();i++){
			if(availableTranslators[i].getResourceId() == this.translatorArea.getSelectedTranslatorId()){
				selectedTranslator = availableTranslators[i];
				break;
			}
		}
		this.translatorArea.setTargetLanguages(selectedTranslator.getTargetLanguages(this.getSelectedSourceLanguage()));
		this.translatorArea.drawTargetLanguages();
	},

	setEvent: function(){
		this.textareaElement.observe('keyup',this.onKeyUpTextarea.bindAsEventListener(0,this));
	},

	onKeyUpTextarea: function(e){
		var paralletextArray = $A(arguments)[1].getParallelText();
		var language = $A(arguments)[1].getSelectedSourceLanguage();
		var text = null;

		for(var i=0;i<paralletextArray.size();i++){
			if(paralletextArray[i].car() == language){
				text = paralletextArray[i].cdr();
				break;
			}
		}
		if(text != null && text.strip() != Event.element(e).value.strip()){
			//$A(arguments)[1].container.getCompositeTranslation().removeParallelText();
			$A(arguments)[1].clearParallelTextResults();
			$A(arguments)[1].drawTranslatorMenu();
		}
	}
};

CompositeTranslationContainer.prototype = {
	initialize: function(number,translators,previousContainer,compositeTranslation){
		this.number = number;
		this.attribute = 'unit';
		this.element = null;
		this.translatorArea = new TranslatorSelectArea(this.number,translators,compositeTranslation);
		this.textareaArray = new Array();
		this.nextSibling = null;
		this.previousSibling = previousContainer;
		this.compositeTranslation = compositeTranslation;
	},

	getElement: function(){
		if(this.element) this.element = $(CONTAINER_ID_HEADER+this.number);
		return this.element;
	},

	getCompositeTranslation: function(){
		return this.compositeTranslation;
	},

	getSelectedTargetLanguages: function(){
		return this.getTranslatorArea().getSelectedTargetLanguages();
	},

	getTranslatorArea: function(){
		return this.translatorArea;
	},

	getSelectedTextarea: function(){
		for(var i=0;i<this.textareaArray.size();i++){
			if(this.textareaArray[i].isSelected())
				return this.textareaArray[i];
		}
		return null;
	},

	getParallelText: function(){
		return this.getSelectedTextarea().getParallelTextResults();
	},

	getTextOfSelectedTextarea: function(){
		for(var i=0;i<this.textareaArray.size();i++){
			if(this.textareaArray[i].isSelected())
				return this.textareaArray[i].getText();
		}
	},

	getSelectedSourceLanguage: function(){
		for(var i=0;i<this.textareaArray.size();i++){
			if(this.textareaArray[i].isSelected())
				return this.textareaArray[i].getLanguage();
		}
	},

	destroy: function(){
		this.getElement().remove();
	},

	setNextSibling: function(container){
		this.nextSibling = container;
	},

	getSelectedTranslatorId: function(){
		return this.translatorArea.getSelectedTranslatorId();
	},

	getHashData: function(){
		var hashArray = [];
		this.textareaArray.each(function(t){
			hashArray.push({language: t.getLanguage(),text:t.getText()});
		});
		return hashArray;
	},

	//* 結果のリスポンスを得てコンテナを描画する
	draw: function(resultHash,mode){

		var replacement = null;
		if(mode == REPLACE_MODE){
			replacement = {
				element: $(CONTAINER_ID_HEADER+this.number),
				translatorId: this.getSelectedTranslatorId(),
				sourceLanguage: this.getSelectedSourceLanguage(),
				targetLanguages: this.getSelectedTargetLanguages()
			}
		}

		this.textareaArray = new Array();
		for(var i=0; i < resultHash.size(); i++){
			var result = resultHash[i];
			var language = result['contents']['targetLanguage'];
			var text = '';
			var checker = new StatusProcessor(result);
			checker.ok = function(){
				text = this.response['contents']['targetText']['contents'];
				return true;
			}
			checker.error = function(){
				text = "("+this.message+")";
				return true;
			}
			checker.warning = function(){
				text = "("+this.message+")";
				return true;
			}
			if(!checker.check()) return;
			this.textareaArray.push(new CompositeTranslationContainerTextarea(this.number,i,language,text,this));
		}

		var translationWrapDiv = document.createElement("div");
		translationWrapDiv.className = "translation-wrap";
		this.element = translationWrapDiv;

		var inputForm = document.createElement("form");
		translationWrapDiv.appendChild(inputForm);

		for(var i=0; i< resultHash.size();i++){
			inputForm.appendChild(this.textareaArray[i].getDomElement());
		}

		var inputAreaConditionClearfix = document.createElement("div");
		inputAreaConditionClearfix.className = "input-area-condition clearfix";
		inputForm.appendChild(inputAreaConditionClearfix);

		var arrowDown2 = document.createElement("div");
		arrowDown2.className = "arrow-down2";
		inputAreaConditionClearfix.appendChild(arrowDown2);

		var inputCondition = document.createElement("div");
		inputCondition.className = "input-condition";
		inputAreaConditionClearfix.appendChild(inputCondition);

		inputCondition.appendChild(this.translatorArea.getDomElementArray());

		var nowTranslating = document.createElement("span");
		nowTranslating.className = "translating"
		nowTranslating.id = "translating-" + this.number;
		inputCondition.appendChild(nowTranslating);

		if(mode == REPLACE_MODE){
			replacement.element.replace(translationWrapDiv);
			this.translatorArea.setDefaultTargetLanguages(replacement.targetLanguages);
			this.translatorArea.setDefaultTranslator(replacement.translatorId);
			this.textareaArray.each(function(t){
				if(t.getLanguage() == replacement.sourceLanguage) t.setSelected(true);
				else t.setSelected(false);
			});
		}else if(mode == CREATE_MODE){
			$("translation-form-area").appendChild(translationWrapDiv);
		}
		translationWrapDiv.id = CONTAINER_ID_HEADER+this.number;

		this.drawTranslatorMenu(null,true);
		this.translatorArea.setEvent();
		this.textareaArray.each(function(t){t.setEvent();});
	},

	drawTranslatorMenu: function(defaultTranslatorId,isInit){
		if(isInit != true){
			this.translatorArea.setDefaultTargetLanguages(this.translatorArea.getSelectedTargetLanguages());
			if(defaultTranslatorId == null){
				this.translatorArea.setDefaultTranslator(this.translatorArea.getSelectedTranslatorId());
			} else {
				this.translatorArea.setDefaultTranslator(defaultTranslatorId);
			}
		}

		var availableTranslators = new Array();
		var translators = this.getCompositeTranslation().getAllTranslators();
		for(var i=0;i<translators.size();i++){
			if(translators[i].isSupportedSourceLanguage(this.getSelectedSourceLanguage()))
				if(!translators[i].isParallelText() || (translators[i].isParallelText() && this.getSelectedTextarea().hasParallelTextResults()))
					availableTranslators.push(translators[i]);
		}
		this.translatorArea.setTranslators(availableTranslators);
		this.translatorArea.drawTranslatorMenu();

		var selectedTranslator = null;
		for(var i=0;i<availableTranslators.size();i++){
			if(availableTranslators[i].getResourceId() == this.translatorArea.getSelectedTranslatorId()){
				selectedTranslator = availableTranslators[i];
				break;
			}
		}
		this.translatorArea.setTargetLanguages(selectedTranslator.getTargetLanguages(this.getSelectedSourceLanguage()));
		this.translatorArea.drawTargetLanguages();
	}
};

CompositeTranslationContainerTextarea.prototype = {
	CLASS_NORMAL_TEXTAREA: 'normal-style',
	CLASS_INPUT_TEXTAREA: 'input-style',

	initialize: function(containerNumber,textareaNumber,language,text,container){
		this.containerNumber = containerNumber;
		this.textareaNumber = textareaNumber;
		this.language = language;
		this.textareaId = CONTAINER_TEXTAREA_OUTER_ID_HEADER+this.containerNumber+'-'+this.textareaNumber;
		this.textareaElement = null;
		this.textareaWrapperId = CONTAINER_TEXTAREA_WRAPPER_ID_HEADER+this.containerNumber+'-'+this.textareaNumber;
		this.textareaWrapperElement = null;
		this.defaultText = text;
		this.buttonElement = null;
		this.changed = false;
		this.container = container;
		this.autocompleteContainer = null;
		this.resultPairs = new Array();
	},

	isChanged: function(){
		return this.changed;
	},

	isSelected: function(){
		return this.getButtonElement().checked;
	},

	getButtonElement: function(){
		if(this.buttonElement == null) this.buttonElement = $(CONTAINER_SOURCE_LANGUAGE_RADIO_ID_HEADER+this.containerNumber+'-'+this.textareaNumber);
		return this.buttonElement;
	},

	getTextareaElement: function(){
		if(this.textareaElement == null) this.textareaElement = $(this.textareaId);
		return this.textareaElement;
	},

	getWrapperElement: function(){
		if(this.textareaWrapperElement == null) this.textareaWrapperElement = $(this.textareaWrapperId);
		return this.textareaWrapperElement;
	},

	getText: function(){
		if(this.changed) return this.getTextareaElement().value;
		else return this.defaultText;
	},

	getLanguage: function(){
		return this.language;
	},

	setParallelTextResults: function(resultPairs){
		this.resultPairs = resultPairs;
	},

	clearParallelTextResults: function(){
		this.resultPairs = new Array();
	},

	hasParallelTextResults: function(){
		if(this.resultPairs.size() != 0) return true;
		else return false;
	},

	getParallelTextResults: function(){
		return this.resultPairs;
	},

	setSelected: function(isSelected){
		this.getButtonElement().checked = isSelected;
	},

	getDomElement: function(){
		var resultAreaDiv = document.createElement("div");
		resultAreaDiv.className = "result-area";

		var resultAreaWrapClearfixDiv = document.createElement("div");
		resultAreaWrapClearfixDiv.className = "result-area-wrap clearfix";
		resultAreaWrapClearfixDiv.id = this.textareaWrapperId;
		resultAreaDiv.appendChild(resultAreaWrapClearfixDiv);

		var resultRadio = document.createElement("div");
		resultRadio.className = "result-radio";
		if(this.textareaNumber == 0){
			resultRadio.innerHTML = '<input name="radiobutton" id="'+CONTAINER_SOURCE_LANGUAGE_RADIO_ID_HEADER+this.containerNumber+'-'+this.textareaNumber+'" type="radio" value="' + this.language + '" checked />' +Language.getNameByTag(this.language) +':'
		}else{
			resultRadio.innerHTML = '<input name="radiobutton" id="'+CONTAINER_SOURCE_LANGUAGE_RADIO_ID_HEADER+this.containerNumber+'-'+this.textareaNumber+'" type="radio" value="' + this.language + '" />' +Language.getNameByTag(this.language) +':'
		}

		//this.buttonElement.observe('click',this.onClickRadioButton.bindAsEventListener(0,this));

		resultAreaWrapClearfixDiv.appendChild(resultRadio);

		var resultTextAreaDiv = document.createElement("div");
		resultTextAreaDiv.className = "result-textarea";
		resultAreaWrapClearfixDiv.appendChild(resultTextAreaDiv);

		var normalStyle = document.createElement("div");
		normalStyle.className = this.CLASS_NORMAL_TEXTAREA;
		normalStyle.id = this.textareaId;
		normalStyle.appendChild(document.createTextNode(this.defaultText));
		normalStyle.setAttribute('dir', Language.getTextDirection(this.language));
		resultTextAreaDiv.appendChild(normalStyle);
		return resultAreaDiv;
	},

	//* 用例対訳のテキストで新たに入れ替える
	replace: function(text){
		var selected = this.isSelected();
		this.textareaElement = null;
		this.defaultText = text;
		this.buttonElement = null;
		this.changed = false;
		this.textareaId = CONTAINER_TEXTAREA_OUTER_ID_HEADER+this.containerNumber+'-'+this.textareaNumber;

		var html = '<div class="result-radio">'
		if(this.defaultText != NO_PARALLEL_TEXT_MESSAGE) html += '<img src="img/customized/icon_book.png" />&nbsp;';
		if(selected){
			html += '<input name="radiobutton" id="'+CONTAINER_SOURCE_LANGUAGE_RADIO_ID_HEADER+this.containerNumber+'-'+this.textareaNumber+'" type="radio" value="' + this.language + '" checked />' +Language.getNameByTag(this.language) +':'
		}else{
			html += '<input name="radiobutton" id="'+CONTAINER_SOURCE_LANGUAGE_RADIO_ID_HEADER+this.containerNumber+'-'+this.textareaNumber+'" type="radio" value="' + this.language + '" />' +Language.getNameByTag(this.language) +':'
		}
		html += '</div>';

		html += '<div class="result-textarea">';
		html += '<div class="'+this.CLASS_NORMAL_TEXTAREA+'" id="'+this.textareaId+'" dir="'+Language.getTextDirection(this.language)+'">';
		html += this.defaultText.escapeHTML();
		html += '</div>';
		html += '</div>';
		this.getWrapperElement().innerHTML = '';
		this.getWrapperElement().innerHTML = html;

		this.setEvent();
	},

	setEvent: function(){
		this.getButtonElement().observe('change',this.onChangeRadioButton.bindAsEventListener(0,this));
		this.getTextareaElement().observe('click',this.onClickTextarea.bindAsEventListener(0,this));
		this.getTextareaElement().observe('mouseover',this.onMouseOverTextarea.bindAsEventListener(0,this));
		this.getTextareaElement().observe('mouseout',this.onMouseOutTextarea.bindAsEventListener(0,this));
	},

	onChangeRadioButton: function(e){
		if($A(arguments)[1].isSelected()){
			//$A(arguments)[1].container.getCompositeTranslation().removeParallelText();
			$A(arguments)[1].container.drawTranslatorMenu();
		}
	},

	onMouseOverTextarea: function(e){
		$A(arguments)[1].getTextareaElement().removeClassName($A(arguments)[1].CLASS_NORMAL_TEXTAREA);
		$A(arguments)[1].getTextareaElement().addClassName($A(arguments)[1].CLASS_INPUT_TEXTAREA);
	},

	onMouseOutTextarea: function(e){
		$A(arguments)[1].getTextareaElement().removeClassName($A(arguments)[1].CLASS_INPUT_TEXTAREA);
		$A(arguments)[1].getTextareaElement().addClassName($A(arguments)[1].CLASS_NORMAL_TEXTAREA);
	},

	onClickTextarea: function(e){
		var containerTextarea = $A(arguments)[1];
		var innerId = containerTextarea.textareaId.replace(CONTAINER_TEXTAREA_OUTER_ID_HEADER,CONTAINER_TEXTAREA_INNER_ID_HEADER);
		var str = containerTextarea.getText();
		var heightPX = containerTextarea.getTextareaElement().getHeight()-6;

		//*ちょっと無理やり幅と高さをそろえた
		// kitajima mod start 20090731
//		containerTextarea.getTextareaElement().up('div').innerHTML = '<textarea id="'+ innerId +'" class="input-style-textarea" style="width:780px;height:'+ heightPX +';" dir="'+Language.getTextDirection(containerTextarea.language)+'"></textarea>'+
		containerTextarea.getTextareaElement().up('div').innerHTML = '<textarea id="'+ innerId +'" class="input-style-textarea" style="width:740px;height:'+ heightPX +';" dir="'+Language.getTextDirection(containerTextarea.language)+'"></textarea>'+
		// kitajima mod end 20090731
			'<div id="'+AUTOCOMPLETE_CONTAINER_ID_HEADER+containerTextarea.containerNumber+'-'+containerTextarea.textareaNumber+'"></div>';
		containerTextarea.textareaElement = $(innerId);
		containerTextarea.textareaElement.value = str;
		//*containerTextarea.textareaElement.observe('keyup',containerTextarea.onKeyUpTextarea.bindAsEventListener(0,containerTextarea));
		containerTextarea.changed = true;
		containerTextarea.textareaElement.focus();
		//*containerTextarea.setAutocomplete();
	},

	onKeyUpTextarea: function(e){
		var paralletextArray = $A(arguments)[1].getParallelTextResults();
		var language = $A(arguments)[1].container.getSelectedSourceLanguage();
		var text = null;
		for(var i=0;i<paralletextArray.size();i++){
			if(paralletextArray[i].car() == language){
				text = paralletextArray[i].cdr();
				break;
			}
		}
		if(text != null && text.strip() != Event.element(e).value.strip()){
			//$A(arguments)[1].container.getCompositeTranslation().removeParallelText();
			$A(arguments)[1].clearParallelTextResults();
			$A(arguments)[1].container.drawTranslatorMenu();
		}
	},

	setAutocomplete: function(){
		this.autocompleteContainer = new AutocompleteContainer(this.containerNumber,this.textareaNumber,this.container,this);
		this.autocompleteContainer.setQueryLanguage();
		this.autocompleteContainer.setQueryResourceIds(CompositTranslationServices.Connector.getIdOfSelectedParallelText());
	}
};

AutocompleteContainer.prototype = {
	initialize: function(containerNumber,textareaNumber,parentContainer,textareaContainer){
		this.id = AUTOCOMPLETE_CONTAINER_ID_HEADER+containerNumber+'-'+textareaNumber;
		this.sourceId =CONTAINER_TEXTAREA_INNER_ID_HEADER+containerNumber+'-'+textareaNumber;
		this.element = $(this.id);
		this.parentContainer = parentContainer;
		this.textareaContainer = textareaContainer;
		this.oACDS = new YAHOO.widget.DS_XHR("php/ajax/composite-translation-services/autocomplete.php", ["contents","sourceText"]);
		this.oAutoComplete = new YAHOO.widget.AutoComplete(this.sourceId,this.id, this.oACDS);

		this.language = new Array();
		this.resourceIds = new Array();

		this.setYuiEvent();
	},

	//* オートコンプリート用にコールバック関数をオーバーライドする
	setYuiEvent: function(){
		this.oACDS.queryMatchContains = true;
		this.oACDS.maxCacheEntries = 0;

		this.oAutoComplete.useShadow = true;
		//* オートコンプリートの結果の調整
		this.oAutoComplete.formatResult = function(oResultItem, sQuery) {
			return oResultItem[0];
		};
		//* コンテナ表示前の調整
		this.oAutoComplete.doBeforeExpandContainer = function(oTextbox, oContainer, sQuery, aResults) {
			var pos = YAHOO.util.Dom.getXY(oTextbox);
			pos[1] += YAHOO.util.Dom.get(oTextbox).offsetHeight + 2;
			YAHOO.util.Dom.setXY(oContainer,pos);
			return true;
		};
		//* 項目選択時の動作の指定
		var container = this.parentContainer;
		var parentContainer = this.parentContainer;
		if(this.textareaContainer != undefined){ //* 子コンテナの時
			container = this.textareaContainer;
		}

		this.oAutoComplete.itemSelectEvent.subscribe(function(oSelf,elItem,oData){
			var resourceArray = CompositTranslationServices.Connector.getIdOfSelectedParallelText();
			for (var i=0;i<resourceArray.size();i++) {
				serviceInformation.requestById(resourceArray[i]);
			}
			var targetArray = elItem[1]._oResultData[1].targetTexts;
			var resultPairs = new Array();
			var targetLanguages = new Array();
			for(var i=0;i<targetArray.length;i++){
				resultPairs.push(new Pair(targetArray[i].targetLanguage,targetArray[i].targetText));
				targetLanguages.push(targetArray[i].targetLanguage);
			}
			resultPairs.push(new Pair(elItem[1]._oResultData[1].sourceLanguage,elItem[1]._oResultData[1].sourceText));

			var textareaArray = parentContainer.getCompositeTranslation().getAllTextareaContainers();

			// eip kawauchi mod start 20100105
			//オートコンプリート入力の度に、
			//オブジェクトを生成し直す
			if(textareaArray.size() != 0){
				parentContainer.getCompositeTranslation().trancateChildren(0);
			}
			//if(textareaArray.size() == 0){
			parentContainer.getCompositeTranslation().makeDummy();
			textareaArray = parentContainer.getCompositeTranslation().getAllTextareaContainers();
			//}
			// eip kawauchi mod end 20100105

			for(var i=0;i<textareaArray.size();i++){
				var hasParallel = false;
				for(var j=0;j<resultPairs.size();j++){
					if(textareaArray[i].getLanguage() == resultPairs[j].car()){
						textareaArray[i].replace(resultPairs[j].cdr());
						hasParallel = true;
						break;
					}
				}
				if(!hasParallel) textareaArray[i].replace(NO_PARALLEL_TEXT_MESSAGE);
			}
			//*container.setParallelTextResults(resultPairs);
			//*targetLanguages.push(elItem[1]._oResultData[1].sourceLanguage);
			//*parentContainer.getCompositeTranslation().addParallelText(targetLanguages);
			//*parentContainer.drawTranslatorMenu(PARALLEL_TEXT_RESOURCE_ID);
		});
	},

	setQueryLanguage: function(){
	   	this.language = this.parentContainer.getSelectedSourceLanguage();
		this.setQuery();
	},

	setQueryResourceIds: function(ids){
	   	this.resourceIds = ids;
		this.setQuery();
	},

	setQuery: function(){
		var query = '';
		query += "from="+this.language;
		query+="&idNum="+this.resourceIds.length;
		for(var i=0;i<this.resourceIds.length;i++){
			query += "&id"+i+"="+encodeURIComponent(this.resourceIds[i]);
		}
		this.oACDS.scriptQueryAppend = query;
	}
};

CompositeTranslation.Event = {
	load: function(compositeServices){
		compositeServices.loadTranslators();
	}
};

