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

Aus Stupidedia, der sinnfreien Enzyklopädie!
Wechseln zu: Navigation, Suche
K
K
 
(33 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt)
Zeile 2: Zeile 2:
 
<noscript>Dieses Gerät funktioniert nur bei aktiviertem JavaScript.</noscript>
 
<noscript>Dieses Gerät funktioniert nur bei aktiviertem JavaScript.</noscript>
 
<form name="pEBC" id="pEBC" class="jq-tabs" style="display: none;">
 
<form name="pEBC" id="pEBC" class="jq-tabs" style="display: none;">
<p>Mit diesem Gerät kannst du deine Editbuttons konfigurieren.</p>
+
    <p>Mit diesem Gerät kannst du deine Editbuttons konfigurieren.</p>
<div id="pEBC-toolbar"></div>
+
    <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>
<ol id="pEBC-tabs">
+
    <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>
<li>
+
    <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>
<a href="#pEBC-tab-config">Einstellungen ändern</a>
+
    <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>
</li>
+
    <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>
<li>
+
    <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>
<a href="#pEBC-tab-group">Gruppe bearbeiten</a>
+
    <p>Dieses Gerät ist voll funktionsfähig bzw. sollte es zumindest sein. Viel Spaß damit!</p>
</li>
+
    <div id="pEBC-toolbar"></div>
<li>
+
    <dl id="pEBC-info">
<a href="#pEBC-tab-button">Button bearbeiten</a>
+
        <dt>Aktuelle Gruppe</dt>
</li>
+
        <dd>&mdash;</dd>
</ol>
+
        <dt>Aktueller Button</dt>
<div id="pEBC-tab-config">
+
        <dd>&mdash;</dd>
<table></table>
+
    </dl>
</div>
+
    <ol id="pEBC-tabs">
<div id="pEBC-tab-group">
+
        <li>
<p class="pEBC-noSelection">Keine Gruppe ausgewählt</p>
+
            <a href="#pEBC-tab-config">Einstellungen ändern</a>
<table style="display: none;"></table>
+
        </li>
</div>
+
        <li>
<div id="pEBC-tab-button">
+
            <a href="#pEBC-tab-group">Gruppe bearbeiten</a>
<p class="pEBC-noSelection">Kein Button ausgewählt</p>
+
        </li>
<table style="display: none;"></table>
+
        <li>
</div>
+
            <a href="#pEBC-tab-button">Button bearbeiten</a>
<div id="pEBC-submit">
+
        </li>
<input type="button" id="pEBC-submit-save" value="Speichern" />
+
    </ol>
<input type="button" id="pEBC-submit-reset" value="Zurücksetzen" />
+
    <div id="pEBC-tab-config">
<input type="button" id="pEBC-submit-newGroup" value="Neue Gruppe" />
+
        <table></table>
<input type="button" id="pEBC-submit-newButton" value="Neuer Button" />
+
    </div>
</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>
 
</form>
<style type="text/css">
+
</html><css>
  
#pEBC {
+
#pEBC-toolbar {
padding: 10px;
+
    margin-top: 10px;
 +
    margin-bottom: 10px;
 
}
 
}
  
#pEBC-toolbar {
+
#pEBC-info {
margin-top: 10px;
+
    clear: both;
margin-bottom: 10px;
+
    padding-top: 10px;
 
}
 
}
  
#pEBC-tabs {
+
#pEBC-tab-config,
clear: both;
+
#pEBC-tab-group,
 +
#pEBC-tab-button {
 +
    background-color: #FFFFFF;
 +
    border: 1px solid #BBBBBB;
 +
    margin-top: -1px;
 
}
 
}
  
 
#pEBC table {
 
#pEBC table {
width: 100%;
+
    width: 100%;
border-spacing: 0px;
+
    border-spacing: 0px;
 
}
 
}
  
 
#pEBC td {
 
#pEBC td {
border-bottom: 1px solid #DDDDDD;
+
    border-top: 1px solid #DDDDDD;
padding: 5px;
+
    padding: 5px;
vertical-align: top;
+
    vertical-align: top;
 +
}
 +
 
 +
#pEBC tr:first-child td {
 +
    border-top: none;
 
}
 
}
  
 
.pEBC-defaultCol {
 
.pEBC-defaultCol {
width: 110px;
+
    width: 110px;
 
}
 
}
  
 
.pEBC-inputCol {
 
.pEBC-inputCol {
width: 300px;
+
    width: 300px;
 
}
 
}
  
 
.pEBC-assignCol {
 
.pEBC-assignCol {
width: 170px;
+
    width: 170px;
 +
    display: none; /* Gibt es noch nicht */
 
}
 
}
  
 
.pEBC-descCol p {
 
.pEBC-descCol p {
font-size: 85%;
+
    font-size: 85%;
margin-bottom: 0px;
+
    margin-bottom: 0px;
 
}
 
}
  
 
.pEBC-descCol p:first-child {
 
.pEBC-descCol p:first-child {
font-size: 100%;
+
    font-size: 100%;
font-weight: bold;
+
    font-weight: bold;
margin-top: 0px;
+
    margin-top: 0px;
 
}
 
}
  
 
.pEBC-inputCol textarea,
 
.pEBC-inputCol textarea,
 
.pEBC-inputCol select {
 
.pEBC-inputCol select {
width: 100%;
+
    width: 100%;
 
}
 
}
  
</style>
+
</css><js>
<script type="text/javascript">
 
  
 
