// Textarea object
var bbObject = null;
// Start of selection in editor
var bbSelectionStart = -1;
// End of selection in editor
var bbSelectionEnd = -1;
// Range object
var bbRange = null;
// Nothing is selected
var bbNoSelection = 0;
// Text before selection
var bbBeforeSelection = '';
// Text after selection
var bbAfterSelection = '';
// Selected text
var bbSelectionText = '';

// BB Codes
var bbBoldClicked = 0;
var bbItalicClicked = 0;
var bbUnderlineClicked = 0;
var bbStreightlineClicked = 0;
var bbSubClicked = 0;
var bbSupClicked = 0;
var bbCodeClicked = 0;
var bbQuoteClicked = 0;
var bbIndentClicked = 0;
var bbLeftClicked = 0;
var bbCenterClicked = 0;
var bbRightClicked = 0;
var bbJustifyClicked = 0;
var SpoilerClicked = 0;
var AcronymClicked = 0;

var tempObj = null;

function tempFunc()
{
	tempObj = getObject("omg");
}

function bbRegisterObject(obj)
{
	if (!obj)
		return;
		
	bbObject = getObject(obj);
	
	tempFunc();
	return true;
}

function bbGetSelection()
{
	if (!bbObject)
		return;
		
	bbObject.focus();
	
	bbNoSelection = 0;
	bbBeforeSelection = '';
	bbAfterSelection = '';
	
	if (window.getSelection)
	{
		// Opera
		if (document.selection)
		{
			//bbObject.innerHTML = bbObject.value;
			var innerHTML = bbObject.value;
			select = document.selection.createRange();
			
			bbRange = select;
			
			// Remember start and end of selections
			bbSelectionStart = bbObject.selectionStart;
			bbSelectionEnd = bbObject.selectionEnd;
			
			// If start and end are equal so there is no selection
			if (bbSelectionStart == bbSelectionEnd)
			{
				bbNoSelection = 1;
				bbBeforeSelection = innerHTML.substr(0, bbSelectionStart);
				bbAfterSelection = innerHTML.substr(bbSelectionEnd, (innerHTML.length - bbSelectionEnd));
				bbSelectionText = "";
			}
			else
			{
				bbBeforeSelection = innerHTML.substr(0, bbSelectionStart);
				bbAfterSelection = innerHTML.substr(bbSelectionEnd, (innerHTML.length - bbSelectionEnd));
				bbSelectionText = innerHTML.substr(bbSelectionStart, bbSelectionEnd - bbSelectionStart);
			}
		}
		// Google Chrome & Apple Safari & Mozilla
		else
		{
			select = window.getSelection();
			
			if (select.getRangeAt)
			{
				var range = select.getRangeAt(0);
				
				bbRange = range;
				
				bbSelectionStart = bbObject.selectionStart;
				bbSelectionEnd = bbObject.selectionEnd;
				
				bbBeforeSelection = bbObject.innerHTML.substr(0, bbObject.selectionStart);
				bbAfterSelection = bbObject.innerHTML.substr(bbObject.selectionEnd);
				bbSelectionText = bbObject.innerHTML.substr(bbObject.selectionStart, bbObject.selectionEnd - bbObject.selectionStart);
				
				if (bbSelectionText == "")
					bbNoSelection = 1;
			}
		}
	}
	// IE
	else if (document.selection)
	{
		var select = document.selection.createRange();
		
		bbRange = select;
		
		bbSelectionText = select.text;
		
		if (bbSelectionText == "")
			bbNoSelection = 1;
		
		var counter = 0;
		
		var htmlText = htmlspecialchars(select.text);
		
		var startSelectionLength = select.text.length;
		
		while (bbObject.innerHTML.substr(0, htmlText.length) != htmlText && counter <= bbObject.innerHTML.length)
		{
			counter++;
			select.moveStart('character', -1);
			
			htmlText = htmlspecialchars(select.text);
			
		}
		
		bbBeforeSelection = bbObject.innerHTML.substr(0, htmlText.length - startSelectionLength);
		
		for (var i = 0; i < counter; i++)
		{
			select.moveStart('character', 1);
		}
		
		select.select();
		
		var endMinusLength = bbBeforeSelection.length + select.text.length;
		
		bbAfterSelection = bbObject.innerHTML.substr(endMinusLength);
		
		bbSelectionStart = bbBeforeSelection.length;
		bbSelectionEnd = bbAfterSelection.length;
	}
	
	bbRange = select;
}

