// ==UserScript==
// @name           selfhtml
// @namespace      http://selfhtml.jstruebig.de/
// @description    BBCode Buttons für das selfhtml Forum
// @include        http://forum.de.selfhtml.org/*
// ==/UserScript==


(function() {
/*
	Die selfhtml Buttons entfernen
*/
var o = document.getElementById('bbcodeButtons');
if(o) o.style.display = 'none';

/*
	Den Header entfernen
*/
o = document.getElementById('kopf');
if(o) o.style.display = 'none';
	
var l = document.createElement('span');
l.addEventListener('click', function() {o.style.display = 'block'; l.style.display = 'none'}, true);
l.innerHTML = 'Kopf einblenden.';
l.style.cursor = 'pointer';
l.style.textDecoration = 'underline';
o.parentNode.insertBefore(l, o);
/*
	alle gelesenen Threads entfernen
*/

var all = document.getElementsByTagName('li');
var r = /\bvisited\b/i;
for(var i = 0; i < all.length; i++) {
	var el = all[i];
	if(el && r.test(el.className) && !el.getElementsByTagName('ul').length) 
	el.style.display = 'none';
}

var textarea = document.getElementsByTagName('textarea')[0];
if(! textarea) return;

var br = document.createElement("br");
// Platz für die Buttons schaffen
textarea.parentNode.insertBefore(br, textarea);
// Die Buttons anlegen
createButton('Link', 'link');
createButton('Bild', 'image');
createButton('HTML', 'code', 'html');
createButton('CSS', 'code', 'css');
createButton('JS', 'code', 'javascript');
createButton('PHP', 'code', 'php');
createButton('Perl', 'code', 'perl');
createButton('test', 'B');
	
/*
createButton() - fügt den Button oberhalb der Textarea ein
*/
function createButton (titel, aTag, eTag) {
	var button = document.createElement("input");
	button.type = 'button';
	button.className = 'jeena_bbcode';
	button.addEventListener('click', function() { insert(aTag, eTag);  }, true);
	button.value = titel;
	br.parentNode.insertBefore(button, br);
}
	
// Suchmuster
var url  = new RegExp('^(http://|https://|www.|ftp://|news:|mailto:|nntp:|telnet:|gopher:).');
var mail = new RegExp('^[^@]+@[^@]+\.[a-zA-Z]+$');
var http = new RegExp('^(http://)');
var nl = new RegExp('(\015\012|\015|\012)');
var ref = /^http:\/\/de\.selfhtml\.org\//;
	
var selfVersion = 'self812';

// insert - die eigentliche Funktion zum, einfügen des Code
function insert (aTag, eTag){
	textarea.focus();
	if(typeof document.selection != 'undefined') {
		/* für Internet Explorer und Opera >= 8 */
		var range = document.selection.createRange();
		var insText = getInsertText(range.text, aTag, eTag);
		if(!insText) return;
		range.text = insText;
		if (insText.length == 0) range.move('character', -1);
		else range.moveStart('character', insText.length);
	
	} else if(typeof textarea.selectionStart != 'undefined'){
		/* für neuere auf Gecko basierende Browser */
		var start = textarea.selectionStart;
		var end = textarea.selectionEnd;
		var insText = getInsertText( textarea.value.substring(start, end), aTag, eTag );
		if(!insText) return;
		textarea.value = textarea.value.substr(0, start) + insText  + textarea.value.substr(end);
		
		var pos;
		if (insText.length == 0) pos = start + aTag.length + 1;
		else pos = start + insText.length;
		
		textarea.selectionStart = pos;
		textarea.selectionEnd = pos;
	} else {
		/* fuer die uebrigen Browser */
		var insText = getInsertText('', aTag, eTag);
		textarea.value += insText;
	}
}
	
/*
getInsertText()
prüft ob eine Funktion mit dem Namen aTag existiert, dann wird diese aufgerufen
andernfalls wird der Code mit BBCode Tags umschlosse
*/
function getInsertText (insText, aTag, eTag) {
	if (typeof functions[aTag] == 'function')  return functions[aTag](insText, eTag);
	return functions.bbcode( insText, aTag, eTag);
}
	
/*
newline() - enthält die Zeichenkette Newline Zeichen
*/
function newline (insText) {
	if(nl.test(insText)) {
		alert('Der markierte Text darf keine Zeilenumbrueche enthalten');
		return true;
	}
	return false;
}
/*
Die Liste der Funktionen in einem Objekt gespeichert
*/
var functions = {
	// Image
	image: function(insText){
		if(newline(insText)) return '';
		var href = insText;
		var node = '';
		if(url.test(insText)) {
			// Text ist ein Link
			node = prompt('Alternativtext eingeben:', '');
		} else {
			// Text ist ein Text
			node = insText;
			if(!node) node = prompt('Alternativtext eingeben:');
			href = prompt('Bild URL eingeben:', 'http://');
		}
		if (!http.test(href)) href = 'http://' + href;
		return href ? 
		'[image:' + href + (node ? '@alt=' + node : '') + ']'
		: insText;
	},
	// code() -
	code: function(insText, lang ) {
		return '[code lang=' + lang + ']' + insText + '[/code]';
	},
	// bbCode()
	bbcode: function(insText, aTag, eTag ) {
		return '[' + aTag + ']' + insText + '[/' + (eTag || aTag)  +']';
	},
	// link()
	link: function(insText) {
		if(newline(insText)) return '';
		var node;
		var href;
		if( url.test(insText) || mail.test(insText) ) {
			// Der Text ist ein Link
			href = insText || prompt('URL eingeben:', '');
			
			if (mail.test(href)) href = 'mailto:' + insText;
			else if (!http.test(href)) href = 'http://' + insText;
			node = prompt('Linktext eingeben:', '');
		} else {
			// Der Text ist der Titel
			node = insText || prompt('Linktext eingeben:', '')
			href = prompt('URL eingeben:', 'http://');
			if (!http.test(href)) href = 'http://' + href;
		}
		if(!href) return insText;
		
		if(ref.test(href)) return '[ref:' + href.replace(ref, selfVersion + ";")
		+ (  node ? '@title=' + node : '' ) + ']';
		
		return '[link:' + href + (  node ? '@title=' + node : '' ) + ']';
	}
};


})();
