
var bbopen = false;
var bbdelayclose = null;
var avoidmouseover = true;

var postbuffer = new Array();
var postbufferindex = -1;
var postbuffercurr = '';

var animspeed = 400;
var ie6 = navigator.userAgent.match(/MSIE 6/) && !navigator.userAgent.match(/MSIE (7|8|9)/);
var ie7 = navigator.userAgent.match(/MSIE 7/) && !navigator.userAgent.match(/MSIE (8|9)/);
var shownavipanel = true; /* switch by cookie */
var showuserlist = true; /* switch by cookie */
var radio_data = false;

$(document).ready(function(){

	$('body').click(function() { /* close opened menus on body click */
		$('div.bbmenu:visible').fadeOut(250);
		window.clearTimeout(bbdelayclose);
		bbopen = false;
	});

	/*
	 * tabs
	 */
	$('#tabs>li').mouseenter(function() {
		if(avoidmouseover) { return; }
		$(this).siblings('li').removeClass('hover').find('div.sub').stop(true,true).hide();
		$(this).addClass('hover').find('div.sub').stop(true,true).slideDown(100);
	});
	$('#tabs').mouseleave(function() {
		$(this).find('div.sub').delay(500).fadeOut(200, function() {
			$(this).parents('li').removeClass('hover');
		});
	});
	$('#tabs>li a').click(function() {
		$(this).parents('li').removeClass('hover').find('div.sub').fadeOut(200);
	});
	window.setTimeout(function() { /* avoid popping up menu on site load */
		avoidmouseover = false;
	}, 500);
	/*
	 * tabs
	 */


	/*
	 * bbcode editor stuff
	 */
	$('div.editor>ul').hover(
		function() {
			window.clearTimeout(bbdelayclose);
		},
		function() {
			bbdelayclose = window.setTimeout(function() {
				$('div.bbmenu:visible').fadeOut(250);
				bbopen = false;
			}, 1000);
		}
	);
	$('div.editor>ul>li').hover(
		function() {
			$(this).siblings('li').find('div.bbhelp:visible').stop(true,true).hide(); /* hide other help boxes immediatelly */
			$(this).find('div.bbhelp').fadeIn(250); /* show help */
			if(bbopen) {
				$(this).siblings('li').find('div.bbmenu:visible').stop(true,true).hide()
				$(this).find('div.bbmenu').slideDown(100);
			}
		},
		function() {
			$(this).find('div.bbhelp').stop(true,true).fadeOut(500);
		}
	);
	$('div.editor>ul>li>a').click(function(e) {
		e.preventDefault();
		var $li = $(this).parent();
		if($li[0].className.match(/^bb(tag|block)(\-\w+)+$/)) {
			bbcodefromclassname($li.parents('div.editor').find('textarea').get(0), $li[0].className);
		} else
		if($li[0].className.match(/^bbmenu$/)) {
			if($li.find('div.bbmenu').is(':hidden')) {
				$li.siblings('li').find('div.bbmenu:visible').hide(); /* hide manually since body.click() is not called */
				$li.find('div.bbmenu').slideDown(100);
				bbopen = true;
				return false; /* do not call body.click() */
			}
		}
	});
	$('div.editor>ul>li>div.bbmenu a').click(function(e) {
		e.preventDefault();
		if(this.className.match(/^bb(tag|block)(\-\w+)+$/)) {
			bbcodefromclassname($(this).parents('div.editor').find('textarea').get(0), this.className);
		}
	});
	$('div.editor>ul>li>div.bbmenu .bbpicker a').click(function(e) {
		$(this).closest('.bbpicker').hide();
		$(this).closest('.bbpicker').next('div.picker').slideDown(200);
		return false;
	});

	$('div.editor>textarea').click(function() { /* activate editor on click */
		activateeditor(this);
	});
	$('div.editor>textarea').each(function() { /* activate editors automatically if there is any input */
		if(this.value.length > 0) { activateeditor(this); }
	});
	$('div.editor>textarea').keyup(function(event) { /* editor typing... */
		var regs;
		if(!(regs = this.className.match(/maxlen\-(\d+)/))) { return; }
		var maxlen = regs[1];
		if(this.value.length > maxlen) {
			var scroll = $(this).scrollTop();
			this.value = this.value.substring(0, maxlen);
			$(this).scrollTop(scroll);
			alert('Du darfst hier leider nicht mehr als ' + maxlen + ' Zeichen eingeben.');
		}
		refreshcharcount(this,$(this).next('p.chars'),maxlen);
	});

	$(".box:has(div.editor)").css('overflow', 'visible'); /* box fix: set overflow to visible when box contains an editor */
	/*
	 * /bbcode editor stuff
	 */


	/*
	 * color picker
	 */
	$('input.color').each(function() { /* form color input load */
		if(this.value.match(/[0-9A-F]{6}/)) {
			$(this).css('color', '#' + this.value);
		}
		// append colorpicker button
		$(this).after(' <button type="button" class="color small">...</button>');
	});

	$('input.color').keyup(function() { /* form color input change */
		if(this.value.match(/([0-9A-Fa-f]{3})|([0-9A-Fa-f]{6})/)) {
			this.value = this.value.toUpperCase();
			$(this).css('color', '#' + this.value);
		} else {
			$(this).css('color', '#000');
		}
	});
	$('button.color').click(function() { /* color picker button */
		$picker = $(this).next('div.picker');
		if(!$picker.is(':visible')) {
			$picker
				.css({ left: $(this).position().left + $(this).outerWidth() + 2, top: $(this).position().top })
				.show(250)
			;
			return false;
		}
	});
	$('div.picker').each(function() {
		var picker = this;
		var opts = picker.className.match(/\bpicker\-(\d+)\-(\d+)\-(\w+)\b/);
		if(opts == null) { $(picker).html('error'); return; }
		var ph = $(picker).height(); /* may be zero if picker is not visible yet */
		if(ph == 0) { /* get height from css property */
			var css = $(picker).css('height').match(/(\d+)px/);
			if(css == null) { alert('no picker height'); return; }
			ph = parseInt(css[1]);
		}
		var mt = parseInt(opts[1]); /* hide top pixels */
		var mb = parseInt(opts[2]); /* hide bottom pixels */
		$(picker).html('<div style="height:'+ph+'px;overflow:hidden;">'
			+ '<img src="../media/pickergray.png" class="pickergray" style="float:left;width:4%;height:'+(ph+mt+mb)+'px;margin-top:-'+mt+'px;cursor:pointer;" />'
			+ '<img src="../media/pickercolor.png" class="pickercolor" style="float:right;width:95%;height:'+(ph+mt+mb)+'px;margin-top:-'+mt+'px;cursor:pointer;" />'
			+ '</div>'
		);
		$(picker).find('img')
			.mousemove(function(e) {
				var pos = $(this).offset();
				var x = e.pageX - pos.left, y = e.pageY - pos.top;
				var color = this.className == 'pickercolor' ? getcolor(x, y, this.width, this.height) : getgray(y, this.height);
				$preview = $('#pickerpreview');
				if($preview.length == 0) {
					$preview = $('<div id="pickerpreview" style="display:none;position:absolute;">color</div>');
					$preview.prependTo($('body'));
				}
				$preview
					.css({ color: '#' + color, left: e.pageX-($preview.width()/2), top: e.pageY+20 }).text(color)
					.text(color)
					.fadeIn(250)
				;
			})
			.mouseout(function(e) {
				$('#pickerpreview').stop(true,true).fadeOut(250);
			})
			.click(function(e) {
				var opts = $(this).closest('div.picker')[0].className.match(/\bpicker\-(\d+)\-(\d+)\-(\w+)\b/);
				var pos = $(this).offset();
				var x = e.pageX - pos.left, y = e.pageY - pos.top;
				var color = this.className == 'pickercolor' ? getcolor(x, y, this.width, this.height) : getgray(y, this.height);
				eval(opts[3]+'(\''+color+'\', this)');
			})
		;
	});
	/*
	 * /color picker
	 */

	/*
	 * /chat stuff
	 */
	if($('#chat').length > 0) {
		
		/* post */
		$('#chatpost').each(function() {
			$(this).find('form').submit(function() {
				var $input = $(this).find('input');
				var cmd = $input.val();
				if(cmd.length > 0 && (postbuffer.length == 0 || postbuffer[0] != cmd)) { postbuffer.unshift(cmd); }
				postbufferindex = -1;
				post(cmd);
				$input.val('');
				return false;
			});
			$(this).find('input').keydown(function(e) { /* special key events */
				switch(navigator.userAgent.match(/Gecko/) ? e.which : e.keyCode) {
					case 9: /* tab */
						return false;
					case 27: /* escape */
						return false;
					case 38: /* up */
						postbufferindex++;
						if(postbufferindex == postbuffer.length) { postbufferindex--; break; }
						if(postbufferindex == 0) { postbuffercurr = this.value; }
						this.value = postbuffer[postbufferindex];
						if(this.value.match(/\/\S+ .+/)) { setSelectionRange(this, this.value.indexOf(' ')+1, this.value.length); } else { this.select(); }
						return false;
					case 40: /* down */
						if(--postbufferindex < -1) { postbufferindex++; break; }
						if(postbufferindex == -1) { this.value = postbuffercurr; break; }
						this.value = postbuffer[postbufferindex];
						if(this.value.match(/\/\S+ .+/)) { setSelectionRange(this, this.value.indexOf(' ')+1, this.value.length); } else { this.select(); }
						return false;
				}
			}).focus();
		});

		/* userlist */
		toggleUserList(getCookie('chatuserlist') == null ? showuserlist : (getCookie('chatuserlist') == 'yes'));
		$('#chatpanels a.chatusers.collapse').click(function() {
			document.cookie = 'chatuserlist=no; expires=Tue, 31-Dec-2030 00:00:00 GMT;';
			toggleUserList(false);
		});
		$('#chatpanels a.chatusers.expand').click(function() {
			document.cookie = 'chatuserlist=yes; expires=Tue, 31-Dec-2030 00:00:00 GMT;';
			toggleUserList(true);
		});

		/* navi Panel */
		toggleNaviPanel(getCookie('chatnavipanel') == null ? shownavipanel : (getCookie('chatnavipanel') == 'yes'));
		$('#chatpanels a.chatnavi.collapse').click(function() {
			document.cookie = 'chatnavipanel=no; expires=Tue, 31-Dec-2030 00:00:00 GMT;';
			toggleNaviPanel(false);
		});
		$('#chatpanels a.chatnavi.expand').click(function() {
			document.cookie = 'chatnavipanel=yes; expires=Tue, 31-Dec-2030 00:00:00 GMT;';
			toggleNaviPanel(true);
		});

		/* legacy mode fallback */
		window.setTimeout(function() {
			if($('#chatcontent .cs-enter').length == 0) {
				$('#chatcontent .cs-frameoption').show();
			}
		}, 15000);
	}
	/*
	 * /chat stuff
	 */


	/*
	 * preview
	 */
	$('button.preview').click(function() {
		$('div.box:has(div.error)').hide(); /* hide existing errors in document */
		$form = $(this).parents('form');
		$preview = $("#preview");
		$content = $preview.find('#previewcontent');
		$content.html('<div id="previewwrapper" style="padding: 0px; margin: 0px;"></div>');
		$wrapper = $content.find('#previewwrapper');
		$wrapper.html('<p class="progress">Lade Vorschau...</p>');
		$preview.show(0, function() {
			smoothScrollTo(Math.min($('a[name=edit]').position().top, $preview.position().top));
		});
		$.ajax({
			type: 'POST',
			url: 'preview.html',
			data: $form.serializeArray(),
			success: function(html){
				$wrapper.html(html);
				$content.css({ height: $wrapper.height()+20 });
			}
		});
	});
	/*
	 * /preview
	 */

	/*
	 * misc
	 */
	$('#boardsearch')
		.focus(function() {
			if(this.value == this.defaultValue) { this.value = ''; this.style.color = '#000'; this.style.textAlign = 'left'; }
		})
		.blur(function() {
			if(this.value == '') { this.value = this.defaultValue; this.style.color = ''; this.style.textAlign = 'center'; }
		})
		.each(function() {
			this.style.color = this.value == this.defaultValue ? '' : '#000';
			this.style.textAlign = this.value == this.defaultValue ? 'center' : 'left';
		})
	;
	$('td>input[type=checkbox]').mouseenter(function() { /* memo checkbox options */
		var opts = $(this).parents('table').siblings('.tableopts').slideDown(250);
	});
	$('select.jump').change(function() { /* page chooser jump menu */
		go(this.options[this.selectedIndex].value);
	});
	$('.focusme').each(function() {
		if(this.value == '') $(this).focus();
	});
	$('div.splitbox').each(function() {
		$lb = $(this).find('.left .box');
		$rb = $(this).find('.right .box');
		if($rb.height() > $lb.height()) { $lb.height($rb.height()); } else
		if($lb.height() > $rb.height()) { $rb.height($lb.height()); }
	});
	/*
	 * /misc
	 */

	if($('#chatscreen').length > 0) {
		radio_init();
		if(ie6) {
			fixChatIE6();
			window.setInterval(fixChatIE6, 250);
			window.setTimeout(function() {
				alert('Du verwendest einen stark veralteten Browser. Der Chat wird deshalb nicht optimal dargestellt. Bitte aktualisiere deinen Browser bei nächster Gelegenheit oder benutze einen anderen Browser.');
			}, 1000);
		}
	}

});