function bbResetRange(tagsLength)
{
	if (!tagsLength)
		tagsLength = 0;

	// Opera
	if (bbRange.move && !bbRange.moveEnd)
	{
		bbRange.moveEnd('character', tagsLength);
		bbRange.select();
	}
	else if (bbObject.setSelectionRange)
	{
		bbObject.setSelectionRange(bbSelectionStart, bbSelectionEnd + tagsLength);
	}
	else if (bbRange.moveEnd)
	{
		bbRange.moveStart('character', 1 * bbSelectionStart);
		bbRange.moveEnd('character', -1 * bbSelectionEnd);
		bbRange.select();
	}
}

// PERSONAL BB CODES //
function bbBold()
{
	bbGetSelection();
	if (bbSelectionText != "")
	{
		bbObject.value = bbBeforeSelection + '[b]' + bbSelectionText + '[/b]' + bbAfterSelection;
		bbObject.innerHTML = bbBeforeSelection + '[b]' + bbSelectionText + '[/b]' + bbAfterSelection;
		bbResetRange(7);
	}
	else
	{
		if (bbBoldClicked == 0)
		{
			bbObject.value = bbBeforeSelection + '[b]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[b]' + bbAfterSelection;
			bbBoldClicked = 1;
			bbResetRange(3);
		}
		else
		{
			bbObject.value = bbBeforeSelection + '[/b]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[/b]' + bbAfterSelection;
			bbBoldClicked = 0;
			bbResetRange(4);
		}
	}
	
	return false;
}

function bbItalic()
{
	bbGetSelection();
	if (bbSelectionText != "")
	{
		bbObject.value = bbBeforeSelection + '[i]' + bbSelectionText + '[/i]' + bbAfterSelection;
		bbObject.innerHTML = bbBeforeSelection + '[i]' + bbSelectionText + '[/i]' + bbAfterSelection;
		bbResetRange(7);
	}
	else
	{
		if (bbItalicClicked == 0)
		{
			bbObject.value = bbBeforeSelection + '[i]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[i]' + bbAfterSelection;
			bbItalicClicked = 1;
			bbResetRange(3);
		}
		else
		{
			bbObject.value = bbBeforeSelection + '[/i]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[/i]' + bbAfterSelection;
			bbItalicClicked = 0;
			bbResetRange(4);
		}
	}
		
	return false;
}

function bbUnderline()
{
	bbGetSelection();
	if (bbSelectionText != "")
	{
		bbObject.value = bbBeforeSelection + '[u]' + bbSelectionText + '[/u]' + bbAfterSelection;
		bbObject.innerHTML = bbBeforeSelection + '[u]' + bbSelectionText + '[/u]' + bbAfterSelection;
		bbResetRange(7);
	}
	else
	{
		if (bbUnderlineClicked == 0)
		{
			bbObject.value = bbBeforeSelection + '[u]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[u]' + bbAfterSelection;
			bbUnderlineClicked = 1;
			bbResetRange(3);
		}
		else
		{
			bbObject.value = bbBeforeSelection + '[/u]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[/u]' + bbAfterSelection;
			bbUnderlineClicked = 0;
			bbResetRange(4);
		}
	}
		
	return false;
}

function bbStreightline()
{
	bbGetSelection();
	if (bbSelectionText != "")
	{
		bbObject.value = bbBeforeSelection + '[s]' + bbSelectionText + '[/s]' + bbAfterSelection;
		bbObject.innerHTML = bbBeforeSelection + '[s]' + bbSelectionText + '[/s]' + bbAfterSelection;
		bbResetRange(7);
	}
	else
	{
		if (bbStreightlineClicked == 0)
		{
			bbObject.value = bbBeforeSelection + '[s]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[s]' + bbAfterSelection;
			bbStreightlineClicked = 1;
			bbResetRange(3);
		}
		else
		{
			bbObject.value = bbBeforeSelection + '[/s]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[/s]' + bbAfterSelection;
			bbStreightlineClicked = 0;
			bbResetRange(4);
		}
	}
		
	return false;
}

