YAHOO.namespace( 'MultiLanguage' );
YAHOO.MultiLanguage = function() {

	var languages = {}, // языки
		forms = {}; // мультиязычные формы, двумерный массив id формы, id поля, объект поля

	return {
		setLanguages: function() {
			languages = arguments[0];
			return this;
		},

		getLanguages: function() {
			return languages;
		},

		init: function(formId) {
			forms[formId].init();
			return this;
		},

		onSubmit: function(formId) {
			forms[formId].onSubmit();
			return this;
		},

		addForm: function() {
			var formId = arguments[0];
			if (YAHOO.lang.isUndefined(forms[formId])) {
				forms[formId] = new YAHOO.MultiLanguage.Form({'form':formId, 'languages':languages});
			}

			return this;
		},

		addField: function() {
			var element = YAHOO.util.Dom.get(arguments[0].id);
			var formId = YAHOO.util.Dom.getAttribute(element.form, 'id');
			if (!forms[formId]) {
				forms[formId] = new YAHOO.MultiLanguage.Form({'form':formId, 'languages':languages});
			}

			forms[formId].addField(element, arguments[0].type);
			return this;
		}
	}
}();

YAHOO.MultiLanguage.Form = function(){
	this.languages = {},
	this.fields = {},
	this.form = null;

	YAHOO.lang.augmentObject(this, arguments[0] || {},true);
	YAHOO.util.Event.onDOMReady(function(){
		YAHOO.util.Event.on(this.form, 'submit', this.onSubmit, this, true);
	}, this, true);
}

YAHOO.MultiLanguage.Form.prototype = {
	init : function() {
		for (var i in this.fields) {
			// Без этого не работает инициализация FCKEditor
			this.fields[i].field = YAHOO.util.Dom.get(i);
			this.fields[i].init();
		}
	},

	addField : function() {
		var element = arguments[0];
		var type = arguments[1];
        var id = element.id;
		this.fields[id] = new YAHOO.MultiLanguage.FormField({'field': element, 'languages': this.languages, 'type' : type});
	},

	getFields : function() {
		return this.fields;
	},

	onSubmit : function(e) {
		for(var i in this.fields){
			this.fields[i].onSubmit();
		}
	}
};

YAHOO.MultiLanguage.FormField = function(){
	this.languages = {},
	this.langButtons = {},
	this.values = {},
	this.field = null,
	this.editor = null;

	YAHOO.lang.augmentObject(this, arguments[0] || {}, true);
	YAHOO.util.Event.onDOMReady(this.init, this, true);
};

YAHOO.MultiLanguage.FormField.prototype = {
	td: null,
	semafore: true,

	init : function() {
		this.semafore = true;

		for (var i in this.languages) {
			var regular = new RegExp(".*?" + i + ":((\n|\r|.)*?)(\\|\\|)","im");
			var value = this.field.value.match(regular);
			if (!value) {
				// костылька
				regular = new RegExp(".*?" + i + ":((\n|\r|.)*)(?:$)","im");
				value = this.field.value.match(regular);
			}
			if (value) {
				this.values[i] = value[1];
			} else {
				if (this.languages[i] == true) {
					this.values[i] = this.field.value;
				} else {
					this.values[i] = '';
				}
			}
		}

		this.td = this.field.parentNode;
		this.createField();
	},

	createField : function() {
		switch(this.type){
			case 'text':
				this.createTextField();
				break;
			case 'FCKeditor':
				this.createTextArea();
				break;
		}
	},

	createTextField : function() {
		YAHOO.util.Dom.setStyle(this.field, 'float', 'left');
		this.defLang = this.getDefLang();
		this.field.value = this.getValue(this.defLang);
		this.createLangSelector();
	},

	createTextArea:function(){
		YAHOO.util.Dom.setStyle(this.field, 'float','left');
		this.defLang = this.getDefLang();
		this.field.value = this.getValue(this.defLang);
		this.createLangSelector();
	},

	createLangSelector:function(){
		var bDiv = document.createElement('div');
		bDiv.id = 'langButtons_' + this.field.id;
		this.td.appendChild(bDiv);
		this.langButtons = new YAHOO.widget.ButtonGroup({id:'buttonGroup_' + this.field.id, container:bDiv});
		this.langButtons.subscribe('beforeCheckedButtonChange', this._onBeforeChangeLang, this, true);
		this.langButtons.subscribe('checkedButtonChange', this._onChangeLang, this, true);
		for (var i in this.languages) {
			this.langButtons.addButton({ label: i, value: i, checked: (this.languages[i] ? true : false) });
		}

		if (this.type == 'FCKeditor') {
			var oFCKeditor = new FCKeditor(this.field.id);
			oFCKeditor.BasePath = '/js/fckeditor/' ;
			oFCKeditor.Width = '100%';
			oFCKeditor.Height = '500';
			oFCKeditor.ReplaceTextarea();

			this.editor = FCKeditorAPI.GetInstance(this.field.id);
		}
	},

	_onChangeLang:function(){
		var langButton = this.langButtons.get('checkedButton');
		if (langButton) {
			switch(this.type){
				case 'text':
					this.field.value = this.getValue(langButton._configs.value.value);
					this.field.focus();
					break;
				case 'FCKeditor':
					//if (!this.editor) {
						this.editor = FCKeditorAPI.GetInstance(this.field.id);
					//}
					if (this.editor) {
						this.editor.SetData(this.getValue(langButton._configs.value.value));
					}
					break;
			}
		}
	},

	_onBeforeChangeLang:function(){
		var langButton = this.langButtons.get('checkedButton');
		if (langButton) {
			switch(this.type){
				case 'text':
					this.values[langButton._configs.value.value] = this.field.value;
					break;
				case 'FCKeditor':
					//if (!this.editor) {
						this.editor = FCKeditorAPI.GetInstance(this.field.id);
					//}

					if (this.editor) {
						this.values[langButton._configs.value.value] = this.editor.GetXHTML();
					}
					break;
			}
		}
	},

	getDefLang : function() {
		for (var i in this.languages) {
			if (this.languages[i] == true) {
				return i;
			}
		}
	},

	getValue:function(lang){
		return this.values[lang];
	},

	onSubmit: function() {
		if (this.semafore == true) {
			this.semafore = false;
			this._onBeforeChangeLang();

			var val = new Array();
            var flag = false;
			for (var i in this.languages) {
				if (YAHOO.lang.trim(this.values[i]) != '') {
					flag = true;
				}
			}

			if (flag) {
				for (var i in this.languages) {
					val[val.length] = i + ':' + this.values[i];
				}
			}

			if (this.type == 'FCKeditor') {
				var sender = document.createElement('textarea');
				this.td.appendChild(sender);
				sender.name = this.field.name;
				sender.value = val.join('||');
			} else {
				this.field.value = val.join('||');
			}
		}
	}
};

