Zum Inhalt springen

Benutzer:ASM/quickedit.js

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 11. August 2006 um 19:04 Uhr durch ASM (Diskussion | Beiträge). Sie kann sich erheblich von der aktuellen Version unterscheiden.
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

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>*/