function bbSub()
{
	bbGetSelection();
	if (bbSelectionText != "")
	{
		bbObject.value = bbBeforeSelection + '[sub]' + bbSelectionText + '[/sub]' + bbAfterSelection;
		bbObject.innerHTML = bbBeforeSelection + '[sub]' + bbSelectionText + '[/sub]' + bbAfterSelection;
		bbResetRange(11);
	}
	else
	{
		if (bbSubClicked == 0)
		{
			bbObject.value = bbBeforeSelection + '[sub]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[sub]' + bbAfterSelection;
			bbSubClicked = 1;
			bbResetRange(5);
		}
		else
		{
			bbObject.value = bbBeforeSelection + '[/sub]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[/sub]' + bbAfterSelection;
			bbSubClicked = 0;
			bbResetRange(6);
		}
	}
		
	return false;
}

function bbSup()
{
	bbGetSelection();
	if (bbSelectionText != "")
	{
		bbObject.value = bbBeforeSelection + '[sup]' + bbSelectionText + '[/sup]' + bbAfterSelection;
		bbObject.innerHTML = bbBeforeSelection + '[sup]' + bbSelectionText + '[/sup]' + bbAfterSelection;
		bbResetRange(11);
	}
	else
	{
		if (bbSupClicked == 0)
		{
			bbObject.value = bbBeforeSelection + '[sup]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[sup]' + bbAfterSelection;
			bbSupClicked = 1;
			bbResetRange(5);
		}
		else
		{
			bbObject.value = bbBeforeSelection + '[/sup]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[/sup]' + bbAfterSelection;
			bbSupClicked = 0;
			bbResetRange(6);
		}
	}
		
	return false;
}

function bbCode()
{
	bbGetSelection();
	if (bbSelectionText != "")
	{
		bbObject.value = bbBeforeSelection + '[code]' + bbSelectionText + '[/code]' + bbAfterSelection;
		bbObject.innerHTML = bbBeforeSelection + '[code]' + bbSelectionText + '[/code]' + bbAfterSelection;
		bbResetRange(13);
	}
	else
	{
		if (bbCodeClicked == 0)
		{
			bbObject.value = bbBeforeSelection + '[code]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[code]' + bbAfterSelection;
			bbCodeClicked = 1;
			bbResetRange(6);
		}
		else
		{
			bbObject.value = bbBeforeSelection + '[/code]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[/code]' + bbAfterSelection;
			bbCodeClicked = 0;
			bbResetRange(7);
		}
	}
		
	return false;
}

function bbQuote(nameMessage)
{
	if (!nameMessage)
		nameMessage = "Type the name of author below:";
		
	bbGetSelection();
	if (bbSelectionText != "")
	{
		var name = prompt(nameMessage, "");
		
		bbObject.value = bbBeforeSelection + '[quote="' + name + '"]' + bbSelectionText + '[/quote]' + bbAfterSelection;
		bbObject.innerHTML = bbBeforeSelection + '[quote="' + name + '"]' + bbSelectionText + '[/quote]' + bbAfterSelection;
		bbResetRange(18 + name.length);
	}
	else
	{
		if (bbQuoteClicked == 0)
		{
			var name = prompt(nameMessage, "");
			
			bbObject.value = bbBeforeSelection + '[quote="' + name + '"]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[quote="' + name + '"]' + bbAfterSelection;
			bbQuoteClicked = 1;
			bbResetRange(10 + name.length);
		}
		else
		{
			bbObject.value = bbBeforeSelection + '[/quote]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[/quote]' + bbAfterSelection;
			bbQuoteClicked = 0;
			bbResetRange(11 + name.length);
		}
	}
		
	return false;
}

function bbImage(promptMessage)
{
	if (!promptMessage)
		promptMessage = "Type image adress below:";
		
	bbGetSelection();
	if (bbSelectionText != "")
	{
		bbObject.value = bbBeforeSelection + '[img]' + bbSelectionText + '[/img]' + bbAfterSelection;
		bbObject.innerHTML = bbBeforeSelection + '[img]' + bbSelectionText + '[/img]' + bbAfterSelection;
		bbResetRange(11);
	}
	else
	{
		var link = prompt(promptMessage, 'http://');
		
		if (!link || link == "" || link == "http://")
			return false;
			
		bbObject.value = bbBeforeSelection + '[img]' + link + '[/img]' + bbAfterSelection;
		bbObject.innerHTML = bbBeforeSelection + '[img]' + link + '[/img]' + bbAfterSelection;
		bbResetRange(11 + link.length);
	}
		
	return false;
}