var pEBC = {
 
var pEBC = {
  
defaultConfig: {},
+
    defaultConfig: {},
+
 
userConfig: {},
+
    userConfig: {},
+
 
form: {
+
    form: {
config: {},
+
        config: {},
groups: {},
+
        groups: {},
buttons: {}
+
        buttons: {}
},
+
    },
+
 
selectedGroup: null,
+
    selectedGroup: null,
+
 
selectedButton: null,
+
    selectedButton: null,
+
 
init: function() {
+
    init: function() {
pEBC.defaultConfig = {
+
        pEBC.defaultConfig = {
config: gEditButtons.config,
+
            config: gEditButtons.config,
groups: gEditButtons.groups,
+
            groups: gEditButtons.groups,
buttons: gEditButtons.buttons
+
            buttons: gEditButtons.buttons
};
+
        };
pEBC.userConfig = $.parseJSON( mw.user.options.get( 'userjs-editbuttons' ) ) || {
+
        pEBC.userConfig = $.parseJSON( mw.user.options.get( 'userjs-editbuttons' ) ) || {
config: {},
+
            config: {},
groups: {},
+
            groups: {},
buttons: {}
+
            buttons: {}
};
+
        };
+
 
pEBC.setForm();
+
        pEBC.setForm();
},
+
    },
+
 
setForm: function() {
+
    setForm: function() {
var form = pEBC.form;
+
        var form = pEBC.form;
+
 
// Erst die Standard- und dann die Benutzerkonfiguration abarbeiten
+
        // Erst die Standard- und dann die Benutzerkonfiguration abarbeiten
$.each( ['defaultConfig', 'userConfig'], function( i, e ) {
+
        $.each( ['defaultConfig', 'userConfig'], function( i, e ) {
var cur = pEBC[e];
+
            var cur = pEBC[e];
+
 
// Wir übernehmen die allgemeinen Einstellungen Schritt für Schritt
+
            // Wir übernehmen die allgemeinen Einstellungen Schritt für Schritt
var config = cur.config;
+
            var config = cur.config;
$.each( ['groupOrder', 'marginButtons', 'marginGroups', 'showAllPages'], function( i2, e2 ) {
+
            $.each( ['groupOrder', 'marginButtons', 'marginGroups', 'showAllPages'], function( i2, e2 ) {
if ( config[e2] !== undefined && config[e2] !== null ) {
+
                if ( config[e2] !== undefined && config[e2] !== null ) {
// showAllPages ist ein Array mit Seitentiteln
+
                    // showAllPages ist ein Array mit Seitentiteln
if ( e2 === 'showAllPages' ) {
+
                    if ( e2 === 'showAllPages' ) {
form.config[e2] = config[e2].join( '\n' ).replace( / /g, '_' );
+
                        form.config[e2] = config[e2].join( '\n' ).replace( / /g, '_' );
}
+
                    }
else {
+
                    else {
form.config[e2] = config[e2];
+
                        form.config[e2] = config[e2];
}
+
                    }
// Wenn die Eigenschaft in der Benutzerkonfiguration existiert, entspricht sie nicht dem Standard
+
                    // Wenn die Eigenschaft in der Benutzerkonfiguration existiert, entspricht sie nicht dem Standard
form.config[e2 + '-default'] = ( e === 'userConfig' ) ? '' : '1';
+
                    form.config[e2 + '-default'] = ( e === 'userConfig' ) ? '' : '1';
}
+
                }
} );
+
            } );
+
 
// Nun die Gruppen
+
            // Nun die Gruppen
$.each( cur.groups, function( i2, e2 ) {
+
            $.each( cur.groups, function( i2, e2 ) {
var group = e2;
+
                var group = e2;
+
 
// Wenn das Gruppenobjekt im Formular noch nicht existiert, legen wir es an
+
                // Wenn das Gruppenobjekt im Formular noch nicht existiert, legen wir es an
if ( !form.groups[i2] ) {
+
                if ( !form.groups[i2] ) {
// Mit Standardwerten füllen (buttonOrder brauchen wir nicht, da es nicht direkt angezeigt wird)
+
                    // Mit Standardwerten füllen (buttonOrder brauchen wir nicht, da es nicht direkt angezeigt wird)
form.groups[i2] = {
+
                    form.groups[i2] = {
id: i2,
+
                        id: i2,
name: '',
+
                        name: '',
css: '',
+
                        css: '',
hardcoded: pEBC.defaultConfig.groups[i2] ? true : false // Wenn die Gruppe in der Standardkonfiguration existiert, ist sie hardcodiert
+
                        hardcoded: pEBC.defaultConfig.groups[i2] ? true : false // Wenn die Gruppe in der Standardkonfiguration existiert, ist sie hardcodiert
};
+
                    };
}
+
                }
+
 
// Jede Gruppeneigenschaft einzeln übernehmen
+
                // Jede Gruppeneigenschaft einzeln übernehmen
$.each( ['buttonOrder', 'name', 'css'], function( i3, e3 ) {
+
                $.each( ['buttonOrder', 'name', 'css'], function( i3, e3 ) {
if ( group[e3] !== undefined && group[e3] !== null ) {
+
                    if ( group[e3] !== undefined && group[e3] !== null ) {
form.groups[i2][e3] = group[e3];
+
                        form.groups[i2][e3] = group[e3];
form.groups[i2][e3 + '-default'] = ( e === 'userConfig' ) ? '' : '1';
+
                        form.groups[i2][e3 + '-default'] = ( e === 'userConfig' ) ? '' : '1';
}
+
                    }
} );
+
                } );
} );
+
            } );
} );
+
        } );
+
 
// Die Buttons müssen auf andere Weise übernommen werden
+
        // Die Buttons müssen auf andere Weise übernommen werden
var buttons = [];
+
        var buttons = [];
$.each( pEBC.defaultConfig.buttons, function( i ) {
+
        $.each( pEBC.defaultConfig.buttons, function( i ) {
buttons.push( i );
+
            buttons.push( i );
} );
+
        } );
$.each( pEBC.userConfig.buttons, function( i ) {
+
        $.each( pEBC.userConfig.buttons, function( i ) {
buttons.push( i );
+
            buttons.push( i );
} );
+
        } );
+
 
$.each( buttons, function( i, e ) {
+
        $.each( buttons, function( i, e ) {
form.buttons[e] = {
+
            form.buttons[e] = {
id: e,
+
                id: e,
hardcoded: pEBC.defaultConfig.buttons[e] ? true : false
+
                hardcoded: pEBC.defaultConfig.buttons[e] ? true : false
};
+
            };
+
 
var button = form.buttons[e];
+
            var button = form.buttons[e];
+
 
// Standardwerte prüfen
+
            // Standardwerte prüfen
if ( pEBC.userConfig.buttons[e] ) {
+
            if ( pEBC.userConfig.buttons[e] ) {
$.each( pEBC.userConfig.buttons[e], function( i2, e2 ) {
+
                $.each( pEBC.userConfig.buttons[e], function( i2, e2 ) {
if ( e2 !== null ) {
+
                    if ( e2 !== null ) {
switch ( i2 ) {
+
                        switch ( i2 ) {
case 'actionType':
+
                            case 'actionType':
case 'actionText':
+
                            case 'actionText':
i2 = 'action';
+
                                i2 = 'action';
break;
+
                                break;
case 'namespacesIn':
+
                            case 'namespacesIn':
case 'namespacesEx':
+
                            case 'namespacesEx':
case 'userGroupsIn':
+
                            case 'userGroupsIn':
case 'userGroupsEx':
+
                            case 'userGroupsEx':
case 'pageTypesIn':
+
                            case 'pageTypesIn':
case 'pageTypesEx':
+
                            case 'pageTypesEx':
case 'contextsIn':
+
                            case 'contextsIn':
case 'contextsEx':
+
                            case 'contextsEx':
i2 = i2.slice( 0, -2 );
+
                                i2 = i2.slice( 0, -2 );
break;
+
                                break;
case 'disabled':
+
                            case 'disabled':
break;
+
                                break;
}
+
                        }
button[i2 + '-default'] = '';
+
                        button[i2 + '-default'] = '';
}
+
                    }
} );
+
                } );
}
+
            }
+
 
pEBC.assignButtonProps( e );
+
            pEBC.assignButtonProps( e );
} );
+
        } );
},
+
    },
+
 
assignButtonProps: function( e, newButton ) {
+
    assignButtonProps: function( e, newButton ) {
var form = pEBC.form;
+
        var form = pEBC.form;
var button = form.buttons[e];
+
        var button = form.buttons[e];
var objects = [gEditButtons.EditButton.prototype];
+
        var objects = [gEditButtons.EditButton.prototype];
if ( !newButton ) {
+
        if ( !newButton ) {
objects.push( pEBC.defaultConfig.buttons[e] );
+
            objects.push( pEBC.defaultConfig.buttons[e] );
objects.push( pEBC.userConfig.buttons[e] );
+
            objects.push( pEBC.userConfig.buttons[e] );
}
+
        }
$.each( objects, function( i2, e2 ) {
+
        $.each( objects, function( i2, e2 ) {
// Abbruch, wenn kein Objekt
+
            // Abbruch, wenn kein Objekt
if ( e2 === undefined ) {
+
            if ( e2 === undefined ) {
return;
+
                return;
}
+
            }
+
 
// Einfache Werte
+
            // Einfache Werte
$.each( ['group', 'title', 'width', 'height', 'fgImage', 'fgImageWidth', 'bgImage', 'bgImageWidth', 'bgColor', 'condition', 'label', 'css', 'disabled', 'actionType'], function( i3, e3 ) {
+
            $.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 ) {
+
                if ( e2[e3] !== undefined && e2[e3] !== null ) {
button[e3] = e2[e3];
+
                    button[e3] = e2[e3];
}
+
                }
} );
+
            } );
+
 
// Zusammenfassung
+
            // Zusammenfassung
if ( typeof e2.summary === 'string' ) {
+
            if ( typeof e2.summary === 'string' ) {
button.summary = e2.summary;
+
                button.summary = e2.summary;
}
+
            }
else if ( $.type( e2.summary ) === 'array' ) {
+
            else if ( $.type( e2.summary ) === 'array' ) {
button.summary = e2.summary.join( '\n' );
+
                button.summary = e2.summary.join( '\n' );
}
+
            }
+
 
// Erlaubnisauswahlfelder
+
            // Erlaubnisauswahlfelder
$.each( ['namespacesIn', 'namespacesEx', 'userGroupsIn', 'userGroupsEx', 'pageTypesIn', 'pageTypesEx', 'contextsIn', 'contextsEx'], function( i3, e3 ) {
+
            $.each( ['namespacesIn', 'namespacesEx', 'userGroupsIn', 'userGroupsEx', 'pageTypesIn', 'pageTypesEx', 'contextsIn', 'contextsEx'], function( i3, e3 ) {
if ( e2[e3] !== undefined && e2[e3] !== null ) {
+
                if ( e2[e3] !== undefined && e2[e3] !== null ) {
button[e3] = ( e2[e3] === true || e2[e3] === false ) ? ['!'] : e2[e3];
+
                    button[e3] = ( e2[e3] === true || e2[e3] === false ) ? ['!'] : e2[e3];
}
+
                }
} );
+
            } );
+
 
// Aktionstext
+
            // Aktionstext
if ( typeof e2.actionText === 'string' || typeof e2.actionText === 'object' && e2.actionText.length === 1 ) {
+
            if ( typeof e2.actionText === 'string' || typeof e2.actionText === 'object' && e2.actionText.length === 1 ) {
button.actionText0 = e2.actionText;
+
                button.actionText0 = e2.actionText;
button.actionText1 = '';
+
                button.actionText1 = '';
button.actionText2 = '';
+
                button.actionText2 = '';
}
+
            }
else if ( $.type( e2.actionText ) === 'array' ) {
+
            else if ( $.type( e2.actionText ) === 'array' ) {
button.actionText0 = e2.actionText[0];
+
                button.actionText0 = e2.actionText[0];
button.actionText1 = e2.actionText[1];
+
                button.actionText1 = e2.actionText[1];
button.actionText2 = e2.actionText[2];
+
                button.actionText2 = e2.actionText[2];
}
+
            }
} );
+
        } );
},
+
    },
