var imgLib;
var fileLib;
var uploadFrame;
var imgLibPath		= '';
var imageLibrary		= 'img.library';
var fileLibrary			= 'file.library';
var library;
var library2;

function BBCodeElement(TextAreaElement,embedded)
{
	var self = this;
	
	this.element = TextAreaElement;
	
	this.textCursor;
	this.textPosition;
	
	this.selectionStart;
	this.selectionEnd;
	this.uploadImages = false;
	this.lastTimeUpdate;
	
	this.picbox;
	this.urlbox;
	this.IEMode;
	this.range;
	
	this.button = new Array();

	// copy element contents
	this.elementContents = TextAreaElement.value;
	this.content = TextAreaElement.value;

	this.expertMode = false;

	this.aBold = false;			this.aItalics = false;		this.aUnderline = false;
	this.aLineThrough = false;	this.aSubScript = false;	this.aSuperScript = false;

	this.init = function() {
		if(pagePrivileges & 16)
			self.uploadImages = true;

		//Open "Editor" in Window..
		if(typeof(embedded) == 'undefined')
		{
			self.rteWindow = new sitePEWin({close: false});
			self.rteWindow.setHeight(250);
			self.rteWindow.setWidth(800);
		}

		self.buttonBar = document.createElement('div');
		if(typeof(embedded) == 'undefined')
			self.rteWindow.content.appendChild(self.buttonBar);
		else
			self.element.parentNode.appendChild(self.buttonBar);
		self.buttonBar.className = 'wysiwygButtonBar';
		self.reprintButtonBar();

		tempdummy = document.createElement('div');
		if(typeof(embedded) == 'undefined') {
			tempdummy.className = 'rTEdiv';
			self.richTextEditor.style.height = '';
		} else
			tempdummy.className = 'rTEdivEmbedded';
		self.richTextEditor = self.element;
		
		if(typeof(embedded) == 'undefined') {
			self.rteWindow.content.appendChild(tempdummy);
			self.rteWindow.setTitle('Editor');
		} else {
			self.element.parentNode.appendChild(tempdummy);
		}
		tempdummy.appendChild(self.richTextEditor);

		//self.richTextEditor.value = self.dounhtml(self.elementContents);

		text = document.createElement('div');
		text.innerHTML = 'Vorschau:';
		self.element.parentNode.appendChild(text);
		self.element.parentNode.appendChild(document.createElement('hr'));
		self.resultArea = document.createElement('div');
		self.resultArea.className = 'resultArea';
		self.element.parentNode.appendChild(self.resultArea);

		self.richTextEditor.className = 'htmlTextEditorField';
		self.richTextEditor.id = 'rTE';
		
		self.updateResult();
		
		self.evalSelection();
		
		self.richTextEditor.onfocus = self.rTEonfocus;
		self.richTextEditor.onblur = self.rTEonblur;
		self.richTextEditor.onmouseup = self.evalSelection;
		
		self.richTextEditor.blur();
		self.richTextEditor.focus();
	}

	this.reprintButtonBar = function() {
		self.buttonBar.innerHTML = '';

		buttonlables = new Array('', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '' );

		buttonToolTips = new Array(
			'Fett',
			'Kursiv',
			'Unterstrichen',
			'Durchgestrichen',
			'Tiefgestellt',
			'Hochgestellt',
			'Linksbündig',
			'Zentriert',
			'Rechtsbündig',
			'Blocksatz',
			'Schrift größer',
			'Schrift kleiner',
			'Hervorheben',
			'Schriftfarbe',
			'Tabelle einfügen',
			'Link einfügen',
			'Bild einfügen',
			'Datei einfügen'
		); 

		buttonfunctions = new Array(
			self.setBold,
			self.setItalic,
			self.setUnderline,
			'',
			self.setSubscript,
			self.setSuperscript,
			self.setAlignLeft,
			self.setAlignCenter,
			self.setAlignRight,
			self.setAlignJustify,
			'',
			'',
			self.setMarkColorTarget,
			self.setFontColorTarget,
			self.insertTable,
			self.openLinkInsertDialog,
			self.openImgInsertDialog,
			''
		); 

		for(i = 0; i< buttonlables.length; i++){
			if(typeof(buttonfunctions[i]) != 'function') { self.button[i] = false; continue };
			self.button[i] = document.createElement('div');
			self.button[i].className = 'button buttonNormal'+i;
			self.button[i].title = buttonToolTips[i];
			self.button[i].onmouseout = new Function('','this.className = \'button buttonNormal'+i+'\'');
			self.button[i].innerHTML = buttonlables[i];
			self.button[i].onclick = buttonfunctions[i];
			self.button[i].onmouseover = new Function('','this.className = \'button buttonMouseover'+i+'\'');
		
			self.buttonBar.appendChild(self.button[i]);
		}
		/*
		self.expertModeButton = document.createElement('div');
		self.expertModeButton.className = 'expertButton buttonNormalHTML';
		self.expertModeButton.onmouseout = self.getExpertMode;
		self.expertModeButton.innerHTML = '';
		self.expertModeButton.onclick = self.setExpertMode;
		self.expertModeButton.onmouseover = function() { this.className = 'expertButton buttonMouseoverHTML' };
		self.buttonBar.appendChild(self.expertModeButton);
		*/
	}

	this.setExpertMode = function() {
		self.expertMode = !self.expertMode;
		self.getExpertMode();
	}

	this.getExpertMode = function() {
		if(self.expertMode)
			self.expertModeButton.className = 'expertButton buttonActiveHTML';
		else
			self.expertModeButton.className = 'expertButton buttonNormalHTML';
	}

	this.setFontColorTarget = function(Event){
		if(window.event)
		{
			ypos=window.event.clientY;
			ypos += document.documentElement.scrollTop;
			xpos=window.event.clientX;
			xpos += document.documentElement.scrollLeft;
		}
		else
		{
			ypos=Event.pageY;
			xpos=Event.pageX;
		}
		
		callerCoordX = xpos;
		callerCoordY = ypos;

		rteCaller = self;
		rteCallerType = 'font';
		openColorChanger();
	}
	
	this.setMarkColorTarget = function(Event){
		if(window.event)
		{
			ypos=window.event.clientY;
			ypos += document.documentElement.scrollTop;
			xpos=window.event.clientX;
			xpos += document.documentElement.scrollLeft;
		}
		else
		{
			ypos=Event.pageY;
			xpos=Event.pageX;
		}
		
		callerCoordX = xpos;
		callerCoordY = ypos;

		rteCaller = self;
		rteCallerType = 'mark';
		openColorChanger();
	}

	this.changeSelection = function(start,end) {
		if(typeof(self.IEMode)!='undefined') {

			start -= self.startTxt.split('\n').length-1;
			end -= self.startTxt.split('\n').length-1;
			end -= self.selTxt.split('\n').length-1;

			range2 = range.duplicate();
			range2.moveToElementText( self.richTextEditor );
			range2.collapse(true);
			range2.moveEnd('character',end);
			range2.moveStart('character',start);
			range.setEndPoint('EndToEnd',range2);
			range.setEndPoint('StartToStart',range2);
			if(start-end == 0)
				range.collapse(true);
			range.select();
		} else {
			self.richTextEditor.selectionStart = start;
			self.richTextEditor.selectionEnd = end;
		}
	}

	this.evalSelection = function(keypressed,shiftKey) {
		self.richTextEditor.focus();

		if(typeof(self.richTextEditor.selectionStart)!='undefined') {
			start	= self.richTextEditor.selectionStart;
			end		= self.richTextEditor.selectionEnd;
			oldEnd = end;
			oldStart = start;
		} else {
			self.range = document.selection.createRange();
			range = self.range.duplicate();
			range2 = range.duplicate();
			range2.moveToElementText( self.richTextEditor );
			range2.setEndPoint( 'EndToEnd', range );
			start = range2.text.length - range.text.length;
			end = start + range.text.length;
			self.IEMode = true;
			oldStart = start; oldEnd = end;
		}
		
		selectedText		= self.richTextEditor.value.substring(start, end);
		textBeforeSelection	= self.richTextEditor.value.substring(0,start);
		textAfterSelection	= self.richTextEditor.value.substring(end);

		if(typeof(keypressed)!='undefined' && keypressed == 37 && !shiftKey)
			end = start;
		else if(typeof(keypressed)!='undefined' && (keypressed == 38 || keypressed==39 || keypressed ==40) && !shiftKey)
			start = end;

		selectedText		= self.richTextEditor.value.substring(start, end);
		textBeforeSelection	= self.richTextEditor.value.substring(0,start);
		textAfterSelection	= self.richTextEditor.value.substring(end);
		
		self.selTxt = selectedText;
		self.startTxt = textBeforeSelection;
		self.endTxt = textAfterSelection;

		if(start!=oldStart || end!=oldEnd) {
			self.changeSelection(start,end);
		}

		self.start = start;
		self.end = end;

		tests = new Array(
			new Array('\\[b\\]','\\[/b\\]','aBold',self.button[0]),
			new Array('\\[i\\]','\\[/i\\]','aItalics',self.button[1]),
			new Array('\\[u\\]','\\[/u\\]','aUnderline',self.button[2]),
			new Array('','','',self.button[3]),
			new Array('\\[sub\\]','\\[/sub\\]','aSubScript',self.button[4]),
			new Array('\\[sup\\]','\\[/sup\\]','aSuperScript',self.button[5])
		);
		
		for(t in tests){
			if(!self.expertMode) {
				if(!self.find(selectedText,tests[t][0]) && !self.find(selectedText,tests[t][1]) && textBeforeSelection.lastIndexOf(tests[t][0]) > textBeforeSelection.lastIndexOf(tests[t][1])){
					self[tests[t][2]] = true;
					tests[t][3].className = 'button buttonActive'+t;
					tests[t][3].onmouseout = new Function('','this.className = \'button buttonActive'+t+'\'');
				} else {
					self[tests[t][2]] = false;
					tests[t][3].className = 'button buttonNormal'+t;
					tests[t][3].onmouseout = new Function('','this.className = \'button buttonNormal'+t+'\'');
				}
			}
			else {
				self[tests[t][2]] = false;
				tests[t][3].className = 'button buttonNormal'+t;
				tests[t][3].onmouseout = new Function('','this.className = \'button buttonNormal'+t+'\'');
			}
		}
	}

	this.changeColorStyle = function(style,cValue) {
		self.richTextEditor.focus();
		selectedText = self.selTxt;
		textBefore = self.startTxt;
		textAfter = self.endTxt;
		
		start = self.start;
		end = self.end;

		styleRegExp = new RegExp("^((?:\n|\r|\s|.)*?)\\["+style+"=(([#a-zA-Z0-9])*?)\\]((?:\n|\r|\s|.)*?)\\[/"+style+"\\]((?:\n|\r|\s|.)*?)$");
		if(sizedText = styleRegExp.exec(selectedText))
			selectedText = sizedText[1]+sizedText[3]+sizedText[4];

		if(cValue == null) {
			databefore = '';
			dataafter = '';
		}
		else {
			databefore = '['+style+'=#'+cValue+']';
			dataafter = '[/'+style+']';
		}

		self.richTextEditor.value = textBefore + databefore + selectedText + dataafter + textAfter;
		end = start + databefore.length + selectedText.length + dataafter.length;
		self.changeSelection(start,end);
		self.evalSelection();
		self.richTextEditor.focus();
	}
	
	/*
	this.changeFontSize = function(direction){
		self.richTextEditor.focus();
		if (typeof(self.richTextEditor.selectionStart) == 'undefined')
			range = document.selection.createRange();
		selectedText = self.selTxt;
		textBefore = self.startTxt;
		textAfter = self.endTxt;
		
		start = self.start;
		end = self.end;

		fontSizeRegExp = /^((?:\n|\r|\s|.)*?)<span style="font-size: ([0-9]{1,2})px;">((?:\n|\r|\s|.)*?)<\/span>((?:\n|\r|\s|.)*?)$/;

		if(sizedText = fontSizeRegExp.exec(selectedText)) {
			oldSize = sizedText[2];
			selectedText = sizedText[1]+sizedText[3]+sizedText[4];
			if(direction==1)
				newSize = oldSize*1+4;
			else
				newSize = oldSize-4;
		}
		else {
			if(direction==1)
				newSize = 20;
			else
				newSize = 12;
		}

		if(newSize < 0)
			newSize = 0;
		if(newSize > 96)
			newSize = 96;

		if(newSize == 16) {
			databefore = '';
			dataafter = '';
		}
		else {
			databefore = '<span style="font-size: '+newSize+'px;">';
			dataafter = '</span>';
		}

		self.richTextEditor.value = textBefore + databefore + selectedText + dataafter + textAfter;
		end = start + databefore.length + selectedText.length + dataafter.length;
		self.changeSelection(start,end);
		self.richTextEditor.focus();
		self.evalSelection();
	}
	*/
	
	/*FormatFunctions*/ {
		this.changeFontColor = function(color){ if(color == 'default')color = null;self.changeColorStyle('color',color);self.updateResult(); }
		this.changeMarkColor = function(color){ if(color == 'default')color = null;self.changeColorStyle('mark',color);self.updateResult(); }
	//	this.increaseSize = function(){ self.changeFontSize(1); self.updateResult(); }
	//	this.decreaseSize = function(){ self.changeFontSize(-1); self.updateResult(); }
		this.insertTable = function(){ self.insertData('[table]','[/table]',-1); self.updateResult(); }
		this.setAlignLeft = function(){ self.insertData('[left]','[/left]',1); self.updateResult(); }
		this.setAlignCenter = function(){ self.insertData('[center]','[/center]',1); self.updateResult(); }
		this.setAlignRight = function(){ self.insertData('[right]','[/right]',1); self.updateResult(); }
		this.setAlignJustify = function(){ self.insertData('[justify]','[/div]',1); self.updateResult(); }

		this.setBold = function(){ if(self.aBold == false) { self.insertData('[b]','[/b]',1); } else { self.insertData('[/b]','[b]',1); } self.updateResult(); }
		this.setItalic = function(){ if(self.aItalics == false) { self.insertData('[i]','[/i]',1);} else { self.insertData('[/i]','[i]',1); } self.updateResult(); }
		this.setUnderline = function(){ if(self.aUnderline == false) {  self.insertData('[u]','[/u]',1);} else { self.insertData('[/u]','[u]',1); } self.updateResult(); }
		this.setSubscript = function(){ if(self.aSubScript == false) {  self.insertData('[sub]','[/sub]',1);} else { self.insertData('[/sub]','[sub]',1); } self.updateResult(); }
		this.setSuperscript = function(){ if(self.aSuperScript == false) {  self.insertData('[sup]','[/sup]',1);} else { self.insertData('[/sup]','[sup]',1); } self.updateResult(); }
		//this.setLineThrough = function(){ if(self.aLineThrough == false) {  self.insertData('<span style="text-decoration:line-through;">','</span>',1);} else { self.insertData('</span>','<span style="text-decoration:line-through;">'); } self.updateResult(); }
	}

	this.rTEonfocus = function(){
		document.onkeydown = self.testSpecialKeys;
		document.onkeyup = self.monitorCursorMovement;
		document.onkeypress = self.monitorKeyPress;
	}

	this.rTEonblur = function(){
		document.onkeyup = function () { return; };
		document.onkeypress = function() { return; };
	}
	
	this.monitorKeyPress = function(Ereignis) {
		if(!self.expertMode && window.opera){ // Opera seems to remap keys for this event, thus executing them nonetheless...
			if (!Ereignis)
				Ereignis = window.event;
			if (Ereignis.which)
				key = Ereignis.which;
			else if (Ereignis.keyCode)
				key = Ereignis.keyCode;
				
			if(key == 9)
				return false;

			if((key == 226 && !window.opera) || (window.opera && key == 188))
				return false;

			if(key == 54 || key==38)
				return false;

/*
			if(key==8)	// Backspace
				return self.deletePrevObject(false);
			if(key==46)	// Entf-Taste
				return self.deleteNextObject(false);
*/
			if((key==60 || key==62))
				return false;
		}
	}
	
	this.testSpecialKeys = function(Ereignis) {
		if (!Ereignis)
			Ereignis = window.event;
		if (Ereignis.which)
			key = Ereignis.which;
		else if (Ereignis.keyCode)
			key = Ereignis.keyCode;

		if(key == 13 && self.linkInsertDialog.is_closed == false){
			self.insertURL();
			return false;
		}
		if(key == 13 && self.picInsertDialog.is_closed == false){
			self.insertPIC();
			return false;
		}
		if(key == 27 && self.linkInsertDialog.is_closed == false){
			self.urlbox.value='';
			self.insertURL();
			return false;
		}
		if(key == 27 && self.picInsertDialog.is_closed == false){
			self.picbox.value='';
			self.insertPIC();
			return false;
		}

		if(self.picInsertDialog.is_closed == false || self.linkInsertDialog.is_closed == false)
			return;

		if(key == 9) {
			self.insertData("\t");
			return false;
		}

		if(((key == 226 && !window.opera) || (window.opera && key == 188)) && !self.expertMode) {
			if(Ereignis.shiftKey)
				self.insertData(">");
			else if(Ereignis.ctrlKey && Ereignis.altKey)
				self.insertData("|");
			else
				self.insertData("<");
			return false;
		}
		
		if(key == 109 && !self.expertMode) {
			if(!Ereignis.shiftKey && !Ereignis.ctrlKey && !Ereignis.altKey) {
				self.insertData("-");
				return false;
			}
		}
	
		/*
		if(key == 54 && !self.expertMode) {
			if(Ereignis.shiftKey)
				self.insertData("&amp;");
			else
				self.insertData("6");
			return false;
		}

		if(key==8 && !self.expertMode){		// Backspace
			return self.deletePrevObject();
		}
		if(key==46 && !self.expertMode){	// Entf-Taste
			return self.deleteNextObject();
		}
		*/
		
		if(Ereignis.shiftKey && Ereignis.ctrlKey) {
			if(key==70){
				self.setBold();
				return false;
			}
			if(key==85){
				self.setUnderline();
				return false;
			}
			if(key==75){
				self.setItalic();
				return false;
			}
		}
	}
	
	this.deleteEmptyFormats = function() {
		formats = new Array(
			new Array('\\[b\\]','\\[/b\\]'),
			new Array('\\[i\\]','\\[/i\\]'),
			new Array('\\[u\\]','\\[/u\\]'),
			new Array('\\[sub\\]','\\[/sub\\]'),
			new Array('\\[sup\\]','\\[/sup\\]')
		);
		if(typeof(self.richTextEditor.selectionStart)!='undefined') {
			start	= self.richTextEditor.selectionStart;
			end		= self.richTextEditor.selectionEnd;
			oldStart = start; oldEnd = end;
		} else {
			self.range = document.selection.createRange();
			range = self.range.duplicate();
			range2 = range.duplicate();
			range2.moveToElementText( self.richTextEditor );
			range2.setEndPoint( 'EndToEnd', range );
			start = range2.text.length - range.text.length;
			end = start + range.text.length;
			self.IEMode = true;
			oldStart = start; oldEnd = end;
		}

		textbefore = self.richTextEditor.value.substring(0, start);
		textafter = self.richTextEditor.value.substring(end);

		for(f in formats) {
			textbefore = textbefore.replace(new RegExp(formats[f][0]+formats[f][1],'g'),'');
			textafter = textafter.replace(new RegExp(formats[f][0]+formats[f][1],'g'),'');
		}
		
		cleanUpRoutine = true;
		
		while(cleanUpRoutine == true) {
			cleanUpRoutine = false;
			for(f in formats) {
				if(textbefore.search(new RegExp(formats[f][0]+'$'))!=-1 && textafter.search(new RegExp('^'+formats[f][1]))!=-1) {
					textbefore = textbefore.replace(new RegExp(formats[f][0]+'$'),'');
					textafter = textafter.replace(new RegExp('^'+formats[f][1]),'');
					cleanUpRoutine = true;
				}
			}
		}
		
		start = textbefore.length;
		end = start;
		
		if(start==oldStart && end==oldEnd)
			return;
		
		self.richTextEditor.value = textbefore + textafter;
		self.changeSelection(start,end);
		self.evalSelection();
	}
	
	this.monitorCursorMovement = function(Ereignis){
		if (!Ereignis)
			Ereignis = window.event;
		if (Ereignis.which)
			key = Ereignis.which;
		else if (Ereignis.keyCode)
			key = Ereignis.keyCode;
		self.evalSelection(key,Ereignis.shiftKey);
			
		if(!self.expertMode){
			if(key==8 || key==46){		// Backspace && Entf
				self.deleteEmptyFormats();
			}
		}

		self.updateResult();
	}

	this.find = function(string,data){
		if(string.search(new RegExp(data.replace(/\[/g,'\\[').replace(/\]/g,'\\]'))) != -1)
			return true;
		return false;
	}
	
	this.insertData = function (databefore,dataafter,codeCleanUp) {
		if(typeof(dataafter)=='undefined')
			dataafter = '';
		self.richTextEditor.focus();

		if (typeof(self.richTextEditor.selectionStart) == 'undefined')
			range = document.selection.createRange();
		selectedText = self.selTxt;
		textBefore = self.startTxt;
		textAfter = self.endTxt;
		
		start = self.start;
		end = self.end;

		if(typeof(codeCleanUp)!='undefined' && codeCleanUp == 1) {
			if(self.find(selectedText,databefore) && self.find(selectedText,dataafter)) {
				replace = new RegExp(databefore.replace(/\[/,'\\[').replace(/\]/,'\\]')+"((?:\n|\r|\s|.)*)"+dataafter.replace(/\[/,'\\[').replace(/\]/,'\\]'),"g");
				selectedText = selectedText.replace(replace,'$1');
				databefore = '';
				dataafter = '';
			}
		}
		else if(typeof(codeCleanUp)!='undefined')
		{
			replace1 = new RegExp(databefore.replace(/\[/,'\\[').replace(/\]/,'\\]'),"g");
			replace2 = new RegExp(dataafter.replace(/\[/,'\\[').replace(/\]/,'\\]'),"g");
			selectedText = selectedText.replace(replace1,'');
			selectedText = selectedText.replace(replace2,'');
		}
		
		if(typeof(dataafter)!='undefined' && selectedText.length > 0 && (typeof(codeCleanUp)=='undefined' || codeCleanUp != -1)) {
			selectedText = selectedText.replace(/\t/g,dataafter.replace(/\[/,'\\[').replace(/\]/,'\\]')+"\t"+databefore.replace(/\[/,'\\[').replace(/\]/,'\\]'))
			selectedText.replace(new RegExp(databefore.replace(/\[/,'\\[').replace(/\]/,'\\]')+dataafter.replace(/\[/,'\\[').replace(/\]/,'\\]'),'g'),'');
			selectedText.replace(new RegExp(dataafter.replace(/\[/,'\\[').replace(/\]/,'\\]')+databefore.replace(/\[/,'\\[').replace(/\]/,'\\]'),'g'),'');
		}
		
		if(selectedText.length == 0 && typeof(self.IEMode)!='undefined') {
			self.range.text = databefore+dataafter;
			self.range.collapse(true);
			return;
		}
		
		if(textBefore.match(/--$/) && databefore == '>') {
			databefore = '[rarr]';
			textBefore = textBefore.replace(/--$/,'');
			start -= 2;
		}
		
		if(textBefore.match(/<-$/) && databefore == '-') {
			databefore = '[larr]';
			textBefore = textBefore.replace(/<-$/,'');
			start -= 2;
		}
		
		self.richTextEditor.value = textBefore + databefore + selectedText + dataafter + textAfter;

		/* Anpassen der Cursorposition */
		if (selectedText.length == 0) {
			start = start + databefore.length;
			end = start;
		} else {
			end = start + databefore.length + selectedText.length + dataafter.length;
		}

		self.changeSelection(start,end);
		self.richTextEditor.focus();
		self.evalSelection();
	}
	
	this.updateResult = function(Ereignis) {
		window.setTimeout(self.doUpdateResult,250);
		self.lastTimeUpdate = new Date();
		//self.updateBorders();
	}
	
	this.doUpdateResult = function(){
			tempTime = new Date();
			if(tempTime.getTime() - self.lastTimeUpdate.getTime() >= 250)
				self.resultArea.innerHTML = self.htmlupdate(self.richTextEditor.value);
	}
	
	this.htmlupdate = function(text){
		newtext = text;
	
		tablesearch = /\[table([-%:=a-zA-Z0-9\s";]*?)\]((\n|\r|\s|.)*?)\[\/table\]/g;
		while(tables = tablesearch.exec(newtext))
		{
			//TabellenInhalt sollte in Index 2 gespeichert sein
			tables[2] = tables[2].replace(/^\n/,"");
			tables[2] = tables[2].replace(/\n$/,"");
			rows = tables[2].split("\n");
			for(i = 0; i < rows.length; i++)
				rows[i] = rows[i].split("\t");
			maxcols = 0;
			for(i = 0; i < rows.length; i++){
				if(rows[i].length > maxcols)
					maxcols = rows[i].length;
			}
			for(i = 0; i < rows.length; i++){
				if(rows[i].length < maxcols){
					for(e = 0; e < maxcols; e++){
						if(typeof(rows[i][e]) == 'undefined')
							rows[i][e] = '';
					}
				}
			}
			
			for(i = 0; i < rows.length; i++){
				rows[i] = rows[i].join("\t");
				rows[i] = rows[i].replace(/\t/g,'</td><td>');
			}
			table = rows.join("\n");
			table = table.replace(/\n/g,"</td></tr><tr><td>");
			table = '<tr><td>' + table + '</td></tr>';
			newtext = newtext.replace(/\[table([-%:=a-zA-Z0-9\s";]*?)\]((\n|\r|\s|.)*?)\[\/table\]/,'<table'+tables[1]+'>'+table+'</table>');
		}
		newtext = newtext.replace(/\n/g,'<br />');
		newtext = newtext.replace(/\r/g,'');

		newtext = newtext.replace(/\[i\](.*?)\[\/i\]/gi,'<i>$1</i>');
		newtext = newtext.replace(/\[u\](.*?)\[\/u\]/gi,'<u>$1</u>');
		newtext = newtext.replace(/\[b\](.*?)\[\/b\]/gi,'<b>$1</b>');
		newtext = newtext.replace(/\[sub\](.*?)\[\/sub\]/gi,'<sub>$1</sub>');
		newtext = newtext.replace(/\[sup\](.*?)\[\/sup\]/gi,'<sup>$1</sup>');
		newtext = newtext.replace(/\[img\](http(s?):\/\/)?((www.)?[A-Za-z0-9~.%_\\\/-]+(\.gif|\.jpg|\.png|\.bmp))\[\/img\]/gi,'<img src="http$2://$3" style="border: none" alt="" />');
		//Email-Code
		newtext = newtext.replace(/\[email\](.*?)\[\/email\]/gi,'<a href="mailto:$1">$1</a>');
		newtext = newtext.replace(/\[email=(.*?)\](.*?)\[\/email\]/gi,'<a href="mailto:$1">$2</a>');
		//URL-Code
		newtext = newtext.replace(/\[url\]www.(.*?)\[\/url\]/gi,'<a href="http://www.$1" target="_blank">www.$1</a>');
		newtext = newtext.replace(/\[url\](.*?)\[\/url\]/gi,'<a href="$1" target="_blank">$1</a>');
		newtext = newtext.replace(/\[url=www.(.*?)\](.*?)\[\/url\]/gi,'<a href="http://www.$1" target="_blank">$2</a>');
		newtext = newtext.replace(/\[url=(.*?)\](.*?)\[\/url\]/gi,'<a href="$1" target="_blank">$2</a>');
		//Farb-Codes
		newtext = newtext.replace(/\[color=(#{0,1}[0-9A-Za-z]*?)\](.*?)\[\/color\]/gi,'<span style="color: $1">$2</span>');
		newtext = newtext.replace(/\[mark=(#{0,1}[0-9A-Za-z]*?)\](.*?)\[\/mark\]/gi,'<span style="background-color: $1">$2</span>');
		//Alignment-Codes
		newtext = newtext.replace(/\[left\](.*?)\[\/left\]/gi,'<div style="text-align: left;">$1</div>');
		newtext = newtext.replace(/\[right\](.*?)\[\/right\]/gi,'<div style="text-align: right;">$1</div>');
		newtext = newtext.replace(/\[center\](.*?)\[\/center\]/gi,'<div style="text-align: center;">$1</div>');
		newtext = newtext.replace(/\[justify\](.*?)\[\/justify\]/gi,'<div style="text-align: justify;">$1</div>');
		//List-Codes
		do {
			temptext = newtext;
			newtext = newtext.replace(/\[list\](.*?)\[\/list\]/gi,'<ul>$1</ul>');
			newtext = newtext.replace(/\[\*\](.*?)\[\*\]/gi,'<li>$1</li>[*]');
			newtext = newtext.replace(/\[\*\](.*?)<\/ul>/gi,'<li>$1</li></ul>');
		} while (temptext != newtext);
		//Quote-Codes
		do {
			temptext = newtext;
			newtext = newtext.replace(/\[quote\]((?:\n|\r|\s|.)*?)\[\/quote\]/gi,'<blockquote><div>$1</div></blockquote>');
			newtext = newtext.replace(/\[quote=(.*?)\]((?:\n|\r|\s|.)*?)\[\/quote\]/gi,'<blockquote><div><cite>$1 schrieb:</cite>$2</div></blockquote>');
		} while (temptext != newtext);

		newtext = newtext.replace(/\[rarr\]/g,'&rarr;');
		newtext = newtext.replace(/\[larr\]/g,'&larr;');
		
		return newtext;
	}

	this.unInit = function(){
		self.rteWindow.closeWin();
		self.rteWindow.destroy();
	}

/*	this.updateBorders = function(){
		height = self.buttonBar.offsetHeight + self.richTextEditor.offsetHeight + self.resultArea.offsetHeight +2;
		width = self.resultArea.offsetWidth +2;
	
		self.elementBorder.style.width = width+'px';
		self.elementBorder.style.height = height+'px';
	}
	//this.debugWindow = new sitePEWin();
	//this.debugWindow.setTitle('Debug');
*/

	this.picInsertDialog = new sitePEWin({resizable: false, minimize: false, setontop: false, enlarge: false});
	this.picInsertDialog.setTitle('Bild einf&uuml;gen');
	this.picInsertDialog.setCSSClass('insertPictureDialog');
	this.picInsertDialog.setWinIcon(pic_path+'add_image.png');
	this.picInsertDialog.closeWin();

	this.fileInsertDialog = new sitePEWin({resizable: false, minimize: false, setontop: false, enlarge: false});
	this.fileInsertDialog.setTitle('Datei einf&uuml;gen');
	this.fileInsertDialog.setCSSClass('insertFileDialog');
	this.fileInsertDialog.setWinIcon(pic_path+'add_file.png');
	this.fileInsertDialog.closeWin();

	this.openImgInsertDialog = function() {
		bodyEle = document.getElementsByTagName('body')[0];
		
		self.richTextEditor.focus();
		selectedText = self.selTxt;
		textBefore = self.startTxt;
		textAfter = self.endTxt;
		
		start = self.start;
		end = self.end;

		self.styleobj = new JSStyleObject();
		picurl = '';
		
		formDialog = '<table cellpadding="0" cellspacing="0">';
		formDialog += '<tr class="picDiag0"><td class="description">Adresse:</td><td><input type="text" value="'+picurl+'" onclick="this.focus();" id="picbox" /></td></tr>';
		formDialog += '<tr class="picDiag1"><td class="description">oder aus Galerie</td><td><input type="button" value="Durchsuchen..." id="imglibbutton" onclick="startImgLib();" /></td></tr>';
		formDialog += '</table>';
		
		formDialog += '<input type="button" value="OK" id="PICOKB" /></div>';

		self.picInsertDialog.setContent(formDialog);
		self.picInsertDialog.openWin();
		self.picInsertDialog.toTop();

		self.picbox = document.getElementById('picbox');
		self.picbox.focus();
		self.okbutton = document.getElementById('PICOKB');
		self.okbutton.onclick = self.insertPIC;

		rteCaller = self;
		document.onkeydown = self.testSpecialKeys;
	}
	
	this.linkInsertDialog = new sitePEWin({resizable: false, minimize: false, setontop: false, enlarge: false});
	this.linkInsertDialog.setTitle('Link einf&uuml;gen');
	this.linkInsertDialog.setCSSClass('insertlinkDialog');
	this.linkInsertDialog.closeWin();

	this.openLinkInsertDialog = function() {
		self.richTextEditor.focus();
		selectedText = self.selTxt;
		textBefore = self.startTxt;
		textAfter = self.endTxt;
		
		start = self.start;
		end = self.end;
		
		targetOption = true;
		link = '';
		removeOption = false;

		self.linkInsertDialog.openWin();
		self.linkInsertDialog.toTop();

		formDialog = '<div><span class="description">Adresse:</span><br /><input type="text" value="'+link+'" id="urlbox" /><br /><br />';
		formDialog += '<br />';
		if(removeOption)
			formDialog += '<input type="button" value="L&ouml;schen" id="URLDELB" />';
		formDialog += '<input type="button" value="OK" id="URLOKB" /></div>';

		self.linkInsertDialog.setContent(formDialog);

		self.urlbox = document.getElementById('urlbox');
		if(self.urlbox)
			self.urlbox.focus();
		self.okbutton = document.getElementById('URLOKB');
		self.okbutton.onclick = self.insertURL;
		if(removeOption) {
			self.delbutton = document.getElementById('URLDELB');
			self.delbutton.onclick = self.removeURL;
		}

		document.onkeydown = self.testSpecialKeys;
	}

	this.insertURL = function() {
		givenurl = self.urlbox.value;
		if(givenurl!='' && givenurl != 'http://') {
			httpgivenurl = givenurl;
			if(httpgivenurl.match(/^www.([a-zA-Z0-9]+).([a-z]{2,3})/))
				httpgivenurl = 'http://' + encodeURI(givenurl);
			if(selectedText == '')
				self.insertData('[url='+httpgivenurl+']'+givenurl+'[/url]');
			else
				self.insertData('[url='+httpgivenurl+']','[/url]');
		}
		self.updateResult();
		self.linkInsertDialog.closeWin();
	}

	this.insertPIC = function() {
		givenurl = self.picbox.value;
	
		if(givenurl!='') {
			httpgivenurl = givenurl;
			if(httpgivenurl.match(/^www.([a-zA-Z0-9]+).([a-z]{2,3})/))
				httpgivenurl = 'http://' + encodeURI(givenurl);
			
			self.insertData('[img]'+httpgivenurl+'[/img]');
			self.updateResult();
		}
		self.picInsertDialog.closeWin();
	}

	this.init();
}

var rteCaller = false;
var rteCallerType = false;
var selectorDiv;
var callerCoordX;
var callerCoordY;
var clicknum;

function openColorChanger() {
	if(!rteCaller)
		return false;
	if(selectorDiv)
		return false;

	SelectionWindow = '<table cellpadding="0" cellspacing="0">';
	colors = new Array(
		new Array('000000','222222','444444','666666','888888','AAAAAA','CCCCCC','FFFFFF'),
		new Array('330000','660000','990000','CC0000','FF0000','FF4444','FF8888','FFCCCC'),
		new Array('332000','664000','996000','CC8000','FFA000','FFC044','FFD088','FFE0CC'),
		new Array('333300','666600','999900','CCCC00','FFFF00','FFFF44','FFFF88','FFFFCC'),
		new Array('003300','006600','009900','00CC00','00FF00','44FF44','88FF88','CCFFCC'),
		new Array('003333','006666','009999','00CCCC','00FFFF','44FFFF','88FFFF','CCFFFF'),
		new Array('000033','000066','000099','0000CC','0000FF','4444FF','8888FF','CCCCFF'),
		new Array('330033','660066','990099','CC00CC','FF00FF','FF44FF','FF88FF','FFCCFF')
	);
	
	for(c in colors) {
		SelectionWindow += '<tr>';
		for(co in colors[c]){
			SelectionWindow += '<td style="cursor:pointer; border: 1px solid transparent; background-color: #'+colors[c][co]+'; height: 12px; width: 12px; font-size:12px" onmouseover="this.style.border=\'1px outset black\';" onmouseout="this.style.border=\'1px solid transparent\'" onclick="setSelectedColor(\''+colors[c][co]+'\');">&nbsp;</td>';
		}
		SelectionWindow += '</tr>';
	}
	SelectionWindow += '<tr><td colspan="'+colors[0].length+'" style="cursor:pointer; text-align: center; border: 1px solid transparent; height: 8px; width: 8px; font-size:8px" onmouseover="this.style.border=\'1px outset black\';" onmouseout="this.style.border=\'1px solid transparent\'" onclick="setSelectedColor(\'default\');">Standard</td></tr>';
	
	SelectionWindow += '</table>';
	
	selectorDiv = document.createElement('div');
	document.getElementsByTagName('body')[0].appendChild(selectorDiv);
	selectorDiv.innerHTML = SelectionWindow;
	selectorDiv.style.position = 'absolute';
	selectorDiv.style.top = callerCoordY+'px';
	selectorDiv.style.left = callerCoordX+'px';
	selectorDiv.style.zIndex = 5000000 // Make Sure this Window is ABOVE everything else...
	document.onclick = abortSelectColor;
	clicknum = 0;
}

function setSelectedColor(color) {
	if(rteCallerType == 'font')
		rteCaller.changeFontColor(color);
	else if(rteCallerType == 'mark')
		rteCaller.changeMarkColor(color);
	else
		rteCaller.setBorderColor(color);
}

function abortSelectColor(){
	clicknum++;
	if(clicknum > 1) {
		document.getElementsByTagName('body')[0].removeChild(selectorDiv);
		selectorDiv = false;
		document.onclick = function() { return; }
	}
	return;
}

function trim(str) {
	return str.replace(/^\s\s*/,'').replace(/\s\s*$/,'');
}
