/*
** name    = checkpage
** author  = Formatierer
** status  = tested in IE, Firefox and Opera
**
** This script checks some constraints in the german wiktionary
** Problems are displayed in the current window
** See also: http://de.wiktionary.org/wiki/Benutzer:Formatierer/checkpage_FAQ
**
** <nowiki>
*/

// begin namespace: checkpage
(function( _public, $, undefined ) {

var version = "autoedit/[[Benutzer:Formatierer/checkpage FAQ|checkpage]] 3.58";

// public:

_public.analyzePage = function() {
  var ns = mw.config.get("wgNamespaceNumber");
//  if (ns == 106 && (mw.config.get("wgUserName") == null
//    || !(mw.config.get("wgUserName") == "Udo T."
//    || mw.config.get("wgUserName") == "Formatierer"))) {
//    return;
//  }

  if (mw.config.get("wgArticleId") == "978526") {
   var cps = localStorage.getItem('checkpageStapel');
   if (cps && cps !== undefined) {
    createButtonNext("start");
   }
   return;
  }
  if (ns == 0 && mw.config.get("wgAction") == "edit"
      && window.name == "checkpageStapel") {
   createButtonNext("");
   return;
  }
  if (ns == 0 && mw.config.get("wgAction") == "view"
      && window.name == "checkpageStapel"
      && localStorage.getItem('checkpageStapel') !== undefined) {
   _public.Next();
   return;
  }

  if (ns == 0 || ns == 10 || ns == 106) {  // 10 = Templates 106 = Reim
    var pv = mw.util.getParamValue('checkpage');

    if (mw.config.get("wgAction") == "view") {
      if (pv) {
       if (pv == "auto") {
        _public.analyzeThisPage();
        return;
       }
       if (pv == "simulation") {
        doSimulation = true;
        _public.analyzeThisPage();
        return;
       }
       if (pv == "aktualisierung") {
        doAktualisierung = true;
        _public.analyzeThisPage();
        return;
       }
       if (pv == "reimen") {
        doReimen = true;
        _public.analyzeThisPage();
        return;
       }
      }

      if (document.getElementById("ca-view")) {
       var cp = mw.util.addPortletLink("p-views", null, "Check", "ca-checkpage",
                "checkpage() für diese Seite aufrufen",null,"#ca-view");
       $(cp).click(_public.analyzeThisPage);
      } else {
       var cp = document.createElement("a");
       cp.href = "#";
       cp.onclick = checkpage.analyzeThisPage;
       cp.innerHTML = 'Check';
       var nl = document.createElement("li");
       nl.appendChild(cp);
       $("#"+configDefault("CheckButton","pt-userpage")).before(nl);
      }

    }

    if (mw.config.get("wgAction") == "edit") {
      if (pv) {
        if (pv == "sortierung") {
          _public.sortTranslations(false);
          return;
        }
      }
    }

    var rl = mw.util.getParamValue("redlink");
    if (rl && rl == "1" && text){
      checkComp(text);
    }
    if (mw.config.get("wgAction") == "submit") {  // autocheck in preview mode only
      // get(url) gets LF + TEXT
      var text = internalText(document.editform.wpTextbox1.value);
      doReport=true;
      checkText(text,mw.config.get("wgPageName"),ns,getGadgetAnker(),partialEdit());
      checkComp(text);
      checkExtend(text,mw.config.get("wgPageName"));
    }
    if(canSort){
      createButtonTS();
    }
    createButtonCS();
  }
  
}


function getInputNode(n) {
 var b = document.getElementById(n);
 if (b && b.nodeName == "INPUT") {
  return b;
 }
 return $(b).find("INPUT")[0];
}


_public.checkSave = function() {
  var ns = mw.config.get("wgNamespaceNumber");
  // Trick, weil geturl auch immer eine Leerzeile einfügt
  var text = internalText(document.editform.wpTextbox1.value);
  var w = checkText(text,mw.config.get("wgPageName"),ns,getGadgetAnker(),partialEdit());
  if (w > 0) {
    getInputNode("wpPreview").click();
  } else {
    getInputNode("wpSave").click();
  }
}


_public.storageEventHandler = function(ev) {
 if (ev.url != window.location) {  //prevent self invocation
  if (ev.key == 'checkpageStapel') {
   if (ev.newValue == null || ev.newValue == "") {
    if (stapel.length > 0) {
     localStorage.setItem('checkpageStapel',stapelPop());
    }
   }
  }
 }
}


_public.SaveNext = function() {
 window.name = 'checkpageStapel';
 var button = getInputNode("wpSave");
 if (button) {
  button.click();
 } else { // start Batch
  _public.Next();
 }
}


_public.Stop = function() {
 window.name = "";
 localStorage.setItem('checkpageStapel',location.href);
 location.href = buildUrl2("Wiktionary:Stapelverarbeitung mit checkpage","");
}


_public.Cancel = function() {
 _public.Next();
}


_public.Next = function() {
 var href = localStorage.getItem('checkpageStapel');
 if (href && href != undefined && href != "undefined") {
  localStorage.removeItem('checkpageStapel');
  window.location = href;
 } else {
  window.name = "";
  location.href = buildUrl2("Wiktionary:Stapelverarbeitung mit checkpage","");
 }
}


function stapelAdd(key,value){
 stapel.push(key+value);
 stapel.sort();
 stapel.reverse();
}


function stapelPop(){
 if (stapel.length > 0) {
  var entry = stapel.pop().split("\f");
  return entry[2];
 }
 return "";
}


_public.sortTranslations = function(preview) {
  doSort = true;
  document.editform.wpTextbox1.value = checkTextSort(internalText(document.editform.wpTextbox1.value));
  if (document.editform.wpSummary.value.length == 0) {
    document.editform.wpSummary.value = "Ü-Tabelle sortiert";
  }
  if (preview) {
    document.getElementById("wpPreview").click();
  }
}


_public.Cats = function() {
  var list = $("#cp-head").nextUntil("#cp-sonstiges","DL");
  for (var i = 0; i < list.length; i++) {
    var spr = list[i].id.slice(3);
    // nur die blauen links heraussuchen
    var links = $(list[i]).find("[style*=0000E0]","A");
    cpCats[i] = {element: list[i], spr:spr, links:links};
    for (var j = 0; j < links.length; j++) {
      limit50(links[j].textContent,i,spr,handleResponseCats1);
    }
    limit50(null,i,spr,handleResponseCats1);
  }
  return false;  // Stop Gui Propagation
}


_public.fillDeVerbReg = function(schieb) {
  document.editform.wpTextbox1.value = fillDeVerbReg(internalText(document.editform.wpTextbox1.value),schieb);
}


_public.sortChapters = function() {
  doSortCh=true;
  document.editform.wpTextbox1.value = checkTextSort(internalText(document.editform.wpTextbox1.value));
  document.getElementById("wpPreview").click();
}


_public.analyzeThisPage = function() {
 if (inCheckThis) return false; // already done?
 inCheckThis = true;
 var node = document.getElementById("ca-view");
 if (node) node.classList.remove("selected");
 node = document.getElementById("ca-current");
 if (node) node.classList.remove("selected");
 node = document.getElementById("ca-checkpage");
 if (node) node.classList.add("selected");

 var oldid = mw.util.getParamValue( "oldid" );
 var oldidp = "";
 if ( oldid !== null ) {
  oldidp += "&oldid=" + oldid;
 }
 if(mw.config.get("wgNamespaceNumber")==106){
  checkRhyme();
 } else {
  if (getGadgetAnker()){
   thispage = mw.config.get("wgPageName");
   $.get(buildUrl(thispage)+oldidp, handleResponse);
  }
 }
 return false;
}


_public.aktualisierenAlle = function(id) {
 for (var t in pages) {
  if (pages[t].hasOwnProperty("id")) {
   if (pages[t].id == id && pages[t].hasOwnProperty("tx2")) {
    _public.aktualisieren(t);
   }
  }
 }
 $("#cp-AktAlle").hide();
}


_public.aktualisieren = function(t) {
 updateList(t,pages[t].tx2);
 delete pages[t].tx2;
}


_public.insUe2 = function() {
 var node=document.editform.wpTextbox1;
 if (node) {
  var t=node.value;
  if (contains(t,"({{Sprache|")) {return;}

  var itag=buildUe2();
  node.value=insertStr(t,0,itag);
  setCursor(node,0+itag.length);
 }
}

_public.insUe3 = function() {
 var node=document.editform.wpTextbox1;
 if (node) {
  var t=node.value;
  if (contains(t,"{{Wortart|")) {return;}
  var p = t.search(/\s==[\s\S]?\n/);
  if (p<0)
   {p=0;} else {
   var q= t.indexOf("\n",p);
   if (q<0) {p=p+3;
   } else {
    p=q+1;
   }
  }
  var itag=buildUe3(composit.w2d);
  node.value=insertStr(t,p,itag);
  setCursor(node,p+itag.length);

 }
}

_public.insST = function() {
 var node=document.editform.wpTextbox1;
 if (node) {
  var t=node.value;
  if (contains(t,"{{Deutsch Substantiv Übersicht")) {return;}
  var p = t.search(/\s===[\s]?\n/);
  if (p<0){
   p=0;
  } else {
   var q= t.indexOf("\n",p);
   if (q<0) {
    p=p+4;
   } else {
    p=q+1;
   }
  }

  var itag=buildSubTab(composit.w2d,composit.w1w+composit.wbs);
  node.value=insertStr(t,p,itag);
  setCursor(node,p+itag.length);
 }
}

_public.insWT = function() {
 var node=document.editform.wpTextbox1;
 if (node) {
  var t=node.value;
  if (contains(t,"{{Worttrennung}}")) {return;}
  var p = t.search(/{{Deutsch Substantiv Übersicht[\s\S]*\n}}/);
  if (p<0)
   {p=0;} else {
   var q= t.indexOf("\n}}",p);
   if (q>=0){
    p=q+3;
   }
  }

  var wt=$.trim(extractStr(composit.w2d,"{{Worttrennung}}","\n{{",'L'));
  var wts2=getWtSg(wt);
  var wtp2=getWtPl(wt);

  var d1=getData1();
  d1=$.trim(extractStr(d1,"{{Worttrennung}}","\n{{",'L'));
  var wts1=getWtSg(d1);
  var alt=wts1.hasOwnProperty("alt") || wts2.hasOwnProperty("alt");

  var wta="";
  var wtsa=[];
  var wtpa=[];

  var wtn="";
  var wtsn=[];
  var wtpn=[];
  wtsn=buildWtA(false,wts1,wts2);
  wtpn=buildWtA(false,wts1,wtp2);

  if(alt){
   wtn+="''Neue Rechtschreibung:'' ";
   wta+="\n:''Alte Rechtschreibung:'' ";
   wtsa=buildWtA(alt,wts1,wts2);
   wtpa=buildWtA(alt,wts1,wtp2);
   wta+=buildWtLine(wtsa,wtpa);
  }

  wtn+=buildWtLine(wtsn,wtpn);

  var itag="\n{{Worttrennung}}\n:"+wtn+wta+"\n";
  node.value=insertStr(t,p,itag);
  setCursor(node,p+itag.length);
 }
}

_public.insAus = function() {
 var node=document.editform.wpTextbox1;
 if (node) {
  var t=node.value;
  if (contains(t,"{{Aussprache}}")) {return;}
  var p = t.search(/{{Worttrennung}}/);
  if (p<0){
   p=0;
  } else {
   var q= t.indexOf("\n{{",p);
   if (q>=0){
    p=q+1;
   }
  }
  var itag='\n{{Aussprache}}\n'+buildIpa(composit.w2d,getIpaSg(getData1()),composit.w2w);
  itag+=':{{Hörbeispiele}} {{Audio|}}, {{Pl.}} {{Audio|}}\n\n';
  node.value=insertStr(t,p,itag);
  setCursor(node,p+itag.length);

 }
}

_public.insUeTab = function() {
 var node=document.editform.wpTextbox1;
 if (node) {
  var t=node.value;
  if (contains(t,"==== Übersetzungen ")) {return;}
  var p = t.search(/\n{{Referenzen}}/);
  if (p<0) {
   p=t.length;
  }

  var itag=buildUeTab();
  node.value=insertStr(t,p,itag);
  setCursor(node,p+itag.length);

 }
}

_public.insRef = function() {
 var node=document.editform.wpTextbox1;
 if (node) {
  var t=node.value;
  if (contains(t,"{{Referenzen}}")) {return;}
  var p = t.search(/{{Ü-rechts}}/);
  if (p<0) {
   p=0;
  } else {
   var q= t.indexOf("\n",p);
   if (q<0) {
    p=p+12;
   } else {
    p=q;
   }
  }

  var itag='\n'+buildReferenz(buildWort());
  node.value=insertStr(t,p,itag);
  setCursor(node,p+itag.length);

 }
}

_public.insAll = function() {
 _public.insUeTab();
 _public.insRef();
 _public.insAus();
 _public.insWT();
 _public.insST();
 _public.insUe3();
 _public.insUe2();
}

_public.neuesSubstantiv = function() {
// var p=prompt("Bestandteile des Kompositums eingeben. Beispiel:  Leder;Jacke  oder  Bär;en;Hunger");
var text = internalText(document.editform.wpTextbox1.value);
 var p=extractStr(text,"{{Herkunft}}",'','L');
 p=extractStr(p,":",'\n');
alert (p);
 var a1=p.match(/\[\[\S*\]\]/g);
 var pn=mw.config.get("wgPageName");
 var i;
var a=[];
 for (i=a1.length-1;i>=0;i--) {
   if (endsWith(pn,a1[i].substring(2,a1[i].length-2).toLowerCase())) {
     a[2]=a1[i].substring(2,a1[i].length-2);
   }
   if (startsWith(pn,a1[i].substring(2,a1[i].length-2))) {
     a[0]=a1[i].substring(2,a1[i].length-2);
   }
 }
 a[1]=extractStr(pn,a[0],a[2].toLowerCase(),'B');
 p=a.join(';');
 p=p.replace(/\s/g,'');
 a=p.split(';');

 if (a.length == 2) {
  a[2]=a[1];
  a[1]="";
 }

 composit={w1ex:false,w2ex:false,w1d:'',w2d:'',ausspr:false};
 composit.w0w=a[0];
 composit.w1w=a[0]+a[1];

 if (endsWith(a[1],'-')){
  composit.wbs='-';
  composit.w1w=a[0]+a[1].substr(0,a[1].length-1);
 }
 composit.w2w=a[2];


 if (a.length == 3) {
  if(a[1].length >0) {
   $.get(buildUrl(a[0]+a[1]),handleResponseW1F);
  }
  $.get(buildUrl(a[0]),handleResponseW1);
  $.get(buildUrl(a[2]),handleResponseW2);
 } else {
  alert("Hä? '"+p+"'");
 }
}


// private:

// flow control
var doAktualisierung=false;
var doAktualisierungButton=false;
var doReport=false;
var doSort=false;
var doSortCh=false;
var canSort=false;
var doSortierungButton=false;
var inCheckThis=false;
var doSimulation=false;
var doSimulationButton=false;
var doSprachenButton=false;
var doStapelButton=false;
var doReimen=false;
var doReimenButton=false;
var VerbkonjugationDone=false;

var reorder=[];
var flexion={};
var flexionv={};
var flexionvls={};
var flexionReime={};
var sections={};
var extend={wt:false,ls:false,hb:false};
var composit={w0w:'',w1w:'',wbs:'',w2w:'',w1ex:false,w2ex:false,w1d:'',w2d:'',ausspr:false};
var worttr={};
var lautschr={};
var hoerbsp={};
var reime={};
var stapel=[];  // Stapelverarbeitung
var sprk = { "Deutsch":"de", "Englisch":"en", "Esperanto":"eo", "Französisch":"fr", "Italienisch":"it",
    "Niedersorbisch":"dsb", "Obersorbisch":"hsb", "Polnisch":"pl", "Russisch":"ru", "Ukrainisch":"uk", "Weißrussisch":"be"};

var thispage = "";
var pages = {};

var limitCnt = 0;
var limitTxt = '';
var cpCats = [];

var lsleer = "{{Lautschrift|}}";    // <-- Hier noch das … entfernen
var lsnorm = "{{Lautschrift|…}}";

function page(title,text){
 this.title=title;
 this.text=text;
}

function handleResponseW1(data){
 composit.w1d=data;
 callSubstantiv();
}

function handleResponseW2(data){
 composit.w2d=data;
 callSubstantiv();
}


function callSubstantiv(){
 if ((composit.w1ex == (composit.w1d.length > 0)) &&
  (composit.w2ex == (composit.w2d.length > 0)))
 {
  createTools(composit.w2d);
 }
}


function createTools(data){

 var node=document.getElementById("editform");
 if (node){
  if(composit.w2d.length ==0) {return;}

  var b = '<hr>Ergänze: | <a title="Überschrift 2" href="javascript:checkpage.insUe2()">Ü2</a>';
  b += ' | <a title="Überschrift 3" href="javascript:checkpage.insUe3()">Ü3</a>';
  b += ' | <a href="javascript:checkpage.insST()">Substantivtabelle</a>';
  if (composit.w1d.length > 0) {
   b += ' | <a href="javascript:checkpage.insWT()">Worttrennung</a>';
   b += ' | <a href="javascript:checkpage.insAus()">Aussprache</a>';
  }
  b += ' | <a href="javascript:checkpage.insUeTab()">Übersetzungen</a>';
  b += ' | <a href="javascript:checkpage.insRef()">Referenzen</a>';
  b += ' | <a href="javascript:checkpage.insAll()">Alles</a> |<hr>';
  var div=document.createElement("div");
  div.innerHTML += b;
  node.parentNode.insertBefore(div,node);
 }else{
  insertIpa(data);
 }
}


function insertIpa(data){

  var node = getGadgetAnker();   // top of page
  if(node){

   if(composit.w1d.length > 0 && composit.w2d.length > 0){
    var ls=buildIpa(composit.w2d,getIpaSg(getData1()),composit.w2w);
    if (composit.ausspr==false) {
     ls='{{Bedeutungen}}\v{{Aussprache}}\n'+ls+
        ':{{Hörbeispiele}} {{Audio|}}, {{Pl.}} {{Audio|}}\n\n{{Bedeutungen}}\v';
    } else {
     ls=':{{IPA}}.*\n\v'+ls+'\v';
    }

    if (config("LautschriftVorschlagen") && contains(ls,"{{Lautschrift") && !contains(ls,"…")) {

     var nl = document.createElement("a");
     var t=mw.config.get("wgPageName");

     nl.href=buildUrl2(t,"&action=edit")+
      "&editintro=Vorlage:Autoedit/intro&autoedit="+
      encodeURIComponent("s\v"+ls)+
      "&autominor=true&autosummary=IPA erg. ("+version+")";

     nl.innerHTML = t;
     nl.setAttribute("style", "color:#FFC000");
     appendWithComma("Deutsch","-ls",nl);

    }
   }
  }
}


function internalText(t){
  var regLs = /\{\{\s*Lautschrift\s*(\|\s*spr\s*=\s*de\s*)?\|(\|\s*spr\s*=\s*de\s*)?\}\}/g;
  return '\n' + t.replace(regLs,lsnorm);
}


function externalText(t){
  if (t[0] == '\n') {
    return externalLS(t).substr(1);
  }
  return externalLS(t);
}


function externalLS(t){
  return t.replace(/\{\{Lautschrift\|…\}\}/g,lsleer);
}


function repl(f,r,p) {
 return "s\v"+f+'\v'+r+'\v'+p;
}


function anlegenAlle() {
 localStorage.setItem('checkpageStapel',stapelPop());
 window.addEventListener("storage", _public.storageEventHandler);
}


function handleResponse(data){
 var node = getGadgetAnker();  // top of page
 if (node) {
  var ns = mw.config.get("wgNamespaceNumber");
  doReport = true;
  data = internalText(data);
  pages[thispage] = new page(thispage,data);
  checkText(data,thispage,ns,node,"");
  if (ns == 0) {
   checkExtend(data,thispage);
   checkComp(data);
  }
 }
}


function handleResponseLinks(data){
 if (data.parse !== undefined && data.parse.links !== undefined) {
  addFlexionLinks(data.parse.links,1);
 }
}


function handleResponseLinksV(data){
 if (data.parse !== undefined && data.parse.links !== undefined) {
  if (!VerbkonjugationDone) {
   addFlexionLinks(data.parse.links,2);
  }
  VerbkonjugationDone=true;
 }
}


function handleResponseDim(diminutiv, dpl){

 var node = getGadgetAnker();   // top of page
 if (node) {

  for (var i = dpl.length - 1; i >= 0; i--){
   var t = dpl[i]['*'];
   if (!dpl[i].hasOwnProperty("exists")) {

    var pnf='';

    var nl=document.createElement("a");
    if (contains(t,'ß')){
     pnf = "\n{{Alternative Schreibweisen}}\n:{{CH&LI}} [["+t.replace(/ß/g,'ss')+"]]\n";
    }

    nl.href=buildUrl2(t,"&action=edit")+
     "&editintro=Vorlage:Autoedit/intro&preload=Vorlage:Autoedit/"+diminutiv[t].vorlage+"&autoedit="+
     encodeURIComponent(
      repl("@NF@",pnf,"g;")+
      repl("@1@",diminutiv[t].wt,"g;")+
      repl("@3@",externalLS(diminutiv[t].ls),"g;")+
      repl("@4@",diminutiv[t].bed,"g;")+
      repl("@6@",diminutiv[t].rest,"g;")+
      repl("@7@",diminutiv[t].ref,"g")
     )+"&autominor=false&autosummary=Verkleinerungsform ("+version+")";

    nl.innerHTML = t;
    nl.setAttribute("style", "color:#CC0000");
    appendWithComma("Deutsch","-vform",nl,diminutiv[t].id);

   }

  }
 }
}


function handleResponseFem(feminin, dpl){
 
 var i=dpl.length-1;

 for(;i>=0;i--){
  var t = dpl[i]['*'];
  if (!dpl[i].hasOwnProperty("exists")) {

   var node = getGadgetAnker();   // top of page
   if(node){

    var pnf='';
    if (contains(t,'ß')){
     pnf="\n{{Alternative Schreibweisen}}\n:{{CH&LI}} [["+t.replace(/ß/g,'ss')+"]]\n";
    }

    var nl=document.createElement("a");
    nl.href=buildUrl2(t,"&action=edit")+
     "&editintro=Vorlage:Autoedit/intro&preload=Vorlage:Autoedit/"+feminin.vorlage+"&autoedit="+
     encodeURIComponent(
      repl("@NF@",pnf,"g;")+
      repl("@1@",feminin.wt,"g;")+
      repl("@2@",t+"nen","g;")+
      repl("@3@",externalLS(feminin.ls),"g;")+
      repl("@4@",feminin.bed,"g;")+
      repl("@5@",mw.config.get("wgPageName"),"g;")+
      repl("@6@",feminin.rest,"g;")+
      repl("@7@",feminin.ref,"g")
     )+"&autominor=false&autosummary=weibl. Form ("+version+")";

    nl.innerHTML = t;
    nl.setAttribute("style", "color:#CC0000");
    appendWithComma("Deutsch","-wform",nl,feminin.id);
   }

  }
 }

}


function handleResponseWB(wobi, dpl){

 for (var i = dpl.length - 1; i >= 0; i--){
  var t = dpl[i]['*'];
  if (!dpl[i].hasOwnProperty("exists")) {

   var node = getGadgetAnker();   // top of page
   if (node){

    var pnf = '';
    if (contains(t,'ß')){
     pnf = "\n{{Alternative Schreibweisen}}\n:{{CH&LI}} [["+t.replace(/ß/g,'ss')+"]]\n";
    }

    var wb = wobi[t];

    var rest = '';
    if (wb.vorlage == "de-Sub-Wb") {
     rest += repl("@G@",wb.genus,"g;")+
      repl("@GS@",wb.gs,"g;")+
      repl("@DS@",wb.ds,"g;")+
      repl("@AS@",wb.as,"g;")+
      repl("@NP@",wb.np,"g;")+
      repl("@GP@",wb.gp,"g;")+
      repl("@DP@",wb.dp,"g;")+
      repl("@AP@",wb.ap,"g;");
    }
    if (wb.vorlage == "de-Adj-Wb") {
     rest += repl("@K@",wb.komp,"g;") + repl("@S@",wb.sup,"g;");
    }

    var nl=document.createElement("a");
    nl.href=buildUrl2(t,"&action=edit")+
     "&editintro=Vorlage:Autoedit/intro&preload=Vorlage:Autoedit/"+wb.vorlage+"&autoedit="+
     encodeURIComponent(
      repl("@1@",wb.wt,"g;")+
      repl("@2@",t+"en","g;")+
      repl("@3@",externalLS(wb.ls),"g;")+
      repl("@4@",wb.bed,"g;")+
      repl("@6@",wb.rest,"g;")+
      repl("@7@",wb.ref,"g;") + rest +
      repl("@NF@",pnf,"g")
     )+"&autominor=false&autosummary=Wortbildung ("+version+")";

    nl.innerHTML = t;
    nl.setAttribute("style", "color:#CC0000");
    appendWithComma("Deutsch","-wbform",nl,wb.id);
   }

  }
 }

}


function handleResponseLinksComp(data){
 if (data.parse !== undefined && data.parse.links !== undefined) {
  var dpl=data.parse.links;
  var i=dpl.length-1;

  for(;i>=0;i--){
   var t = dpl[i]['*'];
   if (dpl[i].hasOwnProperty("exists")) {

    if (composit.w1w==t) {
     composit.w1ex=true;
     $.get(buildUrl(t),handleResponseW1);
    }

    if (composit.w2w==t) {
     composit.w2ex=true;
     $.get(buildUrl(t),handleResponseW2);
    }
   }
  }

  if(!composit.w1ex){
   i=dpl.length-1;
   for(;i>=0;i--){
    var t = dpl[i]['*'];
    if (dpl[i].hasOwnProperty("exists")) {
     if (composit.w1w==toUpperFirst(t)) {
      composit.w1ex=true;
      $.get(buildUrl(t),handleResponseW1);
     }
    }
   }
  }

 }
}


function handleResponseExtend(data){

  var node = getGadgetAnker();   // top of page
  if(node){

    var wt="";
    var wta="";
    var wtn="";
    var ls=lsnorm;
    var hb="{{Audio|}}";
    var a1=[];
    var a2=[];
    var lsx="";
    var wtx="";
    var w=extractStr(data,"{Wortart|Substantiv|Deutsch","\n==");
    w=extractStr(w,"{{Worttrennung}}","{{Bedeutungen}}");

    worttr=getWtStruct(extractStr(w,"{{Worttrennung}}","\n{{",'B'));
    lautschr=getSgPlStruct(extractStr(w,":{{IPA}}","\n",'B'));
    var s=buildPropNeu(lautschr,"Sg.");

    switch(extend.kasus){

    case "deGenSgses":

     if(s.length>0 && !contains(s,"…")){
      ls=lsPlusE(extend.gf,s,"səs");
     }
     wt=buildWtNeu(worttr,"Sg.");
     wt=wtPlusE(wt,"·ses");
     break;

    case "deGenSges":

     if(s.length>0 && !contains(s,"…")){
      ls=lsPlusE(extend.gf,s,"əs");
     }
     wt=buildWtNeu(worttr,"Sg.");
     wt=wtPlusE(wt,"es");
     break;

    case "deGenSgs":

     if(s.length>0 && !contains(s,"…")){
      ls=lsPlusE(extend.gf,s,"s");
     }
     wt=buildWtNeu(worttr,"Sg.");
     wt+="s";
     break;

    case "deDatSge":

     if(s.length>0 && !contains(s,"…")){
      ls=lsPlusE(extend.gf,s,"ə");
     }
     wt=buildWtNeu(worttr,"Sg.");
     wt=wtPlusE(wt,"e");
     break;

    default:

     if(extend.kasus=="deDatPln"){
      lsx="n";
      wtx="n";
     }
     var at=w.split("{{Aussprache}}");
     a1=at[0].split("{{Pl.}}");
     if (a1.length == 3) {
      if(contains(a1[0],"te Rechts")) {
       wta=$.trim(extractStr(a1[1]," ","\n"));
       wtn=$.trim(extractStr(a1[2]," ","\n"));
      }
      if(contains(a1[0],"ue Rechts")) {
       wta=$.trim(extractStr(a1[2]," ","\n"));
       wtn=$.trim(extractStr(a1[1]," ","\n"));
      }
      //wt="''Neue Rechtschreibung:'' "+wtn+wtx+"\n:''Alte Rechtschreibung:'' "+wta+wtx;
      wt=wtn+wtx;
     }

     if (a1.length == 2) {
      wt=$.trim(extractStr(a1[1]," ","\n"))+wtx;
     }

     if (at.length == 2) {
      a2=at[1].split("{{Pl.}}");
      if (a2.length > 1) {
       if (extend.ls) {
        ls=$.trim(extractStr(a2[1]," ","\n"));
        ls=ls.replace(/([^….])\}\}/g,"$1"+lsx+"}}");
        if (endsWith(thispage,"en")){
         ls=anpassenLsEn(thispage,ls);
        }
       }
       if (extend.hb && a2.length > 2) {
        hb=$.trim(extractStr(a2[2]," ","\n"));
       }
      }
     }
    }

    if (extend.wt && wt.length>0
      || extend.ls && !contains(ls,'…')
      || extend.hb && !contains(hb,"{fehlend}") && !contains(hb,"{Audio|}")) {

     var nl = document.createElement("a");
     var t = mw.config.get("wgPageName");

     nl.href=buildUrl2(t,"&action=edit")+
      "&editintro=Vorlage:Autoedit/intro&autoedit="+
      encodeURIComponent(
        repl("Worttrennung}}\n\n","Worttrennung}}\n:"+wt+"\n\n",";")+
        repl("Worttrennung}}\n:\n","Worttrennung}}\n:"+wt+"\n",";")+
        repl("{{Lautschrift\\|\\.\\.\\.}}|{{Lautschrift\\|…}}|{{Lautschrift\\|}}",ls,";")+
        repl("{{Audio\\|}}|{{fehlend}}",hb,"")
      )+"&autominor=true&autosummary=erg. ("+version+")";

     var pv=mw.util.getParamValue('checkpage');
     if (pv && pv=="auto") {
      window.location.href=nl.href;
      return;
     }

     nl.innerHTML = t;
     nl.setAttribute("style", "color:#FFC000");
     appendWithComma(extend.sp,"-erg",nl);

    }
  }
}


function sucheVerbtabellen(data){
 var ar = [];
 var id = 'id="Infinitive_und_Partizipien';
 var part,part0,part1,part2,part3 = '';
 var posa,posb,p1,p2;
 var hdrregexp = /<h[1-6].*class="mw-headline"(.*\.28Konjugation\.29.*\.28Deutsch\.29).*<\/h[1-6]>/g;

 if (data.search(hdrregexp) == -1) {
  hdrregexp = /<h[1-6].*class="mw-headline"(.*\(Konjugation\).*\(Deutsch\)).*<\/h[1-6]>/g;
 }

 var hdrs = data.split(hdrregexp);

 for (var h=1; h < hdrs.length; h+=2) {

  posa = hdrs[h+1].indexOf(id);

  while (posa >= 0) {
   posb = hdrs[h+1].indexOf(id,posa+1);
   if (posb >= 0) {
    part = hdrs[h+1].substring(posa,posb);
   } else {
    part = hdrs[h+1].substring(posa);
   }

   posa = posb;

   p1 = part.indexOf('title="Hilfe:Infinitiv"');
   if (p1 < 0) continue;
   p2 = part.indexOf('id="Finite_Formen',p1);
   if (p2 < 0) continue;
   part0 = part.substring(p1,p2);

   p1 = part.indexOf('title="Hilfe:Imperativ"');
   if (p1 < 0) continue;
   p2 = part.indexOf('>Höflichkeitsform',p1);
   if (p2 < 0) continue;
   part1 = part.substring(p1,p2);
   if (part1.indexOf('. Pers') < 0) continue;

   p1 = part.indexOf('>Präsens<',p2);
   if (p1 < 0) continue;
   p2 = part.indexOf('>Präteritum<',p1);
   if (p2 < 0) continue;
   part2 = part.substring(p1,p2);
   if (part2.indexOf('. Pers') < 0) continue;

   p1 = part.indexOf('>Perfekt<',p2);
   if (p1 < 0) continue;
   part3 = part.substring(p2,p1);
   if (part3.indexOf('. Pers') < 0) continue;

   ar.push(hdrs[h],part0,part1,part2,part3);
  }
 }
 return ar;
}


function verbAktiv(idx,s1,ht,konj12){
 var i,s1a,s1b;
 var hta = ["1. Person Singular","2. Person Singular","3. Person Singular",
            "1. Person Plural","2. Person Plural","3. Person Plural"];
 var htai = 0;
 var hsns = '';

 s1a=s1.split("<tr>");
 for(i=0;i<s1a.length;i++){
  if(contains(s1a[i],"Hauptsatz")){
   hsns=" der Hauptsatzkonjugation";
  }
  s1b=s1a[i].split(". Pers");
  if (s1b.length > 1){
   s1b=s1b[1].split("</td>",5);
   addFlexionVerb(idx,2,"Deutsch",s1b[1],thispage,"","","",hta[htai]+" Indikativ"+ht+hsns);
   addFlexionVerb(idx,2,"Deutsch",s1b[2],thispage,"","","",hta[htai]+" Konjunktiv"+konj12+ht+hsns);
   if (hsns != ''){
    addFlexionVerb(idx,2,"Deutsch",s1b[3],thispage,"","","",hta[htai]+" Indikativ"+ht+" der Nebensatzkonjugation");
    addFlexionVerb(idx,2,"Deutsch",s1b[4],thispage,"","","",hta[htai]+" Konjunktiv"+konj12+ht+" der Nebensatzkonjugation");
   }
   htai++;
  }
 }

}


function handleResponseKonjugation(data){
 data = data.replace(/&#32;|&#160;/g,' ');

 var h,i,j,s1a,s1b;
 var ar = sucheVerbtabellen(data);

 for (h=0;h<ar.length-1;h=h+5) {

  var idx = matchSection(ar[h]);
  s1a = ar[h+1].split("</tr>");

  var formenG = [];
  var formenP1 = [];
  var formenP2 = [];
  var posi = '';
  for (i=0; i<s1a.length; i++){
   if (contains(s1a[i],">erweiterte Infinitive<") || contains(s1a[i],">erweitert<")){
    s1b = s1a[i+1].split("</td>",2);
    if (!contains(s1b[1],"zu ")) {
     addFlexionVerb(idx,2,"Deutsch",s1b[1],thispage,"","","","erweiterter Infinitiv Aktiv");
     formenG = getFormenVerb(s1b[1]);
     posi = formenG[0] + "d";
    }
   }

   if (contains(s1a[i],">Gerundivum<")) {
    s1b = s1a[i+1].split("</td>",3);
    if (!contains(s1b[2],"—")) {
     addFlexionAdjPositiv(idx.i2,idx.i3,posi,thispage,[],['…'],'',"Gerundivum",'','','',"");
     setPositivPass(idx,2,"gvform",formenG[0]);
    }
   }
   if (contains(s1a[i],">Partizipien<")) {
    s1b = s1a[i+2].split("</td>",2);
    formenP1 = getFormenVerb(s1b[0]);
    formenP2 = getFormenVerb(s1b[1]);
   }
   if (contains(s1a[i],">Flexion der Verbaladjektive<")) {
    s1b = s1a[i+1].split("</td>",2);
    if (contains(s1b[0],"—")) {
     if (sections[idx.i2].child[idx.i3].flexion[formenP1[0]] === undefined) {
      sections[idx.i2].child[idx.i3].flexion[formenP1[0]] = 
        new flex(formenP1[0],"de-Verb",idx.i2,idx.i3,2);
     } 
     sections[idx.i2].child[idx.i3].flexion[formenP1[0]].vap1 = false;
    } else {
     addFlexionAdjPositiv(idx.i2,idx.i3,formenP1[0],formenP1[0],[],['…'],'',"Posi",['…'],'','',"");
     setPositivPass(idx,2,"p1form");
    }
    for (j = 0; j < formenP2.length; j++) {
     if (!contains(s1b[1],"Flexion:" + formenP2[j])) {
      if (sections[idx.i2].child[idx.i3].flexion[formenP2[j]] === undefined) {
       sections[idx.i2].child[idx.i3].flexion[formenP2[j]] = 
         new flex(formenP2[j],"de-Verb",idx.i2,idx.i3,2);
      }
      sections[idx.i2].child[idx.i3].flexion[formenP2[j]].vap2 = false;
     } else {
      formenP2[j] = $.trim(formenP2[j]);
      var o = {};
      var f3 = sections[idx.i2].child[idx.i3].flexion;
      if (f3.hasOwnProperty(formenP2[j])) {
       o[formenP2[j]] = f3[formenP2[j]].wt;
      }
      addFlexionAdjPositiv(idx.i2,idx.i3,formenP2[j],formenP2[j],o,['…'],'',"Posi",['…'],'','',"");
     }
     setPositivPass(idx,2,"p2form");
    }
   }
  }

  var ht = " Präsens Aktiv";
  var pt = "2. Person Singular";
  s1a = ar[h+2].split("<tr>");

  for (i=0;i<s1a.length;i++){
   if(contains(s1a[i],". Pers")){
    s1b=s1a[i].split("</td>",2);
    addFlexionVerb(idx,2,"Deutsch",s1b[1],thispage,"","","",pt+" Imperativ"+ht);
    pt = "2. Person Plural";
   }
  }

  verbAktiv(idx,ar[h+3],ht," I");
  verbAktiv(idx,ar[h+4]," Präteritum Aktiv"," II");

  if (idx.i2 != 0) {
   createFlexionWtLsVerb(idx);
   findMissingLsVerb(idx);
   deleteDuplicateLSFlexion(idx);
  }
 }

 createSchreibweiseCH(sections,2);

 var i2,i3,s2,s3;
 for (i2=1;i2<sections.length;i2++) {
  s2 = sections[i2];
  for (i3=1;i3<s2.child.length;i3++) {
   s3 = s2.child[i3];
   for (var k in s3.flexion) {
    flexionv[k] = s3.flexion[k];
   }
  }
 }
 
 if (!isEmpty(flexionvls)) {
  requestMissingLs();
 } else {
  if (!isEmpty(flexionv)) {
   apiParseLinks(flexionv,handleResponseLinksV,2);
  }
 }

}


function requestMissingLs() {
 var t = "";
 for (var form in flexionvls) {
  if (t.length == 0) {
    t += form;
  } else {
    t += "|" + form;
  }
 }

 var urlls = buildApi("","action=query&prop=revisions&format=json&rvprop=content&titles=" + mw.util.wikiUrlencode(t));
 $.get(urlls, handleResponseLs);
}


function findMissingLsVerb(idx) {

 // prefix aus der Herkunft ermitteln
 var tmp = getHerkunft(sections[idx.i2].child[idx.i3].text);
 var prefix = "";
 for (var i = 0; i < tmp.length; i++) {
  if (startsWith(thispage,tmp[i]) && tmp[i].length > 0 && tmp[i].length < thispage.length) {
   prefix = tmp[i];
  }
 }

 // sonst prefix aus der Worttrennung Präteritum ermitteln
 if (prefix.length == 0) {
  var tmp = buildPropNeu(sections[idx.i2].child[idx.i3].worttr,"Prät");
  if (!contains(tmp,",")) {
   var ar = tmp.split(" ");
   if (ar.length == 2) {
    prefix += ar[1].replace(/·/g,'');
   }
  }
 }

 // sonst prefix aus der Worttrennung Infinitiv ermitteln
 if (prefix.length == 0) {
  var tmp = buildPropNeu(sections[idx.i2].child[idx.i3].worttr,"Inf");
  if (startsWith(tmp,":")) {
   tmp = tmp.substring(1);
  }
  var ar = tmp.split("·");
  for (var i = 0; i < ar.length - 2; i++) {
   prefix += ar[i];
  }
 }

 var prefixls = getPrefixLsVerb(prefix,buildPropNeu(sections[idx.i2].child[idx.i3].lautschr,"Inf"));

 if (prefix.length == 0 || prefixls.length == 0) {
  return; // Präfix oder dessen Lautschrift nicht ermittelbar
 }

 // Tabelle flexionvls mit fehlenden Lautschriftteilen aufbauen
 var f3 = sections[idx.i2].child[idx.i3].flexion;
 for (var verb in f3) {
  var fi = f3[verb];
  fi.prefix = prefix;
  fi.prefixls = prefixls;
  if (fi.ls.length == 0 && fi.vorlage != "ch-Schreibweise") { // nicht für CH-Formen
   if (startsWith(verb,prefix)) {
    var vt = verb.slice(prefix.length);
    flexionvls[vt] = "";
    if (startsWith(fi.vorlage,"de-Adj-")) { // ge-Partizip suchen
     flexionvls["ge" + vt] = "";
    }
   } else {
    var pos = verb.indexOf(" ");
    if (pos > 0) {
     flexionvls[verb.slice(0,pos)] = "";
    }
   }
  }
 }

}


function getLautschriftInf(t) {
  var su = "";
  if (contains(t,"{{Wortart|Konjugierte Form|Deutsch}}")) {
    su = "{{Wortart|Konjugierte Form|Deutsch}}";
  } else if (contains(t,"{{Wortart|Deklinierte Form|Deutsch}}")) {
    su = "{{Wortart|Deklinierte Form|Deutsch}}";
  } else {
    su = "{{Wortart|Partizip II|Deutsch}}";
  }
  t = extractStr(t,su,"{{Grammatische Merkmale}}",'B');
  var lautschr = getStructPP(extractStr2(t,":{{IPA}}",":{{Hörbeispiele}}","\n",'B'));
  return buildPropNeu(lautschr,"Inf");
}


function handleResponseLs(data){

 if (data.query !== undefined && data.query.pages !== undefined) {
  for (var form in flexionvls) {
   var txt = getRevision(data.query.pages,form);
   if (!pages.hasOwnProperty(form)) {
    pages[form] = new page(form,txt);
   }
  }

  var i2,i3,s2,s3;
  for (i2 = 1; i2 < sections.length; i2++) {
   s2 = sections[i2];
   for (i3 = 1; i3 < s2.child.length; i3++) {
    s3 = s2.child[i3];
    var f3 = sections[i2].child[i3].flexion;

    for (var verb in f3) {
     var fi = f3[verb];
     if (fi.ls.length == 0 && fi.vorlage != "ch-Schreibweise") { // nicht für CH-Formen

      var p1ls = '';
      if (startsWith(verb,fi.prefix)) {  // nicht getrennte Formen
       var form = verb.slice(fi.prefix.length);
       if (!pages.hasOwnProperty(form)) {
        continue;
       }
       var t = pages[form].text;
       if (t.length == 0) {
        if (startsWith(fi.vorlage,"de-Adj-")) {
         t = pages["ge" + form].text;
         if (t.length == 0) {
          continue;
         }
         p1ls = getLautschriftInf(t);
         p1ls = p1ls.replace(/schrift\|ɡə/g,"schrift|");
        } else {
         continue;
        }
       } else {
        p1ls = getLautschriftInf(t);
       }
      
       for (var i = 0; i < fi.prefixls.length; i++) {
        var tmpls = p1ls;
        if (contains(fi.prefixls[i],"ˈ")) {  // betont
         tmpls = p1ls.replace(/ˈ/g,"ˌ");   // nebenbetont
         if (!contains(tmpls,"ˌ")) {
          tmpls = tmpls.replace(/schrift\|/g,"schrift\|ˌ");
         }
        } else {
         if (!contains(tmpls,"ˈ")) {
          tmpls = tmpls.replace(/schrift\|/g,"schrift\|ˈ");
         }
        }
        if (form.search(/^[aeiouäöüy]/) >= 0) {  // Knacklaut
         tmpls = tmpls.replace(/schrift\|([ˈˌ]?)/g,"schrift\|$1ʔ");
        }
        if (fi.ls.length > 0) {
          fi.ls += ", ";
        }
        fi.ls += tmpls.replace(/schrift\|/g,"schrift\|" + fi.prefixls[i]);
        fi.ls = cleanupLsPf(fi.ls);
       }

      } else {  // getrennte Formen

       var pos = verb.indexOf(" ");
       if (pos > 0) {
        var t = pages[verb.slice(0,pos)].text;
        if (t.length == 0) continue;
        var p1ls = getLautschriftInf(t);

        for (var i = 0; i < fi.prefixls.length; i++) {
         var tmpls = p1ls;
         if (contains(fi.prefixls[i],"ˈ")) {  // betont
          tmpls = p1ls.replace(/ˈ/g,"ˌ");   // nebenbetont
          if (!contains(tmpls,"ˌ")) {
           tmpls = tmpls.replace(/schrift\|/g,"schrift\|ˌ");
          }
         } else {
          if (!contains(tmpls,"ˈ")) {
           tmpls = tmpls.replace(/schrift\|/g,"schrift\|ˈ");
          }
         }
         if (fi.ls.length > 0) {
           fi.ls += ", ";
         }
         fi.ls += tmpls.replace(/\}\}/g," " + fi.prefixls[i]+"}}");
         fi.ls = cleanupLsPf(fi.ls);
        }
       }
      }
     }

    }  // end for (verb... loop

   }
  }
 }

 if (!isEmpty(flexionv)) {
  apiParseLinks(flexionv,handleResponseLinksV,2);
 }
}


function matchSection(hdr){
 var idx = {i2:0, i3:0};
 var i2,i3,s2,s3;
 for (i2 = 1; i2 < sections.length; i2++) {
  s2 = sections[i2];
  if (contains(s2.head,"Sprache|Deutsch")) {
   for (i3=1;i3<s2.child.length;i3++) {
    s3 = s2.child[i3];
    if (contains(s3.head,"Wortart|Verb")) {
     if (contains(hdr,"untrennbar")) {
      if(contains(s3.head,"untrennbar")) {
       idx.i2 = i2;
       idx.i3 = i3;
      }
     }else if (contains(hdr,"trennbar")) {
      if(!contains(s3.head,"untrennbar") && contains(s3.head,"trennbar")) {
       idx.i2 = i2;
       idx.i3 = i3;
      }
     }else if (contains(hdr,"unregelmäßig")) {
      if(contains(s3.head,"unregelmäßig")) {
       idx.i2 = i2;
       idx.i3 = i3;
      }
     }else if (contains(hdr,"regelmäßig")) {
      if(!contains(s3.head,"unregelmäßig") && contains(s3.head,"regelmäßig")) {
       idx.i2 = i2;
       idx.i3 = i3;
      }
     }

     if (idx.i2 == 0) {  // best match
      idx.i2 = i2;
      idx.i3 = i3;
     }
    }
   }
  }
 }
 return idx;
}


var urlreim="";
var warnreim=[];

function handleResponseRhyme(data){
 if (data.query !== undefined && data.query.backlinks !== undefined) {

  var i=0;
  var bl=data.query.backlinks;
  for (i=0;i<bl.length;i++) {
   if (reime.hasOwnProperty(bl[i].title)){
    reime[bl[i].title].link=true;
   } else {
    warnreim.push(new warning(-2,'Reimwort fehlt hier oder falscher Link in: <a href="/wiki/'+bl[i].title+'">'+bl[i].title+'</a>'));
   }
  }
  if (data.continue !== undefined) {
   var url = urlreim + "&blcontinue=" + mw.util.wikiUrlencode(data.continue.blcontinue);
   $.get(url, handleResponseRhyme);
  } else {
   var w;
   for (w in reime){
    if (reime[w].cnt > 1){
     var wtxt = 'Reimwort '+reime[w].cnt+'-mal vorhanden: '+w;
     for (var wi in reime[w].head){
      wtxt += '<br />&nbsp; &nbsp;'+reime[w].head[wi].hcnt+'-mal unter: '+wi;
     }
     warnreim.push(new warning(-2,wtxt));
    }
     if (!reime[w].redlink && !reime[w].link){
     warnreim.push(new warning(-2,'Link zu dieser Seite fehlt in: <a href="/wiki/'+w+'">'+w+'</a>'));
    }
   }
   reportWarnings(getGadgetAnker(),[],warnreim,[false,false,false,true]);

// Vorbereitung Reim im Eintrag aktualisieren

   var reimseiten = {};

   for (w in reime){
    if (!reime[w].redlink && !reime[w].link){
     reimseiten[w] = '';
    }
   }

   apiQueryRevision(reimseiten,handleResponseRhymeEintrag,1);
  }
 }
}


function handleResponseRhymeEintrag(reimseiten,dqp,pass){
 var rhymehome = mw.config.get("wgTitle").split(":")[1].substr(1);
 var langname  = mw.config.get("wgTitle").split(':')[0];
 var cnt = 0;

 for (var t in reimseiten) {
  var txt = getRevision(dqp,t);
  if (!pages.hasOwnProperty(t)) {
   pages[t] = new page(t,txt);
  }

  // Prüfen, ob die Seite einen Wortartabschnitt dieser Sprache enthält
  var re = new RegExp("\\{\\{Wortart\\|.*\\|" + langname + "\\}\\}","m");

  if (txt.search(re) < 0) {

   var nl = document.createElement("a");
   nl.href = "/wiki/" + t;
   nl.innerHTML = "<br>&nbsp;" + t + " enthält keinen Wortartabschnitt in der Sprache " + langname;
   nl.setAttribute("id", "cp-Akt-" + t.replace(/ /g,'_'));
   nl.setAttribute("style", "color:#0000E0");

   appendWithComma("sonstiges", "-reim", nl, "");

  } else {

   pages[t].tx2 = rhymesedit.after_save_text(externalText(txt), rhymehome, langname);

   if (txt != pages[t].tx2) {
    pages[t].id  = "REIME"; 
    cnt++;

    var nl = document.createElement("a");
    nl.href = "javascript:checkpage.aktualisieren('"+t+"')";
    nl.innerHTML = "<br>&nbsp;" + t;
    nl.setAttribute("id", "cp-Akt-" + t.replace(/ /g,'_'));
    nl.setAttribute("style", "color:#00D03F");

    appendWithComma("sonstiges", "-reim", nl, "");
   }
  }
 }

 var nl = document.createElement("a");
 nl.href = buildUrl2(thispage,"&checkpage=simulation");
 nl.innerHTML = 'Link zu dieser Seite hinzufügen';
 nl.setAttribute("style", "color:#00D03F");

 if (cnt > 1) {

  nl = document.createElement("a");
  nl.href = "javascript:checkpage.aktualisierenAlle('"+"REIME"+"')";
  nl.innerHTML = "<br>&nbsp; Alle aktualisieren.";
  nl.setAttribute("id", "cp-AktAlle");
  nl.setAttribute("style", "color:#00D03F");
  appendWithComma("sonstiges", "-reim", nl, "");

 }
}


function getData1() {
 return extractStr2(composit.w1d,"|Deutsch}}","{{Bedeutungen}}","{{Grammatische Merkmale}}");
}


function getHerkunft(text){
 var r=['','',''];
 var p=extractStr(text,"{{Herkunft}}",'','L');
 var a=p.match(/\S+.*/);
 if (a==null) return r;

 a=a[0].match(/\[\[[^\]\s]+\]\]/g);
 if (a==null) return r;

 var pn=mw.config.get("wgPageName");
 var i=a.length-1;
 var as="";

 for (;i>=0;i--) {
  as=a[i].substring(2,a[i].length-2);
  if (endsWith(pn,as)) {
   r[2]=as;
  }
  if (endsWith(pn,as.toLowerCase())) {
   r[2]=as;
  }
  if (startsWith(pn,as)) {
   r[0]=as;
  }
 }
 r[1]=pn.substr(r[0].length,pn.length-r[0].length-r[2].length);
 return r;
}


function addwte (r,alt,wt){
 if (wt.length>0) {
  if(alt){
   if(!r.hasOwnProperty("alt")) {
    r.alt=[];
   }
   r.alt.push(wt);
  }else{
   if(!r.hasOwnProperty("neu")) {
    r.neu=[];
   }
   r.neu.push(wt);
  }
 }
}


function addwts(r,key,alt,t){

 if (t && t.length > 0) {
  t=$.trim(t.replace(/[,;]\s*$/,''));
  if(alt){
   if(!r.hasOwnProperty("alt")) {
    r.alt={};
   }
   r.alt[key]=t;
  }else{
   if(!r.hasOwnProperty("neu")) {
    r.neu={};
   }
   r.neu[key]=t;
  }
 }
}


function getWtSg(txt){
 var a=buildLines(txt);
 var r={};

 for (var i in a) {
  var z=$.trim(a[i]);
  var alt=contains(z,"lte Rechts");
  if(z.length>0 && z.charAt(0)==':') {
   var zs=z.split(',');

   var j=zs[0].lastIndexOf(' ');
   if(j==-1){
     j=0;
   }
   addwte(r,alt,zs[0].substr(j+1));
  }
 }
 return r;
}


function getWtPl(txt){
 var a=buildLines(txt);
 var r={};
 for (var i in a) {
  var l=$.trim(a[i]);
  var alt=contains(l,"lte Rechts");
  if(l.length>0 && l.charAt(0)==':') {
   addwte(r,alt,getWtPln(l,''));
   addwte(r,alt,getWtPln(l,'1'));
   addwte(r,alt,getWtPln(l,'2'));
   addwte(r,alt,getWtPln(l,'3'));
   addwte(r,alt,getWtPln(l,'4'));
  }
 }
 return r;
}

function getWtPln(t,pl){
 var s=$.trim(extractStr(t,"{{Pl."+pl+"}}",",",'B'));
 if (s.length == 0) {
  s=$.trim(extractStr(t,"{{Pl."+pl+"}}","",'B'));
 }
 return s;
}


function getWtPart(txt){
 var a=buildLines(txt);
 var r={};
 var warn = [];

 for (var i in a) {
  a[i] = filterTag(a[i],"ref",warn);
  a[i] = filterItalic(a[i]);
  var z=$.trim(a[i]);
  var alt=contains(z,"lte Rechts");
  if(z.length>0 && z.charAt(0)==':') {
   addwte(r,alt,getWtN(z,'Part.'));
  }
 }
 return r;
}


function getWtAll(txt){
 var a=buildLines(txt);
 var r={};
 for (var i in a) {
  var z=$.trim(a[i]);
  var alt=contains(z,"lte Rechts");
  if(z.length>0 && z.charAt(0)==':') {
   addwts(r,"First",alt,getWt1(z,':'));
  }
 }
 return r;
}


function getWt1(t,vl){
 var s=$.trim(extractStr(t,vl,",",'B'));
 if (s.length == 0) {
  s=$.trim(extractStr(t,vl,"{{",'B'));
 }
 if (s.length == 0) {
  s=$.trim(extractStr(t,vl,"",'B'));
 }
 return s;
}


function getWtStruct(t,vl){
 var r={};
 var a=buildLines(t);
 for (var i in a) {
  var z=$.trim(a[i]);
  var alt=contains(z,"lte Rechts");
  if(z.length>0 && z.charAt(0)==':') {
   if (contains(z,"{{Sg.}}")) {
     addwts(r,"Sg.",alt,getSgPl(z,"{{Sg.}}"));
   } else if (contains(z,"{{Sg.1}}")) {
     addwts(r,"Sg.1",alt,getSgPl(z,"{{Sg.1}}"));
   } else if (contains(z,"schreibung:''")) {
     addwts(r,"Sg.",alt,getSgPl(z,"schreibung:''"));
   } else if (contains(z,"schreibung'':")) {
     addwts(r,"Sg.",alt,getSgPl(z,"schreibung'':"));
   } else if (contains(z,"{{kSg.}}")) {
     addwts(r,"Sg.",alt,'');
   } else {
     addwts(r,"Sg.",alt,getSgPl(z,":"));
   }
   addwts(r,"Sg.2",alt,getSgPl(z,"{{Sg.2}}"));
   addwts(r,"Sg.3",alt,getSgPl(z,"{{Sg.3}}"));
   addwts(r,"Sg.4",alt,getSgPl(z,"{{Sg.4}}"));
   addwts(r,"Du.",alt,getSgPl(z,"{{Du.}}"));
   addwts(r,"Pl.",alt,getSgPl(z,"{{Pl.}}"));
   addwts(r,"Pl.1",alt,getSgPl(z,"{{Pl.1}}"));
   addwts(r,"Pl.2",alt,getSgPl(z,"{{Pl.2}}"));
   addwts(r,"Pl.3",alt,getSgPl(z,"{{Pl.3}}"));
   addwts(r,"Pl.4",alt,getSgPl(z,"{{Pl.4}}"));
  }
 }
 return r;
}


function getSgPlStruct(z,vl){
 var r={};
 var f=false;
 var z=$.trim(z);
 if(z.length>0) {
  if (contains(z,"{{Sg.}}")) {
    addwts(r,"Sg.",f,getSgPl(z,"{{Sg.}}"));
  } else if (contains(z,"{{Sg.1}}")) {
    addwts(r,"Sg.1",f,getSgPl(z,"{{Sg.1}}"));
  } else {
    addwts(r,"Sg.",f,getSgPl(z,""));
  }
  addwts(r,"Sg.2",f,getSgPl(z,"{{Sg.2}}"));
  addwts(r,"Sg.3",f,getSgPl(z,"{{Sg.3}}"));
  addwts(r,"Sg.4",f,getSgPl(z,"{{Sg.4}}"));
  addwts(r,"Du.",f,getSgPl(z,"{{Du.}}"));
  addwts(r,"Pl.",f,getSgPl(z,"{{Pl.}}"));
  addwts(r,"Pl.1",f,getSgPl(z,"{{Pl.1}}"));
  addwts(r,"Pl.2",f,getSgPl(z,"{{Pl.2}}"));
  addwts(r,"Pl.3",f,getSgPl(z,"{{Pl.3}}"));
  addwts(r,"Pl.4",f,getSgPl(z,"{{Pl.4}}"));
 }

 return r;
}

function getSgPl(t,vl){
 var s=$.trim(extractStr(t,vl,"{{Sg",'B'));
 if (s.length == 0) {
  s=$.trim(extractStr(t,vl,"{{Pl.",'B'));
 }
 if (s.length == 0) {
  s=$.trim(extractStr(t,vl,"{{kPl.",'B'));
 }
 if (s.length == 0) {
  s=$.trim(extractStr(t,vl,"",'B'));
 }
 return s;
}


function getWtN(t,pl){
 var s=$.trim(extractStr(t,"{{"+pl+"}}",",",'B'));
 if (s.length == 0) {
  s=$.trim(extractStr(t,"{{"+pl+"}}","",'B'));
 }
 return s;
}


function getIpaSg(txt){
 txt=extractStr(txt,":{{IPA}}","\n");
 return extractStr(txt,"{{Lautschrift|","}}",'B');
}


function getSingleLs(txt){
 var a = txt.split("{{Lautschrift|");
 if (a.length != 2) {
  return "";
 }
 return extractStr(a[1],"","}}",'B');
}


function getStructPP(t){
 var r = {};
 var a = buildLines(t);
 var warn = [];

 for (var i in a) {
  a[i] = filterTag(a[i],"ref",warn);
  a[i] = filterItalic(a[i]);
  var z = $.trim(a[i]);
  if (z.length > 0) {
   addwts(r,"Inf",false,getPP(z,""));
   addwts(r,"Prät",false,getPP(z,"{{Prät.}}"));
   addwts(r,"Part",false,getPP(z,"{{Part.}}"));
  }
 }
 return r;
}


function getPP(t,vl){
 var s = $.trim(extractStr(t,vl,"{{Prät.}}",'B'));
 if (s.length == 0) {
  s = $.trim(extractStr(t,vl,"{{Part.}}",'B'));
 }
 if (s.length == 0) {
  s = $.trim(extractStr(t,vl,"",'B'));
 }
 return s;
}


function readStructPKS(r,typ,t){
 var a = buildLines(t);

 for (var i = 0; i < a.length; i++) {
  var z = $.trim(a[i]);
  if (z.length > 0) {
   var alt = contains(z.substr(0,30),"lte Rechtschreibung") ? "alt" : "neu";
   var pos = "";
   if (contains(z.substr(0,30),"schreibung:''")) {
    pos = "schreibung:''";
   } else if (contains(z.substr(0,30),"schreibung'':")) {
    pos = "schreibung'':";
   }
   addWtLsHb(r,typ,"Pos",alt,getPKS(z,pos));
   addWtLsHb(r,typ,"Komp",alt,getPKS(z,"{{Komp.}}"));
   addWtLsHb(r,typ,"Sup",alt,getPKS(z,"{{Sup.}}"));
  }
 }
}


function getPKS(t,from){
 var s = $.trim(extractStr(t,from,"{{kSt.}}",'B'));
 if (s.length == 0) {
  s = $.trim(extractStr(t,from,"{{Komp.}}",'B'));
 }
 if (s.length == 0) {
  s = $.trim(extractStr(t,from,"{{Sup.}}",'B'));
 }
 if (s.length == 0) {
  s = $.trim(extractStr(t,from,"",'B'));
 }
 return s.replace(/[:;]/g,'');
}


function addWtLsHb(r,typ,key,p,v){
 var tk = typ + key + p;
 v = v.replace(/\}\} /g,',') // falls Komma fehlt
 var a = v.split(',');
 var j = 0;
 var warn = [];

 for (var i = 0; i < a.length; i++) {
  if (typ == "wt") {
   a[i] = filterTag(a[i],"ref",warn);
   a[i] = filterItalic(a[i]);
  }
  var s = $.trim(a[i]);
  if (s.length > 0) {
   if (!r.hasOwnProperty(tk)) {
    r[tk] = {val: []};
   }
   s = s.replace(/[^{]*\{\{Lautschrift\|/,'').replace("{{Audio|","Audio|").replace("}}",'').replace(/^am +/,'');
   r[tk].val[j++] = s;
   if (typ == "wt") {
    r.wtlist[s.replace(/·/g,'')] = s;
   }
  }
 }
}


function addWtlist(r,v){
 var a = v.split(',');
 var j = 0;

 for (var i = 0; i < a.length; i++) {
  var s = $.trim(a[i]);
  if (s.length > 0) {
   r.wtlist[s.replace(/·/g,'')] = s;
  }
 }
}


// t = "Neuem"; ls = "...Cəm}}"
function anpassenLsEm(t,ls){
 var endchr = t.substr(-4,2);
 if (endchr.search(/ah?$|eh?$|ih?$|oh?$|uh?$|äh?$|öh?$|üh?$|yh?$/) < 0) {
  var a = ls.split("}}");
  var i;
  for (i = 0; i < a.length; i++) {
   var endls = a[i].substr(-3,1);
   if (a[i].search(/\{\{\s*Lautschrift\s*\|/) != -1) {
    if (endls.search(/[bdgɡklmnŋpʀʁt]/) < 0) {
     a[i] = a[i].replace(/əm$/g,"m̩");
    }
   }
  }
  ls = a.join("}}");
 }
 return ls;
}


// t = "Worten"; ls = "...Cən}}"
function anpassenLsEn(t,ls){
 var endchr = t.substr(-4,2);
 if (endchr.search(/ah?$|eh?$|ih?$|oh?$|uh?$|äh?$|öh?$|üh?$|yh?$/) < 0) {
  var a = ls.split("}}");
  var i;
  for (i = 0; i < a.length; i++) {
   var endls = a[i].substr(-3,1);
   if (a[i].search(/\{\{\s*Lautschrift\s*\|/) != -1) {
    if (endls.search(/[mnŋʀʁlj]/) < 0) {
     a[i] = a[i].replace(/ən$/g,"n̩");
    }
   }
  }
  ls = a.join("}}");
 }
 return ls;
}


function addCORS(){
 if (window.location.hostname.indexOf(".m.") >= 0) {  // mobile site
  return "origin=" + window.location.protocol + "//" + window.location.hostname + "&";
 }
 return "";
}

function buildUrl(t){
 return buildUrl2(t,"&action=raw&maxage=0");
}

function buildUrl2(t,p){
 return mw.config.get("wgServer")+mw.config.get("wgScript")+"?title="+mw.util.wikiUrlencode(t)+p;
}

function buildApi(t,p) {
  return mw.config.get("wgServer") + mw.config.get("wgScriptPath") + "/api.php?" + addCORS() +
         p + mw.util.wikiUrlencode(t);
}


function buildWort() {
 var w=toUpperFirst(composit.w1w);
 if (composit.wbs == '-'){
  w+='-'+composit.w2w;
 } else {
  w+=toLowerFirst(composit.w2w);
 }
 return w;
}

function buildUe2(){
 return "== "+buildWort()+" ({{Sprache|Deutsch}}) ==\n";
}

function buildUe3(t){
 t=extractStr(t,"=== {{Wortart|"," ===");
 return t+'\n';
}

function buildSubTab(t,w){
 t=extractStr(t,"{{Deutsch Substantiv Übersicht","\n}}");
 t = t.replace(/\|Bild.*\n/g,"");
 t = t.replace(/\bder\s+\S|\bdie\s+\S|\bdas\s+\S|\bdes\s+\S|\bdem\s+\S|\bden\s+\S/g,
   function (s) {
    if (endsWith(w,'-')) {
     return s.substr(0,s.length-1) + w + s.substr(s.length-1,1);
    } else {
     return s.substr(0,s.length-1) + w + toLowerFirst(s.substr(s.length-1,1));
    }
   });
 return t+'\n';
}


function buildWtLine(sg,pl){
 var s="";
 if(sg.length>0) {
   s+=sg[0];
 }
 if(pl.length==1) {
   s+=", {{Pl.}} "+pl[0];
 }
 if(pl.length>1) {
  for(var i=1;i<=pl.length;i++) {
   s+=", {{Pl."+(i).toString()+"}} "+pl[i-1];
  }
 }
 return s;
}


function buildWtA(alt,v,w){
 var w1=[];
 var w2=[];
 var r=[];
 if(v.hasOwnProperty("neu")){
  w1=v.neu;
 }
 if(w.hasOwnProperty("neu")){
  w2=w.neu;
 }
 if(alt){
  if(v.hasOwnProperty("alt")){
   w1=v.alt;
  }
  if(w.hasOwnProperty("alt")){
   w2=w.alt;
  }
 }
 if(w1.length>0 && w2.length>0){
  for(var i=0;i<w2.length;i++){
   r.push(buildWt(w1[0],w2[i]));
  }
 }
 return r;
}


function buildWt(v,w){
 if (endsWith(v,'-')) {
  return toUpperFirst(v+w);
 } else {
  return toUpperFirst(v)+'·'+toLowerFirst(w);
 }
}

function buildWtPl(alt,w1,w2){
  var wtps='';

  if(w1.length==1) {
   wtps+=", {{Pl.}} "+buildWt(wts1,wtpa[0]);
  }
  if(wtpa.length>1) {
   for(var i=1;i<=wtpa.length;i++) {
    wtps+=", {{Pl."+(i).toString()+"}} "+buildWt(wts1,wtpa[i-1]);
   }
  }
}

function buildUeTab() {
 return "\n==== Übersetzungen ====\n{{Ü-Tabelle|Ü-links=\n"+
  "*{{en}}: [1] {{Ü|en|}}\n*{{fr}}: [1] {{Ü|fr|}}\n|Ü-rechts=\n"+
  "*{{it}}: [1] {{Ü|it|}}\n*{{es}}: [1] {{Ü|es|}}\n}}\n";
}


function buildIpa(txt,ipa1,w2){
 var ipa=extractStr(txt,":{{IPA}}","\n");

 ipa=ipa.replace(/\ˌ/g,"");
 ipa=ipa.replace(/\ˈ/g,"ˌ");
 if (w2.search(/^[AEIOUÄÖÜaeiouäöü]/)>=0) {
  ipa=ipa.replace(/\|/g,"|ʔ");;
 }
 var a=ipa.split("{Lautschrift");
 for (var i=1;i<a.length;i++) {
  if(!contains(a[i],'ˌ')){
   a[i]=a[i].replace(/\|/g,"|ˌ");
  }
 }
 ipa=a.join("{Lautschrift");
 ipa=ipa.replace(/\|ʔˌ/g,"|ˌʔ");
 ipa=ipa.replace(/\|/g,"|"+ipa1);
 if(!contains(ipa,'ˈ')){
  ipa=ipa.replace(/\|/g,"|ˈ");
 }
 return ipa;
}



function buildReferenz(w){
 var s="\n{{Referenzen}}\n<!--Achtung, bitte die Referenz-Links testen -->";
 s+="\n:[1] {{Wikipedia|"+w+"}}";
 s+="\n:[1] {{Ref-DWDS|"+w+"}}";
 s+="\n:[1] {{Ref-Canoo|"+w+"}}";
 s+="\n:[1] {{Ref-UniLeipzig|"+toAnsi(w)+"}}";
 s+="\n:[1] {{Ref-FreeDictionary|"+toAnsi(w)+"}}";
 return s;
}




function partialEdit(){
  var pe=document.getElementsByName("wpSection");
  if (pe.length>0) {
    return pe[0].value;
  }
  return "";
}


function createButtonCS(){
  var node = document.getElementsByClassName("editHelp");
  if (node.length > 0) {
    var p = node[0].parentNode;
    var y = document.createElement("input");

    y.setAttribute("id", "wpCheck");
    y.setAttribute("style", "padding: 6px 8px 6px 8px;");
    y.setAttribute("value", "Check & Save");
    y.setAttribute("title", "checkpage() aufrufen. Bei Fehlern Vorschau anzeigen, sonst speichern.");
    y.setAttribute("type", "button");
    y.setAttribute("onclick", "checkpage.checkSave()");

    p.insertBefore(y,node[0]);
    p.insertBefore(document.createTextNode('\n'),node[0]);
  }
}


function createButtonTS(){
  var node = document.getElementsByClassName("editHelp");
  if (node.length > 0) {
    var p=node[0].parentNode;
    var y=document.createElement("input");

    y.setAttribute("id", "wpTsort");
    y.setAttribute("value", "Sort");
    y.setAttribute("title", "Übersetzungstabelle sortieren");
    y.setAttribute("type", "button");
    y.setAttribute("onclick", "checkpage.sortTranslations(true)");

    p.insertBefore(y,node[0]);
    p.insertBefore(document.createTextNode('\n'),node[0]);
  }
}


function createButtonNext(val){
 var node = document.getElementById("firstHeading");
 if (node) {
  var p = node.parentNode;

  var y = document.createElement("input");

  y.setAttribute("id", "cpCheckNext");
  if (val == "start") {
   y.setAttribute("value", "Starten");
   y.setAttribute("title", "Stapelverarbeitung starten");
  } else {
   y.setAttribute("value", "Veröffentlichen");
   y.setAttribute("title", "Veröffentlichen und nächste Seite laden");
  }
  y.setAttribute("type", "button");
  y.setAttribute("onclick", "checkpage.SaveNext()");

  p.insertBefore(y,node);

  if (val != "start") {
   p.insertBefore(document.createTextNode('\n'),node);
   var y = document.createElement("input");

   y.setAttribute("id", "cpCancel");
   y.setAttribute("value", "Nächste Seite");
   y.setAttribute("title", "Nicht veröffentlichen und nächste Seite laden");
   y.setAttribute("type", "button");
   y.setAttribute("onclick", "checkpage.Cancel()");

   p.insertBefore(y,node);

   p.insertBefore(document.createTextNode('\n'),node);
   var y = document.createElement("input");

   y.setAttribute("id", "cpStop");
   y.setAttribute("value", "Beenden");
   y.setAttribute("title", "Stapelverarbeitung beenden");
   y.setAttribute("type", "button");
   y.setAttribute("onclick", "checkpage.Stop()");

   p.insertBefore(y,node);
  }

 }

}


function checkRhyme(){

 var schreibung = {};
 var txt = "";

 warnreim = [];
 if (document.querySelectorAll(".mw-parser-output").length > 0) {
  var shead = "#mw-content-text > div > h3";
 } else {
  shead = "#mw-content-text > h3";
 }

 var rs = $("#ReimSchreibungen");
 if (rs.length > 0) {
  var rsa = $(rs).next("td").children("a");
  $(rsa).each(function(index, element) {
   txt = $(element).text();
   if (txt.length > 0) {
    schreibung[txt.slice(1)] = 1;
   }
  })
 } else {
  warnreim.push(new warning(-2,"Kann es sein, dass der Parameter 'Schreibungen' im Seitenkopf vergessen wurde?"));
 }

 var headerText; // Überschrift
 var h;  // Selektiere ersten H3-header
 h = document.querySelector(shead);
 if (h) {  // not null
  // zu diesem H3-Header alle Siblings
  var childs = h.parentNode.children;
  for (var li = 0; li < childs.length; li++) {
   if (childs[li].nodeName == "H3") {
    headerText = $(childs[li]).children(".mw-headline").text();
   }
   if (childs[li].nodeName == "UL") {
    var links = childs[li].querySelectorAll("ul a");
    for (var lix = 0; lix < links.length; lix++) {
     txt = links[lix].textContent;
     if (reime.hasOwnProperty(txt)) {
      reime[txt].cnt++;
      if (reime[txt].head.hasOwnProperty(headerText)) { // zählen je Überschrift
       reime[txt].head[headerText].hcnt++;
      } else {
       reime[txt].head[headerText] = {hcnt:1};
      }
     } else {
      if (hasClass(links[lix],'new')) {
       reime[txt] = {cnt:1, link:false, redlink:true, head:{}};
      } else {
       reime[txt] = {cnt:1, link:false, redlink:false, head:{}};
      }
      reime[txt].head[headerText] = {hcnt:1};
     }

     if (!hasSchreibung(schreibung,txt)) {
      warnreim.push(new warning(-2,"Wortendung nicht im Parameter 'Schreibungen' im Seitenkopf gefunden bei: " + txt));
     }

    }
   }
  }

 }

 urlreim = buildApi(mw.config.get("wgPageName"),"action=query&list=backlinks&bllimit=9999&blnamespace=0&blfilterredir=nonredirects&format=json&continue&bltitle=");

 $.get(urlreim, handleResponseRhyme);
}


function hasSchreibung(schreibung,txt) {
 for (var sch in schreibung) {
  if (endsWith(txt.toLowerCase(),sch)) {
   return true;
  }
 }
 return false;
}


function checkExtend(text,t) {
 if(!window.hasOwnProperty("autoedit")){return;}
    //   (?: starts a non-capturing group   )? makes this group optional
 var re=/Deklinierte Form\s*\|\s*(\S+)\s*\}\}[^\v]+?\{\{Grundformverweis(?: Dekl)?\s*\|\s*(\S+)\}\}/g;
 do {
  var arr=re.exec(text);
  if (arr != null && arr.length == 3){
   if(!contains(arr[0],"\n=")){
    extend.sp=arr[1];
    extend.gf=arr[2];
    extend.wt=contains(text,"{{Worttrennung}}\n\n") || contains(text,"{{Worttrennung}}\n:\n");
    extend.ls=contains(text,"{{Lautschrift|…") || contains(text,"{{Lautschrift|...");
    extend.hb=false;

    if (contains(text,"Nominativ Plural")) {
     extend.hb=contains(text,"{{Audio|}}");
     if (extend.wt || extend.ls || extend.hb) {
      $.get(buildUrl(arr[2]), handleResponseExtend);
     }
    }else if (contains(text,"Dativ Plural") && arr[1]=="Deutsch" && endsWith(t,"n")){
     if (extend.wt || extend.ls) {
      extend.kasus="deDatPln";
      $.get(buildUrl(arr[2]), handleResponseExtend);
     }
    }else if (contains(text,"Genitiv Singular") && arr[1]=="Deutsch" && (t==arr[2]+"ses")){
     if (extend.wt || extend.ls) {
      extend.kasus="deGenSgses";
      $.get(buildUrl(arr[2]), handleResponseExtend);
     }
    }else if (contains(text,"Genitiv Singular") && arr[1]=="Deutsch" && (t==arr[2]+"es")){
     if (extend.wt || extend.ls) {
      extend.kasus="deGenSges";
      $.get(buildUrl(arr[2]), handleResponseExtend);
     }
    }else if (contains(text,"Genitiv Singular") && arr[1]=="Deutsch" && (t==arr[2]+"s")){
     if (extend.wt || extend.ls) {
      extend.kasus="deGenSgs";
      $.get(buildUrl(arr[2]), handleResponseExtend);
     }
    }else if (contains(text,"Dativ Singular") && arr[1]=="Deutsch" && (t==arr[2]+"e")){
     if (extend.wt || extend.ls) {
      extend.kasus="deDatSge";
      $.get(buildUrl(arr[2]), handleResponseExtend);
     }
    }

   }
  }
 } while (arr != null);

}


function checkComp(text) {

 if (contains(text,"{{Wortart|Substantiv|Deutsch") || !contains(text,"{{Wortart|")) {

  if ((contains(text,"{{Deutsch Substantiv Übersicht") || contains(text,"{{Deutsch Toponym Übersicht") )
    && contains(text,"{{Worttrennung}}")
    && contains(text,"{{Lautschrift|")
    && !contains(text,"{{Lautschrift|...")
    && !contains(text,"{{Lautschrift|…")
    ) {
    return;
  }

  if (contains(text,"{{Aussprache}}")) {
   composit.ausspr=true;
  }

  if (contains(text,"{{Herkunft}}")) {
   var a = getHerkunft(text);
   var url = '';
   if (a[0].length > 0) {
    composit.w0w=a[0];
   }

   if (endsWith(a[1],'-')) {
    url += "[["+a[0]+a[1].substr(0,a[1].length-1)+"]]";
    composit.wbs='-';
    composit.w1w=a[0]+a[1].substr(0,a[1].length-1);
   } else {
    url += "[["+a[0]+a[1]+"]]";
    composit.wbs='';
    composit.w1w=a[0]+a[1];
   }

   url += "[["+toLowerFirst(a[0]+a[1])+"]]";

   if (a[2].length > 0) {
    url += "[["+a[2]+"]]";
    composit.w2w=a[2];
   }

   if (url.length>0) {
    url = buildApi(url,"action=parse&prop=links&format=json&text=");
    $.get(url, handleResponseLinksComp);
   }
  }

 }

}


function nebenform(nform,anzGm) {
 var pnf = '';
 var j;
 for (var nf in nform) {
  if (pnf.length==0) {
   pnf += "\n{{Nebenformen}}\n:";
   if (anzGm > 1) {
    for (j = 0; j < nform[nf].length; j++){
     if (j > 0) { pnf += "[["+nf+"]]\n:"; }
     pnf += "''"+nform[nf][j]+":'' ";
    }
   }
  } else {
   if (anzGm > 1) {
    for (j = 0; j < nform[nf].length; j++){
     if (j > 0) { pnf += "[["+nf+"]]"; }
     pnf += "\n:''"+nform[nf][j]+":'' ";
    }
   } else {
    pnf += ", ";
   }
  }
  pnf += "[["+nf+"]]";
 }

 if (pnf.length>0) {
  pnf += "\n";
 }
 return pnf;
}


function existsInDB(dpl,t){
 for (var i=0;i<dpl.length;i++) {
  if (dpl[i]['*'] == t) {
   return dpl[i].hasOwnProperty("exists");
  }
 }
 return false;
}


function addFlexionLinks(dpl,pass) {

 var node = getGadgetAnker();
 if (node) {
  for (var i2 = 1; i2 < sections.length; i2++) {
   var s2 = sections[i2];
   for (var i3 = 1; i3 < s2.child.length; i3++) {
    var s3 = s2.child[i3];
    for (var form in s3.flexion) {
     var ft = s3.flexion[form];
     if ((ft.pass !== undefined && ft.pass != pass)||(ft.pass === undefined && pass == 2)) {continue;}

     var exists = existsInDB(dpl,form);

     var j,nl;

     var ls = '…';
     var hb = 'Audio|';
     var pflexion = '';
     var preim = '';
     var pnf = '';
     var pnfp = '';
     var pgm = '';
     var pvgf = '';
     var p4 = '';
     var p7 = 'I';
     var wa = 'Konjugierte Form';
     var anzGm = 0;
     nl = document.createElement("a");

   if (ft.vorlage == "ch-Schreibweise") {
    ft.linkgrp = "sform";
   } else if (!ft.hasOwnProperty("linkgrp")) {
    ft.linkgrp = "fform";
   }

   if (ft.vorlage == "de-Sub-S6" || ft.vorlage == "de-Partizip" || ft.vorlage == "de-Verb"
       || startsWith(ft.vorlage,"de-Adj") || startsWith(ft.vorlage,"de-Gerundivum")
      ) {
    ls = '{{Lautschrift|…}}';
    hb = '{{Audio|}}';
   }

   if (ft.vorlage == "de-Adj-e" || ft.vorlage == "de-Adj-en") {
    if (ft.hasOwnProperty("gm") && ft.gm.length > 0) {
     ft.vorlage += "-Verb";
     var vgf = ft.gm[0].match(/''\[\[[^\[]*\]\]''/g);
     pvgf = vgf[0].replace(/['\[\]]/g,'');
    }
   }

   var padjf = '';
   if (ft.vorlage == "de-Verb") {
    if (ft.hasOwnProperty("gm") && ft.gm.length > 0) {
     if (contains(ft.gm[0],"erweiterter Infinitiv")) {
      wa = "Erweiterter Infinitiv";
      ft.linkgrp = "fform";
     }
     if (contains(ft.gm[0],"Partizip Präsens")) {
      wa = "Partizip I";
      padjf = "\n{{Wortart fehlt|Adjektiv}}";
      if (ft.hasOwnProperty("vap1") && !ft.vap1) {
       padjf = '';
      }
      ft.linkgrp = "p1form";
     }
     if (contains(ft.gm[0],"Partizip Perfekt")) {
      wa = "Partizip II";
      padjf = "\n{{Wortart fehlt|Adjektiv}}";
      if (ft.hasOwnProperty("vap2") && !ft.vap2) {
       padjf = '';
      }
      ft.linkgrp = "p2form";
      if (ft.gm.length > 1) {
       ft.gm.splice(0,1);
       ft.vorlage = "de-Partizip"
      } else {
       ft.nf = ft.nfp;
      }
     }
    }
   }

   if (!exists || doSimulation) {

    if (ft.hasOwnProperty("gm")) {
     pgm = ft.gm.join('\n');
     anzGm = ft.gm.length;
    }
    if (ft.hasOwnProperty("form")) {
     p4 = ft.form;
    }

    if (ft.hasOwnProperty("nf")) {
     pnf = nebenform(ft.nf,anzGm);
    }

    if (ft.hasOwnProperty("nfp")) {
     pnfp = nebenform(ft.nfp,1);
    }

    if (ft.hasOwnProperty("flexion")) {
     pflexion = ft.flexion;
    }

    if (ft.hasOwnProperty("reim") && ft.reim.length > 0) {
     preim = ":{{Reime}} " + ft.reim + "\n";
    }
    if (contains(form,'ß')){
     pnf = "\n{{Alternative Schreibweisen}}\n:{{CH&LI}} [["+form.replace(/ß/g,'ss')+"]]\n" + pnf;
    }
    if (ft.ls.length > 0) {
     ls = ft.ls;
    }
    ls = $.trim(ls);

    if (ft.hb.length > 0) {
     hb = ft.hb;
    }
    ft.exists = false;

    var sim = form;
    if (exists) {
     sim = "Benutzer:"+mw.config.get("wgUserName")+"/"+form;
    }

    // Sprachkürzel
    var spr = sprk[ft.sp];
    if (spr == "de") {
      spr = "";
    } else {
      spr = "|spr=" + spr;
    }

    // Umschrift
    var umschr = "";
    if (sprk[ft.sp] == "be" || sprk[ft.sp] == "ru" || sprk[ft.sp] == "uk" ) {
      umschr = "\n{{Umschrift}}\n:''{{w|DIN 1460}}:'' {{subst:Gentrans|" + form + "|spr=" + sprk[ft.sp] + "}}\n";
    }

    // Vorlagentausch für fremdsprachige Einträge ohne Worttrennung
    if (ft.wt == "" && sprk[ft.sp] != "de" && ft.vorlage == "de-Sub-S6") {
      ft.vorlage = "FS-Sub-S6";
    }

    nl.href=buildUrl2(sim,"&action=edit")+
      "&editintro=Vorlage:Autoedit/intro&preload=Vorlage:Autoedit/"+ft.vorlage+"&autoedit="+
      encodeURIComponent(
        repl("@ADJF@",padjf,"g;")+
        repl("@WA@",wa,"g;")+
        repl("@NF@",pnf,"g;")+
        repl("@NFP@",pnfp,"g;")+
        repl("@UM@",umschr,"g;")+
        repl("@REIM@",preim,"g;")+
        repl("@GM@",pgm,"g;")+
        repl("@VGF@",pvgf,"g;")+
        repl("@FLEX@",pflexion,"g;")+
        repl("@SPR@",spr,"g;")+
        repl("@1@",ft.wt,"g;")+
        repl("@2@",externalLS(ls),"g;")+
        repl("@3@",hb,"g;")+
        repl("@4@",p4,"g;")+
        repl("@5@",ft.title,"g;")+
        repl("@6@",ft.sp,"g;")+
        repl("@7@",p7,"g")
      )+"&autominor=false&autosummary=neu ("+version+")";

    nl.innerHTML = form;
    if (config("LautschriftVorschau")) {
     nl.innerHTML = "<br>&nbsp;"+form+' | '+ft.wt+' | '+externalLS(ls)+' | '+preim;
    }

    if (!exists && config("FlexionAutomatisch")) {
     var sortkey = form + "\f";
     if (contains(s3.head,"unregelm")) {
      sortkey += "ur\f";
     } else if (contains(s3.head,"untrenn")) {
      sortkey += "ut\f";
     } else if (contains(s3.head,"regelm")) {
      sortkey += "re\f";
     } else if (contains(s3.head,"trennbar")) {
      sortkey += "tr\f";
     } else {
      sortkey += "!!\f";
     }
     stapelAdd(sortkey, nl.href);
    }

      if (exists) {
       nl.setAttribute("style", "color:#005000");
      }else{
       nl.setAttribute("style", "color:#00E000");
      }

      appendWithComma(ft.sp, "-" + ft.linkgrp + "-anl", nl,ft.id);

     }
    }
   }
  }

  // existierende Formen als Blaulinks anzeigen
  for (var i2 = 1; i2 < sections.length; i2++) {
   var s2 = sections[i2];
   for (var i3 = 1; i3 < s2.child.length; i3++) {
    var s3 = s2.child[i3];
    for (var form in s3.flexion) {
     var ft = s3.flexion[form];
     if ((ft.pass !== undefined && ft.pass != pass) || (ft.pass === undefined && pass == 2)) {continue;}

     exists = existsInDB(dpl,form);

     if (exists) {
      nl = document.createElement("a");
      nl.href = buildUrl2(form,"");
      nl.innerHTML = form;
      nl.setAttribute("style", "color:#0000E0")
      appendWithComma(ft.sp, "-" + ft.linkgrp + "-anz", nl,ft.id);
     }

    }
   }
  }

  // Alle anlegen?
  if (config("FlexionAutomatisch") && !doStapelButton) {
   if (stapel.length > 2) {
    anlegenAlle();
    doStapelButton = true;
    nl = document.createElement("a");
    nl.href = buildUrl2("Wiktionary:Stapelverarbeitung mit checkpage","");
    nl.innerHTML = "Stapelverarbeitungsfenster öffnen";
    nl.setAttribute("onclick", 'document.getElementById("cp-sonstiges--stapel").style.display = "none"; window.open(this.href); return false;');
    nl.setAttribute("style", "color:#00B000");
    appendWithComma("sonstiges", "-stapel", nl, "");
   }
  }

  if (config("FlexionSimulieren") && !doSprachenButton){
   doSprachenButton = true;
   nl = document.createElement("a");
   nl.href = "#";
   nl.onclick = checkpage.Cats;
   nl.innerHTML = 'Flektierte Form prüfen';
   nl.setAttribute("style", "color:#005000");
   appendWithComma("sonstiges", "-spr", nl, "");
  }

  if (config("FlexionSimulieren") && !doSimulation && !doSimulationButton){
   doSimulationButton = true;
   nl = document.createElement("a");
   nl.href = buildUrl2(thispage,"&checkpage=simulation");
   nl.innerHTML = 'Flektierte Form simulieren';
   nl.setAttribute("style", "color:#005000");
   appendWithComma("sonstiges", "-sim", nl, "");
  }

  if (config("FlexionAktualisieren") && !doAktualisierung && !doAktualisierungButton){
   doAktualisierungButton = true;
   nl = document.createElement("a");
   nl.href = buildUrl2(thispage, "&checkpage=aktualisierung");
   nl.innerHTML = 'Flektierte Form aktualisieren';
   nl.setAttribute("style", "color:#00D03F");
   appendWithComma("sonstiges", "-akt", nl, "");
  }

  if (config("FlexionReimen") && !doReimen && !doReimenButton){
   doReimenButton = true;
   nl = document.createElement("a");
   nl.href = buildUrl2(thispage, "&checkpage=reimen");
   nl.innerHTML = 'Flektierte Form reimen';
   nl.setAttribute("style", "color:#D3545F");
   appendWithComma("sonstiges", "-reimen", nl, "");
  }

  if (mw.config.get("wgAction") != "edit" && mw.config.get("wgAction") != "submit" && canSort && !doSortierungButton){
   doSortierungButton = true;
   nl = document.createElement("a");
   nl.href = buildUrl2(thispage, "&action=edit&checkpage=sortierung");
   nl.innerHTML = 'Ü-Tabelle sortieren';
   nl.setAttribute("style", "color:#00007F");
   appendWithComma("sonstiges", "-sorttrans", nl, "");
  }

 }
}


function appendWithComma(spr, id, node,ftid) {
 var e = $("#cp-" + spr + "-" + ftid + id);
 if (e[0] && e[0].children.length > 0) {
  e.append(document.createTextNode(", "));
 }
 e.append(node);
 e.show().parent().show().parent().show().parent().show();
}


function addFlexionAdjEnd(i2,i3,name,title,wt,wte,ls,hb,form,vorlage,nameList) {
 var f3 = sections[i2].child[i3].flexion;
 if (f3[name] === undefined) {
  f3[name] = new flex(title,vorlage,i2,i3);
 }
 var i;
 var f = f3[name];
 f.sp = "Deutsch";

 if (f.hasOwnProperty("wt")) {
  if (f.wt.length < wt.length+wte.length && wt.length > 1){
   f.wt = wt+wte;
  }
 } else {
  if (wt.length > 1){
   f.wt = wt+wte;
  } else {
   f.wt = "";
  }
 }
 f.wt = cleanupWt(f.wt);

 if (typeof ls == "string") {
  ls = [ls];
 }

 var tls = '';
 for (i=0; i<ls.length; i++) {
  if (!contains(tls,"|"+ls[i]+"}")) {
   tls += "{{Lautschrift|" + ls[i] + "}}, ";
  }
 }
 if (endsWith(tls,", ")) {
  tls = cropStr(tls,2);
 }

 if (f.hasOwnProperty("ls")) {
  if (f.ls.length < tls.length){
   f.ls = tls;
  }
 } else {
  f.ls = tls;
 }

 f.ls = cleanupLs(f.ls,f.wt);

 if (f.hasOwnProperty("hb")) {
  if (f.hb.length < hb.length){
   f.hb = "{{" + hb + "}}";
  }
 } else {
  f.hb = "{{" + hb + "}}";
 }

 for (i=0;i<nameList.length;i++) {
  if (nameList[i].length > 0) {
   var nli = nameList[i]+wte;
   if (nli != name) {
    if(typeof f.nf[nli] === "undefined") {
     f.nf[nli] = [];
    }
    f.nf[nli].push("NF");
   }
  }
 }

 if (!f.hasOwnProperty("form")) {
  f.form = form;
 }

 if (!f.hasOwnProperty("linkgrp")) {
  if (startsWith(form,"Posi")) {
   f.linkgrp = "posform";
  }
  if (startsWith(form,"Superla")) {
   f.linkgrp = "supform";
  }
  if (startsWith(form,"Kompara")) {
   f.linkgrp = "komform";
  }
 }

}


function prepareWorttrennungAdjA(wt) {
 var o = {};
 if (typeof wt == "string") {
  return prepareWorttrennungAdj(wt);
 } else {
  for (var w in wt) {
   o[w] = prepareWorttrennungAdj(wt[w]);
  }
 }
 return o;
}


function prepareWorttrennungAdj(wt) {
 var re2 = /ch$|ck$|ph$|sh$|rh$|th$/g;
 var re1 = /a$|e$|i$|o$|u$|ä$|ö$|ü$|y$/g;
 if (startsWith(wt,':')) {
  wt=wt.substr(1);
 }
 if (startsWith(wt,"''Neue Rechtschreibung:'' ")) {
  wt=wt.substr(26);
 }
 if (endsWith(wt,',')) {
  wt=$.trim(cropStr(wt,1));
 }
 if (endsWith(wt,'sch')) {
  wt = insertStr(wt,-3,'·');
 } else if (endsWith(wt,'e')) {
  wt = cropStr(wt,1);
 } else if (wt.search(re2)>=0) {
  wt = insertStr(wt,-2,'·');
 } else if (wt.search(re1)>=0) {
  wt = wt+'·';
 } else {
  wt = insertStr(wt,-1,'·');
 }
 return $.trim(wt);
}


function prepareWorttrennungVerb(wt) {
 var re2 = /·ch$|·ck$|·ph$|·sh$|·rh$|·th$/g;
 if (startsWith(wt,':')) {
  wt = wt.substr(1);
 }
 if (startsWith(wt,"''Neue Rechtschreibung:'' ")) {
  wt = wt.substr(26);
 }
 if (endsWith(wt,',')) {
  wt = $.trim(cropStr(wt,1));
 }
 if (endsWith(wt,'·')) {
  wt = cropStr(wt,1);
 }
 if (endsWith(wt,'·sch')) {
  wt = cropStr(wt,4) + 'sch';
 } else if(wt.search(re2) >= 0) {
  wt = cropStr(wt,3) + wt.substr(wt.length - 2,2);
 } else if(wt.charAt(wt.length-2) == '·') {
  wt = cropStr(wt,2) + wt.substr(wt.length - 1,1);
 }

 return $.trim(wt);
}


// Liegt eine Worttrennung bei Fremdwörtern vor, die aus Konsonant + l,n,r besteht
// und die Auswirkungen auf die Hinzufügung von Flexionsendungen hat?
// Dann die Trennsybole entfernen
function wtParagraph112(wt) {
 var re1 = /·([bcdfghjklmnpqrstvwxz])·?([lnr])$/g;
 if (wt.search(re1) >= 0) {
  wt = wt.replace(re1,'$1$2');
 }
  return $.trim(wt);
}


function ohneUmlaute(s) {
 return s.replace(/ä/g,'a').replace(/Ä/g,'A').replace(/ö/g,'o').replace(/Ö/g,'O').replace(/ü/g,'u').replace(/Ü/g,'U');
}


function mitUmlautung(s) {
 var str = "";
 var i;
 for (i = s.length - 1; i >= 0; i--) {
  if (s[i] == 'a') { str = 'ä' + str; break;}
  if (s[i] == 'A') { str = 'Ä' + str; break;}
  if (s[i] == 'o') { str = 'ö' + str; break;}
  if (s[i] == 'O') { str = 'Ö' + str; break;}
  if (s[i] == 'u') { str = 'ü' + str; break;}
  if (s[i] == 'U') { str = 'Ü' + str; break;}
  str = s[i] + str;
 }
 return s.slice(0,i) + str;
}


function mitUmlautungAu(s) {
 var str = "";
 var i;
 var Ulaut = -1;
 for (i = s.length - 1; i >= 0; i--) {
  if (s[i] == 'a' && Ulaut == i + 1) { str = 'ä' + str; break;}
  if (s[i] == 'A' && Ulaut == i + 1) { str = 'Ä' + str; break;}
  if (s[i] == 'u') { Ulaut = i;}
  if (s[i] == 'U') { Ulaut = i;}
  str = s[i] + str;
 }
 return s.slice(0,i) + str;
}


function UmlautungLS(ls,ohne,mit) {
 var a = ls.split(',');

 for (var i = 0; i < a.length; i++) {
  a[i] = Umlautung(a[i],ohne,mit);
  if (a[i] == '…') {
   a[i] = "{{Lautschrift|…}}";
  }
 }
 return a.join(',');
}


function Umlautung(ls,ohne,mit) {
 ohne = ohne.toLowerCase();
 mit = mit.toLowerCase();
 var uml = mit.length-1;
 var i = 0;

 if (contains(ls,'…')) {
  return ls;
 }

 while (uml >= 0) {
  if (mit.charAt(uml) == 'ä' && ohne.charAt(uml) == 'a') {
   i = ls.length-1;
   while (i >= 0) {
    if (ls.charAt(i) == 'a') {
     if (containsAt(ls,"aʊ̯",i)) {
      ls = ls.substr(0,i)+'ɔɪ'+ls.substr(i+2);
      ls = chLaut(ls,i+2);
     } else {
      ls = ls.substr(0,i)+'ɛ'+ls.substr(i+1);
      ls = chLaut(ls,i+1);
     }
     return ls;
    }
    i--;
   }
  }
  if (mit.charAt(uml) == 'ö' && ohne.charAt(uml) == 'o') {
   i = ls.length-1;
   while (i >= 0) {
    if (ls.charAt(i) == 'ɔ') {
     ls = ls.substr(0,i)+'œ'+ls.substr(i+1);
     ls = chLaut(ls,i+1);
     return ls;
    }
    if (ls.charAt(i) == 'o') {
     ls = ls.substr(0,i)+'ø'+ls.substr(i+1);
     ls = chLaut(ls,i+1);
     return ls;
    }
    i--;
   }
  }
  if (mit.charAt(uml) == 'ü' && ohne.charAt(uml) == 'u') {
   i = ls.length-1;
   while (i >= 0) {
    if (ls.charAt(i) == 'ʊ') {
     ls = ls.substr(0,i)+'ʏ'+ls.substr(i+1);
     ls = chLaut(ls,i+1);
     return ls;
    }
    if (ls.charAt(i) == 'u') {
     ls = ls.substr(0,i)+'y'+ls.substr(i+1);
     ls = chLaut(ls,i+1);
     return ls;
    }
    i--;
   }
  }
  uml--;
 }
 return '…';
}


function chLaut(ls,i) {
 if (containsAt(ls,'\u032fχ',i)) {  // IPA ̯ 
  ls = ls.substr(0,i+1)+'ç'+ls.substr(i+2);
 }
 if (containsAt(ls,'ːχ',i)) {
  ls = ls.substr(0,i+1)+'ç'+ls.substr(i+2);
 }
 if (containsAt(ls,'χ',i)) {
  ls = ls.substr(0,i)+'ç'+ls.substr(i+1);
 }
 if (containsAt(ls,'\u032fx',i)) {  // IPA ̯ 
  ls = ls.substr(0,i+1)+'ç'+ls.substr(i+2);
 }
 if (containsAt(ls,'ːx',i)) {
  ls = ls.substr(0,i+1)+'ç'+ls.substr(i+2);
 }
 if (containsAt(ls,'x',i)) {
  ls = ls.substr(0,i)+'ç'+ls.substr(i+1);
 }
 return ls;
}


// eventuelle e-Endung ist bereits aus posi und ls entfernt worden
function LautschriftAusPositivKomp(posi,lsp,komp) {

 var a = [];
 var i = 0;
 var ls = '';

 for (i=0; i<lsp.length; i++) {

  ls = prepareLautschrift(posi,lsp[i],'ə');  // positiv + Inlautverweichlichung
  ls = cropStr(ls,1);
  ls = ls.replace(/(n̩$|ŋ̍$|ŋ̩$|ɱ̍$|ɱ̩$|m̩$)/g,"ən");

  var tp = posi + "er";

  if (!contains(ls,'ˈ')) {
   ls = 'ˈ'+ls;
  }

  if (endsWith(posi,'en') && cropStr(posi,2) + 'ner' == komp) {
   ls = cropStr(ls,2)+'n';  // [n̩ ] oder [ən] ersetzen
  }

  if (endsWith(posi,'er') && cropStr(posi,2) + 'rer' == komp) {
   if (endsWith(ls,'ɐ')) {
    ls = cropStr(ls,1)+'ʁ'; // [ɐ] ersetzen
   } else {
    ls = cropStr(ls,2)+'ʁ'; // [əʁ] ersetzen
   }
  }

//  if (endsWith(posi,'r') && endsWith(ls,'ʁ')) {
//   ls = cropStr(ls,1)+'ʀ'; // [ʁ] ersetzen
//  }

  if (tp == komp) {
   a.push(ls + 'ɐ');
   continue;
  } else {
   if (tp.length == komp.length) {
    ls = Umlautung(ls,tp,komp);
   }
  }

  if (ls != '…') {
   ls += 'ɐ';
  }
  a.push(ls);

 }  // end for

 return a;
}


function auslautHartLoop(ls,wa){
 var a = ls.split("}}");
 var i;
 for (i=0; i<a.length; i++){
  if (a[i].length > 0){
   a[i] = auslautHart(a[i],wa);
  }
 }
 return a.join("}}");
}


// Auslautverhärtung, nicht bei -v und Wortart wa == Verb
function auslautHart(ls,wa) {
 if (endsWith(ls,'b')) {
  return cropStr(ls,1) + 'p';
 }
 if (endsWith(ls,'d')) {
  return cropStr(ls,1) + 't';
 }
 if (endsWith(ls,'\u0261') || endsWith(ls,'g')) {  //IPA || g
  return cropStr(ls,1) + 'k';
 }
 if (endsWith(ls,'v') && wa != "Verb") {
  return cropStr(ls,1) + 'f';
 }
 if (endsWith(ls,'z')) {
  return cropStr(ls,1) + 's';
 }
 return ls;
}


// Auslaut weich
function auslautWeich(ls) {
 if (endsWith(ls,'p')) {
  return cropStr(ls,1) + 'b';
 }
 if (endsWith(ls,'t')) {
  return cropStr(ls,1) + 'd';
 }
 if (endsWith(ls,'k')) {
  return cropStr(ls,1) + '\u0261';  //IPA g
 }
 if (endsWith(ls,'f')) {
  return cropStr(ls,1) + 'v';
 }
 if (endsWith(ls,'s')) {
  return cropStr(ls,1) + 'z';
 }
 return ls;
}


// eventuelle e-Endung ist NICHT aus posi und lsp entfernt worden
function LautschriftAusPositivSup(posi,lsp,sup) {

 var a = [];
 var i = 0;
 var ls = '';

 for (i=0; i<lsp.length; i++) {

  ls = lsp[i];
  if (!contains(ls,'ˈ')) {
   ls = 'ˈ' + ls;
  }

  ls = ls.replace(/(ŋ̍$|ŋ̩$|ɱ̍$|ɱ̩$|m̩$)/g,"n̩");

  var lsh = ls;
  if (endsWith(posi,"e")) {
   posi = cropStr(posi,1);
   ls  = cropStr(ls,1);
   // Auslautverhärtung
   lsh = auslautHart(ls);
  }

  var tp = posi + "sten";

  if (tp == sup) {
   a.push(lsh + 'stn̩');
   continue;
  } else {
   if (tp.length == sup.length) {
    lsh = Umlautung(lsh,tp,sup);
    if (lsh != '…') {
     a.push(lsh + 'stn̩');
     continue;
    }
   }
  }

  tp = posi + "esten";

  ls = prepareLautschrift(posi,ls,'ə');  // positiv + Inlautverweichlichung
  ls = cropStr(ls,1);

  if (tp == sup) {
   a.push(ls + 'əstn̩');
   continue;
  } else {
   if (tp.length == sup.length) {
    ls = Umlautung(ls,tp,sup);
    if (ls != '…') {
     a.push(ls + 'əstn̩');
     continue;
    }
   } else {
    a.push('…');
    continue;
   }
  }
 }  // end for

 return a;
}


function prepareLautschrift(t,ls,e,wa) {
 if (endsWith(ls,"-") || endsWith(ls,"…") || endsWith(ls,".")) {
  return ls;
 }
 if (e == "n") {
  if (endsWith(ls,"iː") && endsWith(t,"ie")) {
   return ls+"ən";
  }
  return ls+e;
 }
 if (e == "nən") {
  if (endsWith(t,"in")) {
   return ls+"ən";
  } else if (endsWith(t,"o")) {
   return ls+"ːnən";
  } else {
   return ls+e;
  }
 }
// if (endsWith(t,"r")) {
//  if (endsWith(ls,"ʁ") && startsWith(e,'ə')) {
//   return cropStr(ls,1)+"ʀ"+e;
//  }
// }
 if (startsWith(e,"s")) {
  if (endsWith(ls,"v")) { // Auslautverhärtung bei Verben für v nachholen
   ls = cropStr(ls,1) + 'f';
  }
  if (endsWith(t,"s")) {
   return cropStr(ls,1)+e;
  } else {
   return (ls+e).replace(/ts$/,"t͡s");
  }
 }
 if (startsWith(e,"t")) {
  if (endsWith(ls,"v")) { // Auslautverhärtung bei Verben für v nachholen
   ls = cropStr(ls,1) + 'f';
  }
  return ls+e;
 }
 // Inlautverweichlichung
 if (startsWith(e,'ə') || startsWith(e,'ɪ') || startsWith(e,'ɐ')) {
  if (endsWith(t,"b")) {return cropStr(ls,1)+"b"+e;}
  if (endsWith(t,"d")) {return cropStr(ls,1)+"d"+e;}
  if (endsWith(t,"g")) {  // sonst bleibts zB bei lang: laŋ
   if (endsWith(ls,"ç") || endsWith(ls,"k")) {
    return cropStr(ls,1)+"ɡ"+e;
   }
  }
  if (endsWith(t,"el")) {
   if (endsWith(ls,"l̩")) {
    return cropStr(ls,2)+"əl"+e;
   }
  }
  if (endsWith(t,"r")) {
   if (endsWith(ls,"ɐ̯")) {
    return cropStr(ls,2)+"ʁ"+e;
   } else if (endsWith(ls,"ɐ")) {
    return cropStr(ls,1)+"əʁ"+e;
   }
  }
  if (!endsWith(t,"ss") &&
      !endsWith(ls,"ps") && !endsWith(ls,"ks") &&
      !endsWith(ls,"ts") && !endsWith(ls,"ʦ") && !endsWith(ls,"t͡s")) {
   if (endsWith(t,"s")) {
    return cropStr(ls,1)+"z"+e;
   }
  }
  if (endsWith(t,"v")) {
   if (!startsWith(e,"ə")) { // Auslautverhärtung bei Verben für v nachholen
    ls = cropStr(ls,1) + 'f';
   } else {
    if (wa != "Verb") { // Adj. + Subst.
     ls = cropStr(ls,1) + 'v';
    }
   }
   return ls+e;
  }
 }
 if (endsWith(ls,"v") && !startsWith(e,"ə")) { // Auslautverhärtung bei Verben für v nachholen
  ls = cropStr(ls,1) + 'f';
 }
 return ls+e;
}


function addFlexionAdjStern(i2,i3,v,it,p,title,wt,ls,hb,form,kls,khb,pls,vorlage) {

 var param = getTemplateParamStern(v,it,p,2);
 if (param == undefined) return;

 addFlexionAdj(i2,i3,param,title,wt,ls,hb,form,kls,khb,pls,vorlage);

}


function addFlexionAdj(i2,i3,param,title,wt,ls1,hb,form,kls,khb,pls,vorlage) {

 if (param == undefined) return;

 var ls = ls1.slice(0);
 var i = 0;
 var j = 0;
 var nameList = param.split(/\s+|<[^>]*>|{[^}]*}|am /g);
 var wtorg = wt;
 var tls = [];

 if (form == "Superla") {
  for (i=0;i<nameList.length;i++) {
   if (endsWith(nameList[i],"ten")) {
    nameList[i] = cropStr(nameList[i],2);
   }
  }
 } else {
  wt = prepareWorttrennungAdjA(wt);
 }

 for (i=0;i<nameList.length;i++) {
  if (nameList[i].length>2 && !contains(nameList[i],' ')) { //keine Leerz.
   if (!contains(nameList[i],'(') && !contains(nameList[i],')')) {
    var nli=nameList[i];

    if (form == "Superla") {
     var twt = '';
     if (typeof wt != "string") {
      if (wt.hasOwnProperty(nli+"en")) {
       twt = wt[nli+"en"];
      } else if (wt.hasOwnProperty(nli)) {
       twt = wt[nli];
      } else if (wt.hasOwnProperty(ohneUmlaute(nli)+"en")) {
       twt = wt[ohneUmlaute(nli)+"en"];
      } else if (wt.hasOwnProperty(ohneUmlaute(nli))) {
       twt = wt[ohneUmlaute(nli)];
      }
     } else {
      twt = wt;
     }
     if (endsWith(twt,"ten")) {
      twt = cropStr(twt,2);
     }

     if (endsWith(nli,"ten")) {
      nli = cropStr(nli,2);
     }

     var sls = ls.slice(0);
     if (sls[0] == '…' && !contains(pls[0],'…')) {
      sls = LautschriftAusPositivSup(title,pls,nli+"en");
     }
     twt = copyTrenner(twt,nli);
     if (endsWith(sls[0],"n̩") || endsWith(sls[0],"ən")){
      sls = forEachLs2(sls,"cropStr",2);
      tls = forEachLs2(sls,"concat","ə");
      addFlexionAdjEnd(i2,i3,nli+"e",title,twt,"e",tls,'',form,"de-Adj-e",nameList);
      tls = forEachLs2(sls,"concat","əm");
      addFlexionAdjEnd(i2,i3,nli+"em",title,twt,"em",tls,'',form,"de-Adj-em",nameList);
      tls = forEachLs2(sls,"concat","n̩");
      addFlexionAdjEnd(i2,i3,nli+"en",title,twt,"en",tls,hb,form,"de-Adj-en-Sup",nameList);
      tls = forEachLs2(sls,"concat","ɐ");
      addFlexionAdjEnd(i2,i3,nli+"er",title,twt,"er",tls,'',form,"de-Adj-er",nameList);
      tls = forEachLs2(sls,"concat","əs");
      addFlexionAdjEnd(i2,i3,nli+"es",title,twt,"es",tls,'',form,"de-Adj-es",nameList);
     } else {
      addFlexionAdjEnd(i2,i3,nli+"e",title,twt,"e",'','',form,"de-Adj-e",nameList);
      addFlexionAdjEnd(i2,i3,nli+"em",title,twt,"em",'','',form,"de-Adj-em",nameList);
      addFlexionAdjEnd(i2,i3,nli+"en",title,twt,"en",ls,hb,form,"de-Adj-en-Sup",nameList);
      addFlexionAdjEnd(i2,i3,nli+"er",title,twt,"er",'','',form,"de-Adj-er",nameList);
      addFlexionAdjEnd(i2,i3,nli+"es",title,twt,"es",'','',form,"de-Adj-es",nameList);
     }
    } else { // Komparativ
     var kls = ls.slice(0); 
     if (kls[0] == '…' && !contains(pls[0],'…')) {
      kls = LautschriftAusPositivKomp(title,pls,nli);
     }
     var twt = '';
     if (typeof wt != "string") {
      if (wt.hasOwnProperty(nli)) {
       twt = wt[nli];
      } else {
       if (wt.hasOwnProperty(ohneUmlaute(nli))) {
        twt = copyTrenner(wt[ohneUmlaute(nli)],nli);
       }
      }
     } else {
      twt = wt;
     }
     twt = copyTrenner(twt,nli);
     if (endsWith(kls[0],"ɐ")){
      if (nli != title + "er" && nli != title + "r" && nli != cropStr(title,2) + "ler") {
       var wtk = '';
       if (typeof wtorg != "string") {
        if (wt.hasOwnProperty(nli)) {
         wtk = wt[nli];
        } else {
         if (wtorg.hasOwnProperty(ohneUmlaute(nli))) {
          wtk = copyTrenner(wtorg[ohneUmlaute(nli)],nli);
         }
        }
       }
       if (endsWith(wtk,"·r")) {
        wtk = cropStr(wtk,2) + 'r';
       }
       addFlexionAdjEnd(i2,i3,nli,title,wtk,'',kls,'',form,"de-Adj-Komp",nameList);
      }
      kls = forEachLs2(kls,"cropStr",1);
      tls = forEachLs2(kls,"concat","əʁə");
      addFlexionAdjEnd(i2,i3,nli+"e",title,twt,"e",tls,'',form,"de-Adj-e",nameList);
      tls = forEachLs2(kls,"concat","əʁəm");
      addFlexionAdjEnd(i2,i3,nli+"em",title,twt,"em",tls,'',form,"de-Adj-em",nameList);
      tls = forEachLs2(kls,"concat","əʁən");
      addFlexionAdjEnd(i2,i3,nli+"en",title,twt,"en",tls,'',form,"de-Adj-en",nameList);
      tls = forEachLs2(kls,"concat","əʁɐ");
      addFlexionAdjEnd(i2,i3,nli+"er",title,twt,"er",tls,'',form,"de-Adj-er",nameList);
      tls = forEachLs2(kls,"concat","əʁəs");
      addFlexionAdjEnd(i2,i3,nli+"es",title,twt,"es",tls,'',form,"de-Adj-es",nameList);
     } else {
      addFlexionAdjEnd(i2,i3,nli+"e",title,twt,"e",'','',form,"de-Adj-e",nameList);
      addFlexionAdjEnd(i2,i3,nli+"em",title,twt,"em",'','',form,"de-Adj-em",nameList);
      addFlexionAdjEnd(i2,i3,nli+"en",title,twt,"en",'','',form,"de-Adj-en",nameList);
      addFlexionAdjEnd(i2,i3,nli+"er",title,twt,"er",'','',form,"de-Adj-er",nameList);
      addFlexionAdjEnd(i2,i3,nli+"es",title,twt,"es",'','',form,"de-Adj-es",nameList);
     }

    }
   }
  }
 }
}


function addFlexionAdjPositiv(i2,i3,param,title,wt,ls1,hb,form,kls,khb,pls,vorlage) {
// alert ("addFlexionAdjPositiv "+param+","+title+","+wt+","+ls+hb+form+kls+khb); 
 if (param == undefined) return;

 var ls;
 var i = 0;
 var j = 0;
 var nameList = getNameList(param);
 var tls = [];
 var vorlage1 = (form == "Gerundivum" ? "de-Gerundivum-" : "de-Adj-");

// Prüfe Spezialfall bei Fremdwörtern und e-Tilgung und Konsonant +l,+n,+r
// ergibt zusätzliche Trennmöglichkeit: nobel (no·bel) aber: noble (no·b·le)

 var re1 = /[bcdfghjklmnpqrstvwxz][lnr]$/g;
 for (i = 0; i < nameList.length; i++) {
  var nli = nameList[i];
  // schauen ob Voraussetzung erfüllt ist und wt zu Komparativform = Positiv + er existiert
  if (nli.search(re1) >= 0) {
   if (typeof wt != "string") {
    if (wt.hasOwnProperty(nli + "er")) {
     wt[nli] = cropStr(wt[nli + "er"],2);
    }
   }
  }
 }

 wt = prepareWorttrennungAdjA(wt);

 for (i = 0; i < nameList.length; i++) {

  var nli = nameList[i];

  var twt = '';
  if (typeof wt != "string") {
   if (wt.hasOwnProperty(nli)) {
    twt = wt[nli];
   }
  } else {
   twt = wt;
  }

  ls = ls1.slice(0);
  if (!contains(ls[0],'…')) {
   for (j=0; j<ls.length; j++) {
    if (!contains(ls[j],'ˈ')) {
     ls[j] = 'ˈ' + ls[j];
    }
    ls[j] = prepareLautschrift(title,ls[j],'ə');  // positiv + Inlautverweichlichung
    ls[j] = cropStr(ls[j],1);
    ls[j] = ls[j].replace(/(n̩$|ŋ̍$|ŋ̩$|ɱ̍$|ɱ̩$|m̩$)/g,"ən");
    if (ls[j].charAt(ls[j].length-2) == 'ə' && nli.charAt(nli.length-2) != 'e') {  //e-Tilgung
     ls[j] = cropStr(ls[j],2) + ls[j].charAt(ls[j].length-1);
    }
   }
  }

  var tls = forEachLs2(ls,"concat","ə");
addFlexionAdjEnd(i2,i3,nli+"e",title,twt,"e",tls,'',form,vorlage1+"e",nameList);
  if (nli.search(/ah?$|eh?$|ih?$|oh?$|uh?$|äh?$|öh?$|üh?$|yh?$/g) < 0) {

   if (ls[0].search(/b$|d$|g$|ɡ$|k$|l$|m$|n$|ŋ$|p$|ʀ$|ʁ$|t$/g) < 0) {
    tls = forEachLs2(ls,"concat","m̩");
    addFlexionAdjEnd(i2,i3,nli+"em",title,twt,"em",tls,'',form,vorlage1+"em",nameList);
   } else {
    tls = forEachLs2(ls,"concat","əm");
    addFlexionAdjEnd(i2,i3,nli+"em",title,twt,"em",tls,'',form,vorlage1+"em",nameList);
   }

   if (ls[0].search(/l$|m$|n$|ŋ$|n̩$|ʀ$|ʁ$/g) < 0) {
    tls = forEachLs2(ls,"concat","n̩");
    addFlexionAdjEnd(i2,i3,nli+"en",title,twt,"en",tls,'',form,vorlage1+"en",nameList);
   } else {
    tls = forEachLs2(ls,"concat","ən");
    addFlexionAdjEnd(i2,i3,nli+"en",title,twt,"en",tls,'',form,vorlage1+"en",nameList);
   }

  } else {
   tls = forEachLs2(ls,"concat","əm");
   addFlexionAdjEnd(i2,i3,nli+"em",title,twt,"em",tls,'',form,vorlage1+"em",nameList);
   tls = forEachLs2(ls,"concat","ən");
   addFlexionAdjEnd(i2,i3,nli+"en",title,twt,"en",tls,'',form,vorlage1+"en",nameList);
  }

  if (kls[0] == "…") {
   tls = forEachLs2(ls,"concat","ɐ");
   addFlexionAdjEnd(i2,i3,nli+"er",title,twt,"er",tls,'',form,vorlage1+"er"+vorlage,nameList);
  } else {
   addFlexionAdjEnd(i2,i3,nli+"er",title,twt,"er",kls,khb,form,vorlage1+"er"+vorlage,nameList);
  }
  tls = forEachLs2(ls,"concat","əs");
  addFlexionAdjEnd(i2,i3,nli+"es",title,twt,"es",tls,'',form,vorlage1+"es",nameList);
 
 }
}


function getNameList(param) {
 var a = param.split(/\s+|<[^>]*>|{[^}]*}|am /g);
 var i = 0;
 while (i < a.length) {
  if (a[i].length < 2 || contains(a[i],' ') || contains(a[i],'(') || contains(a[i],')')) {
   a.splice(i,1);
  } else {
   i++;
  }
 }
 return a;
}


function flex(title,vorlage,i2,i3,pass) {
 this.title = title;
 this.vorlage = vorlage;
 this.exists = true;
 this.pass = pass;
 this.wt = '';
 this.ls = '';
 this.hb = '';
 this.reim = '';
 this.prefix = "";
 this.prefixls = [];
 this.gm = [];
 this.nf = {};
 this.nfp = {};  // Nebenformen Partizip
 this.id = ""+i2+"-"+i3;
}


function wortbildung(title,vorlage,i2,i3,pass) {
 var wb = new flex(title,vorlage,i2,i3,pass);
 wb.gs = ''; wb.ds = ''; wb.as = ''; wb.np = ''; wb.gp = ''; wb.dp = ''; wb.ap = '';
 wb.komp = ''; wb.sup = '';
 wb.genus = '';
 return wb;
}


function addFlexionSubStern(i2,i3,v,it,p,title,wt,ls,hb,gm,ht) {
 var param = getTemplateParamStern(v,it,p,2);
 if (param == undefined) return;

 var re = /\s+|<[^>]*>|{{[^}]*}}|\bder |\bdie |\bdas |\bdes |\bdem |\bden |\bthe /g;
 var nameList = param.split(re);

 addFlexionSub(i2,i3,v,it,title,wt,ls,hb,gm,ht,nameList);
}


function addFlexionSub(i2,i3,v,it,title,wt,ls,hb,gm,ht,nameList) {

  var formen = [];
  var i = 0;
  var j = 0;
  for (i = 0; i < nameList.length; i++) {
    if (nameList[i].length > 2 && nameList[i].length >= title.length-2) { //Pl+Sg-Etant.
      if (!contains(nameList[i],'(') && !contains(nameList[i],')')) {
        formen.push(nameList[i]);
      }
    }
  }

  for (i=0;i<formen.length;i++) {
    if (formen[i]!=title) {
     var f3 = sections[i2].child[i3].flexion;
     if (f3[formen[i]] === undefined) {
      f3[formen[i]] = new flex(title,"de-Sub-S6",i2,i3);
     }
     var fi=f3[formen[i]];
     for (j=0;j<formen.length;j++) {
      if(formen[i]!=formen[j]) {
       if(typeof fi.nf[formen[j]] === "undefined"){
        fi.nf[formen[j]] = [];
       }
       fi.nf[formen[j]].push(gm);
      }
     }

     if (fi.wt.length < wt.length){
      fi.wt=wt;
     }
     if (fi.ls.length < ls.length){
      fi.ls=ls;
     }
     if (fi.hb.length < hb.length){
      fi.hb=hb;
     }
     fi.sp = extractStr2(getTemplateParam(v,it,"0"),""," Substantiv"," ",'R');
     var dative = "";
     if (fi.sp == "Deutsch" && gm == "Dativ Singular") {
      if (title + 'e' == formen[i] || title + 'se' == formen[i]) {
       dative = "{{Dativ-e}} ";
      }
     }
     if($.inArray('*'+dative+gm+ht,fi.gm) == -1){
      fi.gm.push('*'+dative+gm+ht);
     }

    }
  }
}


function deleteDuplicateLSFlexion(idx) {
 var f3 = sections[idx.i2].child[idx.i3].flexion;
 for (var i in f3) {
  if (f3[i].hasOwnProperty("ls")) {
   f3[i].ls = deleteDuplicateLS(f3[i].ls);
  }
 }
}


function deleteDuplicateLS(ls) {
 var s = ls.split(", ");
 if (s.length > 1) {
  var st = [];
  st.push(s[0]);
  for (var i = 1; i < s.length; i++) {
   addOnlyUniqueLS(st,s[i]);
  }
  ls = st.join(", ");
 }
 return ls;
}


function apiParseLinks(flexion,hr,pass) {
 if (doAktualisierung || doReimen) {
  apiQueryRevision(flexion,handleResponseFlex,pass);
 }
 var url = '';
 for (var i in flexion) {
  url += "[["+i+"]]";
 }
 if (url.length>0) {
  url = buildApi(url,"action=parse&prop=links&format=json&text=");
  $.get(url, hr);
 }
}


function apiQueryRevision(flexion,hr,pass) {

 function hri(data) {
  if (data.query !== undefined && data.query.pages !== undefined) {
   hr(flexion,data.query.pages,pass);
  }
 }

 var url = '',
     sep = '';
 for (var i in flexion) {
  url += sep + i
  sep = '|';
 }
 if (url.length>0) {
  url = buildApi(url,"action=query&prop=revisions&format=json&rvprop=content&titles=");
  $.get(url, hri);
 }

}


function getRevision(dqp,t){
 for (var i in dqp) {
  if (dqp[i].title == t) {
   if (dqp[i].hasOwnProperty("revisions")) {
    if (dqp[i].revisions.length > 0) {
     return internalText(dqp[i].revisions[0]['*']);
    }
   }
  }
 }
 return '';
}


function handleResponseRhymeExists(reime,dqp,pass){

 var txt = '';
 var nl;
 var i2,i3,s2,s3;

 for (i2 = 1; i2 < sections.length; i2++) {
  s2 = sections[i2];
  for (i3 = 1; i3 < s2.child.length; i3++) {
   s3 = s2.child[i3];

   for (var r in reime) {
    var ft = s3.flexion[reime[r].titel];

    if (!ft && reime[r].titel == thispage) {  // bin ichs selbst?
     ft = {};
    }

    if (ft) {
     if (reime[r].hasOwnProperty("gui")) { continue; }
     txt = getRevision(dqp,r);
     nl = document.createElement("a");

     if (txt.length > 0) {
      if (contains(txt,"[[" + reime[r].titel + "]]")) {
       nl.setAttribute("style", "color:#0000E0");
       nl.href=buildUrl2(r,"&checkpage=auto");
       nl.innerHTML = "<br>&nbsp;Reimseite aktualisieren: " + reime[r].titel + " | " + r + ' | ';
      } else {
       nl.setAttribute("style", "color:#0000E0");
       nl.href=buildUrl2(r,"&rhyme=" + reime[r].titel);
       nl.innerHTML = "<br>&nbsp;Reimseite ergänzen: " + reime[r].titel + " | " + r + ' | ';
      }
     } else {
      nl.setAttribute("style", "color:#D3545F");
      nl.href=buildUrl2(r,"&rhyme=" + reime[r].titel);
      nl.innerHTML = "<br>&nbsp;Reimseite erstellen: " + reime[r].titel + " | " + r + ' | ';
     }
     appendWithComma(reime[r].sp, "-fform-reim", nl, reime[r].id);
     reime[r].gui = true;
    }

   } // end for (var r in reime) {
   
  } // end for child
 } // end for sections
 
}


function handleResponseFlex(flexion,dqp,pass){

 var node = getGadgetAnker();
 if (node) {

  var txt = '';
  var tx2 = '';
  var nl;
  var r = {};
  var spracheH2 = '';
  var lastId = '';

  var i2,i3,s2,s3;
  for (i2 = 1; i2 < sections.length; i2++) {
   s2 = sections[i2];
   spracheH2 = leseSpracheH2(sections[i2].ht);
   for (i3 = 1; i3 < s2.child.length; i3++) {
    s3 = s2.child[i3];
    var cnt = 0;

    for (var t in s3.flexion) {
     var ft = s3.flexion[t];
     lastId = ft.id;
     if ((ft.pass !== undefined && ft.pass != pass)||(ft.pass === undefined && pass == 2)) {continue;}

     txt = getRevision(dqp,t);
     if (!pages.hasOwnProperty(t)) {
      pages[t] = new page(t,txt);
     }

     if (doAktualisierung) {

      r = editChapter(txt,"Deutsch",thispage,ft.wt,ft.ls);

      if (txt != r.tx2) {
       pages[t].id  = ft.id;
       pages[t].tx2 = r.tx2.substr(1);
       cnt++;

       nl = document.createElement("a");
       nl.href = "javascript:checkpage.aktualisieren('"+t+"')";
       nl.innerHTML = "<br>&nbsp;" + t +' | '
        + (ft.wt.length == 0 ? '×' : ft.wt) + ' | '
        + ((ft.ls.length == 0 || contains(ft.ls,'…')) ? '×' : ft.ls);
       nl.setAttribute("id", "cp-Akt-" + t.replace(/ /g,'_'));
       nl.setAttribute("style", "color:#00D03F");

       var dn = document.createElement("span");
       dn.appendChild(nl);
       dn.appendChild(document.createElement("br"));
       dn.appendChild(document.createTextNode("\u00A0bisher: " + r.wt + ' | ' + r.ls));
       appendWithComma(ft.sp, "-fform-akt", dn, ft.id);
      }
     }

     var exists = txt.length > 0;
     if (exists && doReimen && !contains(t," ")) {
      fehltReim(flexionReime, t, txt, ft.ls, ft.sp, ft.id);
     }

    }  // end for (var t in s3.flexion)

    // Fehlt der Reim bei der Grundform?
    fehltReim(flexionReime, thispage, s3.text, "{{Lautschrift|" + ersteLautschrift(s3.tt) + "}}", spracheH2, lastId);

    if (doAktualisierung) {
     if (cnt > 1) {

      nl = document.createElement("a");
      nl.href = "javascript:checkpage.aktualisierenAlle('"+ft.id+"')";
      nl.innerHTML = "<br>&nbsp; Alle aktualisieren.";
      nl.setAttribute("id", "cp-AktAlle");
      nl.setAttribute("style", "color:#00D03F");
      appendWithComma(ft.sp, "-fform-akt", nl, ft.id);

     }
    }

   }
  }  // end of: for (i3

  if (doReimen && !isEmpty(flexionReime)) {
   apiQueryRevision(flexionReime,handleResponseRhymeExists,1);
  }

 }  // end of: for (i2
}


function fehltReim(flexionReime, t, txt, ls, spr, id) {
  if (ls.length == 0) {
    // bei eindeutiger LS falls ls leer
    ls = "{{Lautschrift|" + getSingleLs(txt) + "}}";
  }

  var hasReim = true;
  var lsr = getLsReim(ls);
  
  if (lsr.length > 0) {
    hasReim = txt.indexOf("{{Reim|") > 0;
    var r = "Reim:" + spr + ":-" + lsr;
  }

  if (!hasReim && !flexionReime.hasOwnProperty(r)) {
    flexionReime[r] = {};
    flexionReime[r].titel = t;
    flexionReime[r].sp = spr;
    flexionReime[r].id = id;
  }
}


function getLsReim(lsr) {

 if (lsr.length > 0) {
  lsr = lsr.replace(/\{Lautschrift\|/g,"{Lautschrift|ˈ"); // Betonung sicherstellen
  lsr = $.trim(lsr);
 }

 var rtab = [];
 var a = externalLS(lsr).split("{Lautschrift");

 if (a.length > 1) {
  for (var i = 1; i < 2; i++) {   // nur für erste Lautschrift  // i<a.length
   var li = a[i].lastIndexOf("ˈ");
   if (li >= 0) {
    var tmp = a[i].substr(li);
    var vokal = tmp.search(/[aɑeɛiɪoɔøœuʊyʏ]/);
    if (tmp[vokal + 1] == '\u032f' || tmp[vokal + 1] == '\u0311') {  // unsilbisch unten oder oben
     vokal += 2;
    }
    var bis = tmp.indexOf("}");
    tmp = tmp.slice(vokal,bis);
    tmp = tmp.replace(/ˌ/g,""); // Nebenbetonung aus Link entfernen
    rtab.push(tmp);
   }
  }
 }

 return rtab.join('');
}


function editChapter(txt,spr,title,wt,ls) {
 var t2 = txt.split(/(\n==[^=]+?)/);
 var t3 = [];
 var r = {tx2: '', wt: '', ls: ''};
 var i,j;
 var e;

 for (i=0; i<t2.length; i++) {
  if (contains(t2[i],'{{Sprache|'+spr+'}}')) {
   t3 = t2[i].split(/(\n===[^=]+?)/);
   for (j=0; j<t3.length; j++) {
    if (t3[j].length == 5) continue;

    if (contains(t3[j],'{{Schweizer und Liechtensteiner Schreibweise|')) {
     e = /\|Worttrennung\s*=\s*([^\}]*)/.exec(t3[j]);
     if (e && e.length > 1) {
      r.wt = e[1];
      if (wt.length > 0) {
       t3[j] = t3[j].replace(/\|Worttrennung\s*=\s*[^\}]*/,"|Worttrennung="+wt);
      }
     } else {
      r.wt = "-";
      if (wt.length > 0) {
       t3[j] = t3[j].replace(/Schweizer und Liechtensteiner Schreibweise\|([^\}]*)/,
               "Schweizer und Liechtensteiner Schreibweise|$1|Worttrennung="+wt);
      }
     }
    }

    var inf = contains(t3[j],'Erweiterter Infinitiv|'+spr+'}}');
    var gerund = contains(t3[j],'Dekliniertes Gerundivum|'+spr+'}}');
    var part1 = contains(t3[j],'Partizip I|'+spr+'}}');
    var part2 = contains(t3[j],'Partizip II|'+spr+'}}');
    var flx = contains(t3[j],'ierte Form|'+spr+'}}');
    var komp = contains(t3[j],'Komparativ|'+spr+'}}');
    var sup = contains(t3[j],'Superlativ|'+spr+'}}');
    var re = new RegExp('|'+title+'(\||\}\})');
    var gfv = contains(t3[j],'{{Grundformverweis|') && (t3[j].search(re) > -1);
    var gfd = contains(t3[j],'{{Grundformverweis Dekl|') && (t3[j].search(re) > -1);
    var gfk = contains(t3[j],'{{Grundformverweis Konj|') && (t3[j].search(re) > -1);

    if ((inf || gerund || part1 || part2 || flx || komp || sup) && (gfv || gfd || gfk)) {

     e = /\{\{Worttrennung\}\}\n*([^\{]*)\n\{\{/.exec(t3[j]);
     if (e && e.length > 1) {
      r.wt = e[1];
     }
     if (wt.length > 0) {
      t3[j] = t3[j].replace(/\{\{Worttrennung\}\}\n*[^\{]*\n*\{\{/,"{{Worttrennung}}\n:"+wt+"\n\n{{");
     }

     e = /\{\{IPA\}\}(.*)\n/.exec(t3[j]);
     if (e && e.length > 1) {
      r.ls = e[1];
     }
     if (ls.length > 0 && !contains(ls,'…')) {
      if (contains(t3[j],'{{Aussprache}}')) {
       t3[j] = t3[j].replace(/\{\{IPA}}.*\n/,"{{IPA}} "+ls+"\n");
      } else {
       t3[j] = t3[j].replace(/\{\{Grammatische/,"{{Aussprache}}\n:{{IPA}} " +
               ls + "\n:{{Hörbeispiele}} {{Audio|}}\n\n{{Grammatische");
      }
     }

    }
   }
   t2[i] = t3.join('');
  }                
 }
 r.tx2 = t2.join('');
 return r;
}


function createDim(i2,i3,v,title,it) {

 var i,s,w,dw;
 var endung='';
 var laut='';
 var nowtls=false;
 var tsge='';
 var tple='';
 var diminutiv = {};
 var t=extractStr2(v.text,getTemplateParam(v.tt,it,"0"),"\n=","");
 var wfn=extractStr(t,"{{Verkleinerungsformen}}","\n{{",'B');
 var ar=getLinks(wfn);
 if (ar.length == 0){
  return;
 }

 var titlea=toAnsi(title);
 var tpl=getTemplateParam(v.tt,it,"Nominativ Plural");
 if (tpl==undefined) {
  tpl=getTemplateParam(v.tt,it,"Nominativ Plural 1");
 }
 if (tpl==undefined) {
  tpl='';
 } else {
  tpl=extractStr(tpl,"die ","",'B');
 }

 if(endsWith(title,"e")){
  tsge=cropStr(title,1);
 }
 if(endsWith(tpl,"e")){
  tple=cropStr(tpl,1);
 }

 for(i=0;i<ar.length;i++){
  w=ar[i];
  var schwa=false;
  var plural=false;
  nowtls=false;

  if(endsWith(w,"chen")){
   endung="chen";
   laut="çən";
  } else if(endsWith(w,"lein")){
   endung="lein";
   laut="laɪ̯n";
  } else {
   endung="";
  }

  if(title+endung == w){
   ;
  } else if(tsge+endung == w){
   schwa=true;
  } else if(tpl+endung == w){
   plural=true;
  } else if(tple+endung == w){
   plural=true;
   schwa=true;
  } else {
   nowtls=true;
  }

  var genend=getGenusEnd(v.head);
  var und = '';
  var hk="{{Herkunft}}\n:[[Ableitung]] der Verkleinerungsform aus dem Substantiv ''[["
   +title+"]]''";
  if (tsge+endung == w || startsWithUml(w,tsge)){
   und = ' und';
   hk+=", Subtraktionsfuge -e";
  }
  if (startsWithUml(w,title) || startsWithUml(w,tsge)){
   und = ' und';
   hk+=", Umlautung";
  }
  hk+=und + " mit dem [[Derivatem]] ([[Ableitungsmorphem]]) ''[[-"+endung+"]]''\n";

  diminutiv[w]=new flex(title,"de-Sub-Dim",i2,i3);
  dw=diminutiv[w];
  dw.bed="\n:[1] klein"+genend+" [["+title+"]]\n";
  dw.rest=hk;

/* Referenzen nun in Autoedit-Vorlage
  s=extractStr2(v.text,"\n{{Referenzen}}","\n\n","");
  s=s.replace(new RegExp(title,'g'),w);
  if(title != titlea){
   s=s.replace(new RegExp(titlea,'g'),toAnsi(w));
  }
  dw.ref=s.replace(/\n\n$/,'');
*/
  dw.ref = "";

  if(nowtls){
   dw.ls = "{{Lautschrift|…}}";
//   dw.ls += ", {{Pl.}} " + dw.ls;
   dw.wt=" , {{Pl.}} ";
  } else {
   worttr=getWtStruct(extractStr(t,"{{Worttrennung}}","\n{{",'B'));
   lautschr=getSgPlStruct(extractStr(t,":{{IPA}}","\n",'B'));

   if(plural){
    dw.wt=buildWtNeu(worttr,"Pl.");
    s=buildPropNeu(lautschr,"Pl.");
   } else {
    dw.wt=buildWtNeu(worttr,"Sg.");
    s=buildPropNeu(lautschr,"Sg.");
   }

   if(schwa){
    dw.wt=cropStr(dw.wt,1);
    dw.wt=prepareWorttrennungDim(dw.wt)
    s=s.replace(/ə}}/,"}}");
   }

   if(s.length==0||contains(s,"…")){
    dw.ls = "{{Lautschrift|…}}";
//    dw.ls += ", {{Pl.}} " + dw.ls;
   }else{
    dw.ls = lsPlusE(title,s,laut);
//    dw.ls += ", {{Pl.}} " + dw.ls;
   }

   dw.wt=wtPlusE(dw.wt,"·"+endung)+", {{Pl.}} "+wtPlusE(dw.wt,"·"+endung);
   dw.wt=dw.wt.replace(/··/g,"·");
  }
 }

 function handleResponseIntern(data) {
  if (data.parse !== undefined && data.parse.links !== undefined) {
   handleResponseDim(diminutiv,data.parse.links);
  }
 }

 if (!isEmpty(diminutiv)) {
  var url = buildApi(wfn,"action=parse&prop=links&format=json&text=");
  $.get(url, handleResponseIntern);
 }
}


function prepareWorttrennungDim(wt) {
 var re2 = /·ch$|·ck$|·ph$|·sh$|·rh$|·th$/g;
 var re1 = /·.$/g;
 if (startsWith(wt,':')) {
  wt=wt.substr(1);
 }
 if (endsWith(wt,',')) {
  wt=$.trim(cropStr(wt,1));
 }
 if (endsWith(wt,'·sch')) {
  wt = wt.replace(/·sch$/,'sch');
 } else if (wt.search(re2)>=0) {
  wt = cropStr(wt,3)+wt.substr(wt.length-2,2);
 } else if (wt.search(re1)>=0) {
  wt = cropStr(wt,2)+wt.substr(wt.length-1,1);
 }
 return $.trim(wt);
}


function createWF(i2,i3,v,text,title,it) {

 var t = extractStr2(text,getTemplateParam(v,it,"0"),"\n=","");
 var wfn = extractStr(t,"{{Weibliche Wortformen}}","\n{{",'B');

 var eTilgung = false;
 var erTilgung = false;
 var umlautung = false;
 var wfo = title.replace(/e$/,'')+"in";
 var wfu = mitUmlautung(wfo);
 var wfau = mitUmlautungAu(wfo);
 var wf = wfo;

 if (!contains(wfn,wfo)) {
  if (!contains(wfn,wfu) && !contains(wfn,wfau)) {
   wfo = title.replace(/erer$/,'er')+"in";
   wfu = mitUmlautung(wfo);
   wfau = mitUmlautungAu(wfo);
   if (!contains(wfn,wfo)) {
    if (!contains(wfn,wfu) && !contains(wfn,wfau)) {
     return;
    } else {
     if (contains(wfn,wfu)) {
      wf = wfu;
     } else {
      wf = wfau;
      wfu = wfau;
     }
     umlautung = true;
     erTilgung = endsWith(title,'er');
    }
   } else {
    erTilgung = endsWith(title,'er');
   }
  } else {
   if (contains(wfn,wfu)) {
    wf = wfu;
   } else {
    wf = wfau;
    wfu = wfau;
   }
   umlautung = true;
   eTilgung = endsWith(title,'e');
  }
 } else {
  eTilgung = endsWith(title,'e');
 }


 var titlea = toAnsi(title);
 var s = extractStr(t,"{{Bedeutungen}}","\n{{Weibliche Wortformen");
 var hk = "{{Herkunft}}\n:[[Ableitung]] ([[Motion]], [[Movierung]]) des Femininums aus der männlichen Form ''[["
  + title + "]]''";
 if (eTilgung){
  hk += ", Subtraktionsfuge -e und";
 }
 if (erTilgung){
  hk += ", Subtraktionsfuge -er und";
 }
 hk += " mit dem [[Derivatem]] ([[Ableitungsmorphem]]) ''[[-in]]''"
 if (umlautung) {
  hk += " und Umlautung"
 }
 hk += "\n\n";

 if (contains(s,"{{Herkunft}}")){
  s = s.replace(/\{\{Herkunft\}\}[^\v]*?\n\n/,hk);
 } else if (contains(s,"{{Symbole}}")){
  s = s.replace(/(\{\{Symbole\}\}[^\v]*?\n\n)/,"$1"+hk);
 } else if (contains(s,"{{Abkürzungen}}")){
  s = s.replace(/(\{\{Abkürzungen\}\}[^\v]*?\n\n)/,"$1"+hk);
 } else {
  s = s.replace(/(\{\{Bedeutungen\}\}[^\v]*?\n\n)/,"$1"+hk);
 }

 var feminin = new flex(title,"de-Sub-fem",i2,i3);
 feminin.bed = extractStr(s,"{{Bedeutungen}}","\n{{Weibliche Wortformen",'B');
 feminin.bed = feminin.bed.replace(/\{\{gM\|?([mnrs]?)\}\}/g, "weibliche$1");  // gen. mask. -> weiblich

 s = extractStr(t,"\n{{Weibliche Wortformen}}","\n=",'L');
 s = extractStr(s,"\n{{","\n=",'R')+'\n';
 s = s.replace(/\{\{Wortbildungen\}\}[^\v]*?\n\n/,'');
 feminin.rest = filterRefs(s.replace(/\n\n$/,'\n'));

 s = extractStr2(text,"\n{{Referenzen}}","\n\n","");
 s = s.replace(new RegExp(title,'g'),wf);
 if (title != titlea){
  s = s.replace(new RegExp(titlea,'g'),toAnsi(wf));
 }
 feminin.ref = s.replace(/\n\n$/,'');

 worttr = getWtStruct(extractStr(t,"{{Worttrennung}}","\n{{",'B'));
 lautschr = getSgPlStruct(extractStr(t,":{{IPA}}","\n",'B'));

 feminin.wt = copyTrenner(buildWtNeu(worttr,"Sg."),cropStr(wf,2));

 var ls = buildPropNeu(lautschr,"Sg.");

 if (eTilgung){
  if (endsWith(feminin.wt,'e')) {
   feminin.wt = cropStr(feminin.wt,1);
  }
  ls = ls.replace(/ə}}/,"}}");
 }
 if (erTilgung){
  feminin.wt = cropStr(feminin.wt,2);
  ls = ls.replace(/ɐ}}/,"}}");
 }

 if (ls.length == 0 || contains(ls,"…")){
  feminin.ls = "{{Lautschrift|…}}";
 } else {
  if (umlautung) {
   ls = UmlautungLS(ls,wfo,wfu);
   feminin.ls = lsPlusE(wfu,ls,"ɪn");
  } else {
   feminin.ls = lsPlusE(title,ls,"ɪn");
  }
  if (!contains(feminin.ls,"ˈ")) {
   feminin.ls = feminin.ls.replace(/schrift\|/g,"schrift|ˈ");
  }

  if (endsWith(title,"or")){
   feminin.ls = feminin.ls.replace(/\{\{Lautschrift\|/g,"{{Lautschrift?|");
  }
 }

 feminin.wt = wtPlusE(feminin.wt,"in")+", {{Pl.}} "+wtPlusE(feminin.wt,"in·nen");
 feminin.wt = feminin.wt.replace(/··/g,"·");

 function handleResponseIntern(data) {
  if (data.parse !== undefined && data.parse.links !== undefined) {
   handleResponseFem(feminin,data.parse.links);
  }
 }

 if (wf.length > 0) {
  var url = buildApi(wfn,"action=parse&prop=links&format=json&text=");
  $.get(url, handleResponseIntern);
 }
}


function createWortbildung(i2,i3,v,text,title,it) {

 var wobi = {};
 var wb;
 var eTilgung = false;

 var t = extractStr2(text,getTemplateParam(v,it,"0"),"\n=","");
 var wfwb = extractStr2(t,"{{Wortbildungen}}","\n{{","\n=");
 var wflist = "";

 var lautschr = getStructPP(extractStr2(t,":{{IPA}}",":{{Hörbeispiele}}","\n",'B'));
 var ls = buildPropNeu(lautschr,"Inf");

 if (ls.length == 0 || contains(ls,"…")){
  ls = "{{Lautschrift|…}}";
 }

 if (endsWith(title,"en")) {
  var wf = title.replace(/en$/,'');
  ls = ls.replace(/m̩\}\}/g, "}}");
  ls = ls.replace(/n̩\}\}/g, "}}");
  ls = ls.replace(/ŋ̍\}\}/g, "}}");
  ls = ls.replace(/ŋ̩\}\}/g, "}}");
  ls = ls.replace(/ən\}\}/g, "}}");
 } else {
  if (endsWith(title,"ln")) {
   var wf = title.replace(/n$/,'');
   ls = ls.replace(/n\}\}/g, "}}");
   }
  if (endsWith(title,"ern")) {
   var wf = title.replace(/n$/,'');
   ls = ls.replace(/n\}\}/g, "}}");
  }
 }
 ls = deleteDuplicateLS(ls);

 var wfu = toUpperFirst(wf);

 if (!contains(ls,"ˈ")) {
  ls = ls.replace(/schrift\|/g,"schrift|ˈ");
 }

 var lsweich = ls;
 var lshart  = auslautHartLoop(ls,"WB");

 var wbf = "";

 if (wfwb.indexOf("[[" + wfu + "ung]]") >= 0) {
  wbf = wfu + "ung";
 }

 if (wbf.length > 0) {
  var s = extractStr(t,"{{Bedeutungen}}","\n{{");
  var hk = "{{Herkunft}}\n:[[Ableitung]] des Substantivs vom Stamm des Verbs ''[[" + title + "]]'' mit dem [[Derivatem]] ([[Ableitungsmorphem]]) ''[[-ung]]''\n";

  wb = wortbildung(title,"de-Sub-Wb",i2,i3);
  wb.np = 'en'; wb.gp = 'en'; wb.dp = 'en'; wb.ap = 'en';
  wb.genus = 'f';

  wb.bed = extractStr(s,"{{Bedeutungen}}","\n{{",'B');

  s = extractStr(t,"\n{{Synonyme}}","\n{{",'R');
  wb.rest = hk + s;
 
  worttr = getWtStruct(extractStr(t,"{{Worttrennung}}","\n{{",'B'));

  wb.wt = copyTrenner(buildWtNeu(worttr,"Sg."),cropStr(wbf,3));

  wb.ls = lsweich.replace(/\}\}/g, "ʊŋ}}");

  wb.wt = toUpperFirst(wtPlusE(wb.wt,"ung")) + ", {{Pl.}} " + toUpperFirst(wtPlusE(wb.wt,"un·gen"));
  wb.wt = wb.wt.replace(/··/g,"·");

  wobi[wbf] = wb;
  wflist += "[[" + wbf + "]]";
 }
//---------

 wbf = "";
 if (wfwb.indexOf("[[" + wfu + "er]]") >= 0) {
  wbf = wfu + "er";
 }

 if (wbf.length > 0) {
  var s = extractStr(t,"{{Bedeutungen}}","\n{{");
  var hk = "{{Herkunft}}\n:[[Ableitung]] des Substantivs vom Stamm des Verbs ''[[" + title + "]]'' mit dem [[Derivatem]] ([[Ableitungsmorphem]]) ''[[-er]]''\n";

  wb = wortbildung(title,"de-Sub-Wb",i2,i3);
  wb.gs = 's'; wb.dp = 'n';
  wb.genus = 'm';

  wb.bed = extractStr(s,"{{Bedeutungen}}","\n{{",'B');

  s = extractStr(t,"\n{{Synonyme}}","\n{{",'R');
  wb.rest = hk + s;
 
  worttr = getWtStruct(extractStr(t,"{{Worttrennung}}","\n{{",'B'));

  wb.wt = copyTrenner(buildWtNeu(worttr,"Sg."),cropStr(wbf,2));

  wb.ls = lsweich.replace(/\}\}/g, "ɐ}}");

  wb.wt = toUpperFirst(wtPlusE(wb.wt,"er")) + ", {{Pl.}} " +
    toUpperFirst(wtPlusE(wb.wt,"er"));
  wb.wt = wb.wt.replace(/··/g,"·");
 
  wobi[wbf] = wb;
  wflist += "[[" + wbf + "]]";
 }
//---------

 wbf = "";
 if (wfwb.indexOf("[[" + wfu + "e]]") >= 0) {
  wbf = wfu + "e";
 }

 if (wbf.length > 0) {
  var s = extractStr(t,"{{Bedeutungen}}","\n{{");
  var hk = "{{Herkunft}}\n:[[Ableitung]] des Substantivs vom Stamm des Verbs ''[[" + title + "]]'' mit dem [[Derivatem]] ([[Ableitungsmorphem]]) ''[[-e]]''\n";

  wb = wortbildung(title,"de-Sub-Wb",i2,i3);
  wb.np = 'n'; wb.gp = 'n'; wb.dp = 'n'; wb.ap = 'n';
  wb.genus = 'f';

  wb.bed = extractStr(s,"{{Bedeutungen}}","\n{{",'B');

  s = extractStr(t,"\n{{Synonyme}}","\n{{",'R');
  wb.rest = hk + s;
 
  worttr = getWtStruct(extractStr(t,"{{Worttrennung}}","\n{{",'B'));

  wb.wt = copyTrenner(buildWtNeu(worttr,"Sg."),cropStr(wbf,1));

  wb.ls = lsweich.replace(/\}\}/g, "ə}}");

  wb.wt = toUpperFirst(wtPlusE(wb.wt,"er")) + ", {{Pl.}} " + toUpperFirst(wtPlusE(wb.wt,"er"));
  wb.wt = wb.wt.replace(/··/g,"·");

  wobi[wbf] = wb;
  wflist += "[[" + wbf + "]]";
 }
//---------
 var t = extractStr2(text,getTemplateParam(v,it,"0"),"\n=","");

 wbf = "";
 if (wfwb.indexOf("[[" + wf + "bar]]") >= 0) {
  wbf = wf + "bar";
 }

 if (wbf.length > 0) {

  var s = extractStr(t,"{{Bedeutungen}}","\n{{");
  var hk = "{{Herkunft}}\n:[[Ableitung]] des Adjektivs vom Stamm des Verbs ''[[" + title + "]]'' mit dem [[Derivatem]] ([[Ableitungsmorphem]]) ''[[-bar]]''\n";

  wb = wortbildung(title,"de-Adj-Wb",i2,i3);
  wb.komp = wbf + "er";
  wb.sup = wbf + "sten";

  wb.bed = extractStr(s,"{{Bedeutungen}}","\n{{",'B');

  s = extractStr(t,"\n{{Synonyme}}","\n{{",'R');
  wb.rest = hk + s;
 
  worttr = getWtStruct(extractStr(t,"{{Worttrennung}}","\n{{",'B'));
  lautschr = getStructPP(extractStr2(t,":{{IPA}}",":{{Hörbeispiele}}","\n",'B'));

  wb.wt = copyTrenner(buildWtNeu(worttr,"Sg."),cropStr(wbf,3));
  wb.wt = wtMinusT(wb.wt);

  wb.ls = lshart.replace(/\}\}/g, "baːɐ̯}}");

  wb.wt = wtPlusE(wb.wt,"·bar") + ", {{Komp.}} " + wtPlusE(wb.wt,"·ba·rer") +
     ", {{Sup.}} " + wtPlusE(wb.wt,"·bars·ten");
  wb.wt = wb.wt.replace(/··/g,"·");

  wobi[wbf] = wb;
  wflist += "[[" + wbf + "]]";
 }
//---------

 wbf = "";
 if (wfwb.indexOf("[[" + wf + "sam]]") >= 0) {
  wbf = wf + "sam";
 }

 if (wbf.length > 0) {

  var s = extractStr(t,"{{Bedeutungen}}","\n{{");
  var hk = "{{Herkunft}}\n:[[Ableitung]] des Adjektivs vom Stamm des Verbs ''[[" + title + "]]'' mit dem [[Derivatem]] ([[Ableitungsmorphem]]) ''[[-sam]''\n";

  wb = wortbildung(title,"de-Adj-Wb",i2,i3);
  wb.komp = wbf + "er";
  wb.sup = wbf + "sten";

  wb.bed = extractStr(s,"{{Bedeutungen}}","\n{{",'B');

  s = extractStr(t,"\n{{Synonyme}}","\n{{",'R');
  wb.rest = hk + s;
 
  worttr = getWtStruct(extractStr(t,"{{Worttrennung}}","\n{{",'B'));
  lautschr = getStructPP(extractStr2(t,":{{IPA}}",":{{Hörbeispiele}}","\n",'B'));

  wb.wt = copyTrenner(buildWtNeu(worttr,"Sg."),cropStr(wbf,3));
  wb.wt = wtMinusT(wb.wt);

  wb.ls = lshart.replace(/\}\}/g, "zaːm}}");

  wb.wt = wtPlusE(wb.wt,"·sam") + ", {{Komp.}} " + wtPlusE(wb.wt,"·sa·mer") +
     ", {{Sup.}} " + wtPlusE(wb.wt,"·sam·sten");
  wb.wt = wb.wt.replace(/··/g,"·");

  wobi[wbf] = wb;
  wflist += "[[" + wbf + "]]";
 }
//---------

 wbf = "";
 if (wfwb.indexOf("[[" + wf + "lich]]") >= 0) {
  wbf = wf + "lich";
 }

 if (wbf.length > 0) {

  var s = extractStr(t,"{{Bedeutungen}}","\n{{");
  var hk = "{{Herkunft}}\n:[[Ableitung]] des Adjektivs vom Stamm des Verbs ''[[" + title + "]]'' mit dem [[Derivatem]] ([[Ableitungsmorphem]]) ''[[-lich]]''\n";

  wb = wortbildung(title,"de-Adj-Wb",i2,i3);
  wb.komp = wbf + "er";
  wb.sup = wbf + "sten";

  wb.bed = extractStr(s,"{{Bedeutungen}}","\n{{",'B');

  s = extractStr(t,"\n{{Synonyme}}","\n{{",'R');
  wb.rest = hk + s;
 
  worttr = getWtStruct(extractStr(t,"{{Worttrennung}}","\n{{",'B'));
  lautschr = getStructPP(extractStr2(t,":{{IPA}}",":{{Hörbeispiele}}","\n",'B'));

  wb.wt = copyTrenner(buildWtNeu(worttr,"Sg."),cropStr(wbf,4));
  wb.wt = wtMinusT(wb.wt);

  wb.ls = lshart.replace(/\}\}/g, "lɪç}}");

  wb.wt = wtPlusE(wb.wt,"·lich") + ", {{Komp.}} " + wtPlusE(wb.wt,"·li·cher") +
     ", {{Sup.}} " + wtPlusE(wb.wt,"·lichs·ten");
  wb.wt = wb.wt.replace(/··/g,"·");

  wobi[wbf] = wb;
  wflist += "[[" + wbf + "]]";
 }


 function handleResponseIntern(data) {
  if (data.parse !== undefined && data.parse.links !== undefined) {
   handleResponseWB(wobi,data.parse.links);
  }
 }


 if (wflist.length > 0) {
  var url = buildApi(wflist,"action=parse&prop=links&format=json&text=");
  $.get(url, handleResponseIntern);
 }
}


function buildPropAdjNeu(r,typ,prop) {
 var p = '';
 if (typ == "ls") {
  p = ['…'];
 }
 if (typ == "hb") {
  p = 'Audio|';
 }

 var t = typ+prop+"neu";
 if (r[t] !== undefined) {
  if (r[t].val !== undefined) {
   if (typ == "ls") {
    p = forEachLs2(r[t].val,"replace","{{Lautschrift|",'');
    p = forEachLs2(p,"replace","}}",'');
   } else {
    return r[t].val[0].replace("{{Audio|","Audio|").replace("}}",'');
   }
  }
 }
 return p;
}


function forEachLs2(ls,func,p1,p2) {
 var a = [];
 for (var i=0; i<ls.length; i++) {
  if (func == "replace") { a.push(ls[i].replace(p1,p2))};
  if (func == "cropStr") { a.push(cropStr(ls[i],p1))};
  if (func == "concat")  { a.push(ls[i] + p1)};
 }
 return a;
}


function buildStructR(text,templatep) {
 var r = {wtlist:{}};
 var t = extractStr2(text,templatep,"\n=","");
 readStructPKS(r,"wt",extractStr(t,"{{Worttrennung}}","\n{{",'B'));
 readStructPKS(r,"ls",extractStr2(t,":{{IPA}}","\n:{{Hörbeispiele}}","\n",'B'));
 readStructPKS(r,"hb",extractStr2(t,":{{Hörbeispiele}}","\n:{{Reime}}","\n{{",'B'));
 readStructPKS(r,"re",extractStr2(t,":{{Reime}}","\n{{","\n",'B'));
 return r;
}


function createFlexionAdj(i2,i3,v,text,title,it) {

 var r = buildStructR(text,getTemplateParam(v,it,"0"));

 // Spezialfall für Adjektive ohne Steigerung: Worttrennung Paragraph 112 hinzufügen
 var wtSonderfall = getTemplateParam(v,it,"dataWTSonderfall");
 if (wtSonderfall == "P112") {
  var wt = buildPropAdjNeu(r,"wt","Pos");
  var eTilgChar = wt.charAt(wt.length - 1);
  var eTilgWt = cropStr(wt,2) + '·' + eTilgChar + "er";
  readStructPKS(r,"wt","{{Komp.}} " + eTilgWt + "\n", "\n","\n",'B');
  meldung("Parameter 'dataWTSonderfall=" + wtSonderfall + "' erkannt. Sonderfall Worttrennung!");
 }

 var pwt = buildPropAdjNeu(r,"wt","Pos");
 var kwt = buildPropAdjNeu(r,"wt","Komp");
 var swt = buildPropAdjNeu(r,"wt","Sup");

 var pls = buildPropAdjNeu(r,"ls","Pos");
 var kls = buildPropAdjNeu(r,"ls","Komp");
 var sls = buildPropAdjNeu(r,"ls","Sup");

 var khb = buildPropAdjNeu(r,"hb","Komp");
 var shb = buildPropAdjNeu(r,"hb","Sup");

 addFlexionAdjStern(i2,i3,v,it,"Superlativ",title,r.wtlist,sls,shb,"Superla",kls,khb,pls,'');

 var posi = getTemplateParam(v,it,"Positiv");
 if (posi === undefined) {
  posi = title;
 }
 if (endsWith(posi,"r")) {
  ; // pls = forEachLs2(pls,"replace",/([aɪɛɔœʊʏ])ʁ$/g,"$1ʀ");
 } else if (endsWith(posi,"e")) {
  posi = cropStr(posi,1);
  r.wtlist[posi] = pwt;
  if (!contains(pls[0],'…')) {
   pls = forEachLs2(pls,"cropStr",1);
  }
 } else if(endsWith(posi,"el")) {
  if (!endsWith(pls[0],"eːl")) {
   posi = cropStr(posi,2)+'l';
   if (endsWith(pls[0],"əl") || endsWith(pls[0],"l̩")) {
    pls = forEachLs2(pls,"cropStr",2);
    pls = forEachLs2(pls,"concat",'l');
   }else{
    if (!contains(pls[0],'…')) {
     pls = forEachLs2(pls,"cropStr",1);
    }
   }
   pwt = cropStr(pwt,2)+'·l';
   if (pwt.length > 3 && pwt[pwt.length-4] == '·') {
    pwt = cropStr(pwt,4)+pwt.substr(pwt.length-3);
   }
   r.wtlist[posi] = pwt;
  }
 }

 addFlexionAdjStern(i2,i3,v,it,"Komparativ",title,r.wtlist,kls,khb,"Kompara",kls,khb,pls,'');

 var komp = getTemplateParam(v,it,"Komparativ");
 var vorlage = "-Komp";
 if (posi + "er" != komp && posi + "r" != komp && cropStr(posi,2) + "ler" != komp){
  kls = ['…'];
  vorlage = '';
 }
 addFlexionAdjPositiv(i2,i3,posi,title,r.wtlist,pls,'',"Posi",kls,khb,pls,vorlage);

}


// Worttrennung laut Meinungsbild vom 27.10.2015
function buildWtNeu(o,p) {
 var wt='';

 if(o.hasOwnProperty("neu")){
  if(o.neu.hasOwnProperty(p)){
   wt=o.neu[p];
  }
 }
 return wt;
}


// Worttrennung vor dem Meinungsbild vom 27.10.2015
function buildWtAltNeu(o,p) {
 var wt='';
 if(o.hasOwnProperty("alt")){
  if(o.alt.hasOwnProperty(p)){
   wt="\n:''Alte Rechtschreibung:'' "+o.alt[p];
  }
 }
 if(o.hasOwnProperty("neu")){
  if(o.neu.hasOwnProperty(p)){
   if(o.hasOwnProperty("alt") && (o.alt[p] != o.neu[p])){
    wt="''Neue Rechtschreibung:'' "+o.neu[p]+wt;
   }else{
    wt=o.neu[p];
   }
  }
 }
 return wt;
}


function buildPropNeu(o,p) {
 if(o.hasOwnProperty("neu")){
  if(o.neu.hasOwnProperty(p)){
   return o.neu[p];
  }
 }
 return '';
}


function createFlexionSub(i2,i3,v,text,title,it) {

 title = title.replace(/_/g,' ');
 var thisTemplate = getTemplateParam(v,it,"0");
 var t = extractStr2(text,thisTemplate,"\n=","");
 worttr = getWtStruct(extractStr(t,"{{Worttrennung}}","\n{{",'B'));
 lautschr = getSgPlStruct(extractStr(t,":{{IPA}}","\n",'B'));
 var hbs = getSgPlStruct(extractStr(t,":{{Hörbeispiele}}","\n",'B'));

 var ht = " des Substantivs '''[["+title+"]]'''";
 var p1 = [""," 1"," 2"," 3"," 4"];
 var p2 = ["","1","2","3","4"];
 var kasus = ["Genitiv","Dativ","Akkusativ","Instrumental","Präpositiv","Lokativ","Vokativ"];
 var num = ["Singular","Dual","Plural"];
 var wt = '';
 var ls = '';
 var hb = '';
 var flForm = '';

 if (contains(thisTemplate,"Deutsch Toponym")
 && getTemplateParam(v,it,"Genitiv Singular") === undefined) {
  flForm = title + 's';
  flForm = flForm.replace(/([sxzß])s$/,'$1’');
  addFlexionSub(i2,i3,v,it,title,wt,ls,hb,"Genitiv Singular",ht,[flForm]);
 }
 
 if (contains(thisTemplate,"Deutsch Substantiv Übersicht -sch")
     && getTemplateParam(v,it,"Genitiv Singular") === undefined) {
  flForm = title + 's';
  addFlexionSub(i2,i3,v,it,title,wt,ls,hb,"Genitiv Singular",ht,[flForm]);
  flForm = title + 'e';
  addFlexionSub(i2,i3,v,it,title,wt,ls,hb,"Nominativ Singular",ht,[flForm]);
  addFlexionSub(i2,i3,v,it,title,wt,ls,hb,"Akkusativ Singular",ht,[flForm]);
  flForm = title + 'en';
  addFlexionSub(i2,i3,v,it,title,wt,ls,hb,"Genitiv Singular",ht,[flForm]);
  addFlexionSub(i2,i3,v,it,title,wt,ls,hb,"Dativ Singular",ht,[flForm]);
 }
 
 if (contains(thisTemplate,"Deutsch Nachname Übersicht")) {
  flForm = title + 's';
  flForm = flForm.replace(/([sxzß])s$/,'$1’');
  if (getTemplateParam(v,it,"Zischlaut") !== undefined || flForm != title + 's') {
   addFlexionSub(i2,i3,v,it,title,wt,ls,hb,"Genitiv Singular",ht,[flForm]);
   addFlexionSub(i2,i3,v,it,title,wt,ls,hb,"Nominativ Plural",ht,[title]);
   addFlexionSub(i2,i3,v,it,title,wt,ls,hb,"Genitiv Plural",ht,[title]);
   addFlexionSub(i2,i3,v,it,title,wt,ls,hb,"Dativ Plural",ht,[title]);
   addFlexionSub(i2,i3,v,it,title,wt,ls,hb,"Akkusativ Plural",ht,[title]);
   if (getTemplateParam(v,it,"Kein-ens") === undefined) {
    addFlexionSub(i2,i3,v,it,title,wt,ls,hb,"Nominativ Plural",ht,[title + 'ens']);
    addFlexionSub(i2,i3,v,it,title,wt,ls,hb,"Genitiv Plural",ht,[title + 'ens']);
    addFlexionSub(i2,i3,v,it,title,wt,ls,hb,"Dativ Plural",ht,[title + 'ens']);
    addFlexionSub(i2,i3,v,it,title,wt,ls,hb,"Akkusativ Plural",ht,[title + 'ens']);
   }
  } else {
   addFlexionSub(i2,i3,v,it,title,wt,ls,hb,"Genitiv Singular",ht,[title + 's']);
   addFlexionSub(i2,i3,v,it,title,wt,ls,hb,"Nominativ Plural",ht,[title + 's']);
   addFlexionSub(i2,i3,v,it,title,wt,ls,hb,"Genitiv Plural",ht,[title + 's']);
   addFlexionSub(i2,i3,v,it,title,wt,ls,hb,"Dativ Plural",ht,[title + 's']);
   addFlexionSub(i2,i3,v,it,title,wt,ls,hb,"Akkusativ Plural",ht,[title + 's']);
  }
  if (endsWith(title,"e") || endsWith(title,"el") || endsWith(title,"en") || endsWith(title,"er")) {
   addFlexionSub(i2,i3,v,it,title,wt,ls,hb,"Nominativ Plural",ht,[title]);
   addFlexionSub(i2,i3,v,it,title,wt,ls,hb,"Genitiv Plural",ht,[title]);
   addFlexionSub(i2,i3,v,it,title,wt,ls,hb,"Dativ Plural",ht,[title]);
   addFlexionSub(i2,i3,v,it,title,wt,ls,hb,"Akkusativ Plural",ht,[title]);
  }
  return;
 }

 for (var p=0; p<p1.length; p++) {

  wt = buildWtNeu(worttr,"Du."+p2[p]);
  ls = buildPropNeu(lautschr,"Du."+p2[p]);
  hb = buildPropNeu(hbs,"Du."+p2[p]);

  addFlexionSubStern(i2,i3,v,it,"Nominativ Dual"+p1[p],title,wt,ls,hb,"Nominativ Dual",ht);

  wt = buildWtNeu(worttr,"Pl."+p2[p]);
  ls = buildPropNeu(lautschr,"Pl."+p2[p]);
  hb = buildPropNeu(hbs,"Pl."+p2[p]);

  addFlexionSubStern(i2,i3,v,it,"Nominativ Plural"+p1[p],title,wt,ls,hb,"Nominativ Plural",ht);
  addFlexionSubStern(i2,i3,v,it,"Plural"+p1[p],title,wt,ls,hb,"Plural",ht);

  for (var k=0; k<kasus.length; k++) {
   for (var n=0; n<num.length; n++) {
    addFlexionSubStern(i2,i3,v,it,kasus[k]+" "+num[n]+p1[p],title,'','','',kasus[k]+" "+num[n],ht);
   }
  }

 }

}


function lsReplaceLoop(ls,vorher,nachher) {
  var ret = '';
  for (var i = 0; i < ls.length; i++) {
    if (ret.length > 0) ret += ", ";
    ret += "{{Lautschrift|" + ls[i].replace(vorher,nachher) + "}}";
  }
  return ret;
}


function createFlexionSubAD(i2,i3,v,text,title,it,genus) {

 var r = buildStructR(text,getTemplateParam(v,it,"0"));

 var pwt = buildPropAdjNeu(r,"wt","Pos");
 var pls = buildPropAdjNeu(r,"ls","Pos");

 var title1 = cropStr(title,1);
 var title2 = cropStr(title,2);
 var pwt1 = cropStr(pwt,1);

 var ht = " Deklination des Substantivs '''[["+title+"]]'''";
 var htsta = " der starken" + ht;
 var htsch = " der schwachen" + ht;
 var htgem = " der gemischten" + ht;
 var sg = getTemplateParam(v,it,"kein Singular") === undefined;
 var pl = getTemplateParam(v,it,"kein Plural") === undefined;

 switch (genus) {
  case 'm':
   var pwte = pwt1.replace(/·e$/,"e");
   var pwtm = wtPlusE(pwt1,'m');
   var pwtn = wtPlusE(pwt1,'n');

   var pls1 = lsReplaceLoop(pls,/ɐ$/,'');
   var plse = lsPlusE(title2,pls1,"ə");
   var plsm = lsPlusE(title2+'e',plse,"m");
   plsm = anpassenLsEm(title2+"em",plsm);
   var plsn = lsPlusE(title2+'e',plse,"n");
   plsn = anpassenLsEn(title2+"en",plsn);
   plsn = cleanupLs(plsn,pwtn);

   if (sg) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Genitiv Singular",htsta,[title1+'n']);
   if (sg) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Akkusativ Singular",htsta,[title1+'n']);
   if (pl) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Dativ Plural",htsta,[title1+'n']);

   if (sg) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Genitiv Singular",htsch,[title1+'n']);
   if (sg) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Dativ Singular",htsch,[title1+'n']);
   if (sg) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Akkusativ Singular",htsch,[title1+'n']);
   if (pl) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Alle Kasus Plural",htsch,[title1+'n']);

   if (sg) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Genitiv Singular",htgem,[title1+'n']);
   if (sg) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Dativ Singular",htgem,[title1+'n']);
   if (sg) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Akkusativ Singular",htgem,[title1+'n']);
   if (pl) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Alle Kasus Plural",htgem,[title1+'n']);

   if (sg) addFlexionSub(i2,i3,v,it,title,pwtm,plsm,'',"Dativ Singular",htsta,[title1+'m']);

   if (pl) addFlexionSub(i2,i3,v,it,title,pwte,plse,'',"Nominativ Plural",htsta,[title1]);
   if (pl) addFlexionSub(i2,i3,v,it,title,pwte,plse,'',"Akkusativ Plural",htsta,[title1]);
   if (sg) addFlexionSub(i2,i3,v,it,title,pwte,plse,'',"Nominativ Singular",htsch,[title1]);
   break;

  case 'f':
   var pwtn = wtPlusE(pwt,'n');
   var pwtr = wtPlusE(pwt,'r');

   var pls1 = lsReplaceLoop(pls,/ə$/,'');
   var plse = lsPlusE(title1,pls1,"ə");
   var plsr = lsPlusE(title1,pls1,"ɐ");
   var plsn = lsPlusE(title1+'e',plse,"n");
   plsn = anpassenLsEn(title1+"en",plsn);
   plsn = cleanupLs(plsn,pwtn);

   if (pl) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Dativ Plural",htsta,[title+'n']);

   if (sg) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Genitiv Singular",htsch,[title+'n']);
   if (sg) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Dativ Singular",htsch,[title+'n']);
   if (pl) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Alle Kasus Plural",htsch,[title+'n']);

   if (sg) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Genitiv Singular",htgem,[title+'n']);
   if (sg) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Dativ Singular",htgem,[title+'n']);
   if (pl) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Alle Kasus Plural",htgem,[title+'n']);

   if (sg) addFlexionSub(i2,i3,v,it,title,pwtr,plsr,'',"Genitiv Singular",htsta,[title+'r']);
   if (sg) addFlexionSub(i2,i3,v,it,title,pwtr,plsr,'',"Dativ Singular",htsta,[title+'r']);
   if (pl) addFlexionSub(i2,i3,v,it,title,pwtr,plsr,'',"Genitiv Plural",htsta,[title+'r']);

   break;

  case 'n':
   var pwte = pwt1.replace(/·e$/,"e");
   var pwtm = wtPlusE(pwt1,'m');
   var pwtn = wtPlusE(pwt1,'n');
   var pwtr = wtPlusE(pwt1,'r');

   var pls1 = lsReplaceLoop(pls,/əs$/,'');
   var plse = lsPlusE(title2,pls1,"ə");
   var plsm = lsPlusE(title2+'e',plse,"m");
   plsm = anpassenLsEm(title2+"em",plsm);
   var plsn = lsPlusE(title2+'e',plse,"n");
   plsn = anpassenLsEn(title2+"en",plsn);
   plsn = cleanupLs(plsn,pwtn);

   if (sg) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Genitiv Singular",htsta,[title1+'n']);
   if (pl) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Dativ Plural",htsta,[title1+'n']);

   if (sg) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Genitiv Singular",htsch,[title1+'n']);
   if (sg) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Dativ Singular",htsch,[title1+'n']);
   if (pl) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Alle Kasus Plural",htsch,[title1+'n']);

   if (sg) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Genitiv Singular",htgem,[title1+'n']);
   if (sg) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Dativ Singular",htgem,[title1+'n']);
   if (pl) addFlexionSub(i2,i3,v,it,title,pwtn,plsn,'',"Alle Kasus Plural",htgem,[title1+'n']);

   if (sg) addFlexionSub(i2,i3,v,it,title,pwtm,plsm,'',"Dativ Singular",htsta,[title1+'m']);

   if (pl) addFlexionSub(i2,i3,v,it,title,pwtr,plsr,'',"Genitiv Plural",htsta,[title1+'r']);

   if (pl) addFlexionSub(i2,i3,v,it,title,pwte,plse,'',"Nominativ Plural",htsta,[title1]);
   if (pl) addFlexionSub(i2,i3,v,it,title,pwte,plse,'',"Akkusativ Plural",htsta,[title1]);
   if (sg) addFlexionSub(i2,i3,v,it,title,pwte,plse,'',"Nominativ Singular",htsch,[title1]);
   if (sg) addFlexionSub(i2,i3,v,it,title,pwte,plse,'',"Akkusativ Singular",htsch,[title1]);
   break;
 }
}


function createFlexionVerb(idx,v,text,title,it) {

 var t, p1wt = '';
 var p2wt = '';
 var p1ls = '';
 var p2ls = '';
 var p1hb = '';
 var p2hb = '';
 var p1reim = '';
 title = title.replace(/_/g,' ');
 var wtSonderfall = getTemplateParam(v,it,"dataWTSonderfall");
 if (wtSonderfall !== undefined) {
  meldung("Parameter 'dataWTSonderfall=" + wtSonderfall + "' erkannt. Sonderfall Worttrennung!");
 }
 var ii = getTemplate2(v,"Worttrennung",it);

 var wt = $.trim(extractStr(text,"{{Worttrennung}}","\n{{",'L'));

 p1wt = buildWtNeu(getWtAll(wt),"First").replace(/\n/g,"d\n")+'d';

 t = extractStr2(text,getTemplateParam(v,it,"0"),"\n=","");

 worttr = getStructPP(extractStr(t,"{{Worttrennung}}","\n{{",'B'));
 addwts(worttr,"Sonderfall",false,wtSonderfall);
 lautschr = getStructPP(extractStr2(t,":{{IPA}}",":{{Hörbeispiele}}","\n",'B'));
 hoerbsp = getStructPP(extractStr2(t,":{{Hörbeispiele}}","\n:{{Reime}}","\n{{",'B'));
 reime = getStructPP(extractStr2(t,":{{Reime}}","\n{{","\n",'B'));

 sections[idx.i2].child[idx.i3].worttr = worttr;
 sections[idx.i2].child[idx.i3].lautschr = lautschr;
 sections[idx.i2].child[idx.i3].hoerbsp = hoerbsp;
 sections[idx.i2].child[idx.i3].reime = reime;

 p1ls = buildPropNeu(lautschr,"Inf");
 if (!isEmptyLs(p1ls)) {
  p1ls = p1ls.replace(/(ɱ̍\}\}|ɱ̩\}\}|m̩\}\})/g,"n̩}}");
  p1ls = p1ls.replace(/\}\}/g,"t}}");
 }
 p2wt = buildPropNeu(worttr,"Part");
 p2ls = buildPropNeu(lautschr,"Part");
 p2hb = buildPropNeu(hoerbsp,"Part");
 p1reim = buildPropNeu(reime,"Inf");
 if (p1reim.length > 0) {
  if (contains(p1reim,"|Deutsch")){
    p1reim = p1reim.replace(/(ŋ̍\|D|ŋ̩\|D|ɱ̍\|D|ɱ̩\|D|m̩\|D)/g,"n̩|D");
    p1reim = p1reim.replace(/\|Deutsch/g,"t|Deutsch");
  }else{
    p1reim = p1reim.replace(/(ŋ̍\}\}|ŋ̩\}\}|ɱ̍\}\}|ɱ̩\}\}|m̩\}\})/g,"n̩}}");
    p1reim = p1reim.replace(/\}\}/g,"t}}");
  }
 }

 var posi = title.replace(/_/g,' ')+'d';
 addFlexionVerb(idx,2,"Deutsch",posi,title,p1wt,p1ls,p1hb,"Partizip Präsens",p1reim);
 addFlexionPartizipStern(idx,2,"Deutsch",v,it,"Partizip II",title,p2wt,p2ls,p2hb,"Partizip Perfekt");

 $.get(buildUrl2("Flexion:"+title,''), handleResponseKonjugation);
}


function addFlexionPartizipStern(idx,pass,spr,v,it,p,title,wt,ls,hb,gm) {
 var param = getTemplateParamStern(v,it,p,3);
 if (param == undefined) return;
 param = param.replace(/<[^>]*>/g,',');

 addFlexionVerb(idx,pass,spr,param,title,wt,ls,hb,gm);
}


function setPositivPass(idx, pass, linkgrp, erwInfinitiv) {
 var f3 = sections[idx.i2].child[idx.i3].flexion;
 for (var i in f3) {
  if (f3[i].hasOwnProperty("form") && (f3[i].form == "Posi" || f3[i].form == "Gerundivum")) {
   if (!f3[i].hasOwnProperty("linkgrp")|| f3[i].linkgrp == "posform") {
    f3[i].linkgrp = linkgrp;
   }
   if (f3[i].form == "Gerundivum") {
    f3[i].flexion = erwInfinitiv;
   }
   if (f3[i].hasOwnProperty("pass") && f3[i].pass != 1) {
    f3[i].pass = pass;
   }
   if (f3[i].pass != 1) {
    if (f3[i].hasOwnProperty("ls")) {
     f3[i].ls = '';
    }
   }
  }
 }
}


function getFormenVerb(p) {
 p = p.replace(/<[^>]*>|\n/g,' ');
 p = p.replace(/(\[|&#91;)\d*(\]|&#93;)/g,' ');
 p = p.replace(/\bungebräuchlich:/g,' ');
 p = p.replace(/\bmich\b|\bdich\b|\bsich\b|\buns\b|\beuch\b|\bmir\b|\bdir\b/g,'');
 p = p.replace(/\bich\b|\bdu\b|\bes\b|\ber\/sie\/es\b|\bwir\b|\bihr\b|\bsie\b/g,'');
 p = p.replace(/\bveraltet:/g,'VA:');
 p = p.replace(/  /g,' ');
 var nameList = p.split(/!|,/g);
 
 var formen = [];
 var i = 0;
 var j = 0;
 for (i = 0; i < nameList.length; i++) {
  nameList[i] = $.trim(nameList[i]);
  if (nameList[i].length > 2) {
   if (!contains(nameList[i],'(') && !contains(nameList[i],')') && !contains(nameList[i],'VA:')) {
    formen.push(nameList[i]);
   }
  }
 }

 return formen;
}


function addFlexionVerb(idx,pass,spr,param,title,wt,ls,hb,gm,reim) {

  var i=0;
  var j=0; 
  var formen = getFormenVerb(param);
  title = title.replace(/_/g,' ');

  var f3 = sections[idx.i2].child[idx.i3].flexion;

  for (i=0;i<formen.length;i++) {
    if (formen[i] != title) {
 
     if (f3[formen[i]] === undefined) {
      f3[formen[i]] = new flex(title,"de-Verb",idx.i2,idx.i3,pass);
     }
     var verb = formen[i];
     var fi = f3[verb];

     for (j = 0; j < formen.length; j++) {
      if(formen[i] != formen[j]) {
       if (contains(gm,"Partizip Perfekt")) {

        if(typeof fi.nfp[formen[j]] === "undefined"){
         fi.nfp[formen[j]] = [];
        }
        if($.inArray(gm,fi.nfp[formen[j]]) == -1){
         fi.nfp[formen[j]].push(gm);
        }

       }else{

        if(typeof fi.nf[formen[j]] === "undefined"){
         fi.nf[formen[j]] = [];
        }
        if($.inArray(gm,fi.nf[formen[j]]) == -1){
         fi.nf[formen[j]].push(gm);
        }

       }
      }
     }

     if (contains(gm,"Partizip Perfekt")) {
      var r = {wtlist:{}};
      addWtlist(r,wt);
      var wtt = r.wtlist[verb];
      if (wtt && fi.wt.length < wtt.length){
       fi.wt = wtt;
      }
     }

     if (contains(gm,"1. Person Singular Indikativ Präteritum Aktiv")
        && !contains(gm,"Nebensatzkonjugation")){
      var t = buildPropNeu(sections[idx.i2].child[idx.i3].worttr,"Prät");
      var r = {wtlist:{}};
      addWtlist(r,t);
      var wtt = r.wtlist[verb];
      if (wtt && fi.wt.length < wtt.length){
       fi.wt = wtt;
      }
      t = buildPropNeu(sections[idx.i2].child[idx.i3].lautschr,"Prät");
      if (fi.ls.length < t.length){
       fi.ls=t;
      }
      t = buildPropNeu(sections[idx.i2].child[idx.i3].hoerbsp,"Prät");
      if (fi.hb.length < t.length){
       fi.hb=t;
      }
     }

     if (fi.wt.length == 0){
      fi.wt = wt;
     }
     if (fi.ls.length < ls.length){
      fi.ls = ls;
     }
     if (fi.hb.length < hb.length){
      fi.hb = hb;
     }
     fi.sp = spr;
     var g = "*"+gm+" des Verbs '''[["+thispage.replace(/_/g,' ')+"]]'''";
     if($.inArray(g,fi.gm) == -1){
      fi.gm.push(g);
     }
 
    }
  }
}


function wtPlusE(wt,e){
 if (wt.length == 0 || e.length == 0) {return wt;}
 var a = wt.split("\n");
 var i;
 for (i = 0; i < a.length; i++) {
  if (startsWith(e,'·s') || startsWith(e,'·t')) {
    a[i] = wtParagraph112(a[i]);
  } else if (!startsWith(e,'·')) {
   if (e == 'n' || e == 's' || e == 'st' || e == 't') {
    if (a[i].search(/Aue$|aue$|äue$|aie$|eie$|eue$/g) >= 0) {
     a[i] = insertStr(a[i],-1,'·');
    }
   } else if(endsWith(a[i],"sch")) {
    a[i] = insertTrenner(a[i],-3);
   } else if (a[i].search(/ch$|ck$|ph$|sh$|rh$|th$/g) >= 0) {
    a[i] = insertTrenner(a[i],-2);
   } else if (a[i].search(/[aeiouäöüyAEIOUÄÖÜY]$/g) < 0) {
    a[i] = insertTrenner(a[i],-1);
   } else if (e.length > 1) {
    a[i] += '·';
   }
  }
  a[i] = cleanupWt(a[i] + e);
 }
 return a.join("\n");
}


// Entferne Trennsymbol vor Konsonantenkette
function wtMinusT(wt){
 if (wt.length == 0) {return wt;}
 var i = wt.length - 1;
 while (i > 0) {
  if (wt[i].search(/[·aeiouäöüyAEIOUÄÖÜY]$/g) < 0) {
   i--;
  } else {
   if (wt[i] == '·') {
    return removeStr(wt,i,1);
   } else {
    return wt;
   }
  }
 }
 return wt;
}


/* Ausnahmenliste für Wörter mit einzelnem Anfangsvokal
** Adjektive: öd
** Verben:  uzen, äsen, ölen, ösen, üben, an·ecken, aschen
** Substantive: (werden aus Pluralform gebildet)
*/
function insertTrenner(wt,n){
 if (endsWith(wt,'·öd')
    || endsWith(wt,'·uz') || endsWith(wt,'·äs') || endsWith(wt,'·öl')
    || endsWith(wt,'·ös') || endsWith(wt,'·üb')
    || endsWith(wt,'·eck') || endsWith(wt,'·asch') ) {
  return wt;
 }
 return insertStr(wt,n,'·');
}


function lsPlusE(t,ls,e,wa) {
 var a = ls.split("}}");
 var i;
 for (i = 0; i < a.length; i++) {
  if (a[i].search(/\{\{\s*Lautschrift\s*\|/) != -1) {
   a[i] = prepareLautschrift(t,a[i],e,wa);
  }
 }
 return a.join("}}");
}


function getTemplateParam1(v,it,title,kasusnum) {
 var param = getTemplateParam(v,it,kasusnum);
 if (param == undefined) {
  param = getTemplateParam(v,it,kasusnum + " 1");
 }
 if (param == undefined) param = title;
 var re = /\s+|<[^>]*>|{{[^}]*}}|\bder |\bdie |\bdas |\bdes |\bdem |\bden |\bthe /g;
 var nameList = param.split(re);
 if (nameList.length == 1) {
  return nameList[0].replace(/_/g,' ');
 }
 return nameList[1].replace(/_/g,' ');

}


function createFlexionWtLsSub(i2,i3,v,title,it) {

 var NomSg = getTemplateParam1(v,it,title,"Nominativ Singular");
 var NomPl = getTemplateParam1(v,it,title,"Nominativ Plural");
 var NomSgOhneUml = ohneUmlaute(NomSg);
 var iOhneUml = '';

 var wts = buildWtNeu(worttr,"Sg.");
 var wtpl = buildWtNeu(worttr,"Pl.");
 var lss = buildPropNeu(lautschr,"Sg.");

 var f3 = sections[i2].child[i3].flexion;

 for (var i in f3) {
  var fi = f3[i];
  iOhneUml = ohneUmlaute(i);

// wg. Dreieck, Erdöl, usw. keine Abtrennung Einzelvokal
  if (i == NomPl + 'es'){
   if (fi.wt.length == 0){
    fi.wt = wtPlusE(wtpl,'s');
   }
  }

  if (i == NomPl + 'en'){
   if (fi.wt.length == 0){
    fi.wt = wtPlusE(wtpl,'n');
   }
  }


  if (i == NomSg+'’'){
   if (fi.wt.length==0){
    fi.wt=wtPlusE(wts,'')+'’';
   }
   if (fi.ls.length==0){
    fi.ls=lsPlusE(NomSg,lss,"");
   }
  }

  if (iOhneUml == NomSgOhneUml){
   if (fi.wt.length==0){
    fi.wt=wts;
   }
   if (fi.ls.length==0){
    fi.ls=UmlautungLS(lss,iOhneUml,i);
   }
  }

  if (i == NomSg+'e'){
   if (fi.wt.length==0){
    fi.wt=wtPlusE(wts,'e');
   }
   if (fi.ls.length==0){
    fi.ls=lsPlusE(NomSg,lss,"ə");
   }
  }

  if (iOhneUml == NomSgOhneUml+'e'){
   if (fi.wt.length==0){
    fi.wt=wtPlusE(wts,'e');
   }
   if (fi.ls.length==0){
    fi.ls=lsPlusE(NomSg,lss,"ə");
    fi.ls=UmlautungLS(fi.ls,iOhneUml,i);
   }
  }

  if (i == NomSg+'en'){
   if (fi.wt.length==0){
    fi.wt=wtPlusE(wts,'e');
    fi.wt=wtPlusE(fi.wt,'n');
   }
   if (fi.ls.length==0){
    fi.ls=lsPlusE(NomSg,lss,"ə");
    fi.ls=lsPlusE(NomSg+'e',fi.ls,"n");
    fi.ls=anpassenLsEn(i,fi.ls);
   }
  }

  if (iOhneUml == NomSgOhneUml+'en'){
// Worttrennung in Schlussschleife
//   if (fi.wt.length==0){
//    fi.wt=wtPlusE(wts,'e');
//    fi.wt=fi.wt.replace(/\n/g,"n\n")+'n';
//   }
   if (fi.ls.length==0){
    fi.ls=lsPlusE(NomSg,lss,"ə");
    fi.ls=lsPlusE(NomSg+'e',fi.ls,"n");
    fi.ls=anpassenLsEn(i,fi.ls);
    fi.ls=UmlautungLS(fi.ls,iOhneUml,i);
   }
  }

  if (i == NomSg+'er'){
   if (fi.wt.length==0){
    fi.wt=wtPlusE(wts,'er');
   }
   if (fi.ls.length==0){
    fi.ls=lsPlusE(NomSg,lss,"ɐ");
   }
  }

  if (iOhneUml == NomSgOhneUml+'er'){
   if (fi.wt.length==0){
    fi.wt=wtPlusE(wts,'er');
   }
   if (fi.ls.length==0){
    fi.ls=lsPlusE(NomSg,lss,"ɐ");
    fi.ls=UmlautungLS(fi.ls,iOhneUml,i);
   }
  }

  if (i == NomSg+'es'){
   if (fi.wt.length==0){
    fi.wt=wtPlusE(wts,'es');
   }
   if (fi.ls.length==0){
    fi.ls=lsPlusE(NomSg,lss,"əs");
   }
  }

  if (iOhneUml == NomSgOhneUml+'es'){
   if (fi.wt.length==0){
    fi.wt=wtPlusE(wts,'es');
   }
   if (fi.ls.length==0){
    fi.ls=lsPlusE(NomSg,lss,"əs");
    fi.ls=UmlautungLS(fi.ls,iOhneUml,i);
   }
  }
  
  if (i == NomSg+'ens'){
   if (fi.wt.length==0){
    fi.wt=wtPlusE(wts,'ens');
   }
   if (fi.ls.length==0){
    fi.ls=lsPlusE(NomSg,lss,"əns");
   }
  }
  
  if (i == NomSg+'s'){
   if (fi.wt.length==0){
    fi.wt=wtPlusE(wts,'s');
   }
   if (fi.ls.length==0){
    fi.ls=lsPlusE(NomSg,lss,"s");
   }
  }

  if (iOhneUml == NomSgOhneUml+'s'){
   if (fi.wt.length==0){
    fi.wt=wtPlusE(wts,'s');
   }
   if (fi.ls.length==0){
    fi.ls=lsPlusE(NomSg,lss,"s");
    fi.ls=UmlautungLS(fi.ls,iOhneUml,i);
   }
  }

  if (i == NomSg+'se'){
   if (fi.wt.length==0){
    fi.wt=wtPlusE(wts,'·se');
   }
   if (fi.ls.length==0){
    fi.ls=lsPlusE(NomSg,lss,"sə");
   }
  }

  if (iOhneUml == NomSgOhneUml+'se'){
   if (fi.wt.length==0){
    fi.wt=wtPlusE(wts,'·se');
   }
   if (fi.ls.length==0){
    fi.ls=lsPlusE(NomSg,lss,"sə");
    fi.ls=UmlautungLS(fi.ls,iOhneUml,i);
   }
  }

  if (i == NomSg+'ses'){
   if (fi.wt.length==0){
    fi.wt=wtPlusE(wts,'·ses');
   }
   if (fi.ls.length==0){
    fi.ls=lsPlusE(NomSg,lss,"səs");
   }
  }

  if (i == NomSg+'n'){
   if (fi.wt.length==0){
    fi.wt=wts.replace(/\n/g,"n\n")+'n';
   }
   if (fi.ls.length==0){
    fi.ls=lsPlusE(NomSg,lss,"n");
    if (endsWith(i,"en")){
     fi.ls=anpassenLsEn(i,fi.ls);
    }
   }
  }

  if (iOhneUml == NomSgOhneUml+'n'){
//   if (fi.wt.length==0){
//    fi.wt=wts.replace(/\n/g,"n\n")+'n';
//   }
   if (fi.ls.length==0){
    fi.ls=lsPlusE(NomSg,lss,"n");
    if (endsWith(i,"en")){
     fi.ls=anpassenLsEn(i,fi.ls);
    }
    fi.ls=UmlautungLS(fi.ls,iOhneUml,i);
   }
  }

  if (i == NomSg+'nen'){
   if (fi.wt.length==0){
    fi.wt=wts.replace(/\n/g,"·nen\n")+'·nen';
   }
   if (fi.ls.length==0){
    fi.ls=lsPlusE(NomSg,lss,"nən");
   }
  }

  if (iOhneUml == NomSgOhneUml+'nen'){
   if (fi.wt.length==0){
    fi.wt=wts.replace(/\n/g,"·nen\n")+'·nen';
   }
   if (fi.ls.length==0){
    fi.ls=lsPlusE(NomSg,lss,"nən");
    fi.ls=UmlautungLS(fi.ls,iOhneUml,i);
   }
  }

  if (i==NomSg+'ns'){
   if (fi.wt.length==0){
    fi.wt=wts.replace(/\n/g,"ns\n")+'ns';
   }
   if (fi.ls.length==0){
    fi.ls=lsPlusE(NomSg,lss,"n");
    if (endsWith(NomSg,"e")){
     fi.ls=anpassenLsEn(NomSg+'n',fi.ls);
    }
    fi.ls=lsPlusE(NomSg+'n',fi.ls,"s");
   }
  }

  for (var j in f3) {
   if (i==j+'n'){
    if (fi.wt.length==0){
     fi.wt=wtPlusE(f3[j].wt,'n');
    }
    if (fi.ls.length==0){
     fi.ls=f3[j].ls.replace(/([^….])\}\}/g,"$1n}}");
     if (endsWith(i,"en")){
      fi.ls=anpassenLsEn(i,fi.ls);
     }
    }
   }
  }

  if (contains(fi.wt,'·') && !contains(fi.ls,'ˈ') && !contains(fi.ls,'…')) {
   fi.ls = fi.ls.replace(/Lautschrift\|/g,"Lautschrift|ˈ");
  }

  fi.ls = cleanupLs(fi.ls,fi.wt);

 } // end - for (var i in f3)

}


function doLautschrift(title, ls) {
 var r = {p:0,g:"",pfx:"",err:""};
 r.err = checkLSDeutsch(ls);

 if (r.err.length == 0) {
  r = checkPhonemGraphem(title, ls);
 }

 return r;
}


function checkLSDeutsch(ls) {
 var s2 = "";
 var ipa = " aeiouybdfhjklmnpstvzx"  + // ɡ ˈ ˌ ̍  ̩  ̯ 
      "əɛɪɔøœʊʏɱŋʀʁɐʒʃʧʦçχ\u0261\u02c8\u02cc\u030d\u0325\u0329\u032f\u0361ˑːʔ";
 var found = false; // Fehler gefunden?
 if (ls == "…" || ls == "...") {return '';}
 for (var i = 0; i < ls.length; i++) {
  var c = ls.charAt(i);
  if ( !contains(ipa,c)) {
   found = true;
   s2 += c;
  } else {
   s2 += " ";
  }
 }
 if (found) {
  return s2;
 }
 return '';
}


function leseSpracheH2(v) {
 var i = getTemplate2(v,"Sprache",0);
 if (i > 0) {
  return getTemplateParam(v,i,"1");
 }
 return '';
}


function ersteLautschrift(v) {
 var i = getTemplate2(v,"Aussprache",0);
 if (i > 0) {
  i = getTemplate2(v,"Lautschrift",i);
  if (i > 0) {
   return getTemplateParam(v,i,"1");
  }
 }
 return '';
}


function analyzeLautschrift(v,title,warn){

 var ls = ersteLautschrift(v);
 var err = checkLSDeutsch(ls);
 if (err.length>0) {
  warn.push(new warning(-2,"Die Lautschrift '"+ls+"' ist nicht deutsch oder der Eintrag ist ein Fremdwort oder ein Dialekt. Nach den hier vereinbarten IPA-Regeln im Deutschen unübliche IPA-Zeichen: '"+err+"'"));
 } else {
  var r = {p:0,g:"",pfx:"",err:""};
  r = checkPhonemGraphem(title, ls);
  if (r.pfx.length > 0) {
   warn.push(new warning(-2,"Die Lautschrift nach '"+r.pfx+"' kann nach den hier vereinbarten IPA-Regeln im Deutschen nicht dem Lemma zugeordnet werden '"+ls+"'. Vielleicht ist der Eintrag ein Fremdwort oder ein Dialekt."));
  }
 }

}


function checkPhonemGraphem(title, ls) {
 var graphem = "";
 var max = {p:0,g:"",pfx:"",err:""};
 var t0 = title.charAt(0);

 // A , UN, PKW soll nicht geprüft werden,
 if (title.length > 1 && (t0 == 'Ä' || t0 == 'ä' || t0 == 'Ö' || t0 == 'ö'
     || t0 == 'Ü' || t0 == 'ü' || (t0 >= 'A' && t0 <= 'Z') || (t0 >= 'a' && t0 <= 'z'))){
  for (var i = 1; i < title.length; i++) {
   var ti = title.charAt(i);
   if (ti != 'ä' && ti != 'ö' && ti != 'ü' && ti != 'ß' && !(ti >= 'a' && ti <= 'z')){
    return max;
   }
  }
  if (ls != "…" && ls != "..." && ls.length > 0) {
   var phon = ls.split('');
   if (!rekPhonemGraphem(0, graphem, phon, title.toLowerCase(), max)) {
    for (i = 0; i < max.p; i++) {
     max.pfx += phon[i];
    }
   }
  }
 }
 return max;
}


var phone = {};

  phone["p͡f"] = ["pf"];
  phone["t͡s"] = ["dts", "tts", "ds", "ts", "tz", "zz", "c", "t", "z"];
  phone["t͡ʃ"] = ["tsch"];

  phone["t"] = ["dt", "th", "tt", "d", "t"];
  phone["ə"] = ["e"];
  phone["n"] = ["nn", "n"];
  phone["s"] = ["ss", "zz", "c", "s", "ß", "z"];
  phone["a"] = ["ah", "a"];

  phone["l"] = ["ll", "l"];
  phone["ɛ"] = ["e", "ä"];
  phone["f"] = ["ff", "ph", "f", "v"];
//  phone["g"] = ["gg", "gh", "g"];   // buchstabe g
  phone["\u0261"] = ["gg", "gh", "g"]; // ipa g

  phone["i"]  = ["i", "y"];
  phone["iː"] = ["ieh", "ie", "ih", "i"];
  phone["i̯"] = ["i"];
  phone["ɪ"]  = ["i"];
  phone["ɪ̯"] = ["i"];

  phone["k"] = ["cch", "ch", "ck", "gg", "kk", "c", "g", "k"];
  phone["m"] = ["mm", "m"];

  phone["b"] = ["bb", "b"];
  phone["ʃ"] = ["sch", "ch", "sk", "s"];
  phone["d"] = ["dd", "d"];
  phone["ɐ"] = ["er"];
  phone["n̩"] = ["en"];
  phone["ŋ̍"] = ["en"];
  phone["ŋ̩"] = ["en"];

  phone["aː"] = ["aa", "ah", "a"];

  phone["p"] = ["bb", "pp", "b", "p"];
  phone["ŋ"] = ["ng", "n"];

  phone["ɔ"] = ["au", "o"];
  phone["v"] = ["v", "w"];
  phone["ʊ"] = ["u"];
  phone["ɐ̯"] = ["r"];
  phone["z"] = ["zz", "s", "z"];
  phone["z̥"] = ["s"];

  phone["aɪ̯"] = ["aille", "aill", "ail", "eih", "ai", "ei", "ay", "y"];

//  + "g" in lustig
  phone["ç"]  = ["ch", "g"];
  phone["eː"] = ["ee", "eh", "et", "e"];
  phone["h"]  = ["h"];

  phone["ɛː"] = ["äh", "ä"];

  phone["uː"] = ["oo", "ou", "uh", "u"];
  phone["aʊ̯"] = ["au", "ou", "ow"];
  phone["ʏ"]  = ["ü", "y", "u"];
  phone["oː"] = ["eau", "au", "oh", "oo", "o"];
  phone["yː"] = ["üh", "ü", "y", "u"];
  phone["x"]  = ["ch"];
  phone["χ"]  = ["ch"];
  phone["ɔɪ̯"] = ["eu", "äu", "oi", "oy"];

  phone["ks"] = ["chs", "cks", "gs", "ks", "x"];
  phone["e"]  = ["ee", "e"];
  phone["ø"]  = ["ö"];
  phone["øː"] = ["eue", "eu", "öh", "ö"];
   
  phone["l̩"] = ["el"];
  phone["j"] = ["j", "y"];
  phone["u"] = ["ou", "u"];

  phone["o"] = ["au", "o"];

  phone["m̩"] = ["em", "en"];
  phone["ɱ̍"] = ["en"];
  phone["ɱ̩"] = ["en"];

  phone["œ"] = ["ö"];

  phone["ʁ"]  = ["rrh", "rh", "rr", "r"];
  phone["ʀ"]  = ["rrh", "rh", "rr", "r"];
  phone["r"]  = ["rrh", "rh", "rr", "r"];

  phone["kv"] = ["qu"];

  phone["y"] = ["y", "ü"];

  phone["ʔ"] = [""];
  phone["ʒ"] = ["g", "j"];


function rekPhonemGraphem( pos, graphem, phon, titlelow, max) {
 var c;

 if (!startsWith(titlelow,graphem)) {
  return false;
 }
 if (graphem.length > max.g.length) {
  max.g = graphem;
  max.p = pos;
 }

 if (phon.length > pos) {
  c = phon[pos];
      
  if (phon.length > pos+1 ){
   if( phon[pos + 1] == 'ː') {
    c = phon[pos] + 'ː';
    pos++;
   }
   var p0 = phon[pos];
   var p1 = (phon.length > pos+1) ? phon[pos+1] : '';
   var p2 = (phon.length > pos+2) ? phon[pos+2] : '';

   if (p0 == 'a' && p1 == '\u026a' && p2 == '\u032f') {
    c = "aɪ̯";
    pos += 2;
   } else if (p0 == 'a' && p1 == 'ʊ' && p2 == '\u032f') {
    c = "aʊ̯";
    pos += 2;
   } else if (p0 == '\u0250' && p1 == '\u032f') { // [ɐ̯]
    c = "\u0250\u032f";
    pos++;
   } else if (p0 == 'i' && p1 == '\u032f') { // [i̯]
    c = "i\u032f";
    pos++;
   } else if (p0 == '\u026a' && p1 == '\u032f') { // [ɪ̯]
    c = "\u026a\u032f";
    pos++;
   } else if (p0 == 't' && p1 == '\u0361' && p2 == 's') {
    c = "t͡s";
    pos += 2;
   } else if (p0 == 't' && p1 == '\u0361' && p2 == 'ʃ') {
    c = "t͡ʃ";
    pos += 2;
   } else if (p0 == 'p' && p1 == '\u0361' && p2 == 'f') {
    c = "p͡f";
    pos += 2;
   } else if (p0 == 'k' && p1 == 's') {
    if (startsWith(titlelow,graphem + "x")) {
     c = "ks";
     pos++;
    }
   } else if (p0 == 'k' && p1 == 'v') {
    if (startsWith(titlelow,graphem + "qu")) {
     c = "kv";
     pos++;
    }
   } else if (p0 == 'l' && p1 == '\u0329') {
    c = "l̩";
    pos++;
   } else if (p0 == 'm' && p1 == '\u0329') {
    c = "m̩";
    pos++;
   } else if (p0 == '\u0271' && p1 == '\u030D') {
    c = "ɱ̍";
    pos++;
   } else if (p0 == 'ŋ' && p1 == '\u030D') {
    c = "ŋ̍";
    pos++;
   } else if (p0 == 'ŋ' && p1 == '\u0329') {
    c = "ŋ̩";
    pos++;
   } else if (p0 == 'n' && p1 == '\u0329') {
    c = "n̩";
    pos++;
   } else if (p0 == 'ɔ' && p1 == '\u026a' && p2 == '\u032f') {
    c = "ɔɪ̯";
    pos += 2;
   }
  }

  if (phone[c] !== undefined) {
   for (var i = 0; i < phone[c].length; i++) {
    if (rekPhonemGraphem(pos + 1, graphem + phone[c][i], phon, titlelow, max)) {
     return true;
    }
   }
  } else {
   if (rekPhonemGraphem(pos + 1, graphem, phon, titlelow, max)) {
    return true;
   }
  }
 } else {
  if (graphem == titlelow) {
   return true;
  }
 }

 return false;
}


function splitWtPrefix(wt,pfx) {
 var a = [];
 var i,j = 0;
 for (i=0; i < pfx.length; i++) {
  if (wt.charAt(j) == pfx.charAt(i)) {
   j++;
  } else {
   a[0] = wt.substr(0,j).replace(/·$/,"");
   a[1] = wt.substr(j).replace(/^·/,"");
   return a;
  }
  while (wt.charAt(j) == '·') {
   j++;
  }
 }
 a[0] = wt.substr(0,j).replace(/·$/,"");
 a[1] = wt.substr(j).replace(/^·/,"");
 return a;
}


function cleanupWt(wt) {
 wt = wt.replace(/··/g,'·');
 wt = wt.replace(/^(\S?)·/,'$1');
 wt = wt.replace(/·(\S?)$/,'$1');
 return wt;
}


function cleanupWtEnd(wt) {
 // Letzte Trennsilbe darf nicht nur aus Konsonanten bestehen
 var re1 = /·([bcdfghjklmnpqrstvwxz]+$)/;
 if (wt.search(re1) >= 0) {
  wt = wt.replace(re1,'$1');
 }
 return wt;
}


function cleanupLsPf(ls) {
 return ls.replace(/ˈp͡ˌf/g,'ˈp͡f');
}


function cleanupLs(ls,wt) {
 // einsilbig?
 if (wt) {
  if (!contains(wt,'·') && !contains(wt,' ')) {
   ls = ls.replace(/ˈ/g,'');
  }
 }

 if (contains(ls,"…") || contains(ls,"...")) {
  return "{{Lautschrift|…}}";
 }
 if (contains(ls,"{{Lautschrift|{{Lautschrift?|")) {
  ls = ls.replace(/\{\{Lautschrift\|/g,'');
 }
 ls = ls.replace(/\{Lautschrift\|\}/g,'{Lautschrift|…}');

 ls = ls.replace(/n̩n̩\}/g,'ənən}');
 ls = ls.replace(/ənn̩\}/g,'ənən}');

 ls = ls.replace(/m̩dn̩\}/g,'m̩dən}');
 ls = ls.replace(/m̩tn̩\}/g,'m̩tən}');
 ls = ls.replace(/m̩stn̩\}/g,'m̩stən}');
 ls = ls.replace(/m̩tstn̩\}/g,'m̩tstən}');

 ls = ls.replace(/n̩dn̩\}/g,'n̩dən}');
 ls = ls.replace(/n̩tn̩\}/g,'n̩tən}');
 ls = ls.replace(/n̩stn̩\}/g,'n̩stən}');
 ls = ls.replace(/n̩tstn̩\}/g,'n̩tstən}');

 ls = ls.replace(/ŋ̍dn̩\}/g,'ŋ̍dən}');
 ls = ls.replace(/ŋ̍tn̩\}/g,'ŋ̍tən}');
 ls = ls.replace(/ŋ̍stn̩\}/g,'ŋ̍stən}');
 ls = ls.replace(/ŋ̍tstn̩\}/g,'ŋ̍tstən}');

 ls = ls.replace(/ŋ̩dn̩\}/g,'ŋ̍dən}');
 ls = ls.replace(/ŋ̩tn̩\}/g,'ŋ̍tən}');
 ls = ls.replace(/ŋ̩stn̩\}/g,'ŋ̍stən}');
 ls = ls.replace(/ŋ̩tstn̩\}/g,'ŋ̍tstən}');

 ls = ls.replace(/tstn̩\}/g,'t͡stn̩}');
 ls = ls.replace(/tstə\}/g,'t͡stə}');
 ls = ls.replace(/tstəm\}/g,'t͡stəm}');
 ls = ls.replace(/tstən\}/g,'t͡stən}');
 ls = ls.replace(/tstɐ\}/g,'t͡stɐ}');
 ls = ls.replace(/tstəs\}/g,'t͡stəs}');
 return ls;
}


function splitLs(ls) {
 var a = [];
 var i=0, j=0 ,pos = 0,idx = 0;

 while (i < ls.length && i >= 0) {
  i = ls.indexOf("{{Lautschrift|",i);
  if (i>=0) {
   j = ls.indexOf("}}",i);
   if (j>=0) {
    a[idx++] = ls.substring(pos,i+14);
    a[idx++] = ls.substring(i+14,j);
    pos = j;
   }
   i += 14;
  }
 }
 a[idx] = ls.substr(pos);
 return a;
}


var verbWtLs = [
 {end:'',     wt:'',      ls:''},
 {end:'e',    wt:'e',     ls:'ə'},
 {end:'est',  wt:'est',   ls:'əst'},
 {end:'et',   wt:'et',    ls:'ət'},
 {end:'ete',  wt:'e·te',  ls:'ətə'},
 {end:'eten', wt:'e·ten', ls:'ətn̩'},
 {end:'etest',wt:'e·test',ls:'ətəst'},
 {end:'etet', wt:'e·tet', ls:'ətət'},
 {end:'etem', wt:'e·tem', ls:'ətəm'},
 {end:'eter', wt:'e·ter', ls:'ətɐ'},
 {end:'etes', wt:'e·tes', ls:'ətəs'},

 {end:'st',   wt:'st',    ls:'st'},
 {end:'t',    wt:'t',     ls:'t'},
 {end:'test', wt:'·test', ls:'təst'},
 {end:'tet',  wt:'·tet',  ls:'tət'},

 {end:'te',   wt:'·te',   ls:'tə'},
 {end:'ten',  wt:'·ten',  ls:'tn̩'},
 {end:'tem',  wt:'·tem',  ls:'təm'},
 {end:'tes',  wt:'·tes',  ls:'təs'},
 {end:'ter',  wt:'·ter',  ls:'tɐ'}
];

var verbZuWtLs = [
 {end:'en',    wt:'',     ls:''},
 {end:'ende',  wt:'·de',  ls:'də'},
 {end:'endem', wt:'·dem', ls:'dəm'},
 {end:'enden', wt:'·den', ls:'dn̩'},
 {end:'ender', wt:'·der', ls:'dɐ'},
 {end:'endes', wt:'·des', ls:'dəs'},
 {end:'n',     wt:'',     ls:''},
 {end:'nde',   wt:'·de',  ls:'də'},
 {end:'ndem',  wt:'·dem', ls:'dəm'},
 {end:'nden',  wt:'·den', ls:'dn̩'},
 {end:'nder',  wt:'·der', ls:'dɐ'},
 {end:'ndes',  wt:'·des', ls:'dəs'}
];

var verbP1WtLs = [
 {end:'',     wt:'',     ls:''},
 {end:'de',   wt:'·de',  ls:'də'},
 {end:'dem',  wt:'·dem', ls:'dəm'},
 {end:'den',  wt:'·den', ls:'dn̩'},
 {end:'der',  wt:'·der', ls:'dɐ'},
 {end:'des',  wt:'·des', ls:'dəs'}
];

var verbP2WtLs = [
 {end:'e',   wt:'e',  ls:'ə'},
 {end:'em',  wt:'em', ls:'əm'},
 {end:'en',  wt:'en', ls:'n̩'},
 {end:'er',  wt:'er', ls:'ɐ'},
 {end:'es',  wt:'es', ls:'əs'}
];


function buildRegExpVerb(stamm){

 for (var i=stamm.length;i>=0;i--) {
  if (stamm.charAt(i).search(/[aäeioöuüy]/) >= 0) {
   if (i>0 && stamm.charAt(i-1).search(/[aäeioöuüy]/) >= 0) {
    return new RegExp("^" + stamm.substring(0,i-1) + "(a|ä|au|e|ei|eu|i|ie|o|ö|u|ü|y)" + stamm.substr(i+1) + "$");
   } else {
    return new RegExp("^" + stamm.substring(0,i) + "(a|ä|au|e|ei|eu|i|ie|o|ö|u|ü|y)" + stamm.substr(i+1) + "$");
   }
  }
 }
 return '';
}


function buildRegExpVerb2(stamm){

 for (var i=stamm.length;i>=0;i--) {
  if (stamm.charAt(i).search(/[aäeioöuüy]/) >= 0) {
   if (i>0 && stamm.charAt(i-1).search(/[aäeioöuüy]/) >= 0) {
    return new RegExp("^" + stamm.substring(0,i-1) + "(a|ä|au|e|ei|eu|i|ie|o|ö|u|ü|y)" + "(b|ch|f|ff|g|k|l|m|mm|nd|ng|ss|t|tt|ß)$");
   } else {
    return new RegExp("^" + stamm.substring(0,i) + "(a|ä|au|e|ei|eu|i|ie|o|ö|u|ü|y)" + "(b|ch|f|ff|g|k|l|m|mm|nd|ng|ss|t|tt|ß)$");
   }
  }
 }
 return '';
}


function copyTrenner(src,dst){
 var s = '';
 var j = 0;
 for (var i=0;i<dst.length;i++) {
  if (src.length > i+j && src.charAt(i+j) == '·') {
   s += '·';
   j++;
  }
  if (src.charAt(i+j) != dst.charAt(i)) {
   var sv = src.charAt(i+j+1).search(/[aäeioöuüy]/);
   var dv = dst.charAt(i+1).search(/[aäeioöuüy]/);
   if (sv == 0 && dv == -1) {
    j++;
   }
   if (sv == -1 && dv == 0) {
    j--;
   }
  }
  s += dst.charAt(i);
 }
 return s;
}


function isNearlyEqual(verb,re,end){
 if (endsWith(verb,end)) {
  verb = cropStr(verb,end.length);
  return verb.search(re) == 0;
 }   
 return false;
}


function createFlexionWtLsVerb(idx) {

 var f3 = sections[idx.i2].child[idx.i3].flexion;

 var stamm = thispage;
 var wtsi = buildWtNeu(sections[idx.i2].child[idx.i3].worttr,"Inf");
 var lssi = buildPropNeu(sections[idx.i2].child[idx.i3].lautschr,"Inf");
 var wts  = wtsi;
 var lss  = lssi;
 var lssig = lssi;
 var eTilgChar = '';
 var eTilgStamm = '';
 var eTilgWt = '';
 var eTilgLs = '';
 var a = [];
 var form = '';
 var j;

 if (endsWith(stamm,"en")) {
  stamm = cropStr(stamm,2);
  wts = cropStr(wts,2);
  lss = lss.replace(/(ən\}\}|n̩\}\}|ŋ̍\}\}|ŋ̩\}\}|ɱ̍\}\}|ɱ̩\}\}|m̩\}\})/g,"}}");
  if (lss.search(/[aɪɛɔœʊʏ]ʁ\}\}/) == -1) {
   lss = lss.replace(/ʁ\}\}/g,"ɐ̯}}");
  }
  lssig = lss;
  if (endsWith(stamm,"ig") && !endsWith(stamm,"eig")) {
   lssig = lss.replace(/[g\u0261]\}\}/g,"ç}}");
   lssig += ", " + lss.replace(/[g\u0261]\}\}/g,"k}}");
  }
  lss = auslautHartLoop(lss,"Verb");
  lssig = auslautHartLoop(lssig,"Verb");
 } else if (endsWith(stamm,"ln") || endsWith(stamm,"rn")) {
  stamm = cropStr(stamm,1);
  wts = cropStr(wts,1);
  lss = lss.replace(/n\}\}/g,"}}");
  lssig = lss;
  eTilgChar = stamm.charAt(stamm.length - 1);
  eTilgStamm = stamm.substr(0,stamm.length - 2) + eTilgChar;
  var etilgfremd = buildWtNeu(sections[idx.i2].child[idx.i3].worttr,"Sonderfall");
  if (etilgfremd == "P112") {
    eTilgWt = cropStr(wts,2) + '·' + eTilgChar;
    if (startsWith(eTilgWt,':')) {
      eTilgWt = eTilgWt.substr(1);
    }
  } else {
    eTilgWt = cropStr(wts,2);
    eTilgWt = prepareWorttrennungVerb(eTilgWt) + eTilgChar;
  }
  eTilgLs = lss.replace(/l̩\}\}/g,"l}}");
  eTilgLs = eTilgLs.replace(/əl\}\}/g,"l}}");
  eTilgLs = eTilgLs.replace(/ɐ\}\}/g,"ʁ}}");
 }
 wts = prepareWorttrennungVerb(wts);
 wtsi = prepareWorttrennungVerb(wtsi);

 var stammRe = buildRegExpVerb(stamm);
 var stammRe2 = buildRegExpVerb2(stamm);

 for (var verb in f3) {
  var fi = f3[verb];

  for (j = 0; j < verbWtLs.length; j++) {

   if (verb == stamm + verbWtLs[j].end) {
    if (fi.wt.length == 0){
     fi.wt = wtPlusE(wts,verbWtLs[j].wt);
    }
    if (fi.ls.length == 0){
     if (startsWith(verbWtLs[j].end,'t') || startsWith(verbWtLs[j].end,'s') || verbWtLs[j].end == "") {
      fi.ls = lsPlusE(stamm,lssig,verbWtLs[j].ls,"Verb");
     } else {
      fi.ls = lsPlusE(stamm,lss,verbWtLs[j].ls,"Verb");
     }
     fi.ls = cleanupLs(fi.ls,fi.wt);
    } 
    fi.wt = cleanupWtEnd(fi.wt);
    break;
   } else if (verb == eTilgStamm + verbWtLs[j].end){
    if (fi.wt.length == 0){
     fi.wt = wtPlusE(eTilgWt,verbWtLs[j].wt);
    }
    if (fi.ls.length == 0){
     fi.ls = lsPlusE(stamm,eTilgLs,verbWtLs[j].ls,"Verb");
    }
    fi.ls = cleanupLs(fi.ls,fi.wt);
    fi.wt = cleanupWtEnd(fi.wt);
    break;
   }

   if (verb == 'ge' + stamm + verbWtLs[j].end){
    if (fi.wt.length == 0){
     fi.wt = wtPlusE('ge·'+wts,verbWtLs[j].wt);
    }
    if (fi.ls.length == 0){
     if (startsWith(verbWtLs[j].end,'t') || startsWith(verbWtLs[j].end,'s') || verbWtLs[j].end == "") {
      fi.ls = lsPlusE(stamm,lssig,verbWtLs[j].ls,"Verb");
     } else {
      fi.ls = lsPlusE(stamm,lss,verbWtLs[j].ls,"Verb");
     }
     if (!contains(fi.ls,'…')) {
      if (stamm.search(/[aeiouäöü]/) == 0) {
       fi.ls = fi.ls.replace(/Lautschrift\|([ˈˌ]*)ʔ*/g,"Lautschrift|ɡə$1ʔ");
      } else {
       fi.ls = fi.ls.replace(/Lautschrift\|/g,"Lautschrift|ɡə");
      }
     }
    } break;
   }

   if (contains(verb,' ')) {
    a = verb.split(' ');
    var swap = a[1] + a[0];
    if (swap == stamm + verbWtLs[j].end){
     trennbaresVerb(fi,wts,verbWtLs[j].wt,' ',lss,lssig,verbWtLs[j].ls,a[1],verbWtLs[j].end,'',stamm);
    } else if (isNearlyEqual(swap,stammRe,verbWtLs[j].end) || isNearlyEqual(swap,stammRe2,verbWtLs[j].end)) {
     if (fi.wt.length == 0) {
      trennbaresVerb(fi,wtPlusE(copyTrenner(wts,cropStr(swap,verbWtLs[j].end.length)),verbWtLs[j].wt),'',' ','','','',a[1],verbWtLs[j].end,'',stamm);
     }
    }
    if (swap == eTilgStamm + verbWtLs[j].end){
     trennbaresVerb(fi,eTilgWt,verbWtLs[j].wt,' ',eTilgLs,eTilgLs,verbWtLs[j].ls,a[1],verbWtLs[j].end,'',eTilgStamm);
    }
    if (swap == stamm + 'en') {
     trennbaresVerb(fi,wtsi,'',' ',lssi,lssi,'',a[1],'en','',stamm);
    } else if (isNearlyEqual(swap,stammRe,'en') || isNearlyEqual(swap,stammRe2,'en')) {
     if (fi.wt.length == 0) {
      trennbaresVerb(fi,wtPlusE(copyTrenner(wts,cropStr(swap,2)),'en'),'',' ','','','',a[1],'en','',stamm);
     }
    }
    if (swap == stamm + 'n'){
     trennbaresVerb(fi,wtsi,'',' ',lssi,lssi,'',a[1],'n','',stamm);
    }
   }

   var geidx = verb.indexOf('ge');
   if (geidx > 0) {  // Partizip 2 trennbares Verb
    var pre = verb.slice(0, geidx);
    form = pre + verb.slice(geidx+2);
    if (form == stamm + verbWtLs[j].end){
     trennbaresVerb(fi,wts,verbWtLs[j].wt,'·ge·',lss,lssig,verbWtLs[j].ls,pre, verbWtLs[j].end,'ɡə',stamm);
    }
    if (form == eTilgStamm + verbWtLs[j].end){
     trennbaresVerb(fi,eTilgWt,verbWtLs[j].wt,'·ge·',eTilgLs,eTilgLs,verbWtLs[j].ls,pre, verbWtLs[j].end,'ɡə',eTilgStamm);
    }
    if (form == stamm + 'n'){
     trennbaresVerb(fi,wtsi,'','·ge·',lssi,lssi,'',pre,'n','ɡə',stamm);
    }
    if (form == stamm + 'en'){
     trennbaresVerb(fi,wtsi,'','·ge·',lssi,lssi,'',pre,'en','ɡə',stamm);
    }
    for (var k = 0; k < verbP2WtLs.length; k++) {
     if (form == stamm + 'en' + verbP2WtLs[k].end) {
      var ls = lssi.replace(/(n̩\}|ŋ̍\}|ŋ̩\}|ɱ̍\}|ɱ̩\}|m̩\})/g,"ən}");
      trennbaresVerb(fi,wtsi,verbP2WtLs[k].wt,'·ge·',ls,ls,verbP2WtLs[k].ls,pre,'en' + verbP2WtLs[k].end,'ɡə',stamm+'en');
      fi.ls = cleanupLs(fi.ls,fi.wt);
     }
    }
   }
 
  } // end:  for (var j = 0; ...

  if (fi.wt.length > 0 && fi.ls.length > 0) {
   continue;
  }

// Ähnlichkeitssuche
  for (j = 0; j < verbWtLs.length; j++) {
   if (isNearlyEqual(verb,stammRe,verbWtLs[j].end) || isNearlyEqual(verb,stammRe2,verbWtLs[j].end)) {
    if (fi.wt.length == 0) {
     fi.wt = wtPlusE(copyTrenner(wts,cropStr(verb,verbWtLs[j].end.length)),verbWtLs[j].wt);
    } break;
   }
  }

  if (verb != stamm + 'en') {
   if (isNearlyEqual(verb,stammRe,'en') || isNearlyEqual(verb,stammRe2,'en')) {
    if (fi.wt.length == 0) {
     fi.wt = wtPlusE(copyTrenner(wts,cropStr(verb,2)),'en');
    }
   }
  }

  // Partizip 1
  for (var j = 0; j < verbP1WtLs.length; j++) {
   if (verb == stamm + 'en' + verbP1WtLs[j].end || verb == stamm + 'n' + verbP1WtLs[j].end) {
    if (fi.wt.length == 0){
     fi.wt = wtPlusE(wtsi,verbP1WtLs[j].wt);
    }
    if (fi.ls.length == 0){
     fi.ls = lsPlusE(stamm,lssi,verbP1WtLs[j].ls,"Verb");
     fi.ls = cleanupLs(fi.ls,fi.wt);
    }
    fi.wt = cleanupWtEnd(fi.wt);
    break;
   }
  }

  // Partizip 2
  for (var j = 0; j < verbP2WtLs.length; j++) {
   if (verb == stamm + 'en' + verbP2WtLs[j].end) {
    if (fi.wt.length == 0){
     fi.wt = wtPlusE(wtsi, verbP2WtLs[j].wt);
    }
    if (fi.ls.length == 0){
     var ls = lssi.replace(/(n̩\}|ŋ̍\}|ŋ̩\}|ɱ̍\}|ɱ̩\}|m̩\})/g,"ən}");
     fi.ls = lsPlusE(stamm + 'en',ls,verbP2WtLs[j].ls,"Verb");
     fi.ls = cleanupLs(fi.ls,fi.wt);
    } break;
   }
  }

  // Partizip 2 mit ge
  for (var j = 0; j < verbP2WtLs.length; j++) {
   if (verb == 'ge' + stamm + 'en' + verbP2WtLs[j].end) {
    if (fi.wt.length == 0){
     fi.wt = wtPlusE('ge·'+wtsi,verbP2WtLs[j].wt);
    }
    if (fi.ls.length == 0){
     ls = lssi.replace(/(n̩\}|ŋ̍\}|ŋ̩\}|ɱ̍\}|ɱ̩\}|m̩\})/g,"ən}");
     fi.ls = lsPlusE(stamm + 'en',ls,verbP2WtLs[j].ls,"Verb");
     if (!contains(fi.ls,'…')) {
      fi.ls = fi.ls.replace(/Lautschrift\|/g,"Lautschrift|ɡə");
     }
     fi.ls = cleanupLs(fi.ls,fi.wt);
    } break;
   }
  }

  // Gerundivum mit zu
  if (verb.indexOf("zu",1) > 0) {
   a = verb.split("zu");   // not at start of string
   if (a[0].length == 0) {
    a[0] = "zu";
   }
   if (a.length == 4) {
    if (a[1].length == 0) {  // zu(zu)zurren
     a[1] = "zu" + a[3];
    } else {
     a[0] = a[0] + a[1];
     a[1] = "zu" + a[3];  // zusammen(zu)zucken
    }
   }
   if (a.length == 3) {
    if (a[1].length == 0) {  // ab(zu)zupfen, hinzu(zu)fügen, dazu(zu)zählen
     // Ausnahmen
     if (startsWith(verb,"hinzuzu")) {
      a[0] = "hinzu";
      a[1] = a[2];
     } else if (startsWith(verb,"dazuzu")) {
      a[0] = "dazu";
      a[1] = a[2];
     } else if (startsWith(verb,"zuzu")) {  // zu(zu)schneiden
      a[0] = "zu";
      a[1] = a[2];
     } else {      // ab(zu)zupfen{
      a[1] = "zu" + a[2];
     }
    } else {
     a[0] = a[0] + a[1];
     a[1] = a[2];  // zusammen(zu)fassen
    }
   }
   form = a[0] + a[1];

   for (var j = 0; j < verbZuWtLs.length; j++) {
    if (form == stamm + verbZuWtLs[j].end) {
     trennbaresVerb(fi,wtsi,verbZuWtLs[j].wt,'·zu·',lssi,lssi,verbZuWtLs[j].ls,
        a[0],verbZuWtLs[j].end,'t͡su',stamm);
     fi.ls = cleanupLs(fi.ls,fi.wt);
     break; // gefunden
    }
   }

  }

  fi.wt = cleanupWtEnd(fi.wt);
 } // end:  for (var verb in flexion) ...
}


function trennbaresVerb(fi,wts,wt,wtinfix,lss,lssig,ls,prefix,end,lsinfix,stamm){
 var r,rls;
 var tls;
 var k;

 if (fi.wt.length == 0) {
  fi.wt = wtPlusE(wts,wt);
  r = splitWtPrefix(fi.wt,prefix);
  if (wtinfix == ' ') {
   fi.wt = r[1] + wtinfix + r[0];
  } else {
   fi.wt = r[0] + wtinfix + r[1];
  }
 }

 if (fi.ls.length == 0){
  if (startsWith(end,'t') || startsWith(end,'s') || end == "") {
   tls = lssig;
  } else {
   tls = lss;
  }
  r = splitLs(tls);
  k = 1;

  while (k < r.length) {
   rls = checkPhonemGraphem(prefix,r[k]);
   if (rls.pfx.length > 0) {
    r[k] = prepareLautschrift(stamm,r[k],ls,"Verb");
    var re = new RegExp("\^"+rls.pfx,'g');
    if (lsinfix.length > 0) {
     r[k] = r[k].replace(re,rls.pfx+lsinfix); 
    } else {
     r[k] = r[k].replace(re,"");  // Prefix entfernen
     r[k] = r[k].replace(/^([^}]*)$/g,"$1 "+rls.pfx);  // Prefix hinten anhängen
    }
    r[k] = r[k].replace(/^([ˈˌ]?)ʔ/g,"$1");
   }
   k += 2;
  }
  fi.ls = r.join('');

 }
}


// liefert unique array mit ls für prefix
function getPrefixLsVerb(prefix,ls) {
 var ret = [];
 var r = splitLs(ls);
 var i, k = 1;

 while (k < r.length) {
  var rls = checkPhonemGraphem(prefix,r[k]);
  if (rls.pfx.length > 0) {
   if (prefix == "emp") { // empfangen, empfehlen, ...
    rls.pfx += "ˈp͡";
   }
   addOnlyUniqueLS(ret,rls.pfx);
  }
  k += 2;
 }

 return ret;
}


function addOnlyUniqueLS(prefix,ls) {
  for (var i = 0; i < prefix.length; i++) {
    if (prefix[i] == ls) {
      return;
    }
  }
  prefix.push(ls);
}


function createFlexion(sct,title) {
 if (!window.hasOwnProperty("autoedit")) {return;}

// if (mw.config.get("wgUserName") == null ||
//  !( mw.config.get("wgUserName") == "Formatierer"
//   || mw.config.get("wgUserName") == "Udo T."
//  )) {
//  meldung("Mein Schöpfer meint, es wäre wegen der IPA-Wartungsarbeiten zurzeit nicht angebracht Flexionsformen zu generieren.");
//  return;
// }

 var i2,i3,s2,s3;
 for (i2=1;i2<sct.length;i2++) {
  s2 = sct[i2];
  for (i3=1;i3<s2.child.length;i3++) {
   s3 = s2.child[i3];

   if (contains(title,'ß')) {
    var wtch = getWtAll(extractStr(s3.text,"{{Worttrennung}}","\n{{",'B'));
    addWtCH(i2,i3,title,buildPropNeu(wtch,"First"));
   }

   var sp = ["Deutsch", "Englisch", "Esperanto", "Französisch", "Italienisch", "Niedersorbisch", "Obersorbisch",
             "Polnisch", "Russisch", "Ukrainisch", "Weißrussisch"];
   var k;
   for (k=0;k<sp.length;k++) {
    var it = getTemplate2(s3.tt,sp[k]+" Substantiv Übersicht",0);
    if (it < 0) {
     it = getTemplate2(s3.tt,sp[k]+" Substantiv Übersicht -sch",0);
    }
    if (it < 0) {
     it = getTemplate2(s3.tt,sp[k]+" Toponym Übersicht",0);
    }
    if (it < 0) {
     it = getTemplate2(s3.tt,sp[k]+" Nachname Übersicht",0);
    }
    if (it >= 0) {
     createFlexionSub(i2,i3,s3.tt,s3.text,title,it);
     if (sp[k] == "Deutsch") {
      createFlexionWtLsSub(i2,i3,s3.tt,title,it);
      createWF(i2,i3,s3.tt,s3.text,title,it);
      createDim(i2,i3,s3,title,it);
     }
    }
   }

   // adjektivische Deklination für Einträge ohne Leerzeichen
   if (!contains(title,'_')) {
    it = getTemplate2(s3.tt,"Deutsch adjektivisch Übersicht",0);
    if (it >= 0) {
     createFlexionSubAD(i2,i3,s3.tt,s3.text,title,it,getTemplateParam(s3.tt,it,"Genus"));
    }
   }

   it = getTemplate2(s3.tt,"Deutsch Adjektiv Übersicht",0);
   if (it >= 0 && !contains(title,' ') && !contains(title,'_')) {
    if (getTemplateParam(s3.tt,it,"keine weiteren Formen") === undefined){
     if (!(endsWith(title,"fit") || endsWith(title,"hip") || endsWith(title,"hoch")
        || endsWith(title,"auer") || endsWith(title,"euer")
        || endsWith(title,"illuster") || endsWith(title,"minder") || endsWith(title,"mittel")
        || endsWith(title,"nah") || endsWith(title,"nahe") || endsWith(title,"viel")
        || (startsWith(title,"gut") && !endsWith(title,"ig")))) {
      createFlexionAdj(i2,i3,s3.tt,s3.text,title,it);
     } else {
       meldung("Mein Schöpfer hat mir verboten hier Flexionslinks zu erzeugen, weil ich dabei immer so viele Fehler mache.");
     }
    }
   }

   it = getTemplate2(s3.tt,"Deutsch Verb Übersicht",0);
   if (it>=0) {
    if (!(endsWith(title,"sein") || endsWith(title,"tun")
       || endsWith(title,"knien")|| endsWith(title,"selfien"))) {
     createFlexionVerb({i2:i2,i3:i3},s3.tt,s3.text,title,it);
     createWortbildung(i2,i3,s3.tt,s3.text,title,it);
    } else {
     meldung("Mein Schöpfer hat mir verboten hier Flexionslinks zu erzeugen, weil ich dabei immer so viele Fehler mache.");
    }
   }

   deleteDuplicateLSFlexion({i2:i2,i3:i3});
  }
 }

 createSchreibweiseCH(sections);
 for (i2=1;i2<sct.length;i2++) {
  s2 = sct[i2];
  for (i3=1;i3<s2.child.length;i3++) {
   s3 = s2.child[i3];
   for (var k in s3.flexion) {
    flexion[k] = s3.flexion[k];
   }
  }
 }

 if(!isEmpty(flexion)){
  apiParseLinks(flexion,handleResponseLinks,1);
 }
}


function createSchreibweiseCH(sections,pass) {
 var i2,i3,s2,s3;
 for (i2=1;i2<sections.length;i2++) {
  s2 = sections[i2];
  for (i3=1;i3<s2.child.length;i3++) {
   s3 = s2.child[i3];
   for (var gf in s3.flexion) {
    if (contains(gf,'ß')) {
     addWtCH(i2,i3,gf,s3.flexion[gf].wt,pass)
    }
   }
  }
 }
}


function addWtCH(i2,i3,gf,wt,pass) {
 var ss = '';
 gf = gf.replace(/_/g,' ');
 ss = gf.replace(/ß/g,"ss");
 var f3 = sections[i2].child[i3].flexion;
 if (f3[ss] === undefined) {
  f3[ss] = new flex(gf,"ch-Schreibweise",i2,i3,pass);
  f3[ss].sp = "Deutsch";
  wt = wt.replace(/·ß/g,"s·s");
  wt = wt.replace(/ß/g,"ss");
  f3[ss].wt = wt;
 }
}


function meldung(text){
 getGadgetAnker().appendChild(document.createTextNode(text));
}


var templates = [];

function templatep(name,value){
 this.name=name;
 this.value=value;
}

function getTemplate(name,start){
 for (var i=start;i<templates.length;i++) {
  if(templates[i][0].name=='0' && templates[i][0].value==name) {
   return i;
  }
 }
 return -1;
}

function getTemplate2(t,name,start){
 for (var i=start;i<t.length;i++) {
  if(t[i][0].name=='0' && t[i][0].value==name) {
   return i;
  }
 }
 return -1;
}


function getTemplateParam(t,index,name){
 for (var i=t[index].length-1;i>=0;i--) {
  if (t[index][i].name==name) {
   return t[index][i].value;
  }
 }
 return undefined;
}


function getTemplateParamStern(t,index,name,n) {
 var param = getTemplateParam(t,index,name);
 if (param !== undefined) {
  while (n > 0) {
   name += '*';
   n--;
   var pstern = getTemplateParam(t,index,name);
   if (pstern !== undefined) {
    param = param + "<>" + pstern;
   }
  }
 }
 return param;
}


function getTextAfter(t,index){
 if (t[index+1][0].name == 'T') {
  return t[index+1][0].value;
 }
 return '';
}


function wse(obj){
 this.state=obj.state;
 this.tlist=obj.tlist;
 this.tpnum=obj.tpnum;// template parameter nummer
 this.pname=obj.pname;
 this.pval=obj.pval;
}


// simple Wiki Parser
function parseWiki(text,templates,rekursiv,warn)
{
  var chr = '';
  var nowikistate = 0;

  var stack = [];
  var i = 0;
  var pos = 0;
  var p = new ph(rekursiv); //zeiger auf lokale variable
  var aktwse = new wse({state:1,tlist:[],tpnum:0,pname:'',pval:''});

  text += "\n";
  var textlow = text.toLocaleLowerCase("tr");

  var tmptxt = '';
  var textlist = [];

  var debug = false;
  while (pos<text.length){
    chr = text.charAt(pos);
    if (debug) {
      debug = confirm("parseWiki ["+chr+"]"+text.substr(pos+1,50)+"\nstate="+aktwse.state+"\npos="+pos+"\nfrom="+from+"\nlevel="+level+"\nattr="+attr+"\nattr1="+attr1+"\nval="+val+"\ntag="+tag+"\nakthse.sb="+akthse.sb+"\nsb="+sb+"\nstack[level].sb="+stack[level].sb);
    }
    switch (aktwse.state) { //switch1


    case 1:
      if (chr == '\n') {
        tmptxt+=chr;
        aktwse.state=3;
      } else if (chr == '{') {
        if (containsAt(textlow,"{{{{",pos)) {
          stack.push(new wse(aktwse));
          aktwse.state=21;
          pos++;
        } else if (containsAt(textlow,"{{{",pos)) {
          pos+=2;
        } else if (containsAt(textlow,"{{",pos)) {
          stack.push(new wse(aktwse));
          aktwse.tlist = [];
          aktwse.state=21;
          pos++;
        }
      } else if (chr == '}') {
        if (containsAt(textlow,"}}}}",pos)) {
          aktwse.state=2;
          pos++;
        } else if (containsAt(textlow,"}}}",pos)) {
          pos+=2;
        } else if (containsAt(textlow,"}}",pos)) {
          aktwse.state=2;
          pos++;
        }
      } else if (chr == '<' && containsAt(textlow,"<nowiki",pos)) {
        nowikistate = 1;
        aktwse.state=11;
        pos+=6;
      } else {
        tmptxt+=chr;
      } break;

    case 3:
      if (chr == '\n') {
        tmptxt+=chr;
        aktwse.state=3;
      } else if (chr == '=') {
        tmptxt+=chr;
        aktwse.state=3;
      } else {
        aktwse.state=1;
        pos--;
      } break;

    case 11:
      i = text.indexOf('>', pos);
      if (i >= 0){
        pos = i;
        if (text.charAt(i-1) == '/') {
          aktwse.state = nowikistate;
        } else {
          aktwse.state = 13;
        }
      }else{
        pos =text.length;
        warn.push(new warning(-1,"parseWiki nowiki end not found: "+pos+" state="+aktwse.state));
        aktwse.state = 1;
      } break;

    case 13:
      i = textlow.indexOf('</nowiki', pos);
      if (i >= 0){
        pos = i;
        aktwse.state = 15;
      }else{
        pos =text.length;
        warn.push(new warning(-1,"parseWiki &lt;/nowiki not found: "+pos+" state="+aktwse.state));
        aktwse.state = 1;
      } break;

    case 15:
      i = textlow.indexOf('>', pos);
      if (i >= 0){
        pos = i;
        aktwse.state = nowikistate;
      }else{
        pos =text.length;
        warn.push(new warning(-1,"parseWiki &lt;/nowiki end not found: "+pos+" state="+aktwse.state));
        aktwse.state = 1;
      } break;

    case 21:
      if (chr == '}'){
        if (containsAt(textlow,"}}",pos)) {
          aktwse.state=2;
          pos++;
        } else {
          aktwse.state=1;
        }
      } else if (chr == '{') {
        if (containsAt(textlow,"{{{{",pos)) {
          stack.push(new wse(aktwse));
          aktwse.tlist = [];
          aktwse.state=21;
          pos++;
        } else if (containsAt(textlow,"{{{",pos)) {
          stack.push(new wse(aktwse));
          aktwse.state=31;
          pos+=2;
        } else if (containsAt(textlow,"{{",pos)) {
          stack.push(new wse(aktwse));
          aktwse.tlist = [];
          aktwse.state=21;
          pos++;
        }
      } else if (chr == '}') {
        if (containsAt(textlow,"}}}}",pos)) {
          aktwse.state=2;
          pos++;
        } else if (containsAt(textlow,"}}}",pos)) {
          pos+=2;
        } else if (containsAt(textlow,"}}",pos)) {
          aktwse.state=2;
          pos++;
        }
      } else if (chr == '|') {
        aktwse.state=1;
      } else if (chr == '<' && containsAt(textlow,"<nowiki",pos)) {
        nowikistate = aktwse.state;
        aktwse.state=11;
        pos+=6;
      } else {
        aktwse.state=23;
        aktwse.tpnum=0;
        aktwse.pval = chr;
      } break;


    case 23:
      if (chr == '}'){
        if (containsAt(textlow,"}}",pos)) {
          aktwse.tlist.push(new templatep('0',$.trim(aktwse.pval)));
          aktwse.pval='';
          aktwse.state=2;
          pos++;
        } else {
          aktwse.state=1;
        }
      } else if (chr == '{') {
        if (containsAt(textlow,"{{{{",pos)) {
          stack.push(new wse(aktwse));
          aktwse.tlist = [];
          aktwse.state=21;
          pos++;
        } else if (containsAt(textlow,"{{{",pos)) {
          stack.push(new wse(aktwse));
          aktwse.state=31;
          pos+=2;
        } else if (containsAt(textlow,"{{",pos)) {
          stack.push(new wse(aktwse));
          aktwse.tlist = [];
          aktwse.state=21;
          pos++;
        }
      } else if (chr == '|') {
        aktwse.tlist.push(new templatep('0',$.trim(aktwse.pval)));
        aktwse.pval='';
        aktwse.state=25;
      } else if (chr == '<' && containsAt(textlow,"<nowiki",pos)) {
        nowikistate = aktwse.state;
        aktwse.state=11;
        pos+=6;
      } else {
        aktwse.pval += chr;
      } break;


    case 25:
      if (chr == '}'){
        if (containsAt(textlow,"}}",pos)) {
          aktwse.tpnum++;
          aktwse.tlist.push(new templatep(aktwse.tpnum.toString(),aktwse.pval));
          aktwse.state=2;
          pos++;
        } else {
          aktwse.pval += chr;
        }
      } else if (chr == '{') {
        if (containsAt(textlow,"{{{{",pos)) {
          stack.push(new wse(aktwse));
          aktwse.tlist = [];
          aktwse.state=21;
          pos++;
        } else if (containsAt(textlow,"{{{",pos)) {
          stack.push(new wse(aktwse));
          aktwse.state=31;
          pos+=2;
        } else if (containsAt(textlow,"{{",pos)) {
          stack.push(new wse(aktwse));
          aktwse.tlist = [];
          aktwse.state=21;
          pos++;
        }
      } else if (chr == '|') {
        aktwse.tpnum++;
        aktwse.tlist.push(new templatep(aktwse.tpnum.toString(),aktwse.pval));
        aktwse.pval='';
        aktwse.state=25;
      } else if (chr == '=') {
        aktwse.pname = aktwse.pval;
        aktwse.pval='';
        aktwse.state=27;
      } else if (chr == '<' && containsAt(textlow,"<nowiki",pos)) {
        nowikistate = aktwse.state;
        aktwse.state=11;
        pos+=6;
      } else {
        aktwse.pval += chr;
      } break;


    case 27:
      if (chr == '}'){
        if (containsAt(textlow,"}}",pos)) {
          aktwse.tlist.push(new templatep($.trim(aktwse.pname),$.trim(aktwse.pval)));
          aktwse.state=2;
          pos++;
        } else {
          aktwse.pval += chr;
        }
      } else if (chr == '{') {
        if (containsAt(textlow,"{{{{",pos)) {
          stack.push(new wse(aktwse));
          aktwse.tlist = [];
          aktwse.state=21;
          pos++;
        } else if (containsAt(textlow,"{{{",pos)) {
          stack.push(new wse(aktwse));
          aktwse.state=31;
          pos+=2;
        } else if (containsAt(textlow,"{{",pos)) {
          stack.push(new wse(aktwse));
          aktwse.tlist = [];
          aktwse.state=21;
          pos++;
        }
      } else if (chr == '|') {
        aktwse.tlist.push(new templatep($.trim(aktwse.pname),$.trim(aktwse.pval)));
        aktwse.pval='';
        aktwse.state=25;
      } else if (chr == '<' && containsAt(textlow,"<nowiki",pos)) {
        nowikistate = aktwse.state;
        aktwse.state=11;
        pos+=6;
      } else {
        aktwse.pval += chr;
      } break;

    case 31:
      if (chr == '}'){
        if (containsAt(textlow,"}}}",pos)) {
          aktwse.state=2;
          pos+=2;
        } else {
          aktwse.pval += chr;
        }
      }

    default:
      warn.push(new warning(-1,"parseWiki internal error at: "+pos+" state="+aktwse.state));
    } //switch1


    switch (aktwse.state) { //switch2

    case 2:
      if (stack.length==1) {
        textlist =[];
        textlist.push(new templatep('T',tmptxt));
        templates.push(textlist);
        tmptxt='';
        if (aktwse.tlist.length>0){
          templates.push(aktwse.tlist);
        }
      }
      if (stack.length>0) {
        aktwse=stack.pop();
      } else {
        warn.push(new warning(-1,"parseWiki Fehler in Vorlagenstruktur: pos="+pos+" state="+aktwse.state));
      }
      aktwse.state=1;
      break;

    default:
      
    } //switch2

    pos++;
  }

  if (stack.length>0) {
    warn.push(new warning(-1,"parseWiki Fehler in Vorlagenstruktur: pos="+pos+" state="+aktwse.state));
  }
  textlist = [];
  textlist.push(new templatep('T',tmptxt));
  templates.push(textlist);

}


//  Objekt für zu suchende HTML-Tags; enthält Steuerinformationen
var tags = {};

//  Hilfsobjekt zur references-Prüfung
var tagmark = {};


function tag(name,f1,f2){
 this.name=name;
 this.f1=f1;
 this.f2=f2;
}


function initTags(){
// tags["br"]=new tag("br",ignore,ignore);
 tags["nowiki"]=new tag("nowiki",setrek,resetrek);
// tags["p"]=new tag("p",ignore,ignore);
 tags["ref"]=new tag("ref",ignore,setref);
 tags["references"]=new tag("references",ignore,resetref);
 tags["#1"]=new tag("#1",ignore,resetref1);
 tags["#2"]=new tag("#2",ignore,resetref2);
// tags["small"]=new tag("small",ignore,ignore);
// tags["sub"]=new tag("sub",ignore,ignore);
// tags["sup"]=new tag("sup",ignore,ignore);
}


function ignore(){
 return "";
}

function setrek(p){
 tagmark["rek"]=p.rek;
 p.rek=false;
}

function resetrek(p){
 p.rek=tagmark["rek"];
 return "";
}

function setref(p){
 tagmark["ref"]=true;
 return "";
}

function resetref(p){
 tagmark["ref"]=false;
 return "";
}

function resetref1(p){
 tagmark["ref"]=false;
 return "{{Quellen}}";
}

function resetref2(p){
 tagmark["ref"]=false;
 return "{{Quellen|}}";
}

function onEndHtml(warn){
 if(tagmark["ref"]==true){
   warn.push(new warning(-1,"&lt;ref&gt;-Tag ohne nachfolgendes &lt;references /&gt; oder {{Quellen}} gefunden"));
 }
}

function isTag(tag){
  return tags[tag.toLowerCase()] != undefined;
}

// html stack element
function hse(tag,sb,from,to){
 this.tag=tag;
 this.sb=sb;
 this.from=from;
 this.to=to;
}

function ph(rek) {
 this.rek=rek;
}

// simple HTML Parser
function parseHTML(text,rekursiv,warn)
{
  var sb="";
  var pos=0;
  var state=1;
  var startp=0;
  var slash = false;
  var i=0;
  var from=0;  // start of tag-element
  var chr = '';
  var attr = '';
  var attr1 = '';
  var tag = '';
  var val = '';
  var stack = [];
  var level=0;
  var akthse = new hse("","",0,0);
  var p= new ph(rekursiv); //ptr to local variable

  // some tricks
  text=text.replace(/\{\{Quellen\}\}/g,"<#1 />");
  text=text.replace(/\{\{Quellen\|\}\}/g,"<#2 />");
  text+="\n";
  var textlow=text.toLowerCase();

  stack.push(akthse);

  while (pos<text.length){
    chr = text.charAt(pos);

    switch (state) { //switch1
    case 1:
      slash = false;
      attr = '';
      tag = '';
      val = '';
      i = text.indexOf('<', pos);
      if (i >= 0){
        from=i;
        pos = i;
        state = 3;
        sb+=text.substring(startp,i);
        startp = i;
      }else{
        pos =text.length;
        sb+=text.substring(startp);
      } break;

    case 3:
      if (chr=='<'){
        sb+=text.substring(from,pos);
        from=pos;
      }else if (chr==' '||chr=='\n'||chr=='>'){
        startp=from;
        state = 1;
      }else if (chr=='/'){
        slash = true;
        state = 5;
      }else{
        tag+=chr;
        state = 5;
      } break;

    case 5:
      if (chr=='<'){
        state = 2;
      }else if (chr==' '||chr=='\n'){
        if (isTag(tag)){
          state = 7;
        }else{
          startp=from;
          state = 1;
        }
      }else if (chr=='/'){
        if (isTag(tag)){
          state = 19;
        }else{
          startp=from;
          state = 1;
        }
      }else if (chr=='>'){

        if (isTag(tag)){
          stack[level].sb += sb;
          sb="";
          startp=pos+1;
          state = 20;
        }else{
          startp=from;
          state = 1;
        }
      }else{
        tag+=chr;
      } break;

    case 7:
      if (chr=='<'){
        state = 2;
      }else if (chr==' '||chr=='\n'){
        if(attr.length>0){
          attr1=attr;
          attr="";
        }
        ; //loop
      }else if (chr=='/'){
        state = 19;
      }else if (chr=='>'){
        if (isTag(tag)){
          stack[level].sb += sb;
          sb="";
          startp=pos+1;
          attr="";
          state = 20;
        }else{
          startp=from;
          state = 1;
        }
      }else if (chr=='='){
        state = 11;
      }else{
        attr+=chr;
      } break;

    case 11:
      if (chr=='<'){
        state = 2;
      }else if (chr==' '||chr=='\n'){
        ; //loop
      }else if (chr=='>'){
        state = 20;
      }else if (chr=='"'){
        startp=pos+1;
        state = 13;
      }else if (chr=="'"){
        startp=pos+1;
        state = 15;
      }else{
        val+=chr;
        state = 17;
      } break;

    case 13:
      i = text.indexOf('"', startp);
      if (i >= 0){
        pos = i;
        state = 7;
        val=text.substring(startp,i);
        attr='';
        val='';
      }else{
        pos =text.length;
        val+=text.substring(startp);
        state = 1;
      } break;

    case 15:
      i = text.indexOf("'", startp);
      if (i >= 0){
        pos = i;
        state = 7;
        val=text.substring(startp,i);
        attr='';
        val='';
      } else {
        pos =text.length;
        sb+=text.substring(startp);
        state = 1;
      } break;

    case 17:
      if (chr=='<'){
        state = 2;
      }else if (chr=='>'){
        stack[level].sb += sb;
        sb="";
        startp=pos+1;
        state = 20;
        attr="";
        val="";
      }else if (chr=='/'){
        state = 19;
      }else if (chr==' '||chr=='\n'){
        attr="";
        val="";
        state = 7;
      }else{
        val+=chr;
      } break;

    case 19:
      if (chr=='<'){
        state = 2;
      }else if (chr=='>'){
        sb+=tags[tag.toLowerCase()].f2(p);
        stack[level].sb += sb;
        sb="";
        attr="";
        val="";
        state = 1;
        startp=pos+1;
      }else{
        state = 1;
      } break;


    case 21:
      i = textlow.indexOf("</"+tag.toLowerCase(), pos);
      if (i >= 0){
        from=i;
        pos = i+tag.length+1;
        state = 23;
        sb+=text.substring(startp,i);
        startp = i;
      } else {
        pos =text.length;
        sb+=text.substring(startp);
      } break;

    case 23:
      if (chr=='<'){
        state = 2;
      }else if (chr=='>'){
        sb += tags[tag.toLowerCase()].f2(p);
        stack[level].sb += sb;
        sb="";
        startp=pos+1;
        state = 1;
      }else{
        state = 1;
      } break;

    default:
      warn.push(new warning(-1,"parseHTML internal error at: "+pos+" state="+state));
    } //switch1


    switch (state) { //switch2

    case 2:
      sb+=text.substring(from,pos);
      from=pos;
      tag="";
      state = 3;
      break;

    case 20:
      startp=pos+1;
      if (p.rek){
        if (slash){
          akthse=new hse("","",0,0);

          if(level>0) {
            var found = false;
            var k=0;
            var j=level;
            while(!found && j>0){
              if(stack[j].tag.toLowerCase() == tag.toLowerCase()) {
                found = true;
              }else {
                j--;
              }
            }
            if (found) {
              for (k=level;k>=j;k--) {
                akthse=stack.pop();
                level--;
                akthse.sb+=tags[akthse.tag.toLowerCase()].f2(p);
              }
            } else {
              sb+=tags[tag.toLowerCase()].f2(p);
              warn.push(new warning(-1,"Schließendes HTML-Element ohne öffnendes Element gefunden: "+mask(text.substring(from,pos+1))));
            }
          } else {
            sb+=tags[tag.toLowerCase()].f2(p);
            warn.push(new warning(-1,"Schließendes HTML-Element ohne öffnendes Element gefunden: "+mask(text.substring(from,pos+1))));
          }
          tag='';
          sb+=akthse.sb;
        }else{ //!slash
          tags[tag.toLowerCase()].f1(p);
          if(p.rek){
            stack.push(new hse(tag,sb,from,pos));// =>+1
            level++;
          }
          sb="";
        }
        if(p.rek){
          state = 1;
        }else{
          state = 21;
        }
      }else{
        state = 21;
      } break;
    default:
      
    } //switch2

    pos++;
  } 

  while (level>0) {
    akthse=stack.pop();
    level--;
    stack[level].sb+=akthse.sb;
    stack[level].sb+=tags[akthse.tag.toLowerCase()].f2(p);
  }

  stack[0].sb += sb;
  onEndHtml(warn);

}


function checkText(text,title,ns,node,pedit) {
  var warnings = [];
  var parts = [];
  var checkdone = [false,false,false,false];

  text = filterComments(text,warnings);

  if(!pages.hasOwnProperty(title)){
    pages[title] = new page(title,text);
  }
  pages[title].cotxt = filterComments(pages[title].text,warnings);
  pages[title].nwtxt = filterTag(pages[title].text,"nowiki",warnings);

  var lines = buildLines(pages[title].nwtxt);

  // do work
  analyzeBraces(pages[title].nwtxt,warnings);
  checkdone[0]=true;
  if (ns == 0) {
    do {
      /*
      if (contains(title,"(Deklination)") || contains(title,"(Konjugation)")) {
        break;
      }
      if (contains(pages[title].nwtxt,"{{Sprache|Umschrift}}")
       || contains(pages[title].nwtxt,"{{Sprache|Latein}}")) {
       break; // Probleme
      }
      */
      if (warnings.length == 0) {
        var fitext = filterTag(text,"math",warnings); //um nicht als Vorlagen interpretiert zu werden
        parseWiki(fitext,templates,true,warnings); //z.z. noch doppelt
        sections=buildSections(fitext);
        analyzeSections(sections,title,warnings);
        createFlexion(sections,title);
      }
      initTags();
      parseHTML(text,true,warnings);

      parts = buildStructure(lines);
      if (pedit.length==0){
        checkStructure(parts,warnings);
        checkdone[1]=true;
      }
      checkChapters(parts,lines,warnings,checkdone);

    } while (false)  // "Pseudo-While-Schleife" kann mit break verlassen werden
  }

  // report warnings
  if (doReport) {
    reportWarnings(node,lines,warnings,checkdone);
  }

  return warnings.length;
}

//
function checkTextSort(text) {
  var warnings = [];
  var parts = [];
  var checkdone = [false,false,false,false];
  var i = 0;
  var txt = filterComments(text,warnings);

  var lines = buildLines(txt);
  for (i = 0; i < lines.length; i++){
    reorder[i] = i;
  }
  parts = buildStructure(lines);
  checkChapters(parts,lines,warnings,checkdone);

  var lines2 = buildLines(text);
  for (i = 0; i < lines2.length; i++){
    lines[reorder[i]] = lines2[i];
  }
  text = lines.join("\n");
  return externalText(text);
}


function fillDeVerbReg(text,schieb) {

  var i = 0;
  var a = [];

  schieb = schieb || 0;

  var title = mw.config.get("wgPageName");
  if (endsWith(title,'en')) {
   var gf = title.slice(0,-2);
  } else if (endsWith(title,'eln') || endsWith(title,'ern')) {
   gf = title.slice(0,-1);
  }

  var einE = '';
  if (/d$|t$|tm$|dm$|fn$|dn$|gn$|chn$|kn$|mn$|pn$/.test(gf)) {
    einE = 'e';
  }

  var pers2 = 'st';
  if (/s$|x$|z$|ß$/.test(gf)) {
    pers2 = 't';
  }

  var lines = buildLines(text);
  for (i = 0; i < lines.length; i++){
    lines[i] = fillParam(lines[i],"|Präsens_ich=",gf + 'e',schieb);
    lines[i] = fillParam(lines[i],"|Präsens_du=",gf + einE + pers2,schieb);
    lines[i] = fillParam(lines[i],"|Präsens_er, sie, es=",gf + einE + 't',schieb);
    lines[i] = fillParam(lines[i],"|Präteritum_ich=",gf + einE + 'te',schieb);
    lines[i] = fillParam(lines[i],"|Konjunktiv II_ich=",gf + einE + 'te',schieb);
    lines[i] = fillParam(lines[i],"|Imperativ Singular=",gf + einE,schieb);
    if (einE == '') {
     lines[i] = fillParam(lines[i],"|Imperativ Singular*=",gf + 'e',schieb);
    }
    lines[i] = fillParam(lines[i],"|Imperativ Plural=",gf + einE + 't',schieb);
    lines[i] = fillParam(lines[i],"|Partizip II=",'ge' + gf + einE + 't',schieb);
  }

  text = lines.join("\n");
  return externalText(text);
}


function fillParam(t,p,v,schieb) {
 if (startsWith(t,p)) {
  var a = t.split('=');
  if (schieb == 1) {
   if (contains(a[1],' ')) {
    a[1] = a[1].slice(1) + a[1].slice(0,1);
   } else {
    a[1] = a[1].slice(2) + ' ' + a[1].slice(0,2);
   }
  }
  if (schieb == -1) {
   a[1] = a[1][a[1].length - 1] + a[1].slice(0,a[1].length - 1);
  }
  if (schieb == 0) {
   a[1] = v;
 }
  a[1] = $.trim(a[1]);
  t = a.join('=');
 }
 return t;
}


function warning(lino,msg) {
  this.lino = lino;
  this.msg = msg;
}


// Add warning messages to the node.
function reportWarnings(node,lines,warn,checkdone) {

  var p=node.parentNode;
  var zeile = '<dd>Zeile ';
  var ih = "&nbsp;Anzahl der Warnungen: " + warn.length + "<dl>";

  var n = document.createElement("div");
  if (warn.length > 0) {
    n.setAttribute("style", "background-color:#FFE0E0");
  } else {
    n.setAttribute("style", "background-color:#E0FFE0");
  }

  for (var i=0;i<warn.length;i++) {
    ih += "<dt>&nbsp;"+(i+1) + ": "+warn[i].msg+"</dt>";
    var lino = warn[i].lino;
    if (lino < -1) { ;
    }else if (lino == -1) {
      ih += zeile +"?: unbekannt</dd>";
    }else{
      ih += zeile +lino+": "+maskff(lines[lino])+"</dd>";
    }
  }
  ih += "</dl>";
  n.innerHTML = ih;

  p.insertBefore(n,p.firstChild);

  var h=document.createElement("h2");
  h.setAttribute("id", "cp-head");
  h.style.background = "none";

  var txt="Checkpage: ";
  if (checkdone[0]) {
    txt+="Klammern";
  }
  if (checkdone[1]) {
    txt+=", Kapitelstruktur";
  }
  if (checkdone[2]) {
    txt+=", Abschnitte";
  }
  if (checkdone[3]) {
    txt+="Reime";
  }
  txt+=" geprüft.";

  h.appendChild(document.createTextNode(txt));
  p.insertBefore(h,p.firstChild);

  createLink(false,"sonstiges",
    "stapel","",
    "spr", "",
    "sim","",
    "akt","",
    "reimen", "",
    "sorttrans", "Wechselt zum Bearbeiten-Modus: ",
    "sonst", "",
    "reim", "Reimlink ergänzen: "
  );

  createLinkLang(true,"Weißrussisch");
  createLinkLang(true,"Ukrainisch");
  createLinkLang(true,"Russisch");
  createLinkLang(true,"Polnisch");
  createLinkLang(true,"Obersorbisch");
  createLinkLang(true,"Niedersorbisch");
  createLinkLang(true,"Italienisch");
  createLinkLang(true,"Französisch");
  createLinkLang(true,"Esperanto");
  createLinkLang(true,"Englisch");

  createLink(true,"Deutsch",
    "ls", "Nur für Experten! Lautschrift aus bekannten Wörtern ergänzen: ",
    "erg", "Flektierte Form aus Grundform ergänzen: ",
    "vform", "Verkleinerungsform anlegen (Nachbearbeitung nötig!): ",
    "wform", "Weibliche Wortform anlegen (Nachbearbeitung nötig!): ",
    "wbform", "Wortbildung anlegen (Nachbearbeitung nötig!): ",
    "p1form-anl", "Partizip I Formen anlegen (Sind die Verbaladjektive nicht bildbar, ergänze auf der Flexionsseite: „VA Partizip I=0“): ",
    "p2form-anl", "Partizip II Formen anlegen (Sind die Verbaladjektive nicht bildbar, ergänze auf der Flexionsseite: „VA Partizip II=0“): ",
    "gvform-anl", "Gerundivumformen anlegen (Sind die Verbaladjektive nicht bildbar, ergänze auf der Flexionsseite: „gerund=0“): ",
    "fform-anl",  "Flektierte Formen anlegen: ",
    "posform-anl", "Positivformen anlegen: ",
    "komform-anl", "Komparativformen anlegen: ",
    "supform-anl", "Superlativformen anlegen: ",
    "p1form-anz", "Partizip I Formen anzeigen: ",
    "p2form-anz", "Partizip II Formen anzeigen: ",
    "gvform-anz", "Gerundivumformen anzeigen: ",
    "fform-anz",  "Flektierte Formen anzeigen: ",
    "posform-anz", "Positivformen anzeigen: ",
    "komform-anz", "Komparativformen anzeigen: ",
    "supform-anz", "Superlativformen anzeigen: ",
    "sform-anl",  "Schweizer Form anlegen: ",
    "sform-anz",  "Schweizer Form anzeigen: ",
    "fform-akt",  "Flektierte Form aktualisieren (Mit '×' markierte Bestandteile werden nicht aktualisiert): ",
    "fform-reim",  "Flektierte Formen reimen. Neue Reimseiten nur anlegen, wenn ein weiterer Reim existiert! "
  );

}


function createLinkLang(hdr,lang) {
  createLink(hdr,lang,
    "fform-anl", "Flektierte Form anlegen: ",
    "fform-anz", "Flektierte Form anzeigen: "
  );
}


function createLink(hdr,lang) {

 var h=document.createElement("dl");
 h.setAttribute("id", "cp-"+lang);
 h.setAttribute("style", "display:none");
 h.innerHTML = "<dt>"+lang+":</dt>";
 $("#cp-head").next().after(h);

 if (hdr) {
  for (var i=0;i<sections.length;i++) {
   var si=sections[i];
   for (var j=0;j<si.child.length;j++) {
    var sj=si.child[j];
    if (contains(sj.head,"|"+lang+"}")) {
     var hdrid = ""+i+"-"+j;
     var n = newNodeDDH(h,lang,sj.head,hdrid);
 var g=document.createElement("dl");
n.appendChild(g);
     for (var k=2;k<arguments.length;k=k+2) {
      newNodeDD(g,lang,arguments[k],arguments[k+1],hdrid);
     }
    }
   }
  }
 } else {
  for (var k=2;k<arguments.length;k=k+2) {
   newNodeDD(h,lang,arguments[k],arguments[k+1],"");
  }
 }
}


function newNodeDDH(n,lang,head,headid) {
 var h = document.createElement("dd");
 h.setAttribute("id", "cp-"+lang+"-"+headid);
 h.setAttribute("style", "display:none;font-weight:bold");
 h.innerHTML = head;
 n.appendChild(h);
 return h;
}


function newNodeDD(n,lang,id,txt,headid) {
 var h = document.createElement("dd");
 h.setAttribute("id", "cp-"+lang+"-"+headid+"-"+id);
 h.setAttribute("style", "display:none;font-weight:normal");
 h.innerHTML = txt;
 n.appendChild(h);
}


function maskff(str) {
 return '<span style="font-family:monospace;font-size:9pt">'+mask(str)+"</span>";
}

function mask(str) {
 if (str) {
  str = str.replace(/&/g ,"&amp;");
  str = str.replace(/</g ,"&lt;");
  return str.replace(/>/g ,"&gt;");
 }
 return str;
}


var tokens = [];

function tok(typ,val) {
  this.typ=typ;
  this.val=val;
}


function braceline(brace,line) {
  this.brace = brace;
  this.line = line;
}


// Check the nesting of braces
function analyzeBraces(text,warn)
{
  var level = 0;
  var k = [];
  var lino = 0;
  var i=0;

  for (i=0; i<text.length;i++) {
    var c = text.charAt(i);

    if (c == '\n') {
      lino++;
    }

    if (c == '[' || c == '{') {
      k[level++] = new braceline(c,lino);
    }
    
    if (c == ']') {
      level--;
      if (level < 0 || k[level].brace != '[') {
        warn.push(new warning(lino,"Klammerung - ]"));
        level=Math.max(0,level);
      }
    }
    if (c == '}') {
      level--;
      if (level < 0 || k[level].brace != '{') {
        warn.push(new warning(lino,"Klammerung - }"));
        level=Math.max(0,level);
      }
    }
  }
  for (i=0; i<level;i++) {
    warn.push(new warning(k[i].line,"Klammerung - offene Klammer: " + k[i].brace));
  }
  
}


function analyzeSections(lvl,title,warn){
 var i,j,si,sj,w=[];
 for(i=1;i<lvl.length;i++){
  si=lvl[i];
  parseWiki(si.head,si.ht,true,w);
  for(j=1;j<si.child.length;j++){
   sj=si.child[j];
   parseWiki(sj.head,sj.ht,true,w);
   parseWiki(sj.text,sj.tt,true,w);
   if (contains(si.head,"{{Sprache|Deutsch}}")) {
    if (config("LautschriftVorschlagen")) {
     analyzeLautschrift(sj.tt,title,warn);
    }
   }
  }
 }
}


function buildSections(txt){
 var s=buildSection(txt,"==");
 var i=0;
 for(i=0;i<s.length;i++){
  s[i].child=buildSection(s[i].text,"===");
 }
 return s;
}


function level(h,t){
 this.head=h; //header ==,=== ohne LF
 this.text=t;
 this.ht=[];  //head templates
 this.tt=[];  //text templates
 this.child=[]; //stufe 3
 this.flexion={}; //flektierte Formen
}


// txt.split(/\n(==[^=\n]+[^=\n]==)\n/) funktioniert nicht,
// wenn zwei == Überschriften direkt aufeinander folgen.
function buildSection(txt,h)
{
 var i=0,j,pos=0,
  s2=[],
  hdr='\n'+h,
  len=hdr.length,
  head='';

 while (i>=0) {
  i = txt.indexOf(hdr,i);
  if (i>=0) {
   if (txt.length >= i+len && txt[i+len] != '=' && txt[i+len] != '\n'){
    j = txt.indexOf("\n",i+len);
    if (j>=0 && containsAt(txt,h,j-len+1) && txt[j-len] != '='){
     s2.push(new level(head,txt.substring(pos,i+1)));
     head = txt.substring(i+1,j);
     i = j-1;
     pos = j;
    }
   }
   i++;
  }
 }
 s2.push(new level(head,txt.substring(pos)));
 return s2;
}


function part(type,begin) {
  this.type = type;
  this.begin = begin;
}


// build Structure
function buildStructure(lines)
{
  var i = 0;
  var ar = [];

  while (i < lines.length) {

    var line = trimEnd(lines[i]);
    if (line.length > 0) {
      if (line.charAt(0) == '=') {
        if (endsWith(line,"=")) {
          if (startsWith(line,"======") && endsWith(line,"======")) {
            ;
          } else if (startsWith(line,"=====") && endsWith(line,"=====")) {
            ;
          } else if (startsWith(line,"====") && endsWith(line,"====")) {
            ;
          } else if (startsWith(line,"===") && endsWith(line,"===")) {
            ar.push(new part('3',i));
          } else if (startsWith(line,"==") && endsWith(line,"==")) {
            ar.push(new part('2',i));
          } else {
            ar.push(new part('1',i));
          }
        }
      } else {
        if (contains(line,"{{Alte Schreibweise|")) {
          ar.push(new part('S',i));
        } else if (contains(line,"{{Schweizer und Liechtensteiner Schreibweise|")) {
          ar.push(new part('S',i));
        } else if (contains(line,"{{Ähnlichkeiten}}")) {
          ar.push(new part('E',i));
        }
      }
    }
    // Prolog vor erster Überschrift
    if (ar.length == 0) {
      ar.push(new part('P',i));
    }
    i++;
  }

  // Ende marker
  ar.push(new part('X',lines.length));
  return ar;

}


// check Structure
function checkStructure(parts,warn)
{
  var ks = 1; // kapitelstruktur
  var i=0;
  
  for (i=0;i<parts.length;i++) {
    var key = parts[i].type;
    var lino = parts[i].begin;

    if (key == 'X') { // Ende
      return;
    }

    switch (ks) {
      case 1: // Beginn
        switch (key) {
          case 'P': ks = 1;
            break;
          case '2': ks = 2;
            break;
          default:
            warn.push(new warning(lino,"Kapitelstruktur - erwartet: (==)"));
        }
        break;
      case 2: // nach ==
        switch (key) {
          case '3':
          case 'S': ks = 3;
            break;
          default:
            warn.push(new warning(lino,"Kapitelstruktur - erwartet: (===)"));
        }
        break;
      case 3: // nach ===
        switch (key) {
          case '2': ks = 2;
            break;
          case '3': ks = 3;
            break;
          case '4': ks = 4;
            break;
          case 'E': ks = 5;
            break;
          case 'S':
            break;
          default:
            warn.push(new warning(lino,"Kapitelstruktur - erwartet: (====) oder {{Ähnlichkeiten}}"));
        }
      
        break;
      case 4:  // nach ====
        switch (key) {
          case '2': ks = 2;
            break;
          case '3': ks = 3;
            break;
          case '4': ks = 4;
            break;
          case 'E': ks = 5;
            break;
          default:
            warn.push(new warning(lino,"Kapitelstruktur - erwartet: (====) oder {{Ähnlichkeiten}}"));
        }
        break;
      case 5:  // nach Ähnlichkeiten
          warn.push(new warning(lino,"Kapitelstruktur - nach {{Ähnlichkeiten}} erwartet: Nichts"));
        break;
   
      default:
          warn.push(new warning(lino,"Kapitelstruktur - interner Fehler"));
    }
  }
}

// check Chapters
function checkChapters(parts,lines,warn,checkdone)
{
  var i=0;

  for (i=0;i<parts.length;i++) {
    if (parts[i].type != 'X') {
     checkSofthyphen(lines,warn,parts[i].begin+1,parts[i+1].begin);
    }
    //partial edit
    var transOnly = parts[i].type == 'P' && contains(lines[parts[i].begin+1],"Übersetzung");
    // for now restricted to german entries

    if (parts[i].type == '3' || transOnly) {
      if (transOnly || contains(lines[parts[i].begin],"{{Wortart|")) {
        checkChapterOrder(lines,warn,parts[i].begin+1,parts[i+1].begin);
        checkUeTab(lines,warn,parts[i].begin+1,parts[i+1].begin);
        checkdone[2]=true;
      }
    }
  }
}




function wpState() {
  this.pos=0;
  this.txt="";
  this.head=0;
  this.nesting = 0;
  this.equal = 0;
}


function clearText(state,tokens,token) {
  if(state.txt.length > 0) {
    tokens.push(new tok ("TX",state.txt));
    state.txt = "";
  }
  if(token.length>0) {
    tokens.push(new tok (token,""));
  }
}

function incPosHead(state,tokens,pos,token) {
  clearText(state,tokens,token);
  state.pos += pos;
  state.head = pos;
}

function incPosNest(state,tokens,pos,token) {
  clearText(state,tokens,token);
  state.pos += pos;
  state.nesting += pos;
}

function decPosNest(state,tokens,pos,token) {
  clearText(state,tokens,token);
  state.pos += pos;
  state.nesting=Math.max(0,state.nesting-pos);
  if (state.nesting==0) {
    state.equal=0;
  }
}

function incPos(state,tokens,pos,token) {
  clearText(state,tokens,token);
  state.pos += pos;
}


// check Ü-Tabelle
function checkUeTab(lines,warn,from,to)
{
 var li = 0;
 var lino;
 var line = "";
 var status = "";

 for (lino = from; lino < to; lino++) {
  line = lines[lino];

  if ((status == "L" || status == "R") && !(startsWith(line,"*") || startsWith(line,":"))) {
   if (line == "|Ü-rechts=") {
    status = "R";
   } else {
    status = "";
    checkTransOrder(lines,warn,li+1,lino);
    checkScript(lines,warn,li+1,lino);
   }
  }

  if (startsWith(line,"{{Ü-Tabelle")) {
   status = "T";
  }
  if (status == "T" && (endsWith(line,"|Ü-links=") || endsWith(line,"|Ü-Liste="))) {
   li = lino;
   status = "L";
  }

 }
}


// check Chapter Order
function checkChapterOrder(lines,warn,from,to)
{
 var lastOrder = -1;
 var chapterName = "";
 var lino;
 var line = "";
 var order = 0;
 var sorted = true;

 for (lino = from; lino < to; lino++) {
  line = lines[lino];
  if (line.length > 0 && (line.charAt(0) == '{' || line.charAt(0) == '=' )) {
   order = nextChapter(order,line);
   if (order > 0) {
    if (lastOrder < order) {
     lastOrder = order;
    } else {
     sorted = false;
     warn.push (new warning(lino,"Reihenfolge - bei "+chapterName+"/"+line));
    }
    chapterName = line;
   }
  }
 }

 if (!sorted && doSortCh) {
  sortChapterLines(lines,from,to);
 }
}


// check Softhyphen
function checkSofthyphen(lines,warn,from,to)
{
 var chapterBsp = chapterOrder("{{Beispiele}}");
 var lino;
 var line = "";
 var chapter = 0;

 for (lino = from; lino < to; lino++) {
  line = lines[lino];
  if (line.length > 0) {
   chapter = nextChapter(chapter,line);
   if (chapter != chapterBsp) {
    if (contains(line,'\u00ad')) {
     warn.push (new warning(lino,"Softhyphen (weiches Trennzeichen) gefunden: "
      + line.replace(/\u00ad/g,'-')));
    }
   }
  }
 }

}


function nextChapter(chapter,line) {
 if (line.charAt(0) == '{' || line.charAt(0) == '=' ) {
  if (startsWith(line,"====") && contains(line,"Übersetzungen")) {
   //Pseudoabschnitt Übersetzungen
   chapter = chapterOrder("{{Übersetzungen}}");
  } else {
   chapter = chapterOrder(line);
  }
 }
 return chapter;
}


function sortChapterLines(lines,from,to)
{
 var lino;
 var line = "";
 var order = 0;
 var key = 100;
 var sorta = [];
 var tabstart = chapterOrder("{{Übersetzungen}}");
 var tabrechts = chapterOrder("{{Ü-rechts}}");

 for (lino = from; lino < to; lino++) {
  line = lines[lino];
  if (line.length > 0 && (line.charAt(0) == '{' || line.charAt(0) == '=' )) {
   if (startsWith(line,"====") && contains(line,"Übersetzungen")) {
    //Pseudoabschnitt Übersetzungen
    order = tabstart;
   } else {
    order = chapterOrder(line);
   }
   if (order > 0) {
    if (order >= tabstart && order <= tabrechts) { //Ü-Tab nicht sort.
     key = 100 + tabstart;
    }else{
     key = 100 + order;
    }
   }
  }
  sorta.push(key + "%%" + (10000 + lino));
 }

 sorta.sort();

 var sl;
 var lii=from;
 for (lino = 0; lino < sorta.length; lino++) {
  sl = sorta[lino].split(/%%/);
  reorder[parseInt(sl[1],10)-10000]=lii++;
 }

}


// sort translations
function sortTransLines(lines,from,to,lc)
{

  var lino;
  var line = "";
  var lcs =[]; // langcode
  var item;
  var sorta =[];
  var lastp ="";
  var pre="";
  var prel="";
  var abst=-1;
  var i=0;
  var p=0;

  for (lino = from; lino < to; lino++) {
    line = lines[lino];

    if(startsWith(line,"**{{")||startsWith(line,":*{{")||startsWith(line,"*:{{")){
      lcs = getLcs(line);
      if(lc[lcs[0]]) {
        item = lc[lcs[0]].name;
        pre=lastp+"%2";
      }else{
        if(doSort){alert("Sortieren nicht möglich wegen Zeile: "+line);}
        canSort=false;
        return;
      }
    } else if(startsWith(line,"*{{")){
      lcs = getLcs(line);
      if(lc[lcs[0]]) {
        item = lc[lcs[0]].name;
        pre=item+"%1";
        lastp =item;
      }else{
        if(doSort){alert("Sortieren nicht möglich wegen Zeile: "+line);}
        canSort=false;
        return;
      }
    } else if(startsWith(line,"**")||startsWith(line,":*")||startsWith(line,"*:")){
      p=line.indexOf(":",2);
      if (p>2){
        item = line.substring(2,p);
      }else{
        item = line.substring(2);
      }
      pre=lastp+"%2";
    } else if(startsWith(line,"*")){
      p=line.indexOf(":",2);
      if (p>1){
        item = line.substring(1,p);
      }else{
        item = line.substring(1);
      }
      pre=item+"%1";
      lastp =item;
    }
    prel=pre.toLowerCase();

    prel=prel.replace(/ä/g,"a");
    prel=prel.replace(/ö/g,"o");
    prel=prel.replace(/ü/g,"u");
    prel=prel.replace(/ß/g,"s");
    if(line == "|Ü-rechts="){
      abst=lino;
    }else{
      sorta[i++] = prel+pre+"%%"+lino;
    }
  }
  canSort=true;

  if(doSort) {
    sorta.sort();

    var sl;
    var lii=from;
    for (lino = 0; lino < sorta.length; lino++) {
      sl = sorta[lino].split(/%%/);
      if (lino >= Math.floor((to-from)/2)){
        if (abst >= 0) {
          if(lino == sorta.length-1){
            reorder[abst] = lii++;
            abst = -1;
          } else {
            if (contains(sorta[lino],"%1%%")){ //geschachtelte Sprachen nicht trennen
              reorder[abst]=lii++;
              abst = -1;
            }
          }
        }
      }
      reorder[parseInt(sl[1],10)]=lii++;
    }
  }
}


function getLcs(line)
{
  var r=["", ""];
  var i=0;
  var j=0;
  var k=0;
  var li="";
  i=line.indexOf("{{");
  j=line.indexOf("}}");
  if(i>0 && j>0){
    li= line.substring(i+2,j);
    k = li.indexOf('|');
    if (k >= 0) {
      r[1]=li.substring(k+1);
      r[0]=li.substring(0,k);
    }else{
      r[0]=li;
    }
  }
  return r;
}


// check Script kyrillisch/lateinisch
function checkScript(lines,warn,from,to)
{
  var trans = [];
  var msg = 'Übersetzung - Zeichensatzmix aus <span style="background:yellow">kyrillisch</span>/<span style="background:cyan">lateinisch</span>: ';
  for (var lino = from; lino < to; lino++) {
    var line = lines[lino];
    if (line.length > 0 && startsWith(line,"*")) {
      trans = getTrans(line);
      for (var i = 0; i < trans.length; i++) {
        var parts = trans[i].split('|');
        if (parts.length > 2) {
          if (checkScript0(parts[2])) {
            warn.push (new warning(lino,msg + makeScript0(parts[2])));
          }
        }
        if (parts.length > 3) {
          if (checkScript0(parts[3])) {
            warn.push (new warning(lino,msg + makeScript0(parts[3])));
          }
        }
      }
    }
  }
}


function checkScript0(txt) {
  var kyr = false;
  var lat = false;
  var mix = [0,0];
  for (var i = 0; i < txt.length; i++) {
    var chr = txt[i];
    kyr = "АаБбВвГ㥴ЃѓДдЂђЕеЀѐЁёЄєЖжЗзЅѕИиЍѝІіЇїЙйЈјКкЌќЛлЉљМмНнЊњОоПпРрСсТтЋћУуЎўФфХхЦцЧчЏџШшЩщЫыЬьЭэЮюЯя".indexOf(chr) >= 0;
    lat = "abcdefghijklmnopqrstuvwxyzäöüßABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜẞ".indexOf(chr) >= 0;
    if (kyr) mix[0] = 1;
    if (lat) mix[1] = 1;
  }
  return (mix[0] == 1 && mix[1] == 1);
}


function makeScript0(txt) {
  var kyr = false;
  var lat = false;
  var result = '';
  for (var i = 0; i < txt.length; i++) {
    var chr = txt[i];
    kyr = "АаБбВвГ㥴ЃѓДдЂђЕеЀѐЁёЄєЖжЗзЅѕИиЍѝІіЇїЙйЈјКкЌќЛлЉљМмНнЊњОоПпРрСсТтЋћУуЎўФфХхЦцЧчЏџШшЩщЫыЬьЭэЮюЯя".indexOf(chr) >= 0;
    lat = "abcdefghijklmnopqrstuvwxyzäöüßABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜẞ".indexOf(chr) >= 0;
    if (kyr) {
      result += '<span style="background:yellow">' + chr + '</span>';
    } else if (lat) {
      result += '<span style="background:cyan">' + chr + '</span>';
    } else {
      result += chr;
    }
  }
  return result;
}


function getTrans(line) {
  var ar = [];
  var idx1 = line.indexOf("{{Ü");
  var idx2 = line.indexOf("}}",idx1);
  while (idx1 >= 0 && idx2 >= 0) {
    ar.push(line.slice(idx1 + 2, idx2));
    idx1 = line.indexOf("{{Ü",idx2);
    idx2 = line.indexOf("}}",idx1);
  }
  return ar;
}


// check translation order
function checkTransOrder(lines,warn,from,to)
{
  var currorder = -1;
  var currlc = "";
  var lino;
  var line = "";
  var lcs = []; // lang code
  var lc = createSk();
  var item;
  var ums="";
  var p1;
  var k2;
  var found=false;

  for (lino = from; lino < to; lino++) {
    line = lines[lino];
    if (line.length > 0 && startsWith(line,"*{{")) {
      lcs = getLcs(line);
      if (lcs[1].length > 0 && lcs[1] != "ALA-LC" && lcs[1] != "CHA" && lcs[1] != "DMG"
         && lcs[1] != "Hepburn" && lcs[1] != "ISO 9" && lcs[1] != "iU" && lcs[1] != "KNAB"
         && lcs[1] != "RR" && lcs[1] != "YIVO") {
        warn.push (new warning(lino,"Übersetzung - Umschrift nicht bekannt: "+lcs[1]));
      }
      item = lc[lcs[0]];
      if (item) {

        if (item.order > 0) {
          if (currorder > item.order) {
            warn.push (new warning(lino,"Reihenfolge Übersetzung - bei {{"+currlc+"}} "+lc[currlc].name+" und {{"+lcs[0]+"}} "+lc[lcs[0]].name));
            found=true;
          } else {
            currorder = item.order;
            currlc = lcs[0];
          }
        }

        // prüfe sprachkürzel
        if (lcs[0] == "zh-cn" || lcs[0] == "zh-tw") {
          continue;
        }

        var re = /\{\{Üx*\|[A-Za-z\-]+\|/
        var alc = re.exec(line)
        if (alc) {
          for (var i=0;i<alc.length;i++) {
            var str = alc[i];
            var lci = str.substring(str.indexOf('|')+1,str.length-1);
            if (lci != lcs[0]) {
              warn.push (new warning(lino,"Übersetzung - Sprachkürzel abweichend: {{"+ lcs[0]+"}}: {{Ü |"+lci+"|"));
            }
          }
        }

      } else {
        warn.push (new warning(lino,"Übersetzung - Sprachkürzel unbekannt: "+ lcs[0]));
      }
    }
  }

  if (found) {
    sortTransLines(lines,from,to,lc);
  }
}


// Sprachkürzel Sortierinfo
function sk(order,name) {
  this.order = order;
  this.name = name;
}


function addSk(a,lc,name) {
 a[lc]= new sk(a.counter++,name);
}


function createSk() {

 var ska = [
"abq","Abasinisch",
"ab", "Abchasisch",
"ace","Acehnesisch",
"ady","Adygeisch",
"aa", "Afar",
"af", "Afrikaans",
"egy","Ägyptisch",
"arz","Ägyptisch-Arabisch",
"ain","Ainu",
"ak", "Akan",
"akk","Akkadisch",
"akz","Alabama",
"sq", "Albanisch",
"als","Alemannisch",
"ale","Aleutisch",
"arq","Algerisch-Arabisch",
"alq","Algonkin",
"alt","Altaisch",
"xcl","Altarmenisch",
"obt","Altbretonisch",
"ang","Altenglisch",
"frk","Altfränkisch",
"fro","Altfranzösisch",
"ofs","Altfriesisch",
"oge","Altgeorgisch",
"grc","Altgriechisch",
"goh","Althochdeutsch",
"sga","Altirisch",
"cu", "Altkirchenslawisch",
"oco","Altkornisch",
"omr","Altmarathi",
"odt","Altniederländisch",
"non","Altnordisch",
"nrf","Altnormannisch",
"orv","Altostslawisch",
"peo","Altpersisch",
"bat","Altpreußisch",
"pro","Altprovenzalisch/Altokzitanisch",
"osx","Altsächsisch",
"otk","Alttürkisch",
"owl","Altwalisisch",
"alp","Alune",
"ems","Alutiiq",
"aie","Amara",
"amk","Ambai",
"am", "Amharisch",
"ami","Amisisch",
"amu","Amuzgo",
"akg","Anakalangu",
"xaa","Andalusisches Arabisch",
"xno","Anglonormannisch",
"acf","Antillen-Kreolisch",
"aud","Anutisch",
"xae","Äquisch",
"ar", "Arabisch",
"an", "Aragonesisch",
"arc","Aramäisch",
"arw","Arawak",
"aae","Arbëresh",
"agj","Argobba",
"agf","Arguni",
"ari","Arikara",
"hy", "Armenisch",
"rup","Aromunisch",
"aat","Arvanitika",
"az", "Aserbaidschanisch",
"as", "Assamesisch",
"asb","Assiniboine",
"ast","Asturisch",
"aua","Asumboa",
"tay","Atayal",
"ae", "Avestisch",
"av", "Awarisch",
"ay", "Aymara",
"baa","Babatana",
"bzg","Babuza",
"bde","Bade",
"bar","Bairisch",
"xbc","Baktrisch",
"ban","Balinesisch",
"bm", "Bambara",
"bnd","Banda",
"bmg","Bangi",
"bjn","Banjar",
"bcm","Banoni",
"ba", "Baschkirisch",
"eu", "Baskisch",
"bbc","Batak Toba",
"sne","Bau Bidayuh",
"bci","Baule",
"bal","Belutschi",
"bem","Bemba",
"bn", "Bengalisch",
"ber","Berbersprache",
"bho","Bhojpuri",
"bhw","Biak",
"bh", "Bihari",
"my", "Birmanisch",
"bpy","Bishnupriya",
"bi", "Bislama",
"bla","Blackfoot",
"bty","Bobot",
"nb", "Bokmål",
"bol","Bole",
"bs", "Bosnisch",
"brh","Brahui",
"br", "Bretonisch",
"bug","Buginesisch",
"bg", "Bulgarisch",
"bua","Burjatisch",
"rmq","Caló",
"sro","Campinadesisches Sardisch",
"chc","Catawba",
"cay","Cayuga",
"ceb","Cebuano",
"kjh","Chakassisch",
"ccc","Chamicuro",
"ch", "Chamorro",
"kca","Chantisch",
"chr","Cherokee",
"chy","Cheyenne",
"ny", "Chichewa",
"cic","Chickasaw",
"kjj","Chinalugisch",
"zh", "Chinesisch",
"zh-tw","Chinesisch (traditionell)",
"zh-cn","Chinesisch (vereinfacht)",
"chp","Chipewyan",
"ciw","Chippewa",
"cho","Choctaw",
"com","Comanche",
"cr", "Cree",
"mus","Creek",
"cro","Crow",
"quz","Cusco-Quechua",
"dag","Dagbani",
"dak","Dakota",
"dlm","Dalmatisch",
"da", "Dänisch",
"prs","Dari",
"dhv","Dehu",
"ddn","Dendi",
"de", "Deutsch",
"diq","Dimli",
"dob","Dobu",
"nic","Dogon",
"dgl","Dongolawi",
"dng","Dunganisch",
"dbp","Duwai",
"dz", "Dzongkha",
"egl","Emilianisch",
"en", "Englisch",
"myv","Ersja",
"qka","Erzgebirgisch",
"eo", "Esperanto",
"et", "Estnisch",
"ee", "Ewe",
"ext","Extremadurisch",
"xfa","Faliskisch",
"fng","Fanagalo",
"fan","Fang",
"fo", "Färöisch",
"fj", "Fidschi",
"hif","Fiji Hindi",
"fi", "Finnisch",
"nld","Flämisch",
"fon","Fon",
"sac","Fox",
"frp","Frankoprovenzalisch",
"fr", "Französisch",
"fur","Friaulisch",
"ff", "Fulfulde",
"fud","Futunisch",
"gag","Gagausisch",
"xga","Galatisch",
"gl", "Galicisch",
"xtg","Gallisch",
"gan","Gan",
"gay","Gayo",
"aln","Gegisch",
"ka", "Georgisch",
"gez","Ge\u2019ez",
"gha","Ghadames",
"shv","Gibb\u0101li",
"glk","Gilaki",
"gil","Gilbertesisch",
"hac","Gorani",
"got","Gotisch",
"gr", "Griechisch",
"el", "Griechisch (Neu-)",
"kl", "Grönländisch",
"gcf","Guadeloupe-Kreolisch",
"gnc","Guanche",
"gn", "Guaraní",
"ngu","Guerrero-Nahuatl",
"pov","Guineabissauisches Kreol",
"gu", "Gujarati",
"guw","Gun",
"sgw","Gurage",
"ht", "Haitianisch",
"hak","Hakka",
"bgc","Haryanvi",
"ha", "Hausa",
"haw","Hawaiianisch",
"he", "Hebräisch",
"hit","Hethitisch",
"hid","Hidatsa",
"acw","Hijazi-Arabisch",
"hil","Hiligaynon",
"hi", "Hindi",
"ho", "Hiri Motu",
"mww","Hmong Daw",
"hop","Hopi",
"nhe","Huastekisches Ost-Nahuatl",
"nhw","Huastekisches West-Nahuatl",
"nch","Huastekisches Zentral-Nahuatl",
"xhu","Hurritisch",
"iba","Iban",
"io", "Ido",
"ig", "Igbo",
"ilo","Ilokano",
"smn","Inarisamisch",
"ine","Indogermanisch",
"id", "Indonesisch",
"inh","Inguschisch",
"ia", "Interlingua",
"ie", "Interlingue",
"ikt","Inuinnaqtun",
"iu", "Inuktitut",
"ik", "Inupiaq",
"iow","Iowa-Oto",
"ga", "Irisch",
"izh","Ischorisch",
"xh", "isiXhosa",
"zu", "isiZulu",
"is", "Isländisch",
"zai","Isthmus-Zapotekisch",
"ist","Istriotisch",
"ruo","Istrorumänisch",
"it", "Italienisch",
"itl","Itelmenisch",
"sah","Jakutisch",
"jam","Jamaika-Kreolisch",
"ja", "Japanisch",
"jv", "Javanisch",
"yi", "Jiddisch",
"jrb","Judäo-Arabisch",
"itk","Judäo-Italienisch",
"kbd","Kabardinisch",
"kab","Kabylisch",
"xal","Kalmückisch",
"kn", "Kannada",
"ksk","Kansa",
"yue","Kantonesisch",
"kr", "Kanuri",
"pam","Kapampangan",
"kpg","Kapingamarangi",
"kea","Kapverdisches Kreol",
"kdr","Karaimisch",
"kaa","Karakalpakisch",
"krc","Karatschai-Balkarisch",
"kai","Karekare",
"krl","Karelisch",
"hns","Karibisches Hindustani",
"kyh","Karok",
"rue","Karpato-Russinisch",
"kk", "Kasachisch",
"csb","Kaschubisch",
"ks", "Kashmiri",
"ca", "Katalanisch",
"kaw","Kawi",
"cel","Keltisch",
"km", "Khmer",
"khw","Khowar",
"kic","Kickapoo",
"kam","Kikamba",
"kg", "Kikongo",
"ki", "Kikuyu",
"sjd","Kildinsamisch",
"klb","Kiliwa",
"rw", "Kinyarwanda",
"ky", "Kirgisisch",
"rn", "Kirundi",
"kla","Klamath",
"KA", "klassisches Arabisch",
"myz","klassisches Mandäisch",
"nci","Klassisches Nahuatl",
"tlh","Klingonisch",
"ksh","Kölsch",
"kv", "Komi",
"koi","Komi-Permjakisch",
"swb","Komorisch",
"kok","Konkani",
"cop","Koptisch",
"ko", "Koreanisch",
"kw", "Kornisch",
"co", "Korsisch",
"kos","Kosraeanisch",
"avk","Kotava",
"crh","Krimtatarisch",
"hr", "Kroatisch",
"kj", "Kuanyama",
"kum","Kumükisch",
"ku", "Kurdisch",
"kmr","Kurmandschi",
"fkv","Kvenisch",
"ldn","Láadan",
"lld","Ladinisch",
"lad","Ladino",
"lbe","Lakisch",
"lkt","Lakota",
"lo", "Laotisch",
"lzz","Lasisch",
"la", "Latein",
"lvk","Lavukaleve",
"lep","Lepcha",
"lez","Lesgisch",
"ltg","Lettgallisch",
"lv", "Lettisch",
"apc","Levantinisches Arabisch",
"ayl","Libysch-Arabisch",
"lij","Ligurisch",
"li", "Limburgisch",
"ln", "Lingala",
"lt", "Litauisch",
"liv","Livisch",
"src","Logudoresisch",
"jbo","Lojban",
"lmo","Lombardisch",
"lou","Louisiana-Kreolisch",
"lud","Lüdisch",
"lg", "Luganda",
"xlu","Luwisch",
"lb", "Luxemburgisch",
"xld","Lydisch",
"xlc","Lykisch",
"mas","Maa",
"mg", "Madagassisch",
"mad","Maduresisch",
"mak","Makassar",
"ms", "Malaiisch",
"ml", "Malayalam",
"pqm","Malecite-Passamaquoddy",
"dv", "Maledivisch",
"mt", "Maltesisch",
"cmn","Mandarin",
"mnk","Mandinka",
"mnc","Mandschurisch",
"mrv","Mangarevanisch",
"xmn","Manichäisch",
"msk","Mansaka",
"mns","Mansisch",
"gv", "Manx",
"mi", "Maori",
"arn","Mapudungun",
"mrw","Maranao",
"mr", "Marathi",
"chm","Mari",
"ary","Marokkanisch-Arabisch",
"umc","Marrukinisch",
"mh", "Marshallesisch",
"ims","Marsisch",
"mzn","Masanderanisch",
"myn","Maya-Sprache",
"yua","Mayathan",
"mk", "Mazedonisch",
"nhx","Mecayapan-Nahuatl",
"ruq","Meglenorumänisch",
"gdq","Mehri",
"ote","Mezquital-Otomi",
"mia","Miami-Illinois",
"mic","Micmac",
"cdo","Min Dong",
"nan","Min Nan",
"min","Minangkabau",
"xmf","Mingrelisch",
"mwl","Mirandés",
"xbm","Mittelbretonisch",
"enm","Mittelenglisch",
"frm","Mittelfranzösisch",
"gmh","Mittelhochdeutsch",
"mga","Mittelirisch",
"cnx","Mittelkornisch",
"gml","Mittelniederdeutsch",
"dum","Mittelniederländisch",
"wlm","Mittelwalisisch",
"mxt","Mixtekisch",
"lus","Mizo",
"MHA","modernes Hocharabisch",
"mid","modernes Mandäisch",
"moh","Mohawk",
"xpq","Mohegan-Pequot",
"mjy","Mohican",
"mdf","Mokscha",
"mnw","Mon",
"mn", "Mongolisch",
"mfe","Morisien",
"mxi","Mozarabisch",
"umu","Munsee",
"gmy","Mykenisch",
"nqo","N'Ko",
"nah","Nahuatl",
"naq","Nama",
"nrm","Narom",
"na", "Nauruisch",
"nv", "Navajo",
"ng", "Ndonga",
"nap","Neapolitanisch",
"ne", "Nepalesisch",
"new","Newari",
"nez","Nez Perce",
"nbh","Ngamo",
"ngi","Ngizim",
"ngo","Ngoni",
"nds","Niederdeutsch",
"nl", "Niederländisch",
"dsb","Niedersorbisch",
"niu","Niueanisch",
"nog","Nogaisch",
"llp","Nord-Efate",
"nd", "Nord-Ndebele",
"nso","Nord-Sotho",
"atv","Nordaltaisch",
"azj","Nordaserbaidschanisch",
"frr","Nordfriesisch",
"se", "Nordsamisch",
"nrn","Norn",
"no", "Norwegisch",
"nov","Novial",
"nup","Nupe",
"nn", "Nynorsk",
"nzd","Nzadi",
"ood","O'odham",
"hsb","Obersorbisch",
"oj", "Ojibwe",
"oc", "Okzitanisch",
"one","Oneida",
"ono","Onondaga",
"or", "Oriya",
"nlv","Orizaba-Nahuatl",
"om", "Oromo",
"osa","Osage",
"osc","Oskisch",
"ota","Osmanisches Türkisch",
"os", "Ossetisch",
"vmf","Ostfränkisch",
"frs","Ostfriesisch",
"cjm","Östliches Cham",
"azd","Östliches Durango-Nahuatl",
"mhr","Ostmari",
"hz", "Otjiherero",
"otw","Ottawa",
"pal","Pahlavi",
"pau","Palauisch",
"pi", "Pali",
"pgn","Pälignisch",
"pa", "Pandschabi",
"pag","Pangasinensisch",
"pap","Papiamentu",
"ps", "Paschtu",
"paw","Pawnee",
"pdc","Pennsylvaniadeutsch",
"fa", "Persisch",
"pfl","Pfälzisch",
"phn","Phönizisch",
"xpg","Phrygisch",
"pms","Piemontesisch",
"pis","Pijin",
"pcd","Pikardisch",
"myp","Pirahã",
"sje","Pitesamisch",
"pih","Pitkern",
"pdt","Plautdietsch",
"pox","Polabisch",
"pl", "Polnisch",
"pnt","Pontisch",
"pt", "Portugiesisch",
"pra","Prakrit",
"pre","Principensisches Kreol",
"prg","Prußisch",
"pkp","Pukapuka",
"pua","Purépecha",
"qua","Quapaw",
"qu", "Quechua",
"raj","Rajasthani",
"rap","Rapanui",
"rm", "Rätoromanisch",
"hrx","Riograndenser Hunsrückisch",
"rhg","Rohingya",
"rom","Romani",
"kwn","RuKwangali",
"ro", "Rumänisch",
"nyn","Runyankore",
"ru", "Russisch",
"bxr","Russisches Burjatisch",
"smi","Sami",
"sm", "Samoanisch",
"sg", "Sango",
"sa", "Sanskrit",
"cri","Saotomensisches Kreol",
"sc", "Sardisch",
"sas","Sasak",
"stq","Saterfriesisch",
"sgs","Schemaitisch",
"shi","Schilh",
"sli","Schlesisch (Deutsch)",
"szl","Schlesisch (Polnisch)",
"cjs","Schorisch",
"gd", "Schottisch-Gälisch",
"swg","Schwäbisch",
"sv", "Schwedisch",
"gsw","Schweizerdeutsch",
"sco","Scots",
"zea","Seeländisch",
"see","Seneca",
"sr", "Serbisch",
"sh", "Serbokroatisch",
"srr","Serer",
"sei","Seri",
"crs","Seselwa",
"st", "Sesotho",
"tn", "Setswana",
"shn","Shan",
"sjw","Shawnee",
"wlc","shiMwali",
"wni","shiNdzuani",
"zdj","shiNgazidja",
"sn", "Shona",
"shh","Shoshone",
"ess","Sibirisch-Yupik",
"scx","Sikulisch",
"loz","Silozi",
"simple","Simple English",
"sjn","Sindarin",
"sd", "Sindhi",
"si", "Singhalesisch",
"ss", "Siswati",
"scn","Sizilianisch",
"sqr","Sizilianisches Arabisch",
"sms","Skoltsamisch",
"sk", "Slowakisch",
"sl", "Slowenisch",
"sla","Slowinzisch",
"sog","Sogdisch",
"so", "Somalisch",
"snk","Soninke",
"sqt","Soqotri",
"ckb","Sorani",
"wen","Sorbisch",
"es", "Spanisch",
"srn","Sranantongo",
"sw", "Suaheli",
"sbs","Subiya",
"erk","Süd-Efate",
"nr", "Süd-Ndebele",
"azb","Südaserbaidschanisch",
"tvk","Südost-Ambrym",
"spx","Südpikenisch",
"sma","Südsamisch",
"suw","Sumbwa",
"sux","Sumerisch",
"su", "Sundanesisch",
"sva","Swanisch",
"syr","Syrisch",
"tg", "Tadschikisch",
"tl", "Tagalog",
"mvv","Tagol Murut",
"tgw","Tagwana",
"ty", "Tahitianisch",
"khb","Tai Lü",
"tnq","Taíno",
"tzl","Talossanisch",
"tmh","Tamaschek",
"tzm","Tamazight",
"ta", "Tamil",
"rif","Tarifit",
"trv","Taroko",
"tt", "Tatarisch",
"tsg","Tausug",
"te", "Telugu",
"nhv","Temascaltepec-Nahuatl",
"nhg","Tetelcingo-Nahuatl",
"tet","Tetum",
"th", "Thai",
"txh","Thrakisch",
"bo", "Tibetisch",
"tig","Tigre",
"ti", "Tigrinya",
"tli","Tlingit",
"tox","Tobianisch",
"xto","Tocharisch A",
"txb","Tocharisch B",
"tpi","Tok Pisin",
"tkl","Tokelauisch",
"tok","Toki Pona",
"to", "Tongaisch",
"trw","Torwali",
"cs", "Tschechisch",
"ce", "Tschetschenisch",
"lua","Tschiluba",
"ckt","Tschuktschisch",
"cv", "Tschuwaschisch",
"ve", "Tshivenda",
"tsi","Tsimshian",
"ctu","Tumbalá-Chol",
"tum","Tumbuka",
"aeb","Tunesisch-Arabisch",
"tpw","Tupí",
"tpn","Tupinambá",
"tr", "Türkisch",
"tk", "Turkmenisch",
"tru","Turoyo",
"tus","Tuscarora",
"tvl","Tuvaluisch",
"tyv","Tuwinisch",
"tw", "Twi",
"tzh","Tzeltal",
"tzo","Tzotzil",
"udm","Udmurtisch",
"uga","Ugaritisch",
"ug", "Uigurisch",
"uk", "Ukrainisch",
"xum","Umbrisch",
"umb","Umbundu",
"sju","Umesamisch",
"unm","Unami",
"hu", "Ungarisch",
"xur","Urartäisch",
"ur", "Urdu",
"gem","Urgermanisch",
"uum","Urum",
"uz", "Usbekisch",
"xve","Venetisch",
"vec","Venezianisch",
"vi", "Vietnamesisch",
"rmy","Vlax",
"vo", "Volapük",
"xvo","Volskisch",
"vro","Võro",
"cy", "Walisisch",
"wa", "Wallonisch",
"war","Waray",
"be", "Weißrussisch",
"vep","Wepsisch",
"zbw","West Berawan",
"abe","West-Abenaki",
"apw","West-Apache",
"mbb","West-Bukidnon",
"pnb","West-Pandschabi",
"wep","Westfälisch",
"vls","Westflämisch",
"fy", "Westfriesisch",
"gmw","Westgermanisch",
"bdr","Westküsten-Bajau",
"cja","Westliches Cham",
"mrj","Westmari",
"wym","Wilmesaurisch",
"wo", "Wolof",
"vot","Wotisch",
"wuu","Wu",
"wyn","Wyandot",
"ts", "Xitsonga",
"nmn","Xóõ",
"yak","Yakima",
"yaq","Yaqui",
"ii", "Yi",
"yo", "Yoruba",
"mpm","Yosondúa-Mixtekisch",
"dje","Zarma",
"zza","Zazaki",
"zen","Zenaga",
"esu","Zentral-Alaska-Yupik",
"bcl","Zentral-Bikolano",
"mel","Zentral-Melanauisch",
"nhn","Zentral-Nahuatl",
"ryu","Zentral-Okinawa",
"tar","Zentral-Tarahumara",
"ncx","Zentrales Puebla-Nahuatl",
"za", "Zhuang",
"cim","Zimbrisch"
];
// 680 Seiten aus Kategorie:Wiktionary:Sprachkürzel


 var a = {counter:1000};
 for (var i = 0; i < ska.length; i++) {
  addSk(a,ska[i*2],ska[i*2+1]);
 }
 return a;
}


// liefert einen int Wert zurück, mittels dessen man
// die richtige Reihenfolge der Abschnitte prüfen kann
function chapterOrder(key)
{
 switch (key.substring(2,key.indexOf("}}"))) {
 case "Lesungen": return 10;
 case "Alternative Schreibweisen": return 11;
 case "Alte Rechtschreibung": return 12;
 case "Nicht mehr gültige Schreibweisen": return 12;
 case "Nebenformen": return 13;
 case "Silbentrennung": return 14;
 case "Worttrennung": return 14;

 case "in arabischer Schrift": return 20;
 case "in kyrillischer Schrift": return 21;
 case "in lateinischer Schrift": return 22;
 case "Strichreihenfolge": return 23;
 case "Vokalisierung": return 24;
 case "Umschrift": return 25;
 case "Aussprache": return 26;

 case "Bedeutungen": return 30;
 case "Abkürzungen": return 31;
 case "Symbole": return 32;
 case "Herkunft": return 33;
 case "Synonyme": return 34;
 case "Sinnverwandte Wörter": return 35;
 case "Gegenwörter": return 36;

 case "Weibliche Wortformen": return 40;
 case "Männliche Wortformen": return 41;
 case "Verkleinerungsformen": return 42;
 case "Vergrößerungsformen": return 43;
 case "Oberbegriffe": return 44;
 case "Unterbegriffe": return 45;
 case "Holonyme": return 46;
 case "Meronyme": return 47;

 case "Kurzformen": return 50;
 case "Koseformen": return 51;
 case "Kurz- und Koseformen": return 52;
 case "Namensvarianten": return 53;
 case "Weibliche Namensvarianten": return 54;
 case "Männliche Namensvarianten": return 55;
 case "Bekannte Namensträger": return 56;

 case "Beispiele": return 60;
 case "Redewendungen": return 61;
 case "Sprichwörter": return 62;
 case "Charakteristische Wortkombinationen": return 63;
 case "Abgeleitete Begriffe": return 64;
 case "Wortbildungen": return 64;

 case "Übersetzungen": return 70; // Pseudovorlage bei ====

 case "Referenzen": return 90;
 case "Quellen": return 91;
 case "Quellen|": return 91;

 default: return -1;
 }
}


function preserveLinefeeds(txt,from,to)
{
 var i=0;
 var lf="";

 for (i=from; i<to; i++) {
  if (txt[i] == '\n') {
   lf += '\n';
  }else{
   lf += ' ';
  }
 }
 return lf;
}


function filterRefs(txt)
{
 var ta=buildLines(txt);
 var tb=[];
 var i;
 for (i=0; i<ta.length; i++) {
  if (!contains(ta[i],"<ref>") && !contains(ta[i],"#tag:ref|")){
   tb.push(ta[i]);
  }
 }
 return tb.join('\n');
}


// <!-- --> Kommentare sind nicht geschachtelt
function filterComments(txt,warn)
{
 var sb="";
 var pos=0;
 var i;
 var j;
 var lino=0;

 do {
  i = txt.indexOf("<!--", pos);
  if (i >= 0){
   j = txt.indexOf("-->", i);
   if (j > 0){
    sb += txt.substring(pos,i);
    sb += preserveLinefeeds(txt,i+4,j);
    pos = j + 3;
   } else {
    for(j=0;j<i;j++){
     if (txt.charAt(j)=='\n') lino++;
    }
    warn.push(new warning(lino,"Schließende Kommentarklammer nicht gefunden"));
    i = -1; // schleife beenden
   }
  }
 } while (i >= 0);

 return sb+txt.substr(pos);
}


// WikiMarkup ausblenden (nicht geschachtelt)
function filterItalic(text)
{
 return text.replace(/''[^']+''/g, '');
}


// Tags ausblenden (nicht geschachtelt)
function filterTag(text,tag,warn)
{
  var sb="";
  var pos=0;
  var state=0;
  var startp=0;
  var i1=0;
  var from=0;
  var to=0;
  var chr = '';
  var attr = '';
  var val = '';
  var txt = '';
  var textlow=text.toLowerCase();

  while (i1 >= 0 && pos<text.length){
    chr = text.charAt(pos);

    switch (state) {
    case 0:
      i1 = textlow.indexOf("<"+tag, pos);
      if (i1 >= 0){
        state = 1;
        from=i1;
        pos = i1+tag.length+1;
      } else {
        pos =text.length;
      } break;
    case 1:
      if (chr==' '){
        state = 3;
        pos++;
      } else if (chr=='/'){
        state = 2;
        pos++;
      } else if (chr=='>'){
        state = 20;
        pos++;
      } else {
        state = 0;
        pos++;
      } break;
    case 2:
      if (chr=='>'){
        state = 0;
        pos++;
        to=pos;
        sb += text.substr(startp, from - startp);
        sb += preserveLinefeeds(text,from,to);
        startp = to;
      } else {
        warn.push(new warning(-1,"Schließende Tagklammer &gt; nicht gefunden"));
        pos++;
      } break;
    case 3:
      if (chr=='/'){
        state = 2;
        pos++;
      } else if (chr=='>'){
        state = 20;
        pos++;
      } else if (chr==' '){
        attr='';
        pos++;
      } else if (chr=='='){
        state = 10;
        val="";
        pos++;
      } else {
        attr+=chr;
        pos++;
      } break;

    case 10:
      if (chr=='"'){
        i1 = text.indexOf('"', pos+1);
        if (i1 >= 0){
          state = 3;
          val=text.substring(pos+1,i1);
          pos = i1+1;
        } else {
          state = 0;
          warn.push(new warning(-1,'Schließendes Hochkomma " nicht gefunden'));
          pos++;
        } break;

      } else if (chr=="'"){
        i1 = text.indexOf("'", pos+1);
        if (i1 >= 0){
          state = 3;
          val=text.substring(pos+1,i1);
          pos = i1+1;
        } else {
          state = 0;
          warn.push(new warning(-1,"Schließendes Hochkomma ' nicht gefunden"));
          pos++;
        } break;

      } else if (chr==' '){
        pos++;
      } else {
        state = 13;
        val+=chr;
        pos++;
      } break;

    case 13:
      if (chr=='>'){
        state = 20;
        pos++;
      } else if (chr==' '){
        state = 3;
        attr='';
        val='';
        pos++;
      } else {
        val+=chr;
        pos++;
      } break;

    case 20:
      i1 = textlow.indexOf("</"+tag, pos);
      if (i1 >= 0){
        txt+=text.substring(pos,i1);
        state = 21;
        pos = i1+tag.length+2;
      } else {
        warn.push(new warning(-1,"Schließendes Tag &lt;/"+tag+"&gt; nicht gefunden"));
        txt+=text.substring(pos,text.length);
        pos =text.length;
      } break;

    case 21:
      if (chr == ' '){
        pos++;
      } else if (chr == '>'){
        state = 0;
        txt='';
        pos++;
        to=pos;
        sb += text.substr(startp, from - startp);
        sb += preserveLinefeeds(text,from,to);
        startp = to;
      } else {
        warn.push(new warning(-1,"Schließende Tagklammer &gt; nicht gefunden"));
        pos++;
      } break;

    }
  }
  sb += text.substr(startp,text.length-startp);
  return sb;
}


// text to lines
function buildLines(txt)
{
// opera uses CRLF in textareas
  return txt.split(/\r?\n/)
}


//  misc helper functions
function getCursor (e) {
 var c = 0;
 if (document.selection) {
  e.focus ();
  var s = document.selection.createRange ();
  s.moveStart ('character', -e.value.length);
  c = s.text.length;
 } else if (e.selectionStart || e.selectionStart == '0') {
  c = e.selectionStart;
 }
 return (c);
}

function setCursor(e, pos){
 if(e.setSelectionRange) {
  e.focus();
  e.setSelectionRange(pos,pos);
 } else if (e.createTextRange) {
  var r = ctrl.createTextRange();
  r.collapse(true);
  r.moveEnd('character', pos);
  r.moveStart('character', pos);
  r.select();
 }
}


function startsWithUml(txt,str) {
 var i = txt.length;
 var uml=false;
 if(i<str.length){
  return false;
 }
 for(i=0;i<str.length;i++){
  if(txt[i] == str[i]){
  } else {
   if( (txt[i] == 'Ä' && str[i] == 'A')
    || (txt[i] == 'Ö' && str[i] == 'O')
    || (txt[i] == 'Ü' && str[i] == 'U')
    || (txt[i] == 'ä' && str[i] == 'a')
    || (txt[i] == 'ö' && str[i] == 'o')
    || (txt[i] == 'ü' && str[i] == 'u')){
    uml=true;
   } else {
    return false;
   }
  }
 }
 return uml;
}


function getGenusEnd(s) {
 var e="e";
 if (contains(s,"===")){
  if (contains(s,"{n}") || contains(s,"{nf}") || contains(s,"{nm}")) {
   e+="s";
  } else if (contains(s,"{m}") || contains(s,"{mf}")) {
   e+="r";
  }
 }
 return e;
}


function getLinks(s) {
 var a=[];
 var re=/\[\[([^\]]*)\]\]/g;
 var ar=re.exec(s);
 while (ar!=null) {
  a.push(ar[1]);
  ar=re.exec(s);
 }
 return a;
}


// Die Sprach-Kategorie der Einträge verarbeiten; nach der Suche nach einzelner Sprache
// Ergebnis per requestid den einzelnen Abschnitten zuordnen
function handleResponseCats1(data) {

  if (data.query !== undefined && data.query.pages !== undefined) {

    var dqp = data.query.pages;
    var idx = parseInt(data.requestid.slice(1));
    for (var i in dqp) {
      if ( dqp[i].hasOwnProperty("pageid")) {   // Seite ist vorhanden
        if ( ! dqp[i].hasOwnProperty("categories")) {   // aber Kategorie fehlt, dann gelb markieren
          $(cpCats[idx].element).find("A").each(function(index, element) {

            // Abfrage auf href wegen rot/blau Links; "$", damit kein prefix matched
            if ((element.href+"$").indexOf("title=" + mw.util.wikiUrlencode(dqp[i].title) + "$") >= 0) {
              element.style.backgroundColor = "yellow";
            }

          });
        }
      }
    }

  }
}


// Api-Aufruf starten, wenn 50 Titel erreicht oder
// wenn t == null, dann txt aus Puffer
function limit50(t,idx,sprache,func){
 if (t) {
  if (limitCnt == 0) {
   limitTxt += t;
  } else {
   limitTxt += "|"+t;
  }
  limitCnt++;
 }

 if (limitCnt == 50 || t == null) {
  if (limitTxt.length > 0) {
   $.get(buildApi(limitTxt,"action=query&format=json&requestid=i" + idx +
     "&prop=categories&cllimit=5000&clcategories=" + mw.util.wikiUrlencode("Category:" + sprache) +
     "&titles="),func);
  }
  limitTxt = '';
  limitCnt = 0;
 }
}


// wo sollen die Ausgaben hin?
function getGadgetAnker() {
 var gadgets = document.getElementById("gadgets");
 if (!gadgets) {
  gadgets = document.getElementById("mw-content-text");
  gadgets.insertAdjacentHTML("afterbegin",'<div id="gadgets"></div>');
  gadgets = document.getElementById("gadgets");
 }
 return gadgets;
}


function config(s) {
 return checkpage.hasOwnProperty(s) && checkpage[s];
}


function configDefault(s,d) {
 if (checkpage.hasOwnProperty(s)) {
  return checkpage[s];
 }
 return d;
}


function toAnsi(s) {
 return s.replace(/ß/g,"%DF").replace(/ü/g,"%FC").replace(/ö/g,"%F6").replace(/ä/g,"%E4").replace(/Ü/g,"%DC").replace(/Ö/g,"%D6").replace(/Ä/g,"%C4");
}


function hasClass(element, className) {
 return (' ' + element.className + ' ').indexOf(' ' + className + ' ') > -1;
}


function isEmpty(obj){
 for (var k in obj) {
  if (obj.hasOwnProperty(k)) return false;
 }
 return true;
}


function isEmptyLs(ls) {
 return contains(ls,'…');
}


function extractStr2(txt,left,r1,r2,strip) {
 var s=extractStr(txt,left,r1,strip);
 if(s.length==0){
  s=extractStr(txt,left,r2,strip);
 }
 return s;
}


// extract substring
function extractStr(txt,left,right,strip)
{
 var i = left.length == 0 ? 0 : txt.indexOf(left);
 if (i>=0) {
  var j = right.length == 0 ? txt.length : txt.indexOf(right,i+1);
  if (j>=0) {
   if (typeof strip === "undefined") {
    return txt.substring(i,j+right.length);
   } else {
    switch (strip) {
     case 'L': return txt.substring(i+left.length,j+right.length);
     case 'R': return txt.substring(i,j);
     case 'B': return txt.substring(i+left.length,j);
    }
   }
  }
 }
 return '';
}


function toUpperFirst(s) {
 return s.substr(0,1).toUpperCase()+s.substr(1);
}

function toLowerFirst(s) {
 return s.substr(0,1).toLowerCase()+s.substr(1);
}

// string aus string entfernen
function removeStr(txt,pos,len)
{
 return txt.slice(0,pos) + txt.slice(pos+len);
}

// string am ende abschneiden
function cropStr(txt,len)
{
 return txt.substr(0,txt.length-len);
}


// insert string
function insertStr(txt,pos,str)
{
 if (pos<0) {
  return txt.substr(0,txt.length+pos)+str+txt.substr(txt.length+pos);
 }
 return txt.substr(0,pos)+str+txt.substr(pos);
}


// trim space
function trimEnd(txt)
{
 var i = txt.length-1;
 while (i >= 0 && txt.charAt(i) == ' ') {
  i--;
 }
 return txt.substring(0,i+1);
}


function startsWith(txt,str)
{
 return (txt.length >= str.length && txt.lastIndexOf(str,0) == 0)
}


function endsWith(txt,str)
{
 var idx = txt.length - str.length;
 return (txt.length >= str.length && txt.indexOf(str,idx) == idx)
}


function containsAt(txt,str,pos)
{
 return (txt.length+pos >= str.length && (txt.substr(pos,str.length)).lastIndexOf(str,0) == 0)
}


function contains(txt,str)
{
 return txt.indexOf(str) >= 0;
}


function updateList(title,txt) {
 update(title,txt,response);
 function response (data, textStatus, jqXHR) {
  $("#cp-Akt-" + title.replace(/ /g,'_')).hide();
 }
}


function update(t, txt, response) {

 $.ajax({
  url: mw.util.wikiScript('api'),
  method: 'POST',
  data: {
   action: 'edit',
   title: t,
   summary: 'aktualisiert (' + version + ')',
   text: txt,
   token: mw.user.tokens.get('csrfToken'),
   format: 'json'
  },
  success: response

 });

}


// end namespace: checkpage
}( window.checkpage = window.checkpage || {}, jQuery ));


jQuery(document).ready(checkpage.analyzePage);


// </nowiki>