MediaWiki:Common.js/edit.js
Jump to navigation
Jump to search
This script seems to have a documentation page at MediaWiki:Common.js/edit. |
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Microsoft Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Go to Menu → Settings (Opera → Preferences on a Mac) and then to Privacy & security → Clear browsing data → Cached images and files.
/* Version: 3.1 * ============================================================ * en: ADD SOME EXTRA BUTTONS TO THE EDITPANEL * de: FÜGE NEUE BUTTON IN DIE WERKZEUGLEISTE * pt: ACRESCENTA ALGUNS BOTÕES EXTRAS AO PAINEL DE EDIÇÃO * ============================================================ * Vorschläge für neue Buttons werden gerne entgegengenommen * Die Reihenfolge und Anzahl der Buttons ist über die (alphabetische) Variable XEBOrder wählbar. * * ================================ * Control Variables * * window.rmEditButtons - Removes standard toolbar buttons * window.XEBOrder - The order in which the buttons are displayed * window.myButtons - Add user defined buttons */ mw.loader.load( 'http://wiki.oni2.net/MediaWiki:Live.css&action=raw&ctype=text/css', 'text/css' ); if (typeof XEBPopups === 'undefined') { XEBPopups = true; } if (typeof XEBHideDelay === 'undefined') { // Time before the popup disappears after the mouse moves out window.XEBHideDelay = 1.0; } if (typeof XEBExtendEditSummary === 'undefined') { // Is the edit summary extended after a popup window.XEBExtendEditSummary = true; } if (typeof usersignature === 'undefined') { var usersignature = '-- ~~' + '~~'; } var Isrc = '//wiki.oni2.net/w/images/'; var BDict = { 'A':['e/e9/Button_headline2.png','Third-level headline','\n===','===','Secondary headline'], 'B':['1/13/Button_enter.png','Line break','<br />','',''], 'C':['f/f7/Button_align_center.png','Center-aligned text','<div style="text-align: center;">\n','\n<\/div>','Centered text'], 'D':['e/ea/Button_align_left.png','Left-aligned text','<div style="text-align: left; direction: ltr; margin-left: 1em;">\n','\n<\/div>','Left-aligned text'], 'D1':['a/a5/Button_align_right.png','Right-aligned text','<div style="text-align: right; direction: ltr; margin-left: 1em;">\n','\n<\/div>','Right-aligned text'], 'E':['7/79/Button_cmpl_table.png','Simple table','\n{| class="wikitable" \n|- \n| 1 || 2\n|- \n| 3 || 4','\n|}\n',''], 'E1':['8/80/Button_smart_table.png', 'Smart table wizard', '','',''], 'F':['1/1e/Button_font_color.png','Colored text','<span style="color: ','">Colored text<\/span>','ColorName'], 'FS':['6/6d/Button_unsigned.png','Unsigned post','{{subst:unsigned|','|date}}','user name or IP'], 'G':['1/12/Button_gallery.png','Image gallery',"\n<gallery>\nImage:","|[[M63]]\nImage:Mona Lisa.jpg|[[Mona Lisa]]\nImage:Truite arc-en-ciel.jpg|Eine [[Forelle ]]\n<\/gallery>",'M63.jpg'], 'H':['7/74/Button_comment.png','Comment',"<!--","-->",'Comment'], 'I1':['d/d6/Button_superscript.png','Superscript','<sup>','<\/sup>','Superscript text'], 'I2':['b/bf/Button_subscript.png','Subscript','<sub>','<\/sub>','Subscript text'], 'J1':['d/d5/Button_small_text.png','Small text','<small>','<\/small>','Small Text'], 'J2':['9/99/Button_big_text.png','Big text','<big>','<\/big>','Big text'], 'K':['1/11/Button_category.png','Category',"[[Category:","]]",'Category name'], 'L':['e/e2/Button_tab_in.png','Insert tab',':','',':'], 'M':['f/fd/Button_blockquote.png','Quoted text block','<blockquote style="border: 1px solid blue; padding: 2em;">\n','\n<\/blockquote>','Block quote'], 'N':['4/4b/Button_nbsp.png','Insert non-breaking space',' ','',''], 'O':['2/23/Button_code.png','Code block','<code>','<\/code>','Code'], 'P':['3/3c/Button_pre.png','Pre-formatted text block','<pre>','<\/pre>','Pre-formatted text'], 'P1':['2/2e/Button_subpage.png','Link to sub-page','[[','/Sub_Page]]','Page'], 'Q':['1/1f/Button_list_tab.png','Definition (tabbed) list','\n; ','\n: Item 1\n: Item 2','Definition'], 'R':['e/ef/Button_reflink_start.png','Insert a reference','<ref>','<\/ref>','Insert reference material'], 'R1':['5/5f/Button_reflink_smart.png','Reference Wizard','<ref name="','','Reference name'], 'R2':['c/cb/Button_reflink_footer.png','Insert reference footer',"<references/>",'',''], 'R3': ['1/1a/Button_reflink_advanced_3.png', 'No reference material', '', '"/>', ''], 'R4': ['9/9a/Button_references.png', 'Reference footer', "\n==Notes==\n<!--See http://en.wikipedia.org/wiki/Wikipedia:Footnotes for an explanation of how to generate footnotes using the <ref(erences/)> tags-->\n<div class=\'references-small\'>\n<references/>\n</div>", '', ''], 'S':['c/c9/Button_strike.png','Strikeout text','<s>','<\/s>','Struck-out text'], 'T':['5/59/Button_template.png','Template','{{','}}','Template name'], 'TS':['a/a1/Button_table_start.png','Start a table','{|','',''], 'TC':['5/59/Button_table_cell.png','Table cell','|','',''], 'TE':['f/f0/Button_table_end.png','End a table','','|}',''], 'TR':['7/70/Button_table_row.png','Start a table row','|-','',''], 'T1':['8/82/Button_teletype.png','Teletype text','<tt>','<\/tt>','Teletype Text'], 'TL':['d/d3/Button_subst_tmpl.png','Template (substituted)',"{{subst:"+"tl|",'}}','Template name'], 'U':['f/fd/Button_underline.png','Underlined text',"<u>","<\/u>",'Underlined text'], 'V':['c/c8/Button_redirect.png','Redirect',"#REDIRECT [[","]]",'Article Name'], 'W':['5/50/Button_list_num.png','Numbered list',"\n# ","\n# Element 2\n# Element 3",'Element 1'], 'X':['f/fa/Button_list_bull.png','Bulleted list',"\n* ","\n* Element B\n* Element C",'Element A'], 'Y1':['d/d5/Button_noinclude.png','No include',"<noinclude>","<\/noinclude>",'Text'], 'Y2':['6/63/Button_includeonly.png','Include only',"<includeonly>","<\/includeonly>",'Text'], 'Z':['3/35/Button_substitute.png','Substituted page link',"{{subst:","}}",'Template'], 'AI':['c/cc/Button_adv_image.png','Advanced image',"[[Image:","|thumb|right|px|Caption]]",'FileName.jpg'], 'GEO': ['b/b8/Button_Globe.png', 'Geo location', "", "", ""], 'TALK': ['4/49/Button_talk.png', 'Add talk template', "", "", ""], 'BF': ['e/ec/Button_base.png', 'Insert BSL function', "", "", ""] }; var XEBOrder2 = []; initButtons(); if (!mw.config.get( 'wgIsArticle' )) { // only if edit if (XEBPopups) { $(extendButtons); } } function initButtons() { var bc, d, i, customTools = {}; if (typeof XEBOrder !== 'string') { // can be modified XEBOrder2 = '0,1,U,F,D,C,D1,4,A,2,3,E,G,8,H,9'.split(','); } else if (XEBOrder.toLowerCase() === 'all') { $.each(BDict, function( b, value ){ XEBOrder2.push(b); }); } else { XEBOrder2 = XEBOrder.toUpperCase().split(','); } $.each(BDict, function( b, value ){ // Add the start of the URL (Isrc) to the XEB buttons BDict[b][0] = Isrc + BDict[b][0]; }); // If the user has defined any buttons then add them into the available button lists if (typeof myButtons === 'object') { $.each(myButtons, function( b, value ){ // custom user buttons BDict[b] = myButtons[b]; }); } mw.loader.using( 'user.options', function () { if ( mw.user.options.get('usebetatoolbar') ) { // Use the enhanced edit toolbar mw.loader.using( 'ext.wikiEditor.toolbar', function () { $(function(){ // Build the new buttons for (i = 0; i < XEBOrder2.length; i++) { bc = BDict[XEBOrder2[i]]; //Check if bc is an object // - protects if user specified a non-existant buttons // - IE causes a javascript error when viewing a page if (typeof bc === 'object') { customTools[ XEBOrder2[i] ] = { label: bc[1], type: 'button', icon: bc[0], action: { type: 'encapsulate', options: { pre: bc[2], peri: bc[4], post: bc[3] } } }; } } $('#wpTextbox1').wikiEditor( 'addToToolbar', { 'sections': { 'extra': { 'type': 'toolbar', 'label': 'Extras' } }, 'section': 'extra', 'groups': { 'my-buttons': { 'label': 'My buttons', 'tools': customTools } } } ); }); } ); } else { // Use the old edit toolbar // Add the MediaWiki standard buttons into the available buttons $.each(mw.toolbar.buttons, function( b, value ){ // add standard buttons for full XEB order changing // BDict[b]=[]; BDict[b] = [ value.imageFile, value.speedTip, value.tagOpen, value.tagClose, value.sampleText]; // for (d in value) {BDict[b].push(value}[d]); }); // Build the new buttons for (i = 0; i < XEBOrder2.length; i++) { bc = BDict[XEBOrder2[i]]; //Check if bc is an object // - protects if user specified a non-existant buttons // - IE causes a javascript error when viewing a page if (typeof bc === 'object') { //Call addButton from module mediawiki.action.edit mw.toolbar.addButton(bc[0], bc[1], bc[2], bc[3], bc[4] /* , imageId, selectText */ ); } } // Remove the default buttons (if requested by the user) eraseButtons(); } } ); } /** en: Removes arbitrary standard buttons from the toolbar * @author: [[:de:User:Olliminatore]] * @version: 0.1 (01.10.2006) **/ function eraseButtons() { var x, i, enExtraButtons; //Remove the buttons the user doesn't want if (typeof rmEditButtons !== 'object') { return; } if (typeof rmEditButtons[0] === 'string' && rmEditButtons[0].toLowerCase() === 'all') { // English Wikipedia creates 11 extra buttons which are stored in mwCustomEditButtons // rather than mw.toolbar.buttons. However, there is no guarantee it will always be 11 // so we count them here. enExtraButtons = window.mwCustomEditButtons.length; mw.toolbar.buttons = []; for (i = 0; i < enExtraButtons; i++) { window.mwCustomEditButtons.shift(); } } //Sort the user's requests so we remove the button with the highest index first //- This ensures we remove the buttons the user expects whatever order he requested the buttons in window.rmEditButtons.sort(sortit); //Remove individual buttons the user doesn't want for (i = 0; i < rmEditButtons.length; i++) { var n = rmEditButtons[i]; //Standard Wikimedia buttons if (n >= 0 && n < mw.toolbar.buttons.length) { if (n < mw.toolbar.buttons.length) { x = -1; while ((++x) < mw.toolbar.buttons.length) { if (x >= n) { mw.toolbar.buttons[x] = mw.toolbar.buttons[x + 1]; } } } mw.toolbar.buttons.pop(); } //Extra buttons in English Wikipedia n = n - mw.toolbar.buttons.length; if (n > 0 && n < window.mwCustomEditButtons.length) { if (n < window.mwCustomEditButtons.length) { x = -1; while ((++x) < window.mwCustomEditButtons.length) { if (x >= n) { window.mwCustomEditButtons[x] = window.mwCustomEditButtons[x + 1]; } } } window.mwCustomEditButtons.pop(); } } } //Function: // sortit //Purpose: // Used to sort the rmEditButtons array into descending order function sortit(a, b) { return (b - a); } //Function: //Purpose: // Adds extended onclick-function to some buttons function extendButtons() { var allEditButtons = document.getElementById('toolbar'); if ( !allEditButtons ) { return false; } if (typeof editform !== 'undefined') { if (!(window.editform = document.forms.editform)) { return false; } } // table extendAButton(Isrc + '8/80/Button_smart_table.png',XEBPopupTable) extendAButton(Isrc + 'e/ef/Button_reflink_start.png',XEBPopupRef) extendAButton(Isrc + 'b/b8/Button_Globe.png', XEBPopupGeoLink); extendAButton(Isrc + '4/49/Button_talk.png', XEBPopupTalk); extendAButton(Isrc + 'c/cc/Button_adv_image.png',XEBPopupImage); extendAButton(Isrc + 'e/ec/Button_base.png',XEBPopupBSLfunc); //extendAButton(Isrc+'d/d6/Button_superscript.png',XEBPopupFormattedText); // redirect -##IE doesn't like this line. Object doesn't support this property or method //c=XEBOrder2.getIndex('V'); // if(c != -1) // allEditButtons[bu_len+c].onclick=function(){ // var a='#REDIRECT \[\['+prompt("Which page do you want to redirect to\?")+'\]\]'; // document.editform.elements['wpTextbox1'].value=a; // document.editform.elements['wpSummary'].value=a; // document.editform.elements['wpWatchthis'].checked=false // }; } function extendAButton(url, newfunc) { var i; var allEditButtons = document.getElementById('toolbar'); if ( !allEditButtons ) { return false; } if (typeof editform !== 'undefined') { if (!(window.editform = document.forms.editform)) { return false; } } allEditButtons = allEditButtons.getElementsByTagName('img'); for (i = 0; i < allEditButtons.length; i++) { if (allEditButtons[i].src.indexOf(url) != -1) { //if (allEditButtons[i].src === url) { // Cannot work because "url" does not start with "http://"; using indexOf() instead. -Iritscen allEditButtons[i].onclick = newfunc; } } } //========================================================================================================== // General purpose popup code //========================================================================================================== function getXEBPopupDiv(name) { var XEBMainDiv = document.getElementById('XEB'); if (XEBMainDiv === null) { XEBMainDiv = document.createElement('div'); document.body.appendChild(XEBMainDiv); XEBMainDiv.id = 'XEB'; } var me = document.getElementById('XEBPopup' && name); if (me !== null) { return me; } me = document.createElement('div'); XEBMainDiv.appendChild(me); me.id = 'XEBPopup'; me.style.position = 'absolute'; me.display = 'none'; me.visibility = 'hidden'; me.onmouseout = CheckHideXEBPopup; me.onmouseover = cancelHidePopup; return me; } //Function: // CheckHideXEBPopup //Purpose: // Looks at the cursor position and if it has moved outside the popup it will close the popup //Called: // When the onMouseEvent is fired on the popup function CheckHideXEBPopup(e) { var x, y, ph, s, pl, pt, pw; var m = document.getElementById('XEBmnu'); if (is_gecko) { ph = m.offsetHeight; x = e.clientX + window.scrollX; y = e.clientY + window.scrollY; s = window.getComputedStyle(m, ''); ph = s.height; ph = Number(ph.substring(0, ph.length - 2)); } else { x = event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft; y = event.clientY + document.documentElement.scrollTop + document.body.scrollTop; ph = m.offsetHeight; } pl = curPopup.x; pt = curPopup.y; pw = m.style.width; pw = Number(pw.substring(0, pw.length - 2)); if (x > (pl + 2) && x < (pl + pw - 5) && y > (pt + 2) && y < (pt + ph - 5)) { return; } curPopup.hideTimeout = setTimeout(hideXEBPopup, XEBHideDelay * 1000); } function cancelHidePopup() { clearTimeout(curPopup.hideTimeout); } function hideXEBPopup() { var XEBMainDiv = document.getElementById('XEB'); var m = document.getElementById('XEBPopup'); XEBMainDiv.removeChild(m); } function XEBstartDrag(e) { var m = new GetPos(e || event); curPopup.startDrag.mouse = m; curPopup.startDrag.floatpopup.y = parseInt(curPopup.div.style.top, 10); curPopup.startDrag.floatpopup.x = parseInt(curPopup.div.style.left, 10); curPopup.dragging = true; } function XEBstopDrag(e) { if (curPopup.dragging === false) { return; } curPopup.dragging = false; } function XEBDrag(e) { if (curPopup.dragging === false) { return; } var m = new GetPos(e || event); var x = parseInt(curPopup.startDrag.floatpopup.x + (m.x - curPopup.startDrag.mouse.x), 10); var y = parseInt(curPopup.startDrag.floatpopup.y + (m.y - curPopup.startDrag.mouse.y), 10); curPopup.div.style.top = y + 'px'; curPopup.div.style.left = x + 'px'; curPopup.x = x; curPopup.y = y; } //============================================================================= // Popup: Table //============================================================================= function XEBPopup(name, x, y) { // Make sure the popup can appear on the screen this.IESelectedRange = XEBgetIESelectedRange(); var winW = (is_gecko) ? window.innerWidth : document.body.offsetWidth; if ((winW - this.width) < x) { x = (winW - this.width); } this.div = getXEBPopupDiv(name); this.div.style.zIndex = 2000; this.div.display = 'inline'; this.div.visibility = 'visible'; this.div.style.top = y + 'px'; this.x = x; this.y = y; this.name = name; this.startDrag = {}; this.startDrag.floatpopup = {}; } function setInnerHTML(text) { var i; var winW = (is_gecko) ? window.innerWidth : document.body.offsetWidth; if ((winW - this.width) < this.x) { this.x = (winW - this.width); } this.div.style.left = this.x + 'px'; var mt = '<div id="XEBmnu" style="width:' + this.width + 'px" >'; mt += '<div id="XEBmnuTitle" class="XEBPopupTitle" onmousedown="XEBstartDrag(event)" onmouseup="XEBstopDrag(event)" onmousemove="XEBDrag(event)">Title</div>'; mt += text; mt += '</div>'; this.div.innerHTML = mt; //Turn off autocomplete. If the mouse moves over the autocomplete popup then x,y in CheckHidePopup is relative to the // autocomplete popup and our popup is hidden var InTexts = this.div.getElementsByTagName('input'); for (i = 0; i < InTexts.length; i++) { var theInput = InTexts[i]; if (theInput.type === 'text') { theInput.setAttribute('autocomplete', 'off'); } } //Add rollover features to menu items. Doing it here means we don't have to do it for each menu var x = XEBgetElementsByClassName(this.div, 'XEBMnuItm', 'span'); for (i = 0; i < x.length; i++) { var theItm = x[i]; theItm.onmouseout = XEBMenuMouseOut; theItm.onmouseover = XEBMenuMouseOver; } this.div.style.borderWidth = 'thin'; this.div.style.borderStyle = 'solid'; this.div.style.backgroundColor = '#D0D0D0'; } XEBPopup.prototype.width = 250; XEBPopup.prototype.dragging = false; XEBPopup.prototype.setInnerHTML = setInnerHTML; var curPopup; function GetPos(e) { this.x = e.clientX - 10 + document.documentElement.scrollLeft + document.body.scrollLeft; this.y = e.clientY - 10 + document.documentElement.scrollTop + document.body.scrollTop; } function XEBPopupTable(e) { var m = new GetPos(e || event); curPopup = new XEBPopup('table', m.x, m.y); var mt = '<p>Enter the table parameters below: <\/p>' + '<form name="XEBPopupTableForm">' + 'Table caption: <input type="checkbox" name="inputCaption"><p\/>' + 'Table alignment: center<input type="checkbox" name="inputAlign"><p\/>' + 'Table headline: colored<input type="checkbox" name="inputHead"><p\/>' + 'Number of rows: <input type="text" name="inputRow" value="3" size="2"><p\/>' + 'Number of columns: <input type="text" name="inputCol" value="3" size="2"><p\/>' + // 'Alternating grey lines: <input type="checkbox" name="inputLine" checked="1" ><p\/>' + 'Item column: <input type="checkbox" name="inputItems" ><p\/>' + 'Sortable: <input type="checkbox" name="inputSort" ><p\/>' + '<\/form>' + '<i>The default table allows for fields and values only.<\/i><p\/>' + 'Check "Item column" to allow for the table to have fields, items, and values.<\/i><p\/>' + '<p><button onClick="javascript:insertTableCode()">Insert</button>' + '<button onClick="hideXEBPopup()">Cancel</button>'; curPopup.setInnerHTML(mt); return true; } function insertTableCode() { var i; var f = document.XEBPopupTableForm; var caption = (f.inputCaption.checked) ? '|+ TABLE CAPTION \n' : ''; var exhead = (f.inputHead.checked) ? '|- style="background: #DDFFDD;"\n' : ''; var nbRow = parseInt(f.inputRow.value, 10); var nbCol = parseInt(f.inputCol.value, 10); var exfield = f.inputItems.checked; var align = (f.inputAlign.checked) ? 'align="center"' : ''; //generateTable(caption, exhead, nbCol, nbRow, exfield, align); var code = '\n'; code += '{| ' + align + ' '; code += (f.inputSort.checked) ? 'class="wikitable sortable" \n' : '\n'; code += caption + exhead; if (exfield) { code += '!\n'; } for (i = 1; i < nbCol + 1; i++) { code += '! COLUMN ' + i + '\n'; } var items = 0; for (var j = 0; j < nbRow; j++) { if (exfield) { items++; code += '|-\n! style="background: #FFDDDD;"|ITEM ' + items + '\n'; } else { code += '|-\n'; } for (i = 0; i < nbCol; i++) { code += '| Element ' + i + '\n'; } } code += '|}\n'; hideXEBPopup(); insertTags('', '', code); extendSummary('table'); return false; } function XEBPopupBSLfunc(e) { var m = new GetPos(e || event); curPopup = new XEBPopup('bslfunc', m.x, m.y + 22); var mt = '<p>Enter the BSL function information: <\/p>' + '<form name="XEBPopupBSLfuncForm">' + '<div id="bsl_return_type">Function type: <select name="inputType"><option value="void">void</option><option value="bool">bool</option><option value="int">int</option><option value="float">float</option><option value="string">string</option></select></div><p\/>' + '<div id="bsl_return_default">Default return value: <input type="text" name="inputDefaultReturn" value="" size="10"><p\/>' + 'Function name: <input type="text" name="inputName" value="" size="20"></div><p\/>' + 'Number of columns: <input type="text" name="inputCol" value="3" size="2"><p\/>' + // 'Alternating grey lines: <input type="checkbox" name="inputLine" checked="1" ><p\/>' + 'Item column: <input type="checkbox" name="inputItems" ><p\/>' + 'Sortable: <input type="checkbox" name="inputSort" ><p\/>' + '<\/form>' + '<i>The default table allows for fields and values only.<\/i><p\/>' + 'Check "Item column" to allow for the table to have fields, items, and values.<\/i><p\/>' + '<p><button onClick="javascript:insertBSLfuncCode()">Insert</button>' + '<button onClick="hideXEBPopup()">Cancel</button>'; curPopup.setInnerHTML(mt); return true; } function insertBSLfuncCode() { var i; var f = document.XEBPopupTableForm; var caption = (f.inputCaption.checked) ? '|+ TABLE CAPTION \n' : ''; var exhead = (f.inputHead.checked) ? '|- style="background: #DDFFDD;"\n' : ''; var nbRow = parseInt(f.inputRow.value, 10); var nbCol = parseInt(f.inputCol.value, 10); var exfield = f.inputItems.checked; var align = (f.inputAlign.checked) ? 'align="center"' : ''; //generateTable(caption, exhead, nbCol, nbRow, exfield, align); var code = '\n'; code += '{| ' + align + ' '; code += (f.inputSort.checked) ? 'class="wikitable sortable" \n' : '\n'; code += caption + exhead; if (exfield) { code += '!\n'; } for (i = 1; i < nbCol + 1; i++) { code += '! COLUMN ' + i + '\n'; } var items = 0; for (var j = 0; j < nbRow; j++) { if (exfield) { items++; code += '|-\n! style="background: #FFDDDD;"|ITEM ' + items + '\n'; } else { code += '|-\n'; } for (i = 0; i < nbCol; i++) { code += '| Element ' + i + '\n'; } } code += '|}\n'; hideXEBPopup(); insertTags('', '', code); extendSummary('table'); return false; } // Get the text currently selected by user in the textAra // This code is based on part of the insertTags function in wikibits.js function XEBGetSelectedText() { var txtarea, theSelection; if (document.editform) { txtarea = document.editform.wpTextbox1; } else { // some alternate form? take the first one we can find var areas = document.getElementsByTagName('textarea'); txtarea = areas[0]; } // IE & Opera if (document.selection && !is_gecko) { theSelection = document.selection.createRange().text; if (!theSelection) { theSelection = ''; } } // Mozilla else if (txtarea.selectionStart || txtarea.selectionStart === 0) { var replaced = false; var startPos = txtarea.selectionStart; var endPos = txtarea.selectionEnd; theSelection = (txtarea.value).substring(startPos, endPos); if (!theSelection) { theSelection = ''; } } return theSelection; } //Notes: // IE loses the cursor position in the textarea when the popup is used. // So we save the cursor position here function XEBgetIESelectedRange() { var IESel = {}; var txtarea; if (document.editform) { txtarea = document.editform.wpTextbox1; } else { // some alternate form? take the first one we can find var areas = document.getElementsByTagName('textarea'); txtarea = areas[0]; } // IE & Opera if (document.selection && !is_gecko) { txtarea.focus(); IESel.Rng = document.selection.createRange(); return IESel; } } function XEBinsertText(beforeText, selText, afterText, IESelectedRange) { var newText = beforeText + selText + afterText; var txtarea, tr; if (document.editform) { txtarea = document.editform.wpTextbox1; } else { // some alternate form? take the first one we can find var areas = document.getElementsByTagName('textarea'); txtarea = areas[0]; } // IE if (document.selection && !is_gecko) { tr = IESelectedRange.Rng; tr.text = newText; txtarea.focus(); //txtarea.caretpos=tr.duplicate(); tr.select(); return; // Mozilla } else if (txtarea.selectionStart || txtarea.selectionStart === 0) { var replaced = false; var startPos = txtarea.selectionStart; var endPos = txtarea.selectionEnd; if (endPos - startPos) { replaced = true; } var scrollTop = txtarea.scrollTop; // var myText = (txtarea.value).substring(startPos, endPos); // if (!myText) { // myText=sampleText; // } // if (myText.charAt(myText.length - 1) == " ") { // exclude ending space char, if any // subst = tagOpen + myText.substring(0, (myText.length - 1)) + tagClose + " "; // } else { // subst = tagOpen + myText + tagClose; // } txtarea.value = txtarea.value.substring(0, startPos) + newText + txtarea.value.substring(endPos, txtarea.value.length); txtarea.focus(); //set new selection if (!replaced) { var cPos = startPos + (newText.length); txtarea.selectionStart = cPos; txtarea.selectionEnd = cPos; } else { txtarea.selectionStart = startPos + beforeText.length; txtarea.selectionEnd = startPos + beforeText.length + selText.length; } txtarea.scrollTop = scrollTop; // All other browsers get no toolbar. // There was previously support for a crippled "help" // bar, but that caused more problems than it solved. } // reposition cursor if possible if (txtarea.createTextRange) { txtarea.caretPos = document.selection.createRange().duplicate(); //txtarea.caretPos =IESelectedRange.Rng; } txtarea.focus(); } //============================================================ // Table generator //============================================================ /** en: Generate an array using MediaWiki syntax * @author: originally from fr:user:dake * @version: 0.2 */ function generateTable(caption, exhead, nbCol, nbRow, exfield, align) { } function XEBPopupRef(e) { var m = new GetPos(e || event); curPopup = new XEBPopup('ref', m.x, m.y); curPopup.width = 300; var mt = '<p>Enter the reference parameters below: <\/p>' + '<form name="XEBPopupRefForm">' + 'Name:<input type="text" name="refName" value="" size="10"><p\/>' + 'Material:<input type="text" name="refMaterial" value="' + XEBGetSelectedText() + '" size="20">' + '<\/form>' + '<p><button onClick="javascript:insertRef()">Insert</button>' + '<button onClick="hideXEBPopup()">Cancel</button>'; curPopup.setInnerHTML(mt); // document.XEBPopupRefForm.refName.focus(); return true; } function insertRef() { var f = document.XEBPopupRefForm; var refName = f.refName.value; var refMaterial = f.refMaterial.value; hideXEBPopup(); var code1 = '<ref'; code1 += (refName) ? ' name="' + refName + '">' : '>'; var code2 = refMaterial; var code3 = '<\/ref>'; XEBinsertText(code1, code2, code3, curPopup.IESelectedRange); extendSummary('ref'); return false; } //===GEO LINK Function================================================== function XEBPopupGeoLink(e) { var m = new GetPos(e || event); curPopup = new XEBPopup('geo', m.x, m.y); curPopup.width = 300; var mt = '<p>Enter the location parameters below: <\/p>' + '<form name="XEBPopupGeoLinkForm">' + 'Location:<p\/>' + '<table style="background: transparent;">' + '<tr><td>Latitude:<\/td><td><input type="text" autocomplete="off" name="geoLatDeg" value="" size="4"><\/td>' + '<td><input type="text" name="geoLatMin" size="4"><\/td>' + '<td><input type="text" name="geoLatSec" size="4"><\/td>' + '<td><select name="geoLatNS"><option value="N">N<option value="S">S</select><\/td><\/tr>' + '<tr><td>Longitude:<\/td><td><input type="text" name="geoLonDeg" value="" size="4"><\/td>' + '<td><input type="text" name="geoLonMin" value="" size="4"><\/td>' + '<td><input type="text" name="geoLonSec" value="" size="4"><\/td>' + '<td><select name="geoLonEW"><option value="E">E<option value="W">W</select><\/td><\/tr>' + '<\/table>' + 'Region:<input type="text" name="geoRegion" value="" size="4"><p\/>' + 'Type:' + '<SELECT NAME="geoType" size="5">' + '<OPTION VALUE="country">Country<OPTION VALUE="state">State' + '<OPTION VALUE="adm1st">Admin unit, 1st level<OPTION VALUE="adm2st">Admin unit, 2nd level' + '<OPTION VALUE="city">City<OPTION VALUE="airport">Airport' + '<OPTION VALUE="mountain">Mountain<OPTION VALUE="isle">Isle' + '<OPTION VALUE="waterbody">Waterbody<OPTION VALUE="landmark" SELECTED>Landmark' + '<OPTION VALUE="forest">forest</SELECT><br>' + 'Title: <input type="checkbox" name="geoTitle" ><p\/>' + '<\/form>' + '<p><button onClick="javascript:insertGeoLink()">Insert</button>' + '<button onClick="hideXEBPopup()">Cancel</button>'; curPopup.setInnerHTML(mt); document.paramForm.refName.focus(); return true; } function insertGeoLink() { var f = document.XEBPopupGeoLinkForm; var code = '{{Coor '; if (f.geoTitle.checked) { code += 'title '; } var ft = 'dms'; if (f.geoLatSec.value === '' && f.geoLonSec.value === '') { ft = 'dm'; } if (ft === 'dm' && f.geoLatMin.value === '' && f.geoLonMin.value === '') { ft = 'd'; } code += ft; code += '|' + f.geoLatDeg.value; code += (ft === 'dm' || ft === 'dms') ? '|' + f.geoLatMin.value : ''; code += (ft === 'dms') ? '|' + f.geoLatSec.value : ''; code += '|' + f.geoLatNS.value; code += '|' + f.geoLonDeg.value; code += (ft === 'dm' || ft === 'dms') ? '|' + f.geoLonMin.value : ''; code += (ft === 'dms') ? '|' + f.geoLonSec.value : ''; code += '|' + f.geoLonEW.value; code += '|type:' + f.geoType.value + '_region:' + f.geoRegion.value; code += '}}'; insertTags('', '', code); extendSummary('geo-location'); hideXEBPopup(); return false; } //===Talk Page entry Function=========================================== function XEBPopupTalk(e) { var m = new GetPos(e || event); curPopup = new XEBPopup('talk', m.x, m.y); curPopup.width = 200; var mt = '<div style="font-size:medium"><p>Please choose:<\/p>'; mt += '<span class="XEBMnuItm" onclick="XEBInsertTalk(1)">Test1<\/span><br>'; mt += '<span class="XEBMnuItm" onclick="XEBInsertTalk(2)">Self Test<\/span><br>'; mt += '<span class="XEBMnuItm" onclick="XEBInsertTalk(3)">Nonsense<\/span><br>'; mt += '<span class="XEBMnuItm" onclick="XEBInsertTalk(4)">Please stop<\/span><br>'; mt += '<span class="XEBMnuItm" onclick="XEBInsertTalk(5)">Last chance<\/span><br>'; mt += '<span class="XEBMnuItm" onclick="XEBInsertTalk(6)">Blanking<\/span><br>'; mt += '<span class="XEBMnuItm" onclick="XEBInsertTalk(7)">Blatant<\/span><br>'; mt += '<span class="XEBMnuItm" ;onclick="XEBInsertTalk(8)">*BLOCKED*<\/span><br>'; mt += '<span class="XEBMnuItm" onclick="XEBInsertTalk(9)">Spam<\/span><br>'; mt += '<span class="XEBMnuItm" onclick="XEBInsertTalk(10)">Npov<\/span><br>'; curPopup.setInnerHTML(mt); return true; } function XEBInsertTalk(itm) { var code = { 1: '{' + '{subst:test1-n|}}', 2: '{' + '{subst:selftest-n|}}', 3: '{' + '{subst:test2-n|}}', 4: '{' + '{subst:test3-n|}}', 5: '{' + '{subst:test4-n|}}', 6: '{' + '{subst:test2a-n|}}', 7: '{' + '{subst:bv-n|}}', 8: '{' + '{subst:blantant|}}', 9: '{' + '{subst:spam-n|}}', 10: '{' + '{subst:NPOV user}}' }; hideXEBPopup(); insertTags('', '', code[ itm ]); return false; } function XEBPopupImage(e) { var m = new GetPos(e || event); curPopup = new XEBPopup('image', m.x, m.y); curPopup.width = 300; var mt = '<p>Enter the image parameters below: <\/p>' + '<form name="XEBPopupImageForm">' + 'File:<input type="text" name="imgFile" value="' + XEBGetSelectedText() + '" size="30"><br>' + 'Type:<SELECT NAME="imgType">' + '<OPTION VALUE="thumb">Thumbnail' + '<OPTION VALUE="frame">Frame' + '<OPTION VALUE="none">[not specified]' + '</SELECT><br>' + 'Location:<SELECT NAME="imgLocation">' + '<OPTION VALUE="left">Left' + '<OPTION VALUE="center">Centre' + '<OPTION VALUE="right">Right' + '<OPTION VALUE="none">None' + '</SELECT><br>' + 'Size:<input type="text" name="imgSize" value="100" size="3">px<br>' + 'Caption:<input type="text" name="imgCaption" value="" size="30"><\/p>' + '<\/form>' + '<p><button onClick="javascript:XEBInsertImage()">Insert</button>' + '<button onClick="hideXEBPopup()">Cancel</button>'; curPopup.setInnerHTML(mt); return true; } function XEBInsertImage() { var f = document.XEBPopupImageForm; hideXEBPopup(); var code = '[[Image:'; code += f.imgFile.value; code += '|' + f.imgType.value; code += '|' + f.imgLocation.value; code += '|' + f.imgSize.value; code += '|' + f.imgCaption.value; code += ']]'; insertTags('', '', code); extendSummary('image'); return false; } function XEBPopupFormattedText(e) { var m = new GetPos(e || event); curPopup = new XEBPopup('image', m.x, m.y); curPopup.width = 300; var mt = '<form name="XEBPopupImageForm">' + '<table style="background: transparent;">' + '<tr><td>Bold:<\/td><td><input type="checkbox" name="textBold"><\/td>' + '<td>Superscript:<\/td><td><input type="checkbox" name="textSuperscript"><\/td><\/tr>' + '<tr><td>Italic:<\/td><td><input type="checkbox" name="textItalic"><\/td>' + '<td>Subscript:<\/td><td><input type="checkbox" name="textSubscript"><\/td><\/tr>' + '<tr><td>Strike:<\/td><td><input type="checkbox" name="textStrike"><\/td>' + '<td> <\/td><\/tr>' + '</table>' + 'Size:<SELECT NAME="textSize">' + '<OPTION VALUE="small">small' + '<OPTION VALUE="normal">[Normal]' + '<OPTION VALUE="big">big' + '</SELECT><br><table style="background:transparent;"><tr><td>Colour:<\/td><td>' + '<table width="100px">' + '<tr><td colspan="4">None<\/td></tr>' + '<tr><td bgcolor="aqua"> <\/td><td bgcolor="gray"> <\/td>' + '<td bgcolor="olive"> <\/td><td bgcolor="navy"> <\/td><\/tr>' + '<tr><td bgcolor="black"> <\/td><td bgcolor="green"> <\/td>' + '<td bgcolor="purple"> <\/td><td bgcolor="teal"> <\/td><\/tr>' + '<tr><td bgcolor="blue"> <\/td><td bgcolor="lime"> <\/td>' + '<td bgcolor="red"> <\/td><td bgcolor="white"> <\/td><\/tr>' + '<tr><td bgcolor="fuchsia"> <\/td><td bgcolor="maroon"> <\/td>' + '<td bgcolor="silver"> <\/td><td bgcolor="yellow"> <\/td><\/tr>' + '</table><\/td><\/tr>' + '<\/form>' + 'Sample:' + '<span id="sampleText">Text</span>"' + '<p><button onClick="javascript:XEBInsertFormattedText()">Insert</button>' + '<button onClick="hideXEBPopup()">Cancel</button>'; curPopup.setInnerHTML(mt); return true; } function XEBUpdateSampleText() { var f = document.XEBPopupImageForm; } //==================== function XEBMenuMouseOut(e) { var targ; if (!e) { e = window.event; } if (e.target) { targ = e.target; } else if (e.srcElement) { targ = e.srcElement; } targ.style.color = 'black'; } function XEBMenuMouseOver(e) { var targ; if (!e) { e = window.event; } if (e.target) { targ = e.target; } else if (e.srcElement) { targ = e.srcElement; } targ.style.color = 'red'; } //======================================================================= // Other functions //======================================================================= function XEBgetElementsByClassName(parent, clsName, htmltag) { var arr = [], elem; var elems = parent.getElementsByTagName(htmltag); for (var cls, i = 0; (elem = elems[i]); i++) { if (elem.className === clsName) { arr[arr.length] = elem; } } return arr; } function extendSummary(newText) { if (!XEBExtendEditSummary) { return; } var s = document.editform.elements.wpSummary.value; s += (s === '') ? newText : ' +' + newText; document.editform.elements.wpSummary.value = s; } function bug(msg) { if (mw.config.get( 'wgUserName' ) === 'MarkS') { alert(msg); } }