/******************************************************************************
 *                                                                            *
 *   This is part of xBB library                                              *
 *   Copyright (C) 2006-2007  Dmitriy Skorobogatov  dima@pc.uz                *
 *                                                                            *
 *   This program is free software; you can redistribute it and/or modify     *
 *   it under the terms of the GNU General Public License as published by     *
 *   the Free Software Foundation; either version 2 of the License, or        *
 *   (at your option) any later version.                                      *
 *                                                                            *
 *   This program is distributed in the hope that it will be useful,          *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of           *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            *
 *   GNU General Public License for more details.                             *
 *                                                                            *
 *   You should have received a copy of the GNU General Public License        *
 *   along with this program; if not, write to the Free Software              *
 *   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *
 *                                                                            *
 ******************************************************************************/

function bbcode(code) {
	this.text = code;
  this.syntax = [];
  this.tags = [];
  this.autolinks = true;
  this.preg_autolinks = {
  	pattern   : [
    		        /(\w+:\/\/[A-z0-9\.\?\+\-\/_=&%#:;]+[\w/=]+)/,
        		    /([^/])(www\.[A-z0-9\.\?\+\-/_=&%#:;]+[\w/=]+)/,
            		/([\w]+[\w\-\.]+@[\w\-\.]+\.[\w]+)/,
        				],
    highlight : [
    		        '<' + 'span class="bb_autolink">$1<' + '/span>',
        		    '$1<' + 'span class="bb_autolink">$2<' + '/span>',
           		 '<' + 'span class="bb_autolink">$1<' + '/span>',
        				]
  };
  this.mnemonics = [];
  this.smiles = [];
  this.fonts = [];
  this.colors = [];
  this.iframeId = 'xbb_iframe';
  this.textareaId = 'post_body';
  this.transportDiv = parent.document.getElementById('xbb_transport_div');
  /*
  'plain' (textarea) or 'highlight'
  */
  this.state = 'plain';
  var _cursor = 0;
  /*
  get_token()
  0 - ("[")
  1 - ("]")
  2 - ('"')
  3 - ("'")
  4 - ("=")
  5 - ("/")
  6 - (" ", "\t", "\n", "\r", "\0" or "\x0B")
  7 - else symbols
  8 - tag name
  */
  this.get_token = function() {
  	var token = '';
    var token_type = NaN;
    var char_type = NaN;
    var cur_char;
    while (true) {
    	token_type = char_type;
      if (! this.text.charAt(_cursor)) {
      	if (isNaN(char_type)) {
        	return false;
      	} else {
          break;
      	}
      }
      cur_char = this.text.charAt(_cursor);
      switch (cur_char) {
      	case '[':
        	char_type = 0;
      		break;
        case ']':
        	char_type = 1;
      		break;
        case '"':
        	char_type = 2;
      		break;
        case "'":
      		char_type = 3;
     			 break;
        case "=":
        	char_type = 4;
      		break;
        case '/':
        	char_type = 5;
      		break;
        case ' ':
        	char_type = 6;
      		break;
        case "\t":
        	char_type = 6;
      		break;
        case "\n":
        	char_type = 6;
      		break;
        case "\r":
        	char_type = 6;
      		break;
        case "\0":
        	char_type = 6;
      		break;
        case "\x0B":
        	char_type = 6;
      		break;
        default:
        	char_type = 7;
      }
      if (isNaN(token_type)) {
      	token = cur_char;
      } else if (5 >= token_type) {
      	break;
      } else if (char_type == token_type) {
        token += cur_char;
      } else {
        break;
      }
        _cursor += 1;
      }
      if (this.in_array(token.toLowerCase(), this.tags)) {
      	token_type = 8;
      }
      return [token_type, token];
    }

    this.parse = function(code) {
    	if (code) { this.text = code; }
      var finite_automaton = {
	   		// previous|            Actual states                   |
	   		//  states |  0 |  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |
	             0 : [  1 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ]
	          ,  1 : [  2 ,  3 ,  3 ,  3 ,  3 ,  4 ,  3 ,  3 ,  5 ]
	          ,  2 : [  2 ,  3 ,  3 ,  3 ,  3 ,  4 ,  3 ,  3 ,  5 ]
	          ,  3 : [  1 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ]
	          ,  4 : [  2 ,  6 ,  3 ,  3 ,  3 ,  3 ,  3 ,  3 ,  7 ]
	          ,  5 : [  2 ,  6 ,  3 ,  3 ,  8 ,  9 , 10 ,  3 ,  3 ]
	          ,  6 : [  1 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ]
	          ,  7 : [  2 ,  6 ,  3 ,  3 ,  3 ,  3 ,  3 ,  3 ,  3 ]
	          ,  8 : [ 13 , 13 , 11 , 12 , 13 , 13 , 14 , 13 , 13 ]
	          ,  9 : [  2 ,  6 ,  3 ,  3 ,  3 ,  3 ,  3 ,  3 ,  3 ]
	          , 10 : [  2 ,  6 ,  3 ,  3 ,  8 ,  9 ,  3 , 15 , 15 ]
	          , 11 : [ 16 , 16 , 17 , 16 , 16 , 16 , 16 , 16 , 16 ]
	          , 12 : [ 18 , 18 , 18 , 17 , 18 , 18 , 18 , 18 , 18 ]
	          , 13 : [ 19 ,  6 , 19 , 19 , 19 , 19 , 17 , 19 , 19 ]
	          , 14 : [  2 ,  3 , 11 , 12 , 13 , 13 ,  3 , 13 , 13 ]
	          , 15 : [  2 ,  6 ,  3 ,  3 ,  8 ,  9 , 10 ,  3 ,  3 ]
	          , 16 : [ 16 , 16 , 17 , 16 , 16 , 16 , 16 , 16 , 16 ]
	          , 17 : [  2 ,  6 ,  3 ,  3 ,  3 ,  9 , 20 , 15 , 15 ]
	          , 18 : [ 18 , 18 , 18 , 17 , 18 , 18 , 18 , 18 , 18 ]
	          , 19 : [ 19 ,  6 , 19 , 19 , 19 , 19 , 20 , 19 , 19 ]
	          , 20 : [  2 ,  6 ,  3 ,  3 ,  3 ,  9 ,  3 , 15 , 15 ]
      };
      var mode = 0;
      this.syntax = [];
      var decomposition = {};
      var token_key = -1;
      var value = '';
      var previous_mode;
      var type;
      var name;
      _cursor = 0;
      var token = this.get_token();
      while (token) {
      	previous_mode = mode;
        mode = finite_automaton[previous_mode][token[0]];
        if (-1 < token_key) {
        	type = this.syntax[token_key].type;
        } else {
          type = false;
        }
        switch (mode) {
        	case 0:
	          if ('text' == type) {
	          	this.syntax[token_key].str += token[1];
	          } else {
	           	this.syntax[++token_key] = {
	            	type : 'text',
	            	str  : token[1]
	           	};
	          }
	        	break;
          case 1:
	          decomposition = {
	        	  name   : '',
	            type   : '',
	            str    : '[',
	            layout : [[0, '[']]
	          };
	        	break;
          case 2:
	          if ('text' == type) {
	        	  this.syntax[token_key].str += decomposition.str;
	          } else {
	            this.syntax[++token_key] = {
	          		type : 'text',
	              str  : decomposition.str
	            };
	          }
	          decomposition = {
	          	name   : '',
	            type   : '',
	            str    : '[',
	            layout : [[0, '[']]
	          };
	        	break;
        	case 3:
	          if ('text' == type) {
	          	this.syntax[token_key].str += decomposition.str;
	            this.syntax[token_key].str += token[1];
	          } else {
	            this.syntax[++token_key] = {
	            	type : 'text',
	              str  : decomposition.str + token[1]
	            };
	          }
	          decomposition = {};
        		break;
          case 4:
	          decomposition.type = 'close';
	        	decomposition.str += '/';
	        	decomposition.layout[decomposition.layout.length] = [1, '/'];
	        	break;
          case 5:
	          decomposition.type = 'open';
	          name = token[1].toLowerCase();
	          decomposition.name = name;
	          decomposition.str += token[1];
	          decomposition.layout[decomposition.layout.length] = [2, token[1]];
	          if (! decomposition.attrib) {
	        	  decomposition.attrib = {};
	          }
	          decomposition.attrib[name] = '';
	       	 	break;
          case 6:
	          if (! decomposition.name) {
	        	  decomposition.name = '';
	          }
	          if (13 == previous_mode || 19 == previous_mode) {
	          	decomposition.layout[decomposition.layout.length] = [7, value];
	          }
	          decomposition.str += ']';
	          decomposition.layout[decomposition.layout.length] = [0, ']'];
	          this.syntax[++token_key] = decomposition;
	          decomposition = {};
       			break;
          case 7:
	          decomposition.name = token[1].toLowerCase();
	          decomposition.str += token[1];
	          decomposition.layout[decomposition.layout.length] = [2, token[1]];
	        	break;
          case 8:
	          decomposition.str += '=';
	          decomposition.layout[decomposition.layout.length] = [3, '='];
	        	break;
          case 9:
	          decomposition.type = 'open/close';
	          decomposition.str += '/';
	          decomposition.layout[decomposition.layout.length] = [1, '/'];
	        	break;
          case 10:
	          decomposition.str += token[1];
	          decomposition.layout[decomposition.layout.length] = [4, token[1]];
	        	break;
          case 11:
	          decomposition.str += '"';
	          decomposition.layout[decomposition.layout.length] = [5, '"'];
	          value = '';
	        	break;
          case 12:
	          decomposition.str += "'";
	          decomposition.layout[decomposition.layout.length] = [5, "'"];
	          value = '';
	        	break;
          case 13:
	          if (! decomposition.attrib) {
	        	  decomposition.attrib = {};
	          }
	          decomposition.attrib[name] = token[1];
	          value = token[1];
	          decomposition.str += token[1];
	        	break;
          case 14:
	          decomposition.str += token[1];
	          decomposition.layout[decomposition.layout.length] = [4, token[1]];
	        	break;
          case 15:
	          name = token[1].toLowerCase();
	          decomposition.str += token[1];
	          decomposition.layout[decomposition.layout.length] = [6, token[1]];
	          if (! decomposition.attrib) {
	        	  decomposition.attrib = {};
	          }
	          decomposition.attrib[name] = '';
	        	break;
          case 16:
	          decomposition.str += token[1];
	          if (! decomposition.attrib) {
	        	  decomposition.attrib = {};
	          }
	          decomposition.attrib[name] += token[1];
	          value += token[1];
		        break;
          case 17:
		        decomposition.str += token[1];
		        decomposition.layout[decomposition.layout.length] = [7, value];
		        value = '';
		        decomposition.layout[decomposition.layout.length] = [5, token[1]];
		      	break;
          case 18:
	          decomposition.str += token[1];
	          decomposition.attrib[name] += token[1];
	          value += token[1];
	       		break;
          case 19:
	          decomposition.str += token[1];
	          decomposition.attrib[name] += token[1];
	          value += token[1];
	        	break;
          case 20:
	          decomposition.str += token[1];
	          if (13 == previous_mode || 19 == previous_mode) {
	        	  decomposition.layout[decomposition.layout.length] = [7, value];
	          }
	          value = '';
	          decomposition.layout[decomposition.layout.length] = [4, token[1]];
        		break;
        }
        token = this.get_token();
      }
      if (decomposition.type) {
      	if ('text' == type) {
        	this.syntax[token_key].str += decomposition.str;
      	} else {
          this.syntax[++token_key] = {
        	  type : 'text',
            str  : decomposition.str
          };
      	}
    	}
    }    
    this.highlight = function() {
    	var chars = [
      	['@l;' , '<span class="bb_spec_char">@l;</span>' ],
        ['@r;' , '<span class="bb_spec_char">@r;</span>' ],
        ['@q;' , '<span class="bb_spec_char">@q;</span>' ],
        ['@a;' , '<span class="bb_spec_char">@a;</span>' ],
        ['@at;', '<span class="bb_spec_char">@at;</span>']
      ];
      var link_search = this.preg_autolinks.pattern;
      var link_replace = this.preg_autolinks.highlight;
      var str = '';
      var elem;
      var val;
      for (var i_syntax in this.syntax) {
      	elem = this.syntax[i_syntax].str;
        if ('text' == this.syntax[i_syntax].type) {
        	elem = this.htmlspecialchars(elem);
          elem = this.strtr(elem, chars);
          for (var i_mnemonic in this.mnemonics) {
          	elem = elem.replace(
            	this.mnemonics[i_mnemonic],
              '<span class="bb_mnemonic">' + this.mnemonics[i_mnemonic] + '</span>'
          	);
          }
          for (var i = 0; link_search[i]; ++i) {
          	elem = elem.replace(link_search[i], link_replace[i]);
          }
          str += elem;
        } else {
          str += '<span class="bb_tag">';
          var trim_val = '';
          for (var i_val in this.syntax[i_syntax].layout) {
         		val = this.syntax[i_syntax].layout[i_val];
           	switch (val[0]) {
           		case 0:
	             	str += '<span class="bb_bracket">' + val[1] + '</span>';
	           		break;
             	case 1:
             		str += '<span class="bb_slash">/</span>';
           			break;
            	case 2:
              	str += '<span class="bb_tagname">' + val[1] + '</span>';
            		break;
              case 3:
              	str += '<span class="bb_equal">=</span>';
           		 	break;
              case 4:
              	str += val[1];
            		break;
              case 5:
              	trim_val = val[1].replace(/\s/, '');
	              if (! trim_val) {
	             		str += val[1];
	              } else {
	                str += '<span class="bb_quote">' + val[1] + '</span>';
	              }
	            	break;
              case 6:
	              str += '<span class="bb_attrib_name">'
	              + this.htmlspecialchars(val[1]) + '</span>';
	            	break;
              case 7:
	              trim_val = val[1].replace(/\s/, '');
	              if (! trim_val) {
	            	 	str += val[1];
	              } else {
	                str += '<span class="bb_attrib_val">'
	                + this.strtr(this.htmlspecialchars(val[1]), chars)
	                + '</span>';
	              }
	            	break;
              default:
              	str += val[1];
           	}
          }
          str += '</span>';
        }
      }
      str = this.nl2br(str);
      str = str.replace(/\s\s/, '&nbsp;&nbsp;');
      return str;
    }

    this.innerText = function(node) {
    	if (node.innerText) {
      	return node.innerText;
    	}
      if (node.textContent) {
      	for (var t = [], l = (c = node.childNodes).length, p, i = 0; i < l; i++) {
        	t[t.length] =
          					   'p' == (p = c[i].nodeName.toLowerCase())
                        ? '\n' + c[i].textContent + '\n'
                        : 'br' == p ? '\n' : c[i].textContent;
      	}
        return t.join('');
      }
      return '';
    }

    /* Like in_array in PHP */
    this.in_array = function(needle, haystack) {
      for (var i = 0; haystack[i]; i++) {
	      if (haystack[i] == needle) {
          return true;
	      }
      }
      return false;
    }

    /* Like nl2br in PHP */
    this.nl2br = function(str) {
      if (typeof(str) == "string") {
        return str.replace(/(\r\n)|(\n\r)|\r|\n/g, '<br />');
      }
      return str;
    }

    /* Like htmlspecialchars in PHP */
    this.htmlspecialchars = function(str) {
      str = str.replace(/&/g, '&amp;');
      str = str.replace('/\"/g', '&quot;');
      str = str.replace("/\'/g", '&#039;');
      str = str.replace(/</g, '&lt;');
      str = str.replace(/>/g, '&gt;');
      return str
    }

    /*
    Like strtr in PHP
    pairs = [['a', 'b'], ['c', 'd']];
    str1 = strtr("abcdabcdabcdabcd", pairs);
    str2 = strtr("abcdabcdabcdabcd", "dcba", "hgfe");
    */
    this.strtr = function(str, pairs, to) {
      if ((typeof(pairs)=="object") && (pairs.length)) {
        for (i in pairs) {
          str = str.replace(RegExp(pairs[i][0], "g"), pairs[i][1]);
        }
        return str;
      } else {
        pairs2 = new Array();
        for (i = 0; i < pairs.length; i++) {
            pairs2[i] = [pairs.substr(i,1), to.substr(i,1)];
        }
        return strtr(str, pairs2);
      }
    }

    this.parse();
}

// Remember the current position.
function storeCaret(text) {
	// Only bother if it will be useful.	
	if (typeof(text.createTextRange) != "undefined")
		text.caretPos = document.selection.createRange().duplicate();
}

// Replaces the currently selected text with the passed text.
function replaceText(text, textarea) {
	// Attempt to create a text range (IE).
	if (typeof(textarea.caretPos) != "undefined" && textarea.createTextRange) {
		var caretPos = textarea.caretPos;
		if (caretPos.text.charAt(caretPos.text.length - 1) == ' ') {
		    caretPos.text = text + ' ';
		} else {
		    caretPos.text = text;
		}
		caretPos.select();
	}
	// Mozilla text range replace.
	else if (typeof(textarea.selectionStart) != "undefined") {
		var begin = textarea.value.substr(0, textarea.selectionStart);
		var end = textarea.value.substr(textarea.selectionEnd);
		var scrollPos = textarea.scrollTop;

		textarea.value = begin + text + end;

		if (textarea.setSelectionRange)
		{
			textarea.focus();
			textarea.setSelectionRange(begin.length + text.length, begin.length + text.length);
		}
		textarea.scrollTop = scrollPos;
	}
	// Just put it on the end.
	else {
		textarea.value += text;
		textarea.focus(textarea.value.length - 1);
	}
}

function doinsert(text1, text2) {
   textarea = xbb_textarea;
	// Can a text range be created?
	if (typeof(textarea.caretPos) != "undefined" && textarea.createTextRange)
	{
		var caretPos = textarea.caretPos, temp_length = caretPos.text.length;
		caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ?  caretPos.text + text1 + text2 + ' ' :  caretPos.text + text1 + text2;

		if (temp_length == 0)
		{
			caretPos.moveStart("character", 0);
			caretPos.moveEnd("character", 0);
			caretPos.select();
		}
		else
			textarea.focus(caretPos);
	}
	// Mozilla text range wrap.
	else if (typeof(textarea.selectionStart) != "undefined")
	{
		var begin = textarea.value.substr(0, textarea.selectionStart);
		var selection = textarea.value.substr(textarea.selectionStart, textarea.selectionEnd - textarea.selectionStart);
		var end = textarea.value.substr(textarea.selectionEnd);
		var newCursorPos = textarea.selectionStart;
		var scrollPos = textarea.scrollTop;

		textarea.value = begin + text1 + selection + text2 + end;

		if (textarea.setSelectionRange)
		{
			if (selection.length == 0)
				textarea.setSelectionRange(newCursorPos + text1.length + text2.length , newCursorPos + text1.length + text2.length);
			else
				textarea.setSelectionRange(newCursorPos, newCursorPos + text1.length + selection.length + text2.length);
			textarea.focus();
		}
		textarea.scrollTop = scrollPos;
	}
	// Just put them on the end, then.
	else
	{
		textarea.value += text1 + text2;
		textarea.focus(textarea.value.length - 1);
	}

}

function tag_url() {
	var FoundErrors = '';
	var enterURL   = prompt(text_enter_url, "http://");
	var enterTITLE = prompt(text_enter_url_name, "My WebPage");
	
	if (!enterURL || enterURL=='http://') {FoundErrors = 1;}
	else if (!enterTITLE) {FoundErrors = 1;}
	
	if (FoundErrors) {return;}
	
	doinsert ('[url=' + enterURL + ']'+enterTITLE, '[/url]');
}

function tag_email() {
	var emailAddress = prompt(text_enter_email, "");
	
	if (!emailAddress) {return;}
	
	doinsert("[email]"+emailAddress,"[/email]");
}

function tag_image() {
	var FoundErrors = '';
	var enterURL   = prompt(text_enter_image, "http://");
	
	if (!enterURL || enterURL=='http://' || enterURL.length<10) {return;}
	
	doinsert("[img]"+enterURL,"[/img]");
}

function tag_list() {
	var listvalue = "init";
	var thelist = "";
	while ( (listvalue != "") && (listvalue != null) )	{
		listvalue = prompt(list_prompt, "");
		if ( (listvalue != "") && (listvalue != null) )	{
			thelist = thelist+"[*]"+listvalue+"\n";
		}
	}	
	if ( thelist != "" )	{
		doinsert( "[list]\n" + thelist, "[/list]\n");
	}
}


var xbb_code_names = {0:  {0: 'code',         1: 'Text'                  },
									    1:  {0: 'actionscript', 1: 'ActionScript'          },
									    2:  {0: 'c++',          1: 'C++'                   },
									    3:  {0: 'css',          1: 'CSS'                   },
									    4:  {0: 'delphi',       1: 'Delphi (Object Pascal)'},
									    5:  {0: 'html4',        1: 'HTML 4.01 Strict'      },
									    6:  {0: 'java',         1: 'Java'                  },
									    7:  {0: 'js',           1: 'JavaScript'            },
									    8:  {0: 'latex',        1: 'LaTeX'                 },
									    9:  {0: 'perl',         1: 'Perl'                  },
									    10: {0: 'php',          1: 'PHP'                   },
									    11: {0: 'sql',          1: 'SQL'                   },
									    12: {0: 'vb',           1: 'Visual Basic'          },
									    13: {0: 'xml',          1: 'XML'                   }};
var xbb_smiles = 		{0:{	0:{0:'1.gif' , 1:'Very we!' , 2:':D'},
													1:{0:'2.gif' , 1:'Well' , 2:':)'},
													2:{0:'3.gif' , 1:'Not so' , 2:':('},
													3:{0:'4.gif' , 1:'Eyes in a heap' , 2:':heap:'},
													4:{0:'5.gif' , 1:'Really?' , 2:':ooi:'},
										 			5:{0:'6.gif' , 1:'So-so' , 2:':so:'},
													6:{0:'7.gif' , 1:'It is surprised' , 2:':surp:'},
													7:{0:'8.gif' , 1:'Again' , 2:':ag:'},
													8:{0:'9.gif' , 1:'I roll!' , 2:':ir:'},
													9:{0:'10.gif' , 1:'I hesitate' , 2:':oops:'}},
										 1:{	0:	{0:'11.gif' , 1:'To you' , 2:':P'},
													1:{0:'12.gif' , 1:'Tears' , 2:':cry:'},
													2:{0:'13.gif' , 1:'I am malicious' , 2:':rage:'},
													3:{0:'14.gif' , 1:'All ok' , 2:':B'},
													4:{0:'15.gif' , 1:'Not precisely' , 2:':roll:'},
										      5:{0:'16.gif' , 1:'To wink' , 2:':wink:'},
													6:{0:'17.gif' , 1:'Yes' , 2:':yes:'},
													7:{0:'18.gif' , 1:'Has bothered' , 2:':bot:'},
													8:{0:'19.gif' , 1:'Ridiculously' , 2:':z)'},
													9:{0:'20.gif' , 1:'Here' , 2:':arrow:'}},
										 2:{  0:{0:'21.gif' , 1:'Attention' , 2:':vip:'},
													1:{0:'22.gif' , 1:'I congratulate' , 2:':Heppy:'},
													2:{0:'23.gif' , 1:'I think' , 2:':think:'},
													3:{0:'24.gif' , 1:'Farewell' , 2:':bye:'},
													4:{0:'25.gif' , 1:'Perfectly' , 2:':roul:'},
										      5:{0:'26.gif' , 1:'Fingers' , 2:':pst:'},
													6:{0:'27.gif' , 1:'Poorly' , 2:':o'},
													7:{0:'28.gif' , 1:'Veal closed' , 2:':closed:'},
													8:{0:'29.gif' , 1:'Censorship' , 2:':cens:'},
												  9:{0:'30.gif' , 1:'Features' , 2:':tani:'}},
										 3:{  0:{0:'31.gif' , 1:'Applause' , 2:':appl:'},
												  1:{0:'32.gif' , 1:'I do not know' , 2:':idnk:'},
													2:{0:'33.gif' , 1:'Singing' , 2:':sing:'},
													3:{0:'34.gif' , 1:'Shock' , 2:':shock:'},
													4:{0:'98.gif' , 1:'Bicycle' , 2:':bic:'},
										      5:{0:'36.gif' , 1:'Respect' , 2:':res:'},
													6:{0:'37.gif' , 1:'Alcohol' , 2:':alc:'},
													7:{0:'38.gif' , 1:'The lamer' , 2:':lam:'},
													8:{0:'39.gif' , 1:'Boxing' , 2:':box:'},
													9:{0:'40.gif' , 1:'Tomato' , 2:':tom:'}},
										 4:{  0:{0:'41.gif' , 1:'Cheerfully' , 2:':lol:'},
													1:{0:'42.gif' , 1:'The villain' , 2:':vill:'},
													2:{0:'43.gif' , 1:'Idea' , 2:':idea:'},
													3:{0:'44.gif' , 1:'Oops!' , 2:':oops:'},
													4:{0:'45.gif' , 1:'The big rage' , 2:':E'},
										 			5:{0:'46.gif' , 1:'Sex' , 2:':sex:'},
													6:{0:'47.gif' , 1:'Horns' , 2:':horns:'},
													7:{0:'48.gif' , 1:'Love me' , 2:':love:'},
													8:{0:'49.gif' , 1:'Happy birthday' , 2:':poz:'},
													9:{0:'50.gif' , 1:'Roza' , 2:':roza:'}},
										 5:{  0:{0:'51.gif' , 1:'Megaphone' , 2:':meg:'},
													1:{0:'52.gif' , 1:'The DJ' , 2:':dj:'},
													2:{0:'100.gif' , 1:'Bar' , 2:':bar:'},
													3:{0:'54.gif' , 1:'OffLine' , 2:':offln:'},
													4:{0:'55.gif' , 1:'Spider' , 2:':sp:'},
													5:{0:'56.gif' , 1:'Storm of applause' , 2:':stapp:'},
													6:{0:'57.gif' , 1:'Beautiful girl' , 2:':girl:'},
													7:{0:'58.gif' , 1:'Heart' , 2:':heart:'},
													8:{0:'59.gif' , 1:'Kiss' , 2:':kiss:'},
													9:{0:'60.gif' , 1:'Spam' , 2:':spam:'}},
										 6:{  0:{0:'61.gif' , 1:'Party' , 2:':party:'},
													1:{0:'62.gif' , 1:'Song' , 2:':ser:'},
													2:{0:'63.gif' , 1:'Dream' , 2:':eam:'},
													3:{0:'64.gif' , 1:'Gift' , 2:':gift:'},
													4:{0:'65.gif' , 1:'I adore' , 2:':adore:'},
													5:{0:'66.gif' , 1:'Pie' , 2:':pie:'},
													6:{0:'67.gif' , 1:'Egg' , 2:':egg:'},
													7:{0:'68.gif' , 1:'Concert' , 2:':cnrt:'},
													8:{0:'69.gif' , 1:'Off Topic' , 2:':oftop:'},
													9:{0:'70.gif' , 1:'Football' , 2:':foo:'}},
										 7:{  0:{0:'71.gif' , 1:'Cellular' , 2:':mob:'},
													1:{0:'99.gif' , 1:'Ban?' , 2:':ban:'},
													2:{0:'73.gif' , 1:'Together' , 2:':tog:'},
													3:{0:'74.gif' , 1:'Pancake' , 2:':pnk:'},
													4:{0:'75.gif' , 1:'Party Time' , 2:':pati:'},
													5:{0:'76.gif' , 1:'I here' , 2:':-({|=:'},
													6:{0:'77.gif' , 1:'Head about a wall' , 2:':haaw:'},
													7:{0:'78.gif' , 1:'Angel' , 2:':angel:'},
													8:{0:'79.gif' , 1:'killer' , 2:':kil:'},
													9:{0:'80.gif' , 1:'Cemetery' , 2:':died:'}},
										 8:{  0:{0:'81.gif' , 1:'Coffee' , 2:':cof:'},
													1:{0:'82.gif' , 1:'Forbidden fruit' , 2:':fruit:'},
													2:{0:'83.gif' , 1:'To tease' , 2:':tease:'},
													3:{0:'84.gif' , 1:'Devil' , 2:':evil:'},
													4:{0:'85.gif' , 1:'Excellently' , 2:':exc:'},
													5:{0:'86.gif' , 1:'Not I, and he' , 2:':niah:'},
													6:{0:'87.gif' , 1:'Studio' , 2:':Head:'},
													7:{0:'88.gif' , 1:'girl' , 2:':gl:'},
													8:{0:'89.gif' , 1:'Pomegranate' , 2:':granat:'},
													9:{0:'90.gif' , 1:'Gangster' , 2:':gans:'}},
										 9:{  0:{0:'91.gif' , 1:'User' , 2:':user:'},
													1:{0:'92.gif' , 1:'New year' , 2:':ny:'},
													2:{0:'93.gif' , 1:'Megavolt' , 2:':mvol:'},
													3:{0:'94.gif' , 1:'In a boat' , 2:':boat:'},
													4:{0:'95.gif' , 1:'Phone' , 2:':phone:'},
													5:{0:'96.gif' , 1:'Cop' , 2:':cop:'},
													6:{0:'97.gif' , 1:'Smoking' , 2:':smok:'}}};

/*var xbb_smiles = 		{0:{	0:{0:'1.gif' , 1:':D'				},
											   	1:{0:'2.gif' , 1:':)'     	},
											   	2:{0:'3.gif' , 1:':('     	},
											   	3:{0:'4.gif' , 1:':heap:' 	},
											   	4:{0:'5.gif' , 1:':ooi:'  	}	},
											1:{	0:{0:'6.gif' , 1:':so:'			},
										     	1:{0:'7.gif' , 1:':surp:'		},
										     	2:{0:'8.gif' , 1:':ag:'   	},
										     	3:{0:'9.gif' , 1:':ir:' 		},
										     	4:{0:'10.gif' , 1:':oops:'	} },
											2:{	0:{0:'11.gif' , 1:':P'    	},
											    1:{0:'12.gif' , 1:':cry:' 	},
											    2:{0:'13.gif' , 1:':rage:'	},
											    3:{0:'15.gif' , 1:':wink:'	},
											    4:{0:'16.gif' , 1:':yes:' 	} },
											3:{ 0:{0:'17.gif' , 1:':bot:'  	},
											    1:{0:'18.gif' , 1:':z)'    	},
											    2:{0:'19.gif' , 1:':arrow:'	},
											    3:{0:'20.gif' , 1:':lol:'  	},
											    4:{0:'41.gif' , 1:':lol:'  	} },
											4:{ 0:{0:'58.gif' , 1:':heart:'	},
											    1:{0:'64.gif' , 1:':gift:' 	},
											    2:{0:'74.gif' , 1:':pnk:' 	} }	};  */													
var fonts = 				{	0: 'Arial',
								    	1: 'Courier',
								    	2: 'Geneva',
								    	3: 'Impact',
								    	4: 'Optima',
								    	5: 'Times New Roman',
								    	6: 'Verdana',
								    	7: 'Tahoma',
								    	8: 'Symbol'};
				    	
// Insert begin & end round selection
function xbb_insertTags(begin, end) {
  /*if ('highlight' == bb.state) {
    xbb_insertTags2iframe(begin, end);
  } else {*/
    xbb_insertTags2textarea(begin, end);
  //}
  return false;
}

/*// Insert begin & end round selection on iframe
function xbb_insertTags2iframe(begin, end) {
  var iframe = document.getElementById(bb.iframeId);
  var wysiwyg = iframe.contentWindow.document;
  var sel;
  var range;
  if (wysiwyg.body.scrollTop) {
    var x = wysiwyg.body.scrollLeft;
    var y = wysiwyg.body.scrollTop;
  } else {
    var x = 0;
    var y = 0;
  }
  // для браузеров, не поддерживающих работу с выделением
  if (! wysiwyg.execCommand) {
    wysiwyg.body.innerHTML += begin + end;
    return false;
  }
  if (wysiwyg.selection) { // IE, Opera
		//retrieve selected range
		sel = wysiwyg.selection;
		if (null != sel) {
			range = sel.createRange();
			range = xbb_current_range;
			range.select();
		}
	}
	iframe.contentWindow.focus();
    // для браузеров,поддерживающих работу с выделением
    // Берем выделение в <font color="#000000">. Их может получиться несколько.
    wysiwyg.execCommand('ForeColor', false, '#000000');
    var nodes = wysiwyg.getElementsByTagName('font');
    if (! nodes.length && iframe.contentWindow.getSelection) { // Gecko, Opera
	    sel = iframe.contentWindow.getSelection();
	    range = sel.getRangeAt(0);
	    var html = wysiwyg.createElement('span');
	    html.innerHTML = begin + range + end;
	    var range2 = range.cloneRange();
	    // Insert text at cursor position
			sel.removeAllRanges();
			range.deleteContents();
			range.insertNode(html);
	    // Move the cursor to the end of text
			range2.selectNode(html);
			range2.collapse(false);
			sel.removeAllRanges();
			sel.addRange(range2);
			xbb_removeNode(html);
			iframe.contentWindow.focus();
			if (y && iframe.contentWindow.scrollTo) {
		        iframe.contentWindow.scrollTo(x, y);
		  }
		  return false;
    }
    while (nodes.length) {
    	// Вставляем begin и end
    	if ('span' != nodes.item(0).parentNode.tagName.toLowerCase()) {
  	    nodes.item(0).innerHTML = begin + nodes.item(0).innerHTML + end;
    	}
    	// Удаляем font
    	xbb_removeNode(nodes.item(0));
    }
    iframe.contentWindow.focus();
    if (y && iframe.contentWindow.scrollTo) { // для Opera
      iframe.contentWindow.scrollTo(x, y);
    }
    return false;
}*/

function xbb_insertTags2textarea(begin, end) {
  surroundText(begin, end);
  return false;
}

// Insert simple tags (like [b], [i], [u]...)
function xbb_insertSimpleTags(tag_name) {
  //xbb_buttonClick();
  window.document.getElementById('hidden_div').style.display = 'none';
  /*if ('highlight' == bb.state) {
    begin = '<span class="bb_tag"><span class="bb_bracket">[</span>'
        + '<span class="bb_tagname">' + tag_name
        + '</span><span class="bb_bracket">]</span></span>';
    end = '<span class="bb_tag"><span class="bb_bracket">[</span>'
        + '<span class="bb_slash">/</span><span class="bb_tagname">'
        + tag_name + '</span><span class="bb_bracket">]</span></span>';
    xbb_insertTags(begin, end);
  } else {*/
     xbb_insertTags('[' + tag_name + ']', '[/' + tag_name + ']');
  //}
  return false;
}

// Insert single tags (like [hr])
function xbb_insertSingleTag(tag_name) {
  //xbb_buttonClick();
  /*if ('highlight' == bb.state) {
      tag = '<span class="bb_tag"><span class="bb_bracket">[</span>'
          + '<span class="bb_tagname">' + tag_name
          + '</span><span class="bb_bracket">]</span></span>';
      xbb_insertTags(tag, '');
  } else {*/
      xbb_insertTags('[' + tag_name + ']', '');
  //}
  return false;
}

// Surrounds the selected text with text1 and text2.
function surroundText(text1, text2, textarea) {
	textarea = window.document.getElementById('post_body');
	// Can a text range be created?
	if (typeof(textarea.caretPos) != "undefined" && textarea.createTextRange) {
		var caretPos = textarea.caretPos, temp_length = caretPos.text.length;
		caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text1 + caretPos.text + text2 + ' ' : text1 + caretPos.text + text2;

		if (temp_length == 0) {
			caretPos.moveStart("character", -text2.length);
			caretPos.moveEnd("character", -text2.length);
			caretPos.select();
		}
		else
		textarea.focus(caretPos);
	}
	// Mozilla text range wrap.
	else if (typeof(textarea.selectionStart) != "undefined") {
		var begin = textarea.value.substr(0, textarea.selectionStart);
		var selection = textarea.value.substr(textarea.selectionStart, textarea.selectionEnd - textarea.selectionStart);
		var end = textarea.value.substr(textarea.selectionEnd);
		var newCursorPos = textarea.selectionStart;
		var scrollPos = textarea.scrollTop;

		textarea.value = begin + text1 + selection + text2 + end;

		if (textarea.setSelectionRange) {
			if (selection.length == 0) textarea.setSelectionRange(newCursorPos + text1.length, newCursorPos + text1.length);
			else textarea.setSelectionRange(newCursorPos, newCursorPos + text1.length + selection.length + text2.length);
			textarea.focus();
		}
		textarea.scrollTop = scrollPos;
	}
	// Just put them on the end, then.
	else {
		textarea.value += text1 + text2;
		textarea.focus(textarea.value.length - 1);
	}
}
// View code-highlight list
function xbb_codeList() {
  //xbb_buttonClick();
  var div = document.getElementById('hidden_div');
	if ('none' != div.style.display) {
    div.style.display = 'none';
    return false;
  }
  var coords = xbb_getCoords(document.getElementById('img_code'));
  div.style.left = coords['left'] + 'px';
  div.style.top = coords['top'] + coords['height'] + 'px';
  var html = '';
  for (var i = 0; xbb_code_names[i]; ++i) {
    html += '<a href="#" class="opt" onclick="xbb_insertSimpleTags(\''
        + xbb_code_names[i][0] + '\');return false;">' + xbb_code_names[i][1] + '</a><br />';
  }
  div.innerHTML = html;
  div.style.display = '';
  return false;
}

// View font-size list
function xbb_sizeList() {
  xbb_buttonClick();
  var div = document.getElementById('hidden_div');
	if ('none' != div.style.display) {
    div.style.display = 'none';
    return false;
  }
  var coords = xbb_getCoords(document.getElementById('img_size'));
  div.style.left = coords['left'] + 'px';
  div.style.top = coords['top'] + coords['height'] + 'px';
  var html = '';
  for (var i = 1; i <= 7; ++i) {
    html += '<a href="#" class="opt" onclick="xbb_insertSize(' + i
        + ');return false;"><font size="' + i + '">Font size '
        + i + '</font></a><br />';
  }
  div.innerHTML = html;
  div.style.display = '';
  return false;
}
// Insert tag [size]
function xbb_insertSize(size) {
 /* if ('highlight' == bb.state) {
    	begin = '<span class="bb_tag"><span class="bb_bracket">[</span>'
          	+ '<span class="bb_tagname">size</span>'
          	+ '<span class="bb_equal">=</span>'
          	+ '<span class="bb_attrib_val">' + size + '</span>'
         		+ '<span class="bb_bracket">]</span></span>';
      end 	= '<span class="bb_tag"><span class="bb_bracket">[</span>'
          	+ '<span class="bb_slash">/</span>'
          	+ '<span class="bb_tagname">size</span>'
          	+ '<span class="bb_bracket">]</span></span>';
  } else {*/
    begin = '[size=' + size + ']';
    end = '[/size]'
  //}
  document.getElementById('hidden_div').style.display = 'none';
	xbb_insertTags(begin, end);
	return false;
}

// View color palette
function xbb_colorList() {
  xbb_buttonClick();
  var div = document.getElementById('hidden_div');
	if ('none' != div.style.display) {
    div.style.display = 'none';
    return false;
  }
  var coords = xbb_getCoords(document.getElementById('img_color'));
  div.style.left = coords['left'] + 'px';
  div.style.top = coords['top'] + coords['height'] + 'px';
  var d=window.document;
	var Columns=16;
	s=d.getElementById('ta3').value;
  a=s.match(/#(\w{6})/ig);    //for  hex- #CCCCCC,#999999,#666666,...
  j=0; s2='<table bgColor=black>';
  while(a[j]){
		s2+='<tr>';
	  for(i=0;i<Columns;i++)if(a[j])s2+='<td'
	  	+'  style=\"font-size:4px;cursor:pointer;background-color:'+a[j++]+';\" width=\"4\" height=\"5\" onclick=\"xbb_insertColor(this);return false;\"></td>';
	    s2+='</tr>';
  }
  div.innerHTML = s2+'</table>';
  div.style.display = '';
  return false;
}

// Insert tag [color]
function xbb_insertColor(div) {
	var color = div.style.backgroundColor;
	color = rgbNormal(color);
  /*if ('highlight' == bb.state) {
    	begin = '<span class="bb_tag"><span class="bb_bracket">[</span>'
          	+ '<span class="bb_tagname">color</span>'
          	+ '<span class="bb_equal">=</span>'
            + '<span class="bb_attrib_val">' + color + '</span>'
         	  + '<span class="bb_bracket">]</span></span>';
      end   = '<span class="bb_tag"><span class="bb_bracket">[</span>'
            + '<span class="bb_slash">/</span>'
            + '<span class="bb_tagname">color</span>'
            + '<span class="bb_bracket">]</span></span>';
  } else {*/
    begin = '[color=' + color + ']';
    end = '[/color]'
  //}
  document.getElementById('hidden_div').style.display = 'none';
	xbb_insertTags(begin, end);
	return false;
}

// View font list 
function xbb_fontList() {
	xbb_buttonClick();
	var div = document.getElementById('hidden_div');
	if ('none' != div.style.display) {
        div.style.display = 'none';
        return false;
  }
  var coords = xbb_getCoords(document.getElementById('img_font'));
  div.style.left = coords['left'] + 'px';
  div.style.top = coords['top'] + coords['height'] + 'px';
  var html = '';
  for (var i = 0; fonts[i]; ++i) {
    html += '<a href="#" class="opt" style="font-family:'
        + fonts[i] + '" onclick="xbb_insertFont(\'' + fonts[i]
        + '\');return false;">' + fonts[i] + '</a><br />';
  }
  div.innerHTML = html;
  div.style.display = '';
  return false;
}

// Insert tag [font]
function xbb_insertFont(font) {
	/*if ('highlight' == bb.state) {
	    begin = '<span class="bb_tag"><span class="bb_bracket">[</span>'
            + '<span class="bb_tagname">font</span>'
            + '<span class="bb_equal">=</span><span class="bb_quote">"</span>'
            + '<span class="bb_attrib_val">' + font + '</span>'
            + '<span class="bb_quote">"</span>'
            + '<span class="bb_bracket">]</span></span>';
        end = '<span class="bb_tag"><span class="bb_bracket">[</span>'
            + '<span class="bb_slash">/</span>'
            + '<span class="bb_tagname">font</span>'
            + '<span class="bb_bracket">]</span></span>';
    } else {*/
        begin = '[font="' + font + '"]';
        end = '[/font]'
    //}
  document.getElementById('hidden_div').style.display = 'none';
	xbb_insertTags(begin, end);
	return false;
}

// View image list
function xbb_imageList(img_str, dom_res, img_str_m) {
	xbb_buttonClick();
	var div = document.getElementById('hidden_div');
	if ('none' != div.style.display) {
    div.style.display = 'none';
    return false;
  }
  var coords = xbb_getCoords(document.getElementById('img_img'));
  div.style.left = coords['left'] + 'px';
  div.style.top = coords['top'] + coords['height'] + 'px';
	var images = img_str.split("##");
	var images_m = img_str_m.split("##");
  var html = '';
  var cnt = 1;
  for (var i = 0; images[i]; ++i) {
    html += "<img src='"+dom_res+"/"+images[i]+"' style='padding:1px;' onclick='xbb_insertImg(\""+dom_res+"/"+images_m[i]+"\");return false;' onmouseover='this.style.cursor=\"pointer\"'>";
    if (cnt == 3) {
    	html += "<br>";
    	cnt = 0;
    }
    ++cnt;
  }
  div.innerHTML = html;
  div.style.display = '';
  return false;
}

// Insert tag [img]
function xbb_insertImg(src) {
	/*if ('highlight' == bb.state) {
	    begin = '<span class="bb_tag"><span class="bb_bracket">[</span>'
            + '<span class="bb_tagname">font</span>'
            + '<span class="bb_equal">=</span><span class="bb_quote">"</span>'
            + '<span class="bb_attrib_val">' + font + '</span>'
            + '<span class="bb_quote">"</span>'
            + '<span class="bb_bracket">]</span></span>';
        end = '<span class="bb_tag"><span class="bb_bracket">[</span>'
            + '<span class="bb_slash">/</span>'
            + '<span class="bb_tagname">font</span>'
            + '<span class="bb_bracket">]</span></span>';
    } else {*/ 
      begin = '[img]'+src;
      end = '[/img]'
    //}
  document.getElementById('hidden_div').style.display = 'none';
	xbb_insertTags(begin, end);
	return false;
}
// View video list
function xbb_videoList(vid_str, dom_res, vid_str_v) {
	xbb_buttonClick();
	var div = document.getElementById('hidden_div');
	if ('none' != div.style.display) {
    div.style.display = 'none';
    return false;
  }
  var coords = xbb_getCoords(document.getElementById('img_size'));
  div.style.left = coords['left'] + 'px';
  div.style.top = coords['top'] + coords['height'] + 'px';
	var videos = vid_str.split("##");
	var videos_v = vid_str_v.split("##");
  var html = '';
  var cnt = 1;
  for (var i = 0; videos[i]; ++i) {
    html += "<img src='"+dom_res+"/"+videos[i]+"' style='padding:1px;' onclick='xbb_insertVid(\""+dom_res+"/"+videos_v[i]+"\");return false;' onmouseover='this.style.cursor=\"pointer\"' width=\"100\" height=\"100\">";
    if (cnt == 3) {
    	html += "<br>";
    	cnt = 0;
    }
    ++cnt;
  }
  div.innerHTML = html;
  div.style.display = '';
  return false;
}

// Insert tag [video]
function xbb_insertVid(src) {
	/*if ('highlight' == bb.state) {
	    begin = '<span class="bb_tag"><span class="bb_bracket">[</span>'
            + '<span class="bb_tagname">font</span>'
            + '<span class="bb_equal">=</span><span class="bb_quote">"</span>'
            + '<span class="bb_attrib_val">' + font + '</span>'
            + '<span class="bb_quote">"</span>'
            + '<span class="bb_bracket">]</span></span>';
        end = '<span class="bb_tag"><span class="bb_bracket">[</span>'
            + '<span class="bb_slash">/</span>'
            + '<span class="bb_tagname">font</span>'
            + '<span class="bb_bracket">]</span></span>';
    } else {*/
      begin = '[video]' + src;
      end = '[/video]'
    //}
  document.getElementById('hidden_div').style.display = 'none';
	xbb_insertTags(begin, end);
	return false;
}

// Insert tags [url]
function xbb_insertLink(tag, text) {
	xbb_buttonClick();
	if ('none' != document.getElementById('hidden_div').style.display) {
    document.getElementById('hidden_div').style.display = 'none';
  }
	var url = prompt(text, "");
	if (! url) { return false; }
	/*if ('highlight' == bb.state) {
	    url = '<span class="bb_tag"><span class="bb_bracket">[</span>'
            + '<span class="bb_tagname">' + tag
            + '</span><span class="bb_bracket">]</span></span>'
            + '<span class="bb_autolink">' + url
            + '</span><span class="bb_tag"><span class="bb_bracket">[</span>'
            + '<span class="bb_slash">/</span><span class="bb_tagname">' + tag
            + '</span><span class="bb_bracket">]</span></span>';
        xbb_insertTags(url, '');
    } else {*/
        xbb_insertTags('[' + tag + ']' + url + '[/' + tag + ']', '');
    //}
    return false;
}
// View smile list
function xbb_smilesList(temp_url) {
  //xbb_buttonClick();
  var div = document.getElementById('hidden_div');
	if ('none' != div.style.display) {
        div.style.display = 'none';
        return false;
	}
  var coords = xbb_getCoords(document.getElementById('img_img'));
  div.style.left = coords['left'] + 'px';
  div.style.top = coords['top'] + coords['height'] + 'px';
  var html = '<table border="0" cellpadding="0" cellspacing="1">';
  for (var i = 0; xbb_smiles[i]; ++i) {
      html += '<tr>';
      for (var j = 0; xbb_smiles[i][j]; ++j) {
          html += '<td height="20" width="20" ><a href="#" '
              + 'onclick="xbb_insertSmile(\'' + xbb_smiles[i][j][2]
              + '\'); return false;"><img alt="' + xbb_smiles[i][j][1]
              + '" src="'+temp_url+'/images/buttons/smiles/' + xbb_smiles[i][j][0]
              + '" border="0" /></a></td>';
      }
      html += '</tr>';
  }
  html += '</table>';
  div.innerHTML = html;
  div.style.display = '';
  return false;
}
// Insert smiles
function xbb_insertSmile(smile) {
	xbb_buttonClick();
	document.getElementById('hidden_div').style.display = 'none';
	/*if ('highlight' == bb.state) {
        xbb_insertTags('<span class="bb_mnemonic">' + smile  + '</span>', '');
    } else {*/
       xbb_insertTags(smile, '');
   // }
   return false;
}
// insert tags with attributes, like [tag align=center][/tag]
function xbb_insertTagWithAttribute(tag, text) {
    xbb_buttonClick();
    var begin;
    var end;
    var val = prompt(text, "");
	/*if ('highlight' == bb.state) {
	    begin = '<span class="bb_tag"><span class="bb_bracket">[</span>'
            + '<span class="bb_tagname">' + tag + '</span>';
        if (val) {
            begin += '<span class="bb_equal">=</span>'
                + '<span class="bb_quote">"</span>'
                + '<span class="bb_attrib_val">' + val + '</span>'
                + '<span class="bb_quote">"</span>';
        }
        begin += '<span class="bb_bracket">]</span></span>';
        end = '<span class="bb_tag"><span class="bb_bracket">[</span>'
            + '<span class="bb_slash">/</span><span class="bb_tagname">' + tag
            + '</span><span class="bb_bracket">]</span></span>';
    } else {*/
        begin = '[' + tag;
        if (val) { begin += '="' + val + '"'; }
        begin += ']';
        end = '[/' + tag + ']';
    //}
    xbb_insertTags(begin, end);
    return false;
}
//preview blog
function xbb_submit(m_id) {
    /*if ('highlight' == bb.state) {
        bb.text = bb.innerText(xbb_iframe.contentWindow.document.body);
        xbb_textarea.value = bb.text;
    }*/
		xajax_modelBlogShow(m_id, 3, 0, 0, 1, document.getElementById('post_body').value);
		return false;
}
// Determine position & size of element
function xbb_getCoords(element) {
    var left = element.offsetLeft;
    var top = element.offsetTop;
    for (var parent = element.offsetParent; parent; parent = parent.offsetParent) {
        left += parent.offsetLeft - parent.scrollLeft;
        top += parent.offsetTop - parent.scrollTop
    }
    return {
    	left: left,
    	top: top,
    	width: element.offsetWidth,
    	height: element.offsetHeight
    };
}
function xbb_buttonClick() {
  /*  var sel;
	if (xbb_iframe.contentWindow.document.selection) { // IE, Opera
	    sel = xbb_iframe.contentWindow.document.selection;
	    xbb_current_range = sel.createRange();
	}*/
  return false;
}