+
 
execute: function() {
+
    execute: function() {
gEditButtons.getButtons( 'config' );
+
        gEditButtons.getButtons( 'config' );
pEBC.createTables();
+
        pEBC.createTables();
var groups = '';
+
        var groups = '';
$.each( pEBC.form.groups, function( i, e ) {
+
        $.each( pEBC.form.groups, function( i, e ) {
groups += '<option value="' + i + '">' + e.name + '</option>';
+
            groups += '<option value="' + i + '">' + e.name + '</option>';
} );
+
        } );
document.pEBC['button-group'].innerHTML = groups;
+
        document.pEBC['button-group'].innerHTML = groups;
pEBC.fillConfigTable();
+
        pEBC.fillConfigTable();
$( '.pEBC-defaultCol, .pEBC-inputCol' ).find( 'input:not(:button), select, textarea' ).on( 'change keyup', pEBC.change );
+
        $( '#pEBC-row-group-move .pEBC-inputCol input' ).click( pEBC.moveGroup );
$( '#pEBC-submit-save' ).click( pEBC.save );
+
        $( '#pEBC-row-button-move .pEBC-inputCol input' ).click( pEBC.moveButton );
$( '#pEBC-submit-reset' ).click( pEBC.reset );
+
        $( '.pEBC-defaultCol, .pEBC-inputCol' ).find( 'input:not(:button), select, textarea' ).on( 'change keyup', pEBC.change );
$( '#pEBC-submit-newGroup' ).click( pEBC.newGroup );
+
        $( '#pEBC-toggleAdvanced' ).on( 'change', pEBC.toggleAdvanced );
$( '#pEBC-submit-newButton' ).click( pEBC.newButton );
+
        $( '#pEBC-submit-save' ).click( pEBC.save );
$( '#pEBC' ).show();
+
        $( '#pEBC-submit-reset' ).click( pEBC.reset );
},
+
        $( '#pEBC-submit-newGroup' ).click( pEBC.newGroup );
+
        $( '#pEBC-submit-newButton' ).click( pEBC.newButton );
select: function( button ) {
+
        $( '#pEBC' ).removeClass( 'ui-widget-content' ).show();
var form = pEBC.form;
+
        $( '#pEBC-pleaseWait' ).remove();
var id = button.getAttribute( 'data-id' );
+
    },
var group = form.buttons[id].group;
+
 
pEBC.selectedButton = id;
+
    select: function( button ) {
pEBC.selectedGroup = group;
+
        var form = pEBC.form;
addCSS( '#pEBC-toolbar .editButton-' + id + ' { outline: 2px solid red; position: relative; z-index: 1; }', 'pEBC-selectedCSS' );
+
        var id = button.getAttribute( 'data-id' );
pEBC.fillGroupTable();
+
        var group = form.buttons[id].group;
pEBC.fillButtonTable();
+
        pEBC.selectedButton = id;
},
+
        pEBC.selectedGroup = group;
+
        addCSS( '#pEBC-toolbar .editButton-' + id + ' { outline: 2px solid red; position: relative; z-index: 1; }', 'pEBC-selectedCSS' );
createTables: function() {
+
        pEBC.fillGroupTable();
function link( page, text ) {
+
        pEBC.fillButtonTable();
var html = '<a href="' +
+
    },
mw.util.getUrl( page ) +
+
 
'" title="' +
+
    createTables: function() {
mw.html.escape( page ) +
+
        function link( page, text ) {
'">' +
+
            var html = '<a href="' +
( ( text === undefined ) ? mw.html.escape( page ) : text ) +
+
                mw.util.getUrl( page ) +
'</a>';
+
                '" title="' +
return html;
+
                mw.html.escape( page ) +
}
+
                '">' +
+
                ( ( text === undefined ) ? mw.html.escape( page ) : text ) +
var cr = pEBC.createRow;
+
                '</a>';
+
            return html;
const TEXT = 0;
+
        }
const NUMBER = 1;
+
 
const AREA = 2;
+
        var cr = pEBC.createRow;
+
 
const ADVANCED = 1;
+
        const TEXT = 0;
const DISABLED = 2;
+
        const NUMBER = 1;
const NOASSIGN = 4;
+
        const AREA = 2;
const NODEFAULT = 8;
+
 
+
        const ADVANCED = 1;
var namespaceSelector = '<option value="!">(keine Angabe)</option>';
+
        const DISABLED = 2;
var namespaceCount = 1;
+
        const NOASSIGN = 4;
$.each( mw.config.get( 'wgFormattedNamespaces' ), function( i, e ) {
+
        const NODEFAULT = 8;
if ( i >= 0 ) {
+
 
var name = ( i === '0' ) ? '(Hauptraum)' : e;
+
        var namespaceSelector = '<option value="!">(keine Angabe)</option>';
namespaceSelector += '<option value="' + i + '">' + name + '</option>';
+
        var namespaceCount = 1;
namespaceCount++;
+
        $.each( mw.config.get( 'wgFormattedNamespaces' ), function( i, e ) {
}
+
            if ( i >= 0 ) {
} );
+
                var name = ( i === '0' ) ? '(Hauptraum)' : e;
if ( namespaceCount > 5 ) {
+
                namespaceSelector += '<option value="' + i + '">' + name + '</option>';
namespaceCount = 5;
+
                namespaceCount++;
}
+
            }
+
        } );
var pageTypeSelector = '<option value="!">(keine Angabe)</option>';
+
        if ( namespaceCount > 5 ) {
var pageTypeCount = 1;
+
            namespaceCount = 5;
$.each( {
+
        }
subject: 'Inhaltsseiten',
+
 
talk: 'Diskussionsseiten',
+
        var pageTypeSelector = '<option value="!">(keine Angabe)</option>';
css: 'CSS-Seiten',
+
        var pageTypeCount = 1;
js: 'JavaScript-Seiten'
+
        $.each( {
}, function( i, e ) {
+
            subject: 'Inhaltsseiten',
pageTypeSelector += '<option value="' + i + '">' + e + '</option>';
+
            talk: 'Diskussionsseiten',
pageTypeCount++;
+
            css: 'CSS-Seiten',
} );
+
            js: 'JavaScript-Seiten'
if ( pageTypeCount > 5 ) {
+
        }, function( i, e ) {
pageTypeCount = 5;
+
            pageTypeSelector += '<option value="' + i + '">' + e + '</option>';
}
+
            pageTypeCount++;
+
        } );
var userGroupSelector = '<option value="!">(keine Angabe)</option>';
+
        if ( pageTypeCount > 5 ) {
var userGroupCount = 1;
+
            pageTypeCount = 5;
$.each( global.groups.names, function( i, e ) {
+
        }
userGroupSelector += '<option value="' + i + '">' + e + '</option>';
+
 
userGroupCount++;
+
        var userGroupSelector = '<option value="!">(keine Angabe)</option>';
} );
+
        var userGroupCount = 1;
if ( userGroupCount > 5 ) {
+
        $.each( global.groups.names, function( i, e ) {
userGroupCount = 5;
+
            userGroupSelector += '<option value="' + i + '">' + e + '</option>';
}
+
            userGroupCount++;
+
        } );
var contextSelector = '<option value="!">(keine Angabe)</option>';
+
        if ( userGroupCount > 5 ) {
var contextCount = 1;
+
            userGroupCount = 5;
$.each( gEditButtons.contexts, function( i, e ) {
+
        }
if ( i !== 'config' ) {
+
 
contextSelector += '<option value="' + i + '">' + e.name + '</option>';
+
        var contextSelector = '<option value="!">(keine Angabe)</option>';
contextCount++;
+
        var contextCount = 1;
}
+
        $.each( gEditButtons.contexts, function( i, e ) {
} );
+
            if ( i !== 'config' ) {
if ( contextCount > 5 ) {
+
                contextSelector += '<option value="' + i + '">' + e.name + '</option>';
contextCount = 5;
+
                contextCount++;
}
+
            }
+
        } );
// Einstellungen
+
        if ( contextCount > 5 ) {
cr(
+
            contextCount = 5;
'config-marginGroups',
+
        }
'Gruppenabstand\nDer Abstand zwischen den Buttongruppen in Pixeln. Gib einfach eine Zahl an.',
+
 
NUMBER
+
        // Einstellungen
);
+
        cr(
cr(
+
            'config-marginGroups',
'config-marginButtons',
+
            'Gruppenabstand\nDer Abstand zwischen den Buttongruppen in Pixeln. Gib einfach eine Zahl an.',
'Buttonabstand\nDer Abstand zwischen den einzelnen Buttons innerhalb einer Gruppe in Pixeln.',
+
            NUMBER
NUMBER
+
        );
);
+
        cr(
cr(
+
            'config-marginButtons',
'config-showAllPages',
+
            'Buttonabstand\nDer Abstand zwischen den einzelnen Buttons innerhalb einer Gruppe in Pixeln.',
'Seiten mit allen Buttons\nAuf diesen Seiten sollen alle Buttons angezeigt werden. Gibt eine pro Zeile an.',
+
            NUMBER
AREA
+
        );
);
+
        cr(
+
            'config-showAllPages',
// Gruppe
+
            'Seiten mit allen Buttons\nAuf diesen Seiten sollen alle Buttons angezeigt werden. Gibt eine pro Zeile an.',
cr(
+
            AREA
'group-move',
+
        );
'Position der Gruppe\nMit diesen beiden Buttons kannst du die Gruppe innerhalb der Toolbar verschieben.',
+
        cr(
'<input type="button" name="group-move-left" value="Nach links" /> <input type="button" name="group-move-right" value="Nach rechts" />',
+
            'config-options',
NOASSIGN | NODEFAULT
+
            '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" /> ' +
cr(
+
                '<label for="pEBC-config-resetGroupOrder">Gruppenreihenfolge zurücksetzen</label>',
'group-id',
+
            NODEFAULT
'ID\nDie ID der Gruppe. Kann nicht geändert werden.',
+
        );
TEXT,
+
 
DISABLED | NODEFAULT
+
        // Gruppe
);
+
        cr(
cr(
+
            'group-move',
'group-name',
+
            'Position der Gruppe\nMit diesen beiden Buttons kannst du die Gruppe innerhalb der Toolbar verschieben.',
'Name\nDer Name der Gruppe. Wird zur Zeit nur für die Auswahlfelder in diesem Gerät benötigt.',
+
            '<input type="button" name="group-move-left" value="Nach links" /> <input type="button" name="group-move-right" value="Nach rechts" />',
TEXT
+
            NOASSIGN | NODEFAULT
);
+
        );
cr(
+
        cr(
'group-css',
+
            'group-id',
'CSS\nZusätzliche Stylesheets für die Gruppe.',
+
            'ID\nDie ID der Gruppe. Kann nicht geändert werden.',
AREA,
+
            TEXT,
ADVANCED
+
            DISABLED | NODEFAULT
);
+
        );
+
        cr(
// Button
+
            'group-name',
cr(
+
            'Name\nDer Name der Gruppe. Wird zur Zeit nur für die Auswahlfelder in diesem Gerät benötigt.',
'button-move',
+
            TEXT
'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" />',
+
        cr(
NOASSIGN | NODEFAULT
+
            'group-css',
);
+
            'CSS\nZusätzliche Stylesheets für die Gruppe.',
cr(
+
            AREA,
'button-id',
+
            ADVANCED
'ID\nDie ID des Buttons. Kann nicht geändert werden.',
+
        );
TEXT,
+
        cr(
DISABLED | NODEFAULT
+
            '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.',
cr(
+
            '<input type="checkbox" name="group-resetButtonOrder" id="pEBC-group-resetButtonOrder" /> ' +
'button-group',
+
                '<label for="pEBC-group-resetButtonOrder">Buttonreihenfolge zurücksetzen</label>' +
'Gruppe\nHier kannst du einstellen, zu welcher Gruppe der Button gehören soll.',
+
                '<br />' +
'<select name="button-group"></select>'
+
                '<input type="checkbox" name="group-reset" id="pEBC-group-reset" /> ' +
);
+
                '<label for="pEBC-group-reset">Gruppe zurücksetzen/löschen</label>',
cr(
+
            NODEFAULT
'button-title',
+
        );
'Beschreibung\nEine kurze Beschreibung, was der Button macht. Wird angezeigt, wenn man mit der Maus über den Button fährt.',
+
 
TEXT
+
        // Button
);
+
        cr(
cr(
+
            'button-move',
'button-label',
+
            'Position des Buttons\nMit diesen beiden Buttons kannst du den Button innerhalb seiner Gruppe verschieben.',
'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.\nWir nur angezeigt, wenn kein Icon angegeben wurde.',
+
            '<input type="button" name="button-move-left" value="Nach links" /> <input type="button" name="button-move-right" value="Nach rechts" />',
TEXT
+
            NOASSIGN | NODEFAULT
);
+
        );
cr(
+
        cr(
'button-fgImage',
+
            'button-id',
'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' ) + '.',
+
            'ID\nDie ID des Buttons. Kann nicht geändert werden.',
TEXT
+
            TEXT,
);
+
            DISABLED | NODEFAULT
cr(
+
        );
'button-fgImageWidth',
+
        cr(
'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.',
+
            'button-group',
NUMBER
+
            'Gruppe\nHier kannst du einstellen, zu welcher Gruppe der Button gehören soll.',
);
+
            '<select name="button-group"></select>'
cr(
+
        );
'button-bgColor',
+
        cr(
'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' ) + '.',
+
            'button-title',
TEXT,
+
            'Beschreibung\nEine kurze Beschreibung, was der Button macht. Wird angezeigt, wenn man mit der Maus über den Button fährt.',
ADVANCED
+
            TEXT
);
+
        );
cr(
+
        cr(
'button-bgImage',
+
            'button-label',
'Hintergrundbild\nButtons haben meist ein Hintergrundbild, in der Regel ' + link( 'Datei:Clear.png', 'Clear.png' ) + '. 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.',
+
            '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,
+
            TEXT
ADVANCED
+
        );
);
+
        cr(
cr(
+
            'button-fgImage',
'button-bgImageWidth',
+
            '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' ) + '.',
'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.',
+
            TEXT
NUMBER
+
        );
);
+
        cr(
cr(
+
            'button-fgImageWidth',
'button-width',
+
            '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.',
'Breite des Buttons\nDer Button selbst ist ein div-Element. Hier kannst du dessen Breite einstellen.',
+
            NUMBER
NUMBER
+
        );
);
+
        cr(
cr(
+
            'button-bgColor',
'button-height',
+
            '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' ) + '.',
'Höhe des Buttons\nHier kannst du die Höhe des Buttons einstellen.',
+
            TEXT,
NUMBER
+
            ADVANCED
);
+
        );
cr(
+
        cr(
'button-action',
+
            'button-bgImage',
'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 Beutzers, 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.' +
+
            '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.',
'</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.' +
+
            TEXT,
'</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.' +
+
            ADVANCED
'</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.' +
+
        cr(
'</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> referenziert auf <i>gEditButtons.context</i>, das ist das Objekt, das die IDs der Toolbar, des Eingabefeldes und der Zusammenfassungszeile des aktuellen Bearbeitungskontextes enthält. 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.',
+
            'button-bgImageWidth',
'<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>' +
+
            '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.',
'<br />' +
+
            NUMBER,
'<textarea name="button-actionText0" rows="5" style="display: block;"></textarea>' +
+
            ADVANCED
'<textarea name="button-actionText1" rows="5" style="display: block;"></textarea>' +
+
        );
'<textarea name="button-actionText2" rows="5" style="display: block;"></textarea>'
+
        cr(
);
+
            'button-width',
cr(
+
            'Breite des Buttons\nDer Button selbst ist ein div-Element. Hier kannst du dessen Breite einstellen.',
'button-summary',
+
            NUMBER,
'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.',
+
            ADVANCED
AREA
+
        );
);
+
        cr(
cr(
+
            'button-height',
'button-namespaces',
+
            'Höhe des Buttons\nHier kannst du die Höhe des Buttons einstellen.',
'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.',
+
            NUMBER,
'<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
ADVANCED
+
        );
);
+
        cr(
cr(
+
            'button-action',
'button-pageTypes',
+
            '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.' +
'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>.',
+
                '</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.' +
'<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>',
+
                '</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.' +
ADVANCED
+
                '</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.' +
cr(
+
                '</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.',
'button-userGroups',
+
            '<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>' +
'Benutzergruppen\nManche Buttons sollen nur bestimmten Benutzergruppen zur Verfügung stehen.',
+
                '<br />' +
'<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>',
+
                '<textarea name="button-actionText0" rows="5" style="display: block;"></textarea>' +
ADVANCED
+
                '<textarea name="button-actionText1" rows="5" style="display: block;"></textarea>' +
);
+
                '<textarea name="button-actionText2" rows="5" style="display: block;"></textarea>'
cr(
+
        );
'button-contexts',
+
        cr(
'Bearbeitungskontexte\nJeder Kontexte 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.',
+
            'button-summary',
'<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>',
+
            '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.',
ADVANCED
+
            AREA
);
+
        );
cr(
+
        cr(
'button-condition',
+
            'button-pageTypes',
'Erweiterte Konditionen\nFalls die Auswahlfelder da oben nicht ausreichen, kannst du hier eine Funktion angeben, ',
+
            '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>.',
AREA,
+
            '<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
+
            ADVANCED
);
+
        );
cr(
+
        cr(
'button-css',
+
            'button-namespaces',
'CSS\nDu kannst für jeden Button eigene Stylesheets angeben, um ihn genauer zu modifizieren.',
+
            '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.',
AREA,
+
            '<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
+
            ADVANCED
);
+
        );
cr(
+
        cr(
'button-options',
+
            'button-userGroups',
'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. Das kann nicht rückgängig gemacht werden.\nSelbst erstellt Buttons kann man wieder löschen. Die sind dann komplett und unwiderruflich weg.',
+
            'Benutzergruppen\nManche Buttons sollen nur bestimmten Benutzergruppen zur Verfügung stehen.',
'<input type="checkbox" name="button-disabled" id="pEBC-button-disabled" /> <label for="pEBC-button-disabled">Button deaktivieren</label><br /><input type="button" name="button-delete" value="Zurücksetzen/Löschen" />',
+
            '<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>',
NODEFAULT
+
            ADVANCED
);
+
        );
},
+
        cr(
+
            'button-contexts',
createRow: function( name, desc, input, flags ) {
+
            '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.',
if ( flags === undefined ) {
+
            '<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>',
flags = 0;
+
            ADVANCED
}
+
        );
var advanced = ( flags & 1 ) ? ' class="pEBC-advancedRow"' : '';
+
        cr(
var disabled = ( flags & 2 ) ? ' disabled="disabled"' : '';
+
            'button-condition',
// Eingabezeile
+
            '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.',
if ( input === 0 || input === undefined ) {
+
            AREA,
input = '<input type="text" name="' + name + '"' + disabled + ' />';
+
            ADVANCED
}
+
        );
// Numerisches Input
+
        cr(
else if ( input === 1 ) {
+
            'button-css',
input = '<input type="number" name="' + name + '"' + disabled + ' />';
+
            'CSS\nDu kannst für jeden Button eigene Stylesheets angeben, um ihn genauer zu modifizieren.',
}
+
            AREA,
// Großes Textfeld
+
            ADVANCED
else if ( input === 2 ) {
+
        );
input = '<textarea name="' + name + '"' + disabled + ' rows="5"></textarea>';
+
        cr(
}
+
            'button-options',
// Standardwertspalte
+
            '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.',
var defaultCol = '';
+
            '<input type="checkbox" name="button-disabled" id="pEBC-button-disabled" /> ' +
if ( ~flags & 2 && ~flags & 8 ) {
+
                '<label for="pEBC-button-disabled">Button ist deaktiviert</label>' +
defaultCol = '<select name="' + name + '-default" size="2"><option value="1">Standard</option><option value="">Wie definiert:</option></select>';
+
                '<br />' +
}
+
                '<input type="checkbox" name="button-reset" id="pEBC-button-reset" /> ' +
// Zuweisungsspalte
+
                '<label for="pEBC-button-reset">Button zurücksetzen/löschen</label>',
var assignCol = '';
+
            NODEFAULT
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;
+
    createRow: function( name, desc, input, flags ) {
}
+
        if ( flags === undefined ) {
}
+
            flags = 0;
// HTML
+
        }
var html = '<tr id="pEBC-row-' + name + '"' + advanced + '>' +
+
        var advanced = ( flags & 1 ) ? ' class="pEBC-advancedRow" style="display: none;"' : '';
'<td class="pEBC-descCol">' +
+
        var disabled = ( flags & 2 ) ? ' disabled="disabled"' : '';
'<p>' + desc.replace( /\n/g, '</p><p>' ) + '</p>' +
+
        // Eingabezeile
'</td>' +
+
        if ( input === 0 || input === undefined ) {
'<td class="pEBC-defaultCol">' + defaultCol + '</td>' +
+
            input = '<input type="text" name="' + name + '"' + disabled + ' />';
'<td class="pEBC-inputCol">' + input + '</td>' +
+
        }
'<td class="pEBC-assignCol">' + assignCol + '</td>' +
+
        // Numerisches Input
'</tr>';
+
        else if ( input === 1 ) {
var obj = $( html );
+
            input = '<input type="number" name="' + name + '"' + disabled + ' />';
obj.appendTo( '#pEBC-tab-' + name.split( '-' )[0] + ' table' );
+
        }
return obj;
+
        // Großes Textfeld
},
+
        else if ( input === 2 ) {
+
            input = '<textarea name="' + name + '"' + disabled + ' rows="5"></textarea>';
fillConfigTable: function() {
+
        }
$.each( ['marginGroups', 'marginButtons', 'showAllPages'], function( i, e ) {
+
        // Standardwertspalte
document.pEBC['config-' + e].value = pEBC.form.config[e];
+
        var defaultCol = '';
pEBC.setDefaultField( 'config-' + e );
+
        if ( ~flags & 2 && ~flags & 8 ) {
} );
+
            defaultCol = '<select name="' + name + '-default" size="2"><option value="1">Standard</option><option value="">Wie definiert:</option></select>';
},
+
        }
+
        // Zuweisungsspalte
fillGroupTable: function() {
+
        var assignCol = '';
$.each( ['id', 'name', 'css'], function( i, e ) {
+
        if ( ~flags & 2 && ~flags & 4 && name.indexOf( 'config-' ) !== 0 ) {
document.pEBC['group-' + e].value = pEBC.form.groups[pEBC.selectedGroup][e];
+
            assignCol = '<input type="button" name="' + name + '-assignAll" value="Für alle übernehmen" />';
pEBC.setDefaultField( 'group-' + e );
+
            if ( name.indexOf( 'button-' ) === 0 ) {
} );
+
                assignCol = '<input type="button" name="' + name + '-assignGroup" value="Für Gruppe übernehmen" /><br />' + assignCol;
$( '#pEBC-tab-group .pEBC-noSelection' ).hide();
+
            }
$( '#pEBC-tab-group table' ).show();
+
        }
},
+
        // HTML
+
        var html = '<tr id="pEBC-row-' + name + '"' + advanced + '>' +
fillButtonTable: function() {
+
            '<td class="pEBC-descCol">' +
$.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 ) {
+
                '<p>' + desc.replace( /\n/g, '</p><p>' ) + '</p>' +
document.pEBC['button-' + e].value = pEBC.form.buttons[pEBC.selectedButton][e];
+
            '</td>' +
pEBC.setDefaultField( 'button-' + e );
+
            '<td class="pEBC-defaultCol">' + defaultCol + '</td>' +
} );
+
            '<td class="pEBC-inputCol">' + input + '</td>' +
pEBC.displayActionFields( pEBC.form.buttons[pEBC.selectedButton].actionType );
+
            '<td class="pEBC-assignCol">' + assignCol + '</td>' +
pEBC.setDefaultField( 'button-action' );
+
            '</tr>';
pEBC.setDefaultField( 'button-namespaces' );
+
        var obj = $( html );
pEBC.setDefaultField( 'button-pageTypes' );
+
        obj.appendTo( '#pEBC-tab-' + name.split( '-' )[0] + ' table' );
pEBC.setDefaultField( 'button-userGroups' );
+
        return obj;
pEBC.setDefaultField( 'button-contexts' );
+
    },
