/************************************************************************************************************
*  Number Formats
************************************************************************************************************/
function print_num(number,laenge,force_sign,force_units){
	var neg = false;
	var unit = '';
	if( !laenge )laenge = 0;
	if(getSetting('show_units')=='1'||force_units){
		var val = Math.abs(number);
		if(val>=1000000000000){unit='T';val/=1000000000000;}
		else if(val>=1000000000){unit='G';val/=1000000000;}
		else if(val>=1000000){unit='M';val/=1000000;}
		else if(val>=1000){unit='K';val/=1000;}
		if(number<0)number=-val;
		else number=val;
		if(laenge==0&&val-Math.floor(val)!=0)laenge=2;
		else if(laenge<0){
			if(unit=='')laenge = 0;
			else laenge = -laenge;
		}
	}
	if( number<0 ){neg=true;number=-number;}
	number = Math.round( number * Math.pow(10, laenge) ) / Math.pow(10, laenge);
	str_number = number+'';
	arr_int = str_number.split('.');
	if(!arr_int[0]) arr_int[0] = '0';
	if(!arr_int[1]) arr_int[1] = '';
	if(arr_int[1].length < laenge){
		nachkomma = arr_int[1];
		for(i=arr_int[1].length+1; i <= laenge; i++){  nachkomma += '0';  }
		arr_int[1] = nachkomma;
	}
	if(arr_int[0].length > 3){
		Begriff = arr_int[0];
		arr_int[0] = '';
		for(j = 3; j < Begriff.length ; j+=3){
			Extrakt = Begriff.slice(Begriff.length - j, Begriff.length - j + 3);
			arr_int[0] = '.' + Extrakt +  arr_int[0] + '';
		}
		str_first = Begriff.substr(0, (Begriff.length % 3 == 0)?3:(Begriff.length % 3));
		arr_int[0] = str_first + arr_int[0];
	}
	if(neg)arr_int[0] = '-'+arr_int[0];
	else if(force_sign!=null&&force_sign)arr_int[0] = '+'+arr_int[0];
	if(laenge)return arr_int[0]+','+arr_int[1]+unit;
	return arr_int[0]+unit;
}

/************************************************************************************************************
*  Editor
************************************************************************************************************/
function EditorInsert(input,aTag,eTag){
	input.focus();
	// für Internet Explorer:
	if(typeof document.selection != 'undefined'){
		var range = document.selection.createRange();
		var insText = range.text;
		range.text = aTag + insText + eTag;
		range = document.selection.createRange();
		if(insText.length == 0){
			range.move('character', -eTag.length);
		}else{
			range.moveStart('character', aTag.length + insText.length + eTag.length);      
		}
		range.select();
	}
	// für auf Gecko basierende Browser:
	else if(typeof input.selectionStart != 'undefined'){
		var start = input.selectionStart;
		var end = input.selectionEnd;
		var insText = input.value.substring(start, end);
		input.value = input.value.substr(0, start) + aTag + insText + eTag + input.value.substr(end);
		var pos;
		if(insText.length == 0){
			pos = start + aTag.length;
		}else{
			pos = start + aTag.length + insText.length + eTag.length;
		}
		input.selectionStart = pos;
		input.selectionEnd = pos;
	}
	// für die übrigen Browser:
	else{
		alert("Dein Browser unterstützt dieses Feature leider nicht, bitte gibt das "+aTag+" und "+eTag+" Tag manuell ein.");
	}
}

EditorButton = function(cell,caption,tag,title,textarea,opt){
	this.txt = textarea;
	this.tag = tag;
	this.opt = opt;
	var c,r,t = document.createElement('table');
	r = t.insertRow(-1);
	c = r.insertCell(-1);
	c.innerHTML = caption;
	c.style.cursor = 'pointer';
	c.align = 'center';
	c.className = 'EditorButton';
	c.title = title;
	var self = this;
	c.onmouseover = function(){
		c.className = 'EditorButtonOver';
	}
	c.onmouseout = function(){
		c.className = 'EditorButton';
	}
	c.onclick = function(){
		EditorInsert(self.txt,'['+self.tag+(self.opt?'='+self.opt:'')+']','[/'+self.tag+']');
	}
	cell.appendChild(t);
	this.cell = c;
}

Editor = function(div,okCaption,onOk,maxChars,initText,width,lines){
	this.div = div;
	this.maxChars = (maxChars?maxChars:32000);
	var c,r,t = document.createElement('table');
	t.className = 'nonTransparent';
	if(width)t.width = width;
	else t.width = getSetting('content_width');
	this.textarea = document.createElement('textarea');

	// Formatierungen:
	var buttons = new Array('<b>B</b>','b','Fett [b][/b]',null,
							'<i>I</i>','i','Kursiv [i][/i]',null,
							'<u>U</u>','u','Unterstrichen [u][/u]',null,
							'Center','ctr','Zentriert [ctr][/ctr]',null,
							'Link','url','Link [url][/url]','caption',
							'Image','img','Bild [img][/img]',null,
							'Quote','quo','Zitat [quo][/quo]','name'
	                        );
	r = t.insertRow(-1);
	c = r.insertCell(-1);
	c.style.padding = '5px';
	var subr,subc,subt = document.createElement('table');
	subt.width = '100%';
	subr = subt.insertRow(-1);
	for(var i=0;i<buttons.length;i+=4){
		subc = subr.insertCell(-1);
		subc.width = '20px';
		subc.style.border = '0px;';
		subc.style.backgroundColor = 'transparent';
		new EditorButton(subc,buttons[i],buttons[i+1],buttons[i+2],this.textarea,buttons[i+3]);
	}
	c.appendChild(subt);
	
	// Farbtabelle:
	var palette = document.createElement('div');
	palette.style.zIndex = 100001;
	palette.style.position = 'absolute';
	palette.style.width = '150px';
	palette.style.height = '100px';
	palette.style.visibility = 'hidden';
	palette.color = null;
	
	var colors = new Array("CLR_FFFFFF","CLR_FFCCCC","CLR_FFCC99","CLR_FFFF99","CLR_FFFFCC","CLR_99FF99","CLR_99FFFF","CLR_CCFFFF","CLR_CCCCFF","CLR_FFCCFF","CLR_CCCCCC","CLR_FF6666","CLR_FF9966","CLR_FFFF66","CLR_FFFF33","CLR_66FF99","CLR_33FFFF","CLR_66FFFF","CLR_9999FF","CLR_FF99FF","CLR_C0C0C0","CLR_FF0000","CLR_FF9900","CLR_FFCC66","CLR_FFFF00","CLR_33FF33","CLR_66CCCC","CLR_33CCFF","CLR_6666CC","CLR_CC66CC","CLR_999999","CLR_CC0000","CLR_FF6600","CLR_FFCC33","CLR_FFCC00","CLR_33CC00","CLR_00CCCC","CLR_3366FF","CLR_6633FF","CLR_CC33CC","CLR_666666","CLR_990000","CLR_CC6600","CLR_CC9933","CLR_999900","CLR_009900","CLR_339999","CLR_3333FF","CLR_6600CC","CLR_993399","CLR_333333","CLR_660000","CLR_993300","CLR_996633","CLR_666600","CLR_006600","CLR_336666","CLR_000099","CLR_333399","CLR_663366","CLR_000000","CLR_330000","CLR_663300","CLR_663333","CLR_333300","CLR_003300","CLR_003333","CLR_000066","CLR_330099","CLR_330033");
	var pr,pc,pt = document.createElement('table');
	pt.width = '100%';
	pt.style.border = '1px solid #000';
	pt.style.borderCollapse = 'separate';
	pt.style.cellpadding = 0;
	pt.style.cellspacing = 0;
	var onOver = function(){this.style.border = '1px solid #FFF';}
	var onOut = function(){this.style.border = '1px solid #000';}
	var onClick = function(){palette.color = this.id.replace('CLR_','');}
	for(var i=0;i<colors.length;i++){
		if(i%10==0){
			pr = pt.insertRow(-1);
		}
		pc = pr.insertCell(-1);
		pc.id = colors[i];
		pc.onmouseover = onOver;
		pc.onmouseout = onOut;
		pc.onclick = onClick;
		pc.innerHTML = '&nbsp;';
		pc.style.width = '10px';
		pc.style.height = '10px';
		pc.style.border = '1px solid #000';
		pc.style.cursor = 'pointer';
		pc.title = colors[i].replace('CLR_',''); 
		pc.style.background = '#' + colors[i].replace('CLR_',''); 
	}
	palette.appendChild(pt);
	
	subc = subr.insertCell(-1);
	subc.width = '20px';
	subc.style.border = '0px;';
	subc.style.backgroundColor = 'transparent';
	this.clrButton = new EditorButton(subc,'Color','clr','Farbe [clr=x][/clr]',this.textarea);
	
	var self = this;
	this.clrButton.cell.appendChild( palette );
	this.clrButton.cell.onclick = function(){
		if(smiley.style.visibility=='visible')smiley.style.visibility = 'hidden';
		if(palette.style.visibility=='visible')palette.style.visibility = 'hidden';
		else palette.style.visibility = 'visible';
		if(palette.color){
			EditorInsert(self.textarea,'[clr='+palette.color+']','[/clr]');
			palette.color = null;
		}
	}

	// Smileys:
	var smiley = document.createElement('div');
	smiley.style.zIndex = 100001;
	smiley.style.position = 'absolute';
	smiley.style.width = '90px';
	smiley.style.height = '60px';
	smiley.style.visibility = 'hidden';
	smiley.which = null;
	
	var smileys = new Array("B-)","O-|",":-D","|-D",":-|",":-~","|-[",":-[",":-(","|-(","}-(","R-|",":-{","]-(","]-)",":-P","|-P",":-.",":-)",":-o",";-)","[!]","[?]","[*]");
	pt = document.createElement('table');
	pt.width = '100%';
	pt.style.border = '1px solid #000';
	pt.style.borderCollapse = 'separate';
	pt.style.cellpadding = 0;
	pt.style.cellspacing = 0;
	var onOver = function(){this.style.border = '1px solid #FFF';}
	var onOut = function(){this.style.border = '1px solid #000';}
	var onClick = function(){smiley.which = this.id;}
	for(var i=0;i<smileys.length;i++){
		if(i%6==0){
			pr = pt.insertRow(-1);
		}
		pc = pr.insertCell(-1);
		pc.id = i;
		pc.onmouseover = onOver;
		pc.onmouseout = onOut;
		pc.onclick = onClick;
		var img = document.createElement('img');
		img.src = 'gfx/smile/sm'+(i<10?'0':'')+i+'.gif';
		img.title = smileys[i];
		pc.appendChild(img);
		pc.style.width = '10px';
		pc.style.height = '10px';
		pc.style.border = '1px solid #000';
		pc.style.cursor = 'pointer';
	}
	smiley.appendChild(pt);
	
	subc = subr.insertCell(-1);
	subc.width = '20px';
	subc.style.border = '0px;';
	subc.style.backgroundColor = 'transparent';
	this.smileyButton = new EditorButton(subc,'Smiley','sm','Smiley',this.textarea);
	
	var self = this;
	this.smileyButton.cell.appendChild( smiley );
	this.smileyButton.cell.onclick = function(){
		if(palette.style.visibility=='visible')palette.style.visibility = 'hidden';
		if(smiley.style.visibility=='visible')smiley.style.visibility = 'hidden';
		else smiley.style.visibility = 'visible';
		if(smiley.which){
			EditorInsert(self.textarea,smileys[parseInt(smiley.which)],'');
			smiley.which = null;
		}
	}

	subc = subr.insertCell(-1);
	subc.style.border = '0px;';
	subc.style.backgroundColor = 'transparent';
	subc.align = 'right';

	// Edit-Feld:
	r = t.insertRow(-1);
	c = r.insertCell(-1);
	this.textarea.style.width = '100%';
	if(initText)initText = initText.replace(/\[br\]/g,"\n");
	this.textarea.value = (initText?initText:'');
	if(lines)this.textarea.rows = lines;
	else this.textarea.rows = 12;
	c.appendChild( this.textarea );

	// Buttons:
	r = t.insertRow(-1);
	c = r.insertCell(-1);
	c.align = 'center';
	this.previewButton = document.createElement('input');
	this.previewButton.type = 'submit';
	this.previewButton.value = 'Vorschau anzeigen';
	this.preview = null;
	this.headline = null;
	this.table = t;
	c.appendChild( this.previewButton );
	this.previewButton.onclick = function(){self.showPreview();};

	var b = document.createElement('blank');
	b.innerHTML = '&nbsp;&nbsp;';
	c.appendChild( b );
	
	if(onOk){
		this.okButton = document.createElement('input');
		this.okButton.type = 'submit';
		this.okButton.value = (okCaption?okCaption:"OK");
		c.appendChild( this.okButton );
		this.okButton.onclick = function(){
			self.code = preParseBBCode(self.textarea.value);
			if(self.code.length>self.maxChars)self.code = self.code.substr(0,self.maxChars-1);
			if( onOk )onOk();
		}
	}
	
	div.appendChild(t);
}