function fixChatIE6() {
	$('#chatradio').remove();
	var headh = $('#head').outerHeight();
	var screenw = $(window).width() - ($('#chatusers').is(':visible')?$('#chatusers').outerWidth():0) - ($('#chatnavi').is(':visible')?$('#chatnavi').outerWidth():0) - 30;
	var screenh = $(window).height() - $('#head').outerHeight() - $('#chatpanels').outerHeight();
	$('#chatscreen').css({ top: headh, width: screenw, height: screenh - $('#chatpost').outerHeight() });
	$('#chatcontent').css({ width: screenw - 50 });
	$('#chatpost').css({ top: headh + screenh - $('#chatpost').outerHeight(), width: screenw });
	$('#chatusers').css({ top: headh, height: screenh });
	$('#chatnavi').css({ top: headh, height: screenh + ($('#chatnavi').outerHeight()-$('#chatnavi').height()) });
}

function smoothScrollTo(pos) {
	$('body').append('<div id="scrollhelper" style="height:2000px;" />')
	smoothScrollBy(pos - $(window).scrollTop());
}
function smoothScrollBy(h) {
	if(h > -3 && h < 3) {
		window.scrollBy(0, h);
		$('#scrollhelper').remove();
	} else {
		s = Math.round(h / 3);
		window.scrollBy(0, s);
		window.setTimeout(function() { smoothScrollBy(h-s); }, 10);
	}
}