document.pEBC['button-disabled'].checked = pEBC.form.buttons[pEBC.selectedButton].disabled;
+
 
$( '#pEBC-tab-button .pEBC-noSelection' ).hide();
+
    fillConfigTable: function() {
$( '#pEBC-tab-button table' ).show();
+
        $.each( ['marginGroups', 'marginButtons', 'showAllPages'], function( i, e ) {
},
+
            document.pEBC['config-' + e].value = pEBC.form.config[e];
+
            pEBC.setDefaultField( 'config-' + e );
setDefaultField: function( name ) {
+
        } );
name = name.split( '-' );
+
    },
var hardcoded = true;
+
 
if ( name[0] === 'config' ) {
+
    fillGroupTable: function() {
var value = pEBC.form.config[name[1] + '-default'];
+
        $.each( ['id', 'name', 'css'], function( i, e ) {
}
+
            document.pEBC['group-' + e].value = pEBC.form.groups[pEBC.selectedGroup][e];
else {
+
            pEBC.setDefaultField( 'group-' + e );
var obj = pEBC.form[name[0] + 's'][pEBC['selected' + $.ucFirst( name[0] )]];
+
        } );
var value = obj[name[1] + '-default'];
+
        document.pEBC['group-reset'].checked = pEBC.form.groups[pEBC.selectedGroup].reset;
if ( !obj.hardcoded ) {
+
        pEBC.checkPosition( $( '#pEBC-toolbar .buttonGroup-' + pEBC.selectedGroup ), 'group' );
hardcoded = false;
+
        $( '#pEBC-tab-group .pEBC-noSelection' ).hide();
}
+
        $( '#pEBC-tab-group table' ).show();
}
+
        pEBC.refreshInfoField();
value = ( value === '' || !hardcoded ) ? '' : '1';
+
    },
