MediaWiki:Edittools.js/dev
//
/*
EditTools support: add a selector, change into true buttons, enable for all text input fields
The special characters to insert are defined at [[MediaWiki:Edittools]].
*/
importStylesheet('MediaWiki:Edittools.css');
var EditTools = {
createSelector: function () {
$spec = $j('#specialchars');
$sb = $j('#specialchars p.specialbasic');
// Only care if there is more than one
if (!$spec.length || $sb.length <= 1) return;
$sel = $j(document.createElement('select'));
$sel.change(function () {
EditTools.chooseCharSubset();
});
$sb.each(function (i) {
id = $j(this).attr('id').replace(/.([0-9A-F][0-9A-F])/g, '%$1').replace(/_/g, ' ');
$sel.append('<option value='+ i +'>' + decodeURIComponent (id) + '</option>');
});
$spec.prepend($sel);
this.chooseCharSubset();
},
chooseCharSubset: function () {
$sb = $j('#specialchars p.specialbasic');
id = $j('#specialchars select').val();
$wanted = $sb.eq(id);
this.makeButtons($wanted);
$sb.hide();
$wanted.css('display', 'inline');
},
makeButtons: function ($wanted) {
$links = $wanted.find('a');
$links.each(function () {
$button = $j('<button type="button">');
$button.text($j(this).text());
$button.click($j(this).attr('onclick'));
$j(this).replaceWith($button);
$j(this).blur();
});
$wanted.contents().not($j('button')).remove();
},
makeToolbarButtons: function () {
// Add Edittool section
$j('#wpTextbox1').wikiEditor('addToToolbar', {
'sections': {
'Edittools': {
'type': 'booklet',
'label': 'Edittools',
'pages': {
'Edittools1': {
'layout': 'characters',
'label': 'Edittools2'
}
}
}
}
});
$section = $j('.page-Edittools1 div');
$links = $j('#specialchars p.specialbasic').first().find('a');
$links.each(function () {
$button = $j('<span>');
$button.text($j(this).text());
$button.click($j(this).attr('onclick'));
$section.append($button);
});
$j('.mw-editTools').remove();
},
last_active_textfield: null,
enableForAllFields: function () {
$j('textarea, input').focus(function () {
EditTools.last_active_textfield = this.id;
});
insertTags = EditTools.insertTags;
},
getTextArea: function () {
var txtarea = null;
if (EditTools.last_active_textfield !== null) txtarea = $j('#' + EditTools.last_active_textfield).get(0);
if (!txtarea) {
txtarea = $j('textarea').first().get(0);
}
return txtarea;
},
registerTextField : function (evt)
{
var e = evt || window.event;
var node = e.target || e.srcElement;
if (!node) return;
EditTools.last_active_textfield = node.id;
return true;
},
insertTags: function (tagOpen, tagClose, sampleText) {
var txtarea = EditTools.getTextArea();
if (!txtarea) return;
/* WikiEditor compatibility */
if (typeof $j.fn.textSelection != 'undefined') {
$j(txtarea).textSelection('encapsulateSelection', {
'pre': tagOpen,
'peri': sampleText,
'post': tagClose
});
return;
}
var selText, isSample = false;
function checkSelectedText() {
if (!selText) {
selText = sampleText;
isSample = true;
} else if (selText.charAt(selText.length - 1) == ' ') { // Exclude ending space char
selText = selText.substring(0, selText.length - 1);
tagClose += ' '
}
}
if (document.selection && document.selection.createRange) { // IE/Opera
// Save window scroll position
var winScroll = 0;
if (document.documentElement && document.documentElement.scrollTop) winScroll = document.documentElement.scrollTop;
else if (document.body) winScroll = document.body.scrollTop;
// Get current selection
txtarea.focus();
var range = document.selection.createRange();
selText = range.text;
// Insert tags
checkSelectedText();
range.text = tagOpen + selText + tagClose;
// Mark sample text as selected
if (isSample && range.moveStart) {
if (window.opera) tagClose = tagClose.replace(/\n/g, "");
range.moveStart('character', -tagClose.length - selText.length);
range.moveEnd('character', -tagClose.length);
}
range.select();
// Restore window scroll position
if (document.documentElement && document.documentElement.scrollTop) document.documentElement.scrollTop = winScroll;
else if (document.body) document.body.scrollTop = winScroll;
} else if (txtarea.selectionStart || txtarea.selectionStart == '0') { // Mozilla
// Save textarea scroll position
var textScroll = txtarea.scrollTop;
// Get current selection
txtarea.focus();
var startPos = txtarea.selectionStart;
var endPos = txtarea.selectionEnd;
selText = txtarea.value.substring(startPos, endPos);
// Insert tags
checkSelectedText();
txtarea.value = txtarea.value.substring(0, startPos) + tagOpen + selText + tagClose + txtarea.value.substring(endPos);
// Set new selection
if (isSample) {
txtarea.selectionStart = startPos + tagOpen.length;
txtarea.selectionEnd = startPos + tagOpen.length + selText.length;
} else {
txtarea.selectionStart = startPos + tagOpen.length + selText.length + tagClose.length;
txtarea.selectionEnd = txtarea.selectionStart;
}
// Restore textarea scroll position
txtarea.scrollTop = textScroll;
}
},
setup: function () {
var i18n_edittools = {
'en': 'Use old edittools' // default
};
if (wgUserName !== null) JSconfig.registerKey('oldEdittools', true, i18n_edittools[wgUserLanguage] || i18n_edittools['en'], 3);
else JSconfig.registerKey('oldEdittools', false, i18n_edittools[wgUserLanguage] || i18n_edittools['en'], 3);
//Decide whether to use the toolbar or the bottom div
if ($j('#toolbar').length || JSconfig.keys['oldEdittools'] || $j('#wpUploadDescription').length) {
EditTools.createSelector();
EditTools.enableForAllFields();
} else {
EditTools.makeToolbarButtons();
EditTools.enableForAllFields();
}
}
};
$j(document).ready(function () {
EditTools.setup();
});
//