var bbEditObject = null;
var bbHelpObject = null;
var bbSimpleMode = 0;
var bbStack = Array();
var bbStackPos = 0;

function bbRegister(ta, sp) {
	bbEditObject=ta;
	bbHelpObject=sp;
}

function bbSetMode(m) {
	bbSimpleMode = m;
}

function bbWrite(t) {
	bbEditObject.value = bbEditObject.value + t;
}

function bbExtend(){
if(bbEditObject.style.height == ''){
	bbEditObject.style.height = '400px';
}else{
	height = parseInt(bbEditObject.style.height) + 50;
	
	bbEditObject.style.height = height + 'px';
	}
}

function bbInStack(tok) {
	for(i = 0; i < bbStackPos; i++) {
		if(bbStack[i] == tok)
			return true;
	}
	return false;
}

function bbPush(tok) {
	bbStack[bbStackPos++] = tok;
}

function bbPop(tok) {
	if(bbStackPos > 0)
		return bbStack[--bbStackPos];
	return null;
}

function bbDoTok(tok, extra, object) {
	var pop;
	if(bbGetSelected())
		bbDoSimple(tok, extra);
	else {
		if(bbInStack(tok)) {
			do {
			object.style.borderColor="#999999";
				pop = bbPop();
				doOutTok(pop);
			} while(pop != tok && pop != null);
		}
		else {
			object.style.borderColor="#333399";
			bbPush(tok);
			doInTok(tok, extra);
		}
		if(!bbSimpleMode)
			bbHelp(tok); // update count
	}
	bbEditObject.focus();
}

function doInTok(tok, extra) {
	switch(tok) {
	case "b":
		bbWrite("[b]");
		break;
	case "i":
		bbWrite("[i]");
		break;
	case "u":
		bbWrite("[u]");
		break;
	case "q":
		bbWrite("[quote]");
		break;
	case "pre":
		bbWrite("[pre]");
		break;
	case "color":
		bbWrite("[color="+extra+"]");
		break;
	case "size":
		switch(extra) {
			case "tiny": bbWrite("[sm][sm][/sm][/sm]"); break;
			case "small": bbWrite("[sm][/sm]"); break;
			case "big": bbWrite("[big][/big]"); break;
			case "huge": bbWrite("[big][big][/big][/big]"); break;
		}
	case "spoiler":
		bbWrite("[spoiler]");
		break;
	}
}

function doOutTok(tok, extra) {
	switch(tok) {
	case "b":
		bbWrite("[/b]");
		break;
	case "i":
		bbWrite("[/i]");
		break;
	case "u":
		bbWrite("[/u]");
		break;
	case "q":
		bbWrite("[/quote]");
		break;
	case "pre":
		bbWrite("[/pre]");
		break;
	case "spoiler":
		bbWrite("[/spoiler]");
		break;
	case "color":
		bbWrite("[/color]");
		break;
	default:
	}
}

