	
	/*
		Script by Benjamin Falk
		E-Mail: lumio.noma@gmx.net
		
		This script is free;
		you can redistribute it and/or modify
		it under the terms of GNU General Public
		License as published by the Free
		Software Foundation
		
		Script Version: 0.1b2.4.1
	*/
<!--//	
	//some settings for bb-parser
	var warning			= 'A custom warning. Your message has %i signs. So <a%l>click here</a> to view your preview and deactivate the protection.';
	var max_length		= -1;
	var additional		= '<div class="preview_box">';
	var tail			= '</div>';
	var output			= 'preview';
	var output_empty	= false;
	var convert_urls	= true;
	var i = 0;
	//tags
	var tags = new Array();
	//bold
	tags[i]				= new Array();
	tags[i]['name']		= 'b';			//Name of bb-code tag; Example [b] -> name = b
	tags[i]['start']	= '<b>';		//Replacement of [b]
	tags[i]['end']		= '</b>';		//Replacement of [/b]
	tags[i]['single']	= false;		//You need two replacement-tags to make bold-text. Otherwise only one - Example: img
	tags[i]['plain']	= false;		//Tag can contain other tags if its false.
	tags[i]['breaks']	= true;			//Add <br />
	i++;
	//italic
	tags[i]				= new Array();
	tags[i]['name']		= 'i';
	tags[i]['start']	= '<i>';
	tags[i]['end']		= '</i>';
	tags[i]['single']	= false;
	tags[i]['plain']	= false;
	tags[i]['breaks']	= true;
	i++;
	//underlined
	tags[i]				= new Array();
	tags[i]['name']		= 'u';
	tags[i]['start']	= '<u>';
	tags[i]['end']		= '</u>';
	tags[i]['single']	= false;
	tags[i]['plain']	= false;
	tags[i]['breaks']	= true;
	i++;
	
	//quote
	tags[i]				= new Array();
	tags[i]['name']		= 'quote';
	tags[i]['start']	= '<div class="quote">';
	tags[i]['end']		= '</div>';
	tags[i]['single']	= '';
	tags[i]['plain']	= false;
	tags[i]['breaks']	= true;
	tags[i]['links']	= true;
	i++;
	//-->
	
	//warning, if the text is too long
	if (typeof warning == 'undefined')		{ var warning = '<i>your text is above %i signs. The preview got canceld to protect your computer. <a%l>Click here</a> to show the preview anyway.</i>'; }
	//max. signs in text
	if (typeof max_length == 'undefined')	{ var max_length = -1; }
	//additional text before preview
	if (typeof additional == 'undefined')	{ var additional = '<b>Preview:</b><br />'; }
	//text after preview:
	if (typeof tail == 'undefined')			{ var tail = ''; }
	//output or return:
	if (typeof output == 'undefined')		{ var output = 'return'; }
	//output if empty?:
	if (typeof output_empty == 'undefined')	{ var output_empty = true; }
	//convert plain-urls:
	if (typeof convert_urls == 'undefined')	{ var convert_urls = true; }
	
	/*	this variable is the status of the function.
		if you do not like to execute the BBParse-Function
		repeatedly so let the value of live_repeatedly on
		false. Otherwise it parses on every call.	*/
	var live_works = false;
	var live_repeatedly = false;
	var live_repeatedly_return = false;
	
	if (typeof tags == 'undefined') { tags = new Array(); }
	for (var i = 0; i<tags.length; i++) {
		if (typeof tags == 'undefined') { tags[i] = new Array(); }
		if (typeof tags[i]['start'] == 'undefined')	{ tags[i]['start']	= '';		}
		if (typeof tags[i]['end'] == 'undefined')		{ tags[i]['end']	= '';		}
		if (typeof tags[i]['single'] == 'undefined')	{ tags[i]['single']	= false;	}
		if (typeof tags[i]['plain'] == 'undefined')	{ tags[i]['plain']	= false;	}
		if (typeof tags[i]['breaks'] == 'undefined')	{ tags[i]['breaks']	= true;		}
		if (typeof tags[i]['links'] == 'undefined')	{ tags[i]['links']	= true;		}
		if (typeof tags[i]['email'] == 'undefined')	{ tags[i]['email']	= true;		}
	}
	
	var bb_elements = new Array();
	var bb_e = new Array();
	var noprotect = true;
	
	function BBParse(content) {
		if (typeof content == 'undefined') { return false; }
		if (live_repeatedly == false  && live_works == true) { return live_repeatedly_return; }
		live_works = true;
		
		if (max_length != -1) {
			if (content.length > max_length && noprotect == false) {
				if (output != 'return') {
					var new_warn = replace(warning, '%i', content.length);
					new_warn = replace(new_warn, '%l', ' href="#" onclick="noprotect=true; BBParse()"');
					document.getElementById('preview').innerHTML = new_warn;
				}
				return false;
			}
//			uncomment this if you want max_length protection
//			if (content.length < max_length && noprotect == true) {
//				noprotect = false;
//			}
		}
		
		var bb_open = -1;
		var bb_close = -1;
		var bb_inneropen = -1;
		var bb_array = new Array();
		content = replace(content, '&', '&amp;');
		content = replace(content, '<', '&lt;');
		content = replace(content, '>', '&gt;');
		content = replace(content, '&', '&amp;');
		
		//lexar
		bb_open = content.indexOf("[", (bb_open+1));
		while (bb_open != -1) {
			bb_close = content.indexOf("]", (bb_open+1));
			if (bb_close == -1) break;
			
			bb_inneropen = content.indexOf("[", (bb_open+1));
			if (bb_inneropen != -1 && bb_inneropen < bb_close) {
				bb_open = content.indexOf("[", (bb_open+1));
				continue;
			}
			
			content = content.substr(0, bb_open)+'&&'+content.substr(bb_open, bb_close-bb_open+1)+'&&'+content.substr(bb_close+1);
			bb_open = bb_open + 2;
			
			bb_open = content.indexOf("[", (bb_open+1));
		}
		
		//parse
		renew();
		bb_elements = content.split('&&');
		
		bb_e = new Array();
		for (var n = 0; n < bb_elements.length; n++) {
			var s = bb_elements[n];
			
			bb_e[n] = new Array();
			if (s.substr(0,1) == '[' && s.substr(s.length-1) == ']') { //is bb-tag
				var attribute=-1;
				
				s = s.substr(1,s.length-2);
				var a = s.indexOf("=");
				if (a != -1) {
					attribute = s.substr(a+1);
					s = s.substr(0,a);
				}
				
				var tag_id = -1;
				if (s.substr(0,1) == '/') { //endtag
					var tag_name = s.substr(1);
					var accept_tag = false;
					for (var tn=0; tn<tags.length; tn++) {
						if (tags[tn]['name'] == tag_name) {
							accept_tag = true;
							tag_id = tn;
							break;
						}
					}
					
					if (accept_tag == true) {
						var lastIndexOfTag = lastIndex(tag_name);
						if (typeof lastIndexOfTag == 'undefined') {
							lastIndexOfTag = -1;
						}else {
							if (lastIndexOfTag == false) {
								lastIndexOfTag = -1;
							}else {
								bb_e[lastIndexOfTag][3] = true;
								bb_e[lastIndexOfTag][6] = n;
								for (var nn = lastIndexOfTag; nn<n; nn++) {
									bb_e[nn][7] == true;
								}
								
							}
						}
						
						bb_e[n][0] = s;								//name
						bb_e[n][1] = 'endtag';						//type
						bb_e[n][2] = '';							//value
						bb_e[n][3] = true;							//closed
						bb_e[n][4] = lastIndex(s.substr(1), 1)	;	//parent
						bb_e[n][5] = lastIndexOfTag	;				//end of
						bb_e[n][6] = -1;							//index of endtag
						bb_e[n][7] = false;						//innerClosed
						bb_e[n][8] = -1;							//attribute
						bb_e[n][9] = tag_id	;						//accept tag id
					}else {
						bb_e[n][0] = '';							//name
						bb_e[n][1] = 'value';						//type
						bb_e[n][2] = '['+s+']';						//value
						bb_e[n][3] = true;							//closed
						bb_e[n][4] = lastIndex(s, 1, n);			//parent
						bb_e[n][5] = -1;							//end of
						bb_e[n][6] = -1;							//index of endtag
						bb_e[n][7] = false;						//innerClosed
						bb_e[n][8] = -1;							//attribute
						bb_e[n][9] = tag_id	;						//accept tag id
					}
				}else {											//tag
					var accept_tag = false;
					for (var tn=0; tn<tags.length; tn++) {
						if (tags[tn]['name'] == s) {
							accept_tag = true;
							tag_id = tn;
							break;
						}
					}
					if (accept_tag == true) {
						bb_e[n][0] = s;								//name
						bb_e[n][1] = 'tag';							//type
						bb_e[n][2] = '';							//value
						bb_e[n][3] = false;						//closed
						bb_e[n][4] = lastIndex(s, 1);				//parent
						bb_e[n][5] = -1;							//end of
						bb_e[n][6] = -1;							//index of endtag
						bb_e[n][7] = false;						//innerClosed
						bb_e[n][8] = attribute;						//attribute
						bb_e[n][9] = tag_id	;						//accept tag id
					}else {
						bb_e[n][0] = '';							//name
						bb_e[n][1] = 'value';						//type
						bb_e[n][2] = '['+s+']';						//value
						bb_e[n][3] = true;							//closed
						bb_e[n][4] = lastIndex(s, 1, n);			//parent
						bb_e[n][5] = -1;							//end of
						bb_e[n][6] = -1;							//index of endtag
						bb_e[n][7] = false;						//innerClosed
						bb_e[n][8] = -1;							//attribute
						bb_e[n][9] = tag_id	;						//accept tag id
					}
				}
			}else { //value
				bb_e[n][0] = '';									//name
				bb_e[n][1] = 'value';								//type
				bb_e[n][2] = s;										//value
				bb_e[n][3] = true;									//closed
				bb_e[n][4] = lastIndex(s, 1, n);					//parent
				bb_e[n][5] = -1;									//end of
				bb_e[n][6] = -1;									//index of endtag
				bb_e[n][7] = false;								//innerClosed
				bb_e[n][8] = -1;									//attribute
				bb_e[n][9] = -1	;									//accept tag id
			}
		}
		
		//melt values
		var temp_e = new Array();
		var nn = 0;
		var new_val = 0;
		var new_e = false;
		for (var n=0; n<bb_e.length; n++) {
			new_e = false;
			if (bb_e[n][1] == 'tag' && bb_e[n][3] == false) {
				for (var n2 = (temp_e.length-1); n2>=0; n2--) {
					new_val = 0;
					if (temp_e[n2][1] == 'tag' || temp_e[n2] == 'endtag') {
						new_val = true;
						break;
					}else { new_val = n2; }
				}
				
				if (new_val !== true) {
					var a = '';
					if (bb_e[n][8] != -1) { a = '='+bb_e[n][8]; }else { a = ''; }
					temp_e[new_val][2] += '['+bb_e[n][0]+a+']';
				}else {
					temp_e[nn] = new Array();
					temp_e[nn] = bb_e[n];
					var a = '';
					if (bb_e[n][8] != -1) { a = '='+bb_e[n][8]; }else { a = ''; }
					temp_e[nn][2] = '['+temp_e[nn][0]+a+']';
					temp_e[nn][1] = 'value';
					nn++;
				}
				
				
			}else if (bb_e[n][1] == 'endtag' && bb_e[n][5] == -1) {
				for (var n2 = (temp_e.length-1); n2>=0; n2--) {
					new_val = 0;
					if (temp_e[n2][1] == 'tag' || temp_e[n2] == 'endtag') {
						new_val = true;
						break;
					}else { new_val = n2; }
				}
				
				if (new_val !== true) {
					temp_e[new_val][2] += '['+bb_e[n][0]+']';
				}else {
					temp_e[nn] = new Array();
					temp_e[nn] = bb_e[n];
					temp_e[nn][2] = '['+temp_e[nn][0]+']';
					temp_e[nn][1] = 'value';
					nn++;
				}
				
			}else if (bb_e[n][1] == 'value') {
				if (temp_e.length > 0) {
					for (var n2 = (temp_e.length-1); n2>=0; n2--) {
						new_val = 0;
						if (temp_e[n2][1] == 'tag' || temp_e[n2] == 'endtag') {
							new_val = true;
							break;
						}else { new_val = n2; }
					}
					
					if (new_val !== true) {
						temp_e[new_val][2] += bb_e[n][2];
					}else {
						new_e = true;
					}
				}else {
					new_e = true;
				}
				
			}else {
				new_e = true;
			}
			
			if (new_e == true) {
				temp_e[nn] = new Array();
				temp_e[nn] = bb_e[n];
				nn++;
			}
		}
		bb_e = temp_e;
		
		//translate into html
		var plain = false;
		var plainOf = '';
		var content = '';
		var is_single_tag = false;
		for (var n = 0; n < bb_e.length; n++) {
			if (bb_e[n][1] == 'tag' || bb_e[n][1] == 'endtag') {
				if (plain == true) {
					if (bb_e[n][1] == 'endtag' && bb_e[n][0] == '/'+plainOf) {
						plain = false;
					}
				}
				
				if (plain == false) {
					var tag = bb_e[n][0];
					var a=-1;
					a = '';
					if (bb_e[n][8] != -1) {
						a = "="+bb_e[n][8];
					}else { a = ''; }
					
					if (bb_e[n][3] == true) { //tag is closed
						if (bb_e[n][1] == 'endtag') { tag = tag.substr(1); }
						
						if (bb_e[n][7] == false) {
							if (bb_e[n][1] == 'endtag') {
								if (bb_e[n][5] != -1) {
									is_single_tag = false;
									if (bb_e[n][9] != -1) {
										if (tags[bb_e[n][9]]['single'] != false) {
											is_single_tag = true;
										}
									}
									
									if (is_single_tag == true) {
										tag = '';
									}else {
										if (bb_e[n][5] != -1) {
											tag = tags[bb_e[n][9]]['end'];
										}else {
											tag = '['+bb_e[n][0]+']';
										}
									}
								}else {
									tag = '['+bb_e[n][0]+']';
								}
							}else { //is tag
								if (bb_e[n][6] > -1) {
									if (bb_e[n][9] != -1) {
										var r_start = tags[bb_e[n][9]]['start'];
										if (r_start.length > 0) {
											tag = replace(r_start, '%1', bb_e[n][8]);
										}else {
											if (tags[bb_e[n][9]]['single'] != false) {
												var temp_content	= '';
												var c_plain			= tags[bb_e[n][9]]['plain'];
												
												for (var nn = (n+1); nn < bb_e[n][6]; nn++) {
													if (bb_e[nn][1] == 'value') {
														temp_content += bb_e[nn][2];
														bb_e[nn][2] = '';
													}else {
														if (c_plain == true) {
															var a = '';
															if (bb_e[nn][8] != -1) { a = '='+bb_e[nn][8]; }else { a = ''; }
															temp_content += '['+bb_e[nn][0]+a+']';
															bb_e[nn][0] = '';
															bb_e[nn][1] = 'value';
															bb_e[nn][8] = '';
														}
													}
												}
												
												r_start = tags[bb_e[n][9]]['single'];
												tag = replace(r_start, '%1', temp_content);
											}else {
												tag = '';
											}
										}
									}else {
										tag = '['+bb_e[n][0]+a+']';
									}
								}else {
									tag = '';
								}
							}
						}else {
							tag = '['+bb_e[n][0]+a+']';
						}
					}else {
						tag = '['+bb_e[n][0]+a+']';
					}
					
					content += tag;
					
					if (bb_e[n][9] != -1) {
						//plain-tags
						if (bb_e[n][1] == 'tag' && bb_e[n][3] == true && tags[bb_e[n][9]]['plain'] == true) {
							plain = true;
							plainOf = bb_e[n][0];
							for (var nn=(n+1); nn<bb_e[n][6]; nn++) {
								if (bb_e[nn][1] == 'tag' || bb_e[nn][1] == 'endtag') {
									var a = ''
									if (bb_e[nn][8] != -1) { a = '='+bb_e[nn][8]; }
									else { a = ''; }
									bb_e[nn][2] = '['+bb_e[nn][0]+a+']';
									bb_e[nn][1] = 'value';
									bb_e[nn][0] = '';
								}
								bb_e[nn][4] = n;
							}
						}
					}
				}else {
					bb_e[n][3] = false;
					bb_e[n][5] = -1;
					if (bb_e[n][6] != -1) {
						bb_e[ bb_e[n][6] ][5] = -1;
					}
					content += '['+bb_e[n][0]+']';
				}
			}else if (bb_e[n][1] == 'value') { //plain text
				var c = bb_e[n][2];
				var nc = '';
				
				//find links
				if (typeof bb_e[n][4] == 'undefined') {
					var convert_links = true;
				}else {
					var convert_links = tags[bb_e[bb_e[n][4]][9]]['links']
				}
				
				if (convert_links == true) {
					var i = c.indexOf('http://');
					var i2= c.indexOf('www.');
					if (i2 == -1) { i2 = i; }
					if (i > -1 && i < i2) {
						var wwwlink = false;
					}else {
						i = i2;
						var wwwlink = true;
					}
					while (i > -1) {
						var i_space = c.indexOf(' ', i);
						var i_break = c.indexOf("\n", i);
						var i_c = c.indexOf('!', i);
						
						var i_end = -1;
						var i_set = -1;
						
						if (i_space != -1) { i_set = i_space; }
						
						if (i_break != -1 && i_set != -1 && i_break < i_set) {
							i_set = i_break;
						}else if(i_set == -1) {
							i_set = i_break;
						}
						
						if (i_c != -1 && i_c != -1 && i_c < i_set) {
							i_set = i_c;
						}else if(i_set == -1) {
							i_set = i_c;
						}
						
						i_end = i_set;
						
						if (i_end == -1) { i_end = c.length; }
						
						var s_link = c.substr(i, (i_end-i));
						
						nc += c.substr(0,i);
						c  = c.substr(i_end);
						
						if (s_link.length > 0) {
							var href = '';
							href = s_link;
							if (href.substr(0,7) != 'http://') 
								{ href = 'http://'+href; }
							if (href.match(/games.handy.de/)) {
								// own links are opend in the same window
								nc += '<a href="'+href+'" >link</a>';
							} else {							
								nc += '<a href="'+href+'" target="_blank">link</a>';
//								nc += '<a href="'+href+'" target="_blank">'+s_link+'</a>';
							}
						}
						
						i = c.indexOf('http://');
						i2= c.indexOf('www.');
						if (i > -1 && i < i2) {
							wwwlink = false;
						}else {
							i = i2;
							wwwlink = true;
						}
						if (i == -1) {
							nc += c;
						}
					}
					if (nc.length > 0) { c = nc; }
				}
				
				//find mailaddresses
				if (typeof bb_e[n][4] == 'undefined') {
					var convert_emails = true;
				}else {
					var convert_emails = tags[bb_e[bb_e[n][4]][9]]['emails']
				}
				if (convert_emails == true) {
					c = c.replace(/([a-zA-Z0-9.?]+@[a-zA-Z0-9.?]+)/, '<a href="mailto:$1">$1</a>');
				}
				
				//breaks
				if (typeof bb_e[n][4] == 'undefined') {
					var breaks = true;
				}else {
					var breaks = tags[bb_e[bb_e[n][4]][9]]['breaks'];
				}
				if (breaks == true) {
					c = replace(c, "\n", "<br />\n");
				}
				
				content += c;
			}
		}
		content = replace(content, '&amp;', '&');
		
		//output
		live_works = false;
		if (output == 'return') {
			return content;
		}else {
			if (output_empty == false && content.length == 0) {
				document.getElementById(output).innerHTML = '';
				return true;
			}else {
				document.getElementById(output).innerHTML = additional+content+tail;
				
				return true;
			}
		}
	}
	
	function lastIndex(s, level, index) {
		if (typeof level == 'undefined') {
			level = 0;
		}
		if (typeof index == 'undefined') {
			index = -1;
		}
		
		var bb_content = '';
		var get_parent = -1;
		for (var n = (bb_e.length-1); n>=0; n--) {
			if (level > 0) {
				if (get_parent == -1) {
					if (index > -1) {
						if (n == index) {
							get_parent = 0;
						}
					}else {
						if (bb_e[n][0] == s && bb_e[n][1] == 'tag') {
							get_parent = 0;
						}
					}
				}else {
					if (get_parent<level && bb_e[n][1] == 'tag' && bb_e[n][3] == false) {
						get_parent++
					}else {
						if (bb_e[n][3] == false) {
							return n;
							break;
						}
					}
				}
			}else {
				if (bb_e[n][0] == s && bb_e[n][1] == 'tag' && bb_e[n][3] == false && bb_e[n][7] == false) {
					return n;
					break;
				}
			}
			
			
		}
	}
	
	function inArray(s, a) {
		for (var n = 0; n<a.length; n++) {
			if (a[n] == s) {
				return true;
			}
		}
		return false;
	}
	
	function renew() {
		bb_elements = new Array();
		bb_e = new Array();
	}
	
	function replace(content, needle, replacement) {
		var content_array = content.split(needle);
		
		if (content_array.length > 1) {
			var new_content = content_array[0];
			for(var n = 1; n < content_array.length; n++) {
				new_content += replacement+content_array[n];
			}
			content = new_content;
		}
		
		return content;
	}
	
	function trim(s) {
		while (s.substr(0,1) == ' ') { s = substr(1); }
		while (s.substr((s.length-1)) == ' ') { s = substr(0,(s.length-1)); }
		while (s.substr(0,1) == "\n") { s = substr(1); }
		while (s.substr((s.length-1)) == "\n") { s = substr(0,(s.length-1)); }
		return s;
	}
