//This function initializes bbcode
(function( $ ){

	var $init_bbcode = $.init_bbcode = function( settings ){
		return $(window).init_bbcode( settings );
	};
	$init_bbcode.defaults = {
		form_name:		'comments_form', //form tag ID
		text_name:		'DATA[MESSAGE]', //textarea field name
		bbcode_buttons:	'.insert_bbcode' //buttons class atribute
		//target:			''
	};

	$.fn.init_bbcode = function( options ){

		
		return this.each(function(){
			var 
				settings = $.extend( {}, $init_bbcode.defaults, options ),
				form_name = settings.form_name, 
				text_name = settings.text_name,
				bbcode_buttons = settings.bbcode_buttons,
				context = settings.target ? this : document, // if a target is specified, then everything's relative to 'this'.
				imageTag = false,
				theSelection = false,
				clientPC = navigator.userAgent.toLowerCase(),
				clientVer = parseInt(navigator.appVersion),
				is_ie = ((clientPC.indexOf('msie') != -1) && (clientPC.indexOf('opera') == -1)),
				is_win = ((clientPC.indexOf('win') != -1) || (clientPC.indexOf('16bit') != -1)),
				baseHeight,
				load_draft = false,
				upload = false,
				bbcode = new Array(),
				bbtags = new Array('[b]','[/b]','[i]','[/i]','[u]','[/u]','[quote]','[/quote]','[code]','[/code]','[list]','[/list]','[list=]','[/list]','[img]','[/img]','[url]','[/url]','[flash=]', '[/flash]','[size=]','[/size]', '[s]', '[/s]', '[tab]', '[/tab]'),
				imageTag = false,
				help_line = {
					b: 'Bold: [b]text[/b]',
					i: 'Italic: [i]text[/i]',
					u: 'Underlined: [u]text[/u]',
					q: 'Quote: [quote]text[/quote]',
					c: 'Code: [code]code[/code]',
					l: 'List: [list]text[/list]',
					o: 'Numbered list: [list=]text[/list]',
					p: 'Insert image: [img]http://image_url[/img]',
					w: 'Insert hyperlink: [url]http://url[/url] or [url=http://url]URL text[/url]',
					a: 'Insert attachment: [attachment=]filename.ext[/attachment]',
					s: 'Font color: [color=red]text[/color] You can also use this construction: color=#FF0000',
					f: 'Font size: [size=85]small text[/size]',
					e: 'List: add an element',
					d: 'Flash: [flash=width,height]http://url[/flash]'
				},
				panels = new Array(''),
				show_panel = '';
		
			
			//onload_functions.push('initInsertions()');
			initInsertions();			
			
			// Button binding, optional
			$.each($(settings.bbcode_buttons||[], context),function(i,obj) {
				$(obj).bind( 'click', {bbnumber: $(obj).attr("href")}, bbstyle );
			});
		
			/**
			* 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 ($("#forum #" + form_name).length || $("#comments #" + form_name).length)
				{
					doc = document;
					
				}
				else if (opener && typeof(opener.document) != 'unknown' && typeof(opener.document) != 'undefined')
				{
					doc = opener.document;
					
				}
				else
				{
					
					return;
				}
		
				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(event)
			{
				var bbnumber = event.data.bbnumber;
				if (bbnumber != -1)
				{
					bbfontstyle(bbtags[Number(bbnumber)], bbtags[Number(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, '&');
						theSelection = theSelection.replace(/&nbsp\;/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 + '" style="width: ' + width + 'px; height: ' + height + 'px;">');
							document.write('<a href="#" onclick="bbfontstyle(\'[color=#' + color + ']\', \'[/color]\'); return false;"><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;
					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;
				}
		
				return caretPos;
			};
		});
	};

})( jQuery );