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*$/,'');
}

function startImgLib() {
	if(typeof(imgLib) == 'undefined') {
		imgLib = new sitePEWin({resizable: true, minimize: true, setontop: false, enlarge: true});
		imgLib.setWinIcon(pic_path+"imgico.png");
		imgLib.setOnTop();
		imgLib.setHeight(400);
		imgLib.setWidth(800);
		imgLib.setTitle('Image Library');
		if(typeof(uploadFrame) == 'undefined') {
			uploadFrame = document.createElement('iframe');
			uploadFrame.style.display = 'none';
			uploadFrame.name = 'uploadFrame';
			bodyEle.appendChild(uploadFrame);
		}
		
		winLayout = '';
		
		if(rteCaller.uploadImages) {
			winLayout += '<div class="imgLibUploadField">';
			winLayout += '<form id="imgUploadForm" target="uploadFrame" method="post" action="'+pre_path+'ajax.php?mode=sd_imglib&path='+imgLibPath+'" enctype="multipart/form-data" onsubmit="updloadFile();">';
			winLayout += 'Datei hochladen: <br /><input type="file" name="imgUpload" id="imgUpload" />';
			winLayout += '<input type="submit" Value="Hochladen" name="doImgUpload" id="doImgUpload" />';
			winLayout += '</form>';
			winLayout += '<div style="float: left; margin: 2px; cursor: pointer;" onmouseover="this.className=\'hover\';" onmouseout="this.className=\'\';" onclick="library.createFolder();"><img src="'+pic_path+'folder.png" style="width: 16px; height: 16px;" alt="" />Ordner erstellen</div>';
			winLayout += '<div id="librarydelbutton" style="visibility:hidden; float: left; margin: 2px; cursor: pointer;" onmouseover="this.className=\'hover\';" onmouseout="this.className=\'\';" onclick="library.deleteMarkedFile();"><img src="'+pic_path+'delete.png" style="width: 16px; height: 16px;" alt="" />Datei L&ouml;schen</div>';
			winLayout += '<br style="clear: both;" />';
			winLayout += '</div>';
		}
		winLayout += '<div class="imgLibBrowser" id="imgLibBrowser">';
		winLayout += '</div>';
		imgLib.setContent(winLayout);
		if(typeof(library) == 'undefined') {
			library = new fileLibraryObject(imageLibrary);
		}
		
		library.loadLibrary();
	}

	imgLib.onResize = false;
	imgLib.openWin();
	imgLib.toTop();
}

function updloadFile() {
	if(rteCaller.uploadImages) {
		winInfo = '<img src="'+pic_path+'upload_anim.gif" class="waitAnim" alt="" />';
		if(document.getElementById('imgUpload') && document.getElementById('imgUpload').value != '') {
			imgLib.closeWin();
			library.fileName = document.getElementById('imgUpload').value.replace(/(.*)\\/,''); // Should save Name only ...
		} else if(document.getElementById('fileUpload')) {
			fileLib.closeWin();
			library2.fileName = document.getElementById('fileUpload').value.replace(/(.*)\\/,''); // Should save Name only ...
		}

		setErrorWin(winInfo);
		errorWin.setTitle('Uploading');
		return true;
	}
	
	return false;
}

