
function storeCaret(textEl) {
	if (textEl.createTextRange) textEl.caretPos = document.selection.createRange().duplicate();
	xbb_hhide();
}

function replaceText(text, textarea)
{	
	xbb_hhide();
	// Attempt to create a text range (IE).
	if (typeof(textarea.caretPos) != "undefined" && textarea.createTextRange)
	{
		var caretPos = textarea.caretPos;

		caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? 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 surroundText(text1, text2, textarea)
{	
	xbb_hhide();

	// 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);
	}

}



function xbb_buttonClick() {
    var sel;
/*
	if (document.selection) { // IE, Opera
	    sel = document.selection;
	    xbb_current_range = sel.createRange();
	}  */
 return;
}



String.prototype.toCamelCase = function() {
	var string, tokens = this.split('-');
	if (tokens.length > 1) {
		for (var i = 1; i < tokens.length; i++) {
			tokens[i] = tokens[i].substring(0, 1).toUpperCase() + tokens[i].substring(1).toLowerCase();
		}
		string = tokens.join('');
	}
	return string;
};

var Util = {

	dom: {
		
		browser: {
			isOpera: navigator.userAgent.toLowerCase().indexOf('opera') > -1
		},
		
		getStyle: function(element, styleName) {
			if(!element) return;
			if (element.currentStyle) {
				return element.currentStyle[styleName.toCamelCase()] || null;
			} else if (document.defaultView) {
				return document.defaultView.getComputedStyle(element, null).getPropertyValue(styleName);
			} else if (element.style) {
				return element.style[styleName] || element.style[styleName.toCamelCase()] || null;
			}
		},
		
		getObjectPostion: function(obj) {
			    var pos = {top: 0, left: 0}, el = obj;
			    var isOpera = navigator.userAgent.toLowerCase().indexOf('opera')> -1;
			    while(obj) {
			        pos.top += obj.offsetTop;
			        pos.left += obj.offsetLeft;
			        if (!isOpera) {
			            pos.top += parseInt(this.getStyle(obj.offsetParent, 'border-top-width')) || 0;
			            pos.left += parseInt(this.getStyle(obj.offsetParent, 'border-left-width')) || 0;
			        }
			        obj = obj.offsetParent;
			    }
			    for (obj = el.parentNode; obj && obj != document.body; obj = obj.parentNode) {
			        pos.top -= obj.scrollTop;
			        pos.left -= obj.scrollLeft;
			    }   
			    return pos;
		}
		
	}
	
}


function xbb_getCoords(element) {


	var pos = Util.dom.getObjectPostion(element);

    return {
    	left: pos.left,
    	top: pos.top,
    	width: element.offsetWidth,
    	height: element.offsetHeight
    };
}

/*
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_smilesList() {
    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_smile'));


    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; bb.smiles[i]; ++i) {
        html += '<tr>';
        for (var j = 0; bb.smiles[i][j]; ++j) {
            html += '<td height="20" width="20" ><a href="#" '
                + 'onclick="xbb_insertSmile(\'' + bb.smiles[i][j][1]
                + '\'); return false;"><img alt="' + bb.smiles[i][j][1]
                + '" src="/	tim/div/bbcode/images/smiles/' + bb.smiles[i][j][0]
                + '" border="0" /></a></td>';
        }
        html += '</tr>';
    }
    html += '</table>';
    div.innerHTML = html;
    div.style.display = '';
    return false;
}


function xbb_insertSmile(smile) {
	xbb_buttonClick();
	document.getElementById('hidden_div').style.display = 'none';

	surroundText(smile, '', gettarea());
}

function xbb_insertTagWithAttribute(tag, text) {
    xbb_buttonClick();
    var begin;
    var end;
    var val = prompt(text, "");
	
        begin = '[' + tag;
        if (val) { begin += '="' + val + '"'; }
        begin += ']';
        end = '[/' + tag + ']';

    surroundText(begin, end, gettarea());
    return false;
}

function xbb_hhide() {
document.getElementById('hidden_div').style.display   = 'none';

}

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="xbb_opt" onclick="surroundText(\'['+ xbb_code_names[i][0] + ']\',\'[/'+ xbb_code_names[i][0] + ']\',gettarea()); xbb_hhide(); return false;">' + xbb_code_names[i][1] + '</a>';
    }
    div.innerHTML = html;
    div.style.display = '';
    return false;
}




function bbcode(code) {
    this.text = code;
    this.syntax = [];
    this.tags = [];
    this.autolinks = true;

    this.mnemonics = [];
    this.smiles = [];
    this.fonts = [];
    this.colors = [];
    this.iframeId = 'xbb_iframe';
    this.textareaId = 'xbb_textarea';
    this.transportDiv = parent.document.getElementById('xbb_transport_div');
    this.state = 'plain';
 
}




var xbb_current_range;

var bb = new bbcode('');
bb.tags=['*','a','abbr','acronym','address','align','anchor','b','bbcode','bdo','big','blockquote','br','caption','center','chess','cite','color','del','em','email','font','google','h1','h2','h3','h4','h5','h6','hr','i','img','ins','justify','left','list','md','nobb','ol','p','quote','right','s','size','small','strike','strong','sub','sup','table','td','th','tr','tt','u','ul','url','var','actionscript','ada','apache','applescript','asm','asp','autoit','bash','blitzbasic','bnf','c','c++','c#','c_mac','caddcl','cadlisp','cfdg','cfm','code','cpp-qt','css','d','delphi','diff','div','dos','eiffel','fortran','freebasic','gml','groovy','html4','idl','ini','inno','io','java','java5','js','latex','lisp','lua','matlab','mirc','mpasm','mysql','nsis','objc','ocaml','oobas','oracle','pascal','perl','php','plsql','pre','python','qbasic','reg','robots','ruby','sas','scheme','sdlbasic','smalltalk','smarty','sql','t-sql','tcl','text','thinbasic','vb','vb.net','vhdl','visualfoxpro','winbatch','xml','z80'];
bb.mnemonics=[':D',':)',':(',':heap:',':ooi:',':so:',':surp:',':ag:',':ir:',':oops:',':P',':cry:',':rage:',':B',':roll:',':wink:',':yes:',':bot:',':z)',':arrow:',':vip:',':Heppy:',':think:',':bye:',':roul:',':pst:',':o',':closed:',':cens:',':tani:',':appl:',':idnk:',':sing:',':shock:',':tgu:',':res:',':alc:',':lam:',':box:',':tom:',':lol:',':vill:',':idea:',':oops:',':E',':sex:',':horns:',':love:',':poz:',':roza:',':meg:',':dj:',':rul:',':offln:',':sp:',':stapp:',':girl:',':heart:',':kiss:',':spam:',':party:',':ser:',':eam:',':gift:',':adore:',':pie:',':egg:',':cnrt:',':oftop:',':foo:',':mob:',':hoo:',':tog:',':pnk:',':pati:',':-({|=:',':haaw:',':angel:',':kil:',':died:',':cof:',':fruit:',':tease:',':evil:',':exc:',':niah:',':Head:',':gl:',':granat:',':gans:',':user:',':ny:',':mvol:',':boat:',':phone:',':cop:',':smok:',':bic:',':ban:',':bar:'];
bb.state='plain';
bb.fonts=['Arial','Courier','Geneva','Impact','Optima','Times New Roman','Verdana','Tahoma','Symbol'];
bb.colors=[['Black','Maroon','Green','Navy'],['Silver','Red','Lime','Blue'],['Gray','Purple','Olive','Teal'],['White','Fuchsia','Yellow','Aqua']];
bb.smiles=[[['1.gif',':D'],['2.gif',':)'],['3.gif',':('],['4.gif',':heap:'],['5.gif',':ooi:']],[['6.gif',':so:'],['7.gif',':surp:'],['8.gif',':ag:'],['9.gif',':ir:'],['10.gif',':oops:']],[['11.gif',':P'],['12.gif',':cry:'],['13.gif',':rage:'],['15.gif',':roll:'],['16.gif',':wink:']],[['17.gif',':yes:'],['18.gif',':bot:'],['19.gif',':z)'],['20.gif',':arrow:'],['41.gif',':lol:']],[['58.gif',':heart:'],['64.gif',':gift:'],['74.gif',':pnk:']]];

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'                   }
};


               
