/**
 * @author ADLN
 */
var Editor = new Class({

	Implements: [Options, Events],

	options: {
	},

	initialize: function(element, options)
	{
		this.element = $(element);
		if (this.element.tagName != 'TEXTAREA')
		{
			alert('Incorrect element type.');
			return;
		}
		this.setOptions(options);
	},

	getCursor: function()
	{
		var result = {start: 0, end: 0};
		if (this.element.setSelectionRange)
		{
			result.start = this.element.selectionStart;
			result.end = this.element.selectionEnd;
		}
		else if (!document.selection)
		{
			return false;
		}
		else if (document.selection && document.selection.createRange)
		{
			var range = document.selection.createRange();
			var stored_range = range.duplicate();
			stored_range.moveToElementText(this.element);
			stored_range.setEndPoint('EndToEnd', range);
			result.start = stored_range.text.length - range.text.length;
			result.end = result.start + range.text.length;
		}
		return result;
	},

	setCursor: function(start, end)
	{
		if (this.element.createTextRange)
		{
			var range = this.element.createTextRange();
			range.move("character", start);
			range.select();
		}
		else if (this.element.selectionStart)
		{
			this.element.setSelectionRange(start, end);
		}
	},

	insertTag: function(startTag, endTag)
	{
		this.element.focus();

		var scrtop = this.element.scrollTop;

		var cursorPos = this.getCursor();
		var txt_pre = this.element.value.substring(0, cursorPos.start);
		var txt_sel = this.element.value.substring(cursorPos.start, cursorPos.end);
		var txt_aft = this.element.value.substring(cursorPos.end);

		if (cursorPos.start == cursorPos.end)
		{
			var nuCursorPos = cursorPos.start + startTag.length;
		}
		else
		{
			var nuCursorPos = String(txt_pre + startTag + txt_sel + endTag).length;
		}
		this.element.value = txt_pre + startTag + txt_sel + endTag + txt_aft;
		this.setCursor(nuCursorPos,nuCursorPos);

		if (scrtop) this.element.scrollTop = scrtop;
	},

	tag: function(tagName)
	{
		var startTag = '<' + tagName + '>';
		var endTag = '</' + tagName + '>';
		this.insertTag(startTag, endTag);
		return false;
	},

	finder: function(type)
	{
		var popup = window.open('/admin/attaches/index/type:' + type + '/', 'finder', 'width=550,height=600,scrollbars=yes');
		popup.focus();
	},

	image: function(id)
	{
		if (id)
		{
			this.insertTag('[img]' + id + '[/img]', '');
		}
	},

	generic: function(id)
	{
		if (id)
		{
			this.insertTag('[file]' + id + '[/file]', '');
		}
	},

	link: function()
	{
		var href = prompt('Óêàæèòå ññûëêó', 'http://');
		if (href)
		{
			this.insertTag('<a href="' + href + '">', '</a>');
		}
	}

});