function uploadResult(resultNum) {
	msg = new Array();
	msg[200] = 'Datei erfolgreich hochgeladen!';

	msg[300] = 'Zugriff verweigert!';
	msg[301] = 'Keine Datei angegeben';
	msg[302] = 'Möglicher Angriff (Datei eventuell mit Virus befallen?)';
	msg[303] = 'Die Hochgeladene Datei war leer';
	msg[304] = 'Dateityp nicht erlaubt';
	msg[305] = 'Datei ist zu groß';
	msg[306] = 'Diese Datei existiert bereits auf dem Server';
	msg[307] = 'Die Datei konnte nicht ins Zielverzeichnis verschoben werden';
	msg[308] = 'Hochgeladene Datei ist kein Bild, aber es wurde ein Bild erwartet';
	msg[309] = 'Das Bild ist zu groß';

	msg[321] = 'Zeichenfolge war leer!';
	msg[322] = 'Name bereits vergeben';
	
	content = '<div class="uploadResult">'+msg[resultNum];
	errorWin.closeWin();
	
	if(document.getElementById('imgUpload') && document.getElementById('imgUpload').value != '') {
		callFunction1 = 'setPicURL';
		callFunction2 = 'startImgLib';
	} else if(document.getElementById('fileUpload')) {
		callFunction1 = 'setFileURL';
		callFunction2 = 'startFileLib';
	}

	if(resultNum == 200) {
		errorWin.setTitle('OK');
		content += '<br /><input type="button" value="OK" onclick="'+callFunction1+'()" />';
	} else if(resultNum >= 301 && resultNum <= 320)  {
		errorWin.setTitle('Fehler');
		content += '<br /><input type="button" value="OK" onclick="'+callFunction2+'(); errorWin.closeWin();" />';
	} else if(resultNum == 300 || resultNum >= 321) {
		errorWin.setTitle('Fehler');
		content += '<br /><input type="button" value="OK" onclick="errorWin.closeWin();" />';
	}
	
	content += '</div>';
	
	setErrorWin(content);
}

function setPicURL() {
	imgLib.closeWin();
	document.getElementById('picbox').value = pre_path + imageLibrary + '/'+imgLibPath+library.fileName;
	library.setFileName('');
	errorWin.closeWin();
	
	library.loadLibrary();
}

