<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>https://fr.nvcwiki.com/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AEdittools.js</id>
		<title>MediaWiki:Edittools.js - Historique des versions</title>
		<link rel="self" type="application/atom+xml" href="https://fr.nvcwiki.com/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AEdittools.js"/>
		<link rel="alternate" type="text/html" href="https://fr.nvcwiki.com/index.php?title=MediaWiki:Edittools.js&amp;action=history"/>
		<updated>2026-05-07T06:11:23Z</updated>
		<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
		<generator>MediaWiki 1.28.0</generator>

	<entry>
		<id>https://fr.nvcwiki.com/index.php?title=MediaWiki:Edittools.js&amp;diff=15235&amp;oldid=prev</id>
		<title>Dieudo : Page créée avec « // &lt;source lang=&quot;javascript&quot;&gt;  /*     EditTools support: add a selector, change into true buttons, enable for all text input fields     The special characters to insert are d... »</title>
		<link rel="alternate" type="text/html" href="https://fr.nvcwiki.com/index.php?title=MediaWiki:Edittools.js&amp;diff=15235&amp;oldid=prev"/>
				<updated>2010-08-26T16:36:51Z</updated>
		
		<summary type="html">&lt;p&gt;Page créée avec « // &amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;  /*     EditTools support: add a selector, change into true buttons, enable for all text input fields     The special characters to insert are d... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;// &amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
    EditTools support: add a selector, change into true buttons, enable for all text input fields&lt;br /&gt;
    The special characters to insert are defined at [[MediaWiki:Edittools]].&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Globals: getElementsByClassName, hookEvent, addEvent (from wikibits.js)&lt;br /&gt;