/*
 * bbcode and color picker helpers
 */
function activateeditor(elem) {
	var regs;
	/* expand on classname "size-123" */
	if(regs = elem.className.match(/size\-(\d+)/)) {
		if($(elem).css('height') != regs[1]+'px') {
			$(elem).animate({height: regs[1]+'px'},250);
		}
	}
	/* append charcount info if classname "maxlen-123" */
	if(regs = elem.className.match(/maxlen\-(\d+)/)) {
		if($(elem).parent().find('p.chars').length == 0) {
			$(elem).after('<p class="chars" style="display:none;"></p>');
			$(elem).next().show(500);
			refreshcharcount(elem, $(elem).next(), regs[1]);
		}
	}
	/* show bbode panel if hidden */
	var tb = $(elem).parents('div.editor').find('ul').get();
	if($(tb).is(':hidden')) { $(tb).slideDown(200); }
}

function refreshcharcount(elem,$count,maxlen) {
	$count.text(elem.value.length < maxlen ?
		'(Du darfst noch ' + (maxlen-elem.value.length) + ' Zeichen eingeben)' :
		'(Du darfst hier leider nicht mehr Zeichen eingeben)'
	);
}

function bbcodefromclassname(elem, classname) {
	var regs;
	if(regs = classname.match(/^bb(tag|block)\-(\w+)$/)) {
		bbcode(elem, regs[2], null, regs[1]=='block', null);
	} else
	if(regs = classname.match(/^bb(tag|block)\-(\w+)\-([\w\d]+)$/)) {
		bbcode(elem, regs[2], regs[3], regs[1]=='block', null);
	}
}

