// ==UserScript==
// @name TC+ BBCodes
// @description Adds some buttons to formate messages.
// @author Oskar Bley
// @namespace http://dkplus.org/
// @include http://die-kreuzzuege.de/game.php*
// @include http://*.die-kreuzzuege.de/game.php*
// @include http://the-crusades.org/game.php*
// @include http://*.the-crusades.org/game.php*
// ==/UserScript==
// -----------------------------------------------------------------------------
// Modifikationen und Weiterverbreitung dieses Scripts benötigen die
// Zustimmung des Autors.
// -----------------------------------------------------------------------------
(function(){
var _addEvent = function(eElem, sEvent, fEventHandler){
if (eElem.addEventListener) {
eElem.addEventListener(sEvent, fEventHandler, true);
} else if (eElem.attachEvent) {
eElem.attachEvent('on' + sEvent, fEventHandler);
}
};
var _preventDefaultEvent = function(e){
if (!e){
e = window.event;
}
e.preventDefault();
return false;
}
var _insert = function(aTag, eTag) {
var input = _getTextarea();
input.focus();
var insText, pos;
if (typeof document.selection != 'undefined') { //für Internet Explorer
//Einfügen des Formatierungscodes
var range = document.selection.createRange();
insText = range.text;
range.text = aTag + insText + eTag;
//Anpassen der Cursorposition
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();
} else if (typeof input.selectionStart != 'undefined') { //für neuere auf Gecko basierende Browser
//Einfügen des Formatierungscodes
var start = input.selectionStart;
var end = input.selectionEnd;
insText = input.value.substring(start, end);
input.value = input.value.substr(0, start) + aTag + insText + eTag + input.value.substr(end);
//Anpassen der Cursorposition
if (insText.length == 0) {
pos = start + aTag.length;
} else {
pos = start + aTag.length + insText.length + eTag.length;
}
input.selectionStart = pos;
input.selectionEnd = pos;
} else { //für die übrigen Browser
//Abfrage der Einfügeposition
var re = new RegExp('^[0-9]{0,3}$');
while (!re.test(pos)) {
pos = prompt("Einfügen an Position (0.." + input.value.length + "):", "0");
}
if (pos > input.value.length) {
pos = input.value.length;
}
//Einfügen des Formatierungscodes
insText = prompt("Bitte geben Sie den zu formatierenden Text ein:");
input.value = input.value.substr(0, pos) + aTag + insText + eTag + input.value.substr(pos);
}
}
var _getTextarea = function(){
var oElements = document.getElementsByTagName('textarea');
if (oElements.length == 1) {
return oElements[0];
}
throw new Error('Textarea not found');
}
var _getQueryParam = (function(){
var aQuery = window.location.search.replace(/\?/, '').split('&');
var aSplit;
var _aQuery = {};
for(var i = 0, len = aQuery.length; i < len; ++i){
aSplit = aQuery[i].split('=');
delete aQuery[i];
_aQuery[aSplit[0]] = aSplit[1];
}
return function(sParam){
return _aQuery[sParam];
};
})();
var _getUserLanguage = (function(){
var sLanguage = navigator.language;
if (sLanguage.indexOf('de') != -1) {
return function(){return 'de'};
} else if( sLanguage.indexOf('fr') != -1) {
return function(){return 'fr'};
}
return function(){return 'en'};
})();
var _insertButtons = function(elem, bIntern, eTextarea){
var eButton = document.createElement('button');
_addEvent(eButton, 'click', function(e){_insert('[b]', '[/b]'); _preventDefaultEvent(e); });
eButton.innerHTML = '';
elem.appendChild(eButton);
eButton = document.createElement('button');
_addEvent(eButton, 'click', function(e){
_insert('[i]', '[/i]');
return _preventDefaultEvent(e);
});
eButton.innerHTML = '';
elem.appendChild(eButton);
eButton = document.createElement('button');
_addEvent(eButton, 'click', function(e){
_insert('[u]', '[/u]');
return _preventDefaultEvent(e);
});
eButton.innerHTML = '';
elem.appendChild(eButton);
eButton = document.createElement('button');
_addEvent(eButton, 'click', function(e){
_insert('[center]', '[/center]');
return _preventDefaultEvent(e);
});
eButton.innerHTML = '';
elem.appendChild(eButton);
eButton = document.createElement('button');
_addEvent(eButton, 'click', function(e){
var id = window.prompt('Bitte gib die ID des gewünschten Spieler ein', '');
if (id == undefined){return _preventDefaultEvent(e);}
_insert('[p' + id + ']', '[/p]');
return _preventDefaultEvent(e);
});
eButton.innerHTML = '';
elem.appendChild(eButton);
eButton = document.createElement('button');
_addEvent(eButton, 'click', function(e){
var id = window.prompt('Bitte gib die ID der gewünschten Allianz ein', '');
if (id == undefined){return _preventDefaultEvent(e);}
_insert('[a' + id + ']', '[/a]');
return _preventDefaultEvent(e);
});
eButton.innerHTML = '';
elem.appendChild(eButton);
eButton = document.createElement('button');
_addEvent(eButton, 'click', function(e){
var id = window.prompt('Bitte gib die ID der gewünschten Burg ein', '');
if (id == undefined){return _preventDefaultEvent(e);}
_insert('[v' + id + ']', '[/v]');
return _preventDefaultEvent(e);
});
eButton.innerHTML = '';
elem.appendChild(eButton);
if (bIntern) {
eButton = document.createElement('button');
_addEvent(eButton, 'click', function(e){
_insert('[img]', '[/img]');
return _preventDefaultEvent(e);
});
eButton.innerHTML = '';
elem.appendChild(eButton);
eButton = document.createElement('button');
eButton.innerHTML = '';
elem.appendChild(eButton);
var eDiv = document.createElement('div');
eDiv.style.position = 'absolute';
eDiv.style.height = (eTextarea.offsetHeight + 'px');
eDiv.style.width = (eTextarea.offsetWidth + 'px');
eDiv.style.backgroundColor = 'white';
eDiv.style.overflow = 'scroll';
eDiv.style.display = 'none';
var eSmileyContainer = document.createElement('span');
eSmileyContainer.style.display = 'inline-block';
eSmileyContainer.style.border = '1px solid black';
eSmileyContainer.style.height = '45px';
eSmileyContainer.style.paddingTop = '15px';
eSmileyContainer.style.width = '60px';
eSmileyContainer.style.verticalAlign = 'middle';
eSmileyContainer.style.textAlign = 'center';
eSmileyContainer.appendChild(document.createElement('a'));
var eSmileyDiv;
eSmileyDiv = eSmileyContainer.cloneNode(true);
eSmileyDiv.firstChild.innerHTML = '';
_addEvent(eSmileyDiv.firstChild, 'click', function(e){
_insert('', ' :danke: ');
eDiv.style.display = 'none';
return _preventDefaultEvent(e);
});
eDiv.appendChild(eSmileyDiv);
eSmileyDiv = eSmileyContainer.cloneNode(true);
eSmileyDiv.firstChild.innerHTML = '';
_addEvent(eSmileyDiv.firstChild, 'click', function(e){
_insert('', ' :D ');
eDiv.style.display = 'none';
return _preventDefaultEvent(e);
});
eDiv.appendChild(eSmileyDiv);
eSmileyDiv = eSmileyContainer.cloneNode(true);
eSmileyDiv.firstChild.innerHTML = '';
_addEvent(eSmileyDiv.firstChild, 'click', function(e){
_insert('', ' :) ');
eDiv.style.display = 'none';
return _preventDefaultEvent(e);
});
eDiv.appendChild(eSmileyDiv);
eSmileyDiv = eSmileyContainer.cloneNode(true);
eSmileyDiv.firstChild.innerHTML = '';
_addEvent(eSmileyDiv.firstChild, 'click', function(e){
_insert('', ' :confused: ');
eDiv.style.display = 'none';
return _preventDefaultEvent(e);
});
eDiv.appendChild(eSmileyDiv);
eSmileyDiv = eSmileyContainer.cloneNode(true);
eSmileyDiv.firstChild.innerHTML = '';
_addEvent(eSmileyDiv.firstChild, 'click', function(e){
_insert('', ' :mad: ');
eDiv.style.display = 'none';
return _preventDefaultEvent(e);
});
eDiv.appendChild(eSmileyDiv);
eSmileyDiv = eSmileyContainer.cloneNode(true);
eSmileyDiv.firstChild.innerHTML = '';
_addEvent(eSmileyDiv.firstChild, 'click', function(e){
_insert('', ' :applaus: ');
eDiv.style.display = 'none';
return _preventDefaultEvent(e);
});
eDiv.appendChild(eSmileyDiv);
eSmileyDiv = eSmileyContainer.cloneNode(true);
eSmileyDiv.firstChild.innerHTML = '';
_addEvent(eSmileyDiv.firstChild, 'click', function(e){
_insert('', ' :gruebel: ');
eDiv.style.display = 'none';
return _preventDefaultEvent(e);
});
eDiv.appendChild(eSmileyDiv);
eSmileyDiv = eSmileyContainer.cloneNode(true);
eSmileyDiv.firstChild.innerHTML = '';
_addEvent(eSmileyDiv.firstChild, 'click', function(e){
_insert('', ' :hallo: ');
eDiv.style.display = 'none';
return _preventDefaultEvent(e);
});
eDiv.appendChild(eSmileyDiv);
eSmileyDiv = eSmileyContainer.cloneNode(true);
eSmileyDiv.firstChild.innerHTML = '';
_addEvent(eSmileyDiv.firstChild, 'click', function(e){
_insert('', ' :hupf: ');
eDiv.style.display = 'none';
return _preventDefaultEvent(e);
});
eDiv.appendChild(eSmileyDiv);
eSmileyDiv = eSmileyContainer.cloneNode(true);
eSmileyDiv.firstChild.innerHTML = '';
_addEvent(eSmileyDiv.firstChild, 'click', function(e){
_insert('', ' :kotz: ');
eDiv.style.display = 'none';
return _preventDefaultEvent(e);
});
eDiv.appendChild(eSmileyDiv);
eSmileyDiv = eSmileyContainer.cloneNode(true);
eSmileyDiv.firstChild.innerHTML = '';
_addEvent(eSmileyDiv.firstChild, 'click', function(e){
_insert('', ' :love: ');
eDiv.style.display = 'none';
return _preventDefaultEvent(e);
});
eDiv.appendChild(eSmileyDiv);
eSmileyDiv = eSmileyContainer.cloneNode(true);
eSmileyDiv.firstChild.innerHTML = '';
_addEvent(eSmileyDiv.firstChild, 'click', function(e){
_insert('', ' :sex: ');
eDiv.style.display = 'none';
return _preventDefaultEvent(e);
});
eDiv.appendChild(eSmileyDiv);
eSmileyDiv = eSmileyContainer.cloneNode(true);
eSmileyDiv.firstChild.innerHTML = '';
_addEvent(eSmileyDiv.firstChild, 'click', function(e){
_insert('', ' :stupid: ');
eDiv.style.display = 'none';
return _preventDefaultEvent(e);
});
eDiv.appendChild(eSmileyDiv);
eSmileyDiv = eSmileyContainer.cloneNode(true);
eSmileyDiv.firstChild.innerHTML = '';
_addEvent(eSmileyDiv.firstChild, 'click', function(e){
_insert('', ' :thumb: ');
eDiv.style.display = 'none';
return _preventDefaultEvent(e);
});
eDiv.appendChild(eSmileyDiv);
eSmileyDiv = eSmileyContainer.cloneNode(true);
eSmileyDiv.firstChild.innerHTML = '';
_addEvent(eSmileyDiv.firstChild, 'click', function(e){
_insert('', ' :wall: ');
eDiv.style.display = 'none';
return _preventDefaultEvent(e);
});
eDiv.appendChild(eSmileyDiv);
eSmileyDiv = eSmileyContainer.cloneNode(true);
eSmileyDiv.firstChild.innerHTML = '';
_addEvent(eSmileyDiv.firstChild, 'click', function(e){
_insert('', ' :wink: ');
eDiv.style.display = 'none';
return _preventDefaultEvent(e);
});
eDiv.appendChild(eSmileyDiv);
eSmileyDiv = eSmileyContainer.cloneNode(true);
eSmileyDiv.firstChild.innerHTML = '';
_addEvent(eSmileyDiv.firstChild, 'click', function(e){
_insert('', ' ;) ');
eDiv.style.display = 'none';
return _preventDefaultEvent(e);
});
eDiv.appendChild(eSmileyDiv);
eSmileyDiv = eSmileyContainer.cloneNode(true);
eSmileyDiv.firstChild.innerHTML = '';
_addEvent(eSmileyDiv.firstChild, 'click', function(e){
_insert('', ' :( ');
eDiv.style.display = 'none';
return _preventDefaultEvent(e);
});
eDiv.appendChild(eSmileyDiv);
elem.appendChild(eDiv);
_addEvent(eButton, 'click', function(e){
eDiv.style.display = 'block';
return _preventDefaultEvent(e);
});
} else {
eButton = document.createElement('button');
_addEvent(eButton, 'click', function(e){
_insert('', ' :D ');
return _preventDefaultEvent(e);
});
eButton.innerHTML = '';
elem.appendChild(eButton);
eButton = document.createElement('button');
_addEvent(eButton, 'click', function(e){
_insert('', ' :) ');
return _preventDefaultEvent(e);
});
eButton.innerHTML = '';
elem.appendChild(eButton);
eButton = document.createElement('button');
_addEvent(eButton, 'click', function(e){
_insert('', ' ;) ');
return _preventDefaultEvent(e);
});
eButton.innerHTML = '';
elem.appendChild(eButton);
eButton = document.createElement('button');
_addEvent(eButton, 'click', function(e){
_insert('', ' :( ');
return _preventDefaultEvent(e);
});
eButton.innerHTML = '';
elem.appendChild(eButton);
}
}
var _createEditor = function(eTextarea, extendedMode){
eParentNode = eTextarea.parentNode;
eDiv = document.createElement('div');
eDiv.style.position = 'relative';
_insertButtons(eDiv, extendedMode, eTextarea);
eParentNode.insertBefore(eDiv, eTextarea);
eDiv = document.createElement('div');
eDiv.appendChild(document.createTextNode('Berichte und Koordinaten werden automatisch formatiert.'));
eParentNode.appendChild(eDiv);
//Nachformatieren
eForm = eTextarea.form;
_addEvent(eForm, 'submit', function(e){
var content = eTextarea.value;
//Reports nachformatieren
content = content.replace(/Qfv([^ \[]*)/g, function(text){
return '[report]' + text + '[/report]';
});
content = content.replace(/(\[report\])+/g, '[report]');
content = content.replace(/(\[\/report\])+/g, '[/report]');
//Koordinaten nachformatieren
content = content.replace(/\((-?\d+)\|(-?\d+)\)/g, '$1|$2');
content = content.replace(/\[(-?\d+)\|(-?\d+)\]/g, '$1|$2');
eTextarea.value = content.replace(/(-?\d+)\|(-?\d+)/g, '[$1|$2]');
});
}
var eTextarea, eParentNode, eDiv, eForm;
if ((_getQueryParam('action') == 'mail')
&& (_getQueryParam('mode') == 'new'))
{ //Buttons für IGMs
_createEditor(_getTextarea(), false);
} else if ((_getQueryParam('action') == 'changetext')
&& ((_getQueryParam('command') == 'player')
|| (_getQueryParam('command') == 'ally')))
{ //Buttons zum Ändern der Spielerbeschreibung
_createEditor(_getTextarea(), false);
} else if ((_getQueryParam('action') == 'forum')
&& ((_getQueryParam('forumaction') == 'neuerthread')
|| (_getQueryParam('forumaction') == 'neuerpoll')
|| (_getQueryParam('forumaction') == 'showthread')
|| (_getQueryParam('forumaction') == 'editreply')))
{ //Foren-Buttons
_createEditor(_getTextarea(), true);
}
})();