Benutzer:Wurgl/8Schwestern.js

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

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
  • Internet Explorer/Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
  • Opera: Strg+F5
var EightSisters = {
  queryPageProps      : {
    action: 'query',
    prop: 'pageprops',
    ppprop: 'wikibase_item',
    pageids: mw.config.get('wgArticleId'),
  },
  api : 0,
  qId : '',
  canInsert : true,
  haveAny : false,
  addWeblinks : -1,
  sisterData : {
    0 : { tmpl : 'Commons',     sitelink : 'commonswiki',   property : 'P935', pagelnk: 'https://commons.wikimedia.org/wiki/' },
    1 : { tmpl : 'Commonscat',                              property : 'P373', pagelnk: 'https://commons.wikimedia.org/wiki/Category:' },
    2 : { tmpl : 'Wikibooks',   sitelink : 'dewikibooks',                      pagelnk: 'https://de.wikibooks.org/wiki/' },
    3 : { tmpl : 'Wikispecies', sitelink : 'specieswiki',                      pagelnk: 'https://species.wikimedia.org/wiki/' },
    4 : { tmpl : 'Wikiquote',   sitelink : 'dewikiquote',                      pagelnk: 'https://de.wikiquote.org/wiki/' },
    5 : { tmpl : 'Wikisource',  sitelink : 'dewikisource',                     pagelnk: 'https://de.wikisource.org/wiki/' },
    6 : { tmpl : 'Wikiversity', sitelink : 'dewikiversity',                    pagelnk: 'https://de.wikiversity.org/wiki/' },
    7 : { tmpl : 'Wikivoyage',  sitelink : 'dewikivoyage',                     pagelnk: 'https://de.wikivoyage.org/wiki/' },
    8 : { tmpl : 'Wiktionary',  sitelink : 'dewiktionary',                     pagelnk: 'https://de.wiktionary.org/wiki/' }
   },

  execute : function () {
    if(mw.config.get('wgNamespaceNumber') != 0 &&
       mw.config.get('wgNamespaceNumber') != 14)
      return;
    if(mw.config.get('wgNamespaceNumber') == 14) {
      EightSisters.sisterData[ 9] = { tmpl : 'Themenkategorie Welterbe',        pagelnk: 'https://commons.wikimedia.org/wiki/Category:', add: 1, param: 5,            data: 'v' };
      EightSisters.sisterData[10] = { tmpl : 'Kategorie Curling',               pagelnk: 'https://commons.wikimedia.org/wiki/Category:', add: 1, param: 'Commonscat', data: null }; // Nur bei "nein" dieses entfernen
      EightSisters.sisterData[11] = { tmpl : 'Kategorie Eishockey',             pagelnk: 'https://commons.wikimedia.org/wiki/Category:', add: 1, param: 'Commonscat', data: null }; // Nur bei "nein" dieses entfernen
      EightSisters.sisterData[12] = { tmpl : 'Kategorie Filmjahr nach Jahr',    pagelnk: 'https://commons.wikimedia.org/wiki/Category:', add: 1, param: 'Commonscat', data: 'pv' }; // C&C Wert einsetzen
      EightSisters.sisterData[13] = { tmpl : 'Kategorie Filmjahr nach Jahr',    pagelnk: 'https://commons.wikimedia.org/wiki/Category:', add: 0, param: 'Commons',    data: 'pv' }; // C&C Wert einsetzen
      EightSisters.sisterData[14] = { tmpl : 'Kategorie Jahrhundert',           pagelnk: 'https://commons.wikimedia.org/wiki/Category:', add: 1, param: 'Commonscat', data: 'pv' }; // Cat Wert einsetzen
      EightSisters.sisterData[15] = { tmpl : 'Kategorie Raumfahrer nach Staat', pagelnk: 'https://commons.wikimedia.org/wiki/Category:', add: 1, param: 'Commonscat', data: /Astronauts[ _]+from[ _]+/, hint: 'Commonstitel' }; // Cat Inhalt: "Astronauts from " rausnehmen
      EightSisters.sisterData[16] = { tmpl : 'Kategorie Raumfahrt nach Staat',  pagelnk: 'https://commons.wikimedia.org/wiki/Category:', add: 1, param: 'Commonscat', data: 'pv', hint: 'Commonstitel' }; // Cat & Tite Wert einsetzenl
      EightSisters.sisterData[17] = { tmpl : 'Musikgruppe als Thema',           pagelnk: 'https://commons.wikimedia.org/wiki/Category:', add: 1, param: 'Commonscat', data: 'pv' }; // C&C Wert einsetzen
      EightSisters.sisterData[18] = { tmpl : 'Musikgruppe als Thema',           pagelnk: 'https://commons.wikimedia.org/wiki/Category:', add: 0, param: 'Commons',    data: 'pv' }; // C&C Wert einsetzen
      EightSisters.sisterData[19] = { tmpl : 'Person als Thema',                pagelnk: 'https://commons.wikimedia.org/wiki/Category:', add: 1, param: 'Commonscat', data: 'pv' }; // C&C Wert einsetzen
      EightSisters.sisterData[20] = { tmpl : 'Person als Thema',                pagelnk: 'https://commons.wikimedia.org/wiki/Category:', add: 0, param: 'Commons',    data: 'pv' }; // C&C Wert einsetzen
      EightSisters.sisterData[21] = { tmpl : 'Kategorie Ereignis nach Jahr',    pagelnk: 'https://commons.wikimedia.org/wiki/Category:', add: 1, param: 'Commonscat', data: 'pv' }; // C&C Wert einsetzen
      EightSisters.sisterData[22] = { tmpl : 'Kategorie Ereignis nach Jahr',    pagelnk: 'https://commons.wikimedia.org/wiki/Category:', add: 0, param: 'Commons',    data: 'pv' }; // C&C Wert einsetzen
    }
    var action = mw.config.get('wgAction');
    if(action != 'edit' && action != 'submit')
      return;
    var message = mw.config.get('wgEditMessage');
    if(message != 'editing')
      return;

    if($('#wpTextbox1').textSelection('getContents').search(RegExp('{{\\s*[Ss]chwesterprojekte\\s*[\\|}]')) != -1)
      return;

    var lang = mw.config.get('wgPageContentLanguage');
    EightSisters.api = new mw.Api();
    EightSisters.queryWikidataId(EightSisters.api, EightSisters.gotWikidataId, EightSisters.queryPageProps);
  },

  gotWikidataId : function(data) {
    var pages = data.query.pages;
    for(var p in pages) {
      if(pages[p].pageprops && pages[p].pageprops.wikibase_item)
        EightSisters.qId = pages[p].pageprops.wikibase_item;
    }
    if(EightSisters.qId != '') {
      var siteLinks = '';
      for(var key in Object.keys(EightSisters.sisterData)) {
        if(EightSisters.sisterData[key].sitelink)
          if(siteLinks == '')
            siteLinks += EightSisters.sisterData[key].sitelink;
          else
            siteLinks += '|' + EightSisters.sisterData[key].sitelink;
      }
      fetch('https://www.wikidata.org/w/api.php?action=wbgetentities&format=json&ids=' + EightSisters.qId + '&props=sitelinks&sitefilter=' + siteLinks + '&formatversion=2' + "&origin=*").then(function(response) {
          // console.log("1 Response" + response);
          return response.json();
        }).then(function(response) {
          // console.log("2 Response" + response);
          for(var c in response.entities) {
            if(response.entities[c].sitelinks)
              for(var key in Object.keys(EightSisters.sisterData)) {
                if(EightSisters.sisterData[key].sitelink && response.entities[c].sitelinks[EightSisters.sisterData[key].sitelink]) {
                  if(key == 0 && response.entities[c].sitelinks[EightSisters.sisterData[key].sitelink].title.startsWith('Category:'))
                    EightSisters.sisterData[1].commonsData = response.entities[c].sitelinks[EightSisters.sisterData[key].sitelink].title.substring(9);
                  else
                    EightSisters.sisterData[key].commonsData = response.entities[c].sitelinks[EightSisters.sisterData[key].sitelink].title;
                  EightSisters.haveAny = true;
                }
              }
          }
          fetch('https://www.wikidata.org/w/api.php?action=wbgetclaims&format=json&entity=' + EightSisters.qId + '&formatversion=2' + "&origin=*").then(function(response) {
              // console.log("1 Response" + response);
              return response.json();
            }).then(function(response) {
              // console.log("2 Response" + response);
              if(response.claims) {
                for(var key in Object.keys(EightSisters.sisterData)) {
                  if(EightSisters.sisterData[key].property && response.claims[EightSisters.sisterData[key].property])
                    for(var cc in response.claims[EightSisters.sisterData[key].property]) {
                      if(response.claims[EightSisters.sisterData[key].property][cc].rank != 'deprecated') {
                        if(key == 0 && EightSisters.sisterData[key].commonsData != null && EightSisters.sisterData[key].commonsData != response.claims[EightSisters.sisterData[key].property][cc].mainsnak.datavalue.value) {
                          console.log("Sitelink (" + EightSisters.sisterData[key].commonsData + ") is different to Property " + EightSisters.sisterData[key].property + " (" + response.claims[EightSisters.sisterData[key].property][cc].mainsnak.datavalue.value + ")");
                        }
                        else {
                          EightSisters.sisterData[key].commonsData = response.claims[EightSisters.sisterData[key].property][cc].mainsnak.datavalue.value;
                          EightSisters.haveAny = true;
                        }
                        break;
                      }
                    }
                }
              }
              EightSisters.analyseText(true);
            });
        });
    }
  },

  analyseText : function(initial) {
    var $textbox = $('#wpTextbox1');
    var text = $textbox.textSelection('getContents');
    EightSisters.addWeblinks = -1;
    var weblinkPos = -1;
    if(mw.config.get('wgNamespaceNumber') != 14) {
      var sections = text.match(/\n==.*\n/g);
      if(sections) {
        for(var i = sections.length - 1; i >= 0; -- i) {
          if(sections[i].indexOf('Weblink') != -1) {
            weblinkPos = text.lastIndexOf(sections[i]) + sections[i].length;
            break;
          }
        }
        if(weblinkPos == -1)
          for(var i = sections.length - 1; i >= 0; -- i) {
            if(sections[i].indexOf('Siehe auch') != -1) {
              weblinkPos = text.lastIndexOf(sections[i]) + sections[i].length;
              break;
            }
          }
        if(weblinkPos == -1)
          for(var i = sections.length - 1; i >= 0; -- i) {
            if(sections[i].indexOf('Verweise') != -1) {
              weblinkPos = text.lastIndexOf(sections[i]) + sections[i].length;
              break;
            }
          }
      }

      if(weblinkPos == -1) {
        weblinkPos = text.lastIndexOf('<references');
        if(weblinkPos != -1) {
          weblinkPos = text.substring(0, weblinkPos).lastIndexOf('\n==');
          EightSisters.addWeblinks = weblinkPos;
        }

        if(weblinkPos == -1) {
          var minWeblinkPos = 0;
          if(sections)
            minWeblinkPos = text.indexOf(sections[sections.length - 1]);
          var pos = text.indexOf('{{Normdaten', minWeblinkPos);
          if(pos != -1)
            weblinkPos = pos;
          if((pos = text.indexOf('{{Navi', minWeblinkPos)) != -1 && (weblinkPos == -1 || pos < weblinkPos))
            weblinkPos = pos;
          if((pos = text.indexOf('[[Kategorie', minWeblinkPos)) != -1 && (weblinkPos == -1 || pos < weblinkPos))
            weblinkPos = pos;
          if((pos = text.indexOf('{{DEFAULTSORT', minWeblinkPos)) != -1 && (weblinkPos == -1 || pos < weblinkPos))
            weblinkPos = pos;
          if((pos = text.indexOf('{{SORTIERUNG', minWeblinkPos)) != -1 && (weblinkPos == -1 || pos < weblinkPos))
            weblinkPos = pos;
          if((pos = text.indexOf('{{Hinweis ', minWeblinkPos)) != -1 && (weblinkPos == -1 || pos < weblinkPos))
            weblinkPos = pos;
          if((pos = text.indexOf('{{Hinweis|', minWeblinkPos)) != -1 && (weblinkPos == -1 || pos < weblinkPos))
            weblinkPos = pos;
          if(weblinkPos != -1)
            EightSisters.addWeblinks = weblinkPos;
        }
      }
    }
    else {
      if((pos = text.indexOf('[[Kategorie')) != -1) {
        weblinkPos = pos;
        while(text.substring(weblinkPos - 2, weblinkPos) == '\n\n')
          -- weblinkPos;
      }
      else if((pos = text.lastIndexOf('}}')) != -1) {
        weblinkPos = pos + 2;
        if(text.substring(weblinkPos, weblinkPos + 1) == '\n')
          ++ weblinkPos;
      }
    }

    for(var key in Object.keys(EightSisters.sisterData)) {
      var tmplPos;
      for(var from = 0;;) {
        tmplPos = text.substring(from).search(RegExp("{{\\s*[" + EightSisters.sisterData[key].tmpl.substring(0, 1) + EightSisters.sisterData[key].tmpl.substring(0, 1).toLowerCase() + "]" + EightSisters.sisterData[key].tmpl.substring(1).replaceAll(' ', '[ _]+') + '\\s*[\\|}]'));
        if(tmplPos == -1)
          break;
        if(EightSisters.inRefOrComment(text, tmplPos)) {
          from += tmplPos + 2;
        }
        else {
          tmplPos += from;
          break;
        }
      }
      EightSisters.sisterData[key].foundAt = tmplPos;
      if(tmplPos != -1) {
        if(mw.config.get('wgNamespaceNumber') != 14) {
          var sectionPos = text.substring(0, tmplPos).lastIndexOf('==\n');
          if(weblinkPos == -1)
            weblinkPos = sectionPos;
          else if(weblinkPos != sectionPos + 3) {
            console.log("Mismatch position of " + EightSisters.sisterData[key].tmpl + " (" + weblinkPos + ") and position of section Weblinks (" + (sectionPos + 3) + ")");
            // EightSisters.canInsert = false;
          }
        }
        EightSisters.sisterData[key].tmplpos = tmplPos;
        EightSisters.sisterData[key].endpos = tmplPos + text.indexOf('\n', tmplPos) + 1;
      }
      else {
        EightSisters.sisterData[key].tmplpos = -1;
        EightSisters.sisterData[key].endpos = -1;
        if(initial == true && EightSisters.sisterData[key].commonsData)
          EightSisters.sisterData[key].show = true;
      }
    }

    if(mw.config.get('wgNamespaceNumber') == 14) {
      for(key = 9; key < Object.keys(EightSisters.sisterData).length; ++ key) {
        if(EightSisters.sisterData[key].foundAt != -1) {
          if(EightSisters.sisterData[EightSisters.sisterData[key].add].commonsData == null) {
            EightSisters.sisterData[key].foundAt = -1;
            continue;
          }
          EightSisters.sisterData[key].show = false;
          var endPos = text.indexOf('}}', EightSisters.sisterData[key].foundAt + 2);
          if(endPos !== -1) {
            var found = false;
            var tmplStart = endPos;
            var tmplEnd = endPos;
            var params = text.substring(EightSisters.sisterData[key].foundAt + 2, endPos).split('|');
            var pos = EightSisters.sisterData[key].foundAt + 2 + params[0].length;
            var nIdx = 0; // index of unnamed parameters
            for(var fndPIdx = 1; fndPIdx < params.length; ++ fndPIdx) {
              var matches;
              if((matches = params[fndPIdx].match(RegExp('^\\s*' + EightSisters.sisterData[key].param + '\\s*=\\s*(.*)$', 's'))) != null) {
                // if matches[1] == null, just Commons=
                if(EightSisters.sisterData[key].data == null) {
                  if(matches[1] != null && matches[1].trim() == 'nein') {
                    found = true;
                    tmplStart = pos;
                    tmplEnd = pos + params[fndPIdx].length + 1;
                    break;
                  }
                }
                else {
                  if(matches[1] == null || matches[1] == '') {
                    tmplStart = pos;
                    tmplEnd = pos + params[fndPIdx].length + 1;
                    if(params[fndPIdx].endsWith('\n'))
                      -- tmplEnd;
                  }
                  else {
                    found = true;
                    break;
                  }
                }
              }
              if(typeof(params[fndPIdx]) == 'number') {
                if(params[fndPIdx].indexOf('=') == -1) {
                  ++ nIdx;
                  if(nIdx == EightSisters.sisterData[key].param) {
                    if(params[fndPIdx].trim() == '') {
                      tmplStart = pos;
                      tmplEnd = pos + params[fndPIdx].length + 1;
                      if(params[fndPIdx].endsWith('\n'))
                        -- tmplEnd;
                    }
                    else {
                      found = true;
                      break;
                    }
                  }
                }
              }
              pos += params[fndPIdx].length + 1; // +1 for the '|'
              /* DEBUG* */ if(fndPIdx == params.length - 1 && pos != endPos) console.log('*** pos ' + pos + ' is not equal to expected endpos ' + endpos);
            }

            if(EightSisters.sisterData[key].data == null) {
              if(found == true) {
                EightSisters.sisterData[key].tmplpos = tmplStart;
                EightSisters.sisterData[key].tmplend = tmplEnd;
                EightSisters.sisterData[key].foundAt = -1;
                EightSisters.sisterData[key].show = true;
              }
            }
            else if(found == false) {
              EightSisters.sisterData[key].tmplpos = tmplStart;
              EightSisters.sisterData[key].tmplend = tmplEnd;
              EightSisters.sisterData[key].foundAt = -1;
              EightSisters.sisterData[key].show = true;
            }
            EightSisters.sisterData[EightSisters.sisterData[key].add].show = false;
          }
          else
            EightSisters.sisterData[key].show = false;
        }
        else
          EightSisters.sisterData[key].show = false;
      }
    }
    var haveAny = false;
    for(var key in Object.keys(EightSisters.sisterData)) {
      if(EightSisters.sisterData[key].show == true) {
        haveAny = true;
      }
    }

    if(weblinkPos == -1) {
      console.log("position of section Weblinks not found");
      EightSisters.canInsert = false;
    }
    for(var key in Object.keys(EightSisters.sisterData)) {
      if(EightSisters.sisterData[key].endpos == -1)
        EightSisters.sisterData[key].endpos = weblinkPos;
    }

    var displKey;
    if(EightSisters.canInsert == true && haveAny == true && initial == true) {
      var innerHtml = '<div id="chSisters" class="oo-ui-layout oo-ui-labelElement oo-ui-fieldLayout oo-ui-fieldLayout-align-top editOptions" style="border-radius: 0.25em 0.25em 0.25em 0.25em; margin-bottom:0.5em"><div class="oo-ui-layout oo-ui-horizontalLayout">';
      var section = '';
      if(mw.config.get('wgNamespaceNumber') != 14)
        section = ' im Abschnitt Weblinks';

      for(var key in Object.keys(EightSisters.sisterData)) {
        if(EightSisters.sisterData[key].show) {
          var addLabel = '';
          if(key == 0 && EightSisters.sisterData[1].tmplpos != -1) {
            addLabel = ' <span style="font-weight: bold">Achtung!</span> {{Commonscat|…}} ist schon vorhanden';
          }
          else if(key == 1 && EightSisters.sisterData[0].tmplpos != -1) {
            addLabel = ' <span style="font-weight: bold">Achtung!</span> {{Commons|…}} ist schon vorhanden';
          }

          if(key >= 9) {
            if(key > 9 && EightSisters.sisterData[key].tmpl == EightSisters.sisterData[key - 1].tmpl && EightSisters.sisterData[key - 1].show == false)
              addLabel = ' <span style="font-weight: bold">Achtung!</span> {{' + EightSisters.sisterData[key - 1].param  + '|…}} ist schon vorhanden';
            if(key + 1 < Object.keys(EightSisters.sisterData) && EightSisters.sisterData[key].tmpl == EightSisters.sisterData[key + 1].tmpl && EightSisters.sisterData[key + 1].show == false)
              addLabel = ' <span style="font-weight: bold">Achtung!</span> {{' + EightSisters.sisterData[key + 1].param  + '|…}} ist schon vorhanden';
          }

          var template = EightSisters.makeTemplate(key, true);

          var doAdd = '';
          if(key >= 9)
            doAdd = 'hinzufügen';
          else
            doAdd = 'ergänzen';
          innerHtml += '<div id="editpage-addEightSisters' + key + '" class="oo-ui-layout oo-ui-labelElement oo-ui-fieldLayout oo-ui-fieldLayout-align-inline">' +
              '<div class="oo-ui-fieldLayout-body" id="bodyEightSisters' + key + '" >' +
                '<a class="editMenus-button" title="EightSisters' + key + '" id="buttonEightSisters' + key + '"style="text-decoration: none; white-space: nowrap;">' +
                  '<img data-id="' + key + '" title="Vorlage ' + EightSisters.sisterData[key].tmpl + section + ' ' + doAdd + '" alt="' + EightSisters.sisterData[key].tmpl + '" src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/f6/OOjs_UI_icon_check-constructive.svg/18px-OOjs_UI_icon_check-constructive.svg.png" width="18" height="18" style="cursor:pointer">' +
                '</a>' +
                '<span class="oo-ui-fieldLayout-header" id="headerEightSisters' + key + '">' +
                  '<label id="labelEightSisters' + key + '" title="Vorlage:' + EightSisters.sisterData[key].tmpl + section + ' ' + doAdd + '" for="AddEightSisters' + key + '" class="oo-ui-labelElement-label oo-ui-optionWidget" disabled="true">+ ' + template + addLabel +
                  '</label>' +
                '</span>' +
              '</div>' +
            '</div>';
        }
      }
      innerHtml += '</div></div>';
      var e = document.getElementById('wpSummaryLabel').parentElement;
      e.insertAdjacentHTML('beforebegin', innerHtml);

      for(var key in Object.keys(EightSisters.sisterData)) {
        if(EightSisters.sisterData[key].show) {
          document.getElementById('buttonEightSisters' + key).addEventListener('click', EightSisters.addTemplate);
        }
      }
    }
  },

  inRefOrComment : function(text, tmplPos) {
    var refStart = text.substring(0, tmplPos).lastIndexOf('<ref');
    if(refStart != -1) {
      if(text.substring(refStart, tmplPos).match(/<ref[^>]*\/>/) == false &&
         text.substring(refStart, tmplPos).indexOf('</ref') == -1)
        return true;
    }
    var commentStart = text.substring(0, tmplPos).lastIndexOf('<!--');
    if(commentStart != -1) {
      if(text.substring(commentStart, tmplPos).indexOf('-->') == -1)
        return true;
    }
    return false;
  },

  makeTemplate : function(key, withLink) {
    var template;
    if(withLink == true)
      template = '{{<a href="' + EightSisters.sisterData[key].pagelnk + EightSisters.sisterData[key >= 9 ? EightSisters.sisterData[key].add : key].commonsData + '">' + EightSisters.sisterData[key].tmpl + '</a>';
    else
      template = '{{' + EightSisters.sisterData[key].tmpl;
    if(key >= 9) {
      if(typeof(EightSisters.sisterData[key].param) == 'number')
        template += '|…|' + EightSisters.sisterData[EightSisters.sisterData[key].add].commonsData;
      else if(EightSisters.sisterData[key].data == 'pv')
        template += '|…|' + EightSisters.sisterData[key].param + '=' + EightSisters.sisterData[EightSisters.sisterData[key].add].commonsData;
      else if(EightSisters.sisterData[key].data == null)
        template += '|…<s>' + $('#wpTextbox1').textSelection('getContents').substring(EightSisters.sisterData[key].tmplpos, EightSisters.sisterData[key].tmplend) + '</s>';
      else if(EightSisters.sisterData[key].data instanceof RegExp)
        template += '|…|' + EightSisters.sisterData[key].param + '=' + EightSisters.sisterData[EightSisters.sisterData[key].add].commonsData.replace(EightSisters.sisterData[key].data, '');
      else
        template += '|…|?';
    }
    else {
      var title = mw.config.get('wgTitle');
      if(title != EightSisters.sisterData[key].commonsData) {
        template += '|' + EightSisters.sisterData[key].commonsData + '|';
        if(mw.config.get('wgNamespaceNumber') != 14) {
          if(title.endsWith(')')) {
            var brPos = title.lastIndexOf(' (');
            if(brPos != -1)
              template += title.substring(0, brPos);
            else
              template += title;
          }
          else
            template += title;
        }
        else {
          template += '{{SEITENNAME}}'
        }
      }
    }
    return template + '}}';
  },

  addTemplate : function(event) {
    EightSisters.analyseText(false);
    var img = event.target;
    if(!img.attributes['data-id'])
      img = img.firstChild;
    var targetKey = img.attributes['data-id'].value;
    if(EightSisters.sisterData[targetKey].foundAt != -1)
      return;
    var insertFrom = 0;
    var insertTo = 0;
    if(targetKey >= 9) {
      insertFrom = EightSisters.sisterData[targetKey].tmplpos;
      insertTo = EightSisters.sisterData[targetKey].tmplend;
    }
    else {
      if(EightSisters.addWeblinks == -1) {
        for(var key = 0; key <= targetKey; ++ key) {
          if(insertFrom < EightSisters.sisterData[targetKey].endpos)
            insertFrom = EightSisters.sisterData[targetKey].endpos;
        }
      }
      else
        insertFrom = EightSisters.addWeblinks;
      insertTo = insertFrom;
    }
    var template;
    if(targetKey >= 9) {
      if(typeof(EightSisters.sisterData[targetKey].param) == 'number')
        template = '|' + EightSisters.sisterData[EightSisters.sisterData[targetKey].add].commonsData;
      else if(EightSisters.sisterData[targetKey].data == 'pv')
        template = '|' + EightSisters.sisterData[targetKey].param + '=' + EightSisters.sisterData[EightSisters.sisterData[targetKey].add].commonsData;
      else if(EightSisters.sisterData[targetKey].data == null)
        template = '';
      else if(EightSisters.sisterData[targetKey].data instanceof RegExp)
        template = '|' + EightSisters.sisterData[targetKey].param + '=' + EightSisters.sisterData[EightSisters.sisterData[targetKey].add].commonsData.replace(EightSisters.sisterData[targetKey].data, '');
      else
        return;
    }
    else
      template = EightSisters.makeTemplate(targetKey, false) + '\n';
    var $textbox = $('#wpTextbox1');
    var text = $textbox.textSelection('getContents');
    var fixPos = 0;
    if(mw.config.get('wgNamespaceNumber') != 14) {
      if(EightSisters.addWeblinks != -1) {
        var newSection;
        if(text.substring(insertFrom - 2, insertFrom) == '\n\n')
          newSection = '== Weblinks ==\n';
        else
          newSection = '\n== Weblinks ==\n';
        for(var key in Object.keys(EightSisters.sisterData)) {
          if(EightSisters.sisterData[key].tmplpos != -1) {
            newSection += text.substring(EightSisters.sisterData[key].tmplpos, EightSisters.sisterData[key].endpos);
            text = text.substring(0, EightSisters.sisterData[key].tmplpos) + text.substring(EightSisters.sisterData[key].endpos);
            $textbox.textSelection('setSelection', { start: EightSisters.sisterData[key].tmplpos, end: EightSisters.sisterData[key].endpos });
            $textbox.textSelection('replaceSelection', '');
            if(EightSisters.sisterData[key].tmplpos < insertFrom)
              insertFrom -= EightSisters.sisterData[key].endpos - EightSisters.sisterData[key].tmplpos;
          }
          else if(key == targetKey)
            newSection += template;
        }
        if(text.substring(insertFrom, insertFrom + 1) != '\n')
          newSection += '\n';
        template = newSection;
      }
      else {
        if(text.substring(insertFrom, insertFrom + 1) == '\n' && text.substring(insertFrom + 1, insertFrom + 1) != '=')
          template = template.substring(0, template.length - 1);
      }
    }
    else {
      if(targetKey < 9) {
        if(text == '' || text.substring(insertFrom, insertFrom + 1) != '\n')
          template += '\n';
      }
    }

    addComment = '';
    if(targetKey >= 9 && EightSisters.sisterData[EightSisters.sisterData[targetKey].add].tmplpos != null) {
      var from = EightSisters.sisterData[EightSisters.sisterData[targetKey].add].tmplpos;
      var to = text.indexOf('}}', from);
      if(to != -1)  {
        to += 2;
        while(to < text.length && (text.substring(to, to + 1) == ' ' || text.substring(to, to + 1) == '\n'))
          ++ to;
      }

      $textbox.textSelection('setSelection', { start: from - 1, end: to });
      $textbox.textSelection('replaceSelection', text.substring(from - 1, from));
      addComment = ' (' + EightSisters.sisterData[targetKey].param + ' verschoben)';

      if(insertFrom > to) {
        insertFrom -= to - from;
        insertTo -= to - from;
      }
    }

    $textbox.textSelection('setSelection', { start: insertFrom, end: insertTo });
    $textbox.textSelection('replaceSelection', template);
    $textbox.textSelection('setSelection', { start: insertFrom, end: insertFrom + template.length });
    $textbox.textSelection('scrollToCaretPosition');

    e = document.getElementById('wpSummary');
    if(targetKey >= 9) {
      var addText = EightSisters.sisterData[targetKey].tmpl + ' mit [[Benutzer:Wurgl/8Schwestern|Helferlein]] ergänzt' + addComment;
      if(e.value == '')
        e.value = addText;
      else {
        if(e.value.indexOf(addText) == -1)
          e.value += ', ' + addText;
      }
    }
    else {
      if(e.value == '')
        e.value = EightSisters.sisterData[targetKey].tmpl + ' mit [[Benutzer:Wurgl/8Schwestern|Helferlein]] hinzugefügt';
      else {
        var parts = e.value.split(',');
        for(var i = 0; i < parts.length; ++ i) {
          if(parts[i].trim() == EightSisters.sisterData[targetKey].tmpl)
            return;
          var pos = parts[i].indexOf(' mit [[Benutzer:Wurgl/8Schwestern|Helferlein]] hinzugefügt');
          if(pos != -1) {
            var posU = parts[i].indexOf(' und ');
            if(posU != -1) {
              parts[i] = parts[i].substring(0, posU) + ', ' + parts[i].substring(posU + 5);
              pos -= 3;
            }
            if(parts[i].substring(0, pos) == EightSisters.sisterData[targetKey].tmpl)
              return;
            parts[i] = parts[i].substring(0, pos) + ' und ' + EightSisters.sisterData[targetKey].tmpl + parts[i].substring(pos);
            e.value = parts.join(', ');
            return;
          }
        }
        e.value += ', ' + EightSisters.sisterData[targetKey].tmpl + ' mit [[Benutzer:Wurgl/8Schwestern|Helferlein]] hinzugefügt';
      }
    }
    if(EightSisters.sisterData[targetKey].hint != null)
      mw.notify('EightSisters: Parameter "' + EightSisters.sisterData[targetKey].hint + '" eventuell ergänzen', {tag: 'parameter-hint', type: 'warn', autoHideSeconds: 30});
  },

  queryWikidataId : function(api, callback, queryParams) {
    api.get($.extend({}, queryParams, { 'continue': '' })).then(function(data) {
      callback(data);
    }).fail(function(code, data) {
      var extraText;
      if(code === 'http' && data) {
        extraText = (data.xhr && data.xhr.status ? '[' + data.xhr.status + ']' : '') +
                    (data.textStatus ? '' + data.textStatus + (data.exception ? ': ' : '') : '') +
                    (data.exception ? '' + data.exception : '');
      }
      else {
        extraText = code + (data && data.error && data.error.info ? ': ' + data.error.info : '');
      }
      mw.notify('EightSisters: Fehler beim Lesen der Wikidata-ID ' + ' (' + extraText + ')', {tag: 'EightSisters-error'});
    });
  }
};
$(EightSisters.execute);