function bbcode(elem, tag, param, block, text) {
	var bbopen = (block?'\n':'')+'['+tag+(param!=null?'='+param:'')+']'+(block?'\n':'');
	var bbclose = tag!='*'?(block?'\n':'')+'[/'+tag+']'+(block?'\n':''):''
	var scrollTop = elem.scrollTop;
	if(elem.setSelectionRange) { /* modern browsers */
		var srange = getSelectionRange(elem);
		elem.value = elem.value.substring(0, srange.start) + bbopen + (text != null ? text : elem.value.substring(srange.start, srange.end)) + bbclose + elem.value.substring(srange.end);
		setSelectionRange(elem, srange.start+bbopen.length, srange.end+bbopen.length);
	} else { /* IE */
		elem.focus();
		var selected = document.selection.createRange().text;
		document.selection.createRange().text = bbopen + (text != null ? text : selected) + bbclose;
		/*
		 * placing the cursor/selection between bbopen and bbclose does not work
		 * so let IE keep its selection on the whole text including tags
		 * todo: solve
		 */
	}
	elem.scrollTop = scrollTop + (block?30:0);
	elem.focus();
}

function quoteSelection(username) {
	var text = getSelectedText();
	if(text.length == 0) { alert('Du hast keinen Text markiert!'); return; }
	if($('div.editor>textarea').length != 1) { return; } // no editor found or not unique
	var editor = $('div.editor>textarea').get(0);
	bbcode(editor, 'quote', username, true, text);
	$(document).scrollTop($(editor).position().top-30);
}
function getcolor(x, y, w, h){
	sv = 2; sh = 1;	     /* vertical and horizontal skip values used for image generation */
	bv = w/6; bh = h/2;  /* vertical and horizontal block sizes (6x2 blocks) */
	f = 768 / w;         /* relation to original image size */
	if(x < bv*1) {
		r = 255; g = (x - bv*0) * f * sv; b = 0;
	} else if(x < bv*2) {
		r = 255 - ((x - bv*1) * f * sv); g = 255; b = 0;
	} else if(x < bv*3) {
		r = 0; g = 255; b = (x - bv*2) * f * sv;
	} else if(x < bv*4) {
		r = 0; g = 255 - ((x - bv*3) * f * sv); b = 255;
	} else if(x < bv*5) {
		r = (x - bv*4) * f * sv; g = 0; b = 255;
	} else {
		r = 255; g = 0; b = 255 - ((x - bv*5) * f * sv);
	}
	if(y < bh) {
		r += ((255 - r) * (bh - y)) / bh;
		g += ((255 - g) * (bh - y)) / bh;
		b += ((255 - b) * (bh - y)) / bh;
	} else {
		r -= (r * (y - bh)) / bh;
		g -= (g * (y - bh)) / bh;
		b -= (b * (y - bh)) / bh;
	}
	return hexcolor(r, g, b);
}
function getgray(y, h) {
	var i = 255 - 255*(y/h);
	return hexcolor(i, i, i);
}