function bbDoSimple(tok, extra) {
	var text1, text2;
	bbGetSelected();
	switch(tok) {
	case "b":
		bbWritePrompt("Please enter the text to be made bold.", "[b]", "[/b]", "");
		break;
	case "i":
		bbWritePrompt("Please enter the text to be made italic.", "[i]", "[/i]", "");
		break;
	case "u":
		bbWritePrompt("Please enter the text to underline.", "[u]", "[/u]", "");
		break;
	case "img":
		bbWritePrompt("Please enter the image location.", "[img]", "[/img]", "http://");
		break;
	case "@":
		bbWritePrompt("Please enter the email address.", "[email]", "[/email]", "");
		break;
	case "q":
		bbWritePrompt("Please enter the text to quote.", "[quote]", "[/quote]", "");
		break;
	case "pre":
		bbWritePrompt("Please enter the pre-formatted text.", "[pre]", "[/pre]", "");
		break;
	case "spoiler":
		bbWritePrompt("Please enter the spoiler text.", "[spoiler]", "[/spoiler]", "");
		break;		
	case "youtube":
		bbWritePrompt("Please enter the URL of the Youtube video you want to embed.", "[youtube=", "]", "");
		break;		
	case "url":
		text1 = prompt("Please enter the link url.\n[url=xxxxx][/url]", "http://");
		if(!text1)
			break;
		bbWrite("[url="+text1+"]");
		text2 = prompt("Please enter the link title.\n[url="+text1+"]xxxxx[/url]", "");
		if(!text2)
			text2=text1;
		bbWrite(text2+"[/url]");
		break;
	case "list":
		nFound = 0;
		text2="[list]\n";
		do {
			text1 = prompt("Please enter the next list item, or leave blank when finished.", "");
			if(text1) {
				text2 = text2+"[*]"+text1+"\n";
				nFound++;
			}
		} while(text1);
		text2 = text2+"[/list]";
		if(nFound)
			bbWrite(text2);
		break;
	case "color":
		bbWritePrompt("Please enter the text to colorize.", "[color="+extra+"]", "[/color]", "");
		break;
	case "size":
		switch(extra) {
			case "tiny": bbWritePrompt("Please enter the text to resize.", "[sm][sm]", "[/sm][/sm]", ""); break;
			case "small": bbWritePrompt("Please enter the text to resize.", "[sm]", "[/sm]", ""); break;
			case "big": bbWritePrompt("Please enter the text to resize.", "[big]", "[/big]", ""); break;
			case "huge": bbWritePrompt("Please enter the text to resize.", "[big][big]", "[/big][/big]", ""); break;
		}
	}
	bbEditObject.focus();
}

function bbHelp(tok) {
	switch(tok) {
	case "b":     bbShowHelp("Bold Text"); break;
	case "i":     bbShowHelp("Italic Text"); break;
	case "u":     bbShowHelp("Underlined Text"); break;
	case "img":   bbShowHelp("Image/Graphic"); break;
	case "@":     bbShowHelp("Email Link"); break;
	case "q":     bbShowHelp("Quotation"); break;
	case "pre":   bbShowHelp("Pre-formatted Text"); break;
	case "url":   bbShowHelp("Link/Url"); break;
	case "list":  bbShowHelp("List of Items"); break;
	case "color": bbShowHelp("Font Color"); break;
	case "size":  bbShowHelp("Font Size"); break;
	case "spoiler": bbShowHelp("Hides the text so as not to spoil it"); break;
	case "youtube": bbShowHelp("Embed a Youtube Video"); break;
	case "extend": bbShowHelp("Make the writable area bigger"); break;
	default: bbShowHelp("");
	}
}

function bbShowHelp(str) {

		bbHelpObject.innerHTML = str;
}

function bbWritePrompt(msg, pre, post, val) {
	var userText;
	
	userText = bbGetSelected()
	if(userText) {
		bbSetSelected(pre+userText+post);
	}
	else {
		userText = prompt(msg+"\n"+pre+"xxxxx"+post, val);
		if(userText)
			bbWrite(pre+userText+post);
	}
	return userText;
}

function bbGetSelected() {

		if ( document.selection )
		{
			var oRange = document.selection.createRange();
			return oRange.text;
		}else{
			start = bbEditObject.selectionStart;
			end = bbEditObject.selectionEnd;
			if((start >= 0) && end && start != end)
				return bbEditObject.value.substring(start, end);
			return null;
	}
}

function bbSetSelected(newStr) {

	if ( document.selection )
	{
		var oRange = bbEditObject.selection.createTextRange();
		oRange.text = '<b>' + oRange.text + '</b>';
	}else{
		start = bbEditObject.selectionStart;
		end = bbEditObject.selectionEnd;
		if((start >= 0) && end && start != end) {
			partA = bbEditObject.value.substring(0, start);
			partB = bbEditObject.value.substring(end);
		  	bbEditObject.value=partA+newStr+partB;
		}
		else
			bbEditObject.value=bbEditObject.value+newStr;
	}
}
