(function() {

	SL.ui.HTMLEditor = Class.create(SL.Component, {

		init : function() {
			this.config.setDefault('textarea', this.id + "_t");
			this.config.setDefault('toolbar', 'Basic');
			this.config.setDefault('editor', 'fck');
			this.config.setDefault('language', 'de');

			this._init.bind(this).defer();
		},

		_init : function() {

			if (this.config.get('editor') == 'mce') {
				var ta = $(this.config.get('textarea'));
				this.e.setStyle({
					visibility : 'hidden'
				});
				ta.setStyle({
					visibility : 'hidden'
				});

				setTimeout(function(e, ta) {
					if (e.getStyle('visibility') == 'hidden') {
						e.setStyle({
							visibility : 'visible'
						});
						ta.setStyle({
							visibility : 'visible'
						});
					}
				}.curry(this.e, ta), 2000);

				SL.utils.loadScript('/go/gui/_ws/mediabase/_ts_1312459638000/lib/tinymce-3.4.4/tiny_mce.js', this.initMCE.bind(this), function() {
					tinymce.dom.Event.domLoaded = true;
				});

			} else {
				this.editor = CKEDITOR.replace($(this.config.get('textarea')), {
					toolbar : this.config.get('toolbar')
				});
				this.editor.on('instanceReady', this._instanceReady.bind(this));
			}
		},

		initMCE : function() {

			console.log("Init MCE");

			var cfg = {
				mode : 'none',
				theme : 'advanced',
				skin : "o2k7",
				skin_variant : "silver",
				content_css : '/go/gui/_ws/mediabase/_ts_1311771171000/styles/tinymce.css',
				theme_advanced_toolbar_location : 'top',
				theme_advanced_toolbar_align : 'left',
				theme_advanced_statusbar_location : 'bottom',
				theme_advanced_resizing : true,
				plugins : 'safari,pagebreak,style,layer,table,advlink,emotions,inlinepopups,preview,media,searchreplace,contextmenu,paste,fullscreen,visualchars,nonbreaking,xhtmlxtras',
				theme_advanced_buttons1 : 'paste,pastetext,pasteword,|,bold,italic,underline,sub,sup,|,justifyleft,justifycenter,justifyright,justifyfull,|,bullist,numlist,|,link,unlink,charmap,cleanup,table,|,code,|,fullscreen',
				theme_advanced_buttons2 : '',
				theme_advanced_buttons3 : '',
				language : this.config.get('language'),
				extended_valid_elements : "iframe[src|width|height|name|id|class|align|style|frameborder|border|allowtransparency],script[charset|defer|language|src|type]",
				init_instance_callback : this._instanceReady.bind(this)

			/*
			 * file_browser_callback : function (field_name, url, type, win){
			 * win.document.getElementById(field_name).value = "TEST" }
			 */
			};

			if (this.config.get("toolbar") == 'Advanced') {
				cfg.theme_advanced_buttons1 = 'bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,formatselect,fontselect,fontsizeselect';
				cfg.theme_advanced_buttons2 = 'cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,code,|,insertdate,inserttime,preview,|,forecolor,backcolor';
				cfg.theme_advanced_buttons3 = 'tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,fullscreen';
			} else if (this.config.get('toolbar') == 'easy') {
				cfg.theme_advanced_statusbar_location = undefined;
				cfg.theme_advanced_buttons1 = 'pastetext,pasteword,|,bold,italic,underline,sub,sup,|,justifyleft,justifycenter,justifyright,justifyfull,|,bullist,numlist,|,link,unlink,charmap,|,code,fullscreen';
			}

			tinyMCE.init(cfg);
			tinyMCE.execCommand('mceAddControl', false, this.config.get('textarea'));
		},

		_instanceReady : function() {
			console.log("Editor ready");
			this._emitContentChanged.bind(this, true).defer();
			if (this.e.getStyle('visibility') == 'hidden') {
				setTimeout(function(e) {
					e.setOpacity(0.0);
					e.setStyle({
						visibility : 'visible'
					});
					e.appear({
						duration : 0.075
					});
				}.curry(this.e), 1);
			}
		},

		updateForPost : function() {
			try {
				if (this.config.get('editor') == 'mce') {
					tinyMCE.execCommand('mceRemoveControl', false, this.config.get('textarea'));
				} else if (this.editor) {
					this.editor.updateElement();
					this.editor.destroy();
					this.editor = undefined;
				}
			} catch (e) {
				console.log(e);
			}
		},
		
		cleanup : function() {
			this.updateForPost();
		},
	});

})();

