	/*
		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
        
        This script has been modified for use with the Slipbox. You
        should find an unmodified copy of this script if you wish to
        use it with your application.
	*/
    
	//warning, if the text is too long
	if (typeof warning == 'undefined')		{ var warning = '<i>your text is above %i signs. The preview got cancelled 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; }
    
    var inline_image_id = 0;
    
    /* Extend parser to handle more tags */
    var tags = [
        { name: 'b', start: '<b>', end: '</b>' },
        { name: 'i', start: '<i>', end: '</i>' },
        { name: 'u', start: '<u>', end: '</u>' },
        { name: 's', start: '<s>', end: '</s>' },
        { name: 'color', start: '<span style="color: %1 !important">', end: '</span>' },
        { name: 'huge',  start: '<span style="font-size: 150%">', end: '</span>' },
        { name: 'big',   start: '<span style="font-size: 120%">', end: '</span>' },
        { name: 'small', start: '<span style="font-size: 80%">',  end: '</span>' },
        { name: 'tiny',  start: '<span style="font-size: 60%">',  end: '</span>' },
        {
            name:   'tube',
            start:  '',
            end:    '',
            single: '<div class="videoThumbnail"><a href="javascript:newYoutubeVideo(\'%1\')"><img src="http://img.youtube.com/vi/%1/default.jpg" onLoad="scrollIfNeeded()" width="130" height="97" alt="Video Thumbnail" /></a></div><div id="youtube_info_%1"><i>Loading video information...</i></div><p class="videoLinks"><span id="openlink_youtube_%1"><a href="javascript:newYoutubeVideo(\'%1\')">Open here</a> <b>&middot;</b> </span><a href="http://www.youtube.com/watch?v=%1" target="_blank">Open in new window</a></p>'
        },
        {
            name:   'gvid',
            start:  '',
            end:    '',
            single: '<div class="videoThumbnail" id="googlevideo_thumb_%1"><span style="font-size: 8pt; font-style: italic">Loading <br />thumbmail...</span></div><div id="googlevideo_info_%1"><i>Loading video information...</i></div><p class="videoLinks"><span id="openlink_googlevideo_%1"><a href="javascript:newGoogleVideo(\'%1\')">Open here</a> <b>&middot;</b> </span><a href="http://video.google.com/videoplay?docid=%1" target="_blank">Open in new window</a></p>'
        },
        /* Code tag prevents smiley/link/e-mail processing */
        {
            name:  'code',
            start: '<pre>',
            end:   '</pre>',
            plain: true,
            breaks: false,
            links: false,
            email: false,
            smileys: false
        },
        {
            name: 'ns',
            start: '',
            end: '',
            plain: true,
            smileys: false
        },
        {
            name:  'quote',
            start: '<div class="quote">',
            end:   '</div>'
        },
        {
            name: 'sp',
            start: "<span class=\"spoiler\" onmouseover=\"this.className='spoiler_hover'\" onmouseout=\"this.className='spoiler'\">",
            end: '</span>'
        },
        {
            name: 'new',
            start: '<span class="updated_text">',
            end: '</span>'
        },
        {
            name: 'song',
            start: '<img src="music_note.gif" align="absmiddle" /> ',
            end: ' <img src="music_note_2.gif" align="absmiddle" />'
        },
        {
            name: 'xmas',
            start: '<div style="background: green url(tree-icon.gif) repeat">',
            end: '</div>'
        },
        {
            name: 'rap',
            start: '<table cellpadding="3" cellspacing="0" border="0"><tr><td valign="top" width="110"><img src="rappers/%1.jpg" width="100" height="100" /></td><td valign="top">',
            end: '</td></tr></table>'
        },
        {
            name: 'url',
            start: '<a href="%1" target="_blank">',
            end: '</a>',
            add_http: true,
            links: false,
            smileys: false,
            email: false,
            plain: true
        },
        {
            name: 'img',
            start: '',
            end: '',
            single: '<img src="%1" onLoad="scrollIfNeeded()" />'
        }
    ];
	
	/*	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;		}
		if (typeof tags[i]['smileys'] == 'undefined')	{ tags[i]['smileys']	= true;	}
		if (typeof tags[i]['add_http'] == 'undefined')	{ tags[i]['add_http']	= false;}        
	}
	
	var bb_elements = new Array();
	var bb_e = new Array();
	var noprotect = false;
	
	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;
			}
			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, '"', '&quot;');
		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.toLowerCase()) {
							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.toLowerCase()) {
					            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) {
                                            if(tags[bb_e[n][9]]['add_http'] && bb_e[n][8] != -1 && !bb_e[n][8].match(/^https?:/i)) bb_e[n][8] = 'http://' + bb_e[n][8];
											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 (typeof bb_e[n][4] == 'undefined') {
					var convert_smileys = true;
				}else {
					var convert_smileys = tags[bb_e[bb_e[n][4]][9]]['smileys'];
				}
				
				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;
					}
                    // Handle case where there's no link present - smiley the whole thing
                    if(i == -1 && convert_smileys == true) {
                        c = formatSmileys(c);
                    }
					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));
						
                        // Handle case where there is a link present - we filter the surrounding text
                        if(convert_smileys == true) {
    						nc += formatSmileys(c.substr(0,i));
    						c  = formatSmileys(c.substr(i_end));
                        }
                        else {
                            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; }
                            
                            // Convert links ending in .gif, .jpg, .jpeg or .png into inline images
                            if(href.match(/\.(jpe?g|gif|png)$/i)) {
                                nc += '<span id="inline_image_closed_'+inline_image_id+'"><a href="'+href+'" target="_blank">'+s_link+'</a> (<a href="javascript:void(null)" ';
                                nc += 'onClick="$(\'inline_image_closed_'+inline_image_id+'\').hide();$(\'inline_image_open_'+inline_image_id+'\').style.display=\'block\';scrollIfNeeded();">';
                                nc += 'open inline</a>)</span><div id="inline_image_open_'+inline_image_id+'" style="display: none">';
                                nc += '<img src="'+href+'" onLoad="scrollIfNeeded()" /></div>';
                                inline_image_id++;
                            }
                            else {
                                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; }
				}
                else {
                    if(convert_smileys == true) {
                        c = formatSmileys(c);
                    }
                }
				
				//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;
	}