function bbIndent()
{
	bbGetSelection();
	if (bbSelectionText != "")
	{
		bbObject.value = bbBeforeSelection + '[indent]' + bbSelectionText + '[/indent]' + bbAfterSelection;
		bbObject.innerHTML = bbBeforeSelection + '[indent]' + bbSelectionText + '[/indent]' + bbAfterSelection;
		bbResetRange(17);
	}
	else
	{
		if (bbIndentClicked == 0)
		{
			bbObject.value = bbBeforeSelection + '[indent]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[indent]' + bbAfterSelection;
			bbIndentClicked = 1;
			bbResetRange(8);
		}
		else
		{
			bbObject.value = bbBeforeSelection + '[/indent]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[/indent]' + bbAfterSelection;
			bbIndentClicked = 0;
			bbResetRange(9);
		}
	}
		
	return false;
}

function bbLeft()
{
	bbGetSelection();
	if (bbSelectionText != "")
	{
		bbObject.value = bbBeforeSelection + '[left]' + bbSelectionText + '[/left]' + bbAfterSelection;
		bbObject.innerHTML = bbBeforeSelection + '[left]' + bbSelectionText + '[/left]' + bbAfterSelection;
		bbResetRange(13);
	}
	else
	{
		if (bbLeftClicked == 0)
		{
			bbObject.value = bbBeforeSelection + '[left]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[left]' + bbAfterSelection;
			bbLeftClicked = 1;
			bbResetRange(6);
		}
		else
		{
			bbObject.value = bbBeforeSelection + '[/left]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[/left]' + bbAfterSelection;
			bbLeftClicked = 0;
			bbResetRange(7);
		}
	}
		
	return false;
}

function bbCenter()
{
	bbGetSelection();
	if (bbSelectionText != "")
	{
		bbObject.value = bbBeforeSelection + '[center]' + bbSelectionText + '[/center]' + bbAfterSelection;
		bbObject.innerHTML = bbBeforeSelection + '[center]' + bbSelectionText + '[/center]' + bbAfterSelection;
		bbResetRange(17);
	}
	else
	{
		if (bbCenterClicked == 0)
		{
			bbObject.value = bbBeforeSelection + '[center]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[center]' + bbAfterSelection;
			bbCenterClicked = 1;
			bbResetRange(8);
		}
		else
		{
			bbObject.value = bbBeforeSelection + '[/center]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[/center]' + bbAfterSelection;
			bbCenterClicked = 0;
			bbResetRange(9);
		}
	}
		
	return false;
}

function bbRight()
{
	bbGetSelection();
	if (bbSelectionText != "")
	{
		bbObject.value = bbBeforeSelection + '[right]' + bbSelectionText + '[/right]' + bbAfterSelection;
		bbObject.innerHTML = bbBeforeSelection + '[right]' + bbSelectionText + '[/right]' + bbAfterSelection;
		bbResetRange(15);
	}
	else
	{
		if (bbRightClicked == 0)
		{
			bbObject.value = bbBeforeSelection + '[right]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[right]' + bbAfterSelection;
			bbRightClicked = 1;
			bbResetRange(7);
		}
		else
		{
			bbObject.value = bbBeforeSelection + '[/right]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[/right]' + bbAfterSelection;
			bbRightClicked = 0;
			bbResetRange(8);
		}
	}
		
	return false;
}

function bbJustify()
{
	bbGetSelection();
	if (bbSelectionText != "")
	{
		bbObject.value = bbBeforeSelection + '[justify]' + bbSelectionText + '[/justify]' + bbAfterSelection;
		bbObject.innerHTML = bbBeforeSelection + '[justify]' + bbSelectionText + '[/justify]' + bbAfterSelection;
		bbResetRange(19);
	}
	else
	{
		if (bbJustifyClicked == 0)
		{
			bbObject.value = bbBeforeSelection + '[justify]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[justify]' + bbAfterSelection;
			bbJustifyClicked = 1;
			bbResetRange(9);
		}
		else
		{
			bbObject.value = bbBeforeSelection + '[/justify]' + bbAfterSelection;
			bbObject.innerHTML = bbBeforeSelection + '[/justify]' + bbAfterSelection;
			bbJustifyClicked = 0;
			bbResetRange(10);
		}
	}
		
	return false;
}