&lt;br /&gt;
if ( load_edittools == true ) { // Legacy. Do we really need this?&lt;br /&gt;
    if ( typeof( EditTools_set_focus ) == 'undefined' ) {&lt;br /&gt;
        var EditTools_set_focus = true;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if ( typeof( EditTools_set_focus_initially ) == 'undefined' ) {&lt;br /&gt;
        var EditTools_set_focus_initially = EditTools_set_focus;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if ( typeof( EditTools_initial_subset ) == 'undefined' ) {&lt;br /&gt;
        var EditTools_initial_subset = 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var EditTools = {&lt;br /&gt;
        createSelector: function() {&lt;br /&gt;
            var spec = document.getElementById( 'specialchars' );&lt;br /&gt;
            if ( !spec ) {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            var sb = getElementsByClassName( spec, 'p', 'specialbasic' );&lt;br /&gt;
            if ( sb.length &amp;lt;= 1 ) {&lt;br /&gt;
                return; // Only care if there is more than one&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var sel = document.createElement( 'select' );&lt;br /&gt;
            sel.style.display = 'inline';&lt;br /&gt;
            // sel.setAttribute( 'onchange', 'EditTools.chooseCharSubset( selectedIndex, true );' );&lt;br /&gt;
            // Apparently, this doesn't work on IE6. Use an explicit event handling function instead:&lt;br /&gt;
            sel.onchange = EditTools.handleOnchange;&lt;br /&gt;
&lt;br /&gt;
            var initial = EditTools_initial_subset;&lt;br /&gt;
            if ( isNaN( initial ) || initial &amp;lt; 0 || initial &amp;gt;= sb.length ) {&lt;br /&gt;
                initial = 0;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            for ( var i = 0; i &amp;lt; sb.length; i++ ) {&lt;br /&gt;
                var o = document.createElement( 'option' );&lt;br /&gt;
                // Ugh. We have encoded Unicode characters in the names...&lt;br /&gt;
                var id = sb[i].id.replace( /.([0-9A-F][0-9A-F])/g, '%$1' ).replace( /_/g, ' ' );&lt;br /&gt;
                if ( i == initial ) {&lt;br /&gt;
                    o.selected = 'selected';&lt;br /&gt;
                }&lt;br /&gt;
                o.appendChild( document.createTextNode( decodeURIComponent( id ) ) );&lt;br /&gt;
                sel.appendChild( o );&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            spec.insertBefore( sel, spec.firstChild );&lt;br /&gt;
&lt;br /&gt;
            EditTools.chooseCharSubset(&lt;br /&gt;
                initial,&lt;br /&gt;
                ( wgAction != 'submit' ) &amp;amp;&amp;amp;&lt;br /&gt;
                EditTools_set_focus_initially &amp;amp;&amp;amp;&lt;br /&gt;
                ( wgCanonicalNamespace != 'Special' || wgCanonicalSpecialPageName != 'Upload' )&lt;br /&gt;
            );&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        handleOnchange: function( evt ) {&lt;br /&gt;
            var e    = evt || window.event;      // W3C, IE&lt;br /&gt;
            var node = e.target || e.srcElement; // W3C, IE&lt;br /&gt;
&lt;br /&gt;
            EditTools.chooseCharSubset( node.selectedIndex, true );&lt;br /&gt;
            return true;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        chooseCharSubset: function( selected, set_focus ) {&lt;br /&gt;
            var sb = getElementsByClassName( document.getElementById( 'specialchars' ), 'p', 'specialbasic' );&lt;br /&gt;
            EditTools.makeButtons( sb[selected] );&lt;br /&gt;
            for ( var i = 0; i &amp;lt; sb.length; i++ ) {&lt;br /&gt;
                sb[i].style.display = i == selected ? 'inline' : 'none';&lt;br /&gt;
            }&lt;br /&gt;
            if ( set_focus &amp;amp;&amp;amp; EditTools_set_focus ) {&lt;br /&gt;
                var txtarea = EditTools.getTextArea();&lt;br /&gt;
                if ( txtarea ) {&lt;br /&gt;
                    txtarea.focus();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        fixateWidth: function() {&lt;br /&gt;
            var edit_bar = document.getElementById( 'specialchars' );&lt;br /&gt;
            if ( !edit_bar ) {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            // Try to fixate the width of that bar, otherwise IE6 may make it wider, which will lead to&lt;br /&gt;
            // a table re-layout on the upload form resulting in the right column extending beyond the&lt;br /&gt;
            // right edge of the window.&lt;br /&gt;
            edit_bar.setAttribute( 'width', '' + ( edit_bar.clientWidth || edit_bar.offsetWidth ) );&lt;br /&gt;
            edit_bar.style.maxWidth = '' + ( edit_bar.clientWidth || edit_bar.offsetWidth ) + 'px';&lt;br /&gt;
            // If we're inside a table, fixate the containing table cell, too.&lt;br /&gt;
            var parent = edit_bar.parentNode;&lt;br /&gt;
            while ( parent &amp;amp;&amp;amp; parent != document.body &amp;amp;&amp;amp; parent.nodeName.toLowerCase() != 'td' ) {&lt;br /&gt;
                parent = parent.parentNode;&lt;br /&gt;
            }&lt;br /&gt;
            if ( parent &amp;amp;&amp;amp; parent != document.body ) {&lt;br /&gt;
                parent.setAttribute( 'width', '' + ( parent.clientWidth || parent.offsetWidth ) );&lt;br /&gt;
                parent.style.maxWidth = '' + ( parent.clientWidth || parent.offsetWidth ) + 'px';&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        makeButtons: function( section ) {&lt;br /&gt;
            var edit_bar = section || document.getElementById( 'specialchars' );&lt;br /&gt;
            if ( !edit_bar ) {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            var links = edit_bar.getElementsByTagName( 'a' );&lt;br /&gt;
            // 'links' is a *live* collection!&lt;br /&gt;
            var b = null;&lt;br /&gt;
            while ( links.length ) {&lt;br /&gt;
                b = document.createElement( 'input' );&lt;br /&gt;
                b.type = 'button';&lt;br /&gt;
                b.style.fontSize = '0.9em';&lt;br /&gt;
                b.style.paddingLeft = '1px';&lt;br /&gt;
                b.style.paddingRight = '1px';&lt;br /&gt;
                b.style.marginLeft = '1px';&lt;br /&gt;
                b.onclick = links[0].onclick;&lt;br /&gt;
                b.value = links[0].firstChild.data;&lt;br /&gt;
                var parent = links[0].parentNode;&lt;br /&gt;
                parent.replaceChild( b, links[0] ); // This removes links[0] from links!&lt;br /&gt;
                b.blur(); // IE6 insists on marking some buttons as having the focus...&lt;br /&gt;
                var margin_added = false;&lt;br /&gt;
                // Remove text nodes (nodeType == Node.TEXT_NODE, but IE6 doesn't know that...)&lt;br /&gt;
                // Insert some spacing where desired.&lt;br /&gt;
                while ( b.nextSibling &amp;amp;&amp;amp; b.nextSibling.nodeType == 3 ) {&lt;br /&gt;
                    if ( !margin_added &amp;amp;&amp;amp; b.nextSibling.data.search( /\S/ ) &amp;gt;= 0 ) {&lt;br /&gt;
                        b.style.marginRight = '4px';&lt;br /&gt;
                        margin_added = true;&lt;br /&gt;
                    }&lt;br /&gt;
                    parent.removeChild( b.nextSibling );&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        enableForAllFields: function() {&lt;br /&gt;
            if ( typeof( insertTags ) != 'function' ) {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            // insertTags from the site-wide /skins-1.5/common/edit.js just inserts in the first&lt;br /&gt;
            // textarea in the document. Evidently, that's not good if we have multiple textareas.&lt;br /&gt;
            // My first idea was to simply add a hidden textarea as the first one, and redefine&lt;br /&gt;
            // insertTags such that it copied first the last active textareas contents over to that hidden&lt;br /&gt;
            // field, set the cursor or selection there, let the standard insertTags do its thing, and&lt;br /&gt;
            // then copy the hidden field's text, cursor position and selection back to the currently&lt;br /&gt;
            // active field. Unfortunately, that is just as complex as simply copying the whole code&lt;br /&gt;
            // from wikibits to here and let it work on the right text field in the first place.&lt;br /&gt;
            var texts = document.getElementsByTagName( 'textarea' );&lt;br /&gt;
            for ( var i = 0; i &amp;lt; texts.length; i++ ) {&lt;br /&gt;
                addEvent( texts[i], 'focus', EditTools.registerTextField );&lt;br /&gt;
            }&lt;br /&gt;
            // While we're at it, also enable it for input fields&lt;br /&gt;
            texts = document.getElementsByTagName( 'input' );&lt;br /&gt;
            for ( var i = 0; i &amp;lt; texts.length; i++ ) {&lt;br /&gt;
                if ( texts[i].type == 'text' ) {&lt;br /&gt;
                    addEvent( texts[i], 'focus', EditTools.registerTextField );&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            insertTags = EditTools.insertTags; // Redefine the global insertTags&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        last_active_textfield: null,&lt;br /&gt;
&lt;br /&gt;
        registerTextField: function( evt ) {&lt;br /&gt;
            var e = evt || window.event;&lt;br /&gt;
            var node = e.target || e.srcElement;&lt;br /&gt;
            if ( !node ) {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            EditTools.last_active_textfield = node.id;&lt;br /&gt;
            return true;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        getTextArea: function() {&lt;br /&gt;
            var txtarea = null;&lt;br /&gt;
            if ( EditTools.last_active_textfield &amp;amp;&amp;amp; EditTools.last_active_textfield != '' )&lt;br /&gt;
                txtarea = document.getElementById( EditTools.last_active_textfield );&lt;br /&gt;
                if ( !txtarea ) {&lt;br /&gt;
                    // Fallback option: old behaviour&lt;br /&gt;
                    if ( document.editform ) {&lt;br /&gt;
                        txtarea = document.editform.wpTextbox1;&lt;br /&gt;
                    } else {&lt;br /&gt;
                        // Some alternate form? Take the first one we can find&lt;br /&gt;
                        txtarea = document.getElementsByTagName( 'textarea' );&lt;br /&gt;
                        if ( txtarea.length &amp;gt; 0 ) {&lt;br /&gt;
                            txtarea = txtarea[0];&lt;br /&gt;
                        } else {&lt;br /&gt;
                            txtarea = null;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
            }&lt;br /&gt;
            return txtarea;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        insertTags: function( tagOpen, tagClose, sampleText ) {&lt;br /&gt;
            /* Usability initiative compatibility */&lt;br /&gt;
            if ( typeof $j != 'undefined' &amp;amp;&amp;amp; typeof $j.fn.textSelection != 'undefined' ) {&lt;br /&gt;
                $j( '#wpTextbox1' ).textSelection(&lt;br /&gt;
                    'encapsulateSelection', { 'pre': tagOpen, 'peri': sampleText, 'post': tagClose }&lt;br /&gt;
                );&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            var txtarea = EditTools.getTextArea ();&lt;br /&gt;
            if ( !txtarea ) {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            var selText, isSample = false;&lt;br /&gt;
&lt;br /&gt;
            function checkSelectedText() {&lt;br /&gt;
                if ( !selText ) {&lt;br /&gt;
                    selText = sampleText;&lt;br /&gt;
                    isSample = true;&lt;br /&gt;
                } else if ( selText.charAt( selText.length - 1 ) == ' ' ) { // Exclude ending space char&lt;br /&gt;
                    selText = selText.substring( 0, selText.length - 1 );&lt;br /&gt;
                    tagClose += ' ';&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if ( document.selection &amp;amp;&amp;amp; document.selection.createRange ) { // IE/Opera&lt;br /&gt;
                // Save window scroll position&lt;br /&gt;
                var winScroll = 0;&lt;br /&gt;
                if ( document.documentElement &amp;amp;&amp;amp; document.documentElement.scrollTop ) {&lt;br /&gt;
                    winScroll = document.documentElement.scrollTop;&lt;br /&gt;
                } else if ( document.body ) {&lt;br /&gt;
                    winScroll = document.body.scrollTop;&lt;br /&gt;
                }&lt;br /&gt;
                // Get current selection&lt;br /&gt;
                txtarea.focus();&lt;br /&gt;
                var range = document.selection.createRange();&lt;br /&gt;
                selText = range.text;&lt;br /&gt;
                // Insert tags&lt;br /&gt;
                checkSelectedText ();&lt;br /&gt;
                range.text = tagOpen + selText + tagClose;&lt;br /&gt;
                // Mark sample text as selected&lt;br /&gt;
                if ( isSample &amp;amp;&amp;amp; range.moveStart ) {&lt;br /&gt;
                    if ( window.opera ) {&lt;br /&gt;
                        tagClose = tagClose.replace( /\n/g, '' );&lt;br /&gt;
                    }&lt;br /&gt;
                    range.moveStart( 'character', - tagClose.length - selText.length );&lt;br /&gt;
                    range.moveEnd( 'character', - tagClose.length );&lt;br /&gt;
                }&lt;br /&gt;
                range.select();&lt;br /&gt;
                // Restore window scroll position&lt;br /&gt;
                if ( document.documentElement &amp;amp;&amp;amp; document.documentElement.scrollTop ) {&lt;br /&gt;
                    document.documentElement.scrollTop = winScroll;&lt;br /&gt;
                } else if ( document.body ) {&lt;br /&gt;
                    document.body.scrollTop = winScroll;&lt;br /&gt;
                }&lt;br /&gt;
            } else if ( txtarea.selectionStart || txtarea.selectionStart == '0' ) { // Mozilla&lt;br /&gt;
                // Save textarea scroll position&lt;br /&gt;
                var textScroll = txtarea.scrollTop;&lt;br /&gt;
                // Get current selection&lt;br /&gt;
                txtarea.focus();&lt;br /&gt;
                var startPos = txtarea.selectionStart;&lt;br /&gt;
                var endPos   = txtarea.selectionEnd;&lt;br /&gt;
                selText = txtarea.value.substring( startPos, endPos );&lt;br /&gt;
                // Insert tags&lt;br /&gt;
                checkSelectedText();&lt;br /&gt;
                txtarea.value = txtarea.value.substring( 0, startPos ) +&lt;br /&gt;
                        tagOpen + selText + tagClose +&lt;br /&gt;
                        txtarea.value.substring( endPos );&lt;br /&gt;
                // Set new selection&lt;br /&gt;
                if ( isSample ) {&lt;br /&gt;
                    txtarea.selectionStart = startPos + tagOpen.length;&lt;br /&gt;
                    txtarea.selectionEnd = startPos + tagOpen.length + selText.length;&lt;br /&gt;
                } else {&lt;br /&gt;
                    txtarea.selectionStart = startPos + tagOpen.length + selText.length + tagClose.length;&lt;br /&gt;
                    txtarea.selectionEnd = txtarea.selectionStart;&lt;br /&gt;
                }&lt;br /&gt;
                // Restore textarea scroll position&lt;br /&gt;
                txtarea.scrollTop = textScroll;&lt;br /&gt;
            }&lt;br /&gt;
        }, // end insertTags&lt;br /&gt;
&lt;br /&gt;
        setup: function() {&lt;br /&gt;
            EditTools.fixateWidth();&lt;br /&gt;
            EditTools.createSelector();&lt;br /&gt;
            EditTools.enableForAllFields();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    } // end EditTools&lt;br /&gt;
&lt;br /&gt;
    // Do not use addOnloadHook; it runs *before* the onload event fires. At that time, onclick or&lt;br /&gt;
    // onfocus handlers may not yet be set up properly.&lt;br /&gt;
    hookEvent( 'load', EditTools.setup );&lt;br /&gt;
&lt;br /&gt;
} // end if&lt;br /&gt;
&lt;br /&gt;
// &amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dieudo</name></author>	</entry>

	</feed>