function chatcolor(color, elem) {
	post('/col ' + color);
}
function buttoncolor(color, elem) {
	$(elem).closest('div.picker').prevAll('input.color').css({ color: '#'+color }).val(color).focus();
}
function bbcolor(color, elem) {
	bbcode($(elem).closest('div.editor').find('textarea')[0], 'color', color, false, null);
}

/*
 * /bbcode and color picker helpers
 */



/*
 * navigation
 */
function go(url,msg) { /* opens url with optional confirm message */
	if(arguments.length>1 && msg!= null && !confirm(msg)) { return; }
	location.href = url;
}
function op(elem,name,force) { /* opens new popup if required */
	if(!force && !window.name.match(/^popup_/)) return;
	elem.target = 'popup_' + name;
	w = window.open('', 'popup_'+name, 'scrollbars=yes,toolbar=no,location=no,directories=no,status=no,menubar=no,resizable=no,width=900,height=550');
	w.focus();
}
function image(id,width,height) {
	$('body').append('<div id="overlay" /><div id="modal" />');
	$('#overlay')
		.fadeTo(200, 0.7, function() {
			$('#modal')
				.html('<img src="/sys/image/' + id + '" alt="" width="' + width + '" height="' + height + '" /><small>Zum Schließen auf das Bild klicken!</small>')
				.css({ marginLeft: -($('#modal').outerWidth()/2), marginTop: -($('#modal').outerHeight()/2) })
				.click(function() {
					$('#modal').remove();
					$('#overlay').fadeOut(200);
				})
				.show(0)
			;
		})
		.click(function() {
			$('#modal').remove();
			$('#overlay').fadeOut(200);
		})
	;
	return false;
}
/*
 * /navigation
 */


