// Script main.js must be implemented before using this script
var selection = null;
var object = null;
var selectStart = 0;
var selectEnd = 0;
var noSelection = 0;
var oldRange = null;

var bbStartTags = Array();
var bbEndTags = Array();

// Bold font style
bbStartTags['bold'] 		=		'b';
//bbEndTags['bold'] 			=		'b';

// Italic font stile
bbStartTags['italic']		=		'i';
//bbEndTags['italic']			=		'i';

// Underline style
bbStartTags['underline']		=		'u';
//bbEndTags['underline']			=		'[/u]';

// Striketrough font style
bbStartTags['striketrough']		=		's';
//bbEndTags['striketrough']			=		'[/s]';

// Align left
bbStartTags['alignLeft']		=		'left';
//bbEndTags['alignLeft']			=		'[/left]';

// Align center
bbStartTags['alignCenter']		=		'center';
//bbEndTags['alignCenter']		=		'[/center]';

// Align right
bbStartTags['alignRight']		=		'right';
//bbEndTags['alignRight']			=		'[/right]';

// Align justify
bbStartTags['alignJustify']		=		'justify';
//bbEndTags['alignJustify']			=		'[/justify]';

// Link
bbStartTags['link']			=		'url';
//bbEndTags['link']			=		'url';

// Image
bbStartTags['image']		=		'img';
//bbEndTags['image']			=		'/img';

// E-mail
bbStartTags['mail']			=		'email';
//bbEndTags['mail']			=		'email';

// Quotes
bbStartTags['quote']		=		'quote';
//bbEndTags['quote']			=		'justify';

// Code
bbStartTags['code']			=		'code';
//bbEndTags['code']			=		'[/code]';

// If tag was opened there will be true variable in special index of array
var OpenTags = Array;

// Register textarea object, where all changes will be supplied
function bbRegisterObject(name)
{
	if (name === "")
		return false;
		
	if (document.all)
		eval("object = document.all."+name);
	else if (document.getElementById)
		eval("object = document.getElementById('"+name+"')");
	else
		return false;
}

// Getting selected area of text
function bbGetSelected()
{
	if (!object)
		return false;
	else
		object.focus();
		
	if (window.getSelection)
	{
		if (window.getSelection && document.selection)
		{
			var selectionInner = window.getSelection();
		
			selection = selectionInner;
		
			var range = document.selection.createRange();
			
			if (range.text == "")
				noSelection = 1;
			
			return range;
		}
		
		if (!object)
			return false;
		
		selectStart = object.selectionStart;
		selectEnd = object.selectionEnd;
		if (selectStart == selectEnd)
			noSelection = 1;
	}
	else if (document.getSelection)
	{
		var selection = document.getSelection();
		//var range = document.selection.createRange();
		return selection;
	}
	else if (document.selection)
	{
		var range = document.selection.createRange();
		
		if (range)
			if (range.text == "")
				noSelection = 1;
		return range;
	}
	else
		return false;
}

// IE optimized linker
function getLinkIE(promptText, defValue, linkField, parent)
{
	if (browser != "ie")
		return false;
	
	var link = prompt(promptText, defValue);
	if (!link)
		return false;
		
	setValue(name, link);
	
	noSelectShowLink(linkField, parent);
}

