Es gibt z.Z. Probleme mit einem Update, es ist nur Lesen möglich.
Currently there are issues with the installation, readonly possible for now.

Difference between revisions of "MediaWiki:Gadget-Vorlagenmeister/core.js"

From Jigsaw-Wiki
Jump to: navigation, search
(Die Seite wurde neu angelegt: „/** * Project: Vorlagen-Meister * Version: 0.5+ *** Date: 2015-05-16 or later (see VERSION) * Copyright (C) 2007-2013 de:Benutzer:Revvar * Released under…“)
 
(test new)
 
Line 1: Line 1:
 
/**
 
/**
 
* Project:  Vorlagen-Meister
 
* Project:  Vorlagen-Meister
* Version:  0.5+ *** Date: 2015-05-16 or later (see VERSION)
+
* Version:  0.590+ *** Date: 2018-08-25 or later (see VERSION)
 
* Copyright (C) 2007-2013 [[de:Benutzer:Revvar]]
 
* Copyright (C) 2007-2013 [[de:Benutzer:Revvar]]
 
* Released under the GPL license version 2
 
* Released under the GPL license version 2
Line 31: Line 31:
 
( function ( mw, $ ) {
 
( function ( mw, $ ) {
 
   "use strict";
 
   "use strict";
   var VERSION     = "0.504 * 2015-05-16",
+
   var VERSION   = "0.594 * BETA * 2018-10-24",
       document   = window.document,
+
       document = window.document,
       LOCALS     = { me: "Vorlagenmeister" },
+
       LOCALS   = { me: "Vorlagenmeister" },
       MW_LIB     = "vorlagenmeister",
+
       MW_LIB   = "vorlagenmeister",
       SIGNATURE   = "ext.gadget." + LOCALS.me,
+
       SIGNATURE = "ext.gadget." + LOCALS.me + "/core",
 +
      rLoader  = { },
 
       BUTTONICON, I18N, IS_IE, OPTIONS, PAR_START;
 
       BUTTONICON, I18N, IS_IE, OPTIONS, PAR_START;
 +
  if ( ! mw.loader.getState( SIGNATURE ) ) {
 +
      rLoader[ SIGNATURE ] = "loading";
 +
      mw.loader.state( rLoader );
 +
  }
  
  
Line 69: Line 74:
 
       seekTD:    "Suche TemplateData ...",
 
       seekTD:    "Suche TemplateData ...",
 
       seekXML:    "Suche XML ...",
 
       seekXML:    "Suche XML ...",
 +
      showTdoc:  "Doku",
 
       sys_load_error: "Konnte Vorlageninfo zu \"$1\" nicht laden.",
 
       sys_load_error: "Konnte Vorlageninfo zu \"$1\" nicht laden.",
 
       sys_no_usage_section: "Keine XML-Beschreibung in der Vorlage \"$1\" gefunden.",
 
       sys_no_usage_section: "Keine XML-Beschreibung in der Vorlage \"$1\" gefunden.",
Line 93: Line 99:
 
       seekTD:    "Suche TemplateData ...",
 
       seekTD:    "Suche TemplateData ...",
 
       seekXML:    "Suche XML ...",
 
       seekXML:    "Suche XML ...",
 +
      showTdoc:  "Doku",
 
       sys_load_error: "Konnte Vorlageninfo zu \"$1\" nicht laden.",
 
       sys_load_error: "Konnte Vorlageninfo zu \"$1\" nicht laden.",
 
       sys_no_usage_section: "Keine XML-Beschreibung in der Vorlage \"$1\" gefunden.",
 
       sys_no_usage_section: "Keine XML-Beschreibung in der Vorlage \"$1\" gefunden.",
Line 117: Line 124:
 
       seekTD:    "Looking for TemplateData ...",
 
       seekTD:    "Looking for TemplateData ...",
 
       seekXML:    "Looking for XML ...",
 
       seekXML:    "Looking for XML ...",
 +
      showTdoc:  "doc",
 
       sys_load_error: "Unable to load \"$1\" template info.",
 
       sys_load_error: "Unable to load \"$1\" template info.",
 
       sys_no_usage_section: "No XML description found in \"$1\" template.",
 
       sys_no_usage_section: "No XML description found in \"$1\" template.",
Line 141: Line 149:
 
       seekTD:    "TemplateData-leírás keresése…",
 
       seekTD:    "TemplateData-leírás keresése…",
 
       seekXML:    "XML-leírás keresése…",
 
       seekXML:    "XML-leírás keresése…",
 +
      showTdoc:  "doc",
 
       sys_load_error:  "A(z) \"$1\" sablont nem lehet betölteni.",
 
       sys_load_error:  "A(z) \"$1\" sablont nem lehet betölteni.",
 
       sys_no_usage_section:  "A(z) \"$1\" sablonhoz nem található XML-leírás.",
 
       sys_no_usage_section:  "A(z) \"$1\" sablonhoz nem található XML-leírás.",
Line 191: Line 200:
 
       "vmf" :  "de"
 
       "vmf" :  "de"
 
   };  // I18N.translate
 
   };  // I18N.translate
 +
 +
 +
 +
  function log_message( about ) {
 +
      var s = LOCALS.me + " " + VERSION + ":\r\n" + about;
 +
      window.alert( s );
 +
      if ( typeof window.console  ===  "object"
 +
          &&    window.console ) {
 +
        if ( typeof window.console.error  ===  "function" ) {
 +
            window.console.error( s );
 +
        } else if ( typeof window.console.log  ===  "function" ) {
 +
            window.console.log( s );
 +
        }
 +
      }
 +
  }  // log_message()
  
  
Line 309: Line 333:
  
  
//## File: tm_formular.xsl.js #################################
+
  function preventDefault(event) {
 +
      // if ( ! IS_IE  ||  IS_IE_9plus ) {
 +
        event.preventDefault();
 +
      // }
 +
  }  // preventDefault()
 +
 
 +
 
  
function get_xsl_dom() {
+
  function parseXML(text) {
// 2014-12-27 PerfektesChaos@de.wikipedia
+
      var dom = null,
return parseXML(
+
          aError, aHtmlText, aLocation, error, parser, sError;
'<?xml version="1.0" encoding="utf-8" ?>\n'+
+
      if ( IS_IE ) {
'<!--\n'+
+
        try {
'* Copyright (C) 2007-2013 [[de:Benutzer:Revvar]] <revvar@gmx.de>\n'+
+
            dom = new ActiveXObject( "Microsoft.XMLDOM" );
'* Released under the GPL license\n'+
+
            dom.async = "false";
'* http://www.gnu.org/copyleft/gpl.html\n'+
+
            dom.loadXML( text );
'-->\n'+
+
        } catch(e) {
'<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >\n'+
+
            log_message( "parseXML(IE:ActiveXObject) " + e.message );
'  <xsl:output method="html" />\n'+
+
        }
'  <xsl:param name="locals_submit" />\n'+
+
      }
'  <xsl:param name="locals_cancel" />\n'+
+
      if ( ! dom ) {
'  <xsl:param name="locals_createxml" />\n'+
+
        try {
'  <xsl:param name="locals_template" />\n'+
+
            parser = new DOMParser();
'  <xsl:param name="locals_nohelp" />\n'+
+
            dom = parser.parseFromString( text, "text/xml" );
'  <xsl:param name="locals_version" />\n'+
+
            error = dom.getElementsByTagName( "parsererror" );
'   <xsl:template match="/TemplateUsage">\n'+
+
            if ( error[0] ) {
'\n'+
+
              sError = error[0].firstChild.nodeValue;
'      <!-- create basic gui -->\n'+
+
              log_message("parseXML() " + sError);
'      <div id="tm_main_frame" class="tm_main_frame" tm_output="{@output}" tm_max_value_indentation="{@max_value_indentation}">\n'+
+
              aError = sError.split("\n");
'      <div id="tm_header" class="tm_header">\n'+
+
              if (aError[2]) {
'           <span class="tm_template"><xsl:choose><xsl:when test="$locals_template"><xsl:value-of select="$locals_template" /></xsl:when><xsl:otherwise>locals_template</xsl:otherwise></xsl:choose>:&#160; </span>\n'+
+
                  aLocation=aError[2].match(/[0-9]+/g);
'           <input type="text" id="tm_template" class="tm_template" size="32" disabled="true"/>\n'+
+
                  if (aLocation[0]) {
'           <span class="tm_version"><xsl:choose><xsl:when test="$locals_version"><xsl:value-of select="$locals_version" /></xsl:when><xsl:otherwise>locals_version</xsl:otherwise></xsl:choose></span>\n'+
+
                    aHtmlText = text.split("\n");
'     </div>\n'+
+
                    log_message("error line:"
'     <div id="tm_group_selector" class="tm_group_selector">\n'+
+
                                + aHtmlText[ aLocation[0]-1 ]);
'         <xsl:apply-templates mode="group_selector" />\n'+
+
                  }
'     </div>\n'+
+
              } else {
'     <div id="tm_form" class="tm_form">\n'+
+
                  log_message("no error position");
'     <!-- create form -->\n'+
+
              }
'     <form>\n'+
+
            }
'     <xsl:for-each select="Group">\n'+
+
        } catch(e) {
'         <div id="tm_group_{position()}" tm_name="tm_formelem" class="tm_group" tabindex="{4000+position()}">\n'+
+
            log_message( "parseXML(DOMParser) " + e.message );
'           <xsl:choose>\n'+
+
        }
'              <xsl:when test="@showempty=\'false\'">\n'+
+
      }
'                 <xsl:attribute name="tm_showempty">false</xsl:attribute>\n'+
+
      return dom;
'              </xsl:when>\n'+
+
  }   // parseXML()
'              <xsl:otherwise>\n'+
+
 
'                  <xsl:attribute name="tm_showempty">true</xsl:attribute>\n'+
+
 
'              </xsl:otherwise>\n'+
+
 
'            </xsl:choose>\n'+
+
//## File: tm_formular.xsl.js #################################
'            <xsl:if test="@name">\n'+
+
 
'               <h3 class="tm_group_heading"><xsl:value-of select="@name" /></h3>\n'+
+
function get_xsl_dom() {
'            </xsl:if>\n'+
+
// 2014-12-27 PerfektesChaos@de.wikipedia
'            <xsl:for-each select="Parameter">\n'+
+
return parseXML(
'               <div class="tm_formelem"><table class="tm_table">\n'+
+
'<?xml version="1.0" encoding="utf-8" ?>\n'+
'                 <xsl:if test="@length=\'max\'">\n'+
+
'<!--\n'+
'                     <xsl:attribute name="class">tm_table tm_table_max</xsl:attribute>\n'+
+
'* Copyright (C) 2007-2013 [[de:Benutzer:Revvar]] <revvar@gmx.de>\n'+
'                 </xsl:if>\n'+
+
'* Released under the GPL license\n'+
'                 <xsl:choose><xsl:when test="count(Value)=1">\n'+
+
'* http://www.gnu.org/copyleft/gpl.html\n'+
'                     <input type="checkbox" tm_name="tm_formelem" value="{Value}">\n'+
+
'-->\n'+
'                       <xsl:call-template name="SetBasicAttributes" />\n'+
+
'<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >\n'+
'                     </input>\n'+
+
'   <xsl:output method="html" />\n'+
'                     <span><xsl:choose>\n'+
+
'   <xsl:param name="locals_submit" />\n'+
'                        <xsl:when test="@label">\n'+
+
'   <xsl:param name="locals_cancel" />\n'+
'                           <xsl:value-of select="@label" />\n'+
+
'   <xsl:param name="locals_createxml" />\n'+
'                       </xsl:when>\n'+
+
'   <xsl:param name="locals_template" />\n'+
'                       <xsl:otherwise>\n'+
+
'   <xsl:param name="locals_nohelp" />\n'+
'                           <xsl:value-of select="@name" />\n'+
+
'   <xsl:param name="locals_version" />\n'+
'                       </xsl:otherwise>\n'+
+
'   <xsl:template match="/TemplateUsage">\n'+
'                     </xsl:choose></span>\n'+
+
'\n'+
'                 </xsl:when><xsl:otherwise>\n'+
+
'      <!-- create basic gui -->\n'+
'                     <tr class="tm_tr"><td class="tm_td_label"><span>\n'+
+
'      <div id="tm_main_frame" class="tm_main_frame" style="overflow:hidden" tm_output="{@output}" tm_max_value_indentation="{@max_value_indentation}">\n'+
'                       <xsl:choose>\n'+
+
'     <div id="tm_header" class="tm_header">\n'+
'                           <xsl:when test="@null=\'false\'">\n'+
+
'           <span class="tm_template"><xsl:choose><xsl:when test="$locals_template"><xsl:value-of select="$locals_template" /></xsl:when><xsl:otherwise>locals_template</xsl:otherwise></xsl:choose>:&#160; </span>\n'+
'                             <xsl:attribute name="class">tm_param</xsl:attribute>\n'+
+
'            <input type="text" id="tm_template" class="tm_template" size="32" disabled="true" />\n'+
'                           </xsl:when>\n'+
+
'           <span id="tm_template-doc" class="tm_template-doc"></span>\n'+
'                           <xsl:otherwise>\n'+
+
'            <span class="tm_version"><xsl:choose><xsl:when test="$locals_version"><xsl:value-of select="$locals_version" /></xsl:when><xsl:otherwise>locals_version</xsl:otherwise></xsl:choose></span>\n'+
'                             <xsl:attribute name="class">tm_opt_param</xsl:attribute>\n'+
+
'     </div>\n'+
'                           </xsl:otherwise>\n'+
+
'      <div id="tm_group_selector" class="tm_group_selector">\n'+
'                       </xsl:choose>\n'+
+
'         <xsl:apply-templates mode="group_selector" />\n'+
'                        <xsl:choose>\n'+
+
'     </div>\n'+
'                           <xsl:when test="@label">\n'+
+
'     <div id="tm_form" class="tm_form" style="overflow:auto">\n'+
'                             <xsl:value-of select="@label" />:\n'+
+
'     <!-- create form -->\n'+
'                           </xsl:when>\n'+
+
'      <form style="overflow:auto">\n'+
'                          <xsl:otherwise>\n'+
+
'     <xsl:for-each select="Group">\n'+
'                              <xsl:value-of select="@name" />:\n'+
+
'         <div id="tm_group_{position()}" tm_name="tm_formelem" class="tm_group" tabindex="{4000+position()}">\n'+
'                          </xsl:otherwise>\n'+
+
'           <xsl:choose>\n'+
'                       </xsl:choose>\n'+
+
'               <xsl:when test="@showempty=\'false\'">\n'+
'                     </span></td><td class="tm_td_content">\n'+
+
'                 <xsl:attribute name="tm_showempty">false</xsl:attribute>\n'+
'                     <xsl:choose><xsl:when test="Value">\n'+
+
'               </xsl:when>\n'+
'                       <select tm_name="tm_formelem">\n'+
+
'               <xsl:otherwise>\n'+
'                           <xsl:call-template name="SetBasicAttributes" />\n'+
+
'                 <xsl:attribute name="tm_showempty">true</xsl:attribute>\n'+
'                           <xsl:if test="not (@null=\'false\')">\n'+
+
'               </xsl:otherwise>\n'+
'                              <option />\n'+
+
'           </xsl:choose>\n'+
'                          </xsl:if>\n'+
+
'           <xsl:if test="@name">\n'+
'                          <xsl:for-each select="Value">\n'+
+
'               <h3 class="tm_group_heading"><xsl:value-of select="@name" /></h3>\n'+
'                              <option value="{text()}">\n'+
+
'           </xsl:if>\n'+
'                                <xsl:attribute name="id">' + PAR_START + '<xsl:value-of select="@name"/>_<xsl:value-of select="position()"/></xsl:attribute>\n'+
+
'           <xsl:for-each select="Parameter">\n'+
'                                <xsl:choose><xsl:when test="@label">\n'+
+
'               <div class="tm_formelem"><table class="tm_table">\n'+
'                                <xsl:value-of select="@label" />\n'+
+
'                 <xsl:if test="@length=\'max\'">\n'+
'                                </xsl:when>\n'+
+
'                     <xsl:attribute name="class">tm_table tm_table_max</xsl:attribute>\n'+
'                                <xsl:otherwise>\n'+
+
'                 </xsl:if>\n'+
'                                    <xsl:value-of select="text()" />\n'+
+
'                 <xsl:choose><xsl:when test="count(Value)=1">\n'+
'                                </xsl:otherwise></xsl:choose>\n'+
+
'                     <input type="checkbox" tm_name="tm_formelem" value="{Value}">\n'+
'                                <xsl:if test="position()=0">\n'+
+
'                       <xsl:call-template name="SetBasicAttributes" />\n'+
'                                    <xsl:attribute name="selected" />\n'+
+
'                     </input>\n'+
'                                </xsl:if>\n'+
+
'                    <span>'+
'                              </option>\n'+
+
'                        <xsl:choose>\n'+
'                          </xsl:for-each>\n'+
+
'                          <xsl:when test="@label">\n'+
'                        </select>\n'+
+
'                              <xsl:value-of select="@label" />\n'+
'                    </xsl:when><xsl:when test="@height">\n'+
+
'                          </xsl:when>\n'+
'                        <textarea tm_name="tm_formelem" rows="{@height}">\n'+
+
'                           <xsl:otherwise>\n'+
'                          <xsl:call-template name="SetBasicAttributes" />\n'+
+
'                             <xsl:value-of select="@name" />\n'+
'                          <xsl:choose><xsl:when test="@length=\'max\'">\n'+
+
'                           </xsl:otherwise>\n'+
'                              <xsl:attribute name="class">tm_textarea tm_textarea_max</xsl:attribute>\n'+
+
'                        </xsl:choose>\n'+
'                          </xsl:when><xsl:otherwise>\n'+
+
'                     </span>\n'+
'                              <xsl:attribute name="class">tm_textarea tm_textarea_auto</xsl:attribute>\n'+
+
'                 </xsl:when><xsl:otherwise>\n'+
'                              <xsl:attribute name="cols">\n'+
+
'                    <tr class="tm_tr">\n'+
'                                <xsl:choose><xsl:when test="@length">\n'+
+
'                       <xsl:choose>\n'+
'                                    <xsl:value-of select="@length" />\n'+
+
'                          <xsl:when test="@deprecated=\'true\'">\n'+
'                                </xsl:when>\n'+
+
'                              <xsl:attribute name="class">'+
'                                <xsl:otherwise>20</xsl:otherwise></xsl:choose>\n'+
+
'                                tm_deprecated'+
 
'                              </xsl:attribute>\n'+
 
'                              </xsl:attribute>\n'+
'                          </xsl:otherwise></xsl:choose>\n'+
+
'                          </xsl:when>\n'+
'                          <xsl:value-of select="Default" />\n'+
+
'                        </xsl:choose>\n'+
'                       </textarea>\n'+
+
'                    <td class="tm_td_label"><span>\n'+
'                     </xsl:when><xsl:otherwise>\n'+
+
'                        <xsl:choose>\n'+
//  '   <xsl:when test="@type=\'boolean\'">
+
'                          <xsl:when test="@null=\'false\'">\n'+
//  '     <input type="checkbox" tm_name="tm_formelem" value="1">\n'+
+
'                             <xsl:attribute name="class">tm_param</xsl:attribute>\n'+
//  '         <xsl:call-template name="SetBasicAttributes" />\n'+
+
'                           </xsl:when>\n'+
//  '     </input>\n'+
+
'                          <xsl:otherwise>\n'+
//  '   </xsl:when>\n'+
+
'                             <xsl:attribute name="class">tm_opt_param</xsl:attribute>\n'+
/'   <xsl:otherwise>\n'+
+
'                          </xsl:otherwise>\n'+
//
+
'                        </xsl:choose>\n'+
//   '   </xsl:otherwise>\n'+
+
'                        <xsl:choose>\n'+
'                        <input type="text" tm_name="tm_formelem" value="{Default}" class="tm_input">\n'+
+
'                           <xsl:when test="@label">\n'+
 +
'                             <xsl:value-of select="@label" />:\n'+
 +
'                           </xsl:when>\n'+
 +
'                           <xsl:otherwise>\n'+
 +
'                              <xsl:value-of select="@name" />:\n'+
 +
'                           </xsl:otherwise>\n'+
 +
'                        </xsl:choose>\n'+
 +
'                    </span></td><td class="tm_td_content">\n'+
 +
'                     <xsl:choose><xsl:when test="Value">\n'+
 +
'                        <select tm_name="tm_formelem">\n'+
 
'                          <xsl:call-template name="SetBasicAttributes" />\n'+
 
'                          <xsl:call-template name="SetBasicAttributes" />\n'+
'                          <xsl:choose><xsl:when test="@length=\'max\'">\n'+
+
'                          <xsl:if test="not (@null=\'false\')">\n'+
'                              <xsl:attribute name="class">tm_input tm_input_max</xsl:attribute>\n'+
+
'                              <option />\n'+
'                          </xsl:when><xsl:otherwise>\n'+
+
'                          </xsl:if>\n'+
'                              <xsl:attribute name="size">\n'+
+
'                          <xsl:for-each select="Value">\n'+
'                                <xsl:choose><xsl:when test="@length">\n'+
+
'                              <option value="{text()}">\n'+
'                                    <xsl:value-of select="@length" />\n'+
+
'                                <xsl:attribute name="id">' + PAR_START + '<xsl:value-of select="@name"/>_<xsl:value-of select="position()"/></xsl:attribute>\n'+
 +
'                                <xsl:choose><xsl:when test="@label">\n'+
 +
'                                <xsl:value-of select="@label" />\n'+
 +
'                                </xsl:when>\n'+
 +
'                                <xsl:otherwise>\n'+
 +
'                                    <xsl:value-of select="text()" />\n'+
 +
'                                </xsl:otherwise></xsl:choose>\n'+
 +
'                                <xsl:if test="position()=0">\n'+
 +
'                                    <xsl:attribute name="selected" />\n'+
 +
'                                </xsl:if>\n'+
 +
'                              </option>\n'+
 +
'                          </xsl:for-each>\n'+
 +
'                        </select>\n'+
 +
'                    </xsl:when><xsl:when test="@height">\n'+
 +
'                        <textarea tm_name="tm_formelem" rows="{@height}">\n'+
 +
'                          <xsl:call-template name="SetBasicAttributes" />\n'+
 +
'                          <xsl:choose><xsl:when test="@length=\'max\'">\n'+
 +
'                              <xsl:attribute name="class">tm_textarea tm_textarea_max</xsl:attribute>\n'+
 +
'                          </xsl:when><xsl:otherwise>\n'+
 +
'                              <xsl:attribute name="class">tm_textarea tm_textarea_auto</xsl:attribute>\n'+
 +
'                              <xsl:attribute name="cols">\n'+
 +
'                                <xsl:choose><xsl:when test="@length">\n'+
 +
'                                    <xsl:value-of select="@length" />\n'+
 
'                                </xsl:when>\n'+
 
'                                </xsl:when>\n'+
 
'                                <xsl:otherwise>20</xsl:otherwise></xsl:choose>\n'+
 
'                                <xsl:otherwise>20</xsl:otherwise></xsl:choose>\n'+
 
'                              </xsl:attribute>\n'+
 
'                              </xsl:attribute>\n'+
 
'                          </xsl:otherwise></xsl:choose>\n'+
 
'                          </xsl:otherwise></xsl:choose>\n'+
'                        </input>\n'+
+
'                          <xsl:value-of select="Default" />\n'+
'                    </xsl:otherwise></xsl:choose>\n'+
+
'                        </textarea>\n'+
'                    </td></tr>\n'+
+
'                    </xsl:when><xsl:otherwise>\n'+
'                  </xsl:otherwise></xsl:choose></table>\n'+
+
//  '  <xsl:when test="@type=\'boolean\'">
'              </div>\n'+
+
//  '      <input type="checkbox" tm_name="tm_formelem" value="1">\n'+
'            </xsl:for-each>\n'+
+
//  '        <xsl:call-template name="SetBasicAttributes" />\n'+
'        </div>\n'+
+
//  '      </input>\n'+
'      </xsl:for-each>\n'+
+
//  '  </xsl:when>\n'+
 +
//  '  <xsl:otherwise>\n'+
 +
//
 +
//  '  </xsl:otherwise>\n'+
 +
'                        <input type="text" tm_name="tm_formelem" value="{Default}" class="tm_input">\n'+
 +
'                          <xsl:call-template name="SetBasicAttributes" />\n'+
 +
'                          <xsl:choose><xsl:when test="@length=\'max\'">\n'+
 +
'                              <xsl:attribute name="class">tm_input tm_input_max</xsl:attribute>\n'+
 +
'                          </xsl:when><xsl:otherwise>\n'+
 +
'                              <xsl:attribute name="size">\n'+
 +
'                                <xsl:choose><xsl:when test="@length">\n'+
 +
'                                    <xsl:value-of select="@length" />\n'+
 +
'                                </xsl:when>\n'+
 +
'                                <xsl:otherwise>20</xsl:otherwise></xsl:choose>\n'+
 +
'                              </xsl:attribute>\n'+
 +
'                          </xsl:otherwise></xsl:choose>\n'+
 +
'                        </input>\n'+
 +
'                    </xsl:otherwise></xsl:choose>\n'+
 +
'                    </td></tr>\n'+
 +
'                  </xsl:otherwise></xsl:choose></table>\n'+
 +
'              </div>\n'+
 +
'            </xsl:for-each>\n'+
 +
'        </div>\n'+
 +
'      </xsl:for-each>\n'+
 
'      </form>\n'+
 
'      </form>\n'+
 
'      <!-- end formular creation -->\n'+
 
'      <!-- end formular creation -->\n'+
 
'      </div> <!-- formular -->\n'+
 
'      </div> <!-- formular -->\n'+
 +
'      <div id="tm_state" class="tm_state">:-)</div>\n'+
 
'      <div id="tm_footer" class="tm_footer">\n'+
 
'      <div id="tm_footer" class="tm_footer">\n'+
'            <div id="tm_state" class="tm_state">:-)</div>\n'+
 
 
'            <button id="tm_submit" class="tm_button" tabindex="5000" disabled="true"><xsl:choose><xsl:when test="$locals_submit"><xsl:value-of select="$locals_submit" /></xsl:when><xsl:otherwise>locals_submit</xsl:otherwise></xsl:choose></button>\n'+
 
'            <button id="tm_submit" class="tm_button" tabindex="5000" disabled="true"><xsl:choose><xsl:when test="$locals_submit"><xsl:value-of select="$locals_submit" /></xsl:when><xsl:otherwise>locals_submit</xsl:otherwise></xsl:choose></button>\n'+
 
'            <button id="tm_cancel" class="tm_button" tabindex="5001" disabled="true"><xsl:choose><xsl:when test="$locals_cancel"><xsl:value-of select="$locals_cancel" /></xsl:when><xsl:otherwise>locals_cancel</xsl:otherwise></xsl:choose></button>\n'+
 
'            <button id="tm_cancel" class="tm_button" tabindex="5001" disabled="true"><xsl:choose><xsl:when test="$locals_cancel"><xsl:value-of select="$locals_cancel" /></xsl:when><xsl:otherwise>locals_cancel</xsl:otherwise></xsl:choose></button>\n'+
Line 580: Line 664:
 
       //    editing mode
 
       //    editing mode
 
       var escapeSyntax = "#~\f~#",
 
       var escapeSyntax = "#~\f~#",
           xmlHTTP = { },
+
          max_tics    = 50,
 +
          milli_sec    = 200,
 +
          more_tics    = max_tics,
 +
          sel_fields  = "input[title],select[title],textarea[title]",
 +
           xmlHTTP     = { },
 
           Act_input,
 
           Act_input,
           State,
+
           Divs,
 
           Template,
 
           Template,
 
           Tm_box,
 
           Tm_box,
 
           act_view,
 
           act_view,
 
           generated_xml,
 
           generated_xml,
          help_mutex,
 
 
           is_gecko,
 
           is_gecko,
 
           is_opera,
 
           is_opera,
 
           is_xml_generated,
 
           is_xml_generated,
 
           max_value_indentation,
 
           max_value_indentation,
           resize_mutex;
+
           resize_mutex,
 +
          $sel_fields,
 +
          $Statebar;
  
  
  
       function addEventListener(Node, event, callback) {
+
       function addEventListener( aNode, event, callback ) {
 
         if ( IS_IE
 
         if ( IS_IE
               &&  ( typeof( Node.attachEvent ) === "object"  ||
+
               &&  ( typeof( aNode.attachEvent ) === "object"  ||
                     typeof( Node.attachEvent ) === "function" ) ) {
+
                     typeof( aNode.attachEvent ) === "function" ) ) {
 
             // ... IE10
 
             // ... IE10
             Node.attachEvent( "on"+event, callback );
+
             aNode.attachEvent( "on"+event, callback );
 
         } else {
 
         } else {
             Node.addEventListener( event, callback, false );
+
             aNode.addEventListener( event, callback, false );
 
         }
 
         }
 
       }  // tm_init().addEventListener()
 
       }  // tm_init().addEventListener()
Line 609: Line 698:
  
  
      /* shows the template master */
+
       function removeEventListener( aNode, event, callback ) {
       function show() {
+
         if ( IS_IE
         var marker_end   = "##\f#template_master_marker_end##\f#",
+
              &&   ( typeof( aNode.detachEvent ) === "object" ||
            marker_start = "##\f#template_master_marker_start##\f#",
+
                    typeof( aNode.detachEvent ) === "function" ) ) {
            act_depth, cursor_pos, cursor_depth, cursor_dist, depth,
+
            // ... IE10
            Editbox, end, end_index, i,
+
            aNode.detachEvent("on"+event, callback);
            new_part, new_pos, new_template_source,
+
        } else {
            source, start, start_index,
+
            aNode.removeEventListener(event, callback, false);
            tag_list, tag_pos, Target, Template_given, template_source,
+
        }
            x_htmlcomment, x_nowiki, x_tag;
+
      }  // tm_init().removeEventListener()
 +
 
 +
 
  
 +
      function replace_all( text, regexp, replacement ) {
 +
        var count_tmp = 1000;
 +
        while ( text.search(regexp) >= 0  &&  count_tmp ) {
 +
            text = text.replace(regexp, replacement);
 +
            count_tmp--;
 +
        }
 +
        if (! count_tmp) {
 +
            log_message("replace_all: Internal error - infinite loop");
 +
            text = null;
 +
        }
 +
        return text;
 +
      }  // tm_init().replace_all()
  
  
        function makeTMbox() {
 
            var bx = document.getElementById( "wpTextbox1" ),
 
                r = cNode( bx.parentNode,
 
                          "div",
 
                          null,
 
                          {"id":    "tm_dummy_div",
 
                            "style": "position:absolute;" +
 
                                    "z-index:99;" +
 
                                    "left:" + bx.offsetLeft + "px;" +
 
                                    "top:" + bx.offsetTop + "px;" +
 
                                    "width:" + bx.offsetWidth + "px;" +
 
                                    "height:" + bx.offsetHeight +"px;" +
 
                                    ( IS_IE  ?  "overflow-x:hidden;" +
 
                                                "overflow-y:auto;"
 
                                              : "overflow:auto;" ) } );
 
              return r;
 
        }  // tm_init().show().makeTMbox()
 
  
 
+
      function trim( text ) {
 
+
        text = "" + text;
         function pluginSelect( Target, Tm_box ) {
+
         text = replace_all(text, /^\s+/g, "");
             var A_cancel, A_plugin, Editbox, handler, i, name,
+
        text = replace_all(text, /^(.*?)\s+$/, "$1");
                 Plugin_div, plugins, Template_given, type;
+
        text = replace_all(text, "\n\n", "\n");
             if ( TM_PluginList && TM_PluginList.length ) {
+
        if (text.search(/[^\s]/) < 0) {
               /* create plugin list */
+
            text = "";
              plugins = [ ];
+
        }
              for ( i = 0; i < TM_PluginList.length; i++ ) {
+
        return text;
                   try {
+
      }  // tm_init().trim()
                     name = TM_PluginList[i].opGetName();
+
 
                     type = TM_PluginList[i].opGetType();
+
 
                     if ( type === "Wiki2Template" &&  name ) {
+
 
                         plugins.push( TM_PluginList[i] );
+
      function setStyleAttribute( aNode, attribute ) {
 +
        var aid;
 +
        if ( aNode && attribute ) {
 +
            for ( aid in attribute ) {
 +
              aNode.style[ aid ] = attribute[ aid ];
 +
             }
 +
        }
 +
      }  // tm_init().setStyleAttribute()
 +
 
 +
 
 +
 
 +
 
 +
      function Sanitize() {
 +
        // HTML sanitizer; good luck (singleton)
 +
        var reFirst  = new RegExp( "<\\W*(\\w+)\\W", "g" ),
 +
            saveHTML = " a b bdi bdo br caption cite code col colgroup"
 +
                        + " dd del dfn div dl dt em"
 +
                        + " h1 h2 h3 h4 h5 h6 hr i ins kbd li ol"
 +
                        + " p pre q ruby rp rt"
 +
                        + " s samp small span strong sub sup "
 +
                        + " table tbody td th thead tfoot tr tt"
 +
                        + " u ul var ";
 +
        function first( all, approve ) {
 +
            // Sanitize HTML tags
 +
            var r,
 +
                 s = " " + approve.toLowercase() + " ";
 +
             if ( saveHTML.indexOf( s )  <  0 ) {
 +
              r = "&lt;" + all.substr( 1 );
 +
            } else {
 +
               r = all;
 +
            }
 +
            return r;
 +
        }  // tm_init().Sanitize().first()
 +
        function further( $a, all ) {
 +
            // Sanitize jQuery object
 +
            //    $a  -- jQuery element, with children
 +
            //    all  -- string, with entire HTML code
 +
            //   return sanitized string
 +
            var r  = all,
 +
                dom, i, j, s, shit, $e;
 +
            for ( i = 0; i < $a.length; i++ ) {
 +
              dom = $a.get( i );
 +
// console.log( dom.nodeType, dom.nodeName )
 +
              if ( dom.nodeType === window.document.ELEMENT_NODE ) {
 +
                  $e = $a.eq( i );
 +
                  s  = $e.attr( "style" );
 +
                   if ( s  &&  s.indexOf( "//" )  >  0 ) {
 +
                     shit = "HTML sanitized (possible URL)";
 +
                    break;  // for i
 +
                  }
 +
                  dom = dom.attributes;
 +
                  for ( j = 0;  j < dom.length;  j++ ) {
 +
                     s = dom.item( j ).nodeName.toLowerCase();
 +
// console.log( j, s )
 +
                     if ( s.substr( 0, 2 ) === "on" ) {
 +
                         shit = "HTML sanitized attribute " + s + "=";
 +
                        break;  // for j
 +
                    }
 +
                  }  // for j
 +
                  if ( shit ) {
 +
                    break;  // for i
 +
                  } else {
 +
                    $e = $e.children();
 +
                    if ( $e.length ) {
 +
                        r = further( $e, r );
 
                     }
 
                     }
                  } catch(e) {
 
                    log_message("Incompatible Plugin: " + e.message);
 
 
                   }
 
                   }
              }  // for i
 
              if ( plugins.length > 0 ) {
 
                  Plugin_div = cNode( null,
 
                                      "div",
 
                                      LOCALS.w2t_plugin_selection,
 
                                      {"class": "tm_plugin_selector"} );
 
                  handler = function (e) {
 
                        var plugin = ( IS_IE ? e.srcElement
 
                                            : e.target ).tm_plugin;
 
                        if (plugin) {
 
                          Template_given = plugin.opTransform(Editbox.value.substring(Target.start, Target.end + 1));
 
                          if (Template_given) {
 
                              Plugin_div.parentNode.removeChild(Plugin_div);
 
                              show_template(Tm_box, false, Template_given, Target);
 
                          }
 
                        } else {
 
                          log_message("Internal error: No tm_plugin attribute found.");
 
                        }
 
                  };  // handler()
 
                  for ( i = 0; i < plugins.length; i++ ) {
 
                    A_plugin = cNode(Plugin_div,
 
                                      "a",
 
                                      plugins[i].opGetName(),
 
                                      {"class":"tm_button tm_v_selector tm_plugin_selector"});
 
                    A_plugin.tm_plugin = plugins[i];
 
                    addEventListener( A_plugin, "click", handler );
 
                  }  // for i
 
                  A_cancel = cNode( Plugin_div,
 
                                    "a",
 
                                    LOCALS.Cancel,
 
                                    { "class": "tm_button tm_v_selector tm_cancel_button",
 
                                      "style": "margin-top:8px !important"
 
                                    } );
 
                  addEventListener( A_cancel,
 
                                    "click",
 
                                    function() {
 
                              Plugin_div.parentNode.removeChild(Plugin_div);
 
                              show_template(Tm_box, false, null, Target);
 
                                    } );
 
                  Tm_box.appendChild(Plugin_div);
 
 
               }
 
               }
   /*
+
            }  // for i
               log_message(plugins.join(","));
+
            if ( shit ) {
               Template_given =
+
              r = "****** " + shit + " ******";
                   TM_PluginList[0].opTransform(Editbox.value.substring(Target.start,
+
            }
                                                                      Target.end + 1));
+
            return r;
  */
+
        }  // tm_init().Sanitize().further()
 +
        Sanitize.fire = function ( all ) {
 +
            // Start sanitizing
 +
            //   all  -- string, with entire HTML code
 +
            //    return sanitized string
 +
            var r  = all.replace( reFirst, first ),
 +
                $t = $( "<div>" ).html( r );
 +
            return further( $t, r );
 +
        };  // tm_init().Sanitize.fire()
 +
      }  // tm_init().Sanitize()
 +
 
 +
 
 +
      function cNode( nRoot, nType, nText, nAttr ) {
 +
      /**
 +
        Creates a new GUI node.
 +
 
 +
      @param nRoot null or reference to the prefered root node object
 +
      @param nType HTML type string ("div" for example)
 +
      @param nText null or string with the text for the text child node
 +
      @param nAttr null or object with attribute attributes, ({style:"...",width:"100%"} for example)
 +
      @return the new node object
 +
      @author [[de:Benutzer:Revvar]]
 +
      */
 +
        var elem = document.createElement(nType),
 +
            re1  = /^\s*([^:]+):.*$/,
 +
            re2  = /^\s*[^:]+:\s*([^\s;]+)[\s;]*$/,
 +
            aid,
 +
            i,
 +
            style_attr,
 +
            style_id,
 +
            style_obj,
 +
            style_value;
 +
        if (nAttr) {
 +
            for (aid in nAttr) {
 +
               if (aid === "style") {
 +
                  style_attr = nAttr[aid].split(";");
 +
                  style_obj = { };
 +
                  for (i = 0; i < style_attr.length; i++) {
 +
                    style_id = style_attr[i].replace(re1, "$1");
 +
                    style_value = style_attr[i].replace(re2,"$1");
 +
                    if (style_id.length > 0) {
 +
                        style_obj[style_id] = style_value;
 +
                    }
 +
        //            log_message(style_id + ":" + style_value);
 +
                  }
 +
                  setStyleAttribute(elem, style_obj);
 +
               } else {
 +
                  if (aid === "class") {
 +
                    elem.className = nAttr[aid];
 +
                   } else {
 +
                    elem.setAttribute(aid, nAttr[aid]);
 +
                  }
 +
              }
 +
            }  // for aid in nAttr
 +
        }
 +
        if (nText) {
 +
            elem.appendChild(document.createTextNode(nText));
 +
        }
 +
        if (nRoot) {
 +
            nRoot.appendChild(elem);
 +
        }
 +
        return elem;
 +
      }  // tm_init().cNode()
 +
 
 +
 
 +
 
 +
      function deprecated() {
 +
        var $d = $( ".tm_deprecated" ),
 +
            i, $e, $i;
 +
        for ( i = 0;  i < $d.length;  i++ ) {
 +
            $e = $d.eq( i );
 +
            $i = $e.find( "input[type=\"text\"]" );
 +
            if ( $i.length === 1   &&
 +
                trim( $i.eq( 0 ).val() )  ===  "" ) {
 +
              $e.hide();
 
             }
 
             }
         }  // tm_init().show().pluginSelect()
+
         }  // for i
 +
      }  // tm_init().deprecated()
  
  
  
        function wikEdEnclose( obj ) {
+
      function getNamespaceNumber( pagename, defaultspace ) {
            window.wikEd.GetText( obj, "selection, cursor" );
+
        // return identified number, or defaultspace
             if ( obj.selection.plain === "" ) {
+
        var s = pagename.replace( /^\s+/, "" ),
               obj.sel = window.wikEd.GetSelection();
+
            i = s.indexOf( ":" ),
              if ( obj.sel.anchorNode.previousSibling ) {
+
            n, r;
                  obj.changed = obj.cursor;
+
        if ( i < 0 ) {
              } else {
+
             r = defaultspace;
                  window.wikEd.GetText( obj, "whole" );
+
        } else if ( i ) {
                  obj.changed = obj.whole;
+
            if ( typeof(LOCALS.wgNamespaceIds) !== "object" ) {
              }
+
               LOCALS.wgNamespaceIds = mw.config.get( "wgNamespaceIds" );
             } else {
+
            }
               obj.changed = obj.selection;
+
            s = s.substr( 0,  i - 1 )
 +
                .replace( /\s*$/, "" )
 +
                .replace( /\s+/, "_" )
 +
                .toLowerCase();
 +
            n = LOCALS.wgNamespaceIds[ s ];
 +
             if ( n ) {
 +
               r = n;
 
             }
 
             }
             obj.changed.plain = marker_start
+
        } else {
                                + obj.changed.plain
+
             r = 0;
                                + marker_end;
+
        }
        }  // tm_init().show().wikEdEnclose()
+
        return r;
 +
      }  // tm_init().getNamespaceNumber()
  
  
  
         /* set some globals to their defaults */
+
      function getFullTemplatePagename( page ) {
         State = null;
+
         // return pagename, defaulting to template namespace
         if ( document.getElementById( "tm_dummy_div" ) ) {
+
         var nsn = getNamespaceNumber( page, 10 ),
             switch_view_to();
+
            r  = trim( page );
             return;
+
         r  = ( nsn === 10  ?  LOCALS.template + ":" + r
 +
                            :  r );
 +
        return r.replace( /\s+/g, "_");
 +
      }  // tm_init().getFullTemplatePagename()
 +
 
 +
 
 +
 
 +
      function insertUnknown(e) {
 +
        var text;
 +
        if (IS_IE) {
 +
             text = e.srcElement.title;
 +
        } else {
 +
            text = e.target.title;
 +
        }
 +
        preventDefault(e);
 +
        if ( Act_input  &&
 +
              ! Act_input.nodeName.search(/^(input|select|textarea)$/i)
 +
              &&  Act_input.type.search(/^checkbox$/i) < 0 ) {
 +
             Act_input.value = text;
 
         }
 
         }
 +
      }  // tm_init().insertUnknown()
 +
  
        /* check if cursor within template wikitext and parse it */
 
        Target = { };
 
        Editbox = document.getElementById( "wpTextbox1" );
 
        Target.Editbox = Editbox;
 
  
        /* get cursor/mark position (browser dependant) */
+
      function resizeInputBox( oInputBox, extra_spaces ) {
         if ( typeof( OPTIONS.wikEd ) === "object"
+
         var right_pos = oInputBox.offsetWidth,
              &&  window.wikEd.useWikEd ) {
+
            tmp_str = "",
            window.wikEd.EditButton( null, null, null, wikEdEnclose );
+
            node = oInputBox,
            window.wikEd.UpdateTextarea();
+
            table_node = null,
            window.wikEd.SetEditArea( false, false );
+
            old_width;
            window.wikEd.useWikEd = false;
+
        if (resize_mutex === true) {
            Target.start  = Editbox.value.search( marker_start );
+
             return;
            Editbox.value = Editbox.value.replace( marker_start, "" );
+
        }
             Target.end    = Editbox.value.search( marker_end ) - 1;
+
        resize_mutex = true;
            Editbox.value = Editbox.value.replace( marker_end, "" );
+
         if ( ! ( oInputBox.nodeName  &&
            window.wikEd.UpdateFrame();
+
                  ! oInputBox.nodeName.search(/^input$/i)   &&
            Target.cursor = Target.start;
+
                  oInputBox.type  &&
            OPTIONS.wikEd.live = true;
+
                  ! oInputBox.type.search(/^text$/i) ) ) {
         } else if ( IS_IE ) {
+
             log_message("Internal error: call of resizeInputBox with an unsupported node type: " + oInputBox);
            mw.toolbar.insertTags( marker_start, marker_end, "" );
+
             resize_mutex = false;
            Target.start  = Editbox.value.search( marker_start );
+
             return;
            Editbox.value = Editbox.value.replace( marker_start, "" );
 
            Target.end    = Editbox.value.search( marker_end ) - 1;
 
             Editbox.value = Editbox.value.replace( marker_end, "" );
 
        } else {
 
            Target.cursor = Editbox.selectionStart;
 
             Target.start  = Editbox.selectionStart;
 
             Target.end    = Editbox.selectionEnd - 1;
 
 
         }
 
         }
  
         /* search if cursor within a template */
+
         /* first call for this node ? */
 +
        if (!(oInputBox.tm_org_size)) {
 +
            oInputBox.tm_org_size = oInputBox.size; // save orginal size
 +
        }
  
         /* (1) replace syntax chars within nowiki-tags and html-comments */
+
         if (oInputBox.tm_org_size >= oInputBox.value.length) {
        x_nowiki = /(<nowiki>.*?)[{|}](.*?<\/nowiki>)/g;
+
            resize_mutex = false;
        source = replace_all(Editbox.value, x_nowiki, "$1#$2");
+
            return;
        x_htmlcomment = /(<!--.*?)[{|}](.*?-->)/g;
+
         }
        source = replace_all(Editbox.value, x_htmlcomment, "$1#$2");
+
         oInputBox.size = oInputBox.value.length + extra_spaces;
 
+
         right_pos = oInputBox.offsetWidth;
         /* (2) create a list of all remaining template tags */
+
         tmp_str = "";
         tag_list = [ ];
+
         node = oInputBox;
         depth = 0;
+
         table_node = null;
         x_tag = /(\{\{|\}\})/;
 
         tag_pos = -2;
 
         new_pos = 0;
 
 
         do {
 
         do {
             new_pos = (source.substring(tag_pos + 2)).search(x_tag);
+
             if (node.className.search("tm_table") >= 0) {
            if (new_pos >= 0) {
+
               table_node = node;
               tag_pos += new_pos + 2;
+
            } else {
              switch (source.substring(tag_pos, tag_pos + 2)) {
+
              right_pos += node.offsetLeft;
                  case "{{":
+
              tmp_str  += node.offsetLeft + "px +";
                    tag_list.push( { type:    0,
+
            }
                                      depth:    depth,
+
            node = node.parentNode;
                                      position: tag_pos } );
+
        } while (node.className.search("tm_group") < 0);
                    depth++;
+
        if ((right_pos + 8) > node.offsetWidth) {
                    break;
+
            if (IS_IE) {
                  case "}}":
+
              while ((right_pos + 8) > node.offsetWidth) {
                    depth--;
+
                  old_width = oInputBox.offsetWidth;
                    tag_list.push( { type:    1,
+
                  oInputBox.size--;
                                      depth:    depth,
+
                  right_pos -= old_width - oInputBox.offsetWidth;
                                      position: tag_pos } );
+
              }
                    break;
+
            } else {
                   default:
+
              oInputBox.size = oInputBox.tm_org_size;
                    log_message("Internal error: Searching template tags failed ("+source.substring(tag_pos, tag_pos + 2)+").");
+
              if (table_node) {
                    return;
+
                  table_node.className = "tm_table tm_table_max";
               }  // switch
+
              } else {
 +
                   log_message("internal error: table not found");
 +
              }
 +
               oInputBox.className = "tm_input tm_input_max";
 
             }
 
             }
         } while (new_pos >= 0);
+
            removeEventListener(oInputBox, "keyup", resizeHandler);
 +
        }
 +
        resize_mutex = false;
 +
         return;
 +
      } // tm_init().resizeInputBox()
 +
 
 +
 
 +
 
 +
      function resizeHandler(e) {
 +
        var org_end, org_start, org_value;
 +
        Act_input = (IS_IE ? e.srcElement : e.target);
 +
        Act_input.tm_old_size = Act_input.size;
 +
        resizeInputBox(Act_input, 1);
 +
        if (is_gecko && (Act_input.tm_old_size !== Act_input.size)) {
 +
            org_value = Act_input.value;
 +
            org_start = Act_input.selectionStart;
 +
            org_end = Act_input.selectionEnd;
 +
            Act_input.value = "";
 +
            Act_input.value = org_value;
 +
            if (org_end >= org_start) {
 +
              Act_input.selectionEnd = org_end;
 +
            }
 +
            Act_input.selectionStart = org_start;
 +
            if (org_end < org_start) {
 +
              Act_input.selectionEnd = org_end;
 +
            }
 +
        }
 +
      }  // tm_init().resizeHandler()
 +
 
  
        /* (3) find nearest tag pair (same depth) around the cursor position */
 
        start = -1;
 
        end = -1;
 
        start_index = -1;
 
        end_index = -1;
 
        act_depth = 0;
 
        cursor_pos = Target.start;
 
        cursor_depth = 0;
 
        cursor_dist = 1000000;
 
  
         /* (a) find the depth at cursor pos */
+
      function selectGroup(e) {
         for (i = 0;  i < tag_list.length; i++) {
+
        var Form_div, Group_div, position, text;
             if (tag_list[i].type) {
+
         preventDefault(e);
              if (cursor_pos > tag_list[i].position   &&
+
         try {
                  cursor_pos - tag_list[i].position  <  cursor_dist) {
+
            text = "" + (IS_IE ? e.srcElement : e.target).id;
                  cursor_depth = tag_list[i].depth - 1;
+
             position = Math.round( parseFloat( text.replace( /^.+_([0-9\.]+)$/,
                  cursor_dist = cursor_pos - tag_list[i].position;
+
                                                            "$1") )
              }
+
                                  * ( IS_IE ? 2 : 1 ) );
            } else {
+
            Group_div = document.getElementById("tm_group_"+position);
              if (cursor_pos >= tag_list[i].position    &&
+
            Form_div = document.getElementById("tm_form");
                  cursor_pos - tag_list[i].position < cursor_dist) {
+
            Form_div.scrollTop = Group_div.offsetTop
                  cursor_depth = tag_list[i].depth;
+
                                - Group_div.parentNode.offsetTop;
                  cursor_dist = cursor_pos - tag_list[i].position;
+
        } catch(exc) {
              }
+
            log_message(exc.message+"\n"+"Internal error: Can't select group div with id=\"tm_group_"+position+"\".");
            }
+
            switch_view_to("EB");
            if (cursor_pos < tag_list[i].position) {
+
        }
              break;   // sorted array
+
      }   // tm_init().selectGroup()
             }
+
 
 +
 
 +
 
 +
      function template_doc(  ) {
 +
        var $wrap = $( "#tm_template-doc" ),
 +
            s    = $( "#tm_template").val(),
 +
            $a;
 +
        $wrap.empty();
 +
        if ( s) {
 +
            s = getFullTemplatePagename( s );
 +
            $a = $( "<a>" );
 +
            $a.attr( { href:  mw.util.getUrl( s ),
 +
                      target: "_blank" } )
 +
              .text( LOCALS.showTdoc );
 +
 
 +
            $wrap.append( $a );
 +
        }
 +
      }  // tm_init().template_doc()
 +
 
 +
 
 +
 
 +
      function tipsy() {
 +
        var opts = { gravity: "n",
 +
                      html:    true,
 +
                      opcity:  0.66,
 +
                      trigger: "hover" },
 +
            i, $e;
 +
        for ( i = 0;  i < $sel_fields.length;  i++ ) {
 +
            $e = $sel_fields.eq( i );
 +
             $e.attr( "title",
 +
                    Sanitize.fire( $e.attr( "title" ) ) );
 
         }  // for i
 
         }  // for i
 +
        $sel_fields.tipsy( opts );
 +
      }  // tm_init().tipsy()
 +
 +
  
        /* (b) search */
+
      function whenDOMready() {
         for ( i = 0;  i < tag_list.length;  i++ ) {
+
         $sel_fields = $( "#tm_main_frame" ).find( sel_fields );
            if ( cursor_pos >= tag_list[i].position ) {
+
         if ( $sel_fields.length ) {
              if ( ! tag_list[i].type
+
            more_tics = false;
                  &&  cursor_depth >= tag_list[i].depth ) {
 
                  start = tag_list[i].position;
 
                  start_index = i;
 
                  act_depth = tag_list[i].depth;
 
              }
 
              if ( start > -1  &&
 
                    tag_list[i].type === 1  &&
 
                    act_depth === tag_list[i].depth  &&
 
                    cursor_pos > tag_list[i].position ) {
 
                  start = -1;
 
                  start_index = -1;
 
              }
 
            } else {
 
              break;
 
            }
 
        }  // for i
 
         if ( start > -1 ) {
 
            for ( i = tag_list.length - 1;  i > 0;  i-- ) {
 
              if ( cursor_pos <= tag_list[i].position ) {
 
                  if ( cursor_depth >= tag_list[i].depth
 
                      && tag_list[i].type === 1
 
                      && act_depth === tag_list[i].depth ) {
 
                    end = tag_list[i].position;
 
                    end_index = i;
 
                  }
 
              } else {
 
                  break;
 
              }
 
            }  // for i
 
 
         }
 
         }
 
+
         if ( more_tics ) {
        /* (4) get template source code without the surrounding brackets */
+
             more_tics--;
         if ( start >=0  &&  end >= 0 ) {
+
            window.setTimeout( whenDOMready, milli_sec );
             template_source = Editbox.value.substring(start + 2, end);
 
 
         } else {
 
         } else {
             template_source = null;
+
             more_tics = max_tics;
 +
            // BETA-Test  deprecated();
 +
            template_doc();
 +
            tipsy();
 
         }
 
         }
 +
      }  // tm_init().whenDOMready()
  
        /* defuse nested templates */
 
        new_template_source = "";
 
        if ( start_index + 1  <  end_index - 1 ) {
 
            new_template_source = template_source.substring(0,
 
                                                            tag_list[start_index + 1].position - start);
 
            for ( i = start_index + 1;  i < end_index - 1;  i++ ) {
 
              new_part = template_source.substring(tag_list[i].position - start,
 
                                                    tag_list[i+1].position - start);
 
              if (tag_list[i].depth - tag_list[i].type > act_depth) {
 
                  new_part = replace_all(new_part, /\|/g, escapeSyntax);
 
              }
 
              new_template_source += new_part;
 
            }
 
            new_template_source += template_source.substring(tag_list[end_index - 1].position
 
                                                            - start, template_source.length);
 
            template_source = new_template_source;
 
        }
 
  
        /* parse source */
 
        if (template_source) {
 
            Template_given = parse_template_source(template_source);
 
            if (Template_given) {
 
              // save new positions only, if template parsed successfull
 
              Target.start = start;
 
              Target.end = end + 1;
 
            } else {
 
              template_source = null;
 
            }
 
        }
 
  
        switch_view_to();
+
      /* shows the template master */
        /* dummy main div */
+
      function show() {
        Tm_box = makeTMbox();
+
         var marker_end  = "##\f#template_master_marker_end##\f#",
 
+
             marker_start = "##\f#template_master_marker_start##\f#",
         if ( template_source === null
+
            act_depth, cursor_pos, cursor_depth, cursor_dist, depth,
             &&  Target.start <= Target.end ) {
+
            Editbox, end, end_index, i,
            // ask, if the user want to use a Wikitext_To_Template-Plugin
+
            new_part, new_pos, new_template_source,
            pluginSelect( Target, Tm_box );
+
            source, start, start_index,
        } else {
+
            tag_list, tag_pos, Target, Template_given, template_source,
            /* load given template */
+
            x_htmlcomment, x_nowiki, x_tag;
            show_template( Tm_box, false, Template_given, Target );
 
        }
 
      }  // tm_init().show()
 
  
  
  
/* shows specific template */
+
        function makeTMbox() {
function show_template(Root_node, template_name, Template_given, Target) {
+
            var bx = document.getElementById( "wpTextbox1" ),
  var $buttonOkay = false,
+
                r = cNode( bx.parentNode,
      $throbber  = false,
+
                          "div",
      REclose, REopen, Template_new, $inputTemplateName;
+
                          null,
 +
                          {"id":    "tm_dummy_div",
 +
                            "style": "position:absolute;" +
 +
                                    "z-index:99;" +
 +
                                    "left:" + bx.offsetLeft + "px;" +
 +
                                    "top:" + bx.offsetTop + "px;" +
 +
                                    "width:" + bx.offsetWidth + "px;" +
 +
                                    "height:" + bx.offsetHeight +"px;" +
 +
                                    ( IS_IE  ?  "overflow-x:hidden;" +
 +
                                                "overflow-y:auto;"
 +
                                              : "overflow:auto;" ) } );
 +
              return r;
 +
        }  // tm_init().show().makeTMbox()
  
  
  
  function iso8601( date, local, max ) {
+
        function pluginSelect( Target, Tm_box ) {
      var n = ( max ? max : 19 ),
+
            var A_cancel, A_plugin, Editbox, handler, i, name,
          k, r;
+
                Plugin_div, plugins, Template_given, type;
      function f( a ) {
+
            if ( TM_PluginList && TM_PluginList.length ) {
        return ( local ? "get" : "getUTC" ) +  a;
+
              /* create plugin list */
      }
+
              plugins = [ ];
      r = date[ f( "FullYear" ) ]() +  "";
+
              for ( i = 0; i < TM_PluginList.length; i++ ) {
      if ( n >= 7 ) {
+
                  try {
        r = r + "-";
+
                    name = TM_PluginList[i].opGetName();
        k = date[ f( "Month" ) ]() +  1;
+
                    type = TM_PluginList[i].opGetType();
        if ( k < 10 ) {
+
                    if ( type === "Wiki2Template" &&  name ) {
            r = r + "0";
+
                        plugins.push( TM_PluginList[i] );
        }
+
                    }
        r = r + k;
+
                  } catch(e) {
        if ( n >= 10 ) {
+
                    log_message("Incompatible Plugin: " + e.message);
            r = r + "-";
+
                  }
            k = date[ f( "Date" ) ]();
+
              }  // for i
            if ( k < 10 ) {
+
              if ( plugins.length > 0 ) {
              r = r + "0";
+
                  Plugin_div = cNode( null,
            }
+
                                      "div",
            r = r + k;
+
                                      LOCALS.w2t_plugin_selection,
            if ( n >= 13 ) {
+
                                      {"class": "tm_plugin_selector"} );
              r = r + " ";
+
                  handler = function (e) {
              k = date[ f( "Hours" ) ]();
+
                        var plugin = ( IS_IE ? e.srcElement
              if ( k < 10 ) {
+
                                            : e.target ).tm_plugin;
                  r = r + "0";
+
                        if (plugin) {
              }
+
                          Template_given = plugin.opTransform(Editbox.value.substring(Target.start, Target.end + 1));
              r = r + k;
+
                          if (Template_given) {
              if ( n >= 16 ) {
+
                              Plugin_div.parentNode.removeChild(Plugin_div);
                  r = r + ":";
+
                              show_template(Tm_box, false, Template_given, Target);
                  k = date[ f( "Minutes" ) ]();
+
                          }
                  if ( k < 10 ) {
+
                        } else {
                    r = r + "0";
+
                          log_message("Internal error: No tm_plugin attribute found.");
                   }
+
                        }
                   r = r + k;
+
                  };   // handler()
                  if ( n >= 19 ) {
+
                  for ( i = 0; i < plugins.length; i++ ) {
                    r = r + ":";
+
                    A_plugin = cNode(Plugin_div,
                    k = date[ f( "Seconds" ) ]();
+
                                      "a",
                    if ( k < 10 ) {
+
                                      plugins[i].opGetName(),
                        r = r + "0";
+
                                      {"class":"tm_button tm_v_selector tm_plugin_selector"});
                    }
+
                    A_plugin.tm_plugin = plugins[i];
                    r = r + k;
+
                    addEventListener( A_plugin, "click", handler );
                   }
+
                   }   // for i
 +
                   A_cancel = cNode( Plugin_div,
 +
                                    "a",
 +
                                    LOCALS.Cancel,
 +
                                    { "class": "tm_button tm_v_selector tm_cancel_button",
 +
                                      "style": "margin-top:8px !important"
 +
                                    } );
 +
                  addEventListener( A_cancel,
 +
                                    "click",
 +
                                    function() {
 +
                              Plugin_div.parentNode.removeChild(Plugin_div);
 +
                              show_template(Tm_box, false, null, Target);
 +
                                    } );
 +
                   Tm_box.appendChild(Plugin_div);
 
               }
 
               }
 +
  /*
 +
              log_message(plugins.join(","));
 +
              Template_given =
 +
                  TM_PluginList[0].opTransform(Editbox.value.substring(Target.start,
 +
                                                                      Target.end + 1));
 +
  */
 
             }
 
             }
         }
+
         }  // tm_init().show().pluginSelect()
      }
 
      return r;
 
  }  // tm_init().show_template().iso8601()
 
  
  
  
  function traverse(Parent, name) {
+
        function wikEdEnclose( obj ) {
      var childs = [ ],
+
            window.wikEd.GetText( obj, "selection, cursor" );
          Child = Parent.firstChild;
+
            if ( obj.selection.plain === "" ) {
      while (Child) {
+
              obj.sel = window.wikEd.GetSelection();
        if ((Child.getAttribute) && (Child.getAttribute("tm_name"))) {
+
              if ( obj.sel.anchorNode.previousSibling ) {
            if ( ! (""+Child.getAttribute("tm_name")).search(name) ) {
+
                  obj.changed = obj.cursor;
               childs.push(Child);
+
              } else {
 +
                  window.wikEd.GetText( obj, "whole" );
 +
                  obj.changed = obj.whole;
 +
              }
 +
            } else {
 +
               obj.changed = obj.selection;
 
             }
 
             }
        }
+
            obj.changed.plain = marker_start
        if (Child.firstChild) {
+
                                + obj.changed.plain
            childs = childs.concat(traverse(Child, name));
+
                                + marker_end;
        }
+
        }  // tm_init().show().wikEdEnclose()
        Child = Child.nextSibling;
 
      }
 
      return childs;
 
  }  // tm_init().show_template().traverse()
 
  
  
  
  function attachForm(dom) {
+
        /* set some globals to their defaults */
      /* append formular to root node */
+
        if ( document.getElementById( "tm_dummy_div" ) ) {
      var Mf = dom.getElementById("tm_main_frame"),
+
            switch_view_to();
          i, Input_node, new_height,
+
             return;
          Tm_footer, Tm_form, Tm_header, Tm_main;
 
      if (IS_IE) {
 
        Root_node.removeChild(document.getElementById("tm_dummy_ie_div"));
 
      }
 
      Root_node.appendChild(Mf);
 
 
 
      Tm_main  = document.getElementById("tm_main_frame");
 
      Tm_header = document.getElementById("tm_header");
 
      Tm_form  = document.getElementById("tm_form");
 
      Tm_footer = document.getElementById("tm_footer");
 
 
 
      /* resize all input boxes*/
 
      Input_node = traverse(Tm_form, "tm_formelem");
 
      for (i = 0; i < Input_node.length; i++) {
 
        if (Input_node[i].className === "tm_input") {
 
             resizeInputBox(Input_node[i], 1);
 
 
         }
 
         }
      }
 
  
      /* resize formular */
+
        /* check if cursor within template wikitext and parse it */
      new_height = Root_node.offsetHeight
+
        Target = { };
                  - Tm_header.offsetHeight - Tm_footer.offsetHeight;
+
        Editbox = document.getElementById( "wpTextbox1" );
      setStyleAttribute(Tm_form, {"height": new_height + "px"});
+
        Target.Editbox = Editbox;
      setStyleAttribute(Tm_form, {"height": (new_height + Root_node.offsetHeight - Tm_main.offsetHeight)
 
                                            + "px"} );
 
  }  // tm_init().show_template().attachForm()
 
  
 +
        // CodeMirror
  
 
+
        /* get cursor/mark position (browser dependant) */
  function autovalue( assign ) {
+
        if ( typeof( OPTIONS.wikEd ) === "object"
      var r = "",
+
              && window.wikEd.useWikEd ) {
          date, local, n, perform;
+
            window.wikEd.EditButton( null, null, null, wikEdEnclose );
      if ( typeof assign  === "string"   &&   assign ) {
+
            window.wikEd.UpdateTextarea();
        r = trim( assign );
+
            window.wikEd.SetEditArea( false, false );
        if ( r.charCodeAt( 0 )  === 124 ) {  // '|'
+
            window.wikEd.useWikEd = false;
             perform = r.split( "|" );
+
            Target.start = Editbox.value.search( marker_start );
             switch ( perform[ 1 ] ) {
+
            Editbox.value = Editbox.value.replace( marker_start, "" );
              case "localtime" :
+
            Target.end    = Editbox.value.search( marker_end ) - 1;
                  local = true;
+
             Editbox.value = Editbox.value.replace( marker_end, "" );
                  // fall through
+
             window.wikEd.UpdateFrame();
              case "utc" :
+
            Target.cursor = Target.start;
                  date = new Date();
+
            OPTIONS.wikEd.live = true;
                  if ( perform[ 2 ] ) {
+
/*
                    n = perform[ 2 ].length;
+
  2018-10-24  TEST  IE complaints??
                  }
+
        } else if ( IS_IE ) {
                  r = iso8601( date, local, n );
+
            mw.toolbar.insertTags( marker_start, marker_end, "" );
                  break;
+
            Target.start  = Editbox.value.search( marker_start );
              default:
+
            Editbox.value = Editbox.value.replace( marker_start, "" );
                  r = "";
+
            Target.end    = Editbox.value.search( marker_end ) - 1;
             }  // switch perform[0]
+
            Editbox.value = Editbox.value.replace( marker_end, "" );
 +
*/
 +
        } else {
 +
            Target.cursor = Editbox.selectionStart;
 +
            Target.start  = Editbox.selectionStart;
 +
             Target.end    = Editbox.selectionEnd - 1;
 
         }
 
         }
      }
 
      return r;
 
  }  // tm_init().show_template().autovalue()
 
  
 +
        /* search if cursor within a template */
  
 +
        /* (1) replace syntax chars within nowiki-tags and html-comments */
 +
        x_nowiki = /(<nowiki>.*?)[{|}](.*?<\/nowiki>)/g;
 +
        source = replace_all(Editbox.value, x_nowiki, "$1#$2");
 +
        x_htmlcomment = /(<!--.*?)[{|}](.*?-->)/g;
 +
        source = replace_all(Editbox.value, x_htmlcomment, "$1#$2");
  
  function cancelTemplate(e) {
+
        /* (2) create a list of all remaining template tags */
      if (! IS_IE) {
+
        tag_list = [ ];
        e.preventDefault();
+
        depth = 0;
      }
+
        x_tag = /(\{\{|\}\})/;
      switch_view_to("EB");
+
        tag_pos = -2;
  }  // tm_init().show_template().cancelTemplate()
+
        new_pos = 0;
 
+
        do {
 
+
            new_pos = (source.substring(tag_pos + 2)).search(x_tag);
 
+
            if (new_pos >= 0) {
  function completeForm(dom) {
+
              tag_pos += new_pos + 2;
      var comment_counter = 0,
+
              switch (source.substring(tag_pos, tag_pos + 2)) {
          is_changed = false,
+
                  case "{{":
          Button_cancel, Button_createXML, Button_submit,
+
                    tag_list.push( { type:    0,
          Group_button, group_count, Group_div, Group_selector,
+
                                      depth:    depth,
          i, id, Input_node, name, Name_node, new_name,
+
                                      position: tag_pos } );
          s, sx, Temp_real, Template_used,
+
                    depth++;
          unknown_div, Unknown_link, unknown_parameter;
+
                    break;
 +
                  case "}}":
 +
                    depth--;
 +
                    tag_list.push( { type:    1,
 +
                                      depth:    depth,
 +
                                      position: tag_pos } );
 +
                    break;
 +
                  default:
 +
                    log_message("Internal error: Searching template tags failed ("+source.substring(tag_pos, tag_pos + 2)+").");
 +
                    return;
 +
              }  // switch
 +
            }
 +
        } while (new_pos >= 0);
  
 +
        /* (3) find nearest tag pair (same depth) around the cursor position */
 +
        start = -1;
 +
        end = -1;
 +
        start_index = -1;
 +
        end_index = -1;
 +
        act_depth = 0;
 +
        cursor_pos = Target.start;
 +
        cursor_depth = 0;
 +
        cursor_dist = 1000000;
  
 
+
        /* (a) find the depth at cursor pos */
      function template_name_changed( e ) {
+
         for (i = 0;  i < tag_list.length; i++) {
         var learnt = ( ! is_changed );
+
             if (tag_list[i].type) {
        if ( learnt ) {
+
               if (cursor_pos > tag_list[i].position  &&
             if ( e.type === "keypress" ) {
+
                  cursor_pos - tag_list[i].position  <  cursor_dist) {
               if ( typeof( e.which ) === "number" ) {
+
                   cursor_depth = tag_list[i].depth - 1;
                  learnt = ( e.which === 13 );
+
                   cursor_dist = cursor_pos - tag_list[i].position;
              } else if ( typeof( e.keyCode ) === "number" ) {
 
                   learnt = ( e.keyCode === 13 );
 
              } else {
 
                   learnt = false;
 
 
               }
 
               }
 
             } else {
 
             } else {
               learnt = false;
+
               if (cursor_pos >= tag_list[i].position    &&
 +
                  cursor_pos - tag_list[i].position  <  cursor_dist) {
 +
                  cursor_depth = tag_list[i].depth;
 +
                  cursor_dist = cursor_pos - tag_list[i].position;
 +
              }
 
             }
 
             }
             if ( learnt ) {
+
             if (cursor_pos < tag_list[i].position) {
              new_name =  trim( $inputTemplateName.val() );
+
               break;   // sorted array
              if ( new_name.length ) {
 
                  new_name = new_name.substr( 0, 1 ).toUpperCase()
 
                            + new_name.substr( 1 );
 
                  is_changed = true;
 
                  removeForm();
 
                  show_template(Root_node, new_name, null, Target);
 
               } else {
 
                  $inputTemplateName.val( "" );
 
              }
 
 
             }
 
             }
         }
+
         }  // for i
      }  // tm_init().show_template().completeForm().template_name_changed()
 
  
 +
        /* (b) search */
 +
        for ( i = 0;  i < tag_list.length;  i++ ) {
 +
            if ( cursor_pos >= tag_list[i].position ) {
 +
              if ( ! tag_list[i].type
 +
                  &&  cursor_depth >= tag_list[i].depth ) {
 +
                  start = tag_list[i].position;
 +
                  start_index = i;
 +
                  act_depth = tag_list[i].depth;
 +
              }
 +
              if ( start > -1  &&
 +
                    tag_list[i].type === 1  &&
 +
                    act_depth === tag_list[i].depth  &&
 +
                    cursor_pos > tag_list[i].position ) {
 +
                  start = -1;
 +
                  start_index = -1;
 +
              }
 +
            } else {
 +
              break;
 +
            }
 +
        }  // for i
 +
        if ( start > -1 ) {
 +
            for ( i = tag_list.length - 1;  i > 0;  i-- ) {
 +
              if ( cursor_pos <= tag_list[i].position ) {
 +
                  if ( cursor_depth >= tag_list[i].depth
 +
                      && tag_list[i].type === 1
 +
                      && act_depth === tag_list[i].depth ) {
 +
                    end = tag_list[i].position;
 +
                    end_index = i;
 +
                  }
 +
              } else {
 +
                  break;
 +
              }
 +
            }  // for i
 +
        }
  
 
+
        /* (4) get template source code without the surrounding brackets */
      function template_name_submit() {
+
         if ( start >=0  && end >= 0 ) {
         template_name_changed( { type: "keypress",
+
            template_source = Editbox.value.substring(start + 2, end);
                                  which: 13 } );
+
         } else {
      }  // tm_init().show_template().completeForm().template_name_submit()
+
             template_source = null;
 
 
 
 
 
 
      State = dom.getElementById("tm_state").firstChild;
 
      Name_node = dom.getElementById("tm_template");
 
      $inputTemplateName = $( Name_node );
 
      if ( template_name || Template_given ) {
 
         if ( Template_given ) {
 
             template_name = Template_given.template_name;
 
 
         }
 
         }
        template_name = trim( template_name );
 
        template_name = template_name.replace( /_+/g, " " )
 
                                      .replace( /  +/g, " " );
 
        i = { readOnly: true };
 
        if (template_name.length > 32) {
 
            i.size = template_name.length;
 
        }
 
        $inputTemplateName.val( template_name );
 
        $inputTemplateName.attr( i );
 
      } else {
 
        $inputTemplateName.val( "" );
 
        $buttonOkay = $( "<button>" );
 
        $buttonOkay.attr( { type: "button" } );
 
        $buttonOkay.css( { "margin-left": "1em" } );
 
        $buttonOkay.click( template_name_submit );
 
        $buttonOkay.text( LOCALS.Okay );
 
        $inputTemplateName.after( $buttonOkay );
 
        $inputTemplateName.keypress( template_name_changed );
 
        $inputTemplateName.mousemove( template_name_changed );
 
        $inputTemplateName.dblclick( template_name_submit );
 
      }
 
  
      /* fix an ie width problem for the group divs */
+
        /* defuse nested templates */
      if (IS_IE) {
+
         new_template_source = "";
         group_count = 1;
+
         if ( start_index + 1  <  end_index - 1 ) {
         do {
+
             new_template_source = template_source.substring(0,
             Group_div = dom.getElementById("tm_group_" + group_count);
+
                                                            tag_list[start_index + 1].position - start);
             if ( Group_div  &&
+
             for ( i = start_index + 1;  i < end_index - 1;  i++ ) {
                Group_div.className  &&
+
              new_part = template_source.substring(tag_list[i].position - start,
                ("" + Group_div.className).search("tm_ie_group") < 0 ) {
+
                                                    tag_list[i+1].position - start);
               Group_div.className = "tm_group tm_ie_group";
+
              if (tag_list[i].depth - tag_list[i].type > act_depth) {
 +
                  new_part = replace_all(new_part, /\|/g, escapeSyntax);
 +
              }
 +
               new_template_source += new_part;
 
             }
 
             }
             group_count++;
+
             new_template_source += template_source.substring(tag_list[end_index - 1].position
        } while (Group_div);
+
                                                            - start, template_source.length);
      }
+
            template_source = new_template_source;
 +
        }
  
      Input_node  = traverse(dom, "tm_formelem");
+
        /* parse source */
      group_count = 1;
+
        if (template_source) {
 +
            Template_given = parse_template_source(template_source);
 +
            if (Template_given) {
 +
              // save new positions only, if template parsed successfull
 +
              Target.start = start;
 +
              Target.end = end + 1;
 +
            } else {
 +
              template_source = null;
 +
            }
 +
        }
  
      /* save references to nodes and set help attribute */
+
        switch_view_to();
      for ( i = 0;  i < Input_node.length;  i++ ) {
+
        /* dummy main div */
        if (Input_node[i].className === "tm_group") {
+
        Tm_box = makeTMbox();
            id = "tm_group_" + group_count;
+
 
            Group_div = dom.getElementById(id);
+
        if ( template_source === null
            if ( Group_div ) {
+
            &&  Target.start <= Target.end ) {
              Template_new[id] = Group_div;
+
             // ask, if the user want to use a Wikitext_To_Template-Plugin
              Template_new[id].value = "";
+
             pluginSelect( Target, Tm_box );
              Template_new[id].showempty =
 
                    (Group_div.getAttribute("tm_showempty") !== "false");
 
            }
 
            group_count++;
 
        } else if (Input_node[i].className === "tm_group_heading") {
 
             id = "tm_comment_" + comment_counter;
 
            Template_new[id].value = "";
 
             if (comment_counter) {
 
              Template_new[id].value += "\n";
 
            }
 
            Template_new[id].value += "<!-- "
 
                              + Input_node[i].firstChild.data + " -->\n";
 
            comment_counter++;
 
 
         } else {
 
         } else {
             id = Input_node[i].id;
+
             /* load given template */
             if (id === null) {
+
             show_template( Tm_box, false, Template_given, Target );
              log_message("Internal error: XSLT created input node without id.");
+
        }
              switch_view_to( "EB" );
+
      }  // tm_init().show()
              return false;
+
 
            }
+
 
            if (Template_new[id]) {
+
 
              log_message("Internal error: Duplicate id \"" + id + "\".");
+
/* shows specific template */
              switch_view_to( "EB" );
+
function show_template(Root_node, template_name, Template_given, Target) {
              return false;
+
  var $buttonOkay = false,
            }
+
      $throbber  = false,
            Input_node[i].tm_help = Input_node[i].title;
+
      REclose, REopen, Template_new, $inputTemplateName;
            Template_new[id] = Input_node[i];
+
 
        }
+
 
 +
 
 +
  function iso8601( date, local, max ) {
 +
      var n = ( max ? max : 19 ),
 +
          k, r;
 +
      function f( a ) {
 +
        return ( local ? "get" : "getUTC" ) +  a;
 
       }
 
       }
 
+
       r = date[ f( "FullYear" ) ]() + "";
      /* transform all condition attributes from text to a RegExp */
+
      if ( n >= 7 ) {
       for (i = 0; i < Input_node.length; i++) {
+
        r = r + "-";
        sx = Input_node[i].getAttribute("tm_type");
+
        k = date[ f( "Month" ) ]() + 1;
        if ( sx && typeof sx === "string" ) {
+
        if ( k < 10 ) {
            switch ( sx ) {
+
            r = r + "0";
              case "boolean" :
+
        }
                  s = "[01]";
+
        r = r + k;
                  break;
+
        if ( n >= 10 ) {
              case "date" :
+
            r = r + "-";
                  s = "(1[0-9][0-9][0-9]|20[0-2][0-9])"
+
            k = date[ f( "Date" ) ]();
                      + "(-(1[0-2]|0[0-9])"
+
            if ( k < 10 ) {
                      + "(-(3[01]|[012][0-9])"
+
              r = r + "0";
                        + "([ T][012][0-9]"
+
            }
                        + "(:[0-5][0-9]"
+
            r = r + k;
                          + "(:[0-5][0-9]"
+
            if ( n >= 13 ) {
                          + "(.[0-9]+"
+
               r = r + " ";
                          + ")?"
+
               k = date[ f( "Hours" ) ]();
                          + ")?"
+
              if ( k < 10 ) {
                        + ")?"
+
                   r = r + "0";
                        + ")?"
+
              }
                      + ")?"
+
               r = r + k;
                      + ")?";
+
               if ( n >= 16 ) {
                  break;
+
                   r = r + ":";
               case "line" :
+
                   k = date[ f( "Minutes" ) ]();
                  s = "[^\n]+";
+
                   if ( k < 10 ) {
                  break;
+
                    r = r + "0";
               case "number" :
+
                   }
                  s = "[+-" + String.fromCharCode(8722) + "]?";
+
                   r = r + k;
                   s = s + "[0-9.,]*[0-9]+[0-9.,]*"
+
                  if ( n >= 19 ) {
                      + "([eE]" + s + "[0-9]+)?";
+
                    r = r + ":";
                  break;
+
                    k = date[ f( "Seconds" ) ]();
               case "wiki-file-name" :
+
                    if ( k < 10 ) {
                  s = "[^/#<>{}]+\\.[a-zA-Z][a-zA-Z][a-zA-Z]+";
+
                        r = r + "0";
                  break;
+
                    }
               case "wiki-page-name" :
+
                    r = r + k;
                   s = "[^#<>{}]+";
+
                  }
                   break;
 
              case "wiki-user-name" :
 
                   s = "[^/#<>{}]+";
 
                   break;
 
              default:
 
                   s = false;
 
            }  // switch
 
            if ( s ) {
 
              Input_node[i].tm_type = new RegExp( "^" + s + "$" );
 
              if ( ! sx.indexOf( "wiki-" ) ) {
 
                  Input_node[i].tm_legalWikipage = true;
 
 
               }
 
               }
 
             }
 
             }
 
         }
 
         }
        s = Input_node[i].getAttribute("tm_condition");
+
      }
         if (&& typeof s === "string") {
+
      return r;
             try {
+
  }  // tm_init().show_template().iso8601()
              Input_node[i].tm_condition = new RegExp(s);
+
 
            } catch(e) {
+
 
              log_message(e.message+"\n"
+
 
                          +LOCALS.sys_invalid_condition.replace("$1",
+
  function traverse(Parent, name) {
                                                                s));
+
      var childs = [ ],
               switch_view_to( "EB" );
+
          Child = Parent.firstChild;
              return false;
+
      while (Child) {
 +
         if ((Child.getAttribute) && (Child.getAttribute("tm_name"))) {
 +
             if ( ! (""+Child.getAttribute("tm_name")).search(name) ) {
 +
               childs.push(Child);
 
             }
 
             }
 
         }
 
         }
        s = Input_node[i].getAttribute("tm_autovalue");
+
         if (Child.firstChild) {
         if (s  &&  typeof s === "string") {
+
             childs = childs.concat(traverse(Child, name));
             if ( Input_node[i].getAttribute("tm_null") === "false" ) {
 
              s  = Input_node[i].id;
 
              if ( s  &&  s.substr(0, 8)  ===  "tm_form_" ) {
 
                  s  =  LOCALS.sys_conflict_null_AutoValue
 
                        + " *** " + s.substr(8);
 
              } else {
 
                  s  =  LOCALS.sys_conflict_null_AutoValue;
 
              }
 
              log_message( s );
 
              switch_view_to( "EB" );
 
              return false;
 
            } else {
 
              Input_node[i].tm_autovalue = trim(s);
 
            }
 
 
         }
 
         }
 +
        Child = Child.nextSibling;
 
       }
 
       }
 +
      return childs;
 +
  }  // tm_init().show_template().traverse()
  
       /* map suggested to existing parameter names */
+
 
       if (Template_given
+
 
          && Template_given.source
+
  function attachForm(dom) {
          && Template_given.source === "plug-in") {
+
       /* append formular to root node */
        /* create a list with all valid parameter names */
+
       var Mf = dom.getElementById("tm_main_frame"),
        Temp_real = { };
+
          i, Input_node, new_height,
        for (i = 0; i < Input_node.length; i++) {
+
          Tm_footer, Tm_form, Tm_header, Tm_main;
            name = "" + Input_node[i].id;
+
      if (IS_IE) {
            if (name.length && name.length>0) {
+
         Root_node.removeChild(document.getElementById("tm_dummy_ie_div"));
              Temp_real[name] = true;
 
            }
 
         }
 
        Template_given = mapParameter(Template_given, Temp_real);
 
 
       }
 
       }
 +
      Root_node.appendChild(Mf);
  
 +
      Tm_main  = document.getElementById("tm_main_frame");
 +
      Tm_header = document.getElementById("tm_header");
 +
      Tm_form  = document.getElementById("tm_form");
 +
      Tm_footer = document.getElementById("tm_footer");
  
       /* fill the form with the given template and add resize handler */
+
       /* resize all input boxes*/
       Template_used = { };
+
       Input_node = traverse(Tm_form, "tm_formelem");
       if (Template_given) {
+
       for (i = 0; i < Input_node.length; i++) {
        for (i = 0; i < Input_node.length; i++) {
+
        if (Input_node[i].className === "tm_input") {
            name = "" + Input_node[i].id;
+
            resizeInputBox(Input_node[i], 1);
            if (typeof Template_given[name] === "string") {
 
              Template_used[name] = true; /* mark given parameter to find unknown */
 
            }
 
            if (name
 
                && name.length
 
                && name.length > 0
 
                && Template_given[name]
 
                && Template_given[name].length > 0) {
 
              if ( Input_node[i].nodeName.search(/^select$/i)) {
 
                  if ( ! Input_node[i].type.search(/^checkbox$/i) ) {
 
                    Input_node[i].checked = (Input_node[i].value
 
                                          &&  Input_node[i].value !== "0");
 
                  } else  {   // <select>
 
                    Input_node[i].value = Template_given[name];
 
                    if ( ! Input_node[i].nodeName.search(/^input$/i) ) {
 
                        /* (1) replace newlines with <br /> */
 
                        Input_node[i].value = replace_all(Input_node[i].value,
 
                                                          new RegExp("\n","g"),
 
                                                          "<br />");
 
                    }
 
                  }
 
              } else {
 
                  Input_node[i].value = Template_given[name];
 
                  if (Input_node[i].value !== Template_given[name]) {
 
                    Input_node[i].title = LOCALS.sys_invalid_value
 
                                + ": \"" + Template_given[name] + "\"! "
 
                                + Input_node[i].tm_help;
 
                    Input_node[i].className = "tm_input tm_error";
 
                    Input_node[i].setAttribute("tm_error", "true");
 
                  }
 
              }
 
            }
 
 
         }
 
         }
 
       }
 
       }
  
       /* add function to show help text at state bar on focus and to trace act input field + add resize handler */
+
       /* resize formular */
       for ( i = 0;  i < Input_node.length; i++ ) {
+
       new_height = Root_node.offsetHeight
        addEventListener(Input_node[i], "focus", showHelp);
+
                  - Tm_header.offsetHeight - Tm_footer.offsetHeight;
        if ( ! Input_node[i].nodeName.search(/^input$/i)  &&
+
      setStyleAttribute(Tm_form, {"height": new_height + "px"});
              ! Input_node[i].type.search(/^text$/i) &&
+
      setStyleAttribute(Tm_form, {"height": (new_height + Root_node.offsetHeight - Tm_main.offsetHeight)
              Input_node[i].className.search(/tm_input_max/i) < 0 ) {
+
                                            + "px"} );
            addEventListener(Input_node[i], "keyup", resizeHandler);
+
  }  // tm_init().show_template().attachForm()
 +
 
 +
 
 +
 
 +
  function autovalue( assign ) {
 +
      var r = "",
 +
          date, local, n, perform;
 +
      if ( typeof assign  === "string"  &&   assign ) {
 +
        r = trim( assign );
 +
        if ( r.charCodeAt( 0 )  ===  124 ) {  // '|'
 +
            perform = r.split( "|" );
 +
            switch ( perform[ 1 ] ) {
 +
              case "localtime" :
 +
                  local = true;
 +
                  // fall through
 +
              case "utc" :
 +
                  date = new Date();
 +
                  if ( perform[ 2 ] ) {
 +
                    n = perform[ 2 ].length;
 +
                  }
 +
                  r = iso8601( date, local, n );
 +
                  break;
 +
              default:
 +
                  r = "";
 +
            }  // switch perform[0]
 
         }
 
         }
 
       }
 
       }
 +
      return r;
 +
  }  // tm_init().show_template().autovalue()
 +
 +
 +
 +
  function cancelTemplate(e) {
 +
      preventDefault(e);
 +
      switch_view_to("EB");
 +
  }  // tm_init().show_template().cancelTemplate()
 +
  
      /* add function for the group selection button */
 
      Group_selector = dom.getElementById("tm_group_selector");
 
      if (Group_selector) {
 
        Group_button = Group_selector.firstChild;
 
        while (Group_button) {
 
            if (Group_button.nodeName.search(/^a$/i) === 0) {
 
              addEventListener(Group_button, "click", selectGroup);
 
            }
 
            Group_button = Group_button.nextSibling;
 
        }
 
      }
 
  
      /* search unknown given named parameter */
+
  function createXML(e) {
      if (Template_given && Template_used) {
+
      var env = mw.config.get( [ "wgScript",
        unknown_parameter = [ ];
+
                                "wgServer" ] ),
        for ( id in Template_given ) {
+
          full_name = getFullTemplatePagename( template_name ),
            if ( ! (Template_used[id] && Template_used[id] === true) &&
+
          tb, textbox, xml_window;
                id !== "source"  &&
+
      preventDefault(e);
                id !== "template_name" &&
+
      xml_window = window.open(
                id !== "tm_form_parameter"/* ??? */ ) {
+
                  env.wgServer + env.wgScript
              name = id.substr( PAR_START.length );
+
                  + "?action=edit&summary="
              unknown_parameter.push( name );
+
                  + encodeURIComponent(LOCALS.summary_generated)
            }
+
                  + "&title=" + encodeURIComponent(full_name)
        }  // for id
+
                  + "/XML" );
        if (unknown_parameter.length > 0) {
+
      xml_window.focus();
            unknown_div = cNode( dom.getElementById("tm_group_selector"),
+
      textbox = xml_window.document.getElementById("wpTextbox1");
                                "div",
+
      if (textbox) {
                                null,
+
        textbox.value = generated_xml;
                                { "class": "tm_unknown_selector",
+
      } else {
                                  "id"  : "tm_unknown_selector" } );
+
        addEventListener(xml_window,
            for ( i = 0;  i < unknown_parameter.length;  i++ ) {
+
                          "load",
               Unknown_link = cNode(unknown_div,
+
                          function () {
                                    "a",
+
               tb = xml_window.document.getElementById("wpTextbox1");
                                    unknown_parameter[i],
+
               if (tb) {
                                    { "class": "tm_button tm_selector tm_unknown_selector",
+
                  tb.value = generated_xml;
                                      "title": Template_given[ PAR_START + unknown_parameter[i] ]
+
              }
                                    } );
+
                          } );
               addEventListener(Unknown_link, "click", insertUnknown);
 
            }   // for i
 
        }
 
 
       }
 
       }
 +
  }  // tm_init().show_template().createXML()
 +
 +
 +
 +
  function completeForm(dom) {
 +
      var comment_counter = 0,
 +
          is_changed = false,
 +
          Button_cancel, Button_createXML, Button_submit,
 +
          Group_button, group_count, Group_div, Group_selector,
 +
          i, id, Input_node, name, Name_node, new_name,
 +
          s, sx, Temp_real, Template_used,
 +
          unknown_div, Unknown_link, unknown_parameter;
 +
  
      /* buttons */
 
      Button_submit = dom.getElementById("tm_submit");
 
      addEventListener(Button_submit, "click", submitTemplate);
 
      Button_cancel = dom.getElementById("tm_cancel");
 
      addEventListener(Button_cancel, "click", cancelTemplate);
 
      if ( is_xml_generated  &&  ! is_opera ) {
 
        Button_createXML = dom.getElementById("tm_createxml");
 
        setStyleAttribute( Button_createXML,
 
                            { visibility: "visible" } );
 
        Button_createXML.removeAttribute("disabled");
 
        if (Button_createXML) {
 
            addEventListener(Button_createXML, "click", createXML);
 
        }
 
      }
 
  
       /* last op (possible race condition!): enable Template_name node and buttons */
+
       function mapParameter(Temp_plugin, Temp_real) {
      $inputTemplateName.attr( "disabled", null );
+
        var Temp_given = { },
      Button_cancel.removeAttribute("disabled");
+
            id, pi_id;
      if (template_name !== false) {
+
        for (id in Temp_real) {
        Button_submit.removeAttribute("disabled");
+
            if (Temp_plugin[id]) {
      }
+
              Temp_given[id] = Temp_plugin[id];
      return dom;
+
              Temp_plugin[id] = null;
  }  // tm_init().show_template().completeForm()
+
            } else {
 +
              for (pi_id in Temp_plugin) {
 +
                  if (Temp_plugin[pi_id] &&
 +
                      id.toLowerCase() === pi_id.toLowerCase()) {
 +
                    Temp_given[id] = Temp_plugin[pi_id];
 +
                    Temp_plugin[pi_id] = null;
 +
                    break;
 +
                  }
 +
              }  // for pi_id in Temp_plugin
 +
            }
 +
        }  // for id in Temp_real
  
 +
        /* append all unknown params */
 +
        for (pi_id in Temp_plugin) {
 +
            if (Temp_plugin[pi_id]) {
 +
              Temp_given[pi_id] = Temp_plugin[pi_id];
 +
            }
 +
        }  // for pi_id in Temp_plugin
 +
        return Temp_given;
 +
      }  // tm_init().show_template().completeForm().mapParameter()
  
  
  function createForm( Xml_dom, Xsl_dom ) {
+
 
       var Result_dom,
+
      function removeForm() {
          group_div,
+
        $( "#tm_main_frame" ).remove();
          Processor,
+
       }  // tm_init().show_template().removeForm()
          Result_div,
+
 
          result_xml,
+
 
          xslDoc,
+
 
          xslt;
+
      function showHelp(e) {
         /* transform XML formular spec with loaded stylesheet */
+
        var div = [ "#tm_main_frame",         // [0]
      if ( typeof(XSLTProcessor) !== "undefined" ) {
+
                    "#tm_form",               // [1]
        Processor = new XSLTProcessor();
+
                    "#tm_footer",             // [2]
        Processor.importStylesheet( Xsl_dom );
+
                    "#tm_header",
        Processor.setParameter(null, "locals_submit",
+
                    "#tm_group_selector" ],
                                LOCALS.Submit);
+
            i, n, s, $elem;
        Processor.setParameter(null, "locals_cancel",
+
        preventDefault(e);
                                LOCALS.Cancel);
+
         if ( ! Divs ) {
         Processor.setParameter(null, "locals_createxml",
+
            Divs = [ ];
                                LOCALS.createXML);
+
            for ( i = 0;  i < div.length;  i++ ) {
         Processor.setParameter(null, "locals_template",
+
              s = div[ i ];
                                LOCALS.template);
+
              if ( i ) {
        Processor.setParameter(null, "locals_nohelp",
+
                  $elem = Divs[ 0 ][ 0 ].find( s );
                                LOCALS.sys_no_help);
+
              } else {
         Processor.setParameter(null, "locals_version",
+
                  $elem = $( s );
                                VERSION);
+
              }
         Result_dom = Processor.transformToDocument( Xml_dom );
+
              Divs.push( [ $elem, $elem.height() ] );
      } else {
+
            }  // for i
         Result_dom = null;
+
            $Statebar = Divs[ 0 ][ 0 ].find( "#tm_state" );
       }
+
            $Statebar.css( { width:    "100%",
       if ( ! Result_dom  &&  IS_IE ) {
+
                            top:      "auto",
         result_xml = null;
+
                            bottom:  Divs[ 2 ][ 1 ],
         if ( IS_IE <= 8 ) {
+
                            left:    "1em",
            if ( typeof( Xml_dom.transformNode ) !== "undefined" ) {
+
                            right:    "1em" } );
               result_xml = Xml_dom.transformNode( Xsl_dom.documentElement );
+
        }
 +
        Act_input = (IS_IE ? e.srcElement : e.target);
 +
        $elem    = $( Act_input );
 +
         s        = $elem.attr( "title" )  ||
 +
                    $elem.attr( "original-title" );
 +
         $Statebar.empty().html( s )
 +
                          .css( { "background-color": null } );
 +
         n = Divs[ 0 ][ 1 ]  -  $Statebar.height();
 +
         for ( i = 2;  i < Divs.length;  i++ ) {
 +
            n -= Divs[ i ][ 1 ];
 +
        }   // for i
 +
         Divs[ 1 ][ 0 ].height( n );
 +
       }   // tm_init().showHelp()
 +
 
 +
 
 +
 
 +
       function template_name_changed( e ) {
 +
         var learnt = ( ! is_changed );
 +
         if ( learnt ) {
 +
            if ( e.type === "keypress" ) {
 +
              if ( typeof( e.which ) === "number" ) {
 +
                  learnt = ( e.which === 13 );
 +
               } else if ( typeof( e.keyCode ) === "number" ) {
 +
                  learnt = ( e.keyCode === 13 );
 +
              } else {
 +
                  learnt = false;
 +
              }
 +
            } else {
 +
              learnt = false;
 
             }
 
             }
        } else {
+
             if ( learnt ) {
             try {
+
               new_name = trim( $inputTemplateName.val() );
               xslt = new ActiveXObject( "Msxml2.XSLTemplate" );
+
               if ( new_name.length ) {
               xslDoc = new ActiveXObject( "Msxml2.FreeThreadedDOMDocument" );
+
                  new_name = new_name.substr( 0, 1 ).toUpperCase()
              xslDoc.loadXML( Xsl_dom.xml );
+
                            + new_name.substr( 1 );
              xslt.stylesheet = xslDoc;
+
                  is_changed = true;
              Processor = xslt.createProcessor();
+
                  removeForm();
              Processor.input = Xml_dom;
+
                  show_template(Root_node, new_name, null, Target);
              Processor.transform();
+
              } else {
              result_xml = Processor.output;
+
                  $inputTemplateName.val( "" );
            } catch (e) {
+
              }
              log_message( "createForm(IE:ActiveXObject) " + e.message );
 
 
             }
 
             }
 
         }
 
         }
        if ( result_xml ) {
+
      }  // tm_init().show_template().completeForm().template_name_changed()
            result_xml = result_xml.replace("locals_submit",
+
 
                                            LOCALS.Submit)
+
 
                                  .replace("locals_cancel",
+
 
                                            LOCALS.Cancel)
+
      function template_name_submit() {
                                  .replace("locals_createxml",
+
        template_name_changed( { type:  "keypress",
                                            LOCALS.createXML)
+
                                  which: 13 } );
                                  .replace("locals_template",
+
      }  // tm_init().show_template().completeForm().template_name_submit()
                                            LOCALS.template)
+
 
                                  .replace(/locals_nohelp/g,
+
 
                                            LOCALS.sys_no_help)
+
      $Statebar = $( "#tm_state" );
                                  .replace("locals_version",
+
      Name_node = dom.getElementById( "tm_template" );
                                            VERSION);
+
      $inputTemplateName = $( Name_node );
            Result_div = cNode( null,
+
      if ( template_name || Template_given ) {
                                "div",
+
        if ( Template_given ) {
                                null,
+
             template_name = Template_given.template_name;
                                { id:    "tm_dummy_ie_div",
+
        }
                                  style: "visibility:hidden;" } );
+
        template_name = trim( template_name );
             Result_div.innerHTML = result_xml;
+
        template_name = template_name.replace( /_+/g, " " )
            Root_node.appendChild( Result_div );
+
                                      .replace( /  +/g, " " );
            Result_dom = document;
+
        i = { readOnly: true };
            group_div = document.getElementById( "tm_group_selector" );
+
        if (template_name.length > 32) {
            if ( ! group_div.firstChild ) {
+
            i.size = template_name.length;
              group_div.parentNode.removeChild( group_div );
 
            }
 
 
         }
 
         }
      }
+
        $inputTemplateName.val( template_name );
      if ( Result_dom ) {
+
         $inputTemplateName.attr( i );
         /* add program logic */
+
         whenDOMready();
         Result_dom = completeForm( Result_dom );
 
 
       } else {
 
       } else {
         log_message( "XSLTProcessor et al. unavailable" );
+
         $inputTemplateName.val( "" );
 +
        $buttonOkay = $( "<button>" );
 +
        $buttonOkay.attr( { type: "button" } );
 +
        $buttonOkay.css( { "margin-left": "1em" } );
 +
        $buttonOkay.click( template_name_submit );
 +
        $buttonOkay.text( LOCALS.Okay );
 +
        $inputTemplateName.after( $buttonOkay );
 +
        $inputTemplateName.keypress( template_name_changed );
 +
        $inputTemplateName.mousemove( template_name_changed );
 +
        $inputTemplateName.dblclick( template_name_submit );
 
       }
 
       }
      return Result_dom;
 
  }  // tm_init().show_template().createForm()
 
 
  
 +
      /* fix an ie width problem for the group divs */
 +
      if (IS_IE) {
 +
        group_count = 1;
 +
        do {
 +
            Group_div = dom.getElementById("tm_group_" + group_count);
 +
            if ( Group_div  &&
 +
                Group_div.className  &&
 +
                ("" + Group_div.className).search("tm_ie_group") < 0 ) {
 +
              Group_div.className = "tm_group tm_ie_group";
 +
            }
 +
            group_count++;
 +
        } while (Group_div);
 +
      }
  
  function createXML(e) {
+
       Input_node  = traverse(dom, "tm_formelem");
       var env = mw.config.get( [ "wgScript",
+
      group_count = 1;
                                "wgServer" ] ),
+
 
          full_name = getFullTemplatePagename( template_name ),
+
       /* save references to nodes and set help attribute */
          tb, textbox, xml_window;
+
       for ( i = 0;  i < Input_node.length;  i++ ) {
      if (! IS_IE) {
+
        if (Input_node[i].className === "tm_group") {
        e.preventDefault();
+
            id = "tm_group_" + group_count;
       }
+
            Group_div = dom.getElementById(id);
       xml_window = window.open(
+
            if ( Group_div ) {
                  env.wgServer + env.wgScript
+
              Template_new[id] = Group_div;
                  + "?action=edit&summary="
+
              Template_new[id].value = "";
                  + encodeURIComponent(LOCALS.summary_generated)
+
              Template_new[id].showempty =
                  + "&title=" + encodeURIComponent(full_name)
+
                    (Group_div.getAttribute("tm_showempty") !== "false");
                  + "/XML" );
+
            }
      xml_window.focus();
+
            group_count++;
      textbox = xml_window.document.getElementById("wpTextbox1");
+
        } else if (Input_node[i].className === "tm_group_heading") {
      if (textbox) {
+
            id = "tm_comment_" + comment_counter;
        textbox.value = generated_xml;
+
            Template_new[id].value = "";
      } else {
+
            if (comment_counter) {
        addEventListener(xml_window,
+
              Template_new[id].value += "\n";
                          "load",
+
            }
                          function () {
+
            Template_new[id].value += "<!-- "
              tb = xml_window.document.getElementById("wpTextbox1");
+
                              + Input_node[i].firstChild.data + " -->\n";
              if (tb) {
+
            comment_counter++;
                  tb.value = generated_xml;
+
        } else {
              }
+
            id = Input_node[i].id;
                          } );
+
            if (id === null) {
      }
+
              log_message("Internal error: XSLT created input node without id.");
  }  // tm_init().show_template().createXML()
+
              switch_view_to( "EB" );
 
+
              return false;
 
+
            }
 
+
            if (Template_new[id]) {
  function load_templateXML( template_name ) {
+
              log_message("Internal error: Duplicate id \"" + id + "\".");
      var full_name = getFullTemplatePagename( template_name );
+
              switch_view_to( "EB" );
 
+
              return false;
      mwXmlHttpRequest( {
+
            }
        api:    false,
+
            Input_node[i].tm_help = Input_node[i].title;
        pars:    { title:  full_name + "/XML" },
+
            Template_new[id] = Input_node[i];
        onload:  function( answer ) {
+
        }
                    var s;
+
       }
                    switch ( typeof answer ) {
 
                        case "string":
 
                          s = answer;
 
                          break;
 
                        case "object":
 
                          s = answer.responseText;
 
                          break;
 
                        default:
 
                          s = false;  // try TemplateData
 
                    }   // switch
 
                    if ( s ) {
 
                        $throbber.hide();
 
                        parseUsage( s, full_name );
 
                    } else {
 
                        throbber( "seekTD" );
 
                        load_TemplateData( full_name );
 
                    }
 
                  },
 
        onerror: function() {
 
                    throbber( "seekTD" );
 
                    load_TemplateData( full_name );
 
                  }
 
      } );
 
  }  // tm_init().show_template().load_templateXML()
 
 
 
 
 
 
 
  function load_TemplateData( full_name ) {
 
      var s = full_name.replace( /\/.*$/, "" );
 
      mwXmlHttpRequest( {
 
          api:    true,
 
          pars:    { action: "templatedata",
 
                      titles: s },
 
        onload:  function( answer ) {
 
                    var story;
 
                    if ( answer ) {
 
                        $throbber.hide();
 
                        story = makeXMLfromTemplateData( answer );
 
                        parseUsage( story, s );
 
                    } else {
 
                        $throbber.hide();
 
                    }
 
                  },
 
        onerror: function() {
 
                    $throbber.hide();
 
                    log_message( LOCALS.sys_load_error.replace("$1",
 
                                                                template_name) );
 
                    switch_view_to( "EB" );
 
                  }
 
       } );
 
  }  // tm_init().show_template().load_TemplateData()
 
  
 +
      /* transform all condition attributes from text to a RegExp */
 +
      for (i = 0; i < Input_node.length; i++) {
 +
        sx = Input_node[i].getAttribute("tm_type");
 +
        if ( sx  &&  typeof sx === "string" ) {
 +
            switch ( sx ) {
 +
              case "boolean" :
 +
                  s = "[01]";
 +
                  break;
 +
              case "date" :
 +
                  s = "(1[0-9][0-9][0-9]|20[0-2][0-9])"
 +
                      + "(-(1[0-2]|0[0-9])"
 +
                      + "(-(3[01]|[012][0-9])"
 +
                        + "([ T][012][0-9]"
 +
                        + "(:[0-5][0-9]"
 +
                          + "(:[0-5][0-9]"
 +
                          + "(.[0-9]+"
 +
                          + ")?"
 +
                          + ")?"
 +
                        + ")?"
 +
                        + ")?"
 +
                      + ")?"
 +
                      + ")?";
 +
                  break;
 +
              case "line" :
 +
                  s = "[^\n]+";
 +
                  break;
 +
              case "number" :
 +
                  s = "[+-" + String.fromCharCode(8722) + "]?";
 +
                  s = s + "[0-9.,]*[0-9]+[0-9.,]*"
 +
                      + "([eE]" + s + "[0-9]+)?";
 +
                  break;
 +
              case "wiki-file-name" :
 +
                  s = "[^/#<>{}]+\\.[a-zA-Z][a-zA-Z][a-zA-Z]+";
 +
                  break;
 +
              case "wiki-page-name" :
 +
                  s = "[^#<>{}]+";
 +
                  break;
 +
              case "wiki-user-name" :
 +
                  s = "[^/#<>{}]+";
 +
                  break;
 +
              default:
 +
                  s = false;
 +
            }  // switch
 +
            if ( s ) {
 +
              Input_node[i].tm_type = new RegExp( "^" + s + "$" );
 +
              if ( ! sx.indexOf( "wiki-" ) ) {
 +
                  Input_node[i].tm_legalWikipage = true;
 +
              }
 +
            }
 +
        }
 +
        s = Input_node[i].getAttribute("tm_condition");
 +
        if (s  &&  typeof s === "string") {
 +
            try {
 +
              Input_node[i].tm_condition = new RegExp(s);
 +
            } catch(e) {
 +
              log_message(e.message+"\n"
 +
                          +LOCALS.sys_invalid_condition.replace("$1",
 +
                                                                s));
 +
              switch_view_to( "EB" );
 +
              return false;
 +
            }
 +
        }
 +
        s = Input_node[i].getAttribute("tm_autovalue");
 +
        if (s  &&  typeof s === "string") {
 +
            if ( Input_node[i].getAttribute("tm_null") === "false" ) {
 +
              s  =  Input_node[i].id;
 +
              if ( s  &&  s.substr(0, 8)  ===  "tm_form_" ) {
 +
                  s  =  LOCALS.sys_conflict_null_AutoValue
 +
                        + " *** " + s.substr(8);
 +
              } else {
 +
                  s  =  LOCALS.sys_conflict_null_AutoValue;
 +
              }
 +
              log_message( s );
 +
              switch_view_to( "EB" );
 +
              return false;
 +
            } else {
 +
              Input_node[i].tm_autovalue = trim(s);
 +
            }
 +
        }
 +
      }
  
 +
      /* map suggested to existing parameter names */
 +
      if (Template_given
 +
          && Template_given.source
 +
          && Template_given.source === "plug-in") {
 +
        /* create a list with all valid parameter names */
 +
        Temp_real = { };
 +
        for (i = 0; i < Input_node.length; i++) {
 +
            name = "" + Input_node[i].id;
 +
            if (name.length && name.length>0) {
 +
              Temp_real[name] = true;
 +
            }
 +
        }
 +
        Template_given = mapParameter(Template_given, Temp_real);
 +
      }
  
  function makeXMLfromTemplateData( apply ) {
+
 
       var r = "",
+
       /* fill the form with the given template and add resize handler */
          o, p, params, sign, slang, story;
+
      Template_used = { };
       function f( assembly, access ) {
+
       if (Template_given) {
         var s, t;
+
         for (i = 0; i < Input_node.length; i++) {
        switch ( typeof assembly[ access ] ) {
+
            name = "" + Input_node[i].id;
             case "object" :
+
            if (typeof Template_given[name] === "string") {
               if ( typeof slang !== "string" ) {
+
              Template_used[name] = true; /* mark given parameter to find unknown */
                  slang = mw.config.get( "wgContentLanguage" );
+
             }
               }
+
            if (name
              t = assembly[ access ];
+
                && name.length
              if ( t ) {
+
                && name.length > 0
                  if ( typeof t[ slang ] =="string" ) {
+
                && Template_given[name]
                     s = t[ slang ];
+
                && Template_given[name].length > 0) {
 +
               if ( Input_node[i].nodeName.search(/^select$/i)) {
 +
                  if ( ! Input_node[i].type.search(/^checkbox$/i) ) {
 +
                    Input_node[i].checked = (Input_node[i].value
 +
                                          && Input_node[i].value !== "0");
 +
                  } else  {   // <select>
 +
                    Input_node[i].value = Template_given[name];
 +
                    if ( ! Input_node[i].nodeName.search(/^input$/i) ) {
 +
                        /* (1) replace newlines with <br /> */
 +
                        Input_node[i].value = replace_all(Input_node[i].value,
 +
                                                          new RegExp("\n","g"),
 +
                                                          "<br />");
 +
                    }
 +
                  }
 +
               } else {
 +
                  Input_node[i].value = Template_given[name];
 +
                  if (Input_node[i].value !== Template_given[name]) {
 +
                    Input_node[i].title = LOCALS.sys_invalid_value
 +
                                + ": \"" + Template_given[name] + "\"! "
 +
                                + Input_node[i].tm_help;
 +
                    Input_node[i].className = "tm_input tm_error";
 +
                     Input_node[i].setAttribute("tm_error", "true");
 
                   }
 
                   }
 
               }
 
               }
              break;
+
            }
            case "string" :
+
        }
              s = assembly[ access ];
+
      }
              break;
+
 
        }  // switch typeof component
+
      /* add function to show help text at state bar on focus and to trace act input field + add resize handler */
        if ( s ) {
+
      for ( i = 0;  i < Input_node.length;  i++ ) {
            s = s.replace( /^\s+/,   "" )
+
        // addEventListener(Input_node[i], "focus", showHelp);
                .replace( /\s+$/,    "" )
+
        if ( ! Input_node[i].nodeName.search(/^input$/i) &&
                .replace( /&nbsp;/g, "&#160;" )
+
              ! Input_node[i].type.search(/^text$/i)  &&
                .replace( /\\/g,     "\\\\" );
+
              Input_node[i].className.search(/tm_input_max/i) < 0 ) {
 +
            addEventListener(Input_node[i], "keyup", resizeHandler);
 
         }
 
         }
        return s;
 
      }  // tm_init().show_template().makeXMLfromTemplateData().f()
 
      if ( typeof apply.pages  ===  "object" ) {
 
        for ( p in apply.pages ) {
 
            o = apply.pages[ p ];
 
            break;
 
        }  // for  in .params
 
 
       }
 
       }
       if ( o ) {
+
 
        if ( typeof o.params  ===  "object"  &&
+
      /* add function for the group selection button */
              o.params ) {
+
       Group_selector = dom.getElementById("tm_group_selector");
            params = o.params;
+
      if (Group_selector) {
            for ( sign in params ) {
+
        Group_button = Group_selector.firstChild;
              if ( sign  &&
+
        while (Group_button) {
                    typeof params[ sign ]  === "object" ) {
+
            if (Group_button.nodeName.search(/^a$/i) === 0) {
                  r    = r + '    <Parameter name="' + sign + '"';
+
              addEventListener(Group_button, "click", selectGroup);
                  p    = params[ sign ];
+
            }
                  story = f( p, "label" );
+
            Group_button = Group_button.nextSibling;
                  if ( story ) {
+
        }
                    r = r + ' label="'
+
      }
                          + story.replace( /</g, "&lt;" )
+
 
                                  .replace( />/g, "&gt;" )
+
      /* search unknown given named parameter */
                          + '"';
+
      if (Template_given && Template_used) {
                  }
+
        unknown_parameter = [ ];
                  if ( typeof p.required  ===  "boolean"   &&
+
        for ( id in Template_given ) {
                      p.required ) {
+
            if ( ! (Template_used[id] && Template_used[id] === true) &&
                    r = r + ' null="false"';
+
                id !== "source" &&
                  }
+
                id !== "template_name" &&
                  if ( typeof p.type  === "string" ) {
+
                id !== "tm_form_parameter"/* ??? */ ) {
                    story = trim( p.type ).toLowerCase();
+
              name = id.substr( PAR_START.length );
                    if ( ! story.indexOf( "string/" ) ) {
+
              unknown_parameter.push( name );
                        story = story.substr( 7 );
+
            }
                    }
+
        }  // for id
                    if ( story && story !== "unknown" ) {
+
        if (unknown_parameter.length > 0) {
                        r = r + ' type="' + story + '"';
+
            unknown_div = cNode( dom.getElementById("tm_group_selector"),
                    }
+
                                "div",
                  }
+
                                null,
                  r = r + '>\n';
+
                                { "class": "tm_unknown_selector",
                  story = f( p, "description" );
+
                                  "id"  : "tm_unknown_selector" } );
                  if ( story ) {
+
            for ( i = 0; i < unknown_parameter.length; i++ ) {
                    r = r + '       <Help>'
+
              Unknown_link = cNode(unknown_div,
                        + story.replace( /</g, "&lt;" )
+
                                    "a",
                                .replace( /&nbsp;/g, "&#160;" )
+
                                    unknown_parameter[i],
                        + '</Help>\n';
+
                                    { "class": "tm_button tm_selector tm_unknown_selector",
                  }
+
                                      "title": Template_given[ PAR_START + unknown_parameter[i] ]
                  if ( typeof p[ "default" ]  ===  "string" ) {
+
                                    } );
                    story = p[ "default" ].replace( /^\s+/, "" )
+
              addEventListener(Unknown_link, "click", insertUnknown);
                                          .replace( /\s+$/, "" );
+
            }  // for i
                    if ( story ) {
+
        }
                        r = r + '      <Default>'
+
       }
                          + story.replace( /</g, "&lt;" )
+
 
                          + '</Default>\n';
+
      /* buttons */
                    }
+
      Button_submit = dom.getElementById("tm_submit");
                  }
+
      addEventListener(Button_submit, "click", submitTemplate);
                  if ( typeof p.autovalue  ===  "string" ) {
+
      Button_cancel = dom.getElementById("tm_cancel");
                    story = p.autovalue.replace( /^\s+/, "" )
+
      addEventListener(Button_cancel, "click", cancelTemplate);
                                        .replace( /\s+$/, "" );
+
      if ( is_xml_generated  &&  ! is_opera ) {
                    if ( story ) {
+
        Button_createXML = dom.getElementById("tm_createxml");
                        r = r + '      <AutoValue>'
+
        setStyleAttribute( Button_createXML,
                          + story.replace( /</g, "&lt;" )
+
                            { visibility: "visible" } );
                          + '</AutoValue>\n';
+
        Button_createXML.removeAttribute("disabled");
                    }
+
        if (Button_createXML) {
                  }
+
            addEventListener(Button_createXML, "click", createXML);
                  r = r + '    </Parameter>\n';
 
              }
 
            }  // for  in .params
 
 
         }
 
         }
 
       }
 
       }
      r = '<?xml version="1.0" encoding="utf-8"?>\n'
 
          + ' <TemplateUsage output="collapse">\n'
 
          + '  <Group>\n'
 
          + r
 
          + '  </Group>\n'
 
          + ' </TemplateUsage>';
 
      return r;
 
  }  // tm_init().show_template().makeXMLfromTemplateData()
 
  
 +
      /* last op (possible race condition!): enable Template_name node and buttons */
 +
      $inputTemplateName.attr( "disabled", null );
 +
      Button_cancel.removeAttribute("disabled");
 +
      if (template_name !== false) {
 +
        Button_submit.removeAttribute("disabled");
 +
      }
 +
      return dom;
 +
  }  // tm_init().show_template().completeForm()
  
  
  function mapParameter(Temp_plugin, Temp_real) {
 
      var Temp_given = { },
 
          id, pi_id;
 
      for (id in Temp_real) {
 
        if (Temp_plugin[id]) {
 
            Temp_given[id] = Temp_plugin[id];
 
            Temp_plugin[id] = null;
 
        } else {
 
            for (pi_id in Temp_plugin) {
 
              if (Temp_plugin[pi_id] &&
 
                  id.toLowerCase() === pi_id.toLowerCase()) {
 
                  Temp_given[id] = Temp_plugin[pi_id];
 
                  Temp_plugin[pi_id] = null;
 
                  break;
 
              }
 
            }  // for pi_id in Temp_plugin
 
        }
 
      }  // for id in Temp_real
 
  
       /* append all unknown params */
+
  function createForm( Xml_dom, Xsl_dom ) {
       for (pi_id in Temp_plugin) {
+
       var Result_dom,
         if (Temp_plugin[pi_id]) {
+
          group_div,
            Temp_given[pi_id] = Temp_plugin[pi_id];
+
          Processor,
         }
+
          Result_div,
      }  // for pi_id in Temp_plugin
+
          result_xml,
      return Temp_given;
+
          xslDoc,
  }  // tm_init().show_template().mapParameter()
+
          xslt;
 
+
        /* transform XML formular spec with loaded stylesheet */
 
+
       if ( typeof(XSLTProcessor) !== "undefined" ) {
 
+
         Processor = new XSLTProcessor();
  function parseUsage( source, full_name ) {
+
         Processor.importStylesheet( Xsl_dom );
      // source: XML document
+
        Processor.setParameter(null, "locals_submit",
      var usage_text, Xml_dom, Xsl_dom;
+
                                LOCALS.Submit);
 
+
         Processor.setParameter(null, "locals_cancel",
      function onload() {
+
                                LOCALS.Cancel);
         var dom = createForm(Xml_dom, Xsl_dom);
+
         Processor.setParameter(null, "locals_createxml",
         if (dom) {
+
                                LOCALS.createXML);
            attachForm(dom);
+
        Processor.setParameter(null, "locals_template",
 
+
                                LOCALS.template);
            /* cache template */
+
        Processor.setParameter(null, "locals_nohelp",
            Template[template_name] = { };
+
                                LOCALS.sys_no_help);
            Template[template_name].Xml_dom = Xml_dom;
+
         Processor.setParameter(null, "locals_version",
            Template[template_name].Xsl_dom = Xsl_dom;
+
                                VERSION);
         } else {
+
         Result_dom = Processor.transformToDocument( Xml_dom );
            switch_view_to( "EB" );
+
       } else {
         }
+
         Result_dom = null;
      }  // tm_init().show_template().parseUsage().onload()
+
      }
 
+
      if ( ! Result_dom  &&  IS_IE ) {
 
+
         result_xml = null;
 
+
         if ( IS_IE <= 8 ) {
       try {
+
            if ( typeof( Xml_dom.transformNode ) !== "undefined" ) {
         Xml_dom = null;
+
              result_xml = Xml_dom.transformNode( Xsl_dom.documentElement );
         Xsl_dom = null;
+
            }
         is_xml_generated = false;
 
 
 
        if ( source.length ) {
 
            usage_text = source;
 
 
         } else {
 
         } else {
             mwXmlHttpRequest( {
+
             try {
                api:     true,
+
              xslt = new ActiveXObject( "Msxml2.XSLTemplate" );
                pars:    { prop:    "revisions",
+
              xslDoc = new ActiveXObject( "Msxml2.FreeThreadedDOMDocument" );
                          rvprop:  "content",
+
              xslDoc.loadXML( Xsl_dom.xml );
                          rvlimit: "1",
+
              xslt.stylesheet = xslDoc;
                          titles:  encodeURIComponent(full_name) },
+
              Processor = xslt.createProcessor();
                onload: function(rD) {
+
              Processor.input = Xml_dom;
                          var endPos, i, names, rT, startPos, tmp,
+
              Processor.transform();
                              varname, vars, xVarname;
+
              result_xml = Processor.output;
                  try {
+
            } catch (e) {
                    rT = rD.responseText;
+
              log_message( "createForm(IE:ActiveXObject) " + e.message );
                    startPos = rT.search('\\[\\{"\\*":"') + 7;
+
            }
                    endPos  = rT.search('"\\}\\]\\}\\}\\},"');
+
        }
 
+
        if ( result_xml ) {
                    if (endPos < 0) {
+
            result_xml = result_xml.replace("locals_submit",
                        log_message(LOCALS.sys_no_such_template.replace("$1",
+
                                            LOCALS.Submit)
                                                                        template_name));
+
                                  .replace("locals_cancel",
                        switch_view_to("EB");
+
                                            LOCALS.Cancel)
                        return;
+
                                  .replace("locals_createxml",
                    }
+
                                            LOCALS.createXML)
 +
                                  .replace("locals_template",
 +
                                            LOCALS.template)
 +
                                  .replace(/locals_nohelp/g,
 +
                                            LOCALS.sys_no_help)
 +
                                  .replace("locals_version",
 +
                                            VERSION);
 +
            Result_div = cNode( null,
 +
                                "div",
 +
                                null,
 +
                                { id:    "tm_dummy_ie_div",
 +
                                  style: "visibility:hidden;" } );
 +
            Result_div.innerHTML = result_xml;
 +
            Root_node.appendChild( Result_div );
 +
            Result_dom = document;
 +
            group_div = document.getElementById( "tm_group_selector" );
 +
            if ( ! group_div.firstChild ) {
 +
              group_div.parentNode.removeChild( group_div );
 +
            }
 +
        }
 +
      }
 +
      if ( Result_dom ) {
 +
        /* add program logic */
 +
        Result_dom = completeForm( Result_dom );
 +
      } else {
 +
        log_message( "XSLTProcessor et al. unavailable" );
 +
      }
 +
      return Result_dom;
 +
  }   // tm_init().show_template().createForm()
 +
 
 +
 
  
                    rT = rT.substring(startPos, endPos);
+
      function mwXmlHttpRequest( data ) {
                    xVarname = /\{\{\{[\s]*([^\s\|\}]([^\|\}]*[^\s\|\}]){0,1})[\s\|\}]/g;
+
        // Start possible actions on current page
                    names = rT.match(xVarname);
+
        // Precondition:
                    vars = { };
+
        //    data.api      true  or  false->index.php
                    if (names) {
+
        //    data.pars    details
                        for (i = 0; i < names.length; i++) {
+
        //    data.onload  callback
                          tmp = names[i].replace(xVarname, "$1");
+
        //    data.onerror  function on failure
                          tmp = tmp.replace(/<[^>]+>/g, '');
+
        // Postcondition:
                          tmp = decodeURI(tmp);
+
        //   ajax request launched
                          tmp = tmp.replace("\\u00f6", "ö")
+
        // 2014-06-20 PerfektesChaos@de.wikipedia
                                    .replace("\\u00fc", "ü")
+
        var defaults;
                                    .replace("\\u00e4", "ä")
+
        if ( typeof xmlHTTP[ data.api ]  !==  "object" ) {
                                    .replace("\\u00df", "ß")
+
            if ( data.api ) {
                                    .replace("\\u00d6", "Ö")
+
              xmlHTTP[ true ] = new mw.Api();
                                    .replace("\\u00dc", "Ü")
+
            } else {
                                    .replace("\\u00c4", "Ä");
+
              defaults = { ajax:      { url:      mw.util.wikiScript(),
                          vars[tmp] = true;
+
                                          dataType: "text" },
                        }
+
                            parameters: { action: "raw" } };
                    }
+
              xmlHTTP[ false ] = new mw.Api( defaults );
                    usage_text =  "<?xml version='1.0' encoding='utf-8'?>\n"
+
            }
                                  + "<?mediawiki '{{XML-Warnung|"
+
        }
                                              + template_name + "}}'?>\n"
+
        xmlHTTP[ data.api ].get( data.pars )
                                  + " <TemplateUsage output='expand'>\n"
+
                            .done( data.onload )
                                  + "  <Group>\n";
+
                            .fail( data.onerror );
                    for (varname in vars) {
+
       }  // tm_init().mwXmlHttpRequest()
                        usage_text +=  "    <Parameter name='"
 
                                                      + varname + "'>\n"
 
                                      + "       <Help></Help>\n"
 
                                      + "    </Parameter>\n";
 
                    }
 
                    usage_text +=  "   </Group>\n"
 
                                  + " </TemplateUsage>\n";
 
  
                    Xml_dom = parseXML(usage_text);
 
                    Xsl_dom = get_xsl_dom();
 
  
                    is_xml_generated = true;
 
                    generated_xml    = usage_text;
 
  
                    onload();
+
  function makeXMLfromTemplateData( apply ) {
                  } catch (e) {
+
      // 2016-05-31
                    log_message("parseUsage(onload) " + e.message);
+
      var r = "",
                    switch_view_to("EB");
+
          o, p, params, sign, slang, story;
 +
      function f( assembly, access ) {
 +
        var s, t;
 +
        switch ( typeof assembly[ access ] ) {
 +
            case "object" :
 +
              if ( typeof slang  !==  "string" ) {
 +
                  slang = mw.config.get( "wgContentLanguage" );
 +
              }
 +
              t = assembly[ access ];
 +
              if ( t ) {
 +
                  if ( typeof t[ slang ]  ===  "string" ) {
 +
                    s = t[ slang ];
 
                   }
 
                   }
                        },   // onload:
+
              }
              onerror: function() {
+
              break;
                  log_message(LOCALS.sys_load_error.replace("$1",
+
            case "string" :
                                                            template_name) );
+
              s = assembly[ access ];
                  switch_view_to("EB");
+
              break;
                        }  // onerror:
+
        }  // switch typeof component
            });
+
        if ( s ) {
            return;
+
            s = s.replace( /^\s+/,    "" )
 +
                .replace( /\s+$/,    "" )
 +
                .replace( /&nbsp;/g, "&#160;" )
 +
                .replace( /\\/g,    "\\\\" );
 
         }
 
         }
 
+
        return s;
        /* create document from XML text */
+
      }  // tm_init().show_template().makeXMLfromTemplateData().f()
        Xml_dom = parseXML(usage_text);
+
      if ( typeof apply.pages  ===  "object" ) {
        Xsl_dom = get_xsl_dom();
+
         for ( p in apply.pages ) {
 
+
            o = apply.pages[ p ];
        /* load style sheet for the transformation */
+
            break;
//          var Xsl_dom = document.implementation.createDocument("", "", null);
+
         // for  in .params
//          Xsl_dom.addEventListener("load", onload, false);
 
//         Xsl_dom.load("http://tools.wikimedia.de/~revvar/tm_formular.xsl");
 
 
 
         /* next step "function onload" */
 
        onload();
 
      } catch(e) {
 
        log_message("parseUsage() " + e.message);
 
        switch_view_to("EB");
 
 
       }
 
       }
  }   // tm_init().show_template().parseUsage()
+
      if ( o ) {
 
+
        if ( typeof o.params  ===  "object"   &&
 
+
              o.params ) {
 
+
            params = o.params;
  function pipeActive( assign ) {
+
            for ( sign in params ) {
      var i      = assign.indexOf( "|" ),
+
              if ( sign  &&
          scream = "sys_value_pipe_active",
+
                    typeof params[ sign ]  ===  "object" ) {
          r;
+
                  r    = r + '    <Parameter name="' + sign + '"';
      if ( i >= 0 ) {
+
                  p    = params[ sign ];
        if ( ! REopen ) {
+
                  story = f( p, "label" );
            REopen = new RegExp( "(\\[|\\{\\{)" );
+
                  if ( story ) {
        }
+
                    r = r + ' label="'
        if ( REopen.test( assign.substr( 0, i ) ) ) {
+
                          + story.replace( /</g, "&lt;" )
            if ( ! REclose ) {
+
                                  .replace( />/g, "&gt;" )
              REclose = new RegExp( "(\\]|\\}\\})" );
+
                          + '"';
            }
+
                  }
            i = assign.lastIndexOf( "|" );
+
                  if ( typeof p.required  === "boolean"  &&
            if ( ! REclose.test( assign.substr( i ) ) ) {
+
                      p.required ) {
              r = scream;
+
                    r = r + ' null="false"';
            }
+
                  }
        } else {
+
                  if ( typeof p.type  ===  "string" ) {
            r = scream;
+
                    story = trim( p.type ).toLowerCase();
        }
+
                    if ( ! story.indexOf( "string/" ) ) {
       }
+
                        story = story.substr( 7 );
      return r;
+
                    }
  }  // tm_init().show_template().pipeActive()
+
                    if ( story  &&  story !== "unknown" ) {
 
+
                        r = r + ' type="' + story + '"';
 
+
                    }
 
+
                  }
  function restoreTemplate(name) {
+
                  story = typeof p.deprecated;
      var r = false,
+
                  if ( ( story === "boolean"  || story === "string" )
          dom;
+
                        &&  p.deprecated ) {
      if (Template[name]) {
+
                    r = r + ' deprecated="true"';
        dom = createForm( Template[name].Xml_dom,
+
                  }
                          Template[name].Xsl_dom );
+
                  r = r + '>\n';
        if (dom) {
+
                  story = f( p, "description" );
            attachForm(dom);
+
                  if ( story ) {
            r = true;
+
                    r = r + '       <Help>'
         }
+
                        + story.replace( /</g, "&lt;" )
 +
                                .replace( /&nbsp;/g, "&#160;" )
 +
                        + '</Help>\n';
 +
                  }
 +
                  if ( typeof p[ "default" ]  ===  "string" ) {
 +
                    story = p[ "default" ].replace( /^\s+/, "" )
 +
                                          .replace( /\s+$/, "" );
 +
                    if ( story ) {
 +
                        r = r + '      <Default>'
 +
                          + story.replace( /</g, "&lt;" )
 +
                          + '</Default>\n';
 +
                    }
 +
                  }
 +
                  if ( typeof p.autovalue  ===  "string" ) {
 +
                    story = p.autovalue.replace( /^\s+/, "" )
 +
                                        .replace( /\s+$/, "" );
 +
                    if ( story ) {
 +
                        r = r + '      <AutoValue>'
 +
                          + story.replace( /</g, "&lt;" )
 +
                          + '</AutoValue>\n';
 +
                    }
 +
                  }
 +
                  r = r + '    </Parameter>\n';
 +
              }
 +
            }  // for sign in .params
 +
         }
 
       }
 
       }
 +
      r = '<?xml version="1.0" encoding="utf-8"?>\n'
 +
          + ' <TemplateUsage output="collapse">\n'
 +
          + '  <Group>\n'
 +
          + r
 +
          + '  </Group>\n'
 +
          + ' </TemplateUsage>';
 
       return r;
 
       return r;
   }  // tm_init().show_template().restoreTemplate()
+
   }  // tm_init().show_template().makeXMLfromTemplateData()
  
 +
 +
 +
  function load_TemplateData( full_name ) {
 +
      var s = full_name.replace( /\/.*$/, "" );
 +
      mwXmlHttpRequest( {
 +
          api:    true,
 +
          pars:    { action: "templatedata",
 +
                      titles: s },
 +
        onload:  function( answer ) {
 +
                    var story;
 +
                    if ( answer ) {
 +
                        $throbber.hide();
 +
                        story = makeXMLfromTemplateData( answer );
 +
                        parseUsage( story, s );
 +
                    } else {
 +
                        $throbber.hide();
 +
                    }
 +
                  },
 +
        onerror: function() {
 +
                    $throbber.hide();
 +
                    log_message( LOCALS.sys_load_error.replace("$1",
 +
                                                                template_name) );
 +
                    switch_view_to( "EB" );
 +
                  }
 +
      } );
 +
  }  // tm_init().show_template().load_TemplateData()
  
  
  
   function removeForm() {
+
   function throbber( access ) {
       Root_node.removeChild(document.getElementById("tm_main_frame"));
+
       // Show throbber
  }  // tm_init().show_template().removeForm()
+
      // Use: $throbber
 
+
       var spooling = "//upload.wikimedia.org/wikipedia/commons"
 
+
                    + "/d/de/Ajax-loader.gif",   // throbber URL
 
+
           $img, $root, $span;
  function submitTemplate(e) {
+
       if ( $throbber ) {
       var First_error_node = null,
+
         $throbber.find( "span" ).text( LOCALS[ access ] );
          i = PAR_START.length,
+
       } else {
          n = 0,
+
         $throbber = $( "<div>" );
          reNumber = /^[1-9][0-9]*$/,
+
         $throbber.css( { "position": "absolute",
           success = true,
+
                          "left":    "50px",
          unnamedEqual = false,
+
                          "top":      "32px" } );
          group_count, group_template, group_showempty,
+
        $img = $( "<img />" );
          id, lines, max_parameter_length,
+
        $img.attr( { src:    spooling,
          new_template, Node,
+
                      id:    "ajax_throbber",
          output, parameter_space, prevEmptyNumbers,
+
                      height: "32",
          Range, space, scream, scroll_top, tmp_param;
+
                      alt:    "Ajax" } );
       if (! IS_IE) {
+
        $throbber.append( $img );
         e.preventDefault();
+
        $span = $( "<span>" );
       }
+
        $span.css( { "margin-left": "3em" } );
 
+
        $span.text( LOCALS[ access ] );
      /* read all results and correct them if necessary */
+
        $throbber.append( $span );
      for ( id in Template_new ) {   // all template paremeter names
+
        $root = $( Root_node );
         Node = Template_new[id];
+
        $root.find( "#tm_main_frame" ).remove();
         if ( id.search( /^(source|template_name|tm_comment_)/ ) ) {
+
        $root.append( $throbber );
            Node.tm_parName = id.substr( i );
+
      }
            if ( reNumber.test( Node.tm_parName ) ) {
+
      $throbber.show();
              Node.tm_numbered = parseInt( Node.tm_parName );
+
  } // tm_init().show_template().throbber()
              if ( Node.tm_numbered <= n ) {
+
 
                  log_message( "Internal / XML spec error: "
+
 
                              + "Positional order in object/XML. ("
+
 
                              + Node.tm_parName + ")" );
+
  function load_templateXML( template_name ) {
                  switch_view_to( "EB" );
+
      var full_name = getFullTemplatePagename( template_name );
                  return;
+
 
                  // Template_new should be Array rather than object.
+
 
              }
+
 
              n = Node.tm_numbered;
+
      mwXmlHttpRequest( {
            }
+
        api:    false,
 
+
        pars:    { title:  full_name + "/XML" },
            switch ( (""+Node.nodeName).toLowerCase() ) {
+
        onload:  function( answer ) {
              case "textarea":
+
                    var s;
                  Node.tm_value = trim(Node.value);
+
                    switch ( typeof answer ) {
                  lines = Node.tm_value.split("\n");
+
                        case "string":
                  if ( lines.length - 1 > 1
+
                          s = answer;
                      && (lines[lines.length - 1].search(/[\S]/) < 0)) {
+
                          break;
                    lines.pop();
+
                        case "object":
                  }
+
                          s = answer.responseText;
                  Node.tm_value = lines.join("\n");
+
                          break;
                  if ( lines.length > 1 ) {
+
                        default:
                    Node.tm_value = "\n" + Node.tm_value;
+
                          s = false;  // try TemplateData
                  }
+
                    }  // switch
                  break;
+
                     if ( s ) {
              case "input":
+
                         $throbber.hide();
                  if ( (""+Node.type).toLowerCase() === "checkbox" ) {
+
                        parseUsage( s, full_name );
                     if ( Node.checked === true ) {
+
                     } else {
                         Node.tm_value = trim(Node.value);
+
                         throbber( "seekTD" );
                     } else {
+
                        load_TemplateData( full_name );
                         Node.tm_value = "";
+
                     }
                     }
+
                   },
                   } else {
+
        onerror: function() {
                     Node.tm_value = trim(Node.value);
+
                     throbber( "seekTD" );
 +
                    load_TemplateData( full_name );
 
                   }
 
                   }
                  break;
+
      } );
              case "select":
+
  }  // tm_init().show_template().load_templateXML()
                  Node.tm_value = trim(Node.value);
+
 
                  break;
+
 
              case "div":
+
 
                  break;
+
  function parseUsage( source, full_name ) {
              default:
+
      // source: XML document
                  log_message( "Internal Error: Unknown Node type \""
+
      var usage_text, Xml_dom, Xsl_dom;
                              + Node.nodeName + " (" + id + ")\"." );
+
 
                  switch_view_to( "EB" );
+
      function onload() {
                  return;
+
        var dom = createForm(Xml_dom, Xsl_dom);
             }  // switch
+
        if (dom) {
            if ( Node.tm_numbered  &&
+
             attachForm(dom);
                ! unnamedEqual  &&
 
                Node.tm_value.indexOf( "=" ) >= 0 ) {
 
              unnamedEqual = true;
 
            }
 
  
             /* verify values */
+
             /* cache template */
             if ( typeof Node.tm_value  === "string" ) {
+
             Template[template_name] = { };
              scream = false;
+
            Template[template_name].Xml_dom = Xml_dom;
              if ( Node.getAttribute("tm_null") === "false"  &&
+
            Template[template_name].Xsl_dom = Xsl_dom;
                    ! Node.tm_value ) {
+
        } else {
                  scream = "sys_enter_value";
+
            switch_view_to( "EB" );
              } else {
+
        }
                  scream = pipeActive( Node.tm_value );
+
      }  // tm_init().show_template().parseUsage().onload()
              }
+
 
              if ( ! scream  &&
+
 
                    Node.tm_condition    &&
+
 
                    ( Node.getAttribute("tm_null") !== "true"  ||
+
      try {
                      Node.tm_value )   &&
+
        Xml_dom = null;
                    Node.tm_value.search( Node.tm_condition ) ) {
+
        Xsl_dom = null;
                  scream = "sys_enter_valid_value";
+
        is_xml_generated = false;
              }
+
 
              if ( ! scream  &&  Node.tm_type  &&  Node.tm_value ) {
+
        if ( source.length ) {
                  if ( Node.tm_value.search( Node.tm_type ) ) {
+
            usage_text = source;
                    scream = "sys_enter_valid_value";
+
        } else {
                  } else if ( Node.tm_legalWikipage  &&
+
            mwXmlHttpRequest( {
                              ( Node.tm_value.indexOf( "[" )  >= 0  ||
+
                api:    true,
                                Node.tm_value.indexOf( "]" )  >= 0 ) ) {
+
                pars:    { prop:    "revisions",
                    scream = "sys_enter_valid_value";
+
                          rvprop:  "content",
                  }
+
                          rvlimit: "1",
              }
+
                          titles:  encodeURIComponent(full_name) },
              if ( ! scream  &&
+
                onload: function(rD) {
                    Node.tm_autovalue  &&
+
                          var endPos, i, names, rT, startPos, tmp,
                    ! Node.tm_value ) {
+
                              varname, vars, xVarname;
                  Node.tm_value = autovalue( Node.tm_autovalue );
+
                   try {
              }
+
                    rT = rD.responseText;
              if ( scream ) {
+
                    startPos = rT.search('\\[\\{"\\*":"') + 7;
                  success = false;
+
                    endPos  = rT.search('"\\}\\]\\}\\}\\},"');
                  if ( ! First_error_node ) {
 
                    First_error_node = Node;
 
                  }
 
                  Node.title = LOCALS[ scream ] + " *** " + Node.tm_help;
 
                  Node.className = "tm_input tm_error";
 
                  Node.setAttribute("tm_error", "true");
 
              } else {
 
                  Node.setAttribute("tm_error", "false");
 
                   Node.className = "tm_input";
 
                  Node.title = Node.tm_help;
 
              }
 
            }
 
        } else if ( id !== "source" &&  id !== "template_name" ) {
 
            Node.tm_leader = true;
 
            Node.tm_value = "\0";
 
        }
 
      }   // for id in Template_new
 
      if ( ! success ) {
 
        if ( State ) {
 
            State.data = LOCALS.sys_please_correct_errors;
 
        }
 
        First_error_node.focus();
 
        return;
 
      }
 
  
      if ( n && unnamedEqual ) {
+
                    if (endPos < 0) {
        for ( id in Template_new ) {
+
                        log_message(LOCALS.sys_no_such_template.replace("$1",
            Node = Template_new[id];
+
                                                                        template_name));
            if ( Node.tm_numbered ) {
+
                        switch_view_to("EB");
              Node.tm_numbered = false;
+
                        return;
            }
+
                    }
        }  // for id in Template_new
 
      }
 
  
      /* create new template source */
+
                    rT = rT.substring(startPos, endPos);
      output = document.getElementById( "tm_main_frame" );
+
                    xVarname = /\{\{\{[\s]*([^\s\|\}]([^\|\}]*[^\s\|\}]){0,1})[\s\|\}]/g;
      if ( output ) {
+
                    names = rT.match(xVarname);
        if ( output.getAttribute("tm_max_value_indentation") ) {
+
                    vars = { };
            max_value_indentation = 0
+
                    if (names) {
                      + output.getAttribute("tm_max_value_indentation");
+
                        for (i = 0; i < names.length; i++) {
        }
+
                          tmp = names[i].replace(xVarname, "$1");
        output = ( output.getAttribute( "tm_output" ) === "expand" );
+
                          tmp = tmp.replace(/<[^>]+>/g, '');
      } else {
+
                          tmp = decodeURI(tmp);
        output = false;
+
                          tmp = tmp.replace("\\u00f6", "ö")
      }
+
                                    .replace("\\u00fc", "ü")
 
+
                                    .replace("\\u00e4", "ä")
      new_template = "{{" + Template_new.template_name
+
                                    .replace("\\u00df", "ß")
                          + ( output ? "\n" : "" );
+
                                    .replace("\\u00d6", "Ö")
       group_count = 0;
+
                                    .replace("\\u00dc", "Ü")
      group_template = "";
+
                                    .replace("\\u00c4", "Ä");
      group_showempty = false;
+
                          vars[tmp] = true;
 +
                        }
 +
                    }
 +
                    usage_text =  "<?xml version='1.0' encoding='utf-8'?>\n"
 +
                                  + "<?mediawiki '{{XML-Warnung|"
 +
                                              + template_name + "}}'?>\n"
 +
                                  + " <TemplateUsage output='expand'>\n"
 +
                                  + "   <Group>\n";
 +
                    for (varname in vars) {
 +
                        usage_text +=  "    <Parameter name='"
 +
                                                      + varname + "'>\n"
 +
                                      + "       <Help></Help>\n"
 +
                                      + "    </Parameter>\n";
 +
                    }
 +
                    usage_text +=   "   </Group>\n"
 +
                                  + " </TemplateUsage>\n";
 +
 
 +
                    Xml_dom = parseXML(usage_text);
 +
                    Xsl_dom = get_xsl_dom();
  
      // get max parameter length
+
                    is_xml_generated = true;
      max_parameter_length = 0;
+
                    generated_xml    = usage_text;
      for ( id in Template_new ) {
 
        Node = Template_new[id];
 
        if ( Node.tm_parName  &&  Node.tm_value  &&
 
              ( output || Node.tm_value.length ) ) {
 
            if ( max_parameter_length < Node.tm_parName.length ) {
 
              max_parameter_length = Node.tm_parName.length;
 
            }
 
        }
 
      }  // for id in Template_new
 
  
      parameter_space = "";
+
                    onload();
      prevEmptyNumbers = "";
+
                  } catch (e) {
      if ( OPTIONS.lotsOfSpaces ) {
+
                    log_message("parseUsage(onload) " + e.message);
        space = " ";
+
                    switch_view_to("EB");
      } else {
 
        n = ( max_parameter_length > max_value_indentation
 
              ? max_value_indentation
 
              : max_parameter_length );
 
        for ( i = 0;  i < n;  i++ ) {
 
            parameter_space += " ";
 
        }  // for i
 
        space = "";
 
      }
 
      for ( id in Template_new ) {
 
        Node = Template_new[id];
 
        if ( Node.tm_leader || Node.tm_parName ) {
 
            tmp_param = Node.tm_parName;
 
            if ( output ) {  // expand
 
              if ( ! id.search("tm_group_") ) {
 
                  if ( group_count || group_showempty ) {
 
                    new_template += group_template;
 
 
                   }
 
                   }
                  group_count = 0;
+
                        },  // onload:
                  group_template = "";
+
               onerror: function() {
                  group_showempty = Node.showempty;
+
                   log_message(LOCALS.sys_load_error.replace("$1",
               } else if ( id.search("tm_comment_") ) {
+
                                                            template_name) );
                   if (tmp_param.length < parameter_space.length) {
+
                   switch_view_to("EB");
                    tmp_param = (tmp_param + parameter_space).substr(0,
+
                         }   // onerror:
                                                                      parameter_space.length);
+
             });
                  }
+
             return;
                  group_template += space + "|";
 
                  if ( ! Node.tm_numbered ) {
 
                    group_template += tmp_param + "= ";
 
                  }
 
                  i = Node.tm_value.length;
 
                   if ( i  ||
 
                      Node.getAttribute("tm_predefined") === "false") {
 
                    group_template += Node.tm_value;
 
                    if ( i ) {
 
                         group_count++;
 
                    }
 
                  }
 
                  group_template += "\n";
 
              }
 
             } else if ( Node.tm_value  &&  Node.tm_value.length
 
                        &&  ! Node.tm_leader ) {
 
              tmp_param = tmp_param + space;
 
              new_template += prevEmptyNumbers;
 
              prevEmptyNumbers = "";
 
              if ( Node.tm_numbered ) {
 
                  new_template += space + "|"
 
                                  + Node.tm_value;
 
              } else {
 
                  new_template += space + "| " + tmp_param + "=" + space
 
                                  + Node.tm_value;
 
              }
 
             } else if ( Node.tm_numbered ) {
 
              prevEmptyNumbers += "|";
 
            }
 
 
         }
 
         }
      }  // for id in Template_new
 
      if ( output  &&
 
          ( group_count || group_showempty ) ) {
 
        new_template += group_template;
 
      }
 
      new_template += space + "}}";
 
  
      switch_view_to("EB");
+
        /* create document from XML text */
 +
        Xml_dom = parseXML(usage_text);
 +
        Xsl_dom = get_xsl_dom();
 +
 
 +
        /* load style sheet for the transformation */
 +
//          var Xsl_dom = document.implementation.createDocument("", "", null);
 +
//          Xsl_dom.addEventListener("load", onload, false);
 +
//          Xsl_dom.load("http://tools.wikimedia.de/~revvar/tm_formular.xsl");
  
      /* insert source into Editbox at cursor */
+
        /* next step "function onload" */
      scroll_top = Target.Editbox.scrollTop;
+
        onload();
      Target.Editbox.value = Target.Editbox.value.substring(0, Target.start)
+
       } catch(e) {
                            + new_template
+
         log_message("parseUsage() " + e.message);
                            + Target.Editbox.value.substring(Target.end + 1);
+
         switch_view_to("EB");
       if ( IS_IE ) {
 
         Range = Target.Editbox.createTextRange();
 
        Range.collapse(true);
 
        Range.moveEnd("character", Target.start);
 
         Range.moveStart("character", Target.start);
 
        Range.select();
 
      } else {
 
        Target.Editbox.selectionStart = Target.cursor;
 
        Target.Editbox.selectionEnd = Target.cursor;
 
        Target.Editbox.scrollTop = scroll_top;
 
 
       }
 
       }
      if ( typeof( OPTIONS.wikEd ) === "object"
+
   }   // tm_init().show_template().parseUsage()
          && window.wikEd.useWikEd ) {
 
        window.wikEd.UpdateFrame();
 
      }
 
   } // tm_init().show_template().submitTemplate()
 
  
  
  
   function throbber( access ) {
+
   function pipeActive( assign ) {
      // Show throbber
+
       var i      = assign.indexOf( "|" ),
      // Use: $throbber
+
          scream = "sys_value_pipe_active",
       var spooling = "//upload.wikimedia.org/wikipedia/commons"
+
           r;
                    + "/d/de/Ajax-loader.gif",   // throbber URL
+
       if ( i >= 0 ) {
           $img, $root, $span;
+
         if ( ! REopen ) {
       if ( $throbber ) {
+
            REopen = new RegExp( "(\\[|\\{\\{)" );
         $throbber.find( "span" ).text( LOCALS[ access ] );
+
         }
      } else {
+
         if ( REopen.test( assign.substr( 0, i ) ) ) {
        $throbber = $( "<div>" );
+
            if ( ! REclose ) {
         $throbber.css( { "position": "absolute",
+
              REclose = new RegExp( "(\\]|\\}\\})" );
                          "left":    "50px",
+
            }
                          "top":      "32px" } );
+
            i = assign.lastIndexOf( "|" );
         $img = $( "<img />" );
+
            if ( ! REclose.test( assign.substr( i ) ) ) {
        $img.attr( { src:    spooling,
+
              r = scream;
                      id:    "ajax_throbber",
+
            }
                      height: "32",
+
         } else {
                      alt:    "Ajax" } );
+
            r = scream;
        $throbber.append( $img );
+
         }
        $span = $( "<span>" );
+
       }
        $span.css( { "margin-left": "3em" } );
+
       return r;
        $span.text( LOCALS[ access ] );
+
   }   // tm_init().show_template().pipeActive()
        $throbber.append( $span );
 
        $root = $( Root_node );
 
         $root.find( "#tm_main_frame" ).remove();
 
         $root.append( $throbber );
 
       }
 
       $throbber.show();
 
   } // tm_init().show_template().throbber()
 
  
  
  
   function show_execute( Template_given, template_name ) {
+
   function restoreTemplate( name ) {
       // check parameter
+
       var r = false,
       if (Template_given  &&
+
          dom;
          Template_given.template_name !== template_name) {
+
       if (Template[name]) {
        template_name = Template_given.template_name;
+
        dom = createForm( Template[name].Xml_dom,
 +
                          Template[name].Xsl_dom );
 +
        if (dom) {
 +
            attachForm(dom);
 +
            r = true;
 +
        }
 
       }
 
       }
 +
      return r;
 +
  }  // tm_init().show_template().restoreTemplate()
 +
 +
  
      if ( ! Template_given  &&  template_name === false ) {
+
  function submitTemplate(e) {
        // create empty form
+
      var First_error_node = null,
        Template_new = { };
+
          i = PAR_START.length,
        parseUsage( "<?xml version='1.0' encoding='utf-8'?>"
+
          n = 0,
                    + "<TemplateUsage>"
+
          reNumber = /^[1-9][0-9]*$/,
                    +    "<Group></Group>"
+
          success = true,
                    + "</TemplateUsage>",
+
          unnamedEqual = false,
                    "" );
+
          group_count, group_template, group_showempty,
      } else {
+
          id, lines, max_parameter_length,
        Template_new = { template_name: template_name };
+
          new_template, Node,
        if ( restoreTemplate(template_name) !== true ) {
+
          output, parameter_space, prevEmptyNumbers,
            throbber( "seekXML" );
+
          Range, space, scream, scroll_top, tmp_param;
            load_templateXML( template_name );
+
       preventDefault(e);
        }
 
       }
 
  } // tm_init().show_template().show_execute()
 
  
 +
      /* read all results and correct them if necessary */
 +
      for ( id in Template_new ) {  // all template paremeter names
 +
        Node = Template_new[id];
 +
        if ( id.search( /^(source|template_name|tm_comment_)/ ) ) {
 +
            Node.tm_parName = id.substr( i );
 +
            if ( reNumber.test( Node.tm_parName ) ) {
 +
              Node.tm_numbered = parseInt( Node.tm_parName );
 +
              if ( Node.tm_numbered <= n ) {
 +
                  log_message( "Internal / XML spec error: "
 +
                              + "Positional order in object/XML. ("
 +
                              + Node.tm_parName + ")" );
 +
                  switch_view_to( "EB" );
 +
                  return;
 +
                  // Template_new should be Array rather than object.
 +
              }
 +
              n = Node.tm_numbered;
 +
            }
  
 
+
            switch ( (""+Node.nodeName).toLowerCase() ) {
  show_execute( Template_given, template_name );
+
              case "textarea":
}  // tm_init().show_template()
+
                  Node.tm_value = trim(Node.value);
 
+
                  lines = Node.tm_value.split("\n");
 
+
                  if ( lines.length - 1 > 1
 
+
                      && (lines[lines.length - 1].search(/[\S]/) < 0)) {
      function switch_view_to( view ) {
+
                    lines.pop();
        var Editbox = document.getElementById( "wpTextbox1" );
+
                  }
        if ( ( view === "VM" ||  ! view )
+
                  Node.tm_value = lines.join("\n");
              &&  act_view === "EB" ) {
+
                  if ( lines.length > 1 ) {
            if ( typeof( OPTIONS.wikEd ) === "object"
+
                    Node.tm_value = "\n" + Node.tm_value;
                &&  OPTIONS.wikEd.live ) {
+
                  }
              window.wikEd.saveButton.disabled = true;
+
                  break;
              window.wikEd.previewButton.disabled = true;
+
              case "input":
              window.wikEd.diffPreviewButton.disabled = true;
+
                  if ( (""+Node.type).toLowerCase() === "checkbox" ) {
            } else if ( Editbox ) {
+
                    if ( Node.checked === true ) {
               setStyleAttribute( Editbox,
+
                        Node.tm_value = trim(Node.value);
                                  { "visibility": "hidden" } );
+
                    } else {
               Editbox.readOnly = true;
+
                        Node.tm_value = "";
               document.getElementById("wpSave").disabled = true;
+
                    }
              document.getElementById("wpPreview").disabled = true;
+
                  } else {
              document.getElementById("wpDiff").disabled = true;
+
                    Node.tm_value = trim(Node.value);
 +
                  }
 +
                  break;
 +
               case "select":
 +
                  Node.tm_value = trim(Node.value);
 +
                  break;
 +
               case "div":
 +
                  break;
 +
               default:
 +
                  log_message( "Internal Error: Unknown Node type \""
 +
                              + Node.nodeName + " (" + id + ")\"." );
 +
                  switch_view_to( "EB" );
 +
                  return;
 +
            }  // switch
 +
            if ( Node.tm_numbered  &&
 +
                ! unnamedEqual  &&
 +
                Node.tm_value.indexOf( "=" ) >= 0 ) {
 +
              unnamedEqual = true;
 
             }
 
             }
             Tm_box = document.getElementById( "tm_dummy_div" );
+
 
             if ( Tm_box ) {
+
             /* verify values */
               setStyleAttribute( Tm_box,
+
             if ( typeof Node.tm_value  ===  "string" ) {
                                  { "visibility": "visible",
+
               scream = false;
                                    "z-index":    "99" } );
+
              if ( Node.getAttribute("tm_null") === "false"   &&
            }
+
                    ! Node.tm_value ) {
            act_view = "VM";
+
                  scream = "sys_enter_value";
        } else if ( ( view === "EB" ||  ! view )
+
               } else {
                    &&  act_view === "VM" ) {
+
                   scream = pipeActive( Node.tm_value );
            if ( Tm_box ) {
 
              setStyleAttribute( Tm_box,
 
                                  { "visibility": "hidden",
 
                                    "z-index":    "0" } );
 
               if ( view === "EB" ) {
 
                   // removes user interface
 
                  Tm_box.parentNode.removeChild( Tm_box );
 
                  Tm_box = null;
 
 
               }
 
               }
            }
+
              if ( ! scream  &&
            if ( typeof( OPTIONS.wikEd ) === "object"
+
                    Node.tm_condition    &&
                && OPTIONS.wikEd.live ) {
+
                    ( Node.getAttribute("tm_null") !== "true"   ||
              OPTIONS.wikEd.live = false;
+
                      Node.tm_value )    &&
               window.wikEd.useWikEd = true;
+
                    Node.tm_value.search( Node.tm_condition ) ) {
              window.wikEd.saveButton.removeAttribute("disabled");
+
                  scream = "sys_enter_valid_value";
              window.wikEd.previewButton.removeAttribute("disabled");
+
               }
              window.wikEd.diffPreviewButton.removeAttribute("disabled");
+
              if ( ! scream  &&  Node.tm_type  &&  Node.tm_value ) {
               window.wikEd.SetEditArea( true, false );
+
                  if ( Node.tm_value.search( Node.tm_type ) ) {
              window.wikEd.frameWindow.focus();
+
                    scream = "sys_enter_valid_value";
            } else if ( Editbox ) {
+
                  } else if ( Node.tm_legalWikipage  &&
              if ( view === "EB" ) {
+
                              ( Node.tm_value.indexOf( "[" ) >= 0  ||
                   Editbox.removeAttribute("readonly");
+
                                Node.tm_value.indexOf( "]" ) >= 0 ) ) {
                   document.getElementById("wpSave").removeAttribute("disabled");
+
                    scream = "sys_enter_valid_value";
                   document.getElementById("wpPreview").removeAttribute("disabled");
+
                  }
                   document.getElementById("wpDiff").removeAttribute("disabled");
+
               }
 +
              if ( ! scream  &&
 +
                    Node.tm_autovalue  &&
 +
                    ! Node.tm_value ) {
 +
                  Node.tm_value = autovalue( Node.tm_autovalue );
 +
              }
 +
              if ( scream ) {
 +
                  success = false;
 +
                  if ( ! First_error_node ) {
 +
                    First_error_node = Node;
 +
                  }
 +
                  Node.title = LOCALS[ scream ] + " *** " + Node.tm_help;
 +
                   Node.className = "tm_input tm_error";
 +
                   Node.setAttribute("tm_error", "true");
 +
              } else {
 +
                   Node.setAttribute("tm_error", "false");
 +
                   Node.className = "tm_input";
 +
                  Node.title = Node.tm_help;
 
               }
 
               }
              setStyleAttribute( Editbox,
 
                                  { "visibility": "visible" } );
 
              Editbox.focus();
 
 
             }
 
             }
            act_view = "EB";
+
         } else if ( id !== "source"  &&  id !== "template_name" ) {
         } else if ( view !== act_view ) {
+
             Node.tm_leader = true;
             log_message("Internal error: act_view='" + act_view
+
            Node.tm_value = "\0";
                        + "' conflicts with view parameter '"
 
                        + view + "'");
 
 
         }
 
         }
       }  // tm_init().switch_view_to()
+
       }  // for id in Template_new
 +
      if ( ! success ) {
 +
        if ( $Statebar ) {
 +
            $Statebar.empty().html( LOCALS.sys_please_correct_errors )
 +
                            .css( { "background-color": "#FFFF00" } );
 +
        }
 +
        First_error_node.focus();
 +
        return;
 +
      }
  
 
+
       if ( n && unnamedEqual ) {
 
+
         for ( id in Template_new ) {
       function showHelp(e) {
+
             Node = Template_new[id];
         var new_height, rel_scroll_pos, text,
+
             if ( Node.tm_numbered ) {
            Tm_footer, Tm_form, Tm_header, Tm_main;
+
               Node.tm_numbered = false;
 
 
        if (help_mutex !== true) {
 
             help_mutex = true;
 
             if (! IS_IE) {
 
               e.preventDefault();
 
 
             }
 
             }
            Act_input = (IS_IE ? e.srcElement : e.target);
+
        }  // for id in Template_new
            text = Act_input.title;
+
      }
            /* write help text and resize formular */
 
            Tm_main = document.getElementById("tm_main_frame");
 
            Tm_header=document.getElementById("tm_header");
 
            Tm_form=document.getElementById("tm_form");
 
            rel_scroll_pos = Tm_form.scrollTop / Tm_form.scrollHeight;
 
            Tm_footer=document.getElementById("tm_footer");
 
            new_height = Tm_main.parentNode.offsetHeight;
 
  
            document.getElementById("tm_state").firstChild.data = text;
+
      /* create new template source */
 
+
      output = document.getElementById( "tm_main_frame" );
            new_height = new_height
+
      if ( output ) {
                        - Tm_header.offsetHeight
+
        if ( output.getAttribute("tm_max_value_indentation") ) {
                        - Tm_footer.offsetHeight;
+
             max_value_indentation = 0
            setStyleAttribute( Tm_form,
+
                      + output.getAttribute("tm_max_value_indentation");
                              {"height": (new_height+ "px") } );
 
             setStyleAttribute( Tm_form,
 
                              {"height": ((new_height
 
                                            + (Tm_main.parentNode.offsetHeight - Tm_main.offsetHeight))
 
                                          + "px") } );
 
            Tm_form.scrollTop = Tm_form.scrollHeight * rel_scroll_pos;
 
            help_mutex = false;
 
 
         }
 
         }
      }  // tm_init().showHelp()
+
        output = ( output.getAttribute( "tm_output" ) === "expand" );
 +
      } else {
 +
        output = false;
 +
      }
  
 +
      new_template = "{{" + Template_new.template_name
 +
                          + ( output ? "\n" : "" );
 +
      group_count = 0;
 +
      group_template = "";
 +
      group_showempty = false;
  
 
+
      // get max parameter length
       function resizeHandler(e) {
+
       max_parameter_length = 0;
        var org_end, org_start, org_value;
+
      for ( id in Template_new ) {
        Act_input = (IS_IE ? e.srcElement : e.target);
+
         Node = Template_new[id];
         Act_input.tm_old_size = Act_input.size;
+
         if ( Node.tm_parName  &&  Node.tm_value  &&
        resizeInputBox(Act_input, 1);
+
              ( output || Node.tm_value.length ) ) {
         if (is_gecko && (Act_input.tm_old_size !== Act_input.size)) {
+
             if ( max_parameter_length < Node.tm_parName.length ) {
             org_value = Act_input.value;
+
               max_parameter_length = Node.tm_parName.length;
            org_start = Act_input.selectionStart;
 
            org_end = Act_input.selectionEnd;
 
            Act_input.value = "";
 
            Act_input.value = org_value;
 
            if (org_end >= org_start) {
 
               Act_input.selectionEnd = org_end;
 
            }
 
            Act_input.selectionStart = org_start;
 
            if (org_end < org_start) {
 
              Act_input.selectionEnd = org_end;
 
 
             }
 
             }
 
         }
 
         }
       }  // tm_init().resizeHandler()
+
       }  // for id in Template_new
  
 +
      parameter_space = "";
 +
      prevEmptyNumbers = "";
 +
      if ( OPTIONS.lotsOfSpaces ) {
 +
        space = " ";
 +
      } else {
 +
        n = ( max_parameter_length > max_value_indentation
 +
              ? max_value_indentation
 +
              : max_parameter_length );
 +
        for ( i = 0;  i < n;  i++ ) {
 +
            parameter_space += " ";
 +
        }  // for i
 +
        space = "";
 +
      }
 +
      for ( id in Template_new ) {
 +
        Node = Template_new[id];
 +
        if ( Node.tm_leader || Node.tm_parName ) {
 +
            tmp_param = Node.tm_parName;
 +
            if ( output ) {  // expand
 +
              if ( ! id.search("tm_group_") ) {
 +
                  if ( group_count || group_showempty ) {
 +
                    new_template += group_template;
 +
                  }
 +
                  group_count = 0;
 +
                  group_template = "";
 +
                  group_showempty = Node.showempty;
 +
              } else if ( id.search("tm_comment_") ) {
 +
                  if (tmp_param.length < parameter_space.length) {
 +
                    tmp_param = (tmp_param + parameter_space).substr(0,
 +
                                                                      parameter_space.length);
 +
                  }
 +
                  group_template += space + "|";
 +
                  if ( ! Node.tm_numbered ) {
 +
                    group_template += tmp_param + "= ";
 +
                  }
 +
                  i = Node.tm_value.length;
 +
                  if ( i  ||
 +
                      Node.getAttribute("tm_predefined") === "false") {
 +
                    group_template += Node.tm_value;
 +
                    if ( i ) {
 +
                        group_count++;
 +
                    }
 +
                  }
 +
                  group_template += "\n";
 +
              }
 +
            } else if ( Node.tm_value  &&  Node.tm_value.length
 +
                        &&  ! Node.tm_leader ) {
 +
              tmp_param = tmp_param + space;
 +
              new_template += prevEmptyNumbers;
 +
              prevEmptyNumbers = "";
 +
              if ( Node.tm_numbered ) {
 +
                  new_template += space + "|"
 +
                                  + Node.tm_value;
 +
              } else {
 +
                  new_template += space + "| " + tmp_param + "=" + space
 +
                                  + Node.tm_value;
 +
              }
 +
            } else if ( Node.tm_numbered ) {
 +
              prevEmptyNumbers += "|";
 +
            }
 +
        }
 +
      }  // for id in Template_new
 +
      if ( output  &&
 +
          ( group_count || group_showempty ) ) {
 +
        new_template += group_template;
 +
      }
 +
      new_template += space + "}}";
  
 +
      switch_view_to("EB");
  
       function insertUnknown(e) {
+
       /* insert source into Editbox at cursor */
        var text;
+
      scroll_top = Target.Editbox.scrollTop;
        if (IS_IE) {
+
      Target.Editbox.value = Target.Editbox.value.substring(0, Target.start)
            text = e.srcElement.title;
+
                            + new_template
        } else {
+
                            + Target.Editbox.value.substring(Target.end + 1);
            e.preventDefault();
+
       if ( IS_IE ) {
            text = e.target.title;
+
         Range = Target.Editbox.createTextRange();
        }
+
         Range.collapse(true);
        if ( Act_input  &&
+
         Range.moveEnd("character", Target.start);
              ! Act_input.nodeName.search(/^(input|select|textarea)$/i)
+
        Range.moveStart("character", Target.start);
              &&  Act_input.type.search(/^checkbox$/i) < 0 ) {
+
        Range.select();
            Act_input.value = text;
+
      } else {
        }
+
        Target.Editbox.selectionStart = Target.cursor;
      }  // tm_init().insertUnknown()
+
        Target.Editbox.selectionEnd = Target.cursor;
 
+
        Target.Editbox.scrollTop = scroll_top;
 
+
      }
 
+
      if ( typeof( OPTIONS.wikEd ) === "object"
       function selectGroup(e) {
+
          && window.wikEd.useWikEd ) {
         var Form_div, Group_div, position, text;
+
        window.wikEd.UpdateFrame();
         if (! IS_IE) {
+
      }
            e.preventDefault();
+
       // CodeMirror
         }
+
  } // tm_init().show_template().submitTemplate()
        try {
+
 
            text = "" + (IS_IE ? e.srcElement : e.target).id;
+
 
            position = Math.round( parseFloat( text.replace( /^.+_([0-9\.]+)$/,
+
 
                                                            "$1") )
+
  function show_execute( Template_given, template_name ) {
                                  * ( IS_IE ? 2 : 1 ) );
+
      // check parameter
            Group_div = document.getElementById("tm_group_"+position);
+
      if (Template_given  &&
            Form_div = document.getElementById("tm_form");
+
          Template_given.template_name !== template_name) {
            Form_div.scrollTop = Group_div.offsetTop
+
         template_name = Template_given.template_name;
                                - Group_div.parentNode.offsetTop;
+
      }
        } catch(exc) {
 
            log_message(exc.message+"\n"+"Internal error: Can't select group div with id=\"tm_group_"+position+"\".");
 
            switch_view_to("EB");
 
        }
 
       }   // tm_init().selectGroup()
 
 
 
 
 
 
 
      function parse_template_source( source ) {
 
        var k = 0,
 
            re_back = new RegExp( escapeSyntax, "g" ),
 
            rep12 = "$1" + escapeSyntax + "$2",
 
            Template_given = { },
 
            x_comment = /<!--.*?-->/g,
 
            x_nowiki_1 = /(<\s*nowiki\s*>.*?)\|(.*?<\s*\/nowiki\s*>)/gi,
 
            x_nowiki_2 = /(<\s*nowiki\s*>.*?)=(.*?<\s*\/nowiki\s*>)/gi,
 
            x_wikilinks = /(\[\[[^\]]+)\|([^\]]*)/g,
 
            equals, i, par, parameter, par_name, par_value, re;
 
 
 
         source = replace_all(source, x_comment, "");
 
 
 
        /* replace split chars within nowiki segments and nested templates */
 
        source = replace_all(source, x_nowiki_1, rep12);
 
 
 
        /* replace split chars within wikilinks */
 
        source = replace_all(source, x_wikilinks, rep12);
 
  
        parameter = source.split("|");
+
      if ( ! Template_given && template_name === false ) {
        for ( i = 0; i < parameter.length; i++ ) {
+
        // create empty form
            par = replace_all(parameter[i], re_back, "|");
+
        Template_new = { };
            if (i) {
+
        parseUsage( "<?xml version='1.0' encoding='utf-8'?>"
              par = replace_all( par, x_nowiki_2, rep12 );
+
                    + "<TemplateUsage>"
              equals = par.search("=");
+
                    +   "<Group></Group>"
              if (equals < 0) {
+
                    + "</TemplateUsage>",
                  k++;
+
                    "" );
                  par_name  = PAR_START + k;
+
      } else {
                  par_value = trim(par);
+
        Template_new = { template_name: template_name };
              } else {
+
        if ( restoreTemplate(template_name) !== true ) {
                  par_name  = PAR_START + trim(par.substring(0, equals));
+
            throbber( "seekXML" );
                  par_value = trim(par.substring(equals + 1));
+
            load_templateXML( template_name );
              }
+
        }
              if (Template_given[ par_name ]) {
+
        whenDOMready();
                  log_message( "Syntax error: Parameter name \""
+
      }
                              + par_name.substr( PAR_START.length )
+
  } // tm_init().show_template().show_execute()
                              + "\" already in use.");
+
 
                  return null;
+
 
              }
+
 
              /* correct format errors */
+
  show_execute( Template_given, template_name );
              par_value = replace_all( par_value, re_back, "=" );
+
}  // tm_init().show_template()
              Template_given[par_name] = par_value;
 
            } else {
 
              re = new RegExp( "^(Template|" + LOCALS.template + "): *(.*)$",
 
                                "i" );
 
              Template_given.template_name = trim(par);
 
              if ( ! Template_given.template_name.search( re ) ) {
 
                  Template_given.template_name = Template_given.template_name.replace(re, "$2");
 
              }
 
            }
 
        }  // for i
 
        Template_given.source = "source code";
 
        return Template_given;
 
      }  // tm_init().parse_template_source()
 
  
  
  
      /* == helper functions ==========================================*/
+
       function switch_view_to( view ) {
 
+
         var Editbox = document.getElementById( "wpTextbox1" );
 
+
         if ( ( view === "VM||  ! view )
 
+
              &&  act_view === "EB" ) {
       function getFullTemplatePagename( page ) {
+
            if ( typeof( OPTIONS.wikEd ) === "object"
        // return pagename, defaulting to template namespace
+
                &&  OPTIONS.wikEd.live ) {
         var nsn = getNamespaceNumber( page, 10 ),
+
              window.wikEd.saveButton.disabled = true;
            r  = trim( page );
+
              window.wikEd.previewButton.disabled = true;
         r  = ( nsn === 10  ?  LOCALS.template + ":" + r
+
              window.wikEd.diffPreviewButton.disabled = true;
                            : r );
+
            } else if ( Editbox ) {
        return r.replace( /\s+/g, "_");
+
              setStyleAttribute( Editbox,
      }  // tm_init().getFullTemplatePagename()
+
                                  { "visibility": "hidden" } );
 
+
              Editbox.readOnly = true;
 
+
              document.getElementById("wpSave").disabled = true;
 
+
              document.getElementById("wpPreview").disabled = true;
      function getNamespaceNumber( pagename, defaultspace ) {
+
               document.getElementById("wpDiff").disabled = true;
        // return identified number, or defaultspace
 
        var s = pagename.replace( /^\s+/, "" ),
 
            i = s.indexOf( ":" ),
 
            n, r;
 
        if ( i < 0 ) {
 
            r = defaultspace;
 
        } else if ( i ) {
 
            if ( typeof(LOCALS.wgNamespaceIds) !== "object" ) {
 
               LOCALS.wgNamespaceIds = mw.config.get( "wgNamespaceIds" );
 
 
             }
 
             }
             s = s.substr( 0,  i - 1 )
+
             Tm_box = document.getElementById( "tm_dummy_div" );
                .replace( /\s*$/, "" )
+
             if ( Tm_box ) {
                .replace( /\s+/, "_" )
+
               setStyleAttribute( Tm_box,
                .toLowerCase();
+
                                  { "visibility": "visible",
            n = LOCALS.wgNamespaceIds[ s ];
+
                                    "z-index":    "99" } );
             if ( n ) {
 
               r = n;
 
 
             }
 
             }
         } else {
+
            act_view = "VM";
             r = 0;
+
         } else if ( ( view === "EB"  ||  ! view )
         }
+
                    &&  act_view === "VM" ) {
         return r;
+
             if ( Tm_box ) {
       }  // tm_init().getNamespaceNumber()
+
              setStyleAttribute( Tm_box,
 +
                                  { "visibility": "hidden",
 +
                                    "z-index":    "0" } );
 +
              if ( view === "EB" ) {
 +
                  // removes user interface
 +
                  Tm_box.parentNode.removeChild( Tm_box );
 +
                  Tm_box = null;
 +
              }
 +
            }
 +
            if ( typeof( OPTIONS.wikEd ) === "object"
 +
                &&  OPTIONS.wikEd.live ) {
 +
              OPTIONS.wikEd.live = false;
 +
              window.wikEd.useWikEd = true;
 +
              window.wikEd.saveButton.removeAttribute("disabled");
 +
              window.wikEd.previewButton.removeAttribute("disabled");
 +
              window.wikEd.diffPreviewButton.removeAttribute("disabled");
 +
              window.wikEd.SetEditArea( true, false );
 +
              window.wikEd.frameWindow.focus();
 +
            } else if ( Editbox ) {
 +
              if ( view === "EB" ) {
 +
                  Editbox.removeAttribute("readonly");
 +
                  document.getElementById("wpSave").removeAttribute("disabled");
 +
                  document.getElementById("wpPreview").removeAttribute("disabled");
 +
                  document.getElementById("wpDiff").removeAttribute("disabled");
 +
              }
 +
              setStyleAttribute( Editbox,
 +
                                  { "visibility": "visible" } );
 +
              Editbox.focus();
 +
            }
 +
            act_view = "EB";
 +
         } else if ( view !== act_view ) {
 +
            log_message("Internal error: act_view='" + act_view
 +
                        + "' conflicts with view parameter '"
 +
                        + view + "'");
 +
         }
 +
       }  // tm_init().switch_view_to()
  
  
  
       function replace_all( text, regexp, replacement ) {
+
       function parse_template_source( source ) {
         var count_tmp = 1000;
+
         var k = 0,
        while ( text.search(regexp) >= 0  &&  count_tmp ) {
+
            re_back = new RegExp( escapeSyntax, "g" ),
            text = text.replace(regexp, replacement);
+
            rep12 = "$1" + escapeSyntax + "$2",
            count_tmp--;
+
            Template_given = { },
        }
+
            x_comment = /<!--.*?-->/g,
        if (! count_tmp) {
+
            x_nowiki_1 = /(<\s*nowiki\s*>.*?)\|(.*?<\s*\/nowiki\s*>)/gi,
            log_message("replace_all: Internal error - infinite loop");
+
            x_nowiki_2 = /(<\s*nowiki\s*>.*?)=(.*?<\s*\/nowiki\s*>)/gi,
            text = null;
+
            x_wikilinks = /(\[\[[^\]]+)\|([^\]]*)/g,
        }
+
            equals, i, par, parameter, par_name, par_value, re;
        return text;
 
      }  // tm_init().replace_all()
 
  
 +
        source = replace_all(source, x_comment, "");
  
 +
        /* replace split chars within nowiki segments and nested templates */
 +
        source = replace_all(source, x_nowiki_1, rep12);
  
      function trim( text ) {
+
        /* replace split chars within wikilinks */
         text = "" + text;
+
        source = replace_all(source, x_wikilinks, rep12);
         text = replace_all(text, /^\s+/g, "");
+
 
        text = replace_all(text, /^(.*?)\s+$/, "$1");
+
         parameter = source.split("|");
        text = replace_all(text, "\n\n", "\n");
+
         for ( i = 0;  i < parameter.length;  i++ ) {
        if (text.search(/[^\s]/) < 0) {
+
            par = replace_all(parameter[i], re_back, "|");
            text = "";
+
            if (i) {
         }
+
              par = replace_all( par, x_nowiki_2, rep12 );
         return text;
+
              equals = par.search("=");
       }  // tm_init().trim()
+
              if (equals < 0) {
 
+
                  k++;
 +
                  par_name  = PAR_START + k;
 +
                  par_value = trim(par);
 +
              } else {
 +
                  par_name  = PAR_START + trim(par.substring(0, equals));
 +
                  par_value = trim(par.substring(equals + 1));
 +
              }
 +
              if (Template_given[ par_name ]) {
 +
                  log_message( "Syntax error: Parameter name \""
 +
                              + par_name.substr( PAR_START.length )
 +
                              + "\" already in use.");
 +
                  return null;
 +
              }
 +
              /* correct format errors */
 +
              par_value = replace_all( par_value, re_back, "=" );
 +
              Template_given[par_name] = par_value;
 +
            } else {
 +
              re = new RegExp( "^(Template|" + LOCALS.template + "): *(.*)$",
 +
                                "i" );
 +
              Template_given.template_name = trim(par);
 +
              if ( ! Template_given.template_name.search( re ) ) {
 +
                  Template_given.template_name = Template_given.template_name.replace(re, "$2");
 +
              }
 +
            }
 +
         }   // for i
 +
        Template_given.source = "source code";
 +
         return Template_given;
 +
       }  // tm_init().parse_template_source()
  
  
      /**
 
        Creates a new GUI node.
 
  
      @param nRoot null or reference to the prefered root node object
+
       /* == helper functions ==========================================*/
      @param nType HTML type string ("div" for example)
+
 
      @param nText null or string with the text for the text child node
+
 
      @param nAttr null or object with attribute attributes, ({style:"...",width:"100%"} for example)
+
 
      @return the new node object
+
      function buttonWikiEditor() {
      @author [[de:Benutzer:Revvar]]
+
        try {
       */
+
        $( "#wpTextbox1" ).wikiEditor( "addToToolbar",
      function cNode( nRoot, nType, nText, nAttr ) {
+
                        { "section": "main",
        var elem = document.createElement(nType),
+
                          "group":  "format",
            re1  = /^\s*([^:]+):.*$/,
+
                          "tools":  { "vorlagenmeister":
            re2  = /^\s*[^:]+:\s*([^\s;]+)[\s;]*$/,
+
                                        { type:  "button",
            aid,
+
                                          label:  LOCALS.me,
            i,
+
                                          icon:  BUTTONICON,
            style_attr,
+
                                          action: { type:    "callback",
            style_id,
+
                                                    execute: show
            style_obj,
+
                                                  }
            style_value;
+
                                        }
        if (nAttr) {
+
                                    }
            for (aid in nAttr) {
+
                        } );
              if (aid === "style") {
+
        } catch(e) {
                  style_attr = nAttr[aid].split(";");
+
            log_message("tm_init().buttonWikiEditor()\r\n" + e.message);
                  style_obj = { };
 
                  for (i = 0; i < style_attr.length; i++) {
 
                    style_id = style_attr[i].replace(re1, "$1");
 
                    style_value = style_attr[i].replace(re2,"$1");
 
                    if (style_id.length > 0) {
 
                        style_obj[style_id] = style_value;
 
                    }
 
        //            log_message(style_id + ":" + style_value);
 
                  }
 
                  setStyleAttribute(elem, style_obj);
 
              } else {
 
                  if (aid === "class") {
 
                    elem.className = nAttr[aid];
 
                  } else {
 
                    elem.setAttribute(aid, nAttr[aid]);
 
                  }
 
              }
 
            }  // for aid in nAttr
 
 
         }
 
         }
        if (nText) {
+
       } // tm_init().buttonWikiEditor()
            elem.appendChild(document.createTextNode(nText));
 
        }
 
        if (nRoot) {
 
            nRoot.appendChild(elem);
 
        }
 
        return elem;
 
       }   // tm_init().cNode()
 
  
  
      function setStyleAttribute( Node, Attribute ) {
 
        var aid;
 
        if ( Node && Attribute ) {
 
            for ( aid in Attribute ) {
 
              Node.style[ aid ] = Attribute[ aid ];
 
            }
 
        }
 
      }  // tm_init().setStyleAttribute()
 
  
 
+
       function buttonToolbar() {
 
+
         var $toolbar = $( "#toolbar" ),
       function removeEventListener( Node, event, callback ) {
+
            BUTTONBASE = "//upload.wikimedia.org/wikipedia/commons/"
         if ( IS_IE
+
                          + "e/ec/Button_base.png",
              &&  ( typeof( Node.detachEvent ) === "object" ||
+
            $btn, r, show;
                    typeof( Node.detachEvent ) === "function" ) ) {
+
        if ( $toolbar.length ) {
             // ... IE10
+
        try {
             Node.detachEvent("on"+event, callback);
+
            r    = "tm_switch_button";
         } else {
+
            $btn = $( "<div>" );
             Node.removeEventListener(event, callback, false);
+
            $btn.attr( { "id":    r,
 +
                        "class": r + " mw-toolbar-editbutton",
 +
                        "title": LOCALS.me } );
 +
            $btn.css( { "background-image": "url(" + BUTTONBASE + ")",
 +
                        "display":          "inline",
 +
                        "height":          "22px",
 +
                        "width":            "23px" } );
 +
            if ( typeof OPTIONS.toolbarLabel  === "string"
 +
                &&    OPTIONS.toolbarLabel ) {
 +
              show = OPTIONS.toolbarLabel;
 +
             } else {
 +
              show = LOCALS.ButtonText;
 +
            }
 +
            $btn.text( show );
 +
             $toolbar.prepend( $btn );
 +
         } catch(e) {
 +
             log_message("tm_init().buttonToolbar()\r\n" + e.message);
 +
        }
 
         }
 
         }
       }   // tm_init().removeEventListener()
+
        return r;
 +
       } // tm_init().buttonToolbar()
  
  
  
       function mwXmlHttpRequest( data ) {
+
       function equipGUI() {
         // Start possible actions on current page
+
         var lucky = false,
        // Precondition:
+
            opts  = mw.user.options.get( [ "showtoolbar",
        //    data.api      true  or false->index.php
+
                                            "usebetatoolbar" ] ),
        //    data.pars    details
+
            shower = false;
        //    data.onload  callback
+
         if ( typeof( window.wikEd ) === "object" ) {
        //    data.onerror  function on failure
+
             OPTIONS.wikEd = { live: false };
        // Postcondition:
+
             if ( typeof( window.wikEd.config ) === "object"   &&
        //    ajax request launched
+
                typeof( window.wikEd.config.button ) === "object"   &&
        // 2014-06-20 PerfektesChaos@de.wikipedia
+
                typeof( window.wikEd.config.button[ 745 ] ) === "object" ) {
        var defaults;
+
              OPTIONS.wikEd.click = show;
         if ( typeof xmlHTTP[ data.api ]  !== "object" ) {
 
             if ( data.api ) {
 
              xmlHTTP[ true ] = new mw.Api();
 
             } else {
 
              defaults = { ajax:      { url:      mw.util.wikiScript(),
 
                                          dataType: "text" },
 
                            parameters: { action: "raw" } };
 
              xmlHTTP[ false ] = new mw.Api( defaults );
 
 
             }
 
             }
 
         }
 
         }
         xmlHTTP[ data.api ].get( data.pars )
+
         if ( opts.usebetatoolbar ) {
                            .done( data.onload )
+
            mw.loader.using( [ "ext.wikiEditor" ],
                            .fail( data.onerror );
+
                            buttonWikiEditor );
      }   // tm_init().mwXmlHttpRequest()
+
            lucky = true;
 
+
        } else if ( opts.showtoolbar ) {
 
+
            shower = buttonToolbar();
 
+
            lucky  = shower;
      function resizeInputBox( oInputBox, extra_spaces ) {
+
        }
        var right_pos = oInputBox.offsetWidth,
+
        if ( ! lucky ) {
            tmp_str = "",
+
            shower = "t-vorlagenmeister";
            node = oInputBox,
+
            try {
            table_node = null,
+
              mw.util.addPortletLink( "p-tb", "#", LOCALS.me, shower );
            old_width;
+
            } catch(e) {
        if (resize_mutex === true) {
+
              log_message("mw.util.addPortletLink()\r\n" + e.message);
             return;
+
             }
 
         }
 
         }
        resize_mutex = true;
+
         if ( shower ) {
         if ( ! ( oInputBox.nodeName  &&
+
             $( "#" + shower ).click( show );
                  ! oInputBox.nodeName.search(/^input$/i)  &&
 
                  oInputBox.type  &&
 
                  ! oInputBox.type.search(/^text$/i) ) ) {
 
             log_message("Internal error: call of CInputBoxResizer.opResize with an unsupported node type: " + oInputBox);
 
            resize_mutex = false;
 
            return;
 
 
         }
 
         }
 +
      } // tm_init().equipGUI()
  
        /* first call for this node ? */
 
        if (!(oInputBox.tm_org_size)) {
 
            oInputBox.tm_org_size = oInputBox.size; // save orginal size
 
        }
 
  
        if (oInputBox.tm_org_size >= oInputBox.value.length) {
+
 
            resize_mutex = false;
+
      function init() {
            return;
+
         var sXML = mw.util.getParamValue( "tm_xml_content" ),
         }
+
            userAgent;
        oInputBox.size = oInputBox.value.length + extra_spaces;
+
 
        right_pos = oInputBox.offsetWidth;
+
         OPTIONS.loading = false;
        tmp_str = "";
+
 
         node = oInputBox;
+
         if ( sXML ) {
        table_node = null;
+
             $( "#wpTextbox1" ).val( sXML );
         do {
+
        } else {
             if (node.className.search("tm_table") >= 0) {
+
            try {
              table_node = node;
+
               try {
            } else {
+
                  LOCALS = I18N.fire();
               right_pos += node.offsetLeft;
+
               } catch(e) {
               tmp_str  += node.offsetLeft + "px +";
+
                  log_message("init() I18N.fire()\r\n" + e.message);
            }
+
              }
            node = node.parentNode;
+
              try {
        } while (node.className.search("tm_group") < 0);
+
                  Sanitize();
        if ((right_pos + 8) > node.offsetWidth) {
+
              } catch(e) {
            if (IS_IE) {
+
                  log_message("init() Sanitize()\r\n" + e.message);
              while ((right_pos + 8) > node.offsetWidth) {
 
                  old_width = oInputBox.offsetWidth;
 
                  oInputBox.size--;
 
                  right_pos -= old_width - oInputBox.offsetWidth;
 
 
               }
 
               }
            } else {
+
              try {
              oInputBox.size = oInputBox.tm_org_size;
+
                  equipGUI();
              if (table_node) {
+
               } catch(e) {
                  table_node.className = "tm_table tm_table_max";
+
                   log_message("init() equipGUI()\r\n" + e.message);
               } else {
 
                   log_message("internal error: table not found");
 
 
               }
 
               }
               oInputBox.className = "tm_input tm_input_max";
+
               // globals
             }
+
              PAR_START = "tm_form_";
            removeEventListener(oInputBox, "keyup", resizeHandler);
+
              $Statebar = null;
 +
              Template = { };
 +
              Tm_box = null;
 +
              act_view = "EB";
 +
              Act_input = null;
 +
              is_xml_generated = false;
 +
              generated_xml = "";
 +
              max_value_indentation = 32;
 +
              resize_mutex = false;
 +
              if ( ! IS_IE ) {
 +
                  userAgent = $.client.profile();
 +
                  is_gecko = ( userAgent.layout === "gecko" );
 +
                  is_opera = ( userAgent.name === "opera" );
 +
              }
 +
             } catch(e) {
 +
              log_message("init()\r\n" + e.message);
 +
            }
 
         }
 
         }
        resize_mutex = false;
+
       } // tm_init().init()
        return;
+
 
       } // tm_init().resizeInputBox()
+
 
 +
 
 +
      init();
 +
  } // tm_init()
 +
 
  
  
 +
//## File: tm_w2t_infobox_schienenfahrzeug.js #################
  
      function buttonWikiEditor() {
+
/**
        $( "#wpTextbox1" ).wikiEditor( "addToToolbar",
+
* Wiki2Template-Plugin des Vorlagen-Meister fuer die Vorlage "Infobox Schienenfahrzeug", Version: 0.1beta, Date: 2007-02-04
                        { "section": "main",
+
* Copyright (C) 2007 [[de:Benutzer:Revvar]] <revvar@gmx.de>
                          "group":   "format",
+
* Released under the GPL license version 2
                          "tools":   { "vorlagenmeister":
+
* http://www.gnu.org/copyleft/gpl.html
                                        { type:  "button",
+
*
                                          label: LOCALS.me,
+
* This program is free software; you can redistribute it and/or modify
                                          icon:  BUTTONICON,
+
* it under the terms of the GNU General Public License version 2 as
                                          action: { type:    "callback",
+
* published by the Free Software Foundation.
                                                    execute: show
+
*
                                                  }
+
* This program is distributed in the hope that it will be useful,
                                        }
+
* but WITHOUT ANY WARRANTY; without even the implied warranty
                                    }
+
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE.
                        } );
+
* See the GNU General Public License for more details.
      } // tm_init().buttonWikiEditor()
+
*/
  
 +
function TM_P_Infobox_Schienenfahrzeug() {
 +
  TM_P_Wiki2Template.call(this);
  
 
+
  var name = "Infobox Schienenfahrzeug";
      function buttonToolbar() {
+
  this.opGetName = function() {
        var $toolbar = $( "#toolbar" ),
+
      return name;
            BUTTONBASE = "//upload.wikimedia.org/wikipedia/commons/"
+
  };
                          + "e/ec/Button_base.png",
+
  var template = "Infobox Schienenfahrzeug";
            $btn, r, show;
+
  this.opGetTemplate = function() {
        if ( $toolbar.length ) {
+
      return template;
            r    = "tm_switch_button";
+
  };
            $btn = $( "<div>" );
+
  var super_opTransform = this.opTransform;
            $btn.attr( { "id":    r,
+
  this.opTransform = function(wiki_text) {
                        "class": r + " mw-toolbar-editbutton",
+
      wiki_text = super_opTransform(wiki_text);
                        "title": LOCALS.me } );
+
      var Template = { };
            $btn.css( { "background-image": "url(" + BUTTONBASE + ")",
+
      Template.template_name = template;
                        "display":         "inline",
+
      Template.source = "plug-in";
                        "height":          "22px",
+
      var line = wiki_text.split("\n");
                        "width":            "23px" } );
+
      for (var i = 0; i < line.length; i++) {
             if ( typeof OPTIONS.toolbarLabel  =="string"
+
         if (line[i].search(/\s*(\|-|\|\}|\{\|)/) !== 0
                &&    OPTIONS.toolbarLabel ) {
+
            &&  line[i].search(/\|\|/) > 0) {
               show = OPTIONS.toolbarLabel;
+
            var entry = line[i].split("||");
             } else {
+
             if (entry.length !== 2) {
               show = LOCALS.ButtonText;
+
              log_message("TM_P_Infobox_Schienenfahrzeug: Momentan wird nur ein ||-Trenner pro Zeile unterstützt.");
 +
               return null;
 +
            }
 +
            var x_wikilink = /\[\[[^|]+\|([^\]]+)\]\]/;
 +
             if (entry[0].search(x_wikilink) >= 0) {
 +
               entry[0] = entry[0].replace(x_wikilink, "$1");
 
             }
 
             }
             $btn.text( show );
+
             entry[0] = entry[0].replace(/^\s*\|\s*/g, "").replace(/^\s*(\S.*\S)\s*$/g,"$1").replace(/[^a-zA-ZäöüÄÖÜß0-9_]/g,"");
            $toolbar.prepend( $btn );
+
            entry[1] = entry[1].replace(/^\s*(\S.*\S)\s*$/g,"$1");
        }
+
            if ( entry[1].charCodeAt( 0 ) === 124 ) {   // '|'
        return r;
+
              entry[1] = entry[1].substring(1);
      } // tm_init().buttonToolbar()
+
             }
 
+
             if ( ! entry[0].search(/^Indienststellung$/i) ) {
 
+
              entry[0] = "Baujahre";
 
+
            }
      function equipGUI() {
+
            if ((entry[1].search(/^\s*k\s*\.\s*A\s*(\.){0,1}\s*$/) < 0) && (entry[1].search(/^\s*-+\s*/) < 0)) {
        var lucky  = false,
+
               Template[ PAR_START + entry[0] ] = entry[1];
            opts  = mw.user.options.get( [ "showtoolbar",
 
                                            "usebetatoolbar" ] ),
 
            shower = false;
 
        if ( typeof( window.wikEd ) === "object" ) {
 
             OPTIONS.wikEd = { live: false };
 
             if ( typeof( window.wikEd.config ) === "object"   &&
 
                typeof( window.wikEd.config.button ) === "object"  &&
 
                typeof( window.wikEd.config.button[ 745 ] ) === "object" ) {
 
               OPTIONS.wikEd.click = show;
 
 
             }
 
             }
 +
        } else if (line[i].search(/^\s*!.*((color:|background)[^\|]*){2,2}\|.*/) === 0) {
 +
            var base_color_name = {"aqua":"00ffff", "black":"000000", "blue":"0000ff", "fuchsia":"ff00ff", "gray":"808080", "green":"008000", "lime":"00ff00", "maroon":"800000", "navy":"000080", "olive":"808000", "purple":"800080", "red":"ff0000", "silver":"c0c0c0", "teal":"008080", "white":"ffffff", "yellow":"ffff00"};
 +
            // Baureihe, Farbe1 und Farbe2
 +
            var baureihe = line[i].substring(line[i].search(/\|/) + 1).replace(/^\s*(\S.*\S)\s*$/g,"$1");
 +
            var farbe2 = line[i].replace(/^.*[^a-zA-Z]color\s*:\s*(#[a-fA-F0-9]{6,6}|[a-zA-Z]+).*/,"$1").replace(/^\s*(\S.*\S)\s*$/g,"$1");
 +
            var farbe1 = line[i].replace(/^.*[^a-zA-Z]background(-color){0,1}\s*:\s*(#[a-fA-F0-9]{6,6}|[a-zA-Z]+).*/,"$2").replace(/^\s*(\S.*\S)\s*$/g,"$1");
 +
            if (farbe1.charCodeAt( 0 )  ===  35 ) {  // '#'
 +
              farbe1 = farbe1.substring(1);
 +
            }
 +
            else if (base_color_name[farbe1.toLowerCase()]) {
 +
              farbe1 = base_color_name[farbe1.toLowerCase()];
 +
            }
 +
            else {
 +
              farbe1 = null;
 +
            }
 +
            if (farbe2.charCodeAt( 0 )  ===  35 ) {  // '#'
 +
              farbe2 = farbe2.substring(1);
 +
            } else if (base_color_name[farbe2.toLowerCase()]) {
 +
              farbe2 = base_color_name[farbe2.toLowerCase()];
 +
            } else {
 +
              farbe2 = null;
 +
            }
 +
            Template[PAR_START + "Baureihe"] = baureihe;
 +
            if (farbe1) {
 +
              Template[PAR_START + "Farbe1"] = farbe1;
 +
            }
 +
            if (farbe2) {
 +
              Template[PAR_START + "Farbe2"] = farbe2;
 +
            }
 +
        } else if (line[i].search(/^\s*(!|\|[^\-]).*\[\[(Bild|Image):[^\]]+\]\]/) === 0) {
 +
            var bild = line[i].replace(/^\s*(!|\|).*\[\[(Bild|Image):([^\]]+)\]\].*/,"$3");
 +
            bild = bild.split("|");
 +
            Template[PAR_START + "Abbildung"] = bild[0];
 +
            for (var k = 1; k < bild.length; k++) {
 +
              if (bild[k].search("[0-9]px") < 0) {
 +
                  Template[PAR_START + "Name"] = bild[k].replace(/^\s*(\S.*\S)\s*$/g,"$1");
 +
              }
 +
            }  // for k
 
         }
 
         }
        if ( opts.usebetatoolbar ) {
+
      }
            mw.loader.using( [ "ext.wikiEditor.toolbar" ],
+
      return Template;
                            buttonWikiEditor );
+
  };
            lucky = true;
+
}   // TM_P_Infobox_Schienenfahrzeug()
        } else if ( opts.showtoolbar ) {
+
TM_P_Infobox_Schienenfahrzeug.prototype=new TM_P_Wiki2Template();
            shower = buttonToolbar();
 
            lucky  = shower;
 
        }
 
        if ( ! lucky ) {
 
            shower = "t-vorlagenmeister";
 
            mw.util.addPortletLink( "p-tb", "#", LOCALS.me, shower );
 
        }
 
        if ( shower ) {
 
            $( "#" + shower ).click( show );
 
        }
 
      } // tm_init().equipGUI()
 
  
 +
TM_PluginList.push(new TM_P_Infobox_Schienenfahrzeug()); // register plugin
  
  
      function init() {
 
        var sXML = mw.util.getParamValue( "tm_xml_content" ),
 
            userAgent;
 
  
        OPTIONS.loading = false;
+
  // ###################################################################
  
        if ( sXML ) {
 
            $( "#wpTextbox1" ).val( sXML );
 
        } else {
 
            try {
 
              LOCALS = I18N.fire();
 
              equipGUI();
 
  
              // globals
 
              PAR_START = "tm_form_";
 
              State = null;
 
              Template = { };
 
              Tm_box = null;
 
              act_view = "EB";
 
              Act_input = null;
 
              help_mutex = false;
 
              is_xml_generated = false;
 
              generated_xml = "";
 
              max_value_indentation = 32;
 
              resize_mutex = false;
 
  
              if ( ! IS_IE ) {
+
  function initialize() {
                  userAgent = $.client.profile();
+
      // Start action on current page
                  is_gecko = ( userAgent.layout === "gecko" );
+
      // Precondition:
                  is_opera = ( userAgent.name === "opera" );
+
      //    configs have been loaded
              }
+
      // Postcondition:
             } catch(e) {
+
      //    tm_init() will be called upon document.ready
              log_message("init()\r\n" + e.message);
+
      // 2014-07-21 PerfektesChaos@de.wikipedia
             }
+
      BUTTONICON = "//upload.wikimedia.org/wikipedia/commons/"
 +
                  + "e/eb/Button_templatelink.png";
 +
      if ( mw.user.options.get( "gadget-wikEd" )
 +
          ||  typeof( window.wikEd ) === "object" ) {
 +
        if ( typeof( window.wikEd ) !== "object" ) {
 +
            window.wikEd = {  config: { }  };
 +
        }
 +
        if ( typeof( window.wikEd.config ) !== "object" ) {
 +
             window.wikEd.config = { button:    { },
 +
                                    buttonBar: { } };
 +
        }
 +
        if ( typeof( window.wikEd.config.button  ) !== "object" ) {
 +
             window.wikEd.config.button = { };
 
         }
 
         }
      } // tm_init().init()
+
        window.wikEd.config.button[ 745 ] = [ "wikEdVorlagenmeister",
 
+
                                              "wikEdButton",
 
+
                                              "Vorlagenmeister",
 
+
                                              BUTTONICON, "16", "16",
      init();
+
                                              "DIV",
  } // tm_init()
+
                                              "window.mediaWiki.libs."
 
+
                                              + MW_LIB
 
+
                                              + ".wikEd.click();"
 
+
                                            ];
  function log_message(msg) {
+
        if ( typeof( window.wikEd.config.buttonBar ) !== "object" ) {
      window.alert( LOCALS.me + " " + VERSION + ":\r\n" + msg );
+
            window.wikEd.config.buttonBar = { };
  }  // log_message()
+
        }
 
+
        if ( typeof( window.wikEd.config.buttonBar.custom1 ) !== "object" ) {
 
+
             window.wikEd.config.buttonBar.custom1 =
 
+
                                              [ "wikEdButtonBarCustom1",
  function parseXML(text) {
+
                                                "wikEdButtonBarCustom1",
      var dom = null,
+
                                                "wikEdButtonsCustom1",
          aError, aHtmlText, aLocation, error, parser, sError;
+
                                                "wikEdButtonsCustom1",
      if ( IS_IE ) {
+
                                                44,
        try {
+
                                                "Meine Buttons",
            dom = new ActiveXObject( "Microsoft.XMLDOM" );
+
                                                [ ]
             dom.async = "false";
+
                                              ];
            dom.loadXML( text );
 
        } catch(e) {
 
            log_message( "parseXML(IE:ActiveXObject) " + e.message );
 
 
         }
 
         }
 +
        window.wikEd.config.buttonBar.custom1[ 6 ].push( 745 );
 
       }
 
       }
       if ( ! dom ) {
+
       $( tm_init );
        try {
+
  }  // initialize()
            parser = new DOMParser();
+
 
            dom = parser.parseFromString( text, "text/xml" );
+
 
            error = dom.getElementsByTagName( "parsererror" );
+
 
            if ( error[0] ) {
+
  function loadStyleIE( area, access ) {
              sError = error[0].firstChild.nodeValue;
+
      // Load stylesheet where mw.loader.load() fails for IE.
              log_message("parseXML() " + sError);
+
      // Precondition:
              aError = sError.split("\n");
+
      //    mw.util.wikiScript() :: mediawiki.util
              if (aError[2]) {
+
      //   mw.Api() :: mediawiki.api
                  aLocation=aError[2].match(/[0-9]+/g);
+
      //    mediawiki.api has been loaded
                  if (aLocation[0]) {
+
      // 2014-08-04 PerfektesChaos@de.wikipedia
                    aHtmlText = text.split("\n");
+
      var defaults = { ajax: { url:  area + mw.util.wikiScript( "api" )
                    log_message("error line:"
+
                            }
                                + aHtmlText[ aLocation[0]-1 ]);
+
                    },
                  }
+
          done = function ( arrived ) {
              } else {
+
                    var q, $style;
                  log_message("no error position");
+
                    if ( typeof arrived  ===  "object"  &&
              }
+
                          typeof arrived.query  ===  "object"  &&
            }
+
                          typeof arrived.query.pages  ===  "object"  &&
        } catch(e) {
+
                          typeof arrived.query.pageids  ===  "object" ) {
            log_message( "parseXML(DOMParser) " + e.message );
+
                        q  = arrived.query;
        }
+
                        q  =  q.pages[ q.pageids[ 0 ] ];
       }
+
                        if ( typeof q  ===  "object"   &&
      return dom;
+
                            typeof q.revisions  === "object" ) {
   }  // parseXML()
+
                          q  = q.revisions[ 0 ];
 +
                          if ( typeof q  ===  "object"  &&
 +
                                typeof q[ "*" ] ===  "string" ) {
 +
                              $style = $( "<style>"
 +
                                      + q[ "*" ]
 +
                                      + "</style>" );
 +
                              $style.attr( { title: "loadStyleIE",
 +
                                            type:  "text/css" } );
 +
                              $( "head" ).append( $style );
 +
                          }
 +
                        }
 +
                    }
 +
                  },
 +
          params = { prop:        "revisions",
 +
                    indexpageids: true,
 +
                    rvprop:      "content",
 +
                    rvlimit:      "1",
 +
                    titles:      access
 +
                  },
 +
          request = new mw.Api( defaults );
 +
       request.get( params )
 +
            .done( done );
 +
   }  // loadStyleIE()
  
  
  
//## File: tm_w2t_infobox_schienenfahrzeug.js #################
+
  function autoRun() {
 
+
      // Start possible actions on current page
/**
+
      // Precondition:
* Wiki2Template-Plugin des Vorlagen-Meister fuer die Vorlage "Infobox Schienenfahrzeug", Version: 0.1beta, Date: 2007-02-04
+
      //    jquery.client and configs have been loaded
* Copyright (C) 2007 [[de:Benutzer:Revvar]] <revvar@gmx.de>
+
      //   $.client() :: jquery.client
* Released under the GPL license version 2
+
      // Postcondition:
* http://www.gnu.org/copyleft/gpl.html
+
      //    initialize() will be called, if appropriate
*
+
      //   IS_IE has been defined
* This program is free software; you can redistribute it and/or modify
+
      // 2016-11-01 PerfektesChaos@de.wikipedia
* it under the terms of the GNU General Public License version 2 as
+
      var env    = mw.config.get( [ "wgAction",
* published by the Free Software Foundation.
+
                                    "wgIsProbablyEditable",
*
+
                                    "wgNamespaceNumber",
* This program is distributed in the hope that it will be useful,
+
                                    "wgPageContentModel",
* but WITHOUT ANY WARRANTY; without even the implied warranty
+
                                    "wgScript",
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE.
+
                                    "wgServer",
* See the GNU General Public License for more details.
+
                                    "wgTitle" ] ),
*/
+
          server = "//de.wikipedia.beta.wmflabs.org",
 
+
          sheet  = "MediaWiki:Gadget-Vorlagenmeister.css",
function TM_P_Infobox_Schienenfahrzeug() {
+
          legacy, maxage, userAgent;
  TM_P_Wiki2Template.call(this);
+
      if ( ( env.wgAction === "edit" ||  env.wgAction === "submit" ) &&
 
+
          env.wgIsProbablyEditable  &&
  var name = "Infobox Schienenfahrzeug";
+
          env.wgPageContentModel === "wikitext" &&
  this.opGetName = function() {
+
          ! ( env.wgNamespaceNumber === 10  &&
      return name;
+
              /\/XML$/.test( env.wgTitle ) ) ) {
  };
+
        if ( env.wgServer.indexOf( server )  <  0 ) {
  var template = "Infobox Schienenfahrzeug";
+
            server = "https://de.wikipedia.org";
  this.opGetTemplate = function() {
+
            maxage = 1209600;  // 14 d
      return template;
+
        } else {
  };
+
            maxage = 0;
  var super_opTransform = this.opTransform;
+
        }
  this.opTransform = function(wiki_text) {
+
        userAgent = $.client.profile();
      wiki_text = super_opTransform(wiki_text);
+
        IS_IE    = ( userAgent.name === "msie" );
      var Template = { };
+
         if ( IS_IE ) {
      Template.template_name = template;
+
             IS_IE = userAgent.versionNumber;
      Template.source = "plug-in";
+
            /*
      var line = wiki_text.split("\n");
+
             if ( userAgent.versionNumber >= 9 ) {
      for (var i = 0; i < line.length; i++) {
+
               IS_IE_9plus  = userAgent.versionNumber;
         if (line[i].search(/\s*(\|-|\|\}|\{\|)/) !== 0
 
            &&  line[i].search(/\|\|/) > 0) {
 
             var entry = line[i].split("||");
 
             if (entry.length !== 2) {
 
               log_message("TM_P_Infobox_Schienenfahrzeug: Momentan wird nur ein ||-Trenner pro Zeile unterstützt.");
 
              return null;
 
 
             }
 
             }
             var x_wikilink = /\[\[[^|]+\|([^\]]+)\]\]/;
+
             */
            if (entry[0].search(x_wikilink) >= 0) {
 
              entry[0] = entry[0].replace(x_wikilink, "$1");
 
            }
 
            entry[0] = entry[0].replace(/^\s*\|\s*/g, "").replace(/^\s*(\S.*\S)\s*$/g,"$1").replace(/[^a-zA-ZäöüÄÖÜß0-9_]/g,"");
 
            entry[1] = entry[1].replace(/^\s*(\S.*\S)\s*$/g,"$1");
 
            if ( entry[1].charCodeAt( 0 )  ===  124 ) {  // '|'
 
              entry[1] = entry[1].substring(1);
 
            }
 
            if ( ! entry[0].search(/^Indienststellung$/i) ) {
 
              entry[0] = "Baujahre";
 
            }
 
            if ((entry[1].search(/^\s*k\s*\.\s*A\s*(\.){0,1}\s*$/) < 0) && (entry[1].search(/^\s*-+\s*/) < 0)) {
 
              Template[ PAR_START + entry[0] ] = entry[1];
 
            }
 
        } else if (line[i].search(/^\s*!.*((color:|background)[^\|]*){2,2}\|.*/) === 0) {
 
            var base_color_name = {"aqua":"00ffff", "black":"000000", "blue":"0000ff", "fuchsia":"ff00ff", "gray":"808080", "green":"008000", "lime":"00ff00", "maroon":"800000", "navy":"000080", "olive":"808000", "purple":"800080", "red":"ff0000", "silver":"c0c0c0", "teal":"008080", "white":"ffffff", "yellow":"ffff00"};
 
            // Baureihe, Farbe1 und Farbe2
 
            var baureihe = line[i].substring(line[i].search(/\|/) + 1).replace(/^\s*(\S.*\S)\s*$/g,"$1");
 
            var farbe2 = line[i].replace(/^.*[^a-zA-Z]color\s*:\s*(#[a-fA-F0-9]{6,6}|[a-zA-Z]+).*/,"$1").replace(/^\s*(\S.*\S)\s*$/g,"$1");
 
            var farbe1 = line[i].replace(/^.*[^a-zA-Z]background(-color){0,1}\s*:\s*(#[a-fA-F0-9]{6,6}|[a-zA-Z]+).*/,"$2").replace(/^\s*(\S.*\S)\s*$/g,"$1");
 
            if (farbe1.charCodeAt( 0 )  ===  35 ) {  // '#'
 
              farbe1 = farbe1.substring(1);
 
            }
 
            else if (base_color_name[farbe1.toLowerCase()]) {
 
              farbe1 = base_color_name[farbe1.toLowerCase()];
 
            }
 
            else {
 
              farbe1 = null;
 
            }
 
            if (farbe2.charCodeAt( 0 )  ===  35 ) {  // '#'
 
              farbe2 = farbe2.substring(1);
 
            } else if (base_color_name[farbe2.toLowerCase()]) {
 
              farbe2 = base_color_name[farbe2.toLowerCase()];
 
            } else {
 
              farbe2 = null;
 
            }
 
            Template[PAR_START + "Baureihe"] = baureihe;
 
            if (farbe1) {
 
              Template[PAR_START + "Farbe1"] = farbe1;
 
            }
 
            if (farbe2) {
 
              Template[PAR_START + "Farbe2"] = farbe2;
 
            }
 
        } else if (line[i].search(/^\s*(!|\|[^\-]).*\[\[(Bild|Image):[^\]]+\]\]/) === 0) {
 
            var bild = line[i].replace(/^\s*(!|\|).*\[\[(Bild|Image):([^\]]+)\]\].*/,"$3");
 
            bild = bild.split("|");
 
            Template[PAR_START + "Abbildung"] = bild[0];
 
            for (var k = 1; k < bild.length; k++) {
 
              if (bild[k].search("[0-9]px") < 0) {
 
                  Template[PAR_START + "Name"] = bild[k].replace(/^\s*(\S.*\S)\s*$/g,"$1");
 
              }
 
            }  // for k
 
        }
 
      }
 
      return Template;
 
  };
 
}  // TM_P_Infobox_Schienenfahrzeug()
 
TM_P_Infobox_Schienenfahrzeug.prototype=new TM_P_Wiki2Template();
 
 
 
TM_PluginList.push(new TM_P_Infobox_Schienenfahrzeug()); // register plugin
 
 
 
 
 
 
 
  // ###################################################################
 
 
 
 
 
 
 
  function initialize() {
 
      // Start action on current page
 
      // Precondition:
 
      //    configs have been loaded
 
      // Postcondition:
 
      //    tm_init() will be called upon document.ready
 
      // 2014-07-21 PerfektesChaos@de.wikipedia
 
      BUTTONICON = "//upload.wikimedia.org/wikipedia/commons/"
 
                  + "e/eb/Button_templatelink.png";
 
      if ( mw.user.options.get( "gadget-wikEd" )
 
          ||  typeof( window.wikEd ) === "object" ) {
 
        if ( typeof( window.wikEd ) !== "object" ) {
 
            window.wikEd = {  config: { }  };
 
        }
 
        if ( typeof( window.wikEd.config ) !== "object" ) {
 
            window.wikEd.config = { button:    { },
 
                                    buttonBar: { } };
 
        }
 
        if ( typeof( window.wikEd.config.button  ) !== "object" ) {
 
            window.wikEd.config.button = { };
 
        }
 
        window.wikEd.config.button[ 745 ] = [ "wikEdVorlagenmeister",
 
                                              "wikEdButton",
 
                                              "Vorlagenmeister",
 
                                              BUTTONICON, "16", "16",
 
                                              "DIV",
 
                                              "window.mediaWiki.libs."
 
                                              + MW_LIB
 
                                              + ".wikEd.click();"
 
                                            ];
 
        if ( typeof( window.wikEd.config.buttonBar ) !== "object" ) {
 
            window.wikEd.config.buttonBar = { };
 
        }
 
        if ( typeof( window.wikEd.config.buttonBar.custom1 ) !== "object" ) {
 
            window.wikEd.config.buttonBar.custom1 =
 
                                              [ "wikEdButtonBarCustom1",
 
                                                "wikEdButtonBarCustom1",
 
                                                "wikEdButtonsCustom1",
 
                                                "wikEdButtonsCustom1",
 
                                                44,
 
                                                "Meine Buttons",
 
                                                [ ]
 
                                              ];
 
        }
 
        window.wikEd.config.buttonBar.custom1[ 6 ].push( 745 );
 
      }
 
      $( tm_init );
 
  }  // initialize()
 
 
 
 
 
 
 
  function loadStyleIE( area, access ) {
 
      // Load stylesheet where mw.loader.load() fails for IE.
 
      // Precondition:
 
      //    mw.util.wikiScript() :: mediawiki.util
 
      //    mw.Api() :: mediawiki.api
 
      //    mediawiki.api has been loaded
 
      // 2014-08-04 PerfektesChaos@de.wikipedia
 
      var defaults = { ajax: { url:  area + mw.util.wikiScript( "api" )
 
                            }
 
                    },
 
          done = function ( arrived ) {
 
                    var q, $style;
 
                    if ( typeof arrived  ===  "object"  &&
 
                          typeof arrived.query  ===  "object"  &&
 
                          typeof arrived.query.pages  ===  "object"  &&
 
                          typeof arrived.query.pageids  ===  "object" ) {
 
                        q  =  arrived.query;
 
                        q  =  q.pages[ q.pageids[ 0 ] ];
 
                        if ( typeof q  ===  "object"  &&
 
                            typeof q.revisions  ===  "object" ) {
 
                          q  =  q.revisions[ 0 ];
 
                          if ( typeof q  ===  "object"  &&
 
                                typeof q[ "*" ]  ===  "string" ) {
 
                              $style = $( "<style>"
 
                                      + q[ "*" ]
 
                                      + "</style>" );
 
                              $style.attr( { title: "loadStyleIE",
 
                                            type:  "text/css" } );
 
                              $( "head" ).append( $style );
 
                          }
 
                        }
 
                    }
 
                  },
 
          params = { prop:        "revisions",
 
                    indexpageids: true,
 
                    rvprop:      "content",
 
                    rvlimit:      "1",
 
                    titles:      access
 
                  },
 
          request = new mw.Api( defaults );
 
      request.get( params )
 
            .done( done );
 
  }  // loadStyleIE()
 
 
 
 
 
 
 
  function autoRun() {
 
      // Start possible actions on current page
 
      // Precondition:
 
      //    jquery.client and configs have been loaded
 
      //    $.client() :: jquery.client
 
      // Postcondition:
 
      //    initialize() will be called, if appropriate
 
      //    IS_IE has been defined
 
      // 2015-01-14 PerfektesChaos@de.wikipedia
 
      var env    = mw.config.get( [ "wgAction",
 
                                    "wgIsProbablyEditable",
 
                                    "wgNamespaceNumber",
 
                                    "wgPageContentModel",
 
                                    "wgScript",
 
                                    "wgServer",
 
                                    "wgTitle" ] ),
 
          server = "//de.wikipedia.beta.wmflabs.org",
 
          sheet  = "MediaWiki:Gadget-Vorlagenmeister.css",
 
          legacy, maxage, userAgent;
 
      if ( ( env.wgAction === "edit"  ||  env.wgAction === "submit" )  &&
 
          env.wgIsProbablyEditable  &&
 
          env.wgPageContentModel === "wikitext"  &&
 
          ! ( env.wgNamespaceNumber === 10  &&
 
              /\/XML$/.test( env.wgTitle ) ) ) {
 
        if ( env.wgServer === server ) {
 
            maxage = 0;
 
        } else {
 
            server = "//de.wikipedia.org";
 
            maxage = 1209600;  // 14 d
 
        }
 
        userAgent = $.client.profile();
 
        IS_IE    = ( userAgent.name === "msie" );
 
        if ( IS_IE ) {
 
            IS_IE = userAgent.versionNumber;
 
 
             legacy = ( IS_IE < 11 );
 
             legacy = ( IS_IE < 11 );
 
         } else {
 
         } else {
Line 3,129: Line 3,350:
 
         }
 
         }
 
         mw.loader.using( [ "mediawiki.api",
 
         mw.loader.using( [ "mediawiki.api",
                             "mediawiki.toolbar",
+
                             "mediawiki.user",
                             "mediawiki.util" ],
+
                             "mediawiki.util",
 +
                            "jquery.tipsy" ],   // DEPRECATED (known)
 
                           initialize );
 
                           initialize );
 
       }
 
       }
Line 3,137: Line 3,359:
  
  
   if ( typeof( mw.libs[ MW_LIB ] ) !== "object"  ||
+
   if ( mw.loader.getState( SIGNATURE ) !== "ready" ) {
        ! mw.libs[ MW_LIB ] ) {
+
      if ( typeof( mw.libs[ MW_LIB ] ) !== "object"  ||
      mw.libs[ MW_LIB ] = { };
+
          ! mw.libs[ MW_LIB ] ) {
  }
+
        mw.libs[ MW_LIB ] = { };
  OPTIONS = mw.libs[ MW_LIB ];
 
  if ( typeof( OPTIONS.loading ) !== "boolean" ) {
 
      OPTIONS.loading = true;
 
      if ( ! mw.loader.getState( SIGNATURE ) ) {
 
        mw.loader.state( SIGNATURE, "ready" );
 
 
       }
 
       }
 +
      mw.libs[ MW_LIB ].type = MW_LIB;
 +
      OPTIONS                = mw.libs[ MW_LIB ];
 
       OPTIONS.vsn = VERSION;
 
       OPTIONS.vsn = VERSION;
 
       mw.loader.using( [ "jquery.client",
 
       mw.loader.using( [ "jquery.client",
Line 3,153: Line 3,372:
 
                         "user.options" ],
 
                         "user.options" ],
 
                       autoRun );
 
                       autoRun );
 +
      rLoader[ SIGNATURE ] = "ready";
 +
      mw.loader.state( rLoader );
 +
      mw.hook( OPTIONS.type + ".ready" ).fire( OPTIONS );
 
   }
 
   }
 
}( window.mediaWiki, window.jQuery ) );
 
}( window.mediaWiki, window.jQuery ) );
Line 3,160: Line 3,382:
 
// Emacs
 
// Emacs
 
// Local Variables:
 
// Local Variables:
// encoding: utf-8-dos
 
 
// coding: utf-8-dos
 
// coding: utf-8-dos
 
// fill-column: 80
 
// fill-column: 80
 
// End:
 
// End:

Latest revision as of 16:50, 5 June 2019

/**
* Project:  Vorlagen-Meister
* Version:  0.590+ *** Date: 2018-08-25 or later (see VERSION)
* Copyright (C) 2007-2013 [[de:Benutzer:Revvar]]
* Released under the GPL license version 2
* http://www.gnu.org/copyleft/gpl.html
* Download from
*    https://de.wikipedia.org/wiki/MediaWiki:Gadget-Vorlagenmeister.js
*    https://de.wikipedia.org/wiki/MediaWiki:Gadget-Vorlagenmeister/core.js
*    https://de.wikipedia.org/wiki/MediaWiki:Gadget-Vorlagenmeister.css
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE.
* See the GNU General Public License for more details.
*/

/* global window:false,
          ActiveXObject:false, DOMParser:false, XSLTProcessor:false    */
/* jshint forin:false,
          bitwise:true, curly:true, eqeqeq:true, latedef:true,
          laxbreak:true,
          nocomma:true, strict:true, undef:true, unused:true           */



( function ( mw, $ ) {
   "use strict";
   var VERSION   = "0.594 * BETA * 2018-10-24",
       document  = window.document,
       LOCALS    = { me: "Vorlagenmeister" },
       MW_LIB    = "vorlagenmeister",
       SIGNATURE = "ext.gadget." + LOCALS.me + "/core",
       rLoader   = { },
       BUTTONICON, I18N, IS_IE, OPTIONS, PAR_START;
   if ( ! mw.loader.getState( SIGNATURE ) ) {
      rLoader[ SIGNATURE ] = "loading";
      mw.loader.state( rLoader );
   }



   //## File: tm_locals_de.js ####################################
   /*
   * Lokalisierung "Deutsch" des Vorlagen-Meister
   * Copyright (C) 2007-2013 [[de:Benutzer:Revvar]] <revvar@gmx.de>
   * Released under the GPL license version 2
   * http://www.gnu.org/copyleft/gpl.html
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty
   * of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE.
   * See the GNU General Public License for more details.
   */



   I18N = { langs:  { }  };
   I18N.langs.de = {
      ButtonText: "VM",
      Okay:       "Okay",
      Submit:     "Übernehmen",
      Cancel:     "Abbrechen",
      createXML:  "XML-Beschreibung generieren ...",
      progress:   "wird geladen",
      seekTD:     "Suche TemplateData ...",
      seekXML:    "Suche XML ...",
      showTdoc:   "Doku",
      sys_load_error: "Konnte Vorlageninfo zu \"$1\" nicht laden.",
      sys_no_usage_section: "Keine XML-Beschreibung in der Vorlage \"$1\" gefunden.",
      sys_no_such_template: "Keine Vorlage mit dem Namen \"$1\" gefunden.",
      sys_no_help: "(Leider keine Hilfe vorhanden.)",
      sys_invalid_condition: "XML-Beschreibung enthält ein ungültiges <Condition>-Element: \"$1\".",
      sys_conflict_null_AutoValue: "XML-Beschreibung enthält Konflikt zwischen null=false und <AutoValue>",
      sys_invalid_value: "Ungültiger Wert",
      sys_value_pipe_active: "Ungültiger Wert: aktive | Pipe",
      sys_enter_value: "Bitte gib einen Wert ein!",
      sys_enter_valid_value: "Bitte gib einen gültigen Wert ein!",
      sys_please_correct_errors: "Es sind Fehler aufgetreten. Bitte korrigiere die rot markierten Felder.",
      sys_question_repeat_http_request: "Willst du die Anfrage wiederholen=[Okay] oder [Abbrechen] ?",
      sys_unknown_parameter: "Der Vorlagentext enthält folgende unbekannte Parameter: \"$1\". Gründe: Schreibfehler, z.B. Groß- bzw. Kleinschreibung wurde nicht beachtet, oder die Beschreibung der Vorlage ist unvollständig.",
      w2t_plugin_selection: "Bitte wähle eine Vorlage, welche mit dem ausgewählten Text ausgefüllt werden soll:"
   };
   I18N.langs["de-formal"] = {
      ButtonText: "VM",
      Okay:       "Okay",
      Submit:     "Übernehmen",
      Cancel:     "Abbrechen",
      createXML:  "XML-Beschreibung generieren ...",
      progress:   "wird geladen",
      seekTD:     "Suche TemplateData ...",
      seekXML:    "Suche XML ...",
      showTdoc:   "Doku",
      sys_load_error: "Konnte Vorlageninfo zu \"$1\" nicht laden.",
      sys_no_usage_section: "Keine XML-Beschreibung in der Vorlage \"$1\" gefunden.",
      sys_no_such_template: "Keine Vorlage mit dem Namen \"$1\" gefunden.",
      sys_no_help: "(Leider keine Hilfe vorhanden.)",
      sys_invalid_condition: "XML-Beschreibung enthält ein ungültiges <Condition>-Element: \"$1\".",
      sys_conflict_null_AutoValue: "XML-Beschreibung enthält Konflikt zwischen null=false und <AutoValue>",
      sys_invalid_value: "Ungültiger Wert",
      sys_value_pipe_active: "Ungültiger Wert: aktive | Pipe",
      sys_enter_value: "Bitte geben Sie einen Wert ein!",
      sys_enter_valid_value: "Bitte geben Sie einen gültigen Wert ein!",
      sys_please_correct_errors: "Es sind Fehler aufgetreten. Bitte korrigieren Sie die rot markierten Felder.",
      sys_question_repeat_http_request: "Wollen Sie die Anfrage wiederholen=[Ok] oder [Abbrechen] ?",
      sys_unknown_parameter: "Der Vorlagentext enthält folgende unbekannte Parameter: \"$1\". Gründe: Schreibfehler, z.B. Groß- bzw. Kleinschreibung wurde nicht beachtet, oder die Beschreibung der Vorlage ist unvollständig.",
      w2t_plugin_selection: "Bitte wählen Sie eine Vorlage, welche mit dem ausgewählten Text ausgefüllt werden soll:"
   };
   I18N.langs.en = {
      ButtonText: "TM",
      Okay:       "Okay",
      Submit:     "Apply",
      Cancel:     "Abort",
      createXML:  "Create XML description ...",
      progress:   "loading",
      seekTD:     "Looking for TemplateData ...",
      seekXML:    "Looking for XML ...",
      showTdoc:   "doc",
      sys_load_error: "Unable to load \"$1\" template info.",
      sys_no_usage_section: "No XML description found in \"$1\" template.",
      sys_no_such_template: "For \"$1\" no template was found.",
      sys_no_help: "(Imagine, there is no help.)",
      sys_invalid_condition: "Invalid <Condition> element in XML description: \"$1\".",
      sys_conflict_null_AutoValue: "Conflict in XML description; both null=false and <AutoValue>",
      sys_invalid_value: "Invalid value",
      sys_value_pipe_active: "Invalid value: active | pipe",
      sys_enter_value: "Please enter a value.",
      sys_enter_valid_value: "Please enter an appopriate value.",
      sys_please_correct_errors: "Errors occurred. Please correct fields marked in red colour.",
      sys_question_repeat_http_request: "Do you want to repeat=[Okay] the request or [Abort] ?",
      sys_unknown_parameter: "The template source contains the following unknown parameters: \"$1\". Reasons: typo, e.g. upcasing/downcasing, or incomplete XML template description.",
      w2t_plugin_selection: "Please choose a template to be filled with the selected text:"
   };
   I18N.langs.hu = {
      ButtonText: "SM",
      Okay:       "OK",
      Submit:     "Elküld",
      Cancel:     "Mégse",
      createXML:  "XML-leírás generálása…",
      progress:   "Betöltés folyamatban",
      seekTD:     "TemplateData-leírás keresése…",
      seekXML:    "XML-leírás keresése…",
      showTdoc:   "doc",
      sys_load_error:  "A(z) \"$1\" sablont nem lehet betölteni.",
      sys_no_usage_section:  "A(z) \"$1\" sablonhoz nem található XML-leírás.",
      sys_no_such_template:  "Nem található \"$1\" nevu sablon.",
      sys_no_help:  "(Nincs rendelkezésre álló segítség.)",
      sys_invalid_condition:  "Az XML-leírás egy érvénytelen feltétel-paramétert tartalmaz: \"$1\".",
      sys_conflict_null_AutoValue: "Conflict in XML description; both null=false and <AutoValue>",
      sys_invalid_value:  "Nem megfelelo érték",
      sys_enter_value:  "Adj meg egy értéket!",
      sys_value_pipe_active: "Invalid value: active | pipe",
      sys_enter_valid_value:  "Adj meg egy megfelelo értéket!",
      sys_please_correct_errors:  "Hiba történt. Javítsd ki a pirossal jelzett mezoket.",
      sys_question_repeat_http_request:  "Szeretnéd a kérést megismételni=[OK] vagy [félbeszakítani] ?",
      sys_unknown_parameter:  "A sablonszöveg a következo ismeretlen paramétert tartalmazza: \"$1\". Okok: elütés, pl. kis- és nagybetuk nem lettek figyelembe véve, vagy a sablon leírása hiányos.",
      w2t_plugin_selection:  "Válassz egy sablont, amellyel a kijelölt szöveget szeretnéd kitölteni:"
   };



   I18N.projects = {
     dewiki: {
        summary_generated: "Automatisch erzeugt"
                           + " mit dem [[WP:HW/VM|Vorlagen-Meister]]"
     },
     huwiki: {
        summary_generated: "Automatikusan létrehozva"
                           + " a [[Wikipédia:Sablonmester|Sablonmester]]"
                           + " segítségével"
     }
   };



   I18N.translate  =  {   // fallback languages
      // 2012-12-19 PerfektesChaos@de.wikipedia
      "als" :  "de",
      "bar" :  "de",
      "dsb" :  "de",
      "frr" :  "de",
      "gsw" :  "de",
      "hsb" :  "de",
      "ksh" :  "de",
      "lb" :   "de",
      "nds" :  "de",
      "pdc" :  "de",
      "pdt" :  "de",
      "pfl" :  "de",
      "sli" :  "de",
      "stq" :  "de",
      "vmf" :  "de"
   };   // I18N.translate



   function log_message( about ) {
      var s = LOCALS.me + " " + VERSION + ":\r\n" + about;
      window.alert( s );
      if ( typeof window.console  ===  "object"
           &&     window.console ) {
         if ( typeof window.console.error  ===  "function" ) {
            window.console.error( s );
         } else if ( typeof window.console.log  ===  "function" ) {
            window.console.log( s );
         }
      }
   }   // log_message()



   I18N.facilitate  =  function ( available, accept, achieve ) {
      // Localize in language or sub-language
      // Precondition:
      //    available  -- translation object
      //    accept     -- string, language code
      //    achieve    -- string, requested type
      //                          ("string", "object", "function")
      // Postcondition:
      //    Returns translation thing, or not
      // Uses:
      //    >  I18N.translate
      // 2015-01-01 PerfektesChaos@de.wikipedia
      var slang = accept.toLowerCase(),
          i, r;
      if ( typeof available[ slang ]  ===  achieve ) {
         r = available[ slang ];
      } else {
         i = slang.indexOf( "-", 2 );
         if ( i > 0 ) {
            slang = slang.substr( 0, i );
            if ( typeof available[ slang ]  ===  achieve ) {
               r = available[ slang ];
            }
         }
      }
      if ( ! r ) {
         if ( typeof I18N.translate[ slang ]  ===  achieve ) {
            slang = I18N.translate[ slang ];
            if ( typeof available[ slang ]  ===  achieve ) {
               r = available[ slang ];
            }
         }
      }
      return r;
   };   // I18N.facilitate()



   I18N.facility  =  function ( available, achieve ) {
      // Localize in user language, GUI only
      // Precondition:
      //    available  -- translation object
      //    achieve    -- string, requested type
      //                          ("string", "object", "function")
      // Postcondition:
      //    Returns translation thing, at least English, or type achieve
      // Uses:
      //    mw.config.get()
      //    I18N.facilitate()
      // 2015-01-01 PerfektesChaos@de.wikipedia
      var env = mw.config.get( [ "wgUserLanguage",
                                 "wgContentLanguage" ] ),
          r   = I18N.facilitate( available,
                                 env.wgUserLanguage,
                                 achieve );
      if ( ! r ) {
         if ( env.wgContentLanguage !== env.wgUserLanguage ) {
            r = I18N.facilitate( available,
                                 env.wgContentLanguage,
                                 achieve );
         }
         if ( ! r ) {
            r = available.en;
         }
      }
      if ( typeof r  !==  achieve ) {
         switch ( achieve ) {
            case "function" :
               r = false;
               break;
            case "object" :
               r = { };
               break;
            case "string" :
               r = "";
               break;
         }   // switch achieve
      }
      return r;
   };   // I18N.facility()



   I18N.fire  =  function () {
      // Localization
      // Postcondition:
      //    Returns object, adopted to current environment
      // Uses:
      //    this
      //    >  I18N.langs
      //    >  LOCALS.me
      //    >  I18N.projects
      //    mw.config.get()
      //    I18N.facility()
      // 2014-12-30 PerfektesChaos@de.wikipedia
      var env = mw.config.get( [ "wgDBname",
                                 "wgFormattedNamespaces" ] ),
          r   = this.facility( this.langs, "object" );
      r.me       = LOCALS.me;
      r.template = env.wgFormattedNamespaces[ 10 ];
      if ( typeof this.projects[ env.wgDBname ]  ===  "object" ) {
         r.project = this.projects[ env.wgDBname ];
         if ( typeof r.project.summary_generated  ===  "string" ) {
            r.summary_generated = r.project.summary_generated;
         }
      }
      if ( typeof r.summary_generated  !==  "string" ) {
         r.summary_generated = "Automatically generated"
                               + " by Vorlagen-Meister (TemplateMaster)";
      }
      return r;
   };   // I18N.fire()



   function preventDefault(event) {
      // if ( ! IS_IE  ||  IS_IE_9plus ) {
         event.preventDefault();
      // }
   }   // preventDefault()



   function parseXML(text) {
      var dom = null,
          aError, aHtmlText, aLocation, error, parser, sError;
      if ( IS_IE ) {
         try {
            dom = new ActiveXObject( "Microsoft.XMLDOM" );
            dom.async = "false";
            dom.loadXML( text );
         } catch(e) {
            log_message( "parseXML(IE:ActiveXObject) " + e.message );
         }
      }
      if ( ! dom ) {
         try {
            parser = new DOMParser();
            dom = parser.parseFromString( text, "text/xml" );
            error = dom.getElementsByTagName( "parsererror" );
            if ( error[0] ) {
               sError = error[0].firstChild.nodeValue;
               log_message("parseXML() " + sError);
               aError = sError.split("\n");
               if (aError[2]) {
                  aLocation=aError[2].match(/[0-9]+/g);
                  if (aLocation[0]) {
                     aHtmlText = text.split("\n");
                     log_message("error line:"
                                 + aHtmlText[ aLocation[0]-1 ]);
                  }
               } else {
                  log_message("no error position");
               }
            }
         } catch(e) {
            log_message( "parseXML(DOMParser) " + e.message );
         }
      }
      return dom;
   }   // parseXML()



//## File: tm_formular.xsl.js #################################

function get_xsl_dom() {
// 2014-12-27 PerfektesChaos@de.wikipedia
return parseXML(
'<?xml version="1.0" encoding="utf-8" ?>\n'+
'<!--\n'+
'* Copyright (C) 2007-2013 [[de:Benutzer:Revvar]] <revvar@gmx.de>\n'+
'* Released under the GPL license\n'+
'* http://www.gnu.org/copyleft/gpl.html\n'+
'-->\n'+
'<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >\n'+
'   <xsl:output method="html" />\n'+
'   <xsl:param name="locals_submit" />\n'+
'   <xsl:param name="locals_cancel" />\n'+
'   <xsl:param name="locals_createxml" />\n'+
'   <xsl:param name="locals_template" />\n'+
'   <xsl:param name="locals_nohelp" />\n'+
'   <xsl:param name="locals_version" />\n'+
'   <xsl:template match="/TemplateUsage">\n'+
'\n'+
'      <!-- create basic gui -->\n'+
'      <div id="tm_main_frame" class="tm_main_frame" style="overflow:hidden" tm_output="{@output}" tm_max_value_indentation="{@max_value_indentation}">\n'+
'      <div id="tm_header" class="tm_header">\n'+
'            <span class="tm_template"><xsl:choose><xsl:when test="$locals_template"><xsl:value-of select="$locals_template" /></xsl:when><xsl:otherwise>locals_template</xsl:otherwise></xsl:choose>:&#160; </span>\n'+
'            <input type="text" id="tm_template" class="tm_template" size="32" disabled="true" />\n'+
'            <span id="tm_template-doc" class="tm_template-doc"></span>\n'+
'            <span class="tm_version"><xsl:choose><xsl:when test="$locals_version"><xsl:value-of select="$locals_version" /></xsl:when><xsl:otherwise>locals_version</xsl:otherwise></xsl:choose></span>\n'+
'      </div>\n'+
'      <div id="tm_group_selector" class="tm_group_selector">\n'+
'         <xsl:apply-templates mode="group_selector" />\n'+
'      </div>\n'+
'      <div id="tm_form" class="tm_form" style="overflow:auto">\n'+
'      <!-- create form -->\n'+
'      <form style="overflow:auto">\n'+
'      <xsl:for-each select="Group">\n'+
'         <div id="tm_group_{position()}" tm_name="tm_formelem" class="tm_group" tabindex="{4000+position()}">\n'+
'            <xsl:choose>\n'+
'               <xsl:when test="@showempty=\'false\'">\n'+
'                  <xsl:attribute name="tm_showempty">false</xsl:attribute>\n'+
'               </xsl:when>\n'+
'               <xsl:otherwise>\n'+
'                  <xsl:attribute name="tm_showempty">true</xsl:attribute>\n'+
'               </xsl:otherwise>\n'+
'            </xsl:choose>\n'+
'            <xsl:if test="@name">\n'+
'               <h3 class="tm_group_heading"><xsl:value-of select="@name" /></h3>\n'+
'            </xsl:if>\n'+
'            <xsl:for-each select="Parameter">\n'+
'               <div class="tm_formelem"><table class="tm_table">\n'+
'                  <xsl:if test="@length=\'max\'">\n'+
'                     <xsl:attribute name="class">tm_table tm_table_max</xsl:attribute>\n'+
'                  </xsl:if>\n'+
'                  <xsl:choose><xsl:when test="count(Value)=1">\n'+
'                     <input type="checkbox" tm_name="tm_formelem" value="{Value}">\n'+
'                        <xsl:call-template name="SetBasicAttributes" />\n'+
'                     </input>\n'+
'                     <span>'+
'                        <xsl:choose>\n'+
'                           <xsl:when test="@label">\n'+
'                              <xsl:value-of select="@label" />\n'+
'                           </xsl:when>\n'+
'                           <xsl:otherwise>\n'+
'                              <xsl:value-of select="@name" />\n'+
'                           </xsl:otherwise>\n'+
'                        </xsl:choose>\n'+
'                     </span>\n'+
'                  </xsl:when><xsl:otherwise>\n'+
'                     <tr class="tm_tr">\n'+
'                        <xsl:choose>\n'+
'                           <xsl:when test="@deprecated=\'true\'">\n'+
'                              <xsl:attribute name="class">'+
'                                 tm_deprecated'+
'                              </xsl:attribute>\n'+
'                           </xsl:when>\n'+
'                        </xsl:choose>\n'+
'                     <td class="tm_td_label"><span>\n'+
'                        <xsl:choose>\n'+
'                           <xsl:when test="@null=\'false\'">\n'+
'                              <xsl:attribute name="class">tm_param</xsl:attribute>\n'+
'                           </xsl:when>\n'+
'                           <xsl:otherwise>\n'+
'                              <xsl:attribute name="class">tm_opt_param</xsl:attribute>\n'+
'                           </xsl:otherwise>\n'+
'                        </xsl:choose>\n'+
'                        <xsl:choose>\n'+
'                           <xsl:when test="@label">\n'+
'                              <xsl:value-of select="@label" />:\n'+
'                           </xsl:when>\n'+
'                           <xsl:otherwise>\n'+
'                              <xsl:value-of select="@name" />:\n'+
'                           </xsl:otherwise>\n'+
'                        </xsl:choose>\n'+
'                     </span></td><td class="tm_td_content">\n'+
'                     <xsl:choose><xsl:when test="Value">\n'+
'                        <select tm_name="tm_formelem">\n'+
'                           <xsl:call-template name="SetBasicAttributes" />\n'+
'                           <xsl:if test="not (@null=\'false\')">\n'+
'                              <option />\n'+
'                           </xsl:if>\n'+
'                           <xsl:for-each select="Value">\n'+
'                              <option value="{text()}">\n'+
'                                 <xsl:attribute name="id">' + PAR_START + '<xsl:value-of select="@name"/>_<xsl:value-of select="position()"/></xsl:attribute>\n'+
'                                 <xsl:choose><xsl:when test="@label">\n'+
'                                 <xsl:value-of select="@label" />\n'+
'                                 </xsl:when>\n'+
'                                 <xsl:otherwise>\n'+
'                                    <xsl:value-of select="text()" />\n'+
'                                 </xsl:otherwise></xsl:choose>\n'+
'                                 <xsl:if test="position()=0">\n'+
'                                    <xsl:attribute name="selected" />\n'+
'                                 </xsl:if>\n'+
'                              </option>\n'+
'                           </xsl:for-each>\n'+
'                        </select>\n'+
'                     </xsl:when><xsl:when test="@height">\n'+
'                        <textarea tm_name="tm_formelem" rows="{@height}">\n'+
'                           <xsl:call-template name="SetBasicAttributes" />\n'+
'                           <xsl:choose><xsl:when test="@length=\'max\'">\n'+
'                              <xsl:attribute name="class">tm_textarea tm_textarea_max</xsl:attribute>\n'+
'                           </xsl:when><xsl:otherwise>\n'+
'                              <xsl:attribute name="class">tm_textarea tm_textarea_auto</xsl:attribute>\n'+
'                              <xsl:attribute name="cols">\n'+
'                                 <xsl:choose><xsl:when test="@length">\n'+
'                                    <xsl:value-of select="@length" />\n'+
'                                 </xsl:when>\n'+
'                                 <xsl:otherwise>20</xsl:otherwise></xsl:choose>\n'+
'                              </xsl:attribute>\n'+
'                           </xsl:otherwise></xsl:choose>\n'+
'                           <xsl:value-of select="Default" />\n'+
'                        </textarea>\n'+
'                     </xsl:when><xsl:otherwise>\n'+
//   '   <xsl:when test="@type=\'boolean\'">
//   '      <input type="checkbox" tm_name="tm_formelem" value="1">\n'+
//   '         <xsl:call-template name="SetBasicAttributes" />\n'+
//   '      </input>\n'+
//   '   </xsl:when>\n'+
//   '   <xsl:otherwise>\n'+
//
//   '   </xsl:otherwise>\n'+
'                        <input type="text" tm_name="tm_formelem" value="{Default}" class="tm_input">\n'+
'                           <xsl:call-template name="SetBasicAttributes" />\n'+
'                           <xsl:choose><xsl:when test="@length=\'max\'">\n'+
'                              <xsl:attribute name="class">tm_input tm_input_max</xsl:attribute>\n'+
'                           </xsl:when><xsl:otherwise>\n'+
'                              <xsl:attribute name="size">\n'+
'                                 <xsl:choose><xsl:when test="@length">\n'+
'                                    <xsl:value-of select="@length" />\n'+
'                                 </xsl:when>\n'+
'                                 <xsl:otherwise>20</xsl:otherwise></xsl:choose>\n'+
'                              </xsl:attribute>\n'+
'                           </xsl:otherwise></xsl:choose>\n'+
'                        </input>\n'+
'                     </xsl:otherwise></xsl:choose>\n'+
'                     </td></tr>\n'+
'                  </xsl:otherwise></xsl:choose></table>\n'+
'               </div>\n'+
'            </xsl:for-each>\n'+
'         </div>\n'+
'      </xsl:for-each>\n'+
'      </form>\n'+
'      <!-- end formular creation -->\n'+
'      </div> <!-- formular -->\n'+
'      <div id="tm_state" class="tm_state">:-)</div>\n'+
'      <div id="tm_footer" class="tm_footer">\n'+
'             <button id="tm_submit" class="tm_button" tabindex="5000" disabled="true"><xsl:choose><xsl:when test="$locals_submit"><xsl:value-of select="$locals_submit" /></xsl:when><xsl:otherwise>locals_submit</xsl:otherwise></xsl:choose></button>\n'+
'             <button id="tm_cancel" class="tm_button" tabindex="5001" disabled="true"><xsl:choose><xsl:when test="$locals_cancel"><xsl:value-of select="$locals_cancel" /></xsl:when><xsl:otherwise>locals_cancel</xsl:otherwise></xsl:choose></button>\n'+
'             <button id="tm_createxml" class="tm_button" tabindex="5002" disabled="true" style="visibility:hidden"><xsl:choose><xsl:when test="$locals_createxml"><xsl:value-of select="$locals_createxml" /></xsl:when><xsl:otherwise>locals_createxml</xsl:otherwise></xsl:choose></button>\n'+
'      </div>\n'+
'      </div> <!-- main frame -->\n'+
'\n'+
'   </xsl:template>\n'+
'   \n'+
'   <xsl:template match="Group" mode="group_selector">\n'+
'      <xsl:if test="@name">\n'+
'         <a id="tm_group_select_{position() div 2}" class="tm_button tm_selector tm_group_selector"><xsl:value-of select="@name"/></a>\n'+
'      </xsl:if>\n'+
'   </xsl:template>\n'+
'   \n'+
'   <xsl:template name="SetBasicAttributes">\n'+
'      <xsl:attribute name="id">' + PAR_START + '<xsl:value-of select="@name"/></xsl:attribute>\n'+
'      <xsl:attribute name="title"><xsl:choose>\n'+
'         <xsl:when test="Help">\n'+
'            <xsl:value-of select="Help"/>\n'+
'         </xsl:when>\n'+
'         <xsl:otherwise><xsl:choose><xsl:when test="$locals_nohelp"><xsl:value-of select="$locals_nohelp" /></xsl:when>'+
'            <xsl:otherwise>locals_nohelp</xsl:otherwise></xsl:choose></xsl:otherwise>\n'+
'      </xsl:choose>   </xsl:attribute>\n'+
'      <xsl:attribute name="tm_condition"><xsl:value-of select="Condition"/></xsl:attribute>\n'+
'      <xsl:attribute name="tm_autovalue"><xsl:value-of select="AutoValue"/></xsl:attribute>\n'+
'      <xsl:attribute name="tabindex"><xsl:value-of select="20+count(preceding::*)"/></xsl:attribute>\n'+
'      <xsl:attribute name="tm_type">\n'+
'         <xsl:choose>\n'+
'            <xsl:when test="@type">\n'+
'               <xsl:value-of select="@type" />\n'+
'            </xsl:when>\n'+
'         </xsl:choose>\n'+
'      </xsl:attribute>\n'+
'      <xsl:choose>\n'+
'         <xsl:when test="@null=\'false\'">\n'+
'            <xsl:attribute name="tm_null">false</xsl:attribute>\n'+
'         </xsl:when>\n'+
'         <xsl:otherwise>\n'+
'            <xsl:attribute name="tm_null">true</xsl:attribute>\n'+
'         </xsl:otherwise>\n'+
'      </xsl:choose>\n'+
'      <xsl:choose>\n'+
'         <xsl:when test="@predefined=\'true\'">\n'+
'            <xsl:attribute name="tm_predefined">true</xsl:attribute>\n'+
'         </xsl:when>\n'+
'         <xsl:otherwise>\n'+
'            <xsl:attribute name="tm_predefined">false</xsl:attribute>\n'+
'         </xsl:otherwise>\n'+
'      </xsl:choose>\n'+
'      <xsl:attribute name="tm_error">false</xsl:attribute>\n'+
'   </xsl:template>\n'+
'</xsl:stylesheet>'
);
}   // get_xsl_dom()



   //## File: vorlagenmeister.js #################################

   /*
   * Copyright (C) 2007-2013 [[de:Benutzer:Revvar]] <revvar@gmx.de>
   * Released under the GPL license version 2
   * http://www.gnu.org/copyleft/gpl.html
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty
   * of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE.
   * See the GNU General Public License for more details.
   */



/* Plugin objects */
var TM_PluginList = [ ]; //< list with the plugins

/**
 Abstract PlugIn objects, to announce a plugin to the TemplateMaster
*/
function TM_Plugin() {
   this.opGetName = null; //< returns plugin name for the user as String
   this.opGetType = null; //< returns plugin type as String
   this.opGetTemplate = null;  //< returns the template name the PlugIn is written for as String
}

/**
 Abstract object for a Wiki2Template plugin.
*/
function TM_P_Wiki2Template() {
   var type = "Wiki2Template";
   TM_Plugin.call(this);
   this.opGetType = function() { return type; };
   this.opTransform = function(wiki_text) {
      if ( ! ( wiki_text
               &&  typeof(wiki_text) === "string"
               &&  wiki_text.length > 0 ) ) {
         throw("(TMP_Wiki2Template:contructor) Error: Invalid arguments.");
      }
      return wiki_text;
   };
}   // TM_P_Wiki2Template()
TM_P_Wiki2Template.prototype = new TM_Plugin();

/*END: Plugin objects */



   function tm_init() {
      // Start actions on current page
      // Precondition:
      //    Any required module has been loaded
      //    document.ready
      //    editing mode
      var escapeSyntax = "#~\f~#",
          max_tics     = 50,
          milli_sec    = 200,
          more_tics    = max_tics,
          sel_fields   = "input[title],select[title],textarea[title]",
          xmlHTTP      = { },
          Act_input,
          Divs,
          Template,
          Tm_box,
          act_view,
          generated_xml,
          is_gecko,
          is_opera,
          is_xml_generated,
          max_value_indentation,
          resize_mutex,
          $sel_fields,
          $Statebar;



      function addEventListener( aNode, event, callback ) {
         if ( IS_IE
              &&   ( typeof( aNode.attachEvent ) === "object"  ||
                     typeof( aNode.attachEvent ) === "function" ) ) {
            // ... IE10
            aNode.attachEvent( "on"+event, callback );
         } else {
            aNode.addEventListener( event, callback, false );
         }
      }   // tm_init().addEventListener()



      function removeEventListener( aNode, event, callback ) {
         if ( IS_IE
              &&   ( typeof( aNode.detachEvent ) === "object"  ||
                     typeof( aNode.detachEvent ) === "function" ) ) {
            // ... IE10
            aNode.detachEvent("on"+event, callback);
         } else {
            aNode.removeEventListener(event, callback, false);
         }
      }   // tm_init().removeEventListener()



      function replace_all( text, regexp, replacement ) {
         var count_tmp = 1000;
         while ( text.search(regexp) >= 0  &&  count_tmp ) {
            text = text.replace(regexp, replacement);
            count_tmp--;
         }
         if (! count_tmp) {
            log_message("replace_all: Internal error - infinite loop");
            text = null;
         }
         return text;
      }   // tm_init().replace_all()



      function trim( text ) {
         text = "" + text;
         text = replace_all(text, /^\s+/g, "");
         text = replace_all(text, /^(.*?)\s+$/, "$1");
         text = replace_all(text, "\n\n", "\n");
         if (text.search(/[^\s]/) < 0) {
            text = "";
         }
         return text;
      }   // tm_init().trim()



      function setStyleAttribute( aNode, attribute ) {
         var aid;
         if ( aNode && attribute ) {
            for ( aid in attribute ) {
               aNode.style[ aid ] = attribute[ aid ];
            }
         }
      }   // tm_init().setStyleAttribute()




      function Sanitize() {
         // HTML sanitizer; good luck (singleton)
         var reFirst  = new RegExp( "<\\W*(\\w+)\\W", "g" ),
             saveHTML = " a b bdi bdo br caption cite code col colgroup"
                        + " dd del dfn div dl dt em"
                        + " h1 h2 h3 h4 h5 h6 hr i ins kbd li ol"
                        + " p pre q ruby rp rt"
                        + " s samp small span strong sub sup "
                        + " table tbody td th thead tfoot tr tt"
                        + " u ul var ";
         function first( all, approve ) {
            // Sanitize HTML tags
            var r,
                s = " " + approve.toLowercase() + " ";
            if ( saveHTML.indexOf( s )  <  0 ) {
               r = "&lt;" + all.substr( 1 );
            } else {
               r = all;
            }
            return r;
         }   // tm_init().Sanitize().first()
         function further( $a, all ) {
            // Sanitize jQuery object
            //    $a   -- jQuery element, with children
            //    all  -- string, with entire HTML code
            //    return sanitized string
            var r   = all,
                dom, i, j, s, shit, $e;
            for ( i = 0;  i < $a.length;  i++ ) {
               dom = $a.get( i );
// console.log( dom.nodeType, dom.nodeName )
               if ( dom.nodeType === window.document.ELEMENT_NODE ) {
                  $e = $a.eq( i );
                  s  = $e.attr( "style" );
                  if ( s   &&   s.indexOf( "//" )  >  0 ) {
                     shit = "HTML sanitized (possible URL)";
                     break;   // for i
                  }
                  dom = dom.attributes;
                  for ( j = 0;  j < dom.length;  j++ ) {
                     s = dom.item( j ).nodeName.toLowerCase();
// console.log( j, s )
                     if ( s.substr( 0, 2 ) === "on" ) {
                        shit = "HTML sanitized attribute " + s + "=";
                        break;   // for j
                     }
                  }   // for j
                  if ( shit ) {
                     break;   // for i
                  } else {
                     $e = $e.children();
                     if ( $e.length ) {
                        r = further( $e, r );
                     }
                  }
               }
            }   // for i
            if ( shit ) {
               r = "****** " + shit + " ******";
            }
            return r;
         }   // tm_init().Sanitize().further()
         Sanitize.fire = function ( all ) {
            // Start sanitizing
            //    all  -- string, with entire HTML code
            //    return sanitized string
            var r  = all.replace( reFirst, first ),
                $t = $( "<div>" ).html( r );
            return further( $t, r );
         };   // tm_init().Sanitize.fire()
      }   // tm_init().Sanitize()


      function cNode( nRoot, nType, nText, nAttr ) {
      /**
        Creates a new GUI node.

       @param nRoot null or reference to the prefered root node object
       @param nType HTML type string ("div" for example)
       @param nText null or string with the text for the text child node
       @param nAttr null or object with attribute attributes, ({style:"...",width:"100%"} for example)
       @return the new node object
       @author [[de:Benutzer:Revvar]]
      */
         var elem = document.createElement(nType),
             re1  = /^\s*([^:]+):.*$/,
             re2  = /^\s*[^:]+:\s*([^\s;]+)[\s;]*$/,
             aid,
             i,
             style_attr,
             style_id,
             style_obj,
             style_value;
         if (nAttr) {
            for (aid in nAttr) {
               if (aid === "style") {
                  style_attr = nAttr[aid].split(";");
                  style_obj = { };
                  for (i = 0; i < style_attr.length; i++) {
                     style_id = style_attr[i].replace(re1, "$1");
                     style_value = style_attr[i].replace(re2,"$1");
                     if (style_id.length > 0) {
                        style_obj[style_id] = style_value;
                     }
         //             log_message(style_id + ":" + style_value);
                  }
                  setStyleAttribute(elem, style_obj);
               } else {
                  if (aid === "class") {
                     elem.className = nAttr[aid];
                  } else {
                     elem.setAttribute(aid, nAttr[aid]);
                  }
               }
            }   // for aid in nAttr
         }
         if (nText) {
            elem.appendChild(document.createTextNode(nText));
         }
         if (nRoot) {
            nRoot.appendChild(elem);
         }
         return elem;
      }   // tm_init().cNode()



      function deprecated() {
         var $d = $( ".tm_deprecated" ),
             i, $e, $i;
         for ( i = 0;  i < $d.length;  i++ ) {
            $e = $d.eq( i );
            $i = $e.find( "input[type=\"text\"]" );
            if ( $i.length === 1   &&
                 trim( $i.eq( 0 ).val() )  ===  "" ) {
               $e.hide();
            }
         }   // for i
      }   // tm_init().deprecated()



      function getNamespaceNumber( pagename, defaultspace ) {
         // return identified number, or defaultspace
         var s = pagename.replace( /^\s+/, "" ),
             i = s.indexOf( ":" ),
             n, r;
         if ( i < 0 ) {
            r = defaultspace;
         } else if ( i ) {
            if ( typeof(LOCALS.wgNamespaceIds) !== "object" ) {
               LOCALS.wgNamespaceIds = mw.config.get( "wgNamespaceIds" );
            }
            s = s.substr( 0,  i - 1 )
                 .replace( /\s*$/, "" )
                 .replace( /\s+/, "_" )
                 .toLowerCase();
            n = LOCALS.wgNamespaceIds[ s ];
            if ( n ) {
               r = n;
            }
         } else {
            r = 0;
         }
         return r;
      }   // tm_init().getNamespaceNumber()



      function getFullTemplatePagename( page ) {
         // return pagename, defaulting to template namespace
         var nsn = getNamespaceNumber( page, 10 ),
             r   = trim( page );
         r   = ( nsn === 10  ?  LOCALS.template + ":" + r
                             :  r );
         return r.replace( /\s+/g, "_");
      }   // tm_init().getFullTemplatePagename()



      function insertUnknown(e) {
         var text;
         if (IS_IE) {
            text = e.srcElement.title;
         } else {
            text = e.target.title;
         }
         preventDefault(e);
         if ( Act_input   &&
              ! Act_input.nodeName.search(/^(input|select|textarea)$/i)
              &&   Act_input.type.search(/^checkbox$/i) < 0 ) {
            Act_input.value = text;
         }
      }   // tm_init().insertUnknown()



      function resizeInputBox( oInputBox, extra_spaces ) {
         var right_pos = oInputBox.offsetWidth,
             tmp_str = "",
             node = oInputBox,
             table_node = null,
             old_width;
         if (resize_mutex === true) {
            return;
         }
         resize_mutex = true;
         if ( ! ( oInputBox.nodeName   &&
                  ! oInputBox.nodeName.search(/^input$/i)   &&
                  oInputBox.type   &&
                  ! oInputBox.type.search(/^text$/i) ) ) {
            log_message("Internal error: call of resizeInputBox with an unsupported node type: " + oInputBox);
            resize_mutex = false;
            return;
         }

         /* first call for this node ? */
         if (!(oInputBox.tm_org_size)) {
            oInputBox.tm_org_size = oInputBox.size; // save orginal size
         }

         if (oInputBox.tm_org_size >= oInputBox.value.length)  {
            resize_mutex = false;
            return;
         }
         oInputBox.size = oInputBox.value.length + extra_spaces;
         right_pos = oInputBox.offsetWidth;
         tmp_str = "";
         node = oInputBox;
         table_node = null;
         do {
            if (node.className.search("tm_table") >= 0) {
               table_node = node;
            } else {
               right_pos += node.offsetLeft;
               tmp_str   += node.offsetLeft + "px +";
            }
            node = node.parentNode;
         } while (node.className.search("tm_group") < 0);
         if ((right_pos + 8) > node.offsetWidth) {
            if (IS_IE) {
               while ((right_pos + 8) > node.offsetWidth) {
                  old_width = oInputBox.offsetWidth;
                  oInputBox.size--;
                  right_pos -= old_width - oInputBox.offsetWidth;
               }
            } else {
               oInputBox.size = oInputBox.tm_org_size;
               if (table_node) {
                  table_node.className = "tm_table tm_table_max";
               } else {
                  log_message("internal error: table not found");
               }
               oInputBox.className = "tm_input tm_input_max";
            }
            removeEventListener(oInputBox, "keyup", resizeHandler);
         }
         resize_mutex = false;
         return;
      } // tm_init().resizeInputBox()



      function resizeHandler(e) {
         var org_end, org_start, org_value;
         Act_input = (IS_IE ? e.srcElement : e.target);
         Act_input.tm_old_size = Act_input.size;
         resizeInputBox(Act_input, 1);
         if (is_gecko && (Act_input.tm_old_size !== Act_input.size)) {
            org_value = Act_input.value;
            org_start = Act_input.selectionStart;
            org_end = Act_input.selectionEnd;
            Act_input.value = "";
            Act_input.value = org_value;
            if (org_end >= org_start) {
               Act_input.selectionEnd = org_end;
            }
            Act_input.selectionStart = org_start;
            if (org_end < org_start) {
               Act_input.selectionEnd = org_end;
            }
         }
      }   // tm_init().resizeHandler()



      function selectGroup(e) {
         var Form_div, Group_div, position, text;
         preventDefault(e);
         try {
            text = "" + (IS_IE ? e.srcElement : e.target).id;
            position = Math.round( parseFloat( text.replace( /^.+_([0-9\.]+)$/,
                                                             "$1") )
                                   * ( IS_IE ? 2 : 1 ) );
            Group_div = document.getElementById("tm_group_"+position);
            Form_div = document.getElementById("tm_form");
            Form_div.scrollTop = Group_div.offsetTop
                                 - Group_div.parentNode.offsetTop;
         } catch(exc) {
            log_message(exc.message+"\n"+"Internal error: Can't select group div with id=\"tm_group_"+position+"\".");
            switch_view_to("EB");
         }
      }   // tm_init().selectGroup()



      function template_doc(  ) {
         var $wrap = $( "#tm_template-doc" ),
             s     = $( "#tm_template").val(),
             $a;
         $wrap.empty();
         if ( s) {
            s  = getFullTemplatePagename( s );
            $a = $( "<a>" );
            $a.attr( { href:   mw.util.getUrl( s ),
                       target: "_blank" } )
              .text( LOCALS.showTdoc );

            $wrap.append( $a );
         }
      }   // tm_init().template_doc()



      function tipsy() {
         var opts = { gravity: "n",
                      html:    true,
                      opcity:  0.66,
                      trigger: "hover" },
             i, $e;
         for ( i = 0;  i < $sel_fields.length;  i++ ) {
            $e = $sel_fields.eq( i );
            $e.attr( "title",
                     Sanitize.fire( $e.attr( "title" ) ) );
         }   // for i
         $sel_fields.tipsy( opts );
      }   // tm_init().tipsy()



      function whenDOMready() {
         $sel_fields = $( "#tm_main_frame" ).find( sel_fields );
         if ( $sel_fields.length ) {
            more_tics = false;
         }
         if ( more_tics ) {
            more_tics--;
            window.setTimeout( whenDOMready, milli_sec );
         } else {
            more_tics = max_tics;
            // BETA-Test  deprecated();
            template_doc();
            tipsy();
         }
      }   // tm_init().whenDOMready()



      /* shows the template master */
      function show() {
         var marker_end   = "##\f#template_master_marker_end##\f#",
             marker_start = "##\f#template_master_marker_start##\f#",
             act_depth, cursor_pos, cursor_depth, cursor_dist, depth,
             Editbox, end, end_index, i,
             new_part, new_pos, new_template_source,
             source, start, start_index,
             tag_list, tag_pos, Target, Template_given, template_source,
             x_htmlcomment, x_nowiki, x_tag;



         function makeTMbox() {
            var bx = document.getElementById( "wpTextbox1" ),
                r = cNode( bx.parentNode,
                           "div",
                           null,
                           {"id":    "tm_dummy_div",
                            "style": "position:absolute;" +
                                     "z-index:99;" +
                                     "left:" + bx.offsetLeft + "px;" +
                                     "top:" + bx.offsetTop + "px;" +
                                     "width:" + bx.offsetWidth + "px;" +
                                     "height:" + bx.offsetHeight +"px;" +
                                     ( IS_IE  ?  "overflow-x:hidden;" +
                                                 "overflow-y:auto;"
                                              : "overflow:auto;" ) } );
               return r;
         }   // tm_init().show().makeTMbox()



         function pluginSelect( Target, Tm_box ) {
            var A_cancel, A_plugin, Editbox, handler, i, name,
                Plugin_div, plugins, Template_given, type;
            if ( TM_PluginList && TM_PluginList.length ) {
               /* create plugin list */
               plugins = [ ];
               for ( i = 0; i < TM_PluginList.length; i++ ) {
                  try {
                     name = TM_PluginList[i].opGetName();
                     type = TM_PluginList[i].opGetType();
                     if ( type === "Wiki2Template"  &&  name ) {
                        plugins.push( TM_PluginList[i] );
                     }
                  } catch(e) {
                     log_message("Incompatible Plugin: " + e.message);
                  }
               }   // for i
               if ( plugins.length > 0 ) {
                  Plugin_div = cNode( null,
                                      "div",
                                      LOCALS.w2t_plugin_selection,
                                      {"class": "tm_plugin_selector"} );
                  handler = function (e) {
                        var plugin = ( IS_IE ? e.srcElement
                                             : e.target ).tm_plugin;
                        if (plugin) {
                           Template_given = plugin.opTransform(Editbox.value.substring(Target.start, Target.end + 1));
                           if (Template_given) {
                              Plugin_div.parentNode.removeChild(Plugin_div);
                              show_template(Tm_box, false, Template_given, Target);
                           }
                        } else {
                           log_message("Internal error: No tm_plugin attribute found.");
                        }
                  };   // handler()
                  for ( i = 0; i < plugins.length; i++ ) {
                     A_plugin = cNode(Plugin_div,
                                      "a",
                                      plugins[i].opGetName(),
                                      {"class":"tm_button tm_v_selector tm_plugin_selector"});
                     A_plugin.tm_plugin = plugins[i];
                     addEventListener( A_plugin, "click", handler );
                  }   // for i
                  A_cancel = cNode( Plugin_div,
                                    "a",
                                    LOCALS.Cancel,
                                    { "class": "tm_button tm_v_selector tm_cancel_button",
                                      "style": "margin-top:8px !important"
                                    } );
                  addEventListener( A_cancel,
                                    "click",
                                    function() {
                              Plugin_div.parentNode.removeChild(Plugin_div);
                              show_template(Tm_box, false, null, Target);
                                    } );
                  Tm_box.appendChild(Plugin_div);
               }
   /*
               log_message(plugins.join(","));
               Template_given =
                  TM_PluginList[0].opTransform(Editbox.value.substring(Target.start,
                                                                       Target.end + 1));
   */
            }
         }   // tm_init().show().pluginSelect()



         function wikEdEnclose( obj ) {
            window.wikEd.GetText( obj, "selection, cursor" );
            if ( obj.selection.plain === "" ) {
               obj.sel = window.wikEd.GetSelection();
               if ( obj.sel.anchorNode.previousSibling ) {
                  obj.changed = obj.cursor;
               } else {
                  window.wikEd.GetText( obj, "whole" );
                  obj.changed = obj.whole;
               }
            } else {
               obj.changed = obj.selection;
            }
            obj.changed.plain = marker_start
                                + obj.changed.plain
                                + marker_end;
         }   // tm_init().show().wikEdEnclose()



         /* set some globals to their defaults */
         if ( document.getElementById( "tm_dummy_div" ) ) {
            switch_view_to();
            return;
         }

         /* check if cursor within template wikitext and parse it */
         Target = { };
         Editbox = document.getElementById( "wpTextbox1" );
         Target.Editbox = Editbox;

         // CodeMirror

         /* get cursor/mark position (browser dependant) */
         if ( typeof( OPTIONS.wikEd ) === "object"
              &&  window.wikEd.useWikEd ) {
            window.wikEd.EditButton( null, null, null, wikEdEnclose );
            window.wikEd.UpdateTextarea();
            window.wikEd.SetEditArea( false, false );
            window.wikEd.useWikEd = false;
            Target.start  = Editbox.value.search( marker_start );
            Editbox.value = Editbox.value.replace( marker_start, "" );
            Target.end    = Editbox.value.search( marker_end ) - 1;
            Editbox.value = Editbox.value.replace( marker_end, "" );
            window.wikEd.UpdateFrame();
            Target.cursor = Target.start;
            OPTIONS.wikEd.live = true;
/*
   2018-10-24   TEST   IE complaints??
         } else if ( IS_IE ) {
            mw.toolbar.insertTags( marker_start, marker_end, "" );
            Target.start  = Editbox.value.search( marker_start );
            Editbox.value = Editbox.value.replace( marker_start, "" );
            Target.end    = Editbox.value.search( marker_end ) - 1;
            Editbox.value = Editbox.value.replace( marker_end, "" );
*/
         } else {
            Target.cursor = Editbox.selectionStart;
            Target.start  = Editbox.selectionStart;
            Target.end    = Editbox.selectionEnd - 1;
         }

         /* search if cursor within a template */

         /* (1) replace syntax chars within nowiki-tags and html-comments */
         x_nowiki = /(<nowiki>.*?)[{|}](.*?<\/nowiki>)/g;
         source = replace_all(Editbox.value, x_nowiki, "$1#$2");
         x_htmlcomment = /(<!--.*?)[{|}](.*?-->)/g;
         source = replace_all(Editbox.value, x_htmlcomment, "$1#$2");

         /* (2) create a list of all remaining template tags */
         tag_list = [ ];
         depth = 0;
         x_tag = /(\{\{|\}\})/;
         tag_pos = -2;
         new_pos = 0;
         do {
            new_pos = (source.substring(tag_pos + 2)).search(x_tag);
            if (new_pos >= 0) {
               tag_pos += new_pos + 2;
               switch (source.substring(tag_pos, tag_pos + 2)) {
                  case "{{":
                     tag_list.push( { type:     0,
                                      depth:    depth,
                                      position: tag_pos } );
                     depth++;
                     break;
                  case "}}":
                     depth--;
                     tag_list.push( { type:     1,
                                      depth:    depth,
                                      position: tag_pos } );
                     break;
                  default:
                     log_message("Internal error: Searching template tags failed ("+source.substring(tag_pos, tag_pos + 2)+").");
                     return;
               }   // switch
            }
         } while (new_pos >= 0);

         /* (3) find nearest tag pair (same depth) around the cursor position */
         start = -1;
         end = -1;
         start_index = -1;
         end_index = -1;
         act_depth = 0;
         cursor_pos = Target.start;
         cursor_depth = 0;
         cursor_dist = 1000000;

         /* (a) find the depth at cursor pos */
         for (i = 0;  i < tag_list.length;  i++) {
            if (tag_list[i].type) {
               if (cursor_pos > tag_list[i].position   &&
                   cursor_pos - tag_list[i].position  <  cursor_dist) {
                  cursor_depth = tag_list[i].depth - 1;
                  cursor_dist = cursor_pos - tag_list[i].position;
               }
            } else {
               if (cursor_pos >= tag_list[i].position    &&
                   cursor_pos - tag_list[i].position  <  cursor_dist) {
                  cursor_depth = tag_list[i].depth;
                  cursor_dist = cursor_pos - tag_list[i].position;
               }
            }
            if (cursor_pos < tag_list[i].position) {
               break;   // sorted array
            }
         }   // for i

         /* (b) search */
         for ( i = 0;  i < tag_list.length;  i++ ) {
            if ( cursor_pos >= tag_list[i].position ) {
               if ( ! tag_list[i].type
                   &&  cursor_depth >= tag_list[i].depth ) {
                  start = tag_list[i].position;
                  start_index = i;
                  act_depth = tag_list[i].depth;
               }
               if ( start > -1   &&
                    tag_list[i].type === 1   &&
                    act_depth === tag_list[i].depth   &&
                    cursor_pos > tag_list[i].position ) {
                  start = -1;
                  start_index = -1;
               }
            } else {
               break;
            }
         }   // for i
         if ( start > -1 ) {
            for ( i = tag_list.length - 1;  i > 0;  i-- ) {
               if ( cursor_pos <= tag_list[i].position ) {
                  if ( cursor_depth >= tag_list[i].depth
                       && tag_list[i].type === 1
                       && act_depth === tag_list[i].depth ) {
                     end = tag_list[i].position;
                     end_index = i;
                  }
               } else {
                  break;
               }
            }   // for i
         }

         /* (4) get template source code without the surrounding brackets */
         if ( start >=0  &&  end >= 0 ) {
            template_source = Editbox.value.substring(start + 2, end);
         } else {
            template_source = null;
         }

         /* defuse nested templates */
         new_template_source = "";
         if ( start_index + 1  <  end_index - 1 ) {
            new_template_source = template_source.substring(0,
                                                            tag_list[start_index + 1].position - start);
            for ( i = start_index + 1;  i < end_index - 1;  i++ ) {
               new_part = template_source.substring(tag_list[i].position - start,
                                                    tag_list[i+1].position - start);
               if (tag_list[i].depth - tag_list[i].type > act_depth) {
                  new_part = replace_all(new_part, /\|/g, escapeSyntax);
               }
               new_template_source += new_part;
            }
            new_template_source += template_source.substring(tag_list[end_index - 1].position
                                                             - start, template_source.length);
            template_source = new_template_source;
         }

         /* parse source */
         if (template_source) {
            Template_given = parse_template_source(template_source);
            if (Template_given) {
               // save new positions only, if template parsed successfull
               Target.start = start;
               Target.end = end + 1;
            } else {
               template_source = null;
            }
         }

         switch_view_to();
         /* dummy main div */
         Tm_box = makeTMbox();

         if ( template_source === null
             &&  Target.start <= Target.end ) {
            // ask, if the user want to use a Wikitext_To_Template-Plugin
            pluginSelect( Target, Tm_box );
         } else {
            /* load given template */
            show_template( Tm_box, false, Template_given, Target );
         }
      }   // tm_init().show()



/* shows specific template */
function show_template(Root_node, template_name, Template_given, Target) {
   var $buttonOkay = false,
       $throbber   = false,
       REclose, REopen, Template_new, $inputTemplateName;



   function iso8601( date, local, max ) {
      var n = ( max ? max : 19 ),
          k, r;
      function f( a ) {
         return ( local ? "get" : "getUTC" )  +  a;
      }
      r = date[ f( "FullYear" ) ]()  +  "";
      if ( n >= 7 ) {
         r = r + "-";
         k = date[ f( "Month" ) ]()  +  1;
         if ( k < 10 ) {
             r = r + "0";
         }
         r = r + k;
         if ( n >= 10 ) {
            r = r + "-";
            k = date[ f( "Date" ) ]();
            if ( k < 10 ) {
               r = r + "0";
            }
            r = r + k;
            if ( n >= 13 ) {
               r = r + " ";
               k = date[ f( "Hours" ) ]();
               if ( k < 10 ) {
                  r = r + "0";
               }
               r = r + k;
               if ( n >= 16 ) {
                  r = r + ":";
                  k = date[ f( "Minutes" ) ]();
                  if ( k < 10 ) {
                     r = r + "0";
                  }
                  r = r + k;
                  if ( n >= 19 ) {
                     r = r + ":";
                     k = date[ f( "Seconds" ) ]();
                     if ( k < 10 ) {
                        r = r + "0";
                     }
                     r = r + k;
                  }
               }
            }
         }
      }
      return r;
   }   // tm_init().show_template().iso8601()



   function traverse(Parent, name) {
      var childs = [ ],
          Child = Parent.firstChild;
      while (Child) {
         if ((Child.getAttribute) && (Child.getAttribute("tm_name"))) {
            if ( ! (""+Child.getAttribute("tm_name")).search(name) ) {
               childs.push(Child);
            }
         }
         if (Child.firstChild) {
            childs = childs.concat(traverse(Child, name));
         }
         Child = Child.nextSibling;
      }
      return childs;
   }   // tm_init().show_template().traverse()



   function attachForm(dom) {
      /* append formular to root node */
      var Mf = dom.getElementById("tm_main_frame"),
          i, Input_node, new_height,
          Tm_footer, Tm_form, Tm_header, Tm_main;
      if (IS_IE) {
         Root_node.removeChild(document.getElementById("tm_dummy_ie_div"));
      }
      Root_node.appendChild(Mf);

      Tm_main   = document.getElementById("tm_main_frame");
      Tm_header = document.getElementById("tm_header");
      Tm_form   = document.getElementById("tm_form");
      Tm_footer = document.getElementById("tm_footer");

      /* resize all input boxes*/
      Input_node = traverse(Tm_form, "tm_formelem");
      for (i = 0; i < Input_node.length; i++) {
         if (Input_node[i].className === "tm_input") {
            resizeInputBox(Input_node[i], 1);
         }
      }

      /* resize formular */
      new_height = Root_node.offsetHeight
                   - Tm_header.offsetHeight - Tm_footer.offsetHeight;
      setStyleAttribute(Tm_form, {"height": new_height + "px"});
      setStyleAttribute(Tm_form, {"height": (new_height + Root_node.offsetHeight - Tm_main.offsetHeight)
                                            + "px"} );
   }   // tm_init().show_template().attachForm()



   function autovalue( assign ) {
      var r = "",
          date, local, n, perform;
      if ( typeof assign  ===  "string"   &&   assign ) {
         r = trim( assign );
         if ( r.charCodeAt( 0 )  ===  124 ) {   // '|'
            perform = r.split( "|" );
            switch ( perform[ 1 ] ) {
               case "localtime" :
                  local = true;
                  // fall through
               case "utc" :
                  date = new Date();
                  if ( perform[ 2 ] ) {
                     n = perform[ 2 ].length;
                  }
                  r = iso8601( date, local, n );
                  break;
               default:
                  r = "";
            }   // switch perform[0]
         }
      }
      return r;
   }   // tm_init().show_template().autovalue()



   function cancelTemplate(e) {
      preventDefault(e);
      switch_view_to("EB");
   }   // tm_init().show_template().cancelTemplate()



   function createXML(e) {
      var env = mw.config.get( [ "wgScript",
                                 "wgServer" ] ),
          full_name = getFullTemplatePagename( template_name ),
          tb, textbox, xml_window;
      preventDefault(e);
      xml_window = window.open(
                   env.wgServer + env.wgScript
                   + "?action=edit&summary="
                   + encodeURIComponent(LOCALS.summary_generated)
                   + "&title=" + encodeURIComponent(full_name)
                   + "/XML" );
      xml_window.focus();
      textbox = xml_window.document.getElementById("wpTextbox1");
      if (textbox) {
         textbox.value = generated_xml;
      } else {
         addEventListener(xml_window,
                          "load",
                          function () {
               tb = xml_window.document.getElementById("wpTextbox1");
               if (tb) {
                  tb.value = generated_xml;
               }
                          } );
      }
   }   // tm_init().show_template().createXML()



   function completeForm(dom) {
      var comment_counter = 0,
          is_changed = false,
          Button_cancel, Button_createXML, Button_submit,
          Group_button, group_count, Group_div, Group_selector,
          i, id, Input_node, name, Name_node, new_name,
          s, sx, Temp_real, Template_used,
          unknown_div, Unknown_link, unknown_parameter;



      function mapParameter(Temp_plugin, Temp_real) {
         var Temp_given = { },
             id, pi_id;
         for (id in Temp_real) {
            if (Temp_plugin[id]) {
               Temp_given[id] = Temp_plugin[id];
               Temp_plugin[id] = null;
            } else {
               for (pi_id in Temp_plugin) {
                  if (Temp_plugin[pi_id] &&
                      id.toLowerCase() === pi_id.toLowerCase()) {
                     Temp_given[id] = Temp_plugin[pi_id];
                     Temp_plugin[pi_id] = null;
                     break;
                  }
               }   // for pi_id in Temp_plugin
            }
         }   // for id in Temp_real

         /* append all unknown params */
         for (pi_id in Temp_plugin) {
            if (Temp_plugin[pi_id]) {
               Temp_given[pi_id] = Temp_plugin[pi_id];
            }
         }   // for pi_id in Temp_plugin
         return Temp_given;
      }   // tm_init().show_template().completeForm().mapParameter()



      function removeForm() {
         $( "#tm_main_frame" ).remove();
      }   // tm_init().show_template().removeForm()



      function showHelp(e) {
         var div = [ "#tm_main_frame",         // [0]
                     "#tm_form",               // [1]
                     "#tm_footer",             // [2]
                     "#tm_header",
                     "#tm_group_selector" ],
             i, n, s, $elem;
         preventDefault(e);
         if ( ! Divs ) {
            Divs = [ ];
            for ( i = 0;  i < div.length;  i++ ) {
               s = div[ i ];
               if ( i ) {
                  $elem = Divs[ 0 ][ 0 ].find( s );
               } else {
                  $elem = $( s );
               }
               Divs.push( [ $elem, $elem.height() ] );
            }   // for i
            $Statebar = Divs[ 0 ][ 0 ].find( "#tm_state" );
            $Statebar.css( { width:    "100%",
                             top:      "auto",
                             bottom:   Divs[ 2 ][ 1 ],
                             left:     "1em",
                             right:    "1em" } );
         }
         Act_input = (IS_IE ? e.srcElement : e.target);
         $elem     = $( Act_input );
         s         = $elem.attr( "title" )  ||
                     $elem.attr( "original-title" );
         $Statebar.empty().html( s )
                          .css( { "background-color": null } );
         n = Divs[ 0 ][ 1 ]  -  $Statebar.height();
         for ( i = 2;  i < Divs.length;  i++ ) {
            n -= Divs[ i ][ 1 ];
         }   // for i
         Divs[ 1 ][ 0 ].height( n );
      }   // tm_init().showHelp()



      function template_name_changed( e ) {
         var learnt = ( ! is_changed );
         if ( learnt ) {
            if ( e.type === "keypress" ) {
               if ( typeof( e.which ) === "number" ) {
                  learnt = ( e.which === 13 );
               } else if ( typeof( e.keyCode ) === "number" ) {
                  learnt = ( e.keyCode === 13 );
               } else {
                  learnt = false;
               }
            } else {
               learnt = false;
            }
            if ( learnt ) {
               new_name =  trim( $inputTemplateName.val() );
               if ( new_name.length ) {
                  new_name = new_name.substr( 0, 1 ).toUpperCase()
                             + new_name.substr( 1 );
                  is_changed = true;
                  removeForm();
                  show_template(Root_node, new_name, null, Target);
               } else {
                  $inputTemplateName.val( "" );
               }
            }
         }
      }   // tm_init().show_template().completeForm().template_name_changed()



      function template_name_submit() {
         template_name_changed( { type:  "keypress",
                                  which: 13 } );
      }   // tm_init().show_template().completeForm().template_name_submit()


      $Statebar = $( "#tm_state" );
      Name_node = dom.getElementById( "tm_template" );
      $inputTemplateName = $( Name_node );
      if ( template_name || Template_given ) {
         if ( Template_given ) {
            template_name = Template_given.template_name;
         }
         template_name = trim( template_name );
         template_name = template_name.replace( /_+/g, " " )
                                      .replace( /  +/g, " " );
         i = { readOnly: true };
         if (template_name.length > 32) {
            i.size = template_name.length;
         }
         $inputTemplateName.val( template_name );
         $inputTemplateName.attr( i );
         whenDOMready();
      } else {
         $inputTemplateName.val( "" );
         $buttonOkay = $( "<button>" );
         $buttonOkay.attr( { type: "button" } );
         $buttonOkay.css( { "margin-left": "1em" } );
         $buttonOkay.click( template_name_submit );
         $buttonOkay.text( LOCALS.Okay );
         $inputTemplateName.after( $buttonOkay );
         $inputTemplateName.keypress( template_name_changed );
         $inputTemplateName.mousemove( template_name_changed );
         $inputTemplateName.dblclick( template_name_submit );
      }

      /* fix an ie width problem for the group divs */
      if (IS_IE) {
         group_count = 1;
         do {
            Group_div = dom.getElementById("tm_group_" + group_count);
            if ( Group_div   &&
                 Group_div.className   &&
                 ("" + Group_div.className).search("tm_ie_group") < 0 ) {
               Group_div.className = "tm_group tm_ie_group";
            }
            group_count++;
         } while (Group_div);
      }

      Input_node  = traverse(dom, "tm_formelem");
      group_count = 1;

      /* save references to nodes and set help attribute */
      for ( i = 0;  i < Input_node.length;  i++ ) {
         if (Input_node[i].className === "tm_group") {
            id = "tm_group_" + group_count;
            Group_div = dom.getElementById(id);
            if ( Group_div ) {
               Template_new[id] = Group_div;
               Template_new[id].value = "";
               Template_new[id].showempty =
                    (Group_div.getAttribute("tm_showempty") !== "false");
            }
            group_count++;
         } else if (Input_node[i].className === "tm_group_heading") {
            id = "tm_comment_" + comment_counter;
            Template_new[id].value = "";
            if (comment_counter) {
               Template_new[id].value += "\n";
            }
            Template_new[id].value += "<!-- "
                              + Input_node[i].firstChild.data + " -->\n";
            comment_counter++;
         } else {
            id = Input_node[i].id;
            if (id === null) {
               log_message("Internal error: XSLT created input node without id.");
               switch_view_to( "EB" );
               return false;
            }
            if (Template_new[id]) {
               log_message("Internal error: Duplicate id \"" + id + "\".");
               switch_view_to( "EB" );
               return false;
            }
            Input_node[i].tm_help = Input_node[i].title;
            Template_new[id] = Input_node[i];
         }
      }

      /* transform all condition attributes from text to a RegExp */
      for (i = 0; i < Input_node.length; i++) {
         sx = Input_node[i].getAttribute("tm_type");
         if ( sx  &&  typeof sx === "string" ) {
            switch ( sx ) {
               case "boolean" :
                  s = "[01]";
                  break;
               case "date" :
                  s = "(1[0-9][0-9][0-9]|20[0-2][0-9])"
                      + "(-(1[0-2]|0[0-9])"
                       + "(-(3[01]|[012][0-9])"
                        + "([ T][012][0-9]"
                         + "(:[0-5][0-9]"
                          + "(:[0-5][0-9]"
                           + "(.[0-9]+"
                           + ")?"
                          + ")?"
                         + ")?"
                        + ")?"
                       + ")?"
                      + ")?";
                  break;
               case "line" :
                  s = "[^\n]+";
                  break;
               case "number" :
                  s = "[+-" + String.fromCharCode(8722) + "]?";
                  s = s + "[0-9.,]*[0-9]+[0-9.,]*"
                      + "([eE]" + s + "[0-9]+)?";
                  break;
               case "wiki-file-name" :
                  s = "[^/#<>{}]+\\.[a-zA-Z][a-zA-Z][a-zA-Z]+";
                  break;
               case "wiki-page-name" :
                  s = "[^#<>{}]+";
                  break;
               case "wiki-user-name" :
                  s = "[^/#<>{}]+";
                  break;
               default:
                  s = false;
            }   // switch
            if ( s ) {
               Input_node[i].tm_type = new RegExp( "^" + s + "$" );
               if ( ! sx.indexOf( "wiki-" ) ) {
                  Input_node[i].tm_legalWikipage = true;
               }
            }
         }
         s = Input_node[i].getAttribute("tm_condition");
         if (s  &&  typeof s === "string") {
            try {
               Input_node[i].tm_condition = new RegExp(s);
            } catch(e) {
               log_message(e.message+"\n"
                           +LOCALS.sys_invalid_condition.replace("$1",
                                                                 s));
               switch_view_to( "EB" );
               return false;
            }
         }
         s = Input_node[i].getAttribute("tm_autovalue");
         if (s  &&  typeof s === "string") {
            if ( Input_node[i].getAttribute("tm_null") === "false" ) {
               s  =  Input_node[i].id;
               if ( s   &&   s.substr(0, 8)  ===  "tm_form_" ) {
                  s  =  LOCALS.sys_conflict_null_AutoValue
                        + " *** " + s.substr(8);
               } else {
                  s  =  LOCALS.sys_conflict_null_AutoValue;
               }
               log_message( s );
               switch_view_to( "EB" );
               return false;
            } else {
               Input_node[i].tm_autovalue = trim(s);
            }
         }
      }

      /* map suggested to existing parameter names */
      if (Template_given
          && Template_given.source
          && Template_given.source === "plug-in") {
         /* create a list with all valid parameter names */
         Temp_real = { };
         for (i = 0; i < Input_node.length; i++) {
            name = "" + Input_node[i].id;
            if (name.length && name.length>0) {
               Temp_real[name] = true;
            }
         }
         Template_given = mapParameter(Template_given, Temp_real);
      }


      /* fill the form with the given template and add resize handler */
      Template_used = { };
      if (Template_given) {
         for (i = 0; i < Input_node.length; i++) {
            name = "" + Input_node[i].id;
            if (typeof Template_given[name] === "string") {
               Template_used[name] = true; /* mark given parameter to find unknown */
            }
            if (name
                && name.length
                && name.length > 0
                && Template_given[name]
                && Template_given[name].length > 0) {
               if ( Input_node[i].nodeName.search(/^select$/i)) {
                  if ( ! Input_node[i].type.search(/^checkbox$/i) ) {
                     Input_node[i].checked = (Input_node[i].value
                                          &&  Input_node[i].value !== "0");
                  } else  {   // <select>
                     Input_node[i].value = Template_given[name];
                     if ( ! Input_node[i].nodeName.search(/^input$/i) ) {
                        /* (1) replace newlines with <br /> */
                        Input_node[i].value = replace_all(Input_node[i].value,
                                                          new RegExp("\n","g"),
                                                          "<br />");
                     }
                  }
               } else {
                  Input_node[i].value = Template_given[name];
                  if (Input_node[i].value !== Template_given[name]) {
                     Input_node[i].title = LOCALS.sys_invalid_value
                                 + ": \"" + Template_given[name] + "\"! "
                                 + Input_node[i].tm_help;
                     Input_node[i].className = "tm_input tm_error";
                     Input_node[i].setAttribute("tm_error", "true");
                  }
               }
            }
         }
      }

      /* add function to show help text at state bar on focus and to trace act input field + add resize handler */
      for ( i = 0;  i < Input_node.length;  i++ ) {
         // addEventListener(Input_node[i], "focus", showHelp);
         if ( ! Input_node[i].nodeName.search(/^input$/i)  &&
              ! Input_node[i].type.search(/^text$/i)  &&
              Input_node[i].className.search(/tm_input_max/i) < 0 ) {
            addEventListener(Input_node[i], "keyup", resizeHandler);
         }
      }

      /* add function for the group selection button */
      Group_selector = dom.getElementById("tm_group_selector");
      if (Group_selector) {
         Group_button = Group_selector.firstChild;
         while (Group_button) {
            if (Group_button.nodeName.search(/^a$/i) === 0) {
               addEventListener(Group_button, "click", selectGroup);
            }
            Group_button = Group_button.nextSibling;
         }
      }

      /* search unknown given named parameter */
      if (Template_given && Template_used) {
         unknown_parameter = [ ];
         for ( id in Template_given ) {
            if ( ! (Template_used[id] && Template_used[id] === true)  &&
                 id !== "source"  &&
                 id !== "template_name"  &&
                 id !== "tm_form_parameter"/* ??? */ ) {
               name = id.substr( PAR_START.length );
               unknown_parameter.push( name );
            }
         }   // for id
         if (unknown_parameter.length > 0) {
            unknown_div = cNode( dom.getElementById("tm_group_selector"),
                                 "div",
                                 null,
                                 { "class": "tm_unknown_selector",
                                   "id"   : "tm_unknown_selector" } );
            for ( i = 0;  i < unknown_parameter.length;  i++ ) {
               Unknown_link = cNode(unknown_div,
                                    "a",
                                    unknown_parameter[i],
                                    { "class": "tm_button tm_selector tm_unknown_selector",
                                      "title": Template_given[ PAR_START + unknown_parameter[i] ]
                                    } );
               addEventListener(Unknown_link, "click", insertUnknown);
            }   // for i
         }
      }

      /* buttons */
      Button_submit = dom.getElementById("tm_submit");
      addEventListener(Button_submit, "click", submitTemplate);
      Button_cancel = dom.getElementById("tm_cancel");
      addEventListener(Button_cancel, "click", cancelTemplate);
      if ( is_xml_generated   &&   ! is_opera ) {
         Button_createXML = dom.getElementById("tm_createxml");
         setStyleAttribute( Button_createXML,
                            { visibility: "visible" } );
         Button_createXML.removeAttribute("disabled");
         if (Button_createXML) {
            addEventListener(Button_createXML, "click", createXML);
         }
      }

      /* last op (possible race condition!): enable Template_name node and buttons */
      $inputTemplateName.attr( "disabled", null );
      Button_cancel.removeAttribute("disabled");
      if (template_name !== false) {
         Button_submit.removeAttribute("disabled");
      }
      return dom;
   }   // tm_init().show_template().completeForm()



   function createForm( Xml_dom, Xsl_dom ) {
      var Result_dom,
          group_div,
          Processor,
          Result_div,
          result_xml,
          xslDoc,
          xslt;
         /* transform XML formular spec with loaded stylesheet */
      if ( typeof(XSLTProcessor) !== "undefined" ) {
         Processor = new XSLTProcessor();
         Processor.importStylesheet( Xsl_dom );
         Processor.setParameter(null, "locals_submit",
                                LOCALS.Submit);
         Processor.setParameter(null, "locals_cancel",
                                LOCALS.Cancel);
         Processor.setParameter(null, "locals_createxml",
                                LOCALS.createXML);
         Processor.setParameter(null, "locals_template",
                                LOCALS.template);
         Processor.setParameter(null, "locals_nohelp",
                                LOCALS.sys_no_help);
         Processor.setParameter(null, "locals_version",
                                VERSION);
         Result_dom = Processor.transformToDocument( Xml_dom );
      } else {
         Result_dom = null;
      }
      if ( ! Result_dom  &&  IS_IE ) {
         result_xml = null;
         if ( IS_IE <= 8 ) {
            if ( typeof( Xml_dom.transformNode ) !== "undefined" ) {
               result_xml = Xml_dom.transformNode( Xsl_dom.documentElement );
            }
         } else {
            try {
               xslt = new ActiveXObject( "Msxml2.XSLTemplate" );
               xslDoc = new ActiveXObject( "Msxml2.FreeThreadedDOMDocument" );
               xslDoc.loadXML( Xsl_dom.xml );
               xslt.stylesheet = xslDoc;
               Processor = xslt.createProcessor();
               Processor.input = Xml_dom;
               Processor.transform();
               result_xml = Processor.output;
            } catch (e) {
               log_message( "createForm(IE:ActiveXObject) " + e.message );
            }
         }
         if ( result_xml ) {
            result_xml = result_xml.replace("locals_submit",
                                            LOCALS.Submit)
                                   .replace("locals_cancel",
                                            LOCALS.Cancel)
                                   .replace("locals_createxml",
                                            LOCALS.createXML)
                                   .replace("locals_template",
                                            LOCALS.template)
                                   .replace(/locals_nohelp/g,
                                            LOCALS.sys_no_help)
                                   .replace("locals_version",
                                            VERSION);
            Result_div = cNode( null,
                                "div",
                                null,
                                { id:    "tm_dummy_ie_div",
                                  style: "visibility:hidden;" } );
            Result_div.innerHTML = result_xml;
            Root_node.appendChild( Result_div );
            Result_dom = document;
            group_div = document.getElementById( "tm_group_selector" );
            if ( ! group_div.firstChild ) {
               group_div.parentNode.removeChild( group_div );
            }
         }
      }
      if ( Result_dom ) {
         /* add program logic */
         Result_dom = completeForm( Result_dom );
      } else {
         log_message( "XSLTProcessor et al. unavailable" );
      }
      return Result_dom;
   }   // tm_init().show_template().createForm()



      function mwXmlHttpRequest( data ) {
         // Start possible actions on current page
         // Precondition:
         //    data.api      true  or  false->index.php
         //    data.pars     details
         //    data.onload   callback
         //    data.onerror  function on failure
         // Postcondition:
         //    ajax request launched
         // 2014-06-20 PerfektesChaos@de.wikipedia
         var defaults;
         if ( typeof xmlHTTP[ data.api ]  !==  "object" ) {
            if ( data.api ) {
               xmlHTTP[ true ] = new mw.Api();
            } else {
               defaults = { ajax:       { url:      mw.util.wikiScript(),
                                          dataType: "text" },
                            parameters: { action: "raw" } };
               xmlHTTP[ false ] = new mw.Api( defaults );
            }
         }
         xmlHTTP[ data.api ].get( data.pars )
                            .done( data.onload )
                            .fail( data.onerror );
      }   // tm_init().mwXmlHttpRequest()



   function makeXMLfromTemplateData( apply ) {
      // 2016-05-31
      var r = "",
          o, p, params, sign, slang, story;
      function f( assembly, access ) {
         var s, t;
         switch ( typeof assembly[ access ] ) {
            case "object" :
               if ( typeof slang  !==  "string" ) {
                  slang = mw.config.get( "wgContentLanguage" );
               }
               t = assembly[ access ];
               if ( t ) {
                  if ( typeof t[ slang ]  ===  "string" ) {
                     s = t[ slang ];
                  }
               }
               break;
            case "string" :
               s = assembly[ access ];
               break;
         }   // switch typeof component
         if ( s ) {
            s = s.replace( /^\s+/,    "" )
                 .replace( /\s+$/,    "" )
                 .replace( /&nbsp;/g, "&#160;" )
                 .replace( /\\/g,     "\\\\" );
         }
         return s;
      }   // tm_init().show_template().makeXMLfromTemplateData().f()
      if ( typeof apply.pages  ===  "object" ) {
         for ( p in apply.pages ) {
            o = apply.pages[ p ];
            break;
         }   // for  in .params
      }
      if ( o ) {
         if ( typeof o.params  ===  "object"   &&
              o.params ) {
            params = o.params;
            for ( sign in params ) {
               if ( sign   &&
                    typeof params[ sign ]  ===  "object" ) {
                  r     = r + '     <Parameter name="' + sign + '"';
                  p     = params[ sign ];
                  story = f( p, "label" );
                  if ( story ) {
                     r = r + ' label="'
                           + story.replace( /</g, "&lt;" )
                                  .replace( />/g, "&gt;" )
                           + '"';
                  }
                  if ( typeof p.required  ===  "boolean"   &&
                       p.required ) {
                     r = r + ' null="false"';
                  }
                  if ( typeof p.type  ===  "string" ) {
                     story = trim( p.type ).toLowerCase();
                     if ( ! story.indexOf( "string/" ) ) {
                        story = story.substr( 7 );
                     }
                     if ( story  &&  story !== "unknown" ) {
                        r = r + ' type="' + story + '"';
                     }
                  }
                  story = typeof p.deprecated;
                  if ( ( story === "boolean"  ||  story === "string" )
                         &&   p.deprecated ) {
                     r = r + ' deprecated="true"';
                  }
                  r = r + '>\n';
                  story = f( p, "description" );
                  if ( story ) {
                     r = r + '       <Help>'
                         + story.replace( /</g, "&lt;" )
                                .replace( /&nbsp;/g, "&#160;" )
                         + '</Help>\n';
                  }
                  if ( typeof p[ "default" ]  ===  "string" ) {
                     story = p[ "default" ].replace( /^\s+/, "" )
                                           .replace( /\s+$/, "" );
                     if ( story ) {
                        r = r + '       <Default>'
                           + story.replace( /</g, "&lt;" )
                           + '</Default>\n';
                     }
                  }
                  if ( typeof p.autovalue  ===  "string" ) {
                     story = p.autovalue.replace( /^\s+/, "" )
                                        .replace( /\s+$/, "" );
                     if ( story ) {
                        r = r + '       <AutoValue>'
                           + story.replace( /</g, "&lt;" )
                           + '</AutoValue>\n';
                     }
                  }
                  r = r + '     </Parameter>\n';
               }
            }   // for sign in .params
         }
      }
      r = '<?xml version="1.0" encoding="utf-8"?>\n'
          + ' <TemplateUsage output="collapse">\n'
          + '   <Group>\n'
          + r
          + '   </Group>\n'
          + ' </TemplateUsage>';
      return r;
   }   // tm_init().show_template().makeXMLfromTemplateData()



   function load_TemplateData( full_name ) {
      var s = full_name.replace( /\/.*$/, "" );
      mwXmlHttpRequest( {
           api:     true,
           pars:    { action: "templatedata",
                      titles: s },
         onload:  function( answer ) {
                     var story;
                     if ( answer ) {
                        $throbber.hide();
                        story = makeXMLfromTemplateData( answer );
                        parseUsage( story, s );
                     } else {
                        $throbber.hide();
                     }
                  },
         onerror: function() {
                     $throbber.hide();
                     log_message( LOCALS.sys_load_error.replace("$1",
                                                                template_name) );
                     switch_view_to( "EB" );
                  }
      } );
   }   // tm_init().show_template().load_TemplateData()



   function throbber( access ) {
      // Show throbber
      // Use: $throbber
      var spooling = "//upload.wikimedia.org/wikipedia/commons"
                     + "/d/de/Ajax-loader.gif",   // throbber URL
          $img, $root, $span;
      if ( $throbber ) {
         $throbber.find( "span" ).text( LOCALS[ access ] );
      } else {
         $throbber = $( "<div>" );
         $throbber.css( { "position": "absolute",
                          "left":     "50px",
                          "top":      "32px" } );
         $img = $( "<img />" );
         $img.attr( { src:    spooling,
                      id:     "ajax_throbber",
                      height: "32",
                      alt:    "Ajax" } );
         $throbber.append( $img );
         $span = $( "<span>" );
         $span.css( { "margin-left": "3em" } );
         $span.text( LOCALS[ access ] );
         $throbber.append( $span );
         $root = $( Root_node );
         $root.find( "#tm_main_frame" ).remove();
         $root.append( $throbber );
      }
      $throbber.show();
   } // tm_init().show_template().throbber()



   function load_templateXML( template_name ) {
      var full_name = getFullTemplatePagename( template_name );



      mwXmlHttpRequest( {
         api:     false,
         pars:    { title:  full_name + "/XML" },
         onload:  function( answer ) {
                     var s;
                     switch ( typeof answer ) {
                        case "string":
                           s = answer;
                           break;
                        case "object":
                           s = answer.responseText;
                           break;
                        default:
                           s = false;   // try TemplateData
                     }   // switch
                     if ( s ) {
                        $throbber.hide();
                        parseUsage( s, full_name );
                     } else {
                        throbber( "seekTD" );
                        load_TemplateData( full_name );
                     }
                  },
         onerror: function() {
                     throbber( "seekTD" );
                     load_TemplateData( full_name );
                  }
      } );
   }   // tm_init().show_template().load_templateXML()



   function parseUsage( source, full_name ) {
      // source: XML document
      var usage_text, Xml_dom, Xsl_dom;

      function onload() {
         var dom = createForm(Xml_dom, Xsl_dom);
         if (dom) {
            attachForm(dom);

            /* cache template */
            Template[template_name] = { };
            Template[template_name].Xml_dom = Xml_dom;
            Template[template_name].Xsl_dom = Xsl_dom;
         } else {
            switch_view_to( "EB" );
         }
      }   // tm_init().show_template().parseUsage().onload()



      try {
         Xml_dom = null;
         Xsl_dom = null;
         is_xml_generated = false;

         if ( source.length ) {
            usage_text = source;
         } else {
            mwXmlHttpRequest( {
                api:     true,
                pars:    { prop:    "revisions",
                           rvprop:  "content",
                           rvlimit: "1",
                           titles:  encodeURIComponent(full_name) },
                onload: function(rD) {
                           var endPos, i, names, rT, startPos, tmp,
                               varname, vars, xVarname;
                  try {
                     rT = rD.responseText;
                     startPos = rT.search('\\[\\{"\\*":"') + 7;
                     endPos   = rT.search('"\\}\\]\\}\\}\\},"');

                     if (endPos < 0) {
                        log_message(LOCALS.sys_no_such_template.replace("$1",
                                                                        template_name));
                        switch_view_to("EB");
                        return;
                     }

                     rT = rT.substring(startPos, endPos);
                     xVarname = /\{\{\{[\s]*([^\s\|\}]([^\|\}]*[^\s\|\}]){0,1})[\s\|\}]/g;
                     names = rT.match(xVarname);
                     vars = { };
                     if (names) {
                        for (i = 0; i < names.length; i++) {
                           tmp = names[i].replace(xVarname, "$1");
                           tmp = tmp.replace(/<[^>]+>/g, '');
                           tmp = decodeURI(tmp);
                           tmp = tmp.replace("\\u00f6", "ö")
                                    .replace("\\u00fc", "ü")
                                    .replace("\\u00e4", "ä")
                                    .replace("\\u00df", "ß")
                                    .replace("\\u00d6", "Ö")
                                    .replace("\\u00dc", "Ü")
                                    .replace("\\u00c4", "Ä");
                           vars[tmp] = true;
                        }
                     }
                     usage_text =  "<?xml version='1.0' encoding='utf-8'?>\n"
                                   + "<?mediawiki '{{XML-Warnung|"
                                              + template_name + "}}'?>\n"
                                   + " <TemplateUsage output='expand'>\n"
                                   + "   <Group>\n";
                     for (varname in vars) {
                        usage_text +=   "     <Parameter name='"
                                                       + varname + "'>\n"
                                      + "       <Help></Help>\n"
                                      + "     </Parameter>\n";
                     }
                     usage_text +=   "   </Group>\n"
                                   + " </TemplateUsage>\n";

                     Xml_dom = parseXML(usage_text);
                     Xsl_dom = get_xsl_dom();

                     is_xml_generated = true;
                     generated_xml    = usage_text;

                     onload();
                  } catch (e) {
                     log_message("parseUsage(onload) " + e.message);
                     switch_view_to("EB");
                  }
                        },   // onload:
               onerror: function() {
                  log_message(LOCALS.sys_load_error.replace("$1",
                                                            template_name) );
                  switch_view_to("EB");
                        }   // onerror:
            });
            return;
         }

         /* create document from XML text */
         Xml_dom = parseXML(usage_text);
         Xsl_dom = get_xsl_dom();

         /* load style sheet for the transformation */
//          var Xsl_dom = document.implementation.createDocument("", "", null);
//          Xsl_dom.addEventListener("load", onload, false);
//          Xsl_dom.load("http://tools.wikimedia.de/~revvar/tm_formular.xsl");

         /* next step "function onload" */
         onload();
      } catch(e) {
         log_message("parseUsage() " + e.message);
         switch_view_to("EB");
      }
   }   // tm_init().show_template().parseUsage()



   function pipeActive( assign ) {
      var i      = assign.indexOf( "|" ),
          scream = "sys_value_pipe_active",
          r;
      if ( i >= 0 ) {
         if ( ! REopen ) {
            REopen = new RegExp( "(\\[|\\{\\{)" );
         }
         if ( REopen.test( assign.substr( 0, i ) ) ) {
            if ( ! REclose ) {
               REclose = new RegExp( "(\\]|\\}\\})" );
            }
            i = assign.lastIndexOf( "|" );
            if ( ! REclose.test( assign.substr( i ) ) ) {
               r = scream;
            }
         } else {
            r = scream;
         }
      }
      return r;
   }   // tm_init().show_template().pipeActive()



   function restoreTemplate( name ) {
      var r = false,
          dom;
      if (Template[name]) {
         dom = createForm( Template[name].Xml_dom,
                           Template[name].Xsl_dom );
         if (dom) {
            attachForm(dom);
            r = true;
         }
      }
      return r;
   }   // tm_init().show_template().restoreTemplate()



   function submitTemplate(e) {
      var First_error_node = null,
          i = PAR_START.length,
          n = 0,
          reNumber = /^[1-9][0-9]*$/,
          success = true,
          unnamedEqual = false,
          group_count, group_template, group_showempty,
          id, lines, max_parameter_length,
          new_template, Node,
          output, parameter_space, prevEmptyNumbers,
          Range, space, scream, scroll_top, tmp_param;
      preventDefault(e);

      /* read all results and correct them if necessary */
      for ( id in Template_new ) {   // all template paremeter names
         Node = Template_new[id];
         if ( id.search( /^(source|template_name|tm_comment_)/ ) ) {
            Node.tm_parName = id.substr( i );
            if ( reNumber.test( Node.tm_parName ) ) {
               Node.tm_numbered = parseInt( Node.tm_parName );
               if ( Node.tm_numbered <= n ) {
                  log_message( "Internal / XML spec error: "
                               + "Positional order in object/XML. ("
                               + Node.tm_parName + ")" );
                  switch_view_to( "EB" );
                  return;
                  // Template_new should be Array rather than object.
               }
               n = Node.tm_numbered;
            }

            switch ( (""+Node.nodeName).toLowerCase() ) {
               case "textarea":
                  Node.tm_value = trim(Node.value);
                  lines = Node.tm_value.split("\n");
                  if ( lines.length - 1 > 1
                      && (lines[lines.length - 1].search(/[\S]/) < 0)) {
                     lines.pop();
                  }
                  Node.tm_value = lines.join("\n");
                  if ( lines.length > 1 ) {
                     Node.tm_value = "\n" + Node.tm_value;
                  }
                  break;
               case "input":
                  if ( (""+Node.type).toLowerCase() === "checkbox" ) {
                     if ( Node.checked === true ) {
                        Node.tm_value = trim(Node.value);
                     } else {
                        Node.tm_value = "";
                     }
                  } else {
                     Node.tm_value = trim(Node.value);
                  }
                  break;
               case "select":
                  Node.tm_value = trim(Node.value);
                  break;
               case "div":
                  break;
               default:
                  log_message( "Internal Error: Unknown Node type \""
                               + Node.nodeName + " (" + id + ")\"." );
                  switch_view_to( "EB" );
                  return;
            }   // switch
            if ( Node.tm_numbered  &&
                 ! unnamedEqual  &&
                 Node.tm_value.indexOf( "=" ) >= 0 ) {
               unnamedEqual = true;
            }

            /* verify values */
            if ( typeof Node.tm_value  ===  "string" ) {
               scream = false;
               if ( Node.getAttribute("tm_null") === "false"   &&
                    ! Node.tm_value ) {
                  scream = "sys_enter_value";
               } else {
                  scream = pipeActive( Node.tm_value );
               }
               if ( ! scream  &&
                    Node.tm_condition    &&
                    ( Node.getAttribute("tm_null") !== "true"   ||
                      Node.tm_value )    &&
                    Node.tm_value.search( Node.tm_condition ) ) {
                  scream = "sys_enter_valid_value";
               }
               if ( ! scream  &&  Node.tm_type  &&  Node.tm_value ) {
                  if ( Node.tm_value.search( Node.tm_type ) ) {
                     scream = "sys_enter_valid_value";
                  } else if ( Node.tm_legalWikipage  &&
                              ( Node.tm_value.indexOf( "[" )  >= 0   ||
                                Node.tm_value.indexOf( "]" )  >= 0 ) ) {
                     scream = "sys_enter_valid_value";
                  }
               }
               if ( ! scream   &&
                    Node.tm_autovalue   &&
                    ! Node.tm_value ) {
                  Node.tm_value = autovalue( Node.tm_autovalue );
               }
               if ( scream ) {
                  success = false;
                  if ( ! First_error_node ) {
                     First_error_node = Node;
                  }
                  Node.title = LOCALS[ scream ] + " *** " + Node.tm_help;
                  Node.className = "tm_input tm_error";
                  Node.setAttribute("tm_error", "true");
               } else {
                  Node.setAttribute("tm_error", "false");
                  Node.className = "tm_input";
                  Node.title = Node.tm_help;
               }
            }
         } else if ( id !== "source"  &&  id !== "template_name" ) {
            Node.tm_leader = true;
            Node.tm_value = "\0";
         }
      }   // for id in Template_new
      if ( ! success ) {
         if ( $Statebar ) {
            $Statebar.empty().html( LOCALS.sys_please_correct_errors )
                             .css( { "background-color": "#FFFF00" } );
         }
         First_error_node.focus();
         return;
      }

      if ( n && unnamedEqual ) {
         for ( id in Template_new ) {
            Node = Template_new[id];
            if ( Node.tm_numbered ) {
               Node.tm_numbered = false;
            }
         }   // for id in Template_new
      }

      /* create new template source */
      output = document.getElementById( "tm_main_frame" );
      if ( output ) {
         if ( output.getAttribute("tm_max_value_indentation") ) {
            max_value_indentation = 0
                       + output.getAttribute("tm_max_value_indentation");
         }
         output = ( output.getAttribute( "tm_output" ) === "expand" );
      } else {
         output = false;
      }

      new_template = "{{" + Template_new.template_name
                          + ( output ? "\n" : "" );
      group_count = 0;
      group_template = "";
      group_showempty = false;

      // get max parameter length
      max_parameter_length = 0;
      for ( id in Template_new ) {
         Node = Template_new[id];
         if ( Node.tm_parName  &&  Node.tm_value  &&
              ( output || Node.tm_value.length ) ) {
            if ( max_parameter_length < Node.tm_parName.length ) {
               max_parameter_length = Node.tm_parName.length;
            }
         }
      }   // for id in Template_new

      parameter_space = "";
      prevEmptyNumbers = "";
      if ( OPTIONS.lotsOfSpaces ) {
         space = " ";
      } else {
         n = ( max_parameter_length > max_value_indentation
               ? max_value_indentation
               : max_parameter_length );
         for ( i = 0;  i < n;  i++ ) {
            parameter_space += " ";
         }   // for i
         space = "";
      }
      for ( id in Template_new ) {
         Node = Template_new[id];
         if ( Node.tm_leader || Node.tm_parName ) {
            tmp_param = Node.tm_parName;
            if ( output ) {   // expand
               if ( ! id.search("tm_group_") ) {
                  if ( group_count || group_showempty ) {
                     new_template += group_template;
                  }
                  group_count = 0;
                  group_template = "";
                  group_showempty = Node.showempty;
               } else if ( id.search("tm_comment_") ) {
                  if (tmp_param.length < parameter_space.length) {
                     tmp_param = (tmp_param + parameter_space).substr(0,
                                                                      parameter_space.length);
                  }
                  group_template += space + "|";
                  if ( ! Node.tm_numbered ) {
                     group_template += tmp_param + "= ";
                  }
                  i = Node.tm_value.length;
                  if ( i   ||
                       Node.getAttribute("tm_predefined") === "false") {
                     group_template += Node.tm_value;
                     if ( i ) {
                        group_count++;
                     }
                  }
                  group_template += "\n";
               }
            } else if ( Node.tm_value  &&   Node.tm_value.length
                        &&  ! Node.tm_leader ) {
               tmp_param = tmp_param + space;
               new_template += prevEmptyNumbers;
               prevEmptyNumbers = "";
               if ( Node.tm_numbered ) {
                  new_template += space + "|"
                                  + Node.tm_value;
               } else {
                  new_template += space + "| " + tmp_param + "=" + space
                                  + Node.tm_value;
               }
            } else if ( Node.tm_numbered ) {
               prevEmptyNumbers += "|";
            }
         }
      }   // for id in Template_new
      if ( output  &&
           ( group_count || group_showempty ) ) {
         new_template += group_template;
      }
      new_template += space + "}}";

      switch_view_to("EB");

      /* insert source into Editbox at cursor */
      scroll_top = Target.Editbox.scrollTop;
      Target.Editbox.value = Target.Editbox.value.substring(0, Target.start)
                             + new_template
                             + Target.Editbox.value.substring(Target.end + 1);
      if ( IS_IE ) {
         Range = Target.Editbox.createTextRange();
         Range.collapse(true);
         Range.moveEnd("character", Target.start);
         Range.moveStart("character", Target.start);
         Range.select();
      } else {
         Target.Editbox.selectionStart = Target.cursor;
         Target.Editbox.selectionEnd = Target.cursor;
         Target.Editbox.scrollTop = scroll_top;
      }
      if ( typeof( OPTIONS.wikEd ) === "object"
           && window.wikEd.useWikEd ) {
         window.wikEd.UpdateFrame();
      }
      // CodeMirror
   } // tm_init().show_template().submitTemplate()



   function show_execute( Template_given, template_name ) {
      // check parameter
      if (Template_given  &&
          Template_given.template_name !== template_name) {
         template_name = Template_given.template_name;
      }

      if ( ! Template_given  &&  template_name === false ) {
         // create empty form
         Template_new = { };
         parseUsage( "<?xml version='1.0' encoding='utf-8'?>"
                     + "<TemplateUsage>"
                     +    "<Group></Group>"
                     + "</TemplateUsage>",
                     "" );
      } else {
         Template_new = { template_name: template_name };
         if ( restoreTemplate(template_name) !== true ) {
            throbber( "seekXML" );
            load_templateXML( template_name );
         }
         whenDOMready();
      }
   } // tm_init().show_template().show_execute()



   show_execute( Template_given, template_name );
}   // tm_init().show_template()



      function switch_view_to( view ) {
         var Editbox = document.getElementById( "wpTextbox1" );
         if ( ( view === "VM"  ||  ! view )
              &&   act_view === "EB" ) {
            if ( typeof( OPTIONS.wikEd ) === "object"
                 &&  OPTIONS.wikEd.live ) {
               window.wikEd.saveButton.disabled = true;
               window.wikEd.previewButton.disabled = true;
               window.wikEd.diffPreviewButton.disabled = true;
            } else if ( Editbox ) {
               setStyleAttribute( Editbox,
                                  { "visibility": "hidden" } );
               Editbox.readOnly = true;
               document.getElementById("wpSave").disabled = true;
               document.getElementById("wpPreview").disabled = true;
               document.getElementById("wpDiff").disabled = true;
            }
            Tm_box = document.getElementById( "tm_dummy_div" );
            if ( Tm_box ) {
               setStyleAttribute( Tm_box,
                                  { "visibility": "visible",
                                    "z-index":    "99" } );
            }
            act_view = "VM";
         } else if ( ( view === "EB"  ||  ! view )
                     &&   act_view === "VM" ) {
            if ( Tm_box ) {
               setStyleAttribute( Tm_box,
                                  { "visibility": "hidden",
                                    "z-index":    "0" } );
               if ( view === "EB" ) {
                  // removes user interface
                  Tm_box.parentNode.removeChild( Tm_box );
                  Tm_box = null;
               }
            }
            if ( typeof( OPTIONS.wikEd ) === "object"
                 &&  OPTIONS.wikEd.live ) {
               OPTIONS.wikEd.live = false;
               window.wikEd.useWikEd = true;
               window.wikEd.saveButton.removeAttribute("disabled");
               window.wikEd.previewButton.removeAttribute("disabled");
               window.wikEd.diffPreviewButton.removeAttribute("disabled");
               window.wikEd.SetEditArea( true, false );
               window.wikEd.frameWindow.focus();
            } else if ( Editbox ) {
               if ( view === "EB" ) {
                  Editbox.removeAttribute("readonly");
                  document.getElementById("wpSave").removeAttribute("disabled");
                  document.getElementById("wpPreview").removeAttribute("disabled");
                  document.getElementById("wpDiff").removeAttribute("disabled");
               }
               setStyleAttribute( Editbox,
                                  { "visibility": "visible" } );
               Editbox.focus();
            }
            act_view = "EB";
         } else if ( view !== act_view ) {
            log_message("Internal error: act_view='" + act_view
                        + "' conflicts with view parameter '"
                        + view + "'");
         }
      }   // tm_init().switch_view_to()



      function parse_template_source( source ) {
         var k = 0,
             re_back = new RegExp( escapeSyntax, "g" ),
             rep12 = "$1" + escapeSyntax + "$2",
             Template_given = { },
             x_comment = /<!--.*?-->/g,
             x_nowiki_1 = /(<\s*nowiki\s*>.*?)\|(.*?<\s*\/nowiki\s*>)/gi,
             x_nowiki_2 = /(<\s*nowiki\s*>.*?)=(.*?<\s*\/nowiki\s*>)/gi,
             x_wikilinks = /(\[\[[^\]]+)\|([^\]]*)/g,
             equals, i, par, parameter, par_name, par_value, re;

         source = replace_all(source, x_comment, "");

         /* replace split chars within nowiki segments and nested templates */
         source = replace_all(source, x_nowiki_1, rep12);

         /* replace split chars within wikilinks */
         source = replace_all(source, x_wikilinks, rep12);

         parameter = source.split("|");
         for ( i = 0;  i < parameter.length;  i++ ) {
            par = replace_all(parameter[i], re_back, "|");
            if (i) {
               par = replace_all( par, x_nowiki_2, rep12 );
               equals = par.search("=");
               if (equals < 0) {
                  k++;
                  par_name  = PAR_START + k;
                  par_value = trim(par);
               } else {
                  par_name  = PAR_START + trim(par.substring(0, equals));
                  par_value = trim(par.substring(equals + 1));
               }
               if (Template_given[ par_name ]) {
                  log_message( "Syntax error: Parameter name \""
                               + par_name.substr( PAR_START.length )
                               + "\" already in use.");
                  return null;
               }
               /* correct format errors */
               par_value = replace_all( par_value, re_back, "=" );
               Template_given[par_name] = par_value;
            } else {
               re = new RegExp( "^(Template|" + LOCALS.template + "): *(.*)$",
                                "i" );
               Template_given.template_name = trim(par);
               if ( ! Template_given.template_name.search( re ) ) {
                  Template_given.template_name = Template_given.template_name.replace(re, "$2");
               }
            }
         }   // for i
         Template_given.source = "source code";
         return Template_given;
      }   // tm_init().parse_template_source()



      /* == helper functions ==========================================*/



      function buttonWikiEditor() {
         try {
         $( "#wpTextbox1" ).wikiEditor( "addToToolbar",
                        { "section": "main",
                          "group":   "format",
                          "tools":   { "vorlagenmeister":
                                         { type:   "button",
                                           label:  LOCALS.me,
                                           icon:   BUTTONICON,
                                           action: { type:    "callback",
                                                     execute: show
                                                   }
                                         }
                                     }
                        } );
         } catch(e) {
            log_message("tm_init().buttonWikiEditor()\r\n" + e.message);
         }
      } // tm_init().buttonWikiEditor()



      function buttonToolbar() {
         var $toolbar = $( "#toolbar" ),
             BUTTONBASE = "//upload.wikimedia.org/wikipedia/commons/"
                          + "e/ec/Button_base.png",
             $btn, r, show;
         if ( $toolbar.length ) {
         try {
            r    = "tm_switch_button";
            $btn = $( "<div>" );
            $btn.attr( { "id":    r,
                         "class": r + " mw-toolbar-editbutton",
                         "title": LOCALS.me } );
            $btn.css( { "background-image": "url(" + BUTTONBASE + ")",
                        "display":          "inline",
                        "height":           "22px",
                        "width":            "23px" } );
            if ( typeof OPTIONS.toolbarLabel  ===  "string"
                 &&     OPTIONS.toolbarLabel ) {
               show = OPTIONS.toolbarLabel;
            } else {
               show = LOCALS.ButtonText;
            }
            $btn.text( show );
            $toolbar.prepend( $btn );
         } catch(e) {
            log_message("tm_init().buttonToolbar()\r\n" + e.message);
         }
         }
         return r;
      } // tm_init().buttonToolbar()



      function equipGUI() {
         var lucky  = false,
             opts   = mw.user.options.get( [ "showtoolbar",
                                             "usebetatoolbar" ] ),
             shower = false;
         if ( typeof( window.wikEd ) === "object" ) {
            OPTIONS.wikEd = { live: false };
            if ( typeof( window.wikEd.config ) === "object"   &&
                 typeof( window.wikEd.config.button ) === "object"   &&
                 typeof( window.wikEd.config.button[ 745 ] ) === "object" ) {
               OPTIONS.wikEd.click = show;
            }
         }
         if ( opts.usebetatoolbar ) {
            mw.loader.using( [ "ext.wikiEditor" ],
                             buttonWikiEditor );
            lucky = true;
         } else if ( opts.showtoolbar ) {
            shower = buttonToolbar();
            lucky  = shower;
         }
         if ( ! lucky ) {
            shower = "t-vorlagenmeister";
            try {
               mw.util.addPortletLink( "p-tb", "#", LOCALS.me, shower );
            } catch(e) {
               log_message("mw.util.addPortletLink()\r\n" + e.message);
            }
         }
         if ( shower ) {
            $( "#" + shower ).click( show );
         }
      } // tm_init().equipGUI()



      function init() {
         var sXML = mw.util.getParamValue( "tm_xml_content" ),
             userAgent;

         OPTIONS.loading = false;

         if ( sXML ) {
            $( "#wpTextbox1" ).val( sXML );
         } else {
            try {
               try {
                  LOCALS = I18N.fire();
               } catch(e) {
                  log_message("init() I18N.fire()\r\n" + e.message);
               }
               try {
                  Sanitize();
               } catch(e) {
                  log_message("init() Sanitize()\r\n" + e.message);
               }
               try {
                  equipGUI();
               } catch(e) {
                  log_message("init() equipGUI()\r\n" + e.message);
               }
               // globals
               PAR_START = "tm_form_";
               $Statebar = null;
               Template = { };
               Tm_box = null;
               act_view = "EB";
               Act_input = null;
               is_xml_generated = false;
               generated_xml = "";
               max_value_indentation = 32;
               resize_mutex = false;
               if ( ! IS_IE ) {
                  userAgent = $.client.profile();
                  is_gecko = ( userAgent.layout === "gecko" );
                  is_opera = ( userAgent.name === "opera" );
               }
            } catch(e) {
               log_message("init()\r\n" + e.message);
            }
         }
      } // tm_init().init()



      init();
   } // tm_init()



//## File: tm_w2t_infobox_schienenfahrzeug.js #################

/**
* Wiki2Template-Plugin des Vorlagen-Meister fuer die Vorlage "Infobox Schienenfahrzeug", Version: 0.1beta, Date: 2007-02-04
* Copyright (C) 2007 [[de:Benutzer:Revvar]] <revvar@gmx.de>
* Released under the GPL license version 2
* http://www.gnu.org/copyleft/gpl.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE.
* See the GNU General Public License for more details.
*/

function TM_P_Infobox_Schienenfahrzeug() {
   TM_P_Wiki2Template.call(this);

   var name = "Infobox Schienenfahrzeug";
   this.opGetName = function() {
      return name;
   };
   var template = "Infobox Schienenfahrzeug";
   this.opGetTemplate = function() {
      return template;
   };
   var super_opTransform = this.opTransform;
   this.opTransform = function(wiki_text) {
      wiki_text = super_opTransform(wiki_text);
      var Template = { };
      Template.template_name = template;
      Template.source = "plug-in";
      var line = wiki_text.split("\n");
      for (var i = 0; i < line.length; i++) {
         if (line[i].search(/\s*(\|-|\|\}|\{\|)/) !== 0
             &&  line[i].search(/\|\|/) > 0) {
            var entry = line[i].split("||");
            if (entry.length !== 2) {
               log_message("TM_P_Infobox_Schienenfahrzeug: Momentan wird nur ein ||-Trenner pro Zeile unterstützt.");
               return null;
            }
            var x_wikilink = /\[\[[^|]+\|([^\]]+)\]\]/;
            if (entry[0].search(x_wikilink) >= 0) {
               entry[0] = entry[0].replace(x_wikilink, "$1");
            }
            entry[0] = entry[0].replace(/^\s*\|\s*/g, "").replace(/^\s*(\S.*\S)\s*$/g,"$1").replace(/[^a-zA-ZäöüÄÖÜß0-9_]/g,"");
            entry[1] = entry[1].replace(/^\s*(\S.*\S)\s*$/g,"$1");
            if ( entry[1].charCodeAt( 0 )  ===  124 ) {   // '|'
               entry[1] = entry[1].substring(1);
            }
            if ( ! entry[0].search(/^Indienststellung$/i) ) {
               entry[0] = "Baujahre";
            }
            if ((entry[1].search(/^\s*k\s*\.\s*A\s*(\.){0,1}\s*$/) < 0) && (entry[1].search(/^\s*-+\s*/) < 0)) {
               Template[ PAR_START + entry[0] ] = entry[1];
            }
         } else if (line[i].search(/^\s*!.*((color:|background)[^\|]*){2,2}\|.*/) === 0) {
            var base_color_name = {"aqua":"00ffff", "black":"000000", "blue":"0000ff", "fuchsia":"ff00ff", "gray":"808080", "green":"008000", "lime":"00ff00", "maroon":"800000", "navy":"000080", "olive":"808000", "purple":"800080", "red":"ff0000", "silver":"c0c0c0", "teal":"008080", "white":"ffffff", "yellow":"ffff00"};
            // Baureihe, Farbe1 und Farbe2
            var baureihe = line[i].substring(line[i].search(/\|/) + 1).replace(/^\s*(\S.*\S)\s*$/g,"$1");
            var farbe2 = line[i].replace(/^.*[^a-zA-Z]color\s*:\s*(#[a-fA-F0-9]{6,6}|[a-zA-Z]+).*/,"$1").replace(/^\s*(\S.*\S)\s*$/g,"$1");
            var farbe1 = line[i].replace(/^.*[^a-zA-Z]background(-color){0,1}\s*:\s*(#[a-fA-F0-9]{6,6}|[a-zA-Z]+).*/,"$2").replace(/^\s*(\S.*\S)\s*$/g,"$1");
            if (farbe1.charCodeAt( 0 )  ===  35 ) {   // '#'
               farbe1 = farbe1.substring(1);
            }
            else if (base_color_name[farbe1.toLowerCase()]) {
               farbe1 = base_color_name[farbe1.toLowerCase()];
            }
            else {
               farbe1 = null;
            }
            if (farbe2.charCodeAt( 0 )  ===  35 ) {   // '#'
               farbe2 = farbe2.substring(1);
            } else if (base_color_name[farbe2.toLowerCase()]) {
               farbe2 = base_color_name[farbe2.toLowerCase()];
            } else {
               farbe2 = null;
            }
            Template[PAR_START + "Baureihe"] = baureihe;
            if (farbe1) {
               Template[PAR_START + "Farbe1"] = farbe1;
            }
            if (farbe2) {
               Template[PAR_START + "Farbe2"] = farbe2;
            }
         } else if (line[i].search(/^\s*(!|\|[^\-]).*\[\[(Bild|Image):[^\]]+\]\]/) === 0) {
            var bild = line[i].replace(/^\s*(!|\|).*\[\[(Bild|Image):([^\]]+)\]\].*/,"$3");
            bild = bild.split("|");
            Template[PAR_START + "Abbildung"] = bild[0];
            for (var k = 1; k < bild.length; k++) {
               if (bild[k].search("[0-9]px") < 0) {
                  Template[PAR_START + "Name"] = bild[k].replace(/^\s*(\S.*\S)\s*$/g,"$1");
               }
            }   // for k
         }
      }
      return Template;
   };
}   // TM_P_Infobox_Schienenfahrzeug()
TM_P_Infobox_Schienenfahrzeug.prototype=new TM_P_Wiki2Template();

TM_PluginList.push(new TM_P_Infobox_Schienenfahrzeug()); // register plugin



   // ###################################################################



   function initialize() {
      // Start action on current page
      // Precondition:
      //    configs have been loaded
      // Postcondition:
      //    tm_init() will be called upon document.ready
      // 2014-07-21 PerfektesChaos@de.wikipedia
      BUTTONICON = "//upload.wikimedia.org/wikipedia/commons/"
                   + "e/eb/Button_templatelink.png";
      if ( mw.user.options.get( "gadget-wikEd" )
           ||  typeof( window.wikEd ) === "object" ) {
         if ( typeof( window.wikEd ) !== "object" ) {
            window.wikEd = {  config: { }  };
         }
         if ( typeof( window.wikEd.config ) !== "object" ) {
            window.wikEd.config = { button:    { },
                                    buttonBar: { } };
         }
         if ( typeof( window.wikEd.config.button  ) !== "object" ) {
            window.wikEd.config.button = { };
         }
         window.wikEd.config.button[ 745 ] = [ "wikEdVorlagenmeister",
                                               "wikEdButton",
                                               "Vorlagenmeister",
                                               BUTTONICON, "16", "16",
                                               "DIV",
                                               "window.mediaWiki.libs."
                                               + MW_LIB
                                               + ".wikEd.click();"
                                             ];
         if ( typeof( window.wikEd.config.buttonBar ) !== "object" ) {
            window.wikEd.config.buttonBar = { };
         }
         if ( typeof( window.wikEd.config.buttonBar.custom1 ) !== "object" ) {
            window.wikEd.config.buttonBar.custom1 =
                                               [ "wikEdButtonBarCustom1",
                                                 "wikEdButtonBarCustom1",
                                                 "wikEdButtonsCustom1",
                                                 "wikEdButtonsCustom1",
                                                 44,
                                                 "Meine Buttons",
                                                 [ ]
                                               ];
         }
         window.wikEd.config.buttonBar.custom1[ 6 ].push( 745 );
      }
      $( tm_init );
   }   // initialize()



   function loadStyleIE( area, access ) {
      // Load stylesheet where mw.loader.load() fails for IE.
      // Precondition:
      //    mw.util.wikiScript() :: mediawiki.util
      //    mw.Api() :: mediawiki.api
      //    mediawiki.api has been loaded
      // 2014-08-04 PerfektesChaos@de.wikipedia
      var defaults = { ajax: { url:  area + mw.util.wikiScript( "api" )
                             }
                     },
          done = function ( arrived ) {
                     var q, $style;
                     if ( typeof arrived  ===  "object"   &&
                          typeof arrived.query  ===  "object"   &&
                          typeof arrived.query.pages  ===  "object"   &&
                          typeof arrived.query.pageids  ===  "object" ) {
                        q  =  arrived.query;
                        q  =  q.pages[ q.pageids[ 0 ] ];
                        if ( typeof q  ===  "object"   &&
                             typeof q.revisions  ===  "object" ) {
                           q  =  q.revisions[ 0 ];
                           if ( typeof q  ===  "object"   &&
                                typeof q[ "*" ]  ===  "string" ) {
                              $style = $( "<style>"
                                       + q[ "*" ]
                                       + "</style>" );
                              $style.attr( { title: "loadStyleIE",
                                             type:  "text/css" } );
                              $( "head" ).append( $style );
                           }
                        }
                     }
                  },
          params = { prop:         "revisions",
                     indexpageids: true,
                     rvprop:       "content",
                     rvlimit:      "1",
                     titles:       access
                   },
          request = new mw.Api( defaults );
      request.get( params )
             .done( done );
   }   // loadStyleIE()



   function autoRun() {
      // Start possible actions on current page
      // Precondition:
      //    jquery.client and configs have been loaded
      //    $.client() :: jquery.client
      // Postcondition:
      //    initialize() will be called, if appropriate
      //    IS_IE has been defined
      // 2016-11-01 PerfektesChaos@de.wikipedia
      var env    = mw.config.get( [ "wgAction",
                                    "wgIsProbablyEditable",
                                    "wgNamespaceNumber",
                                    "wgPageContentModel",
                                    "wgScript",
                                    "wgServer",
                                    "wgTitle" ] ),
          server = "//de.wikipedia.beta.wmflabs.org",
          sheet  = "MediaWiki:Gadget-Vorlagenmeister.css",
          legacy, maxage, userAgent;
      if ( ( env.wgAction === "edit"  ||  env.wgAction === "submit" )  &&
           env.wgIsProbablyEditable  &&
           env.wgPageContentModel === "wikitext"  &&
           ! ( env.wgNamespaceNumber === 10  &&
               /\/XML$/.test( env.wgTitle ) ) ) {
         if ( env.wgServer.indexOf( server )  <  0 ) {
            server = "https://de.wikipedia.org";
            maxage = 1209600;   // 14 d
         } else {
            maxage = 0;
         }
         userAgent = $.client.profile();
         IS_IE     = ( userAgent.name === "msie" );
         if ( IS_IE ) {
            IS_IE = userAgent.versionNumber;
            /*
            if ( userAgent.versionNumber >= 9 ) {
               IS_IE_9plus  = userAgent.versionNumber;
            }
            */
            legacy = ( IS_IE < 11 );
         } else {
            legacy = false;
         }
         if ( legacy ) {
            // Old IE (like IE8) ignore <link rel="stylesheet">
            // if arriving after document.load has been reached.
            mw.loader.using( [ "mediawiki.api" ],
                             function () {
                                loadStyleIE( server, sheet );
                             } );
         } else {
            sheet = server + env.wgScript
                    + "?title=" + sheet
                    + "&bcache=1&maxage=" + maxage
                    + "&action=raw&ctype=text/css";
            mw.loader.load( sheet, "text/css" );
         }
         mw.loader.using( [ "mediawiki.api",
                            "mediawiki.user",
                            "mediawiki.util",
                            "jquery.tipsy" ],   // DEPRECATED (known)
                          initialize );
      }
   }   // autoRun()



   if ( mw.loader.getState( SIGNATURE ) !== "ready" ) {
      if ( typeof( mw.libs[ MW_LIB ] ) !== "object"   ||
           ! mw.libs[ MW_LIB ] ) {
         mw.libs[ MW_LIB ] = { };
      }
      mw.libs[ MW_LIB ].type = MW_LIB;
      OPTIONS                = mw.libs[ MW_LIB ];
      OPTIONS.vsn = VERSION;
      mw.loader.using( [ "jquery.client",
                         "site",
                         "user",
                         "user.options" ],
                       autoRun );
      rLoader[ SIGNATURE ] = "ready";
      mw.loader.state( rLoader );
      mw.hook( OPTIONS.type + ".ready" ).fire( OPTIONS );
   }
}( window.mediaWiki, window.jQuery ) );



// Emacs
// Local Variables:
// coding: utf-8-dos
// fill-column: 80
// End: