Usuari:Kieziuku/quickedit.js

De la Viquipèdia, l'enciclopèdia lliure

Nota: Després de desar, heu de netejar la memòria cau del navegador per veure els canvis. En la majoria de navegadors amb Windows o Linux, premeu Ctrl+F5 o bé premeu Shift i cliqueu el botó "Actualitza" (Ctrl i "Actualitza" amb Internet Explorer). Vegeu més informació i instruccions per a cada navegador a Viquipèdia:Neteja de la memòria cau.

//<pre><nowiki>
//Proves pel Quickedit, per Albertsab
//Extret de la Wiki en castellà [[:es:Usuario:Axxgreazz/quickedit.js]]
//Codi original fet per [[:de:User:ASM]]

/*<pre>*/

/* * * * * * * * * * * * * * * * * *
 * MediaWiki QuickEdit by ASM
 *
 * Version: 14. Sep 2006-1
 * * * * * * * * * * * * * * * * * *
 *
 *            How to use
 *
 * Insert into your monobook.js:
 *
 * document.write('<script src="'
 * + 'http://ca.wikipedia.org/w/index.php?title=Usuari:Albertsab/quickedit.js'
 * + '&action=raw&ctype=text/javascript"></script>');
 *
 * And (optionally) these variables:
 *
 * var qeEnabled          = true;  // Activate Script?
 * var qeEnableSection0   = true;  // Enable QuickEdit link for section 0 (introduction)?
 * var qeShowErrors       = false; // Show errors (should be left false)
 * var qeEnableAccessKeys = true;  // Activate access keys?
 * var qeTextboxHeight    = 15;    // Height of the textbox
 *
 * Acces keys are the same as usual (except 'a' for abort edit)
 *
 * * * * * * * * * * * * * * * * * */


/////////// Einstellungen ///////////
// -> Standardeinstellungen zuweisen

try { var dummy = qeEnabled; }
catch (e) { qeEnabled = true; }

try { var dummy = qeShowErrors; }
catch (e) { qeShowErrors = false; }

try { var dummy = qeEnableSection0; }
catch (e) { qeEnableSection0 = true; }

try { var dummy = qeTextboxHeight; }
catch (e) { qeTextboxHeight = 15; }

try { var dummy = qeEnableAccessKeys; }
catch (e) { qeEnableAccessKeys = true; }

//////// Ende Einstellungen ////////


// only initialize once
var qeIsInit = false;

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

// ondblclick
var qeOnDoubleClick = null;

////// Start Script //////

$(qeInit);

function qeInit()
{
   if (!qeEnabled || qeIsInit) return;

   qeIsInit = true;

   // check if page is editable
   if (!document.getElementById('ca-edit')) return;

   // check if there is no other action than view
   var pos = document.location.href.indexOf('action=');
   if (pos != -1 && document.location.href.substr(pos+7, 4) != 'view') return;

   qeSetLang();
   
   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)
{
   if (qeShowErrors) qeContentSub(qePhrase('quickedit') + ' ' + qePhrase('error') + ': ' + err);
}