/*
 * chat stuff
 */
function post(cmd) {
	$.post("post.html", { Command: cmd });
	$('#chatpost input').focus();
}
function sepa(n) {
	var c = prompt('Wie soll dein Raum heißen?', n + (n.match(/[xszß]$/i)?'\'':'s') + ' Raum');
	if(c != null && c.length > 0) post('/sepa ' + c);
}
function invite() {
	var u = prompt("Wen möchtest du einladen?", "");
	if(u != null && u.length > 0) post('/i ' + u);
}
function away() {
	var a = prompt('Abmelden:', 'bin kurz weg...');
	if(a != null && a.length > 0) post('/away ' + a);
}
function channel(elem) {
	var c = elem.options[elem.selectedIndex].value;
	if(c.length > 0) { post('/j ' + c); }
	elem.selectedIndex = 0;
}
function toggleNaviPanel(state) {
	if(state) {
		$('#chatpanels a.chatnavi.expand').hide();
		$('#chatcenter').animate({ right: $('#chatnavi').outerWidth() }, 150, function() {
			$('#chatnavi').fadeIn(150);
			$('#chatpanels a.chatnavi.collapse').show();
		});
	} else {
		$('#chatpanels a.chatnavi.collapse').hide();
		$('#chatnavi').fadeOut(150, function() {
			$('#chatcenter').animate({ right: "0px" }, 150);
			$('#chatpanels a.chatnavi.expand').show();
		});
	}
}
function toggleUserList(state) {
	if(state) {
		$('#chatpanels a.chatusers.expand').hide();
		$('#chatcenter').animate({ left: $('#chatusers').outerWidth() }, 150, function() {
			$('#chatusers').fadeIn(150);
			$('#chatpanels a.chatusers.collapse').show();
		});
	} else {
		$('#chatpanels a.chatusers.collapse').hide();
		$('#chatusers').fadeOut(150, function() {
			$('#chatcenter').animate({ left: "0px" }, 150);
			$('#chatpanels a.chatusers.expand').show();
		});
	}
}
/*
 * /chat stuff
 */

 
/*
 * chat user list
 */
