bb={};
bb.imageUrl='images';
bb.smiles = {};
bb.tags = [['[b]','bold.gif'],['[i]','italic.gif'],['[u]','underline.gif'],['[s]','s.gif'],['[quote]','quote.gif'],['[url]','link.gif'],['[img]','image.gif'], ['[smile]','smile.gif']];		

function bbcode(id)
{
	var menu=new Element('div', {'class': 'bbMenu', 'id':'bbMenu-'+id});
	for (var i = 0; bb.tags[i]; ++i)
	{
		if (bb.tags[i][0]=='[smile]' && !bb.smiles.length) continue;
		Element('img', {'src':bb.imageUrl+'/buttons/'+bb.tags[i][1], 'alt':bb.tags[i][0]}).inject(Element('a', {'title':bb.tags[i][0], 'tag':bb.tags[i][0], 'id':'bbtag_'+bb.tags[i][0]+'-'+id, 'events':{'click':function(){getTag(this);}}}).inject(menu));
	}
	Element('table', {'id':'smile_list-'+id, 'class':'smile_list', 'styles':{'display':'none'}}).inject(menu);
	menu.inject($(id), 'before');
	$$('body').addEvent('click', function(e){if (e.target.get('alt')!='[smile]') $$('.smile_list').setStyle('display', 'none');});
}		

function make_smileList(smile)
{
	table=$('smile_list-'+getId(smile.id));
	if (table.getStyle('display')!='none')
	{
		table.setStyle('display', 'none');
	}
	else
	{
		if (!table.get('ready'))
		{
			coord=smile.getPosition('bbMenu-'+getId(smile.id));
			table.set('ready', 'true');
			for (var i = 0; bb.smiles[i]; ++i)
			{
				tr=new Element('tr');
				for (var j = 0; bb.smiles[i][j]; ++j)
				{
					Element('img', {'src':bb.imageUrl+'/smiles/'+bb.smiles[i][j][1], 'alt':bb.smiles[i][j][0]}).inject(
					Element('a', {'title':bb.smiles[i][j][0], 'tag':bb.smiles[i][j][0], 'class':'bbsmile-'+getId(smile.id), 'events':{'click':function(){insert_smile(this);}}}).inject(
					Element('td', {'height':'20', 'width':'20'}).inject(tr)
					)
					);
				}
				tr.inject(table);
			}
			table.inject('bbMenu-'+getId(smile.id));
			table.setStyles({position:'absolute', left:(coord.x+0)+'px', top:(coord.y+20)+'px'});
		}
		table.setStyle('display', '');
	}
}

function insert_smile(smile)
{
	$('smile_list-'+getId(smile.get('class'))).setStyle('display', 'none');
	insertTag(smile.getProperty('tag'), '', getId(smile.get('class')));
}

function getId(text)
{
	return text.match(/^.+?-(.+)$/)[1];
}

function getTag(tag)
{
	title=tag.getProperty('tag');
	if (title=='[smile]') make_smileList(tag);
	else if (title=='[url]') insert_url(tag);
	else if (title=='[quote]') insert_quote('','',getId(tag.id));
	else if (title=='[img]') insert_img(tag);
	else
	{
		end=title.replace(/\[/,'[/');
		insertTag(title, end, getId(tag.id));
	}
}

function insert_img(tag)
{
	if (!isSelection(getId(tag.id)))
	{
		url=prompt("введите адрес картинки", "");
		if (!url) insertTag('[img]','[/img]', getId(tag.id));
		else insertTag('[img]'+url+'[/img]','', getId(tag.id));
	}
	else
	{
		insertTag('[img]','[/img]', getId(tag.id));
	}
}

function insert_url(tag)
{
	url=prompt("введите URL", "");
	if (!url) {insertTag('[url]','[/url]', getId(tag.id)); return true;}
	if (url && !url.match(/\//) && !url.match(/^ftp|https?:\/\//)) url='http://'+url;
	
	if (!isSelection(getId(tag.id)))
	{
		text=prompt("введите текст ссылки", "");
		if(text) url='[url="'+url+'"]'+text+'[/url]';
		else  url='[url]'+url+'[/url]';
		insertTag(url,'', getId(tag.id));
	}
	else
	{
		insertTag('[url="'+url+'"]' ,'[/url]', getId(tag.id));
	}
}

function insert_quote(text, author, textarea)
{
	if (!text) text='';
	if (author && text) insertTag('[quote="'+author+'"]'+text+'[/quote]', '', textarea);
	else insertTag('[quote]','[/quote]', textarea);
}

function insertTag(text1, text2, textarea)
{
	textarea = $(textarea);
	// Can a text range be created?
	if (typeof(textarea.caretPos) != "undefined" && textarea.createTextRange) {
		var caretPos = textarea.caretPos, temp_length = caretPos.text.length;
		caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text1 + caretPos.text + text2 + ' ' : text1 + caretPos.text + text2;

		if (temp_length == 0) {
			caretPos.moveStart("character", -text2.length);
			caretPos.moveEnd("character", -text2.length);
			caretPos.select();
		}
		else
			textarea.focus(caretPos);
	}
	// Mozilla text range wrap.
	else if (typeof(textarea.selectionStart) != "undefined") {
		var begin = textarea.value.substr(0, textarea.selectionStart);
		var selection = textarea.value.substr(textarea.selectionStart, textarea.selectionEnd - textarea.selectionStart);
		var end = textarea.value.substr(textarea.selectionEnd);
		var newCursorPos = textarea.selectionStart;
		var scrollPos = textarea.scrollTop;

		textarea.value = begin + text1 + selection + text2 + end;

		if (textarea.setSelectionRange) {
			if (selection.length == 0)
				textarea.setSelectionRange(newCursorPos + text1.length, newCursorPos + text1.length);
			else
				textarea.setSelectionRange(newCursorPos, newCursorPos + text1.length + selection.length + text2.length);
			textarea.focus();
		}
		textarea.scrollTop = scrollPos;
	}
	// Just put them on the end, then.
	else {
		textarea.value += text1 + text2;
		textarea.focus(textarea.value.length - 1);
	}
}

function isSelection(textarea)
{
	textarea = $(textarea);
	if (typeof(textarea.caretPos) != "undefined" && textarea.createTextRange)
	{
		caretPos = textarea.caretPos;
		temp_length = caretPos.text.length;
	}
	else if (typeof(textarea.selectionStart) != "undefined")
	{
		temp_length = textarea.selectionEnd - textarea.selectionStart;
	}
	
	if (temp_length) return true;
	else return false;
}