azett 85436639f2 added plugin ProtectedMailLinks;
icons (and some new bbcode elements!) for editor toolbar
2019-01-06 13:43:28 +01:00

146 lines
4.5 KiB
JavaScript
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

function insertAtCursor(element, start, end) {
element = document.getElementById(element);
if (document.selection) {
// IE
element.focus();
caretPos = document.selection.createRange().duplicate();
caretPos.text = start + caretPos.text + end;
if (caretPos.text.length == 0) {
caretPos.moveStart("character", -end.length);
caretPos.moveEnd("character", -end.length);
caretPos.select();
}
element.focus(caretPos);
} else if (element.selectionStart || element.selectionStart == '0') {
// MOZILLA
element.focus();
var startPos = element.selectionStart;
var endPos = element.selectionEnd;
var preTxt = element.value.substring(0, startPos);
var selTxt = element.value.substring(startPos, endPos) ;
var follTxt = element.value.substring(endPos, element.value.length);
var scrollPos = element.scrollTop;
element.value = preTxt + start + selTxt + end + follTxt;
if (element.setSelectionRange) {
if (selTxt.length == 0) {
element.setSelectionRange(startPos + start.length, startPos + start.length);
} else {
element.setSelectionRange(startPos, startPos + start.length + selTxt.length + end.length);
}
element.focus();
}
element.scrollTop = scrollPos;
} else {
element.value += start + end;
}
}
// calling the function
// insertAtCursor(document.formName.fieldName, this value);
function insBBCode(code) {
insertAtCursor('content', '[' + code + ']','[/' + code + ']');
}
function insBBCodeWithParams(code, params) {
insertAtCursor('content', '[' + code + '='+params+']','[/' + code + ']');
}
function insBBCodeWithParamsAndContent(code, params, content) {
insertAtCursor('content', '[' + code + '='+params+']'+content,'[/' + code + ']');
}
function insBBCodeWithContent(code, content) {
insertAtCursor('content', '[' + code +']'+content,'[/' + code + ']');
}
function insBBCodeWithoutClosingTag(code) {
insertAtCursor('content', '[' + code +']','');
}
function insBBCodeWithParamsWithoutClosingTag(code, params) {
insertAtCursor('content', '[' + code + '='+params+']','');
}
function insImage(val) {
if (val != '--') {
insertAtCursor('content', '[img=images/'+val+']',' ');
}
}
function insAttach(val) {
if (val !='--') {
insertAtCursor('content', '[url=attachs/'+val+']','[/url]');
}
}
// if false, tab move to next element
var bbcode_editmode = true;
function tabKeyOverrider() {
// Observe keypress on these fields
if (Event.observe) {
Event.observe($('content'), 'keypress', checkTab);
}
}
var bbcode_mode_trapTab = false;
// took from
// http://www.ajaxian.com/archives/handling-tabs-in-textareas
// with the 'mode' thingie... I think I'll add more 'trapping' stuff like this for Ctrl+B (bold) etc.
// At this time we're just using the altkey function (which is not that bad anyway)
function checkTab(evt) {
if (evt.keyCode == Event.KEY_ESC) {
if (bbcode_mode_trapTab) {
var bar = $('bbcode_statusbar');
bar.style.background = 'green';
bar.innerHTML = 'Normal mode. Press <Esc> to switch editing mode.';
bbcode_mode_trapTab = false;
} else {
var bar = $('bbcode_statusbar');
bar.style.background = 'blue';
bar.innerHTML = 'Editing mode. <Tab> is now allowed in the textarea. <Esc> to switch.';
bbcode_mode_trapTab = true;
}
}
if (!bbcode_mode_trapTab) {
return;
}
// Set desired tab- defaults to four space softtab
var tab = "\t";
var t = evt.target;
var ss = t.selectionStart;
var se = t.selectionEnd;
// Tab key - insert tab expansion
if (evt.keyCode == 9) {
evt.preventDefault();
// Special case of multi line selection
if (ss != se && t.value.slice(ss,se).indexOf("\n") != -1) {
// In case selection was not of entire lines (e.g. selection begins in the middle of a line)
// we ought to tab at the beginning as well as at the start of every following line.
var pre = t.value.slice(0, ss);
var sel = t.value.slice(ss, se).replace(/\n/g, "\n"+tab);
var post = t.value.slice(se, t.value.length);
t.value = pre.concat(tab).concat(sel).concat(post);
t.selectionStart = ss + tab.length;
t.selectionEnd = se + tab.length;
}
// "Normal" case (no selection or selection on one line only)
else {
t.value = t.value.slice(0, ss).concat(tab).concat(t.value.slice(ss, t.value.length));
if (ss == se) {
t.selectionStart = t.selectionEnd = ss + tab.length;
}
else {
t.selectionStart = ss + tab.length;
t.selectionEnd = se + tab.length;
}
}
}
}
if (typeof(Event.observe) == 'function') {
//prototype is loaded
Event.observe(window, 'load', tabKeyOverrider, false)
}