function ul_ci(c) { /* channel init */
	var $cdiv = $('#ulc').append('<div id="'+c.cid+'" class="c" style="display:none;"><h4>[<a href="#">'+c.name+'</a>]</h4></div>').children('div.c:last');
	$cdiv.find('a').click(function(){ post('/j ' + c.id); return false; });
	$cdiv.toggleClass('locked', c.locked);
	for(i = 1; i < arguments.length; i++) {
		var u = arguments[i];
		var $udiv = $cdiv.append('<div id="'+u.uid+'" class="u u'+u.sex+'">'+(u.guest?'<span title="nicht registriert" style="color:#'+u.color+';">'+u.name+'</span>':'<a href="../guestbook/?UserName='+encodeURIComponent(u.name)+'" style="color:#'+u.color+';">'+u.name+'</a>')+'</div>').children('div.u:last');
		$udiv.find('a').click(function(){ op(this,'gb',true); });
		$udiv.toggleClass('guest', u.guest).toggleClass('su', u.superuser).toggleClass('away', u.away!=null);
	}
	$cdiv.show(animspeed);
}
function ul_ui(u) { /* user init */
	ul_ua(u);
}
function ul_cu(c) { /* channel update */
	var $cdiv = $('#'+c.cid);
	$cdiv.toggleClass('locked', c.locked);
}
function ul_ce(c, u) { /* channel enter */
	if(nc = (($cdiv = $('#'+c.cid)).length == 0)) {
		$cdiv = $('#ulc').append('<div id="'+c.cid+'" class="c" style="display:none;"><h4>[<a href="#">'+c.name+'</a>]</h4></div>').children('div.c:last');
		$cdiv.find('a').click(function(){ post('/j ' + c.id); return false; });
	}
	$cdiv.toggleClass('locked', c.locked);
	var $udiv = $cdiv.append('<div id="'+u.uid+'" class="u u'+u.sex+'" style="display:'+(nc?'block':'none')+';">'+(u.guest?'<span title="nicht registriert" style="color:#'+u.color+';">'+u.name+'</span>':'<a href="../guestbook/?UserName='+encodeURIComponent(u.name)+'" style="color:#'+u.color+';">'+u.name+'</a>')+'</div>').children('div.u:last');
	$udiv.find('a').click(function(){ op(this,'gb',true); });
	$udiv.toggleClass('guest', u.guest).toggleClass('su', u.superuser).toggleClass('away', u.away!=null);
	(nc?$cdiv:$udiv).show(animspeed);
}
function ul_cl(c, u) { /* channel leave */
	(($cdiv = ($udiv = $('#'+u.uid)).removeAttr('id').parent('div.c')).children('div.u[id]').length == 0 ? $cdiv.removeAttr('id') : $udiv).hide(animspeed, function() { $(this).remove(); });
}
function ul_ua(u) { /* user add (comm) */
	var f = ($odiv = $('#ulo')).children('div.u').length == 0;
	var $udiv = $odiv.append('<div id="'+u.uid+'" class="u u'+u.sex+'" style="display:'+(f?'block':'none')+';">'+(u.guest?'<span title="nicht registriert" style="color:#'+u.color+';">'+u.name+'</span>':'<a href="../guestbook/?UserName='+encodeURIComponent(u.name)+'" style="color:#'+u.color+';">'+u.name+'</a>')+'</div>').children('div.u:last');
	$udiv.find('a').click(function(){ op(this,'gb',true); });
	$udiv.toggleClass('guest', u.guest).toggleClass('su', u.superuser).toggleClass('away', u.away!=null);
	(f?$odiv:$udiv).show(animspeed);
}
function ul_ur(u) { /* user remove (comm) */
	$('#ulo #'+u.uid).removeAttr('id').hide(animspeed, function(){
		$(this).remove();
		if(($odiv = $('#ulo')).children('div.u').length == 0) {
			$odiv.hide(animspeed);
		}
	});
}
function ul_uu(u) { /* user update */
	$udiv = $('#'+u.uid);
	$udiv.toggleClass('guest', u.guest).toggleClass('su', u.superuser).toggleClass('away', u.away!=null);
	$udiv.toggleClass('um', u.sex=='m').toggleClass('uf', u.sex=='f').toggleClass('uu', u.sex=='u');
	$udiv.children(u.guest?'span':'a').css({color:'#'+u.color});
}
/*
 * /chat user list
 */


/*
 * radio
 */