// Changing selected text or inserting tags in non-selected area
function bbSetSelectionChange(name, completedTag, replaceName, replaceText)
{
	if (selection === null)
		return false;
	
	if (replaceName)
	{
		var specialEndTag = bbStartTags[name];
		
		bbStartTags[name] = replaceName;
	}
	
	if (bbStartTags[name])
	{
		if (!(selectStart & selectEnd))
		{
			// If tag is completed type or some text was selected
			if (selection && selection.text.length != 0 || completedTag)
			{
				var startTag = '[' + bbStartTags[name] + ']';
				var endTag = '[/' + bbStartTags[name] + ']';
				
				var selectLen = selection.text.length;
				var tagTitle = selection.text;
				if (specialEndTag)
					endTag = '[/' + specialEndTag + ']';
				if (replaceText && selection.text.length == 0)
					var tagTitle = replaceText;
					
				selection.text = startTag + tagTitle + endTag;
				
				var range = document.selection.createRange();
				
				if (document.all)
				{					
					range.moveStart('character', startTag.length);
					range.moveEnd('character', (-1) * endTag.length);
					range.select();
					
					if (range.text === "")
					{
						range.moveStart('character', 1 + startTag.length);
						range.moveEnd('character', tagTitle.length);
					}
					range.select();
				}
				else if (document.getElementById)
				{
					range.move('character', (-1) * (endTag.length + selectLen));
					range.moveEnd('character', (-1) * endTag.length);
					range.select();
				}
			}
			else
			{
				if (OpenTags[bbStartTags[name]] == 1)
				{
					selection.text = '[/' + bbStartTags[name] + ']';
					OpenTags[bbStartTags[name]] = 0;
				}
				else
				{
					selection.text = '[' + bbStartTags[name] + ']';
					OpenTags[bbStartTags[name]] = 1;
				}
			}
		}
		// Mozilla edition
		else
		{
			// For selected area
			if (selectStart !== selectEnd)
			{
				var startValue = object.value.substr(0, selectEnd - (selectEnd - selectStart));
				var endValue = object.value.substr(selectEnd);
				
				var replaced = object.value.substr(selectStart, selectEnd - selectStart);
				var bbStartCode = '[' + bbStartTags[name] + ']';
				var bbEndCode = '[/' + bbStartTags[name] + ']';
				var replacedLen = replaced.length;
			
				if (specialEndTag)
					bbEndCode = '[/' + specialEndTag + ']';
			
				replaced = bbStartCode + replaced + bbEndCode;
			
				object.value = startValue + replaced + endValue;
				object.setSelectionRange(startValue.length + bbStartCode.length, startValue.length + bbStartCode.length + replacedLen);
				selectStart = 0;
				selectEnd = 0;
				return true;
			}
			// For non-selected area
			else
			{
				var startValue = object.value.substr(0, selectStart);
				var endValue = object.value.substr(selectEnd);
				// Fix open tags
				if (OpenTags[bbStartTags[name]] == 1)
				{
					var bbCode = '[/' + bbStartTags[name] + ']';
					OpenTags[bbStartTags[name]] = 0;
				}
				else
				{
					var bbCode = '[' + bbStartTags[name] + ']';
					OpenTags[bbStartTags[name]] = 1;
				}
				
				if (specialEndTag)
					endValue = specialEndTag;
				
				object.value = startValue + bbCode + endValue;
				
				object.setSelectionRange(selectStart + bbCode.length, selectStart + bbCode.length);
				
				return true;
			}
		}
	}
	else
		return false;
}

// Inserting simple tag (such as [b][/b], [i][/i], etc.)
function bbSimple(bbName)
{
	if (bbName === "")
		return false;
		
	selection = bbGetSelected();
	bbSetSelectionChange(bbName);
}

// If no selected area then do switching images
// Images switching (main.js) is function that switched image source of object between two images
function noSelectSetImage(Item, ImageSource, ImageSource2)
{
	if (noSelection == 1)
	{
		switch_image(Item, ImageSource, ImageSource2);
		noSelection = 0;
	}
	else
		return false;
}

function bbSetLink(link, linkName)
{
	selection = bbGetSelected();
	
	var link = getObject(link);
	var linkName = getObject(linkName);
	
	if (!link)
		return false;
	
	link = link.value;
	if (linkName)
		linkName = linkName.value;
	if (link === "")
		return false;
	
	link = 'url=' + link;
	
	bbSetSelectionChange('link', 1, link, linkName);
	return false;
}

function bbSetMail(mail)
{
	selection = bbGetSelected();
	
	if (selection && selection.text)
	{
		bbSimple('mail');
		return true;
	}
	
	var mail = getObject(mail);
	
	if (!mail)
		return false;
	
	mail = mail.value;
	
	if (mail === "")
		return false;
	
	bbSetSelectionChange('mail', 1, 'email', mail);
	return false;
}

function noSelectShowLink(name, parent, promptText, promptDef)
{
	selection = bbGetSelected();
	
	if (!promptText)
		var promptText = '';
		
	if (!promptDef)
		var promptDef = '';
	
	if (!selection || !parent)
	{
		if (browser == "ie")
		{
			var link = prompt(promptText, promptDef);
			setValue(link, parent);
			bbSetLink(parent);
		}
		else
			show(name);
	}
	else if (selection.text.length == 0)
	{
		if (browser == "ie")
		{
			var link = prompt(promptText, promptDef);
			setValue(link, parent);
			bbSetLink(parent);
		}
		else
			show(name);
	}
	else
	{
		bbSetLink(parent);
		return true;
	}
}


function checkSelectShow(name, parent)
{
	selection = bbGetSelected();
	if (!selection || !parent)
	{
		show_or_hide(name);
		return false;
	}
	else if (selection.text.length == 0)
	{
		show_or_hide(name);
		return false;
	}
	else
		return true;
}

function noSelectShowImage(name, parent)
{
	if (checkSelectShow(name, parent))
	{
		bbSimple('image');
		return true;
	}
}

function bbSetImage(image)
{
	if (!image)
		return false;
		
	image = getObject(image);
	
	bbSetSelectionChange('image', 1, 'img', image.value);
}

function noSelectShowMail(name, parent)
{
	if (checkSelectShow(name, parent))
	{
		bbSetMail(parent);
		return true;
	}
	else
		return false;
	
}

function bbHtmlSetValue(Item)
{
	Item = getObject(Item);
	
	if (Item.value == 1)
		setValue(Item, 0);
	else
		setValue(Item, 1);
}