Editor.prototype.getCode = function(){
	this.code = preParseBBCode(this.textarea.value);
	if(this.code.length>this.maxChars)this.code = this.code.substr(0,this.maxChars-1);
	return this.code;
}

Editor.prototype.showPreview = function(){
	var c,r;
	if( this.preview )c = this.preview;
	else{
		var r = this.table.insertRow(0);
		var c = r.insertCell(-1);
		c.align = 'left';
		this.preview = c;
		this.previewButton.value = 'Vorschau aktualisieren';
	}
	var code = preParseBBCode(this.textarea.value);
	c.innerHTML = parseBBCode(code);
	if(!this.headline){
		var r = this.table.insertRow(0);
		var c = r.insertCell(-1);
		c.align = 'left';
		this.headline = c;
	}
	this.headline.innerHTML = "<b>Vorschau:</b> "+(code.length>this.maxChars?"<font class='red'>":"<font class='green'>")+"("+print_num(code.length,0)+"/"+print_num(this.maxChars,0)+" Zeichen)</font>";
}

function preParseBBCode(code){
	return code.replace(/\r/g,"").replace(/\n/g,"[br]").replace(/>/g,"&gt;").replace(/</g,"&lt;").replace(/  /g," ").replace(/\[url=caption\]/g,"[url]").replace(/\[quo=name\]/g,"[quo]");
}