function bbLink(linkMessage, nameMessage)
{
	if (!linkMessage)
		linkMessage = "Type link below:";
	if (!nameMessage)
		nameMessage = "Type name for the link below:";
		
	bbGetSelection();
	if (bbSelectionText != "")
	{
		var link = prompt(linkMessage, "http://");
		
		if (!link || link == "http://" || link == "")
			return false;
			
		bbObject.value = bbBeforeSelection + '[url="' + link + '"]' + bbSelectionText + '[/url]' + bbAfterSelection;
		bbObject.innerHTML = bbBeforeSelection + '[url="' + link + '"]' + bbSelectionText + '[/url]' + bbAfterSelection;
		bbResetRange(14 + link.length);
	}
	else
	{
		var link = prompt(linkMessage, "http://");
		if (!link || link == "http://" || link == "")
			return false;
			
		var name = prompt(nameMessage, "");
		
		if (!name || name == "")
			return false;
			
		bbObject.value = bbBeforeSelection + '[url="' + link + '"]' + name + '[/url]' + bbAfterSelection;
		bbObject.innerHTML = bbBeforeSelection + '[url="' + link + '"]' + name + '[/url]' + bbAfterSelection;
		bbResetRange(14 + link.length + name.length);
	}
		
	return false;
}

function bbMail(mailMessage, nameMessage)
{
	if (!mailMessage)
		mailMessage = "Type a e-mail adress below:";
	if (!nameMessage)
		nameMessage = "Type e-mail owner name:";
		
	bbGetSelection();
	if (bbSelectionText != "")
	{
		var mail = prompt(mailMessage, "");
		
		if (!mail || mail == "")
			return false;
		
		bbObject.value = bbBeforeSelection + '[email="'+ mail +'"]' + bbSelectionText + '[/email]' + bbAfterSelection;
		bbObject.innerHTML = bbBeforeSelection + '[email="'+ mail +'"]' + bbSelectionText + '[/email]' + bbAfterSelection;
		bbResetRange(18 + mail.length);
	}
	else
	{
		var mail = prompt(mailMessage, "");
		
		if (!mail || mail == "")
			return false;
			
		var name = prompt(nameMessage, "");
		
		if (!name || name == "")
			return false;
			
		bbObject.value = bbBeforeSelection + '[email="'+ mail +'"]' + name + '[/email]' + bbAfterSelection;
		bbObject.innerHTML = bbBeforeSelection + '[email="'+ mail +'"]' + name + '[/email]' + bbAfterSelection;
		bbResetRange(18 + mail.length + name.length);
	}
		
	return false;
}

function bbSpoiler(textMessage)
{
	if (!textMessage)
		textMessage = "Type text you want to hide below:";
		
	bbGetSelection();
	if (bbSelectionText != "")
	{
		bbObject.value = bbBeforeSelection + '[spoiler]' + bbSelectionText + '[/spoiler]' + bbAfterSelection;
		bbObject.innerHTML = bbBeforeSelection + '[spoiler]' + bbSelectionText + '[/spoiler]' + bbAfterSelection;
		bbResetRange(19);
	}
	else
	{
		var hidden = prompt(textMessage, "");
		
		if (!hidden || hidden == "")
			return false;
			
		bbObject.value = bbBeforeSelection + '[spoiler]' + hidden + '[/spoiler]' + bbAfterSelection;
		bbObject.innerHTML = bbBeforeSelection + '[spoiler]' + hidden + '[/spoiler]' + bbAfterSelection;
		bbResetRange(19 + hidden.length);
	}
		
	return false;
}

function bbAcronym(acronymMessage, descMessage)
{
	if (!acronymMessage)
		acronymMessage = "Type acronym below:";
	if (!descMessage)
		descMessage = "Type description for acronym below:";
		
	bbGetSelection();
	if (bbSelectionText != "")
	{
		var desc = prompt(descMessage, "");
		
		if (!desc || desc == "")
			return false;
		
		bbObject.value = bbBeforeSelection + '[acronym="' + desc + '"]' + bbSelectionText + '[/acronym]' + bbAfterSelection;
		bbObject.innerHTML = bbBeforeSelection + '[acronym="' + desc + '"]' + bbSelectionText + '[/acronym]' + bbAfterSelection;
		bbResetRange(22 + desc.length);
	}
	else
	{
		
		var acro = prompt(acronymMessage, "");
		
		if (!acro || acro == "")
			return false;
		
		var desc = prompt(descMessage, "");
		
		if (!desc || desc == "")
			return false;
			
		bbObject.value = bbBeforeSelection + '[acronym="' + desc + '"]' + acro + '[/acronym]' + bbAfterSelection;
		bbObject.innerHTML = bbBeforeSelection + '[acronym="' + desc + '"]' + acro + '[/acronym]' + bbAfterSelection;
		bbResetRange(22 + desc.length + acro.length);
	}
		
	return false;
}

//~PERSONAL BB CODES~//