function fileLibraryObject(lib_path) {
	var self = this;
	this.images;
	this.directories;
	this.lib_path = lib_path;
	this.printWin;

	this.fileName;

	this.delSecWin = new sitePEWin({resizable: false, setontop: false, minimize: false, enlarge: false});
	this.delSecWin.setTitle('');
	this.delSecWin.setWidth(250);
	this.delSecWin.setHeight(150);
	this.delSecWin.closeWin();
	this.createFolderWin = new sitePEWin({resizable: false, setontop: false, minimize: false, enlarge: false});
	this.createFolderWin.setTitle('Ordner erstellen');
	this.createFolderWin.setHeight(100);
	this.createFolderWin.closeWin();

	this.createFolder = function(){
		content = '<div style="margin: 5px; text-align: left">Name des neuen Ordners:';
		content += '<input type="text" id="'+(self.lib_path == imageLibrary ? 'library' : 'library2')+'cFolderName" value="" style="width: 100%" />';
		content += '<input type="button" value="Ordner erstellen" style="float: right" onclick="'+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.cFolder();" /><br style="clear:both" />';
		content += '</div>';
		
		self.createFolderWin.setContent(content);
		self.createFolderWin.openWin();
		self.createFolderWin.toTop();
	}
	
	this.cFolder = function() {
		newFolderName = document.getElementById((self.lib_path == imageLibrary ? 'library' : 'library2')+'cFolderName').value;
		self.createFolderWin.closeWin();
		self.loadLibrary('&createFolder='+newFolderName);
	}

	this.deleteMarkedFile = function() {
		if(typeof(self.fileName) == 'undefined' || self.fileName == '')
			return false;
		
		content = '<div style="margin: 5px; text-align: center">Soll diese Datei wirklich gel&ouml;scht werden?<br /><br />';
		content += '<input type="button" style="float: left" value="L&ouml;schen" onclick="'+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.delFile();" />';
		content += '<input type="button" style="float: right" value="Abbrechen" onclick="'+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.delSecWin.closeWin();" /><br style="clear:both" /></div>';
		
		self.delSecWin.setContent(content);
		self.delSecWin.openWin();
		self.delSecWin.toTop();
	}
	
	this.delFile = function() {
		self.delSecWin.closeWin();
		self.loadLibrary('&deleteFile='+self.fileName);
	}

	this.parseImages = function(response){
		self.directories	= response.responseXML.getElementsByTagName('dir');
		self.images		= response.responseXML.getElementsByTagName('img');
		
		self.printfileLibrary();
	}
	
	this.setFileName = function(fN) {
		self.fileName = fN;
		if(fN == '') {
			if(self.lib_path == imageLibrary)
				document.getElementById('librarydelbutton').style.visibility = 'hidden';
			else
				document.getElementById('library2delbutton').style.visibility = 'hidden';
		} else {
			if(self.lib_path == imageLibrary)
				document.getElementById('librarydelbutton').style.visibility = 'visible';
			else
				document.getElementById('library2delbutton').style.visibility = 'visible';
		}
	}
	
	this.printfileLibrary = function() {
		if(lib_path == imageLibrary)
			imgLib.onResize = self.printfileLibrary;
		else
			fileLib.onResize = self.printfileLibrary;
	
		if(typeof(self.printWin)=='undefined') {
			if(lib_path == imageLibrary)
				self.printWin = document.getElementById('imgLibBrowser');
			else
				self.printWin = document.getElementById('fileLibBrowser');
		}
		availableWidth = self.printWin.offsetWidth;
		
		colNum = Math.floor(availableWidth/250);
		
		m = 0;
		
		libcontent = '<table cellpadding="0" cellspacing="0">';
		c = 0;
		if(imgLibPath != '') {
			dblclick = ' ondblclick="'+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.folderUp();"';
			libcontent += '<td '+dblclick+' onclick="'+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.setFileName(\'\'); '+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.marker('+m+')" ';
			libcontent +='	onmouseover="'+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.marker('+m+',1)" onmouseout="'+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.marker('+m+',2)"id="sym'+m+'" style="width: 50px; height: 50px;">';
			libcontent += '<img style="width: 50px; height: 50px;" src="'+pic_path+'folder.png" alt="" /></td><td '+dblclick+' onclick="'+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.setFileName(\'\'); '+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.marker('+m+')"';
			libcontent +='	onmouseover="'+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.marker('+m+',1)" onmouseout="'+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.marker('+m+',2)" id="nam'+m+'" style="width: 200px;">..</td>';
			c++;
			m++;
		}
		
		for(d = 0; d < self.directories.length; d++) {
			if(c == colNum) {
				libcontent += '</tr><tr>';
				c = 0;
			}
			folder = getNodeValue(self.directories[d],'name');

			dblclick = ' ondblclick="'+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.appendFolder(\''+folder+'\');"';

			libcontent += '<td '+dblclick+' onclick="'+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.setFileName(\''+folder+'\'); '+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.marker('+m+')" onmouseover="'+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.marker('+m+',1)" onmouseout="'+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.marker('+m+',2)" id="sym'+m+'" style="width: 50px; height: 50px;"><img style="width: 50px; height: 50px;" src="'+pic_path+'folder.png" alt="" /></td>';
			libcontent += '<td '+dblclick+' onclick="'+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.setFileName(\''+folder+'\'); '+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.marker('+m+')" onmouseover="'+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.marker('+m+',1)" onmouseout="'+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.marker('+m+',2)" id="nam'+m+'" style="width: 200px;">'+folder+'</td>';
			c++;
			m++;
		}
		
		for(i=0; i < self.images.length; i++) {
			if(c == colNum) {
				libcontent += '</tr><tr>';
				c = 0;
			}
			
			time = new Date(getNodeValue(self.images[i],'date')*1000);
			
			if(self.lib_path == imageLibrary) {
				picture = pre_path + imageLibrary + '/'+imgLibPath + getNodeValue(self.images[i],'name');
				filename = getNodeValue(self.images[i],'name');
				dblclick = ' ondblclick="setPicURL();"';
				
				imgHeight = getNodeValue(self.images[i],'height')*1;
				imgWidth = getNodeValue(self.images[i],'width')*1;
				
				factor1 = imgHeight / imgWidth;
				factor2 = imgWidth / imgHeight;
				addInfo = '<br /><span>'+imgWidth+' x '+imgHeight+' px</span>';
				
				if(imgHeight > 75 || imgWidth > 75) {
					if(imgHeight > imgWidth) {
						showHeight = 75;
						showWidth = 75*factor2;
					} else {
						showHeight = 75*factor1;
						showWidth = 75;
					}
				} else {
					showHeight = imgHeight;
					showWidth = imgWidth;
				}
			} else {
				picture = pic_path + 'files.png';
				filename = getNodeValue(self.images[i],'name');
				dblclick = ' ondblclick="setFileURL();"';
				showHeight = 48;
				showWidth = 48;
				addInfo = '';
			}
			
			filesize = getNodeValue(self.images[i],'size')*1;
			sizeName = 'B';
			if(filesize > 1024) {
				filesize /= 1024;
				sizeName = 'KB';
				if(filesize > 1024) {
					filesize /= 1024;
					sizeName = 'MB';
				}
				
				filesize *= 100;
				filesize = Math.round(filesize);
				filesize /= 100;
			}
			
			libcontent += '<td '+dblclick+' onclick="'+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.setFileName(\''+filename+'\'); '+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.marker('+m+')" onmouseover="'+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.marker('+m+',1)" onmouseout="'+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.marker('+m+',2)" id="sym'+m+'" style="width: 75px; height: 100px; text-align: center; vertical-align: middle;"><img src="'+picture+'" style="width: '+showWidth+'px; height: '+showHeight+'px;" alt="" /></td>';
			libcontent += '<td '+dblclick+' onclick="'+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.setFileName(\''+filename+'\'); '+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.marker('+m+')" onmouseover="'+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.marker('+m+',1)" onmouseout="'+(self.lib_path == imageLibrary ? 'library' : 'library2')+'.marker('+m+',2)" id="nam'+m+'" style="width: 200px;">'+filename;
			libcontent += '<br /><span>'+filesize+' '+sizeName+'</span>';
			libcontent += '<br /><span>'+time.getDate()+'.'+(time.getMonth()+1)+'.'+time.getFullYear().toString().substring(2)+' '+time.getHours()+':'+time.getMinutes()+':'+time.getSeconds()+'</span>';
			libcontent += addInfo;
			libcontent += '</td>';
			c++;
			m++;
		}
		
		if(c < colNum) {
			for(i = c; i < colNum; i++) {
				libcontent += '<td style="width: 50px;"></td><td style="width: 200px;"></td>';
			}
		}
		
		libcontent += '</table>';
		
		self.printWin.innerHTML = libcontent;
	}
	
	this.loadLibrary = function(addFileOptions){
		if(typeof(addFileOptions) == 'undefined')
			addFileOptions = '';

		self.setFileName('');

		if(self.lib_path == imageLibrary) {
			self.ajax			= new AJAXObj('mode=rd_imglib&path='+imgLibPath+addFileOptions,self.parseImages);
			self.ajax.doRequest();
			
			document.getElementById('imgUploadForm').action = pre_path+'ajax.php?mode=sd_imglib&path='+imgLibPath;
		} else {
			self.ajax			= new AJAXObj('mode=rd_filelib&path='+imgLibPath+addFileOptions,self.parseImages);
			self.ajax.doRequest();
			
			document.getElementById('imgUploadForm').action = pre_path+'ajax.php?mode=sd_filelib&path='+imgLibPath;
		}
	}
	
	this.appendFolder = function(folder) {
		imgLibPath += folder+'/';
		self.setFileName('');
		self.loadLibrary();
	}

	this.folderUp = function() {
		imgLibPath = imgLibPath.replace(/[^\/]+?\/$/,'');
		self.setFileName('');
		self.loadLibrary();
	}

	this.marker = function(m,mouseAction) {
		if(typeof(mouseAction) == 'undefined') {
			tablecells = self.printWin.getElementsByTagName('td');
			for(t = 0; t < tablecells.length; t++)
				tablecells[t].className = '';
				
			document.getElementById('sym'+m).className = 'marked';
			document.getElementById('nam'+m).className = 'marked';
		} else {
			if(mouseAction == 1) {
				document.getElementById('sym'+m).className += ' hover';
				document.getElementById('nam'+m).className += ' hover';
			} else {
				document.getElementById('sym'+m).className = document.getElementById('sym'+m).className.replace(/hover/g,'');
				document.getElementById('nam'+m).className = document.getElementById('nam'+m).className.replace(/hover/g,'');
			}
		}
	}
}