var element = document.pEBC[name[0] + '-' + name[1] + '-default'];
+
 
if ( element ) {
+
    fillButtonTable: function() {
element.value = value;
+
        $.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 ) {
element.disabled = !hardcoded;
+
            $( 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;
 +
        }
  
displayActionFields: function( type ) {
+
        form.groups[id] = {
var display = ( type === '0' || type === 0 ) ? 'block' : 'none';
+
            id: id,
$( '#pEBC-row-button-action .pEBC-button-action-desc:not(:eq(' + type + '))' ).hide();
+
            name: '',
$( '#pEBC-row-button-action .pEBC-button-action-desc:eq(' + type + ')' ).show();
+
            css: '',
document.pEBC['button-actionText1'].style.display = display;
+
            buttonOrder: []
document.pEBC['button-actionText2'].style.display = display;
+
        };
},
+
        $( '<span class="buttonGroup buttonGroup-' + id + '" data-id="' + id + '" />' ).appendTo( '#pEBC-toolbar' );
+
        $( '#pEBC-toolbar .editButton:last' ).addClass( 'lastEditButton' );
change: function() {
+
        $( document.pEBC['button-group'] ).append( '<option value="' + id + '"></option>' );
var name = this.getAttribute( 'name' ).split( '-' );
+
        $( '#pEBC-tab-button .pEBC-noSelection' ).show();
var value = this.value;
+
        $( '#pEBC-tab-button > table' ).hide();
var tab = name[0];
+
        addCSS( '', 'pEBC-selectedCSS' );
var prop = name[2] ? name[1] + '-' + name[2] : name[1];
+
        pEBC.selectedGroup = id;
+
        pEBC.selectedButton = null;
if ( tab === 'config' ) {
+
        pEBC.fillGroupTable();
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' ) {
 
obj[prop] = value;
 
pEBC.refreshConfig();
 
}
 
else if ( tab === 'group' ) {
 
obj[prop] = value;
 
pEBC.refreshGroup();
 
}
 
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':
 
obj['disabled'] = this.checked;
 
break;
 
default:
 
obj[prop] = value;
 
pEBC.refreshButton( prop );
 
break;
 
}
 
}
 
},
 
 
refreshConfig: function() {
 
var css = '';
 
  
// Buttonabweichung
+
    newButton: function( e ) {
var marginButtons = ( pEBC.form.config['marginButtons-default'] ) ? pEBC.defaultConfig.config.marginButtons : pEBC.form.config.marginButtons;
+
        e.preventDefault();
css += '#pEBC-toolbar .editButton { margin-right: ' + marginButtons + 'px; margin-bottom: ' + marginButtons + 'px; }';
 
  
// Gruppenabweichung (letzter Button)
+
        var form = pEBC.form;
var marginGroups = ( pEBC.form.config['marginGroups-default'] ) ? pEBC.defaultConfig.config.marginGroups : pEBC.form.config.marginGroups;
+
        var group = pEBC.selectedGroup || 'default';
css += '#pEBC-toolbar .editButton.lastEditButton { margin-right: ' + marginGroups + 'px; }';
 
  
addCSS( css, 'pEBC-toolbarCSS' );
+
        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.' );
refreshGroup: function() {
+
            return;
var group = pEBC.selectedGroup;
+
        }
var css = '';
+
 
if ( pEBC.form.groups[group]['css-default'] ) {
+
        form.buttons[id] = {
if ( gEditButtons.groups[group] ) {
+
            id: id
css = String( gEditButtons.groups[group].css || '' ).replace( /[\r\n]/g, ' ' );
+
        };
}
+
        var button = new gEditButtons.EditButton( form.buttons[id] );
}
+
        pEBC.assignButtonProps( id, true );
else {
+
        form.buttons[id].group = group;
css = pEBC.form.groups[group].css.replace( /[\r\n]/g, ' ' );
+
        form.buttons[id]['group-default'] = '';
}
+
        button = button.getButton( 'config' );
$( '#pEBC-toolbar .buttonGroup-' + group ).attr( 'style', css );
+
        $( '#pEBC-toolbar .buttonGroup-' + group + ' .editButton:last' ).removeClass( 'lastEditButton' );
},
 
 
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 '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;
 
}
 
},
 
 
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 + '" />' ).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;
 