function radio_init() {
	$('#jplayer_play').click(function(e) {
		e.preventDefault();
		radio_play();
		$('#chatpost input').focus();
	});
	$('#jplayer_stop').click(function(e) {
		e.preventDefault();
		radio_stop();
		$('#chatpost input').focus();
	});
	$('#jplayer_ext a').click(function(e) {
		radio_stop();
		$('#chatpost input').focus();
	});
}
function radio_on(data) {
	radio_stream = data.stream;
	radio_meta(data);
	$('#chatradio').fadeOut(500, function() {
		$('#radiooffline').hide();
		$('#radioonline').show();
		$(this).slideDown(200);
	});
	$("#jplayer_ext a").attr('href', data.playlist);
}
function radio_meta(data) {
	$('#radiometa1').html('Zuhörer: <strong>' + data.listeners + '</strong> / Bitrate: <strong>' + data.bitrate + '</strong>' + (data.moderator?' / Moderator: <strong>' + htmlent(data.moderator) + '</strong>':''));
	$('#radiometa2').html('Aktueller Song: <strong>' + htmlent(data.song) + '</strong>');
}
function radio_off() {
	radio_stream = false;
	radio_stop();
	$('#chatradio').fadeOut(500, function() {
		$('#radioonline').hide();
		$('#radiooffline').show();
		$(this).slideDown(200);
	});
}
function radio_play(e) {
	if(e) e.preventDefault();
	$('#jplayer_play').hide();
	$('#jplayer_stop').addClass('progress').append('<img src="../media/roller-dark.gif" alt="" title="Puffern..." />').show();
	$('#chatradio').append('<div id="jplayer"/>')
	$('#jplayer')
		.jPlayer({
			customCssIds: true, oggSupport: false, swfPath: media, errorAlerts: true, warningAlerts: true,
			ready: function() { this.element.jPlayer('setFile', radio_stream).jPlayer('play'); }
		})
		.jPlayer('cssId', 'volumeMin', 'jplayer_volume_min')
		.jPlayer('cssId', 'volumeMax', 'jplayer_volume_max')
		.jPlayer('cssId', 'volumeBar', 'jplayer_volume_bar')
		.jPlayer('cssId', 'volumeBarValue', 'jplayer_volume_bar_value')
		.jPlayer('onSoundComplete', function() { radio_stop(); radio_play(); })
		.jPlayer('onProgressChange', function(loadPercent, playedPercentRelative, playedPercentAbsolute, playedTime, totalTime) {
			if(playedTime > 0 && playedTime < 10000 && $('#jplayer_stop').hasClass('progress')) {
				$('#jplayer_stop').empty().removeClass('progress');
			}
		})
	;
	if($('#jplayer p').length > 0) {
		alert('Der Player scheint in deinem Browser nicht zu funktionieren. Möglicherweise ist kein Flash installiert oder der Browser blockiert das Plugin.\n\nVerwende stattdessen den Link "eigener Player".'); 
		radio_stop();
	}
}
function radio_stop(e) {
	if(e) e.preventDefault();
	$('#jplayer_play').show();
	$('#jplayer_stop').empty().removeClass('progress').hide();
	$('#jplayer').remove();
}
/*
 * /radio
 */


/*
 * misc/helpers
 */
function hexcolor(r,g,b) {
	function hex(i) { i = parseInt(i < 0 ? 0 : (i > 255 ? 255 : i)).toString(16); return (i.length==1?"0":"")+i.toUpperCase(); }
	return hex(r) + hex(g) + hex(b);
}
function htmlent(str) {
	str = str.replace(/</g, '&lt;');
	str = str.replace(/>/g, '&gt;');
	str = str.replace(/^\s+/, '');
	str = str.replace(/\s+$/, '');
	return str;
}
function getSelectedText() {
	if(window.getSelection) { return String(window.getSelection()); } /* modern browsers */
	if(document.getSelection) { return String(document.getSelection()); } /* older gecko/netscape */
	if(document.selection) { return document.selection.createRange().text; } /* IE */
	return null;
}
function getSelectionRange(input) { /* in IE, use for <input type=text> only (does not work on textarea) */
	if(input.setSelectionRange) { /* modern browsers */
		return { start:input.selectionStart, end:input.selectionEnd };
	} else if(document.selection.createRange) { /* IE */
		_start = 0, _end = 0
		var range = document.selection.createRange();
		if(range.compareEndPoints('StartToEnd', range) != 0) range.collapse(true);
		_start = range.getBookmark().charCodeAt(2);
		range = document.selection.createRange();
		if(range.compareEndPoints('StartToEnd', range) != 0) range.collapse(false);
		_end = range.getBookmark().charCodeAt(2);
		return { start:_start-2, end:_end-2 };
	}
}
function setSelectionRange(input, start, end) { /* in IE, use for <input type=text> only (does not work on textarea) */
	if(arguments.length < 3) end = start; /* make end optional */
	if(input.setSelectionRange) { /* modern browsers */
		input.setSelectionRange(start, end);
	}
	else if(input.createTextRange) { /* IE */
		var range = input.createTextRange();
		range.collapse(true);
		range.moveEnd('character', end);
		range.moveStart('character', end);
		range.select();
	}
}
function getCookie(name) {
	c=document.cookie.split(";");
	for(var i=0; i<c.length; i++) {
		ce = c[i].replace(/^\s+|\s+$/g,"").split("=");
		if(ce[0] == name) { return unescape(c[i].split("=")[1]); }
	}
	return null;
}
function toggleAll(n,s) {
	e = document.getElementsByName(n);
	for(i=0;i<e.length;i++) { e[i].checked=s; }
}
/*
 * /misc/helpers
 */

