Hilfe:Helferlein/Bearbeitungstoolbar/Konfiguration: Unterschied zwischen den Versionen

Aus Stupidedia, der sinnfreien Enzyklopädie!
Wechseln zu: Navigation, Suche
(Der Seiteninhalt wurde durch einen anderen Text ersetzt: „Test“)
K
 
(36 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt)
Zeile 1: Zeile 1:
Test
+
<html>
 +
<noscript>Dieses Gerät funktioniert nur bei aktiviertem JavaScript.</noscript>
 +
<form name="pEBC" id="pEBC" class="jq-tabs" style="display: none;">
 +
    <p>Mit diesem Gerät kannst du deine Editbuttons konfigurieren.</p>
 +
    <p>Du klickst einfach einen der Buttons an und kannst dann über die Tabs die allgemeinen Einstellungen, die jeweilige Gruppe und den Button selbst bearbeiten. Während der Bearbeitung passt sich die Buttonleiste automatisch deinen Änderungen an.</p>
 +
    <p>Neben den meisten Einstellungen findest du ein Auswahlfeld mit zwei Optionen, „Standard“ und „Wie definiert:“. Solange eine Einstellung auf „Standard“ steht, wird sie beim Speichern übersprungen und bleibt auf dem im Helferlein definierten Wert. Änderst du die Einstellung im nebenstehenden Eingabefeld, springt die Auswahl automatisch auf „Wie definiert:“ und würde beim nächsten Speichervorgang übernommen werden.</p>
 +
    <p>Zuerst werden nur einige wenige Einstellungen angezeigt, nämlich die wichtigsten. Unten im Formular findest du eine mit „Erweiterte Optionen anzeigen “ beschriftete Checkbox. Wenn du die anhakst, werden alle Einstellungen angezeigt. Das sind z. B. Konditionen zur Anzeige des Buttons, in welchen Namensräumen er auftauchen soll usw. Auch kannst du den Button oder die Gruppe optisch freier gestalten und sogar eigene CSS-Regeln einpflegen.</p>
 +
    <p>Unter dieser Checkbox findest du vier Knöppe. Der erste übernimmt deine Einstellungen und speichert sie auf dem Server. Dabei wird die Seite nicht verlassen oder neu geladen und falls du was vergessen hast, kannst du es direkt wieder ändern. Neben dem Speicherbutton findest du den Knopp zum Zurücksetzen. Der vernichtet alle deine Änderungen und selbst erstellten Buttons und Gruppen. Aber keine Sorge: Solltest du versehentlich auf den Knopp kommen und bestätigen, kannst du gleich danach auf den Speicherbutton drücken und alles ist wieder da.</p>
 +
    <p>Über den dritten Knopp von links kannst du eine neue Gruppe anlegen. Die wird automatisch hinten angehängt und ist zuerst noch nicht sichtbar und auch nicht auswählbar. Du kannst sie jedoch bearbeiten. Direkt daneben findest du den Knopp zum Erstellen eines neuen Buttons. Der wird automatisch an die zuletzt gewählte Gruppe angehängt, du kannst ihn jedoch über ein Auswahlfeld im Buttontab in eine andere verschieben. Sobald du eine Gruppe oder einen Button anlegst, fragt dich das Gerät nach einer ID. Diese ID darf nur aus Buchstaben, Zahlen und dem Unterstrich bestehen und nicht mit einer Zahl beginnen. Außerdem kann sie nachträglich nicht mehr geändert werden.</p>
 +
    <p>Jede Gruppe und jeder Button kann über ein entsprechendes Auswahlfeld unten im Formular wieder zurückgesetzt respektive gelöscht werden, je nachdem, ob der Button standardmäßig installiert ist oder von dir erstellt wurde.</p>
 +
    <p>Dieses Gerät ist voll funktionsfähig bzw. sollte es zumindest sein. Viel Spaß damit!</p>
 +
    <div id="pEBC-toolbar"></div>
 +
    <dl id="pEBC-info">
 +
        <dt>Aktuelle Gruppe</dt>
 +
        <dd>&mdash;</dd>
 +
        <dt>Aktueller Button</dt>
 +
        <dd>&mdash;</dd>
 +
    </dl>
 +
    <ol id="pEBC-tabs">
 +
        <li>
 +
            <a href="#pEBC-tab-config">Einstellungen ändern</a>
 +
        </li>
 +
        <li>
 +
            <a href="#pEBC-tab-group">Gruppe bearbeiten</a>
 +
        </li>
 +
        <li>
 +
            <a href="#pEBC-tab-button">Button bearbeiten</a>
 +
        </li>
 +
    </ol>
 +
    <div id="pEBC-tab-config">
 +
        <table></table>
 +
    </div>
 +
    <div id="pEBC-tab-group">
 +
        <p class="pEBC-noSelection">Keine Gruppe ausgewählt</p>
 +
        <table style="display: none;"></table>
 +
    </div>
 +
    <div id="pEBC-tab-button">
 +
        <p class="pEBC-noSelection">Kein Button ausgewählt</p>
 +
        <table style="display: none;"></table>
 +
    </div>
 +
    <div id="pEBC-submit">
 +
        <p>
 +
            <input type="checkbox" id="pEBC-toggleAdvanced" />
 +
            <label for="pEBC-toggleAdvanced">Erweiterte Optionen anzeigen</label>
 +
        </p>
 +
        <p>
 +
            <input type="button" id="pEBC-submit-save" value="Speichern" />
 +
            <input type="button" id="pEBC-submit-reset" value="Zurücksetzen" />
 +
            <input type="button" id="pEBC-submit-newGroup" value="Neue Gruppe" />
 +
            <input type="button" id="pEBC-submit-newButton" value="Neuer Button" />
 +
        </p>
 +
    </div>
 +
</form>
 +
</html><css>
 +
 
 +
#pEBC-toolbar {
 +
    margin-top: 10px;
 +
    margin-bottom: 10px;
 +
}
 +
 
 +
#pEBC-info {
 +
    clear: both;
 +
    padding-top: 10px;
 +
}
 +
 
 +
#pEBC-tab-config,
 +
#pEBC-tab-group,
 +
#pEBC-tab-button {
 +
    background-color: #FFFFFF;
 +
    border: 1px solid #BBBBBB;
 +
    margin-top: -1px;
 +
}
 +
 
 +
#pEBC table {
 +
    width: 100%;
 +
    border-spacing: 0px;
 +
}
 +
 
 +
#pEBC td {
 +
    border-top: 1px solid #DDDDDD;
 +
    padding: 5px;
 +
    vertical-align: top;
 +
}
 +
 
 +
#pEBC tr:first-child td {
 +
    border-top: none;
 +
}
 +
 
 +
.pEBC-defaultCol {
 +
    width: 110px;
 +
}
 +
 
 +
.pEBC-inputCol {
 +
    width: 300px;
 +
}
 +
 
 +
.pEBC-assignCol {
 +
    width: 170px;
 +
    display: none; /* Gibt es noch nicht */
 +
}
 +
 
 +
.pEBC-descCol p {
 +
    font-size: 85%;
 +
    margin-bottom: 0px;
 +
}
 +
 
 +
.pEBC-descCol p:first-child {
 +
    font-size: 100%;
 +
    font-weight: bold;
 +
    margin-top: 0px;
 +
}
 +
 
 +
.pEBC-inputCol textarea,
 +
.pEBC-inputCol select {
 +
    width: 100%;
 +
}
 +
 
 +
</css><js>
 +
 
 +
var pEBC = {
 +
 
 +
    defaultConfig: {},
 +
 
 +
    userConfig: {},
 +
 
 +
    form: {
 +
        config: {},
 +
        groups: {},
 +
        buttons: {}
 +
    },
 +
 
 +
    selectedGroup: null,
 +
 
 +
    selectedButton: null,
 +
 
 +
    init: function() {
 +
        pEBC.defaultConfig = {
 +
            config: gEditButtons.config,
 +
            groups: gEditButtons.groups,
 +
            buttons: gEditButtons.buttons
 +
        };
 +
        pEBC.userConfig = $.parseJSON( mw.user.options.get( 'userjs-editbuttons' ) ) || {
 +
            config: {},
 +
            groups: {},
 +
            buttons: {}
 +
        };
 +
 
 +
        pEBC.setForm();
 +
    },
 +
 
 +
    setForm: function() {
 +
        var form = pEBC.form;
 +
 
 +
        // Erst die Standard- und dann die Benutzerkonfiguration abarbeiten
 +
        $.each( ['defaultConfig', 'userConfig'], function( i, e ) {
 +
            var cur = pEBC[e];
 +
 
 +
            // Wir übernehmen die allgemeinen Einstellungen Schritt für Schritt
 +
            var config = cur.config;
 +
            $.each( ['groupOrder', 'marginButtons', 'marginGroups', 'showAllPages'], function( i2, e2 ) {
 +
                if ( config[e2] !== undefined && config[e2] !== null ) {
 +
                    // showAllPages ist ein Array mit Seitentiteln
 +
                    if ( e2 === 'showAllPages' ) {
 +
                        form.config[e2] = config[e2].join( '\n' ).replace( / /g, '_' );
 +
                    }
 +
                    else {
 +
                        form.config[e2] = config[e2];
 +
                    }
 +
                    // Wenn die Eigenschaft in der Benutzerkonfiguration existiert, entspricht sie nicht dem Standard
 +
                    form.config[e2 + '-default'] = ( e === 'userConfig' ) ? '' : '1';
 +
                }
 +
            } );
 +
 
 +
            // Nun die Gruppen
 +
            $.each( cur.groups, function( i2, e2 ) {
 +
                var group = e2;
 +
 
 +
                // Wenn das Gruppenobjekt im Formular noch nicht existiert, legen wir es an
 +
                if ( !form.groups[i2] ) {
 +
                    // Mit Standardwerten füllen (buttonOrder brauchen wir nicht, da es nicht direkt angezeigt wird)
 +
                    form.groups[i2] = {
 +
                        id: i2,
 +
                        name: '',
 +
                        css: '',
 +
                        hardcoded: pEBC.defaultConfig.groups[i2] ? true : false // Wenn die Gruppe in der Standardkonfiguration existiert, ist sie hardcodiert
 +
                    };
 +
                }
 +
 
 +
                // Jede Gruppeneigenschaft einzeln übernehmen
 +
                $.each( ['buttonOrder', 'name', 'css'], function( i3, e3 ) {
 +
                    if ( group[e3] !== undefined && group[e3] !== null ) {
 +
                        form.groups[i2][e3] = group[e3];
 +
                        form.groups[i2][e3 + '-default'] = ( e === 'userConfig' ) ? '' : '1';
 +
                    }
 +
                } );
 +
            } );
 +
        } );
 +
 
 +
        // Die Buttons müssen auf andere Weise übernommen werden
 +
        var buttons = [];
 +
        $.each( pEBC.defaultConfig.buttons, function( i ) {
 +
            buttons.push( i );
 +
        } );
 +
        $.each( pEBC.userConfig.buttons, function( i ) {
 +
            buttons.push( i );
 +
        } );
 +
 
 +
        $.each( buttons, function( i, e ) {
 +
            form.buttons[e] = {
 +
                id: e,
 +
                hardcoded: pEBC.defaultConfig.buttons[e] ? true : false
 +
            };
 +
 
 +
            var button = form.buttons[e];
 +
 
 +
            // Standardwerte prüfen
 +
            if ( pEBC.userConfig.buttons[e] ) {
 +
                $.each( pEBC.userConfig.buttons[e], function( i2, e2 ) {
 +
                    if ( e2 !== null ) {
 +
                        switch ( i2 ) {
 +
                            case 'actionType':
 +
                            case 'actionText':
 +
                                i2 = 'action';
 +
                                break;
 +
                            case 'namespacesIn':
 +
                            case 'namespacesEx':
 +
                            case 'userGroupsIn':
 +
                            case 'userGroupsEx':
 +
                            case 'pageTypesIn':
 +
                            case 'pageTypesEx':
 +
                            case 'contextsIn':
 +
                            case 'contextsEx':
 +
                                i2 = i2.slice( 0, -2 );
 +
                                break;
 +
                            case 'disabled':
 +
                                break;
 +
                        }
 +
                        button[i2 + '-default'] = '';
 +
                    }
 +
                } );
 +
            }
 +
 
 +
            pEBC.assignButtonProps( e );
 +
        } );
 +
    },
 +
 
 +
    assignButtonProps: function( e, newButton ) {
 +
        var form = pEBC.form;
 +
        var button = form.buttons[e];
 +
        var objects = [gEditButtons.EditButton.prototype];
 +
        if ( !newButton ) {
 +
            objects.push( pEBC.defaultConfig.buttons[e] );
 +
            objects.push( pEBC.userConfig.buttons[e] );
 +
        }
 +
        $.each( objects, function( i2, e2 ) {
 +
            // Abbruch, wenn kein Objekt
 +
            if ( e2 === undefined ) {
 +
                return;
 +
            }
 +
 
 +
            // Einfache Werte
 +
            $.each( ['group', 'title', 'width', 'height', 'fgImage', 'fgImageWidth', 'bgImage', 'bgImageWidth', 'bgColor', 'condition', 'label', 'css', 'disabled', 'actionType'], function( i3, e3 ) {
 +
                if ( e2[e3] !== undefined && e2[e3] !== null ) {
 +
                    button[e3] = e2[e3];
 +
                }
 +
            } );
 +
 
 +
            // Zusammenfassung
 +
            if ( typeof e2.summary === 'string' ) {
 +
                button.summary = e2.summary;
 +
            }
 +
            else if ( $.type( e2.summary ) === 'array' ) {
 +
                button.summary = e2.summary.join( '\n' );
 +
            }
 +
 
 +
            // Erlaubnisauswahlfelder
 +
            $.each( ['namespacesIn', 'namespacesEx', 'userGroupsIn', 'userGroupsEx', 'pageTypesIn', 'pageTypesEx', 'contextsIn', 'contextsEx'], function( i3, e3 ) {
 +
                if ( e2[e3] !== undefined && e2[e3] !== null ) {
 +
                    button[e3] = ( e2[e3] === true || e2[e3] === false ) ? ['!'] : e2[e3];
 +
                }
 +
            } );
 +
 
 +
            // Aktionstext
 +
            if ( typeof e2.actionText === 'string' || typeof e2.actionText === 'object' && e2.actionText.length === 1 ) {
 +
                button.actionText0 = e2.actionText;
 +
                button.actionText1 = '';
 +
                button.actionText2 = '';
 +
            }
 +
            else if ( $.type( e2.actionText ) === 'array' ) {
 +
                button.actionText0 = e2.actionText[0];
 +
                button.actionText1 = e2.actionText[1];
 +
                button.actionText2 = e2.actionText[2];
 +
            }
 +
        } );
 +
    },
 +
 
 +
    execute: function() {
 +
        gEditButtons.getButtons( 'config' );
 +
        pEBC.createTables();
 +
        var groups = '';
 +
        $.each( pEBC.form.groups, function( i, e ) {
 +
            groups += '<option value="' + i + '">' + e.name + '</option>';
 +
        } );
 +
        document.pEBC['button-group'].innerHTML = groups;
 +
        pEBC.fillConfigTable();
 +
        $( '#pEBC-row-group-move .pEBC-inputCol input' ).click( pEBC.moveGroup );
 +
        $( '#pEBC-row-button-move .pEBC-inputCol input' ).click( pEBC.moveButton );
 +
        $( '.pEBC-defaultCol, .pEBC-inputCol' ).find( 'input:not(:button), select, textarea' ).on( 'change keyup', pEBC.change );
 +
        $( '#pEBC-toggleAdvanced' ).on( 'change', pEBC.toggleAdvanced );
 +
        $( '#pEBC-submit-save' ).click( pEBC.save );
 +
        $( '#pEBC-submit-reset' ).click( pEBC.reset );
 +
        $( '#pEBC-submit-newGroup' ).click( pEBC.newGroup );
 +
        $( '#pEBC-submit-newButton' ).click( pEBC.newButton );
 +
        $( '#pEBC' ).removeClass( 'ui-widget-content' ).show();
 +
        $( '#pEBC-pleaseWait' ).remove();
 +
    },
 +
 
 +
    select: function( button ) {
 +
        var form = pEBC.form;
 +
        var id = button.getAttribute( 'data-id' );
 +
        var group = form.buttons[id].group;
 +
        pEBC.selectedButton = id;
 +
        pEBC.selectedGroup = group;
 +
        addCSS( '#pEBC-toolbar .editButton-' + id + ' { outline: 2px solid red; position: relative; z-index: 1; }', 'pEBC-selectedCSS' );
 +
        pEBC.fillGroupTable();
 +
        pEBC.fillButtonTable();
 +
    },
 +
 
 +
    createTables: function() {
 +
        function link( page, text ) {
 +
            var html = '<a href="' +
 +
                mw.util.getUrl( page ) +
 +
                '" title="' +
 +
                mw.html.escape( page ) +
 +
                '">' +
 +
                ( ( text === undefined ) ? mw.html.escape( page ) : text ) +
 +
                '</a>';
 +
            return html;
 +
        }
 +
 
 +
        var cr = pEBC.createRow;
 +
 
 +
        const TEXT = 0;
 +
        const NUMBER = 1;
 +
        const AREA = 2;
 +
 
 +
        const ADVANCED = 1;
 +
        const DISABLED = 2;
 +
        const NOASSIGN = 4;
 +
        const NODEFAULT = 8;
 +
 
 +
        var namespaceSelector = '<option value="!">(keine Angabe)</option>';
 +
        var namespaceCount = 1;
 +
        $.each( mw.config.get( 'wgFormattedNamespaces' ), function( i, e ) {
 +
            if ( i >= 0 ) {
 +
                var name = ( i === '0' ) ? '(Hauptraum)' : e;
 +
                namespaceSelector += '<option value="' + i + '">' + name + '</option>';
 +
                namespaceCount++;
 +
            }
 +
        } );
 +
        if ( namespaceCount > 5 ) {
 +
            namespaceCount = 5;
 +
        }
 +
 
 +
        var pageTypeSelector = '<option value="!">(keine Angabe)</option>';
 +
        var pageTypeCount = 1;
 +
        $.each( {
 +
            subject: 'Inhaltsseiten',
 +
            talk: 'Diskussionsseiten',
 +
            css: 'CSS-Seiten',
 +
            js: 'JavaScript-Seiten'
 +
        }, function( i, e ) {
 +
            pageTypeSelector += '<option value="' + i + '">' + e + '</option>';
 +
            pageTypeCount++;
 +
        } );
 +
        if ( pageTypeCount > 5 ) {
 +
            pageTypeCount = 5;
 +
        }
 +
 
 +
        var userGroupSelector = '<option value="!">(keine Angabe)</option>';
 +
        var userGroupCount = 1;
 +
        $.each( global.groups.names, function( i, e ) {
 +
            userGroupSelector += '<option value="' + i + '">' + e + '</option>';
 +
            userGroupCount++;
 +
        } );
 +
        if ( userGroupCount > 5 ) {
 +
            userGroupCount = 5;
 +
        }
 +
 
 +
        var contextSelector = '<option value="!">(keine Angabe)</option>';
 +
        var contextCount = 1;
 +
        $.each( gEditButtons.contexts, function( i, e ) {
 +
            if ( i !== 'config' ) {
 +
                contextSelector += '<option value="' + i + '">' + e.name + '</option>';
 +
                contextCount++;
 +
            }
 +
        } );
 +
        if ( contextCount > 5 ) {
 +
            contextCount = 5;
 +
        }
 +
 
 +
        // Einstellungen
 +
        cr(
 +
            'config-marginGroups',
 +
            'Gruppenabstand\nDer Abstand zwischen den Buttongruppen in Pixeln. Gib einfach eine Zahl an.',
 +
            NUMBER
 +
        );
 +
        cr(
 +
            'config-marginButtons',
 +
            'Buttonabstand\nDer Abstand zwischen den einzelnen Buttons innerhalb einer Gruppe in Pixeln.',
 +
            NUMBER
 +
        );
 +
        cr(
 +
            'config-showAllPages',
 +
            'Seiten mit allen Buttons\nAuf diesen Seiten sollen alle Buttons angezeigt werden. Gibt eine pro Zeile an.',
 +
            AREA
 +
        );
 +
        cr(
 +
            'config-options',
 +
            'Optionen\nFalls du die Gruppen in einer bestimmten Reihenfolge angeordnet hast, kannst du das mit dieser Checkbox zurücksetzen.',
 +
            '<input type="checkbox" name="config-resetGroupOrder" id="pEBC-config-resetGroupOrder" /> ' +
 +
                '<label for="pEBC-config-resetGroupOrder">Gruppenreihenfolge zurücksetzen</label>',
 +
            NODEFAULT
 +
        );
 +
 
 +
        // Gruppe
 +
        cr(
 +
            'group-move',
 +
            'Position der Gruppe\nMit diesen beiden Buttons kannst du die Gruppe innerhalb der Toolbar verschieben.',
 +
            '<input type="button" name="group-move-left" value="Nach links" /> <input type="button" name="group-move-right" value="Nach rechts" />',
 +
            NOASSIGN | NODEFAULT
 +
        );
 +
        cr(
 +
            'group-id',
 +
            'ID\nDie ID der Gruppe. Kann nicht geändert werden.',
 +
            TEXT,
 +
            DISABLED | NODEFAULT
 +
        );
 +
        cr(
 +
            'group-name',
 +
            'Name\nDer Name der Gruppe. Wird zur Zeit nur für die Auswahlfelder in diesem Gerät benötigt.',
 +
            TEXT
 +
        );
 +
        cr(
 +
            'group-css',
 +
            'CSS\nZusätzliche Stylesheets für die Gruppe.',
 +
            AREA,
 +
            ADVANCED
 +
        );
 +
        cr(
 +
            'group-options',
 +
            'Optionen\nDu kannst die Reihenfolge der Buttons in dieser Gruppe löschen. Das wird aber erst beim Speichern übernommen.\nBei standardmäßig vorhandenen Gruppen kannst du alle deine Änderungen zurücksetzen. Das passiert erst beim Speichern, das heißt, dass die Änderungen beim Speichern übersprungen werden und daher beim nächsten Seitenaufruf nicht mehr da sind.\nSelbst angelegte Gruppen können auch wieder gelöscht werden. Sollte eine eigene Gruppe aber noch Buttons enthalten, werden die nicht angezeigt, solange keine neue Gruppe mit derselben ID angelegt wurde.',
 +
            '<input type="checkbox" name="group-resetButtonOrder" id="pEBC-group-resetButtonOrder" /> ' +
 +
                '<label for="pEBC-group-resetButtonOrder">Buttonreihenfolge zurücksetzen</label>' +
 +
                '<br />' +
 +
                '<input type="checkbox" name="group-reset" id="pEBC-group-reset" /> ' +
 +
                '<label for="pEBC-group-reset">Gruppe zurücksetzen/löschen</label>',
 +
            NODEFAULT
 +
        );
 +
 
 +
        // Button
 +
        cr(
 +
            'button-move',
 +
            'Position des Buttons\nMit diesen beiden Buttons kannst du den Button innerhalb seiner Gruppe verschieben.',
 +
            '<input type="button" name="button-move-left" value="Nach links" /> <input type="button" name="button-move-right" value="Nach rechts" />',
 +
            NOASSIGN | NODEFAULT
 +
        );
 +
        cr(
 +
            'button-id',
 +
            'ID\nDie ID des Buttons. Kann nicht geändert werden.',
 +
            TEXT,
 +
            DISABLED | NODEFAULT
 +
        );
 +
        cr(
 +
            'button-group',
 +
            'Gruppe\nHier kannst du einstellen, zu welcher Gruppe der Button gehören soll.',
 +
            '<select name="button-group"></select>'
 +
        );
 +
        cr(
 +
            'button-title',
 +
            'Beschreibung\nEine kurze Beschreibung, was der Button macht. Wird angezeigt, wenn man mit der Maus über den Button fährt.',
 +
            TEXT
 +
        );
 +
        cr(
 +
            'button-label',
 +
            'Beschriftung\nDie Beschriftung des Buttons. Wird als HTML interpretiert, es stehen also alle Tags in vollem Umfang zur Verfügung. Wikicode ist aber nicht möglich.\nWird nur angezeigt, wenn kein Icon angegeben wurde.',
 +
            TEXT
 +
        );
 +
        cr(
 +
            'button-fgImage',
 +
            'Icon\nDas Icon des Buttons. Überschreibt die Beschriftung.\nGib den Namen einer Datei, die in der Stupidedia hochgeladen wurde, an. Das Namensraumpräfix (<i>Datei:</i>) musst du aber weglassen. Eine Liste mit allen bisher hochgeladenen Editbutton-Icons findest du in der ' + link( 'Kategorie:Datei:Editbutton' ) + '.',
 +
            TEXT
 +
        );
 +
        cr(
 +
            'button-fgImageWidth',
 +
            'Breite des Icons\nDu kannst eine Breite in Pixeln angeben, damit das Icon nicht in voller Größe angezeigt wird. Du kannst es nur verkleinern, nicht vergrößern.',
 +
            NUMBER
 +
        );
 +
        cr(
 +
            'button-bgColor',
 +
            'Hintergrundfarbe\nDu kannst eine Hintergrundfarbe für den Button angeben. Die liegt hinter dem Hintergrundbild.\nGib einen beliebigen CSS-fähigen Farbwert an. Hilfe dazu findest du in der ' + link( 'Stupidedia:Farbtabelle', 'Farbtabelle' ) + '.',
 +
            TEXT,
 +
            ADVANCED
 +
        );
 +
        cr(
 +
            'button-bgImage',
 +
            'Hintergrundbild\nButtons haben meist ein Hintergrundbild, in der Regel ' + link( 'Datei:Editbutton.svg', 'Editbutton.svg' ) + '. Du kannst das Hintergrundbild ändern, falls es aber andere Abmessungen hat, solltest du die Breite und die Höhe des Buttons anpassen.\nTipp: Vermutlich willst du, dass alle Buttons das gleiche Hintergrundbild haben. Dazu kannst du rechts neben dem Eingabefeld auf „Für alle übernehmen“ klicken.',
 +
            TEXT,
 +
            ADVANCED
 +
        );
 +
        cr(
 +
            'button-bgImageWidth',
 +
            'Breite des Hintergrundbildes\nWie auch das Icon kannst du das Vordergrundbild verkleinern, aber nicht vergrößern. Gibst du hier nichts an, wird es in voller Größe dargestellt.',
 +
            NUMBER,
 +
            ADVANCED
 +
        );
 +
        cr(
 +
            'button-width',
 +
            'Breite des Buttons\nDer Button selbst ist ein div-Element. Hier kannst du dessen Breite einstellen.',
 +
            NUMBER,
 +
            ADVANCED
 +
        );
 +
        cr(
 +
            'button-height',
 +
            'Höhe des Buttons\nHier kannst du die Höhe des Buttons einstellen.',
 +
            NUMBER,
 +
            ADVANCED
 +
        );
 +
        cr(
 +
            'button-action',
 +
            'Aktion\nHier kannst du angeben, was der Button beim Klick machen soll. Das Dropdown-Menü stellt dir fünf Möglichkeiten zur Verfügung: <b>Tags setzen</b> setzt Text vor und hinter die Cursorposition/Markierung im Eingabefeld. <b>Text oben einfügen</b> und <b>Text unten anhängen</b> fügen Text in einer neuen Zeile am Anfang oder am Ende des Eingabefeldes ein. <b>Seiteninhalt ersetzen</b> ersetzt den kompletten Seiteninhalt durch den angegebenen Text. <b>Funktion ausführen</b> führt eine JavaScript-Funktion aus.\nInnerhalb der Aktionstexte wie auch der Zusammenfassungen kannst du Variablen verwenden. Die werden über ein Eingabepopup angefragt. Die Syntax für eine Variable ist <code>%{Variablenname}%</code>, wobei <code>Variablenname</code> ein möglichst aussagekräftiger Name sein soll. Der kann beliebig lang sein und alle Zeichen außer <code>}</code> und <code>%</code> enthalten. Im Eingabepopup wird er gefolgt von einem Fragezeichen angezeigt. Eine Variable kann mehrmals verwendet werden, wird dabei aber nur einmal abgefragt.\nEs gibt drei voreingestellte Variablen, die nicht abgefragt werden: <code>%{Seitentitel}%</code> enthält den vollen Namen der Seite, auf die sich die Buttons beziehen. Das muss nicht zwangsläufig die grad geladene Seite sein. <code>%{Benutzername}%</code> ist der Name des gerade eingeloggten Benutzers, also deiner. Bei IPs ist diese Variable leer. <code>%{Signatur}%</code> enthält die berüchtigten vier Tilden, die die Benutzersignatur bilden. Das muss deshalb eine Variable sein, weil jeder angemeldete Benutzer diesen Code ändern kann, z. B. um den Strich davor zu entfernen.' +
 +
                '</p><p id="pEBC-button-action-desc-insertTags" class="pEBC-button-action-desc">Das obere Eingabefeld definiert den Text, der vor der Cursormarkierung eingefügt werden soll. Das mittlere Feld gibt den Text an, der nach der Markierung eingefügt wird. In das untere Feld kannst du einen Beispieltext eingeben, der eingefügt und markiert wird, wenn nichts anderes markiert wurde.' +
 +
                '</p><p id="pEBC-button-action-desc-prependText" class="pEBC-button-action-desc">Der Text im Eingabefeld wir über dem bisherigen Seiteninhalt eingefügt, gefolgt von einem Zeilenumbruch.' +
 +
                '</p><p id="pEBC-button-action-desc-appendText" class="pEBC-button-action-desc">Der Text im Eingabefeld wird unter dem bisherigen Seiteninhalt eingefügt, davor wird ein Zeilenumbruch eingefügt.' +
 +
                '</p><p id="pEBC-button-action-desc-replaceContent" class="pEBC-button-action-desc">Der Text im Eingabefeld ersetzt den bisherigen Seiteninhalt vollständig.' +
 +
                '</p><p id="pEBC-button-action-desc-function" class="pEBC-button-action-desc">In das Eingabefeld kannst du jetzt deine Funktion schreiben. Neben den üblichen globalen Variablen stehen folgende Funktionsargumente zur Verfügung: <b>button</b> ist das HTML-Objekt des Buttons, aber ein natives, nicht jQuery. <b>gadget</b> ist eine Referenz auf die globale Variable <i>gEditButtons</i>. <b>context</b> enthält die ID des Kontextes (also u. a. des Bearbeitungsfeldes), in dem der Button zur Zeit wirkt. <b>contextObj</b> ist das Kontextobjekt selbst. Die <code>%{…}%</code>-Variablen stehen hier nur innerhalb der Funktionen, die für die anderen vier Aktionsarten genutzt werden, zur Verfügung. Dein Quelltext wird also nicht verpfuscht. Wenn deine Funktion einen Rückgabewert liefert, wird die Zusammenfassungszeile nicht ausgefüllt, es sei denn, du rufst diese Funktion zu Fuß auf.',
 +
            '<select name="button-actionType"><option value="0">Tags setzen</option><option value="1">Text oben einfügen</option><option value="2">Text unten anhängen</option><option value="3">Seiteninhalt ersetzen</option><option value="4">Funktion ausführen</option>' +
 +
                '<br />' +
 +
                '<textarea name="button-actionText0" rows="5" style="display: block;"></textarea>' +
 +
                '<textarea name="button-actionText1" rows="5" style="display: block;"></textarea>' +
 +
                '<textarea name="button-actionText2" rows="5" style="display: block;"></textarea>'
 +
        );
 +
        cr(
 +
            'button-summary',
 +
            'Zusammenfassung\nHier kannst du die Zusammenfassung, die bei Klick auf den Button eingetragen werden soll, eingeben. Wie im Aktionsteil können auch hier Variablen genutzt werden. Du kannst mehrere Zusammenfassungen eintragen, jede in eine Zeile. Es wird dann eine per Zufall ausgewählt.',
 +
            AREA
 +
        );
 +
        cr(
 +
            'button-pageTypes',
 +
            'Seitenarten\nSeitenarten funktionieren ähnlich wie Namensräume, sind aber etwas allgemeiner: <b>Inhaltsseiten</b> sind alle Seiten, die keine Diskussions-, CSS- oder JavaScript-Seiten sind. <b>Diskussionsseiten</b> sind alle Seiten in einem der Diskussionsnamensräume plus denen, die unter ' + link( 'MediaWiki:Gadget-global-config.js' ) + ' in der Variable <code>global.talkpages</code> definiert wurden, also z. B. auch die Wahllokale. <b>CSS-</b> und <b>JavaScript-Seiten</b> liegen in den Namensräumen <i>Benutzer</i> oder <i>MediaWiki</i> und enden auf <i>.css</i> oder <i>.js</i>.',
 +
            '<b>Nur auf Seiten dieser Art anzeigen:</b><br /><select name="button-pageTypesIn" multiple="multiple" size="' + pageTypeCount + '">' + pageTypeSelector + '</select><br /><b>Auf allen Seiten außer welchen dieser Art anzeigen:</b><br /><select name="button-pageTypesEx" multiple="multiple" size="' + pageTypeCount + '">' + pageTypeSelector + '</select>',
 +
            ADVANCED
 +
        );
 +
        cr(
 +
            'button-namespaces',
 +
            'Namensräume\nManche Buttons sollen nicht in allen Namensräumen auftauchen. Hier hast du zwei Möglichkeiten, einzustellen, wo der Button angezeigt werden soll: Entweder in allen angegebenen Namensräumen oder in allen außer den angegebenen.',
 +
            '<b>Nur in diesen Namensräumen anzeigen:</b><br /><select name="button-namespacesIn" multiple="multiple" size="' + namespaceCount + '">' + namespaceSelector + '</select><br /><b>In allen außer diesen Namensräumen anzeigen:</b><br /><select name="button-namespacesEx" multiple="multiple" size="' + namespaceCount + '">' + namespaceSelector + '</select>',
 +
            ADVANCED
 +
        );
 +
        cr(
 +
            'button-userGroups',
 +
            'Benutzergruppen\nManche Buttons sollen nur bestimmten Benutzergruppen zur Verfügung stehen.',
 +
            '<b>Nur Benutzern, die Mitglied einer dieser Gruppen sind, anzeigen:</b><br /><select name="button-userGroupsIn" multiple="multiple" size="' + userGroupCount + '">' + userGroupSelector + '</select><br /><b>Benutzern, die einer dieser Gruppen angehören, den Button nicht anzeigen:</b><br /><select name="button-userGroupsEx" multiple="multiple" size="' + userGroupCount + '">' + userGroupSelector + '</select>',
 +
            ADVANCED
 +
        );
 +
        cr(
 +
            'button-contexts',
 +
            'Bearbeitungskontexte\nJeder Kontext steht im Prinzip für ein Werkzeug, dass diese Buttons benutzt. Nicht in jedem Werkzeug sollen alle Buttons angezeigt werden. Im Werkzeug zum Erstellen eines neuen Beitrags würden Formatierungsknöppe, die das Layout zerschießen, z. B. keinen Sinn machen.',
 +
            '<b>Nur in diesen Werkzeugen anzeigen:</b><br /><select name="button-contextsIn" multiple="multiple" size="' + contextCount + '">' + contextSelector + '</select><br /><b>In allen außer diesen Werkzeugen anzeigen:</b><br /><select name="button-contextsEx" multiple="multiple" size="' + contextCount + '">' + contextSelector + '</select>',
 +
            ADVANCED
 +
        );
 +
        cr(
 +
            'button-condition',
 +
            'Erweiterte Konditionen\nFalls die Auswahlfelder da oben nicht ausreichen, kannst du hier eine Funktion angeben, die berechnet, ob der Button angezeigt werden soll oder nicht.\nEs stehen dabei folgende Variablen zur Verfügung: <b>title</b> ist ein mw.Title-Objekt und enthält den Titel der Seite, auf die sich das Bearbeitungsformular bezieht. <b>ns</b> ist die Namensraum-ID derselben Seite. <b>type</b> ist ein String und der Seitentyp, also <i>subject</i>, <i>talk</i>, <i>css</i> oder <i>js</i>. <b>context</b> ist die ID des jeweiligen Unterobjekts von <i>gEditButtons.contexts</i>, das sich auf das Bearbeitungsformular bezieht.\nGibt die Funktion <b>true</b> zurück, wird der Button auf jeden Fall angezeigt, unabhängig von allen anderen Konditionen. Gibt die Funktion <b>false</b> zurück, wird er nicht angezeigt. In allen anderen Fällen wird mit der normalen Konditionsberechnung fortgefahren.',
 +
            AREA,
 +
            ADVANCED
 +
        );
 +
        cr(
 +
            'button-css',
 +
            'CSS\nDu kannst für jeden Button eigene Stylesheets angeben, um ihn genauer zu modifizieren.',
 +
            AREA,
 +
            ADVANCED
 +
        );
 +
        cr(
 +
            'button-options',
 +
            'Optionen\nJeder Button kann deaktiviert werden. Er taucht dann auf keiner Seite mehr auf, kann aber wieder reaktiviert werden.\nAlle nicht vom Benutzer erstellten Buttons können zurückgesetzt werden. Das bedeutet, dass alle vom Benutzer daran vorgenommenen Änderungen gelöscht werden, der Button selbst bleibt jedoch vorhanden. Beim Speichern werden deine Änderungen dann einfach übersprungen.\nSelbst erstellt Buttons kann man wieder löschen. Die werden beim Speichern ebenfalls weggelassen.',
 +
            '<input type="checkbox" name="button-disabled" id="pEBC-button-disabled" /> ' +
 +
                '<label for="pEBC-button-disabled">Button ist deaktiviert</label>' +
 +
                '<br />' +
 +
                '<input type="checkbox" name="button-reset" id="pEBC-button-reset" /> ' +
 +
                '<label for="pEBC-button-reset">Button zurücksetzen/löschen</label>',
 +
            NODEFAULT
 +
        );
 +
    },
 +
 
 +
    createRow: function( name, desc, input, flags ) {
 +
        if ( flags === undefined ) {
 +
            flags = 0;
 +
        }
 +
        var advanced = ( flags & 1 ) ? ' class="pEBC-advancedRow" style="display: none;"' : '';
 +
        var disabled = ( flags & 2 ) ? ' disabled="disabled"' : '';
 +
        // Eingabezeile
 +
        if ( input === 0 || input === undefined ) {
 +
            input = '<input type="text" name="' + name + '"' + disabled + ' />';
 +
        }
 +
        // Numerisches Input
 +
        else if ( input === 1 ) {
 +
            input = '<input type="number" name="' + name + '"' + disabled + ' />';
 +
        }
 +
        // Großes Textfeld
 +
        else if ( input === 2 ) {
 +
            input = '<textarea name="' + name + '"' + disabled + ' rows="5"></textarea>';
 +
        }
 +
        // Standardwertspalte
 +
        var defaultCol = '';
 +
        if ( ~flags & 2 && ~flags & 8 ) {
 +
            defaultCol = '<select name="' + name + '-default" size="2"><option value="1">Standard</option><option value="">Wie definiert:</option></select>';
 +
        }
 +
        // Zuweisungsspalte
 +
        var assignCol = '';
 +
        if ( ~flags & 2 && ~flags & 4 && name.indexOf( 'config-' ) !== 0 ) {
 +
            assignCol = '<input type="button" name="' + name + '-assignAll" value="Für alle übernehmen" />';
 +
            if ( name.indexOf( 'button-' ) === 0 ) {
 +
                assignCol = '<input type="button" name="' + name + '-assignGroup" value="Für Gruppe übernehmen" /><br />' + assignCol;
 +
            }
 +
        }
 +
        // HTML
 +
        var html = '<tr id="pEBC-row-' + name + '"' + advanced + '>' +
 +
            '<td class="pEBC-descCol">' +
 +
                '<p>' + desc.replace( /\n/g, '</p><p>' ) + '</p>' +
 +
            '</td>' +
 +
            '<td class="pEBC-defaultCol">' + defaultCol + '</td>' +
 +
            '<td class="pEBC-inputCol">' + input + '</td>' +
 +
            '<td class="pEBC-assignCol">' + assignCol + '</td>' +
 +
            '</tr>';
 +
        var obj = $( html );
 +
        obj.appendTo( '#pEBC-tab-' + name.split( '-' )[0] + ' table' );
 +
        return obj;
 +
    },
 +
 
 +
    fillConfigTable: function() {
 +
        $.each( ['marginGroups', 'marginButtons', 'showAllPages'], function( i, e ) {
 +
            document.pEBC['config-' + e].value = pEBC.form.config[e];
 +
            pEBC.setDefaultField( 'config-' + e );
 +
        } );
 +
    },
 +
 
 +
    fillGroupTable: function() {
 +
        $.each( ['id', 'name', 'css'], function( i, e ) {
 +
            document.pEBC['group-' + e].value = pEBC.form.groups[pEBC.selectedGroup][e];
 +
            pEBC.setDefaultField( 'group-' + e );
 +
        } );
 +
        document.pEBC['group-reset'].checked = pEBC.form.groups[pEBC.selectedGroup].reset;
 +
        pEBC.checkPosition( $( '#pEBC-toolbar .buttonGroup-' + pEBC.selectedGroup ), 'group' );
 +
        $( '#pEBC-tab-group .pEBC-noSelection' ).hide();
 +
        $( '#pEBC-tab-group table' ).show();
 +
        pEBC.refreshInfoField();
 +
    },
 +
 
 +
    fillButtonTable: function() {
 +
        $.each( ['id', 'group', 'title', 'width', 'height', 'fgImage', 'fgImageWidth', 'bgImage', 'bgImageWidth', 'bgColor', 'condition', 'label', 'css', 'actionType', 'actionText0', 'actionText1', 'actionText2', 'namespacesIn', 'namespacesEx', 'userGroupsIn', 'userGroupsEx', 'pageTypesIn', 'pageTypesEx', 'contextsIn', 'contextsEx', 'summary'], function( i, e ) {
 +
            $( document.pEBC['button-' + e] ).val( pEBC.form.buttons[pEBC.selectedButton][e] );
 +
            pEBC.setDefaultField( 'button-' + e );
 +
        } );
 +
        pEBC.displayActionFields( pEBC.form.buttons[pEBC.selectedButton].actionType );
 +
        pEBC.setDefaultField( 'button-action' );
 +
        pEBC.setDefaultField( 'button-namespaces' );
 +
        pEBC.setDefaultField( 'button-pageTypes' );
 +
        pEBC.setDefaultField( 'button-userGroups' );
 +
        pEBC.setDefaultField( 'button-contexts' );
 +
        document.pEBC['button-disabled'].checked = pEBC.form.buttons[pEBC.selectedButton].disabled;
 +
        document.pEBC['button-reset'].checked = pEBC.form.buttons[pEBC.selectedButton].reset;
 +
        pEBC.checkPosition( $( '#pEBC-toolbar .editButton-' + pEBC.selectedButton ), 'button' );
 +
        $( '#pEBC-tab-button .pEBC-noSelection' ).hide();
 +
        $( '#pEBC-tab-button table' ).show();
 +
        pEBC.refreshInfoField();
 +
    },
 +
 
 +
    setDefaultField: function( name ) {
 +
        name = name.split( '-' );
 +
        if ( name[0] === 'config' ) {
 +
            var value = pEBC.form.config[name[1] + '-default'];
 +
        }
 +
        else {
 +
            var obj = pEBC.form[name[0] + 's'][pEBC['selected' + $.ucFirst( name[0] )]];
 +
            var value = obj[name[1] + '-default'];
 +
        }
 +
        value = ( value === '' ) ? '' : '1';
 +
        var element = document.pEBC[name[0] + '-' + name[1] + '-default'];
 +
        if ( element ) {
 +
            element.value = value;
 +
        }
 +
    },
 +
 
 +
    displayActionFields: function( type ) {
 +
        var display = ( type === '0' || type === 0 ) ? 'block' : 'none';
 +
        $( '#pEBC-row-button-action .pEBC-button-action-desc:not(:eq(' + type + '))' ).hide();
 +
        $( '#pEBC-row-button-action .pEBC-button-action-desc:eq(' + type + ')' ).show();
 +
        document.pEBC['button-actionText1'].style.display = display;
 +
        document.pEBC['button-actionText2'].style.display = display;
 +
    },
 +
 
 +
    change: function() {
 +
        var name = this.getAttribute( 'name' ).split( '-' );
 +
        var value = $( this ).val();
 +
        var tab = name[0];
 +
        var prop = name[2] ? name[1] + '-' + name[2] : name[1];
 +
 
 +
        if ( tab === 'config' ) {
 +
            var obj = pEBC.form.config;
 +
        }
 +
        else if ( tab === 'group' ) {
 +
            var obj = pEBC.form.groups[pEBC.selectedGroup];
 +
        }
 +
        else if ( tab === 'button' ) {
 +
            var obj = pEBC.form.buttons[pEBC.selectedButton];
 +
        }
 +
 
 +
        if ( !name[2] ) {
 +
            var defaultField = name[0] + '-' + name[1] + '-default';
 +
            if ( document.pEBC[defaultField] ) {
 +
                document.pEBC[defaultField].value = '';
 +
                obj[name[1] + '-default'] = '';
 +
            }
 +
        }
 +
 
 +
        if ( tab === 'config' ) {
 +
            if ( prop === 'resetGroupOrder' ) {
 +
                obj[prop] = this.checked;
 +
            }
 +
            else {
 +
                obj[prop] = value;
 +
                pEBC.refreshConfig();
 +
            }
 +
        }
 +
        else if ( tab === 'group' ) {
 +
            if ( prop === 'reset' || prop === 'resetButtonOrder' ) {
 +
                obj[prop] = this.checked;
 +
            }
 +
            else {
 +
                obj[prop] = value;
 +
                pEBC.refreshGroup();
 +
                if ( prop === 'name' ) {
 +
                    pEBC.refreshInfoField();
 +
                }
 +
            }
 +
        }
 +
        else if ( tab === 'button' ) {
 +
            switch ( prop ) {
 +
                case 'actionType':
 +
                case 'actionText0':
 +
                case 'actionText1':
 +
                case 'actionText2':
 +
                    obj[prop] = value;
 +
                    document.pEBC['button-action-default'].value = '';
 +
                    obj['action-default'] = '';
 +
                    if ( prop === 'actionType' ) {
 +
                        pEBC.displayActionFields( value );
 +
                    }
 +
                    break;
 +
                case 'namespacesIn':
 +
                case 'namespacesEx':
 +
                case 'userGroupsIn':
 +
                case 'userGroupsEx':
 +
                case 'pageTypesIn':
 +
                case 'pageTypesEx':
 +
                case 'contextsIn':
 +
                case 'contextsEx':
 +
                    obj[prop] = value;
 +
                    var sliced = prop.slice( 0, -2 )
 +
                    document.pEBC['button-' + sliced + '-default'].value = '';
 +
                    obj[sliced + '-default'] = '';
 +
                    break;
 +
                case 'disabled':
 +
                case 'reset':
 +
                    obj[prop] = this.checked;
 +
                    break;
 +
                case 'group':
 +
                    obj[prop] = value;
 +
                    var buttonObj = $( '#pEBC-toolbar .editButton-' + pEBC.selectedButton );
 +
                    buttonObj.appendTo( '#pEBC-toolbar .buttonGroup-' + value );
 +
                    var reverse = [];
 +
                    // Entweder über alle Buttons in der Ordnung iterieren …
 +
                    if ( pEBC.form.groups[value].buttonOrder ) {
 +
                        $.each( pEBC.form.groups[value].buttonOrder, function( i, e ) {
 +
                            reverse.unshift( e );
 +
                        } );
 +
                    }
 +
                    // … oder über alle Buttons im Formular
 +
                    else {
 +
                        $.each( pEBC.form.buttons, function( i, e ) {
 +
                            if ( e.group === value ) {
 +
                                reverse.unshift( i );
 +
                            }
 +
                        } );
 +
                    }
 +
                    $.each( reverse, function( i, e ) {
 +
                        $( '#pEBC-toolbar .buttonGroup-' + value + ' .editButton-' + e ).prependTo( '#pEBC-toolbar .buttonGroup-' + value );
 +
                    } );
 +
                    $( '#pEBC-toolbar .buttonGroup-' + pEBC.selectedGroup + ' .editButton' ).removeClass( 'lastEditButton' );
 +
                    $( '#pEBC-toolbar .buttonGroup-' + pEBC.selectedGroup + ' .editButton:last-child' ).addClass( 'lastEditButton' );
 +
                    $( '#pEBC-toolbar .buttonGroup-' + value + ' .editButton' ).removeClass( 'lastEditButton' );
 +
                    $( '#pEBC-toolbar .buttonGroup-' + value + ' .editButton:last-child' ).addClass( 'lastEditButton' );
 +
                    pEBC.selectedGroup = value;
 +
                    pEBC.refreshInfoField();
 +
                    pEBC.checkPosition( buttonObj, 'button' );
 +
                    break;
 +
                default:
 +
                    obj[prop] = value;
 +
                    pEBC.refreshButton( prop );
 +
                    if ( prop === 'title' ) {
 +
                        pEBC.refreshInfoField();
 +
                    }
 +
                    break;
 +
            }
 +
        }
 +
    },
 +
 
 +
    refreshInfoField: function() {
 +
        // Gruppe
 +
        if ( pEBC.selectedGroup ) {
 +
            var group = pEBC.form.groups[pEBC.selectedGroup];
 +
            $( '#pEBC-info dd:first' ).text( '#' + group.id + ': ' + group.name );
 +
        }
 +
        else {
 +
            $( '#pEBC-info dd:first' ).html( '&mdash;' );
 +
        }
 +
        if ( pEBC.selectedButton ) {
 +
            var button = pEBC.form.buttons[pEBC.selectedButton];
 +
            $( '#pEBC-info dd:last' ).text( '#' + button.id + ': ' + button.title );
 +
        }
 +
        else {
 +
            $( '#pEBC-info dd:last' ).html( '&mdash;' );
 +
        }
 +
    },
 +
 
 +
    refreshConfig: function() {
 +
        var css = '';
 +
 
 +
        // Buttonabweichung
 +
        var marginButtons = ( pEBC.form.config['marginButtons-default'] ) ? pEBC.defaultConfig.config.marginButtons : pEBC.form.config.marginButtons;
 +
        css += '#pEBC-toolbar .editButton { margin-right: ' + marginButtons + 'px; margin-bottom: ' + marginButtons + 'px; }';
 +
 
 +
        // Gruppenabweichung (letzter Button)
 +
        var marginGroups = ( pEBC.form.config['marginGroups-default'] ) ? pEBC.defaultConfig.config.marginGroups : pEBC.form.config.marginGroups;
 +
        css += '#pEBC-toolbar .editButton.lastEditButton { margin-right: ' + marginGroups + 'px; }';
 +
 
 +
        addCSS( css, 'pEBC-toolbarCSS' );
 +
    },
 +
 
 +
    refreshGroup: function() {
 +
        var group = pEBC.selectedGroup;
 +
        var css = '';
 +
        if ( pEBC.form.groups[group]['css-default'] ) {
 +
            if ( gEditButtons.groups[group] ) {
 +
                css = String( gEditButtons.groups[group].css || '' ).replace( /[\r\n]/g, ' ' );
 +
            }
 +
        }
 +
        else {
 +
            css = pEBC.form.groups[group].css.replace( /[\r\n]/g, ' ' );
 +
        }
 +
        $( '#pEBC-toolbar .buttonGroup-' + group ).attr( 'style', css );
 +
    },
 +
 
 +
    refreshButton: function( prop ) {
 +
        function getProp( prop ) {
 +
            var button = pEBC.selectedButton;
 +
            if ( pEBC.form.buttons[button][prop + '-default'] ) {
 +
                if ( pEBC.defaultConfig.buttons[button] && pEBC.defaultConfig.buttons[button][prop] !== undefined && pEBC.defaultConfig.buttons[button][prop] !== null ) {
 +
                    return pEBC.defaultConfig.buttons[button][prop];
 +
                }
 +
                else {
 +
                    return gEditButtons.EditButton.prototype[prop];
 +
                }
 +
            }
 +
            else {
 +
                return pEBC.form.buttons[button][prop];
 +
            }
 +
        }
 +
 
 +
        prop = prop.replace( '-default', '' );
 +
        var button = pEBC.selectedButton;
 +
        var obj = $( '#pEBC-toolbar .editButton-' + button );
 +
        var form = pEBC.form.buttons[button];
 +
 
 +
        switch ( prop ) {
 +
            case 'width':
 +
            case 'height':
 +
            case 'bgImage':
 +
            case 'bgImageWidth':
 +
            case 'bgColor':
 +
            case 'css':
 +
                var css = [];
 +
                css.push( 'width: ' + getProp( 'width' ) + 'px;' );
 +
                css.push( 'height: ' + getProp( 'height' ) + 'px;' );
 +
                if ( !getProp( 'fgImage' ) ) {
 +
                    css.push( 'line-height: ' + getProp( 'height' ) + 'px;' );
 +
                }
 +
                css.push( 'background-color: ' + getProp( 'bgColor' ) + ';' );
 +
                var size = getProp( 'bgImageWidth' );
 +
                if ( size ) {
 +
                    var url = '/thumb.php?' + $.param( {
 +
                        f: getProp( 'bgImage' ),
 +
                        w: size
 +
                    } );
 +
                }
 +
                else {
 +
                    var url = getFileSource( getProp( 'bgImage' ) );
 +
                }
 +
                css.push( 'background-image: url(\'' + url + '\');' );
 +
                css.push( getProp( 'css' ).replace( /[\r\n]/g, ' ' ) );
 +
                if ( css.length ) {
 +
                    obj.attr( 'style', css.join( ' ' ) );
 +
                }
 +
                break;
 +
            case 'title':
 +
                obj.attr( 'title', getProp( 'title' ) );
 +
                break;
 +
            case 'label':
 +
            case 'fgImage':
 +
            case 'fgImageWidth':
 +
                var image = getProp( 'fgImage' );
 +
                if ( image ) {
 +
                    var size = getProp( 'fgImageWidth' );
 +
                    if ( size ) {
 +
                        var url = '/thumb.php?' + $.param( {
 +
                            f: image,
 +
                            w: size
 +
                        } );
 +
                    }
 +
                    else {
 +
                        var url = getFileSource( image );
 +
                    }
 +
                    obj.html( '<img src="' + mw.html.escape( url ) + '" alt="" />' );
 +
                }
 +
                else {
 +
                    obj.html( getProp( 'label' ) );
 +
                }
 +
                break;
 +
        }
 +
    },
 +
 
 +
    toggleAdvanced: function() {
 +
        if ( this.checked ) {
 +
            $( '.pEBC-advancedRow' ).show();
 +
        }
 +
        else {
 +
            $( '.pEBC-advancedRow' ).hide();
 +
        }
 +
    },
 +
 
 +
    save: function( e ) {
 +
        e.preventDefault();
 +
        this.disabled = true;
 +
        var data = pEBC.getData();
 +
        api.saveGadgetOptions( 'editbuttons', data, pEBC.response, this );
 +
    },
 +
 
 +
    reset: function( e ) {
 +
        e.preventDefault();
 +
        this.disabled = true;
 +
        if ( confirm( 'Achtung! Du bist dabei, deine Buttoneinstellungen vollständig zu VERNICHTEN! Willst du das wirklich tun? Das kannst du nur rückgängig machen, indem du auf jetzt den Speicherknopf klickst. Sobald du diese Seite verlässt, sind die Einstellungen verloren!' ) ) {
 +
            var data = {
 +
                config: {},
 +
                groups: {},
 +
                buttons: {}
 +
            };
 +
            api.saveGadgetOptions( 'editbuttons', data, pEBC.response, this );
 +
        }
 +
        else {
 +
            this.disabled = false;
 +
        }
 +
    },
 +
 
 +
    newGroup: function( e ) {
 +
        e.preventDefault();
 +
 
 +
        var form = pEBC.form;
 +
 
 +
        var id = prompt( 'ID der neuen Gruppe? Darf nur aus Buchstaben (A – Z und a – z), Zahlen und dem Unterstrich bestehen und nicht mit einer Zahl beginnen.' ) || '';
 +
        if ( id === '' || typeof form.groups[id] === 'object' || id.match( /[A-Z_][A-Z0-9_]*/gi ) === null ) {
 +
            alert( 'Gruppen-ID ist leer, schon besetzt oder passt nicht.' );
 +
            return;
 +
        }
 +
 
 +
        form.groups[id] = {
 +
            id: id,
 +
            name: '',
 +
            css: '',
 +
            buttonOrder: []
 +
        };
 +
        $( '<span class="buttonGroup buttonGroup-' + id + '" data-id="' + id + '" />' ).appendTo( '#pEBC-toolbar' );
 +
        $( '#pEBC-toolbar .editButton:last' ).addClass( 'lastEditButton' );
 +
        $( document.pEBC['button-group'] ).append( '<option value="' + id + '"></option>' );
 +
        $( '#pEBC-tab-button .pEBC-noSelection' ).show();
 +
        $( '#pEBC-tab-button > table' ).hide();
 +
        addCSS( '', 'pEBC-selectedCSS' );
 +
        pEBC.selectedGroup = id;
 +
        pEBC.selectedButton = null;
 +
        pEBC.fillGroupTable();
 +
    },
 +
 
 +
    newButton: function( e ) {
 +
        e.preventDefault();
 +
 
 +
        var form = pEBC.form;
 +
        var group = pEBC.selectedGroup || 'default';
 +
 
 +
        var id = prompt( 'ID des neuen Buttons? Darf nur aus Buchstaben (A – Z und a – z), Zahlen und dem Unterstrich bestehen und nicht mit einer Zahl beginnen.' ) || '';
 +
        if ( id === '' || typeof form.buttons[id] === 'object' || id.match( /[A-Z_][A-Z0-9_]*/gi ) === null ) {
 +
            alert( 'Button-ID ist leer, schon besetzt oder passt nicht.' );
 +
            return;
 +
        }
 +
 
 +
        form.buttons[id] = {
 +
            id: id
 +
        };
 +
        var button = new gEditButtons.EditButton( form.buttons[id] );
 +
        pEBC.assignButtonProps( id, true );
 +
        form.buttons[id].group = group;
 +
        form.buttons[id]['group-default'] = '';
 +
        button = button.getButton( 'config' );
 +
        $( '#pEBC-toolbar .buttonGroup-' + group + ' .editButton:last' ).removeClass( 'lastEditButton' );
 +
        button.addClass( 'lastEditButton' ).appendTo( '#pEBC-toolbar .buttonGroup-' + group );
 +
        pEBC.select( button.get()[0] );
 +
    },
 +
 
 +
    moveGroup: function( e ) {
 +
        e.preventDefault();
 +
 
 +
        var direction = this.getAttribute( 'name' ).slice( 11 );
 +
        var obj = $( '#pEBC-toolbar .buttonGroup-' + pEBC.selectedGroup );
 +
        var option = $( '#pEBC-tab-button select[name="button-group"] option[value="' + pEBC.selectedGroup + '"]' );
 +
 
 +
        if ( direction === 'left' ) {
 +
            obj.after( obj.prev( '.buttonGroup' ) );
 +
            option.after( option.prev( 'option' ) );
 +
        }
 +
        else {
 +
            obj.before( obj.next( '.buttonGroup' ) );
 +
            option.before( option.next( 'option' ) );
 +
        }
 +
        pEBC.checkPosition( obj, 'group' );
 +
        pEBC.form.config.groupOrder = [];
 +
        $( '#pEBC-toolbar .buttonGroup' ).each( function( i, e ) {
 +
            pEBC.form.config.groupOrder.push( e.getAttribute( 'data-id' ) );
 +
        } );
 +
        $( '#pEBC-toolbar .buttonGroup .editButton:last-child' ).addClass( 'lastEditButton' );
 +
        $( '#pEBC-toolbar .buttonGroup:last-child .editButton:last-child' ).removeClass( 'lastEditButton' );
 +
    },
 +
 
 +
    moveButton: function( e ) {
 +
        e.preventDefault();
 +
 
 +
        var direction = this.getAttribute( 'name' ).slice( 12 );
 +
        var obj = $( '#pEBC-toolbar .editButton-' + pEBC.selectedButton );
 +
 
 +
        if ( direction === 'left' ) {
 +
            obj.after( obj.prev( '.editButton' ) );
 +
        }
 +
        else {
 +
            obj.before( obj.next( '.editButton' ) );
 +
        }
 +
        pEBC.checkPosition( obj, 'button' );
 +
        pEBC.form.groups[pEBC.selectedGroup].buttonOrder = [];
 +
        $( '#pEBC-toolbar .buttonGroup-' + pEBC.selectedGroup + ' .editButton' ).each( function( i, e ) {
 +
            pEBC.form.groups[pEBC.selectedGroup].buttonOrder.push( e.getAttribute( 'data-id' ) );
 +
        } );
 +
        $( '#pEBC-toolbar .buttonGroup-' + pEBC.selectedGroup + ' .editButton' ).removeClass( 'lastEditButton' );
 +
        $( '#pEBC-toolbar .buttonGroup-' + pEBC.selectedGroup + ' .editButton:last-child' ).addClass( 'lastEditButton' );
 +
    },
 +
 
 +
    checkPosition: function( obj, type ) {
 +
        document.pEBC[type + '-move-left'].disabled = obj.is( ':first-child' );
 +
        document.pEBC[type + '-move-right'].disabled = obj.is( ':last-child' );
 +
    },
 +
 
 +
    response: function( data, button, jqxhr ) {
 +
        if ( !data ) {
 +
            alert( 'Konnte nicht speichern. HTTP-Statuscode ' + jqxhr.status + ': ' + jqxhr.statusText );
 +
        }
 +
        else if ( data.error ) {
 +
            alert( 'Konnte nicht speichern. API-Fehlercode ' + data.error.code + ': ' + data.error.text );
 +
        }
 +
        button.disabled = false;
 +
    },
 +
 
 +
    exportJSON: function( e ) {
 +
        e.preventDefault();
 +
    },
 +
 
 +
    getData: function() {
 +
        function changed( obj, prop ) {
 +
            return ( obj[prop + '-default'] === '' );
 +
        }
 +
 
 +
        var form = pEBC.form;
 +
        var data = {
 +
            config: {},
 +
            groups: {},
 +
            buttons: {}
 +
        };
 +
 
 +
        $.each( ['marginGroups', 'marginButtons'], function( i, e ) {
 +
            if ( changed( form.config, e ) ) {
 +
                data.config[e] = parseInt( form.config[e] ) || 0;
 +
            }
 +
        } );
 +
 
 +
        if ( changed( form.config, 'showAllPages' ) ) {
 +
            data.config.showAllPages = [];
 +
            var pages = form.config.showAllPages.split( '\n' );
 +
            $.each( pages, function( i, e ) {
 +
                data.config.showAllPages.push( $.trim( e ).replace( / /g, '_' ) );
 +
            } );
 +
        }
 +
 
 +
        if ( form.config.groupOrder !== undefined && !form.config.resetGroupOrder ) {
 +
            data.config.groupOrder = form.config.groupOrder;
 +
        }
 +
 
 +
        // Über alle Gruppen iterieren
 +
        $.each( form.groups, function( i, e ) {
 +
            // Beim Zurücksetzen überspringen
 +
            if ( e.reset ) {
 +
                return;
 +
            }
 +
 
 +
            var isSet = false;
 +
            var group = {};
 +
 
 +
            $.each( ['name', 'css'], function( i2, e2 ) {
 +
                if ( changed( e, e2 ) ) {
 +
                    group[e2] = e[e2];
 +
                    isSet = true;
 +
                }
 +
            } );
 +
 
 +
            if ( e.buttonOrder !== undefined && !e.resetButtonOrder ) {
 +
                group.buttonOrder = e.buttonOrder;
 +
                isSet = true;
 +
            }
 +
 
 +
            if ( isSet ) {
 +
                data.groups[i] = group;
 +
            }
 +
        } );
 +
 
 +
        // Und über alle Buttons
 +
        $.each( form.buttons, function( i, e ) {
 +
            var button = pEBC.getButtonData( e );
 +
            if ( button ) {
 +
                data.buttons[i] = button;
 +
            }
 +
        } );
 +
 
 +
        return data;
 +
    },
 +
 
 +
    getButtonData: function( button ) {
 +
        function changed( prop ) {
 +
            return ( button[prop + '-default'] === '' );
 +
        }
 +
 
 +
        // Beim Zurücksetzen überspringen
 +
        if ( button.reset ) {
 +
            return false;
 +
        }
 +
 
 +
        var data = {};
 +
        var isSet = false;
 +
 
 +
        // Direkt übernehmen
 +
        $.each( ['group', 'title', 'label', 'fgImage', 'bgImage', 'bgColor', 'condition', 'css'], function( i, e ) {
 +
            if ( changed( e ) ) {
 +
                data[e] = button[e];
 +
                isSet = true;
 +
            }
 +
        } );
 +
 
 +
        // Numerische Werte
 +
        $.each( ['width', 'height', 'fgImageWidth', 'bgImageWidth'], function( i, e ) {
 +
            if ( changed( e ) ) {
 +
                data[e] = parseInt( button[e] ) || 0;
 +
                isSet = true;
 +
            }
 +
        } );
 +
 
 +
        // Aktion
 +
        if ( changed( 'action' ) ) {
 +
            data.actionType = parseInt( button.actionType );
 +
            if ( data.actionType === 0 ) {
 +
                data.actionText = [button.actionText0, button.actionText1, button.actionText2];
 +
            }
 +
            else {
 +
                data.actionText = button.actionText0;
 +
            }
 +
            isSet = true;
 +
        }
 +
 
 +
        // Zusammenfassung
 +
        if ( changed( 'summary' ) ) {
 +
            data.summary = [];
 +
            var summaries = button.summary.split( '\n' );
 +
            $.each( summaries, function( i, e ) {
 +
                data.summary.push( $.trim( e ) );
 +
            } );
 +
            isSet = true;
 +
        }
 +
 
 +
        // Konditionskrempel
 +
        $.each( ['namespaces', 'pageTypes', 'userGroups', 'contexts'], function( i, e ) {
 +
            if ( changed( e ) ) {
 +
                var inValue = button[e + 'In'];
 +
                var exValue = button[e + 'Ex'];
 +
                data[e + 'In'] = ( inValue === '!' || inValue[0] === '!' ) ? true : inValue;
 +
                data[e + 'Ex'] = ( exValue === '!' || exValue[0] === '!' ) ? false : exValue;
 +
                isSet = true;
 +
            }
 +
        } );
 +
 
 +
        // Deaktiviert?
 +
        if ( button.disabled ) {
 +
            data.disabled = true;
 +
            isSet = true;
 +
        }
 +
 
 +
        if ( isSet )  {
 +
            return data;
 +
        }
 +
        else {
 +
            return false;
 +
        }
 +
    }
 +
 
 +
}
 +
 
 +
if ( mw.user.options.get( 'gadget-editButtons' ) ) {
 +
    $( '#pEBC' ).before( '<p id="pEBC-pleaseWait">Einen Moment, bitte …</p>' );
 +
    setHook( 'EditButtonConfigInit', 'pEBC.init' );
 +
    setHook( 'EditButtonConfigExecute', 'pEBC.execute' );
 +
}
 +
else {
 +
    $( '#pEBC' ).before( '<p>Dieser Apparat nützt dir nix ohne das Helferlein für Bearbeitungsknöppe.</p>' );
 +
}
 +
 
 +
</js>

Aktuelle Version vom 28. Juni 2015, 23:39 Uhr


Linktipps: Faditiva und 3DPresso