Benutzer:ASM/quickedit.js
Erscheinungsbild
Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.
- Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
- Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
- Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
/*<pre>*/
/* * * * * * * * * * * * * * * * * *
* MediaWiki QuickEdit beta von ASM
*
* Version vom 11. August 2006
* * * * * * * * * * * * * * * * * */
// bis jetzt nur mit den alten Links möglich
var oldEditsectionLinks = true;
////// Einstellungen //////
// Standard-Einstellungen zuweisen
try { var dummy = qeEnabled; }
catch (e) { qeEnabled = true; }
try { dummy = qeEnableSection0; }
catch (e) { qeEnableSection0 = true; }
////// Ende Einstellungen //////
// 2D-Array mit allen Sections und den jeweiligen Unterknoten
var qeSections = new Array();
// Aktuell bearbeitete Section
var qeEdit = -1;
// Link zum Bearbeiten der Abschnitte
var qeEditLink = false;
// Form-Knoten
var qeForm = false;
// XmlHttpRequest
var qeRequest = false;
// 0 = idle 1 = receive 2 = submit
var qeRequestState = 0;
////// Start Script //////
addOnloadHook(qeInit);
function qeInit()
{
if (!qeEnabled) return;
if (document.location.href.indexOf('action=edit') != -1) return;
if (!qeInitAjax()) return;
qeChangeSectionLinks();
}
function qeContentSub(text)
{
var cs = document.getElementById('contentSub');
if (cs.innerHTML)
cs.innerHTML += ' - ' + text;
else
cs.innerHTML = text;
}
function qeShowError(err)
{
qeContentSub('QuickEdit Fehler: ' + err);
}
function qeGetElementsByClassName(tagname, classname)
{
var ret = new Array();
var tags = document.getElementsByTagName(tagname);
for (i = 0; i < tags.length; i++)
if (tags[i].className == classname)
ret.push(tags[i]);
return ret;
}
function qeChangeSectionLinks()
{
// Alle Abschnitte
var sections = qeGetElementsByClassName('div', 'editsection');
// Hauptabschnitt
if (qeEnableSection0 && sections.length > 0)
{
var heading = qeGetElementsByClassName('h1', 'firstHeading')[0];
var jumptonav = document.getElementById('jump-to-nav');
if (!heading || !jumptonav)
qeShowError('Section 0 nicht gefunden.');
else
{
// id verpassen
heading.id = 'section-0';
// Knoten ins Array packen
qeSections[0] = new Array();
var node = jumptonav.nextSibling;
while (node != null && node.className != 'editsection'
&& node.className != 'printfooter')
{
if (node.nodeName.charAt(0) != '#')
qeSections[0].push(node);
node = node.nextSibling;
}
// Link hinzufügen
var newspan = document.createElement('span');
newspan.style.fontSize = '8pt';
newspan.style.marginLeft = '10px';
newspan.appendChild(document.createTextNode('['));
var newlink = document.createElement('a');
newlink.href = 'javascript:qeEditSection(0)';
newlink.appendChild(document.createTextNode('QuickEdit'));
newspan.appendChild(newlink);
newspan.appendChild(document.createTextNode(']'));
heading.appendChild(newspan);
}
} // qeEnableSection0
// Abschnitte
for (i = 0; i < sections.length; i++)
{
// Section-Link suchen
var link = sections[i].childNodes[1].href;
var pos = link.search(/section=/);
var section = link.substring(pos+8);
// allegemeinen edit-link speichern
if (i == 0) qeEditLink = link.substring(0, pos+8);
////
// Sicherstellen dass nur gütlige Section-Nummern dort sind
// (im Normalfall überflüssig, aber wer weiß)
var j;
for (j = 0; j < 2; j++)
if (isNaN(section.charAt(j))) break;
if (j == 0) continue;
section = section.substring(0, j);
////
sections[i].style.fontSize = '.9em';
// QuickEdit-Link erstellen
var newnode = document.createElement('a');
newnode.href = 'javascript:qeEditSection(' + section + ');';
newnode.title = 'QuickEdit Abschnitt ' + section;
newnode.appendChild(document.createTextNode('QuickEdit'));
var where = sections[i].childNodes[2];
sections[i].insertBefore(document.createTextNode('/'), where);
sections[i].insertBefore(newnode, where);
////
// dem div eine ID verpassen
sections[i].id = 'editsection-' + section;
// zugehörige hX Überschrift suchen
var hx = sections[i].nextSibling;
while (hx != null && hx.nodeName.charAt(0).toLowerCase() != 'h')
hx = hx.nextSibling;
// auch ne ID verpassen
hx.id = 'section-' + section;
////
// alle zu dieser Section gehörigen Knoten suchen und ins Array packen
qeSections[section] = new Array();
var node = hx.nextSibling;
while (node != null && node.className != 'editsection'
&& node.className != 'printfooter')
{
// nur echte knoten bitte
if (node.nodeName.charAt(0) != '#')
qeSections[section].push(node);
node = node.nextSibling;
}
////
}
}
function qeEditSection(section)
{
section = parseInt(section);
// könnte etwas suboptimal sein, reicht aber vorerst
if (qeRequestState || !qeEditLink) return;
// es wird bereits ein Abschnitt bearbeitet
// wenn es der aktuelle ist -> Bearbeiten abbrechen, sonst nichts tun
if (qeEdit != -1)
{
if (qeEdit == section) qeAbortEdit(section);
return;
}
qeEdit = section;
// Inhalt des Abschnitts ausblenden
var nodes = qeSections[section];
for (i = 0; i < nodes.length; i++)
nodes[i].style.display = 'none';
////
// Form anzeigen
qeMakeForm();
var hx = document.getElementById('section-' + section);
hx.parentNode.insertBefore(qeForm, hx.nextSibling);
qeForm.childNodes[4].value = 'Lade Daten...';
////
qeGetSection();
}
function qeAbortEdit()
{
if (qeEdit == -1) return;
// Inhalt des Abschnitts wieder einblenden
var nodes = qeSections[qeEdit];
for (i = 0; i < nodes.length; i++)
nodes[i].style.display = 'block';
qeForm.parentNode.removeChild(qeForm);
qeForm.childNodes[4].value = '';
qeEdit = -1;
qeRequest.abort();
}
function qeMakeForm()
{
if (qeForm) return;
qeForm = document.createElement('form');
qeForm.method = 'post';
var elements = new Array(
// subject type name
new Array('input', 'hidden', 'wpSection'),
new Array('input', 'hidden', 'wpStarttime'),
new Array('input', 'hidden', 'wpEdittime'),
new Array('input', 'hidden', 'wpSummary'),
new Array('textarea', 'wpTextbox1'),
new Array('input', 'hidden', 'wpEditToken'),
new Array('input', 'hidden', 'wpAutoSummary')
);
for (i = 0; i < elements.length; i++)
{
var e = elements[i];
var newnode = document.createElement(e[0]);
if (e[0] == 'input')
{
newnode.type = e[1];
newnode.name = e[2];
}
else if (e[0] == 'textarea')
{
newnode.id = e[1];
newnode.name = e[1];
newnode.appendChild(document.createTextNode(''));
newnode.rows = 15;
}
qeForm.appendChild(newnode);
}
newnode = document.createElement('div');
newnode.style.marginTop = '5px';
// Speichern
newnode.appendChild(document.createElement('a'));
newnode.firstChild.onclick = qeSubmit;
newnode.firstChild.style.cursor = 'pointer';
newnode.firstChild.appendChild(document.createTextNode('Speichern'));
// Vorschau
newnode.appendChild(document.createTextNode(' '));
newnode.appendChild(document.createElement('a'));
newnode.childNodes[2].href = 'javascript: qeSubmit(1)';
newnode.childNodes[2].style.marginLeft = '5px';
newnode.childNodes[2].style.cursor = 'pointer';
newnode.childNodes[2].appendChild(document.createTextNode('Vorschau'));
// Abbrechen
newnode.appendChild(document.createTextNode(' '));
newnode.appendChild(document.createElement('a'));
newnode.childNodes[4].onclick = qeAbortEdit;
newnode.childNodes[4].style.marginLeft = '5px';
newnode.childNodes[4].style.cursor = 'pointer';
newnode.childNodes[4].appendChild(document.createTextNode('Abbrechen'));
// Zusammenfassung
newnode.appendChild(document.createTextNode(' '));
newnode.appendChild(document.createElement('input'));
newnode.childNodes[6].type = 'text';
newnode.childNodes[6].size = '70';
newnode.childNodes[6].id = 'qeSummary';
newnode.childNodes[6].style.marginLeft = '5px';
qeForm.appendChild(newnode);
}
function qeFillForm(formaction, wpStarttime, wpEdittime, wpSummary, wpTextbox1,
wpEditToken, wpAutoSummary)
{
if (!qeForm) return;
qeForm.childNodes[0].value = qeEdit;
qeForm.childNodes[1].value = wpStarttime;
qeForm.childNodes[2].value = wpEdittime;
qeForm.childNodes[3].value = wpSummary;
qeForm.childNodes[4].value = wpTextbox1;
qeForm.childNodes[5].value = wpEditToken;
qeForm.childNodes[6].value = wpAutoSummary;
qeForm.action = formaction;
document.getElementById('qeSummary').value = wpSummary;
}
// Ajax stuff
function qeInitAjax()
{
try
{
if (window.XMLHttpRequest)
{
qeRequest = new XMLHttpRequest();
qeRequest.overrideMimeType('text/xml');
// netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');
}
else if (window.ActiveXObject)
qeRequest = new ActiveXObject('Microsoft.XMLHTTP');
else throw 'Kein AJAX-Objekt vorhanden';
}
catch (e)
{
ShowError(e);
return false;
}
if (!qeRequest)
{
ShowError('AJAX-Objekt konnte nicht erstellt werden');
return false;
}
return true;
}
function qeGetSection()
{
if (qeEdit == -1 || !qeForm || !qeRequest || !qeEditLink || qeRequestState) return;
/* var link = document.getElementById('editsection-' + qeEdit).childNodes[1].href;
if (!link)
{
qeShowError('qeGetSection: Link nicht gefunden');
return;
}*/
var link = qeEditLink + qeEdit;
qeRequestState = 1;
qeRequest.onreadystatechange = qeAjaxResponse;
qeRequest.open('GET', link, true);
qeRequest.send(null);
}
function qeAjaxResponse()
{
if (!qeRequestState)
{
alert('QuickEdit Fehler: qeAjaxResponse');
return;
}
// receive
if (qeRequestState == 1 && qeEdit != -1)
{
if (qeRequest.readyState != 4 || qeRequest.status != 200)
return;
var xml = qeRequest.responseXML;
var inputs = xml.getElementsByTagName('input');
for (i = 0; i < inputs.length; i++)
{
if (inputs[i].name == 'wpSection') wpSection = inputs[i].value;
else if (inputs[i].name == 'wpStarttime') wpStarttime = inputs[i].value;
else if (inputs[i].name == 'wpEdittime') wpEdittime = inputs[i].value;
else if (inputs[i].name == 'wpSummary') wpSummary = inputs[i].value;
else if (inputs[i].name == 'wpEditToken') wpEditToken = inputs[i].value;
else if (inputs[i].name == 'wpAutoSummary') wpAutoSummary = inputs[i].value;
}
var wpTextbox1 = xml.getElementById('wpTextbox1').value;
var formaction = xml.getElementById('editform').action;
// sollte nie passieren, wenn doch -> fatal error
if (wpSection != qeEdit)
{
alert('QuickEdit Fehler: wpSection und qeEdit stimmen nicht überein.');
qeRequestState = 0;
qeAbortEdit();
return;
}
qeFillForm(formaction, wpStarttime, wpEdittime, wpSummary, wpTextbox1,
wpEditToken, wpAutoSummary);
}
qeRequestState = 0;
}
function qeSubmit(preview)
{
if (qeEdit == -1 || !qeRequest || !qeForm || qeRequestState)
{
alert('qeSubmit: Interner Fehler');
return;
}
qeForm.childNodes[3].value = document.getElementById('qeSummary').value;
if (preview == 1)
{
var prev = document.createElement('input');
prev.name = 'wpPreview';
prev.value = 'Preview';
prev.type = 'hidden';
qeForm.appendChild(prev);
}
qeForm.submit();
}
/*</pre>*/