/**
* bbCode control by subBlue design [ www.subBlue.com ]
* Includes unixsafe colour palette selector by SHS`
*/

// Startup variables
var imageTag = false;
var theSelection = false;

// Check for Browser & Platform for PC & IE specific bits
// More details from: http://www.mozilla.org/docs/web-developer/sniffer/browser_type.html
var clientPC = navigator.userAgent.toLowerCase(); // Get client info
var clientVer = parseInt(navigator.appVersion); // Get browser version

var is_ie = ((clientPC.indexOf('msie') != -1) && (clientPC.indexOf('opera') == -1));
var is_win = ((clientPC.indexOf('win') != -1) || (clientPC.indexOf('16bit') != -1));

var baseHeight;
window.onload = initInsertions;

/**
* Shows the help messages in the helpline window
*/
function helpline(help)
{
        document.forms[form_name].helpbox.value = help_line[help];
}

/**
* Fix a bug involving the TextRange object. From
* http://www.frostjedi.com/terra/scripts/demo/caretBug.html
*/ 
function initInsertions() 
{
        var doc;

        if (document.forms[form_name])
        {
                doc = document;
        }
        else 
        {
                doc = opener.document;
        }

        var textarea = doc.forms[form_name].elements[text_name];
        if (is_ie && typeof(baseHeight) != 'number')
        {        
                textarea.focus();
                baseHeight = doc.selection.createRange().duplicate().boundingHeight;

                if (!document.forms[form_name])
                {
                        document.body.focus();
                }
        }
}

/**
* bbstyle
*/
function bbstyle(bbnumber)
{        
        if (bbnumber != -1)
        {
                bbfontstyle(bbtags[bbnumber], bbtags[bbnumber+1]);
        } 
        else 
        {
                insert_text('[*]');
                document.forms[form_name].elements[text_name].focus();
        }
}

/**
* Apply bbcodes
*/
function bbfontstyle(bbopen, bbclose)
{
        theSelection = false;
                
        var textarea = document.forms[form_name].elements[text_name];

        textarea.focus();

        if ((clientVer >= 4) && is_ie && is_win)
        {
                // Get text selection
                theSelection = document.selection.createRange().text;

                if (theSelection)
                {
                        // Add tags around selection
                        document.selection.createRange().text = bbopen + theSelection + bbclose;
                        document.forms[form_name].elements[text_name].focus();
                        theSelection = '';
                        return;
                }
        }
        else if (document.forms[form_name].elements[text_name].selectionEnd && (document.forms[form_name].elements[text_name].selectionEnd - document.forms[form_name].elements[text_name].selectionStart > 0))
        {
                mozWrap(document.forms[form_name].elements[text_name], bbopen, bbclose);
                document.forms[form_name].elements[text_name].focus();
                theSelection = '';
                return;
        }
        
        //The new position for the cursor after adding the bbcode
        var caret_pos = getCaretPosition(textarea).start;
        var new_pos = caret_pos + bbopen.length;

        // Open tag
        insert_text(bbopen + bbclose);

        // Center the cursor when we don't have a selection
        // Gecko and proper browsers
        if (!isNaN(textarea.selectionStart))
        {
                textarea.selectionStart = new_pos;
                textarea.selectionEnd = new_pos;
        }        
        // IE
        else if (document.selection)
        {
                var range = textarea.createTextRange(); 
                range.move("character", new_pos); 
                range.select();
                storeCaret(textarea);
        }

        textarea.focus();
        return;
}

/**
* Insert text at position
*/
function insert_text(text, spaces, popup)
{
        var textarea;
        
        if (!popup) 
        {
                textarea = document.forms[form_name].elements[text_name];
        } 
        else 
        {
                textarea = opener.document.forms[form_name].elements[text_name];
        }
        if (spaces) 
        {
                text = ' ' + text + ' ';
        }
        
        if (!isNaN(textarea.selectionStart))
        {
                var sel_start = textarea.selectionStart;
                var sel_end = textarea.selectionEnd;

                mozWrap(textarea, text, '')
                textarea.selectionStart = sel_start + text.length;
                textarea.selectionEnd = sel_end + text.length;
        }        
        
        else if (textarea.createTextRange && textarea.caretPos)
        {
                if (baseHeight != textarea.caretPos.boundingHeight) 
                {
                        textarea.focus();
                        storeCaret(textarea);
                }                
                var caret_pos = textarea.caretPos;
                caret_pos.text = caret_pos.text.charAt(caret_pos.text.length - 1) == ' ' ? caret_pos.text + text + ' ' : caret_pos.text + text;
                
        }
        else
        {
                textarea.value = textarea.value + text;
        }
        if (!popup) 
        {
                textarea.focus();
        }         

}

/**
* Add inline attachment at position
*/
function attach_inline(index, filename)
{
        insert_text('[attachment=' + index + ']' + filename + '[/attachment]');
        document.forms[form_name].elements[text_name].focus();
}