button = button.getButton( 'config' );
 
 
         button.addClass( 'lastEditButton' ).appendTo( '#pEBC-toolbar .buttonGroup-' + group );
 
         button.addClass( 'lastEditButton' ).appendTo( '#pEBC-toolbar .buttonGroup-' + group );
$( '#pEBC-toolbar .editButton:last' ).removeClass( 'lastEditButton' );
 
 
         pEBC.select( button.get()[0] );
 
         pEBC.select( button.get()[0] );
},
+
    },
/*
+
 
moveGroup: function( e ) {
+
    moveGroup: function( e ) {
e.preventDefault();
+
        e.preventDefault();
+
 
var direction = this.getAttribute( 'name' ).slice( 11 );
+
        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 + '"]' );
+
 
response: function( data, button, jqxhr ) {
+
        if ( direction === 'left' ) {
if ( !data ) {
+
            obj.after( obj.prev( '.buttonGroup' ) );
alert( 'Konnte nicht speichern. HTTP-Statuscode ' + jqxhr.status + ': ' + jqxhr.statusText );
+
            option.after( option.prev( 'option' ) );
}
+
        }
else if ( data.error ) {
+
        else {
alert( 'Konnte nicht speichern. API-Fehlercode ' + data.error.code + ': ' + data.error.text );
+
            obj.before( obj.next( '.buttonGroup' ) );
}
+
            option.before( option.next( 'option' ) );
button.disabled = false;
+
        }
},
+
        pEBC.checkPosition( obj, 'group' );
+
        pEBC.form.config.groupOrder = [];
exportJSON: function( e ) {
+
        $( '#pEBC-toolbar .buttonGroup' ).each( function( i, e ) {
e.preventDefault();
+
            pEBC.form.config.groupOrder.push( e.getAttribute( 'data-id' ) );
},
+
        } );
+
        $( '#pEBC-toolbar .buttonGroup .editButton:last-child' ).addClass( 'lastEditButton' );
getData: function() {
+
        $( '#pEBC-toolbar .buttonGroup:last-child .editButton:last-child' ).removeClass( 'lastEditButton' );
function changed( obj, prop ) {
+
    },
return ( obj[prop + '-default'] === '' || !obj.hardcoded );
+
 
}
+
    moveButton: function( e ) {
+
        e.preventDefault();
var form = pEBC.form;
+
 
var data = {
+
        var direction = this.getAttribute( 'name' ).slice( 12 );
config: {},
+
        var obj = $( '#pEBC-toolbar .editButton-' + pEBC.selectedButton );
groups: {},
+
 
buttons: {}
+
        if ( direction === 'left' ) {
};
+
            obj.after( obj.prev( '.editButton' ) );
+
        }
$.each( ['marginGroups', 'marginButtons'], function( i, e ) {
+
        else {
if ( changed( form.config, e ) ) {
+
            obj.before( obj.next( '.editButton' ) );
data.config[e] = parseInt( form.config[e] ) || 0;
+
        }
}
+
        pEBC.checkPosition( obj, 'button' );
} );
+
        pEBC.form.groups[pEBC.selectedGroup].buttonOrder = [];
+
        $( '#pEBC-toolbar .buttonGroup-' + pEBC.selectedGroup + ' .editButton' ).each( function( i, e ) {
if ( changed( form.config, 'showAllPages' ) ) {
+
            pEBC.form.groups[pEBC.selectedGroup].buttonOrder.push( e.getAttribute( 'data-id' ) );
data.config.showAllPages = [];
+
        } );
var pages = form.config.showAllPages.split( '\n' );
+
        $( '#pEBC-toolbar .buttonGroup-' + pEBC.selectedGroup + ' .editButton' ).removeClass( 'lastEditButton' );
$.each( pages, function( i, e ) {
+
        $( '#pEBC-toolbar .buttonGroup-' + pEBC.selectedGroup + ' .editButton:last-child' ).addClass( 'lastEditButton' );
data.config.showAllPages.push( $.trim( e ).replace( / /g, '_' ) );
+
    },
} );
+
 
}
+
    checkPosition: function( obj, type ) {
+
        document.pEBC[type + '-move-left'].disabled = obj.is( ':first-child' );
if ( changed( form.config, 'buttonOrder' ) ) {
+
        document.pEBC[type + '-move-right'].disabled = obj.is( ':last-child' );
data.config.buttonOrder = form.config.buttonOrder;
+
    },
}
+
 
+
    response: function( data, button, jqxhr ) {
// Über alle Gruppen iterieren
+
        if ( !data ) {
$.each( form.groups, function( i, e ) {
+
            alert( 'Konnte nicht speichern. HTTP-Statuscode ' + jqxhr.status + ': ' + jqxhr.statusText );
var isSet = false;
+
        }
var group = {};
+
        else if ( data.error ) {
+
            alert( 'Konnte nicht speichern. API-Fehlercode ' + data.error.code + ': ' + data.error.text );
$.each( ['name', 'css', 'buttonOrder'], function( i2, e2 ) {
+
        }
if ( changed( e, e2 ) ) {
+
        button.disabled = false;
group[e2] = e[e2];
+
    },
isSet = true;
+
 
}
+
    exportJSON: function( e ) {
} );
+
        e.preventDefault();
+
    },
if ( isSet ) {
+
 
data.groups[i] = group;
+
    getData: function() {
}
+
        function changed( obj, prop ) {
} );
+
            return ( obj[prop + '-default'] === '' );
+
        }
// Und über alle Buttons
+
 
$.each( form.buttons, function( i, e ) {
+
        var form = pEBC.form;
var button = pEBC.getButtonData( e );
+
        var data = {
if ( button ) {
+
            config: {},
data.buttons[i] = button;
+
            groups: {},
}
+
            buttons: {}
} );
+
        };
+
 
return data;
+
        $.each( ['marginGroups', 'marginButtons'], function( i, e ) {
},
+
            if ( changed( form.config, e ) ) {
+
                data.config[e] = parseInt( form.config[e] ) || 0;
getButtonData: function( button ) {
+
            }
function changed( prop ) {
+
        } );
return ( button[prop + '-default'] === '' || !button.hardcoded ) ;
+
 
}
+
        if ( changed( form.config, 'showAllPages' ) ) {
+
            data.config.showAllPages = [];
var data = {};
+
            var pages = form.config.showAllPages.split( '\n' );
var isSet = false;
+
            $.each( pages, function( i, e ) {
+
                data.config.showAllPages.push( $.trim( e ).replace( / /g, '_' ) );
// Direkt übernehmen
+
            } );
$.each( ['group', 'title', 'label', 'fgImage', 'bgImage', 'bgColor', 'condition', 'css'], function( i, e ) {
+
        }
if ( changed( e ) ) {
+
 
data[e] = button[e];
+
        if ( form.config.groupOrder !== undefined && !form.config.resetGroupOrder ) {
isSet = true;
+
            data.config.groupOrder = form.config.groupOrder;
}
+
        }
} );
+
 
+
        // Über alle Gruppen iterieren
// Numerische Werte
+
        $.each( form.groups, function( i, e ) {
$.each( ['width', 'height', 'fgImageWidth', 'bgImageWidth'], function( i, e ) {
+
            // Beim Zurücksetzen überspringen
if ( changed( e ) ) {
+
            if ( e.reset ) {
data[e] = parseInt( button[e] ) || 0;
+
                return;
isSet = true;
+
            }
}
+
 
} );
+
            var isSet = false;
+
            var group = {};
// Aktion
+
 
if ( changed( 'action' ) ) {
+
            $.each( ['name', 'css'], function( i2, e2 ) {
data.actionType = parseInt( button.actionType );
+
                if ( changed( e, e2 ) ) {
if ( data.actionType === 0 ) {
+
                    group[e2] = e[e2];
data.actionText = [button.actionText0, button.actionText1, button.actionText2];
+
                    isSet = true;
}
+
                }
else {
+
            } );
data.actionText = button.actionText0;
+
 
}
+
            if ( e.buttonOrder !== undefined && !e.resetButtonOrder ) {
isSet = true;
+
                group.buttonOrder = e.buttonOrder;
}
+
                isSet = true;
+
            }
// Zusammenfassung
+
 
if ( changed( 'summary' ) ) {
+
            if ( isSet ) {
data.summary = [];
+
                data.groups[i] = group;
var summaries = button.summary.split( '\n' );
+
            }
$.each( summaries, function( i, e ) {
+
        } );
data.summary.push( $.trim( e ) );
+
 
} );
+
        // Und über alle Buttons
isSet = true;
+
        $.each( form.buttons, function( i, e ) {
}
+
            var button = pEBC.getButtonData( e );
+
            if ( button ) {
// Konditionskrempel
+
                data.buttons[i] = button;
$.each( ['namespaces', 'pageTypes', 'userGroups', 'contexts'], function( i, e ) {
+
            }
if ( changed( e ) ) {
+
        } );
var inValue = button[e + 'In'];
+
 
var exValue = button[e + 'Ex'];
+
        return data;
data[e + 'In'] = ( inValue[0] === '!' ) ? true : inValue;
+
    },
data[e + 'Ex'] = ( exValue[0] === '!' ) ? false : exValue;
+
 
isSet = true;
+
    getButtonData: function( button ) {
}
+
        function changed( prop ) {
} );
+
            return ( button[prop + '-default'] === '' );
+
        }
// Deaktiviert?
+
 
if ( button.disabled ) {
+
        // Beim Zurücksetzen überspringen
data.disabled = true;
+
        if ( button.reset ) {
isSet = true;
+
            return false;
}
+
        }
+
 
if ( isSet )  {
+
        var data = {};
return data;
+
        var isSet = false;
}
+
 
else {
+
        // Direkt übernehmen
return false;
+
        $.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' ) ) {
 
if ( mw.user.options.get( 'gadget-editButtons' ) ) {
setHook( 'EditButtonConfigInit', 'pEBC.init' );
+
    $( '#pEBC' ).before( '<p id="pEBC-pleaseWait">Einen Moment, bitte …</p>' );
setHook( 'EditButtonConfigExecute', 'pEBC.execute' );
+
    setHook( 'EditButtonConfigInit', 'pEBC.init' );
 +
    setHook( 'EditButtonConfigExecute', 'pEBC.execute' );
 
}
 
}
 
else {
 
else {
$( '#pEBC' ).before( '<p>Dieser Apparat nützt dir nix ohne das Helferlein für Bearbeitungsknöppe.</p>' );
+
    $( '#pEBC' ).before( '<p>Dieser Apparat nützt dir nix ohne das Helferlein für Bearbeitungsknöppe.</p>' );
 
}
 
}
  
</script>
+
</js>
</html>
 

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


Linktipps: Faditiva und 3DPresso