function parseBBCode(code,color,images){
	if(color!==false)useColor = true;else useColor=false;
	if(images!==false)useImages = true;else useImages=false;
	code = code.replace(/\[br\]/g,"<br>").replace(/\[b\]/g,"<b>").replace(/\[\/b\]/g,"</b>").replace(/\[i\]/g,"<i>").replace(/\[\/i\]/g,"</i>").replace(/\[u\]/g,"<u>").replace(/\[\/u\]/g,"</u>").replace(/\[ctr\]/g,"<center>").replace(/\[\/ctr\]/g,"</center>").replace(/  /g,"&nbsp;&nbsp;").replace(/&quot;/g,"\"").replace(/&amp;/g,"&").replace(/&#039;/g,"'");

	var path = "gfx/smile/sm";
	code = code.replace(/B-\)/g,"<img src='"+path+"00.gif'/>").replace(/O-\|/g,"<img src='"+path+"01.gif'/>").replace(/:-D/g,"<img src='"+path+"02.gif'/>").replace(/\|-D/g,"<img src='"+path+"03.gif'/>").replace(/:-\|/g,"<img src='"+path+"04.gif'/>").replace(/:-~/g,"<img src='"+path+"05.gif'/>").replace(/\|-\[/g,"<img src='"+path+"06.gif'/>").replace(/:-\[/g,"<img src='"+path+"07.gif'/>").replace(/:-\(/g,"<img src='"+path+"08.gif'/>").replace(/\|-\(/g,"<img src='"+path+"09.gif'/>").replace(/}-\(/g,"<img src='"+path+"10.gif'/>").replace(/R-\|/g,"<img src='"+path+"11.gif'/>").replace(/:-\{/g,"<img src='"+path+"12.gif'/>").replace(/\]-\(/g,"<img src='"+path+"13.gif'/>").replace(/\]-\)/g,"<img src='"+path+"14.gif'/>").replace(/:-P/g,"<img src='"+path+"15.gif'/>").replace(/\|-P/g,"<img src='"+path+"16.gif'/>").replace(/:-\./g,"<img src='"+path+"17.gif'/>").replace(/:-\)/g,"<img src='"+path+"18.gif'/>").replace(/:-o/g,"<img src='"+path+"19.gif'/>").replace(/;-\)/g,"<img src='"+path+"20.gif'/>").replace(/\[!\]/g,"<img src='"+path+"21.gif'/>").replace(/\[\?\]/g,"<img src='"+path+"22.gif'/>").replace(/\[\*\]/g,"<img src='"+path+"23.gif'/>");
	
	var inda,inde,sub;
	while((inda = code.indexOf('[url]'))>=0){
		sub = code.substr(inda,code.length-inda);
		inde = sub.indexOf('[/url]');
		if(inde>0){
			sub = sub.substr(5,inde-5).replace('[url]','(url)');
			code = code.substr(0,inda) + "<a href='"+sub+"'>"+sub+"</a>" + code.substr(inda+inde+6,code.length-(inda+inde+6));
		}else break;
	}
	while((inda = code.indexOf('[img]'))>=0){
		sub = code.substr(inda,code.length-inda);
		inde = sub.indexOf('[/img]');
		if(inde>0){
			sub = sub.substr(5,inde-5).replace('[img]','(img)');
			if(useImages)code = code.substr(0,inda) + "<img src='"+sub+"' title='"+sub+"'/>" + code.substr(inda+inde+6,code.length-(inda+inde+6));
			else code = code.substr(0,inda) + " "+sub+" " + code.substr(inda+inde+6,code.length-(inda+inde+6));
		}else break;
	}
	while((inda = code.indexOf('[url='))>=0){
		sub = code.substr(inda,code.length-inda);
		inde = sub.indexOf('[/url]');
		if(inde>0){
			sub = sub.substr(5,inde-5);
			var ii = sub.indexOf(']');
			if(ii>0){
				var caption = sub.substr(0,ii).replace('[url=','(url=');
				sub = sub.substr(ii+1,sub.length-ii-1).replace('[url=','(url=');
				code = code.substr(0,inda) + "<a href='"+sub+"'>"+caption+"</a>" + code.substr(inda+inde+6,code.length-(inda+inde+6));
			}else break;
		}else break;
	}
	while((inda = code.indexOf('[quo]'))>=0){
		sub = code.substr(inda,code.length-inda);
		inde = sub.indexOf('[/quo]');
		if(inde>0){
			sub = sub.substr(5,inde-5).replace('[quo]','(quo)');
			code = code.substr(0,inda) + "<table class='invisible' width='100%'><tr><td style='padding-left:10px;'><font class='hint'>Zitat:</font><hr/>"+sub+"<hr></td></tr></table>" + code.substr(inda+inde+6,code.length-(inda+inde+6));
		}else break;
	}
	while((inda = code.indexOf('[quo='))>=0){
		sub = code.substr(inda,code.length-inda);
		inde = sub.indexOf('[/quo]');
		if(inde>0){
			sub = sub.substr(5,inde-5);
			var ii = sub.indexOf(']');
			if(ii>0){
				var caption = sub.substr(0,ii).replace('[quo=','(quo=');
				sub = sub.substr(ii+1,sub.length-ii-1).replace('[quo=','(quo=');
				code = code.substr(0,inda) + "<table class='invisible' width='100%'><tr><td style='padding-left:15px;'><font class='hint'>Zitat</font> "+caption+"<font class='hint'>:</font><hr/>"+sub+"<hr></td></tr></table>" + code.substr(inda+inde+6,code.length-(inda+inde+6));
			}else break;
		}else break;
	}
	while((inda = code.indexOf('[clr='))>=0){
		sub = code.substr(inda,code.length-inda);
		inde = sub.indexOf('[/clr]');
		if(inde>0){
			sub = sub.substr(5,inde-5);
			var ii = sub.indexOf(']');
			if(ii>0){
				var color = sub.substr(0,ii).replace('[clr=','(clr=');
				sub = sub.substr(ii+1,sub.length-ii-1).replace('[clr=','(clr=');
				if(useColor)code = code.substr(0,inda) + "<font color='#"+color+"'>"+sub+"</font>" + code.substr(inda+inde+6,code.length-(inda+inde+6));
				else code = code.substr(0,inda) + sub + code.substr(inda+inde+6,code.length-(inda+inde+6));
			}else break;
		}else break;
	}
	return code;
}