function qeAlert(err)
{
   alert(qePhrase('quickedit') + ' ' + qePhrase('error') + ': ' + 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()
{
   qeEditLink = document.getElementById('ca-edit').firstChild.href + '&section=';

   // Alle Abschnitte
//   var sections = qeGetElementsByClassName('div', 'editsection');
   var sections = qeGetElementsByClassName('span', 'editsection');
   var jumptonav = document.getElementById('jump-to-nav');

/*   qeNewLinks = false;

   if (sections.length == 0)
      if (typeof oldEditsectionLinks == 'undefined' || !oldEditsectionLinks)
      {
         qeNewLinks = true;
         var node = jumptonav.nextSibling;
         while(node != null && node.className != 'printfooter')
         {
            if (/^H[1-6]$/.test(node.nodeName) && node.getElementsByTagName('span').length != 0)
               sections.push(node.getElementsByTagName('span')[0]);

            node = node.nextSibling;
         }
      }
*/

   // Hauptabschnitt
   if (qeEnableSection0)
   {
      var heading = qeGetElementsByClassName('h1', 'firstHeading')[0];

   if (!heading || !jumptonav)
      qeShowError('Section 0 nicht gefunden.');
   else
   {

      // id verpassen
      heading.id = 'section-0';

      // Knoten ins Array packen
      qeSections[0] = new Array();

      var nosections = (sections.length == 0);

      var node = jumptonav.nextSibling;
      while (node != null && node.className != 'editsection'
             && node.className != 'printfooter' && (nosections|| !/^H[1-6]$/.test(node.nodeName)))
      {
         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.id    = 'sectionlink-0';
      newlink.className = 'sectionlink';
      newlink.appendChild(document.createTextNode(qePhrase('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);
      var j;
      for (j = 0; j < 2; j++)
        if (isNaN(section.charAt(j))) break;

      if (j == 0) continue;
      section = section.substring(0, j);
      ////
*/

// fix by lupin
      var section = null, match = null;
      
      if (match = /section=([0-9]+)/.exec(link))
         var section = +match[1];
      else break;
      
      if (!section) continue;
// end fix

      sections[i].style.fontSize = '8pt'; // x-small sieht bei mir "doof" aus

      // QuickEdit-Link erstellen
      var newnode = document.createElement('a');
      newnode.href = 'javascript:qeEditSection(' + section + ');';
      newnode.title = 'QuickEdit Section ' + section;
      newnode.id    = 'sectionlink-' + section;
      newnode.className = 'sectionlink';
      newnode.appendChild(document.createTextNode(qePhrase('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
/*      if (qeNewLinks)
         var hx = sections[i].parentNode;

      else
      {
         var hx = sections[i].nextSibling;
         while (hx != null && !/^H[1-6]$/.test(hx.nodeName))
            hx = hx.nextSibling;
      }
*/      
      var hx = sections[i].parentNode;

      // 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' && !/^H[1-6]$/.test(node.nodeName))
      {
         // 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;

   // save body.ondblclick
   if (document.getElementsByTagName('body')[0].ondblclick)
   {
      qeOnDoubleClick = document.getElementsByTagName('body')[0].ondblclick;
      document.getElementsByTagName('body')[0].ondblclick = null;
   }

   // Inhalt des Abschnitts ausblenden
   var nodes = qeSections[section];
   for (i = 0; i < nodes.length; i++)
      nodes[i].style.display = 'none';
   ////

   // andere Links ändern
   var links = qeGetElementsByClassName('a', 'sectionlink');
   for (i = 0; i < links.length; i++)
   {
      if (links[i].id != 'sectionlink-' + qeEdit)
         links[i].style.color = '#bfbfbf';
   }

   // Form anzeigen
   qeMakeForm();
   var hx = document.getElementById('section-' + section);
   hx.parentNode.insertBefore(qeForm, hx.nextSibling);

   qeForm.childNodes[4].value = qePhrase('loading') + '...';
   ////

   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 = is_gecko?null:'block';

   var links = qeGetElementsByClassName('a', 'sectionlink');
   for (i = 0; i < links.length; i++)
   {
      if (links[i].id != 'sectionlink-' + qeEdit)
         links[i].style.color = null;
   }

   qeForm.parentNode.removeChild(qeForm);
   qeForm.childNodes[4].value = '';

   qeEdit = -1;
   qeRequest.abort();

   // restore body.ondblclick
   if (qeOnDoubleClick)
      document.getElementsByTagName('body')[0].ondblclick = qeOnDoubleClick;
}

function qeMakeForm()
{
   if (qeForm) return;

   if (qeSections.length == 1) qeTextboxHeight += 10; // higher textbox for the main section only

   qeForm = document.createElement('form');
   qeForm.method = 'post';
   qeForm.onsubmit = qeSubmitByReturn;

   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')
//,     new Array('input',    'hidden', 'wpWatchthis')
   );

   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 = qeTextboxHeight;
      }

      qeForm.appendChild(newnode);
   }

   if (qeEnableAccessKeys) qeForm.childNodes[4].accessKey = ',';
   qeForm.childNodes[4].tabIndex = 1;

   newnode = document.createElement('div');
   newnode.style.marginTop = '5px';

// Speichern   
   newnode.appendChild(document.createElement('a'));
   newnode.firstChild.href         = 'javascript:qeSubmit(0)';
   newnode.firstChild.style.cursor = 'pointer';
   newnode.firstChild.appendChild(document.createTextNode(qePhrase('submit')));

   if (qeEnableAccessKeys) newnode.firstChild.accessKey = 's';

// 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(qePhrase('preview')));
   
   if (qeEnableAccessKeys) newnode.childNodes[2].accessKey = 'p';

// Abbrechen
   newnode.appendChild(document.createTextNode(' '));
   
   newnode.appendChild(document.createElement('a'));
   newnode.childNodes[4].href             = 'javascript:qeAbortEdit()';
   newnode.childNodes[4].style.marginLeft = '5px';
   newnode.childNodes[4].style.cursor     = 'pointer';
   newnode.childNodes[4].appendChild(document.createTextNode(qePhrase('cancel')));

   if (qeEnableAccessKeys) newnode.childNodes[4].accessKey = 'a';

// 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].maxLength = '200';
   newnode.childNodes[6].style.marginLeft = '5px';
   newnode.childNodes[6].tabIndex = 2;

// Kleine Änderung
   newnode.appendChild(document.createTextNode(' '));

   var checkboxes = document.createElement('span');
   checkboxes.style.whiteSpace = 'nowrap';

   checkboxes.appendChild(document.createElement('input'));
   checkboxes.childNodes[0].type  = 'checkbox';
   checkboxes.childNodes[0].id    = 'wpMinoredit';
   checkboxes.childNodes[0].name  = 'wpMinoredit';
   checkboxes.childNodes[0].value = '1';
   checkboxes.childNodes[0].style.marginLeft = '5px';
   checkboxes.childNodes[0].tabIndex = 3;

   if (qeEnableAccessKeys) checkboxes.childNodes[0].accessKey = 'i';

   checkboxes.appendChild(document.createElement('label'));
   checkboxes.childNodes[1].htmlFor = 'wpMinoredit';
   checkboxes.childNodes[1].style.fontWeight = 'bold';

   checkboxes.childNodes[1].appendChild(document.createTextNode(qePhrase('k')));

// Beobachten
   checkboxes.appendChild(document.createTextNode(' '));

   checkboxes.appendChild(document.createElement('input'));
   checkboxes.childNodes[3].type  = 'checkbox';
   checkboxes.childNodes[3].id    = 'wpWatchthis';
   checkboxes.childNodes[3].name  = 'wpWatchthis';
   checkboxes.childNodes[3].value = '1';
   checkboxes.childNodes[3].style.marginLeft = '5px';
   checkboxes.childNodes[3].tabIndex = 4;

   if (qeEnableAccessKeys) checkboxes.childNodes[3].accessKey = 'w';

   checkboxes.appendChild(document.createElement('label'));
   checkboxes.childNodes[4].htmlFor = 'wpWatchthis';
   checkboxes.childNodes[4].style.fontWeight = 'bold';

   checkboxes.childNodes[4].appendChild(document.createTextNode(qePhrase('b')));

   newnode.appendChild(checkboxes);
   qeForm.appendChild(newnode);
}

function qeFillForm(formaction, wpStarttime, wpEdittime, wpSummary, wpTextbox1,
                    wpEditToken, wpAutoSummary, wpWatchthis)
{
   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.childNodes[7].name  = wpWatchthis?'wpWatchthis':'dummy';
   document.getElementById('wpWatchthis').checked = wpWatchthis;
   
   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)
   {
      qeShowError(e);
      return false;
   }

   if (!qeRequest)
   {
      qeShowError('AJAX-Objekt konnte nicht erstellt werden');
      return false;
   }

   return true;
}


function qeGetSection()
{
   if (qeEdit == -1 || !qeForm || !qeRequest || !qeEditLink || qeRequestState) 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;

      qeRequestState = 0;

      var xml = qeRequest.responseXML;

      try // MediaWiki bug 6986 workaround
      {
         var wpTextbox1 = xml.getElementById('wpTextbox1').value;
      }
      catch (e)
      {
         xml = qeFixXML(qeRequest.responseText);
         if (!xml)
         {
            qeShowError('XML parsing fehlgeschlagen.');
            return;
         }

         var wpTextbox1 = xml.getElementById('wpTextbox1').value;
      }

      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;

         else if (inputs[i].name == 'wpWatchthis') wpWatchthis = inputs[i].checked;
      }

      var formaction = xml.getElementById('editform').action;

      // sollte nie passieren, wenn doch -> fatal error
      if (wpSection != qeEdit)
      {
         qeAlert(qePhrase('varmismatch'));
         qeRequestState = 0;
         qeAbortEdit();
         return;
      }

      qeFillForm(formaction, wpStarttime, wpEdittime, wpSummary, wpTextbox1,
                 wpEditToken, wpAutoSummary, wpWatchthis);
   }
}

function qeSubmitByReturn()
{
   qeSubmit(0);
   return false;
}

function qeSubmit(preview)
{
   if (qeEdit == -1 || !qeRequest || !qeForm || qeRequestState)
      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();
}

// MediaWiki bug 6986 workaround
function qeFixXML(text)
{
   var pos = text.indexOf('<h1 class="firstHeading">');
   var pos2 = text.indexOf('</h1>');
   if (pos == -1 || pos2 == -1) return null;

   text = text.substring(0, pos) + text.substring(pos2+5);

   var parser = new DOMParser();
   var newdoc = parser.parseFromString(text, "text/xml");
   return newdoc;
}


// Language stuff

function qeSetLang()
{
   switch (document.getElementsByTagName('html')[0].lang)
   {
      case 'de': qeLang = 1; break;
      case 'en': qeLang = 2; break;

//    case 'xx': ...

      default: qeLang = 2;
   }
}

function qePhrase(name)
{
   for (var i = 0; i < qePhrases.length; i++)
      if (qePhrases[i][0] == name)
         return qePhrases[i][qeLang];

   return 'UNDEFINED PHRASE: ' + name;
}

var qePhrases = new Array(
   new Array('quickedit', 'QuickEdit',  'QuickEdit'),
   new Array('submit',    'Speichern',  'Submit'),
   new Array('preview',   'Vorschau',   'Preview'),
   new Array('cancel',    'Abbrechen',  'Cancel'),
   new Array('k',         'K',          'minor'),
   new Array('b',         'B',          'watch'),
   new Array('error',     'Fehler',     'error'),
   new Array('nolinksfound', 'Keine Links gefunden', 'No links found'),
   new Array('loading',   'Lade Daten', 'Loading data'),
   new Array('varmismatch', 'mismatch of wpSection and qeEdit.')
);


/*</pre>*/


//</nowiki></pre>