/**
* Add quote text to message
*/
function addquote(post_id, username)
{
        var message_name = 'message_' + post_id;
        var theSelection = '';
        var divarea = false;

        if (document.all)
        {
                divarea = document.all[message_name];
        }
        else
        {
                divarea = document.getElementById(message_name);
        }

        // Get text selection - not only the post content :(
        if (window.getSelection)
        {
                theSelection = window.getSelection().toString();
        }
        else if (document.getSelection)
        {
                theSelection = document.getSelection();
        }
        else if (document.selection)
        {
                theSelection = document.selection.createRange().text;
        }

        if (theSelection == '' || typeof theSelection == 'undefined' || theSelection == null)
        {
                if (divarea.innerHTML)
                {
                        theSelection = divarea.innerHTML.replace(/<br>/ig, '\n');
                        theSelection = theSelection.replace(/<br\/>/ig, '\n');
                        theSelection = theSelection.replace(/&lt\;/ig, '<');
                        theSelection = theSelection.replace(/&gt\;/ig, '>');
                        theSelection = theSelection.replace(/&amp\;/ig, '&');
                }
                else if (document.all)
                {
                        theSelection = divarea.innerText;
                }
                else if (divarea.textContent)
                {
                        theSelection = divarea.textContent;
                }
                else if (divarea.firstChild.nodeValue)
                {
                        theSelection = divarea.firstChild.nodeValue;
                }
        }

        if (theSelection)
        {
                insert_text('[quote="' + username + '"]' + theSelection + '[/quote]');
        }

        return;
}

/**
* From http://www.massless.org/mozedit/
*/
function mozWrap(txtarea, open, close)
{
        var selLength = txtarea.textLength;
        var selStart = txtarea.selectionStart;
        var selEnd = txtarea.selectionEnd;
        var scrollTop = txtarea.scrollTop;

        if (selEnd == 1 || selEnd == 2) 
        {
                selEnd = selLength;
        }

        var s1 = (txtarea.value).substring(0,selStart);
        var s2 = (txtarea.value).substring(selStart, selEnd)
        var s3 = (txtarea.value).substring(selEnd, selLength);

        txtarea.value = s1 + open + s2 + close + s3;
        txtarea.selectionStart = selEnd + open.length + close.length;
        txtarea.selectionEnd = txtarea.selectionStart;
        txtarea.focus();
        txtarea.scrollTop = scrollTop;

        return;
}

/**
* Insert at Caret position. Code from
* http://www.faqts.com/knowledge_base/view.phtml/aid/1052/fid/130
*/
function storeCaret(textEl)
{
        if (textEl.createTextRange)
        {
                textEl.caretPos = document.selection.createRange().duplicate();
        }
}

/**
* Color pallette
*/
function colorPalette(dir, width, height)
{
        var r = 0, g = 0, b = 0;
        var numberList = new Array(6);
        var color = '';

        numberList[0] = '00';
        numberList[1] = '40';
        numberList[2] = '80';
        numberList[3] = 'BF';
        numberList[4] = 'FF';

        document.writeln('<table cellspacing="1" cellpadding="0" border="0">');

	for (r = 0; r < 5; r++)
	{
		if (dir == 'h')
		{
			document.writeln('<tr>');
		}

		for (g = 0; g < 5; g++)
		{
			if (dir == 'v')
			{
				document.writeln('<tr>');
			}
			
			for (b = 0; b < 5; b++)
			{
				color = String(numberList[r]) + String(numberList[g]) + String(numberList[b]);
				document.write('<td bgcolor="#' + color + '">');
				document.write('<a href="#" onclick="bbfontstyle(\'[color=#' + color + ']\', \'[/color]\'); return false;" onmouseover="helpline(\'s\');"  onmouseout="helpline(\'tip\');"><img src="images/spacer.gif" width="' + width + '" height="' + height + '" alt="#' + color + '" title="#' + color + '" /></a>');
				document.writeln('</td>');
			}

			if (dir == 'v')
			{
				document.writeln('</tr>');
			}
		}

		if (dir == 'h')
		{
			document.writeln('</tr>');
		}
	}
	document.writeln('</table>');
}


/**
* Caret Position object
*/
function caretPosition()
{
	var start = null;
	var end = null;
}


/**
* Get the caret position in an textarea
*/
function getCaretPosition(txtarea)
{
	var caretPos = new caretPosition();
	
	// simple Gecko/Opera way
	if(txtarea.selectionStart || txtarea.selectionStart == 0)
	{
		caretPos.start = txtarea.selectionStart;
		caretPos.end = txtarea.selectionEnd;
	}
	// dirty and slow IE way
	else if(document.selection)
	{
		// get current selection
		var range = document.selection.createRange();

		// a new selection of the whole textarea
		var range_all = document.body.createTextRange();
		range_all.moveToElementText(txtarea);
		
		// calculate selection start point by moving beginning of range_all to beginning of range
		var sel_start;
		try
{

		for (sel_start = 0; range_all.compareEndPoints('StartToStart', range) < 0; sel_start++)
		{		
			range_all.moveStart('character', 1);
		}
	
		txtarea.sel_start = sel_start;
	
		// we ignore the end value for IE, this is already dirty enough and we don't need it
		caretPos.start = txtarea.sel_start;
		caretPos.end = txtarea.sel_start;
		}
catch(e)
{
}
	}

	return caretPos;
}
