Benutzer:Balû/checkpage.js

Aus Wiktionary, dem freien Wörterbuch
/*
** 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/checkpage 1.64";

// public:

_public.analyzePage = function() {
  var ns = mw.config.get("wgNamespaceNumber");
  if (ns === 0 || ns == 10 || ns == 106) {  // 10 = Templates 106 = Reim
    if (mw.config.get("wgAction") == "view") {
      var pv=mw.util.getParamValue('checkpage');
      if (pv && pv=="auto") {
        _public.analyzeThisPage();
        return;
      }
      var checkpageLink = mw.util.addPortletLink("p-views", null, "Check", "ca-checkpage",
       "checkpage() für diese Seite aufrufen",null,"#ca-view");
      $( checkpageLink ).click( _public.analyzeThisPage );
    }
    var rl=mw.util.getParamValue("redlink");
    if(rl && rl=="1"){
      checkComp(text);
    }
    if (mw.config.get("wgAction") == "submit") {  // autocheck in preview mode only
      // get(url) gets LF + TEXT
      var text = '\n'+document.editform.wpTextbox1.value;
      doReport=true;
      checkText(text,mw.config.get("wgPageName"),ns,document.getElementById("contentSub"),partialEdit());
      checkComp(text);
    }
    if(canSort){
      createTSButton();
    }
    createCSButton();
  }
  
}


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


_public.sortTranslations = function() {
  doSort=true;
  document.editform.wpTextbox1.value = checkTextSort('\n'+document.editform.wpTextbox1.value);
  document.getElementById("wpPreview").click();
}


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


_public.analyzeThisPage = function() {
 if(inCheckThis) return; // already done?
 inCheckThis=true;
 var node=document.getElementById("ca-view");
 if(node) node.removeAttribute("class");
 node=document.getElementById("ca-current");
 if(node) node.removeAttribute("class");
 node=document.getElementById("ca-checkpage");
 if(node) node.setAttribute("class","selected");

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


_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 = '\n'+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 doReport=false;
var doSort=false;
var doSortCh=false;
var canSort=false;
var inCheckThis=false;

var diminutiv={};
var feminin={};

var reorder=[];
var flexion={};
var flexionv={};
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 reime={};

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

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 = document.getElementById("contentSub");   // 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 (contains(ls,"{{Lautschrift") && !contains(ls,"…")) {
     var tn = 'Nur für Experten! Lautschrift aus bekannten Wörtern ergänzen: ';
     var p=node.parentNode;
     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");
     p.insertBefore(document.createElement("br"),node.nextSibling);
     p.insertBefore(nl,node.nextSibling);
     p.insertBefore(document.createTextNode(tn),node.nextSibling);
    }
   }
  }
}


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


function handleResponse(data){
 var node = document.getElementById("contentSub");  // top of page
 if(node){
  doReport=true;
  data='\n'+data;
  pages[thispage]=new page(thispage,data);
  checkText(data,thispage,mw.config.get("wgNamespaceNumber"),node,"");
  checkExtend(data,thispage);
  checkComp(data);
 }
}


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


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


function handleResponseDim(data){
 if (data.parse !== undefined && data.parse.links !== undefined) {
  var dpl=data.parse.links;

  var node = document.getElementById("contentSub");   // top of page
  if(node){
   var tn=' Verkleinerungsform anlegen. Deutsch: ';
   var p=node.parentNode;
   var i=dpl.length-1;
   var br=true;

   for(;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/de-Sub-Dim&autoedit="+
      encodeURIComponent(
       repl("@NF@",pnf,"g;")+
       repl("@1@",diminutiv[t].wt,"g;")+
       repl("@3@",diminutiv[t].lss+", {{Pl.}} "+diminutiv[t].lsp,"g;")+
       repl("@4@",diminutiv[t].bed,"g;")+
       repl("@5@",mw.config.get("wgPageName"),"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");

     if(br){
      br=false;
      p.insertBefore(document.createElement("br"),node.nextSibling);
     }
     p.insertBefore(nl,node.nextSibling);
     p.insertBefore(document.createTextNode(tn),node.nextSibling);
     node = nl;
     tn = ", ";

    }

   }
  }
 }
}


function handleResponseFem(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")) {

    var node = document.getElementById("contentSub");   // top of page
    if(node){

     var pnf='';
     var tn=' Weibliche Form anlegen. Deutsch: ';
     var p=node.parentNode;
     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/de-Sub-fem&autoedit="+
      encodeURIComponent(
       repl("@NF@",pnf,"g;")+
       repl("@1@",feminin.wt,"g;")+
       repl("@2@",t+"nen","g;")+
       repl("@3@",feminin.lss+", {{Pl.}} "+feminin.lsp,"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");
     p.insertBefore(document.createElement("br"),node.nextSibling);
     p.insertBefore(nl,node.nextSibling);
     p.insertBefore(document.createTextNode(tn),node.nextSibling);
    }

   }
  }
 }
}


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 = document.getElementById("contentSub");   // top of page
  if(node){

    var wt="";
    var wta="";
    var wtn="";
    var ls="{{Lautschrift|…}}";
    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(s,extend.gf,"səs");
     }
     wt=buildWtAltNeu(worttr,"Sg.");
     wt=wtPlusE(wt,"·ses");
     break;

    case "deGenSges":

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

    case "deGenSgs":

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

    case "deDatSge":

     if(s.length>0 && !contains(s,"…")){
      ls=lsPlusE(s,extend.gf,"ə");
     }
     wt=buildWtAltNeu(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;
     }

     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=anpassenLs(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 tn = 'Flektierte Form aus Grundform ergänzen: '+extend.sp+' ';
     var p=node.parentNode;
     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\\|…}}",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");
     p.insertBefore(document.createElement("br"),node.nextSibling);
     p.insertBefore(nl,node.nextSibling);
     p.insertBefore(document.createTextNode(tn),node.nextSibling);
    }
  }
}


function handleResponseKonjugation(data){
 //alert(JSON.stringify(data));
 var h,i,s1b;
 var hta = ["1. Person Singular","2. Person Singular","3. Person Singular",
           "1. Person Plural","2. Person Plural","3. Person Plural"];

 var s1=extractStr(data,'id="Infinitive_und_Partizipien"',"");
 var d1=s1.split("</table>");
 var hsns='';

 for(h=1;h<d1.length-1;h=h+3){

  var ht = " Präsens Aktiv";
  var pt = "2. Person Singular";
  s1=extractStr(d1[h],'title="Hilfe:Imperativ"',"");
  s1=extractStr(s1,'. Pers',"");
  var s1a=s1.split("<tr>");

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

  s1=extractStr(d1[h+1],'>Präsens<','>Präteritum<');
  s1a=s1.split("<tr>");
  var htai=0;
  hsns='';

  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("Deutsch",s1b[1],thispage,"","…","Audio|",hta[htai]+" Indikativ"+ht+hsns);
    addFlexionVerb("Deutsch",s1b[2],thispage,"","…","Audio|",hta[htai]+" Konjunktiv"+ht+hsns);
    if(hsns!=''){
     addFlexionVerb("Deutsch",s1b[3],thispage,"","…","Audio|",hta[htai]+" Indikativ"+ht+" der Nebensatzkonjugation");
     addFlexionVerb("Deutsch",s1b[4],thispage,"","…","Audio|",hta[htai]+" Konjunktiv"+ht+" der Nebensatzkonjugation");
    }
    htai++;
   }
  }

  s1=extractStr2(d1[h+1],'>Präteritum<','>Perfekt<','');
  s1a=s1.split("<tr>");
  htai=0;
  ht = " Präteritum Aktiv";
  hsns='';

  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("Deutsch",s1b[1],thispage,"","…","Audio|",hta[htai]+" Indikativ"+ht+hsns);
    addFlexionVerb("Deutsch",s1b[2],thispage,"","…","Audio|",hta[htai]+" Konjunktiv II"+ht+hsns);
    if(hsns!=''){
     addFlexionVerb("Deutsch",s1b[3],thispage,"","…","Audio|",hta[htai]+" Indikativ "+ht+" der Nebensatzkonjugation");
     addFlexionVerb("Deutsch",s1b[4],thispage,"","…","Audio|",hta[htai]+" Konjunktiv II "+ht+" der Nebensatzkonjugation");
    }
    htai++;
   }
  }
 }

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

}


function handleResponseRhyme(data){
 if (data.query !== undefined && data.query.backlinks !== undefined) {
 //todo data["query-continue"]
  var warn=[];
  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{
    warn.push(new warning(-1,"Reimwort fehlt oder falscher Link in: "+bl[i].title));
   }
  }
  var w;
  for(w in reime){
   if(reime[w].cnt > 1){
    warn.push(new warning(-1,"Reimwort mehrfach vorhanden: "+w));
   }
   if(!reime[w].link){
    warn.push(new warning(-1,"Link zu dieser Seite fehlt in: "+w));
   }
  }
  reportWarnings(document.getElementById("contentSub"),[],warn,[false,false,false,true]);
 }
}



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 getWtSg(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)==':') {
   var ls=l.split(',');

   var j=ls[0].lastIndexOf(' ');
   if(j==-1){
     j=0;
   }
   addwte(r,alt,ls[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={};
 for (var i in a) {
  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 addwts (r,key,alt,wt){

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


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,"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,"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 anpassenLs(t,ls){
 var endls=ls.substr(-5,1);
 var endchr=t.substr(-3,1);
 if (endls.search(/[mnŋʀlj]/) == -1 && endchr.search(/[aeiouäöüy]/) == -1){
  ls=ls.replace(/ən\}\}/g,"n̩}}");
 }
 return ls;
}


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?"+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 createCSButton(){
  var node = document.getElementById("wpDiff");
  if(node){
    var p=node.parentNode;
    var y=document.createElement("input");

    y.setAttribute("id", "wpCheck");
    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.nextSibling);
    p.insertBefore(document.createTextNode('\n'),node.nextSibling);
  }
}


function createTSButton(){
  var node = document.getElementById("wpDiff");
  if(node){
    var p=node.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()");

    p.insertBefore(y,node.nextSibling);
    p.insertBefore(document.createTextNode('\n'),node.nextSibling);
  }
}


function checkRhyme(){
 var a="#mw-content-text > ul a:not('.new')";

 $(a).each(function(index, element) {
  if (reime.hasOwnProperty($(element).text())){
   reime[$(element).text()].cnt++;
  }else{
   reime[$(element).text()] = {cnt:1,link:false};
  }
 })
 var url=buildApi(mw.config.get("wgPageName"),"action=query&list=backlinks&bllimit=9999&blnamespace=0&blfilterredir=nonredirects&format=json&bltitle=");
 $.get(url, handleResponseRhyme);
}


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,"{{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 addFlexionLinks(flexion,dpl) {

 var node = document.getElementById("contentSub");
 if(node){
  var tn='Flektierte Form anlegen. ';
  var p=node.parentNode;
  var i=dpl.length-1;
  var lsp='';
  var br=true;
  var t = '';
  var j,nl;
  for(;i>=0;i--){
   t = dpl[i]['*'];
   var ft = flexion[t];
   var ls = '…';
   var hb = 'Audio|';
   var pnf ='';
   var p4 ='';
   var p7 ='I';
   var anzGm=0;
   nl =document.createElement("a");

   if (lsp!=ft.sp){
    lsp=ft.sp;
    tn=tn+lsp+': ';
   }

   if (ft.vorlage == "S6-Sub") {
    ls = '{{Lautschrift|…}}';
    hb = '{{Audio|}}';
   }

   if (ft.vorlage == "de-Partizip") {
    if (ft.hasOwnProperty("gm")) {
     if (contains(ft.gm[0],"Perfekt")) {
      p7 = "II";
     }
    }
   }

   if (!dpl[i].hasOwnProperty("exists")) {

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

    if (ft.hasOwnProperty("nf")) {
      for (var nf in ft.nf) {
        if (pnf.length==0) {
         pnf+="\n{{Nebenformen}}\n:";
         if(anzGm>1){
          for (j=0;j<ft.nf[nf].length;j++){
           if(j > 0) {pnf+="[["+nf+"]]\n:";}
           pnf+="''"+ft.nf[nf][j]+":'' ";
          }
         }
        } else {
         if(anzGm>1){
          for (j=0;j<ft.nf[nf].length;j++){
           if(j > 0) {pnf+="[["+nf+"]]";}
           pnf+="\n:''"+ft.nf[nf][j]+":'' ";
          }
         }else{
          pnf+=", ";
         }
        }
        pnf+="[["+nf+"]]";
      }
    }
    if (pnf.length>0) {
     pnf+="\n";
    }
    if (contains(t,'ß')){
     pnf="\n{{Alternative Schreibweisen}}\n:{{CH&LI}} [["+t.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;

    nl.href=buildUrl2(t,"&action=edit")+
      "&editintro=Vorlage:Autoedit/intro&preload=Vorlage:Autoedit/"+ft.vorlage+"&autoedit="+
      encodeURIComponent(
        repl("@NF@",pnf,"g;")+
        repl("@1@",ft.wt,"g;")+
        repl("@2@",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 = t;
    nl.setAttribute("style", "color:#00E000")

    if(br){
     br=false;
     p.insertBefore(document.createElement("br"),node.nextSibling);
    }
    p.insertBefore(nl,node.nextSibling);
    p.insertBefore(document.createTextNode(tn),node.nextSibling);
    node = nl;
    tn = ", ";
   }
  }

  tn='Flektierte Form ansehen. ';
  p=node.parentNode;
  i=dpl.length-1;
  lsp='';
  br=true;
  for(;i>=0;i--){
   t = dpl[i]['*'];
   nl =document.createElement("a");
   if (dpl[i].hasOwnProperty("exists")) {

    nl.href=buildUrl2(t,"");
    nl.innerHTML = t;
    nl.setAttribute("style", "color:#0000E0")

    p.insertBefore(nl,node.nextSibling);
    p.insertBefore(document.createTextNode(tn),node.nextSibling);

    if(br){
     br=false;
     p.insertBefore(document.createElement("br"),node.nextSibling);
    }
    node = nl;
    tn = ", ";
   }
  }
 }
}


function addFlexionAdjEnd(name,title,wt,wte,ls,hb,form,vorlage) {
 if (flexion[name] === undefined) {
  flexion[name] = {};
 }
 var f=flexion[name];
 f.exists=true;
 f.title=title;
 f.vorlage=vorlage;
 f.sp="Deutsch";

 if(wte.length<2){
  wt=wt.replace(/·$/,'');
 }

 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=f.wt.replace(/··/g,"·");

 if (f.hasOwnProperty("ls")) {
  if (f.ls.length < ls.length){
   f.ls=ls;
  }
 } else {
  f.ls=ls;
 }
 if (startsWith(f.ls,"…") || startsWith(f.ls,"...")) {
  f.ls="…";
 }

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

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

}


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 (endsWith(wt,',')) {
  wt=$.trim(wt.substr(0,wt.length-1));
 }
 if (endsWith(wt,'sch')) {
  wt = insertStr(wt,-3,'·');
 } else if (endsWith(wt,'e')) {
  wt = wt.substr(0,wt.length-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 prepareLautschrift(t,ls,e) {
 if (endsWith(ls,"-") || endsWith(ls,"…") || endsWith(ls,".")) {
  return ls;
 }
 if (e=="n") {
  return ls+e;
 }
 if (startsWith(e,"s")) {
  if (endsWith(t,"s")) {
   return ls.substr(0,ls.length-1)+e;
  }else{
   return (ls+e).replace(/ts$/,"ʦ");
  }
 }
 if (endsWith(t,"b")) {return ls.substr(0,ls.length-1)+"b"+e;}
 if (endsWith(t,"d")) {return ls.substr(0,ls.length-1)+"d"+e;}
 if (endsWith(t,"g")) {
  if (endsWith(ls,"ç") || endsWith(ls,"k")) {
   return ls.substr(0,ls.length-1)+"ɡ"+e;
  }
 }
 if (endsWith(t,"r")) {
  if (endsWith(ls,"ɐ̯")) {
   return ls.substr(0,ls.length-2)+"ʀ"+e;
  } else if (endsWith(ls,"ɐ")) {
   return ls.substr(0,ls.length-1)+"əʀ"+e;
  }
 }
 if (!endsWith(t,"ss")) {
  if (endsWith(t,"s")) {
   return ls.substr(0,ls.length-1)+"z"+e;
  }
 }
 if (endsWith(t,"v")) {return ls.substr(0,ls.length-1)+"v"+e;}
 return ls+e;
}


function addFlexionAdj(param,title,wt,ls,hb,form,kls,khb) {
  if (param == undefined) return;
  var re = /\s+|<.*>|{.*}|am /g;
  var nameList = param.split(re);

  if (form == "Superla") {
   if (endsWith(wt,"ten")) {
    wt=wt.substr(0,wt.length-2);
   }
   if (startsWith(wt,'am ')) {
    wt=wt.substr(3);
   }
   if (startsWith(ls,"am ")) {
    ls=ls.substr(3);
   }
  } else {
   wt=prepareWorttrennungAdj(wt);
  }

  for (var 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" && endsWith(nli,"ten")) {
      nli=nli.substr(0,nli.length-2);
     }

     if (form == "Posi") {

      ls=prepareLautschrift(title,ls,'');
      addFlexionAdjEnd(nli+"e",title,wt,"e",ls+"ə",'',form,"de-Adj-e");
      addFlexionAdjEnd(nli+"es",title,wt,"es",ls+"əs",'',form,"de-Adj-es");
      if (kls == "…") {
       addFlexionAdjEnd(nli+"er",title,wt,"er",ls+"ɐ",'',form,"de-Adj-er");
      } else {
       addFlexionAdjEnd(nli+"er",title,wt,"er",kls,khb,form,"de-Adj-er");
      }
      if (nli.search(/ah?$|eh?$|ih?$|oh?$|uh?$|äh?$|öh?$|üh?$|yh?$/g)<0) {

       if (ls.search(/l$|m$|n$|ŋ$|n̩$|ʀ$/g)<0) {
        addFlexionAdjEnd(nli+"en",title,wt,"en",ls+"n̩",'',form,"de-Adj-en");
       } else {
        addFlexionAdjEnd(nli+"en",title,wt,"en",ls+"ən",'',form,"de-Adj-en");
       }
       if (ls.search(/b$|d$|g$|ɡ$|k$|l$|m$|n$|ŋ$|p$|ʀ$|t$/g)<0) {
        addFlexionAdjEnd(nli+"em",title,wt,"em",ls+"m̩",'',form,"de-Adj-em");
       } else {
        addFlexionAdjEnd(nli+"em",title,wt,"em",ls+"əm",'',form,"de-Adj-em");
       }

      } else {

       addFlexionAdjEnd(nli+"en",title,wt,"en",ls+"ən",'',form,"de-Adj-en");
       addFlexionAdjEnd(nli+"em",title,wt,"em",ls+"əm",'',form,"de-Adj-em");

      }

     } else {

      if (form == "Superla") {
       if(endsWith(ls,"n̩") || endsWith(ls,"ən")){
        ls=ls.substr(0,ls.length-2);
        addFlexionAdjEnd(nli+"e",title,wt,"e",ls+"ə",'',form,"de-Adj-e");
        addFlexionAdjEnd(nli+"es",title,wt,"es",ls+"əs",'',form,"de-Adj-es");
        addFlexionAdjEnd(nli+"er",title,wt,"er",ls+"ɐ",'',form,"de-Adj-er");
        addFlexionAdjEnd(nli+"en",title,wt,"en",ls+"n̩",hb,form,"de-Adj-en");
        addFlexionAdjEnd(nli+"em",title,wt,"em",ls+"əm",'',form,"de-Adj-em");
       } else {
        addFlexionAdjEnd(nli+"e",title,wt,"e",'','',form,"de-Adj-e");
        addFlexionAdjEnd(nli+"es",title,wt,"es",'','',form,"de-Adj-es");
        addFlexionAdjEnd(nli+"er",title,wt,"er",'','',form,"de-Adj-er");
        addFlexionAdjEnd(nli+"en",title,wt,"en",ls,hb,form,"de-Adj-en");
        addFlexionAdjEnd(nli+"em",title,wt,"em",'','',form,"de-Adj-em");
       }
      } else { // Komparativ
       if(endsWith(ls,"ɐ")){
        ls=ls.substr(0,ls.length-1);
        addFlexionAdjEnd(nli+"e",title,wt,"e",ls+"əʀə",'',form,"de-Adj-e");
        addFlexionAdjEnd(nli+"es",title,wt,"es",ls+"əʀəs",'',form,"de-Adj-es");
        addFlexionAdjEnd(nli+"er",title,wt,"er",ls+"əʀɐ",'',form,"de-Adj-er");
        addFlexionAdjEnd(nli+"en",title,wt,"en",ls+"əʀən",'',form,"de-Adj-en");
        addFlexionAdjEnd(nli+"em",title,wt,"em",ls+"əʀəm",'',form,"de-Adj-em");
       } else {
        addFlexionAdjEnd(nli+"e",title,wt,"e",'','',form,"de-Adj-e");
        addFlexionAdjEnd(nli+"es",title,wt,"es",'','',form,"de-Adj-es");
        addFlexionAdjEnd(nli+"er",title,wt,"er",'','',form,"de-Adj-er");
        addFlexionAdjEnd(nli+"en",title,wt,"en",'','',form,"de-Adj-en");
        addFlexionAdjEnd(nli+"em",title,wt,"em",'','',form,"de-Adj-em");
       }
      }


     }
    }
   }
  }
}


function flex(title,vorlage) {
 this.title=title;
 this.vorlage=vorlage;
 this.exists=true;
 this.wt='';
 this.ls='';
 this.hb='';
 this.gm=[];
 this.nf={};
}


function addFlexionSub(v,it,p,title,wt,ls,hb,gm,ht) {
  var param = getTemplateParam2(v,it,p);
  if (param == undefined) return;

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

  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-1) { //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) {

     if (flexion[formen[i]] === undefined) {
      flexion[formen[i]] = new flex(title,"S6-Sub");
     }
     var fi=flexion[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=extractStr(getTemplateParam2(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 apiParseLinks(flexion,hr) {
 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 createDim(v,title,it) {

 var i,s,w,dw;
 var endung='';
 var laut='';
 var nowtls=false;
 var tsge='';
 var tple='';
 var t=extractStr2(v.text,getTemplateParam2(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=getTemplateParam2(v.tt,it,"Nominativ Plural");
 if (tpl==undefined) {
  tpl=getTemplateParam2(v.tt,it,"Nominativ Plural 1");
 }
 if (tpl==undefined) {
  tpl='';
 } else {
  tpl=extractStr(tpl,"die ","",'B');
 }

 if(endsWith(title,"e")){
  tsge=title.substr(0,title.length-1);
 }
 if(endsWith(tpl,"e")){
  tple=tpl.substr(0,tpl.length-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]={};
  dw=diminutiv[w];
  dw.bed="\n:[1] klein"+genend+" [["+title+"]]\n";
  dw.rest=hk;

  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$/,'');

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

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

   if(schwa){
    dw.wt=dw.wt.substr(0,dw.wt.length-1);
    dw.wt=prepareWorttrennungDim(dw.wt)
    s=s.replace(/ə}}/,"}}");
   }

   if(s.length==0||contains(s,"…")){
    dw.lss="{{Lautschrift|…}}";
    dw.lsp=dw.lss;
   }else{
    dw.lsp=lsPlusE(s,title,laut);
    dw.lss=lsPlusE(s,title,laut);
   }

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

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


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(wt.substr(0,wt.length-1));
 }
 if (endsWith(wt,'·sch')) {
  wt = wt.replace(/·sch$/,'sch');
 } else if (wt.search(re2)>=0) {
  wt = wt.substr(0,wt.length-3)+wt.substr(wt.length-2,2);
 } else if (wt.search(re1)>=0) {
  wt = wt.substr(0,wt.length-2)+wt.substr(wt.length-1,1);
 }
 return $.trim(wt);
}


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

 var t=extractStr2(text,getTemplateParam2(v,it,"0"),"\n=","");
 var wfn=extractStr(t,"{{Weibliche Wortformen}}","\n{{",'B');
 var wf=title.replace(/e$/,'')+"in";
 var titlea=toAnsi(title);
 if(!contains(wfn,wf)){
  return;
 }
 var s=extractStr(t,"{{Bedeutungen}}","\n{{Weibliche Wortformen");
 var hk="{{Herkunft}}\n:[[Ableitung]] ([[Motion]], [[Movierung]]) des Femininums aus der männlichen Form ''[["
  +title+"]]''";
  if (endsWith(title,"e")){
   hk+=", Subtraktionsfuge -e und";
  }
  hk+=" mit dem [[Derivatem]] ([[Ableitungsmorphem]]) ''[[-in]]''\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);
 }
 feminin.bed=extractStr(s,"{{Bedeutungen}}","\n{{Weibliche Wortformen",'B');
 s=extractStr(t,"\n{{Weibliche Wortformen}}","\n=",'L');
 s=extractStr(s,"\n{{","\n=",'R')+'\n';
 s=s.replace(/\{\{Wortbildungen\}\}[^\v]*?\n\n/,'');
 feminin.rest=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=buildWtAltNeu(worttr,"Sg.");
 s=buildPropNeu(lautschr,"Sg.");
 if(endsWith(title,"or")){
  s=buildPropNeu(lautschr,"Pl.");
  s=s.replace(/ʀən}}/,"ɐ̯}}");
 }
 if(endsWith(title,"e")){
  feminin.wt=feminin.wt.substr(0,feminin.wt.length-1);
  s=s.replace(/ə}}/,"}}");
 }

 if(s.length==0||contains(s,"…")){
  feminin.lss="{{Lautschrift|…}}";
  feminin.lsp=feminin.lss;
 }else{
  feminin.lsp=lsPlusE(s,title,"ɪnən");
  feminin.lss=lsPlusE(s,title,"ɪn");
 }

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

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


function createFlexionAdj(v,title,it) {

 var pwt = '';
 var kwt = '';
 var swt = '';
 var pls = '…';
 var kls = '…';
 var sls = '…';
 var khb = 'Audio|';
 var shb = 'Audio|';
 var t = '';
 var ii = getTemplate2(v,"Worttrennung",it);

 if (ii>0) {
  pwt = $.trim(getTextAfter2(v,ii));
  ii =getTemplate2(v,"Komp.",ii);
  if (ii>0) {
   kwt = $.trim(getTextAfter2(v,ii));
   ii =getTemplate2(v,"Sup.",ii);
   if (ii>0) {
    swt = $.trim(getTextAfter2(v,ii).split('\n')[0]);
   }
  }
 }

 ii =getTemplate2(v,"Aussprache",ii+1);
 if (ii>0) {

  ii =getTemplate2(v,"Lautschrift",ii);
  if (ii>0) {
   pls = getTemplateParam2(v,ii,"1");
   ii =getTemplate2(v,"Komp.",ii);
   if (ii>0) {
    ii =getTemplate2(v,"Lautschrift",ii);
    if (ii>0) {
     kls = getTemplateParam2(v,ii,"1");
     ii =getTemplate2(v,"Sup.",ii);
     if (ii>0) {
      ii =getTemplate2(v,"Lautschrift",ii);
      if (ii>0) {
       sls = getTemplateParam2(v,ii,"1");
      }
     }
    }
   }
  }

  ii =getTemplate2(v,"Hörbeispiele",ii+1);
  if (ii>0) {
   ii =getTemplate2(v,"Komp.",ii);
   if (ii>0) {
    ii =getTemplate2(v,"Audio",ii);
    if (ii>0) {
     khb = "Audio|";
     t = getTemplateParam2(v,ii,"1");
     if (t != undefined) {
      khb += t;
      t = getTemplateParam2(v,ii,"2");
      if (t != undefined) {
       khb += "|"+t;
      }
     }
     ii =getTemplate2(v,"Sup.",ii);
     if (ii>0) {
      ii =getTemplate2(v,"Audio",ii);
      if (ii>0) {
       shb = "Audio|";
       t = getTemplateParam2(v,ii,"1");
       if (t != undefined) {
        shb += t;
        t = getTemplateParam2(v,ii,"2");
        if (t != undefined) {
         shb += "|"+t;
        }
       }
      }
     }
    }
   }
  }

 }

 addFlexionAdj(getTemplateParam2(v,it,"Superlativ"),title,swt,sls,shb,"Superla",kls,khb);
 var komp = getTemplateParam2(v,it,"Komparativ");
 addFlexionAdj(komp,title,kwt,kls,khb,"Kompara",kls,khb);
 var posi = getTemplateParam2(v,it,"Positiv");
 if (endsWith(posi,"e")) {
  posi = posi.substr(0,posi.length-1);
  pls  = pls.substr(0,pls.length-1);
 } else if(endsWith(posi,"el")) {
  if (!endsWith(pls,"eːl")) {
   posi = posi.substr(0,posi.length-2)+'l';
   if (endsWith(pls,"əl")) {
    pls  = pls.substr(0,pls.length-2)+'l';
   }else{
    pls  = pls.substr(0,pls.length-1);
   }
   pwt  = pwt.substr(0,pwt.length-3)+'·l';
   if (pwt.length > 3 && pwt[pwt.length-4] == '·') {
    pwt = pwt.substr(0,pwt.length-4)+pwt.substr(pwt.length-3);
   }
  }
 }
 if (posi+"er" != komp){
  kls = '…';
 }
 addFlexionAdj(posi,title,pwt,pls,'',"Posi",kls,khb);

}


function buildWtAltNeu(o,p) {
 var wt='';
 if(o.hasOwnProperty("alt")){
  if(o.alt.hasOwnProperty(p)){
   wt="\n:''Alte Worttrennung:'' "+o.alt[p];
  }
 }
 if(o.hasOwnProperty("neu")){
  if(o.neu.hasOwnProperty(p)){
   if(o.hasOwnProperty("alt") && (o.alt[p] != o.neu[p])){
    wt="''Neue Worttrennung:'' "+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(v,text,title,it) {

 var t=extractStr2(text,getTemplateParam2(v,it,"0"),"\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 wt,ls,hb;

 for (var k=0;k<p1.length;k++) {
  wt=buildWtAltNeu(worttr,"Pl."+p2[k]);
  ls=buildPropNeu(lautschr,"Pl."+p2[k]);
  hb=buildPropNeu(hbs,"Pl."+p2[k]);

  addFlexionSub(v,it,"Genitiv Singular"+p1[k],title,'','','',"Genitiv Singular",ht);
  addFlexionSub(v,it,"Dativ Singular"+p1[k],title,'','','',"Dativ Singular",ht);
  addFlexionSub(v,it,"Akkusativ Singular"+p1[k],title,'','','',"Akkusativ Singular",ht);
  addFlexionSub(v,it,"Instrumental Singular"+p1[k],title,'','','',"Instrumental Singular",ht);
  addFlexionSub(v,it,"Lokativ Singular"+p1[k],title,'','','',"Lokativ Singular",ht);
  addFlexionSub(v,it,"Vokativ Singular"+p1[k],title,'','','',"Vokativ Singular",ht);

  addFlexionSub(v,it,"Plural"+p1[k],title,wt,ls,hb,"Plural",ht);
  addFlexionSub(v,it,"Nominativ Plural"+p1[k],title,wt,ls,hb,"Nominativ Plural",ht);
  addFlexionSub(v,it,"Genitiv Plural"+p1[k],title,'','','',"Genitiv Plural",ht);
  addFlexionSub(v,it,"Dativ Plural"+p1[k],title,'','','',"Dativ Plural",ht);
  addFlexionSub(v,it,"Akkusativ Plural"+p1[k],title,'','','',"Akkusativ Plural",ht);
  addFlexionSub(v,it,"Instrumental Plural"+p1[k],title,'','','',"Instrumental Plural",ht);
  addFlexionSub(v,it,"Lokativ Plural"+p1[k],title,'','','',"Lokativ Plural",ht);
  addFlexionSub(v,it,"Vokativ Plural"+p1[k],title,'','','',"Vokativ Plural",ht);
 }

}


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

 var t, p1wt = '';
 var p2wt = '';
 var p1ls = '…';
 var p2ls = '…';
 var p1hb = 'Audio|';
 var p2hb = 'Audio|';
 var ii = getTemplate2(v,"Worttrennung",it);

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

 p1wt = buildWtAltNeu(getWtSg(wt),0).replace(/\n/g,"d\n")+'d';
 p2wt = buildWtAltNeu(getWtPart(wt),0);

 ii = getTemplate2(v,"Aussprache",ii+1);
 if (ii>0) {
  ii = getTemplate2(v,"Lautschrift",ii);
  if (ii>0) {
   p1ls = getTemplateParam2(v,ii,"1");
   ii = getTemplate2(v,"Part.",ii);
   if (ii>0) {
    ii =getTemplate2(v,"Lautschrift",ii);
    if (ii>0) {
     p2ls = getTemplateParam2(v,ii,"1");
    }
   }
  }
  ii = getTemplate2(v,"Hörbeispiele",ii+1);
  if (ii>0) {
   ii = getTemplate2(v,"Part.",ii);
   if (ii>0) {
    ii = getTemplate2(v,"Audio",ii);
    if (ii>0) {
     p2hb = "Audio|";
     t = getTemplateParam2(v,ii,"1");
     if (t != undefined) {
      p2hb += t;
      t = getTemplateParam2(v,ii,"2");
      if (t != undefined) {
       p2hb += "|"+t;
      }
     }
    }
   }
  }
 }

 $.get(buildUrl2(title+" (Konjugation)",''), handleResponseKonjugation);

 addFlexionPartizip("Deutsch",title+'d',title,p1wt,p1ls+'t',p1hb,"Präsens");
 addFlexionPartizip("Deutsch",getTemplateParam2(v,it,"Partizip II"),title,p2wt,p2ls,p2hb,"Perfekt");

}


function addFlexionPartizip(spr,p,title,wt,ls,hb,gm) {
  if (p == undefined) return;

  var formen = [];
  formen.push(p);
  var i=0;
  var j=0;

// alert("Flexion "+JSON.stringify(formen));
  for (i=0;i<formen.length;i++) {
    if (formen[i]!=title) {

     if (flexion[formen[i]] === undefined) {
      flexion[formen[i]] = new flex(title,"de-Partizip");
     }
     var fi=flexion[formen[i]];

     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=spr;
     if($.inArray(gm,fi.gm) == -1){
      fi.gm.push(gm);
     }
    }
  }
}


function addFlexionVerb(spr,param,title,wt,ls,hb,gm,ht) {
  param=param.replace(/<[^>]*>|\n|,|&#160;/g,' ');
  param=param.replace(/\bmich\b|\bdich\b|\bsich\b|\buns\b|\beuch\b/g,'');
  var re = /!|\bich\b|\bdu\b|\ber\/sie\/es\b|\bwir\b|\bihr\b|\bsie\b/g;
  var nameList = param.split(re);
 
  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],')')) {
     formen.push(nameList[i]);
    }
   }
  }
 
  for (i=0;i<formen.length;i++) {
    if (formen[i]!=title) {
 
     if (flexionv[formen[i]] === undefined) {
      flexionv[formen[i]] = new flex(title,"de-Verb");
     }
     var fi=flexionv[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=spr;
     var g="*"+gm+" des Verbs '''[["+thispage+"]]'''";
     if($.inArray(g,fi.gm) == -1){
      fi.gm.push(g);
     }
 
    }
  }
}


function wtPlusE(wt,e){
 var a=wt.split("\n");
 var i;
 for(i=0;i<a.length;i++){
  if(!startsWith(e,'·')){
   if(endsWith(a[i],"sch")){
    a[i]=insertStr(a[i],-3,'·');
   }else if (a[i].search(/ch$|ck$|ph$|sh$|rh$|th$/g)>=0) {
    a[i]=insertStr(a[i],-2,'·');
   }else if (a[i].search(/a$|e$|i$|o$|u$|ä$|ö$|ü$|y$/g)<0) {
    a[i]=insertStr(a[i],-1,'·');
   }
  }
  a[i]+=e;
 }
 return a.join("\n");
}


function lsPlusE(ls,t,e){
 var a=ls.split("}}");
 var i;
 for(i=0;i<a.length;i++){
  if(a[i].length>0){
   a[i]=prepareLautschrift(t,a[i],e);
  }
 }
 return a.join("}}");
}


function createFlexionWtLs(v,it) {
 var param = getTemplateParam2(v,it,"Nominativ Singular");
 if (param == undefined) param='';
 var re = /\s+|<[^>]*>|{{[^}]*}}|\bder |\bdie |\bdas |\bdes |\bdem |\bden |\bthe /g;
 var nameList = param.split(re);
 var NomSg =nameList[1];
 var wts=buildWtAltNeu(worttr,"Sg.");
 var lss=buildPropNeu(lautschr,"Sg.");

 for (var i in flexion) {
  var fi=flexion[i];
  if (i==NomSg+'e'){
   if (fi.wt.length==0){
    fi.wt=wtPlusE(wts,'e');
   }
   if (fi.ls.length==0){
    fi.ls=lsPlusE(lss,NomSg,"ə");
   }
  }
  if (i==NomSg+'es'){
   if (fi.wt.length==0){
    fi.wt=wtPlusE(wts,'es');
   }
   if (fi.ls.length==0){
    fi.ls=lsPlusE(lss,NomSg,"əs");
   }
  }
  if (i==NomSg+'ses'){
   if (fi.wt.length==0){
    fi.wt=wtPlusE(wts,'·ses');
   }
   if (fi.ls.length==0){
    fi.ls=lsPlusE(lss,NomSg,"səs");
   }
  }
  if (i==NomSg+'s'){
   if (fi.wt.length==0){
    fi.wt=wts.replace(/\n/g,"s\n")+'s';
   }
   if (fi.ls.length==0){
    fi.ls=lsPlusE(lss,NomSg,"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(lss,NomSg,"n");
   }
  }
  for (var j in flexion) {
   if (i==j+'n'){
    if (fi.wt.length==0){
     fi.wt=flexion[j].wt.replace(/\n/g,"n\n")+'n';
    }
    if (fi.ls.length==0){
     fi.ls=flexion[j].ls.replace(/([^….])\}\}/g,"$1n}}");
     if (endsWith(i,"en")){
      fi.ls=anpassenLs(i,fi.ls);
     }
    }
   }
  }
 }
}


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

 var i,j,si,sj,w=[];
 for(i=1;i<sct.section.length;i++){
  si=sct.section[i];
  for(j=1;j<si.child.section.length;j++){
   sj=si.child.section[j];
   var it=getTemplate2(sj.tt,"Deutsch Substantiv Übersicht",0);
   if(it>=0) {
    createFlexionSub(sj.tt,sj.text,title,it);
    createFlexionWtLs(sj.tt,it);
    createWF(sj.tt,sj.text,title,it);
    createDim(sj,title,it);
   }
   var sp=["Esperanto","Englisch","Polnisch","Estnisch"];
   var k;
   for(k=0;k<sp.length;k++){
    it=getTemplate2(sj.tt,sp[k]+" Substantiv Übersicht",0);
    if(it>=0) {
     createFlexionSub(sj.tt,sj.text,title,it);
    }
   }

   it=getTemplate2(sj.tt,"Deutsch Adjektiv Übersicht",0);
   if(it>=0 && !contains(title,' ') && !contains(title,'_')) {
    if(getTemplateParam2(sj.tt,it,"keine weiteren Formen") === undefined){
     if (!(endsWith(title,"mittel") || endsWith(title,"viel"))) {
      createFlexionAdj(sj.tt,title,it);
     }
    }
   }

   it=getTemplate2(sj.tt,"Deutsch Verb Übersicht",0);
   if(it>=0) {
    if (!(endsWith(title,"sein") || endsWith(title,"tun"))) {
     createFlexionVerb(sj.tt,sj.text,title,it);
    }
   }

  }
 }

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


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(index,name){
 for (var i=templates[index].length-1;i>=0;i--) {
  if (templates[index][i].name==name) {
   return templates[index][i].value;
  }
 }
 return undefined;
}

function getTemplateParam2(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 getTextAfter(index){
 if (templates[index+1][0].name == 'T') {
  return templates[index+1][0].value;
 }
 return '';
}

function getTextAfter2(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.toLowerCase();

  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;
        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',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));
      }
      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
        var sect=buildSections(fitext);
        analyzeSections(sect);
        createFlexion(sect,title);
      }
      initTags();
      parseHTML(text,true,warnings);

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

    } while (false)
  }

  // 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;
  }
  buildStructure(lines,parts);
  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 text.substr(1);
}


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");
  n.setAttribute("style", "background-color:#FFE0E0");

  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", "checkpage");
  var txt="Checkpage: ";
  if (checkdone[0]) {
    txt+="Klammern";
  }
  if (checkdone[1]) {
    txt+=", Kapitelstruktur";
  }
  if (checkdone[2]) {
    txt+=", deutsche Abschnitte";
  }
  if (checkdone[3]) {
    txt+="Reime";
  }
  txt+=" geprüft.";

  h.appendChild(document.createTextNode(txt));
  p.insertBefore(h,p.firstChild);

}



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){
 var i,j,si,sj,w=[];
 for(i=1;i<lvl.section.length;i++){
  si=lvl.section[i];
  parseWiki(si.head,si.ht,true,w);
  for(j=1;j<si.child.section.length;j++){
   sj=si.child.section[j];
   parseWiki(sj.head,sj.ht,true,w);
   parseWiki(sj.text,sj.tt,true,w);
  }
 }
}


function buildSections(txt){
 var s=buildSection(txt,"==");
 var i=0;
 for(i=0;i<s.section.length;i++){
  s.section[i].child=buildSection(s.section[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=null; //stufe 3
}


// 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={section:[]},
  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.section.push(new level(head,txt.substring(pos,i+1)));
     head = txt.substring(i+1,j);
     i = j-1;
     pos = j;
    }
   }
   i++;
  }
 }
 s2.section.push(new level(head,txt.substring(pos)));
 return s2;
}


function part(type,begin) {
  this.type = type;
  this.begin = begin;
}


// build Structure
function buildStructure(lines,parts)
{
  var i = 0;
  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,"===")) {
            parts.push(new part('3',i));
          } else if (startsWith(line,"==") && endsWith(line,"==")) {
            parts.push(new part('2',i));
          } else {
            parts.push(new part('1',i));
          }
        }
      } else {
        if (contains(line,"{{Alte Schreibweise|")) {
          parts.push(new part('S',i));
        } else if (contains(line,"{{Schweizer und Liechtensteiner Schreibweise|")) {
          parts.push(new part('S',i));
        } else if (contains(line,"{{Ähnlichkeiten}}")) {
          parts.push(new part('E',i));
        }
      }
    }
    // Prolog vor erster Überschrift
    if (parts.length == 0) {
      parts.push(new part('P',i));
    }
    i++;
  }

  // Ende marker
  parts.push(new part('X',lines.length));

}


// 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++) {

    //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],"|Deutsch}}")) {
        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);
   }
  }

  if (startsWith(line,"{{Ü-Tabelle")) {
   status = "T";
  }
  if (status == "T" && endsWith(line,"|Ü-links=")) {
   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) == '=' )) {
   if (startsWith(line,"====") && contains(line,"Übersetzungen")) {
    //Pseudoabschnitt Übersetzungen
    order = chapterOrder("{{Übersetzungen}}");
   } else {
    order = chapterOrder(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);
 }
}


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){
          reorder[abst]=lii++;
        }
      }
      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 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]!="CHA" && lcs[1]!="DMG" && lcs[1]!="YIVO" && lcs[1]!="ALA-LC" && lcs[1]!="KNAB") {
        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 a = {counter:1000};

 addSk(a,"abq","Abasinisch");
 addSk(a,"ab", "Abchasisch");
 addSk(a,"ady","Adygeisch");
 addSk(a,"aa", "Afar");
 addSk(a,"af", "Afrikaans");
 addSk(a,"egy","Ägyptisch");
 addSk(a,"arz","Ägyptisch-Arabisch");
 addSk(a,"ain","Ainu");
 addSk(a,"akk","Akkadisch");
 addSk(a,"akz","Alabama");
 addSk(a,"sq", "Albanisch");
 addSk(a,"als","Alemannisch");
 addSk(a,"ale","Aleutisch");
 addSk(a,"alt","Altaisch");
 addSk(a,"ang","Altenglisch");
 addSk(a,"ofs","Altfriesisch");
 addSk(a,"grc","Altgriechisch");
 addSk(a,"sga","Altirisch");
 addSk(a,"goh","Althochdeutsch");
 addSk(a,"cu", "Altkirchenslawisch");
 addSk(a,"non","Altnordisch");
 addSk(a,"peo","Altpersisch");
 addSk(a,"osx","Altsächsisch");
 addSk(a,"am", "Amharisch");
 addSk(a,"ar", "Arabisch");
 addSk(a,"class-arb", "Arabisch");
 addSk(a,"new-arb", "Arabisch");
 addSk(a,"an", "Aragonesisch");
 addSk(a,"arc","Aramäisch");
 addSk(a,"arw","Arawak");
 addSk(a,"hy", "Armenisch");
 addSk(a,"rup","Aromunisch");
 addSk(a,"az", "Aserbaidschanisch");
 addSk(a,"as", "Assamesisch");
 addSk(a,"ast","Asturisch");
 addSk(a,"aua","Asumboa");
 addSk(a,"tay","Atayal");
 addSk(a,"ae", "Avestisch");
 addSk(a,"av", "Awarisch");
 addSk(a,"ay", "Aymara");
 addSk(a,"bar","Bairisch");
 addSk(a,"ban","Balinesisch");
 addSk(a,"bm", "Bambara");
 addSk(a,"ba", "Baschkirisch");
 addSk(a,"eu", "Baskisch");
 addSk(a,"bbc","Batak Toba");
 addSk(a,"bci","Baule (Baoulé);");
 addSk(a,"bal","Belutschi");
 addSk(a,"bem","Bemba");
 addSk(a,"bn", "Bengalisch");
 addSk(a,"ber","Berbersprachen");
 addSk(a,"bhw","Biak");
 addSk(a,"bh", "Biharisch");
 addSk(a,"my", "Birmanisch/Burmesisch");
 addSk(a,"bi", "Bislama (Bichelamar);");
 addSk(a,"bpy","Bishnupriya (Manipuri);");
 addSk(a,"bty","Bobot");
 addSk(a,"nb", "Bokmål");
 addSk(a,"bs", "Bosnisch");
 addSk(a,"br", "Bretonisch");
 addSk(a,"bug","Buginesisch");
 addSk(a,"bg", "Bulgarisch");
 addSk(a,"bua","Burjatisch");
 addSk(a,"rmr","Calo");
 addSk(a,"ceb","Cebuano");
 addSk(a,"kjh","Chakassisch");
 addSk(a,"ch", "Chamorro");
 addSk(a,"kca","Chantisch");
 addSk(a,"chr","Cherokee");
 addSk(a,"chy","Cheyenne");
 addSk(a,"ny", "Chichewa");
 addSk(a,"zh", "Chinesisch");
 addSk(a,"zh-tw","Chinesisch (traditionell);");
 addSk(a,"zh-cn","Chinesisch (vereinfacht);");
 addSk(a,"yue","Chinesisch (Kantonesisch);");
 addSk(a,"nan","Chinesisch (Min-Nan);");
 addSk(a,"cho","Choctaw");
 addSk(a,"com","Comanche");
 addSk(a,"cr", "Cree / Cri / Kri");
 addSk(a,"mus","Creek/ Muskogee");
 addSk(a,"da", "Dänisch");
 addSk(a,"prs","Dari (afghanisches Persisch);");
 addSk(a,"dhv","Dehu");
 addSk(a,"ddn","Dendi (Benin);");
 addSk(a,"de", "Deutsch");
 addSk(a,"dob","Dobu");
 addSk(a,"nic","Dogon");
 addSk(a,"dz", "Dzongkha/Bhutanisch");
 addSk(a,"eml","Emilianisch");
 addSk(a,"en", "Englisch");
 addSk(a,"myv","Ersja");
 addSk(a,"eo", "Esperanto");
 addSk(a,"et", "Estnisch");
 addSk(a,"ee", "Ewe");
 addSk(a,"fng","Fanagalo");
 addSk(a,"fo", "Färöisch");
 addSk(a,"fj", "Fidschianisch");
 addSk(a,"hif","Fidschi Hindi");
 addSk(a,"fi", "Finnisch");
 addSk(a,"vls","Flämisch");
 addSk(a,"fon","Fongbe");
 addSk(a,"frp","Franko-Provenzalisch");
 addSk(a,"fr", "Französisch");
 addSk(a,"fur","Friaulisch");
 addSk(a,"ff", "Ful, Fulfulde");
 addSk(a,"gag","Gagausisch");
 addSk(a,"gl", "Galicisch");
 addSk(a,"gay","Gayo");
 addSk(a,"ka", "Georgisch/Grusinisch");
 addSk(a,"gez","Ge’ez");
 addSk(a,"hac","Gorani");
 addSk(a,"got","Gotisch");
 addSk(a,"el", "Griechisch (Neu-);");
 addSk(a,"kl", "Grönländisch/Kalaallisut");
 addSk(a,"gn", "Guarani");
 addSk(a,"gu", "Gudscharati");
 addSk(a,"ht", "Haitianisch");
 addSk(a,"hak","Hakka");
 addSk(a,"ha", "Hausa");
 addSk(a,"haw","Hawaiisch");
 addSk(a,"he", "Hebräisch (Ivrit);");
 addSk(a,"hit","Hethitisch");
 addSk(a,"hi", "Hindi");
 addSk(a,"ho", "Hiri Motu");
 addSk(a,"xhu","Hurritisch");
 addSk(a,"iba","Iban");
 addSk(a,"io", "Ido");
 addSk(a,"ig", "Igbo");
 addSk(a,"ilo","Ilokano");
 addSk(a,"smn","Inari-Saami");
 addSk(a,"id", "Indonesisch");
 addSk(a,"inh","Inguschisch");
 addSk(a,"ia", "Interlingua");
 addSk(a,"ie", "Interlingue/Occidental");
 addSk(a,"iu", "Inuktitut");
 addSk(a,"ik", "Inupiak");
 addSk(a,"ga", "Irisch");
 addSk(a,"xh", "isiXhosa");
 addSk(a,"zu", "isiZulu");
 addSk(a,"is", "Isländisch");
 addSk(a,"it", "Italienisch");
 addSk(a,"sah","Jakutisch");
 addSk(a,"ja", "Japanisch");
 addSk(a,"jv", "Javanisch");
 addSk(a,"yi", "Jiddisch");
 addSk(a,"kbd","Kabardinisch");
 addSk(a,"kab","Kabylisch");
 addSk(a,"xal","Kalmückisch");
 addSk(a,"km", "Kambodschanisch/Khmer-Sprache");
 addSk(a,"kn", "Kannada");
 addSk(a,"yue","Kantonesisch");
 addSk(a,"pam","Kapampangan");
 addSk(a,"kaa","Karakalpakisch");
 addSk(a,"kdr","Karaimisch (Trakai-);");
 addSk(a,"krc","Karatschai-Balkarisch");
 addSk(a,"krl","Karelisch");
 addSk(a,"kyh","Karok");
 addSk(a,"kk", "Kasachisch");
 addSk(a,"ks", "Kaschmiri");
 addSk(a,"csb","Kaschubisch");
 addSk(a,"ca", "Katalanisch");
 addSk(a,"kaw","Kawi");
 addSk(a,"kg", "Kikongo");
 addSk(a,"ki", "Kikuyu");
 addSk(a,"rw", "Kinyarwanda");
 addSk(a,"ky", "Kirgisisch");
 addSk(a,"rn", "Kirundi (Rundisch);");
// addSk(a,"sw", "Kiswahili");
 addSk(a,"tlh","Klingonisch");
 addSk(a,"ksh","Kölsch");
 addSk(a,"koi","Komi-Permjakisch");
 addSk(a,"kv", "Komi");
 addSk(a,"swb","Komorisch");
 addSk(a,"kok","Konkani");
 addSk(a,"cop","Koptisch");
 addSk(a,"ko", "Koreanisch");
 addSk(a,"kw", "Kornisch");
 addSk(a,"co", "Korsisch");
 addSk(a,"kos","Kosrae");
 addSk(a,"crh","Krimtatarisch");
 addSk(a,"hr", "Kroatisch");
 addSk(a,"kj", "Kuanyama");
 addSk(a,"kum","Kumükisch");
 addSk(a,"ku", "Kurdisch");
 addSk(a,"ckb","Kurdisch (Sorani);");
 addSk(a,"kmr","Kurmandschi");
 addSk(a,"lld","Ladinisch");
 addSk(a,"lad","Ladino/Sephardisch");
 addSk(a,"lo", "Laotisch");
 addSk(a,"lzz","Lasisch");
 addSk(a,"la", "Latein");
 addSk(a,"lep","Lepcha");
 addSk(a,"lv", "Lettisch");
 addSk(a,"lij","Ligurisch");
 addSk(a,"li", "Limburgisch");
 addSk(a,"ln", "Lingala");
 addSk(a,"lt", "Litauisch");
 addSk(a,"liv","Livisch");
 addSk(a,"jbo","Lojban");
 addSk(a,"lmo","Lombardisch");
 addSk(a,"lg", "Luganda");
 addSk(a,"xlu","Luwisch");
 addSk(a,"lb", "Luxemburgisch");
 addSk(a,"xld","Lydisch");
 addSk(a,"mas","Maasai");
 addSk(a,"mg", "Madagassisch/Malagasy");
 addSk(a,"mad","Maduresisch");
 addSk(a,"mak","Makassar");
 addSk(a,"ms", "Malaiisch/Malaysisch");
 addSk(a,"ml", "Malayalam");
 addSk(a,"dv", "Maledivisch/Dhivehi");
 addSk(a,"mt", "Maltesisch");
 addSk(a,"mnc","Mandschurisch");
 addSk(a,"mns","Mansisch");
 addSk(a,"gv", "Manx");
 addSk(a,"mi", "Maori");
 addSk(a,"arn","Mapudungun");
 addSk(a,"mr", "Marathi (Marathisch);");
 addSk(a,"chm","Mari");
 addSk(a,"ary","Marokkanisch");
 addSk(a,"mh", "Marshallesisch");
 addSk(a,"mk", "Mazedonisch");
 addSk(a,"min","Minangkabau");
 addSk(a,"enm","Mittelenglisch");
 addSk(a,"gmh","Mittelhochdeutsch");
 addSk(a,"mga","Mittelirisch");
 addSk(a,"gml","Mittelniederdeutsch");
 addSk(a,"dum","Mittelniederländisch");
 addSk(a,"lus","Mizo");
 addSk(a,"moh","Mohawk");
 addSk(a,"mdf","Mokscha(nisch);");
 addSk(a,"mo", "Moldauisch/Moldawisch");
 addSk(a,"mn", "Mongolisch");
 addSk(a,"nah","Nahuatl/ Aztekisch");
 addSk(a,"naq","Nama");
 addSk(a,"na", "Nauruisch");
 addSk(a,"nv", "Navajo");
 addSk(a,"nde","Ndebele (Nord-Ndebele);");
 addSk(a,"ng", "Ndonga");
 addSk(a,"nap","Neapolitanisch");
 addSk(a,"ne", "Nepalesisch (Nepali);");
 addSk(a,"new","Newari");
 addSk(a,"nez","Nez Perce");
 addSk(a,"ngo","Ngoni");
 addSk(a,"nds","Niederdeutsch");
 addSk(a,"nl", "Niederländisch/Holländisch");
 addSk(a,"dsb","Niedersorbisch");
 addSk(a,"nog","Nogaisch");
 addSk(a,"azj","Nordaserbaidschanisch");
 addSk(a,"frr","Nordfriesisch");
 addSk(a,"se", "Nordsamisch");
 addSk(a,"nso","Nord-Sotho");
 addSk(a,"no", "Norwegisch");
 addSk(a,"nn", "Norwegisch (Nynorsk, Neunorwegisch);");
 addSk(a,"nov","Novial");
 addSk(a,"hsb","Obersorbisch");
 addSk(a,"oj", "Ojibwe");
 addSk(a,"oc", "Okzitanisch");
 addSk(a,"ood","O'odham");
 addSk(a,"or", "Oriya");
 addSk(a,"om", "Oromo");
 addSk(a,"os", "Ossetisch");
 addSk(a,"hz", "Otjiherero");
 addSk(a,"pi", "Pali");
 addSk(a,"pa", "Pandschabisch/Pundjabisch");
 addSk(a,"pap","Papiamentu");
 addSk(a,"ps", "Paschtu (Paschtunisch);");
 addSk(a,"pdc","Pennsylvania Dutch");
 addSk(a,"fa", "Persisch");
 addSk(a,"pms","Piemontesisch");
 addSk(a,"pih","Pitkern");
 addSk(a,"pis","Pijin/Neu-Salomonisch");
 addSk(a,"pdt","Plautdietsch");
 addSk(a,"pox","Polabisch");
 addSk(a,"pl", "Polnisch");
 addSk(a,"pt", "Portugiesisch");
 addSk(a,"prg","Prußisch");
 addSk(a,"qu", "Quechua");
 addSk(a,"raj","Rajasthani");
 addSk(a,"rap","Rapanui");
 addSk(a,"rm", "Rätoromanisch");
 addSk(a,"rom","Romani");
 addSk(a,"ro", "Rumänisch");
 addSk(a,"ru", "Russisch");
 addSk(a,"smi","Samische Sprachen");
 addSk(a,"sm", "Samoanisch");
 addSk(a,"sg", "Sango");
 addSk(a,"sa", "Sanskrit");
 addSk(a,"sc", "Sardisch");
 addSk(a,"stq","Saterfriesisch");
 addSk(a,"sgs","Schemaitisch");
 addSk(a,"szl","Schlesisch (polnisch);");
 addSk(a,"gd", "Schottisch-Gälisch");
 addSk(a,"sv", "Schwedisch");
 addSk(a,"sco","Scots");
 addSk(a,"sr", "Serbisch");
 addSk(a,"sh", "Serbokroatisch");
 addSk(a,"crs","Seselwa");
 addSk(a,"st", "Sesotho");
 addSk(a,"tn", "Setswana");
 addSk(a,"sn", "Shona");
 addSk(a,"shh","Shoshone");
 addSk(a,"simple","Simple English");
 addSk(a,"sjn","Sindarin");
 addSk(a,"sd", "Sindhi");
 addSk(a,"si", "Singhalesisch");
 addSk(a,"ss", "Siswati");
 addSk(a,"scn","Sizilianisch");
 addSk(a,"sk", "Slowakisch");
 addSk(a,"sl", "Slowenisch");
 addSk(a,"so", "Somali");
 addSk(a,"ckb","Sorani");
 addSk(a,"wen","Sorbische Sprachen");
 addSk(a,"es", "Spanisch");
 addSk(a,"srn","Sranan Tongo");
 addSk(a,"sw", "Suaheli");
 addSk(a,"azb","Südaserbaidschanisch");
 addSk(a,"nr", "Süd-Ndebele");
// addSk(a,"st", "Süd-Sotho");
 addSk(a,"sux","Sumerisch");
 addSk(a,"su", "Sundanesisch");
 addSk(a,"sva","Swanisch");
 addSk(a,"syr","Syrisch");
 addSk(a,"tg", "Tadschikisch");
 addSk(a,"tl", "Tagalog");
 addSk(a,"ty", "Tahitianisch");
 addSk(a,"ta", "Tamil (Tamilisch);");
 addSk(a,"trv","Taroko");
 addSk(a,"tt", "Tatarisch");
 addSk(a,"te", "Telugu");
 addSk(a,"tet","Tetum");
 addSk(a,"th", "Thailändisch");
 addSk(a,"bo", "Tibetisch");
 addSk(a,"ti", "Tigrinya");
 addSk(a,"tox","Tobianisch");
 addSk(a,"tpi","Tok Pisin");
 addSk(a,"tokipona", "Toki Pona");
 addSk(a,"to", "Tongaisch");
 addSk(a,"cs", "Tschechisch");
 addSk(a,"ce", "Tschetschenisch");
 addSk(a,"ckt","Tschuktschisch");
 addSk(a,"cv", "Tschuwaschisch");
 addSk(a,"ve", "Tshivenda");
 addSk(a,"tpw","Tupí (Língua Geral Paulista);");
 addSk(a,"tpn","Tupinambá");
 addSk(a,"tr", "Türkisch");
 addSk(a,"tk", "Turkmenisch");
 addSk(a,"tvl","Tuvaluisch");
 addSk(a,"tyv","Tuwinisch");
 addSk(a,"udm","Udmurtisch");
 addSk(a,"ug", "Uigurisch");
 addSk(a,"uk", "Ukrainisch");
 addSk(a,"hu", "Ungarisch");
 addSk(a,"xur","Urartäisch");
 addSk(a,"ur", "Urdu");
 addSk(a,"uz", "Usbekisch");
 addSk(a,"xve","Venetisch");
 addSk(a,"vec","Venezianisch");
 addSk(a,"vi", "Vietnamesisch");
 addSk(a,"vo", "Volapük");
 addSk(a,"vro","Võro");
 addSk(a,"cy", "Walisisch");
 addSk(a,"wa", "Wallonisch");
 addSk(a,"war","Waray-Waray");
 addSk(a,"be", "Weißrussisch");
 addSk(a,"vep","Wepsisch");
 addSk(a,"apw","West-Apache");
 addSk(a,"fy", "Westfriesisch");
 addSk(a,"wym","Wilmesaurisch");
 addSk(a,"wo", "Wolof");
 addSk(a,"vot","Wotisch");
 addSk(a,"ts", "Xitsonga");
 addSk(a,"yo", "Yoruba");
 addSk(a,"yua","Yukatekisch");
 addSk(a,"zza","Zazaki");
 addSk(a,"bcl","Zentral-Bikolano");
 addSk(a,"za", "Zhuang");

 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 "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 "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;
}


// <!-- --> 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);
}




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


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 isEmpty(obj){
 for (var k in obj) {
  if (obj.hasOwnProperty(k)) return false;
 }
 return true;
};


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);
}

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


// end namespace: checkpage
}( window.checkpage = window.checkpage || {}, jQuery ));


jQuery(document).ready(checkpage.analyzePage);


// </nowiki>